Author: rmannibucau Date: Thu Mar 14 22:19:09 2013 New Revision: 1456698 URL: http://svn.apache.org/r1456698 Log: TOMEE-794 using flat file + allowing urls (not only http, mvn, file)
Added: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/QuickJarsTxtParser.java Removed: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/QuickJarsXmlParser.java Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/ClassLoaderUtil.java tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/QuickContextXmlParser.java tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/Files.java tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/ProvisioningUtil.java tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/ProvisioningWebappLoader.java Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/ClassLoaderUtil.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/ClassLoaderUtil.java?rev=1456698&r1=1456697&r2=1456698&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/ClassLoaderUtil.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/ClassLoaderUtil.java Thu Mar 14 22:19:09 2013 @@ -16,10 +16,9 @@ */ package org.apache.openejb; -import org.apache.openejb.assembler.classic.AppInfo; import org.apache.openejb.classloader.ClassLoaderConfigurer; import org.apache.openejb.classloader.CompositeClassLoaderConfigurer; -import org.apache.openejb.config.QuickJarsXmlParser; +import org.apache.openejb.config.QuickJarsTxtParser; import org.apache.openejb.core.TempClassLoader; import org.apache.openejb.loader.SystemInstance; import org.apache.openejb.util.LogCategory; @@ -309,8 +308,8 @@ public class ClassLoaderUtil { } } - final Collection<URL> jarsXmlUrls = QuickJarsXmlParser.parse(new File(appId, "META-INF/" + QuickJarsXmlParser.FILE_NAME)).getAdditionalURLs(); - jarsXmlUrls.addAll(QuickJarsXmlParser.parse(new File(appId, "WEB-INF/" + QuickJarsXmlParser.FILE_NAME)).getAdditionalURLs()); + final Collection<URL> jarsXmlUrls = QuickJarsTxtParser.parse(new File(appId, "META-INF/" + QuickJarsTxtParser.FILE_NAME)); + jarsXmlUrls.addAll(QuickJarsTxtParser.parse(new File(appId, "WEB-INF/" + QuickJarsTxtParser.FILE_NAME))); final URL[] urls; ClassLoaderConfigurer configurer = ClassLoaderUtil.configurer(updatedAppId); Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?rev=1456698&r1=1456697&r2=1456698&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java Thu Mar 14 22:19:09 2013 @@ -59,7 +59,7 @@ import org.apache.openejb.classloader.Cl import org.apache.openejb.component.ClassLoaderEnricher; import org.apache.openejb.config.ConfigurationFactory; import org.apache.openejb.config.NewLoaderLogic; -import org.apache.openejb.config.QuickJarsXmlParser; +import org.apache.openejb.config.QuickJarsTxtParser; import org.apache.openejb.config.TldScanner; import org.apache.openejb.core.ConnectorReference; import org.apache.openejb.core.CoreContainerSystem; @@ -1715,7 +1715,7 @@ public class Assembler extends Assembler } else { prefix = "META-INF/"; } - jars.addAll(QuickJarsXmlParser.parse(new File(appInfo.path, prefix + QuickJarsXmlParser.FILE_NAME)).getAdditionalURLs()); + jars.addAll(QuickJarsTxtParser.parse(new File(appInfo.path, prefix + QuickJarsTxtParser.FILE_NAME))); final URL[] filtered = jars.toArray(new URL[jars.size()]); Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java?rev=1456698&r1=1456697&r2=1456698&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java Thu Mar 14 22:19:09 2013 @@ -396,7 +396,7 @@ public class DeploymentLoader implements createApplicationFromFiles(appId, tmpClassLoader, ejbModules, clientModules, resouceModules, webModules, files); } - final Collection<URL> jarsXmlUrls = QuickJarsXmlParser.parse(new File(appDir, "META-INF/" + QuickJarsXmlParser.FILE_NAME)).getAdditionalURLs(); + final Collection<URL> jarsXmlUrls = QuickJarsTxtParser.parse(new File(appDir, "META-INF/" + QuickJarsTxtParser.FILE_NAME)); final Collection<URL> jarsXmlLib = new ArrayList<URL>(); if (!jarsXmlUrls.isEmpty()) { for (final URL url : jarsXmlUrls) { @@ -881,7 +881,7 @@ public class DeploymentLoader implements webUrls.addAll(parser.getAdditionalURLs()); } - webUrls.addAll(QuickJarsXmlParser.parse(new File(warFile, "WEB-INF/" + QuickJarsXmlParser.FILE_NAME)).getAdditionalURLs()); + webUrls.addAll(QuickJarsTxtParser.parse(new File(warFile, "WEB-INF/" + QuickJarsTxtParser.FILE_NAME))); final URL[] webUrlsArray = webUrls.toArray(new URL[webUrls.size()]); @@ -1301,7 +1301,7 @@ public class DeploymentLoader implements // create the class loader final List<URL> classPath = new ArrayList<URL>(); classPath.addAll(rarLibs.values()); - classPath.addAll(QuickJarsXmlParser.parse(new File(rarFile, "META-INF/" + QuickJarsXmlParser.FILE_NAME)).getAdditionalURLs()); + classPath.addAll(QuickJarsTxtParser.parse(new File(rarFile, "META-INF/" + QuickJarsTxtParser.FILE_NAME))); final URL[] urls = classPath.toArray(new URL[classPath.size()]); final ClassLoader appClassLoader = ClassLoaderUtil.createTempClassLoader(appId, urls, parentClassLoader); Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/QuickContextXmlParser.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/QuickContextXmlParser.java?rev=1456698&r1=1456697&r2=1456698&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/QuickContextXmlParser.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/QuickContextXmlParser.java Thu Mar 14 22:19:09 2013 @@ -16,6 +16,7 @@ */ package org.apache.openejb.config; +import org.apache.openejb.loader.Files; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; @@ -27,6 +28,7 @@ import java.net.MalformedURLException; import java.net.URL; import java.util.Arrays; import java.util.Collection; +import java.util.HashSet; import java.util.LinkedHashSet; import java.util.Locale; import java.util.Set; @@ -62,47 +64,7 @@ public class QuickContextXmlParser exten continue; } - if (token.endsWith("*.jar")) { - token = token.substring(0, token.length() - "*.jar".length()); - - final File directory = new File(token); - if (!directory.isDirectory()) { - continue; - } - - final String filenames[] = directory.list(); - Arrays.sort(filenames); - - for (final String rawFilename : filenames) { - final String filename = rawFilename.toLowerCase(Locale.ENGLISH); - if (!filename.endsWith(".jar")) { - continue; - } - - final File file = new File(directory, rawFilename); - if (!file.isFile()) { - continue; - } - - try { - set.add(file.toURI().toURL()); - } catch (MalformedURLException e) { - // no-op - } - } - } else { - // single file or directory - final File file = new File(token); - if (!file.exists()) { - continue; - } - - try { - set.add(file.toURI().toURL()); - } catch (MalformedURLException e) { - // no-op - } - } + set.addAll(Files.listJars(token)); } return set; } Added: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/QuickJarsTxtParser.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/QuickJarsTxtParser.java?rev=1456698&view=auto ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/QuickJarsTxtParser.java (added) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/QuickJarsTxtParser.java Thu Mar 14 22:19:09 2013 @@ -0,0 +1,68 @@ +/* + * 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.Files; +import org.apache.openejb.loader.IO; +import org.apache.openejb.loader.ProvisioningUtil; +import org.apache.openejb.util.LogCategory; +import org.apache.openejb.util.Logger; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.net.URL; +import java.util.ArrayList; +import java.util.Collection; + +public final class QuickJarsTxtParser { + public static final String FILE_NAME = "jars.txt"; + + private QuickJarsTxtParser() { + // no-op + } + + public static Collection<URL> parse(final File file) { + if (!file.exists()) { + return new ArrayList<URL>(); // need to be modifiable + } + + final Collection<URL> deps = new ArrayList<URL>(); + + BufferedReader reader = null; + try { + reader = new BufferedReader(new FileReader(file)); + + String line; + while ((line = reader.readLine()) != null) { + final String value = line.trim(); + if (line.startsWith("#") || value.isEmpty()) { + continue; + } + + deps.addAll(Files.listJars(new File(ProvisioningUtil.realLocation(value)).getAbsolutePath())); + } + } catch (final Throwable e) { + Logger.getInstance(LogCategory.OPENEJB, QuickContextXmlParser.class.getName()) + .warning("QuickJarsTxtParser#parse: Failed to read provided stream"); + } finally { + IO.close(reader); + } + + return deps; + } +} Modified: tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/Files.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/Files.java?rev=1456698&r1=1456697&r2=1456698&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/Files.java (original) +++ tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/Files.java Thu Mar 14 22:19:09 2013 @@ -19,9 +19,15 @@ package org.apache.openejb.loader; import java.io.File; import java.io.FileFilter; import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; +import java.util.HashSet; import java.util.List; +import java.util.Locale; +import java.util.Set; import java.util.regex.Pattern; /** @@ -293,6 +299,57 @@ public class Files { return sb.substring(0, sb.length() - delimiter.length()); } + // return the token as url if simply a path otheriwse if ending by *.jar returning the list of + // files in the folder + public static Set<URL> listJars(final String path) { + final Set<URL> set = new HashSet<URL>(); + + String token = path; + if (token.endsWith("*.jar")) { + token = token.substring(0, token.length() - "*.jar".length()); + + final File directory = new File(token); + if (!directory.isDirectory()) { + return set; + } + + final String filenames[] = directory.list(); + Arrays.sort(filenames); + + for (final String rawFilename : filenames) { + final String filename = rawFilename.toLowerCase(Locale.ENGLISH); + if (!filename.endsWith(".jar")) { + continue; + } + + final File file = new File(directory, rawFilename); + if (!file.isFile()) { + continue; + } + + try { + set.add(file.toURI().toURL()); + } catch (MalformedURLException e) { + // no-op + } + } + } else { + // single file or directory + final File file = new File(token); + if (!file.exists()) { + return set; + } + + try { + set.add(file.toURI().toURL()); + } catch (MalformedURLException e) { + // no-op + } + } + + return set; + } + public static class FileRuntimeException extends RuntimeException { public FileRuntimeException(final String str) { super(str); @@ -312,5 +369,4 @@ public class Files { super(e); } } - } Modified: tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/ProvisioningUtil.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/ProvisioningUtil.java?rev=1456698&r1=1456697&r2=1456698&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/ProvisioningUtil.java (original) +++ tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/ProvisioningUtil.java Thu Mar 14 22:19:09 2013 @@ -111,7 +111,7 @@ public class ProvisioningUtil { return path; } } - try { + try { // full maven resolution final Class<?> clazz = ProvisioningUtil.class.getClassLoader().loadClass("org.apache.openejb.resolver.Resolver"); final LocationResolver instance = (LocationResolver) clazz.newInstance(); return instance.resolve(rawLocation); @@ -123,17 +123,44 @@ public class ProvisioningUtil { } catch (MalformedURLException e1) { Logger.getLogger(ProvisioningUtil.class.getName()).severe("Can't find " + rawLocation); } + } else { // try url + try { + final File file = cacheFile(lastPart(rawLocation)); + final URL url = new URL(rawLocation); + InputStream is = null; + try { + is = new BufferedInputStream(url.openStream()); + IO.copy(is, file); + return file.getAbsolutePath(); + } finally { + IO.close(is); + } + } catch (final Exception e1) { + // no-op + } } + + // if it was not an url that's just a file path return rawLocation; } } private static String quickMvnUrl(final String raw) throws MalformedURLException { - final StringBuilder builder = new StringBuilder(); + StringBuilder builder = new StringBuilder(); final String toParse; if (!raw.contains("!")) { + // try first local file with default maven settings + final File file = new File(new StringBuilder(System.getProperty("user.home")).append("/.m2/repository/").append(mvnArtifactPath(raw)).toString()); + if (file.exists()) { + return file.getAbsolutePath(); + } + + // else use repo1 + builder = new StringBuilder(); builder.append(REPO1); toParse = raw; + + // try first locally } else { final int repoIdx = raw.lastIndexOf("!"); toParse = raw.substring(repoIdx + 1); @@ -144,26 +171,33 @@ public class ProvisioningUtil { } } + builder.append(mvnArtifactPath(toParse)); + + return builder.toString(); + } + + private static String mvnArtifactPath(final String toParse) throws MalformedURLException { + final StringBuilder builder = new StringBuilder(); final String[] segments = toParse.split("/"); if (segments.length < 3) { - throw new MalformedURLException("Invalid path. " + raw); + throw new MalformedURLException("Invalid path. " + toParse); } final String group = segments[0]; if (group.trim().isEmpty()) { - throw new MalformedURLException("Invalid groupId. " + raw); + throw new MalformedURLException("Invalid groupId. " + toParse); } builder.append(group.replace('.', '/')).append("/"); final String artifact = segments[1]; if (artifact.trim().isEmpty()) { - throw new MalformedURLException("Invalid artifactId. " + raw); + throw new MalformedURLException("Invalid artifactId. " + toParse); } builder.append(artifact).append("/"); final String version = segments[2]; if (version.trim().isEmpty()) { - throw new MalformedURLException("Invalid artifactId. " + raw); + throw new MalformedURLException("Invalid artifactId. " + toParse); } builder.append(version).append("/"); @@ -181,9 +215,8 @@ public class ProvisioningUtil { if (fullClassifier != null) { builder.append(fullClassifier); } - builder.append(".").append(type); - return builder.toString(); + return builder.append(".").append(type).toString(); } public static void addAdditionalLibraries() throws IOException { Modified: tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/ProvisioningWebappLoader.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/ProvisioningWebappLoader.java?rev=1456698&r1=1456697&r2=1456698&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/ProvisioningWebappLoader.java (original) +++ tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/ProvisioningWebappLoader.java Thu Mar 14 22:19:09 2013 @@ -19,7 +19,7 @@ package org.apache.tomee.catalina; import org.apache.catalina.Context; import org.apache.catalina.LifecycleException; -import org.apache.openejb.config.QuickJarsXmlParser; +import org.apache.openejb.config.QuickJarsTxtParser; import org.apache.openejb.loader.ProvisioningUtil; import org.apache.openejb.util.URLs; import org.apache.openejb.util.reflection.Reflections; @@ -57,10 +57,9 @@ public class ProvisioningWebappLoader ex // WEB-INF/jars.xml if (Context.class.isInstance(getContainer())) { final File war = Contexts.warPath(Context.class.cast(getContainer())); - final File jarsXml = new File(war, "WEB-INF/" + QuickJarsXmlParser.FILE_NAME); + final File jarsXml = new File(war, "WEB-INF/" + QuickJarsTxtParser.FILE_NAME); if (jarsXml.exists()) { - final QuickJarsXmlParser parser = QuickJarsXmlParser.parse(jarsXml); - for (final URL url : parser.getAdditionalURLs()) { + for (final URL url : QuickJarsTxtParser.parse(jarsXml)) { builder.append(URLs.toFile(url)).append(";"); // provisiningutil already called so simply decode url } }