diff --git a/utils/src/com/cloud/utils/ReflectUtil.java b/utils/src/com/cloud/utils/ReflectUtil.java index 930e0b61e9c..fecd896c924 100755 --- a/utils/src/com/cloud/utils/ReflectUtil.java +++ b/utils/src/com/cloud/utils/ReflectUtil.java @@ -106,7 +106,12 @@ public class ReflectUtil { return fields; } - // Returns all unique fields except excludeClasses for a cmd class + /** + * Returns all unique fields except excludeClasses for a cmd class + * @param cmdClass the class in which fields should be collected + * @param excludeClasses the classes whose fields must be ignored + * @return list of fields + */ public static Set getAllFieldsForClass(Class cmdClass, Class[] excludeClasses) { Set fields = new HashSet(); @@ -116,14 +121,17 @@ public class ReflectUtil { while (superClass != null && superClass != Object.class) { String superName = superClass.getName(); boolean isNameEqualToSuperName = false; - for (Class baseClass: excludeClasses) - if (superName.equals(baseClass.getName())) + for (Class baseClass: excludeClasses) { + if (superName.equals(baseClass.getName())) { isNameEqualToSuperName = true; + } + } if (!isNameEqualToSuperName) { Field[] superClassFields = superClass.getDeclaredFields(); - if (superClassFields != null) + if (superClassFields != null) { Collections.addAll(fields, superClassFields); + } } superClass = superClass.getSuperclass(); } diff --git a/utils/test/com/cloud/utils/ReflectUtilTest.java b/utils/test/com/cloud/utils/ReflectUtilTest.java index 4c8eb506247..fc1cda6e5df 100644 --- a/utils/test/com/cloud/utils/ReflectUtilTest.java +++ b/utils/test/com/cloud/utils/ReflectUtilTest.java @@ -16,7 +16,11 @@ // under the License.package com.cloud.utils; package com.cloud.utils; +import java.lang.reflect.Field; import java.util.List; +import java.util.Set; + +import org.junit.Assert; import org.junit.Test; import static com.cloud.utils.ReflectUtil.flattenProperties; @@ -88,4 +92,63 @@ public final class ReflectUtilTest { } } + + static class Empty { + } + + static class Foo { + String fooField; + int fooIntField; + } + + static class Bar extends Foo { + String barField; + int barIntField; + } + + static class Baz extends Foo { + String bazField; + int bazIntField; + } + + @Test + public void getAllFieldsForClassWithFoo() throws NoSuchFieldException, SecurityException { + Set fooFields = ReflectUtil.getAllFieldsForClass(Foo.class, new Class [] {}); + Assert.assertNotNull(fooFields); + Assert.assertEquals(2, fooFields.size()); + Assert.assertTrue(fooFields.contains(Foo.class.getDeclaredField("fooField"))); + Assert.assertTrue(fooFields.contains(Foo.class.getDeclaredField("fooIntField"))); + } + + @Test + public void getAllFieldsForClassWithBar() throws NoSuchFieldException, SecurityException { + Set barFields = ReflectUtil.getAllFieldsForClass(Bar.class, new Class [] {}); + Assert.assertNotNull(barFields); + Assert.assertEquals(4, barFields.size()); + Assert.assertTrue(barFields.contains(Foo.class.getDeclaredField("fooField"))); + Assert.assertTrue(barFields.contains(Foo.class.getDeclaredField("fooIntField"))); + Assert.assertTrue(barFields.contains(Bar.class.getDeclaredField("barField"))); + Assert.assertTrue(barFields.contains(Bar.class.getDeclaredField("barIntField"))); + } + + @Test + public void getAllFieldsForClassWithBarWithoutFoo() throws NoSuchFieldException, SecurityException { + Set barFields = ReflectUtil.getAllFieldsForClass(Bar.class, new Class [] {Foo.class}); + Assert.assertNotNull(barFields); + Assert.assertEquals(2, barFields.size()); + Assert.assertTrue(barFields.contains(Bar.class.getDeclaredField("barField"))); + Assert.assertTrue(barFields.contains(Bar.class.getDeclaredField("barIntField"))); + } + + @Test + public void getAllFieldsForClassWithBazWithoutBar() throws NoSuchFieldException, SecurityException { + Set bazFields = ReflectUtil.getAllFieldsForClass(Baz.class, new Class [] {Bar.class}); + Assert.assertNotNull(bazFields); + Assert.assertEquals(4, bazFields.size()); + Assert.assertTrue(bazFields.contains(Foo.class.getDeclaredField("fooField"))); + Assert.assertTrue(bazFields.contains(Foo.class.getDeclaredField("fooIntField"))); + Assert.assertTrue(bazFields.contains(Baz.class.getDeclaredField("bazField"))); + Assert.assertTrue(bazFields.contains(Baz.class.getDeclaredField("bazIntField"))); + } + }