package eu.play_project.dcep;
import java.io.Serializable;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.HashMap;
import java.util.Map;
import org.etsi.uri.gcm.util.GCM;
import org.objectweb.fractal.adl.ADLException;
import org.objectweb.fractal.adl.Factory;
import org.objectweb.fractal.api.Component;
import org.objectweb.fractal.api.NoSuchInterfaceException;
import org.objectweb.fractal.api.control.IllegalLifeCycleException;
import org.objectweb.proactive.Body;
import org.objectweb.proactive.core.ProActiveException;
import org.objectweb.proactive.core.component.Fractive;
import org.objectweb.proactive.core.component.adl.FactoryFactory;
import org.objectweb.proactive.core.component.body.ComponentEndActive;
import org.objectweb.proactive.core.component.body.ComponentInitActive;
import org.objectweb.proactive.core.config.CentralPAPropertyRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import eu.play_project.dcep.api.DcepManagementException;
import eu.play_project.dcep.api.DcepManagmentApi;
import eu.play_project.dcep.api.DcepMonitoringApi;
import eu.play_project.dcep.api.measurement.MeasurementConfig;
import eu.play_project.dcep.api.measurement.NodeMeasurementResult;
import eu.play_project.dcep.constants.DcepConstants;
import eu.play_project.dcep.distributedetalis.DistributedEtalis;
import eu.play_project.dcep.distributedetalis.api.ConfigApi;
import eu.play_project.dcep.distributedetalis.api.DistributedEtalisException;
import eu.play_project.dcep.distributedetalis.api.DistributedEtalisTestApi;
import eu.play_project.dcep.distributedetalis.api.SimplePublishApi;
import eu.play_project.dcep.distributedetalis.configurations.DetalisConfig4store;
import eu.play_project.dcep.distributedetalis.configurations.DetalisConfigLocal;
import eu.play_project.dcep.distributedetalis.configurations.DetalisConfigNet;
import eu.play_project.dcep.distributedetalis.configurations.DetalisConfigVirtuoso;
import eu.play_project.play_platformservices.api.BdplQuery;
import fr.inria.eventcloud.api.CompoundEvent;
/**
* Distributed Complex Event Processing (DCEP) component. This component is a
* container to hold one or more instances of {@linkplain DistributedEtalis} to
* create a distributed network.
*
* @author Stefan Obermeier
* @author Roland Stühmer
*/
public class Dcep implements DcepMonitoringApi, DcepManagmentApi,
ComponentInitActive, ComponentEndActive, DistributedEtalisTestApi,
Serializable {
private static final long serialVersionUID = 100L;
private DistributedEtalisTestApi dEtalisTest;
private DcepMonitoringApi dEtalisMonitoring;
private DcepManager dcepManager;
private ConfigApi configApi;
private Component dEtalis;
private Logger logger;
private boolean init = false; // Shows if variables for other components are
// initialized.
public Dcep() {
}
@Override
public void initComponentActivity(Body body) {
logger = LoggerFactory.getLogger(this.getClass());
logger.info("Initialising {} component.", this.getClass()
.getSimpleName());
CentralPAPropertyRepository.GCM_PROVIDER
.setValue("org.objectweb.proactive.core.component.Fractive");
}
@Override
public void endComponentActivity(Body arg0) {
logger.info("Terminating {} component.", this.getClass()
.getSimpleName());
try {
GCM.getGCMLifeCycleController(this.dEtalis).stopFc();
GCM.getGCMLifeCycleController(this.dEtalis).terminateGCMComponent();
} catch (IllegalLifeCycleException e) {
logger.error("Error terminating subcomponent.", e);
} catch (NullPointerException e) {
logger.error("Error terminating subcomponent.", e);
} catch (NoSuchInterfaceException e) {
logger.error("Error terminating subcomponent.", e);
}
}
@Override
public void registerEventPattern(BdplQuery bdplQuery) throws DcepManagementException {
logger.debug("Pattern reached DCEP facade: "
+ bdplQuery.getEleQuery());
if(!init) init();
dcepManager.getManagementApi().registerEventPattern(bdplQuery);
}
@Override
public BdplQuery getRegisteredEventPattern(String queryId) throws DcepManagementException{
if(!init) init();
return dcepManager.getManagementApi().getRegisteredEventPattern(queryId);
}
@Override
public Map<String, BdplQuery> getRegisteredEventPatterns() {
if(!init) init();
return dcepManager.getManagementApi().getRegisteredEventPatterns();
}
@Override
public void unregisterEventPattern(String queryID) {
if(!init) init();
dcepManager.getManagementApi().unregisterEventPattern(queryID);
}
@Override
public void publish(CompoundEvent event) {
if(!init) init();
dEtalisTest.publish(event);
}
@Override
public void attach(SimplePublishApi subscriber) {
if(!init) init();
dEtalisTest.attach(subscriber);
}
@Override
public void detach(SimplePublishApi subscriber) {
if(!init) init();
dEtalisTest.detach(subscriber);
}
/**
* Init connections to dEtalis components.
*/
private boolean init() {
if (init) {
logger.warn("{} has already been initialized. Skipping.", this.getClass().getSimpleName());
}
else {
Factory factory;
try {
factory = FactoryFactory.getFactory();
HashMap<String, Object> context = new HashMap<String, Object>();
this.dEtalis = (Component) factory.newComponent(
"DistributedEtalis", context);
GCM.getGCMLifeCycleController(dEtalis).startFc();
dEtalisTest = ((DistributedEtalisTestApi) dEtalis
.getFcInterface(DistributedEtalisTestApi.class.getSimpleName()));
dEtalisMonitoring = ((DcepMonitoringApi) dEtalis
.getFcInterface(DcepMonitoringApi.class.getSimpleName()));
configApi = ((ConfigApi)dEtalis.getFcInterface(ConfigApi.class.getSimpleName()));
configDEtalisInstance(configApi);
} catch (NoSuchInterfaceException e) {
logger.error("Error initialising DCEP: ", e);
//throw new DcepException("Error initialising DCEP: ", e);
} catch (ADLException e) {
logger.error("Error initialising DCEP: ", e);
//throw new DcepException("Error initialising DCEP: ", e);
} catch (IllegalLifeCycleException e) {
logger.error("Error initialising DCEP: ", e);
//throw new DcepException("Error initialising DCEP: ", e);
} catch (DistributedEtalisException e) {
logger.error("Error initialising DCEP: ", e);
//throw new DcepException("Error initialising DCEP: ", e);
}
// Register apis
try {
Registry registry = LocateRegistry.getRegistry();
} catch (RemoteException e) {
logger.error("Error initialising DCEP: ", e);
//throw new DcepException("Error initialising DCEP: ", e);
}
try {
Fractive.registerByName(this.dEtalis, "dEtalis");
} catch (ProActiveException e) {
logger.error("Error initialising DCEP: ", e);
//throw new DcepException("Error initialising DCEP: ", e);
}
dcepManager = new DcepManager();
dcepManager.init();
init = true;
}
return init;
}
public void configDEtalisInstance(ConfigApi configApi) throws DistributedEtalisException {
// get property or set default:
String middleware = DcepConstants.getProperties().getProperty("dcep.middleware", "local");
if(middleware.equals("local")) {
configApi.setConfig(new DetalisConfigLocal("play-epsparql-clic2call-historical-data.trig"));
}
else if(middleware.equals("eventcloud")) {
configApi.setConfig(new DetalisConfigNet());
}
else if(middleware.equals("virtuoso")) {
configApi.setConfig(new DetalisConfigVirtuoso());
}
else if(middleware.equals("4store")) {
configApi.setConfig(new DetalisConfig4store());
}
else {
logger.error("Specified middleware is not implemented: {}.", middleware);
}
}
@Override
public void measurePerformance(MeasurementConfig config) {
if(!init) init();
dEtalisMonitoring.measurePerformance(config);
}
@Override
public NodeMeasurementResult getMeasuredData(String queryId) {
if(!init) init();
return dEtalisMonitoring.getMeasuredData(queryId);
}
}