/* * @@COPYRIGHT@@ */ package com.cosylab.acs.maci.plug; import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; import org.omg.CORBA.ORB; import org.omg.PortableServer.POA; import org.omg.PortableServer.POAHelper; import org.omg.PortableServer.POAManager; /** * Class that provides default ACS CORBA service implementation. * * @author Matej Sekoranja (matej.sekoranja@cosylab.com) * @version @@VERSION@@ */ public class DefaultCORBAService implements Runnable { /** * Object Request Broker (ORB) object. */ private ORB orb = null; /** * Additional sync check (what if component is destroyed before thread is started). */ private volatile boolean destroyState = false; /** * Root Portable Object Adapter (POA) object. */ private POA rootPOA = null; /** * Logger. */ private Logger logger = null; /** * Constructor for DefaultCORBAService. */ public DefaultCORBAService(Logger logger) { this.logger = logger; internalInitialize(); } /** * Initializes the CORBA. */ private void internalInitialize() { // ORB stanza Properties orbprops = System.getProperties(); Properties serviceConfig = new Properties(); serviceConfig.put("org.omg.CORBA.ORBClass", "org.jacorb.orb.ORB"); serviceConfig.put("org.omg.CORBA.ORBSingletonClass", "org.jacorb.orb.ORBSingleton"); serviceConfig.put("jacorb.implname", "ORB"); serviceConfig.put("jacorb.orb.objectKeyMap.Manager", "ORB/ManagerPOA/Manager"); serviceConfig.put("jacorb.verbosity", "1"); serviceConfig.put("org.omg.PortableInterceptor.ORBInitializerClass.bidir_init", "org.jacorb.orb.giop.BiDirConnectionInitializer"); // add additional properties if (serviceConfig != null) orbprops.putAll(serviceConfig); orb = ORB.init(new String[0], orbprops); // POA stanza, use rootPOA try { // resolve RootPOA rootPOA = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); // activate POA POAManager manager = rootPOA.the_POAManager(); manager.activate(); } catch (Throwable th) { logger.log(Level.SEVERE, "Failed to initialize CORBA.", th); } // spawn ORB thread (to process incoming requests) new Thread(this, "DefaultCORBAService").start(); } /** * Overloads the destroy to first perform a ORB shutdown. */ public void destroy() { destroyState = true; // destory ORB if (orb != null) { try { // possible solution with orb.work_pending // but JacORB has no implementation of it // do not wait for completion orb.shutdown(false); // and finally destroy orb.destroy(); orb = null; } catch (Throwable th) { // @TODO revisit org.omg.CORBA.COMM_FAILURE in ORB.shutdown() after JacORB upgrade //logger.log(Level.FINER, "Harmless exception caught while destroying ORB.", th); } } } /** * Returns Object Request Broker (ORB) object. * * @return Object Request Broker (ORB) object */ public ORB getORB() { return orb; } /** * Returns root Portable Object Adapter (POA) object. * * @return root Portable Object Adapter (POA) object */ public POA getRootPOA() { return rootPOA; } /** * Main thread to handle CORBA requests. * * @see java.lang.Runnable#run() */ public void run() { ORB localORBRef = orb; if (!destroyState && localORBRef != null) localORBRef.run(); } }