Reuse common superclass for BuiltinTypeStatement
[yangtools.git] / yang / yang-parser-rfc7950 / src / main / java / org / opendaylight / yangtools / yang / parser / rfc7950 / stmt / AbstractDeclaredStatement.java
1 /*
2  * Copyright (c) 2020 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.yang.parser.rfc7950.stmt;
9
10 import static java.util.Objects.requireNonNull;
11
12 import com.google.common.annotations.Beta;
13 import com.google.common.collect.ImmutableList;
14 import java.util.Collection;
15 import org.eclipse.jdt.annotation.NonNull;
16 import org.opendaylight.yangtools.yang.common.QName;
17 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
18 import org.opendaylight.yangtools.yang.model.api.meta.StatementSource;
19 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
20
21 /**
22  * An abstract base class for {@link DeclaredStatement} implementations. This is a direct competition to
23  * {@link org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement}, providing lower-footprint
24  * implementations.
25  */
26 @Beta
27 public abstract class AbstractDeclaredStatement<A> extends AbstractModelStatement<A> implements DeclaredStatement<A> {
28     protected AbstractDeclaredStatement() {
29     }
30
31     @Override
32     public StatementSource getStatementSource() {
33         return StatementSource.DECLARATION;
34     }
35
36     @Override
37     public Collection<? extends DeclaredStatement<?>> declaredSubstatements() {
38         // Default to reduce load on subclasses and keep the number of implementations down
39         return ImmutableList.of();
40     }
41
42     /**
43      * Utility method for recovering singleton lists squashed by {@link #maskList(ImmutableList)}.
44      *
45      * @param masked list to unmask
46      * @return Unmasked list
47      * @throws NullPointerException if masked is null
48      * @throws ClassCastException if masked object does not match DeclaredStatement
49      */
50     @SuppressWarnings({ "rawtypes", "unchecked" })
51     protected static final @NonNull ImmutableList<? extends DeclaredStatement<?>> unmaskList(
52             final @NonNull Object masked) {
53         return (ImmutableList) unmaskList(masked, DeclaredStatement.class);
54     }
55
56     public abstract static class WithRawArgument<A> extends AbstractDeclaredStatement<A> {
57         private final String rawArgument;
58
59         protected WithRawArgument(final StmtContext<A, ?, ?> context) {
60             this(context.rawStatementArgument());
61         }
62
63         protected WithRawArgument(final String rawArgument) {
64             this.rawArgument = rawArgument;
65         }
66
67         @Override
68         public final String rawArgument() {
69             return rawArgument;
70         }
71     }
72
73     public abstract static class WithQNameArgument extends AbstractDeclaredStatement<QName> {
74         public abstract static class WithSubstatements extends WithQNameArgument {
75             private final @NonNull Object substatements;
76
77             protected WithSubstatements(final QName argument,
78                     final ImmutableList<? extends DeclaredStatement<?>> substatements) {
79                 super(argument);
80                 this.substatements = maskList(substatements);
81             }
82
83             @Override
84             public final Collection<? extends DeclaredStatement<?>> declaredSubstatements() {
85                 return unmaskList(substatements);
86             }
87         }
88
89         private final QName argument;
90
91         protected WithQNameArgument(final QName argument) {
92             this.argument = requireNonNull(argument);
93         }
94
95         @Override
96         public final @NonNull QName argument() {
97             return argument;
98         }
99
100         @Override
101         public final String rawArgument() {
102             return argument.getLocalName();
103         }
104     }
105
106     public abstract static class WithRawStringArgument extends WithRawArgument<String> {
107         public abstract static class WithSubstatements extends WithRawStringArgument {
108             private final @NonNull Object substatements;
109
110             protected WithSubstatements(final StmtContext<String, ?, ?> context,
111                     final ImmutableList<? extends DeclaredStatement<?>> substatements) {
112                 super(context);
113                 this.substatements = maskList(substatements);
114             }
115
116             @Override
117             public final Collection<? extends DeclaredStatement<?>> declaredSubstatements() {
118                 return unmaskList(substatements);
119             }
120         }
121
122         protected WithRawStringArgument(final StmtContext<String, ?, ?> context) {
123             super(context);
124         }
125
126         protected WithRawStringArgument(final String rawArgument) {
127             super(rawArgument);
128         }
129
130         @Override
131         public final String argument() {
132             return rawArgument();
133         }
134     }
135
136     public abstract static class WithArgument<A> extends WithRawArgument<A> {
137         public abstract static class WithSubstatements<A> extends WithArgument<A> {
138             private final @NonNull Object substatements;
139
140             protected WithSubstatements(final StmtContext<A, ?, ?> context,
141                     final ImmutableList<? extends DeclaredStatement<?>> substatements) {
142                 super(context);
143                 this.substatements = maskList(substatements);
144             }
145
146             @Override
147             public final Collection<? extends DeclaredStatement<?>> declaredSubstatements() {
148                 return unmaskList(substatements);
149             }
150         }
151
152         private final A argument;
153
154         protected WithArgument(final StmtContext<A, ?, ?> context) {
155             super(context);
156             argument = context.getStatementArgument();
157         }
158
159         @Override
160         public final A argument() {
161             return argument;
162         }
163     }
164
165     public abstract static class ArgumentToString<A> extends AbstractDeclaredStatement<A> {
166         public abstract static class WithSubstatements<A> extends ArgumentToString<A> {
167             private final @NonNull Object substatements;
168
169             protected WithSubstatements(final A argument,
170                     final ImmutableList<? extends DeclaredStatement<?>> substatements) {
171                 super(argument);
172                 this.substatements = maskList(substatements);
173             }
174
175             @Override
176             public final Collection<? extends DeclaredStatement<?>> declaredSubstatements() {
177                 return unmaskList(substatements);
178             }
179         }
180
181         private final @NonNull A argument;
182
183         protected ArgumentToString(final A argument) {
184             this.argument = requireNonNull(argument);
185         }
186
187         @Override
188         public final @NonNull A argument() {
189             return argument;
190         }
191
192         @Override
193         public final String rawArgument() {
194             return argument.toString();
195         }
196     }
197 }