You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by ga...@apache.org on 2010/01/24 00:28:13 UTC

svn commit: r902507 [1/3] - in /geronimo/server/trunk: framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/ framework/modules/geronimo-deployment/src/test/java/org/apache/geronimo/deployment/ plugins/ plugins/axis/geronim...

Author: gawor
Date: Sat Jan 23 23:28:10 2010
New Revision: 902507

URL: http://svn.apache.org/viewvc?rev=902507&view=rev
Log:
GERONIMO-5030: Initial refactoring of some of the module deployment code to support deployment of Bundles. Also, implemented rfc66 extender that can actually deploy WABs with simple servlets and jsps.

Added:
    geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/BundleResourceContext.java   (with props)
    geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/ClassPathUtils.java   (with props)
    geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/Deployable.java   (with props)
    geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/DeployableBundle.java   (with props)
    geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/DeployableJarFile.java   (with props)
    geronimo/server/trunk/plugins/wab/TODO
    geronimo/server/trunk/plugins/wab/web-jetty-server/
    geronimo/server/trunk/plugins/wab/web-jetty-server/pom.xml   (with props)
    geronimo/server/trunk/plugins/wab/web-tomcat-server/
    geronimo/server/trunk/plugins/wab/web-tomcat-server/pom.xml   (with props)
Modified:
    geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/DeploymentContext.java
    geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/ResourceContext.java
    geronimo/server/trunk/framework/modules/geronimo-deployment/src/test/java/org/apache/geronimo/deployment/DeploymentContextTest.java
    geronimo/server/trunk/plugins/   (props changed)
    geronimo/server/trunk/plugins/axis/geronimo-axis-builder/src/main/java/org/apache/geronimo/axis/builder/AxisModuleBuilderExtension.java
    geronimo/server/trunk/plugins/client/geronimo-client-builder/src/main/java/org/apache/geronimo/client/builder/AppClientModuleBuilder.java
    geronimo/server/trunk/plugins/connector-1_6/geronimo-connector-builder-1_6/src/main/java/org/apache/geronimo/connector/deployment/ConnectorModuleBuilder.java
    geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/EARContext.java
    geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/Module.java
    geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/ModuleBuilder.java
    geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/ModuleBuilderExtension.java
    geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/SwitchingModuleBuilder.java
    geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/UnavailableModuleBuilder.java
    geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/WebModule.java
    geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/test/java/org/apache/geronimo/j2ee/deployment/EARConfigBuilder13NakedTest.java
    geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/test/java/org/apache/geronimo/j2ee/deployment/EARConfigBuilder13Test.java
    geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/test/java/org/apache/geronimo/j2ee/deployment/EARConfigBuilder14AltDDTest.java
    geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/test/java/org/apache/geronimo/j2ee/deployment/EARConfigBuilder14AltDDUnpackedTest.java
    geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/test/java/org/apache/geronimo/j2ee/deployment/EARConfigBuilder14NakedTest.java
    geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/test/java/org/apache/geronimo/j2ee/deployment/EARConfigBuilder14NakedUnpackedTest.java
    geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/test/java/org/apache/geronimo/j2ee/deployment/EARConfigBuilder14Test.java
    geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/test/java/org/apache/geronimo/j2ee/deployment/EARConfigBuilder14UnpackedTest.java
    geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/test/java/org/apache/geronimo/j2ee/deployment/EARConfigBuilder5AltDDTest.java
    geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/test/java/org/apache/geronimo/j2ee/deployment/EARConfigBuilder5AltDDUnpackedTest.java
    geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/test/java/org/apache/geronimo/j2ee/deployment/EARConfigBuilder5NakedTest.java
    geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/test/java/org/apache/geronimo/j2ee/deployment/EARConfigBuilder5NakedUnpackedTest.java
    geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/test/java/org/apache/geronimo/j2ee/deployment/EARConfigBuilder5Test.java
    geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/test/java/org/apache/geronimo/j2ee/deployment/EARConfigBuilder5UnpackedTest.java
    geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/test/java/org/apache/geronimo/j2ee/deployment/MockConnectorConfigBuilder.java
    geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/test/java/org/apache/geronimo/j2ee/deployment/MockEJBConfigBuilder.java
    geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/test/java/org/apache/geronimo/j2ee/deployment/MockWARConfigBuilder.java
    geronimo/server/trunk/plugins/j2ee/geronimo-naming-builder/src/main/java/org/apache/geronimo/naming/deployment/SwitchingServiceRefBuilder.java
    geronimo/server/trunk/plugins/j2ee/geronimo-security-builder/src/main/java/org/apache/geronimo/security/deployment/GeronimoSecurityBuilderImpl.java
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/main/java/org/apache/geronimo/web25/deployment/AbstractWebModuleBuilder.java
    geronimo/server/trunk/plugins/j2ee/geronimo-web-2.5-builder/src/test/java/org/apache/geronimo/web25/deployment/SchemaConversionTest.java
    geronimo/server/trunk/plugins/jasper/geronimo-jasper-builder/src/main/java/org/apache/geronimo/jasper/deployment/JspModuleBuilderExtension.java
    geronimo/server/trunk/plugins/jaxws/geronimo-jaxws-ejb-builder/src/main/java/org/apache/geronimo/jaxws/ejb/builder/JAXWSEJBModuleBuilderExtension.java
    geronimo/server/trunk/plugins/jetty8/geronimo-jetty8-builder/src/main/java/org/apache/geronimo/jetty8/deployment/JettyModuleBuilder.java
    geronimo/server/trunk/plugins/jetty8/geronimo-jetty8-builder/src/test/java/org/apache/geronimo/jetty8/deployment/PlanParsingTest.java
    geronimo/server/trunk/plugins/myfaces/geronimo-myfaces-builder/src/main/java/org/apache/geronimo/myfaces/deployment/MyFacesModuleBuilderExtension.java
    geronimo/server/trunk/plugins/openejb/geronimo-openejb-builder/src/main/java/org/apache/geronimo/openejb/deployment/EjbModuleBuilder.java
    geronimo/server/trunk/plugins/openejb/geronimo-openejb-clustering-builder-wadi/src/main/java/org/apache/geronimo/openejb/deployment/cluster/WADIOpenEJBClusteringBuilder.java
    geronimo/server/trunk/plugins/openjpa2/geronimo-persistence-jpa20-builder/src/main/java/org/apache/geronimo/persistence/builder/PersistenceUnitBuilder.java
    geronimo/server/trunk/plugins/pom.xml
    geronimo/server/trunk/plugins/tomcat/geronimo-tomcat7-builder/src/main/java/org/apache/geronimo/tomcat/deployment/TomcatModuleBuilder.java
    geronimo/server/trunk/plugins/wab/geronimo-web-extender/pom.xml
    geronimo/server/trunk/plugins/wab/geronimo-web-extender/src/main/java/org/apache/geronimo/osgi/web/WebApplication.java
    geronimo/server/trunk/plugins/wab/geronimo-web-extender/src/main/java/org/apache/geronimo/osgi/web/WebContainerExtender.java
    geronimo/server/trunk/plugins/wab/pom.xml
    geronimo/server/trunk/plugins/wab/web-extender/pom.xml
    geronimo/server/trunk/plugins/wab/web-extender/src/main/history/dependencies.xml
    geronimo/server/trunk/plugins/wab/web-extender/src/main/plan/plan.xml

Added: geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/BundleResourceContext.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/BundleResourceContext.java?rev=902507&view=auto
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/BundleResourceContext.java (added)
+++ geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/BundleResourceContext.java Sat Jan 23 23:28:10 2010
@@ -0,0 +1,66 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You 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.deployment;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URL;
+import java.util.jar.JarFile;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+public class BundleResourceContext implements ResourceContext {
+
+    public void addFile(URI targetPath, ZipFile zipFile, ZipEntry zipEntry) throws IOException {
+    }
+
+    public void addFile(URI targetPath, URL source) throws IOException {
+    }
+
+    public void addFile(URI targetPath, File source) throws IOException {
+    }
+
+    public void addFile(URI targetPath, String source) throws IOException {
+    }
+
+    public void addFile(URI targetPath, byte[] contents) throws IOException {
+    }
+
+    public void addInclude(URI targetPath, ZipFile zipFile, ZipEntry zipEntry) throws IOException {
+    }
+
+    public void addIncludBundleResourceContexte(URI targetPath, URL source) throws IOException {
+    }
+
+    public void addInclude(URI targetPath, File source) throws IOException {
+    }
+
+    public void addInclude(URI targetPath, URL source) throws IOException {
+    }
+    
+    public void addIncludeAsPackedJar(URI targetPath, JarFile jarFile) throws IOException {
+    }
+
+    public void flush() throws IOException {
+    }
+
+    public File getTargetFile(URI targetPath) {
+        throw new RuntimeException("getTargetFile() is not supported on Bundle-based deployment");
+    }
+
+}

