All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.geronimo.yoko.ORBConfigAdapter Maven / Gradle / Ivy

There is a newer version: 3.0.1
Show newest version
/**
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
  * this work for additional information regarding copyright ownership.
  * The ASF licenses this file to You under the Apache License, Version 2.0
  * (the "License"); you may not use this file except in compliance with
  * the License.  You may obtain a copy of the License at
  *
  *     http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
package org.apache.geronimo.yoko;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Properties;

import javax.rmi.CORBA.UtilDelegate;
import org.apache.geronimo.corba.CORBABean;
import org.apache.geronimo.corba.CSSBean;
import org.apache.geronimo.corba.NameService;
import org.apache.geronimo.corba.ORBConfiguration;
import org.apache.geronimo.corba.security.config.ConfigAdapter;
import org.apache.geronimo.corba.security.config.ConfigException;
import org.apache.geronimo.corba.security.config.tss.TSSConfig;
import org.apache.geronimo.corba.security.config.tss.TSSSSLTransportConfig;
import org.apache.geronimo.corba.security.config.tss.TSSTransportMechConfig;
import org.apache.geronimo.corba.util.UtilDelegateImpl;
import org.apache.geronimo.gbean.annotation.GBean;
import org.apache.geronimo.gbean.annotation.ParamSpecial;
import org.apache.geronimo.gbean.annotation.SpecialAttributeType;
import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
import org.apache.yoko.orb.CosNaming.tnaming.TransientNameService;
import org.apache.yoko.orb.CosNaming.tnaming.TransientServiceException;
import org.apache.yoko.orb.OB.ZERO_PORT_POLICY_ID;
import org.omg.CORBA.Any;
import org.omg.CORBA.ORB;
import org.omg.CORBA.Policy;
import org.osgi.framework.Bundle;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


/**
 * A ConfigAdapter instance for the Apache Yoko
 * CORBA support.
 * @version $Revision: 497125 $ $Date: 2007-01-17 10:51:30 -0800 (Wed, 17 Jan 2007) $
 */
@GBean(j2eeType = NameFactory.ORB_CONFIG)
public class ORBConfigAdapter implements ConfigAdapter {

    private final Logger log = LoggerFactory.getLogger(ORBConfigAdapter.class);

    /**
     * Start the config adapter GBean.  This is basically
     * an opportunity to set any system properties
     * required to make the ORB hook ups.  In particular,
     * this makes the ORB hookups for the RMI over IIOP
     * support.
     *
     * @exception Exception due to class loading problems or narrow not working
     */
    public ORBConfigAdapter(@ParamSpecial(type = SpecialAttributeType.bundle) Bundle bundle) throws Exception {
        // define the default ORB for ORB.init();
//        System.setProperty("org.omg.CORBA.ORBClass", "org.apache.yoko.orb.CORBA.ORB");
//        System.setProperty("org.omg.CORBA.ORBSingletonClass", "org.apache.yoko.orb.CORBA.ORBSingleton");

        // redirect the RMI implementation to use the Yoko ORB.
//        System.setProperty("javax.rmi.CORBA.PortableRemoteObjectClass", "org.apache.yoko.rmi.impl.PortableRemoteObjectImpl");
//        System.setProperty("javax.rmi.CORBA.StubClass", "org.apache.yoko.rmi.impl.StubImpl");
        // this hooks the util class and allows us to override certain functions
//        System.setProperty("javax.rmi.CORBA.UtilClass", "org.apache.geronimo.corba.util.UtilDelegateImpl");
        // this tells the openejb UtilDelegateImpl which implementation to delegate non-overridden
        // operations to.
//        System.setProperty("org.apache.geronimo.corba.UtilDelegateClass", "org.apache.yoko.rmi.impl.UtilImpl");
        // this allows us to hook RMI stub invocation/serialization events.
//        UtilDelegateImpl.setDelegateClass(bundle.loadClass("org.apache.yoko.rmi.impl.UtilImpl").asSubclass(UtilDelegate.class));
//        System.setProperty("org.apache.yoko.rmi.RMIStubInitializerClass", "org.apache.geronimo.yoko.RMIStubHandlerFactory");

        // ok, now we have a potential classloading problem because of where our util delegates are located.
        // by forcing these classes to load now using our class loader, we can ensure things are properly initialized
//        Class clazz = bundle.loadClass("javax.rmi.PortableRemoteObject");
//        Method m = clazz.getMethod("narrow", Object.class, Class.class);
//        m.invoke(null, new Object(), Object.class);


        log.debug("Started  Yoko ORBConfigAdapter");
    }

