blob: 244f0e230582a2ab8bbcd8be2c1b96a019287b4d [file] [log] [blame]
/*
* 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);
}
}