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 1da3741f1..a748c3ec4 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 @@ -74,8 +74,10 @@ public class LogMessage extends I18nMessage { @Override public int hashCode() { final int prime = 31; - int result = 1; - result = prime * result + ((this.id == null) ? 0 : this.id.hashCode()); + int result = super.hashCode(); + result = prime * result + ((this.locator == null) ? 0 : this.locator.hashCode()); + result = prime * result + ((this.realm == null) ? 0 : this.realm.hashCode()); + result = prime * result + ((this.severity == null) ? 0 : this.severity.hashCode()); return result; } @@ -83,15 +85,22 @@ public class LogMessage extends I18nMessage { public boolean equals(Object obj) { if (this == obj) return true; - if (obj == null) + if (!super.equals(obj)) return false; if (getClass() != obj.getClass()) return false; LogMessage other = (LogMessage) obj; - if (this.id == null) { - if (other.id != null) + if (this.locator == null) { + if (other.locator != null) return false; - } else if (!this.id.equals(other.id)) + } else if (!this.locator.equals(other.locator)) + return false; + if (this.realm == null) { + if (other.realm != null) + return false; + } else if (!this.realm.equals(other.realm)) + return false; + if (this.severity != other.severity) return false; return true; } diff --git a/li.strolch.agent/src/main/java/li/strolch/handler/operationslog/LogSeverity.java b/li.strolch.agent/src/main/java/li/strolch/handler/operationslog/LogSeverity.java index 96d37a5ed..76f17f182 100644 --- a/li.strolch.agent/src/main/java/li/strolch/handler/operationslog/LogSeverity.java +++ b/li.strolch.agent/src/main/java/li/strolch/handler/operationslog/LogSeverity.java @@ -2,6 +2,7 @@ package li.strolch.handler.operationslog; public enum LogSeverity { INFO("Info"), // + NOTIFICATION("Notification"), // WARN("Warn"), // ERROR("Error"), // EXCEPTION("Exception"); 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 32ae38400..8f5e7328c 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 @@ -4,10 +4,11 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.stream.Collectors; +import java.util.Set; import li.strolch.agent.api.ComponentContainer; import li.strolch.agent.api.StrolchComponent; @@ -16,8 +17,8 @@ import li.strolch.runtime.configuration.ComponentConfiguration; public class OperationsLog extends StrolchComponent { - private Map> logMessagesById; - private Map>> logMessagesByLocator; + private Map> logMessagesByRealmAndId; + private Map>> logMessagesByLocator; private int maxMessages; public OperationsLog(ComponentContainer container, String componentName) { @@ -29,7 +30,7 @@ public class OperationsLog extends StrolchComponent { this.maxMessages = configuration.getInt("maxMessages", 10000); - this.logMessagesById = new HashMap<>(); + this.logMessagesByRealmAndId = new HashMap<>(); this.logMessagesByLocator = new HashMap<>(); super.initialize(configuration); @@ -38,56 +39,56 @@ public class OperationsLog extends StrolchComponent { public void addMessage(LogMessage logMessage) { // store in global list - LinkedHashMap logMessages = this.logMessagesById.computeIfAbsent(logMessage.getRealm(), - this::newBoundedStringMap); - logMessages.put(logMessage.getId(), logMessage); + LinkedHashMap logMessages = this.logMessagesByRealmAndId + .computeIfAbsent(logMessage.getRealm(), this::newBoundedStringMap); + logMessages.put(logMessage, logMessage); // store under locator - LinkedHashMap> logMessagesLocator = this.logMessagesByLocator + LinkedHashMap> logMessagesLocator = this.logMessagesByLocator .computeIfAbsent(logMessage.getRealm(), this::newBoundedLocatorMap); - List messages = logMessagesLocator.computeIfAbsent(logMessage.getLocator(), - (l) -> new ArrayList()); + LinkedHashSet messages = logMessagesLocator.computeIfAbsent(logMessage.getLocator(), + (l) -> new LinkedHashSet()); messages.add(logMessage); } public void clearMessages(String realm, Locator locator) { - LinkedHashMap> logMessages = this.logMessagesByLocator.get(realm); + LinkedHashMap> logMessages = this.logMessagesByLocator.get(realm); if (logMessages != null) logMessages.remove(locator); } - public Optional> getMessagesFor(String realm, Locator locator) { - LinkedHashMap> logMessages = this.logMessagesByLocator.get(realm); + 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.logMessagesById.get(realm); + LinkedHashMap logMessages = this.logMessagesByRealmAndId.get(realm); if (logMessages == null) return Collections.emptyList(); - return logMessages.entrySet().stream().map(e -> e.getValue()).collect(Collectors.toList()); + return new ArrayList<>(logMessages.keySet()); } - private LinkedHashMap newBoundedStringMap(String realm) { - return new LinkedHashMap() { + private LinkedHashMap newBoundedStringMap(String realm) { + return new LinkedHashMap() { private static final long serialVersionUID = 1L; @Override - protected boolean removeEldestEntry(java.util.Map.Entry eldest) { + protected boolean removeEldestEntry(java.util.Map.Entry eldest) { return size() > maxMessages; } }; } - private LinkedHashMap> newBoundedLocatorMap(String realm) { - return new LinkedHashMap>() { + private LinkedHashMap> newBoundedLocatorMap(String realm) { + return new LinkedHashMap>() { private static final long serialVersionUID = 1L; @Override - protected boolean removeEldestEntry(java.util.Map.Entry> eldest) { + protected boolean removeEldestEntry(java.util.Map.Entry> eldest) { return size() > maxMessages; } }; diff --git a/li.strolch.model/src/main/java/li/strolch/model/State.java b/li.strolch.model/src/main/java/li/strolch/model/State.java index acd039d4b..e96538dce 100644 --- a/li.strolch.model/src/main/java/li/strolch/model/State.java +++ b/li.strolch.model/src/main/java/li/strolch/model/State.java @@ -150,7 +150,7 @@ public enum State { * @return true if {@link #EXECUTION} */ public boolean canSetToWarning() { - return this == EXECUTION; + return this == EXECUTION || this == WARNING; } /** 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 index feeb62532..b0c3226ef 100644 --- a/li.strolch.utils/src/main/java/li/strolch/utils/I18nMessage.java +++ b/li.strolch.utils/src/main/java/li/strolch/utils/I18nMessage.java @@ -41,4 +41,35 @@ public class I18nMessage { String string = this.bundle.getString(this.key); return StringHelper.replacePropertiesIn(this.values, EMPTY, string); } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((this.key == null) ? 0 : this.key.hashCode()); + result = prime * result + ((this.values == null) ? 0 : this.values.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; + I18nMessage other = (I18nMessage) obj; + if (this.key == null) { + if (other.key != null) + return false; + } else if (!this.key.equals(other.key)) + return false; + if (this.values == null) { + if (other.values != null) + return false; + } else if (!this.values.equals(other.values)) + return false; + return true; + } }