Author: rmannibucau
Date: Fri May 23 17:39:42 2014
New Revision: 1597138

URL: http://svn.apache.org/r1597138
Log:
TOMEE-1222 adding some utilities to JarLocation

Added:
    
tomee/tomee/trunk/arquillian/ziplock/src/main/java/org/apache/ziplock/ClassLoaders.java
    
tomee/tomee/trunk/arquillian/ziplock/src/test/java/org/apache/ziplock/JarLocationTest.java
    tomee/tomee/trunk/arquillian/ziplock/src/test/resources/
    tomee/tomee/trunk/arquillian/ziplock/src/test/resources/resources.txt
Modified:
    
tomee/tomee/trunk/arquillian/ziplock/src/main/java/org/apache/ziplock/JarLocation.java

Added: 
tomee/tomee/trunk/arquillian/ziplock/src/main/java/org/apache/ziplock/ClassLoaders.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/arquillian/ziplock/src/main/java/org/apache/ziplock/ClassLoaders.java?rev=1597138&view=auto
==============================================================================
--- 
tomee/tomee/trunk/arquillian/ziplock/src/main/java/org/apache/ziplock/ClassLoaders.java
 (added)
+++ 
tomee/tomee/trunk/arquillian/ziplock/src/main/java/org/apache/ziplock/ClassLoaders.java
 Fri May 23 17:39:42 2014
@@ -0,0 +1,181 @@
+/**
+ * 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.ziplock;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+public final class ClassLoaders {
+    private static final boolean DONT_USE_GET_URLS = 
Boolean.getBoolean("xbean.finder.use.get-resources");
+    private static final ClassLoader SYSTEM = 
ClassLoader.getSystemClassLoader();
+
+    private static final boolean UNIX = 
!System.getProperty("os.name").toLowerCase().contains("win");
+
+    public static Set<URL> findUrls(final ClassLoader classLoader) throws 
IOException {
+        if (classLoader == null || (SYSTEM.getParent() != null && classLoader 
== SYSTEM.getParent())) {
+            return Collections.emptySet();
+        }
+
+        final Set<URL> urls =  new HashSet<URL>();
+
+        if (URLClassLoader.class.isInstance(classLoader) && 
!DONT_USE_GET_URLS) {
+            if (!isSurefire(classLoader)) {
+                for (final Collection<URL> item : Arrays.asList(
+                        
Arrays.asList(URLClassLoader.class.cast(classLoader).getURLs()), 
findUrls(classLoader.getParent()))) {
+                    for (final URL url : item) {
+                        addIfNotSo(urls, url);
+                    }
+                }
+            } else { // http://jira.codehaus.org/browse/SUREFIRE-928 - we 
could reuse findUrlFromResources but this seems faster
+                for (final URL url : fromClassPath()) {
+                    urls.add(url);
+                }
+            }
+        } else {
+            for (final URL url : findUrlFromResources(classLoader)) {
+                urls.add(url);
+            }
+        }
+
+        return urls;
+    }
+
+    private static void addIfNotSo(final Set<URL> urls, final URL url) {
+        if (UNIX && isNative(url)) {
+            return;
+        }
+
+        urls.add(url);
+    }
+
+    public static File toFile(final URL url) {
+        if ("jar".equals(url.getProtocol())) {
+            try {
+                final String spec = url.getFile();
+                final int separator = spec.indexOf('!');
+                if (separator == -1) {
+                    return null;
+                }
+                return toFile(new URL(spec.substring(0, separator + 1)));
+            } catch (final MalformedURLException e) {
+                return null;
+            }
+        } else if ("file".equals(url.getProtocol())) {
+            String path = decode(url.getFile());
+            if (path.endsWith("!")) {
+                path = path.substring(0, path.length() - 1);
+            }
+            return new File(path);
+        }
+        return null;
+    }
+
+    public static String decode(String fileName) {
+        if (fileName.indexOf('%') == -1) return fileName;
+
+        StringBuilder result = new StringBuilder(fileName.length());
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+
+        for (int i = 0; i < fileName.length();) {
+            char c = fileName.charAt(i);
+
+            if (c == '%') {
+                out.reset();
+                do {
+                    if (i + 2 >= fileName.length()) {
+                        throw new IllegalArgumentException("Incomplete % 
sequence at: " + i);
+                    }
+
+                    int d1 = Character.digit(fileName.charAt(i + 1), 16);
+                    int d2 = Character.digit(fileName.charAt(i + 2), 16);
+
+                    if (d1 == -1 || d2 == -1) {
+                        throw new IllegalArgumentException("Invalid % sequence 
(" + fileName.substring(i, i + 3) + ") at: " + String.valueOf(i));
+                    }
+
+                    out.write((byte) ((d1 << 4) + d2));
+
+                    i += 3;
+
+                } while (i < fileName.length() && fileName.charAt(i) == '%');
+
+
+                result.append(out.toString());
+
+                continue;
+            } else {
+                result.append(c);
+            }
+
+            i++;
+        }
+        return result.toString();
+    }
+
+    public static boolean isNative(final URL url) {
+        final File file = toFile(url);
+        if (file != null) {
+            final String name = file.getName();
+            if (!name.endsWith(".jar") && !file.isDirectory()
+                    && name.contains(".so") && 
file.getAbsolutePath().startsWith("/usr/lib")) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+
+    private static boolean isSurefire(ClassLoader classLoader) {
+        return System.getProperty("surefire.real.class.path") != null && 
classLoader == SYSTEM;
+    }
+
+    private static Collection<URL> fromClassPath() {
+        final String[] cp = 
System.getProperty("java.class.path").split(System.getProperty("path.separator",
 ":"));
+        final Set<URL> urls = new HashSet<URL>();
+        for (final String path : cp) {
+            try {
+                urls.add(new File(path).toURI().toURL()); // don't build the 
url in plain String since it is not portable
+            } catch (final MalformedURLException e) {
+                // ignore
+            }
+        }
+        return urls;
+    }
+
+    public static Set<URL> findUrlFromResources(final ClassLoader classLoader) 
throws IOException {
+        final Set<URL> set = new HashSet<URL>();
+        for (final URL url : 
Collections.list(classLoader.getResources("META-INF"))) {
+            final String externalForm = url.toExternalForm();
+            set.add(new URL(externalForm.substring(0, 
externalForm.lastIndexOf("META-INF"))));
+        }
+        set.addAll(Collections.list(classLoader.getResources("")));
+        return set;
+    }
+
+    private ClassLoaders() {
+        // no-op
+    }
+}

Modified: 
tomee/tomee/trunk/arquillian/ziplock/src/main/java/org/apache/ziplock/JarLocation.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/arquillian/ziplock/src/main/java/org/apache/ziplock/JarLocation.java?rev=1597138&r1=1597137&r2=1597138&view=diff
==============================================================================
--- 
tomee/tomee/trunk/arquillian/ziplock/src/main/java/org/apache/ziplock/JarLocation.java
 (original)
+++ 
tomee/tomee/trunk/arquillian/ziplock/src/main/java/org/apache/ziplock/JarLocation.java
 Fri May 23 17:39:42 2014
@@ -16,10 +16,12 @@
  */
 package org.apache.ziplock;
 
