diff --git a/utils/pom.xml b/utils/pom.xml
index c91688812f0..87c078a7a61 100644
--- a/utils/pom.xml
+++ b/utils/pom.xml
@@ -146,6 +146,11 @@
${cs.commons-io.version}
provided
+
+ org.reflections
+ reflections
+ ${cs.reflections.version}
+
install
diff --git a/utils/src/com/cloud/utils/ReflectUtil.java b/utils/src/com/cloud/utils/ReflectUtil.java
index f1d1409ee7d..09447059fe6 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, 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> getClassesWithAnnotation(Class extends Annotation> annotation,
+ String[] packageNames) {
+ Reflections reflections;
+ Set> classes = new HashSet>();
+ 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;
+ }
+
}