Author: rmannibucau
Date: Sat Mar 16 16:28:36 2013
New Revision: 1457271

URL: http://svn.apache.org/r1457271
Log:
TOMEE-794 handling optional hash for jars.txt

Added:
    
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/classloader/TrueFilter.java
    
tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/TrueFilter.java
Modified:
    
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/classloader/DefaultClassLoaderConfigurer.java
    
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/classloader/FalseFilter.java
    
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/classloader/ProvisioningClassLoaderConfigurer.java
    
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/URLs.java
    
tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/Files.java
    tomee/tomee/trunk/maven/jarstxt-maven-plugin/pom.xml
    
tomee/tomee/trunk/maven/jarstxt-maven-plugin/src/main/java/org/apache/openejb/maven/jarstxt/JarsTxtMojo.java

Modified: 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/classloader/DefaultClassLoaderConfigurer.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/classloader/DefaultClassLoaderConfigurer.java?rev=1457271&r1=1457270&r2=1457271&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/classloader/DefaultClassLoaderConfigurer.java
 (original)
+++ 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/classloader/DefaultClassLoaderConfigurer.java
 Sat Mar 16 16:28:36 2013
@@ -117,13 +117,4 @@ public class DefaultClassLoaderConfigure
             excluded = Filters.prefixes(excludedPrefixes);
         }
     }
-
-    private static class TrueFilter implements Filter {
-        public static final TrueFilter INSTANCE = new TrueFilter();
-
-        @Override
-        public boolean accept(final String name) {
-            return true;
-        }
-    }
 }

Modified: 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/classloader/FalseFilter.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/classloader/FalseFilter.java?rev=1457271&r1=1457270&r2=1457271&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/classloader/FalseFilter.java
 (original)
+++ 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/classloader/FalseFilter.java
 Sat Mar 16 16:28:36 2013
@@ -23,6 +23,6 @@ public class FalseFilter  implements Fil
 
     @Override
     public boolean accept(final String name) {
-        return true;
+        return false;
     }
 }

Modified: 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/classloader/ProvisioningClassLoaderConfigurer.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/classloader/ProvisioningClassLoaderConfigurer.java?rev=1457271&r1=1457270&r2=1457271&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/classloader/ProvisioningClassLoaderConfigurer.java
 (original)
+++ 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/classloader/ProvisioningClassLoaderConfigurer.java
 Sat Mar 16 16:28:36 2013
@@ -31,18 +31,19 @@ import java.io.FileReader;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Set;
 
 /**
  * Configuration
  * <configurer prefix>.configuration = /foo/bar/config.txt
- *
+ * <p/>
  * Handled file format:
  * -xbean
  * +http://..../camel-core.jar
  * +mvn:org.foo:bar:1.0
- *
+ * <p/>
  * The maven like urls needs the openejb-provisinning module
- *
+ * <p/>
  * Note: if a line doesn't start with '+' it is considered as an addition
  */
 public class ProvisioningClassLoaderConfigurer implements 
ClassLoaderConfigurer {
@@ -88,7 +89,33 @@ public class ProvisioningClassLoaderConf
                     if (line.startsWith("+")) {
                         line = line.substring(1);
                     }
-                    
toAdd.addAll(Files.listJars(ProvisioningUtil.realLocation(line)));
+
+                    String location = line;
+                    String algo = "MD5";
+                    String hash = null;
+                    final boolean validJar = line.contains("#");
+
+                    if (validJar) {
+                        final String[] segments = line.split("#");
+                        location = segments[0];
+                        if (segments.length >= 2) {
+                            hash = segments[1];
+                        }
+                        if (segments.length >= 3) {
+                            algo = segments[2].trim();
+                        }
+
+                    }
+
+                    final Set<URL> repos = 
Files.listJars(ProvisioningUtil.realLocation(location));
+                    toAdd.addAll(repos);
+
+                    if (validJar) {
+                        final String computedHash = Files.hash(repos, algo);
+                        if (!computedHash.equals(hash)) {
+                            throw new IllegalStateException("Hash of " + 
location + "(" + computedHash + ") doesn't match expected one (" + hash + ")");
+                        }
+                    }
                 }
             }
 

Added: 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/classloader/TrueFilter.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/classloader/TrueFilter.java?rev=1457271&view=auto
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/classloader/TrueFilter.java
 (added)
+++ 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/classloader/TrueFilter.java
 Sat Mar 16 16:28:36 2013
