You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by cl...@apache.org on 2010/07/31 10:14:26 UTC

svn commit: r981016 - in /felix/trunk/ipojo: manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/ manipulator/src/main/java/org/apache/felix/ipojo/manipulator/ tests/core/annotations/ tests/core/annotations/src/main/java/foo/ test...

Author: clement
Date: Sat Jul 31 08:14:26 2010
New Revision: 981016

URL: http://svn.apache.org/viewvc?rev=981016&view=rev
Log:
Fix Felix-2487
If @Component is missing, the annotation processing is aborted.
This case is detected by the MetadataCollector, but the warning message is handled by Pojoization

Add tests.

Added:
    felix/trunk/ipojo/tests/core/annotations/src/main/java/foo/
    felix/trunk/ipojo/tests/core/annotations/src/main/java/foo/Foo.java
    felix/trunk/ipojo/tests/core/annotations/src/main/java/foo/ipojo/
    felix/trunk/ipojo/tests/core/annotations/src/main/java/foo/ipojo/IPOJOFoo.java
    felix/trunk/ipojo/tests/core/annotations/src/main/java/org/apache/felix/ipojo/test/scenarios/component/OnlyFoo.java
    felix/trunk/ipojo/tests/core/annotations/src/main/java/org/apache/felix/ipojo/test/scenarios/component/OnlyiPOJOFoo.java
Modified:
    felix/trunk/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/MetadataCollector.java
    felix/trunk/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/Pojoization.java
    felix/trunk/ipojo/tests/core/annotations/pom.xml

Modified: felix/trunk/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/MetadataCollector.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/MetadataCollector.java?rev=981016&r1=981015&r2=981016&view=diff
==============================================================================
--- felix/trunk/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/MetadataCollector.java (original)
+++ felix/trunk/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/MetadataCollector.java Sat Jul 31 08:14:26 2010
@@ -65,6 +65,8 @@ public class MetadataCollector extends E
      */
     private boolean m_containsComponentAnnotation = false;
     
