From e459b561b8745790960e54f9f58606ff797b1101 Mon Sep 17 00:00:00 2001 From: Robert von Burg Date: Thu, 15 Jun 2017 13:33:14 +0200 Subject: [PATCH] [Major] LogMessage now has an ID which is used in OperationsLog --- .../handler/operationslog/LogMessage.java | 33 ++++++++++ .../handler/operationslog/OperationsLog.java | 64 +++++++++++++------ .../src/main/java/li/strolch/model/Tags.java | 2 + 3 files changed, 81 insertions(+), 18 deletions(-) diff --git a/li.strolch.agent/src/main/java/li/strolch/handler/operationslog/LogMessage.java b/li.strolch.agent/src/main/java/li/strolch/handler/operationslog/LogMessage.java index 1f461608e..1da3741f1 100644 --- a/li.strolch.agent/src/main/java/li/strolch/handler/operationslog/LogMessage.java +++ b/li.strolch.agent/src/main/java/li/strolch/handler/operationslog/LogMessage.java @@ -4,6 +4,7 @@ import java.util.ResourceBundle; import com.google.gson.JsonObject; +import li.strolch.agent.api.StrolchAgent; import li.strolch.model.Locator; import li.strolch.model.Tags.Json; import li.strolch.utils.I18nMessage; @@ -11,17 +12,23 @@ import li.strolch.utils.helper.ExceptionHelper; public class LogMessage extends I18nMessage { + private final String id; private final String realm; private final Locator locator; private final LogSeverity severity; public LogMessage(String realm, Locator locator, LogSeverity logSeverity, ResourceBundle bundle, String key) { super(bundle, key); + this.id = StrolchAgent.getUniqueId(); this.realm = realm; this.locator = locator; this.severity = logSeverity; } + public String getId() { + return this.id; + } + public String getRealm() { return this.realm; } @@ -49,6 +56,7 @@ public class LogMessage extends I18nMessage { JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty(Json.ID, this.id); jsonObject.addProperty(Json.KEY, getKey()); jsonObject.addProperty(Json.MESSAGE, formatMessage()); jsonObject.addProperty(Json.SEVERITY, this.severity.getSeverity()); @@ -62,4 +70,29 @@ public class LogMessage extends I18nMessage { return jsonObject; } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((this.id == null) ? 0 : this.id.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + LogMessage other = (LogMessage) obj; + if (this.id == null) { + if (other.id != null) + return false; + } else if (!this.id.equals(other.id)) + return false; + return true; + } } diff --git a/li.strolch.agent/src/main/java/li/strolch/handler/operationslog/OperationsLog.java b/li.strolch.agent/src/main/java/li/strolch/handler/operationslog/OperationsLog.java index 3879fbe14..32ae38400 100644 --- a/li.strolch.agent/src/main/java/li/strolch/handler/operationslog/OperationsLog.java +++ b/li.strolch.agent/src/main/java/li/strolch/handler/operationslog/OperationsLog.java @@ -1,5 +1,6 @@ package li.strolch.handler.operationslog; +import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; @@ -15,7 +16,8 @@ import li.strolch.runtime.configuration.ComponentConfiguration; public class OperationsLog extends StrolchComponent { - private Map> logMessagesByRealm; + private Map> logMessagesById; + private Map>> logMessagesByLocator; private int maxMessages; public OperationsLog(ComponentContainer container, String componentName) { @@ -27,41 +29,67 @@ public class OperationsLog extends StrolchComponent { this.maxMessages = configuration.getInt("maxMessages", 10000); - this.logMessagesByRealm = new HashMap<>(); + this.logMessagesById = new HashMap<>(); + this.logMessagesByLocator = new HashMap<>(); super.initialize(configuration); } public void addMessage(LogMessage logMessage) { - LinkedHashMap logMessages = this.logMessagesByRealm.computeIfAbsent(logMessage.getRealm(), - this::newBoundedMap); + // store in global list + LinkedHashMap logMessages = this.logMessagesById.computeIfAbsent(logMessage.getRealm(), + this::newBoundedStringMap); + logMessages.put(logMessage.getId(), logMessage); - logMessages.put(logMessage.getLocator(), logMessage); + // store under locator + LinkedHashMap> logMessagesLocator = this.logMessagesByLocator + .computeIfAbsent(logMessage.getRealm(), this::newBoundedLocatorMap); + List messages = logMessagesLocator.computeIfAbsent(logMessage.getLocator(), + (l) -> new ArrayList()); + messages.add(logMessage); } - private LinkedHashMap newBoundedMap(String realm) { - return new LinkedHashMap() { - private static final long serialVersionUID = 1L; - - @Override - protected boolean removeEldestEntry(java.util.Map.Entry eldest) { - return size() > maxMessages; - } - }; + public void clearMessages(String realm, Locator locator) { + LinkedHashMap> logMessages = this.logMessagesByLocator.get(realm); + if (logMessages != null) + logMessages.remove(locator); } - public Optional getMessage(String realm, Locator locator) { - LinkedHashMap logMessages = this.logMessagesByRealm.computeIfAbsent(realm, - this::newBoundedMap); + public Optional> getMessagesFor(String realm, Locator locator) { + LinkedHashMap> logMessages = this.logMessagesByLocator.get(realm); + if (logMessages == null) + return Optional.empty(); return Optional.ofNullable(logMessages.get(locator)); } public List getMessages(String realm) { - LinkedHashMap logMessages = this.logMessagesByRealm.get(realm); + LinkedHashMap logMessages = this.logMessagesById.get(realm); if (logMessages == null) return Collections.emptyList(); return logMessages.entrySet().stream().map(e -> e.getValue()).collect(Collectors.toList()); } + + private LinkedHashMap newBoundedStringMap(String realm) { + return new LinkedHashMap() { + private static final long serialVersionUID = 1L; + + @Override + protected boolean removeEldestEntry(java.util.Map.Entry eldest) { + return size() > maxMessages; + } + }; + } + + private LinkedHashMap> newBoundedLocatorMap(String realm) { + return new LinkedHashMap>() { + private static final long serialVersionUID = 1L; + + @Override + protected boolean removeEldestEntry(java.util.Map.Entry> eldest) { + return size() > maxMessages; + } + }; + } } 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 5ac721151..213e8dd35 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 @@ -69,6 +69,7 @@ public class Tags { public static final String SEVERITY = "Severity"; public static final String KEY = "Key"; public static final String MESSAGE = "Message"; + public static final String MESSAGES = "Messages"; public static final String REALM = "Realm"; public static class Json { @@ -119,6 +120,7 @@ public class Tags { public static final String SEVERITY = "severity"; public static final String KEY = "key"; public static final String MESSAGE = "message"; + public static final String MESSAGES = "messages"; public static final String REALM = "realm"; // miscellaneous