package eu.play_project.dcep.distribution.tests.single_pattern;
import java.util.HashMap;
import javax.jms.IllegalStateException;
import org.etsi.uri.gcm.util.GCM;
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.core.body.exceptions.BodyTerminatedRequestException;
import org.objectweb.proactive.core.component.Fractive;
import org.objectweb.proactive.core.component.adl.FactoryFactory;
import org.objectweb.proactive.core.config.CentralPAPropertyRepository;
import org.objectweb.proactive.extensions.pnp.PNPConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import eu.play_project.dcep.constants.DcepConstants;
import eu.play_project.dcep.distributedetalis.api.DistributedEtalisTestApi;
/**
* Start a single DistributedEtalis instance an register this instance in local registry.
* @author Stefan Obermeier
*
*/
public class SingleDistributedEtalisInstanceRunner {
private static ComplexEventSubscriber subscriber = null;
private static DistributedEtalisTestApi testApi;
private static Logger logger = LoggerFactory.getLogger(SingleDistributedEtalisInstanceRunner.class);
private static boolean running;
private static Component root;
/**
* Start DCEP. There are several ways to stop it: (1) by killing the main
* thread a shutdownhook is caught (2) when an exception happens during
* start.
*/
public static void main(String[] args) throws IllegalStateException {
if (running) {
throw new IllegalStateException("Already running...");
}
running = true;
try {
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
logger.info("Shutting down...");
SingleDistributedEtalisInstanceRunner.stop();
}
});
SingleDistributedEtalisInstanceRunner.start("DistributedEtalis", "dEtalis");
System.out.println("DCEP is running. Use '${DCEP_HOME}/bin/dcep stop', 'kill' or 'kill -15' to stop it.");
// Keep the main thread alive because otherwise Proactive will terminate
synchronized (SingleDistributedEtalisInstanceRunner.class) {
while (running) {
try {
SingleDistributedEtalisInstanceRunner.class.wait();
}
catch (InterruptedException e) {}
}
}
} catch (Exception e) {
logger.error(e.getMessage(), e);
} finally {
SingleDistributedEtalisInstanceRunner.stop();
}
}
public static void start(String componentName, String instanceName) throws Exception {
final String PROACTIVE_PNP_PORT = DcepConstants.getProperties().getProperty("dcep.proactive.pnp.port");
final String PROACTIVE_HTTP_PORT = DcepConstants.getProperties().getProperty("dcep.proactive.http.port");
final String PROACTIVE_RMI_PORT = DcepConstants.getProperties().getProperty("dcep.proactive.rmi.port");
final String PROACTIVE_COMMUNICATION_PROTOCOL = "pnp";
logger.debug("Setting system property 'proactive.communication.protocol' to: " + PROACTIVE_COMMUNICATION_PROTOCOL);
CentralPAPropertyRepository.PA_COMMUNICATION_PROTOCOL.setValue(PROACTIVE_COMMUNICATION_PROTOCOL);
logger.debug("Setting system property 'proactive.pnp.port' to: " + PROACTIVE_PNP_PORT);
PNPConfig.PA_PNP_PORT.setValue(Integer.parseInt(PROACTIVE_PNP_PORT));
logger.debug("Setting system property 'proactive.http.port' to: " + PROACTIVE_HTTP_PORT);
CentralPAPropertyRepository.PA_XMLHTTP_PORT.setValue(Integer.parseInt(PROACTIVE_HTTP_PORT));
logger.debug("Setting system property 'proactive.rmi.port' to: " + PROACTIVE_RMI_PORT);
CentralPAPropertyRepository.PA_RMI_PORT.setValue(Integer.parseInt(PROACTIVE_RMI_PORT));
logger.debug("Setting system property 'proactive.runtime.ping' to: false");
CentralPAPropertyRepository.PA_RUNTIME_PING.setValue(false);
CentralPAPropertyRepository.JAVA_SECURITY_POLICY
.setValue("proactive.java.policy");
CentralPAPropertyRepository.GCM_PROVIDER
.setValue(org.objectweb.proactive.core.component.Fractive.class.getName());
/*
* Set up Components
*/
Factory factory = FactoryFactory.getFactory();
HashMap<String, Object> context = new HashMap<String, Object>();
root = (Component) factory.newComponent(componentName, context);
GCM.getGCMLifeCycleController(root).startFc();
// Register component.
Fractive.registerByName(root, instanceName);
}
public static synchronized void stop() {
try {
// Stop and terminate GCM Components
logger.info("Terminate application");
logger.debug("Send stopFc to all components");
if (root != null) {
// Stop is recursive...
try {
GCM.getGCMLifeCycleController(root).stopFc();
} catch (IllegalLifeCycleException e) {
logger.error(e.getMessage());
} catch (BodyTerminatedRequestException e) {
logger.error(e.getMessage());
}
// Terminate is not recursive:
for (Component subcomponent : GCM.getContentController(root)
.getFcSubComponents()) {
try {
GCM.getGCMLifeCycleController(subcomponent)
.terminateGCMComponent();
} catch (IllegalLifeCycleException e) {
logger.error(e.getMessage());
} catch (BodyTerminatedRequestException e) {
logger.error(e.getMessage());
}
}
try {
GCM.getGCMLifeCycleController(root).terminateGCMComponent();
} catch (IllegalLifeCycleException e) {
logger.error(e.getMessage());
}
}
} catch (NoSuchInterfaceException e) {
logger.error(e.getMessage());
} finally {
running = false;
SingleDistributedEtalisInstanceRunner.class.notifyAll();
}
}
}