You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ah...@apache.org on 2013/01/09 14:26:48 UTC
[28/50] [abbrv] git commit: utils: Reflection utilities to get cmd,
annotation and fields
utils: Reflection utilities to get cmd, annotation and fields
Signed-off-by: Rohit Yadav <bh...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/db297a33
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/db297a33
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/db297a33
Branch: refs/heads/javelin
Commit: db297a338f8a96350c99a4316953cf3631728cd3
Parents: d22229e
Author: Rohit Yadav <bh...@apache.org>
Authored: Tue Jan 8 18:36:31 2013 -0800
Committer: Rohit Yadav <bh...@apache.org>
Committed: Tue Jan 8 18:54:29 2013 -0800
----------------------------------------------------------------------
utils/pom.xml | 5 ++
utils/src/com/cloud/utils/ReflectUtil.java | 63 +++++++++++++++++++++++
2 files changed, 68 insertions(+), 0 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/db297a33/utils/pom.xml
----------------------------------------------------------------------
diff --git a/utils/pom.xml b/utils/pom.xml
index c916888..87c078a 100644
--- a/utils/pom.xml
+++ b/utils/pom.xml
@@ -146,6 +146,11 @@
<version>${cs.commons-io.version}</version>
<scope>provided</scope>
</dependency>
+ <dependency>
+ <groupId>org.reflections</groupId>
+ <artifactId>reflections</artifactId>
+ <version>${cs.reflections.version}</version>
+ </dependency>
</dependencies>
<build>
<defaultGoal>install</defaultGoal>
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/db297a33/utils/src/com/cloud/utils/ReflectUtil.java
----------------------------------------------------------------------
diff --git a/utils/src/com/cloud/utils/ReflectUtil.java b/utils/src/com/cloud/utils/ReflectUtil.java
index f1d1409..0944705 100755
--- a/utils/src/com/cloud/utils/ReflectUtil.java
+++ b/utils/src/com/cloud/utils/ReflectUtil.java
@@ -16,10 +16,14 @@
// under the License.
package com.cloud.utils;
+import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
+import java.util.HashSet;
+import java.util.Set;
import com.cloud.utils.exception.CloudRuntimeException;
+import org.reflections.Reflections;
public class ReflectUtil {
public static Pair<Class<?>, Field> getAnyField(Class<?> clazz, String fieldName) {
@@ -50,4 +54,63 @@ public class ReflectUtil {
return null;
}
+ // Gets all classes with some annotation from a package
+ public static Set<Class<?>> getClassesWithAnnotation(Class<? extends Annotation> annotation,
+ String[] packageNames) {
+ Reflections reflections;
+ Set<Class<?>> classes = new HashSet<Class<?>>();
+ for(String packageName: packageNames) {
+ reflections = new Reflections(packageName);
+ classes.addAll(reflections.getTypesAnnotatedWith(annotation));
+ }
+ return classes;
+ }
+
+ // Checks against posted search classes if cmd is async
+ public static boolean isCmdClassAsync(Class<?> cmdClass,
+ Class<?>[] searchClasses) {
+ boolean isAsync = false;
+ Class<?> superClass = cmdClass;
+
+ while (superClass != null && superClass != Object.class) {
+ String superName = superClass.getName();
+ for (Class<?> baseClass: searchClasses) {
+ if (superName.equals(baseClass.getName())) {
+ isAsync = true;
+ break;
+ }
+ }
+ if (isAsync)
+ break;
+ superClass = superClass.getSuperclass();
+ }
+ return isAsync;
+ }
+
+ // Returns all fields across the base class for a cmd
+ public static Field[] getAllFieldsForClass(Class<?> cmdClass,
+ Class<?>[] searchClasses) {
+ Field[] fields = cmdClass.getDeclaredFields();
+ Class<?> superClass = cmdClass.getSuperclass();
+
+ while (superClass != null && superClass != Object.class) {
+ String superName = superClass.getName();
+ for (Class<?> baseClass: searchClasses) {
+ if(!baseClass.isAssignableFrom(superClass))
+ continue;
+ if (!superName.equals(baseClass.getName())) {
+ Field[] superClassFields = superClass.getDeclaredFields();
+ if (superClassFields != null) {
+ Field[] tmpFields = new Field[fields.length + superClassFields.length];
+ System.arraycopy(fields, 0, tmpFields, 0, fields.length);
+ System.arraycopy(superClassFields, 0, tmpFields, fields.length, superClassFields.length);
+ fields = tmpFields;
+ }
+ }
+ }
+ superClass = superClass.getSuperclass();
+ }
+ return fields;
+ }
+
}