/* * 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.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$ */ public class JarLocation { public static File get() { return jarLocation(JarLocation.class); } public static File jarFromPrefix(final String prefix) { return jarFromRegex(prefix + ".*\\.jar"); } 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 String decode = decode(url.getFile()); File f = new File(decode.replaceFirst("file:", "")); if (!f.exists() && f.getPath().endsWith("!")) { f = new File(f.getPath().substring(0, f.getPath().length() - 1)); } 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"); } if ("jar".equals(url.getProtocol())) { 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); } url = new URL(spec.substring(0, separator++)); return new File(decode(url.getFile())); } else if ("file".equals(url.getProtocol())) { return toFile(resourceName, url); } else { throw new IllegalArgumentException("Unsupported URL scheme: " + url.toExternalForm()); } } 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 (final Exception e) { throw new IllegalStateException(e); } } private static File toFile(final String classFileName, final URL url) { String path = url.getFile(); path = path.substring(0, path.length() - classFileName.length()); return new File(decode(path)); } public static String decode(final String fileName) { return ClassLoaders.decode(fileName); } }