001    /**
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *     http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.geronimo.corba;
018    
019    import org.omg.CORBA.Any;
020    import org.omg.CORBA.ORB;
021    import org.omg.CORBA.Policy;
022    import org.omg.CosNaming.NameComponent;
023    import org.omg.CosNaming.NamingContext;
024    import org.omg.CosNaming.NamingContextExt;
025    import org.omg.CosNaming.NamingContextExtHelper;
026    import org.omg.CosNaming.NamingContextHelper;
027    import org.omg.CosNaming.NamingContextPackage.NotEmpty;
028    import org.omg.CosNaming.NamingContextPackage.NotFound;
029    import org.omg.PortableServer.IdAssignmentPolicyValue;
030    import org.omg.PortableServer.ImplicitActivationPolicyValue;
031    import org.omg.PortableServer.POA;
032    import org.omg.PortableServer.RequestProcessingPolicyValue;
033    import org.omg.PortableServer.ServantRetentionPolicyValue;
034    import org.apache.geronimo.corba.transaction.ServerTransactionPolicyFactory;
035    import org.apache.openejb.InterfaceType;
036    import org.apache.geronimo.openejb.EjbDeployment;
037    
038    /**
039     * @version $Revision: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $
040     */
041    public abstract class Adapter implements RefGenerator {
042        protected final EjbDeployment deployment;
043        protected final POA homePOA;
044        protected final ORB orb;
045        protected final NamingContextExt initialContext;
046        protected final byte[] home_id;
047        protected final org.omg.CORBA.Object homeReference;
048        protected final TSSLink tssLink; 
049    
050        protected Adapter(TSSLink tssLink, ORB orb, POA parentPOA, Policy securityPolicy) throws CORBAException {
051            this.tssLink = tssLink; 
052            this.deployment = tssLink.getDeployment();
053            this.home_id = tssLink.getContainerId().getBytes();
054            this.orb = orb;
055    
056            Any any = orb.create_any();
057            any.insert_Value(tssLink.getHomeTxPolicyConfig());
058    
059            try {
060                Policy[] policies = new Policy[]{
061                    securityPolicy,
062                    orb.create_policy(ServerTransactionPolicyFactory.POLICY_TYPE, any),
063    //                parentPOA.create_lifespan_policy(LifespanPolicyValue.TRANSIENT),
064                    parentPOA.create_request_processing_policy(RequestProcessingPolicyValue.USE_ACTIVE_OBJECT_MAP_ONLY),
065                    parentPOA.create_servant_retention_policy(ServantRetentionPolicyValue.RETAIN),
066                    parentPOA.create_id_assignment_policy(IdAssignmentPolicyValue.USER_ID),
067                    parentPOA.create_implicit_activation_policy(ImplicitActivationPolicyValue.NO_IMPLICIT_ACTIVATION),
068                };
069                // make sure we create this with the appropriate ORB-specific policies. 
070                policies = tssLink.addPolicyOverrides(policies);
071                homePOA = parentPOA.create_POA(tssLink.getContainerId(), parentPOA.the_POAManager(), policies);
072    
073                homePOA.the_POAManager().activate();
074    
075                StandardServant servant = new StandardServant(orb, InterfaceType.EJB_HOME, deployment);
076    
077                homePOA.activate_object_with_id(home_id, servant);
078                homeReference = homePOA.servant_to_reference(servant);
079    
080                org.omg.CORBA.Object obj = orb.resolve_initial_references("NameService");
081                initialContext = NamingContextExtHelper.narrow(obj);
082                String[] names = tssLink.getJndiNames();
083                for (int i = 0; i < names.length; i++) {
084                    NameComponent[] nameComponent = initialContext.to_name(names[i]);
085                    NamingContext currentContext = initialContext;
086                    NameComponent[] nc = new NameComponent[1];
087                    int lastComponent = nameComponent.length - 1;
088                    for (int j = 0; j < lastComponent; ++j) {
089                        nc[0] = nameComponent[j];
090                        try {
091                            currentContext = NamingContextHelper.narrow(currentContext.resolve(nc));
092                        } catch (NotFound nf) {
093                            currentContext = currentContext.bind_new_context(nc);
094                        }
095                    }
096                    nc[0] = nameComponent[lastComponent];
097                    currentContext.rebind(nc, homeReference);
098                }
099            } catch (Exception e) {
100                throw new CORBAException("Unable to activate EJB as CORBA object.", e);
101            }
102    
103        }
104    
105        public EjbDeployment getDeployment() {
106            return deployment;
107        }
108    
109        public NamingContextExt getInitialContext() {
110            return initialContext;
111        }
112    
113        public org.omg.CORBA.Object getHomeReference() {
114            return homeReference;
115        }
116    
117        public ORB getOrb() {
118            return orb;
119        }
120    
121        public void stop() throws CORBAException {
122            try {
123                String[] names = tssLink.getJndiNames();
124                for (int i = 0; i < names.length; i++) {
125                    NameComponent[] nameComponent = initialContext.to_name(names[i]);
126                    initialContext.unbind(nameComponent);
127    
128                    for (int j = nameComponent.length - 1; 0 < j; --j) {
129                        NameComponent[] nc = new NameComponent[j];
130                        System.arraycopy(nameComponent, 0, nc, 0, j);
131                        NamingContext currentContext = NamingContextHelper.narrow(initialContext.resolve(nc));
132                        try {
133                            currentContext.destroy();
134                        } catch (NotEmpty ne) {
135                            break;
136                        }
137                    }
138                }
139    
140                homePOA.deactivate_object(home_id);
141                homePOA.destroy(true, true);
142            } catch (Exception e) {
143                throw new CORBAException("Error deactivating EJB as CORBA object", e);
144            }
145        }
146    
147        public org.omg.CORBA.Object genHomeReference() throws CORBAException {
148            return this.getHomeReference();
149        }
150    }