Author: mbenson Date: Tue Jul 30 12:24:40 2013 New Revision: 1508407 URL: http://svn.apache.org/r1508407 Log: include all known annotations relevant to some ScanResult
Added: commons/sandbox/weaver/branches/priv-asm/processor/src/main/java/org/apache/commons/weaver/Inflater.java (with props) Modified: commons/sandbox/weaver/branches/priv-asm/processor/src/main/java/org/apache/commons/weaver/Finder.java commons/sandbox/weaver/branches/priv-asm/processor/src/main/java/org/apache/commons/weaver/model/Weavable.java Modified: commons/sandbox/weaver/branches/priv-asm/processor/src/main/java/org/apache/commons/weaver/Finder.java URL: http://svn.apache.org/viewvc/commons/sandbox/weaver/branches/priv-asm/processor/src/main/java/org/apache/commons/weaver/Finder.java?rev=1508407&r1=1508406&r2=1508407&view=diff ============================================================================== --- commons/sandbox/weaver/branches/priv-asm/processor/src/main/java/org/apache/commons/weaver/Finder.java (original) +++ commons/sandbox/weaver/branches/priv-asm/processor/src/main/java/org/apache/commons/weaver/Finder.java Tue Jul 30 12:24:40 2013 @@ -336,8 +336,7 @@ class Finder extends AnnotationFinder im final ClassInfo classInfo = classInfos.get(((Class<?>) object).getName()); final IncludesClassfile<Class<?>> annotated; try { - annotated = - new IncludesClassfile<Class<?>>(classInfo.get(), classfileAnnotationsFor(classInfo)); + annotated = new IncludesClassfile<Class<?>>(classInfo.get(), classfileAnnotationsFor(classInfo)); } catch (ClassNotFoundException e) { continue; } @@ -501,8 +500,9 @@ class Finder extends AnnotationFinder im } }; - private final Map<Info, List<Annotation>> classfileAnnotations; private final WithAnnotations withAnnotations = new WithAnnotations(); + private final Map<Info, List<Annotation>> classfileAnnotations; + private final Inflater inflater; /** * Create a new {@link Finder} instance. @@ -513,6 +513,7 @@ class Finder extends AnnotationFinder im super(archive, false); classfileAnnotations = CLASSFILE_ANNOTATIONS.get(); CLASSFILE_ANNOTATIONS.remove(); + inflater = new Inflater(classfileAnnotations); enableFindImplementations(); enableFindSubclasses(); } @@ -602,7 +603,7 @@ class Finder extends AnnotationFinder im } } } - return result; + return inflater.inflate(result); } private Class<?> toClass(Type type) { Added: commons/sandbox/weaver/branches/priv-asm/processor/src/main/java/org/apache/commons/weaver/Inflater.java URL: http://svn.apache.org/viewvc/commons/sandbox/weaver/branches/priv-asm/processor/src/main/java/org/apache/commons/weaver/Inflater.java?rev=1508407&view=auto ============================================================================== --- commons/sandbox/weaver/branches/priv-asm/processor/src/main/java/org/apache/commons/weaver/Inflater.java (added) +++ commons/sandbox/weaver/branches/priv-asm/processor/src/main/java/org/apache/commons/weaver/Inflater.java Tue Jul 30 12:24:40 2013 @@ -0,0 +1,197 @@ +/* + * 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; + +import java.lang.annotation.Annotation; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.weaver.model.ScanResult; +import org.apache.commons.weaver.model.WeavableClass; +import org.apache.commons.weaver.model.WeavableConstructor; +import org.apache.commons.weaver.model.WeavableConstructorParameter; +import org.apache.commons.weaver.model.WeavableField; +import org.apache.commons.weaver.model.WeavableMethod; +import org.apache.commons.weaver.model.WeavableMethodParameter; +import org.apache.commons.weaver.model.WeavablePackage; +import org.apache.xbean.finder.AnnotationFinder.ClassInfo; +import org.apache.xbean.finder.AnnotationFinder.FieldInfo; +import org.apache.xbean.finder.AnnotationFinder.Info; +import org.apache.xbean.finder.AnnotationFinder.MethodInfo; +import org.apache.xbean.finder.AnnotationFinder.PackageInfo; +import org.apache.xbean.finder.AnnotationFinder.ParameterInfo; +import org.apache.xbean.finder.Parameter; + +/** + * Adds all classfile annotations to a ScanResult. + */ +class Inflater { + private class InfoMatcher { + final Class<? extends Info> type; + + InfoMatcher(Class<? extends Info> type) { + super(); + this.type = type; + } + + boolean test(Info info) { + return type.isInstance(info); + } + + } + + private class MethodMatcher extends InfoMatcher { + final boolean cs; + + MethodMatcher(boolean cs) { + super(MethodInfo.class); + this.cs = cs; + } + + @Override + boolean test(Info info) { + return super.test(info) && ((MethodInfo) info).isConstructor() == cs; + } + } + + private class ParameterMatcher extends InfoMatcher { + final boolean cs; + + ParameterMatcher(boolean cs) { + super(ParameterInfo.class); + this.cs = cs; + } + + @Override + boolean test(Info info) { + return super.test(info) && ((ParameterInfo) info).getDeclaringMethod().isConstructor() == cs; + } + } + + final Map<PackageInfo, List<Annotation>> packageAnnotations; + final Map<ClassInfo, List<Annotation>> classAnnotations; + final Map<FieldInfo, List<Annotation>> fieldAnnotations; + final Map<MethodInfo, List<Annotation>> constructorAnnotations; + final Map<MethodInfo, List<Annotation>> methodAnnotations; + final Map<ParameterInfo, List<Annotation>> constructorParameterAnnotations; + final Map<ParameterInfo, List<Annotation>> methodParameterAnnotations; + + Inflater(Map<Info, List<Annotation>> m) { + super(); + + this.packageAnnotations = subMap(m, new InfoMatcher(PackageInfo.class)); + this.classAnnotations = subMap(m, new InfoMatcher(ClassInfo.class)); + this.fieldAnnotations = subMap(m, new InfoMatcher(FieldInfo.class)); + this.constructorAnnotations = subMap(m, new MethodMatcher(true)); + this.methodAnnotations = subMap(m, new MethodMatcher(false)); + this.constructorParameterAnnotations = subMap(m, new ParameterMatcher(true)); + this.methodParameterAnnotations = subMap(m, new ParameterMatcher(false)); + } + + static <I extends Info> Map<I, List<Annotation>> subMap(Map<Info, List<Annotation>> source, InfoMatcher matcher) { + final HashMap<I, List<Annotation>> result = new HashMap<I, List<Annotation>>(); + for (Map.Entry<Info, List<Annotation>> e : source.entrySet()) { + if (matcher.test(e.getKey())) { + @SuppressWarnings("unchecked") + final I key = (I) e.getKey(); + result.put(key, e.getValue()); + } + } + return result; + } + + ScanResult inflate(final ScanResult scanResult) { + for (WeavablePackage pkg : scanResult.getPackages()) { + for (Map.Entry<PackageInfo, List<Annotation>> e : packageAnnotations.entrySet()) { + if (e.getKey().getName().equals(pkg.getTarget().getName())) { + pkg.addAnnotations(e.getValue()); + } + } + for (WeavableClass<?> cls : pkg.getClasses()) { + for (Map.Entry<ClassInfo, List<Annotation>> e : classAnnotations.entrySet()) { + if (e.getKey().getName().equals(cls.getTarget().getName())) { + cls.addAnnotations(e.getValue()); + } + } + for (WeavableField<?> fld : cls.getFields()) { + for (Map.Entry<FieldInfo, List<Annotation>> e : fieldAnnotations.entrySet()) { + try { + if (e.getKey().get().equals(fld.getTarget())) { + fld.addAnnotations(e.getValue()); + } + } catch (ClassNotFoundException cnfe) { + // :/ + } + } + } + for (WeavableConstructor<?> cs : cls.getConstructors()) { + for (Map.Entry<MethodInfo, List<Annotation>> e : constructorAnnotations.entrySet()) { + try { + if (e.getKey().get().equals(cs.getTarget())) { + cs.addAnnotations(e.getValue()); + } + } catch (ClassNotFoundException cnfe) { + // :/ + } + } + for (WeavableConstructorParameter<?> p : cs.getParameters()) { + for (Map.Entry<ParameterInfo, List<Annotation>> e : constructorParameterAnnotations.entrySet()) { + try { + final Parameter<?> parameter = e.getKey().get(); + if (parameter.getDeclaringExecutable().equals(cs.getTarget()) + && p.getTarget().intValue() == parameter.getIndex()) { + p.addAnnotations(e.getValue()); + } + } catch (ClassNotFoundException cnfe) { + // :/ + } + } + } + } + for (WeavableMethod<?> mt : cls.getMethods()) { + for (Map.Entry<MethodInfo, List<Annotation>> e : methodAnnotations.entrySet()) { + try { + if (e.getKey().get().equals(mt.getTarget())) { + mt.addAnnotations(e.getValue()); + } + } catch (ClassNotFoundException cnfe) { + // :/ + } + } + for (WeavableMethodParameter<?> p : mt.getParameters()) { + for (Map.Entry<ParameterInfo, List<Annotation>> e : methodParameterAnnotations.entrySet()) { + try { + final Parameter<?> parameter = e.getKey().get(); + if (parameter.getDeclaringExecutable().equals(mt.getTarget()) + && p.getTarget().intValue() == parameter.getIndex()) { + p.addAnnotations(e.getValue()); + } + } catch (ClassNotFoundException cnfe) { + // :/ + } + } + } + } + } + } + return scanResult; + } + +} Propchange: commons/sandbox/weaver/branches/priv-asm/processor/src/main/java/org/apache/commons/weaver/Inflater.java ------------------------------------------------------------------------------ svn:executable = * Modified: commons/sandbox/weaver/branches/priv-asm/processor/src/main/java/org/apache/commons/weaver/model/Weavable.java URL: http://svn.apache.org/viewvc/commons/sandbox/weaver/branches/priv-asm/processor/src/main/java/org/apache/commons/weaver/model/Weavable.java?rev=1508407&r1=1508406&r2=1508407&view=diff ============================================================================== --- commons/sandbox/weaver/branches/priv-asm/processor/src/main/java/org/apache/commons/weaver/model/Weavable.java (original) +++ commons/sandbox/weaver/branches/priv-asm/processor/src/main/java/org/apache/commons/weaver/model/Weavable.java Tue Jul 30 12:24:40 2013 @@ -20,10 +20,12 @@ package org.apache.commons.weaver.model; import java.lang.annotation.Annotation; import java.lang.reflect.AnnotatedElement; -import java.util.Collections; +import java.util.Arrays; import java.util.LinkedHashSet; import java.util.Set; +import org.apache.commons.lang3.Validate; + public abstract class Weavable<SELF extends Weavable<SELF, TARGET>, TARGET> implements Comparable<SELF>, AnnotatedElement { private static final Annotation[] EMPTY_ANNOTATION_ARRAY = new Annotation[0]; @@ -33,15 +35,30 @@ public abstract class Weavable<SELF exte protected Weavable(TARGET target) { this.target = target; + if (target instanceof AnnotatedElement) { + addAnnotations(((AnnotatedElement) target).getAnnotations()); + } } public boolean addAnnotations(Annotation... toAdd) { + Validate.noNullElements(toAdd); + return addAnnotations(Arrays.asList(toAdd)); + } + + public boolean addAnnotations(Iterable<Annotation> toAdd) { + if (toAdd == null) { + return false; + } synchronized (this) { if (annotations == null) { annotations = new LinkedHashSet<Annotation>(); } } - return Collections.addAll(annotations, toAdd); + boolean result = false; + for (Annotation a : toAdd) { + result = a != null && annotations.add(a) || result; + } + return result; } public TARGET getTarget() {