    /**
     * Create an ORB for a CORBABean server context.
     *
     * @param server The CORBABean that owns this ORB's configuration.
     *
     * @return An ORB instance configured for the CORBABean.
     * @exception ConfigException
     */
    public ORB createServerORB(CORBABean server)  throws ConfigException {
        ORB orb = createORB(server.getURI(), server, translateToArgs(server), translateToProps(server));

        // check the tss config for a transport mech definition.  If we have one, then 
        // the port information will be passed in that config, and the port in the IIOP profile 
        // needs to be zero. 
        TSSConfig config = server.getTssConfig();
        TSSTransportMechConfig transportMech = config.getTransport_mech();
        if (transportMech != null) {
            if (transportMech instanceof TSSSSLTransportConfig) {
                Any any = orb.create_any();
                any.insert_boolean(true);

                try {
                    Policy portPolicy = orb.create_policy(ZERO_PORT_POLICY_ID.value, any);
                    Policy[] overrides = new Policy [] { portPolicy };
                    server.setPolicyOverrides(overrides);
                } catch (org.omg.CORBA.PolicyError e) {
                    // shouldn't happen, but we'll let things continue with no policy set. 
                }

            }
        }

        return orb;
    }

    /**
     * Create an ORB for a CSSBean client context.
     *
     * @param client The configured CSSBean used for access.
     *
     * @return An ORB instance configured for this client access.
     * @exception ConfigException
     */
    public ORB createClientORB(CSSBean client)  throws ConfigException {
        return createORB(client.getURI(), client, translateToArgs(client), translateToProps(client));
    }

    /**
     * Create an ORB for a CSSBean name service client context.
     *
     * @param client The configured CSSBean used for access.
     *
     * @return An ORB instance configured for this client access.
     * @exception ConfigException
     */
    public ORB createNameServiceClientORB(CSSBean client)  throws ConfigException {
        return createORB(client.getURI(), client, translateToArgs(client), translateToNameServiceProps(client));
    }

    /**
     * Create a transient name service instance using the
     * specified host name and port.
     *
     * @param host   The String host name.
     * @param port   The port number of the listener.
     *
     * @return An opaque object that represents the name service.
     * @exception ConfigException
     */
    public Object createNameService(String host, int port) throws ConfigException {
        try {
            // create a name service using the supplied host and publish under the name "NameService"
            TransientNameService service = new TransientNameService(host, port, "NameService") {
                public void run() throws TransientServiceException {
                    // Create an ORB object
                    java.util.Properties props = new Properties();
                    props.putAll(System.getProperties());

                    props.put("org.omg.CORBA.ORBServerId", "1000000" ) ;
                    props.put("org.omg.CORBA.ORBClass", "org.apache.yoko.orb.CORBA.ORB");
                    props.put("org.omg.CORBA.ORBSingletonClass", "org.apache.yoko.orb.CORBA.ORBSingleton");
                    props.put("yoko.orb.oa.endpoint", "iiop --bind " + host  + " --host " + host + " --port " + port );

                    createdOrb = ORB.init((String[])null, props) ;

                    // now initialize the service
                    initialize(createdOrb);
                }
            };
            service.run();
            log.debug("Creating ORB endpoint with host=" + host + ", port=" + port);            
            // the service instance is returned as an opaque object.
            return service;
        } catch (TransientServiceException e) {
            throw new ConfigException("Error starting transient name service on port " + port, e);
        }
    }

    /**
     * Destroy a name service instance created by a
     * prior call to createNameService().
     *
     * @param ns     The opaque name service object returned from a
     *               prior call to createNameService().
     */
    public void destroyNameService(Object ns) {
        // The name service instance handles its own shutdown.
        ((TransientNameService)ns).destroy();
    }

