You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ph...@apache.org on 2013/01/15 18:27:38 UTC

svn commit: r1433539 - in /qpid/proton/branches/jni-binding: design/api-reconciliation/ design/api-reconciliation/src/main/java/org/apache/qpid/proton/apireconciliation/ design/api-reconciliation/src/main/java/org/apache/qpid/proton/apireconciliation/p...

Author: philharveyonline
Date: Tue Jan 15 17:27:37 2013
New Revision: 1433539

URL: http://svn.apache.org/viewvc?rev=1433539&view=rev
Log:
PROTON-191: modified reconciliation tool to 1) use separate packages for API interfaces and implementating classes - the latter is where the annotations now live 2) tool to accept annotation classname as parameter 3) Resolve TODO in package searcher, restructure testdata

Added:
    qpid/proton/branches/jni-binding/design/api-reconciliation/src/main/java/org/apache/qpid/proton/apireconciliation/packagesearcher/
    qpid/proton/branches/jni-binding/design/api-reconciliation/src/main/java/org/apache/qpid/proton/apireconciliation/packagesearcher/PackageSearcher.java
    qpid/proton/branches/jni-binding/design/api-reconciliation/src/main/java/org/apache/qpid/proton/apireconciliation/reportwriter/AnnotationAccessor.java
    qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/TestAnnotation.java
      - copied, changed from r1431947, qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/DummyClass.java
    qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/
    qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/PackageSearcherTest.java
    qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/
    qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/manyimpls/
    qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/manyimpls/Impl1.java
      - copied, changed from r1431947, qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/InterfaceB.java
    qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/manyimpls/Impl2.java
      - copied, changed from r1431947, qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/DummyClass.java
    qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/manyimpls/InterfaceWithManyImpls.java
      - copied, changed from r1431947, qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/InterfaceB.java
    qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/noimpl/
    qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/noimpl/InterfaceWithoutImpl.java
      - copied, changed from r1431947, qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/InterfaceB.java
    qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/subpackage/
    qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/subpackage/InterfaceInSubPackage.java
      - copied, changed from r1431947, qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/subpackage/InterfaceInSubPackage.java
    qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/subpackage/impl/
    qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/subpackage/impl/ImplOfInterfaceInSubPackage.java
      - copied, changed from r1431947, qpid/proton/branches/jni-binding/design/api-reconciliation/src/main/java/org/apache/qpid/proton/apireconciliation/Reconciliation.java
    qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/tree/
    qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/tree/ImplAtTreeTop.java
      - copied, changed from r1431947, qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/InterfaceA.java
    qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/tree/InterfaceAtTreeTop.java
      - copied, changed from r1431947, qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/InterfaceB.java
    qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/tree/leaf/
    qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/tree/leaf/ImplAtLeaf.java
      - copied, changed from r1431947, qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/InterfaceB.java
    qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/tree/leaf/InterfaceAtLeaf.java
      - copied, changed from r1431947, qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/InterfaceB.java
    qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/reportwriter/AnnotationAccessorTest.java
Removed:
    qpid/proton/branches/jni-binding/design/api-reconciliation/src/main/java/org/apache/qpid/proton/apireconciliation/PackageSearcher.java
    qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/PackageSearcherTest.java
    qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/ReconciliationTest.java
    qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/DummyClass.java
    qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/InterfaceA.java
    qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/InterfaceB.java
    qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/subpackage/InterfaceInSubPackage.java
Modified:
    qpid/proton/branches/jni-binding/design/api-reconciliation/pom.xml
    qpid/proton/branches/jni-binding/design/api-reconciliation/src/main/java/org/apache/qpid/proton/apireconciliation/Joiner.java
    qpid/proton/branches/jni-binding/design/api-reconciliation/src/main/java/org/apache/qpid/proton/apireconciliation/Main.java
    qpid/proton/branches/jni-binding/design/api-reconciliation/src/main/java/org/apache/qpid/proton/apireconciliation/Reconciliation.java
    qpid/proton/branches/jni-binding/design/api-reconciliation/src/main/java/org/apache/qpid/proton/apireconciliation/reportwriter/ReconciliationReportWriter.java
    qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/JoinerTest.java
    qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/reportwriter/ReconciliationReportWriterTest.java
    qpid/proton/branches/jni-binding/proton-c/bindings/java/CMakeLists.txt

Modified: qpid/proton/branches/jni-binding/design/api-reconciliation/pom.xml
URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/design/api-reconciliation/pom.xml?rev=1433539&r1=1433538&r2=1433539&view=diff
==============================================================================
--- qpid/proton/branches/jni-binding/design/api-reconciliation/pom.xml (original)
+++ qpid/proton/branches/jni-binding/design/api-reconciliation/pom.xml Tue Jan 15 17:27:37 2013
@@ -24,6 +24,11 @@
   <groupId>org.apache.qpid</groupId>
   <artifactId>proton-api-reconciliation</artifactId>
   <version>1.0-SNAPSHOT</version>
+  <properties>
+    <proton-c-build-dir>${basedir}/../../proton-c/build</proton-c-build-dir>
+    <jni-jar>${proton-c-build-dir}/bindings/java/proton-jni.jar</jni-jar>
+  </properties>
+  
   <build>
     <plugins>
       <plugin>
@@ -39,12 +44,30 @@
         </executions>
         <configuration>
           <mainClass>org.apache.qpid.proton.apireconciliation.Main</mainClass>
+          <includePluginDependencies>true</includePluginDependencies>
           <arguments>
             <argument>org.apache.qpid.proton</argument>
             <argument>target/cfunctions.txt</argument>
+            <argument>org.apache.qpid.proton.ProtonCEquivalent</argument>
             <argument>target/apireconciliation.csv</argument>
           </arguments>
         </configuration>
