You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mb...@apache.org on 2013/01/22 22:37:52 UTC

svn commit: r1437189 - in /commons/sandbox/weaver/branches/mjb/processor/src: main/java/org/apache/commons/weaver/model/ test/java/org/apache/commons/weaver/test/weaver/

Author: mbenson
Date: Tue Jan 22 21:37:52 2013
New Revision: 1437189

URL: http://svn.apache.org/viewvc?rev=1437189&view=rev
Log:
further refinements to the generics interworkings, added AnnotatedElements iterable type to allow more fluent filtering down to the desired scan results

Added:
    commons/sandbox/weaver/branches/mjb/processor/src/main/java/org/apache/commons/weaver/model/AnnotatedElements.java   (with props)
Modified:
    commons/sandbox/weaver/branches/mjb/processor/src/main/java/org/apache/commons/weaver/model/ScanResult.java
    commons/sandbox/weaver/branches/mjb/processor/src/main/java/org/apache/commons/weaver/model/WeavableConstructor.java
    commons/sandbox/weaver/branches/mjb/processor/src/main/java/org/apache/commons/weaver/model/WeavableExecutable.java
    commons/sandbox/weaver/branches/mjb/processor/src/main/java/org/apache/commons/weaver/model/WeavableMethod.java
    commons/sandbox/weaver/branches/mjb/processor/src/main/java/org/apache/commons/weaver/model/WeavableParameter.java
    commons/sandbox/weaver/branches/mjb/processor/src/test/java/org/apache/commons/weaver/test/weaver/TestWeaver.java

