001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied. See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 */
019
020
021 package org.apache.geronimo.corba;
022
023 import java.io.Serializable;
024 import java.util.Map;
025 import java.util.HashMap;
026 import java.util.Iterator;
027 import java.lang.reflect.Method;
028
029 import org.apache.geronimo.corba.util.Util;
030 import org.apache.geronimo.corba.transaction.ServerTransactionPolicyConfig;
031 import org.apache.geronimo.corba.transaction.OperationTxPolicy;
032 import org.apache.geronimo.corba.transaction.MappedServerTransactionPolicyConfig;
033 import org.apache.geronimo.corba.transaction.nodistributedtransactions.NoDTxServerTransactionPolicies;
034 import org.apache.geronimo.gbean.GBeanLifecycle;
035 import org.apache.geronimo.openejb.EjbDeployment;
036
037 import org.omg.CORBA.Policy;
038
039 /**
040 * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $
041 */
042 public class TSSLink implements GBeanLifecycle {
043 private final TSSBean tssBean;
044 private final EjbDeployment ejb;
045 private final String[] jndiNames;
046
047 public TSSLink() {
048 tssBean = null;
049 ejb = null;
050 jndiNames = null;
051 }
052
053 public TSSLink(String[] jndiNames, TSSBean tssBean, EjbDeployment ejb) {
054 if (tssBean == null) {
055 throw new NullPointerException("No TSSBean supplied");
056 }
057 if (ejb == null) {
058 throw new NullPointerException("No ejb supplied");
059 }
060 this.jndiNames = jndiNames;
061 this.tssBean = tssBean;
062 this.ejb = ejb;
063 }
064
065 public void doStart() throws Exception {
066 if (tssBean != null) {
067 tssBean.registerContainer(this);
068 }
069 }
070
071 public void doStop() throws Exception {
072 destroy();
073 }
074
075 public void doFail() {
076 destroy();
077 }
078
079 protected void destroy() {
080 if (tssBean != null) {
081 tssBean.unregisterContainer(this);
082 }
083 }
084
085 public EjbDeployment getDeployment() {
086 return ejb;
087 }
088
089 public String getContainerId() {
090 return ejb.getDeploymentId();
091 }
092
093 public String[] getJndiNames() {
094 return jndiNames;
095 }
096
097 /**
098 * CORBA home transaction import policy configuration
099 * @return home transaction import policy
100 */
101 public Serializable getHomeTxPolicyConfig() {
102 if (ejb.getHomeInterface() == null) {
103 return null;
104 }
105 Serializable policy = buildTransactionImportPolicy(ejb.getHomeInterface());
106 return policy;
107 }
108
109 /**
110 * CORBA remote transaction import policy configuration
111 * @return remote transaction import policy
112 */
113 public Serializable getRemoteTxPolicyConfig() {
114 if (ejb.getRemoteInterface() == null) {
115 return null;
116 }
117 Serializable policy = buildTransactionImportPolicy(ejb.getRemoteInterface());
118 return policy;
119 }
120
121 private Serializable buildTransactionImportPolicy(Class intf) {
122
123 Map policies = new HashMap();
124
125 Map methodToOperation = Util.mapMethodToOperation(intf);
126 for (Iterator iterator = methodToOperation.entrySet().iterator(); iterator.hasNext();) {
127 Map.Entry entry = (Map.Entry) iterator.next();
128 Method method = (Method) entry.getKey();
129 String operation = (String) entry.getValue();
130
131 if (!ejb.isBeanManagedTransaction()) {
132 byte transactionAttribute = ejb.getTransactionAttribute(method);
133 OperationTxPolicy operationTxPolicy = NoDTxServerTransactionPolicies.getContainerTransactionPolicy(transactionAttribute);
134 policies.put(operation, operationTxPolicy);
135 } else {
136 OperationTxPolicy operationTxPolicy = NoDTxServerTransactionPolicies.getBeanTransactionPolicy();
137 policies.put(operation, operationTxPolicy);
138 }
139 }
140 ServerTransactionPolicyConfig serverTransactionPolicyConfig = new MappedServerTransactionPolicyConfig(policies);
141
142 return serverTransactionPolicyConfig;
143 }
144
145 /**
146 * Add the policy overrides (if any) to the list
147 * of policies used to create a POA instance.
148 *
149 * @param policies The base set of policies.
150 *
151 * @return A new Policy array with the overrides added. Returns
152 * the same array if no overrides are required.
153 */
154 public Policy[] addPolicyOverrides(Policy[] policies) {
155 return tssBean.addPolicyOverrides(policies);
156 }
157 }