package jef.tools.resource; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; /** * 一个ResourceLoader一般代表一种加载方式(策略),这个类用来组合多种加载方式(策略), * 用来实现一些较为复杂的加载策略。 * * 但是有一个案例比较麻烦,比如首先加载class文件同包下的资源,没有的情况下再加载其他classpath下的同包资源,这种实现比较难处理。 * * @author jiyi * */ public class CompsiteLoader extends AResourceLoader implements Cloneable{ private List<ResourceLoader> loaders=new ArrayList<ResourceLoader>(); private boolean firstCollection=true; public CompsiteLoader(){ } @Override public CompsiteLoader clone(){ CompsiteLoader c=new CompsiteLoader(); c.loaders.addAll(this.loaders); return c; } public CompsiteLoader(ResourceLoader... loaders){ this.loaders.addAll(Arrays.asList(loaders)); } public CompsiteLoader(boolean first,ResourceLoader... loaders){ this.firstCollection=first; this.loaders.addAll(Arrays.asList(loaders)); } public void addResourceLoader(ResourceLoader loader){ loaders.add(loader); } public boolean removeResourceLoader(ResourceLoader loader){ return loaders.remove(loader); } public int loaderSize(){ return loaders.size(); } public boolean isFirstCollection() { return firstCollection; } public CompsiteLoader setFirstCollection(boolean firstCollection) { this.firstCollection = firstCollection; return this; } public URL getResource(String name) { URL u=null; for(ResourceLoader rl:loaders){ u=rl.getResource(name); if(u!=null)return u; } return null; } public List<URL> getResources(String name) { Set<URL> urls=new HashSet<URL>(); for(ResourceLoader rl:loaders){ urls.addAll(rl.getResources(name)); if(firstCollection && urls.size()>0)break; } return new ArrayList<URL>(urls); } }