[Major] Changes in LogMessage, not using ID for equals

This commit is contained in:
Robert von Burg 2017-08-16 11:23:44 +02:00
parent 3bd9121671
commit f2cdea3b7d
5 changed files with 70 additions and 28 deletions

View File

@ -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;
}

View File

@ -2,6 +2,7 @@ package li.strolch.handler.operationslog;
public enum LogSeverity {
INFO("Info"), //
NOTIFICATION("Notification"), //
WARN("Warn"), //
ERROR("Error"), //
EXCEPTION("Exception");

View File

@ -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<String, LinkedHashMap<String, LogMessage>> logMessagesById;
private Map<String, LinkedHashMap<Locator, List<LogMessage>>> logMessagesByLocator;
private Map<String, LinkedHashMap<LogMessage, LogMessage>> logMessagesByRealmAndId;
private Map<String, LinkedHashMap<Locator, LinkedHashSet<LogMessage>>> 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<String, LogMessage> logMessages = this.logMessagesById.computeIfAbsent(logMessage.getRealm(),
this::newBoundedStringMap);
logMessages.put(logMessage.getId(), logMessage);
LinkedHashMap<LogMessage, LogMessage> logMessages = this.logMessagesByRealmAndId
.computeIfAbsent(logMessage.getRealm(), this::newBoundedStringMap);
logMessages.put(logMessage, logMessage);
// store under locator
LinkedHashMap<Locator, List<LogMessage>> logMessagesLocator = this.logMessagesByLocator
LinkedHashMap<Locator, LinkedHashSet<LogMessage>> logMessagesLocator = this.logMessagesByLocator
.computeIfAbsent(logMessage.getRealm(), this::newBoundedLocatorMap);
List<LogMessage> messages = logMessagesLocator.computeIfAbsent(logMessage.getLocator(),
(l) -> new ArrayList<LogMessage>());
LinkedHashSet<LogMessage> messages = logMessagesLocator.computeIfAbsent(logMessage.getLocator(),
(l) -> new LinkedHashSet<LogMessage>());
messages.add(logMessage);
}
public void clearMessages(String realm, Locator locator) {
LinkedHashMap<Locator, List<LogMessage>> logMessages = this.logMessagesByLocator.get(realm);
LinkedHashMap<Locator, LinkedHashSet<LogMessage>> logMessages = this.logMessagesByLocator.get(realm);
if (logMessages != null)
logMessages.remove(locator);
}
public Optional<List<LogMessage>> getMessagesFor(String realm, Locator locator) {
LinkedHashMap<Locator, List<LogMessage>> logMessages = this.logMessagesByLocator.get(realm);
public Optional<Set<LogMessage>> getMessagesFor(String realm, Locator locator) {
LinkedHashMap<Locator, LinkedHashSet<LogMessage>> logMessages = this.logMessagesByLocator.get(realm);
if (logMessages == null)
return Optional.empty();
return Optional.ofNullable(logMessages.get(locator));
}
public List<LogMessage> getMessages(String realm) {
LinkedHashMap<String, LogMessage> logMessages = this.logMessagesById.get(realm);
LinkedHashMap<LogMessage, LogMessage> 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<String, LogMessage> newBoundedStringMap(String realm) {
return new LinkedHashMap<String, LogMessage>() {
private LinkedHashMap<LogMessage, LogMessage> newBoundedStringMap(String realm) {
return new LinkedHashMap<LogMessage, LogMessage>() {
private static final long serialVersionUID = 1L;
@Override
protected boolean removeEldestEntry(java.util.Map.Entry<String, LogMessage> eldest) {
protected boolean removeEldestEntry(java.util.Map.Entry<LogMessage, LogMessage> eldest) {
return size() > maxMessages;
}
};
}
private LinkedHashMap<Locator, List<LogMessage>> newBoundedLocatorMap(String realm) {
return new LinkedHashMap<Locator, List<LogMessage>>() {
private LinkedHashMap<Locator, LinkedHashSet<LogMessage>> newBoundedLocatorMap(String realm) {
return new LinkedHashMap<Locator, LinkedHashSet<LogMessage>>() {
private static final long serialVersionUID = 1L;
@Override
protected boolean removeEldestEntry(java.util.Map.Entry<Locator, List<LogMessage>> eldest) {
protected boolean removeEldestEntry(java.util.Map.Entry<Locator, LinkedHashSet<LogMessage>> eldest) {
return size() > maxMessages;
}
};

View File

@ -150,7 +150,7 @@ public enum State {
* @return true if {@link #EXECUTION}
*/
public boolean canSetToWarning() {
return this == EXECUTION;
return this == EXECUTION || this == WARNING;
}
/**

View File

@ -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;
}
}