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");
}