-import java.io.ByteArrayOutputStream;
 import java.io.File;
+import java.io.IOException;
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.util.Set;
+import java.util.regex.Pattern;
 
 /**
  * @version $Rev$ $Date$
@@ -30,18 +32,33 @@ public class JarLocation {
         return jarLocation(JarLocation.class);
     }
 
-    public static File jarLocation(Class clazz) {
-        try {
-            String classFileName = clazz.getName().replace(".", "/") + 
".class";
+    public static File jarFromPrefix(final String prefix) {
+        return jarFromRegex(prefix + ".*\\.jar");
+    }
 
-            ClassLoader loader = clazz.getClassLoader();
-            URL url;
-            if (loader != null) {
-                url = loader.getResource(classFileName);
-            } else {
-                url = clazz.getResource(classFileName);
+    public static File jarFromRegex(final String regex) {
+        final Pattern pattern = Pattern.compile(regex);
+        try {
+            final Set<URL> urls = 
ClassLoaders.findUrls(Thread.currentThread().getContextClassLoader());
+            for (final URL url : urls) {
+                final File f = new File(decode(url.getFile()));
+                if (f.exists() && pattern.matcher(f.getName()).matches()) {
+                    return f;
+                }
             }
+            throw new IllegalArgumentException(regex + " not found in " + 
urls);
+        } catch (final IOException e) {
+            throw new IllegalStateException(e);
+        }
+    }
+
+    public static File jarFromResource(final String resourceName) {
+        return jarFromResource(Thread.currentThread().getContextClassLoader(), 
resourceName);
+    }
 
+    public static File jarFromResource(final ClassLoader loader, final String 
resourceName) {
+        try {
+            URL url = loader.getResource(resourceName);
             if (url == null) {
                 throw new 
IllegalStateException("classloader.getResource(classFileName) returned a null 
URL");
             }
@@ -60,13 +77,25 @@ public class JarLocation {
                 return new File(decode(url.getFile()));
 
             } else if ("file".equals(url.getProtocol())) {
-                return toFile(classFileName, url);
+                return toFile(resourceName, url);
             } else {
                 throw new IllegalArgumentException("Unsupported URL scheme: " 
+ url.toExternalForm());
             }
-        } catch (RuntimeException e) {
+        } catch (final RuntimeException e) {
+            throw e;
+        } catch (final Exception e) {
+            throw new IllegalStateException(e);
+        }
+    }
+
+    public static File jarLocation(final Class clazz) {
+        try {
+            final String classFileName = clazz.getName().replace(".", "/") + 
".class";
+            final ClassLoader loader = clazz.getClassLoader();
+            return jarFromResource(loader, classFileName);
+        } catch (final RuntimeException e) {
             throw e;
-        } catch (Exception e) {
+        } catch (final Exception e) {
             throw new IllegalStateException(e);
         }
     }
@@ -77,47 +106,8 @@ public class JarLocation {
         return new File(decode(path));
     }
 
-
-    public static String decode(String fileName) {
-        if (fileName.indexOf('%') == -1) return fileName;
-
-        StringBuilder result = new StringBuilder(fileName.length());
-        ByteArrayOutputStream out = new ByteArrayOutputStream();
-
-        for (int i = 0; i < fileName.length();) {
-            char c = fileName.charAt(i);
-
-            if (c == '%') {
-                out.reset();
-                do {
-                    if (i + 2 >= fileName.length()) {
-                        throw new IllegalArgumentException("Incomplete % 
sequence at: " + i);
-                    }
-
-                    int d1 = Character.digit(fileName.charAt(i + 1), 16);
-                    int d2 = Character.digit(fileName.charAt(i + 2), 16);
-
-                    if (d1 == -1 || d2 == -1) {
-                        throw new IllegalArgumentException("Invalid % sequence 
(" + fileName.substring(i, i + 3) + ") at: " + String.valueOf(i));
-                    }
-
-                    out.write((byte) ((d1 << 4) + d2));
-
-                    i += 3;
-
-                } while (i < fileName.length() && fileName.charAt(i) == '%');
-
-
-                result.append(out.toString());
-
-                continue;
-            } else {
-                result.append(c);
-            }
-
-            i++;
-        }
-        return result.toString();
+    public static String decode(final String fileName) {
+        return ClassLoaders.decode(fileName);
     }
 
 }

Added: 
tomee/tomee/trunk/arquillian/ziplock/src/test/java/org/apache/ziplock/JarLocationTest.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/arquillian/ziplock/src/test/java/org/apache/ziplock/JarLocationTest.java?rev=1597138&view=auto
==============================================================================
--- 
tomee/tomee/trunk/arquillian/ziplock/src/test/java/org/apache/ziplock/JarLocationTest.java
 (added)
+++ 
tomee/tomee/trunk/arquillian/ziplock/src/test/java/org/apache/ziplock/JarLocationTest.java
 Fri May 23 17:39:42 2014
@@ -0,0 +1,45 @@
+/*
+ * 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.ziplock;
+
+import org.junit.Test;
+
+import java.io.File;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class JarLocationTest {
+    @Test
+    public void resource() {
+        final File thisJar = JarLocation.jarFromResource("resources.txt");
+        assertTrue(thisJar.exists());
+    }
+
+    @Test
+    public void regex() {
+        final File api = JarLocation.jarFromRegex("shrinkwrap-api.*\\.jar");
+        assertTrue(api.exists());
+    }
+
+    @Test
+    public void prefix() {
+        final File api = JarLocation.jarFromPrefix("shrinkwrap-api");
+        assertTrue(api.exists());
+        assertEquals(JarLocation.jarFromRegex("shrinkwrap-api.*\\.jar"), api);
+    }
+}

Added: tomee/tomee/trunk/arquillian/ziplock/src/test/resources/resources.txt
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/arquillian/ziplock/src/test/resources/resources.txt?rev=1597138&view=auto
==============================================================================
--- tomee/tomee/trunk/arquillian/ziplock/src/test/resources/resources.txt 
(added)
+++ tomee/tomee/trunk/arquillian/ziplock/src/test/resources/resources.txt Fri 
May 23 17:39:42 2014
@@ -0,0 +1,16 @@
+/*
+ * 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.
+ */


Reply via email to