Propchange: geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/BundleResourceContext.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/BundleResourceContext.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/BundleResourceContext.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/ClassPathUtils.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/ClassPathUtils.java?rev=902507&view=auto
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/ClassPathUtils.java (added)
+++ geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/ClassPathUtils.java Sat Jan 23 23:28:10 2010
@@ -0,0 +1,298 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.deployment;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.StringTokenizer;
+import java.util.jar.JarFile;
+
+import org.apache.geronimo.common.DeploymentException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class ClassPathUtils {
+    
+    private static final Logger log = LoggerFactory.getLogger(ClassPathUtils.class);
+    
+    // values for lenience vs. strict manifest classpath interpretation
+    private final static int manifestClassLoaderMode;
+    private final static String manifestClassLoaderMessage;
+    private final static int MFCP_LENIENT = 1;
+    private final static int MFCP_STRICT = 2;
+
+    static {
+        // Extract the LenientMFCP value if specified.  If not, default to strict..
+        String mode = System.getProperty("Xorg.apache.geronimo.deployment.LenientMFCP");
+        int mfcpMode = MFCP_STRICT;    // Default to strict
+        String mfcpModeMessage = "Strict Manifest Classpath";
+        if (mode != null) {
+            if (mode.equals("true")) {
+                mfcpMode = MFCP_LENIENT;
+                mfcpModeMessage = "Lenient Manifest Classpath";
+            }
+        }
+
+        manifestClassLoaderMode = mfcpMode;
+        manifestClassLoaderMessage = mfcpModeMessage;
+        LoggerFactory.getLogger(DeploymentContext.class).info(
+                "The " + manifestClassLoaderMessage + " processing mode is in effect.\n" +
+                        "This option can be altered by specifying -DXorg.apache.geronimo.deployment.LenientMFCP=true|false\n" +
+                        "Specify =\"true\" for more lenient processing such as ignoring missing jars and references that are not spec compliant.");
+    }
+    
+    interface JarFileFactory {
+        JarFile newJarFile(URI relativeURI) throws IOException;
+
+        String getManifestClassPath(JarFile jarFile) throws IOException;
+
+        boolean isDirectory(URI relativeURI) throws IOException;
+
+        File[] listFiles(URI relativeURI) throws IOException;
+    }
+    
+    /**
+     * Import the classpath from a jar file's manifest.  The imported classpath
+     * is crafted relative to <code>moduleBaseUri</code>.
+     *
+     * @param moduleFile    the jar file from which the manifest is obtained.
+     * @param moduleBaseUri the base for the imported classpath
+     * @param factory       the factory for constructing JarFiles and the way to extract the manifest classpath from a JarFile. Introduced to make
+     *                      testing plausible, but may be useful for in-IDE deployment.
+     * @param problems      List to save all the problems we encounter.
+     * @throws DeploymentException if there is a problem with the classpath in
+     *                             the manifest
+     */
+    public static void addManifestClassPath(JarFile moduleFile, URI moduleBaseUri, LinkedHashSet<String> classPath, JarFileFactory factory, List<DeploymentException> problems) throws DeploymentException {
+        String manifestClassPath;
+        try {
+            manifestClassPath = factory.getManifestClassPath(moduleFile);
+        } catch (IOException e) {
+            problems.add(new DeploymentException("Could not read manifest: " + moduleBaseUri, e));
+            return;
+        }
+
+        if (manifestClassPath == null) {
+            return;
+        }
+
+        for (StringTokenizer tokenizer = new StringTokenizer(manifestClassPath, " "); tokenizer.hasMoreTokens();) {
+            String path = tokenizer.nextToken();
+
+            URI pathUri;
+            try {
+                pathUri = new URI(path);
+            } catch (URISyntaxException e) {
+                problems.add(new DeploymentException("Invalid manifest classpath entry: module= " + moduleBaseUri + ", path= " + path));
+                continue;
+            }
+
+            if (pathUri.isAbsolute()) {
+                problems.add(new DeploymentException("Manifest class path entries must be relative (J2EE 1.4 Section 8.2): path= " + path + ", module= " + moduleBaseUri));
+                continue;
+            }
+
+            URI targetUri = moduleBaseUri.resolve(pathUri);
+
+            try {
+                if (factory.isDirectory(targetUri)) {
+                    if (!targetUri.getPath().endsWith("/")) {
+                        targetUri = URI.create(targetUri.getPath() + "/");
+                    }
+                    for (File file : factory.listFiles(targetUri)) {
+                        if (file.isDirectory()) {
+                            log.debug("Sub directory [" + file.getAbsolutePath() + "] in the manifest entry directory is ignored");
+                            continue;
+                        }
+                        if (!file.getName().endsWith(".jar")) {
+                            log.debug("Only jar files are added to classpath, file [" + file.getAbsolutePath() + "] is ignored");
+                            continue;
+                        }
+                        classPath.add(targetUri.resolve(file.getName()).getPath());
+                    }
+                } else {
+                    if (!pathUri.getPath().endsWith(".jar")) {
+                        if (manifestClassLoaderMode == MFCP_STRICT) {
+                            problems.add(new DeploymentException(
+                                    "Manifest class path entries must end with the .jar extension (J2EE 1.4 Section 8.2): path= "
+                                            + path + ", module= " + moduleBaseUri));
+                        } else {
+                            log.info("The " + manifestClassLoaderMessage + " processing mode is in effect.\n"
+                                    + "Therefore, a manifest classpath entry which does not end with .jar, "
+                                    + pathUri + " is being permitted and ignored.");
+                        }
+                        continue;
+                    }
+                    classPath.add(targetUri.getPath());
+                }
+            } catch (IOException e) {
+                if (manifestClassLoaderMode == MFCP_STRICT) {
+                    problems.add(new DeploymentException(
+                            "An IOException resulting from manifest classpath : targetUri= " + targetUri, e));
+                } else {
+                    log.info("The " + manifestClassLoaderMessage + " processing mode is in effect.\n"
+                            + "Therefore, an IOException resulting from manifest classpath " + targetUri
+                            + " is being ignored.");
+                }
+            }
+        }
+    }
+    
+    /**
+     * Recursively construct the complete set of paths in the ear for the manifest classpath of the supplied modulefile.
+     * Used only in PersistenceUnitBuilder to figure out if a persistence.xml relates to the starting module.  Having a classloader for
+     * each ejb module would eliminate the need for this and be more elegant.
+     *
+     * @param moduleFile    the module that we start looking at classpaths at, in the car.
+     * @param moduleBaseUri where the moduleFile is inside the car file.  For an (unpacked) war this ends with / which means we also need:
+     * @param resolutionUri the uri to resolve all entries against. For a module such as an ejb jar that is part of the
+     *                      root ear car it is ".".  For a sub-configuration such as a war it is the "reverse" of the path to the war file in the car.
+     *                      For instance, if the war file is foo/bar/myweb.war, the resolutionUri is "../../..".
+     * @param classpath     the classpath list we are constructing.
+     * @param exclusions    the paths to not investigate.  These are typically the other modules in the ear/car file: they will have their contents processed for themselves.
+     * @param factory       the factory for constructing JarFiles and the way to extract the manifest classpath from a JarFile. Introduced to make
+     *                      testing plausible, but may be useful for in-IDE deployment.
+     * @param problems      List to save all the problems we encounter.
+     * @throws org.apache.geronimo.common.DeploymentException
+     *          if something goes wrong.
+     */
+    public static void getCompleteManifestClassPath(JarFile moduleFile, URI moduleBaseUri, URI resolutionUri, ClassPathList classpath, ModuleList exclusions, JarFileFactory factory, List<DeploymentException> problems) throws DeploymentException {
+        String manifestClassPath;
+        try {
+            manifestClassPath = factory.getManifestClassPath(moduleFile);
+        } catch (IOException e) {
+            problems.add(new DeploymentException(printInfo("Could not read manifest: " + moduleBaseUri, moduleBaseUri, classpath, exclusions), e));
+            return;
+        }
+
+        if (manifestClassPath == null) {
+            return;
+        }
+
+        for (StringTokenizer tokenizer = new StringTokenizer(manifestClassPath, " "); tokenizer.hasMoreTokens();) {
+            String path = tokenizer.nextToken();
+
+            URI pathUri;
+            try {
+                pathUri = new URI(path);
+            } catch (URISyntaxException e) {
+                problems.add(new DeploymentException(printInfo("Invalid manifest classpath entry, path= " + path, moduleBaseUri, classpath, exclusions)));
+                continue;
+            }
+
+            if (pathUri.isAbsolute()) {
+                problems.add(new DeploymentException(printInfo("Manifest class path entries must be relative (J2EE 1.4 Section 8.2): path= " + path, moduleBaseUri, classpath, exclusions)));
+                continue;
+            }
+
+            URI targetUri = moduleBaseUri.resolve(pathUri);
+
+            try {
+                if (factory.isDirectory(targetUri)) {
+                    if (!targetUri.getPath().endsWith("/")) {
+                        targetUri = URI.create(targetUri.getPath() + "/");
+                    }
+                    for (File file : factory.listFiles(targetUri)) {
+                        if (file.isDirectory()) {
+                            log.debug("Sub directory [" + file.getAbsolutePath() + "] in the manifest entry directory is ignored");
+                            continue;
+                        }
+                        if (!file.getName().endsWith(".jar")) {
+                            log.debug("Only jar files are added to classpath, file [" + file.getAbsolutePath() + "] is ignored");
+                            continue;
+                        }
+                        addToClassPath(moduleBaseUri, resolutionUri, targetUri.resolve(file.getName()), classpath, exclusions, factory, problems);
+                    }
+                } else {
+                    if (!pathUri.getPath().endsWith(".jar")) {
+                        if (manifestClassLoaderMode == MFCP_STRICT) {
+                            problems.add(new DeploymentException(printInfo(
+                                    "Manifest class path entries must end with the .jar extension (J2EE 1.4 Section 8.2): path= "
+                                            + path, moduleBaseUri, classpath, exclusions)));
+                        } else {
+                            log.info("The " + manifestClassLoaderMessage + " processing mode is in effect.\n"
+                                    + "Therefore, a manifest classpath entry which does not end with .jar, "
+                                    + pathUri + " is being permitted and ignored.");
+                        }
+                        continue;
+                    }
+                    addToClassPath(moduleBaseUri, resolutionUri, targetUri, classpath, exclusions, factory, problems);
+                }
+            } catch (IOException e) {
+                if (manifestClassLoaderMode == MFCP_STRICT) {
+                    problems.add(new DeploymentException(
+                            "An IOException resulting from manifest classpath : targetUri= " + targetUri, e));
+                } else {
+                    log.info("The " + manifestClassLoaderMessage + " processing mode is in effect.\n"
+                            + "Therefore, an IOException resulting from manifest classpath " + targetUri
+                            + " is being ignored.");
+                }
+            }
+        }
+    }
+
+    private static void addToClassPath(URI moduleBaseUri, URI resolutionUri, URI targetUri, ClassPathList classpath, ModuleList exclusions, JarFileFactory factory, List<DeploymentException> problems) throws DeploymentException {
+        String targetEntry = targetUri.toString();
+        if (exclusions.contains(targetEntry)) {
+            return;
+        }
+        URI resolvedUri = resolutionUri.resolve(targetUri);
+        String classpathEntry = resolvedUri.toString();
+        //don't get caught in circular references
+        if (classpath.contains(classpathEntry)) {
+            return;
+        }
+        classpath.add(classpathEntry);
+        JarFile classPathJarFile;
+        try {
+            classPathJarFile = factory.newJarFile(targetUri);
+        } catch (IOException e) {
+            if (manifestClassLoaderMode == MFCP_STRICT) {
+                problems.add(new DeploymentException(
+                        printInfo(
+                                "Manifest class path entries must be a valid jar file, or if it is a directory, all the files with jar suffix in it must be a valid jar file (JAVAEE 5 Section 8.2):  resolved to targetURI= "
+                                        + targetUri, moduleBaseUri, classpath, exclusions), e));
+            } else {
+                log.info("The " + manifestClassLoaderMessage + " processing mode is in effect.\n"
+                        + "Therefore, an IOException resulting from manifest classpath " + targetUri
+                        + " is being ignored.");
+            }
+            return;
+        }
+
+        getCompleteManifestClassPath(classPathJarFile, targetUri, resolutionUri, classpath, exclusions, factory, problems);
+    }
+
+    private static String printInfo(String message, URI moduleBaseUri, ClassPathList classpath, ModuleList exclusions) {
+        StringBuffer buf = new StringBuffer(message).append("\n");
+        buf.append("    looking at: ").append(moduleBaseUri);
+        buf.append("    current classpath: ").append(classpath);
+        buf.append("    ignoring modules: ").append(exclusions);
+        return buf.toString();
+    }
+
+}

