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