Add NoZone support
[mdsal.git] / binding / yang-binding / src / main / java / org / opendaylight / yangtools / yang / binding / util / StringValueObjectFactory.java
index c55b9621d1821ac73a7eb3e3d6c835bdbe2e623e..865ad626b2e5ebb242b2e314dc35c61c15098340 100644 (file)
@@ -74,12 +74,7 @@ public final class StringValueObjectFactory<T> {
             throw new IllegalArgumentException(String.format("%s does not have a copy constructor", clazz), e);
         }
 
-        final Field f;
-        try {
-            f = clazz.getDeclaredField("_value");
-        } catch (NoSuchFieldException e) {
-            throw new IllegalArgumentException(String.format("%s does not have required internal field", clazz), e);
-        }
+        final Field f = findValueField(clazz);
         f.setAccessible(true);
 
         final StringValueObjectFactory<T> ret;
@@ -115,6 +110,24 @@ public final class StringValueObjectFactory<T> {
         return false;
     }
 
+    private static Field findValueField(final Class<?> orig) {
+        NoSuchFieldException cause = null;
+        Class<?> clazz = orig;
+        do {
+            try {
+                return clazz.getDeclaredField("_value");
+            } catch (NoSuchFieldException e) {
+                if (cause != null) {
+                    e.addSuppressed(cause);
+                }
+                cause = e;
+            }
+            clazz = clazz.getSuperclass();
+        } while (clazz != null);
+
+        throw new IllegalArgumentException(orig + " nor its superclasses define required internal field _value", cause);
+    }
+
     @SuppressWarnings("checkstyle:illegalCatch")
     public T newInstance(final String string) {
         Preconditions.checkNotNull(string, "Argument may not be null");