You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by cs...@apache.org on 2016/01/13 17:25:23 UTC
svn commit: r1724454 - in
/aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model:
Bean.java Context.java FieldFinder.java Introspector.java
Author: cschneider
Date: Wed Jan 13 16:25:23 2016
New Revision: 1724454
URL: http://svn.apache.org/viewvc?rev=1724454&view=rev
Log:
[ARIES-1481] Refactor to an Introspector class
Added:
aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Introspector.java
- copied, changed from r1724453, aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/FieldFinder.java
Removed:
aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/FieldFinder.java
Modified:
aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Bean.java
aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Context.java
Modified: aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Bean.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Bean.java?rev=1724454&r1=1724453&r2=1724454&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Bean.java (original)
+++ aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Bean.java Wed Jan 13 16:25:23 2016
@@ -18,10 +18,8 @@
*/
package org.apache.aries.blueprint.plugin.model;
-import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
-import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@@ -39,9 +37,6 @@ import org.springframework.beans.factory
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
-import com.google.common.base.Preconditions;
-import com.google.common.collect.Iterables;
-
public class Bean extends BeanRef {
public String initMethod;
public String destroyMethod;
@@ -52,15 +47,16 @@ public class Bean extends BeanRef {
public Bean(Class<?> clazz) {
super(clazz, BeanRef.getBeanName(clazz));
+ Introspector introspector = new Introspector(clazz);
// Init method
- Method initMethod = getMethodWithAnnotation(clazz, PostConstruct.class);
+ Method initMethod = introspector.methodWith(PostConstruct.class);
if (initMethod != null) {
this.initMethod = initMethod.getName();
}
// Destroy method
- Method destroyMethod = getMethodWithAnnotation(clazz, PreDestroy.class);
+ Method destroyMethod = introspector.methodWith(PreDestroy.class);
if (destroyMethod != null) {
this.destroyMethod = destroyMethod.getName();
}
@@ -69,7 +65,7 @@ public class Bean extends BeanRef {
transactionDefs.addAll(new JavaxTransactionFactory().create(clazz));
transactionDefs.addAll(new SpringTransactionFactory().create(clazz));
this.isPrototype = isPrototype(clazz);
- this.persistenceFields = new FieldFinder(PersistenceContext.class, PersistenceUnit.class).findFields(clazz);
+ this.persistenceFields = introspector.fieldsWith(PersistenceContext.class, PersistenceUnit.class);
properties = new TreeSet<Property>();
}
@@ -79,7 +75,7 @@ public class Bean extends BeanRef {
}
public void resolve(Matcher matcher) {
- for (Field field : new FieldFinder(Value.class, Autowired.class, Inject.class).findFields(clazz)) {
+ for (Field field : new Introspector(clazz).fieldsWith(Value.class, Autowired.class, Inject.class)) {
Property prop = Property.create(matcher, field);
if (prop != null) {
properties.add(prop);
@@ -87,26 +83,7 @@ public class Bean extends BeanRef {
}
}
- private static <T extends Annotation> Method getMethodWithAnnotation(Class<?> classToSearch,
- Class<T> annotationClass) {
- List<Method> methods = getMethodsWithAnnotation(classToSearch, annotationClass);
- Preconditions.checkArgument(methods.size() <= 1,
- "Found %d methods annotated with %s in class %s, but only 1 allowed",
- methods.size(), annotationClass.getName(), classToSearch.getName());
- return Iterables.getOnlyElement(methods, null);
- }
- private static <T extends Annotation> List<Method> getMethodsWithAnnotation(Class<?> classToSearch,
- Class<T> annotationClass) {
- List<Method> methods = new ArrayList<>();
- for (Method method : classToSearch.getMethods()) {
- T annotation = method.getAnnotation(annotationClass);
- if (annotation != null) {
- methods.add(method);
- }
- }
- return methods;
- }
@Override
public int hashCode() {
Modified: aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Context.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Context.java?rev=1724454&r1=1724453&r2=1724454&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Context.java (original)
+++ aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Context.java Wed Jan 13 16:25:23 2016
@@ -79,7 +79,7 @@ public class Context implements Matcher
}
private void addServiceRefs(Class<?> clazz) {
- for (Field field : new FieldFinder(OsgiService.class).findFields(clazz)) {
+ for (Field field : new Introspector(clazz).fieldsWith(OsgiService.class)) {
reg.add(new OsgiServiceRef(field));
}
}
Copied: aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Introspector.java (from r1724453, aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/FieldFinder.java)
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Introspector.java?p2=aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Introspector.java&p1=aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/FieldFinder.java&r1=1724453&r2=1724454&rev=1724454&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/FieldFinder.java (original)
+++ aries/trunk/blueprint/blueprint-maven-plugin/src/main/java/org/apache/aries/blueprint/plugin/model/Introspector.java Wed Jan 13 16:25:23 2016
@@ -20,11 +20,15 @@ package org.apache.aries.blueprint.plugi
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
+import com.google.common.base.Preconditions;
import com.google.common.collect.HashMultimap;
+import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
import com.google.common.collect.Sets;
@@ -32,24 +36,24 @@ import com.google.common.collect.Sets;
/**
* Class to find uniquely-named fields declared in a class hierarchy with specified annotations.
*/
-public final class FieldFinder {
- private final Class<? extends Annotation>[] requiredAnnotations;
+public final class Introspector {
+ private Class<?> originalClazz;
/**
- * @param requiredAnnotations if not empty, a field must have one of these annotations for it to be found.
+ * @param clazz the class to introspect (including those defined in parent classes).
*/
- @SafeVarargs
- public FieldFinder(Class<? extends Annotation>... requiredAnnotations) {
- this.requiredAnnotations = requiredAnnotations;
+ public Introspector(Class<?> clazz) {
+ this.originalClazz = clazz;
}
/**
- * @param originalClazz the class in which to find fields (including those defined in parent classes).
+ * @param
* @return fields in the given class (including parent classes) that match this finder's annotations requirements.
* @throws UnsupportedOperationException if any field matching the annotations requirement shares its name with a
* field declared elsewhere in the class hierarchy.
*/
- public List<Field> findFields(Class<?> originalClazz) {
+ @SafeVarargs
+ public final List<Field> fieldsWith(Class<? extends Annotation>... requiredAnnotations) {
Multimap<String, Field> fieldsByName = HashMultimap.create();
Set<String> acceptedFieldNames = Sets.newHashSet();
Class<?> clazz = originalClazz;
@@ -61,7 +65,7 @@ public final class FieldFinder {
fieldsByName.put(field.getName(), field);
// ...and if it meets the annotation requirement, add the field name to the set of accepted field names
- if (hasAnyRequiredAnnotation(field)) {
+ if (hasAnyRequiredAnnotation(field, requiredAnnotations)) {
acceptedFieldNames.add(field.getName());
}
}
@@ -72,7 +76,7 @@ public final class FieldFinder {
List<Field> acceptedFields = Lists.newArrayList();
for (String fieldName : acceptedFieldNames) {
Collection<Field> fields = fieldsByName.get(fieldName);
- validateOnlyOneFieldWithName(originalClazz, fieldName, fields);
+ validateOnlyOneFieldWithName(fieldName, fields);
acceptedFields.addAll(fields);
}
return acceptedFields;
@@ -84,7 +88,7 @@ public final class FieldFinder {
* @param acceptedFieldName
* @param acceptedFieldsWithSameName
*/
- private void validateOnlyOneFieldWithName(Class<?> originalClazz, String acceptedFieldName,
+ private void validateOnlyOneFieldWithName(String acceptedFieldName,
Collection<Field> acceptedFieldsWithSameName) {
if (acceptedFieldsWithSameName.size() > 1) {
String header = String.format("Field '%s' in bean class '%s' has been defined multiple times in:",
@@ -97,9 +101,10 @@ public final class FieldFinder {
}
}
- private boolean hasAnyRequiredAnnotation(Field field) {
+ @SafeVarargs
+ private final boolean hasAnyRequiredAnnotation(Field field, Class<? extends Annotation>... requiredAnnotations) {
if (requiredAnnotations.length == 0) {
- return true;
+ throw new IllegalArgumentException("Must specify at least one annotation");
}
for (Class<? extends Annotation> requiredAnnotation : requiredAnnotations) {
if (field.getAnnotation(requiredAnnotation) != null) {
@@ -108,4 +113,23 @@ public final class FieldFinder {
}
return false;
}
+
+ public <T extends Annotation> Method methodWith(Class<T> annotationClass) {
+ List<Method> methods = methodsWith(annotationClass);
+ Preconditions.checkArgument(methods.size() <= 1,
+ "Found %d methods annotated with %s in class %s, but only 1 allowed",
+ methods.size(), annotationClass.getName(), originalClazz.getName());
+ return Iterables.getOnlyElement(methods, null);
+ }
+
+ public <T extends Annotation> List<Method> methodsWith(Class<T> annotationClass) {
+ List<Method> methods = new ArrayList<>();
+ for (Method method : originalClazz.getMethods()) {
+ T annotation = method.getAnnotation(annotationClass);
+ if (annotation != null) {
+ methods.add(method);
+ }
+ }
+ return methods;
+ }
}