package eu.play_project.dcep.distributedetalis.listeners;
import javax.inject.Singleton;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import org.ontoware.rdf2go.model.Model;
import org.ontoware.rdf2go.util.ModelUtils;
import org.ow2.play.governance.platform.user.api.rest.PublishService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import eu.play_project.dcep.distributedetalis.DistributedEtalis;
import eu.play_project.dcep.distributedetalis.api.EcConnectionmanagerException;
import eu.play_project.dcep.distributedetalis.utils.EventCloudHelpers;
import eu.play_project.play_commons.constants.Stream;
import eu.play_project.play_eventadapter.AbstractReceiverRest;
import eu.play_project.play_eventadapter.NoRdfEventException;
import fr.inria.eventcloud.api.CompoundEvent;
@Singleton
public class EcConnectionListenerRest extends Application implements PublishService {
private DistributedEtalis dEtalis;
private final AbstractReceiverRest rdfReceiver;
private final Logger logger;
public EcConnectionListenerRest() { // For JAXB
this.rdfReceiver = null;
this.logger = null;
}
public EcConnectionListenerRest(AbstractReceiverRest rdfReceiver) {
this.rdfReceiver = rdfReceiver;
this.logger = LoggerFactory.getLogger(this.getClass());
}
@Override
public Response notify(String stream, String notify) {
if (this.dEtalis == null) {
String msg = "Detalis was not set in " + this.getClass().getSimpleName();
throw new IllegalStateException(msg);
}
if (this.dEtalis.getEcConnectionManager() == null) {
String msg = "ecConnectionManager was not set in " + this.getClass().getSimpleName();
throw new IllegalStateException(msg);
}
String topic = Stream.toTopicUri(stream);
try {
Model rdf = this.rdfReceiver.parseRdfRest(notify);
ModelUtils.deanonymize(rdf);
CompoundEvent event = EventCloudHelpers.toCompoundEvent(rdf);
logger.debug("Received event {} on topic {} from the DSB.", event.getGraph(), topic);
// Forward the event to Detalis:
this.dEtalis.publish(event);
// Store the event in Triple Store:
try {
this.dEtalis.getEcConnectionManager().putDataInCloud(event, topic);
} catch (EcConnectionmanagerException e) {
logger.warn("Could not persist event in historic triple store: {}: {}", e.getClass().getSimpleName(), e.getMessage());
}
} catch (NoRdfEventException e) {
logger.error("Received a non-RDF event from the DSB: {}", e.getMessage());
}
return Response.status(Status.ACCEPTED).build();
}
public void setDetalis(DistributedEtalis dEtalis) {
this.dEtalis = dEtalis;
}
}