Something similar was asked in another thread, but I figured others may find 
this helpful.

I wanted to automatically bind my interfaces and implementations of my numerous 
DAOs in my AppModule. It's pretty easy, so here is what I idd. This is called 
from the bind static method. Obviously you'd need to change the package names. 
My naming convention is to put the implementation packages in a sub ".impl" 
package, e.g. com.myasd.db.dao.impl in my case. Classes then are suffixed with 
"Impl" to make Eclipse's package auto-complete suggestions work better. I've 
been using this for a few years, at lest.

    @SuppressWarnings({ "unchecked", "rawtypes" })
    static void bindDAOs(ServiceBinder binder) {
        try {
            ClassLoader contextClassLoader = 
Thread.currentThread().getContextClassLoader();
            List<Class<?>> daos = 
PackageEnumerator.getClassesForPackage("com.myasd.db.dao");
            for (Class<?> dao : daos) {
                String pkg = dao.getPackage().getName();
                String cls = dao.getSimpleName();
                try {
                    Class impl = 
contextClassLoader.loadClass(pkg+".impl."+cls+"Impl");
                    binder.bind(dao, impl).scope(ScopeConstants.PERTHREAD);
                } catch (ClassNotFoundException e) {
                    // Ignore, we just won't bind that class.
                }
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }


Helper method borrowed from who-knows-where:

    public static List<Class<?>> getClassesForPackage(String packageName) 
throws ClassNotFoundException {
        // This will hold a list of directories matching the pckgname.
        // There may be more than one if a package is split over multiple
        // jars/paths
        List<Class<?>> classes = new ArrayList<Class<?>>();
        ArrayList<File> directories = new ArrayList<File>();
        try {
            ClassLoader cld = Thread.currentThread().getContextClassLoader();
            if (cld == null) {
                throw new ClassNotFoundException("Can't get class loader.");
            }
            // Ask for all resources for the path
            Enumeration<URL> resources = 
cld.getResources(packageName.replace('.', '/'));
            while (resources.hasMoreElements()) {
                URL res = resources.nextElement();
                if (res.getProtocol().equalsIgnoreCase("jar")) {
                    JarURLConnection conn = (JarURLConnection) 
res.openConnection();
                    JarFile jar = conn.getJarFile();
                    for (JarEntry e : Collections.list(jar.entries())) {

                        if (e.getName().startsWith(packageName.replace('.', 
'/')) && e.getName().endsWith(".class")
                                && !e.getName().contains("$")) {
                            String className = e.getName().replace("/", 
".").substring(0, e.getName().length() - 6);
                            System.out.println(className);
                            classes.add(Class.forName(className));
                        }
                    }
                } else
                    directories.add(new File(URLDecoder.decode(res.getPath(), 
"UTF-8")));
            }
        } catch (NullPointerException x) {
            throw new ClassNotFoundException(packageName + " does not appear to 
be "
                    + "a valid package (Null pointer exception)");
        } catch (UnsupportedEncodingException encex) {
            throw new ClassNotFoundException(packageName + " does not appear to 
be "
                    + "a valid package (Unsupported encoding)");
        } catch (IOException ioex) {
            throw new ClassNotFoundException("IOException was thrown when 
trying " + "to get all resources for "
                    + packageName);
        }

        // For every directory identified capture all the .class files
        for (File directory : directories) {
            if (directory.exists()) {
                // Get the list of the files contained in the package
                String[] files = directory.list();
                for (String file : files) {
                    // we are only interested in .class files
                    if (file.endsWith(".class")) {
                        // removes the .class extension
                        classes.add(Class.forName(packageName + '.' + 
file.substring(0, file.length() - 6)));
                    }
                }
            } else {
                throw new ClassNotFoundException(packageName + " (" + 
directory.getPath()
                        + ") does not appear to be a valid package");
            }
        }
        return classes;
    }

Norman Franke
Answering Service for Directors, Inc.
www.myasd.com



Reply via email to