/** * * Copyright 2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.geronimo.j2ee.deployment; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.net.URLDecoder; import java.util.Arrays; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.jar.JarFile; import java.util.zip.ZipEntry; import javax.management.MalformedObjectNameException; import javax.management.ObjectName; import javax.xml.namespace.QName; import org.apache.geronimo.common.DeploymentException; import org.apache.geronimo.deployment.ConfigurationBuilder; import org.apache.geronimo.deployment.service.ServiceConfigBuilder; import org.apache.geronimo.deployment.util.DeploymentUtil; import org.apache.geronimo.deployment.util.NestedJarFile; import org.apache.geronimo.deployment.xbeans.ClassFilterType; import org.apache.geronimo.deployment.xbeans.DependencyType; import org.apache.geronimo.deployment.xbeans.GbeanType; import org.apache.geronimo.deployment.xmlbeans.XmlBeansUtil; import org.apache.geronimo.gbean.GBeanData; import org.apache.geronimo.gbean.GBeanInfo; import org.apache.geronimo.gbean.GBeanInfoBuilder; import org.apache.geronimo.j2ee.ApplicationInfo; import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory; import org.apache.geronimo.j2ee.management.impl.J2EEApplicationImpl; import org.apache.geronimo.kernel.Kernel; import org.apache.geronimo.kernel.config.ConfigurationData; import org.apache.geronimo.kernel.config.ConfigurationModuleType; import org.apache.geronimo.kernel.repository.Repository; import org.apache.geronimo.schema.SchemaConversionUtils; import org.apache.geronimo.security.deployment.SecurityBuilder; import org.apache.geronimo.security.deployment.SecurityConfiguration; import org.apache.geronimo.xbeans.geronimo.j2ee.GerApplicationDocument; import org.apache.geronimo.xbeans.geronimo.j2ee.GerApplicationType; import org.apache.geronimo.xbeans.geronimo.j2ee.GerExtModuleType; import org.apache.geronimo.xbeans.geronimo.j2ee.GerModuleType; import org.apache.geronimo.xbeans.j2ee.ApplicationType; import org.apache.geronimo.xbeans.j2ee.ModuleType; import org.apache.xmlbeans.XmlException; import org.apache.xmlbeans.XmlObject; /** * @version $Rev$ $Date$ */ public class EARConfigBuilder implements ConfigurationBuilder { private final static QName APPLICATION_QNAME = GerApplicationDocument.type.getDocumentElementName(); private final Kernel kernel; private final Repository repository; private final ModuleBuilder ejbConfigBuilder; private final ModuleBuilder webConfigBuilder; private final ModuleBuilder connectorConfigBuilder; private final ModuleBuilder appClientConfigBuilder; private final EJBReferenceBuilder ejbReferenceBuilder; private final ResourceReferenceBuilder resourceReferenceBuilder; private final ServiceReferenceBuilder serviceReferenceBuilder; private final List defaultParentId; private final ObjectName transactionContextManagerObjectName; private final ObjectName connectionTrackerObjectName; private final ObjectName transactionalTimerObjectName; private final ObjectName nonTransactionalTimerObjectName; private final ObjectName corbaGBeanObjectName; public EARConfigBuilder(URI[] defaultParentId, ObjectName transactionContextManagerObjectName, ObjectName connectionTrackerObjectName, ObjectName transactionalTimerObjectName, ObjectName nonTransactionalTimerObjectName, ObjectName corbaGBeanObjectName, Repository repository, ModuleBuilder ejbConfigBuilder, EJBReferenceBuilder ejbReferenceBuilder, ModuleBuilder webConfigBuilder, ModuleBuilder connectorConfigBuilder, ResourceReferenceBuilder resourceReferenceBuilder, ModuleBuilder appClientConfigBuilder, ServiceReferenceBuilder serviceReferenceBuilder, Kernel kernel) { this.kernel = kernel; this.repository = repository; this.defaultParentId = defaultParentId == null ? Collections.EMPTY_LIST : Arrays.asList(defaultParentId); this.ejbConfigBuilder = ejbConfigBuilder; this.ejbReferenceBuilder = ejbReferenceBuilder; this.resourceReferenceBuilder = resourceReferenceBuilder; this.webConfigBuilder = webConfigBuilder; this.connectorConfigBuilder = connectorConfigBuilder; this.appClientConfigBuilder = appClientConfigBuilder; this.serviceReferenceBuilder = serviceReferenceBuilder; this.transactionContextManagerObjectName = transactionContextManagerObjectName; this.connectionTrackerObjectName = connectionTrackerObjectName; this.transactionalTimerObjectName = transactionalTimerObjectName; this.nonTransactionalTimerObjectName = nonTransactionalTimerObjectName; this.corbaGBeanObjectName = corbaGBeanObjectName; } public Object getDeploymentPlan(File planFile, JarFile jarFile) throws DeploymentException { if (planFile == null && jarFile == null) { return null; } ApplicationInfo plan = getEarPlan(planFile, jarFile); if (plan != null) { return plan; } //Only "synthetic" ears with only external modules can have no jar file. if (jarFile == null) { return null; } // get the modules either the application plan or for a stand alone module from the specific deployer Module module = null; if (webConfigBuilder != null) { module = webConfigBuilder.createModule(planFile, jarFile); } if (module == null && ejbConfigBuilder != null) { module = ejbConfigBuilder.createModule(planFile, jarFile); } if (module == null && connectorConfigBuilder != null) { module = connectorConfigBuilder.createModule(planFile, jarFile); } if (module == null && appClientConfigBuilder != null) { module = appClientConfigBuilder.createModule(planFile, jarFile); } if (module == null) { return null; } return new ApplicationInfo(module.getType(), module.getConfigId(), module.getParentId(), NameFactory.NULL, null, null, Collections.singleton(module), Collections.EMPTY_SET, null); } private ApplicationInfo getEarPlan(File planFile, JarFile earFile) throws DeploymentException { String specDD; ApplicationType application = null; if (earFile != null) { try { URL applicationXmlUrl = DeploymentUtil.createJarURL(earFile, "META-INF/application.xml"); specDD = DeploymentUtil.readAll(applicationXmlUrl); } catch (Exception e) { //no application.xml, not for us return null; } //we found something called application.xml in the right place, if we can't parse it it's an error try { XmlObject xmlObject = XmlBeansUtil.parse(specDD); application = SchemaConversionUtils.convertToApplicationSchema(xmlObject).getApplication(); } catch (XmlException e) { throw new DeploymentException("Could not parse application.xml", e); } } GerApplicationType gerApplication = null; try { // load the geronimo-application.xml from either the supplied plan or from the earFile GerApplicationDocument gerApplicationDoc = null; XmlObject rawPlan = null; try { if (planFile != null) { rawPlan = XmlBeansUtil.parse(planFile.toURL()); gerApplication = (GerApplicationType) SchemaConversionUtils.fixGeronimoSchema(rawPlan, APPLICATION_QNAME, GerApplicationType.type); if (gerApplication == null) { return null; } } else { URL path = DeploymentUtil.createJarURL(earFile, "META-INF/geronimo-application.xml"); rawPlan = XmlBeansUtil.parse(path); gerApplication = (GerApplicationType) SchemaConversionUtils.fixGeronimoSchema(rawPlan, APPLICATION_QNAME, GerApplicationType.type); } } catch (IOException e) { //TODO isn't this an error? } // if we got one extract the validate it otherwise create a default one if (gerApplication == null) { gerApplication = createDefaultPlan(application, earFile); } } catch (XmlException e) { throw new DeploymentException(e); } // get the ids from either the application plan or for a stand alone module from the specific deployer URI configId = null; try { configId = new URI(gerApplication.getConfigId()); } catch (URISyntaxException e) { throw new DeploymentException("Invalid configId " + gerApplication.getConfigId(), e); } List parentId = ServiceConfigBuilder.getParentID(gerApplication.getParentId(), gerApplication.getImportArray()); parentId.addAll(defaultParentId); // get the modules either the application plan or for a stand alone module from the specific deployer // todo change module so you can extract the real module path back out.. then we can eliminate // the moduleLocations and have addModules return the modules Set moduleLocations = new HashSet(); Set modules = new LinkedHashSet(); try { addModules(earFile, application, gerApplication, moduleLocations, modules); } catch (Throwable e) { // close all the modules for (Iterator iterator = modules.iterator(); iterator.hasNext();) { Module module = (Module) iterator.next(); module.close(); } if (e instanceof DeploymentException) { throw (DeploymentException) e; } else if (e instanceof RuntimeException) { throw (RuntimeException) e; } else if (e instanceof Error) { throw (Error) e; } throw new DeploymentException(e); } String applicationName = gerApplication.isSetApplicationName() ? gerApplication.getApplicationName() : configId.toString(); return new ApplicationInfo(ConfigurationModuleType.EAR, configId, parentId, applicationName, application, gerApplication, modules, moduleLocations, application == null ? null : application.toString()); } private GerApplicationType createDefaultPlan(ApplicationType application, JarFile module) { // construct the empty geronimo-application.xml GerApplicationType gerApplication = GerApplicationType.Factory.newInstance(); // set the configId String id = application.getId(); if (id == null) { File fileName = new File(module.getName()); id = fileName.getName(); if (id.endsWith(".ear")) { id = id.substring(0, id.length() - 4); } if (id.endsWith("/")) { id = id.substring(0, id.length() - 1); } } gerApplication.setConfigId(id); return gerApplication; } public URI getConfigurationID(Object plan, JarFile module) throws IOException, DeploymentException { ApplicationInfo applicationInfo = (ApplicationInfo) plan; return applicationInfo.getConfigId(); } public ConfigurationData buildConfiguration(Object plan, JarFile earFile, File outfile) throws IOException, DeploymentException { assert plan != null; ApplicationInfo applicationInfo = (ApplicationInfo) plan; try { // Create the output ear context EARContext earContext = null; ConfigurationModuleType applicationType = applicationInfo.getType(); try { earContext = new EARContext(outfile, applicationInfo.getConfigId(), applicationType, applicationInfo.getParentId(), kernel, applicationInfo.getApplicationName(), transactionContextManagerObjectName, connectionTrackerObjectName, transactionalTimerObjectName, nonTransactionalTimerObjectName, corbaGBeanObjectName, new RefContext(ejbReferenceBuilder, resourceReferenceBuilder, serviceReferenceBuilder, kernel)); } catch (MalformedObjectNameException e) { throw new DeploymentException(e); } // Copy over all files that are _NOT_ modules Set moduleLocations = applicationInfo.getModuleLocations(); if (ConfigurationModuleType.EAR == applicationType && earFile != null) { for (Enumeration e = earFile.entries(); e.hasMoreElements();) { ZipEntry entry = (ZipEntry) e.nextElement(); if (!moduleLocations.contains(entry.getName())) { earContext.addFile(URI.create(entry.getName()), earFile, entry); } } } GerApplicationType geronimoApplication = (GerApplicationType) applicationInfo.getVendorDD(); if (geronimoApplication != null) { // add dependencies declared in the geronimo-application.xml DependencyType[] dependencies = geronimoApplication.getDependencyArray(); ServiceConfigBuilder.addDependencies(earContext, dependencies, repository); if (geronimoApplication.isSetInverseClassloading()) { earContext.setInverseClassloading(geronimoApplication.getInverseClassloading()); } ClassFilterType[] filters = geronimoApplication.getHiddenClassesArray(); ServiceConfigBuilder.addHiddenClasses(earContext, filters); filters = geronimoApplication.getNonOverridableClassesArray(); ServiceConfigBuilder.addNonOverridableClasses(earContext, filters); } // each module installs it's files into the output context.. this is different for each module type Set modules = applicationInfo.getModules(); for (Iterator iterator = modules.iterator(); iterator.hasNext();) { Module module = (Module) iterator.next(); getBuilder(module).installModule(earFile, earContext, module); } // give each module a chance to populate the earContext now that a classloader is available ClassLoader cl = earContext.getClassLoader(repository); for (Iterator iterator = modules.iterator(); iterator.hasNext();) { Module module = (Module) iterator.next(); getBuilder(module).initContext(earContext, module, cl); } // add gbeans declared in the geronimo-application.xml if (geronimoApplication != null) { GbeanType[] gbeans = geronimoApplication.getGbeanArray(); ServiceConfigBuilder.addGBeans(gbeans, cl, earContext.getJ2eeContext(), earContext); } // Create the J2EEApplication managed object if (ConfigurationModuleType.EAR == applicationType) { GBeanData gbeanData = new GBeanData(earContext.getApplicationObjectName(), J2EEApplicationImpl.GBEAN_INFO); try { String originalSpecDD = applicationInfo.getOriginalSpecDD(); if (originalSpecDD == null) { originalSpecDD = "Synthetic EAR"; } gbeanData.setAttribute("deploymentDescriptor", originalSpecDD); } catch (Exception e) { throw new DeploymentException("Error initializing J2EEApplication managed object"); } try { gbeanData.setReferencePattern("j2eeServer", NameFactory.getServerName(earContext.getDomain(), earContext.getServer(), earContext.getJ2eeContext())); } catch (MalformedObjectNameException e) { throw new DeploymentException("Error constructing J2EEServer name for application", e); } earContext.addGBean(gbeanData); } //TODO this might need to be constructed only if there is security... ObjectName jaccBeanName = null; String moduleName; if (ConfigurationModuleType.EAR == applicationType) { moduleName = NameFactory.NULL; } else { Module module = (Module) modules.iterator().next(); moduleName = module.getName(); } try { jaccBeanName = NameFactory.getComponentName(null, null, null, moduleName, NameFactory.JACC_MANAGER, NameFactory.JACC_MANAGER, earContext.getJ2eeContext()); } catch (MalformedObjectNameException e) { throw new DeploymentException("Could not construct name for JACCBean", e); } earContext.setJaccManagerName(jaccBeanName); //look for application plan security config if (geronimoApplication != null && geronimoApplication.isSetSecurity()) { SecurityConfiguration securityConfiguration = SecurityBuilder.buildSecurityConfiguration(geronimoApplication.getSecurity(), cl); earContext.setSecurityConfiguration(securityConfiguration); } // each module can now add it's GBeans for (Iterator iterator = modules.iterator(); iterator.hasNext();) { Module module = (Module) iterator.next(); getBuilder(module).addGBeans(earContext, module, cl); } //add the JACC gbean if there is a principal-role mapping if (earContext.getSecurityConfiguration() != null) { GBeanData jaccBeanData = SecurityBuilder.configureApplicationPolicyManager(jaccBeanName, earContext.getContextIDToPermissionsMap(), earContext.getSecurityConfiguration()); earContext.addGBean(jaccBeanData); } earContext.close(); return earContext.getConfigurationData(); } finally { Set modules = applicationInfo.getModules(); for (Iterator iterator = modules.iterator(); iterator.hasNext();) { Module module = (Module) iterator.next(); module.close(); } } } private void addModules(JarFile earFile, ApplicationType application, GerApplicationType gerApplication, Set moduleLocations, Set modules) throws DeploymentException { Map altVendorDDs = new HashMap(); try { if (earFile != null) { ModuleType[] moduleTypes = application.getModuleArray(); Set paths = new HashSet(); for (int i = 0; i < moduleTypes.length; i++) { ModuleType type = moduleTypes[i]; if (type.isSetEjb()) { paths.add(type.getEjb().getStringValue()); } else if (type.isSetWeb()) { paths.add(type.getWeb().getWebUri().getStringValue()); } else if (type.isSetConnector()) { paths.add(type.getConnector().getStringValue()); } else if (type.isSetJava()) { paths.add(type.getJava().getStringValue()); } } // build map from module path to alt vendor dd GerModuleType gerModuleTypes[] = gerApplication.getModuleArray(); for (int i = 0; i < gerModuleTypes.length; i++) { GerModuleType gerModule = gerModuleTypes[i]; String path = null; if (gerModule.isSetEjb()) { path = gerModule.getEjb().getStringValue(); } else if (gerModule.isSetWeb()) { path = gerModule.getWeb().getStringValue(); } else if (gerModule.isSetConnector()) { path = gerModule.getConnector().getStringValue(); } else if (gerModule.isSetJava()) { path = gerModule.getJava().getStringValue(); } if (!paths.contains(path)) { throw new DeploymentException("Geronimo deployment plan refers to module '" + path + "' but that was not defined in the META-INF/application.xml"); } if (gerModule.isSetAltDd()) { // the the url of the alt dd try { altVendorDDs.put(path, DeploymentUtil.toTempFile(earFile, gerModule.getAltDd().getStringValue())); } catch (IOException e) { throw new DeploymentException("Invalid alt vendor dd url: " + gerModule.getAltDd().getStringValue(), e); } } else { //dd is included explicitly XmlObject[] anys = gerModule.selectChildren(GerModuleType.type.qnameSetForWildcardElements()); if (anys.length != 1) { throw new DeploymentException("Unexpected count of xs:any elements in embedded vendor plan " + anys.length + " qnameset: " + GerModuleType.type.qnameSetForWildcardElements()); } altVendorDDs.put(path, anys[0]); } } // get a set containing all of the files in the ear that are actually modules for (int i = 0; i < moduleTypes.length; i++) { ModuleType moduleXml = moduleTypes[i]; String modulePath; ModuleBuilder builder; Object moduleContextInfo = null; String moduleTypeName; if (moduleXml.isSetEjb()) { modulePath = moduleXml.getEjb().getStringValue(); if (ejbConfigBuilder == null) { throw new DeploymentException("Cannot deploy ejb application; No ejb deployer defined: " + modulePath); } builder = ejbConfigBuilder; moduleTypeName = "an EJB"; } else if (moduleXml.isSetWeb()) { modulePath = moduleXml.getWeb().getWebUri().getStringValue(); if (webConfigBuilder == null) { throw new DeploymentException("Cannot deploy web application; No war deployer defined: " + modulePath); } builder = webConfigBuilder; moduleTypeName = "a war"; moduleContextInfo = moduleXml.getWeb().getContextRoot().getStringValue().trim(); } else if (moduleXml.isSetConnector()) { modulePath = moduleXml.getConnector().getStringValue(); if (connectorConfigBuilder == null) { throw new DeploymentException("Cannot deploy resource adapter; No rar deployer defined: " + modulePath); } builder = connectorConfigBuilder; moduleTypeName = "a connector"; } else if (moduleXml.isSetJava()) { modulePath = moduleXml.getJava().getStringValue(); if (appClientConfigBuilder == null) { throw new DeploymentException("Cannot deploy app client; No app client deployer defined: " + modulePath); } builder = appClientConfigBuilder; moduleTypeName = "an application client"; } else { throw new DeploymentException("Could not find a module builder for module: " + moduleXml); } moduleLocations.add(modulePath); URL altSpecDD = null; if (moduleXml.isSetAltDd()) { try { altSpecDD = DeploymentUtil.createJarURL(earFile, moduleXml.getAltDd().getStringValue()); } catch (MalformedURLException e) { throw new DeploymentException("Invalid alt sped dd url: " + moduleXml.getAltDd().getStringValue(), e); } } NestedJarFile moduleFile = null; try { moduleFile = new NestedJarFile(earFile, modulePath); } catch (IOException e) { throw new DeploymentException("Invalid moduleFile: " + modulePath, e); } Module module = builder.createModule(altVendorDDs.get(modulePath), moduleFile, modulePath, altSpecDD, URI.create(gerApplication.getConfigId()), moduleContextInfo); if (module == null) { throw new DeploymentException("Module was not " + moduleTypeName + ": " + modulePath); } modules.add(module); } } //deploy the extension modules GerExtModuleType gerExtModuleTypes[] = gerApplication.getExtModuleArray(); for (int i = 0; i < gerExtModuleTypes.length; i++) { GerExtModuleType gerExtModule = gerExtModuleTypes[i]; String moduleName = null; ModuleBuilder builder; Object moduleContextInfo = null; String moduleTypeName; if (gerExtModule.isSetEjb()) { moduleName = gerExtModule.getEjb().getStringValue(); if (ejbConfigBuilder == null) { throw new DeploymentException("Cannot deploy ejb application; No ejb deployer defined: " + moduleName); } builder = ejbConfigBuilder; moduleTypeName = "an EJB"; } else if (gerExtModule.isSetWeb()) { moduleName = gerExtModule.getWeb().getStringValue(); if (webConfigBuilder == null) { throw new DeploymentException("Cannot deploy web application; No war deployer defined: " + moduleName); } builder = webConfigBuilder; moduleTypeName = "a war"; //ext modules must use vendor plan to set context-root // moduleContextInfo = gerExtModule.getWeb().getContextRoot().getStringValue().trim(); } else if (gerExtModule.isSetConnector()) { moduleName = gerExtModule.getConnector().getStringValue(); if (connectorConfigBuilder == null) { throw new DeploymentException("Cannot deploy resource adapter; No rar deployer defined: " + moduleName); } builder = connectorConfigBuilder; moduleTypeName = "a connector"; } else if (gerExtModule.isSetJava()) { moduleName = gerExtModule.getJava().getStringValue(); if (appClientConfigBuilder == null) { throw new DeploymentException("Cannot deploy app client; No app client deployer defined: " + moduleName); } builder = appClientConfigBuilder; moduleTypeName = "an application client"; } else { throw new DeploymentException("Could not find a module builder for module: " + gerExtModule); } //dd is included explicitly XmlObject[] anys = gerExtModule.selectChildren(GerExtModuleType.type.qnameSetForWildcardElements()); if (anys.length != 1) { throw new DeploymentException("Unexpected count of xs:any elements in embedded vendor plan " + anys.length + " qnameset: " + GerExtModuleType.type.qnameSetForWildcardElements()); } Object vendorDD = anys[0]; JarFile moduleFile = null; if (gerExtModule.isSetInternalPath()) { String modulePath = gerExtModule.getInternalPath().trim(); moduleLocations.add(modulePath); try { moduleFile = new NestedJarFile(earFile, modulePath); } catch (IOException e) { throw new DeploymentException("Invalid moduleFile: " + modulePath, e); } } else { String path = gerExtModule.getExternalPath().trim(); URI pathURI = null; try { pathURI = new URI(path); } catch (URISyntaxException e) { throw new DeploymentException("Bad path to external module, " + moduleTypeName, e); } if (!repository.hasURI(pathURI)) { throw new DeploymentException(moduleTypeName + " is missing in repository: " + path); } URL pathURL = null; try { pathURL = repository.getURL(pathURI); } catch (MalformedURLException e) { throw new DeploymentException("Could not locate " + moduleTypeName + " in repository", e); } try { moduleFile = new JarFile(URLDecoder.decode(pathURL.getFile(), "UTF-8")); } catch (IOException e) { throw new DeploymentException("Could not access contents of " + moduleTypeName, e); } } URL altSpecDD = null; //todo implement an alt-spec-dd element. // if (moduleXml.isSetAltDd()) { // try { // altSpecDD = DeploymentUtil.createJarURL(earFile, moduleXml.getAltDd().getStringValue()); // } catch (MalformedURLException e) { // throw new DeploymentException("Invalid alt spec dd url: " + moduleXml.getAltDd().getStringValue(), e); // } // } Module module = builder.createModule(vendorDD, moduleFile, moduleName, altSpecDD, URI.create(gerApplication.getConfigId()), moduleContextInfo); if (module == null) { throw new DeploymentException("Module was not " + moduleTypeName + ": " + moduleName); } modules.add(module); } } finally { // delete all the temp files created for alt vendor dds for (Iterator iterator = altVendorDDs.values().iterator(); iterator.hasNext();) { Object altVendorDD = iterator.next(); if (altVendorDD instanceof File) { ((File) altVendorDD).delete(); } } } } private ModuleBuilder getBuilder(Module module) throws DeploymentException { if (module instanceof EJBModule) { if (ejbConfigBuilder == null) { throw new DeploymentException("Cannot deploy ejb application; No ejb deployer defined: " + module.getModuleURI()); } return ejbConfigBuilder; } else if (module instanceof WebModule) { if (webConfigBuilder == null) { throw new DeploymentException("Cannot deploy web application; No war deployer defined: " + module.getModuleURI()); } return webConfigBuilder; } else if (module instanceof ConnectorModule) { if (connectorConfigBuilder == null) { throw new DeploymentException("Cannot deploy resource adapter; No rar deployer defined: " + module.getModuleURI()); } return connectorConfigBuilder; } else if (module instanceof AppClientModule) { if (appClientConfigBuilder == null) { throw new DeploymentException("Cannot deploy app client; No app client deployer defined: " + module.getModuleURI()); } return appClientConfigBuilder; } throw new IllegalArgumentException("Unknown module type: " + module.getClass().getName()); } public static final GBeanInfo GBEAN_INFO; static { GBeanInfoBuilder infoFactory = GBeanInfoBuilder.createStatic(EARConfigBuilder.class, NameFactory.CONFIG_BUILDER); infoFactory.addAttribute("defaultParentId", URI[].class, true, true); infoFactory.addAttribute("transactionContextManagerObjectName", ObjectName.class, true); infoFactory.addAttribute("connectionTrackerObjectName", ObjectName.class, true); infoFactory.addAttribute("transactionalTimerObjectName", ObjectName.class, true); infoFactory.addAttribute("nonTransactionalTimerObjectName", ObjectName.class, true); infoFactory.addAttribute("corbaGBeanObjectName", ObjectName.class, true); infoFactory.addReference("Repository", Repository.class, NameFactory.GERONIMO_SERVICE); infoFactory.addReference("EJBConfigBuilder", ModuleBuilder.class, NameFactory.MODULE_BUILDER); infoFactory.addReference("EJBReferenceBuilder", EJBReferenceBuilder.class, NameFactory.MODULE_BUILDER); infoFactory.addReference("WebConfigBuilder", ModuleBuilder.class, NameFactory.MODULE_BUILDER); infoFactory.addReference("ConnectorConfigBuilder", ModuleBuilder.class, NameFactory.MODULE_BUILDER); infoFactory.addReference("ResourceReferenceBuilder", ResourceReferenceBuilder.class, NameFactory.MODULE_BUILDER); infoFactory.addReference("AppClientConfigBuilder", ModuleBuilder.class, NameFactory.MODULE_BUILDER); infoFactory.addReference("ServiceReferenceBuilder", ServiceReferenceBuilder.class, NameFactory.MODULE_BUILDER); infoFactory.addAttribute("kernel", Kernel.class, false); infoFactory.addInterface(ConfigurationBuilder.class); infoFactory.setConstructor(new String[]{ "defaultParentId", "transactionContextManagerObjectName", "connectionTrackerObjectName", "transactionalTimerObjectName", "nonTransactionalTimerObjectName", "corbaGBeanObjectName", "Repository", "EJBConfigBuilder", "EJBReferenceBuilder", "WebConfigBuilder", "ConnectorConfigBuilder", "ResourceReferenceBuilder", "AppClientConfigBuilder", "ServiceReferenceBuilder", "kernel" }); GBEAN_INFO = infoFactory.getBeanInfo(); } public static GBeanInfo getGBeanInfo() { return GBEAN_INFO; } }