package eu.play_project.dcep.distributedetalis;
import static eu.play_project.dcep.constants.DcepConstants.LOG_DCEP_EXIT;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import org.ontoware.rdf2go.exception.ModelRuntimeException;
import org.ontoware.rdf2go.exception.SyntaxNotSupportedException;
import org.ontoware.rdf2go.model.ModelSet;
import org.ontoware.rdf2go.model.Syntax;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.hp.hpl.jena.query.Dataset;
import com.hp.hpl.jena.query.Query;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QueryFactory;
import com.hp.hpl.jena.query.QueryParseException;
import eu.play_project.dcep.distributedetalis.api.EcConnectionManager;
import eu.play_project.dcep.distributedetalis.api.EcConnectionmanagerException;
import eu.play_project.dcep.distributedetalis.join.ResultRegistry;
import eu.play_project.dcep.distributedetalis.join.SelectResults;
import eu.play_project.dcep.distributedetalis.utils.EventCloudHelpers;
import eu.play_project.play_commons.eventtypes.EventHelpers;
import eu.play_project.play_platformservices.api.BdplQuery;
import fr.inria.eventcloud.api.CompoundEvent;
import fr.inria.eventcloud.api.wrappers.ResultSetWrapper;
public class EcConnectionManagerLocal implements Serializable, EcConnectionManager {
private static final long serialVersionUID = 100L;
private final Logger logger = LoggerFactory.getLogger(EcConnectionManagerLocal.class);
private String inputRdfModelFileName;
public EcConnectionManagerLocal(String inputRdfModelFileName) {
this.inputRdfModelFileName = inputRdfModelFileName;
logger.info("Initialising {}.", this.getClass().getSimpleName());
}
public EcConnectionManagerLocal() {
}
@Override
public void registerEventPattern(BdplQuery bdplQuery) {
}
@Override
public void publish(CompoundEvent event) {
logger.info(LOG_DCEP_EXIT + event.getGraph() + " " + EventCloudHelpers.getMembers(event));
}
@Override
public void unregisterEventPattern(BdplQuery bdplQuery) {
}
@Override
public synchronized SelectResults getDataFromCloud(String query,
String cloudId) throws EcConnectionmanagerException {
// Create an empty model.
ModelSet rdf = EventHelpers.createEmptyModelSet();
if (inputRdfModelFileName == null) {
throw new RuntimeException("No data in jena model.");
}
InputStream in = this.getClass().getClassLoader()
.getResourceAsStream(inputRdfModelFileName);
if (in == null) {
throw new IllegalArgumentException("File: " + inputRdfModelFileName + " not found");
}
// Read data from file.
try {
logger.debug("Read historical data from file: " + inputRdfModelFileName + ".");
rdf.readFrom(in, Syntax.Trig);
} catch (SyntaxNotSupportedException e) {
logger.error("Syntax " + Syntax.Trig + " is not supported.");
e.printStackTrace();
} catch (ModelRuntimeException e) {
logger.error("ModelRuntimeException: " + e.getMessage());
e.printStackTrace();
} catch (IOException e) {
logger.error("IO-Exception: " + e.getMessage());
e.printStackTrace();
}
// Query data from model
Query jenaQuery;
Dataset jena;
try {
jenaQuery = QueryFactory.create(query);
jena = (Dataset) rdf.getUnderlyingModelSetImplementation();
} catch (QueryParseException e) {
logger.error("Query with pars error: " + query);
throw e;
}
logger.debug("Execute historical query: " + query);
QueryExecution qexec = QueryExecutionFactory.create(jenaQuery, jena);
ResultRegistry results = null;
try {
results = ResultRegistry.makeResult(new ResultSetWrapper(qexec.execSelect()));
} finally {
qexec.close();
}
return (results);
}
@Override
public void putDataInCloud(CompoundEvent event, String topic)
throws EcConnectionmanagerException {
throw new UnsupportedOperationException("not implemented");
}
public void setInputRdfModelFileName(String inputRdfModelFile) {
this.inputRdfModelFileName = inputRdfModelFile;
}
@Override
public void destroy() {
logger.info("Terminating {}.", this.getClass().getSimpleName());
}
}