From 89fce149df9f4151bd5b49d7ceb4d15bfd89cff3 Mon Sep 17 00:00:00 2001 From: Dmitry Isaenko Date: Tue, 20 Oct 2020 18:19:20 +0300 Subject: [PATCH] Cleanup --- README.md | 2 +- pom.xml | 5 - src/main/java/InnaIrcBot/GlobalData.java | 5 + .../java/InnaIrcBot/LogDriver/BotDriver.java | 74 -------------- .../InnaIrcBot/LogDriver/SystemWorker.java | 12 --- .../LogDriver/ThingToCloseOnDie.java | 5 - .../ProvidersConsumers/ChanConsumer.java | 10 +- .../ProvidersConsumers/DataProvider.java | 46 +++++---- .../ProvidersConsumers/SystemConsumer.java | 8 +- .../InnaIrcBot/config/ConfigurationFile.java | 9 +- .../config/LogDriverConfiguration.java | 40 ++++++++ .../java/InnaIrcBot/logging/LogDriver.java | 62 ++++++++++++ .../logging/SupportedLogDrivers.java | 24 +++++ .../{LogDriver => logging}/Worker.java | 2 +- .../WorkerFiles.java} | 6 +- .../WorkerMongoDB.java} | 28 +++--- .../WorkerSQLite.java} | 6 +- .../WorkerSystem.java} | 19 ++-- .../WorkerZero.java} | 4 +- src/main/java/Temporary/DriverTestMongo.java | 74 -------------- src/main/java/Temporary/StorageFileTest.java | 31 ------ .../java/Temporary/StorageReaderTest.java | 9 -- .../config/ConfigurationFileTest.java | 96 +++++++++++++++++++ .../LogDriverTest.java} | 87 ++++++++++------- 24 files changed, 354 insertions(+), 310 deletions(-) delete mode 100644 src/main/java/InnaIrcBot/LogDriver/BotDriver.java delete mode 100644 src/main/java/InnaIrcBot/LogDriver/SystemWorker.java delete mode 100644 src/main/java/InnaIrcBot/LogDriver/ThingToCloseOnDie.java create mode 100644 src/main/java/InnaIrcBot/config/LogDriverConfiguration.java create mode 100644 src/main/java/InnaIrcBot/logging/LogDriver.java create mode 100644 src/main/java/InnaIrcBot/logging/SupportedLogDrivers.java rename src/main/java/InnaIrcBot/{LogDriver => logging}/Worker.java (87%) rename src/main/java/InnaIrcBot/{LogDriver/BotFilesWorker.java => logging/WorkerFiles.java} (97%) rename src/main/java/InnaIrcBot/{LogDriver/BotMongoWorker.java => logging/WorkerMongoDB.java} (93%) rename src/main/java/InnaIrcBot/{LogDriver/BotSQLiteWorker.java => logging/WorkerSQLite.java} (97%) rename src/main/java/InnaIrcBot/{LogDriver/BotSystemWorker.java => logging/WorkerSystem.java} (86%) rename src/main/java/InnaIrcBot/{LogDriver/BotZeroWorker.java => logging/WorkerZero.java} (73%) delete mode 100644 src/main/java/Temporary/DriverTestMongo.java delete mode 100644 src/main/java/Temporary/StorageFileTest.java delete mode 100644 src/main/java/Temporary/StorageReaderTest.java create mode 100644 src/test/java/InnaIrcBot/config/ConfigurationFileTest.java rename src/test/java/InnaIrcBot/{LogDriver/BotDriverTest.java => logging/LogDriverTest.java} (53%) diff --git a/README.md b/README.md index f09b5a6..8e2c503 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Another one IRC bot in deep-deep beta. ## License Source code spreads under the GNU General Public License v3 or higher. Please see LICENSE file. -####Used libraries: +#### Used libraries: * Apache commons CLI: https://commons.apache.org/proper/commons-cli/ * GSON: https://github.com/google/gson * sqliteJDBC: https://bitbucket.org/xerial/sqlite-jdbc diff --git a/pom.xml b/pom.xml index 9ebae2c..a0cb9c3 100644 --- a/pom.xml +++ b/pom.xml @@ -77,11 +77,6 @@ 1.8 1.8 - - - **/Temporary/* - - diff --git a/src/main/java/InnaIrcBot/GlobalData.java b/src/main/java/InnaIrcBot/GlobalData.java index 7bfe309..1e42153 100644 --- a/src/main/java/InnaIrcBot/GlobalData.java +++ b/src/main/java/InnaIrcBot/GlobalData.java @@ -1,5 +1,10 @@ package InnaIrcBot; +import InnaIrcBot.logging.LogDriver; + +import java.util.ArrayList; +import java.util.List; + public class GlobalData { private static final String version = "InnaIrcBot v0.8 \"Коммунарка\""; public static synchronized String getAppVersion(){ diff --git a/src/main/java/InnaIrcBot/LogDriver/BotDriver.java b/src/main/java/InnaIrcBot/LogDriver/BotDriver.java deleted file mode 100644 index 184858b..0000000 --- a/src/main/java/InnaIrcBot/LogDriver/BotDriver.java +++ /dev/null @@ -1,74 +0,0 @@ -package InnaIrcBot.LogDriver; - -import java.util.HashMap; - -public class BotDriver { - private final static HashMap serverDriver = new HashMap<>(); - private final static HashMap systemLogWorkerMap = new HashMap<>(); - /** - * Define driver for desired server - * */ - // TODO: add proxy worker for using with multiple drivers - public static synchronized boolean setLogDriver(String serverName, String driver, String[] driverParams, String applicationLogDir){ - if (driver == null) - return false; - if (driver.isEmpty()) - return false; - if (driverParams.length == 0) - return false; - if (driverParams[0] == null) - return false; - if (driverParams[0].isEmpty()) - return false; - - String[][] drvAndParams = { - {driver}, - driverParams - }; - serverDriver.put(serverName, drvAndParams); - systemLogWorkerMap.put(serverName, new BotSystemWorker(serverName, applicationLogDir)); - return true; - } - - public static synchronized Worker getWorker(String server, String channel){ - if (serverDriver.containsKey(server)) { - switch (serverDriver.get(server)[0][0].toLowerCase()) { - case "files": - BotFilesWorker botFilesWorker = new BotFilesWorker(server, serverDriver.get(server)[1], channel); - return validateConsistancy(botFilesWorker, server, channel); - case "sqlite": - BotSQLiteWorker botSQLiteWorker = new BotSQLiteWorker(server, serverDriver.get(server)[1], channel); - return validateConsistancy(botSQLiteWorker, server, channel); - case "mongodb": - BotMongoWorker botMongoWorker = new BotMongoWorker(server, serverDriver.get(server)[1], channel); - return validateConsistancy(botMongoWorker, server, channel); - case "zero": - return new BotZeroWorker(); - default: - System.out.println("BotDriver->getWorker(): Configuration issue: can't find required driver \"" - +serverDriver.get(server)[0][0] - +"\".Using \"ZeroWorker\"."); - return new BotZeroWorker(); - } - } - System.out.println("Issue on BotDriver->getWorker(): Channel requested for non-existing server?\n" + - "\tUsing ZeroWorker."); - return new BotZeroWorker(); - } - // If channel found that it's impossible to use defined worker from user settings and asking for use ZeroWorker - public static synchronized Worker getZeroWorker(){ return new BotZeroWorker(); } - - public static synchronized BotSystemWorker getSystemWorker(String serverName){ - return systemLogWorkerMap.get(serverName); - } - - private static Worker validateConsistancy(Worker worker, String server, String channel){ // synchronized? - if (worker.isConsistent()){ - return worker; - } - System.out.println("BotDriver->validateConstancy(): Unable to use " - +worker.getClass().getSimpleName()+" for "+server+"/"+channel - +". Using ZeroWorker instead."); - return new BotZeroWorker(); - } -} diff --git a/src/main/java/InnaIrcBot/LogDriver/SystemWorker.java b/src/main/java/InnaIrcBot/LogDriver/SystemWorker.java deleted file mode 100644 index 00cc001..0000000 --- a/src/main/java/InnaIrcBot/LogDriver/SystemWorker.java +++ /dev/null @@ -1,12 +0,0 @@ -package InnaIrcBot.LogDriver; - -public interface SystemWorker { - - void registerInSystemWorker(ThingToCloseOnDie thing); - - void logAdd(String event, - String initiatorArg, - String messageArg); - - void close(); -} diff --git a/src/main/java/InnaIrcBot/LogDriver/ThingToCloseOnDie.java b/src/main/java/InnaIrcBot/LogDriver/ThingToCloseOnDie.java deleted file mode 100644 index 0a5645d..0000000 --- a/src/main/java/InnaIrcBot/LogDriver/ThingToCloseOnDie.java +++ /dev/null @@ -1,5 +0,0 @@ -package InnaIrcBot.LogDriver; - -public interface ThingToCloseOnDie { - void die(); -} diff --git a/src/main/java/InnaIrcBot/ProvidersConsumers/ChanConsumer.java b/src/main/java/InnaIrcBot/ProvidersConsumers/ChanConsumer.java index 2ea1498..2b95633 100644 --- a/src/main/java/InnaIrcBot/ProvidersConsumers/ChanConsumer.java +++ b/src/main/java/InnaIrcBot/ProvidersConsumers/ChanConsumer.java @@ -3,8 +3,8 @@ package InnaIrcBot.ProvidersConsumers; import InnaIrcBot.Commanders.ChanelCommander; import InnaIrcBot.GlobalData; import InnaIrcBot.IrcChannel; -import InnaIrcBot.LogDriver.BotDriver; -import InnaIrcBot.LogDriver.Worker; +import InnaIrcBot.logging.LogDriver; +import InnaIrcBot.logging.Worker; import InnaIrcBot.config.ConfigurationManager; import java.time.LocalTime; @@ -38,7 +38,7 @@ public class ChanConsumer implements Runnable { this.chanConsumerQueue = thisIrcChannel.getChannelQueue(); this.serverName = serverName; this.channelName = thisIrcChannel.toString(); - this.writerWorker = BotDriver.getWorker(serverName, channelName); + this.writerWorker = LogDriver.getWorker(serverName, channelName); this.userList = new ArrayList<>(); this.nick = ownNick; this.rejoin = ConfigurationManager.getConfiguration(serverName).getRejoinOnKick(); @@ -145,9 +145,9 @@ public class ChanConsumer implements Runnable { private void fixLogDriverIssues(String a, String b, String c){ System.out.println("ChanConsumer (@"+serverName+"/"+channelName+")->fixLogDriverIssues(): Some issues detected. Trying to fix..."); - this.writerWorker = BotDriver.getWorker(serverName, channelName); // Reset logDriver and try using the same one + this.writerWorker = LogDriver.getWorker(serverName, channelName); // Reset logDriver and try using the same one if (! writerWorker.logAdd(a, b, c)){ // Write to it what was not written (most likely) and if it's still not consistent: - this.writerWorker = BotDriver.getZeroWorker(); + this.writerWorker = LogDriver.getZeroWorker(); System.out.println("ChanConsumer (@"+serverName+"/"+channelName+")->fixLogDriverIssues(): failed to use defined LogDriver. Using ZeroWorker instead."); } } diff --git a/src/main/java/InnaIrcBot/ProvidersConsumers/DataProvider.java b/src/main/java/InnaIrcBot/ProvidersConsumers/DataProvider.java index 6b0bf58..2a209ff 100644 --- a/src/main/java/InnaIrcBot/ProvidersConsumers/DataProvider.java +++ b/src/main/java/InnaIrcBot/ProvidersConsumers/DataProvider.java @@ -2,7 +2,7 @@ package InnaIrcBot.ProvidersConsumers; import InnaIrcBot.config.ConfigurationFile; import InnaIrcBot.IrcChannel; -import InnaIrcBot.LogDriver.BotDriver; +import InnaIrcBot.logging.LogDriver; import InnaIrcBot.ReconnectControl; import java.io.*; @@ -16,16 +16,16 @@ import java.util.concurrent.BlockingQueue; public class DataProvider implements Runnable { private final ConfigurationFile configurationFile; - private final String serverName; + private final String server; private final String nickName; - private BufferedReader rawStreamReader; + private BufferedReader mainReader; /** * Initiate connection and prepare input/output streams for run() * */ public DataProvider(ConfigurationFile configurationFile){ this.configurationFile = configurationFile; - this.serverName = configurationFile.getServerName(); + this.server = configurationFile.getServerName(); this.nickName = configurationFile.getUserNick(); } @@ -35,18 +35,17 @@ public class DataProvider implements Runnable { } catch (Exception e){ System.out.println("Internal issue: DataProvider->run() caused exception:\n\t"+e.getMessage()); e.printStackTrace(); - } - ReconnectControl.register(serverName); - - if (! BotDriver.setLogDriver(serverName, - configurationFile.getLogDriver(), - configurationFile.getLogDriverParameters(), - configurationFile.getApplicationLogDir())) { //Prepare logDriver for using in threads.) - this.close(); + close(); return; } + ReconnectControl.register(server); + + LogDriver.setLogDriver(server, + configurationFile.getLogDriverConfiguration(), + configurationFile.getApplicationLogDir()); + /* Used for sending data into consumers objects*/ Map ircChannels = Collections.synchronizedMap(new HashMap<>()); @@ -57,19 +56,19 @@ public class DataProvider implements Runnable { new SystemConsumer(systemConsumerQueue, nickName, ircChannels, this.configurationFile)); SystemConsumerThread.start(); - StreamProvider.setSysConsumer(serverName, systemConsumerQueue); // Register system consumer at StreamProvider + StreamProvider.setSysConsumer(server, systemConsumerQueue); // Register system consumer at StreamProvider ircChannels.put(systemConsumerChannel.toString(), systemConsumerChannel); // Not sure that PrintWriter is thread-safe.. ////////////////////////////////////// Start loop ////////////////////////////////////////////////////////////// - StreamProvider.writeToStream(serverName,"NICK "+this.nickName); - StreamProvider.writeToStream(serverName,"USER "+ configurationFile.getUserIdent()+" 8 * :"+ configurationFile.getUserRealName()); // TODO: Add usermode 4 rusnet + StreamProvider.writeToStream(server,"NICK "+this.nickName); + StreamProvider.writeToStream(server,"USER "+ configurationFile.getUserIdent()+" 8 * :"+ configurationFile.getUserRealName()); // TODO: Add usermode 4 rusnet try { String rawMessage; String[] rawStrings; // prefix[0] command[1] command-parameters\r\n[2] //if there is no prefix, you should assume the message came from your client. - while ((rawMessage = rawStreamReader.readLine()) != null) { + while ((rawMessage = mainReader.readLine()) != null) { System.out.println(rawMessage); if (rawMessage.startsWith(":")) { rawStrings = rawMessage @@ -101,7 +100,7 @@ public class DataProvider implements Runnable { } } } catch (IOException e){ - System.out.println("Socket issue: I/O exception"); //Connection closed. TODO: MAYBE try reconnect + System.out.println("Socket issue: I/O exception: "+e.getMessage()); //Connection closed. TODO: MAYBE try reconnect } finally { SystemConsumerThread.interrupt(); @@ -111,7 +110,7 @@ public class DataProvider implements Runnable { private void connect() throws Exception{ final int port = configurationFile.getServerPort(); - InetAddress inetAddress = InetAddress.getByName(serverName); + InetAddress inetAddress = InetAddress.getByName(server); Socket socket = new Socket(); // TODO: set timeout? for (int i = 0; i < 5; i++) { socket.connect(new InetSocketAddress(inetAddress, port), 5000); // 5sec @@ -121,20 +120,19 @@ public class DataProvider implements Runnable { if (! socket.isConnected()) throw new Exception("Unable to connect server."); - StreamProvider.setStream(serverName, socket); + StreamProvider.setStream(server, socket); InputStream inStream = socket.getInputStream(); InputStreamReader isr = new InputStreamReader(inStream, StandardCharsets.UTF_8); //TODO set charset in options; - rawStreamReader = new BufferedReader(isr); + mainReader = new BufferedReader(isr); } private void sendPingReply(String rawData){ - StreamProvider.writeToStream(serverName,"PONG :" + rawData.replace("PING :", "")); + StreamProvider.writeToStream(server,"PONG :" + rawData.replace("PING :", "")); } - //HANDLE ALWAYS in case thread decided to die private void close(){ - StreamProvider.delStream(serverName); - ReconnectControl.notify(serverName); + StreamProvider.delStream(server); + ReconnectControl.notify(server); } } diff --git a/src/main/java/InnaIrcBot/ProvidersConsumers/SystemConsumer.java b/src/main/java/InnaIrcBot/ProvidersConsumers/SystemConsumer.java index c0b7dd7..e7d72d9 100644 --- a/src/main/java/InnaIrcBot/ProvidersConsumers/SystemConsumer.java +++ b/src/main/java/InnaIrcBot/ProvidersConsumers/SystemConsumer.java @@ -6,8 +6,8 @@ import InnaIrcBot.ReconnectControl; import InnaIrcBot.config.ConfigurationFile; import InnaIrcBot.GlobalData; import InnaIrcBot.IrcChannel; -import InnaIrcBot.LogDriver.BotDriver; -import InnaIrcBot.LogDriver.BotSystemWorker; +import InnaIrcBot.logging.LogDriver; +import InnaIrcBot.logging.WorkerSystem; import java.time.LocalDateTime; import java.time.LocalTime; @@ -19,7 +19,7 @@ import java.util.concurrent.BlockingQueue; public class SystemConsumer implements Runnable{ private final BlockingQueue systemQueue; - private BotSystemWorker writerWorker; + private WorkerSystem writerWorker; private String nick; private String serverName; private final Map channels; @@ -34,7 +34,7 @@ public class SystemConsumer implements Runnable{ SystemConsumer(BlockingQueue systemQueue, String userNick, Map channels, ConfigurationFile configurationFile) { this.systemQueue = systemQueue; - this.writerWorker = BotDriver.getSystemWorker(configurationFile.getServerName()); + this.writerWorker = LogDriver.getSystemWorker(configurationFile.getServerName()); this.nick = userNick; this.serverName = configurationFile.getServerName(); this.channels = channels; diff --git a/src/main/java/InnaIrcBot/config/ConfigurationFile.java b/src/main/java/InnaIrcBot/config/ConfigurationFile.java index 9dd774a..4eeba65 100644 --- a/src/main/java/InnaIrcBot/config/ConfigurationFile.java +++ b/src/main/java/InnaIrcBot/config/ConfigurationFile.java @@ -18,6 +18,8 @@ public class ConfigurationFile { private String chanelConfigurationsPath; private String applicationLogDir; + private LogDriverConfiguration logDriverConfiguration; + public ConfigurationFile(String serverName, int serverPort, String serverPass, @@ -63,8 +65,11 @@ public class ConfigurationFile { public String getUserNickAuthStyle() { return nonNullString(userNickAuthStyle); } public String getUserMode() { return nonNullString(userMode); } public boolean getRejoinOnKick() { return rejoinOnKick; } - public String getLogDriver() { return nonNullString(logDriver); } - public String[] getLogDriverParameters() { return logDriverParameters; } + + public LogDriverConfiguration getLogDriverConfiguration(){ + return new LogDriverConfiguration(nonNullString(logDriver).toLowerCase(), logDriverParameters); + } + public String getBotAdministratorPassword() { return nonNullString(botAdministratorPassword); } public String getChanelConfigurationsPath() { return nonNullString(chanelConfigurationsPath); } public String getApplicationLogDir() { return nonNullString(applicationLogDir); } diff --git a/src/main/java/InnaIrcBot/config/LogDriverConfiguration.java b/src/main/java/InnaIrcBot/config/LogDriverConfiguration.java new file mode 100644 index 0000000..9e079e4 --- /dev/null +++ b/src/main/java/InnaIrcBot/config/LogDriverConfiguration.java @@ -0,0 +1,40 @@ +package InnaIrcBot.config; + +import InnaIrcBot.logging.SupportedLogDrivers; + +public class LogDriverConfiguration { + private String name; + private String[] params; + + public LogDriverConfiguration(String name, String[] params){ + this.name = name.toLowerCase(); + this.params = params; + validateName(); + validateParams(); + } + private void validateName(){ + if (! SupportedLogDrivers.contains(name)) { + name = SupportedLogDrivers.zero; + } + } + private void validateParams(){ + if (params == null) { + name = SupportedLogDrivers.zero; + return; + } + if (params.length == 0){ + name = SupportedLogDrivers.zero; + return; + } + if (params[0] == null){ + name = SupportedLogDrivers.zero; + return; + } + if (params[0].isEmpty()){ + name = SupportedLogDrivers.zero; + } + } + + public String getName() { return name; } + public String[] getParams() { return params; } +} diff --git a/src/main/java/InnaIrcBot/logging/LogDriver.java b/src/main/java/InnaIrcBot/logging/LogDriver.java new file mode 100644 index 0000000..037aa31 --- /dev/null +++ b/src/main/java/InnaIrcBot/logging/LogDriver.java @@ -0,0 +1,62 @@ +package InnaIrcBot.logging; + +import InnaIrcBot.ProvidersConsumers.StreamProvider; +import InnaIrcBot.config.LogDriverConfiguration; + +import java.util.HashMap; + +public class LogDriver { + private final static HashMap serverDriver = new HashMap<>(); + private final static HashMap systemLogWorkerMap = new HashMap<>(); + /** + * Define driver for desired server + * */ + // TODO: add proxy worker for using with multiple drivers + public static synchronized void setLogDriver(String server, + LogDriverConfiguration logDriverConfiguration, + String applicationLogDir){ + String[][] drvAndParams = { + {logDriverConfiguration.getName()}, + logDriverConfiguration.getParams() + }; + serverDriver.put(server, drvAndParams); + systemLogWorkerMap.put(server, new WorkerSystem(server, applicationLogDir)); + } + + public static synchronized Worker getWorker(String server, String channel){ + if (serverDriver.containsKey(server)) { + switch (serverDriver.get(server)[0][0]) { + case "files": + WorkerFiles workerFiles = new WorkerFiles(server, serverDriver.get(server)[1], channel); + return validateConsistancy(workerFiles, server, channel); + case "sqlite": + WorkerSQLite workerSQLite = new WorkerSQLite(server, serverDriver.get(server)[1], channel); + return validateConsistancy(workerSQLite, server, channel); + case "mongodb": + WorkerMongoDB workerMongoDB = new WorkerMongoDB(server, serverDriver.get(server)[1], channel); + return validateConsistancy(workerMongoDB, server, channel); + case "zero": + return new WorkerZero(); + } + } + System.out.println("Issue on BotDriver->getWorker(): Channel requested for non-existing server?\n" + + "\tUsing ZeroWorker."); + return new WorkerZero(); + } + // If channel found that it's impossible to use defined worker from user settings and asking for use ZeroWorker + public static synchronized Worker getZeroWorker(){ return new WorkerZero(); } + + public static synchronized WorkerSystem getSystemWorker(String serverName){ + return systemLogWorkerMap.get(serverName); + } + + private static Worker validateConsistancy(Worker worker, String server, String channel){ // synchronized? + if (worker.isConsistent()){ + return worker; + } + System.out.println("BotDriver->validateConstancy(): Unable to use " + +worker.getClass().getSimpleName()+" for "+server+"/"+channel + +". Using ZeroWorker instead."); + return new WorkerZero(); + } +} diff --git a/src/main/java/InnaIrcBot/logging/SupportedLogDrivers.java b/src/main/java/InnaIrcBot/logging/SupportedLogDrivers.java new file mode 100644 index 0000000..ff47c6c --- /dev/null +++ b/src/main/java/InnaIrcBot/logging/SupportedLogDrivers.java @@ -0,0 +1,24 @@ +package InnaIrcBot.logging; + +import java.util.ArrayList; +import java.util.List; + +public class SupportedLogDrivers{ + public static final String files = "files"; + public static final String sqlite = "sqlite"; + public static final String mongodb = "mongodb"; + public static final String zero = "zero"; + + private static final List supportedLogDrivers = new ArrayList<>(); + + static { + supportedLogDrivers.add(files); + supportedLogDrivers.add(sqlite); + supportedLogDrivers.add(mongodb); + supportedLogDrivers.add(zero); + } + + public static boolean contains(String driverName){ + return supportedLogDrivers.contains(driverName); + } +} \ No newline at end of file diff --git a/src/main/java/InnaIrcBot/LogDriver/Worker.java b/src/main/java/InnaIrcBot/logging/Worker.java similarity index 87% rename from src/main/java/InnaIrcBot/LogDriver/Worker.java rename to src/main/java/InnaIrcBot/logging/Worker.java index 40c2119..9eda8f4 100644 --- a/src/main/java/InnaIrcBot/LogDriver/Worker.java +++ b/src/main/java/InnaIrcBot/logging/Worker.java @@ -1,4 +1,4 @@ -package InnaIrcBot.LogDriver; +package InnaIrcBot.logging; public interface Worker { boolean consistent = false; diff --git a/src/main/java/InnaIrcBot/LogDriver/BotFilesWorker.java b/src/main/java/InnaIrcBot/logging/WorkerFiles.java similarity index 97% rename from src/main/java/InnaIrcBot/LogDriver/BotFilesWorker.java rename to src/main/java/InnaIrcBot/logging/WorkerFiles.java index 7e0882a..58f817e 100644 --- a/src/main/java/InnaIrcBot/LogDriver/BotFilesWorker.java +++ b/src/main/java/InnaIrcBot/logging/WorkerFiles.java @@ -1,4 +1,4 @@ -package InnaIrcBot.LogDriver; +package InnaIrcBot.logging; import java.io.File; import java.io.FileWriter; @@ -8,7 +8,7 @@ import java.time.LocalTime; import java.time.format.DateTimeFormatter; import java.util.regex.Pattern; -public class BotFilesWorker implements Worker { +public class WorkerFiles implements Worker { private final String channel; private String filePath; private final DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("HH:mm:ss"); @@ -17,7 +17,7 @@ public class BotFilesWorker implements Worker { private boolean consistent; - public BotFilesWorker(String server, String[] driverParameters, String channel){ + public WorkerFiles(String server, String[] driverParameters, String channel){ this.channel = channel.replaceAll(File.separator, ","); formatFilePath(server, driverParameters); diff --git a/src/main/java/InnaIrcBot/LogDriver/BotMongoWorker.java b/src/main/java/InnaIrcBot/logging/WorkerMongoDB.java similarity index 93% rename from src/main/java/InnaIrcBot/LogDriver/BotMongoWorker.java rename to src/main/java/InnaIrcBot/logging/WorkerMongoDB.java index c0c2ee3..5012c52 100644 --- a/src/main/java/InnaIrcBot/LogDriver/BotMongoWorker.java +++ b/src/main/java/InnaIrcBot/logging/WorkerMongoDB.java @@ -1,4 +1,4 @@ -package InnaIrcBot.LogDriver; +package InnaIrcBot.logging; import com.mongodb.*; import com.mongodb.client.MongoClient; @@ -8,6 +8,7 @@ import com.mongodb.client.MongoDatabase; import com.mongodb.event.*; import org.bson.Document; +import java.io.Closeable; import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -17,13 +18,13 @@ import java.util.concurrent.TimeUnit; * For each channel we store collection that have name of the ircServer + chanelName. * If user decides to use one MongoDB for various servers, he may use even one DB (declared in configuration file) and store collections in there. * **/ -public class BotMongoWorker implements Worker { //TODO consider skipping checks if server already added. +public class WorkerMongoDB implements Worker { //TODO consider skipping checks if server already added. private final static Map serversMap = Collections.synchronizedMap(new HashMap<>()); private final String server; private MongoCollection collection; private boolean consistent; - public BotMongoWorker(String server, String[] driverParameters, String channel){ + public WorkerMongoDB(String server, String[] driverParameters, String channel){ this.server = server; if (driverParameters.length < 2) @@ -129,17 +130,20 @@ public class BotMongoWorker implements Worker { //TODO consider sk // no need to close() obviously } - if (consistent){ - ThingToCloseOnDie thing = () -> { - if (serversMap.containsKey(server)) { - serversMap.get(server).close(); - serversMap.remove(server); - } - }; + setClosable(); + } + private void setClosable(){ + if (! consistent) + return; - BotDriver.getSystemWorker(server).registerInSystemWorker(thing); - } + Closeable thing = () -> { + if (serversMap.containsKey(server)) { + serversMap.get(server).close(); + serversMap.remove(server); + } + }; + LogDriver.getSystemWorker(server).registerInSystemWorker(thing); } @Override diff --git a/src/main/java/InnaIrcBot/LogDriver/BotSQLiteWorker.java b/src/main/java/InnaIrcBot/logging/WorkerSQLite.java similarity index 97% rename from src/main/java/InnaIrcBot/LogDriver/BotSQLiteWorker.java rename to src/main/java/InnaIrcBot/logging/WorkerSQLite.java index 10f6e20..1026efa 100644 --- a/src/main/java/InnaIrcBot/LogDriver/BotSQLiteWorker.java +++ b/src/main/java/InnaIrcBot/logging/WorkerSQLite.java @@ -1,4 +1,4 @@ -package InnaIrcBot.LogDriver; +package InnaIrcBot.logging; import org.sqlite.SQLiteConfig; import org.sqlite.SQLiteOpenMode; @@ -6,7 +6,7 @@ import org.sqlite.SQLiteOpenMode; import java.io.File; import java.sql.*; -public class BotSQLiteWorker implements Worker { +public class WorkerSQLite implements Worker { private Connection connection; private boolean consistent = false; @@ -16,7 +16,7 @@ public class BotSQLiteWorker implements Worker { /** * Don't even think of changing this balalaika. * */ - public BotSQLiteWorker(String server, String[] driverParameters, String channel){ // TODO: threads on SQLite level // remember: One file one DB + public WorkerSQLite(String server, String[] driverParameters, String channel){ // TODO: threads on SQLite level // remember: One file one DB this.ircServer = server; driverParameters[0] = driverParameters[0].trim(); File dir = new File(driverParameters[0]); diff --git a/src/main/java/InnaIrcBot/LogDriver/BotSystemWorker.java b/src/main/java/InnaIrcBot/logging/WorkerSystem.java similarity index 86% rename from src/main/java/InnaIrcBot/LogDriver/BotSystemWorker.java rename to src/main/java/InnaIrcBot/logging/WorkerSystem.java index 6440e23..0bf7a2e 100644 --- a/src/main/java/InnaIrcBot/LogDriver/BotSystemWorker.java +++ b/src/main/java/InnaIrcBot/logging/WorkerSystem.java @@ -1,22 +1,23 @@ -package InnaIrcBot.LogDriver; +package InnaIrcBot.logging; +import java.io.Closeable; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.time.LocalTime; import java.time.format.DateTimeFormatter; -public class BotSystemWorker implements SystemWorker{ +public class WorkerSystem{ private FileWriter fileWriter; private final DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("HH:mm:ss"); - private ThingToCloseOnDie thingToCloseOnDie; // call .die() method of this classes when this (system log class) dies. + private Closeable thingToCloseOnDie; // call .close() method of this classes when this (system log class) dies. private final String server; private boolean consistent = false; - public BotSystemWorker(String server, String appLogDir){ + public WorkerSystem(String server, String appLogDir){ this.server = server; if (appLogDir.isEmpty()) { @@ -53,7 +54,6 @@ public class BotSystemWorker implements SystemWorker{ return "["+ LocalTime.now().format(dateFormat)+"] "; } - @Override public void logAdd(String event, String initiatorArg, String messageArg) { if (consistent) { try { @@ -69,19 +69,16 @@ public class BotSystemWorker implements SystemWorker{ System.out.println(genDate() + event + " " + initiatorArg + " " + messageArg + "\n"); } - @Override - public void registerInSystemWorker(ThingToCloseOnDie thing){ + public void registerInSystemWorker(Closeable thing){ if (this.thingToCloseOnDie == null){ // only one needed this.thingToCloseOnDie = thing; } } - @Override public void close() { - if (thingToCloseOnDie != null) - thingToCloseOnDie.die(); - try { + if (thingToCloseOnDie != null) + thingToCloseOnDie.close(); fileWriter.close(); } catch (IOException | NullPointerException ignore){} diff --git a/src/main/java/InnaIrcBot/LogDriver/BotZeroWorker.java b/src/main/java/InnaIrcBot/logging/WorkerZero.java similarity index 73% rename from src/main/java/InnaIrcBot/LogDriver/BotZeroWorker.java rename to src/main/java/InnaIrcBot/logging/WorkerZero.java index e3b90d0..c78c3ed 100644 --- a/src/main/java/InnaIrcBot/LogDriver/BotZeroWorker.java +++ b/src/main/java/InnaIrcBot/logging/WorkerZero.java @@ -1,6 +1,6 @@ -package InnaIrcBot.LogDriver; +package InnaIrcBot.logging; -public class BotZeroWorker implements Worker{ +public class WorkerZero implements Worker{ @Override public boolean isConsistent() {return true;} diff --git a/src/main/java/Temporary/DriverTestMongo.java b/src/main/java/Temporary/DriverTestMongo.java deleted file mode 100644 index de09782..0000000 --- a/src/main/java/Temporary/DriverTestMongo.java +++ /dev/null @@ -1,74 +0,0 @@ -package Temporary; - -import InnaIrcBot.LogDriver.BotDriver; -import InnaIrcBot.LogDriver.Worker; - -public class DriverTestMongo { - - public static void main(String[] args){ - if (BotDriver.setLogDriver("irc.tomsk.net", "MongoDB", new String[]{"192.168.1.186:27017", - "irc", - "loper", - "password"}, - "/tmp/appLogs/")) - System.out.println("DRVT_Mongo:Successful driver initiation"); - else { - System.out.println("DRVT_Mongo:Failed driver initiation"); - return; - } - - Worker fw1 = BotDriver.getWorker("irc.tomsk.net","system"); - Worker fw2 = BotDriver.getWorker("irc.tomsk.net","#main"); - Worker fw3 = BotDriver.getWorker("irc.tomsk.net","#lpr"); - - if ((fw1 !=null) && (fw2 !=null) && (fw3 !=null)){ - System.out.println("DRVT_Mongo:LogFile1: "+fw1.isConsistent()); - System.out.println("DRVT_Mongo:LogFile2: "+fw2.isConsistent()); - System.out.println("DRVT_Mongo:LogFile3: "+fw3.isConsistent()); - boolean res; - - res = fw1.logAdd("JOIN", "de_su!loper@desktop.lan", "message1"); - System.out.println("DRVT_Mongo:fw1 exec result: "+res); - res = fw1.logAdd("PRIVMSG", "de_su!loper@desktop.lan", ": some text here"); - System.out.println("DRVT_Mongo:fw1 exec result: "+res); - res = fw1.logAdd("PRIVMSG", "de_su!loper@desktop.lan", ": more random tests"); - System.out.println("DRVT_Mongo:fw1 exec result: "+res); - res = fw1.logAdd("NICK", "de_su!loper@desktop.lan", "developer_su"); - System.out.println("DRVT_Mongo:fw1 exec result: "+res); - res = fw1.logAdd("MODE", "de_su!loper@desktop.lan", "+b username"); - System.out.println("DRVT_Mongo:fw1 exec result: "+res); - res = fw1.logAdd("PART", "de_su!loper@desktop.lan", "#chan1"); - System.out.println("DRVT_Mongo:fw1 exec result: "+res); - - res = fw2.logAdd("JOIN", "de_su!loper@desktop.lan", "message2"); - System.out.println("DRVT_Mongo:fw2 exec result: "+res); - res = fw2.logAdd("PRIVMSG", "de_su!loper@desktop.lan", ": some text here"); - System.out.println("DRVT_Mongo:fw2 exec result: "+res); - res = fw2.logAdd("PRIVMSG", "de_su!loper@desktop.lan", ": more random tests"); - System.out.println("DRVT_Mongo:fw2 exec result: "+res); - res = fw2.logAdd("NICK", "de_su!loper@desktop.lan", "developer_su"); - System.out.println("DRVT_Mongo:fw2 exec result: "+res); - res = fw2.logAdd("MODE", "de_su!loper@desktop.lan", "+b username"); - System.out.println("DRVT_Mongo:fw2 exec result: "+res); - res = fw2.logAdd("PART", "de_su!loper@desktop.lan", "#chan2"); - System.out.println("DRVT_Mongo:fw2 exec result: "+res); - - res = fw3.logAdd("JOIN", "de_su!loper@desktop.lan", "message3"); - System.out.println("DRVT_Mongo:fw3 exec result: "+res); - res = fw3.logAdd("PRIVMSG", "de_su!loper@desktop.lan", ": some text here"); - System.out.println("DRVT_Mongo:fw3 exec result: "+res); - res = fw3.logAdd("PRIVMSG", "de_su!loper@desktop.lan", ": more random tests"); - System.out.println("DRVT_Mongo:fw3 exec result: "+res); - res = fw3.logAdd("NICK", "de_su!loper@desktop.lan", "developer_su"); - System.out.println("DRVT_Mongo:fw3 exec result: "+res); - res = fw3.logAdd("MODE", "de_su!loper@desktop.lan", "+b username"); - System.out.println("DRVT_Mongo:fw3 exec result: "+res); - res = fw3.logAdd("PART", "de_su!loper@desktop.lan", "#chan3"); - System.out.println("DRVT_Mongo:fw3 exec result: "+res); - - fw1.close(); - fw2.close(); - fw3.close(); - } - } -} diff --git a/src/main/java/Temporary/StorageFileTest.java b/src/main/java/Temporary/StorageFileTest.java deleted file mode 100644 index e431a11..0000000 --- a/src/main/java/Temporary/StorageFileTest.java +++ /dev/null @@ -1,31 +0,0 @@ -package Temporary; - -import InnaIrcBot.config.ConfigurationFile; - -public class StorageFileTest { - static public void main(String[] args){ - ConfigurationFile config = new ConfigurationFile( - "", - 0, - "", - null, - "", - "", - "", - "", - "", - "", - true, - "", - new String[]{null}, - "", - "", - "" - ); - - System.out.println(config.getLogDriver().isEmpty()); - System.out.println(config.getLogDriverParameters().length); - - - } -} diff --git a/src/main/java/Temporary/StorageReaderTest.java b/src/main/java/Temporary/StorageReaderTest.java deleted file mode 100644 index ddfca14..0000000 --- a/src/main/java/Temporary/StorageReaderTest.java +++ /dev/null @@ -1,9 +0,0 @@ -package Temporary; - -public class StorageReaderTest { - public static void main(String[] args){ - // StorageReader.readConfig("/home/loper/bot.config"); - // StorageFile storageFile = StorageReader.getConfig(); - // System.out.println(storageFile.getLogDriver() == null); - } -} diff --git a/src/test/java/InnaIrcBot/config/ConfigurationFileTest.java b/src/test/java/InnaIrcBot/config/ConfigurationFileTest.java new file mode 100644 index 0000000..f496120 --- /dev/null +++ b/src/test/java/InnaIrcBot/config/ConfigurationFileTest.java @@ -0,0 +1,96 @@ +package InnaIrcBot.config; + +import InnaIrcBot.logging.SupportedLogDrivers; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class ConfigurationFileTest { + ConfigurationFile config; + + ConfigurationFileTest(){ + config = new ConfigurationFile( + null, + -100, + null, + null, + null, + null, + null, + null, + null, + null, + true, + null, + new String[]{null}, + null, + null, + null + ); + } + + @Test + void getServerName() { + } + + @Test + void getServerPort() { + } + + @Test + void getServerPass() { + } + + @Test + void getChannels() { + } + + @Test + void getUserNick() { + } + + @Test + void getUserIdent() { + } + + @Test + void getUserRealName() { + } + + @Test + void getUserNickPass() { + } + + @Test + void getUserNickAuthStyle() { + } + + @Test + void getUserMode() { + } + + @Test + void getRejoinOnKick() { + } + + @Test + void getLogDriverConfiguration() { + assertEquals(config.getLogDriverConfiguration().getName(), SupportedLogDrivers.zero); + } + + @Test + void getBotAdministratorPassword() { + } + + @Test + void getChanelConfigurationsPath() { + } + + @Test + void getApplicationLogDir() { + } + + @Test + void setUserNickAuthStyle() { + } +} \ No newline at end of file diff --git a/src/test/java/InnaIrcBot/LogDriver/BotDriverTest.java b/src/test/java/InnaIrcBot/logging/LogDriverTest.java similarity index 53% rename from src/test/java/InnaIrcBot/LogDriver/BotDriverTest.java rename to src/test/java/InnaIrcBot/logging/LogDriverTest.java index 98bb31d..8a563de 100644 --- a/src/test/java/InnaIrcBot/LogDriver/BotDriverTest.java +++ b/src/test/java/InnaIrcBot/logging/LogDriverTest.java @@ -1,5 +1,7 @@ -package InnaIrcBot.LogDriver; +package InnaIrcBot.logging; +import InnaIrcBot.config.LogDriverConfiguration; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -9,13 +11,14 @@ import org.junit.jupiter.api.io.TempDir; import java.nio.file.Path; -class BotDriverTest { +class LogDriverTest { @TempDir Path mainLogsDir, mainSQLiteLogsDir; - private static final String serverNameFiles = "irc.example.com"; - private static final String serverNameSQLite = "irc2.example.com"; + private static final String serverNameFiles = "files.example.com"; + private static final String serverNameSQLite = "sqlite.example.com"; + private static final String serverNameMongoDB = "mongo.example.com"; private Worker fw1; private Worker fw2; private Worker fw3; @@ -23,55 +26,66 @@ class BotDriverTest { @DisplayName("BotDriver: test files driver") @Test void driverFilesTest() { - assertTrue(this::initializeFilesLogDriver); - createWorkersForFiles(); + initializeFilesLogDriver(); + createWorkers(serverNameFiles); checkConsistency(); checkFilesWorkers(); validateDriver(); checkFilesWorkers(); close(); } - private void createWorkersForFiles(){ - fw1 = BotDriver.getWorker(serverNameFiles,"system"); - fw2 = BotDriver.getWorker(serverNameFiles,"#main"); - fw3 = BotDriver.getWorker(serverNameFiles,"#lpr"); + void checkFilesWorkers(){ + assertTrue(fw1 instanceof WorkerFiles); + assertTrue(fw2 instanceof WorkerFiles); + assertTrue(fw3 instanceof WorkerFiles); } @DisplayName("BotDriver: test SQLite driver") @Test void driverSQLiteTest() { - assertTrue(this::initializeSQLiteLogDriver); - createWorkersForSQLite(); + initializeSQLiteLogDriver(); + createWorkers(serverNameSQLite); checkConsistency(); checkSQLiteWorkers(); validateDriver(); checkSQLiteWorkers(); close(); } - private void createWorkersForSQLite(){ - fw1 = BotDriver.getWorker(serverNameSQLite,"system"); - fw2 = BotDriver.getWorker(serverNameSQLite,"#main"); - fw3 = BotDriver.getWorker(serverNameSQLite,"#lpr"); + void checkSQLiteWorkers(){ + assertTrue(fw1 instanceof WorkerSQLite); + assertTrue(fw2 instanceof WorkerSQLite); + assertTrue(fw3 instanceof WorkerSQLite); } + @Disabled("MongoDB connection/configuration example. Requires real MongdDB instance created & configured") + @DisplayName("BotDriver: test MongoDB driver") + @Test + void driverMongoTest() { + initializeMongoDBLogDriver(); + createWorkers(serverNameMongoDB); + checkConsistency(); + checkMongoDBWorkers(); + validateDriver(); + checkMongoDBWorkers(); + close(); + } + void checkMongoDBWorkers(){ + assertTrue(fw1 instanceof WorkerMongoDB); + assertTrue(fw2 instanceof WorkerMongoDB); + assertTrue(fw3 instanceof WorkerMongoDB); + } + + private void createWorkers(String server){ + fw1 = LogDriver.getWorker(server,"system"); + fw2 = LogDriver.getWorker(server,"#main"); + fw3 = LogDriver.getWorker(server,"#lpr"); + } void checkConsistency(){ assertTrue(fw1.isConsistent()); assertTrue(fw2.isConsistent()); assertTrue(fw3.isConsistent()); } - void checkFilesWorkers(){ - assertTrue(fw1 instanceof BotFilesWorker); - assertTrue(fw2 instanceof BotFilesWorker); - assertTrue(fw3 instanceof BotFilesWorker); - } - - void checkSQLiteWorkers(){ - assertTrue(fw1 instanceof BotSQLiteWorker); - assertTrue(fw2 instanceof BotSQLiteWorker); - assertTrue(fw3 instanceof BotSQLiteWorker); - } - void validateDriver(){ assertTrue(fw1.logAdd("JOIN", "de_su!loper@desktop.lan", "message1")); assertTrue(fw1.logAdd("PRIVMSG", "de_su!loper@desktop.lan", ": some text here")); @@ -95,12 +109,21 @@ class BotDriverTest { assertTrue(fw3.logAdd("PART", "de_su!loper@desktop.lan", "#chan3")); } - private boolean initializeFilesLogDriver(){ - return BotDriver.setLogDriver(serverNameFiles, "files", new String[]{mainLogsDir.toString()}, ""); + private void initializeFilesLogDriver(){ + LogDriver.setLogDriver(serverNameFiles, new LogDriverConfiguration("FileS", new String[]{mainLogsDir.toString()}), ""); } - private boolean initializeSQLiteLogDriver(){ - return BotDriver.setLogDriver(serverNameSQLite, "sqlite", new String[]{mainSQLiteLogsDir.toString()}, ""); + private void initializeSQLiteLogDriver(){ + LogDriver.setLogDriver(serverNameSQLite, new LogDriverConfiguration("SQliTe", new String[]{mainSQLiteLogsDir.toString()}), ""); + } + + private void initializeMongoDBLogDriver(){ + String[] params = new String[]{"192.168.1.186:27017", + "irc", + "loper", + "password"}; + + LogDriver.setLogDriver("irc.tomsk.net",new LogDriverConfiguration("MongoDB", params),""); } private void close(){