package org.nutz.resource.impl; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.regex.Pattern; import javax.servlet.ServletContext; import org.nutz.resource.NutResource; public class WebClassesResourceLocation extends ResourceLocation { protected ServletContext sc; public int priority = 125; public WebClassesResourceLocation(ServletContext sc) { this.sc = sc; } public String id() { return "/WEB-INF/classes/"; } @Override public void scan(String base, Pattern pattern, List<NutResource> list) { if (!base.startsWith("/")) base = "/" + base; List<String> paths = new ArrayList<String>(); getResources("/WEB-INF/classes"+base, paths); for (final String path : paths) { if (path.equals(base)) { list.add(new WebClassesResource(path, base)); continue; } String name = path.substring(path.lastIndexOf('/')); if (pattern == null || pattern.matcher(name).find()) { list.add(new WebClassesResource(path, base)); } } } public class WebClassesResource extends NutResource { protected String path; protected String base; public WebClassesResource(String path, String base) { setSource("webapp:"+path); this.path = path; this.base = base; if (path.equals("/WEB-INF/classes"+base)) setName(path); else setName(path.substring(("/WEB-INF/classes"+base).length())); setPriority(priority); } public InputStream getInputStream() throws IOException { return sc.getResourceAsStream(path); } public String toString() { return "webapp:" + path; } } public void getResources(String base, List<String> list) { Set<String> paths = sc.getResourcePaths(base); if (paths == null) return; for (final String path : paths) { if (path.endsWith("/")) getResources(path, list); else list.add(path); } } }