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 com.google.common.base.Preconditions;
11 import com.google.common.collect.ImmutableList;
12 import com.google.common.collect.Iterables;
13 import java.util.Objects;
14 import org.eclipse.jdt.annotation.NonNull;
15 import org.opendaylight.yangtools.util.HashCodeBuilder;
16 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.IdentifiableItem;
17 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
18 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.Item;
19 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument;
21 final class InstanceIdentifierBuilderImpl<T extends DataObject> implements InstanceIdentifierBuilder<T> {
22 private final ImmutableList.Builder<PathArgument> pathBuilder = ImmutableList.builder();
23 private final HashCodeBuilder<PathArgument> hashBuilder;
24 private final Iterable<? extends PathArgument> basePath;
25 private boolean wildcard = false;
26 private PathArgument arg = null;
28 InstanceIdentifierBuilderImpl() {
29 this.hashBuilder = new HashCodeBuilder<>();
33 InstanceIdentifierBuilderImpl(final PathArgument item, final Iterable<? extends PathArgument> pathArguments,
34 final int hash, final boolean wildcard) {
35 this.hashBuilder = new HashCodeBuilder<>(hash);
36 this.basePath = pathArguments;
37 this.wildcard = wildcard;
42 public int hashCode() {
43 return hashBuilder.build();
47 public boolean equals(final Object obj) {
51 if (obj instanceof InstanceIdentifierBuilderImpl) {
52 @SuppressWarnings("unchecked")
53 final InstanceIdentifierBuilderImpl<T> otherBuilder = (InstanceIdentifierBuilderImpl<T>) obj;
54 return wildcard == otherBuilder.wildcard && Objects.equals(basePath, otherBuilder.basePath)
55 && Objects.equals(arg, otherBuilder.arg)
56 && Objects.equals(hashBuilder.build(), otherBuilder.hashBuilder.build());
62 public <N extends ChildOf<? super T>> InstanceIdentifierBuilderImpl<N> child(final Class<N> container) {
63 return addNode(container);
67 public <C extends ChoiceIn<? super T> & DataObject, N extends ChildOf<? super C>> InstanceIdentifierBuilder<N>
68 child(final Class<C> caze, final Class<N> container) {
69 return addWildNode(Item.of(caze, container));
73 public <N extends Identifiable<K> & ChildOf<? super T>, K extends Identifier<N>> InstanceIdentifierBuilderImpl<N>
74 child(final Class<@NonNull N> listItem, final K listKey) {
75 return addNode(IdentifiableItem.of(listItem, listKey));
79 public <C extends ChoiceIn<? super T> & DataObject, K extends Identifier<N>,
80 N extends Identifiable<K> & ChildOf<? super C>> InstanceIdentifierBuilder<N> child(final Class<C> caze,
81 final Class<N> listItem, final K listKey) {
82 return addNode(IdentifiableItem.of(caze, listItem, listKey));
86 * Build an identifier which refers to a specific augmentation of the current InstanceIdentifier referenced by
89 * @param container Augmentation to be added
90 * @param <N> Augmentation type
91 * @return This builder
94 public <N extends DataObject & Augmentation<? super T>> InstanceIdentifierBuilderImpl<N> augmentation(
95 final Class<N> container) {
96 return addNode(container);
100 public InstanceIdentifier<T> build() {
101 Preconditions.checkState(arg != null, "No path arguments present");
103 final Iterable<PathArgument> pathArguments;
104 if (basePath == null) {
105 pathArguments = pathBuilder.build();
107 pathArguments = Iterables.concat(basePath, pathBuilder.build());
110 return InstanceIdentifier.trustedCreate(arg, pathArguments, hashBuilder.build(), wildcard);
113 <N extends DataObject> @NonNull InstanceIdentifierBuilderImpl<N> addWildNode(final PathArgument newArg) {
114 if (Identifiable.class.isAssignableFrom(newArg.getType())) {
117 return addNode(newArg);
120 @SuppressWarnings("unchecked")
121 <N extends DataObject> @NonNull InstanceIdentifierBuilderImpl<N> addNode(final PathArgument newArg) {
123 hashBuilder.addArgument(newArg);
124 pathBuilder.add(newArg);
125 return (InstanceIdentifierBuilderImpl<N>) this;
128 private <N extends DataObject> @NonNull InstanceIdentifierBuilderImpl<N> addNode(final Class<N> container) {
129 return addWildNode(Item.of(container));