package com.gratex.perconik.uaca.data;
import java.net.URI;
import java.util.Date;
import javax.annotation.Nullable;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import sk.stuba.fiit.perconik.data.AnyStructuredData;
import sk.stuba.fiit.perconik.data.bind.NamingStrategy.Default;
import sk.stuba.fiit.perconik.data.content.Content;
import sk.stuba.fiit.perconik.data.content.StructuredContent;
import sk.stuba.fiit.perconik.data.events.Event;
import static com.fasterxml.jackson.annotation.JsonFormat.Shape.STRING;
import static com.gratex.perconik.uaca.data.GenericUacaEventConstants.EVENT_TYPE_URI_PREFIX;
import static com.gratex.perconik.uaca.data.GenericUacaEventConstants.TIMESTAMP_PATTERN;
import static sk.stuba.fiit.perconik.utilities.MorePreconditions.checkNotNullOrEmpty;
import static sk.stuba.fiit.perconik.utilities.net.UniformResources.newUri;
@JsonNaming(Default.class)
public class UacaEvent extends AnyStructuredData {
@Nullable
protected Date timestamp;
@Nullable
protected URI eventTypeUri;
@Nullable
protected Object data;
public UacaEvent() {}
public static UacaEvent of(final String path, @Nullable final Object data) {
UacaEvent event = new UacaEvent();
if (data instanceof Event) {
event.timestamp = new Date(((Event) data).getTimestamp());
}
event.eventTypeUri = eventTypeUri(path);
event.data = normalizeData(data);
return event;
}
/**
* Creates UACA compatible event type URI for specified path. Each URI is prefixed with
* an {@link GenericUacaEventConstants#EVENT_TYPE_URI_PREFIX EVENT_TYPE_URI_PREFIX}.
*/
public static URI eventTypeUri(final String path) {
return newUri(EVENT_TYPE_URI_PREFIX + "/" + checkNotNullOrEmpty(path));
}
/**
* Normalizes event data according to UACA restrictions. Each data of type {@link Content}
* must be fully structured since UACA does not permit dot characters in JSON field names.
*/
public static Object normalizeData(@Nullable final Object data) {
if (data instanceof StructuredContent) {
return ((StructuredContent) data).structure();
} else if (data instanceof Content) {
return new AnyStructuredData().merge((Content) data);
}
return data;
}
public void setTimestamp(@Nullable final Date timestamp) {
this.timestamp = timestamp;
}
public void setEventTypeUri(@Nullable final URI eventTypeUri) {
this.eventTypeUri = eventTypeUri;
}
public void setData(@Nullable final Object data) {
this.data = data;
}
@JsonFormat(shape = STRING, pattern = TIMESTAMP_PATTERN)
public Date getTimestamp() {
return this.timestamp;
}
public URI getEventTypeUri() {
return this.eventTypeUri;
}
public Object getData() {
return this.data;
}
}