/**
* 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 org.apache.log4j.Logger;
import org.osgi.framework.BundleContext;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceEvent;
import org.osgi.framework.ServiceListener;
import org.osgi.framework.ServiceReference;
import eu.betaas.adaptation.contextmanager.api.SemanticParserAdaptator;
import eu.betaas.adaptation.plugin.api.IAdaptorListener;
import eu.betaas.adaptation.plugin.api.IAdaptorPlugin;
import eu.betaas.adaptation.thingsadaptor.clients.AdaptorClient;
import eu.betaas.adaptation.thingsadaptor.port.ThingConstructor;
public class AdaptatorListenerImpl implements IAdaptorListener {
Logger mLogger = Logger.getLogger("betaas.adaptation");
private ServiceListener sl;
private static BundleContext context;
ServiceReference sr;
private static AdaptatorListenerImpl listener = null;
private List<IAdaptorPlugin> adaptationPlugin;
private SemanticParserAdaptator adaptationcm;
private AdaptatorListenerImpl() {
super();
}
public static AdaptatorListenerImpl getInstance() {
Logger mLogger = Logger.getLogger("betaas.adaptation");
mLogger.info("Called getInstance!"); // comment
if (listener == null) {
listener = new AdaptatorListenerImpl();
}
return listener;
}
public boolean notify(String type, String resourceID, HashMap<String, String> value) {
mLogger.info("Got notification from adaptation plugin for DeviceID:"+resourceID + " with value : " + value);
ThingConstructor thingConstructor = new ThingConstructor(adaptationcm);
thingConstructor.notifyMeasurment(resourceID, value);
return false;
}
public boolean removeThing(String thingId) {
mLogger.info("Got notification from adaptation plugin that DeviceID:"+thingId + " was removed");
List<String> ids = new ArrayList<String>();
ids.add(thingId);
adaptationcm.removeThing(ids);
return true;
}
public void start() {
mLogger.debug("context is:"+(context != null));
AdaptorClient sClient = AdaptorClient.instance(context);
adaptationPlugin = sClient.getApService();
setMyServiceRegistered();
register();
}
public void stop() {
stopListener();
}
public void setMyServiceRegistered() {
mLogger.debug("####Registering the AdaptatorListenerImpl.");
try {
sl = new ServiceListener() {
public void serviceChanged(ServiceEvent ev) {
sr = ev.getServiceReference();
IAdaptorListener adaptationLResource = (IAdaptorListener) context
.getService(sr);
switch (ev.getType()) {
case ServiceEvent.REGISTERED: {
mLogger.info("Register event");
for (int i = 0; i < adaptationPlugin.size(); i++) {
adaptationPlugin.get(i).setListener(adaptationLResource);
}
}
break;
case ServiceEvent.UNREGISTERING: {
mLogger.info("Unregister event");
for (int i = 0; i < adaptationPlugin.size(); i++) {
adaptationPlugin.get(i).setListener(null);
}
context.ungetService(sr);
sr = null;
}
break;
default:
mLogger.info("default event");
break;
}
}
};
context.addServiceListener(sl);
} catch (Exception e) {
mLogger.error("EXCEPTION: " + e.getMessage());
}
}
public boolean stopListener() {
try {
context.removeServiceListener(sl);
this.sl = null;
} catch (Exception e) {
mLogger.error("EXCEPTION: " + e.getMessage());
return false;
}
return true;
}
public void register() {
try {
ServiceReference[] srl = context.getServiceReferences(IAdaptorListener.class.getName(), null);
if (srl != null) {
for (int i = 0; srl != null && i < srl.length; i++) {
sl.serviceChanged(new ServiceEvent(ServiceEvent.REGISTERED,
srl[i]));
}
}
} catch (InvalidSyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void setContext(BundleContext context) {
this.context = context;
}
public void setAdaptationcm(SemanticParserAdaptator adaptationcm) {
this.adaptationcm = adaptationcm;
}
}