You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2012/02/21 15:45:43 UTC

svn commit: r1291819 - in /openejb/trunk/maven-plugins/xbean-xml/src: main/java/org/apache/openejb/xbean/xml/ test/java/org/apache/openejb/xbean/xml/ test/resources/

Author: rmannibucau
Date: Tue Feb 21 14:45:42 2012
New Revision: 1291819

URL: http://svn.apache.org/viewvc?rev=1291819&view=rev
Log:
managing packages in xbean-xml

Added:
    openejb/trunk/maven-plugins/xbean-xml/src/test/java/org/apache/openejb/xbean/xml/AbstractXmlAnnotationFinderTest.java
    openejb/trunk/maven-plugins/xbean-xml/src/test/java/org/apache/openejb/xbean/xml/XmlClassesAnnotationFinderHelperTest.java
      - copied, changed from r1291681, openejb/trunk/maven-plugins/xbean-xml/src/test/java/org/apache/openejb/xbean/xml/XmlAnnotationFinderHelperTest.java
    openejb/trunk/maven-plugins/xbean-xml/src/test/java/org/apache/openejb/xbean/xml/XmlPackageAnnotationFinderTest.java
    openejb/trunk/maven-plugins/xbean-xml/src/test/resources/test-package-scan.xml
Removed:
    openejb/trunk/maven-plugins/xbean-xml/src/test/java/org/apache/openejb/xbean/xml/XmlAnnotationFinderHelperTest.java
Modified:
    openejb/trunk/maven-plugins/xbean-xml/src/main/java/org/apache/openejb/xbean/xml/XMLAnnotationFinderHelper.java

Modified: openejb/trunk/maven-plugins/xbean-xml/src/main/java/org/apache/openejb/xbean/xml/XMLAnnotationFinderHelper.java
URL: http://svn.apache.org/viewvc/openejb/trunk/maven-plugins/xbean-xml/src/main/java/org/apache/openejb/xbean/xml/XMLAnnotationFinderHelper.java?rev=1291819&r1=1291818&r2=1291819&view=diff
==============================================================================
--- openejb/trunk/maven-plugins/xbean-xml/src/main/java/org/apache/openejb/xbean/xml/XMLAnnotationFinderHelper.java (original)
+++ openejb/trunk/maven-plugins/xbean-xml/src/main/java/org/apache/openejb/xbean/xml/XMLAnnotationFinderHelper.java Tue Feb 21 14:45:42 2012
@@ -4,11 +4,22 @@ import org.apache.xbean.finder.Annotatio
 import org.apache.xbean.finder.IAnnotationFinder;
 import org.apache.xbean.finder.archive.Archive;
 import org.apache.xbean.finder.archive.ClassesArchive;
+import org.apache.xbean.finder.archive.ClasspathArchive;
+import org.apache.xbean.finder.archive.CompositeArchive;
+import org.apache.xbean.finder.archive.FilteredArchive;
+import org.apache.xbean.finder.filter.Filter;
+import org.apache.xbean.finder.filter.FilterList;
+import org.apache.xbean.finder.filter.PackageFilter;
 
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.JAXBException;
 import java.io.BufferedInputStream;
 import java.io.InputStream;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
 
 public final class XMLAnnotationFinderHelper {
     private static final JAXBContext JAXB_CONTEXT;
@@ -16,7 +27,7 @@ public final class XMLAnnotationFinderHe
         try {
             JAXB_CONTEXT = JAXBContext.newInstance(Scan.class);
         } catch (JAXBException e) {
-            throw new RuntimeException(e); // TODO: handle it with a custom exception
+            throw new RuntimeException(e); // shouldn't occur
         }
     }
 
@@ -24,14 +35,33 @@ public final class XMLAnnotationFinderHe
         // no-op
     }
 
