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

View File

@ -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<String, LinkedHashMap<Locator, LogMessage>> logMessagesByRealm;
private Map<String, LinkedHashMap<String, LogMessage>> logMessagesById;
private Map<String, LinkedHashMap<Locator, List<LogMessage>>> 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<Locator, LogMessage> logMessages = this.logMessagesByRealm.computeIfAbsent(logMessage.getRealm(),
this::newBoundedMap);
// store in global list
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) {
return new LinkedHashMap<Locator, LogMessage>() {
private static final long serialVersionUID = 1L;
@Override
protected boolean removeEldestEntry(java.util.Map.Entry<Locator, LogMessage> eldest) {
return size() > maxMessages;
}
};
public void clearMessages(String realm, Locator locator) {
LinkedHashMap<Locator, List<LogMessage>> logMessages = this.logMessagesByLocator.get(realm);
if (logMessages != null)
logMessages.remove(locator);
}
public Optional<LogMessage> getMessage(String realm, Locator locator) {
LinkedHashMap<Locator, LogMessage> logMessages = this.logMessagesByRealm.computeIfAbsent(realm,
this::newBoundedMap);
public Optional<List<LogMessage>> getMessagesFor(String realm, Locator locator) {
LinkedHashMap<Locator, List<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<Locator, LogMessage> logMessages = this.logMessagesByRealm.get(realm);
LinkedHashMap<String, LogMessage> logMessages = this.logMessagesById.get(realm);
if (logMessages == null)
return Collections.emptyList();
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 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