/** * Copyright 2014-2015 Converge ICT * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package eu.betaas.adaptation.thingsadaptor.api.impl; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Vector; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import org.apache.log4j.Logger; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; import eu.betaas.adaptation.contextmanager.api.SemanticParserAdaptator; import eu.betaas.adaptation.plugin.api.IAdaptorPlugin; import eu.betaas.adaptation.thingsadaptor.api.ThingsAdaptor; import eu.betaas.adaptation.thingsadaptor.clients.AdaptorClient; import eu.betaas.adaptation.thingsadaptor.config.Thing; import eu.betaas.adaptation.thingsadaptor.config.ThingWithContext; import eu.betaas.adaptation.thingsadaptor.port.ThingConstructor; import eu.betaas.adaptation.thingsadaptor.port.ThingsObserver; import eu.betaas.rabbitmq.publisher.interfaces.Publisher; import eu.betaas.taas.bigdatamanager.database.service.ThingsData; public class ThingsAdaptorImpl implements ThingsAdaptor{ private SemanticParserAdaptator adaptationcm; private List<IAdaptorPlugin> adaptationPlugin; private static BundleContext context; private String key = "monitoring.adaptation"; Logger mLogger; Vector<HashMap<String, String>> discoveredSensors = new Vector<HashMap<String,String>>(); private String sensorsFolder; private volatile ThingsObserver observer; private ScheduledExecutorService executor; public void startTAModule() { mLogger = Logger.getLogger("betaas.adaptation"); mLogger.info("ThingsAdaptor Started.................................."); AdaptorClient sClient = AdaptorClient.instance(context); adaptationPlugin = sClient.getApService(); //Discover the available Sensors.... executor = Executors.newScheduledThreadPool(1); observer = new ThingsObserver(adaptationPlugin, adaptationcm, this, sensorsFolder); observer.init(); // readerThread = new Thread(observer); mLogger.info("FInished with Discovered Sensors:" + discoveredSensors.size()); if (discoveredSensors.size() > 0){ mLogger.info("SEARCHED AND FOUND "+discoveredSensors.size()+" DEVICES"); busMessage("Found:"+discoveredSensors.size()+" Devices"); ThingConstructor thingConstructor = new ThingConstructor(adaptationcm); thingConstructor.constructSendThings(discoveredSensors); } else { mLogger.info("NO DEVICES FOUND!"); } try { executor.schedule(observer, 10, TimeUnit.SECONDS); } catch (Exception e) { mLogger.error("While executing ThingObserver Thread"); e.printStackTrace(); } } public void stopTAModule() { mLogger.info("ThingsAdaptor STOPPED.................................."); try { executor.shutdown(); observer.stopThread(); } catch (Exception e) { e.printStackTrace(); } } public Vector<HashMap<String, String>> getThingsLocal() { return discoveredSensors; } public List<Thing> getPhysicalThingsData() { List<Thing> result = new ArrayList<Thing>(); try { } catch (Exception e) { e.printStackTrace(); } return result; } public ThingWithContext translateThingsInformation(Thing theThing) { ThingWithContext result = new ThingWithContext(); try { if (theThing.isHasContext()){ } else { result = (ThingWithContext) theThing; } } catch (Exception e) { e.printStackTrace(); } return result; } public void setAdaptationcm(SemanticParserAdaptator adaptationcm) { this.adaptationcm = adaptationcm; } public List<ThingsData> getRealTimeInformation() { ArrayList<ThingsData> thingsList = new ArrayList<ThingsData>(); if (discoveredSensors.size() > 0){ mLogger.info("SEARCHED AND FOUND "+discoveredSensors.size()+" DEVICES"); ThingConstructor thingConstructor = new ThingConstructor(adaptationcm); thingsList = thingConstructor.constructSendThings(discoveredSensors); } else { mLogger.info("NO DEVICES FOUND!"); } return thingsList; } public void setContext(BundleContext context) { this.context = context; } public boolean register(String sensorId) { boolean result = false; for (int i = 0; i < adaptationPlugin.size(); i++) { result = result || adaptationPlugin.get(i).register(sensorId, 5); } return result; } public String getData(String thingId) { String result=""; for (int i = 0; i < adaptationPlugin.size(); i++) { result += adaptationPlugin.get(i).getData(thingId); } return result; } public String setThingValue(String thingId, String value) { String result=""; for (int i = 0; i < adaptationPlugin.size(); i++) { result += adaptationPlugin.get(i).setData(thingId,value); } return result; } public List<ThingsData> getMeasurement(List<ThingsData> selectedThingsList) { for (ThingsData thingsData : selectedThingsList) { String measurment = getData(thingsData.getThingId()); thingsData.setMeasurement(measurment); } return selectedThingsList; } public void setMeasurement(List<ThingsData> selectedThingsList) { for (ThingsData thingsData : selectedThingsList) { setThingValue(thingsData.getThingId(), thingsData.getMeasurement()); } } public ThingsData getMeasurement(String thingId) { ThingsData result = null; ThingConstructor thingConstructor = new ThingConstructor(adaptationcm); for (HashMap<String, String> map : discoveredSensors) { if(thingId.equals(map.get("ID"))){ String measurement = this.getData(thingId); map.put("measurement", measurement); mLogger.info("getMeasurement will return : " + map); result = thingConstructor.constructSendThing(map); return result; } } return result; } public List<ThingsData> getMeasurementThingsMonitoring( List<ThingsData> thingsList) { return null; } public boolean subscribe(String thingId, int seconds) { boolean result = false; for (int i = 0; i < adaptationPlugin.size(); i++) { result = result || adaptationPlugin.get(i).register(thingId, seconds); } return result; } public boolean unsubscribe(List<String> thingIdsList) { boolean result = true; for (String thingId : thingIdsList) { boolean partialResult = false; for (int i = 0; i < adaptationPlugin.size(); i++) { mLogger.info("UNSUBSCRIBE Thing:"+thingId); busMessage("UNSUBSCRIBE Thing:"+thingId); partialResult = partialResult || adaptationPlugin.get(i).unregister(thingId); } result = result && partialResult; } return result; } public void setSensorsFolder(String sensorsFolder) { this.sensorsFolder = sensorsFolder; } public void setDiscoveredSensors( Vector<HashMap<String, String>> discoveredSensors) { mLogger.info("Setting Discovered Sensors in TA!"); this.discoveredSensors = discoveredSensors; } private void busMessage(String message){ mLogger.debug("Checking queue"); mLogger.debug("Sending to queue"); ServiceReference serviceReference = context.getServiceReference(Publisher.class.getName()); mLogger.debug("Sending to queue"); if (serviceReference==null){ return; } Publisher service = (Publisher) context.getService(serviceReference); mLogger.debug("Sending"); service.publish(key,message); mLogger.debug("Sent"); } }