package es.upm.fi.dia.oeg.map4rdf.server.command; import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; import net.customware.gwt.dispatch.server.ActionHandler; import net.customware.gwt.dispatch.server.ExecutionContext; import net.customware.gwt.dispatch.shared.ActionException; import com.google.inject.Inject; import com.hp.hpl.jena.query.QueryExecution; import com.hp.hpl.jena.query.QueryExecutionFactory; import com.hp.hpl.jena.query.QuerySolution; import com.hp.hpl.jena.query.ResultSet; import es.upm.fi.dia.oeg.map4rdf.client.action.GetAemetObs; import es.upm.fi.dia.oeg.map4rdf.client.action.ListResult; import es.upm.fi.dia.oeg.map4rdf.server.conf.multiple.MultipleConfigurations; import es.upm.fi.dia.oeg.map4rdf.server.dao.DaoException; import es.upm.fi.dia.oeg.map4rdf.share.Resource; import es.upm.fi.dia.oeg.map4rdf.share.aemet.AemetIntervalo; import es.upm.fi.dia.oeg.map4rdf.share.aemet.AemetObs; import es.upm.fi.dia.oeg.map4rdf.share.conf.ParameterNames; /** * @author Daniel Garijo * @author Francisco Siles */ public class GetAemetObsHandler implements ActionHandler<GetAemetObs, ListResult<AemetObs>> { private MultipleConfigurations configurations; private Logger logger = Logger.getLogger(GetAemetObsHandler.class); @Inject public GetAemetObsHandler(MultipleConfigurations configurations) { this.configurations=configurations; } @Override public ListResult<AemetObs> execute(GetAemetObs action, ExecutionContext context) throws ActionException { String uri = action.getUri(); if(!configurations.existsConfiguration(action.getConfigID())){ throw new ActionException("Bad Config ID"); } String endpointUri = configurations.getConfiguration(action.getConfigID()).getConfigurationParamValue(ParameterNames.ENDPOINT_URL); if (uri == null || uri.length() == 0) { throw new ActionException("Invalid URI: " + uri); } if(endpointUri==null || endpointUri.isEmpty()){ throw new ActionException("Invalid EndpointURL in configID: "+action.getConfigID()); } try { return getDatosObservacion(endpointUri,uri); } catch (Exception e) { logger.error(e); throw new ActionException("Data access error", e); } } @Override public Class<GetAemetObs> getActionType() { return GetAemetObs.class; } @Override public void rollback(GetAemetObs action, ListResult<AemetObs> result, ExecutionContext context) throws ActionException { // nothing to do } private ListResult<AemetObs> getDatosObservacion(String endpointUri,String uri) throws Exception { QueryExecution exec2 = QueryExecutionFactory.sparqlService(endpointUri, createGetMaxDate(uri)); // cogemos ResultSet queryResult2 = exec2.execSelect(); String date = null; while (queryResult2.hasNext()) { QuerySolution sol = queryResult2.next(); if(sol.contains("date")){ date = sol.getLiteral("date").getString(); } } if (date == null) { return null; } return getDatosObservacion(endpointUri,uri, date); } private String createGetMaxDate(String uri) { StringBuilder query = new StringBuilder(); query.append("SELECT (max(?dt) AS ?date)"); query.append("WHERE { "); query.append("?obs <http://purl.oclc.org/NET/ssnx/ssn#observedBy> <"+uri+"> . "); query.append("?obs <http://aemet.linkeddata.es/ontology/observedInInterval> ?inter . "); query.append("?inter <http://www.w3.org/2006/time#hasBeginning> ?instant . "); query.append("?instant <http://www.w3.org/2006/time#inDateTime> ?tiempoFecha . "); query.append("?tiempoFecha <http://www.w3.org/2006/time#inXSDDateTime> ?dt . }"); return query.toString(); } private ListResult<AemetObs> getDatosObservacion(String endpointUri,String uri, String date) throws DaoException { List<AemetObs> obs=new ArrayList<AemetObs>(); QueryExecution exec2 = QueryExecutionFactory.sparqlService(endpointUri, createGetObs(100, uri, date)); // cogemos // las // 100 // ultimas ResultSet queryResult2 = exec2.execSelect(); while (queryResult2.hasNext()) { /* * String id,String uriObs,String estacion,String valor, String * calidad, String prop, String feature, String intervalo ?obs * ?nombreEst ?prop ?dato ?q ?intervalo */ QuerySolution solution2 = queryResult2.next(); String sttionUri = uri; String idObs = solution2.getResource("obs").getURI(); String nombreEstacion = solution2.getLiteral("est").getLexicalForm(); String prop = solution2.getResource("prop").getURI(); String propLabel = solution2.getResource("prop").getLocalName(); double dato = solution2.getLiteral("dato").getDouble(); String q = "No disponible"; if (solution2.contains("q")) { q = solution2.getLiteral("q").getLexicalForm(); } int min, h, dia, mes, anno; min = solution2.getLiteral("min").getInt(); h = solution2.getLiteral("h").getInt(); dia = solution2.getLiteral("dia").getInt(); mes = solution2.getLiteral("mes").getInt(); anno = solution2.getLiteral("anno").getInt(); AemetIntervalo intervalo = new AemetIntervalo(anno, mes, dia, h, min); Resource station = new Resource(sttionUri); station.addLabel("", nombreEstacion); Resource propR = new Resource(prop); propR.addLabel("", propLabel); AemetObs observ = new AemetObs(idObs, station, dato, q, propR, "", intervalo); obs.add(observ); } return new ListResult<AemetObs>(obs); } private String createGetObs(Integer limit, String uri, String date) { StringBuilder query = new StringBuilder( "SELECT distinct ?obs ?est ?prop ?dato ?q ?h ?min ?dia ?mes ?anno "); query.append("WHERE { "); query.append("<"+uri+"> <http://aemet.linkeddata.es/ontology/stationName> ?est . "); query.append("?obs <http://purl.oclc.org/NET/ssnx/ssn#observedBy> <"+uri+"> . "); query.append("?obs <http://purl.oclc.org/NET/ssnx/ssn#observedProperty> ?prop . "); query.append("?obs <http://aemet.linkeddata.es/ontology/valueOfObservedData> ?dato . "); query.append("?obs <http://aemet.linkeddata.es/ontology/observedDataQuality> ?q . "); query.append("?obs <http://aemet.linkeddata.es/ontology/observedInInterval> ?inter . "); query.append("?inter <http://www.w3.org/2006/time#hasBeginning> ?instant . "); query.append("?instant <http://www.w3.org/2006/time#inDateTime> ?tiempoFecha . "); query.append("?tiempoFecha <http://www.w3.org/2006/time#hour> ?h . "); query.append("?tiempoFecha <http://www.w3.org/2006/time#minute> ?min . "); query.append("?tiempoFecha <http://www.w3.org/2006/time#day> ?dia . "); query.append("?tiempoFecha <http://www.w3.org/2006/time#month> ?mes . "); query.append("?tiempoFecha <http://www.w3.org/2006/time#year> ?anno . "); query.append("?tiempoFecha <http://www.w3.org/2006/time#inXSDDateTime> \"" + date + "\"^^<http://www.w3.org/2001/XMLSchema#dateTime> . }"); if (limit != null) { query.append(" LIMIT " + limit); } return query.toString(); } }