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.deployment; 018 019 import java.util.Collection; 020 import java.util.Map; 021 import java.util.HashMap; 022 import java.util.List; 023 import java.util.jar.JarFile; 024 import java.io.File; 025 import java.net.URI; 026 import java.net.URL; 027 028 import org.apache.geronimo.common.DeploymentException; 029 import org.apache.geronimo.corba.TSSLinkGBean; 030 import org.apache.geronimo.deployment.ModuleIDBuilder; 031 import org.apache.geronimo.deployment.xmlbeans.XmlBeansUtil; 032 import org.apache.geronimo.deployment.service.EnvironmentBuilder; 033 import org.apache.geronimo.gbean.AbstractName; 034 import org.apache.geronimo.gbean.AbstractNameQuery; 035 import org.apache.geronimo.gbean.GBeanData; 036 import org.apache.geronimo.gbean.GBeanInfo; 037 import org.apache.geronimo.gbean.GBeanInfoBuilder; 038 import org.apache.geronimo.gbean.GBeanLifecycle; 039 import org.apache.geronimo.j2ee.deployment.EARContext; 040 import org.apache.geronimo.j2ee.deployment.Module; 041 import org.apache.geronimo.j2ee.deployment.ModuleBuilderExtension; 042 import org.apache.geronimo.j2ee.deployment.WebServiceBuilder; 043 import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory; 044 import org.apache.geronimo.kernel.GBeanAlreadyExistsException; 045 import org.apache.geronimo.kernel.GBeanNotFoundException; 046 import org.apache.geronimo.kernel.Kernel; 047 import org.apache.geronimo.kernel.Naming; 048 import org.apache.geronimo.kernel.config.ConfigurationModuleType; 049 import org.apache.geronimo.kernel.config.ConfigurationStore; 050 import org.apache.geronimo.kernel.repository.Environment; 051 import org.apache.geronimo.naming.deployment.ENCConfigBuilder; 052 import org.apache.geronimo.openejb.deployment.EjbModule; 053 import org.apache.openejb.assembler.classic.EnterpriseBeanInfo; 054 055 import org.apache.openejb.jee.oejb2.GeronimoEjbJarType; 056 import org.apache.openejb.jee.oejb2.TssLinkType; 057 058 import org.apache.geronimo.openejb.xbeans.ejbjar.OpenejbGeronimoEjbJarType; 059 import org.apache.geronimo.openejb.xbeans.ejbjar.OpenejbTssLinkType; 060 061 /** 062 * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $ 063 */ 064 public class CorbaModuleBuilderExtension implements ModuleBuilderExtension, GBeanLifecycle { 065 066 private static final Map<String, String> NAMESPACE_UPDATES = new HashMap<String, String>(); 067 static { 068 NAMESPACE_UPDATES.put("http://www.openejb.org/xml/ns/corba-css-config_1_0", "http://openejb.apache.org/xml/ns/corba-css-config-2.1"); 069 NAMESPACE_UPDATES.put("http://www.openejb.org/xml/ns/corba-css-config-2.0", "http://openejb.apache.org/xml/ns/corba-css-config-2.1"); 070 NAMESPACE_UPDATES.put("http://www.openejb.org/xml/ns/corba-tss-config_1_0", "http://openejb.apache.org/xml/ns/corba-tss-config-2.1"); 071 NAMESPACE_UPDATES.put("http://www.openejb.org/xml/ns/corba-tss-config-2.0", "http://openejb.apache.org/xml/ns/corba-tss-config-2.1"); 072 NAMESPACE_UPDATES.put("http://www.openejb.org/xml/ns/corba-tss-config-2.1", "http://openejb.apache.org/xml/ns/corba-tss-config-2.1"); 073 } 074 // our default environment 075 protected Environment defaultEnvironment; 076 077 public CorbaModuleBuilderExtension() throws Exception { 078 this(null); 079 } 080 081 public CorbaModuleBuilderExtension(Environment defaultEnvironment) { 082 this.defaultEnvironment = defaultEnvironment; 083 } 084 085 public void doStart() throws Exception { 086 XmlBeansUtil.registerNamespaceUpdates(NAMESPACE_UPDATES); 087 } 088 089 public void doStop() { 090 XmlBeansUtil.unregisterNamespaceUpdates(NAMESPACE_UPDATES); 091 } 092 093 public void doFail() { 094 doStop(); 095 } 096 097 /** 098 * Early module creation. If this module contains 099 * and CORBA enablement links, the corba default 100 * environment is merged in. 101 * 102 * @param module The module being deployed. 103 * @param plan The module plan 104 * @param moduleFile The jar file containing the module. 105 * @param targetPath The module path. 106 * @param specDDUrl The schema information. 107 * @param environment 108 * The current environment (used for the merge). 109 * @param moduleContextInfo 110 * The module context. 111 * @param earName The name of the ear file. 112 * @param naming The naming context. 113 * @param idBuilder 114 * 115 * @exception DeploymentException 116 */ 117 public void createModule(Module module, Object plan, JarFile moduleFile, String targetPath, URL specDDUrl, Environment environment, Object moduleContextInfo, AbstractName earName, Naming naming, ModuleIDBuilder idBuilder) throws DeploymentException { 118 if (module.getType() != ConfigurationModuleType.EJB) { 119 return; 120 } 121 122 // if we have a default environment specified, we merge it in, but only if 123 // this module has tss links. The vendorDD isn't available yet, so we'll have to look at the 124 // jaxb version of this information now. 125 if (this.defaultEnvironment != null) { 126 EjbModule ejbModule = (EjbModule)module; 127 GeronimoEjbJarType geronimoEjbJarType = (GeronimoEjbJarType) ejbModule.getEjbModule().getAltDDs().get("geronimo-openejb.xml"); 128 129 if (geronimoEjbJarType != null) { 130 List<TssLinkType> links = geronimoEjbJarType.getTssLink(); 131 if (links != null && links.size() > 0) { 132 EnvironmentBuilder.mergeEnvironments(environment, this.defaultEnvironment); 133 } 134 } 135 } 136 } 137 138 public void installModule(JarFile earFile, EARContext earContext, Module module, Collection configurationStores, ConfigurationStore targetConfigurationStore, Collection repository) throws DeploymentException { 139 } 140 141 public void initContext(EARContext earContext, Module module, ClassLoader cl) throws DeploymentException { 142 } 143 144 /** 145 * Add any GBeans to the deployment that might be 146 * required by the presence of tss-link definitions 147 * in the ejb plans. 148 * 149 * @param earContext The earContext of the module deployment. 150 * @param module The module being deployed. 151 * @param cl The module class loader instance. 152 * @param repository The repository. 153 * 154 * @exception DeploymentException 155 * Thrown if any of the tss-link information cannot 156 * be resolved (missing ejb or TSSBean). 157 */ 158 public void addGBeans(EARContext earContext, Module module, ClassLoader cl, Collection repository) throws DeploymentException { 159 160 if (module.getType() != ConfigurationModuleType.EJB) { 161 return; 162 } 163 EjbModule ejbModule = (EjbModule) module; 164 OpenejbGeronimoEjbJarType jarInfo = ejbModule.getVendorDD(); 165 166 OpenejbTssLinkType[] links = jarInfo.getTssLinkArray(); 167 // if there are no links, then there's nothing to do. 168 if (links == null || links.length == 0) { 169 return; 170 } 171 172 URI moduleURI = module.getModuleURI(); 173 String moduleString = moduleURI == null ? null : moduleURI.toString(); 174 175 for (OpenejbTssLinkType link : links) { 176 AbstractName tssBeanName = resolveTssBean(earContext, link.getTssName(), moduleString); 177 AbstractName ejbName = resolveEjb(earContext, ejbModule, link.getEjbName()); 178 179 AbstractName tssLinkName = earContext.getNaming().createChildName(ejbName, link.getTssName(), NameFactory.CORBA_TSS_LINK); 180 GBeanData tssLinkData = new GBeanData(tssLinkName, TSSLinkGBean.GBEAN_INFO); 181 tssLinkData.setAttribute("jndiNames", link.getJndiNameArray()); 182 tssLinkData.setReferencePattern("EJB", ejbName); 183 tssLinkData.setReferencePattern("TSSBean", tssBeanName); 184 try { 185 earContext.addGBean(tssLinkData); 186 } catch (GBeanAlreadyExistsException e) { 187 throw new DeploymentException("tss link gbean already present", e); 188 } 189 } 190 } 191 192 /** 193 * Resolve a TSSBean name specified in a tss-link 194 * item to the bean's abstract name. 195 * 196 * @param context The ear context for the module were processing 197 * @param name The target name of the TSSBean. 198 * @param module The module name used to qualifiy the look ups. 199 * 200 * @return An AbstractName for the target TSSBean. 201 * @exception DeploymentException 202 * Thrown if the target TSSBean could not be located. 203 */ 204 private AbstractName resolveTssBean(EARContext context, String name, String module) throws DeploymentException { 205 AbstractNameQuery tssBeanName = ENCConfigBuilder.buildAbstractNameQuery(null, module, name, NameFactory.CORBA_TSS, NameFactory.EJB_MODULE); 206 try { 207 return context.findGBean(tssBeanName); 208 } catch (GBeanNotFoundException e) { 209 tssBeanName = ENCConfigBuilder.buildAbstractNameQuery(null, null, name, NameFactory.CORBA_TSS, null); 210 try { 211 return context.findGBean(tssBeanName); 212 } catch (GBeanNotFoundException e1) { 213 throw new DeploymentException("No tss bean " + name + " not found for module " + module, e); 214 } 215 } 216 } 217 218 /** 219 * Resolve an EJB name used in a tss-link element to 220 * the abstract name for that EJB. The EJB must be part 221 * of the current module bean set to be resolveable. 222 * 223 * @param context The ear context used for resolution. 224 * @param ejbModule The EJBModule we're currently processing. 225 * @param name The name of the target EJB. 226 * 227 * @return An AbstractName for the referenced EJB. 228 * @exception DeploymentException 229 * Thrown if the ejb does not exist in the current 230 * module. 231 */ 232 private AbstractName resolveEjb(EARContext earContext, EjbModule ejbModule, String name) throws DeploymentException { 233 for (EnterpriseBeanInfo bean : ejbModule.getEjbJarInfo().enterpriseBeans) { 234 // search for the target ejb 235 if (name.equals(bean.ejbName)) { 236 switch (bean.type) { 237 case EnterpriseBeanInfo.STATELESS: { 238 return earContext.getNaming().createChildName(ejbModule.getModuleName(), name, NameFactory.STATELESS_SESSION_BEAN); 239 } 240 case EnterpriseBeanInfo.STATEFUL: { 241 return earContext.getNaming().createChildName(ejbModule.getModuleName(), name, NameFactory.STATEFUL_SESSION_BEAN); 242 } 243 case EnterpriseBeanInfo.ENTITY: { 244 return earContext.getNaming().createChildName(ejbModule.getModuleName(), name, NameFactory.ENTITY_BEAN); 245 } 246 case EnterpriseBeanInfo.MESSAGE: { 247 return earContext.getNaming().createChildName(ejbModule.getModuleName(), name, NameFactory.MESSAGE_DRIVEN_BEAN); 248 } 249 } 250 } 251 } 252 throw new DeploymentException("EJB " + name + " not found for module " + ejbModule.getModuleName()); 253 } 254 255 256 public static final GBeanInfo GBEAN_INFO; 257 258 static { 259 GBeanInfoBuilder infoBuilder = GBeanInfoBuilder.createStatic(CorbaModuleBuilderExtension.class, NameFactory.MODULE_BUILDER); 260 infoBuilder.addInterface(ModuleBuilderExtension.class); 261 infoBuilder.addAttribute("defaultEnvironment", Environment.class, true, true); 262 263 infoBuilder.setConstructor(new String[]{"defaultEnvironment"}); 264 265 GBEAN_INFO = infoBuilder.getBeanInfo(); 266 } 267 268 public static GBeanInfo getGBeanInfo() { 269 return GBEAN_INFO; 270 } 271 } 272