BUG-2825: introduce Ipv4 prefix parser for short bytes
[mdsal.git] / binding / yang-binding / src / main / java / org / opendaylight / yangtools / yang / binding / util / StringValueObjectFactory.java
index d15d580803b5c73c226d8987201a1f5507299713..0955681442dc9e1bfae79201ffd23bc63f9a0dfd 100644 (file)
@@ -41,9 +41,11 @@ public final class StringValueObjectFactory<T> {
 
     private final MethodHandle constructor;
     private final MethodHandle setter;
+    private final T template;
 
-    private StringValueObjectFactory(final MethodHandle constructor, final MethodHandle setter) {
-        this.constructor = Preconditions.checkNotNull(constructor);
+    private StringValueObjectFactory(final T template, final MethodHandle constructor, final MethodHandle setter) {
+        this.template = Preconditions.checkNotNull(template);
+        this.constructor = constructor.bindTo(template);
         this.setter = Preconditions.checkNotNull(setter);
     }
 
@@ -80,8 +82,8 @@ public final class StringValueObjectFactory<T> {
 
         final StringValueObjectFactory<T> ret;
         try {
-            ret = new StringValueObjectFactory<>(
-                    LOOKUP.unreflectConstructor(copyConstructor).asType(CONSTRUCTOR_METHOD_TYPE).bindTo(template),
+            ret = new StringValueObjectFactory<>(template,
+                    LOOKUP.unreflectConstructor(copyConstructor).asType(CONSTRUCTOR_METHOD_TYPE),
                     LOOKUP.unreflectSetter(f).asType(SETTER_METHOD_TYPE));
         } catch (IllegalAccessException e) {
             throw new IllegalStateException("Failed to instantiate method handles", e);
@@ -91,7 +93,7 @@ public final class StringValueObjectFactory<T> {
         // is far from perfect, but better than nothing.
         final Throwable t = new Throwable("Invocation stack");
         t.fillInStackTrace();
-        if (matchesPackage(clazz.getPackage(), t.getStackTrace())) {
+        if (matchesPackage(clazz.getPackage().getName(), t.getStackTrace())) {
             LOG.info("Instantiated factory for {}", clazz);
         } else {
             LOG.warn("Instantiated factory for {} outside its package", clazz, t);
@@ -100,9 +102,10 @@ public final class StringValueObjectFactory<T> {
         return ret;
     }
 
-    private static boolean matchesPackage(final Package pkg, final StackTraceElement[] stackTrace) {
+    private static boolean matchesPackage(final String pkg, final StackTraceElement[] stackTrace) {
         for (StackTraceElement e : stackTrace) {
-            if (pkg.equals(e.getClass().getPackage())) {
+            final String sp = e.getClassName();
+            if (sp.startsWith(pkg) && sp.lastIndexOf('.') == pkg.length()) {
                 return true;
             }
         }
@@ -122,4 +125,8 @@ public final class StringValueObjectFactory<T> {
             throw Throwables.propagate(e);
         }
     }
+
+    public T getTemplate() {
+        return template;
+    }
 }