package org.jboss.iiop;
import java.io.InputStream;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.Name;
import javax.naming.Reference;
import javax.naming.spi.ObjectFactory;
import javax.ejb.spi.HandleDelegate;
import org.jboss.system.ServiceMBeanSupport;
import org.jboss.system.server.ServerConfigUtil;
import org.omg.CORBA.ORB;
import org.omg.CORBA.Policy;
import org.omg.PortableServer.IdAssignmentPolicy;
import org.omg.PortableServer.IdAssignmentPolicyValue;
import org.omg.PortableServer.LifespanPolicy;
import org.omg.PortableServer.LifespanPolicyValue;
import org.omg.PortableServer.POA;
import org.omg.PortableServer.POAHelper;
import org.w3c.dom.Element;
import org.jboss.iiop.naming.ORBInitialContextFactory;
import org.jboss.metadata.MetaData;
import org.jboss.security.SecurityDomain;
import org.jboss.system.Registry;
import org.jboss.proxy.ejb.handle.HandleDelegateImpl;
public class CorbaORBService
extends ServiceMBeanSupport
implements CorbaORBServiceMBean, ObjectFactory
{
public static String ORB_NAME = "JBossCorbaORB";
public static String POA_NAME = "JBossCorbaPOA";
public static String IR_POA_NAME = "JBossCorbaInterfaceRepositoryPOA";
public static String SSL_DOMAIN = "JBossCorbaSSLDomain";
private String orbClass = null;
private String orbSingletonClass = null;
private String orbSingletonDelegate = null;
private String orbPropertiesFileName = "orb-properties-file-not-defined";
private Element portableInterceptorInitializers = null;
private int port = 0;
private int sslPort = 0;
private String sslDomain = null;
private boolean sunJDK14IsLocalBugFix = true;
private static ORB orb;
private static POA poa;
private static POA irPoa;
private static HandleDelegate hd;
private static int oaSslPort;
private static boolean sslComponentsEnabledFlag = false;
private static boolean sendSasAcceptWithExceptionEnabledFlag = true;
public static int getTheActualSSLPort()
{
return oaSslPort;
}
public static boolean getSSLComponentsEnabledFlag()
{
return sslComponentsEnabledFlag;
}
public static boolean getSendSASAcceptWithExceptionEnabledFlag()
{
return sendSasAcceptWithExceptionEnabledFlag;
}
protected void startService()
throws Exception
{
Properties props = new Properties();
ClassLoader cl = Thread.currentThread().getContextClassLoader();
InputStream is = cl.getResourceAsStream(orbPropertiesFileName);
props.load(is);
String oaiAddr = props.getProperty("OAIAddr");
if (oaiAddr == null)
oaiAddr = ServerConfigUtil.getSpecificBindAddress();
if (oaiAddr != null)
props.setProperty("OAIAddr", oaiAddr);
log.debug("Using OAIAddr=" + oaiAddr);
Properties systemProps = System.getProperties();
if (orbClass != null) {
props.put("org.omg.CORBA.ORBClass", orbClass);
systemProps.put("org.omg.CORBA.ORBClass", orbClass);
}
if (orbSingletonClass != null) {
props.put("org.omg.CORBA.ORBSingletonClass", orbSingletonClass);
systemProps.put("org.omg.CORBA.ORBSingletonClass", orbSingletonClass);
}
if (orbSingletonDelegate != null)
systemProps.put(org.jboss.system.ORBSingleton.DELEGATE_CLASS_KEY,
orbSingletonDelegate);
String str = props.getProperty("jacorb.config.log.verbosity");
if (str != null)
systemProps.put("jacorb.config.log.verbosity", str);
if (sunJDK14IsLocalBugFix)
{
try
{
Class SunJDK14IsLocalBugFix = cl.loadClass("org.jboss.iiop.SunJDK14IsLocalBugFix");
log.debug("Was able to load SunJDK14IsLocalBugFix, class="+SunJDK14IsLocalBugFix);
systemProps.put("javax.rmi.CORBA.UtilClass", "org.jboss.iiop.SunJDK14IsLocalBugFix");
}
catch(Throwable t)
{
log.debug("Ignoring sunJDK14IsLocalBugFix=true due to inability to load org.jboss.iiop.SunJDK14IsLocalBugFix", t);
}
}
System.setProperties(systemProps);
Iterator initializerElements =
MetaData.getChildrenByTagName(portableInterceptorInitializers,
"initializer");
if (initializerElements != null)
{
while (initializerElements.hasNext())
{
Element initializerElement = (Element) initializerElements.next();
String portableInterceptorInitializerClassName =
MetaData.getElementContent(initializerElement);
log.debug("Adding portable interceptor initializer: " +
portableInterceptorInitializerClassName);
if (portableInterceptorInitializerClassName != null
&& !portableInterceptorInitializerClassName.equals(""))
props.put("org.omg.PortableInterceptor.ORBInitializerClass."
+ portableInterceptorInitializerClassName, "");
}
}
if (port != 0)
props.put("OAPort", Integer.toString(this.port));
if (sslPort != 0)
props.put("OASSLPort", Integer.toString(this.sslPort));
String oaSslPortString = props.getProperty("OASSLPort");
if (oaSslPortString != null)
oaSslPort = Integer.parseInt(oaSslPortString);
if (sslDomain != null)
{
InitialContext ctx = new InitialContext();
log.debug("sslDomain: " + sslDomain);
try
{
SecurityDomain domain = (SecurityDomain) ctx.lookup(sslDomain);
Registry.bind(SSL_DOMAIN, domain);
}
catch (Exception e)
{
log.warn("Security domain " + sslDomain + " not found");
if (log.isDebugEnabled())
log.debug("Exception looking up " + sslDomain + ": ", e);
}
}
orb = ORB.init(new String[0], props);
bind(ORB_NAME, "org.omg.CORBA.ORB");
CorbaORB.setInstance(orb);
ORBInitialContextFactory.setORB(orb);
poa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
poa.the_POAManager().activate();
bind(POA_NAME, "org.omg.PortableServer.POA");
new Thread(
new Runnable() {
public void run() {
orb.run();
}
}, "ORB thread"
).start();
try {
LifespanPolicy lifespanPolicy =
poa.create_lifespan_policy(LifespanPolicyValue.PERSISTENT);
IdAssignmentPolicy idAssignmentPolicy =
poa.create_id_assignment_policy(IdAssignmentPolicyValue.USER_ID);
irPoa = poa.create_POA("IR", null,
new Policy[]{lifespanPolicy,
idAssignmentPolicy});
bind(IR_POA_NAME, "org.omg.PortableServer.POA");
irPoa.the_POAManager().activate();
} catch (Exception ex) {
getLog().error("Error in IR POA initialization", ex);
}
hd = new HandleDelegateImpl();
}
protected void stopService() throws Exception
{
try {
unbind(ORB_NAME);
unbind(POA_NAME);
unbind(IR_POA_NAME);
orb.shutdown(false);
Registry.unbind(SSL_DOMAIN);
} catch (Exception e) {
log.error("Exception while stopping ORB service", e);
}
}
public ORB getORB()
{
return orb;
}
public HandleDelegate getHandleDelegate()
{
return hd;
}
public String getORBClass()
{
return orbClass;
}
public void setORBClass(String orbClass)
{
this.orbClass = orbClass;
}
public String getORBSingletonClass()
{
return orbSingletonClass;
}
public void setORBSingletonClass(String orbSingletonClass)
{
this.orbSingletonClass = orbSingletonClass;
}
public String getORBSingletonDelegate()
{
return orbSingletonDelegate;
}
public void setORBSingletonDelegate(String orbSingletonDelegate)
{
this.orbSingletonDelegate = orbSingletonDelegate;
}
public void setORBPropertiesFileName(String orbPropertiesFileName)
{
this.orbPropertiesFileName = orbPropertiesFileName;
}
public String getORBPropertiesFileName()
{
return orbPropertiesFileName;
}
public Element getPortableInterceptorInitializers()
{
return portableInterceptorInitializers;
}
public void setPortableInterceptorInitializers(
Element portableInterceptorInitializers)
{
this.portableInterceptorInitializers = portableInterceptorInitializers;
}
public void setPort(int port)
{
this.port = port;
}
public int getPort()
{
return this.port;
}
public void setSSLPort(int sslPort)
{
this.sslPort = sslPort;
}
public int getSSLPort()
{
return this.sslPort;
}
public void setSecurityDomain(String sslDomain)
{
this.sslDomain = sslDomain;
}
public String getSecurityDomain()
{
return this.sslDomain;
}
public boolean getSSLComponentsEnabled()
{
return CorbaORBService.sslComponentsEnabledFlag;
}
public void setSSLComponentsEnabled(boolean sslComponentsEnabled)
{
CorbaORBService.sslComponentsEnabledFlag = sslComponentsEnabled;
}
public boolean getSendSASAcceptWithExceptionEnabled()
{
return CorbaORBService.sendSasAcceptWithExceptionEnabledFlag;
}
public void setSendSASAcceptWithExceptionEnabled(boolean value)
{
CorbaORBService.sendSasAcceptWithExceptionEnabledFlag = value;
}
public boolean getSunJDK14IsLocalBugFix()
{
return sunJDK14IsLocalBugFix;
}
public void setSunJDK14IsLocalBugFix(boolean sunJDK14IsLocalBugFix)
{
this.sunJDK14IsLocalBugFix = sunJDK14IsLocalBugFix;
}
public Object getObjectInstance(Object obj, Name name,
Context nameCtx, Hashtable environment)
throws Exception
{
String s = name.toString();
if (getLog().isTraceEnabled())
getLog().trace("getObjectInstance: obj.getClass().getName=\"" +
obj.getClass().getName() +
"\n name=" + s);
if (ORB_NAME.equals(s))
return orb;
if (POA_NAME.equals(s))
return poa;
if (IR_POA_NAME.equals(s))
return irPoa;
return null;
}
private void bind(String name, String className)
throws Exception
{
Reference ref = new Reference(className, getClass().getName(), null);
new InitialContext().bind("java:/"+name, ref);
}
private void unbind(String name)
throws Exception
{
new InitialContext().unbind("java:/"+name);
}
}