From 6171e53ff4d2c270ea0b503ca1983a3cc7755425 Mon Sep 17 00:00:00 2001 From: Robert von Burg Date: Wed, 14 Jun 2017 12:53:08 +0200 Subject: [PATCH] [New] Implemented simple OperationsLog to storing messages --- .../src/main/java/li/strolch/model/Tags.java | 10 ++++ .../handler/operationslog/LogMessage.java | 50 +++++++++++++++++++ .../handler/operationslog/LogSeverity.java | 27 ++++++++++ .../handler/operationslog/OperationsLog.java | 48 ++++++++++++++++++ .../java/li/strolch/utils/I18nMessage.java | 49 ++++++++++++++++++ 5 files changed, 184 insertions(+) create mode 100644 li.strolch.service/src/main/java/li/strolch/handler/operationslog/LogMessage.java create mode 100644 li.strolch.service/src/main/java/li/strolch/handler/operationslog/LogSeverity.java create mode 100644 li.strolch.service/src/main/java/li/strolch/handler/operationslog/OperationsLog.java create mode 100644 li.strolch.utils/src/main/java/li/strolch/utils/I18nMessage.java diff --git a/li.strolch.model/src/main/java/li/strolch/model/Tags.java b/li.strolch.model/src/main/java/li/strolch/model/Tags.java index 33b9277fa..b6c9afe90 100644 --- a/li.strolch.model/src/main/java/li/strolch/model/Tags.java +++ b/li.strolch.model/src/main/java/li/strolch/model/Tags.java @@ -63,6 +63,11 @@ public class Tags { public static final String RESOURCE_TYPE = "ResourceType"; public static final String STATE_ID = "StateId"; + public static final String LOCATOR = "Locator"; + public static final String SEVERITY = "Severity"; + public static final String KEY = "Key"; + public static final String MESSAGE = "Message"; + public static class Json { // elements @@ -107,6 +112,11 @@ public class Tags { public static final String CREATED_BY = "createdBy"; public static final String DELETED = "deleted"; + public static final String LOCATOR = "locator"; + public static final String SEVERITY = "severity"; + public static final String KEY = "key"; + public static final String MESSAGE = "message"; + // miscellaneous public static final String ELEMENTS = "elements"; diff --git a/li.strolch.service/src/main/java/li/strolch/handler/operationslog/LogMessage.java b/li.strolch.service/src/main/java/li/strolch/handler/operationslog/LogMessage.java new file mode 100644 index 000000000..de230de70 --- /dev/null +++ b/li.strolch.service/src/main/java/li/strolch/handler/operationslog/LogMessage.java @@ -0,0 +1,50 @@ +package li.strolch.handler.operationslog; + +import com.google.gson.JsonObject; + +import li.strolch.model.Locator; +import li.strolch.model.Tags.Json; +import li.strolch.utils.I18nMessage; + +public class LogMessage extends I18nMessage { + + private final Locator locator; + private final LogSeverity severity; + + public LogMessage(Locator locator, LogSeverity logSeverity, String bundleId, String key) { + super(bundleId, key); + this.locator = locator; + this.severity = logSeverity; + } + + public LogSeverity getSeverity() { + return this.severity; + } + + public Locator getLocator() { + return this.locator; + } + + @Override + public LogMessage value(String key, String value) { + super.value(key, value); + return this; + } + + public JsonObject toJson() { + + JsonObject jsonObject = new JsonObject(); + + jsonObject.addProperty(Json.KEY, getKey()); + jsonObject.addProperty(Json.MESSAGE, formatMessage()); + jsonObject.addProperty(Json.SEVERITY, this.severity.getSeverity()); + jsonObject.addProperty(Json.LOCATOR, this.locator.toString()); + JsonObject values = new JsonObject(); + for (String key : getValues().stringPropertyNames()) { + values.addProperty(key, getValues().getProperty(key)); + } + jsonObject.add(Json.VALUES, values); + + return jsonObject; + } +} diff --git a/li.strolch.service/src/main/java/li/strolch/handler/operationslog/LogSeverity.java b/li.strolch.service/src/main/java/li/strolch/handler/operationslog/LogSeverity.java new file mode 100644 index 000000000..96d37a5ed --- /dev/null +++ b/li.strolch.service/src/main/java/li/strolch/handler/operationslog/LogSeverity.java @@ -0,0 +1,27 @@ +package li.strolch.handler.operationslog; + +public enum LogSeverity { + INFO("Info"), // + WARN("Warn"), // + ERROR("Error"), // + EXCEPTION("Exception"); + + private String severity; + + private LogSeverity(String severity) { + this.severity = severity; + } + + public String getSeverity() { + return this.severity; + } + + public static LogSeverity from(String value) { + for (LogSeverity type : values()) { + if (type.severity.equals(value)) + return type; + } + + throw new IllegalArgumentException("No severity exists for " + value); + } +} diff --git a/li.strolch.service/src/main/java/li/strolch/handler/operationslog/OperationsLog.java b/li.strolch.service/src/main/java/li/strolch/handler/operationslog/OperationsLog.java new file mode 100644 index 000000000..3ebfb3db3 --- /dev/null +++ b/li.strolch.service/src/main/java/li/strolch/handler/operationslog/OperationsLog.java @@ -0,0 +1,48 @@ +package li.strolch.handler.operationslog; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.stream.Collectors; + +import li.strolch.agent.api.ComponentContainer; +import li.strolch.agent.api.StrolchComponent; +import li.strolch.model.Locator; +import li.strolch.runtime.configuration.ComponentConfiguration; + +public class OperationsLog extends StrolchComponent { + + private LinkedHashMap logMessages; + + public OperationsLog(ComponentContainer container, String componentName) { + super(container, componentName); + } + + @Override + public void initialize(ComponentConfiguration configuration) throws Exception { + + int maxMessages = configuration.getInt("maxMessages", 10000); + + this.logMessages = new LinkedHashMap() { + private static final long serialVersionUID = 1L; + + @Override + protected boolean removeEldestEntry(java.util.Map.Entry eldest) { + return size() > maxMessages; + } + }; + + super.initialize(configuration); + } + + public void addMessage(LogMessage logMessage) { + this.logMessages.put(logMessage.getLocator(), logMessage); + } + + public LogMessage getMessage(Locator locator) { + return this.logMessages.get(locator); + } + + public List getMessages() { + return this.logMessages.entrySet().stream().map(e -> e.getValue()).collect(Collectors.toList()); + } +} diff --git a/li.strolch.utils/src/main/java/li/strolch/utils/I18nMessage.java b/li.strolch.utils/src/main/java/li/strolch/utils/I18nMessage.java new file mode 100644 index 000000000..50aed5aa9 --- /dev/null +++ b/li.strolch.utils/src/main/java/li/strolch/utils/I18nMessage.java @@ -0,0 +1,49 @@ +package li.strolch.utils; + +import static li.strolch.utils.helper.StringHelper.EMPTY; + +import java.util.Properties; +import java.util.ResourceBundle; + +import li.strolch.utils.dbc.DBC; +import li.strolch.utils.helper.StringHelper; + +public class I18nMessage { + + private String bundleId; + private String key; + private Properties values; + + public I18nMessage(String bundleId, String key) { + DBC.INTERIM.assertNotEmpty("bundleId must be set!", bundleId); + DBC.INTERIM.assertNotEmpty("key must be set!", key); + this.bundleId = bundleId; + this.key = key; + this.values = new Properties(); + } + + public String getBundleId() { + return this.bundleId; + } + + public String getKey() { + return this.key; + } + + public Properties getValues() { + return this.values; + } + + public I18nMessage value(String key, String value) { + DBC.INTERIM.assertNotEmpty("key must be set!", key); + DBC.INTERIM.assertNotEmpty("value must be set!", value); + this.values.setProperty(key, value); + return this; + } + + public String formatMessage() { + ResourceBundle bundle = ResourceBundle.getBundle(this.bundleId); + String string = bundle.getString(this.key); + return StringHelper.replacePropertiesIn(this.values, EMPTY, string); + } +}