package org.openiot.scheduler.client.rest; /** * Copyright (c) 2011-2014, OpenIoT * * This file is part of OpenIoT. * * OpenIoT is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, version 3 of the License. * * OpenIoT is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with OpenIoT. If not, see <http://www.gnu.org/licenses/>. * * Contact: OpenIoT mailto: info@openiot.eu */ import java.io.FileNotFoundException; import java.io.StringReader; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.UriBuilder; import javax.xml.bind.JAXBContext; import javax.xml.bind.Unmarshaller; import javax.xml.transform.stream.StreamSource; import org.jboss.resteasy.client.ClientRequest; import org.jboss.resteasy.client.ClientRequestFactory; import org.jboss.resteasy.client.ClientResponse; 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.sparql.protocoltypes.model.QueryRequest; import org.openiot.commons.descriptiveids.model.DescreptiveIDs; import org.openiot.commons.descriptiveids.model.DescriptiveID; import org.openiot.commons.osdspec.model.OAMO; import org.openiot.commons.osdspec.model.OSDSpec; import org.openiot.commons.osdspec.model.OSMO; import org.openiot.commons.osdspec.model.PresentationAttr; import org.openiot.commons.osdspec.model.Widget; import org.openiot.commons.osdspec.utils.Utilities; import org.openiot.commons.osdspec.utils.Utilities.Deserializer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author Nikos Kefalakis (nkef) e-mail: nkef@ait.edu.gr * @author Stavros Petris (spet) e-mail: spet@ait.edu.gr */ public class SchedulerClient { //logger final static Logger logger = LoggerFactory.getLogger(SchedulerClient.class); private ClientRequestFactory clientRequestFactory; public SchedulerClient() { clientRequestFactory = new ClientRequestFactory(UriBuilder.fromUri( "http://localhost:8080/scheduler.core").build()); } public SchedulerClient(String schedulerURL) { clientRequestFactory = new ClientRequestFactory(UriBuilder.fromUri( schedulerURL).build()); } /** * Prints the available services of the scheduler interface. * Can be used to check that the scheduler service is alive. * * @return the welcome message */ public String welcomeMessage() { ClientRequest welcomeMessageClientRequest = clientRequestFactory .createRelativeRequest("/rest/services"); welcomeMessageClientRequest.accept(MediaType.TEXT_PLAIN); try { String str = welcomeMessageClientRequest.get(String.class).getEntity(); logger.debug(str); return str; } catch (Exception e) { logger.error("WelcomeMessage getEntity error",e); return null; } } /** * Returns the properties of all the sensors deployed in the area defined * by lon,lat and radius. * * @param longitude * @param lat * @param radius * * @return the sensortypes discovered */ public SensorTypes discoverSensors(double longitude, double lat, float radius, String clientId, String token) { ClientRequest discoverSensorsClientRequest = clientRequestFactory .createRelativeRequest("/rest/services/discoverSensors"); //Prepare the request discoverSensorsClientRequest.queryParameter("userID", "userIDString"); discoverSensorsClientRequest.queryParameter("longitude", longitude); discoverSensorsClientRequest.queryParameter("latitude", lat); discoverSensorsClientRequest.queryParameter("radius", radius); discoverSensorsClientRequest.queryParameter("clientId", clientId); discoverSensorsClientRequest.queryParameter("token", token); discoverSensorsClientRequest.accept("application/xml"); //Handle the response String str = null; try { ClientResponse<String> response = discoverSensorsClientRequest.get(String.class); if (response.getStatus() != 200) { throw new RuntimeException("Failed : HTTP error code : " + response.getStatus()); } str = response.getEntity(); logger.debug(str); } catch (Exception e) { logger.error("discoverSensors getEntity error",e); //no need to proceed to umarshalling return null; } try { String sensorTypes_JAXB_CONTEXT = "org.openiot.commons.sensortypes.model"; JAXBContext context = JAXBContext.newInstance(sensorTypes_JAXB_CONTEXT); Unmarshaller um = context.createUnmarshaller(); SensorTypes sensorTypes = (SensorTypes) um.unmarshal(new StreamSource(new StringReader(str))); //debug for (SensorType sensorType : sensorTypes.getSensorType()) { logger.debug("sensorType.getId():" + sensorType.getId()); logger.debug("sensorType.getName():" + sensorType.getName()); for (MeasurementCapability measurementCapability : sensorType.getMeasurementCapability()) { logger.debug("measurementCapability.getId():" + measurementCapability.getId()); logger.debug("measurementCapability.getName():" + measurementCapability.getType()); for (Unit unit : measurementCapability.getUnit()) { logger.debug("unit.getName():" + unit.getName()); logger.debug("unit.getType():" + unit.getType()); } } } return sensorTypes; } catch (Exception e) { logger.error("Unmarshal SensorTypes error",e); return null; } } public String userRegister(String userName, String userMail,String description, String passwd) { ClientRequest registerUserClientRequest = clientRequestFactory .createRelativeRequest("/rest/services/userRegister"); registerUserClientRequest.queryParameter("userName", userName); registerUserClientRequest.queryParameter("userMail", userMail); registerUserClientRequest.queryParameter("description", description); registerUserClientRequest.queryParameter("password", passwd); registerUserClientRequest.accept("application/xml"); //Handle the response try { ClientResponse<String> response = registerUserClientRequest.get(String.class); if (response.getStatus() != 200) { throw new RuntimeException("Failed : HTTP error code : " + response.getStatus()); } String responseStr = response.getEntity(); logger.debug(responseStr); return responseStr; } catch (Exception e) { logger.error("register user get response entity error",e); return null; } } public String userLogin(String userMail, String passwd) { ClientRequest registerUserClientRequest = clientRequestFactory .createRelativeRequest("/rest/services/userLogin"); registerUserClientRequest.queryParameter("userMail", userMail); registerUserClientRequest.queryParameter("userPaswrd", passwd); registerUserClientRequest.accept("application/xml"); //Handle the response try { ClientResponse<String> response = registerUserClientRequest.get(String.class); if (response.getStatus() != 200) { throw new RuntimeException("Failed : HTTP error code : " + response.getStatus()); } String responseStr = response.getEntity(); logger.debug(responseStr); return responseStr; } catch (Exception e) { logger.error("login user get response entity error",e); return null; } } /** * Stores a service created by the user. * * @param osdSpec the service specification * * @return the response from the server, null if something went wrong * */ public String registerService(OSDSpec osdSpec, String clientId, String token) { ClientRequest registerServiceClientRequest = clientRequestFactory .createRelativeRequest("/rest/services/registerService"); registerServiceClientRequest.queryParameter("clientId", clientId); registerServiceClientRequest.queryParameter("token", token); registerServiceClientRequest.body(MediaType.APPLICATION_XML, osdSpec); //Handle the response try { ClientResponse<String> response = registerServiceClientRequest.post(String.class); if (response.getStatus() != 200) { throw new RuntimeException("Failed : HTTP error code : " + response.getStatus()); } String responseStr = response.getEntity(); logger.debug("Service registered successfully: " + responseStr); return responseStr; } catch (Exception e) { logger.error("register service get response entity error",e); return null; } } public OAMO getApplication(String applicationID, String clientId, String token) { ClientRequest getApplicationRequest = clientRequestFactory .createRelativeRequest("/rest/services/getApplication"); //Prepare the request getApplicationRequest.queryParameter("applicationID", applicationID); getApplicationRequest.queryParameter("clientId", clientId); getApplicationRequest.queryParameter("token", token); getApplicationRequest.accept("application/xml"); //Handle the response String str = null; try { ClientResponse<String> response = getApplicationRequest.get(String.class); if (response.getStatus() != 200) { throw new RuntimeException("Failed : HTTP error code : " + response.getStatus()); } str = response.getEntity(); logger.debug(str); } catch (Exception e) { logger.error("getApplicationRequest getEntity error",e); //no need to proceed to umarshalling return null; } try { String sensorTypes_JAXB_CONTEXT = "org.openiot.commons.osdspec.model"; JAXBContext context = JAXBContext.newInstance(sensorTypes_JAXB_CONTEXT); Unmarshaller um = context.createUnmarshaller(); OAMO oamo = (OAMO) um.unmarshal(new StreamSource(new StringReader(str))); logger.debug("oamo.getId():" + oamo.getId()); logger.debug("oamo.getName():" + oamo.getName()); logger.debug("oamo.getDescription():" + oamo.getDescription()); logger.debug("oamo.oamo.getGraphMeta():" + oamo.getGraphMeta()); //debug for (OSMO osmo : oamo.getOSMO()) { logger.debug("osmo.getId():" + osmo.getId()); logger.debug("osmo.getName():" + osmo.getName()); logger.debug("osmo.getName():" + osmo.getDescription()); for (QueryRequest qr : osmo.getQueryRequest()) { logger.debug("qr.getQuery():" + qr.getQuery()); } for (Widget w : osmo.getRequestPresentation().getWidget()) { logger.debug("w.getWidgetID():" + w.getWidgetID()); for (PresentationAttr pattr : w.getPresentationAttr()) { logger.debug("pattr.getName():" + pattr.getName()); logger.debug("pattr.getValue():" + pattr.getValue()); } } } return oamo; } catch (Exception e) { logger.error("Unmarshal OAMO error",e); return null; } } public OSMO getService(String serviceID, String clientId, String token) { ClientRequest getServiceRequest = clientRequestFactory .createRelativeRequest("/rest/services/getService"); //Prepare the request getServiceRequest.queryParameter("serviceID", serviceID); getServiceRequest.queryParameter("clientId", clientId); getServiceRequest.queryParameter("token", token); getServiceRequest.accept("application/xml"); //Handle the response String str = null; try { ClientResponse<String> response = getServiceRequest.get(String.class); if (response.getStatus() != 200) { throw new RuntimeException("Failed : HTTP error code : " + response.getStatus()); } str = response.getEntity(); logger.debug(str); } catch (Exception e) { logger.error("getServiceRequest getEntity error",e); //no need to proceed to umarshalling return null; } try { String sensorTypes_JAXB_CONTEXT = "org.openiot.commons.osdspec.model"; JAXBContext context = JAXBContext.newInstance(sensorTypes_JAXB_CONTEXT); Unmarshaller um = context.createUnmarshaller(); OSMO osmo = (OSMO) um.unmarshal(new StreamSource(new StringReader(str))); //debug logger.debug("osmo.getId():" + osmo.getId()); logger.debug("osmo.getName():" + osmo.getName()); logger.debug("osmo.getName():" + osmo.getDescription()); for (QueryRequest qr : osmo.getQueryRequest()) { logger.debug("qr.getQuery():" + qr.getQuery()); } for (Widget w : osmo.getRequestPresentation().getWidget()) { logger.debug("w.getWidgetID():" + w.getWidgetID()); for (PresentationAttr pattr : w.getPresentationAttr()) { logger.debug("pattr.getName():" + pattr.getName()); logger.debug("pattr.getValue():" + pattr.getValue()); } } return osmo; } catch (Exception e) { logger.error("Unmarshal OAMO error",e); return null; } } public DescreptiveIDs getAvailableAppIDs(String userID, String clientId, String token) { ClientRequest getServiceRequest = clientRequestFactory .createRelativeRequest("/rest/services/getAvailableAppIDs"); //Prepare the request getServiceRequest.queryParameter("userID", userID); getServiceRequest.queryParameter("clientId", clientId); getServiceRequest.queryParameter("token", token); getServiceRequest.accept("application/xml"); //Handle the response String str = null; try { ClientResponse<String> response = getServiceRequest.get(String.class); if (response.getStatus() != 200) { throw new RuntimeException("Failed : HTTP error code : " + response.getStatus()); } str = response.getEntity(); logger.debug(str); } catch (Exception e) { logger.error("getServiceRequest getEntity error",e); //no need to proceed to umarshalling return null; } try { String sensorTypes_JAXB_CONTEXT = "org.openiot.commons.descriptiveids.model"; JAXBContext context = JAXBContext.newInstance(sensorTypes_JAXB_CONTEXT); Unmarshaller um = context.createUnmarshaller(); DescreptiveIDs dids = (DescreptiveIDs) um.unmarshal(new StreamSource(new StringReader(str))); //debug for (DescriptiveID did : dids.getDescriptiveID()) { logger.debug("did.getId():" + did.getId()); logger.debug("did.getName():" + did.getName()); logger.debug("did.getDescription():" + did.getDescription()); } return dids; } catch (Exception e) { logger.error("Unmarshal DescriptiveID error",e); return null; } } public DescreptiveIDs getAvailableServiceIDs(String applicationID, String clientId, String token) { ClientRequest getServiceRequest = clientRequestFactory .createRelativeRequest("/rest/services/getAvailableServiceIDs"); //Prepare the request getServiceRequest.queryParameter("applicationID", applicationID); getServiceRequest.queryParameter("clientId", clientId); getServiceRequest.queryParameter("token", token); getServiceRequest.accept("application/xml"); //Handle the response String str = null; try { ClientResponse<String> response = getServiceRequest.get(String.class); if (response.getStatus() != 200) { throw new RuntimeException("Failed : HTTP error code : " + response.getStatus()); } str = response.getEntity(); logger.debug(str); } catch (Exception e) { logger.error("getServiceRequest getEntity error",e); //no need to proceed to umarshalling return null; } try { String sensorTypes_JAXB_CONTEXT = "org.openiot.commons.descriptiveids.model"; JAXBContext context = JAXBContext.newInstance(sensorTypes_JAXB_CONTEXT); Unmarshaller um = context.createUnmarshaller(); DescreptiveIDs dids = (DescreptiveIDs) um.unmarshal(new StreamSource(new StringReader(str))); //debug for (DescriptiveID did : dids.getDescriptiveID()) { logger.debug("did.getId():" + did.getId()); logger.debug("did.getName():" + did.getName()); logger.debug("did.getDescription():" + did.getDescription()); } return dids; } catch (Exception e) { logger.error("Unmarshal DescriptiveID error",e); return null; } } public OSDSpec getAvailableApps(String userID, String clientId, String token) { ClientRequest getServiceRequest = clientRequestFactory .createRelativeRequest("/rest/services/getAvailableApps"); //Prepare the request getServiceRequest.queryParameter("userID", userID); getServiceRequest.queryParameter("clientId", clientId); getServiceRequest.queryParameter("token", token); getServiceRequest.accept("application/xml"); //Handle the response String str = null; try { ClientResponse<String> response = getServiceRequest.get(String.class); if (response.getStatus() != 200) { throw new RuntimeException("Failed : HTTP error code : " + response.getStatus()); } str = response.getEntity(); logger.debug(str); } catch (Exception e) { logger.error("getAvailableApps getEntity error",e); //no need to proceed to umarshalling return null; } try { String sensorTypes_JAXB_CONTEXT = "org.openiot.commons.osdspec.model"; JAXBContext context = JAXBContext.newInstance(sensorTypes_JAXB_CONTEXT); Unmarshaller um = context.createUnmarshaller(); OSDSpec osdspec = (OSDSpec) um.unmarshal(new StreamSource(new StringReader(str))); logger.debug("osdspec.getUserID():" + osdspec.getUserID()); for (OAMO oamo : osdspec.getOAMO()) { logger.debug("oamo.getId():" + oamo.getId()); logger.debug("oamo.getName():" + oamo.getName()); logger.debug("oamo.getDescription():" + oamo.getDescription()); //debug for (OSMO osmo : oamo.getOSMO()) { logger.debug("osmo.getId():" + osmo.getId()); logger.debug("osmo.getName():" + osmo.getName()); logger.debug("osmo.getName():" + osmo.getDescription()); for (QueryRequest qr : osmo.getQueryRequest()) { logger.debug("qr.getQuery():" + qr.getQuery()); } for (Widget w : osmo.getRequestPresentation().getWidget()) { logger.debug("w.getWidgetID():" + w.getWidgetID()); for (PresentationAttr pattr : w.getPresentationAttr()) { logger.debug("pattr.getName():" + pattr.getName()); logger.debug("pattr.getValue():" + pattr.getValue()); } } } } return osdspec; } catch (Exception e) { logger.error("Unmarshal DescriptiveID error",e); return null; } } // helper methods // /** * Creates a predifined spec and calls registerService(OSDSpec osdSpec) to * register it. * * @return the response from the server, null if something went wrong */ public String registerDemoService(String clientId, String token) { //Prepare the request OSDSpec osdSpec = new OSDSpec(); osdSpec.setUserID("Nikos-Kefalakis"); // // //set it and forget it // OAMO oamo1 = new OAMO(); // // oamo1.setId("OpenIoTApplicationModelObject_1"); // oamo1.setName("OpenIoTApplicationModelObject1Name"); // // // // //equivalent to service entity // OSMO osmo1 = new OSMO(); // // osmo1.setDescription("The New Hyper Service test"); // // //(kane select apo thn vash gia to Service ID) // osmo1.setId("SensorModelObjectServiceID"); // osmo1.setDescription("OpenIoT Sensor Model Object 1"); // osmo1.setName("SensorModelObjectName"); // // // // //ADD WIDGET // Widget widget1 = new Widget(); // // //to WidgetID tha sto stelnei katheytheian o achileas (equivalent to widgetAvailable) // widget1.setWidgetID("TheYperwidgetID"); // // PresentationAttr presentationAttr1 = new PresentationAttr(); // presentationAttr1.setName("widget1PresentationAttr1Name"); // presentationAttr1.setValue("widget1PresentationAttr1Value"); // // PresentationAttr presentationAttr2 = new PresentationAttr(); // presentationAttr2.setName("widget1PresentationAttr2Name"); // presentationAttr2.setValue("widget1PresentationAttr2Value"); // // // widget1.getPresentationAttr().add(presentationAttr1); // widget1.getPresentationAttr().add(presentationAttr2); // // osmo1.getRequestPresentation().getWidget().add(widget1); // // // // //ADD QUERY REQUEST // // osmo1.getQueryRequest().setQuery("SELECT * FROM <openiot> WHERE {?s ?p ?o}"); // // // // oamo1.getOSMO().add(osmo1); // // osdSpec.getOAMO().add(oamo1); return registerService(osdSpec, clientId, token); } /** * Registers a service from an xml file * * @param osdSpec the path of the osdspec XML file * * @return the response from the server, null if something went wrong */ public String registerFromFile(String osdSpecFilePathName, String clientId, String token) throws FileNotFoundException,Exception { OSDSpec osdSpec = null; //Open and Deserialize OSDSPec form file try { osdSpec = Utilities.Deserializer.deserializeOSDSpecFile(osdSpecFilePathName); } catch (FileNotFoundException e) { logger.error("File Not Found",e); throw e; } catch (Exception e) { logger.error("error creating osdspec object",e); throw e; } return registerService(osdSpec, clientId, token); } }