001    package com.ochafik.net;
002    
003    import java.io.File;
004    import java.io.IOException;
005    import java.io.InputStream;
006    import java.net.URL;
007    import java.util.ArrayList;
008    import java.util.List;
009    import java.util.jar.JarEntry;
010    import java.util.jar.JarInputStream;
011    
012    import com.ochafik.util.listenable.Filter;
013    
014    public class URLUtils {
015    
016            public static URL getResource(Class<?> cl, String path) throws IOException {
017                    String clp = cl.getName().replace('.', '/') + ".class";
018                    URL clu = cl.getClassLoader().getResource(clp);
019                    String s = clu.toString();
020                    if (s.endsWith(clp))
021                            return new URL(s.substring(0, s.length() - clp.length()) + path);
022                    
023                    if (s.startsWith("jar:")) {
024                            String[] ss = s.split("!");
025                            return new URL(ss[1] + "!/" + path);
026                    }
027                    return null;
028            }
029            
030            public static List<URL> listFiles(URL directory, Filter<String> pathAccepter) throws IOException {
031                    List<URL> ret = new ArrayList<URL>();
032                    String s = directory.toString();
033                    if (s.startsWith("jar:")) {
034                            String[] ss = s.substring("jar:".length()).split("!");
035                            String path = ss[1];
036                            URL target = new URL(ss[0]);
037                            InputStream tin = target.openStream();
038                            try {
039                                    JarInputStream jin = new JarInputStream(tin);
040                                    JarEntry je;
041                                    while ((je = jin.getNextJarEntry()) != null) {
042                                            String p = "/" + je.getName();
043                                            if (p.startsWith(path) && p.indexOf('/', path.length() + 1) < 0)
044                                                    if (pathAccepter == null || pathAccepter.accept(path))
045                                                            ret.add(new URL("jar:" + target + "!" + p));
046                                    }
047                            } finally {
048                                    tin.close();
049                            }
050                    } else if (s.startsWith("file:")) {
051                            File f = new File(directory.getFile());
052                            File[] ffs = f.listFiles();
053                            if (ffs != null)
054                                    for (File ff : ffs)
055                                            if (pathAccepter == null || pathAccepter.accept(ff.toString()))
056                                                    ret.add(ff.toURI().toURL());
057                    } else 
058                            throw new IOException("Cannot list contents of " + directory);
059                    
060                    return ret;
061            }
062    }