You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by sp...@apache.org on 2007/01/15 20:06:30 UTC
svn commit: r496444 -
/geronimo/server/trunk/modules/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/EARConfigBuilder.java
Author: sppatel
Date: Mon Jan 15 11:06:28 2007
New Revision: 496444
URL: http://svn.apache.org/viewvc?view=rev&rev=496444
Log:
allow EE5 deployments of ears with no application.xml, inspect ear to locate and build modules if dd missing
Modified:
geronimo/server/trunk/modules/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/EARConfigBuilder.java
Modified: geronimo/server/trunk/modules/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/EARConfigBuilder.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/EARConfigBuilder.java?view=diff&rev=496444&r1=496443&r2=496444
==============================================================================
--- geronimo/server/trunk/modules/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/EARConfigBuilder.java (original)
+++ geronimo/server/trunk/modules/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/EARConfigBuilder.java Mon Jan 15 11:06:28 2007
@@ -86,12 +86,12 @@
import org.apache.geronimo.xbeans.geronimo.j2ee.GerExtModuleType;
import org.apache.geronimo.xbeans.geronimo.j2ee.GerModuleType;
import org.apache.geronimo.xbeans.geronimo.j2ee.GerSecurityDocument;
+import org.apache.geronimo.xbeans.javaee.ApplicationDocument;
import org.apache.geronimo.xbeans.javaee.ApplicationType;
import org.apache.geronimo.xbeans.javaee.ModuleType;
-import org.apache.geronimo.xbeans.javaee.ApplicationDocument;
+import org.apache.xmlbeans.XmlCursor;
import org.apache.xmlbeans.XmlException;
import org.apache.xmlbeans.XmlObject;
-import org.apache.xmlbeans.XmlCursor;
/**
* @version $Rev$ $Date$
@@ -302,16 +302,13 @@
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 {
+ //we found something called application.xml in the right place, if we can't parse it it's an error
XmlObject xmlObject = XmlBeansUtil.parse(specDD);
application = convertToApplicationSchema(xmlObject).getApplication();
} catch (XmlException e) {
- throw new DeploymentException("Could not parse application.xml", e);
+ throw new DeploymentException("Could not parse application.xml", e);
+ } catch (Exception e) {
+ //ee5 spec allows optional application.xml, continue with application == null
}
}
@@ -397,7 +394,7 @@
artifactType.setGroupId(Artifact.DEFAULT_GROUP_ID);
// set the configId
- String id = application.getId();
+ String id = application != null ? application.getId() : null;
if (id == null) {
File fileName = new File(module.getName());
id = fileName.getName();
@@ -657,132 +654,197 @@
Map altVendorDDs = new HashMap();
try {
if (earFile != null) {
- ModuleType[] moduleTypes = application.getModuleArray();
- //paths is used to check that all modules in the geronimo plan are in the application.xml.
- 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();
- builder = getEjbConfigBuilder();
- if (builder == null) {
- throw new DeploymentException("Cannot deploy ejb application; No ejb deployer defined: " + modulePath);
+ ModuleType[] moduleTypes = null;
+ if(application != null) {
+ moduleTypes = application.getModuleArray();
+ //paths is used to check that all modules in the geronimo plan are in the application.xml.
+ 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();
}
- moduleTypeName = "an EJB";
- } else if (moduleXml.isSetWeb()) {
- modulePath = moduleXml.getWeb().getWebUri().getStringValue();
- if (getWebConfigBuilder() == null) {
- throw new DeploymentException("Cannot deploy web application; No war deployer defined: " + modulePath);
+ 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");
}
- builder = getWebConfigBuilder();
- moduleTypeName = "a war";
- moduleContextInfo = moduleXml.getWeb().getContextRoot().getStringValue().trim();
- } else if (moduleXml.isSetConnector()) {
- modulePath = moduleXml.getConnector().getStringValue();
- if (getConnectorConfigBuilder() == null) {
- throw new DeploymentException("Cannot deploy resource adapter; No rar deployer defined: " + modulePath);
- }
- builder = getConnectorConfigBuilder();
- moduleTypeName = "a connector";
- } else if (moduleXml.isSetJava()) {
- modulePath = moduleXml.getJava().getStringValue();
- if (getAppClientConfigBuilder() == null) {
- throw new DeploymentException("Cannot deploy app client; No app client deployer defined: " + modulePath);
- }
- builder = getAppClientConfigBuilder();
- 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);
+ 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]);
}
}
-
- NestedJarFile moduleFile;
- 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,
- environment,
- moduleContextInfo,
- earName,
- naming, idBuilder);
-
- if (module == null) {
- throw new DeploymentException("Module was not " + moduleTypeName + ": " + modulePath);
- }
-
- modules.add(module);
- }
+ }
+
+ if(moduleTypes == null) {
+ //no application.xml available, must inspect ear to locate and process modules
+ //TODO //suport EE.8.2.1 bundled libraries
+ Enumeration entries = earFile.entries();
+ while (entries.hasMoreElements()) {
+ ModuleBuilder builder = null;
+ Object moduleContextInfo = null;
+ String moduleTypeName = null;
+ ZipEntry entry = (ZipEntry) entries.nextElement();
+ if(entry.getName().endsWith(".war")) {
+ if (getWebConfigBuilder() == null) {
+ throw new DeploymentException("Cannot deploy web application; No war deployer defined: " + entry.getName());
+ }
+ builder = getWebConfigBuilder();
+ moduleTypeName = "a war";
+ moduleContextInfo = entry.getName().split(".war")[0];
+ } else if(entry.getName().endsWith(".rar")) {
+ if (getConnectorConfigBuilder() == null) {
+ throw new DeploymentException("Cannot deploy resource adapter; No rar deployer defined: " + entry.getName());
+ }
+ builder = getConnectorConfigBuilder();
+ moduleTypeName = "a connector";
+ } else if(entry.getName().endsWith(".jar") && !entry.getName().startsWith("lib")) {
+ try {
+ NestedJarFile moduleFile = new NestedJarFile(earFile, entry.getName());
+ if(moduleFile.getEntry("META-INF/application-client.xml") != null) {
+ if (getAppClientConfigBuilder() == null) {
+ throw new DeploymentException("Cannot deploy app client; No app client deployer defined: " + entry.getName());
+ }
+ builder = getAppClientConfigBuilder();
+ moduleTypeName = "an application client";
+ } else if(moduleFile.getEntry("META-INF/ejb-jar.xml") != null) {
+ builder = getEjbConfigBuilder();
+ if (builder == null) {
+ throw new DeploymentException("Cannot deploy ejb application; No ejb deployer defined: " + entry.getName());
+ }
+ moduleTypeName = "an EJB";
+ }
+ //TODO if no ejb-jar.xml inspect classes for EJB component annotations to identify as EJBJar module
+ } catch (IOException e) {
+ throw new DeploymentException("Invalid moduleFile: " + entry.getName(), e);
+ }
+ } else {
+ continue;
+ }
+
+ moduleLocations.add(entry.getName());
+
+ NestedJarFile moduleFile;
+ try {
+ moduleFile = new NestedJarFile(earFile, entry.getName());
+ } catch (IOException e) {
+ throw new DeploymentException("Invalid moduleFile: " + entry.getName(), e);
+ }
+
+ Module module = builder.createModule(altVendorDDs.get(entry.getName()),
+ moduleFile,
+ entry.getName(),
+ null,
+ environment,
+ moduleContextInfo,
+ earName,
+ naming, idBuilder);
+
+ if (module == null) {
+ throw new DeploymentException("Module was not " + moduleTypeName + ": " + entry.getName());
+ }
+
+ modules.add(module);
+ }
+ } else {
+ // 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();
+ builder = getEjbConfigBuilder();
+ if (builder == null) {
+ throw new DeploymentException("Cannot deploy ejb application; No ejb deployer defined: " + modulePath);
+ }
+ moduleTypeName = "an EJB";
+ } else if (moduleXml.isSetWeb()) {
+ modulePath = moduleXml.getWeb().getWebUri().getStringValue();
+ if (getWebConfigBuilder() == null) {
+ throw new DeploymentException("Cannot deploy web application; No war deployer defined: " + modulePath);
+ }
+ builder = getWebConfigBuilder();
+ moduleTypeName = "a war";
+ moduleContextInfo = moduleXml.getWeb().getContextRoot().getStringValue().trim();
+ } else if (moduleXml.isSetConnector()) {
+ modulePath = moduleXml.getConnector().getStringValue();
+ if (getConnectorConfigBuilder() == null) {
+ throw new DeploymentException("Cannot deploy resource adapter; No rar deployer defined: " + modulePath);
+ }
+ builder = getConnectorConfigBuilder();
+ moduleTypeName = "a connector";
+ } else if (moduleXml.isSetJava()) {
+ modulePath = moduleXml.getJava().getStringValue();
+ if (getAppClientConfigBuilder() == null) {
+ throw new DeploymentException("Cannot deploy app client; No app client deployer defined: " + modulePath);
+ }
+ builder = getAppClientConfigBuilder();
+ moduleTypeName = "an application client";
+ } else {
+ throw new DeploymentException("Could not find a module builder for module: " + moduleXml);
+ }
+
+ moduleLocations.add(modulePath);
+
+ NestedJarFile moduleFile;
+ 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,
+ getAltSpecDDURL(earFile, moduleXml),
+ environment,
+ moduleContextInfo,
+ earName,
+ naming, idBuilder);
+
+ if (module == null) {
+ throw new DeploymentException("Module was not " + moduleTypeName + ": " + modulePath);
+ }
+
+ modules.add(module);
+ }
+ }
}
//deploy the extension modules
@@ -904,6 +966,17 @@
}
}
}
+
+ private URL getAltSpecDDURL(JarFile earFile, ModuleType moduleXml) throws DeploymentException {
+ if (moduleXml != null && moduleXml.isSetAltDd()) {
+ try {
+ return DeploymentUtil.createJarURL(earFile, moduleXml.getAltDd().getStringValue());
+ } catch (MalformedURLException e) {
+ throw new DeploymentException("Invalid alt sped dd url: " + moduleXml.getAltDd().getStringValue(), e);
+ }
+ }
+ return null;
+ }
private ModuleBuilder getBuilder(Module module) throws DeploymentException {
if (module instanceof EJBModule) {