package eu.play_project.dcep.distributedetalis;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import org.ontoware.rdf2go.impl.jena.TypeConversion;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import virtuoso.jdbc4.VirtuosoDataSource;
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 fr.inria.eventcloud.api.CompoundEvent;
import fr.inria.eventcloud.api.Quadruple;
public class EcConnectionManagerVirtuoso extends EcConnectionManagerWsn {
private Connection virtuosoConnection;
private final Logger logger = LoggerFactory.getLogger(EcConnectionManagerVirtuoso.class);
public EcConnectionManagerVirtuoso(DistributedEtalis dEtalis) throws EcConnectionmanagerException {
this(
constants.getProperty("dcep.virtuoso.servername"),
Integer.parseInt(constants.getProperty("dcep.virtuoso.port")),
constants.getProperty("dcep.virtuoso.user"),
constants.getProperty("dcep.virtuoso.password"),
dEtalis
);
}
public EcConnectionManagerVirtuoso(String server, int port, String user, String pw, DistributedEtalis dEtalis) throws EcConnectionmanagerException {
super(dEtalis);
VirtuosoDataSource virtuoso = new VirtuosoDataSource();
virtuoso.setServerName(server);
virtuoso.setPortNumber(port);
virtuoso.setUser(user);
virtuoso.setPassword(pw);
// Test Virtuoso JDBC connection
try {
virtuoso.getConnection().close();
virtuosoConnection = virtuoso.getConnection();
} catch (SQLException e) {
throw new EcConnectionmanagerException("Could not connect to Virtuoso.", e);
}
init();
}
/**
* Persist data in historic storage.
*
* @param event event containing quadruples
* @param cloudId the cloud ID to allow partitioning of storage
*/
@Override
public void putDataInCloud(CompoundEvent event, String cloudId) {
StringBuilder s = new StringBuilder();
s.append("SPARQL INSERT INTO GRAPH <").append(event.getGraph().toString()).append("> {\n");
for (Quadruple quadruple : event) {
s.append(TypeConversion.toRDF2Go(quadruple.getSubject()).toSPARQL()).append(" ");
s.append(TypeConversion.toRDF2Go(quadruple.getPredicate()).toSPARQL()).append(" ");
s.append(TypeConversion.toRDF2Go(quadruple.getObject()).toSPARQL()).append(" . \n");
}
s.append("}\n");
String query = s.toString();
logger.debug("Putting event in cloud " + cloudId + ":\n" + query);
try {
Statement st = virtuosoConnection.createStatement();
st.executeUpdate(query);
} catch (SQLException e) {
logger.error("Error putting an event into Virtuoso.", e);
}
}
/**
* Retreive data from historic storage using a SPARQL SELECT query. SPARQL 1.1
* enhancements like the VALUES clause are allowed.
*/
@Override
public synchronized SelectResults getDataFromCloud(String query, String cloudId)
throws EcConnectionmanagerException {
if (!init) {
throw new IllegalStateException(this.getClass().getSimpleName() + " has not been initialized.");
}
logger.debug("Sending historical query to Virtuoso: \n" + query);
List<String> variables = new ArrayList<String>();
List<List> result = new ArrayList<List>();
Connection con = null;
ResultSet res = null;
try {
con = virtuosoConnection;
Statement sta = con.createStatement();
res = sta.executeQuery("sparql "+query);
ResultSetMetaData rmd = res.getMetaData();
int colNum = rmd.getColumnCount();
for(int i = 1; i <= colNum; i++){
variables.add(rmd.getColumnName(i));
}
logger.debug("Vars: {}", variables);
//TODO result create, select variable analyze, create
while(res.next()){
ArrayList<Object> data = new ArrayList<Object>();
for(int i = 1; i <= colNum; i++) {
data.add(res.getObject(i));
}
result.add(data);
logger.debug("Data: {}", data);
}
} catch (SQLException e) {
throw new EcConnectionmanagerException("Exception with Virtuoso.", e);
} finally {
try {
if (res != null) {
res.close();
}
if(con != null) {
con.close();
}
} catch (SQLException e) {
// Do nothing
}
}
ResultRegistry rr = new ResultRegistry();
rr.setResult(result);
rr.setVariables(variables);
return rr;
}
}