2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.yangtools.yang.binding;
10 import static java.util.Objects.requireNonNull;
12 import com.google.common.base.Preconditions;
13 import com.google.common.collect.ImmutableList;
14 import com.google.common.collect.Iterables;
15 import java.util.Objects;
16 import org.eclipse.jdt.annotation.NonNull;
17 import org.opendaylight.yangtools.util.HashCodeBuilder;
18 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.IdentifiableItem;
19 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
20 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.Item;
21 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument;
23 final class InstanceIdentifierBuilderImpl<T extends DataObject> implements InstanceIdentifierBuilder<T> {
24 private final ImmutableList.Builder<PathArgument> pathBuilder = ImmutableList.builder();
25 private final HashCodeBuilder<PathArgument> hashBuilder;
26 private final Iterable<? extends PathArgument> basePath;
27 private boolean wildcard;
28 private PathArgument arg;
30 private InstanceIdentifierBuilderImpl(final PathArgument item) {
31 hashBuilder = new HashCodeBuilder<>();
33 arg = requireNonNull(item);
34 hashBuilder.addArgument(item);
35 pathBuilder.add(item);
39 InstanceIdentifierBuilderImpl(final IdentifiableItem<? super T, ?> item) {
40 this((PathArgument) item);
43 InstanceIdentifierBuilderImpl(final Item<T> item) {
44 this((PathArgument) item);
45 if (Identifiable.class.isAssignableFrom(item.getType())) {
50 InstanceIdentifierBuilderImpl(final PathArgument item, final Iterable<? extends PathArgument> pathArguments,
51 final int hash, final boolean wildcard) {
52 hashBuilder = new HashCodeBuilder<>(hash);
53 basePath = pathArguments;
54 this.wildcard = wildcard;
59 public int hashCode() {
60 return hashBuilder.build();
64 public boolean equals(final Object obj) {
65 return this == obj || obj instanceof InstanceIdentifierBuilderImpl<?> other
66 && wildcard == other.wildcard && Objects.equals(basePath, other.basePath) && Objects.equals(arg, other.arg)
67 && hashBuilder.build() == other.hashBuilder.build();
71 public <N extends ChildOf<? super T>> InstanceIdentifierBuilderImpl<N> child(final Class<N> container) {
72 return addNode(container);
76 public <C extends ChoiceIn<? super T> & DataObject, N extends ChildOf<? super C>> InstanceIdentifierBuilder<N>
77 child(final Class<C> caze, final Class<N> container) {
78 return addWildNode(Item.of(caze, container));
82 public <N extends Identifiable<K> & ChildOf<? super T>, K extends Identifier<N>> InstanceIdentifierBuilderImpl<N>
83 child(final Class<@NonNull N> listItem, final K listKey) {
84 return addNode(IdentifiableItem.of(listItem, listKey));
88 public <C extends ChoiceIn<? super T> & DataObject, K extends Identifier<N>,
89 N extends Identifiable<K> & ChildOf<? super C>> InstanceIdentifierBuilder<N> child(final Class<C> caze,
90 final Class<N> listItem, final K listKey) {
91 return addNode(IdentifiableItem.of(caze, listItem, listKey));
95 * Build an identifier which refers to a specific augmentation of the current InstanceIdentifier referenced by
98 * @param container Augmentation to be added
99 * @param <N> Augmentation type
100 * @return This builder
103 public <N extends DataObject & Augmentation<? super T>> InstanceIdentifierBuilderImpl<N> augmentation(
104 final Class<N> container) {
105 return addNode(container);
109 public InstanceIdentifier<T> build() {
110 Preconditions.checkState(arg != null, "No path arguments present");
112 final Iterable<PathArgument> pathArguments;
113 if (basePath == null) {
114 pathArguments = pathBuilder.build();
116 pathArguments = Iterables.concat(basePath, pathBuilder.build());
119 return InstanceIdentifier.trustedCreate(arg, pathArguments, hashBuilder.build(), wildcard);
122 private <N extends DataObject> @NonNull InstanceIdentifierBuilderImpl<N> addWildNode(final PathArgument newArg) {
123 if (Identifiable.class.isAssignableFrom(newArg.getType())) {
126 return addNode(newArg);
129 @SuppressWarnings("unchecked")
130 private <N extends DataObject> @NonNull InstanceIdentifierBuilderImpl<N> addNode(final PathArgument newArg) {
132 hashBuilder.addArgument(newArg);
133 pathBuilder.add(newArg);
134 return (InstanceIdentifierBuilderImpl<N>) this;
137 private <N extends DataObject> @NonNull InstanceIdentifierBuilderImpl<N> addNode(final Class<N> container) {
138 return addWildNode(Item.of(container));