Added: commons/sandbox/weaver/branches/mjb/processor/src/main/java/org/apache/commons/weaver/model/AnnotatedElements.java
URL: http://svn.apache.org/viewvc/commons/sandbox/weaver/branches/mjb/processor/src/main/java/org/apache/commons/weaver/model/AnnotatedElements.java?rev=1437189&view=auto
==============================================================================
--- commons/sandbox/weaver/branches/mjb/processor/src/main/java/org/apache/commons/weaver/model/AnnotatedElements.java (added)
+++ commons/sandbox/weaver/branches/mjb/processor/src/main/java/org/apache/commons/weaver/model/AnnotatedElements.java Tue Jan 22 21:37:52 2013
@@ -0,0 +1,26 @@
+/*
+ * 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.commons.weaver.model;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.AnnotatedElement;
+
+public interface AnnotatedElements<T extends AnnotatedElement> extends Iterable<T> {
+    AnnotatedElements<T> with(Class<? extends Annotation> annotationType);
+}

Propchange: commons/sandbox/weaver/branches/mjb/processor/src/main/java/org/apache/commons/weaver/model/AnnotatedElements.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: commons/sandbox/weaver/branches/mjb/processor/src/main/java/org/apache/commons/weaver/model/ScanResult.java
URL: http://svn.apache.org/viewvc/commons/sandbox/weaver/branches/mjb/processor/src/main/java/org/apache/commons/weaver/model/ScanResult.java?rev=1437189&r1=1437188&r2=1437189&view=diff
==============================================================================
--- commons/sandbox/weaver/branches/mjb/processor/src/main/java/org/apache/commons/weaver/model/ScanResult.java (original)
+++ commons/sandbox/weaver/branches/mjb/processor/src/main/java/org/apache/commons/weaver/model/ScanResult.java Tue Jan 22 21:37:52 2013
@@ -19,6 +19,8 @@
 
 package org.apache.commons.weaver.model;
 
+import java.lang.annotation.Annotation;
+import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
@@ -32,7 +34,7 @@ import java.util.concurrent.ConcurrentSk
  * Encapsulates the result of scanning based on a {@link ScanRequest}.
  */
 public class ScanResult {
-    private static abstract class Projection<PARENT, CHILD> implements Iterable<CHILD> {
+    private static abstract class Projection<PARENT, CHILD extends AnnotatedElement> implements AnnotatedElements<CHILD> {
         private final Iterable<PARENT> parents;
 
         Projection(Iterable<PARENT> parents) {
@@ -83,6 +85,68 @@ public class ScanResult {
                 }
             };
         }
+
+        @Override
+        public AnnotatedElements<CHILD> with(Class<? extends Annotation> annotationType) {
+            return new AnnotatedWith<CHILD>(this, annotationType);
+        }
+    }
+
+    private static class AnnotatedWith<W extends AnnotatedElement> implements AnnotatedElements<W> {
+        final Iterable<W> wrapped;
+        final Class<? extends Annotation> annotationType;
+
+        AnnotatedWith(Iterable<W> wrapped, Class<? extends Annotation> annotationType) {
+            super();
+            this.wrapped = wrapped;
+            this.annotationType = annotationType;
+        }
+
+        @Override
+        public Iterator<W> iterator() {
+            final Iterator<W> iter = wrapped.iterator();
+            return new Iterator<W>() {
+                W next = read();
+
+                private W read() {
+                    while (iter.hasNext()) {
+                        W t = iter.next();
+                        if (t.isAnnotationPresent(annotationType)) {
+                            return t;
+                        }
+                    }
+                    return null;
+                }
+
+                @Override
+                public boolean hasNext() {
+                    return next != null;
+                }
+
+                @Override
+                public W next() {
+                    if (next == null) {
+                        throw new NoSuchElementException();
+                    }
+                    try {
+                        return next;
+                    } finally {
+                        next = read();
+                    }
+                }
+
+                @Override
+                public void remove() {
+                    throw new UnsupportedOperationException();
+                }
+            };
+        }
+
+        @Override
+        public AnnotatedElements<W> with(Class<? extends Annotation> annotationType) {
+            return new AnnotatedWith<W>(this, annotationType);
+        }
+
     }
 
     private final ConcurrentNavigableMap<String, WeavablePackage> packages =
@@ -114,11 +178,16 @@ public class ScanResult {
         return getWeavable(ctor.getDeclaringClass()).getWeavable(ctor);
     }
 
-    public Iterable<WeavablePackage> getPackages() {
-        return Collections.unmodifiableCollection(packages.values());
+    public AnnotatedElements<WeavablePackage> getPackages() {
+        return new Projection<WeavablePackage, WeavablePackage>(packages.values()) {
+            @Override
+            protected Iterable<WeavablePackage> childrenOf(WeavablePackage parent) {
+                return Collections.singleton(parent);
+            }
+        };
     }
 
-    public Iterable<WeavableClass<?>> getClasses() {
+    public AnnotatedElements<WeavableClass<?>> getClasses() {
         return new Projection<WeavablePackage, WeavableClass<?>>(getPackages()) {
 
             @Override
@@ -128,7 +197,7 @@ public class ScanResult {
         };
     }
 
-    public Iterable<WeavableField<?>> getFields() {
+    public AnnotatedElements<WeavableField<?>> getFields() {
         return new Projection<WeavableClass<?>, WeavableField<?>>(getClasses()) {
 
             @Override
@@ -140,7 +209,7 @@ public class ScanResult {
         };
     }
 
-    public Iterable<WeavableConstructor<?>> getConstructors() {
+    public AnnotatedElements<WeavableConstructor<?>> getConstructors() {
         return new Projection<WeavableClass<?>, WeavableConstructor<?>>(getClasses()) {
 
             @Override
@@ -152,7 +221,7 @@ public class ScanResult {
         };
     }
 
-    public Iterable<WeavableMethod<?>> getMethods() {
+    public AnnotatedElements<WeavableMethod<?>> getMethods() {
         return new Projection<WeavableClass<?>, WeavableMethod<?>>(getClasses()) {
 
             @Override
@@ -164,7 +233,7 @@ public class ScanResult {
         };
     }
 
-    public Iterable<WeavableMethodParameter<?>> getMethodParameters() {
+    public AnnotatedElements<WeavableMethodParameter<?>> getMethodParameters() {
         return new Projection<WeavableMethod<?>, WeavableMethodParameter<?>>(getMethods()) {
 
             @Override
@@ -176,7 +245,7 @@ public class ScanResult {
         };
     }
 
-    public Iterable<WeavableConstructorParameter<?>> getConstructorParameters() {
+    public AnnotatedElements<WeavableConstructorParameter<?>> getConstructorParameters() {
 
         return new Projection<WeavableConstructor<?>, WeavableConstructorParameter<?>>(getConstructors()) {
 

Modified: commons/sandbox/weaver/branches/mjb/processor/src/main/java/org/apache/commons/weaver/model/WeavableConstructor.java
URL: http://svn.apache.org/viewvc/commons/sandbox/weaver/branches/mjb/processor/src/main/java/org/apache/commons/weaver/model/WeavableConstructor.java?rev=1437189&r1=1437188&r2=1437189&view=diff
==============================================================================
--- commons/sandbox/weaver/branches/mjb/processor/src/main/java/org/apache/commons/weaver/model/WeavableConstructor.java (original)
+++ commons/sandbox/weaver/branches/mjb/processor/src/main/java/org/apache/commons/weaver/model/WeavableConstructor.java Tue Jan 22 21:37:52 2013
@@ -20,7 +20,8 @@ package org.apache.commons.weaver.model;
 
 import java.lang.reflect.Constructor;
 
-public class WeavableConstructor<T> extends WeavableExecutable<WeavableConstructor<T>, Constructor<T>, T> {
+public class WeavableConstructor<T> extends
+    WeavableExecutable<WeavableConstructor<T>, Constructor<T>, T, WeavableConstructorParameter<T>> {
 
     public WeavableConstructor(Constructor<T> target, WeavableClass<T> parent) {
         super(target, parent);
@@ -31,4 +32,9 @@ public class WeavableConstructor<T> exte
         return getTarget().getParameterTypes();
     }
 
+    @Override
+    protected WeavableConstructorParameter<T> createParameter(int index) {
+        return new WeavableConstructorParameter<T>(Integer.valueOf(index), this);
+    }
+
 }

Modified: commons/sandbox/weaver/branches/mjb/processor/src/main/java/org/apache/commons/weaver/model/WeavableExecutable.java
URL: http://svn.apache.org/viewvc/commons/sandbox/weaver/branches/mjb/processor/src/main/java/org/apache/commons/weaver/model/WeavableExecutable.java?rev=1437189&r1=1437188&r2=1437189&view=diff
==============================================================================
--- commons/sandbox/weaver/branches/mjb/processor/src/main/java/org/apache/commons/weaver/model/WeavableExecutable.java (original)
+++ commons/sandbox/weaver/branches/mjb/processor/src/main/java/org/apache/commons/weaver/model/WeavableExecutable.java Tue Jan 22 21:37:52 2013
@@ -25,23 +25,22 @@ import java.util.List;
 
 import org.apache.commons.weaver.utils.Args;
 
-public abstract class WeavableExecutable<SELF extends WeavableExecutable<SELF, TARGET, T>, TARGET extends Member, T>
+public abstract class WeavableExecutable<SELF extends WeavableExecutable<SELF, TARGET, T, P>, TARGET extends Member, T, P extends WeavableParameter<P, SELF, TARGET, T>>
     extends NestedWeavable<SELF, TARGET, WeavableClass<T>, Class<T>> {
 
-    private final List<WeavableParameter<SELF, TARGET, T>> parameters;
+    private final List<P> parameters;
 
     protected WeavableExecutable(TARGET target, WeavableClass<T> parent) {
         super(target, parent);
-        final List<WeavableParameter<SELF, TARGET, T>> params = new ArrayList<WeavableParameter<SELF, TARGET, T>>();
+        final List<P> params = new ArrayList<P>();
         for (int i = 0, sz = getParameterTypes().length; i < sz; i++) {
-            @SuppressWarnings("unchecked")
-            final WeavableParameter<SELF, TARGET, T> param =
-                new WeavableParameter<SELF, TARGET, T>(Integer.valueOf(i), (SELF) this);
-            params.add(param);
+            params.add(createParameter(i));
         }
         parameters = Collections.unmodifiableList(params);
     }
 
+    protected abstract P createParameter(int index);
+
     protected abstract Class<?>[] getParameterTypes();
 
     @Override
@@ -49,11 +48,11 @@ public abstract class WeavableExecutable
         return Args.compare(getParameterTypes(), o.getParameterTypes());
     }
 
-    public WeavableParameter<SELF, TARGET, T> getWeavableParameter(int index) {
+    public P getWeavableParameter(int index) {
         return parameters.get(index);
     }
 
-    public Iterable<WeavableParameter<SELF, TARGET, T>> getParameters() {
+    public Iterable<P> getParameters() {
         return parameters;
     }
 

Modified: commons/sandbox/weaver/branches/mjb/processor/src/main/java/org/apache/commons/weaver/model/WeavableMethod.java
URL: http://svn.apache.org/viewvc/commons/sandbox/weaver/branches/mjb/processor/src/main/java/org/apache/commons/weaver/model/WeavableMethod.java?rev=1437189&r1=1437188&r2=1437189&view=diff
==============================================================================
--- commons/sandbox/weaver/branches/mjb/processor/src/main/java/org/apache/commons/weaver/model/WeavableMethod.java (original)
+++ commons/sandbox/weaver/branches/mjb/processor/src/main/java/org/apache/commons/weaver/model/WeavableMethod.java Tue Jan 22 21:37:52 2013
@@ -20,7 +20,7 @@ package org.apache.commons.weaver.model;
 
 import java.lang.reflect.Method;
 
-public class WeavableMethod<T> extends WeavableExecutable<WeavableMethod<T>, Method, T> {
+public class WeavableMethod<T> extends WeavableExecutable<WeavableMethod<T>, Method, T, WeavableMethodParameter<T>> {
 
     public WeavableMethod(Method target, WeavableClass<T> parent) {
         super(target, parent);
@@ -36,4 +36,9 @@ public class WeavableMethod<T> extends W
         int result = getTarget().getName().compareTo(o.getTarget().getName());
         return result == 0 ? super.localCompareTo(o) : result;
     }
+
+    @Override
+    protected WeavableMethodParameter<T> createParameter(int index) {
+        return new WeavableMethodParameter<T>(Integer.valueOf(index), this);
+    }
 }

Modified: commons/sandbox/weaver/branches/mjb/processor/src/main/java/org/apache/commons/weaver/model/WeavableParameter.java
URL: http://svn.apache.org/viewvc/commons/sandbox/weaver/branches/mjb/processor/src/main/java/org/apache/commons/weaver/model/WeavableParameter.java?rev=1437189&r1=1437188&r2=1437189&view=diff
==============================================================================
--- commons/sandbox/weaver/branches/mjb/processor/src/main/java/org/apache/commons/weaver/model/WeavableParameter.java (original)
+++ commons/sandbox/weaver/branches/mjb/processor/src/main/java/org/apache/commons/weaver/model/WeavableParameter.java Tue Jan 22 21:37:52 2013
@@ -20,7 +20,7 @@ package org.apache.commons.weaver.model;
 
 import java.lang.reflect.Member;
 
-public class WeavableParameter<SELF extends WeavableParameter<SELF, PARENT, PARENT_TARGET, T>, PARENT extends WeavableExecutable<PARENT, PARENT_TARGET, T>, PARENT_TARGET extends Member, T>
+public abstract class WeavableParameter<SELF extends WeavableParameter<SELF, PARENT, PARENT_TARGET, T>, PARENT extends WeavableExecutable<PARENT, PARENT_TARGET, T, SELF>, PARENT_TARGET extends Member, T>
     extends NestedWeavable<SELF, Integer, PARENT, PARENT_TARGET> {
 
     protected WeavableParameter(Integer target, PARENT parent) {

Modified: commons/sandbox/weaver/branches/mjb/processor/src/test/java/org/apache/commons/weaver/test/weaver/TestWeaver.java
URL: http://svn.apache.org/viewvc/commons/sandbox/weaver/branches/mjb/processor/src/test/java/org/apache/commons/weaver/test/weaver/TestWeaver.java?rev=1437189&r1=1437188&r2=1437189&view=diff
==============================================================================
--- commons/sandbox/weaver/branches/mjb/processor/src/test/java/org/apache/commons/weaver/test/weaver/TestWeaver.java (original)
+++ commons/sandbox/weaver/branches/mjb/processor/src/test/java/org/apache/commons/weaver/test/weaver/TestWeaver.java Tue Jan 22 21:37:52 2013
@@ -58,14 +58,13 @@ public class TestWeaver implements Weave
     @Override
     public boolean process(ScanResult scanResult) {
         boolean result = false;
-        for (WeavableClass<?> weavableClass : scanResult.getClasses()) {
-            if (weavableClass.isAnnotationPresent(TestAnnotation.class) && wovenClasses.add(weavableClass.getTarget())) {
+        for (WeavableClass<?> weavableClass : scanResult.getClasses().with(TestAnnotation.class)) {
+            if (wovenClasses.add(weavableClass.getTarget())) {
                 result = true;
             }
         }
-        for (WeavableMethod<?> weavableMethod : scanResult.getMethods()) {
-            if (weavableMethod.isAnnotationPresent(TestAnnotation.class)
-                && wovenMethods.add(weavableMethod.getTarget())) {
+        for (WeavableMethod<?> weavableMethod : scanResult.getMethods().with(TestAnnotation.class)) {
+            if (wovenMethods.add(weavableMethod.getTarget())) {
                 result = true;
             }
         }