224 lines
6.9 KiB
Java
224 lines
6.9 KiB
Java
package net.sf.jasperreports.engine.util;
|
|
|
|
import java.io.File;
|
|
import java.net.MalformedURLException;
|
|
import java.net.URL;
|
|
import java.net.URLStreamHandler;
|
|
import java.net.URLStreamHandlerFactory;
|
|
import java.util.Locale;
|
|
import java.util.MissingResourceException;
|
|
import java.util.ResourceBundle;
|
|
|
|
public class JRResourcesUtil {
|
|
private static FileResolver globalFileResolver;
|
|
|
|
private static ThreadLocalStack localFileResolverStack = new ThreadLocalStack();
|
|
|
|
private static URLStreamHandlerFactory globalURLHandlerFactory;
|
|
|
|
private static ThreadLocalStack localURLHandlerFactoryStack = new ThreadLocalStack();
|
|
|
|
private static ClassLoader globalClassLoader;
|
|
|
|
private static ThreadLocalStack localClassLoaderStack = new ThreadLocalStack();
|
|
|
|
public static URL createURL(String spec, URLStreamHandlerFactory urlHandlerFactory) {
|
|
URL uRL;
|
|
URLStreamHandler handler = getURLHandler(spec, urlHandlerFactory);
|
|
try {
|
|
if (handler == null) {
|
|
uRL = new URL(spec);
|
|
} else {
|
|
uRL = new URL(null, spec, handler);
|
|
}
|
|
} catch (MalformedURLException e) {
|
|
uRL = null;
|
|
}
|
|
return uRL;
|
|
}
|
|
|
|
public static URLStreamHandler getURLHandler(String spec, URLStreamHandlerFactory urlHandlerFactory) {
|
|
urlHandlerFactory = getURLHandlerFactory(urlHandlerFactory);
|
|
URLStreamHandler handler = null;
|
|
if (urlHandlerFactory != null) {
|
|
String protocol = getURLProtocol(spec);
|
|
if (protocol != null)
|
|
handler = urlHandlerFactory.createURLStreamHandler(protocol);
|
|
}
|
|
return handler;
|
|
}
|
|
|
|
private static String getURLProtocol(String spec) {
|
|
String protocol = null;
|
|
spec = spec.trim();
|
|
int colon = spec.indexOf(':');
|
|
if (colon > 0) {
|
|
String proto = spec.substring(0, colon);
|
|
if (protocolValid(proto))
|
|
protocol = proto;
|
|
}
|
|
return protocol;
|
|
}
|
|
|
|
private static boolean protocolValid(String protocol) {
|
|
int length = protocol.length();
|
|
if (length < 1)
|
|
return false;
|
|
if (!Character.isLetter(protocol.charAt(0)))
|
|
return false;
|
|
for (int i = 1; i < length; i++) {
|
|
char c = protocol.charAt(i);
|
|
if (!Character.isLetterOrDigit(c) && c != '+' && c != '-' && c != '.')
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public static FileResolver getFileResolver(FileResolver fileResolver) {
|
|
if (fileResolver == null) {
|
|
fileResolver = getThreadFileResolver();
|
|
if (fileResolver == null)
|
|
fileResolver = globalFileResolver;
|
|
}
|
|
return fileResolver;
|
|
}
|
|
|
|
public static FileResolver getGlobalFileResolver() {
|
|
return globalFileResolver;
|
|
}
|
|
|
|
public static FileResolver getThreadFileResolver() {
|
|
return (FileResolver)localFileResolverStack.top();
|
|
}
|
|
|
|
public static void setThreadFileResolver(FileResolver fileResolver) {
|
|
localFileResolverStack.push(fileResolver);
|
|
}
|
|
|
|
public static void resetThreadFileResolver() {
|
|
localFileResolverStack.pop();
|
|
}
|
|
|
|
public static void setGlobalFileResolver(FileResolver fileResolver) {
|
|
globalFileResolver = fileResolver;
|
|
}
|
|
|
|
public static File resolveFile(String location, FileResolver fileResolver) {
|
|
fileResolver = getFileResolver(fileResolver);
|
|
if (fileResolver != null)
|
|
return fileResolver.resolveFile(location);
|
|
File file = new File(location);
|
|
if (file.exists() && file.isFile())
|
|
return file;
|
|
return null;
|
|
}
|
|
|
|
public static URLStreamHandlerFactory getURLHandlerFactory(URLStreamHandlerFactory urlHandlerFactory) {
|
|
if (urlHandlerFactory == null) {
|
|
urlHandlerFactory = getThreadURLStreamHandlerFactory();
|
|
if (urlHandlerFactory == null)
|
|
urlHandlerFactory = globalURLHandlerFactory;
|
|
}
|
|
return urlHandlerFactory;
|
|
}
|
|
|
|
public static URLStreamHandlerFactory getGlobalURLStreamHandlerFactory() {
|
|
return globalURLHandlerFactory;
|
|
}
|
|
|
|
public static URLStreamHandlerFactory getThreadURLStreamHandlerFactory() {
|
|
return (URLStreamHandlerFactory)localURLHandlerFactoryStack.top();
|
|
}
|
|
|
|
public static void setThreadURLHandlerFactory(URLStreamHandlerFactory urlHandlerFactory) {
|
|
localURLHandlerFactoryStack.push(urlHandlerFactory);
|
|
}
|
|
|
|
public static void resetThreadURLHandlerFactory() {
|
|
localURLHandlerFactoryStack.pop();
|
|
}
|
|
|
|
public static void setGlobalURLHandlerFactory(URLStreamHandlerFactory urlHandlerFactory) {
|
|
globalURLHandlerFactory = urlHandlerFactory;
|
|
}
|
|
|
|
public static ClassLoader getClassLoader(ClassLoader classLoader) {
|
|
if (classLoader == null) {
|
|
classLoader = getThreadClassLoader();
|
|
if (classLoader == null)
|
|
classLoader = globalClassLoader;
|
|
}
|
|
return classLoader;
|
|
}
|
|
|
|
public static ClassLoader getGlobalClassLoader() {
|
|
return globalClassLoader;
|
|
}
|
|
|
|
public static ClassLoader getThreadClassLoader() {
|
|
return (ClassLoader)localClassLoaderStack.top();
|
|
}
|
|
|
|
public static void setThreadClassLoader(ClassLoader classLoader) {
|
|
localClassLoaderStack.push(classLoader);
|
|
}
|
|
|
|
public static void resetClassLoader() {
|
|
localClassLoaderStack.pop();
|
|
}
|
|
|
|
public static void setGlobalClassLoader(ClassLoader classLoader) {
|
|
globalClassLoader = classLoader;
|
|
}
|
|
|
|
public static URL findClassLoaderResource(String location, ClassLoader classLoader, Class clazz) {
|
|
classLoader = getClassLoader(classLoader);
|
|
URL url = null;
|
|
if (classLoader != null)
|
|
url = classLoader.getResource(location);
|
|
if (url == null) {
|
|
classLoader = Thread.currentThread().getContextClassLoader();
|
|
if (classLoader != null)
|
|
url = classLoader.getResource(location);
|
|
if (url == null) {
|
|
classLoader = clazz.getClassLoader();
|
|
if (classLoader == null) {
|
|
url = clazz.getResource("/" + location);
|
|
} else {
|
|
url = classLoader.getResource(location);
|
|
}
|
|
}
|
|
}
|
|
return url;
|
|
}
|
|
|
|
public static ResourceBundle loadResourceBundle(String baseName, Locale locale) {
|
|
return loadResourceBundle(baseName, locale, null);
|
|
}
|
|
|
|
public static ResourceBundle loadResourceBundle(String baseName, Locale locale, ClassLoader classLoader) {
|
|
ResourceBundle resourceBundle = null;
|
|
classLoader = getClassLoader(classLoader);
|
|
if (classLoader != null)
|
|
try {
|
|
resourceBundle = ResourceBundle.getBundle(baseName, locale, classLoader);
|
|
} catch (MissingResourceException e) {}
|
|
if (resourceBundle == null) {
|
|
classLoader = Thread.currentThread().getContextClassLoader();
|
|
if (classLoader != null)
|
|
try {
|
|
resourceBundle = ResourceBundle.getBundle(baseName, locale, classLoader);
|
|
} catch (MissingResourceException e) {}
|
|
}
|
|
if (resourceBundle == null) {
|
|
classLoader = JRClassLoader.class.getClassLoader();
|
|
if (classLoader == null) {
|
|
resourceBundle = ResourceBundle.getBundle(baseName, locale);
|
|
} else {
|
|
resourceBundle = ResourceBundle.getBundle(baseName, locale, classLoader);
|
|
}
|
|
}
|
|
return resourceBundle;
|
|
}
|
|
}
|