Propchange: geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/ClassPathUtils.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/ClassPathUtils.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/ClassPathUtils.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/Deployable.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/Deployable.java?rev=902507&view=auto
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/Deployable.java (added)
+++ geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/Deployable.java Sat Jan 23 23:28:10 2010
@@ -0,0 +1,30 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You 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.deployment;
+
+import java.net.URL;
+
+/**
+ * @version $Rev:386276 $ $Date$
+ */
+public interface Deployable {
+    
+    URL getResource(String name);
+        
+    void close();
+    
+}

Propchange: geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/Deployable.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/Deployable.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/Deployable.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/DeployableBundle.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/DeployableBundle.java?rev=902507&view=auto
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/DeployableBundle.java (added)
+++ geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/DeployableBundle.java Sat Jan 23 23:28:10 2010
@@ -0,0 +1,46 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You 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.deployment;
+
+import java.net.URL;
+
+import org.osgi.framework.Bundle;
+
+/**
+ * @version $Rev:386276 $ $Date$
+ */
+public class DeployableBundle implements Deployable {
+    
+    private Bundle bundle;
+    
+    public DeployableBundle(Bundle bundle) {
+        this.bundle = bundle;
+    }
+    
+    public URL getResource(String name) {
+        return bundle.getEntry(name);
+    }
+    
+    public void close() {        
+    }
+    
+    public Bundle getBundle() {
+        return bundle;
+    }
+    
+}
+

Propchange: geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/DeployableBundle.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/DeployableBundle.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/DeployableBundle.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/DeployableJarFile.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/DeployableJarFile.java?rev=902507&view=auto
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/DeployableJarFile.java (added)
+++ geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/DeployableJarFile.java Sat Jan 23 23:28:10 2010
@@ -0,0 +1,57 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You 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.deployment;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+
+import org.apache.geronimo.kernel.util.JarUtils;
+
+/**
+ * @version $Rev:386276 $ $Date$
+ */
+public class DeployableJarFile implements Deployable {
+    
+    private JarFile jarFile;
+    
+    public DeployableJarFile(JarFile jarFile) {
+        this.jarFile = jarFile;
+    }
+    
+    public URL getResource(String name) {
+        JarEntry entry = jarFile.getJarEntry(name);
+        if (entry != null) {
+            try {
+                return JarUtils.createJarURL(jarFile, name);
+            } catch (MalformedURLException e) {
+                // ignore
+            }
+        }
+        return null;
+    }
+        
+    public void close() {
+        JarUtils.close(jarFile);
+    }
+    
+    public JarFile getJarFile() {
+        return jarFile;
+    }
+    
+}

Propchange: geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/DeployableJarFile.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/DeployableJarFile.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/DeployableJarFile.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/DeploymentContext.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/DeploymentContext.java?rev=902507&r1=902506&r2=902507&view=diff
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/DeploymentContext.java (original)
+++ geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/DeploymentContext.java Sat Jan 23 23:28:10 2010
@@ -24,7 +24,6 @@
 import java.io.OutputStream;
 import java.io.PrintWriter;
 import java.net.URI;
-import java.net.URISyntaxException;
 import java.net.URL;
 import java.net.URLEncoder;
 import java.util.ArrayList;
@@ -36,7 +35,6 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.StringTokenizer;
 import java.util.jar.Attributes;
 import java.util.jar.JarFile;
 import java.util.zip.ZipEntry;
@@ -62,7 +60,6 @@
 import org.apache.geronimo.kernel.config.ConfigurationModuleType;
 import org.apache.geronimo.kernel.config.Manifest;
 import org.apache.geronimo.kernel.config.ManifestException;
-import org.apache.geronimo.kernel.config.NoSuchConfigException;
 import org.apache.geronimo.kernel.osgi.BundleUtils;
 import org.apache.geronimo.kernel.osgi.ConfigurationActivator;
 import org.apache.geronimo.kernel.repository.Artifact;
@@ -90,32 +87,6 @@
 
     private static final Logger log = LoggerFactory.getLogger(DeploymentContext.class);
 
