Add DataObject{Identifier,Reference}.Builder(.WithKey)
[yangtools.git] / binding / binding-spec / src / main / java / org / opendaylight / yangtools / binding / impl / DataObjectReferenceBuilder.java
1 /*
2  * Copyright (c) 2024 PANTHEON.tech, s.r.o. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.yangtools.binding.impl;
9
10 import org.opendaylight.yangtools.binding.DataObject;
11 import org.opendaylight.yangtools.binding.DataObjectReference;
12 import org.opendaylight.yangtools.binding.DataObjectStep;
13 import org.opendaylight.yangtools.binding.Key;
14 import org.opendaylight.yangtools.binding.KeyAware;
15 import org.opendaylight.yangtools.binding.KeyStep;
16
17 final class DataObjectReferenceBuilder<T extends DataObject> extends AbstractDataObjectReferenceBuilder<T> {
18     DataObjectReferenceBuilder(final AbstractDataObjectReferenceBuilder<?> prev, final DataObjectStep<?> item) {
19         super(prev, item);
20     }
21
22     DataObjectReferenceBuilder(final DataObjectReference<T> base) {
23         super(base);
24     }
25
26     DataObjectReferenceBuilder(final DataObjectStep<?> item, final boolean wildcard) {
27         super(item, wildcard);
28     }
29
30     @Override
31     public DataObjectReference<T> build() {
32         final var steps = buildSteps();
33         return wildcard() ? new DataObjectReferenceImpl<>(steps) : new DataObjectIdentifierImpl<>(null, steps);
34     }
35
36     @Override
37     @SuppressWarnings("unchecked")
38     protected <X extends DataObject> DataObjectReferenceBuilder<X> append(final DataObjectStep<X> step) {
39         appendItem(step);
40         return (DataObjectReferenceBuilder<X>) this;
41     }
42
43     @Override
44     protected <X extends DataObject & KeyAware<Y>, Y extends Key<X>> DataObjectReferenceBuilderWithKey<X, Y> append(
45             final KeyStep<Y, X> step) {
46         return new DataObjectReferenceBuilderWithKey<>(this, step);
47     }
48 }