package org.openiot.scheduler.core.api.impl.DiscoverSensors; /** * Copyright (c) 2011-2014, OpenIoT * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL"). If you do not alter this * notice, a recipient may use your version of this file under the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL for * the specific language governing rights and limitations. * * Contact: OpenIoT mailto: info@openiot.eu */ import java.util.ArrayList; import java.util.List; import java.util.Set; import org.openiot.commons.sensortypes.model.MeasurementCapability; import org.openiot.commons.sensortypes.model.SensorType; import org.openiot.commons.sensortypes.model.SensorTypes; import org.openiot.commons.sensortypes.model.Unit; import org.openiot.commons.util.PropertyManagement; import org.openiot.scheduler.core.utils.sparql.SesameSPARQLClient; import org.openrdf.query.BindingSet; import org.openrdf.query.QueryEvaluationException; import org.openrdf.query.TupleQueryResult; import org.openrdf.repository.RepositoryException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.hp.hpl.jena.vocabulary.RDF; import com.hp.hpl.jena.vocabulary.RDFS; import com.hp.hpl.jena.vocabulary.XSD; /** * * @author Stavros Petris (spet) e-mail: spet@ait.edu.gr * @author Nikos Kefalakis (nkef) e-mail: nkef@ait.edu.gr */ public class DiscoverSensorsImpl { private static class Queries { public static ArrayList<SensorTypeMetaData> parseSensorTypeMetaData(TupleQueryResult qres) { ArrayList<SensorTypeMetaData> sensorTypeMetaDataList = new ArrayList<SensorTypeMetaData>(); try { while (qres.hasNext()) { BindingSet b = qres.next(); Set names = b.getBindingNames(); SensorTypeMetaData sensorTypeMetaData = new SensorTypeMetaData(); for (Object n : names) { if (((String) n).equalsIgnoreCase("measurement")) { String str = (b.getValue((String) n) == null) ? null : b.getValue((String) n) .stringValue(); sensorTypeMetaData.setMeasuredVal(str); System.out.print("measurement : " + str + " "); } else if (((String) n).equalsIgnoreCase("unit")) { String str = (b.getValue((String) n) == null) ? null : b.getValue((String) n) .stringValue(); sensorTypeMetaData.setUnit(str); System.out.print("unit : " + str + " "); } else if (((String) n).equalsIgnoreCase("avalue")) { // String str = (b.getValue((String) n)==null) ? // null : b.getValue((String) n).stringValue(); String st = b.getValue((String) n).toString(); String[] split = st.split("#"); sensorTypeMetaData.setValue(split[1].substring(0, split[1].length() - 1)); System.out.print("value : " + sensorTypeMetaData.getValue() + " "); } } sensorTypeMetaDataList.add(sensorTypeMetaData); }// while return sensorTypeMetaDataList; } catch (QueryEvaluationException e) { e.printStackTrace(); return null; } catch (Exception e) { e.printStackTrace(); return null; } } public static ArrayList<SensorTypeData> parseSensorTypeInArea(TupleQueryResult qres) { ArrayList<SensorTypeData> sensorTypeDataList = new ArrayList<SensorTypeData>(); try { while (qres.hasNext()) { BindingSet b = qres.next(); Set names = b.getBindingNames(); SensorTypeData sensorTypeData = new SensorTypeData(); for (Object n : names) { if (((String) n).equalsIgnoreCase("sensLabelType")) { String str = (b.getValue((String) n) == null) ? null : b.getValue((String) n) .stringValue(); sensorTypeData.setLabel(str); System.out.print("sensor label: " + sensorTypeData.getLabel() + " "); } else if (((String) n).equalsIgnoreCase("type")) { String str = (b.getValue((String) n) == null) ? null : b.getValue((String) n) .stringValue(); sensorTypeData.setID(str); System.out.print("unit : " + sensorTypeData.getID() + " "); } } sensorTypeDataList.add(sensorTypeData); }// while return sensorTypeDataList; } catch (QueryEvaluationException e) { e.printStackTrace(); return null; } catch (Exception e) { e.printStackTrace(); return null; } } public static String getSensTypeInArea(String lsmMetaGraph,double longitude, double latitude, float radius) { StringBuilder update = new StringBuilder(); // String str = ("select distinct(?sensLabelType) "//?type " // + "from <" + lsmMetaGraph + "> " // + "WHERE " // + "{" // + "?type <http://www.w3.org/2000/01/rdf-schema#label> ?sensLabelType." // + "?sensorId <http://lsm.deri.ie/ont/lsm.owl#hasSensorType> ?type." // + "?sensorId <http://www.loa-cnr.it/ontologies/DUL.owl#hasLocation> ?p." // + "?p geo:geometry ?geo." // + "filter (<bif:st_intersects>(?geo,<bif:st_point>("+ longitude + "," + latitude + ")," + radius + "))." // + "}"); String str = ("select distinct(?sensLabelType) "//?type " + "from <" + lsmMetaGraph + "> " + "WHERE " + "{" + "?sensLabelType <http://www.w3.org/2000/01/rdf-schema#subClassOf> <http://purl.oclc.org/NET/ssnx/ssn#Sensor>." + "?sensorId <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?sensLabelType." + "?sensorId <http://www.loa-cnr.it/ontologies/DUL.owl#hasLocation> ?p." + "?p geo:geometry ?geo." + "filter (<bif:st_intersects>(?geo,<bif:st_point>("+ longitude + "," + latitude + ")," + radius + "))." + "}"); logger.debug("qString of: getSensTypeInArea --"+str); update.append(str); return update.toString(); } public static String getMDataOfSensorTypeInArea(String lsmMetaGraph,double longitude, double latitude, float radius,String sensorType) { StringBuilder update = new StringBuilder(); // String str = ("SELECT ?measurement ?unit (AVG(?value) AS ?avalue) " // + "WHERE " // + "{" // + "?prob <http://www.w3.org/2000/01/rdf-schema#label> ?measurement. " // + "?prob <http://openiot.eu/ontology/ns/unit> ?unit." // + "?prob <http://openiot.eu/ontology/ns/value> ?value." // + "?prob <http://openiot.eu/ontology/ns/isObservedValueOf> ?obs." // + "?obs <http://purl.oclc.org/NET/ssnx/ssn#observedBy> ?sensorId." // // + "{" // + "select ?sensorId " + "from <" + lsmMetaGraph + "> " // + "WHERE " // + "{" // + "?type <http://www.w3.org/2000/01/rdf-schema#label> '" + sensorType + "' ." // + "?sensorId <http://lsm.deri.ie/ont/lsm.owl#hasSensorType> ?type. " // + "FILTER EXISTS {?sensorId <http://www.loa-cnr.it/ontologies/DUL.owl#hasLocation> ?p. }" // + "?p geo:geometry ?geo. " // + "filter (<bif:st_intersects>(?geo,<bif:st_point>("+ longitude + "," + latitude + ")," + radius + ")). " // + "}" // + "}" // // + "}group by (?measurement)(?unit) "); String str = ("SELECT ?measurement ?unit (AVG(?value) AS ?avalue) " + "WHERE " + "{" + "?prob <http://www.w3.org/2000/01/rdf-schema#label> ?measurement. " + "?prob <http://openiot.eu/ontology/ns/unit> ?unit." + "?prob <http://openiot.eu/ontology/ns/value> ?value." + "?prob <http://openiot.eu/ontology/ns/isObservedValueOf> ?obs." + "?obs <http://purl.oclc.org/NET/ssnx/ssn#observedBy> ?sensorId." + "{" + "select ?sensorId " + "from <" + lsmMetaGraph + "> " + "WHERE " + "{" + "<" + sensorType + "> <http://www.w3.org/2000/01/rdf-schema#subClassOf> <http://purl.oclc.org/NET/ssnx/ssn#Sensor>." + "?sensorId <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <" + sensorType + ">." + "FILTER EXISTS {?sensorId <http://www.loa-cnr.it/ontologies/DUL.owl#hasLocation> ?p. }" + "?p geo:geometry ?geo. " + "filter (<bif:st_intersects>(?geo,<bif:st_point>("+ longitude + "," + latitude + ")," + radius + ")). " + "}" + "}" + "}group by (?measurement)(?unit) "); logger.debug("qString of: getMDataOfSensorTypeInArea --"+str); update.append(str); return update.toString(); } } final static Logger logger = LoggerFactory.getLogger(DiscoverSensorsImpl.class); private String lsmMetaGraph = ""; // private String userID; private double longitude; private double latitude; private float radius; private SensorTypes sensorTypes = null; public DiscoverSensorsImpl(String userID, double longitude, double latitude, float radius) { PropertyManagement propertyManagement = new PropertyManagement(); lsmMetaGraph = propertyManagement.getSchedulerLsmMetaGraph(); this.userID = userID; this.longitude = longitude; this.latitude = latitude; this.radius = radius; logger.debug("Recieved Parameters: " + "userID=" + userID + ", longitude=" + longitude + ", latitude=" + latitude + ", radius=" + radius); discoversensors(); } /** * @return Returns the SensorTypes, within the given area defined by the * lon,lat and rad parameters */ public SensorTypes getSensorTypes() { return sensorTypes; } // helper methods private void discoversensors() { sensorTypes = new SensorTypes(); SesameSPARQLClient sparqlCl = null; try { sparqlCl = new SesameSPARQLClient(); } catch (RepositoryException e) { logger.error("Init sparql repository error. Returning an empty SensorTypes object. ", e); return; } TupleQueryResult qres = sparqlCl.sparqlToQResult(Queries.getSensTypeInArea(lsmMetaGraph,longitude, latitude,radius)); List<SensorTypeData> sensorTypesList = Queries.parseSensorTypeInArea(qres); for (int i = 0; i < sensorTypesList.size(); i++) { SensorType sensorType = new SensorType(); //sensorType.setId(sensorTypesList.get(i).getID()); sensorType.setName(sensorTypesList.get(i).getLabel()); qres = sparqlCl.sparqlToQResult(Queries.getMDataOfSensorTypeInArea(lsmMetaGraph,longitude, latitude,radius,sensorTypesList.get(i).getLabel())); List<SensorTypeMetaData> fullMetaData = Queries.parseSensorTypeMetaData(qres); for (int j = 0; j < fullMetaData.size(); j++) { MeasurementCapability mc = new MeasurementCapability(); mc.setType(fullMetaData.get(j).getMeasuredVal()); Unit unit = new Unit(); unit.setName(fullMetaData.get(j).getUnit()); unit.setType(fullMetaData.get(j).getValue()); mc.getUnit().add(unit); sensorType.getMeasurementCapability().add(mc); } sensorTypes.getSensorType().add(sensorType); }// for } }// class