+    private boolean m_ignoredBecauseOfMissingComponent = false;
+    
     /**
      * Map of [element ids, element].
      * This map is used to easily get an already created element.
@@ -101,6 +103,14 @@ public class MetadataCollector extends E
         return m_containsComponentAnnotation;
     }
     
+    public boolean isIgnoredBecauseOfMissingComponent() {
+        return m_ignoredBecauseOfMissingComponent;
+    }
+    
+    public String getClassName() {
+        return m_className;
+    }
+    
     /**
      * Start visiting a class.
      * Initialize the getter/setter generator, add the _cm field, add the pojo interface.
@@ -205,6 +215,12 @@ public class MetadataCollector extends E
      * @see org.objectweb.asm.commons.EmptyVisitor#visitEnd()
      */
     public void visitEnd() {
+        // If m_elem (Component) is null, print a warning and ignore.
+        if (m_elem == null  && ! m_elements.isEmpty()) {
+            m_ignoredBecauseOfMissingComponent = true;
+            return;
+        }
+        
         // Recompute the tree
         Set elems = getElements().keySet();
         Iterator it = elems.iterator();
@@ -218,7 +234,6 @@ public class MetadataCollector extends E
                 if (ref == null) {
                     // Add to the root
                     m_elem.addElement(current);
-                  // System.err.println("The element " + reference + " is not declared - skipping the element " + current.toXMLString());
                 } else {
                     ref.addElement(current);
                 }

Modified: felix/trunk/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/Pojoization.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/Pojoization.java?rev=981016&r1=981015&r2=981016&view=diff
==============================================================================
--- felix/trunk/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/Pojoization.java (original)
+++ felix/trunk/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/Pojoization.java Sat Jul 31 08:14:26 2010
@@ -29,6 +29,7 @@ import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -290,23 +291,26 @@ public class Pojoization {
      */
     private void computeAnnotations(byte[] inC) {
         ClassReader cr = new ClassReader(inC);
-        MetadataCollector xml = new MetadataCollector();
-        cr.accept(xml, 0);
-        if (xml.isComponentType()) {
+        MetadataCollector collector = new MetadataCollector();
+        cr.accept(collector, 0);
+        
+        if (collector.isIgnoredBecauseOfMissingComponent()) {
+            warn("Annotation processing ignored in " + collector.getClassName() + " - @Component missing");
+        } else if (collector.isComponentType()) {
             boolean toskip = false;
             for (int i = 0; !toskip && i < m_metadata.size(); i++) {
                 Element meta = (Element)  m_metadata.get(i);
                 if (! meta.getName().equals("instance") // Only if its a component type definition, 
                                                                  // so skip instance declaration 
                         && meta.containsAttribute("name")
-                        && meta.getAttribute("name").equalsIgnoreCase(xml.getComponentTypeDeclaration().getAttribute("name"))) {
+                        && meta.getAttribute("name").equalsIgnoreCase(collector.getComponentTypeDeclaration().getAttribute("name"))) {
                     toskip = true;
-                    warn("The component type " + xml.getComponentTypeDeclaration().getAttribute("name") + " is overriden by the metadata file");
+                    warn("The component type " + collector.getComponentTypeDeclaration().getAttribute("name") + " is overriden by the metadata file");
                 }
             }
             if (!toskip) {
                 // if no metadata or empty one, create a new array.
-                Element elem = xml.getComponentTypeDeclaration();
+                Element elem = collector.getComponentTypeDeclaration();
                 m_metadata.add(elem);
                 
                 String name = elem.getAttribute("classname");
@@ -319,9 +323,9 @@ public class Pojoization {
                 m_components.add(info);
                 
                 // Instantiate ?
-                if (xml.getInstanceDeclaration() != null) {
+                if (collector.getInstanceDeclaration() != null) {
                     warn("Declaring an empty instance of " + elem.getAttribute("classname"));
-                    m_metadata.add(xml.getInstanceDeclaration());
+                    m_metadata.add(collector.getInstanceDeclaration());
                 }
             }
         }

Modified: felix/trunk/ipojo/tests/core/annotations/pom.xml
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/tests/core/annotations/pom.xml?rev=981016&r1=981015&r2=981016&view=diff
==============================================================================
--- felix/trunk/ipojo/tests/core/annotations/pom.xml (original)
+++ felix/trunk/ipojo/tests/core/annotations/pom.xml Sat Jul 31 08:14:26 2010
@@ -102,7 +102,7 @@
               ${project.artifactId}
             </Bundle-SymbolicName>
             <Private-Package>
-              org.apache.felix.ipojo.test*
+              org.apache.felix.ipojo.test*, foo
             </Private-Package>
             <Test-Suite>
               org.apache.felix.ipojo.test.scenarios.annotations.AnnotationsTestSuite

Added: felix/trunk/ipojo/tests/core/annotations/src/main/java/foo/Foo.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/tests/core/annotations/src/main/java/foo/Foo.java?rev=981016&view=auto
==============================================================================
--- felix/trunk/ipojo/tests/core/annotations/src/main/java/foo/Foo.java (added)
+++ felix/trunk/ipojo/tests/core/annotations/src/main/java/foo/Foo.java Sat Jul 31 08:14:26 2010
@@ -0,0 +1,10 @@
+package foo;
+
+
+/**
+ * Creates a simple annotation to create the processing of non-matching
+ * annotations
+ */
+public @interface Foo {
+    String bar();
+}

Added: felix/trunk/ipojo/tests/core/annotations/src/main/java/foo/ipojo/IPOJOFoo.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/tests/core/annotations/src/main/java/foo/ipojo/IPOJOFoo.java?rev=981016&view=auto
==============================================================================
--- felix/trunk/ipojo/tests/core/annotations/src/main/java/foo/ipojo/IPOJOFoo.java (added)
+++ felix/trunk/ipojo/tests/core/annotations/src/main/java/foo/ipojo/IPOJOFoo.java Sat Jul 31 08:14:26 2010
@@ -0,0 +1,10 @@
+package foo.ipojo;
+
+
+/**
+ * Creates a simple annotation to create the processing of matching
+ * annotations
+ */
+public @interface IPOJOFoo {
+    String bar();
+}

Added: felix/trunk/ipojo/tests/core/annotations/src/main/java/org/apache/felix/ipojo/test/scenarios/component/OnlyFoo.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/tests/core/annotations/src/main/java/org/apache/felix/ipojo/test/scenarios/component/OnlyFoo.java?rev=981016&view=auto
==============================================================================
--- felix/trunk/ipojo/tests/core/annotations/src/main/java/org/apache/felix/ipojo/test/scenarios/component/OnlyFoo.java (added)
+++ felix/trunk/ipojo/tests/core/annotations/src/main/java/org/apache/felix/ipojo/test/scenarios/component/OnlyFoo.java Sat Jul 31 08:14:26 2010
@@ -0,0 +1,8 @@
+package org.apache.felix.ipojo.test.scenarios.component;
+
+import foo.Foo;
+
+@Foo(bar="bar")
+public class OnlyFoo {
+
+}

Added: felix/trunk/ipojo/tests/core/annotations/src/main/java/org/apache/felix/ipojo/test/scenarios/component/OnlyiPOJOFoo.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/tests/core/annotations/src/main/java/org/apache/felix/ipojo/test/scenarios/component/OnlyiPOJOFoo.java?rev=981016&view=auto
==============================================================================
--- felix/trunk/ipojo/tests/core/annotations/src/main/java/org/apache/felix/ipojo/test/scenarios/component/OnlyiPOJOFoo.java (added)
+++ felix/trunk/ipojo/tests/core/annotations/src/main/java/org/apache/felix/ipojo/test/scenarios/component/OnlyiPOJOFoo.java Sat Jul 31 08:14:26 2010
@@ -0,0 +1,8 @@
+package org.apache.felix.ipojo.test.scenarios.component;
+
+import foo.ipojo.IPOJOFoo;
+
+@IPOJOFoo(bar="bar")
+public class OnlyiPOJOFoo {
+
+}