    /**
     * Create an ORB instance using the configured argument
     * and property bundles.
     *
     * @param name   The String name of the configuration GBean used to
     *               create this ORB.
     * @param config The GBean configuration object required by the
     *               SocketFactory instance.
     * @param args   The String arguments passed to ORB.init().
     * @param props  The property bundle passed to ORB.init().
     *
     * @return An ORB constructed from the provided args and properties.
     */
    private ORB createORB(String name, ORBConfiguration config, String[] args, Properties props) {
        return ORB.init(args, props);
    }

    /**
     * Translate a CORBABean configuration into an
     * array of arguments used to configure the ORB
     * instance.
     *
     * @param server The CORBABean we're creating an ORB instance for.
     *
     * @return A String{} array containing the initialization
     *         arguments.
     * @exception ConfigException if configuration cannot be interpreted
     */
    private String[] translateToArgs(CORBABean server) throws ConfigException {
        ArrayList list = new ArrayList();
//TODO GERONIMO-2687, I don't think it makes sense to associate a default principal with  a tss config, but if we need it
        //here's the disfunctional code.
//        TSSConfig config = server.getTssConfig();

        // if the TSSConfig includes principal information, we need to add argument values
        // for this information.
//        DefaultPrincipal principal = config.getDefaultPrincipal();
//        if (principal != null) {
//            if (principal instanceof DefaultRealmPrincipal) {
//                DefaultRealmPrincipal realmPrincipal = (DefaultRealmPrincipal) principal;
//                list.add("default-realm-principal::" + realmPrincipal.getRealm() + ":" + realmPrincipal.getDomain() + ":"
//                         + realmPrincipal.getPrincipal().getClassName() + ":" + realmPrincipal.getPrincipal().getPrincipalName());
//            } else if (principal instanceof DefaultDomainPrincipal) {
//                DefaultDomainPrincipal domainPrincipal = (DefaultDomainPrincipal) principal;
//                list.add("default-domain-principal::" + domainPrincipal.getDomain() + ":"
//                         + domainPrincipal.getPrincipal().getClassName() + ":" + domainPrincipal.getPrincipal().getPrincipalName());
//            } else {
//                list.add("default-principal::" + principal.getPrincipal().getClassName() + ":" + principal.getPrincipal().getPrincipalName());
//            }
//        }

        // enable the connection plugin
        enableSocketFactory(server.getURI(), list);

        NameService nameService = server.getNameService();
        // if we have a name service to enable as an initial ref, add it to the init processing.
        if (nameService != null) {
            list.add("-ORBInitRef");
            list.add("NameService=" + nameService.getURI());
        }

        if (log.isDebugEnabled()) {
            for (String configArg : list) {
                log.debug(configArg);
            }
        }

        return list.toArray(new String[list.size()]);
    }

    private Properties translateToProps(CORBABean server) throws ConfigException {
        Properties result = new Properties();

        result.put("org.omg.CORBA.ORBClass", "org.apache.yoko.orb.CORBA.ORB");
        result.put("org.omg.CORBA.ORBSingletonClass", "org.apache.yoko.orb.CORBA.ORBSingleton");
        result.put("org.omg.PortableInterceptor.ORBInitializerClass.org.apache.geronimo.corba.transaction.TransactionInitializer", "");
        result.put("org.omg.PortableInterceptor.ORBInitializerClass.org.apache.geronimo.corba.security.SecurityInitializer", "");
        result.put("org.omg.PortableInterceptor.ORBInitializerClass.org.apache.geronimo.yoko.ORBInitializer", "");
        // don't specify the port if we're allowing this to default.
        if (server.getPort() > 0) {
            result.put("yoko.orb.oa.endpoint", "iiop --bind " + server.getHost() + " --host " + server.getHost() + " --port " + server.getPort());
        }
        else {
            result.put("yoko.orb.oa.endpoint", "iiop --bind " + server.getHost()+ " --host " + server.getHost());
        }
        
        // this gives us a connection we can use to retrieve the ORB configuration in the 
        // interceptors. 
        result.put("yoko.orb.id", server.getURI()); 

        // check the tss config for a transport mech definition.  If we have one, then 
        // the port information will be passed in that config, and the port in the IIOP profile 
        // needs to be zero. 
        TSSConfig config = server.getTssConfig();
        TSSTransportMechConfig transportMech = config.getTransport_mech();
        if (transportMech != null) {
            if (transportMech instanceof TSSSSLTransportConfig) {
                result.put("yoko.orb.policy.zero_port", "true");
            }
        }

        if (log.isDebugEnabled()) {
            log.debug("translateToProps(TSSConfig)");
            for (Enumeration iter = result.keys(); iter.hasMoreElements();) {
                String key = (String) iter.nextElement();
                log.debug(key + " = " + result.getProperty(key));
            }
        }
        return result;
    }

