2 * Copyright (c) 2020 PANTHEON.tech, s.r.o. 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.model.spi.meta;
10 import static com.google.common.base.Verify.verifyNotNull;
11 import static java.util.Objects.requireNonNull;
13 import com.google.common.annotations.Beta;
14 import com.google.common.collect.ImmutableList;
15 import java.util.Collection;
16 import org.eclipse.jdt.annotation.NonNull;
17 import org.opendaylight.yangtools.yang.common.Empty;
18 import org.opendaylight.yangtools.yang.common.QName;
19 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
20 import org.opendaylight.yangtools.yang.model.api.meta.StatementOrigin;
23 * An abstract base class for {@link DeclaredStatement} implementations. It provides various further stateless and
24 * stateful subclasses.
27 public abstract class AbstractDeclaredStatement<A> extends AbstractModelStatement<A> implements DeclaredStatement<A> {
29 public StatementOrigin statementOrigin() {
30 return StatementOrigin.DECLARATION;
34 public Collection<? extends DeclaredStatement<?>> declaredSubstatements() {
35 // Default to reduce load on subclasses and keep the number of implementations down
36 return ImmutableList.of();
40 * Utility method for recovering singleton lists squashed by {@link #maskList(ImmutableList)}.
42 * @param masked list to unmask
43 * @return Unmasked list
44 * @throws NullPointerException if masked is null
45 * @throws ClassCastException if masked object does not match DeclaredStatement
47 @SuppressWarnings({ "rawtypes", "unchecked" })
48 protected static final @NonNull ImmutableList<? extends DeclaredStatement<?>> unmaskList(
49 final @NonNull Object masked) {
50 return (ImmutableList) unmaskList(masked, DeclaredStatement.class);
53 public abstract static class WithRawArgument<A> extends AbstractDeclaredStatement<A> {
54 public abstract static class WithSubstatements<A> extends WithRawArgument<A> {
55 private final @NonNull Object substatements;
57 protected WithSubstatements(final String rawArgument,
58 final ImmutableList<? extends DeclaredStatement<?>> substatements) {
60 this.substatements = maskList(substatements);
64 public final Collection<? extends DeclaredStatement<?>> declaredSubstatements() {
65 return unmaskList(substatements);
69 private final String rawArgument;
71 protected WithRawArgument(final String rawArgument) {
72 this.rawArgument = rawArgument;
76 public final String rawArgument() {
81 public abstract static class WithQNameArgument extends AbstractDeclaredStatement<QName> {
82 public abstract static class WithSubstatements extends WithQNameArgument {
83 private final @NonNull Object substatements;
85 protected WithSubstatements(final QName argument,
86 final ImmutableList<? extends DeclaredStatement<?>> substatements) {
88 this.substatements = maskList(substatements);
92 public final Collection<? extends DeclaredStatement<?>> declaredSubstatements() {
93 return unmaskList(substatements);
97 private final @NonNull QName argument;
99 protected WithQNameArgument(final QName argument) {
100 this.argument = requireNonNull(argument);
104 public final QName argument() {
109 public final String rawArgument() {
110 return argument.getLocalName();
114 public abstract static class WithRawStringArgument extends WithRawArgument<String> {
115 public abstract static class WithSubstatements extends WithRawStringArgument {
116 private final @NonNull Object substatements;
118 protected WithSubstatements(final String rawArgument,
119 final ImmutableList<? extends DeclaredStatement<?>> substatements) {
121 this.substatements = maskList(substatements);
125 public final Collection<? extends DeclaredStatement<?>> declaredSubstatements() {
126 return unmaskList(substatements);
130 protected WithRawStringArgument(final String rawArgument) {
131 super(verifyNotNull(rawArgument));
135 public final String argument() {
136 return verifyNotNull(rawArgument());
140 public abstract static class WithArgument<A> extends WithRawArgument<A> {
141 public abstract static class WithSubstatements<A> extends WithArgument<A> {
142 private final @NonNull Object substatements;
144 protected WithSubstatements(final String rawArgument, final A argument,
145 final ImmutableList<? extends DeclaredStatement<?>> substatements) {
146 super(rawArgument, argument);
147 this.substatements = maskList(substatements);
151 public final Collection<? extends DeclaredStatement<?>> declaredSubstatements() {
152 return unmaskList(substatements);
156 private final @NonNull A argument;
158 protected WithArgument(final String rawArgument, final A argument) {
160 this.argument = requireNonNull(argument);
164 public final A argument() {
169 public abstract static class ArgumentToString<A> extends AbstractDeclaredStatement<A> {
170 public abstract static class WithSubstatements<A> extends ArgumentToString<A> {
171 private final @NonNull Object substatements;
173 protected WithSubstatements(final A argument,
174 final ImmutableList<? extends DeclaredStatement<?>> substatements) {
176 this.substatements = maskList(substatements);
180 public final Collection<? extends DeclaredStatement<?>> declaredSubstatements() {
181 return unmaskList(substatements);
185 private final @NonNull A argument;
187 protected ArgumentToString(final @NonNull A argument) {
188 this.argument = requireNonNull(argument);
192 public final A argument() {
197 public final String rawArgument() {
198 return argument.toString();
202 public abstract static class WithoutArgument extends AbstractDeclaredStatement<Empty> {
203 public abstract static class WithSubstatements extends WithoutArgument {
204 private final @NonNull Object substatements;
206 protected WithSubstatements(final ImmutableList<? extends DeclaredStatement<?>> substatements) {
207 this.substatements = maskList(substatements);
211 public final Collection<? extends DeclaredStatement<?>> declaredSubstatements() {
212 return unmaskList(substatements);
217 public final Empty argument() {
218 return Empty.getInstance();
222 public final String rawArgument() {