+        <dependencies>
+          <dependency>
+            <groupId>org.apache.qpid</groupId>
+            <artifactId>proton-jni</artifactId>
+            <version>${project.version}</version>
+            <scope>system</scope>
+            <systemPath>${jni-jar}</systemPath>
+          </dependency>
+          <!-- 
+          <dependency>
+            <groupId>org.apache.qpid</groupId>
+            <artifactId>proton-j-impl</artifactId>
+            <version>1.0-SNAPSHOT</version>
+          </dependency>
+          -->
+        </dependencies>
       </plugin>
     </plugins>
   </build>

Modified: qpid/proton/branches/jni-binding/design/api-reconciliation/src/main/java/org/apache/qpid/proton/apireconciliation/Joiner.java
URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/design/api-reconciliation/src/main/java/org/apache/qpid/proton/apireconciliation/Joiner.java?rev=1433539&r1=1433538&r2=1433539&view=diff
==============================================================================
--- qpid/proton/branches/jni-binding/design/api-reconciliation/src/main/java/org/apache/qpid/proton/apireconciliation/Joiner.java (original)
+++ qpid/proton/branches/jni-binding/design/api-reconciliation/src/main/java/org/apache/qpid/proton/apireconciliation/Joiner.java Tue Jan 15 17:27:37 2013
@@ -25,13 +25,20 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import org.apache.qpid.proton.ProtonCEquivalent;
+import org.apache.qpid.proton.apireconciliation.reportwriter.AnnotationAccessor;
 
 public class Joiner
 {
+    private final AnnotationAccessor _annotationAccessor;
+
+    public Joiner(AnnotationAccessor annotationAccessor)
+    {
+        _annotationAccessor = annotationAccessor;
+    }
+
     /**
      * Does an outer join of the supplied C functions with those named by the
-     * {@link ProtonCEquivalent} annotations on the Java methods.
+     * annotations on the Java methods.
      */
     public ReconciliationReport join(List<String> protonCFunctions, Set<Method> javaMethods)
     {
@@ -69,10 +76,9 @@ public class Joiner
 
         for (Method method : javaMethods)
         {
-            ProtonCEquivalent protonCEquivalent = method.getAnnotation(ProtonCEquivalent.class);
-            if (protonCEquivalent != null)
+            String functionName = _annotationAccessor.getAnnotationValue(method);
+            if (functionName != null)
             {
-                String functionName = protonCEquivalent.functionName();
                 if (annotatedNameToMethod.containsKey(functionName))
                 {
                     functionsWithDuplicateJavaMappings.add(functionName);

Modified: qpid/proton/branches/jni-binding/design/api-reconciliation/src/main/java/org/apache/qpid/proton/apireconciliation/Main.java
URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/design/api-reconciliation/src/main/java/org/apache/qpid/proton/apireconciliation/Main.java?rev=1433539&r1=1433538&r2=1433539&view=diff
==============================================================================
--- qpid/proton/branches/jni-binding/design/api-reconciliation/src/main/java/org/apache/qpid/proton/apireconciliation/Main.java (original)
+++ qpid/proton/branches/jni-binding/design/api-reconciliation/src/main/java/org/apache/qpid/proton/apireconciliation/Main.java Tue Jan 15 17:27:37 2013
@@ -21,6 +21,7 @@ package org.apache.qpid.proton.apireconc
 
 import java.util.List;
 
+import org.apache.qpid.proton.apireconciliation.reportwriter.AnnotationAccessor;
 import org.apache.qpid.proton.apireconciliation.reportwriter.ReconciliationReportWriter;
 
 public class Main
@@ -28,7 +29,7 @@ public class Main
 
     public static void main(String[] args) throws Exception
     {
-        if (args.length != 3)
+        if (args.length != 4)
         {
             System.err.println("Unexpected number of arguments");
             Runtime.getRuntime().exit(-1);
@@ -36,16 +37,18 @@ public class Main
 
         String packageRootName = args[0];
         String cFunctionFile = args[1];
-        String outputFile = args[2];
+        String annotationClassName = args[2];
+        String outputFile = args[3];
 
         CFunctionNameListReader cFunctionNameListReader = new CFunctionNameListReader();
 
-        Reconciliation reconciliation = new Reconciliation();
+        AnnotationAccessor annotationAccessor = new AnnotationAccessor(annotationClassName);
+        Reconciliation reconciliation = new Reconciliation(annotationAccessor);
 
         List<String> cFunctionNames = cFunctionNameListReader.readCFunctionNames(cFunctionFile);
         ReconciliationReport report = reconciliation.reconcile(cFunctionNames, packageRootName);
 
-        ReconciliationReportWriter writer = new ReconciliationReportWriter();
+        ReconciliationReportWriter writer = new ReconciliationReportWriter(annotationAccessor);
         writer.write(outputFile, report);
         System.err.println("Written : " + outputFile);
     }

Modified: qpid/proton/branches/jni-binding/design/api-reconciliation/src/main/java/org/apache/qpid/proton/apireconciliation/Reconciliation.java
URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/design/api-reconciliation/src/main/java/org/apache/qpid/proton/apireconciliation/Reconciliation.java?rev=1433539&r1=1433538&r2=1433539&view=diff
==============================================================================
--- qpid/proton/branches/jni-binding/design/api-reconciliation/src/main/java/org/apache/qpid/proton/apireconciliation/Reconciliation.java (original)
+++ qpid/proton/branches/jni-binding/design/api-reconciliation/src/main/java/org/apache/qpid/proton/apireconciliation/Reconciliation.java Tue Jan 15 17:27:37 2013
@@ -22,10 +22,18 @@ import java.lang.reflect.Method;
 import java.util.List;
 import java.util.Set;
 
+import org.apache.qpid.proton.apireconciliation.packagesearcher.PackageSearcher;
+import org.apache.qpid.proton.apireconciliation.reportwriter.AnnotationAccessor;
+
 public class Reconciliation
 {
-    private PackageSearcher _packageSearcher = new PackageSearcher();
-    private Joiner _joiner = new Joiner();
+    private final PackageSearcher _packageSearcher = new PackageSearcher();
+    private final Joiner _joiner;
+
+    public Reconciliation(AnnotationAccessor annotationAccessor)
+    {
+        _joiner = new Joiner(annotationAccessor);
+    }
 
     public ReconciliationReport reconcile(List<String> protonCFunctions, String packageRootName)
     {

Added: qpid/proton/branches/jni-binding/design/api-reconciliation/src/main/java/org/apache/qpid/proton/apireconciliation/packagesearcher/PackageSearcher.java
URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/design/api-reconciliation/src/main/java/org/apache/qpid/proton/apireconciliation/packagesearcher/PackageSearcher.java?rev=1433539&view=auto
==============================================================================
--- qpid/proton/branches/jni-binding/design/api-reconciliation/src/main/java/org/apache/qpid/proton/apireconciliation/packagesearcher/PackageSearcher.java (added)
+++ qpid/proton/branches/jni-binding/design/api-reconciliation/src/main/java/org/apache/qpid/proton/apireconciliation/packagesearcher/PackageSearcher.java Tue Jan 15 17:27:37 2013
@@ -0,0 +1,105 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.proton.apireconciliation.packagesearcher;
+
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Logger;
+
+import org.reflections.Reflections;
+import org.reflections.scanners.SubTypesScanner;
+
+public class PackageSearcher
+{
+    private final static Logger LOGGER = Logger.getLogger(PackageSearcher.class.getName());
+
+    public Set<Method> findMethods(String packageName)
+    {
+        Reflections reflections = new Reflections(packageName, new SubTypesScanner(false));
+
+        Set<Class<?>> allInterfaces = getAllApiInterfaces(reflections);
+
+        Set<Method> allImplMethods = new HashSet<Method>();
+        for (Class<?> apiInterface : allInterfaces)
+        {
+            List<Method> apiMethodList = Arrays.asList(apiInterface.getMethods());
+            Set<?> impls = reflections.getSubTypesOf(apiInterface);
+            if (impls.size() == 0)
+            {
+                // In the case where there are no implementations of apiInterface, we add the methods of
+                // apiInterface so they appear on the final report.
+                for (Method apiMethod : apiMethodList)
+                {
+                    allImplMethods.add(apiMethod);
+                }
+            }
+            else
+            {
+                for (Object implementingClassObj : impls)
+                {
+                    Class implementingClass = (Class) implementingClassObj;
+                    LOGGER.fine("Found implementation " + implementingClass.getName() + " for " + apiInterface.getName());
+    
+                    for (Method apiMethod : apiMethodList)
+                    {
+                        Method implMethod = findImplMethodOfApiMethod(apiMethod, implementingClass);
+                        allImplMethods.add(implMethod);
+                    }
+                }
+            }
+        }
+        return allImplMethods;
+    }
+
+    private Method findImplMethodOfApiMethod(Method apiMethod, Class<?> impl)
+    {
+        try
+        {
+            Method implMethod = impl.getMethod(apiMethod.getName(), apiMethod.getParameterTypes());
+            return implMethod;
+        }
+        catch (Exception e)
+        {
+            // Should not happen
+            throw new IllegalStateException("Could not find implementation of method " + apiMethod
+                    + " on the impl. " + impl, e);
+        }
+    }
+
+    @SuppressWarnings("rawtypes")
+    private Set<Class<?>> getAllApiInterfaces(Reflections reflections)
+    {
+        Set<Class<?>> classes = reflections.getSubTypesOf(Object.class);
+        Set<Class<?>> interfaces = new HashSet<Class<?>>();
+
+        for (Class clazz : classes)
+        {
+            if(clazz.isInterface())
+            {
+                interfaces.add(clazz);
+            }
+        }
+
+        return interfaces;
+    }
+
+}

Added: qpid/proton/branches/jni-binding/design/api-reconciliation/src/main/java/org/apache/qpid/proton/apireconciliation/reportwriter/AnnotationAccessor.java
URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/design/api-reconciliation/src/main/java/org/apache/qpid/proton/apireconciliation/reportwriter/AnnotationAccessor.java?rev=1433539&view=auto
==============================================================================
--- qpid/proton/branches/jni-binding/design/api-reconciliation/src/main/java/org/apache/qpid/proton/apireconciliation/reportwriter/AnnotationAccessor.java (added)
+++ qpid/proton/branches/jni-binding/design/api-reconciliation/src/main/java/org/apache/qpid/proton/apireconciliation/reportwriter/AnnotationAccessor.java Tue Jan 15 17:27:37 2013
@@ -0,0 +1,90 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.proton.apireconciliation.reportwriter;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+public class AnnotationAccessor
+{
+    private static final String VALUE_METHOD = "value";
+    private final Class<Annotation> _annotationClass;
+    private final Method _functionNameMethod;
+
+    @SuppressWarnings("unchecked")
+    public AnnotationAccessor(String annotationClassName)
+    {
+        try
+        {
+            _annotationClass = (Class<Annotation>) Class.forName(annotationClassName);
+        }
+        catch (ClassNotFoundException e)
+        {
+            throw new IllegalArgumentException("Couldn't find annotation class " + annotationClassName, e);
+        }
+        
+        try
+        {
+            _functionNameMethod = _annotationClass.getMethod(VALUE_METHOD);
+        }
+        catch (SecurityException e)
+        {
+            throw new IllegalArgumentException("Couldn't find method " + VALUE_METHOD + " on annotation " + _annotationClass, e);
+        }
+        catch (NoSuchMethodException e)
+        {
+            throw new IllegalArgumentException("Couldn't find method " + VALUE_METHOD + " on annotation " + _annotationClass, e);
+        }
+    }
+
+    public String getAnnotationValue(Method javaMethod)
+    {
+        Annotation annotation = javaMethod.getAnnotation(_annotationClass);
+        if (javaMethod != null && annotation != null)
+        {
+            return getProtonCFunctionName(annotation);
+        }
+        else
+        {
+            return null;
+        }
+    }
+
+    private String getProtonCFunctionName(Annotation annotation)
+    {
+        try
+        {
+            return String.valueOf(_functionNameMethod.invoke(annotation));
+        }
+        catch (IllegalArgumentException e)
+        {
+            throw new RuntimeException("Couldn't invoke method " + _functionNameMethod + " on annotation " + annotation, e);
+        }
+        catch (IllegalAccessException e)
+        {
+            throw new RuntimeException("Couldn't invoke method " + _functionNameMethod + " on annotation " + annotation, e);
+        }
+        catch (InvocationTargetException e)
+        {
+            throw new RuntimeException("Couldn't invoke method " + _functionNameMethod + " on annotation " + annotation, e);
+        }
+    }
+}

Modified: qpid/proton/branches/jni-binding/design/api-reconciliation/src/main/java/org/apache/qpid/proton/apireconciliation/reportwriter/ReconciliationReportWriter.java
URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/design/api-reconciliation/src/main/java/org/apache/qpid/proton/apireconciliation/reportwriter/ReconciliationReportWriter.java?rev=1433539&r1=1433538&r2=1433539&view=diff
==============================================================================
--- qpid/proton/branches/jni-binding/design/api-reconciliation/src/main/java/org/apache/qpid/proton/apireconciliation/reportwriter/ReconciliationReportWriter.java (original)
+++ qpid/proton/branches/jni-binding/design/api-reconciliation/src/main/java/org/apache/qpid/proton/apireconciliation/reportwriter/ReconciliationReportWriter.java Tue Jan 15 17:27:37 2013
@@ -20,6 +20,7 @@
 package org.apache.qpid.proton.apireconciliation.reportwriter;
 
 import static java.lang.String.format;
+import static org.apache.commons.lang.StringUtils.defaultString;
 
 import java.io.File;
 import java.io.IOException;
@@ -29,7 +30,6 @@ import java.util.Iterator;
 import java.util.List;
 
 import org.apache.commons.io.FileUtils;
-import org.apache.qpid.proton.ProtonCEquivalent;
 import org.apache.qpid.proton.apireconciliation.ReconciliationReport;
 import org.apache.qpid.proton.apireconciliation.ReportRow;
 
@@ -37,6 +37,12 @@ public class ReconciliationReportWriter
 {
     private static final String ROW_FORMAT="%s,%s,%s";
     private static final String REPORT_TITLE = format(ROW_FORMAT, "C function","Java Method","Java Annotation");
+    private final AnnotationAccessor _annotationAccessor;
+
+    public ReconciliationReportWriter(AnnotationAccessor annotationAccessor)
+    {
+        _annotationAccessor = annotationAccessor;
+    }
 
     public void write(String outputFile, ReconciliationReport report) throws IOException
     {
@@ -50,38 +56,24 @@ public class ReconciliationReportWriter
         {
             ReportRow row = itr.next();
             Method javaMethod = row.getJavaMethod();
-            String cFunction = row.getCFunction() == null ? "" : row.getCFunction();
-            String fullyQualifiedMethodName = createFullyQualifiedJavaMethodName(javaMethod);
-            String annotationCFunction = extractCFunctionNameFromAnnotation(javaMethod);
+            String cFunction = defaultString(row.getCFunction());
 
+            String fullyQualifiedMethodName = "";
+            String annotationCFunction = "";
+            if (javaMethod != null)
+            {
+                fullyQualifiedMethodName = createFullyQualifiedJavaMethodName(javaMethod);
+                annotationCFunction = defaultString(_annotationAccessor.getAnnotationValue(javaMethod));
+            }
             reportLines.add(format(ROW_FORMAT, cFunction, fullyQualifiedMethodName, annotationCFunction));
         }
 
         FileUtils.writeLines(output, reportLines);
     }
 
-    private String extractCFunctionNameFromAnnotation(Method javaMethod)
-    {
-        if (javaMethod != null && javaMethod.getAnnotation(ProtonCEquivalent.class) != null)
-        {
-            return javaMethod.getAnnotation(ProtonCEquivalent.class).functionName();
-        }
-        else
-        {
-            return "";
-        }
-    }
-
     private String createFullyQualifiedJavaMethodName(Method javaMethod)
     {
-        if (javaMethod != null)
-        {
-            return javaMethod.getDeclaringClass().getName() +  "#" + javaMethod.getName();
-        }
-        else
-        {
-            return "";
-        }
+        return javaMethod.getDeclaringClass().getName() +  "#" + javaMethod.getName();
     }
 
 }

Modified: qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/JoinerTest.java
URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/JoinerTest.java?rev=1433539&r1=1433538&r2=1433539&view=diff
==============================================================================
--- qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/JoinerTest.java (original)
+++ qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/JoinerTest.java Tue Jan 15 17:27:37 2013
@@ -18,19 +18,18 @@
  */
 package org.apache.qpid.proton.apireconciliation;
 
-import static org.junit.Assert.*;
-
-import java.lang.reflect.Method;
 import static java.util.Arrays.asList;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 
-import java.util.Arrays;
+import java.lang.reflect.Method;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 
-import org.apache.qpid.proton.ProtonCEquivalent;
+import org.apache.qpid.proton.apireconciliation.reportwriter.AnnotationAccessor;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -38,7 +37,7 @@ public class JoinerTest
 {
     private static final String C_FUNCTION1 = "cFunction1";
     private static final String C_FUNCTION2 = "cFunction2";
-    private Joiner _joiner = new Joiner();
+    private Joiner _joiner;
     private Method _method1 = null;
     private Method _method2 = null;
     private Method _methodSharingFunctionNameAnnotationWithMethod2 = null;
@@ -51,6 +50,10 @@ public class JoinerTest
         _method2 = getClass().getMethod("javaMethodWithMapping2");
         _methodSharingFunctionNameAnnotationWithMethod2 = getClass().getMethod("javaMethodSharingFunctionNameAnnotationWithMethod2");
         _methodWithoutAnnotation = getClass().getMethod("javaMethodWithoutAnnotation");
+        
+        AnnotationAccessor annotationAccessor = new AnnotationAccessor(TestAnnotation.class.getName());
+        
+        _joiner = new Joiner(annotationAccessor);
     }
 
     @Test
@@ -142,17 +145,17 @@ public class JoinerTest
         assertEquals(expectedMethod, row.getJavaMethod());
     }
 
-    @ProtonCEquivalent(functionName=C_FUNCTION1)
+    @TestAnnotation(C_FUNCTION1)
     public void javaMethodWithMapping1()
     {
     }
 
-    @ProtonCEquivalent(functionName=C_FUNCTION2)
+    @TestAnnotation(C_FUNCTION2)
     public void javaMethodWithMapping2()
     {
     }
 
-    @ProtonCEquivalent(functionName=C_FUNCTION2)
+    @TestAnnotation(C_FUNCTION2)
     public void javaMethodSharingFunctionNameAnnotationWithMethod2()
     {
     }

Copied: qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/TestAnnotation.java (from r1431947, qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/DummyClass.java)
URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/TestAnnotation.java?p2=qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/TestAnnotation.java&p1=qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/DummyClass.java&r1=1431947&r2=1433539&rev=1433539&view=diff
==============================================================================
--- qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/DummyClass.java (original)
+++ qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/TestAnnotation.java Tue Jan 15 17:27:37 2013
@@ -15,17 +15,18 @@
  * KIND, either express or implied.  See the License for the
  * specific language governing permissions and limitations
  * under the License.
+ *
  */
-package org.apache.qpid.proton.apireconciliation.testdata;
+package org.apache.qpid.proton.apireconciliation;
 
-import org.apache.qpid.proton.apireconciliation.PackageSearcher;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
 
-/**
- * Methods on classes should be ignored by {@link PackageSearcher}
- */
-public class DummyClass
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface TestAnnotation
 {
-    public void dummyClassMethod()
-    {
-    };
-}
+    String value();
+}
\ No newline at end of file

Added: qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/PackageSearcherTest.java
URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/PackageSearcherTest.java?rev=1433539&view=auto
==============================================================================
--- qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/PackageSearcherTest.java (added)
+++ qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/PackageSearcherTest.java Tue Jan 15 17:27:37 2013
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.proton.apireconciliation.packagesearcher;
+
+import static org.junit.Assert.assertEquals;
+
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.qpid.proton.apireconciliation.packagesearcher.testdata.manyimpls.Impl1;
+import org.apache.qpid.proton.apireconciliation.packagesearcher.testdata.manyimpls.Impl2;
+import org.apache.qpid.proton.apireconciliation.packagesearcher.testdata.manyimpls.InterfaceWithManyImpls;
+import org.apache.qpid.proton.apireconciliation.packagesearcher.testdata.noimpl.InterfaceWithoutImpl;
+import org.apache.qpid.proton.apireconciliation.packagesearcher.testdata.tree.ImplAtTreeTop;
+import org.apache.qpid.proton.apireconciliation.packagesearcher.testdata.tree.InterfaceAtTreeTop;
+import org.apache.qpid.proton.apireconciliation.packagesearcher.testdata.tree.leaf.ImplAtLeaf;
+import org.junit.Test;
+
+public class PackageSearcherTest
+{
+    private PackageSearcher _packageSearcher = new PackageSearcher();
+
+    @Test
+    public void testFindDescendsPackageTree() throws Exception
+    {
+        String testDataPackage = InterfaceAtTreeTop.class.getPackage().getName();
+        Set<Method> actualMethods = _packageSearcher.findMethods(testDataPackage);
+        assertEquals(2, actualMethods.size());
+
+        Set<Method> expectedMethods = new HashSet<Method>(Arrays.asList(
+                ImplAtTreeTop.class.getMethod("method"),
+                ImplAtLeaf.class.getMethod("method")));
+
+        assertEquals(expectedMethods, actualMethods);
+    }
+
+    @Test
+    public void testZeroImplenentationsOfInterface() throws Exception
+    {
+        String testDataPackage = InterfaceWithoutImpl.class.getPackage().getName();
+
+        Method expectedMethod = InterfaceWithoutImpl.class.getMethod("method");
+
+        Set<Method> actualMethods = _packageSearcher.findMethods(testDataPackage);
+        assertEquals(1, actualMethods.size());
+
+        Method actualMethod = actualMethods.iterator().next();
+        assertEquals(expectedMethod, actualMethod);
+    }
+
+    @Test
+    public void testManyImplenentationsOfInterface() throws Exception
+    {
+        String testDataPackage = InterfaceWithManyImpls.class.getPackage().getName();
+
+        Set<Method> actualMethods = _packageSearcher.findMethods(testDataPackage);
+        assertEquals(2, actualMethods.size());
+
+        String methodName = "method";
+        Set<Method> expectedMethods = new HashSet<Method>(Arrays.asList(
+                Impl1.class.getMethod(methodName),
+                Impl2.class.getMethod(methodName)));
+
+        assertEquals(expectedMethods, actualMethods);
+    }
+}

Copied: qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/manyimpls/Impl1.java (from r1431947, qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/InterfaceB.java)
URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/manyimpls/Impl1.java?p2=qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/manyimpls/Impl1.java&p1=qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/InterfaceB.java&r1=1431947&r2=1433539&rev=1433539&view=diff
==============================================================================
--- qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/InterfaceB.java (original)
+++ qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/manyimpls/Impl1.java Tue Jan 15 17:27:37 2013
@@ -15,13 +15,15 @@
  * KIND, either express or implied.  See the License for the
  * specific language governing permissions and limitations
  * under the License.
+ *
  */
-package org.apache.qpid.proton.apireconciliation.testdata;
+package org.apache.qpid.proton.apireconciliation.packagesearcher.testdata.manyimpls;
 
-
-public interface InterfaceB
+public class Impl1 implements InterfaceWithManyImpls
 {
-    String methodWithoutAnnotation = "methodWithoutAnnotation";
 
-    void methodWithoutAnnotation();
+    public void method()
+    {
+    }
+
 }

Copied: qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/manyimpls/Impl2.java (from r1431947, qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/DummyClass.java)
URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/manyimpls/Impl2.java?p2=qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/manyimpls/Impl2.java&p1=qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/DummyClass.java&r1=1431947&r2=1433539&rev=1433539&view=diff
==============================================================================
--- qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/DummyClass.java (original)
+++ qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/manyimpls/Impl2.java Tue Jan 15 17:27:37 2013
@@ -15,17 +15,15 @@
  * KIND, either express or implied.  See the License for the
  * specific language governing permissions and limitations
  * under the License.
+ *
  */
-package org.apache.qpid.proton.apireconciliation.testdata;
+package org.apache.qpid.proton.apireconciliation.packagesearcher.testdata.manyimpls;
 
-import org.apache.qpid.proton.apireconciliation.PackageSearcher;
-
-/**
- * Methods on classes should be ignored by {@link PackageSearcher}
- */
-public class DummyClass
+public class Impl2 implements InterfaceWithManyImpls
 {
-    public void dummyClassMethod()
+
+    public void method()
     {
-    };
+    }
+
 }

Copied: qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/manyimpls/InterfaceWithManyImpls.java (from r1431947, qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/InterfaceB.java)
URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/manyimpls/InterfaceWithManyImpls.java?p2=qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/manyimpls/InterfaceWithManyImpls.java&p1=qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/InterfaceB.java&r1=1431947&r2=1433539&rev=1433539&view=diff
==============================================================================
--- qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/InterfaceB.java (original)
+++ qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/manyimpls/InterfaceWithManyImpls.java Tue Jan 15 17:27:37 2013
@@ -15,13 +15,12 @@
  * KIND, either express or implied.  See the License for the
  * specific language governing permissions and limitations
  * under the License.
+ *
  */
-package org.apache.qpid.proton.apireconciliation.testdata;
+package org.apache.qpid.proton.apireconciliation.packagesearcher.testdata.manyimpls;
 
-
-public interface InterfaceB
+public interface InterfaceWithManyImpls
 {
-    String methodWithoutAnnotation = "methodWithoutAnnotation";
+    void method();
 
-    void methodWithoutAnnotation();
 }

Copied: qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/noimpl/InterfaceWithoutImpl.java (from r1431947, qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/InterfaceB.java)
URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/noimpl/InterfaceWithoutImpl.java?p2=qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/noimpl/InterfaceWithoutImpl.java&p1=qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/InterfaceB.java&r1=1431947&r2=1433539&rev=1433539&view=diff
==============================================================================
--- qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/InterfaceB.java (original)
+++ qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/noimpl/InterfaceWithoutImpl.java Tue Jan 15 17:27:37 2013
@@ -15,13 +15,11 @@
  * KIND, either express or implied.  See the License for the
  * specific language governing permissions and limitations
  * under the License.
+ *
  */
-package org.apache.qpid.proton.apireconciliation.testdata;
+package org.apache.qpid.proton.apireconciliation.packagesearcher.testdata.noimpl;
 
-
-public interface InterfaceB
+public interface InterfaceWithoutImpl
 {
-    String methodWithoutAnnotation = "methodWithoutAnnotation";
-
-    void methodWithoutAnnotation();
+    void method();
 }

Copied: qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/subpackage/InterfaceInSubPackage.java (from r1431947, qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/subpackage/InterfaceInSubPackage.java)
URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/subpackage/InterfaceInSubPackage.java?p2=qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/subpackage/InterfaceInSubPackage.java&p1=qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/subpackage/InterfaceInSubPackage.java&r1=1431947&r2=1433539&rev=1433539&view=diff
==============================================================================
--- qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/subpackage/InterfaceInSubPackage.java (original)
+++ qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/subpackage/InterfaceInSubPackage.java Tue Jan 15 17:27:37 2013
@@ -16,15 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.qpid.proton.apireconciliation.testdata.subpackage;
-
-import org.apache.qpid.proton.ProtonCEquivalent;
+package org.apache.qpid.proton.apireconciliation.packagesearcher.testdata.subpackage;
 
 public interface InterfaceInSubPackage
 {
-    String cFunction = "subpackageFunction";
-    String methodWithinSubpackage = "methodWithinSubpackage";
-
-    @ProtonCEquivalent(functionName = cFunction)
     void methodWithinSubpackage();
 }

Copied: qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/subpackage/impl/ImplOfInterfaceInSubPackage.java (from r1431947, qpid/proton/branches/jni-binding/design/api-reconciliation/src/main/java/org/apache/qpid/proton/apireconciliation/Reconciliation.java)
URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/subpackage/impl/ImplOfInterfaceInSubPackage.java?p2=qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/subpackage/impl/ImplOfInterfaceInSubPackage.java&p1=qpid/proton/branches/jni-binding/design/api-reconciliation/src/main/java/org/apache/qpid/proton/apireconciliation/Reconciliation.java&r1=1431947&r2=1433539&rev=1433539&view=diff
==============================================================================
--- qpid/proton/branches/jni-binding/design/api-reconciliation/src/main/java/org/apache/qpid/proton/apireconciliation/Reconciliation.java (original)
+++ qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/subpackage/impl/ImplOfInterfaceInSubPackage.java Tue Jan 15 17:27:37 2013
@@ -15,23 +15,22 @@
  * KIND, either express or implied.  See the License for the
  * specific language governing permissions and limitations
  * under the License.
+ *
  */
-package org.apache.qpid.proton.apireconciliation;
+package org.apache.qpid.proton.apireconciliation.packagesearcher.testdata.subpackage.impl;
 
-import java.lang.reflect.Method;
-import java.util.List;
-import java.util.Set;
+import org.apache.qpid.proton.apireconciliation.TestAnnotation;
+import org.apache.qpid.proton.apireconciliation.packagesearcher.testdata.subpackage.InterfaceInSubPackage;
 
-public class Reconciliation
+public class ImplOfInterfaceInSubPackage implements InterfaceInSubPackage
 {
-    private PackageSearcher _packageSearcher = new PackageSearcher();
-    private Joiner _joiner = new Joiner();
 
-    public ReconciliationReport reconcile(List<String> protonCFunctions, String packageRootName)
+    public static final String VALUE_WITHIN_SUBPACKAGE = "subpackageFunction";
+    public static final String METHOD_WITHIN_SUBPACKAGE = "methodWithinSubpackage";
+
+    @TestAnnotation(VALUE_WITHIN_SUBPACKAGE)
+    public void methodWithinSubpackage()
     {
-        Set<Method> javaMethods = _packageSearcher.findMethods(packageRootName);
-        ReconciliationReport report = _joiner.join(protonCFunctions, javaMethods);
-        return report;
     }
 
 }

Copied: qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/tree/ImplAtTreeTop.java (from r1431947, qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/InterfaceA.java)
URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/tree/ImplAtTreeTop.java?p2=qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/tree/ImplAtTreeTop.java&p1=qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/InterfaceA.java&r1=1431947&r2=1433539&rev=1433539&view=diff
==============================================================================
--- qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/InterfaceA.java (original)
+++ qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/tree/ImplAtTreeTop.java Tue Jan 15 17:27:37 2013
@@ -15,16 +15,15 @@
  * KIND, either express or implied.  See the License for the
  * specific language governing permissions and limitations
  * under the License.
+ *
  */
-package org.apache.qpid.proton.apireconciliation.testdata;
+package org.apache.qpid.proton.apireconciliation.packagesearcher.testdata.tree;
 
-import org.apache.qpid.proton.ProtonCEquivalent;
-
-public interface InterfaceA
+public class ImplAtTreeTop implements InterfaceAtTreeTop
 {
-    String cFunction1 = "function1";
-    String methodA1 = "methodA1";
 
-    @ProtonCEquivalent(functionName=cFunction1)
-    void methodA1();
+    public void method()
+    {
+    }
+
 }

Copied: qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/tree/InterfaceAtTreeTop.java (from r1431947, qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/InterfaceB.java)
URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/tree/InterfaceAtTreeTop.java?p2=qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/tree/InterfaceAtTreeTop.java&p1=qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/InterfaceB.java&r1=1431947&r2=1433539&rev=1433539&view=diff
==============================================================================
--- qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/InterfaceB.java (original)
+++ qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/tree/InterfaceAtTreeTop.java Tue Jan 15 17:27:37 2013
@@ -15,13 +15,12 @@
  * KIND, either express or implied.  See the License for the
  * specific language governing permissions and limitations
  * under the License.
+ *
  */
-package org.apache.qpid.proton.apireconciliation.testdata;
+package org.apache.qpid.proton.apireconciliation.packagesearcher.testdata.tree;
 
-
-public interface InterfaceB
+public interface InterfaceAtTreeTop
 {
-    String methodWithoutAnnotation = "methodWithoutAnnotation";
+    void method();
 
-    void methodWithoutAnnotation();
 }

Copied: qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/tree/leaf/ImplAtLeaf.java (from r1431947, qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/InterfaceB.java)
URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/tree/leaf/ImplAtLeaf.java?p2=qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/tree/leaf/ImplAtLeaf.java&p1=qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/InterfaceB.java&r1=1431947&r2=1433539&rev=1433539&view=diff
==============================================================================
--- qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/InterfaceB.java (original)
+++ qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/tree/leaf/ImplAtLeaf.java Tue Jan 15 17:27:37 2013
@@ -15,13 +15,15 @@
  * KIND, either express or implied.  See the License for the
  * specific language governing permissions and limitations
  * under the License.
+ *
  */
-package org.apache.qpid.proton.apireconciliation.testdata;
+package org.apache.qpid.proton.apireconciliation.packagesearcher.testdata.tree.leaf;
 
-
-public interface InterfaceB
+public class ImplAtLeaf implements InterfaceAtLeaf
 {
-    String methodWithoutAnnotation = "methodWithoutAnnotation";
 
-    void methodWithoutAnnotation();
+    public void method()
+    {
+    }
+
 }

Copied: qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/tree/leaf/InterfaceAtLeaf.java (from r1431947, qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/InterfaceB.java)
URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/tree/leaf/InterfaceAtLeaf.java?p2=qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/tree/leaf/InterfaceAtLeaf.java&p1=qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/InterfaceB.java&r1=1431947&r2=1433539&rev=1433539&view=diff
==============================================================================
--- qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/testdata/InterfaceB.java (original)
+++ qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/packagesearcher/testdata/tree/leaf/InterfaceAtLeaf.java Tue Jan 15 17:27:37 2013
@@ -15,13 +15,11 @@
  * KIND, either express or implied.  See the License for the
  * specific language governing permissions and limitations
  * under the License.
+ *
  */
-package org.apache.qpid.proton.apireconciliation.testdata;
+package org.apache.qpid.proton.apireconciliation.packagesearcher.testdata.tree.leaf;
 
-
-public interface InterfaceB
+public interface InterfaceAtLeaf
 {
-    String methodWithoutAnnotation = "methodWithoutAnnotation";
-
-    void methodWithoutAnnotation();
+    void method();
 }

Added: qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/reportwriter/AnnotationAccessorTest.java
URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/reportwriter/AnnotationAccessorTest.java?rev=1433539&view=auto
==============================================================================
--- qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/reportwriter/AnnotationAccessorTest.java (added)
+++ qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/reportwriter/AnnotationAccessorTest.java Tue Jan 15 17:27:37 2013
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.proton.apireconciliation.reportwriter;
+
+import static org.junit.Assert.*;
+
+import java.lang.reflect.Method;
+
+import org.apache.qpid.proton.apireconciliation.TestAnnotation;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AnnotationAccessorTest
+{
+    private static final String ANNOTATION_VALUE_1 = "value1";
+    private static final String ANNOTATED_METHOD_NAME = "annotatedMethod";
+    private static final String UNANNOTATED_METHOD_NAME = "unannotatedMethod";
+    
+    private Method _annotatedMethod;
+    private Method _unannotatedMethod;
+
+    private String _annotationClassName;
+
+    private AnnotationAccessor _annotationAccessor;
+
+    @Before
+    public void setUp() throws Exception
+    {
+        _annotatedMethod = getClass().getMethod(ANNOTATED_METHOD_NAME);
+        _unannotatedMethod = getClass().getMethod(UNANNOTATED_METHOD_NAME);
+        _annotationClassName = TestAnnotation.class.getName();
+        _annotationAccessor = new AnnotationAccessor(_annotationClassName);
+    }
+
+    @Test
+    public void testGetAnnotationValue()
+    {
+        assertEquals(ANNOTATION_VALUE_1, _annotationAccessor.getAnnotationValue(_annotatedMethod));
+    }
+
+    @Test
+    public void testGetAnnotationValueWithoutAnnotationReturnsNull()
+    {
+        assertNull(_annotationAccessor.getAnnotationValue(_unannotatedMethod));
+    }
+
+    @TestAnnotation(ANNOTATION_VALUE_1)
+    public void annotatedMethod()
+    {
+    }
+    
+    public void unannotatedMethod()
+    {
+    }
+}

Modified: qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/reportwriter/ReconciliationReportWriterTest.java
URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/reportwriter/ReconciliationReportWriterTest.java?rev=1433539&r1=1433538&r2=1433539&view=diff
==============================================================================
--- qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/reportwriter/ReconciliationReportWriterTest.java (original)
+++ qpid/proton/branches/jni-binding/design/api-reconciliation/src/test/java/org/apache/qpid/proton/apireconciliation/reportwriter/ReconciliationReportWriterTest.java Tue Jan 15 17:27:37 2013
@@ -27,16 +27,23 @@ import java.net.URISyntaxException;
 import java.net.URL;
 
 import org.apache.commons.io.FileUtils;
-import org.apache.qpid.proton.ProtonCEquivalent;
 import org.apache.qpid.proton.apireconciliation.ReconciliationReport;
+import org.apache.qpid.proton.apireconciliation.TestAnnotation;
+import org.junit.Before;
 import org.junit.Test;
 
 
 public class ReconciliationReportWriterTest
 {
-    private ReconciliationReportWriter _writer = new ReconciliationReportWriter();
+    private ReconciliationReportWriter _writer;
     private ReconciliationReport _report = new ReconciliationReport();
 
+    @Before
+    public void setUp()
+    {
+        _writer = new ReconciliationReportWriter(new AnnotationAccessor(TestAnnotation.class.getName()));
+    }
+
     @Test
     public void testReportWithSingleFullyMappedRow() throws Exception
     {
@@ -87,12 +94,12 @@ public class ReconciliationReportWriterT
                 FileUtils.readFileToString(actualReport));
     }
 
-    @ProtonCEquivalent(functionName="function1")
+    @TestAnnotation("function1")
     public void methodWithMapping()
     {
     }
 
-    @ProtonCEquivalent(functionName="function2")
+    @TestAnnotation("function2")
     public void anotherMethodWithMapping()
     {
     }

Modified: qpid/proton/branches/jni-binding/proton-c/bindings/java/CMakeLists.txt
URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/proton-c/bindings/java/CMakeLists.txt?rev=1433539&r1=1433538&r2=1433539&view=diff
==============================================================================
--- qpid/proton/branches/jni-binding/proton-c/bindings/java/CMakeLists.txt (original)
+++ qpid/proton/branches/jni-binding/proton-c/bindings/java/CMakeLists.txt Tue Jan 15 17:27:37 2013
@@ -54,6 +54,15 @@ set(CMAKE_JAVA_INCLUDE_PATH ${CMAKE_CURR
 # TODO: We are relying on shell expansion to find the swig generated sources. Surely there is a better way?
 add_jar(proton-jni ${CMAKE_SWIG_OUTDIR}/*.java ${THUNKING_SOURCES_ABS})
 
-add_custom_command(TARGET proton-jni POST_BUILD COMMAND ${Java_JAR_EXECUTABLE} uvf proton-jni-${PN_VERSION}.jar -C ${PROJECT_SOURCE_DIR}/jni/src/main/resources META-INF)
+message("CMAKE_CURRENT_BINARY_DIR " ${CMAKE_CURRENT_BINARY_DIR})
+message("CMAKE_JAVA_CLASS_OUTPUT_PATH" ${CMAKE_JAVA_CLASS_OUTPUT_PATH})
+
+# We need to rebuild the JAR to a) include the resources b) include the 'structural' directory entries that are
+# excluded by Cmake's add_jar command.  The latter is required by Google Reflections.
+add_custom_command(TARGET proton-jni POST_BUILD
+                   COMMAND ${Java_JAR_EXECUTABLE} cf proton-jni-${PN_VERSION}.jar
+                              -C ${PROJECT_SOURCE_DIR}/jni/src/main/resources META-INF
+                              -C ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/proton-jni.dir/ org
+                   COMMENT "Rebuilding JAR to include missing resources")
 
 add_dependencies(proton-jni proton-api proton-swig)



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org