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 }