From 740b241b711c96d31ae3218b7944f19294fc7127 Mon Sep 17 00:00:00 2001 From: rdkartono Date: Mon, 19 Jan 2026 16:57:29 +0700 Subject: [PATCH] first commit --- .idea/inspectionProfiles/Project_Default.xml | 11 ++ src/ActiveMQ/ActiveMQClient.kt | 73 +++++++++++ src/ActiveMQClient.kt | 2 - src/Main.kt | 25 ++++ src/MySQLInjector.kt | 2 - src/Other/Config.kt | 121 +++++++++++++++++++ src/{ => Web}/WebUI.kt | 9 +- src/database/MySQLInjector.kt | 10 ++ 8 files changed, 246 insertions(+), 7 deletions(-) create mode 100644 src/ActiveMQ/ActiveMQClient.kt delete mode 100644 src/ActiveMQClient.kt delete mode 100644 src/MySQLInjector.kt create mode 100644 src/Other/Config.kt rename src/{ => Web}/WebUI.kt (57%) create mode 100644 src/database/MySQLInjector.kt diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml index 6d9ce73..b17a2f5 100644 --- a/.idea/inspectionProfiles/Project_Default.xml +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -1,15 +1,26 @@ \ No newline at end of file diff --git a/src/ActiveMQ/ActiveMQClient.kt b/src/ActiveMQ/ActiveMQClient.kt new file mode 100644 index 0000000..727be9e --- /dev/null +++ b/src/ActiveMQ/ActiveMQClient.kt @@ -0,0 +1,73 @@ +package ActiveMQ + +import jakarta.jms.BytesMessage +import jakarta.jms.Connection +import jakarta.jms.MapMessage +import jakarta.jms.Message +import jakarta.jms.MessageConsumer +import jakarta.jms.MessageListener +import jakarta.jms.Queue +import jakarta.jms.Session +import jakarta.jms.TextMessage +import org.apache.activemq.ActiveMQConnectionFactory +import org.tinylog.Logger +import java.util.function.Consumer + +@Suppress("unused") +class ActiveMQClient(BrokerURL: String, username: String, password: String, queueName: String) { + private lateinit var connection: Connection + private lateinit var session: Session + private lateinit var destination : Queue + private lateinit var consumer: MessageConsumer + var MessageConsumer : Consumer?= null + init{ + try{ + connection = ActiveMQConnectionFactory(BrokerURL, username, password).createConnection() + connection.start() + session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE) + destination = session.createQueue(queueName) + consumer = session.createConsumer(destination) + consumer.messageListener = MessageListener { message -> + MessageConsumer?.accept(message) + when (message) { + is TextMessage -> Logger.info { "Received Text Message : ${message.text}" } + is BytesMessage -> { + val length = message.bodyLength.toInt() + val byteArray = ByteArray(length) + message.readBytes(byteArray) + Logger.info { "Received Bytes Message of length : $length" } + } + + is MapMessage -> { + val mapNames = message.mapNames + val mapContent = mutableMapOf() + while (mapNames.hasMoreElements()) { + val key = mapNames.nextElement() as String + val value = message.getObject(key) + mapContent[key] = value + } + Logger.info { "Received Map Message : $mapContent" } + } + + else -> Logger.warn { "Received Unknown Message Type" } + } + + } + Logger.info { "ActiveMQ Connection created to Broker : $BrokerURL" } + } catch (e : Exception){ + Logger.error { "Failed to create connection, Message : ${e.message}" } + } + + } + + fun Stop(){ + try{ + consumer.close() + session.close() + connection.close() + Logger.info { "Connection closed to Broker" } + } catch (e : Exception){ + Logger.error { "Failed to close connection, Message : ${e.message}" } + } + } +} \ No newline at end of file diff --git a/src/ActiveMQClient.kt b/src/ActiveMQClient.kt deleted file mode 100644 index 51d92d6..0000000 --- a/src/ActiveMQClient.kt +++ /dev/null @@ -1,2 +0,0 @@ -class ActiveMQClient { -} \ No newline at end of file diff --git a/src/Main.kt b/src/Main.kt index c9d0191..720d520 100644 --- a/src/Main.kt +++ b/src/Main.kt @@ -1,5 +1,30 @@ +import ActiveMQ.ActiveMQClient +import Other.Config +import Web.WebUI +import database.MySQLInjector +import java.util.function.Consumer + //TIP To Run code, press or // click the icon in the gutter. fun main() { + val config = Config() + config.Load() + val webUI = WebUI(config) + val activeclient = ActiveMQClient( + config.ActiveMQ_BrokerURL, + config.ActiveMQ_Username, + config.ActiveMQ_Password, + config.ActiveMQ_QueueName + ) + val mysql = MySQLInjector(config) + activeclient.MessageConsumer = Consumer{ message -> + + } + + Runtime.getRuntime().addShutdownHook(Thread { + webUI.Stop() + activeclient.Stop() + mysql.Stop() + }) } \ No newline at end of file diff --git a/src/MySQLInjector.kt b/src/MySQLInjector.kt deleted file mode 100644 index 74e8247..0000000 --- a/src/MySQLInjector.kt +++ /dev/null @@ -1,2 +0,0 @@ -class MySQLInjector { -} \ No newline at end of file diff --git a/src/Other/Config.kt b/src/Other/Config.kt new file mode 100644 index 0000000..596c021 --- /dev/null +++ b/src/Other/Config.kt @@ -0,0 +1,121 @@ +package Other + +import org.tinylog.Logger +import java.io.FileInputStream +import java.io.FileNotFoundException +import java.io.FileOutputStream +import java.nio.file.Files +import java.time.LocalDateTime +import java.util.Properties +import kotlin.io.path.Path + +@Suppress("unused") +class Config { + private val prop = Properties() + private val filename = "config.properties" + var WebPort : Int + get() = prop.getProperty("webport").toInt() + set(value) {prop.setProperty("webport", value.toString())} + var ActiveMQ_BrokerURL : String + get() = prop.getProperty("activemq_brokerurl") + set(value) {prop.setProperty("activemq_brokerurl", value)} + var ActiveMQ_Username : String + get() = prop.getProperty("activemq_username") + set(value) {prop.setProperty("activemq_username", value)} + var ActiveMQ_Password : String + get() = prop.getProperty("activemq_password") + set(value) {prop.setProperty("activemq_password", value)} + var ActiveMQ_QueueName : String + get() = prop.getProperty("activemq_queuename") + set(value) {prop.setProperty("activemq_queuename", value)} + var MySQL_AAS1 : String + get() = prop.getProperty("mysql_aas1") + set(value) {prop.setProperty("mysql_aas1", value)} + var MySQL_AAS2 : String + get() = prop.getProperty("mysql_aas2") + set(value) {prop.setProperty("mysql_aas2", value)} + var MySQL_AAS3 : String + get() = prop.getProperty("mysql_aas3") + set(value) {prop.setProperty("mysql_aas3", value)} + var MySQL_AAS1_Username : String + get() = prop.getProperty("mysql_aas1_username") + set(value) {prop.setProperty("mysql_aas1_username", value)} + var MySQL_AAS1_Password : String + get() = prop.getProperty("mysql_aas1_password") + set(value) {prop.setProperty("mysql_aas1_password", value)} + var MySQL_AAS2_Username : String + get() = prop.getProperty("mysql_aas2_username") + set(value) {prop.setProperty("mysql_aas2_username", value)} + var MySQL_AAS2_Password : String + get() = prop.getProperty("mysql_aas2_password") + set(value) {prop.setProperty("mysql_aas2_password", value)} + var MySQL_AAS3_Username : String + get() = prop.getProperty("mysql_aas3_username") + set(value) {prop.setProperty("mysql_aas3_username", value)} + var MySQL_AAS3_Password : String + get() = prop.getProperty("mysql_aas3_password") + set(value) {prop.setProperty("mysql_aas3_password", value)} + + fun Load(){ + try{ + if (Files.isRegularFile(Path(filename))){ + prop.load(FileInputStream(filename)) + if (!prop.contains("webport")) throw Exception("Invalid config file: missing 'webport'") + if (!prop.contains("activemq_brokerurl")) throw Exception("Invalid config file: missing 'activemq_brokerurl'") + if (!prop.contains("activemq_username")) throw Exception("Invalid config file: missing 'activemq_username'") + if (!prop.contains("activemq_password")) throw Exception("Invalid config file: missing 'activemq_password'") + if (!prop.contains("activemq_queuename")) throw Exception("Invalid config file: missing 'activemq_queuename'") + if (!prop.contains("mysql_aas1")) throw Exception("Invalid config file: missing 'mysql_aas1'") + if (!prop.contains("mysql_aas2")) throw Exception("Invalid config file: missing 'mysql_aas2'") + if (!prop.contains("mysql_aas3")) throw Exception("Invalid config file: missing 'mysql_aas3'") + if (!prop.contains("mysql_aas1_username")) throw Exception("Invalid config file: missing 'mysql_aas1_username'") + if (!prop.contains("mysql_aas1_password")) throw Exception("Invalid config file: missing 'mysql_aas1_password'") + if (!prop.contains("mysql_aas2_username")) throw Exception("Invalid config file: missing 'mysql_aas2_username'") + if (!prop.contains("mysql_aas2_password")) throw Exception("Invalid config file: missing 'mysql_aas2_password'") + if (!prop.contains("mysql_aas3_username")) throw Exception("Invalid config file: missing 'mysql_aas3_username'") + if (!prop.contains("mysql_aas3_password")) throw Exception("Invalid config file: missing 'mysql_aas3_password'") + Logger.info { "Configuration loaded from config.properties" } + } else throw FileNotFoundException("Config file not found") + } catch (e: FileNotFoundException){ + Logger.error(e) { "Config file not found, Message : ${e.message}" } + CreateDefault() + Save() + } + catch (e: Exception){ + Logger.error(e) { "Error while loading config, Message : ${e.message}" } + CreateDefault() + Save() + } + + + } + fun Save(){ + // save prop to file "save.properties" + // comment is save date and time + val comment = "Configuration saved on ${LocalDateTime.now()}" + try{ + prop.store(FileOutputStream(filename), comment) + Logger.info { "Configuration saved to config.properties" } + } catch (ex: Exception){ + Logger.error(ex) { "Error while saving config, Message : ${ex.message}" } + } + } + fun CreateDefault(){ + prop.clear() + prop.setProperty("webport", "7000") + prop.setProperty("activemq_brokerurl", "tcp://localhost:61616") + prop.setProperty("activemq_username", "admin") + prop.setProperty("activemq_password", "admin") + prop.setProperty("activemq_queuename", "TEST.QUEUE") + prop.setProperty("mysql_aas1", "jdbc:mysql://192.168.10.10:3306/aas") + prop.setProperty("mysql_aas2", "jdbc:mysql://192.168.10.11:3306/aas") + prop.setProperty("mysql_aas3"," jdbc:mysql://192.168.10.12:3306/aas") + prop.setProperty("mysql_aas1_username","admin") + prop.setProperty("mysql_aas1_password","admin") + prop.setProperty("mysql_aas2_username","admin") + prop.setProperty("mysql_aas2_password","admin") + prop.setProperty("mysql_aas3_username","admin") + prop.setProperty("mysql_aas3_password","admin") + Logger.info {"Default configuration created" } + } +} \ No newline at end of file diff --git a/src/WebUI.kt b/src/Web/WebUI.kt similarity index 57% rename from src/WebUI.kt rename to src/Web/WebUI.kt index 164392c..3c663dc 100644 --- a/src/WebUI.kt +++ b/src/Web/WebUI.kt @@ -1,13 +1,16 @@ +package Web + +import Other.Config import io.javalin.Javalin @Suppress("unused") /** * Start WebUI Server */ -class WebUI(listenport: Int) { - var app : Javalin = Javalin.create { config -> +class WebUI(config: Config) { + private var app : Javalin = Javalin.create { config -> config.staticFiles.add("/html") - }.start(listenport) + }.start(config.WebPort) /** * Stop WebUI Server diff --git a/src/database/MySQLInjector.kt b/src/database/MySQLInjector.kt new file mode 100644 index 0000000..3e8c50e --- /dev/null +++ b/src/database/MySQLInjector.kt @@ -0,0 +1,10 @@ +package database + +import Other.Config + +class MySQLInjector(config: Config) { + + fun Stop(){ + + } +} \ No newline at end of file