summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--aai-core/src/main/java/org/onap/aai/config/IntrospectionConfig.java35
-rw-r--r--aai-core/src/main/java/org/onap/aai/config/RestBeanConfig.java31
-rw-r--r--aai-core/src/main/java/org/onap/aai/config/SchemaConfiguration.java26
-rw-r--r--aai-core/src/main/java/org/onap/aai/config/SwaggerGenerationConfiguration.java43
-rw-r--r--aai-core/src/main/java/org/onap/aai/db/props/AAIProperties.java30
-rw-r--r--aai-core/src/main/java/org/onap/aai/dbmap/AAIGraph.java299
6 files changed, 237 insertions, 227 deletions
diff --git a/aai-core/src/main/java/org/onap/aai/config/IntrospectionConfig.java b/aai-core/src/main/java/org/onap/aai/config/IntrospectionConfig.java
index e0ce203d..aa4ec1a1 100644
--- a/aai-core/src/main/java/org/onap/aai/config/IntrospectionConfig.java
+++ b/aai-core/src/main/java/org/onap/aai/config/IntrospectionConfig.java
@@ -4,6 +4,8 @@
* ================================================================================
* Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
* ================================================================================
+ * Modifications Copyright © 2018 IBM.
+ * ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
@@ -35,23 +37,22 @@ import org.onap.aai.nodes.NodeIngestor;
@Configuration
public class IntrospectionConfig {
- private Map<SchemaVersion, MoxyLoader> MOXYINSTANCEMAP = new ConcurrentHashMap<>();
- @Autowired
- NodeIngestor nodeIngestor;
+ private Map<SchemaVersion, MoxyLoader> moxyInstanceMap = new ConcurrentHashMap<>();
+ @Autowired
+ NodeIngestor nodeIngestor;
- @Bean
- public LoaderFactory loaderFactory(SchemaVersions schemaVersions) {
- LoaderFactory loaderFactory = new LoaderFactory(moxyLoaderInstance(schemaVersions));
- return loaderFactory;
- }
+ @Bean
+ public LoaderFactory loaderFactory(SchemaVersions schemaVersions) {
+ return new LoaderFactory(moxyLoaderInstance(schemaVersions));
+ }
- @Bean
- public Map<SchemaVersion, MoxyLoader> moxyLoaderInstance(SchemaVersions schemaVersions) {
- for(SchemaVersion version : schemaVersions.getVersions()){
- if (!MOXYINSTANCEMAP.containsKey(version)) {
- MOXYINSTANCEMAP.put(version, new MoxyLoader(version, nodeIngestor));
- }
- }
- return MOXYINSTANCEMAP;
- }
+ @Bean
+ public Map<SchemaVersion, MoxyLoader> moxyLoaderInstance(SchemaVersions schemaVersions) {
+ for(SchemaVersion version : schemaVersions.getVersions()){
+ if (!moxyInstanceMap.containsKey(version)) {
+ moxyInstanceMap.put(version, new MoxyLoader(version, nodeIngestor));
+ }
+ }
+ return moxyInstanceMap;
+ }
}
diff --git a/aai-core/src/main/java/org/onap/aai/config/RestBeanConfig.java b/aai-core/src/main/java/org/onap/aai/config/RestBeanConfig.java
index 29763291..6c56ff69 100644
--- a/aai-core/src/main/java/org/onap/aai/config/RestBeanConfig.java
+++ b/aai-core/src/main/java/org/onap/aai/config/RestBeanConfig.java
@@ -4,6 +4,8 @@
* ================================================================================
* Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
* ================================================================================
+ * Modifications Copyright © 2018 IBM.
+ * ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
@@ -31,21 +33,18 @@ import org.springframework.context.annotation.Scope;
@Configuration
public class RestBeanConfig {
- @Bean(name = "traversalUriHttpEntry")
- @Scope(scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
- public HttpEntry traversalUriHttpEntry() {
- HttpEntry httpEntry = new HttpEntry(ModelType.MOXY, QueryStyle.TRAVERSAL_URI);
- return httpEntry;
- }
-
- @Bean(name = "traversalHttpEntry")
- @Scope(scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
- public HttpEntry traversalHttpEntry() {
- HttpEntry httpEntry = new HttpEntry(ModelType.MOXY, QueryStyle.TRAVERSAL);
-
- return httpEntry;
- }
-
-
+ @Bean(name = "traversalUriHttpEntry")
+ @Scope(scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+ public HttpEntry traversalUriHttpEntry() {
+ return new HttpEntry(ModelType.MOXY, QueryStyle.TRAVERSAL_URI);
+ }
+
+ @Bean(name = "traversalHttpEntry")
+ @Scope(scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+ public HttpEntry traversalHttpEntry() {
+ return new HttpEntry(ModelType.MOXY, QueryStyle.TRAVERSAL);
+ }
+
+
}
diff --git a/aai-core/src/main/java/org/onap/aai/config/SchemaConfiguration.java b/aai-core/src/main/java/org/onap/aai/config/SchemaConfiguration.java
index 20112bde..b00ecfb7 100644
--- a/aai-core/src/main/java/org/onap/aai/config/SchemaConfiguration.java
+++ b/aai-core/src/main/java/org/onap/aai/config/SchemaConfiguration.java
@@ -4,6 +4,8 @@
* ================================================================================
* Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
* ================================================================================
+ * Modifications Copyright © 2018 IBM.
+ * ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
@@ -43,20 +45,18 @@ public class SchemaConfiguration {
return new EdgeSerializer(edgeIngestor);
}
- @Bean(name = "nodeIngestor")
- public NodeIngestor nodeIngestor(ConfigTranslator configTranslator) {
- NodeIngestor nodeIngestor = new NodeIngestor(configTranslator);
- return nodeIngestor;
- }
+ @Bean(name = "nodeIngestor")
+ public NodeIngestor nodeIngestor(ConfigTranslator configTranslator) {
+ return new NodeIngestor(configTranslator);
+ }
- @Bean(name = "configTranslator")
- public ConfigTranslator configTranslator(SchemaLocationsBean schemaLocationsBean, SchemaVersions schemaVersions) {
- ConfigTranslator aaiConfigTranslator = new AAIConfigTranslator(schemaLocationsBean, schemaVersions);
- return aaiConfigTranslator;
- }
+ @Bean(name = "configTranslator")
+ public ConfigTranslator configTranslator(SchemaLocationsBean schemaLocationsBean, SchemaVersions schemaVersions) {
+ return new AAIConfigTranslator(schemaLocationsBean, schemaVersions);
+ }
- @Bean
- public SchemaErrorStrategy schemaErrorStrategy(){
+ @Bean
+ public SchemaErrorStrategy schemaErrorStrategy(){
return new CheckEverythingStrategy();
- }
+ }
}
diff --git a/aai-core/src/main/java/org/onap/aai/config/SwaggerGenerationConfiguration.java b/aai-core/src/main/java/org/onap/aai/config/SwaggerGenerationConfiguration.java
index a09018ad..fbbb703a 100644
--- a/aai-core/src/main/java/org/onap/aai/config/SwaggerGenerationConfiguration.java
+++ b/aai-core/src/main/java/org/onap/aai/config/SwaggerGenerationConfiguration.java
@@ -4,6 +4,8 @@
* ================================================================================
* Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
* ================================================================================
+ * Modifications Copyright © 2018 IBM.
+ * ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
@@ -35,28 +37,25 @@ import org.springframework.context.annotation.Scope;
@Configuration
public class SwaggerGenerationConfiguration {
- @Value("${schema.uri.base.path}")
- private String basePath;
+ @Value("${schema.uri.base.path}")
+ private String basePath;
- @Bean
- @Scope(scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
- public NodesYAMLfromOXM nodesYamlFromOXM(SchemaVersions schemaVersions, NodeIngestor nodeIngestor, EdgeIngestor edgeIngestor) {
- NodesYAMLfromOXM nodesYamlFromOXM = new NodesYAMLfromOXM(basePath, schemaVersions, nodeIngestor, edgeIngestor);
- return nodesYamlFromOXM;
- }
-
- @Bean
- @Scope(scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
- public HTMLfromOXM htmlFromOXM(SchemaVersions schemaVersions, NodeIngestor nodeIngestor, EdgeIngestor edgeIngestor) {
- HTMLfromOXM htmlFromOXM = new HTMLfromOXM(schemaVersions, nodeIngestor, edgeIngestor);
- return htmlFromOXM;
- }
-
- @Bean
- @Scope(scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
- public YAMLfromOXM yamlFromOXM(SchemaVersions schemaVersions, NodeIngestor nodeIngestor, EdgeIngestor edgeIngestor) {
- YAMLfromOXM yamlFromOXM = new YAMLfromOXM(basePath, schemaVersions, nodeIngestor, edgeIngestor);
- return yamlFromOXM;
- }
+ @Bean
+ @Scope(scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+ public NodesYAMLfromOXM nodesYamlFromOXM(SchemaVersions schemaVersions, NodeIngestor nodeIngestor, EdgeIngestor edgeIngestor) {
+ return new NodesYAMLfromOXM(basePath, schemaVersions, nodeIngestor, edgeIngestor);
+ }
+
+ @Bean
+ @Scope(scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+ public HTMLfromOXM htmlFromOXM(SchemaVersions schemaVersions, NodeIngestor nodeIngestor, EdgeIngestor edgeIngestor) {
+ return new HTMLfromOXM(schemaVersions, nodeIngestor, edgeIngestor);
+ }
+
+ @Bean
+ @Scope(scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+ public YAMLfromOXM yamlFromOXM(SchemaVersions schemaVersions, NodeIngestor nodeIngestor, EdgeIngestor edgeIngestor) {
+ return new YAMLfromOXM(basePath, schemaVersions, nodeIngestor, edgeIngestor);
+ }
}
diff --git a/aai-core/src/main/java/org/onap/aai/db/props/AAIProperties.java b/aai-core/src/main/java/org/onap/aai/db/props/AAIProperties.java
index 47e79a39..6b4035c6 100644
--- a/aai-core/src/main/java/org/onap/aai/db/props/AAIProperties.java
+++ b/aai-core/src/main/java/org/onap/aai/db/props/AAIProperties.java
@@ -4,6 +4,8 @@
* ================================================================================
* Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
* ================================================================================
+ * Modifications Copyright © 2018 IBM.
+ * ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
@@ -20,17 +22,21 @@
package org.onap.aai.db.props;
public class AAIProperties {
- public static final String NODE_TYPE = "aai-node-type";
- public static final String LAST_MOD_SOURCE_OF_TRUTH = "last-mod-source-of-truth";
- public static final String SOURCE_OF_TRUTH = "source-of-truth";
- public static final String LAST_MOD_TS = "aai-last-mod-ts";
- public static final String UNIQUE_KEY = "aai-unique-key";
- public static final String CREATED_TS = "aai-created-ts";
- public static final String RESOURCE_VERSION = "resource-version";
- public static final String AAI_URI = "aai-uri";
- public static final Integer MAXIMUM_DEPTH = 10000;
- public static final String LINKED = "linked";
- public static final String DB_ALIAS_SUFFIX = "-local";
- public static final String AAI_UUID = "aai-uuid";
+ public static final String NODE_TYPE = "aai-node-type";
+ public static final String LAST_MOD_SOURCE_OF_TRUTH = "last-mod-source-of-truth";
+ public static final String SOURCE_OF_TRUTH = "source-of-truth";
+ public static final String LAST_MOD_TS = "aai-last-mod-ts";
+ public static final String UNIQUE_KEY = "aai-unique-key";
+ public static final String CREATED_TS = "aai-created-ts";
+ public static final String RESOURCE_VERSION = "resource-version";
+ public static final String AAI_URI = "aai-uri";
+ public static final Integer MAXIMUM_DEPTH = 10000;
+ public static final String LINKED = "linked";
+ public static final String DB_ALIAS_SUFFIX = "-local";
+ public static final String AAI_UUID = "aai-uuid";
+
+ private AAIProperties() {
+
+ }
}
diff --git a/aai-core/src/main/java/org/onap/aai/dbmap/AAIGraph.java b/aai-core/src/main/java/org/onap/aai/dbmap/AAIGraph.java
index aae3aaae..84218e85 100644
--- a/aai-core/src/main/java/org/onap/aai/dbmap/AAIGraph.java
+++ b/aai-core/src/main/java/org/onap/aai/dbmap/AAIGraph.java
@@ -4,6 +4,8 @@
* ================================================================================
* Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
* ================================================================================
+ * Modifications Copyright © 2018 IBM.
+ * ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
@@ -54,151 +56,154 @@ import org.janusgraph.core.schema.JanusGraphManagement;
*/
public class AAIGraph {
- private static final EELFLogger logger = EELFManager.getInstance().getLogger(AAIGraph.class);
- protected static final String COMPONENT = "aaidbmap";
- protected Map<String, JanusGraph> graphs = new HashMap<>();
- private static final String REALTIME_DB = "realtime";
- private static final String CACHED_DB = "cached";
- private static boolean isInit = false;
-
-
-
- /**
- * Instantiates a new AAI graph.
- */
- private AAIGraph() {
- try {
- String serviceName = System.getProperty("aai.service.name", "NA");
- String rtConfig = System.getProperty("realtime.db.config");
- String cachedConfig = System.getProperty("cached.db.config");
- if (rtConfig == null) {
- rtConfig = AAIConstants.REALTIME_DB_CONFIG;
- }
- if (cachedConfig == null) {
- cachedConfig = AAIConstants.CACHED_DB_CONFIG;
- }
- this.loadGraph(REALTIME_DB, rtConfig, serviceName);
- this.loadGraph(CACHED_DB, cachedConfig, serviceName);
- } catch (Exception e) {
- throw new RuntimeException("Failed to instantiate graphs", e);
- }
- }
-
- private static class Helper {
- private static final AAIGraph INSTANCE = new AAIGraph();
- }
-
- /**
- * Gets the single instance of AAIGraph.
- *
- * @return single instance of AAIGraph
- */
- public static AAIGraph getInstance() {
- isInit = true;
- return Helper.INSTANCE;
- }
-
- public static boolean isInit() {
- return isInit;
- }
-
- private void loadGraph(String name, String configPath, String serviceName) throws Exception {
- // Graph being opened by JanusGraphFactory is being placed in hashmap to be used later
- // These graphs shouldn't be closed until the application shutdown
- try {
- PropertiesConfiguration propertiesConfiguration = new AAIGraphConfig.Builder(configPath).forService(serviceName).withGraphType(name).buildConfiguration();
- JanusGraph graph = JanusGraphFactory.open(propertiesConfiguration);
-
- Properties graphProps = new Properties();
- propertiesConfiguration.getKeys().forEachRemaining(k -> graphProps.setProperty(k, propertiesConfiguration.getString(k)));
-
- if ("inmemory".equals(graphProps.get("storage.backend"))) {
- // Load the propertyKeys, indexes and edge-Labels into the DB
- loadSchema(graph);
- loadSnapShotToInMemoryGraph(graph, graphProps);
- }
-
- if (graph == null) {
- throw new AAIException("AAI_5102");
- }
-
- graphs.put(name, graph);
- } catch (FileNotFoundException fnfe) {
- throw new AAIException("AAI_4001");
- } catch (IOException e) {
- throw new AAIException("AAI_4002");
- }
- }
-
- private void loadSnapShotToInMemoryGraph(JanusGraph graph, Properties graphProps) {
- if (logger.isDebugEnabled()) {
- logger.debug("Load Snapshot to InMemory Graph");
- }
- if (graphProps.containsKey("load.snapshot.file")) {
- String value = graphProps.getProperty("load.snapshot.file");
- if ("true".equals(value)) {
- try (Graph transaction = graph.newTransaction()) {
- String location = System.getProperty("snapshot.location");
- logAndPrint(logger, "Loading snapshot to inmemory graph.");
- transaction.io(IoCore.graphson()).readGraph(location);
- transaction.tx().commit();
- logAndPrint(logger, "Snapshot loaded to inmemory graph.");
- } catch (Exception e) {
- logAndPrint(logger,
- "ERROR: Could not load datasnapshot to in memory graph. \n"
- + ExceptionUtils.getFullStackTrace(e));
- throw new RuntimeException(e);
- }
- }
- }
- }
-
- private void loadSchema(JanusGraph graph) {
- // Load the propertyKeys, indexes and edge-Labels into the DB
- JanusGraphManagement graphMgt = graph.openManagement();
-
- System.out.println("-- loading schema into JanusGraph");
- SchemaGenerator.loadSchemaIntoJanusGraph( graph, graphMgt, "inmemory");
- }
-
- /**
- * Close all of the graph connections made in the instance.
- */
- public void graphShutdown() {
- graphs.values().stream().filter(JanusGraph::isOpen).forEach(JanusGraph::close);
- }
-
- /**
- * Gets the graph.
- *
- * @return the graph
- */
- public JanusGraph getGraph() {
- return graphs.get(REALTIME_DB);
- }
-
- public void graphShutdown(DBConnectionType connectionType) {
-
- graphs.get(this.getGraphName(connectionType)).close();
- }
-
- public JanusGraph getGraph(DBConnectionType connectionType) {
- return graphs.get(this.getGraphName(connectionType));
- }
-
- private String getGraphName(DBConnectionType connectionType) {
- String graphName = "";
- if (DBConnectionType.CACHED.equals(connectionType)) {
- graphName = this.CACHED_DB;
- } else if (DBConnectionType.REALTIME.equals(connectionType)) {
- graphName = this.REALTIME_DB;
- }
-
- return graphName;
- }
-
- private void logAndPrint(EELFLogger logger, String msg) {
- System.out.println(msg);
- logger.info(msg);
- }
+ private static final EELFLogger logger = EELFManager.getInstance().getLogger(AAIGraph.class);
+ protected static final String COMPONENT = "aaidbmap";
+ protected Map<String, JanusGraph> graphs = new HashMap<>();
+ private static final String REALTIME_DB = "realtime";
+ private static final String CACHED_DB = "cached";
+ private static boolean isInit = false;
+
+
+
+ /**
+ * Instantiates a new AAI graph.
+ */
+ private AAIGraph() {
+ try {
+ String serviceName = System.getProperty("aai.service.name", "NA");
+ String rtConfig = System.getProperty("realtime.db.config");
+ String cachedConfig = System.getProperty("cached.db.config");
+ if (rtConfig == null) {
+ rtConfig = AAIConstants.REALTIME_DB_CONFIG;
+ }
+ if (cachedConfig == null) {
+ cachedConfig = AAIConstants.CACHED_DB_CONFIG;
+ }
+ this.loadGraph(REALTIME_DB, rtConfig, serviceName);
+ this.loadGraph(CACHED_DB, cachedConfig, serviceName);
+ } catch (Exception e) {
+ throw new RuntimeException("Failed to instantiate graphs", e);
+ }
+ }
+
+ private static class Helper {
+ private static final AAIGraph INSTANCE = new AAIGraph();
+ private Helper() {
+
+ }
+ }
+
+ /**
+ * Gets the single instance of AAIGraph.
+ *
+ * @return single instance of AAIGraph
+ */
+ public static AAIGraph getInstance() {
+ isInit = true;
+ return Helper.INSTANCE;
+ }
+
+ public static boolean isInit() {
+ return isInit;
+ }
+
+ private void loadGraph(String name, String configPath, String serviceName) throws Exception {
+ // Graph being opened by JanusGraphFactory is being placed in hashmap to be used later
+ // These graphs shouldn't be closed until the application shutdown
+ try {
+ PropertiesConfiguration propertiesConfiguration = new AAIGraphConfig.Builder(configPath).forService(serviceName).withGraphType(name).buildConfiguration();
+ JanusGraph graph = JanusGraphFactory.open(propertiesConfiguration);
+
+ Properties graphProps = new Properties();
+ propertiesConfiguration.getKeys().forEachRemaining(k -> graphProps.setProperty(k, propertiesConfiguration.getString(k)));
+
+ if ("inmemory".equals(graphProps.get("storage.backend"))) {
+ // Load the propertyKeys, indexes and edge-Labels into the DB
+ loadSchema(graph);
+ loadSnapShotToInMemoryGraph(graph, graphProps);
+ }
+
+ if (graph == null) {
+ throw new AAIException("AAI_5102");
+ }
+
+ graphs.put(name, graph);
+ } catch (FileNotFoundException fnfe) {
+ throw new AAIException("AAI_4001");
+ } catch (IOException e) {
+ throw new AAIException("AAI_4002");
+ }
+ }
+
+ private void loadSnapShotToInMemoryGraph(JanusGraph graph, Properties graphProps) {
+ if (logger.isDebugEnabled()) {
+ logger.debug("Load Snapshot to InMemory Graph");
+ }
+ if (graphProps.containsKey("load.snapshot.file")) {
+ String value = graphProps.getProperty("load.snapshot.file");
+ if ("true".equals(value)) {
+ try (Graph transaction = graph.newTransaction()) {
+ String location = System.getProperty("snapshot.location");
+ logAndPrint(logger, "Loading snapshot to inmemory graph.");
+ transaction.io(IoCore.graphson()).readGraph(location);
+ transaction.tx().commit();
+ logAndPrint(logger, "Snapshot loaded to inmemory graph.");
+ } catch (Exception e) {
+ logAndPrint(logger,
+ "ERROR: Could not load datasnapshot to in memory graph. \n"
+ + ExceptionUtils.getFullStackTrace(e));
+ throw new RuntimeException(e);
+ }
+ }
+ }
+ }
+
+ private void loadSchema(JanusGraph graph) {
+ // Load the propertyKeys, indexes and edge-Labels into the DB
+ JanusGraphManagement graphMgt = graph.openManagement();
+
+ System.out.println("-- loading schema into JanusGraph");
+ SchemaGenerator.loadSchemaIntoJanusGraph( graph, graphMgt, "inmemory");
+ }
+
+ /**
+ * Close all of the graph connections made in the instance.
+ */
+ public void graphShutdown() {
+ graphs.values().stream().filter(JanusGraph::isOpen).forEach(JanusGraph::close);
+ }
+
+ /**
+ * Gets the graph.
+ *
+ * @return the graph
+ */
+ public JanusGraph getGraph() {
+ return graphs.get(REALTIME_DB);
+ }
+
+ public void graphShutdown(DBConnectionType connectionType) {
+
+ graphs.get(this.getGraphName(connectionType)).close();
+ }
+
+ public JanusGraph getGraph(DBConnectionType connectionType) {
+ return graphs.get(this.getGraphName(connectionType));
+ }
+
+ private String getGraphName(DBConnectionType connectionType) {
+ String graphName = "";
+ if (DBConnectionType.CACHED.equals(connectionType)) {
+ graphName = this.CACHED_DB;
+ } else if (DBConnectionType.REALTIME.equals(connectionType)) {
+ graphName = this.REALTIME_DB;
+ }
+
+ return graphName;
+ }
+
+ private void logAndPrint(EELFLogger logger, String msg) {
+ System.out.println(msg);
+ logger.info(msg);
+ }
}