-    public static IAnnotationFinder finderFromXml(final InputStream is, final ClassLoader loader) throws JAXBException {
+    public static IAnnotationFinder finderFromXml(final InputStream is, final ClassLoader loader, final Iterable<URL> urls, final Class<?> archiveClazz) throws JAXBException {
         final Scan scan = (Scan) JAXB_CONTEXT.createUnmarshaller().unmarshal(new BufferedInputStream(is));
 
-        // TODO: manage packages
+        final Archive packageArchive = packageArchive(scan.getPackagename(), loader, urls, archiveClazz);
+        final Archive classesArchive = classesArchive(scan, loader);
 
+        final Archive archive;
+        if (packageArchive != null && classesArchive != null) {
+            archive = new CompositeArchive(classesArchive, packageArchive);
+        } else if (packageArchive != null) {
+            archive = packageArchive;
+        } else {
+            archive = classesArchive;
+        }
+        return new AnnotationFinder(archive); // don't link here
+    }
+
+    public static Archive classesArchive(final Scan scan, final ClassLoader loader) {
         Class<?>[] classes = new Class<?>[scan.getClassname().size()];
         int i = 0;
+        final Set<String> packages = scan.getPackagename();
         for (String clazz : scan.getClassname()) {
+            // skip classes managed by package filtering
+            if (packages != null && clazzInPackage(packages, clazz)) {
+                continue;
+            }
+
             try {
                 classes[i++] = loader.loadClass(clazz);
             } catch (ClassNotFoundException e) {
@@ -45,7 +75,41 @@ public final class XMLAnnotationFinderHe
             classes = updatedClasses;
         }
 
-        final Archive archive = new ClassesArchive(classes);
-        return new AnnotationFinder(archive); // don't link here
+        return new ClassesArchive(classes);
+    }
+
+    public static Archive packageArchive(final Set<String> packagenames, final ClassLoader loader, final Iterable<URL> urls, final Class<?> archiveClazz) {
+        if (!packagenames.isEmpty()) {
+            Archive rawArchive = null;
+            if (archiveClazz != null) {
+                try {
+                    rawArchive = (Archive) archiveClazz.getConstructor(ClassLoader.class, Iterable.class).newInstance(loader, urls);
+                } catch (Exception e) {
+                    // ignored
+                }
+            }
+            if (rawArchive == null) {
+                rawArchive = new ClasspathArchive(loader, urls);
+            }
+            return new FilteredArchive(rawArchive, filters(packagenames));
+        }
+        return null;
+    }
+
+    private static boolean clazzInPackage(final Collection<String> packagename, final String clazz) {
+        for (String str : packagename) {
+            if (clazz.startsWith(str)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private static Filter filters(final Set<String> packageNames) {
+        final List<Filter> filters = new ArrayList<Filter>();
+        for (String packageName : packageNames) {
+            filters.add(new PackageFilter(packageName));
+        }
+        return new FilterList(filters);
     }
 }

Added: openejb/trunk/maven-plugins/xbean-xml/src/test/java/org/apache/openejb/xbean/xml/AbstractXmlAnnotationFinderTest.java
URL: http://svn.apache.org/viewvc/openejb/trunk/maven-plugins/xbean-xml/src/test/java/org/apache/openejb/xbean/xml/AbstractXmlAnnotationFinderTest.java?rev=1291819&view=auto
==============================================================================
--- openejb/trunk/maven-plugins/xbean-xml/src/test/java/org/apache/openejb/xbean/xml/AbstractXmlAnnotationFinderTest.java (added)
+++ openejb/trunk/maven-plugins/xbean-xml/src/test/java/org/apache/openejb/xbean/xml/AbstractXmlAnnotationFinderTest.java Tue Feb 21 14:45:42 2012
@@ -0,0 +1,43 @@
+package org.apache.openejb.xbean.xml;
+
+import org.apache.openejb.xbean.xml.bean.MyAnnotation;
+import org.apache.openejb.xbean.xml.bean.MyBean1;
+import org.apache.openejb.xbean.xml.bean.MyBean2;
+import org.apache.openejb.xbean.xml.bean.MyBean3;
+import org.apache.xbean.finder.IAnnotationFinder;
+import org.junit.Test;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+public abstract class AbstractXmlAnnotationFinderTest {
+    protected abstract IAnnotationFinder finder();
+
+    @Test
+    public void findClass() {
+        final List<Class<?>> myClassAnnotated = finder().findAnnotatedClasses(MyAnnotation.class);
+        assertEquals(1, myClassAnnotated.size());
+        assertEquals(MyBean1.class, myClassAnnotated.iterator().next());
+    }
+
+    @Test
+    public void findMethod() {
+        final List<Method> myMethodAnnotated = finder().findAnnotatedMethods(MyAnnotation.class);
+        assertEquals(1, myMethodAnnotated.size());
+        final Method method = myMethodAnnotated.iterator().next();
+        assertEquals(MyBean2.class, method.getDeclaringClass());
+        assertEquals("aMethod", method.getName());
+    }
+
+    @Test
+    public void findField() {
+        final List<Field> myFieldAnnotated = finder().findAnnotatedFields(MyAnnotation.class);
+        assertEquals(1, myFieldAnnotated.size());
+        final Field field = myFieldAnnotated.iterator().next();
+        assertEquals(MyBean3.class, field.getDeclaringClass());
+        assertEquals("aField", field.getName());
+    }
+}

Copied: openejb/trunk/maven-plugins/xbean-xml/src/test/java/org/apache/openejb/xbean/xml/XmlClassesAnnotationFinderHelperTest.java (from r1291681, openejb/trunk/maven-plugins/xbean-xml/src/test/java/org/apache/openejb/xbean/xml/XmlAnnotationFinderHelperTest.java)
URL: http://svn.apache.org/viewvc/openejb/trunk/maven-plugins/xbean-xml/src/test/java/org/apache/openejb/xbean/xml/XmlClassesAnnotationFinderHelperTest.java?p2=openejb/trunk/maven-plugins/xbean-xml/src/test/java/org/apache/openejb/xbean/xml/XmlClassesAnnotationFinderHelperTest.java&p1=openejb/trunk/maven-plugins/xbean-xml/src/test/java/org/apache/openejb/xbean/xml/XmlAnnotationFinderHelperTest.java&r1=1291681&r2=1291819&rev=1291819&view=diff
==============================================================================
--- openejb/trunk/maven-plugins/xbean-xml/src/test/java/org/apache/openejb/xbean/xml/XmlAnnotationFinderHelperTest.java (original)
+++ openejb/trunk/maven-plugins/xbean-xml/src/test/java/org/apache/openejb/xbean/xml/XmlClassesAnnotationFinderHelperTest.java Tue Feb 21 14:45:42 2012
@@ -1,51 +1,21 @@
 package org.apache.openejb.xbean.xml;
 
-import org.apache.openejb.xbean.xml.bean.MyAnnotation;
-import org.apache.openejb.xbean.xml.bean.MyBean1;
-import org.apache.openejb.xbean.xml.bean.MyBean2;
-import org.apache.openejb.xbean.xml.bean.MyBean3;
 import org.apache.xbean.finder.IAnnotationFinder;
 import org.junit.BeforeClass;
-import org.junit.Test;
 
 import javax.xml.bind.JAXBException;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.util.List;
 
-import static org.junit.Assert.assertEquals;
-
-public class XmlAnnotationFinderHelperTest {
+public class XmlClassesAnnotationFinderHelperTest extends AbstractXmlAnnotationFinderTest {
     private static IAnnotationFinder finder;
 
     @BeforeClass
     public static void initFinder() throws JAXBException {
         final ClassLoader loader = Thread.currentThread().getContextClassLoader();
-        finder = XMLAnnotationFinderHelper.finderFromXml(loader.getResourceAsStream("test-scan.xml"), loader);
-    }
-
-    @Test
-    public void findClass() {
-        final List<Class<?>> myClassAnnotated = finder.findAnnotatedClasses(MyAnnotation.class);
-        assertEquals(1, myClassAnnotated.size());
-        assertEquals(MyBean1.class, myClassAnnotated.iterator().next());
-    }
-
-    @Test
-    public void findMethod() {
-        final List<Method> myMethodAnnotated = finder.findAnnotatedMethods(MyAnnotation.class);
-        assertEquals(1, myMethodAnnotated.size());
-        final Method method = myMethodAnnotated.iterator().next();
-        assertEquals(MyBean2.class, method.getDeclaringClass());
-        assertEquals("aMethod", method.getName());
+        finder = XMLAnnotationFinderHelper.finderFromXml(loader.getResourceAsStream("test-scan.xml"), loader, null, null);
     }
 
-    @Test
-    public void findField() {
-        final List<Field> myFieldAnnotated = finder.findAnnotatedFields(MyAnnotation.class);
-        assertEquals(1, myFieldAnnotated.size());
-        final Field field = myFieldAnnotated.iterator().next();
-        assertEquals(MyBean3.class, field.getDeclaringClass());
-        assertEquals("aField", field.getName());
+    @Override
+    protected IAnnotationFinder finder() {
+        return finder;
     }
 }

Added: openejb/trunk/maven-plugins/xbean-xml/src/test/java/org/apache/openejb/xbean/xml/XmlPackageAnnotationFinderTest.java
URL: http://svn.apache.org/viewvc/openejb/trunk/maven-plugins/xbean-xml/src/test/java/org/apache/openejb/xbean/xml/XmlPackageAnnotationFinderTest.java?rev=1291819&view=auto
==============================================================================
--- openejb/trunk/maven-plugins/xbean-xml/src/test/java/org/apache/openejb/xbean/xml/XmlPackageAnnotationFinderTest.java (added)
+++ openejb/trunk/maven-plugins/xbean-xml/src/test/java/org/apache/openejb/xbean/xml/XmlPackageAnnotationFinderTest.java Tue Feb 21 14:45:42 2012
@@ -0,0 +1,21 @@
+package org.apache.openejb.xbean.xml;
+
+import org.apache.xbean.finder.IAnnotationFinder;
+import org.junit.BeforeClass;
+
+import javax.xml.bind.JAXBException;
+
+public class XmlPackageAnnotationFinderTest extends AbstractXmlAnnotationFinderTest {
+    private static IAnnotationFinder finder;
+
+    @BeforeClass
+    public static void initFinder() throws JAXBException {
+        final ClassLoader loader = Thread.currentThread().getContextClassLoader();
+        finder = XMLAnnotationFinderHelper.finderFromXml(loader.getResourceAsStream("test-package-scan.xml"), loader, null, null);
+    }
+
+    @Override
+    protected IAnnotationFinder finder() {
+        return finder;
+    }
+}

Added: openejb/trunk/maven-plugins/xbean-xml/src/test/resources/test-package-scan.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/maven-plugins/xbean-xml/src/test/resources/test-package-scan.xml?rev=1291819&view=auto
==============================================================================
--- openejb/trunk/maven-plugins/xbean-xml/src/test/resources/test-package-scan.xml (added)
+++ openejb/trunk/maven-plugins/xbean-xml/src/test/resources/test-package-scan.xml Tue Feb 21 14:45:42 2012
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<scan>
+  <classes>
+    <class>org.apache.openejb.xbean.xml.bean.MyBean1</class>
+    <class>org.apache.openejb.xbean.xml.bean.MyBean2</class>
+    <class>org.apache.openejb.xbean.xml.bean.MyBean3</class>
+  </classes>
+  <packages/>
+</scan>