Hi Romain,

I think there is a file missing in this commit. It breaks
"CheckDescriptorLocationTest.java".

[]s,
Thiago.


On Mon, Oct 20, 2014 at 4:24 AM, <[email protected]> wrote:

> Repository: tomee
> Updated Branches:
>   refs/heads/develop 0937a91bd -> 71a997360
>
>
> TOMEE-1418 support tomcat classloader config in openejb (temp) loaders
>
>
> Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
> Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/71a99736
> Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/71a99736
> Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/71a99736
>
> Branch: refs/heads/develop
> Commit: 71a997360230c72fbb208f9b2f3fedf63c4dbf97
> Parents: 0937a91
> Author: Romain Manni-Bucau <[email protected]>
> Authored: Mon Oct 20 10:24:08 2014 +0200
> Committer: Romain Manni-Bucau <[email protected]>
> Committed: Mon Oct 20 10:24:08 2014 +0200
>
> ----------------------------------------------------------------------
>  .../apache/openejb/assembler/DeployerEjb.java   |  2 +-
>  .../org/apache/openejb/config/AppValidator.java |  2 +-
>  .../openejb/config/ConfigurationFactory.java    |  4 +-
>  .../apache/openejb/config/DeploymentLoader.java | 45 +++++++---
>  .../openejb/config/QuickContextXmlParser.java   | 94 --------------------
>  .../tomee/catalina/TomcatWebAppBuilder.java     | 68 +++++++++++++-
>  6 files changed, 105 insertions(+), 110 deletions(-)
> ----------------------------------------------------------------------
>
>
>
> http://git-wip-us.apache.org/repos/asf/tomee/blob/71a99736/container/openejb-core/src/main/java/org/apache/openejb/assembler/DeployerEjb.java
> ----------------------------------------------------------------------
> diff --git
> a/container/openejb-core/src/main/java/org/apache/openejb/assembler/DeployerEjb.java
> b/container/openejb-core/src/main/java/org/apache/openejb/assembler/DeployerEjb.java
> index 871bd06..2939214 100644
> ---
> a/container/openejb-core/src/main/java/org/apache/openejb/assembler/DeployerEjb.java
> +++
> b/container/openejb-core/src/main/java/org/apache/openejb/assembler/DeployerEjb.java
> @@ -184,7 +184,7 @@ public class DeployerEjb implements Deployer {
>          AppInfo appInfo = null;
>
>          try {
> -            appModule = deploymentLoader.load(file);
> +            appModule = deploymentLoader.load(file, null);
>
>              // Add any alternate deployment descriptors to the modules
>              final Map<String, DeploymentModule> modules = new TreeMap<>();
>
>
> http://git-wip-us.apache.org/repos/asf/tomee/blob/71a99736/container/openejb-core/src/main/java/org/apache/openejb/config/AppValidator.java
> ----------------------------------------------------------------------
> diff --git
> a/container/openejb-core/src/main/java/org/apache/openejb/config/AppValidator.java
> b/container/openejb-core/src/main/java/org/apache/openejb/config/AppValidator.java
> index 9f3f552..6cbcd3b 100644
> ---
> a/container/openejb-core/src/main/java/org/apache/openejb/config/AppValidator.java
> +++
> b/container/openejb-core/src/main/java/org/apache/openejb/config/AppValidator.java
> @@ -288,7 +288,7 @@ public class AppValidator {
>              for (final Object obj : line.getArgList()) {
>                  final String module = (String) obj;
>                  final File file = new File(module);
> -                final AppModule appModule = deploymentLoader.load(file);
> +                final AppModule appModule = deploymentLoader.load(file,
> null);
>                  validator.validate(appModule);
>              }
>          } catch (final Exception e) {
>
>
> http://git-wip-us.apache.org/repos/asf/tomee/blob/71a99736/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
> ----------------------------------------------------------------------
> diff --git
> a/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
> b/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
> index fe0287e..7544c15 100644
> ---
> a/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
> +++
> b/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
> @@ -808,7 +808,7 @@ public class ConfigurationFactory implements
> OpenEjbConfigurationFactory {
>          logger.debug("Beginning load: " + jarFile.getAbsolutePath());
>
>          try {
> -            final AppModule appModule = deploymentLoader.load(jarFile);
> +            final AppModule appModule = deploymentLoader.load(jarFile,
> null);
>              final AppInfo appInfo = configureApplication(appModule);
>
>              // TODO This is temporary -- we need to do this in
> AppInfoBuilder
> @@ -869,7 +869,7 @@ public class ConfigurationFactory implements
> OpenEjbConfigurationFactory {
>              logger.info("Beginning load: " + jarFile.getAbsolutePath());
>
>              try {
> -                final AppModule module = deploymentLoader.load(jarFile);
> +                final AppModule module = deploymentLoader.load(jarFile,
> null);
>
>
>  collection.getAdditionalLibraries().addAll(module.getAdditionalLibraries());
>
>  collection.getClientModules().addAll(module.getClientModules());
>
>
> http://git-wip-us.apache.org/repos/asf/tomee/blob/71a99736/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
> ----------------------------------------------------------------------
> diff --git
> a/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
> b/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
> index a9a7d9f..7b1f995 100644
> ---
> a/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
> +++
> b/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
> @@ -111,7 +111,12 @@ public class DeploymentLoader implements
> DeploymentFilterable {
>      private static String ALTDD =
> SystemInstance.get().getOptions().get(OPENEJB_ALTDD_PREFIX, (String) null);
>      private volatile List<URL> containerUrls = null;
>
> -    public AppModule load(final File jarFile) throws OpenEJBException {
> +    /**
> +     * @param jarFile the app file (war, jar, ear)
> +     * @param additionalAppDescriptors potentially some more desriptor,
> used *only* today for context.xml of tomcat
> +     * @return the loaded module
> +     */
> +    public AppModule load(final File jarFile, final ExternalConfiguration
> config) throws OpenEJBException {
>          // verify we have a valid file
>          final String jarPath;
>          try {
> @@ -211,7 +216,7 @@ public class DeploymentLoader implements
> DeploymentFilterable {
>                  final File file = URLs.toFile(baseUrl);
>
>                  // Standalone Web Module
> -                final WebModule webModule =
> createWebModule(file.getAbsolutePath(), baseUrl, getOpenEJBClassLoader(),
> getContextRoot(), getModuleName());
> +                final WebModule webModule =
> createWebModule(file.getAbsolutePath(), baseUrl, getOpenEJBClassLoader(),
> getContextRoot(), getModuleName(), config);
>                  // important to use the webapp classloader here otherwise
> each time we'll check something using loadclass it will fail (=== empty
> classloader)
>                  final AppModule appModule = new
> AppModule(webModule.getClassLoader(), file.getAbsolutePath(), new
> Application(), true);
>                  addWebModule(webModule, appModule);
> @@ -775,12 +780,12 @@ public class DeploymentLoader implements
> DeploymentFilterable {
>          return ejbModule;
>      }
>
> -    private WebModule createWebModule(final String jar, final URL warUrl,
> final ClassLoader parentClassLoader, final String contextRoot, final String
> moduleName) throws OpenEJBException {
> -        return createWebModule(jar, URLs.toFilePath(warUrl),
> parentClassLoader, contextRoot, moduleName);
> +    private WebModule createWebModule(final String jar, final URL warUrl,
> final ClassLoader parentClassLoader, final String contextRoot, final String
> moduleName, final ExternalConfiguration config) throws OpenEJBException {
> +        return createWebModule(jar, URLs.toFilePath(warUrl),
> parentClassLoader, contextRoot, moduleName, config);
>      }
>
>      public void addWebModule(final AppModule appModule, final URL warUrl,
> final ClassLoader parentClassLoader, final String contextRoot, final String
> moduleName) throws OpenEJBException {
> -        final WebModule webModule =
> createWebModule(appModule.getJarLocation(), URLs.toFilePath(warUrl),
> parentClassLoader, contextRoot, moduleName);
> +        final WebModule webModule =
> createWebModule(appModule.getJarLocation(), URLs.toFilePath(warUrl),
> parentClassLoader, contextRoot, moduleName, null);
>          addWebModule(webModule, appModule);
>      }
>
> @@ -894,7 +899,7 @@ public class DeploymentLoader implements
> DeploymentFilterable {
>
>      }
>
> -    public WebModule createWebModule(final String appId, final String
> warPath, final ClassLoader parentClassLoader, final String contextRoot,
> final String moduleName) throws OpenEJBException {
> +    public WebModule createWebModule(final String appId, final String
> warPath, final ClassLoader parentClassLoader, final String contextRoot,
> final String moduleName, final ExternalConfiguration config) throws
> OpenEJBException {
>          File warFile = new File(warPath);
>          if (!warFile.isDirectory()) {
>              warFile = unpack(warFile);
> @@ -989,10 +994,18 @@ public class DeploymentLoader implements
> DeploymentFilterable {
>          webUrls.addAll(addedUrls);
>
>          // context.xml can define some additional libraries
> -        final File contextXml = new File(warFile, "META-INF/context.xml");
> -        if (contextXml.exists()) {
> -            final QuickContextXmlParser parser =
> QuickContextXmlParser.parse(contextXml);
> -            webUrls.addAll(parser.getAdditionalURLs());
> +        if (config != null) { // we don't test all !=null inline to show
> that config will get extra params in the future and that it is hierarchic
> +            if (config.getClasspath() != null) {
> +                final Set<URL> contextXmlUrls = new LinkedHashSet<>();
> +                for (final String location : config.getClasspath()) {
> +                    try {
> +                        webUrls.add(new File(location).toURI().toURL());
> +                    } catch (final MalformedURLException e) {
> +                        throw new IllegalArgumentException(e);
> +                    }
> +                }
> +                webUrls.addAll(contextXmlUrls);
> +            }
>          }
>
>          final ClassLoaderConfigurer configurer =
> QuickJarsTxtParser.parse(new File(warFile, "WEB-INF/" +
> QuickJarsTxtParser.FILE_NAME));
> @@ -2050,4 +2063,16 @@ public class DeploymentLoader implements
> DeploymentFilterable {
>      public static void reloadAltDD() {
>          ALTDD =
> SystemInstance.get().getOptions().get(OPENEJB_ALTDD_PREFIX, (String) null);
>      }
> +
> +    public static class ExternalConfiguration {
> +        private final String[] classpath;
> +
> +        public ExternalConfiguration(final String[] classpath) {
> +            this.classpath = classpath;
> +        }
> +
> +        public String[] getClasspath() {
> +            return classpath;
> +        }
> +    }
>  }
>
>
> http://git-wip-us.apache.org/repos/asf/tomee/blob/71a99736/container/openejb-core/src/main/java/org/apache/openejb/config/QuickContextXmlParser.java
> ----------------------------------------------------------------------
> diff --git
> a/container/openejb-core/src/main/java/org/apache/openejb/config/QuickContextXmlParser.java
> b/container/openejb-core/src/main/java/org/apache/openejb/config/QuickContextXmlParser.java
> deleted file mode 100644
> index 92481f7..0000000
> ---
> a/container/openejb-core/src/main/java/org/apache/openejb/config/QuickContextXmlParser.java
> +++ /dev/null
> @@ -1,94 +0,0 @@
> -/*
> - * 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.openejb.config;
> -
> -import org.apache.openejb.loader.ProvisioningUtil;
> -import org.apache.openejb.util.PropertyPlaceHolderHelper;
> -import org.xml.sax.Attributes;
> -import org.xml.sax.SAXException;
> -import org.xml.sax.helpers.DefaultHandler;
> -
> -import javax.xml.parsers.SAXParser;
> -import javax.xml.parsers.SAXParserFactory;
> -import java.io.File;
> -import java.net.MalformedURLException;
> -import java.net.URL;
> -import java.util.Collection;
> -import java.util.LinkedHashSet;
> -import java.util.Set;
> -import java.util.StringTokenizer;
> -
> -public class QuickContextXmlParser extends DefaultHandler {
> -    private static final SAXParserFactory FACTORY =
> SAXParserFactory.newInstance();
> -
> -    static {
> -        FACTORY.setNamespaceAware(true);
> -        FACTORY.setValidating(false);
> -    }
> -
> -    private String virtualClasspath = "";
> -
> -    @Override
> -    public void startElement(final String uri, final String localName,
> final String qName, final Attributes attributes) throws SAXException {
> -        if ("Loader".equalsIgnoreCase(localName)) {
> -            final String className = attributes.getValue("className");
> -            if (className != null) {
> -                if
> ("org.apache.catalina.loader.VirtualWebappLoader".equals(className)
> -                    ||
> "org.apache.tomee.catalina.ProvisioningWebappLoader".equals(className)) {
> -                    virtualClasspath =
> attributes.getValue("virtualClasspath");
> -                }
> -            }
> -        }
> -    }
> -
> -    public Collection<URL> getAdditionalURLs() {
> -        final Set<URL> set = new LinkedHashSet<>();
> -
> -        if (virtualClasspath != null) {
> -            final StringTokenizer tkn = new
> StringTokenizer(virtualClasspath, ";");
> -            while (tkn.hasMoreTokens()) {
> -                final String token = tkn.nextToken().trim();
> -                if (token.isEmpty()) {
> -                    continue;
> -                }
> -
> -                final Set<String> locations =
> ProvisioningUtil.realLocation(PropertyPlaceHolderHelper.simpleValue(token));
> -                for (final String location : locations) {
> -                    try {
> -                        set.add(new File(location).toURI().toURL());
> -                    } catch (final MalformedURLException e) {
> -                        throw new IllegalArgumentException(e);
> -                    }
> -                }
> -            }
> -        }
> -
> -        return set;
> -    }
> -
> -    public static QuickContextXmlParser parse(final File contextXml) {
> -        final QuickContextXmlParser handler = new QuickContextXmlParser();
> -        try {
> -            final SAXParser parser = FACTORY.newSAXParser();
> -            parser.parse(contextXml, handler);
> -        } catch (final Exception e) {
> -            // no-op: not parseable so ignoring
> -        }
> -        return handler;
> -    }
> -}
>
>
> http://git-wip-us.apache.org/repos/asf/tomee/blob/71a99736/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
> ----------------------------------------------------------------------
> diff --git
> a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
> b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
> index 5fc5856..1f9273d 100644
> ---
> a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
> +++
> b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
> @@ -31,7 +31,9 @@ import org.apache.catalina.Realm;
>  import org.apache.catalina.Service;
>  import org.apache.catalina.UserDatabase;
>  import org.apache.catalina.Valve;
> +import org.apache.catalina.WebResource;
>  import org.apache.catalina.WebResourceRoot;
> +import org.apache.catalina.WebResourceSet;
>  import org.apache.catalina.core.ContainerBase;
>  import org.apache.catalina.core.NamingContextListener;
>  import org.apache.catalina.core.StandardContext;
> @@ -94,6 +96,7 @@ import
> org.apache.openejb.core.ivm.naming.SystemComponentReference;
>  import org.apache.openejb.jee.EnvEntry;
>  import org.apache.openejb.jee.WebApp;
>  import org.apache.openejb.loader.IO;
> +import org.apache.openejb.loader.ProvisioningUtil;
>  import org.apache.openejb.loader.SystemInstance;
>  import org.apache.openejb.server.httpd.BeginWebBeansListener;
>  import org.apache.openejb.server.httpd.EndWebBeansListener;
> @@ -101,7 +104,9 @@ import org.apache.openejb.server.httpd.HttpSession;
>  import org.apache.openejb.spi.ContainerSystem;
>  import org.apache.openejb.util.LogCategory;
>  import org.apache.openejb.util.Logger;
> +import org.apache.openejb.util.URLs;
>  import org.apache.openejb.util.proxy.LocalBeanProxyFactory;
> +import org.apache.openejb.util.reflection.Reflections;
>  import org.apache.tomcat.InstanceManager;
>  import org.apache.tomcat.JarScanFilter;
>  import org.apache.tomcat.util.descriptor.web.ApplicationParameter;
> @@ -155,6 +160,7 @@ import java.util.Collections;
>  import java.util.HashMap;
>  import java.util.HashSet;
>  import java.util.Iterator;
> +import java.util.LinkedList;
>  import java.util.List;
>  import java.util.Map;
>  import java.util.Properties;
> @@ -165,6 +171,7 @@ import java.util.concurrent.atomic.AtomicReference;
>  import java.util.jar.JarEntry;
>  import java.util.jar.JarFile;
>
> +import static java.util.Arrays.asList;
>  import static org.apache.tomee.catalina.Contexts.warPath;
>
>  /**
> @@ -1948,7 +1955,7 @@ public class TomcatWebAppBuilder implements
> WebAppBuilder, ContextListener, Pare
>                      final AppInfo appInfo;
>                      try {
>                          file = file.getCanonicalFile().getAbsoluteFile();
> -                        final AppModule appModule =
> deploymentLoader.load(file);
> +                        final AppModule appModule =
> deploymentLoader.load(file, null);
>
>                          // Ignore any standalone web modules - this
> happens when the app is unpaked and doesn't have a WEB-INF dir
>                          if (appModule.getDeploymentModule().size() == 1
> && appModule.getWebModules().size() == 1) {
> @@ -2056,7 +2063,7 @@ public class TomcatWebAppBuilder implements
> WebAppBuilder, ContextListener, Pare
>          final TomcatDeploymentLoader tomcatDeploymentLoader = new
> TomcatDeploymentLoader(standardContext, id);
>          final AppModule appModule;
>          try {
> -            appModule =
> tomcatDeploymentLoader.load(Contexts.warPath(standardContext));
> +            appModule =
> tomcatDeploymentLoader.load(Contexts.warPath(standardContext),
> configuredClasspath(standardContext));
>          } catch (final OpenEJBException e) {
>              throw new TomEERuntimeException(e);
>          }
> @@ -2067,6 +2074,63 @@ public class TomcatWebAppBuilder implements
> WebAppBuilder, ContextListener, Pare
>          return appModule;
>      }
>
> +    private static DeploymentLoader.ExternalConfiguration
> configuredClasspath(final StandardContext standardContext) {
> +        final Loader loader = standardContext.getLoader();
> +        if (loader != null) {
> +            final ClassLoader cl =
> standardContext.getLoader().getClassLoader();
> +            if (cl == null) {
> +                return null;
> +            }
> +
> +            final Collection<String> cp = new LinkedList<>();
> +
> +            final String name = loader.getClass().getName();
> +            // no more in tomcat 8 but keep it while we maintain t7
> integration
> +            if
> ("org.apache.catalina.loader.VirtualWebappLoader".equals(name)
> +                    ||
> "org.apache.tomee.catalina.ProvisioningWebappLoader".equals(name)) {
> +                final Object virtualClasspath = Reflections.get(loader,
> "virtualClasspath");
> +                if (virtualClasspath != null) {
> +                    for (final String str :
> virtualClasspath.toString().split(";")) {
> +                        cp.addAll(ProvisioningUtil.realLocation(str));
> +                    }
> +                }
> +            } else {
> +                final WebResourceRoot webResources =
> standardContext.getResources();
> +                if (webResources != null) { // to enhance
> +                    for (final WebResourceSet[] sets :
> asList(webResources.getPreResources(), webResources.getPostResources(),
> webResources.getJarResources())) {
> +                        for (final WebResourceSet wr : sets) {
> +                            final URL base = wr.getBaseUrl();
> +                            if (base != null) {
> +                                final File baseFile = URLs.toFile(base);
> +                                if (baseFile.isDirectory()) {
> +                                    final String[] libs =
> wr.list("/WEB-INF/lib/");
> +                                    if (libs != null) {
> +                                        for (final String resource :
> libs) {
> +                                            cp.add(new File(baseFile,
> resource).getAbsolutePath());
> +                                        }
> +                                    }
> +
> +                                    final WebResource classes =
> wr.getResource("/WEB-INF/classes/");
> +                                    if (classes != null) {
> +                                        final String path =
> classes.getCanonicalPath();
> +                                        if (path != null) {
> +                                            cp.add(path);
> +                                        }
> +                                    }
> +                                }
> +                            }
> +                        }
> +                    }
> +                }
> +            }
> +
> +            if (!cp.isEmpty()) {
> +                return new
> DeploymentLoader.ExternalConfiguration(cp.toArray(new String[cp.size()]));
> +            }
> +        }
> +        return null;
> +    }
> +
>      /**
>       * Creates a new {@link WebModule} instance from given
>       * tomcat context instance.
>
>

Reply via email to