There's a typo in the code snippet, should be:
String className = interfacesPackage.getName() + ".impl." +
intf.getSimpleName() + "Impl";
We need just package name, not its toString() presentation which is
"package com.x.y.z"
On Thu, Aug 16, 2012 at 11:34 AM, Dmitry Gusev <dmitry.gu...@gmail.com>wrote:
> Thanks for sharing, Norman!
>
> Here's mine implementation:
>
> public static void bind(ServiceBinder binder) throwsClassNotFoundException
>
> {
>
> autobindServices(binder, ProjectDAO.class.getPackage());
>
> autobindServices(binder, ProjectManager.class.getPackage());
>
>
>
> ...
>
> }
>
>
> @SuppressWarnings({"unchecked", "rawtypes"})
>
> private static void autobindServices(ServiceBinder binder, Package
> interfacesPackage) throws ClassNotFoundException
>
> {
>
> List<Class<?>> interfaces =
> Utils.getClassesForPackage(interfacesPackage.getName());
>
> for (Class intf : interfaces) {
>
> String className = interfacesPackage + ".impl." +
> intf.getSimpleName() + "Impl";
>
> try {
>
> Class impl = Class.forName(className);
>
> binder.bind(intf, impl);
>
> }
>
> catch (ClassNotFoundException e) {
>
> logger.warn("Class not found during autobinding: {}",
> className);
>
> }
>
> }
>
> }
>
>
> On Thu, Aug 16, 2012 at 2:33 AM, Norman Franke <nor...@myasd.com> wrote:
>
>> 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
>>
>>
>>
>>
>
>
> --
> Dmitry Gusev
>
> AnjLab Team
> http://anjlab.com
>
--
Dmitry Gusev
AnjLab Team
http://anjlab.com