package jef.tools.resource;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.List;
import java.util.Set;
import jef.tools.reflect.ClassLoaderUtil;
import org.apache.commons.lang.StringUtils;
public class UrlResourceLoader extends AResourceLoader {
/**
* 偏好URL
*/
// private URL[] perferUrl;
private java.net.URLClassLoader ul;
/**
* 只在指定目录上搜索
*/
private boolean directoryOnly = false;
public UrlResourceLoader() {
}
public static enum EnvURL {
PATH, JAVA_LIBRARY_PATH, JAVA_HOME, USER_DIR, TEMP_DIR, USER_HOME, JAVA_CLASS_PATH, SYSTEM_TMP, WINDIR
}
public UrlResourceLoader(EnvURL... envs) {
Set<URL> u = new java.util.LinkedHashSet<URL>();
String pathSp = System.getProperty("path.separator");
for (EnvURL type : envs) {
switch (type) {
case JAVA_CLASS_PATH:
for (String s : StringUtils.split(System.getProperty("java.class.path"), pathSp)) {
add(u,s);
}
break;
case JAVA_HOME: {
add(u,System.getProperty("java.home"));
break;
}
case JAVA_LIBRARY_PATH:
for (String s : StringUtils.split(System.getProperty("java.library.path"), pathSp)) {
add(u,s);
}
break;
case PATH:
for (String s : StringUtils.split(System.getenv("PATH"), pathSp)) {
add(u,s);
}
break;
case SYSTEM_TMP:
add(u,System.getenv("TEMP"));
break;
case TEMP_DIR:
add(u,System.getProperty("java.io.tmpdir"));
break;
case USER_DIR:
add(u,System.getProperty("user.dir"));
break;
case USER_HOME:
add(u,System.getProperty("user.home"));
break;
case WINDIR:
add(u,System.getenv("windir"));
break;
}
}
setPerferUrl(u.toArray(new URL[u.size()]));
}
private final void add(Set<URL> u, String s) {
if(s==null || s.length()==0)return;
File f = new File(s);
try{
u.add(f.toURI().toURL());
} catch (MalformedURLException e) {
}
}
private void setPerferUrl(URL[] array) {
this.ul = new URLClassLoader(array);
}
public UrlResourceLoader(Class<?> c) {
this(c, false);
}
public UrlResourceLoader(Class<?> c, boolean dirOnly) {
setSearchURLByClass(c);
this.directoryOnly = dirOnly;
}
public boolean isDirectoryOnly() {
return directoryOnly;
}
public void setDirectoryOnly(boolean directoryOnly) {
this.directoryOnly = directoryOnly;
}
public void setSearchURL(URL... urls) {
setPerferUrl(urls);
}
public void setSearchURLByClass(Class<?> clz) {
URL u = ClassLoaderUtil.getCodeSource(clz);
if (u != null) {
setPerferUrl(new URL[] { u });
}
}
public URL getResource(String name) {
if (name.startsWith("//")){
File file=new File(name.substring(1));
if(file.exists())return super.toURL(file);
name = name.substring(2);
}else if(name.startsWith("/")){
name = name.substring(1);
}
if (directoryOnly)
name = "./" + name;
if (ul != null) {
return ul.findResource(name);
}
return null;
}
public List<URL> getResources(String name) {
if (name.startsWith("//")){
File file=new File(name.substring(1));
if(file.exists())return Arrays.asList(super.toURL(file));
name = name.substring(2);
}else if(name.startsWith("/")){
name = name.substring(1);
}
if (directoryOnly)
name = "./" + name;
List<URL> result = new ArrayList<URL>();
try {
if (ul != null) {
for (Enumeration<URL> e = ul.findResources(name); e.hasMoreElements();) {
result.add(e.nextElement());
}
}
} catch (IOException e) {
throw new IllegalStateException(e.getMessage());
}
return result;
}
}