package org.infinispan.server.eventlogger;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.time.Instant;
import java.util.Collections;
import java.util.Optional;
import java.util.Set;
import org.infinispan.commons.marshall.AbstractExternalizer;
import org.infinispan.commons.marshall.SerializeWith;
import org.infinispan.util.logging.events.EventLog;
import org.infinispan.util.logging.events.EventLogCategory;
import org.infinispan.util.logging.events.EventLogLevel;
/**
* ServerEvent.
*
* @author Tristan Tarrant
* @since 8.2
*/
@SerializeWith(ServerEventImpl.Externalizer.class)
public class ServerEventImpl implements EventLog {
private final EventLogLevel level;
private final EventLogCategory category;
private final Instant when;
private final String message;
private final Optional<String> detail;
private final Optional<String> context;
private final Optional<String> who;
private final Optional<String> scope;
ServerEventImpl(EventLogLevel level, EventLogCategory category, Instant when, String message, Optional<String> detail, Optional<String> context, Optional<String> who, Optional<String> scope) {
this.level = level;
this.category = category;
this.message = message;
this.when = when;
this.detail = detail;
this.context = context;
this.who = who;
this.scope = scope;
}
ServerEventImpl(EventLogLevel level, EventLogCategory category, Instant when, String message) {
this(level, category, when, message, Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty());
}
@Override
public Instant getWhen() {
return when;
}
@Override
public EventLogLevel getLevel() {
return level;
}
@Override
public EventLogCategory getCategory() {
return category;
}
@Override
public String getMessage() {
return message;
}
@Override
public Optional<String> getDetail() {
return detail;
}
@Override
public Optional<String> getWho() {
return who;
}
@Override
public Optional<String> getContext() {
return context;
}
@Override
public Optional<String> getScope() {
return scope;
}
@Override
public int compareTo(EventLog that) {
// Intentionally backwards
return that.getWhen().compareTo(this.when);
}
@Override
public String toString() {
return "ServerEventImpl{" +
"level=" + level +
", category=" + category +
", when=" + when +
", message='" + message + '\'' +
", detail=" + detail +
", context=" + context +
", who=" + who +
", scope=" + scope +
'}';
}
@SuppressWarnings("serial")
public static class Externalizer extends AbstractExternalizer<ServerEventImpl> {
@Override
public void writeObject(ObjectOutput oo, ServerEventImpl event) throws IOException {
oo.writeObject(event.level);
oo.writeObject(event.category);
oo.writeObject(event.when);
oo.writeUTF(event.message);
oo.writeObject(event.detail);
oo.writeObject(event.context);
oo.writeObject(event.who);
oo.writeObject(event.scope);
}
@Override
public ServerEventImpl readObject(ObjectInput oi) throws IOException, ClassNotFoundException {
EventLogLevel level = (EventLogLevel) oi.readObject();
EventLogCategory category = (EventLogCategory) oi.readObject();
Instant when = (Instant) oi.readObject();
String message = oi.readUTF();
Optional<String> detail = (Optional<String>) oi.readObject();
Optional<String> context = (Optional<String>) oi.readObject();
Optional<String> who = (Optional<String>) oi.readObject();
Optional<String> scope = (Optional<String>) oi.readObject();
return new ServerEventImpl(level, category, when, message, detail, context, who, scope);
}
@Override
public Set<Class<? extends ServerEventImpl>> getTypeClasses() {
return Collections.singleton(ServerEventImpl.class);
}
}
}