View Javadoc

1   package com.ochafik.net;
2   
3   import java.io.File;
4   import java.io.IOException;
5   import java.io.InputStream;
6   import java.net.URL;
7   import java.util.ArrayList;
8   import java.util.List;
9   import java.util.jar.JarEntry;
10  import java.util.jar.JarInputStream;
11  
12  import com.ochafik.util.listenable.Filter;
13  
14  public class URLUtils {
15  
16  	public static URL getResource(Class<?> cl, String path) throws IOException {
17  		String clp = cl.getName().replace('.', '/') + ".class";
18  		URL clu = cl.getClassLoader().getResource(clp);
19  		String s = clu.toString();
20  		if (s.endsWith(clp))
21  			return new URL(s.substring(0, s.length() - clp.length()) + path);
22  		
23  		if (s.startsWith("jar:")) {
24  			String[] ss = s.split("!");
25  			return new URL(ss[1] + "!/" + path);
26  		}
27  		return null;
28  	}
29  	
30  	public static List<URL> listFiles(URL directory, Filter<String> pathAccepter) throws IOException {
31  		List<URL> ret = new ArrayList<URL>();
32  		String s = directory.toString();
33  		if (s.startsWith("jar:")) {
34  			String[] ss = s.substring("jar:".length()).split("!");
35  			String path = ss[1];
36  			URL target = new URL(ss[0]);
37  			InputStream tin = target.openStream();
38  			try {
39  				JarInputStream jin = new JarInputStream(tin);
40  				JarEntry je;
41  				while ((je = jin.getNextJarEntry()) != null) {
42  					String p = "/" + je.getName();
43  					if (p.startsWith(path) && p.indexOf('/', path.length() + 1) < 0)
44  						if (pathAccepter == null || pathAccepter.accept(path))
45  							ret.add(new URL("jar:" + target + "!" + p));
46  				}
47  			} finally {
48  				tin.close();
49  			}
50  		} else if (s.startsWith("file:")) {
51  			File f = new File(directory.getFile());
52  			File[] ffs = f.listFiles();
53  			if (ffs != null)
54  				for (File ff : ffs)
55  					if (pathAccepter == null || pathAccepter.accept(ff.toString()))
56  						ret.add(ff.toURI().toURL());
57  		} else 
58  			throw new IOException("Cannot list contents of " + directory);
59  		
60  		return ret;
61  	}
62  }