@@ -0,0 +1,28 @@
+/*
+ * 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.classloader;
+
+import org.apache.xbean.finder.filter.Filter;
+
+public class TrueFilter implements Filter {
+    public static final TrueFilter INSTANCE = new TrueFilter();
+
+    @Override
+    public boolean accept(final String name) {
+        return true;
+    }
+}

Modified: 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/URLs.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/URLs.java?rev=1457271&r1=1457270&r2=1457271&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/URLs.java
 (original)
+++ 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/URLs.java
 Sat Mar 16 16:28:36 2013
@@ -17,6 +17,7 @@
 package org.apache.openejb.util;
 
 
+import org.apache.openejb.loader.Files;
 import org.apache.xbean.finder.UrlSet;
 
 import java.io.File;
@@ -25,33 +26,13 @@ import java.net.MalformedURLException;
 import java.net.URI;
 import java.net.URL;
 
-import static org.apache.openejb.loader.JarLocation.decode;
-
 
 /**
  * @version $Rev$ $Date$
  */
 public class URLs {
     public static File toFile(final URL url) {
-        if ("jar".equals(url.getProtocol())) {
-            try {
-                final String spec = url.getFile();
-
-                int separator = spec.indexOf('!');
-                /*
-                 * REMIND: we don't handle nested JAR URLs
-                 */
-                if (separator == -1) throw new MalformedURLException("no ! 
found in jar url spec:" + spec);
-
-                return toFile(new URL(spec.substring(0, separator++)));
-            } catch (MalformedURLException e) {
-                throw new IllegalStateException(e);
-            }
-        } else if ("file".equals(url.getProtocol())) {
-            return new File(decode(url.getFile()));
-        } else {
-            throw new IllegalArgumentException("Unsupported URL scheme: " + 
url.toExternalForm());
-        }
+        return Files.toFile(url);
     }
 
     public static URL toFileUrl(final URL url) {

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=1457271&r1=1457270&r2=1457271&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
 Sat Mar 16 16:28:36 2013
@@ -18,22 +18,32 @@ package org.apache.openejb.loader;
 
 import java.io.File;
 import java.io.FileFilter;
+import java.io.FileInputStream;
 import java.io.IOException;
+import java.io.OutputStream;
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.security.DigestInputStream;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Locale;
+import java.util.Map;
 import java.util.Set;
 import java.util.regex.Pattern;
 
+import static org.apache.openejb.loader.JarLocation.decode;
+
 /**
  * @version $Rev$ $Date$
  */
 public class Files {
+    private static final Map<String, MessageDigest> DIGESTS = new 
HashMap<String, MessageDigest>();
 
     public static File path(final String... parts) {
         File dir = null;
@@ -350,6 +360,84 @@ public class Files {
         return set;
     }
 
+    public static File toFile(final URL url) {
+        if ("jar".equals(url.getProtocol())) {
+            try {
+                final String spec = url.getFile();
+
+                int separator = spec.indexOf('!');
+                /*
+                 * REMIND: we don't handle nested JAR URLs
+                 */
+                if (separator == -1) throw new MalformedURLException("no ! 
found in jar url spec:" + spec);
+
+                return toFile(new URL(spec.substring(0, separator++)));
+            } catch (MalformedURLException e) {
+                throw new IllegalStateException(e);
+            }
+        } else if ("file".equals(url.getProtocol())) {
+            return new File(decode(url.getFile()));
+        } else {
+            throw new IllegalArgumentException("Unsupported URL scheme: " + 
url.toExternalForm());
+        }
+    }
+
+    public static String hash(final Set<URL> urls, final String algo) {
+        final Collection<File> files = new ArrayList<File>();
+
+        for (final URL u : urls) {
+            final File file = toFile(u);
+            if (!file.isDirectory()) {
+                files.add(file);
+            } else {
+                files.addAll(Files.collect(file, TrueFilter.INSTANCE));
+            }
+        }
+
+        MessageDigest digest = DIGESTS.get(algo);
+        if (digest == null) {
+            try {
+                digest = MessageDigest.getInstance(algo);
+            } catch (final NoSuchAlgorithmException e) {
+                throw new LoaderRuntimeException(e);
+            }
+            DIGESTS.put(algo, digest);
+        }
+
+        for (final File file : files) {
+            if (!file.exists()) {
+                continue;
+            }
+
+            DigestInputStream is = null;
+            try {
+                is = new DigestInputStream(new FileInputStream(file), digest);
+                IO.copy(is, new NoopOutputStream()); // read the stream
+            } catch (final IOException e) {
+                // no-op: shouldn't occur here
+            } finally {
+                IO.close(is);
+            }
+        }
+
+        final byte[] hash = digest.digest();
+        digest.reset();
+
+        final StringBuilder sb = new StringBuilder("");
+        for (final byte b : hash) { // hex convertion
+            sb.append(Integer.toString((b & 0xff) + 0x100, 16).substring(1));
+        }
+
+        return sb.toString();
+    }
+
+    private static class NoopOutputStream extends OutputStream {
+        @Override
+        public void write(final int b) throws IOException {
+            // no-op
+        }
+    }
+
     public static class FileRuntimeException extends RuntimeException {
         public FileRuntimeException(final String str) {
             super(str);

Added: 
tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/TrueFilter.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/TrueFilter.java?rev=1457271&view=auto
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/TrueFilter.java
 (added)
+++ 
tomee/tomee/trunk/container/openejb-loader/src/main/java/org/apache/openejb/loader/TrueFilter.java
 Sat Mar 16 16:28:36 2013
@@ -0,0 +1,29 @@
+/*
+ * 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.loader;
+
+import java.io.File;
+import java.io.FileFilter;
+
+public class TrueFilter implements FileFilter {
+    public static final FileFilter INSTANCE = new TrueFilter();
+
+    @Override
+    public boolean accept(final File file) {
+        return true;
+    }
+}

Modified: tomee/tomee/trunk/maven/jarstxt-maven-plugin/pom.xml
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/maven/jarstxt-maven-plugin/pom.xml?rev=1457271&r1=1457270&r2=1457271&view=diff
==============================================================================
--- tomee/tomee/trunk/maven/jarstxt-maven-plugin/pom.xml (original)
+++ tomee/tomee/trunk/maven/jarstxt-maven-plugin/pom.xml Sat Mar 16 16:28:36 
2013
@@ -44,6 +44,11 @@ Licensed to the Apache Software Foundati
       <groupId>org.apache.maven.plugin-tools</groupId>
       <artifactId>maven-plugin-annotations</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.openejb</groupId>
+      <artifactId>openejb-loader</artifactId>
+      <version>${project.version}</version>
+    </dependency>
   </dependencies>
 
   <properties>

Modified: 
tomee/tomee/trunk/maven/jarstxt-maven-plugin/src/main/java/org/apache/openejb/maven/jarstxt/JarsTxtMojo.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/maven/jarstxt-maven-plugin/src/main/java/org/apache/openejb/maven/jarstxt/JarsTxtMojo.java?rev=1457271&r1=1457270&r2=1457271&view=diff
==============================================================================
--- 
tomee/tomee/trunk/maven/jarstxt-maven-plugin/src/main/java/org/apache/openejb/maven/jarstxt/JarsTxtMojo.java
 (original)
+++ 
tomee/tomee/trunk/maven/jarstxt-maven-plugin/src/main/java/org/apache/openejb/maven/jarstxt/JarsTxtMojo.java
 Sat Mar 16 16:28:36 2013
@@ -16,7 +16,14 @@
  */
 package org.apache.openejb.maven.jarstxt;
 
+import edu.emory.mathcs.backport.java.util.Collections;
 import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.factory.ArtifactFactory;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
+import org.apache.maven.artifact.resolver.ArtifactResolutionException;
+import org.apache.maven.artifact.resolver.ArtifactResolver;
+import org.apache.maven.artifact.versioning.VersionRange;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
@@ -26,11 +33,14 @@ import org.apache.maven.plugins.annotati
 import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.plugins.annotations.ResolutionScope;
 import org.apache.maven.project.MavenProject;
+import org.apache.openejb.loader.Files;
 import org.codehaus.plexus.util.FileUtils;
 
 import java.io.File;
 import java.io.FileWriter;
 import java.io.IOException;
+import java.net.URL;
+import java.util.List;
 import java.util.Set;
 
 @Mojo(name = "generate", threadSafe = true,
@@ -42,6 +52,21 @@ public class JarsTxtMojo extends Abstrac
     @Parameter(property = "outputFile", defaultValue = 
"${project.build.directory}/${project.build.finalName}/WEB-INF/jars.txt" )
     protected File outputFile;
 
+    @Parameter(property = "hash")
+    protected String hashAlgo;
+
+    @Component
+    protected ArtifactFactory factory;
+
+    @Component
+    protected ArtifactResolver resolver;
+
+    @Parameter(defaultValue = "${localRepository}", readonly = true)
+    protected ArtifactRepository local;
+
+    @Parameter(defaultValue = "${project.remoteArtifactRepositories}", 
readonly = true)
+    protected List<ArtifactRepository> remoteRepos;
+
     @Override
     public void execute() throws MojoExecutionException, MojoFailureException {
         if (!outputFile.getParentFile().exists()) {
@@ -59,7 +84,25 @@ public class JarsTxtMojo extends Abstrac
 
                 a.setScope(Artifact.SCOPE_PROVIDED);
 
-                writer.write("mvn:" + a.getGroupId() + "/" + a.getArtifactId() 
+ "/" + a.getVersion());
+                final StringBuilder line = new StringBuilder("mvn:")
+                        .append(a.getGroupId()).append("/")
+                        .append(a.getArtifactId()).append("/")
+                        .append(a.getVersion());
+                if (hashAlgo != null) {
+                    final Artifact artifact = 
factory.createDependencyArtifact(a.getGroupId(), a.getArtifactId(), 
VersionRange.createFromVersion(a.getVersion()), a.getType(), a.getClassifier(), 
a.getScope());
+                    try {
+                        resolver.resolve(artifact, remoteRepos, local);
+                    } catch (final ArtifactResolutionException e) {
+                        throw new MojoExecutionException(e.getMessage(), e);
+                    } catch (ArtifactNotFoundException e) {
+                        throw new MojoExecutionException(e.getMessage(), e);
+                    }
+                    final File file = artifact.getFile();
+                    line.append("#").append(Files.hash((Set<URL>) 
Collections.singleton(file.toURI().toURL()), hashAlgo))
+                        .append("#").append(hashAlgo);
+                }
+
+                writer.write(line.toString());
                 writer.write("\n");
             }
 


Reply via email to