    /**
     * Translate a CSSBean configuration into the
     * argument bundle needed to instantiate the
     * ORB instance.
     *
     * @param client The CSSBean holding the configuration.
     *
     * @return A String array to be passed to ORB.init().
     * @exception ConfigException if configuration cannot be interpreted
     */
    private String[] translateToArgs(CSSBean client) throws ConfigException {
        ArrayList list = new ArrayList();

        // enable the connection plugin
        enableSocketFactory(client.getURI(), list);

        if (log.isDebugEnabled()) {
            for (String configArg : list) {
                log.debug(configArg);
            }
        }

        return list.toArray(new String[list.size()]);
    }

    /**
     * Add arguments to the ORB.init() argument list
     * required to enable the SocketFactory used for
     * SSL support.
     *
     * @param uri    The URI name of the configuration GBean (either a
     *               CSSBean or a CORBABean).
     * @param args configuration arguments to add to
     */
    private void enableSocketFactory(String uri, List args) {
        args.add("-IIOPconnectionHelper");
        args.add("org.apache.geronimo.yoko.SocketFactory");
        args.add("-IIOPconnectionHelperArgs");
        args.add(uri);
    }


    /**
     * Translate a CSSBean configuration into the
     * property bundle necessary to configure the
     * ORB instance.
     *
     * @param client The CSSBean holding the configuration.
     *
     * @return A property bundle that can be passed to ORB.init();
     * @exception ConfigException if configuration cannot be interpreted
     */
    private Properties translateToProps(CSSBean client) throws ConfigException {
        Properties result = new Properties();

        result.put("org.omg.CORBA.ORBClass", "org.apache.yoko.orb.CORBA.ORB");
        result.put("org.omg.CORBA.ORBSingletonClass", "org.apache.yoko.orb.CORBA.ORBSingleton");
        result.put("org.omg.PortableInterceptor.ORBInitializerClass.org.apache.geronimo.corba.transaction.TransactionInitializer", "");
        result.put("org.omg.PortableInterceptor.ORBInitializerClass.org.apache.geronimo.corba.security.SecurityInitializer", "");
        result.put("org.omg.PortableInterceptor.ORBInitializerClass.org.apache.geronimo.yoko.ORBInitializer", "");

        // this gives us a connection we can use to retrieve the ORB configuration in the 
        // interceptors. 
        result.put("yoko.orb.id", client.getURI()); 

        if (log.isDebugEnabled()) {
            log.debug("translateToProps(CSSConfig)");
            for (Enumeration iter = result.keys(); iter.hasMoreElements();) {
                String key = (String) iter.nextElement();
                log.debug(key + " = " + result.getProperty(key));
            }
        }
        return result;
    }


    /**
     * Translate a CSSBean configuration into the
     * property bundle necessary to configure the
     * ORB instance.
     *
     * @param client The CSSBean holding the configuration.
     *
     * @return A property bundle that can be passed to ORB.init();
     * @exception ConfigException if configuration cannot be interpreted
     */
    private Properties translateToNameServiceProps(CSSBean client) throws ConfigException {
        Properties result = new Properties();

        result.put("org.omg.CORBA.ORBClass", "org.apache.yoko.orb.CORBA.ORB");
        result.put("org.omg.CORBA.ORBSingletonClass", "org.apache.yoko.orb.CORBA.ORBSingleton");

        if (log.isDebugEnabled()) {
            log.debug("translateToNameServiceProps(CSSConfig)");
            for (Enumeration iter = result.keys(); iter.hasMoreElements();) {
                String key = (String) iter.nextElement();
                log.debug(key + " = " + result.getProperty(key));
            }
        }
        return result;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy