You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by cz...@apache.org on 2010/11/01 21:01:05 UTC

svn commit: r1029812 - in /felix/trunk/scrplugin: annotations/src/main/resources/ annotations/src/main/resources/META-INF/ annotations/src/main/resources/META-INF/services/ generator/src/main/java/org/apache/felix/scrplugin/ generator/src/main/java/org...

Author: cziegeler
Date: Mon Nov  1 20:01:05 2010
New Revision: 1029812

URL: http://svn.apache.org/viewvc?rev=1029812&view=rev
Log:
FELIX-2679 : Detect AnnotationTagProvider's through META-INF/services

Added:
    felix/trunk/scrplugin/annotations/src/main/resources/
    felix/trunk/scrplugin/annotations/src/main/resources/META-INF/
    felix/trunk/scrplugin/annotations/src/main/resources/META-INF/services/
    felix/trunk/scrplugin/annotations/src/main/resources/META-INF/services/org.apache.felix.scrplugin.tags.annotation.AnnotationTagProvider
Modified:
    felix/trunk/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/JavaClassDescriptorManager.java
    felix/trunk/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/tags/annotation/AnnotationTagProviderManager.java
    felix/trunk/scrplugin/maven-scr-plugin/pom.xml
    felix/trunk/scrplugin/scrtask/pom.xml

Added: felix/trunk/scrplugin/annotations/src/main/resources/META-INF/services/org.apache.felix.scrplugin.tags.annotation.AnnotationTagProvider
URL: http://svn.apache.org/viewvc/felix/trunk/scrplugin/annotations/src/main/resources/META-INF/services/org.apache.felix.scrplugin.tags.annotation.AnnotationTagProvider?rev=1029812&view=auto
==============================================================================
--- felix/trunk/scrplugin/annotations/src/main/resources/META-INF/services/org.apache.felix.scrplugin.tags.annotation.AnnotationTagProvider (added)
+++ felix/trunk/scrplugin/annotations/src/main/resources/META-INF/services/org.apache.felix.scrplugin.tags.annotation.AnnotationTagProvider Mon Nov  1 20:01:05 2010
@@ -0,0 +1,2 @@
+org.apache.felix.scrplugin.tags.annotation.defaulttag.DefaultAnnotationTagProvider
+org.apache.felix.scrplugin.tags.annotation.sling.SlingAnnotationTagProvider

Modified: felix/trunk/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/JavaClassDescriptorManager.java
URL: http://svn.apache.org/viewvc/felix/trunk/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/JavaClassDescriptorManager.java?rev=1029812&r1=1029811&r2=1029812&view=diff
==============================================================================
--- felix/trunk/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/JavaClassDescriptorManager.java (original)
+++ felix/trunk/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/JavaClassDescriptorManager.java Mon Nov  1 20:01:05 2010
@@ -14,14 +14,9 @@
 package org.apache.felix.scrplugin;
 
 
-import java.io.File;
-import java.io.FilterInputStream;
-import java.io.IOException;
-import java.io.InputStream;
+import java.io.*;
 import java.util.*;
-import java.util.jar.JarEntry;
-import java.util.jar.JarFile;
-import java.util.jar.Manifest;
+import java.util.jar.*;
 
 import org.apache.felix.scrplugin.om.Component;
 import org.apache.felix.scrplugin.om.Components;
@@ -31,6 +26,7 @@ import org.apache.felix.scrplugin.tags.a
 import org.apache.felix.scrplugin.tags.cl.ClassLoaderJavaClassDescription;
 import org.apache.felix.scrplugin.tags.qdox.QDoxJavaClassDescription;
 import org.apache.felix.scrplugin.xml.ComponentDescriptorIO;
+
 import com.thoughtworks.qdox.JavaDocBuilder;
 import com.thoughtworks.qdox.model.JavaClass;
 import com.thoughtworks.qdox.model.JavaSource;
@@ -86,7 +82,7 @@ public abstract class JavaClassDescripto
         this.processAnnotations = processAnnotations;
         this.parseJavadocs = parseJavadocs;
         this.log = log;
-        this.annotationTagProviderManager = new AnnotationTagProviderManager( annotationTagProviders );
+        this.annotationTagProviderManager = new AnnotationTagProviderManager( log, annotationTagProviders, classLoader );
         this.classloader = classLoader;
 
         ClassUtil.classLoader = this.classloader;

Modified: felix/trunk/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/tags/annotation/AnnotationTagProviderManager.java
URL: http://svn.apache.org/viewvc/felix/trunk/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/tags/annotation/AnnotationTagProviderManager.java?rev=1029812&r1=1029811&r2=1029812&view=diff
==============================================================================
--- felix/trunk/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/tags/annotation/AnnotationTagProviderManager.java (original)
+++ felix/trunk/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/tags/annotation/AnnotationTagProviderManager.java Mon Nov  1 20:01:05 2010
@@ -19,9 +19,13 @@
 package org.apache.felix.scrplugin.tags.annotation;
 
 
-import java.util.ArrayList;
-import java.util.List;
+import java.security.CodeSource;
+import java.security.ProtectionDomain;
+import java.util.*;
 
+import javax.imageio.spi.ServiceRegistry;
+
+import org.apache.felix.scrplugin.Log;
 import org.apache.felix.scrplugin.SCRDescriptorFailureException;
 import org.apache.felix.scrplugin.tags.JavaField;
 import org.apache.felix.scrplugin.tags.JavaTag;
@@ -43,36 +47,97 @@ public class AnnotationTagProviderManage
      * that provide mappings from custom annotations to
      * {@link org.apache.felix.scrplugin.tags.JavaTag} implementations.
      */
-    private final List<AnnotationTagProvider> annotationTagProviders = new ArrayList<AnnotationTagProvider>();
+    private final Map<String, AnnotationTagProvider> annotationTagProviders = new LinkedHashMap<String, AnnotationTagProvider>();
 
+    private final Log log;
 
     /**
      * @param annotationTagProviderClasses List of classes that implements
      *            {@link AnnotationTagProvider} interface.
      * @throws SCRDescriptorFailureException
      */
-    public AnnotationTagProviderManager( String[] annotationTagProviderClasses ) throws SCRDescriptorFailureException
+    public AnnotationTagProviderManager( final Log log,
+            final String[] annotationTagProviderClasses,
+            final ClassLoader classLoader )
+    throws SCRDescriptorFailureException
     {
+        this.log = log;
+
+        // search for providers
+        final Iterator<AnnotationTagProvider> serviceIter = ServiceRegistry.lookupProviders(AnnotationTagProvider.class, classLoader);
+        while ( serviceIter.hasNext() )
+        {
+            final AnnotationTagProvider provider = serviceIter.next();
+            this.addProvider(provider, false);
+        }
 
-        // the classloader used to load the provider classes
-        final ClassLoader classLoader = getClass().getClassLoader();
+        // add custom providers defined in pom
+        for ( int i = 0; i < annotationTagProviderClasses.length; i++ )
+        {
+            loadProvider( classLoader, annotationTagProviderClasses[i], false );
+        }
 
-        // always add provider supporting built-in SCR default properties
-        loadProvider( annotationTagProviders, classLoader,
+        // always add provider supporting built-in SCR default properties (for compatibility with older
+        // annotation versions)
+        loadProvider( classLoader,
             "org.apache.felix.scrplugin.tags.annotation.defaulttag.DefaultAnnotationTagProvider", true );
-        loadProvider( annotationTagProviders, classLoader,
+        loadProvider( classLoader,
             "org.apache.felix.scrplugin.tags.annotation.sling.SlingAnnotationTagProvider", true );
+    }
 
-        // add custom providers defined in pom
-        for ( int i = 0; i < annotationTagProviderClasses.length; i++ )
+    /**
+     * Try to get the location (class loader) from the object.
+     */
+    private String getLocation(final Object obj)
+    {
+        try {
+            final ProtectionDomain pd = obj.getClass().getProtectionDomain();
+            if ( pd != null && pd.getCodeSource() != null )
+            {
+                final CodeSource cs = pd.getCodeSource();
+                if ( cs.getLocation() != null )
+                {
+                    return cs.getLocation().toExternalForm();
+                }
+            }
+        }
+        catch (final SecurityException se)
         {
-            loadProvider( annotationTagProviders, classLoader, annotationTagProviderClasses[i], false );
+            // ignore this
         }
+        // by default return the class laoder
+        return obj.getClass().getClassLoader().toString();
     }
 
+    /**
+     * Add a provider (if not already available)
+     */
+    private void addProvider(final AnnotationTagProvider provider, final boolean silent)
+    {
+        // check if this provider is already loaded
+        final String key = provider.getClass().getName();
+        if ( !this.annotationTagProviders.containsKey(key) )
+        {
+            this.annotationTagProviders.put(key, provider);
+        }
+        else
+        {
+            if ( !silent )
+            {
+                // now check if the location of the providers (classloader) is different
+                // and log a warning
+                final AnnotationTagProvider usedProvider = this.annotationTagProviders.get(key);
+                if ( !usedProvider.equals(provider) )
+                {
+                    this.log.warn("Ignoring provider " + provider + " from location " + getLocation(provider) +
+                            ". Using previously found version from " + getLocation(usedProvider));
+                }
+
+            }
+        }
+    }
 
-    private static void loadProvider( final List<AnnotationTagProvider> annotationTagProviders,
-        final ClassLoader classLoader, final String className, final boolean silent )
+    private void loadProvider( final ClassLoader classLoader, final String className, final boolean silent )
         throws SCRDescriptorFailureException
     {
         String failureMessage = null;
@@ -81,7 +146,7 @@ public class AnnotationTagProviderManage
             Class<?> clazz = classLoader.loadClass( className );
             try
             {
-                annotationTagProviders.add( ( AnnotationTagProvider ) clazz.newInstance() );
+                addProvider( ( AnnotationTagProvider ) clazz.newInstance(), silent );
             }
             catch ( ClassCastException e )
             {
@@ -135,7 +200,7 @@ public class AnnotationTagProviderManage
     {
         List<JavaTag> tags = new ArrayList<JavaTag>();
 
-        for ( AnnotationTagProvider provider : this.annotationTagProviders )
+        for ( AnnotationTagProvider provider : this.annotationTagProviders.values() )
         {
             tags.addAll( provider.getTags( annotation, description, field ) );
         }

Modified: felix/trunk/scrplugin/maven-scr-plugin/pom.xml
URL: http://svn.apache.org/viewvc/felix/trunk/scrplugin/maven-scr-plugin/pom.xml?rev=1029812&r1=1029811&r2=1029812&view=diff
==============================================================================
--- felix/trunk/scrplugin/maven-scr-plugin/pom.xml (original)
+++ felix/trunk/scrplugin/maven-scr-plugin/pom.xml Mon Nov  1 20:01:05 2010
@@ -60,12 +60,6 @@
             <version>0.0.1-SNAPSHOT</version>
             <scope>compile</scope>
         </dependency>
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.scr.annotations</artifactId>
-            <version>1.3.1-SNAPSHOT</version>
-            <scope>compile</scope>
-        </dependency>
     </dependencies>
     
     <build>

Modified: felix/trunk/scrplugin/scrtask/pom.xml
URL: http://svn.apache.org/viewvc/felix/trunk/scrplugin/scrtask/pom.xml?rev=1029812&r1=1029811&r2=1029812&view=diff
==============================================================================
--- felix/trunk/scrplugin/scrtask/pom.xml (original)
+++ felix/trunk/scrplugin/scrtask/pom.xml Mon Nov  1 20:01:05 2010
@@ -57,12 +57,6 @@
             <version>0.0.1-SNAPSHOT</version>
             <scope>compile</scope>
         </dependency>
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.scr.annotations</artifactId>
-            <version>1.3.1-SNAPSHOT</version>
-            <scope>compile</scope>
-        </dependency>
     </dependencies>
     
     <build>