-    // values for lenience vs. strict manifest classpath interpretation
-    private final static int manifestClassLoaderMode;
-    private final static String manifestClassLoaderMessage;
-    private final static int MFCP_LENIENT = 1;
-    private final static int MFCP_STRICT = 2;
-
-    static {
-        // Extract the LenientMFCP value if specified.  If not, default to strict..
-        String mode = System.getProperty("Xorg.apache.geronimo.deployment.LenientMFCP");
-        int mfcpMode = MFCP_STRICT;    // Default to strict
-        String mfcpModeMessage = "Strict Manifest Classpath";
-        if (mode != null) {
-            if (mode.equals("true")) {
-                mfcpMode = MFCP_LENIENT;
-                mfcpModeMessage = "Lenient Manifest Classpath";
-            }
-        }
-
-        manifestClassLoaderMode = mfcpMode;
-        manifestClassLoaderMessage = mfcpModeMessage;
-        LoggerFactory.getLogger(DeploymentContext.class).info(
-                "The " + manifestClassLoaderMessage + " processing mode is in effect.\n" +
-                        "This option can be altered by specifying -DXorg.apache.geronimo.deployment.LenientMFCP=true|false\n" +
-                        "Specify =\"true\" for more lenient processing such as ignoring missing jars and references that are not spec compliant.");
-    }
-
     protected final File baseDir;
     protected final File inPlaceConfigurationDir;
     protected final ResourceContext resourceContext;
@@ -131,8 +102,6 @@
     //It should be a disposable nested framework so as to not pollute the main framework with stuff we load as deployment parents.
     private final BundleContext bundleContext;
     protected Configuration configuration;
-    //TODO OSGI set this
-    private boolean boot;
     private Bundle tempBundle;
 
 
@@ -140,36 +109,42 @@
         this(baseDir, inPlaceConfigurationDir, environment, moduleName, moduleType, naming, createConfigurationManager(configurationManager, repositories, bundleContext), bundleContext);
     }
 
