[Major] LogMessage now has an ID which is used in OperationsLog

This commit is contained in:
Robert von Burg 2017-06-15 13:33:14 +02:00
parent 9b92d2fdbc
commit e459b561b8
3 changed files with 81 additions and 18 deletions

View File

@ -4,6 +4,7 @@ import java.util.ResourceBundle;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import li.strolch.agent.api.StrolchAgent;
import li.strolch.model.Locator; import li.strolch.model.Locator;
import li.strolch.model.Tags.Json; import li.strolch.model.Tags.Json;
import li.strolch.utils.I18nMessage; import li.strolch.utils.I18nMessage;
@ -11,17 +12,23 @@ import li.strolch.utils.helper.ExceptionHelper;
public class LogMessage extends I18nMessage { public class LogMessage extends I18nMessage {
private final String id;
private final String realm; private final String realm;
private final Locator locator; private final Locator locator;
private final LogSeverity severity; private final LogSeverity severity;
public LogMessage(String realm, Locator locator, LogSeverity logSeverity, ResourceBundle bundle, String key) { public LogMessage(String realm, Locator locator, LogSeverity logSeverity, ResourceBundle bundle, String key) {
super(bundle, key); super(bundle, key);
this.id = StrolchAgent.getUniqueId();
this.realm = realm; this.realm = realm;
this.locator = locator; this.locator = locator;
this.severity = logSeverity; this.severity = logSeverity;
} }
public String getId() {
return this.id;
}
public String getRealm() { public String getRealm() {
return this.realm; return this.realm;
} }
@ -49,6 +56,7 @@ public class LogMessage extends I18nMessage {
JsonObject jsonObject = new JsonObject(); JsonObject jsonObject = new JsonObject();
jsonObject.addProperty(Json.ID, this.id);
jsonObject.addProperty(Json.KEY, getKey()); jsonObject.addProperty(Json.KEY, getKey());
jsonObject.addProperty(Json.MESSAGE, formatMessage()); jsonObject.addProperty(Json.MESSAGE, formatMessage());
jsonObject.addProperty(Json.SEVERITY, this.severity.getSeverity()); jsonObject.addProperty(Json.SEVERITY, this.severity.getSeverity());
@ -62,4 +70,29 @@ public class LogMessage extends I18nMessage {
return jsonObject; 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;
}
} }

View File

@ -1,5 +1,6 @@
package li.strolch.handler.operationslog; package li.strolch.handler.operationslog;
import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
@ -15,7 +16,8 @@ import li.strolch.runtime.configuration.ComponentConfiguration;
public class OperationsLog extends StrolchComponent { public class OperationsLog extends StrolchComponent {
private Map<String, LinkedHashMap<Locator, LogMessage>> logMessagesByRealm; private Map<String, LinkedHashMap<String, LogMessage>> logMessagesById;
private Map<String, LinkedHashMap<Locator, List<LogMessage>>> logMessagesByLocator;
private int maxMessages; private int maxMessages;
public OperationsLog(ComponentContainer container, String componentName) { public OperationsLog(ComponentContainer container, String componentName) {
@ -27,41 +29,67 @@ public class OperationsLog extends StrolchComponent {
this.maxMessages = configuration.getInt("maxMessages", 10000); this.maxMessages = configuration.getInt("maxMessages", 10000);
this.logMessagesByRealm = new HashMap<>(); this.logMessagesById = new HashMap<>();
this.logMessagesByLocator = new HashMap<>();
super.initialize(configuration); super.initialize(configuration);
} }
public void addMessage(LogMessage logMessage) { public void addMessage(LogMessage logMessage) {
LinkedHashMap<Locator, LogMessage> logMessages = this.logMessagesByRealm.computeIfAbsent(logMessage.getRealm(), // store in global list
this::newBoundedMap); LinkedHashMap<String, LogMessage> logMessages = this.logMessagesById.computeIfAbsent(logMessage.getRealm(),
this::newBoundedStringMap);
logMessages.put(logMessage.getId(), logMessage);
logMessages.put(logMessage.getLocator(), logMessage); // store under locator
LinkedHashMap<Locator, List<LogMessage>> logMessagesLocator = this.logMessagesByLocator
.computeIfAbsent(logMessage.getRealm(), this::newBoundedLocatorMap);
List<LogMessage> messages = logMessagesLocator.computeIfAbsent(logMessage.getLocator(),
(l) -> new ArrayList<LogMessage>());
messages.add(logMessage);
} }
private LinkedHashMap<Locator, LogMessage> newBoundedMap(String realm) { public void clearMessages(String realm, Locator locator) {
return new LinkedHashMap<Locator, LogMessage>() { LinkedHashMap<Locator, List<LogMessage>> logMessages = this.logMessagesByLocator.get(realm);
private static final long serialVersionUID = 1L; if (logMessages != null)
logMessages.remove(locator);
@Override
protected boolean removeEldestEntry(java.util.Map.Entry<Locator, LogMessage> eldest) {
return size() > maxMessages;
}
};
} }
public Optional<LogMessage> getMessage(String realm, Locator locator) { public Optional<List<LogMessage>> getMessagesFor(String realm, Locator locator) {
LinkedHashMap<Locator, LogMessage> logMessages = this.logMessagesByRealm.computeIfAbsent(realm, LinkedHashMap<Locator, List<LogMessage>> logMessages = this.logMessagesByLocator.get(realm);
this::newBoundedMap); if (logMessages == null)
return Optional.empty();
return Optional.ofNullable(logMessages.get(locator)); return Optional.ofNullable(logMessages.get(locator));
} }
public List<LogMessage> getMessages(String realm) { public List<LogMessage> getMessages(String realm) {
LinkedHashMap<Locator, LogMessage> logMessages = this.logMessagesByRealm.get(realm); LinkedHashMap<String, LogMessage> logMessages = this.logMessagesById.get(realm);
if (logMessages == null) if (logMessages == null)
return Collections.emptyList(); return Collections.emptyList();
return logMessages.entrySet().stream().map(e -> e.getValue()).collect(Collectors.toList()); return logMessages.entrySet().stream().map(e -> e.getValue()).collect(Collectors.toList());
} }
private LinkedHashMap<String, LogMessage> newBoundedStringMap(String realm) {
return new LinkedHashMap<String, LogMessage>() {
private static final long serialVersionUID = 1L;
@Override
protected boolean removeEldestEntry(java.util.Map.Entry<String, LogMessage> eldest) {
return size() > maxMessages;
}
};
}
private LinkedHashMap<Locator, List<LogMessage>> newBoundedLocatorMap(String realm) {
return new LinkedHashMap<Locator, List<LogMessage>>() {
private static final long serialVersionUID = 1L;
@Override
protected boolean removeEldestEntry(java.util.Map.Entry<Locator, List<LogMessage>> eldest) {
return size() > maxMessages;
}
};
}
} }

View File

@ -69,6 +69,7 @@ public class Tags {
public static final String SEVERITY = "Severity"; public static final String SEVERITY = "Severity";
public static final String KEY = "Key"; public static final String KEY = "Key";
public static final String MESSAGE = "Message"; public static final String MESSAGE = "Message";
public static final String MESSAGES = "Messages";
public static final String REALM = "Realm"; public static final String REALM = "Realm";
public static class Json { public static class Json {
@ -119,6 +120,7 @@ public class Tags {
public static final String SEVERITY = "severity"; public static final String SEVERITY = "severity";
public static final String KEY = "key"; public static final String KEY = "key";
public static final String MESSAGE = "message"; public static final String MESSAGE = "message";
public static final String MESSAGES = "messages";
public static final String REALM = "realm"; public static final String REALM = "realm";
// miscellaneous // miscellaneous