Correct InstanceIdentifier.trustedCreate()
[mdsal.git] / binding / yang-binding / src / main / java / org / opendaylight / yangtools / yang / binding / InstanceIdentifierBuilderImpl.java
index d4243ce1ad04f39f76ef8f1a22f59c5eeabd4f58..bb207ff52ad221bbe8162562f5a1d1d5dd1b427d 100644 (file)
@@ -11,6 +11,7 @@ import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import java.util.Objects;
+import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.util.HashCodeBuilder;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.IdentifiableItem;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
@@ -48,7 +49,8 @@ final class InstanceIdentifierBuilderImpl<T extends DataObject> implements Insta
             return true;
         }
         if (obj instanceof InstanceIdentifierBuilderImpl) {
-            InstanceIdentifierBuilderImpl<T> otherBuilder = (InstanceIdentifierBuilderImpl<T>) obj;
+            @SuppressWarnings("unchecked")
+            final InstanceIdentifierBuilderImpl<T> otherBuilder = (InstanceIdentifierBuilderImpl<T>) obj;
             return wildcard == otherBuilder.wildcard && Objects.equals(basePath, otherBuilder.basePath)
                     && Objects.equals(arg, otherBuilder.arg)
                     && Objects.equals(hashBuilder.build(), otherBuilder.hashBuilder.build());
@@ -56,37 +58,28 @@ final class InstanceIdentifierBuilderImpl<T extends DataObject> implements Insta
         return false;
     }
 
-    @SuppressWarnings("unchecked")
-    <N extends DataObject> InstanceIdentifierBuilderImpl<N> addNode(final Class<N> container) {
-        arg = new Item<>(container);
-        hashBuilder.addArgument(arg);
-        pathBuilder.add(arg);
-
-        if (Identifiable.class.isAssignableFrom(container)) {
-            wildcard = true;
-        }
-
-        return (InstanceIdentifierBuilderImpl<N>) this;
+    @Override
+    public <N extends ChildOf<? super T>> InstanceIdentifierBuilderImpl<N> child(final Class<N> container) {
+        return addNode(container);
     }
 
-    @SuppressWarnings("unchecked")
-    <N extends DataObject & Identifiable<K>, K extends Identifier<N>> InstanceIdentifierBuilderImpl<N> addNode(
-            final Class<N> listItem, final K listKey) {
-        arg = new IdentifiableItem<>(listItem, listKey);
-        hashBuilder.addArgument(arg);
-        pathBuilder.add(arg);
-        return (InstanceIdentifierBuilderImpl<N>) this;
+    @Override
+    public <C extends ChoiceIn<? super T> & DataObject, N extends ChildOf<? super C>> InstanceIdentifierBuilder<N>
+            child(final Class<C> caze, final Class<N> container) {
+        return addWildNode(Item.of(caze, container));
     }
 
     @Override
-    public <N extends ChildOf<? super T>> InstanceIdentifierBuilderImpl<N> child(final Class<N> container) {
-        return addNode(container);
+    public <N extends Identifiable<K> & ChildOf<? super T>, K extends Identifier<N>> InstanceIdentifierBuilderImpl<N>
+            child(final Class<@NonNull N> listItem, final K listKey) {
+        return addNode(IdentifiableItem.of(listItem, listKey));
     }
 
     @Override
-    public <N extends Identifiable<K> & ChildOf<? super T>, K extends Identifier<N>> InstanceIdentifierBuilderImpl<N>
-            child(final Class<N> listItem, final K listKey) {
-        return addNode(listItem, listKey);
+    public <C extends ChoiceIn<? super T> & DataObject, K extends Identifier<N>,
+        N extends Identifiable<K> & ChildOf<? super C>> InstanceIdentifierBuilder<N> child(final Class<C> caze,
+                final Class<N> listItem, final K listKey) {
+        return addNode(IdentifiableItem.of(caze, listItem, listKey));
     }
 
     /**
@@ -114,20 +107,25 @@ final class InstanceIdentifierBuilderImpl<T extends DataObject> implements Insta
             pathArguments = Iterables.concat(basePath, pathBuilder.build());
         }
 
-        @SuppressWarnings("unchecked")
-        final InstanceIdentifier<T> ret = (InstanceIdentifier<T>) InstanceIdentifier.trustedCreate(arg, pathArguments,
-            hashBuilder.build(), wildcard);
-        return ret;
+        return InstanceIdentifier.trustedCreate(arg, pathArguments, hashBuilder.build(), wildcard);
     }
 
-    /**
-     * Build the resulting InstanceIdentifier.
-     *
-     * @deprecated Use #build() instead.
-     */
-    @Override
-    @Deprecated
-    public InstanceIdentifier<T> toInstance() {
-        return build();
+    <N extends DataObject> @NonNull InstanceIdentifierBuilderImpl<N> addWildNode(final PathArgument newArg) {
+        if (Identifiable.class.isAssignableFrom(newArg.getType())) {
+            wildcard = true;
+        }
+        return addNode(newArg);
+    }
+
+    @SuppressWarnings("unchecked")
+    <N extends DataObject> @NonNull InstanceIdentifierBuilderImpl<N> addNode(final PathArgument newArg) {
+        arg = newArg;
+        hashBuilder.addArgument(newArg);
+        pathBuilder.add(newArg);
+        return (InstanceIdentifierBuilderImpl<N>) this;
+    }
+
+    private <N extends DataObject> @NonNull InstanceIdentifierBuilderImpl<N> addNode(final Class<N> container) {
+        return addWildNode(Item.of(container));
     }
 }