-    public DeploymentContext(File baseDir, File inPlaceConfigurationDir, Environment environment, AbstractName moduleName, ConfigurationModuleType moduleType, Naming naming, ConfigurationManager configurationManager, BundleContext bundleContext) throws DeploymentException {
-        if (baseDir == null) throw new NullPointerException("baseDir is null");
+    public DeploymentContext(File baseDir, File inPlaceConfigurationDir, Environment environment, AbstractName moduleName, ConfigurationModuleType moduleType, Naming naming, ConfigurationManager configurationManager, BundleContext bundleContext) throws DeploymentException {        
         if (environment == null) throw new NullPointerException("environment is null");
         if (moduleType == null) throw new NullPointerException("type is null");
         if (configurationManager == null) throw new NullPointerException("configurationManager is null");
-
-        if (!baseDir.exists() && !baseDir.mkdirs()) {
-            throw new DeploymentException("Could not create directory for deployment context assembly: " + baseDir);
-        }
-        this.baseDir = baseDir;
-
+        
+        this.baseDir = baseDir; 
         this.inPlaceConfigurationDir = inPlaceConfigurationDir;
-
         this.moduleName = moduleName;
-
         this.naming = naming;
         this.moduleType = moduleType;
         this.environment = environment;
-
-
         this.configurationManager = configurationManager;
+        this.bundleContext = bundleContext;
+
+        verifyArguments();
+        
+        this.resourceContext = createResourceContext();
+    }
 
+    protected void verifyArguments() throws DeploymentException {
+        if (baseDir == null) {
+            throw new NullPointerException("baseDir is null");
+        }        
+        if (!baseDir.exists() && !baseDir.mkdirs()) {
+            throw new DeploymentException("Could not create directory for deployment context assembly: " + baseDir);
+        }
+    }
+    
+    protected ResourceContext createResourceContext() throws DeploymentException {
         if (null == inPlaceConfigurationDir) {
-            resourceContext = new CopyResourceContext(this, baseDir);
+            return new CopyResourceContext(this, baseDir);
         } else {
-            resourceContext = new InPlaceResourceContext(this, inPlaceConfigurationDir);
+            return new InPlaceResourceContext(this, inPlaceConfigurationDir);
         }
-        this.bundleContext = bundleContext;
     }
-
+    
     private static ConfigurationManager createConfigurationManager(ConfigurationManager configurationManager, Collection<Repository> repositories, BundleContext bundleContext) {
         return new DeploymentConfigurationManager(configurationManager, repositories, bundleContext);
     }
@@ -186,29 +161,6 @@
         LinkedHashSet<Artifact> resolvedParentIds = null;
         try {
             ConfigurationData configurationData = new ConfigurationData(moduleType, null, childConfigurationDatas, environment, baseDir, inPlaceConfigurationDir, naming);
-//            ConfigurationResolver configurationResolver = configurationManager.newConfigurationResolver(configurationData);
-//            List<URL> urls = new ArrayList<URL>();
-//            for (String path: classPath) {
-//                urls.addAll(configurationResolver.resolve(path));
-//            }
-//            List<Bundle> parents = new ArrayList<Bundle>();
-//             resolvedParentIds = configurationManager.resolveParentIds(configurationData);
-//            for (Artifact artifact: resolvedParentIds) {
-//                configurationManager.loadConfiguration(artifact);
-//                Bundle bundle = configurationManager.getBundle(artifact);
-//                if (bundle.getSymbolicName() != null) {
-//                    parents.add(bundle);
-//                }
-//            }
-////            URL[] urls = new URL[0];//TODO crib code from ConfigurationResolver
-////            Bundle[] parents = new Bundle[] {bundleContext.getBundle()}; //TODO this is the "no parents" case, normally use ConfigurationManager to turn parent artifactIds into bundles
-//            ClassLoadingRules classLoadingRules = new ClassLoadingRules();
-//            BundleContext bundleContext = new DeploymentBundleContext(this.bundleContext,
-//                    baseDir.getAbsolutePath(),
-//                    environment.getConfigId(),
-//                    urls.toArray(new URL[urls.size()]),
-//                    parents.toArray(new Bundle[parents.size()]),
-//                    classLoadingRules);
             File tempBundleFile = FileUtils.createTempFile();
             createTempManifest();
             createTempPluginMetadata();
@@ -429,17 +381,7 @@
         resourceContext.addInclude(targetPath, source);
     }
 
-    interface JarFileFactory {
-        JarFile newJarFile(URI relativeURI) throws IOException;
-
-        String getManifestClassPath(JarFile jarFile) throws IOException;
-
-        boolean isDirectory(URI relativeURI) throws IOException;
-
-        File[] listFiles(URI relativeURI) throws IOException;
-    }
-
-    private class DefaultJarFileFactory implements JarFileFactory {
+    private class DefaultJarFileFactory implements ClassPathUtils.JarFileFactory {
 
         public JarFile newJarFile(URI relativeURI) throws IOException {
             File targetFile = getTargetFile(relativeURI);
@@ -474,9 +416,13 @@
         }
     }
 
-    public void getCompleteManifestClassPath(JarFile moduleFile, URI moduleBaseUri, URI resolutionUri, ClassPathList classpath, ModuleList exclusions) throws DeploymentException {
+    public void getCompleteManifestClassPath(Deployable deployable, URI moduleBaseUri, URI resolutionUri, ClassPathList classpath, ModuleList exclusions) throws DeploymentException {
+        if (!(deployable instanceof DeployableJarFile)) {
+            throw new IllegalArgumentException("Expected DeployableJarFile");
+        }
+        JarFile moduleFile = ((DeployableJarFile) deployable).getJarFile();
         List<DeploymentException> problems = new ArrayList<DeploymentException>();
-        getCompleteManifestClassPath(moduleFile, moduleBaseUri, resolutionUri, classpath, exclusions, new DefaultJarFileFactory(), problems);
+        ClassPathUtils.getCompleteManifestClassPath(moduleFile, moduleBaseUri, resolutionUri, classpath, exclusions, new DefaultJarFileFactory(), problems);
         if (!problems.isEmpty()) {
             if (problems.size() == 1) {
                 throw problems.get(0);
@@ -485,142 +431,10 @@
         }
     }
 
-    /**
-     * Recursively construct the complete set of paths in the ear for the manifest classpath of the supplied modulefile.
-     * Used only in PersistenceUnitBuilder to figure out if a persistence.xml relates to the starting module.  Having a classloader for
-     * each ejb module would eliminate the need for this and be more elegant.
-     *
-     * @param moduleFile    the module that we start looking at classpaths at, in the car.
-     * @param moduleBaseUri where the moduleFile is inside the car file.  For an (unpacked) war this ends with / which means we also need:
-     * @param resolutionUri the uri to resolve all entries against. For a module such as an ejb jar that is part of the
-     *                      root ear car it is ".".  For a sub-configuration such as a war it is the "reverse" of the path to the war file in the car.
-     *                      For instance, if the war file is foo/bar/myweb.war, the resolutionUri is "../../..".
-     * @param classpath     the classpath list we are constructing.
-     * @param exclusions    the paths to not investigate.  These are typically the other modules in the ear/car file: they will have their contents processed for themselves.
-     * @param factory       the factory for constructing JarFiles and the way to extract the manifest classpath from a JarFile. Introduced to make
-     *                      testing plausible, but may be useful for in-IDE deployment.
-     * @param problems      List to save all the problems we encounter.
-     * @throws org.apache.geronimo.common.DeploymentException
-     *          if something goes wrong.
-     */
-    public void getCompleteManifestClassPath(JarFile moduleFile, URI moduleBaseUri, URI resolutionUri, ClassPathList classpath, ModuleList exclusions, JarFileFactory factory, List<DeploymentException> problems) throws DeploymentException {
-        String manifestClassPath;
-        try {
-            manifestClassPath = factory.getManifestClassPath(moduleFile);
-        } catch (IOException e) {
-            problems.add(new DeploymentException(printInfo("Could not read manifest: " + moduleBaseUri, moduleBaseUri, classpath, exclusions), e));
-            return;
-        }
-
-        if (manifestClassPath == null) {
-            return;
-        }
-
-        for (StringTokenizer tokenizer = new StringTokenizer(manifestClassPath, " "); tokenizer.hasMoreTokens();) {
-            String path = tokenizer.nextToken();
-
-            URI pathUri;
-            try {
-                pathUri = new URI(path);
-            } catch (URISyntaxException e) {
-                problems.add(new DeploymentException(printInfo("Invalid manifest classpath entry, path= " + path, moduleBaseUri, classpath, exclusions)));
-                continue;
-            }
-
-            if (pathUri.isAbsolute()) {
-                problems.add(new DeploymentException(printInfo("Manifest class path entries must be relative (J2EE 1.4 Section 8.2): path= " + path, moduleBaseUri, classpath, exclusions)));
-                continue;
-            }
-
-            URI targetUri = moduleBaseUri.resolve(pathUri);
-
-            try {
-                if (factory.isDirectory(targetUri)) {
-                    if (!targetUri.getPath().endsWith("/")) {
-                        targetUri = URI.create(targetUri.getPath() + "/");
-                    }
-                    for (File file : factory.listFiles(targetUri)) {
-                        if (file.isDirectory()) {
-                            log.debug("Sub directory [" + file.getAbsolutePath() + "] in the manifest entry directory is ignored");
-                            continue;
-                        }
-                        if (!file.getName().endsWith(".jar")) {
-                            log.debug("Only jar files are added to classpath, file [" + file.getAbsolutePath() + "] is ignored");
-                            continue;
-                        }
-                        addToClassPath(moduleBaseUri, resolutionUri, targetUri.resolve(file.getName()), classpath, exclusions, factory, problems);
-                    }
-                } else {
-                    if (!pathUri.getPath().endsWith(".jar")) {
-                        if (manifestClassLoaderMode == MFCP_STRICT) {
-                            problems.add(new DeploymentException(printInfo(
-                                    "Manifest class path entries must end with the .jar extension (J2EE 1.4 Section 8.2): path= "
-                                            + path, moduleBaseUri, classpath, exclusions)));
-                        } else {
-                            log.info("The " + manifestClassLoaderMessage + " processing mode is in effect.\n"
-                                    + "Therefore, a manifest classpath entry which does not end with .jar, "
-                                    + pathUri + " is being permitted and ignored.");
-                        }
-                        continue;
-                    }
-                    addToClassPath(moduleBaseUri, resolutionUri, targetUri, classpath, exclusions, factory, problems);
-                }
-            } catch (IOException e) {
-                if (manifestClassLoaderMode == MFCP_STRICT) {
-                    problems.add(new DeploymentException(
-                            "An IOException resulting from manifest classpath : targetUri= " + targetUri, e));
-                } else {
-                    log.info("The " + manifestClassLoaderMessage + " processing mode is in effect.\n"
-                            + "Therefore, an IOException resulting from manifest classpath " + targetUri
-                            + " is being ignored.");
-                }
-            }
-        }
-    }
-
-    private void addToClassPath(URI moduleBaseUri, URI resolutionUri, URI targetUri, ClassPathList classpath, ModuleList exclusions, JarFileFactory factory, List<DeploymentException> problems) throws DeploymentException {
-        String targetEntry = targetUri.toString();
-        if (exclusions.contains(targetEntry)) {
-            return;
-        }
-        URI resolvedUri = resolutionUri.resolve(targetUri);
-        String classpathEntry = resolvedUri.toString();
-        //don't get caught in circular references
-        if (classpath.contains(classpathEntry)) {
-            return;
-        }
-        classpath.add(classpathEntry);
-        JarFile classPathJarFile;
-        try {
-            classPathJarFile = factory.newJarFile(targetUri);
-        } catch (IOException e) {
-            if (manifestClassLoaderMode == MFCP_STRICT) {
-                problems.add(new DeploymentException(
-                        printInfo(
-                                "Manifest class path entries must be a valid jar file, or if it is a directory, all the files with jar suffix in it must be a valid jar file (JAVAEE 5 Section 8.2):  resolved to targetURI= "
-                                        + targetUri, moduleBaseUri, classpath, exclusions), e));
-            } else {
-                log.info("The " + manifestClassLoaderMessage + " processing mode is in effect.\n"
-                        + "Therefore, an IOException resulting from manifest classpath " + targetUri
-                        + " is being ignored.");
-            }
-            return;
-        }
-
-        getCompleteManifestClassPath(classPathJarFile, targetUri, resolutionUri, classpath, exclusions, factory, problems);
-    }
-
-    private String printInfo(String message, URI moduleBaseUri, ClassPathList classpath, ModuleList exclusions) {
-        StringBuffer buf = new StringBuffer(message).append("\n");
-        buf.append("    looking at: ").append(moduleBaseUri);
-        buf.append("    current classpath: ").append(classpath);
-        buf.append("    ignoring modules: ").append(exclusions);
-        return buf.toString();
-    }
-
+ 
     public void addManifestClassPath(JarFile moduleFile, URI moduleBaseUri) throws DeploymentException {
         List<DeploymentException> problems = new ArrayList<DeploymentException>();
-        addManifestClassPath(moduleFile, moduleBaseUri, new DefaultJarFileFactory(), problems);
+        ClassPathUtils.addManifestClassPath(moduleFile, moduleBaseUri, classPath, new DefaultJarFileFactory(), problems);
         if (!problems.isEmpty()) {
             if (problems.size() == 1) {
                 throw problems.get(0);
@@ -629,105 +443,10 @@
         }
     }
 
-    /**
-     * Import the classpath from a jar file's manifest.  The imported classpath
-     * is crafted relative to <code>moduleBaseUri</code>.
-     *
-     * @param moduleFile    the jar file from which the manifest is obtained.
-     * @param moduleBaseUri the base for the imported classpath
-     * @param factory       the factory for constructing JarFiles and the way to extract the manifest classpath from a JarFile. Introduced to make
-     *                      testing plausible, but may be useful for in-IDE deployment.
-     * @param problems      List to save all the problems we encounter.
-     * @throws DeploymentException if there is a problem with the classpath in
-     *                             the manifest
-     */
-    public void addManifestClassPath(JarFile moduleFile, URI moduleBaseUri, JarFileFactory factory, List<DeploymentException> problems) throws DeploymentException {
-        String manifestClassPath;
-        try {
-            manifestClassPath = factory.getManifestClassPath(moduleFile);
-        } catch (IOException e) {
-            problems.add(new DeploymentException("Could not read manifest: " + moduleBaseUri, e));
-            return;
-        }
-
-        if (manifestClassPath == null) {
-            return;
-        }
-
-        for (StringTokenizer tokenizer = new StringTokenizer(manifestClassPath, " "); tokenizer.hasMoreTokens();) {
-            String path = tokenizer.nextToken();
-
-            URI pathUri;
-            try {
-                pathUri = new URI(path);
-            } catch (URISyntaxException e) {
-                problems.add(new DeploymentException("Invalid manifest classpath entry: module= " + moduleBaseUri + ", path= " + path));
-                continue;
-            }
-
-            if (pathUri.isAbsolute()) {
-                problems.add(new DeploymentException("Manifest class path entries must be relative (J2EE 1.4 Section 8.2): path= " + path + ", module= " + moduleBaseUri));
-                continue;
-            }
-
-            URI targetUri = moduleBaseUri.resolve(pathUri);
-
-            try {
-                if (factory.isDirectory(targetUri)) {
-                    if (!targetUri.getPath().endsWith("/")) {
-                        targetUri = URI.create(targetUri.getPath() + "/");
-                    }
-                    for (File file : factory.listFiles(targetUri)) {
-                        if (file.isDirectory()) {
-                            log.debug("Sub directory [" + file.getAbsolutePath() + "] in the manifest entry directory is ignored");
-                            continue;
-                        }
-                        if (!file.getName().endsWith(".jar")) {
-                            log.debug("Only jar files are added to classpath, file [" + file.getAbsolutePath() + "] is ignored");
-                            continue;
-                        }
-                        addToClassPath(targetUri.resolve(file.getName()));
-                    }
-                } else {
-                    if (!pathUri.getPath().endsWith(".jar")) {
-                        if (manifestClassLoaderMode == MFCP_STRICT) {
-                            problems.add(new DeploymentException(
-                                    "Manifest class path entries must end with the .jar extension (J2EE 1.4 Section 8.2): path= "
-                                            + path + ", module= " + moduleBaseUri));
-                        } else {
-                            log.info("The " + manifestClassLoaderMessage + " processing mode is in effect.\n"
-                                    + "Therefore, a manifest classpath entry which does not end with .jar, "
-                                    + pathUri + " is being permitted and ignored.");
-                        }
-                        continue;
-                    }
-                    addToClassPath(targetUri);
-                }
-            } catch (IOException e) {
-                if (manifestClassLoaderMode == MFCP_STRICT) {
-                    problems.add(new DeploymentException(
-                            "An IOException resulting from manifest classpath : targetUri= " + targetUri, e));
-                } else {
-                    log.info("The " + manifestClassLoaderMessage + " processing mode is in effect.\n"
-                            + "Therefore, an IOException resulting from manifest classpath " + targetUri
-                            + " is being ignored.");
-                }
-            }
-        }
-    }
-
     public void addToClassPath(String target) {
         classPath.add(target);
     }
 
-    private void addToClassPath(URI targetUri) throws DeploymentException {
-        classPath.add(targetUri.getPath());
-//        String classFileName = fqcn.replace('.', '/') + ".class";
-//        resourceContext.addFile(new URI(targetPath.toString() + classFileName), bytes);
-//
-//        configuration.addToClassPath(targetPath.toString());
-    }
-
     public void addFile(URI targetPath, ZipFile zipFile, ZipEntry zipEntry) throws IOException {
         resourceContext.addFile(targetPath, zipFile, zipEntry);
     }
@@ -768,7 +487,6 @@
     public void close() throws IOException, DeploymentException {
         if (configurationManager != null && configuration != null) {
             try {
-                //TODO OSGI make sure this unloads the bundle from the framework
                 configurationManager.unloadConfiguration(configuration.getId());
             } catch (Exception ignored) {
             }

Modified: geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/ResourceContext.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/ResourceContext.java?rev=902507&r1=902506&r2=902507&view=diff
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/ResourceContext.java (original)
+++ geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/ResourceContext.java Sat Jan 23 23:28:10 2010
@@ -24,7 +24,7 @@
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
 
-interface ResourceContext {
+public interface ResourceContext {
     void addIncludeAsPackedJar(URI targetPath, JarFile jarFile) throws IOException;
 
     void addInclude(URI targetPath, ZipFile zipFile, ZipEntry zipEntry) throws IOException;

Modified: geronimo/server/trunk/framework/modules/geronimo-deployment/src/test/java/org/apache/geronimo/deployment/DeploymentContextTest.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-deployment/src/test/java/org/apache/geronimo/deployment/DeploymentContextTest.java?rev=902507&r1=902506&r2=902507&view=diff
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-deployment/src/test/java/org/apache/geronimo/deployment/DeploymentContextTest.java (original)
+++ geronimo/server/trunk/framework/modules/geronimo-deployment/src/test/java/org/apache/geronimo/deployment/DeploymentContextTest.java Sat Jan 23 23:28:10 2010
@@ -119,7 +119,7 @@
         }
     }
 
-    static class MockJarFileFactory implements DeploymentContext.JarFileFactory {
+    static class MockJarFileFactory implements ClassPathUtils.JarFileFactory {
 
         private final Map<URI, String> data;
 
@@ -160,10 +160,10 @@
         Map<URI, String> data = new HashMap<URI, String>();
         data.put(URI.create("lib1.jar"), "lib1.jar lib2.jar");
 
-        DeploymentContext.JarFileFactory factory = new MockJarFileFactory(data);
+        ClassPathUtils.JarFileFactory factory = new MockJarFileFactory(data);
         DeploymentContext context = new DeploymentContext(new File("."), null, new Environment(Artifact.create("test/foo/1/ear")), new AbstractName(URI.create("test/foo/1/ear?name=test")), ConfigurationModuleType.EAR, new Jsr77Naming(), new MockConfigurationManager(), bundleContext);
         ClassPathList classPathList = new ClassPathList();
-        context.getCompleteManifestClassPath(start, start.getRelativeURI(), resolutionURI, classPathList, exclusions, factory, new ArrayList<DeploymentException>());
+        ClassPathUtils.getCompleteManifestClassPath(start, start.getRelativeURI(), resolutionURI, classPathList, exclusions, factory, new ArrayList<DeploymentException>());
         assertEquals(2, classPathList.size());
     }
 
@@ -176,10 +176,10 @@
         data.put(URI.create("lib2/lib2.jar"), "lib2a.jar");
         data.put(URI.create("lib2/lib2a.jar"), "../lib3.jar ../lib1/lib1/lib1.jar");
 
-        DeploymentContext.JarFileFactory factory = new MockJarFileFactory(data);
+        ClassPathUtils.JarFileFactory factory = new MockJarFileFactory(data);
         DeploymentContext context = new DeploymentContext(new File("."), null, new Environment(Artifact.create("test/foo/1/ear")), new AbstractName(URI.create("test/foo/1/ear?name=test")), ConfigurationModuleType.EAR, new Jsr77Naming(), new MockConfigurationManager(), bundleContext);
         ClassPathList classPathList = new ClassPathList();
-        context.getCompleteManifestClassPath(start, start.getRelativeURI(), resolutionURI, classPathList, exclusions, factory, new ArrayList<DeploymentException>());
+        ClassPathUtils.getCompleteManifestClassPath(start, start.getRelativeURI(), resolutionURI, classPathList, exclusions, factory, new ArrayList<DeploymentException>());
         assertEquals(4, classPathList.size());
         assertEquals("lib1/lib1/lib1.jar", classPathList.get(0));
         assertEquals("lib2/lib2.jar", classPathList.get(1));
@@ -198,10 +198,10 @@
         data.put(URI.create("libfolder/a.jar"), "");
         data.put(URI.create("libfolder/b.jar"), "");
 
-        DeploymentContext.JarFileFactory factory = new MockJarFileFactory(data);
+        ClassPathUtils.JarFileFactory factory = new MockJarFileFactory(data);
         DeploymentContext context = new DeploymentContext(new File("."), null, new Environment(Artifact.create("test/foo/1/ear")), new AbstractName(URI.create("test/foo/1/ear?name=test")), ConfigurationModuleType.EAR, new Jsr77Naming(), new MockConfigurationManager(), bundleContext);
         ClassPathList classPathList = new ClassPathList();
-        context.getCompleteManifestClassPath(start, start.getRelativeURI(), resolutionURI, classPathList, exclusions, factory, new ArrayList<DeploymentException>());
+        ClassPathUtils.getCompleteManifestClassPath(start, start.getRelativeURI(), resolutionURI, classPathList, exclusions, factory, new ArrayList<DeploymentException>());
         assertEquals(6, classPathList.size());
         assertEquals("lib1/lib1/lib1.jar", classPathList.get(0));
         assertEquals("lib2/lib2.jar", classPathList.get(1));
@@ -219,10 +219,10 @@
         Map<URI, String> data = new HashMap<URI, String>();
         data.put(URI.create("lib1.jar"), "lib1.jar lib2.jar");
 
-        DeploymentContext.JarFileFactory factory = new MockJarFileFactory(data);
+        ClassPathUtils.JarFileFactory factory = new MockJarFileFactory(data);
         DeploymentContext context = new DeploymentContext(new File("."), null, new Environment(Artifact.create("test/foo/1/ear")), new AbstractName(URI.create("test/foo/1/ear?name=test")), ConfigurationModuleType.EAR, new Jsr77Naming(), new MockConfigurationManager(), bundleContext);
         ClassPathList classPathList = new ClassPathList();
-        context.getCompleteManifestClassPath(start, start.getRelativeURI(), resolutionURI, classPathList, exclusions, factory, new ArrayList<DeploymentException>());
+        ClassPathUtils.getCompleteManifestClassPath(start, start.getRelativeURI(), resolutionURI, classPathList, exclusions, factory, new ArrayList<DeploymentException>());
         assertEquals(2, classPathList.size());
         assertEquals("../lib1.jar", classPathList.get(0));
         assertEquals("../lib2.jar", classPathList.get(1));
@@ -238,10 +238,10 @@
         data.put(URI.create("lib2/lib2/lib2.jar"), "../lib2a/lib2a.jar");
         data.put(URI.create("lib2/lib2a/lib2a.jar"), "../../lib3/lib3/lib3.jar ../../lib1/lib1/lib1.jar");
 
-        DeploymentContext.JarFileFactory factory = new MockJarFileFactory(data);
+        ClassPathUtils.JarFileFactory factory = new MockJarFileFactory(data);
         DeploymentContext context = new DeploymentContext(new File("."), null, new Environment(Artifact.create("test/foo/1/ear")), new AbstractName(URI.create("test/foo/1/ear?name=test")), ConfigurationModuleType.EAR, new Jsr77Naming(), new MockConfigurationManager(), bundleContext);
         ClassPathList classPathList = new ClassPathList();
-        context.getCompleteManifestClassPath(start, start.getRelativeURI(), resolutionURI, classPathList, exclusions, factory, new ArrayList<DeploymentException>());
+        ClassPathUtils.getCompleteManifestClassPath(start, start.getRelativeURI(), resolutionURI, classPathList, exclusions, factory, new ArrayList<DeploymentException>());
         assertEquals(4, classPathList.size());
         assertEquals("../../../lib1/lib1/lib1.jar", classPathList.get(0));
         assertEquals("../../../lib2/lib2/lib2.jar", classPathList.get(1));
@@ -258,10 +258,10 @@
         data.put(URI.create("lib2/lib2.jar"), "lib2a.jar");
         data.put(URI.create("lib2/lib2a.jar"), "../lib3.jar ../lib1/lib1/lib1.jar");
 
-        DeploymentContext.JarFileFactory factory = new MockJarFileFactory(data);
+        ClassPathUtils.JarFileFactory factory = new MockJarFileFactory(data);
         DeploymentContext context = new DeploymentContext(new File("."), null, new Environment(Artifact.create("test/foo/1/ear")), new AbstractName(URI.create("test/foo/1/ear?name=test")), ConfigurationModuleType.EAR, new Jsr77Naming(), new MockConfigurationManager(), bundleContext);
         ClassPathList classPathList = new ClassPathList();
-        context.getCompleteManifestClassPath(start, start.getRelativeURI(), resolutionURI, classPathList, exclusions, factory, new ArrayList<DeploymentException>());
+        ClassPathUtils.getCompleteManifestClassPath(start, start.getRelativeURI(), resolutionURI, classPathList, exclusions, factory, new ArrayList<DeploymentException>());
         assertEquals(4, classPathList.size());
         assertEquals("../../../lib1/lib1/lib1.jar", classPathList.get(0));
         assertEquals("../../../lib2/lib2.jar", classPathList.get(1));
@@ -280,10 +280,10 @@
         data.put(URI.create("lib2.jar"), "ejb2.jar lib1.jar");
         data.put(URI.create("ejb2.jar"), "lib3.jar lib4.jar");
 
-        DeploymentContext.JarFileFactory factory = new MockJarFileFactory(data);
+        ClassPathUtils.JarFileFactory factory = new MockJarFileFactory(data);
         DeploymentContext context = new DeploymentContext(new File("."), null, new Environment(Artifact.create("test/foo/1/ear")), new AbstractName(URI.create("test/foo/1/ear?name=test")), ConfigurationModuleType.EAR, new Jsr77Naming(), new MockConfigurationManager(), bundleContext);
         ClassPathList classPathList = new ClassPathList();
-        context.getCompleteManifestClassPath(start, start.getRelativeURI(), resolutionURI, classPathList, exclusions, factory, new ArrayList<DeploymentException>());
+        ClassPathUtils.getCompleteManifestClassPath(start, start.getRelativeURI(), resolutionURI, classPathList, exclusions, factory, new ArrayList<DeploymentException>());
         assertEquals(2, classPathList.size());
     }
 

Propchange: geronimo/server/trunk/plugins/
------------------------------------------------------------------------------
--- svn:mergeinfo (added)
+++ svn:mergeinfo Sat Jan 23 23:28:10 2010
@@ -0,0 +1,2 @@
+/geronimo/server/branches/2.2/plugins:832538,885058
+/geronimo/server/trunk/plugins/j2ee:887507

Modified: geronimo/server/trunk/plugins/axis/geronimo-axis-builder/src/main/java/org/apache/geronimo/axis/builder/AxisModuleBuilderExtension.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/axis/geronimo-axis-builder/src/main/java/org/apache/geronimo/axis/builder/AxisModuleBuilderExtension.java?rev=902507&r1=902506&r2=902507&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/axis/geronimo-axis-builder/src/main/java/org/apache/geronimo/axis/builder/AxisModuleBuilderExtension.java (original)
+++ geronimo/server/trunk/plugins/axis/geronimo-axis-builder/src/main/java/org/apache/geronimo/axis/builder/AxisModuleBuilderExtension.java Sat Jan 23 23:28:10 2010
@@ -83,6 +83,9 @@
         this.listener = listener;
     }
 
+    public void createModule(Module module, Bundle bundle, Naming naming, ModuleIDBuilder idBuilder) throws DeploymentException {
+    }
+
     @Override
     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 {
         if (module.getType() != ConfigurationModuleType.EJB) {

Modified: geronimo/server/trunk/plugins/client/geronimo-client-builder/src/main/java/org/apache/geronimo/client/builder/AppClientModuleBuilder.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/client/geronimo-client-builder/src/main/java/org/apache/geronimo/client/builder/AppClientModuleBuilder.java?rev=902507&r1=902506&r2=902507&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/client/geronimo-client-builder/src/main/java/org/apache/geronimo/client/builder/AppClientModuleBuilder.java (original)
+++ geronimo/server/trunk/plugins/client/geronimo-client-builder/src/main/java/org/apache/geronimo/client/builder/AppClientModuleBuilder.java Sat Jan 23 23:28:10 2010
@@ -227,6 +227,10 @@
         return (ModuleBuilder) connectorModuleBuilder.getElement();
     }
 
+    public Module createModule(Bundle bundle, Naming naming, ModuleIDBuilder idBuilder) throws DeploymentException {
+        return null;
+    }
+    
     public Module createModule(File plan, JarFile moduleFile, Naming naming, ModuleIDBuilder idBuilder) throws DeploymentException {
         return createModule(plan, moduleFile, "app-client", null, null, null, naming, idBuilder);
     }

Modified: geronimo/server/trunk/plugins/connector-1_6/geronimo-connector-builder-1_6/src/main/java/org/apache/geronimo/connector/deployment/ConnectorModuleBuilder.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/connector-1_6/geronimo-connector-builder-1_6/src/main/java/org/apache/geronimo/connector/deployment/ConnectorModuleBuilder.java?rev=902507&r1=902506&r2=902507&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/connector-1_6/geronimo-connector-builder-1_6/src/main/java/org/apache/geronimo/connector/deployment/ConnectorModuleBuilder.java (original)
+++ geronimo/server/trunk/plugins/connector-1_6/geronimo-connector-builder-1_6/src/main/java/org/apache/geronimo/connector/deployment/ConnectorModuleBuilder.java Sat Jan 23 23:28:10 2010
@@ -205,6 +205,10 @@
         doStop();
     }
 
+    public Module createModule(Bundle bundle, Naming naming, ModuleIDBuilder idBuilder) throws DeploymentException {
+        return null;
+    }
+    
     public Module createModule(File plan, JarFile moduleFile, Naming naming, ModuleIDBuilder idBuilder) throws DeploymentException {
         return createModule(plan, moduleFile, "rar", null, null, null, naming, idBuilder);
     }

Modified: geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/EARContext.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/EARContext.java?rev=902507&r1=902506&r2=902507&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/EARContext.java (original)
+++ geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/EARContext.java Sat Jan 23 23:28:10 2010
@@ -100,28 +100,6 @@
         this.messageDestinations = messageDestinations;
     }
 
-//    public EARContext(File baseDir,
-//                      File inPlaceConfigurationDir,
-//                      Environment environment,
-//                      ConfigurationModuleType moduleType,
-//                      Naming naming,
-//                      ConfigurationManager configurationManager,
-//                      AbstractNameQuery serverName,
-//                      AbstractName baseName,
-//                      AbstractNameQuery transactionManagerObjectName,
-//                      AbstractNameQuery connectionTrackerObjectName,
-//                      AbstractNameQuery corbaGBeanObjectName,
-//                      Map messageDestinations) throws DeploymentException {
-//        super(baseDir, inPlaceConfigurationDir, environment, baseName, moduleType, naming, configurationManager);
-//
-//        this.serverName = serverName;
-//
-//        this.transactionManagerObjectName = transactionManagerObjectName;
-//        this.connectionTrackerObjectName = connectionTrackerObjectName;
-//        this.corbaGBeanObjectName = corbaGBeanObjectName;
-//        this.messageDestinations = messageDestinations;
-//    }
-
     public EARContext(File baseDir, File inPlaceConfigurationDir, Environment environment, ConfigurationModuleType moduleType, AbstractName baseName, EARContext parent) throws DeploymentException {
         super(baseDir, inPlaceConfigurationDir, environment, baseName, moduleType, parent.getNaming(), parent.getConfigurationManager(), parent.getBundleContext());
         this.serverName = parent.getServerName();

Modified: geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/Module.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/Module.java?rev=902507&r1=902506&r2=902507&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/Module.java (original)
+++ geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/Module.java Sat Jan 23 23:28:10 2010
@@ -22,13 +22,14 @@
 import java.util.jar.JarFile;
 
 import org.apache.geronimo.common.DeploymentException;
+import org.apache.geronimo.deployment.Deployable;
+import org.apache.geronimo.deployment.DeployableJarFile;
 import org.apache.geronimo.gbean.AbstractName;
 import org.apache.geronimo.j2ee.deployment.annotation.AnnotatedApp;
 import org.apache.geronimo.kernel.config.ConfigurationData;
 import org.apache.geronimo.kernel.config.ConfigurationModuleType;
 import org.apache.geronimo.kernel.repository.Artifact;
 import org.apache.geronimo.kernel.repository.Environment;
-import org.apache.geronimo.kernel.util.JarUtils;
 import org.apache.xbean.finder.ClassFinder;
 import org.apache.xmlbeans.XmlObject;
 
@@ -42,7 +43,7 @@
     private final String name;
     private final Environment environment;
     private final URI moduleURI;
-    private final JarFile moduleFile;
+    private final Deployable deployable;
     private final String targetPath;
     private final URI targetPathURI;
     private final XmlObject vendorDD;
@@ -58,13 +59,17 @@
     protected final Map sharedContext = new HashMap();
 
     protected Module(boolean standAlone, AbstractName moduleName, Environment environment, JarFile moduleFile, String targetPath, XmlObject specDD, XmlObject vendorDD, String originalSpecDD, String namespace, AnnotatedApp annotatedApp) {
+        this(standAlone, moduleName, environment, new DeployableJarFile(moduleFile), targetPath, specDD, vendorDD, originalSpecDD, namespace, annotatedApp);
+    }
+        
+    protected Module(boolean standAlone, AbstractName moduleName, Environment environment, Deployable deployable, String targetPath, XmlObject specDD, XmlObject vendorDD, String originalSpecDD, String namespace, AnnotatedApp annotatedApp) {
         assert targetPath != null: "targetPath is null";
         assert moduleName != null: "moduleName is null";
 
         this.standAlone = standAlone;
         this.moduleName = moduleName;
         this.environment = environment;
-        this.moduleFile = moduleFile;
+        this.deployable = deployable;
         this.targetPath = targetPath;
         this.specDD = specDD;
         this.vendorDD = vendorDD;
@@ -106,9 +111,17 @@
     }
 
     public JarFile getModuleFile() {
-        return moduleFile;
+        if (deployable instanceof DeployableJarFile) {
+            return ((DeployableJarFile) deployable).getJarFile();
+        } else {
+            throw new RuntimeException("getModuleFile() is not supported on Bundle-based deployment");
+        }      
     }
-
+    
+    public Deployable getDeployable() {
+        return deployable;        
+    }
+    
     public String getTargetPath() {
         return targetPath;
     }
@@ -157,10 +170,9 @@
     }
 
     public void close() {
-        JarUtils.close(moduleFile);
+        deployable.close();
     }
 
-
     public EARContext getEarContext() {
         return earContext;
     }

Modified: geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/ModuleBuilder.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/ModuleBuilder.java?rev=902507&r1=902506&r2=902507&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/ModuleBuilder.java (original)
+++ geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/ModuleBuilder.java Sat Jan 23 23:28:10 2010
@@ -33,6 +33,9 @@
  * @version $Rev:386276 $ $Date$
  */
 public interface ModuleBuilder {
+    
+    Module createModule(Bundle bundle, Naming naming, ModuleIDBuilder idBuilder) throws DeploymentException;
+    
     Module createModule(File plan, JarFile moduleFile, Naming naming, ModuleIDBuilder idBuilder) throws DeploymentException;
 
     Module createModule(Object plan, JarFile moduleFile, String targetPath, URL specDDUrl, Environment environment, Object moduleContextInfo, AbstractName earName, Naming naming, ModuleIDBuilder idBuilder) throws DeploymentException;

Modified: geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/ModuleBuilderExtension.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/ModuleBuilderExtension.java?rev=902507&r1=902506&r2=902507&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/ModuleBuilderExtension.java (original)
+++ geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/ModuleBuilderExtension.java Sat Jan 23 23:28:10 2010
@@ -32,6 +32,9 @@
  * @version $Rev$ $Date$
  */
 public interface ModuleBuilderExtension {
+    
+    void createModule(Module module, Bundle bundle, Naming naming, ModuleIDBuilder idBuilder) throws DeploymentException;
+
     void createModule(Module module, Object plan, JarFile moduleFile, String targetPath, URL specDDUrl, Environment environment, Object moduleContextInfo, AbstractName earName, Naming naming, ModuleIDBuilder idBuilder) throws DeploymentException;
 
     void installModule(JarFile earFile, EARContext earContext, Module module, Collection configurationStores, ConfigurationStore targetConfigurationStore, Collection repository) throws DeploymentException;

Modified: geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/SwitchingModuleBuilder.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/SwitchingModuleBuilder.java?rev=902507&r1=902506&r2=902507&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/SwitchingModuleBuilder.java (original)
+++ geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/SwitchingModuleBuilder.java Sat Jan 23 23:28:10 2010
@@ -83,6 +83,15 @@
         this.defaultNamespace = defaultNamespace;
     }
 
+    public Module createModule(Bundle bundle, Naming naming, ModuleIDBuilder idBuilder) throws DeploymentException {
+        ModuleBuilder builder = getBuilderFromNamespace(null);
+        if (builder != null) {
+            return builder.createModule(bundle, naming, idBuilder);
+        } else {
+            return null;
+        }
+    }
+    
     public Module createModule(File plan, JarFile moduleFile, Naming naming, ModuleIDBuilder idBuilder) throws DeploymentException {
         String namespace;
         if (plan == null) {

Modified: geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/UnavailableModuleBuilder.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/UnavailableModuleBuilder.java?rev=902507&r1=902506&r2=902507&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/UnavailableModuleBuilder.java (original)
+++ geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/main/java/org/apache/geronimo/j2ee/deployment/UnavailableModuleBuilder.java Sat Jan 23 23:28:10 2010
@@ -37,12 +37,16 @@
  */
 public class UnavailableModuleBuilder implements ModuleBuilder {
 
+    public Module createModule(Bundle bundle, Naming naming, ModuleIDBuilder idBuilder) throws DeploymentException {
+        return null;
+    }
+    
     public Module createModule(File plan, JarFile moduleFile, Naming naming, ModuleIDBuilder idBuilder) throws DeploymentException {
-            return null;
+        return null;
     }
 
     public Module createModule(Object plan, JarFile moduleFile, String targetPath, URL specDDUrl, Environment environment, Object moduleContextInfo, AbstractName earName, Naming naming, ModuleIDBuilder idBuilder) throws DeploymentException {
-            return null;
+        return null;
     }
 
     public void installModule(JarFile earFile, EARContext earContext, Module module, Collection configurationStores, ConfigurationStore targetConfigurationStore, Collection repository) throws DeploymentException {