Add default statementDefinition() methods
[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.model.api.meta.DeclaredStatement;
17 import org.opendaylight.yangtools.yang.model.api.meta.StatementSource;
18 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
19
20 /**
21  * An abstract base class for {@link DeclaredStatement} implementations. This is a direct competition to
22  * {@link org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement}, providing lower-footprint
23  * implementations.
24  */
25 @Beta
26 public abstract class AbstractDeclaredStatement<A> extends AbstractModelStatement<A> implements DeclaredStatement<A> {
27     protected AbstractDeclaredStatement() {
28     }
29
30     @Override
31     public final StatementSource getStatementSource() {
32         return StatementSource.DECLARATION;
33     }
34
35     @Override
36     public Collection<? extends DeclaredStatement<?>> declaredSubstatements() {
37         // Default to reduce load on subclasses and keep the number of implementations down
38         return ImmutableList.of();
39     }
40
41     /**
42      * Utility method for recovering singleton lists squashed by {@link #maskList(ImmutableList)}.
43      *
44      * @param masked list to unmask
45      * @return Unmasked list
46      * @throws NullPointerException if masked is null
47      * @throws ClassCastException if masked object does not match DeclaredStatement
48      */
49     @SuppressWarnings({ "rawtypes", "unchecked" })
50     protected static final @NonNull ImmutableList<? extends DeclaredStatement<?>> unmaskList(
51             final @NonNull Object masked) {
52         return (ImmutableList) unmaskList(masked, DeclaredStatement.class);
53     }
54
55     public abstract static class WithRawArgument<A> extends AbstractDeclaredStatement<A> {
56         private final String rawArgument;
57
58         protected WithRawArgument(final StmtContext<A, ?, ?> context) {
59             rawArgument = context.rawStatementArgument();
60         }
61
62         @Override
63         public final String rawArgument() {
64             return rawArgument;
65         }
66     }
67
68     public abstract static class WithRawStringArgument extends WithRawArgument<String> {
69         public abstract static class WithSubstatements extends WithRawStringArgument {
70             private final @NonNull Object substatements;
71
72             protected WithSubstatements(final StmtContext<String, ?, ?> context,
73                     final ImmutableList<? extends DeclaredStatement<?>> substatements) {
74                 super(context);
75                 this.substatements = maskList(substatements);
76             }
77
78             @Override
79             public final Collection<? extends DeclaredStatement<?>> declaredSubstatements() {
80                 return unmaskList(substatements);
81             }
82         }
83
84         protected WithRawStringArgument(final StmtContext<String, ?, ?> context) {
85             super(context);
86         }
87
88         @Override
89         public final String argument() {
90             return rawArgument();
91         }
92     }
93
94     public abstract static class WithArgument<A> extends WithRawArgument<A> {
95         private final A argument;
96
97         protected WithArgument(final StmtContext<A, ?, ?> context) {
98             super(context);
99             argument = context.getStatementArgument();
100         }
101
102         @Override
103         public final A argument() {
104             return argument;
105         }
106     }
107
108     public abstract static class ArgumentToString<A> extends AbstractDeclaredStatement<A> {
109         public abstract static class WithSubstatements<A> extends ArgumentToString<A> {
110             private final @NonNull Object substatements;
111
112             protected WithSubstatements(final A argument,
113                     final ImmutableList<? extends DeclaredStatement<?>> substatements) {
114                 super(argument);
115                 this.substatements = maskList(substatements);
116             }
117
118             @Override
119             public final Collection<? extends DeclaredStatement<?>> declaredSubstatements() {
120                 return unmaskList(substatements);
121             }
122         }
123
124         private final @NonNull A argument;
125
126         protected ArgumentToString(final A argument) {
127             this.argument = requireNonNull(argument);
128         }
129
130         @Override
131         public final @NonNull A argument() {
132             return argument;
133         }
134
135         @Override
136         public final String rawArgument() {
137             return argument.toString();
138         }
139     }
140 }