package org.jboss.narayana.blacktie.jatmibroker.core.transport; import java.util.ArrayList; import java.util.List; import java.util.Properties; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; import org.jboss.narayana.blacktie.jatmibroker.core.conf.ConfigurationException; import org.omg.CORBA.ORB; import org.omg.CORBA.ORBPackage.InvalidName; import org.omg.CosNaming.NameComponent; import org.omg.CosNaming.NamingContext; import org.omg.CosNaming.NamingContextExt; import org.omg.CosNaming.NamingContextExtHelper; import org.omg.CosNaming.NamingContextExtOperations; import org.omg.CosNaming.NamingContextHelper; import org.omg.CosNaming.NamingContextOperations; import org.omg.CosNaming.NamingContextPackage.AlreadyBound; import org.omg.CosNaming.NamingContextPackage.CannotProceed; import org.omg.CosNaming.NamingContextPackage.NotFound; import org.omg.PortableServer.POA; import org.omg.PortableServer.POAHelper; import org.omg.PortableServer.POAManagerPackage.AdapterInactive; public class OrbManagement implements Runnable { private static final Logger log = LogManager.getLogger(OrbManagement.class); private static final String CorbaOrbClassProp = "org.omg.CORBA.ORBClass"; private static final String CorbaOrbClassValue = "com.sun.corba.se.impl.orb.ORBImpl"; private static final String CorbaSingletonClassProp = "org.omg.CORBA.ORBSingletonClass"; private static final String CorbaSingletonClassValue = "com.sun.corba.se.impl.orb.ORBSingleton"; private static OrbManagement instance; private ORB orb; private NamingContextExt nce; private NamingContext nc; private POA root_poa; private Thread callbackThread; public static synchronized OrbManagement getInstance(Properties properties) throws InvalidName, AdapterInactive, NotFound, CannotProceed, org.omg.CosNaming.NamingContextPackage.InvalidName, ConfigurationException { if (instance == null) { instance = new OrbManagement(properties); } return instance; } private OrbManagement(Properties properties) throws InvalidName, AdapterInactive, NotFound, CannotProceed, org.omg.CosNaming.NamingContextPackage.InvalidName, ConfigurationException { String namingContextExt = properties.getProperty("blacktie.domain.name"); int numberOfOrbArgs = Integer.parseInt(properties.getProperty("blacktie.orb.args", "0")); List<String> orbArgs = new ArrayList<String>(numberOfOrbArgs); for (int i = 1; i <= numberOfOrbArgs; i++) { orbArgs.add(properties.getProperty("blacktie.orb.arg." + i)); } String[] args = orbArgs.toArray(new String[orbArgs.size()]); StringBuilder sb = new StringBuilder(); for (String s : args) sb.append(s).append(", "); log.trace("ServerProxy's connectToORB args: " + sb.toString() + " namingContext: " + namingContextExt); java.util.Properties p = new java.util.Properties(); log.debug("setting properities"); p.setProperty(CorbaOrbClassProp, CorbaOrbClassValue); p.setProperty(CorbaSingletonClassProp, CorbaSingletonClassValue); String oaiAddr = properties.getProperty("blacktie.orb.interface", "0.0.0.0"); String oaiAddrPort = properties.getProperty("blacktie.orb.interface.port", "0"); p.setProperty("OAIAddr", oaiAddr); p.setProperty("OAPort", oaiAddrPort); log.debug("set properities"); log.debug(" initing orb"); orb = org.omg.CORBA.ORB.init(args, p); log.debug(" inited orb"); log.debug(" resolving NameService"); nce = NamingContextExtHelper.narrow(orb.resolve_initial_references("NameService")); log.debug("NamingContextExt is " + nce); // inititialize POA log.debug("resolving roo_poa"); root_poa = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); log.debug("roo_poa is " + root_poa); root_poa.the_POAManager().activate(); log.debug("roo_poa is activated"); log.debug(" finished & returning from ConnectToORBWithNameServiceProp"); try { log.debug(" creating NamingContext"); NameComponent[] aNameComponentArray = new NameComponent[1]; aNameComponentArray[0] = new NameComponent(namingContextExt, ""); nc = nce.bind_new_context(aNameComponentArray); log.debug(" created NamingContext"); } catch (AlreadyBound e) { log.debug("Could not create the context"); } log.debug(" resolving NamingContext"); org.omg.CORBA.Object aObject = nce.resolve_str(namingContextExt); log.debug("NamingContext Object is " + aObject); nc = NamingContextHelper.narrow(aObject); callbackThread = new Thread(this); callbackThread.setDaemon(true); callbackThread.start(); log.debug("NamingContext is " + nc); } public void run() { log.debug("Running the orb"); orb.run(); } public void finalize() { log.debug("Closing"); orb.shutdown(true); orb.destroy(); try { // Wait for thread to join callbackThread.join(); } catch (InterruptedException e) { log.error("Could not join with callback: " + e, e); } log.debug("Closed"); } public POA getRootPoa() { return root_poa; } public NamingContextExtOperations getNamingContextExt() { return nce; } public NamingContextOperations getNamingContext() { return nc; } public ORB getOrb() { return orb; } }