Make builder typesafe by default and deprecate type-unsafe interfaces
authorRobert Varga <rovarga@cisco.com>
Thu, 14 Nov 2013 10:21:32 +0000 (11:21 +0100)
committerRobert Varga <rovarga@cisco.com>
Thu, 14 Nov 2013 10:30:01 +0000 (11:30 +0100)
This concludes the conversion to typesafe builders, by introducing two
new factory methods which can be used with top-level containers,
resulting in a type-initialized container, on which child() and
augmentation() methods work as expected.

Since using this instantiation guides the developer and provides useful
compile-time feedback on what constitutes a valid InstanceIdentifier,
deprecate the old, unsafe interface.

Signed-off-by: Robert Varga <rovarga@cisco.com>
yang/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/InstanceIdentifier.java

index a36efd77de1d423eeb5091afb204ede4b80d43e2..66c745e29a674e19cd129f7496800a085f1bd2e5 100644 (file)
@@ -159,9 +159,16 @@ public final class InstanceIdentifier<T extends DataObject> implements Path<Inst
     }
 
     public interface InstanceIdentifierBuilder<T extends DataObject> extends Builder<InstanceIdentifier<T>> {
-
+        /**
+         * @deprecated use {@link child(Class)} or {@link augmentation(Class)} instead.
+         */
+        @Deprecated
         <N extends DataObject> InstanceIdentifierBuilder<N> node(Class<N> container);
 
+        /**
+         * @deprecated use {@link child(Class,Identifier)} or {@link augmentation(Class,Identifier)} instead.
+         */
+        @Deprecated
         <N extends Identifiable<K> & DataObject, K extends Identifier<N>> InstanceIdentifierBuilder<N> node(
                 Class<N> listItem, K listKey);
 
@@ -174,11 +181,24 @@ public final class InstanceIdentifier<T extends DataObject> implements Path<Inst
 
     }
 
+    /**
+     * @deprecated use {@link builder(Class)} or {@link builder(Class,Identifier)} instead.
+     */
+    @Deprecated
     @SuppressWarnings("rawtypes")
     public static InstanceIdentifierBuilder<?> builder() {
         return new BuilderImpl();
     }
 
+    public static <T extends ChildOf<? extends DataRoot>> InstanceIdentifierBuilder<T> builder(Class<T> container) {
+        return new BuilderImpl<T>().addNode(container);
+    }
+
+    public static <N extends Identifiable<K> & DataObject, K extends Identifier<N>> InstanceIdentifierBuilder<N> builder(
+            Class<N> listItem, K listKey) {
+        return new BuilderImpl<N>().addNode(listItem, listKey);
+    }
+
     public static <T extends DataObject> InstanceIdentifierBuilder<T> builder(InstanceIdentifier<T> basePath) {
         return new BuilderImpl<T>(basePath.path,basePath.targetType);
     }
@@ -192,12 +212,26 @@ public final class InstanceIdentifier<T extends DataObject> implements Path<Inst
             this.path = new ArrayList<>();
         }
         
-
         public BuilderImpl(List<? extends PathArgument> prefix,Class<? extends DataObject> target) {
             this.path = new ArrayList<>(prefix);
             this.target = target;
         }
 
+        @SuppressWarnings("unchecked")
+        private <N extends DataObject> InstanceIdentifierBuilder<N> addNode(Class<N> container) {
+            target = container;
+            path.add(new Item<N>(container));
+            return (InstanceIdentifierBuilder<N>) this;
+        }
+
+        @SuppressWarnings("unchecked")
+        private <N extends DataObject & Identifiable<K> , K extends Identifier<N>> InstanceIdentifierBuilder<N> addNode(
+                Class<N> listItem, K listKey) {
+            target = listItem;
+            path.add(new IdentifiableItem<N, K>(listItem, listKey));
+            return (InstanceIdentifierBuilder<N>) this;
+        }
+
         @SuppressWarnings({ "unchecked", "rawtypes" })
         @Override
         public InstanceIdentifier<T> toInstance() {
@@ -206,37 +240,31 @@ public final class InstanceIdentifier<T extends DataObject> implements Path<Inst
         }
 
         @Override
-        @SuppressWarnings("unchecked")
         public <N extends DataObject> InstanceIdentifierBuilder<N> node(Class<N> container) {
-            target = container;
-            path.add(new Item<N>(container));
-            return (InstanceIdentifierBuilder<N>) this;
+            return addNode(container);
         }
 
         @Override
-        @SuppressWarnings("unchecked")
         public <N extends DataObject & Identifiable<K> , K extends Identifier<N>> InstanceIdentifierBuilder<N> node(
                 Class<N> listItem, K listKey) {
-            target = listItem;
-            path.add(new IdentifiableItem<N, K>(listItem, listKey));
-            return (InstanceIdentifierBuilder<N>) this;
+            return addNode(listItem, listKey);
         }
-        
+
         @Override
         public <N extends ChildOf<? super T>> InstanceIdentifierBuilder<N> child(Class<N> container) {
-            return node(container);
+            return addNode(container);
         }
         
         @Override
         public <N extends Identifiable<K> & ChildOf<? super T>, K extends Identifier<N>> InstanceIdentifierBuilder<N> child(
                 Class<N> listItem, K listKey) {
-            return node(listItem,listKey);
+            return addNode(listItem,listKey);
         }
 
         @Override
         public <N extends DataObject & Augmentation<? super T>> InstanceIdentifierBuilder<N> augmentation(
                 Class<N> container) {
-            return node(container);
+            return addNode(container);
         }
     }