package won.matcher.service.common.event;
import org.apache.jena.query.Dataset;
import org.apache.jena.riot.Lang;
import org.apache.jena.riot.LangBuilder;
import org.apache.jena.riot.RDFDataMgr;
import org.apache.jena.riot.RDFFormat;
import won.matcher.service.common.service.sparql.SparqlService;
import java.io.IOException;
import java.io.Serializable;
import java.io.StringWriter;
/**
* This event is used in the matching service to indicate that a new need has been found.
* It includes the URIs of the need and the won node and optionally the serialized resource
*
* User: hfriedrich
* Date: 04.06.2015
*/
public class NeedEvent implements Serializable
{
private String uri;
private String wonNodeUri;
private String serializedNeedResource;
private String serializationLangName;
private String serializationLangContentType;
private long crawlDate;
private TYPE eventType;
public static enum TYPE
{
CREATED, ACTIVATED, DEACTIVATED
}
public NeedEvent(String uri, String wonNodeUri, TYPE eventType, long crawlDate, String resource, Lang format) {
this.uri = uri;
this.wonNodeUri = wonNodeUri;
this.eventType = eventType;
this.crawlDate = crawlDate;
serializedNeedResource = resource;
serializationLangName = format.getName();
serializationLangContentType = format.getContentType().getContentType();
}
public NeedEvent(String uri, String wonNodeUri, TYPE eventType, long crawlDate, Dataset ds) {
this.uri = uri;
this.wonNodeUri = wonNodeUri;
this.eventType = eventType;
this.crawlDate = crawlDate;
StringWriter sw = new StringWriter();
RDFDataMgr.write(sw, ds, RDFFormat.TRIG.getLang());
serializedNeedResource = sw.toString();
serializationLangName = RDFFormat.TRIG.getLang().getName();
serializationLangContentType = RDFFormat.TRIG.getLang().getContentType().getContentType();
}
public String getUri() {
return uri;
}
public String getWonNodeUri() {
return wonNodeUri;
}
public TYPE getEventType() {
return eventType;
}
public String getSerializedNeedResource() {
return serializedNeedResource;
}
public Lang getSerializationFormat() {
Lang format = LangBuilder.create(serializationLangName, serializationLangContentType).build();
return format;
}
public long getCrawlDate() {
return crawlDate;
}
public Dataset deserializeNeedDataset() throws IOException {
return SparqlService.deserializeDataset(serializedNeedResource, getSerializationFormat());
}
@Override
public NeedEvent clone() {
NeedEvent e = new NeedEvent(uri, wonNodeUri, eventType, crawlDate, serializedNeedResource,
getSerializationFormat());
return e;
}
@Override
public String toString() {
return getUri();
}
}