Add ObjectExtensions.Factory 28/82028/2
authorRobert Varga <robert.varga@pantheon.tech>
Tue, 14 May 2019 10:56:56 +0000 (12:56 +0200)
committerRobert Varga <nite@hq.sk>
Tue, 14 May 2019 11:40:09 +0000 (11:40 +0000)
Rather than allowing direct instantiation, indirect instantiation
through a Factory which performs validation.

Change-Id: If6301db3e6550d99e2746768df6b6312e85d4135
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
common/concepts/src/main/java/org/opendaylight/yangtools/concepts/ObjectExtensions.java

index f82009d95597e1aeedbe67d1a94aa03d8562dd14..53e6f28e19726b55b2dcc1f619a9b96675827407 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.yangtools.concepts;
 
+import static com.google.common.base.Preconditions.checkArgument;
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
@@ -69,13 +70,34 @@ public final class ObjectExtensions<O extends ExtensibleObject<O, E>, E extends
         }
     }
 
+    public static final class Factory<T, O extends ExtensibleObject<O, E>, E extends ObjectExtension<O, E>> {
+        private final @NonNull ImmutableSet<Class<? extends E>> extensions;
+
+        Factory(final ImmutableSet<Class<? extends E>> extensions) {
+            this.extensions = requireNonNull(extensions);
+        }
+
+        public ClassToInstanceMap<E> newInstance(final T object) {
+            return new ObjectExtensions<>(extensions, object);
+        }
+    }
+
     private final @NonNull ImmutableSet<Class<? extends E>> extensions;
-    private final @NonNull O object;
+    private final @NonNull Object object;
 
-    public ObjectExtensions(final ImmutableSet<Class<? extends E>> extensions, final O object) {
+    ObjectExtensions(final ImmutableSet<Class<? extends E>> extensions, final Object object) {
         this.extensions = requireNonNull(extensions);
         this.object = requireNonNull(object);
+    }
 
+    @SafeVarargs
+    public static <T, O extends ExtensibleObject<O, E>, E extends ObjectExtension<O, E>> Factory<T, O, E> factory(
+        final Class<T> objClass, final Class<? extends E>... extensions) {
+        final ImmutableSet<Class<? extends E>> set = ImmutableSet.copyOf(extensions);
+        for (Class<? extends E> extension : set) {
+            checkArgument(extension.isAssignableFrom(objClass), "%s is not a valid extension %s", objClass, extension);
+        }
+        return new Factory<>(set);
     }
 
     @Override