소스 검색

Added basic configuration from a file

Lukas Cerny 5 년 전
부모
커밋
bd278fa95c

+ 10 - 10
build.gradle

@@ -16,16 +16,16 @@ test {
     useJUnitPlatform()
 }
 
-//jar {
-//    manifest {
-//        attributes(
-//                'Main-Class': 'cz.senslog.analyzer.app.Main'
-//        )
-//    }
-//    from {
-//        configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
-//    }
-//}
+jar {
+    manifest {
+        attributes(
+                'Main-Class': 'cz.senslog.analyzer.app.Main'
+        )
+    }
+    from {
+        configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
+    }
+}
 
 dependencies {
     testCompile group: 'org.junit.jupiter', name: 'junit-jupiter', version: '5.6.0'

+ 12 - 0
config/config.yaml

@@ -0,0 +1,12 @@
+database:
+  url: "jdbc:postgresql://localhost:5432/postgres"
+  username: "postgres"
+  password: "postgres"
+  connectionPoolSize: 6
+
+scheduler:
+  initDate: 2020-01-30T15:00:00.000
+  period: 100
+
+server:
+  port: 9090

+ 11 - 16
src/main/java/cz/senslog/analyzer/app/Application.java

@@ -4,18 +4,18 @@ import cz.senslog.analyzer.analysis.Analyzer;
 import cz.senslog.analyzer.analysis.DaggerAnalyzerComponent;
 import cz.senslog.analyzer.persistence.ConnectionModule;
 import cz.senslog.analyzer.persistence.DatabaseConfig;
-import cz.senslog.analyzer.provider.ProviderConfiguration;
+import cz.senslog.analyzer.provider.ProviderConfig;
 import cz.senslog.analyzer.provider.DaggerDataProviderComponent;
 import cz.senslog.analyzer.provider.DataProvider;
 import cz.senslog.analyzer.server.DaggerServerComponent;
 import cz.senslog.analyzer.server.Server;
+import cz.senslog.common.util.Triple;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
 import java.io.IOException;
 import java.lang.management.ManagementFactory;
 import java.lang.management.RuntimeMXBean;
-import java.time.LocalDateTime;
 
 /**
  * The class {@code Application} represents a trigger for entire application.
@@ -72,25 +72,20 @@ public class Application extends Thread {
     public void run() {
 
         String configFile = params.getConfigFileName();
+        Triple<DatabaseConfig, ProviderConfig, Integer> configs = null;
+        try {
+            configs = Configuration.load(configFile);
+        } catch (IOException e) {
+            System.exit(1);
+        }
 
-        DatabaseConfig dbConfig = new DatabaseConfig(
-                "jdbc:postgresql://localhost:5432/postgres",
-                "postgres",
-                "postgres",
-                6
-        );
-
-        int port = 8090;
+        DatabaseConfig dbConfig = configs.getItem1();
+        ProviderConfig config = configs.getItem2();
+        int port = configs.getItem3();
 
 
         ConnectionModule connectionModule = ConnectionModule.create(dbConfig);
 
-
-        ProviderConfiguration config = ProviderConfiguration.config()
-                .period(5)
-                .startDateTime(LocalDateTime.of(2019, 2, 10, 2, 0))
-                .get();
-
         Analyzer analyzer = DaggerAnalyzerComponent.builder()
                 .connectionModule(connectionModule)
                 .build().createSimpleAnalyzer();

+ 96 - 0
src/main/java/cz/senslog/analyzer/app/Configuration.java

@@ -0,0 +1,96 @@
+package cz.senslog.analyzer.app;
+
+import cz.senslog.analyzer.persistence.DatabaseConfig;
+import cz.senslog.analyzer.provider.ProviderConfig;
+import cz.senslog.common.exception.UnsupportedFileException;
+import cz.senslog.common.util.Triple;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.yaml.snakeyaml.Yaml;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.Map;
+
+import static java.time.ZoneOffset.UTC;
+
+public class Configuration {
+    private static Logger logger = LogManager.getLogger(Configuration.class);
+
+    public static Triple<DatabaseConfig, ProviderConfig, Integer> load(String fileName) throws IOException {
+
+        logger.info("Loading '{}' configuration file.", fileName);
+
+        if (!fileName.toLowerCase().endsWith(".yaml")) {
+            throw new UnsupportedFileException(fileName + "does not contain .yaml extension.");
+        }
+
+        Path filePath = Paths.get(fileName);
+        if (Files.notExists(filePath)) {
+            throw new FileNotFoundException(fileName + " does not exist");
+        }
+
+        Map<Object, Object> properties;
+
+        logger.debug("Opening the file '{}'.", fileName);
+        try (InputStream fileStream = Files.newInputStream(filePath)) {
+            logger.debug("Parsing the yaml file '{}'.", fileName);
+            properties = new Yaml().load(fileStream);
+            logger.debug("The configuration yaml file '{}' was parsed successfully.", fileName);
+        }
+
+        if (properties == null || properties.isEmpty()) {
+            throw new IOException(String.format(
+                    "The configuration yaml file %s is empty or was not loaded successfully. ", fileName
+            ));
+        }
+
+        Object dbMap = properties.get("database");
+        if (!(dbMap instanceof Map)) {
+            throw new IOException(String.format(
+                    "Configuration file '%s' contains an error at 'database' attribute.", fileName
+            ));
+        }
+
+        Object schedulerMap = properties.get("scheduler");
+        if (!(schedulerMap instanceof Map)) {
+            throw new IOException(String.format(
+                    "Configuration file '%s' contains an error at 'scheduler' attribute.", fileName
+            ));
+        }
+
+        Object serverMap = properties.get("server");
+        if (!(serverMap instanceof Map)) {
+            throw new IOException(String.format(
+                    "Configuration file '%s' contains an error at 'server' attribute.", fileName
+            ));
+        }
+
+        Map<String, Object> databaseConfigMap = (Map<String, Object>)dbMap;
+        DatabaseConfig databaseConfig = new DatabaseConfig(
+                (String)databaseConfigMap.get("url"),
+                (String)databaseConfigMap.get("username"),
+                (String)databaseConfigMap.get("password"),
+                (Integer) databaseConfigMap.get("connectionPoolSize")
+        );
+
+        Map<String, Object> schedulerConfigMap = (Map<String, Object>)schedulerMap;
+        LocalDateTime initDate = ((Date)schedulerConfigMap.get("initDate")).toInstant().atZone(UTC).toLocalDateTime();
+        ProviderConfig providerConfig = ProviderConfig.config()
+                .startDateTime(initDate)
+                .period((Integer)schedulerConfigMap.get("period"))
+                .get();
+
+
+        Map<String, Object> serverConfigMap = (Map<String, Object>)serverMap;
+        Integer port = (Integer)serverConfigMap.get("port");
+
+        return Triple.of(databaseConfig, providerConfig, port);
+    }
+}

+ 2 - 2
src/main/java/cz/senslog/analyzer/provider/DataProvider.java

@@ -6,9 +6,9 @@ public abstract class DataProvider {
 
     protected Analyzer analyzer;
 
-    protected ProviderConfiguration config;
+    protected ProviderConfig config;
 
-    public void init(Analyzer analyzer, ProviderConfiguration providerConfiguration) {
+    public void init(Analyzer analyzer, ProviderConfig providerConfiguration) {
         this.analyzer = analyzer;
         this.config = providerConfiguration;
     }

+ 5 - 5
src/main/java/cz/senslog/analyzer/provider/ProviderConfiguration.java → src/main/java/cz/senslog/analyzer/provider/ProviderConfig.java

@@ -2,14 +2,14 @@ package cz.senslog.analyzer.provider;
 
 import java.time.LocalDateTime;
 
-public class ProviderConfiguration {
+public class ProviderConfig {
 
     public interface ConfigurationBuilder {
 
         ConfigurationBuilder period(int period);
         ConfigurationBuilder startDateTime(LocalDateTime startDateTime);
 
-        ProviderConfiguration get();
+        ProviderConfig get();
     }
 
     public static ConfigurationBuilder config() {
@@ -31,8 +31,8 @@ public class ProviderConfiguration {
             }
 
             @Override
-            public ProviderConfiguration get() {
-                return new ProviderConfiguration(period, startDateTime);
+            public ProviderConfig get() {
+                return new ProviderConfig(period, startDateTime);
             }
         };
     }
@@ -40,7 +40,7 @@ public class ProviderConfiguration {
     private final int period;
     private final LocalDateTime startDateTime;
 
-    private ProviderConfiguration(int period, LocalDateTime startDateTime) {
+    private ProviderConfig(int period, LocalDateTime startDateTime) {
         this.period = period;
         this.startDateTime = startDateTime;
     }

+ 1 - 1
src/main/java/cz/senslog/analyzer/provider/ScheduledDataProviderConfig.java

@@ -2,5 +2,5 @@ package cz.senslog.analyzer.provider;
 
 public interface ScheduledDataProviderConfig {
 
-    DataProviderDeployment config(ProviderConfiguration providerConfiguration);
+    DataProviderDeployment config(ProviderConfig providerConfiguration);
 }

+ 2 - 2
src/main/java/cz/senslog/analyzer/provider/ScheduledDataProviderConfigImpl.java

@@ -6,7 +6,7 @@ public class ScheduledDataProviderConfigImpl implements ScheduledDataProviderCon
 
     private final ScheduledDatabaseProvider provider;
 
-    private ProviderConfiguration providerConfiguration;
+    private ProviderConfig providerConfiguration;
 
     public ScheduledDataProviderConfigImpl(ScheduledDatabaseProvider provider) {
         this.provider = provider;
@@ -19,7 +19,7 @@ public class ScheduledDataProviderConfigImpl implements ScheduledDataProviderCon
     }
 
     @Override
-    public DataProviderDeployment config(ProviderConfiguration providerConfiguration) {
+    public DataProviderDeployment config(ProviderConfig providerConfiguration) {
         this.providerConfiguration = providerConfiguration;
         return this;
     }