a457fb81cd6f06c82bc148bcbe0f8834dd63c668
[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         protected WithRawStringArgument(final StmtContext<String, ?, ?> context) {
70             super(context);
71         }
72
73         @Override
74         public final String argument() {
75             return rawArgument();
76         }
77     }
78
79     public abstract static class WithArgument<A> extends WithRawArgument<A> {
80         private final A argument;
81
82         protected WithArgument(final StmtContext<A, ?, ?> context) {
83             super(context);
84             argument = context.getStatementArgument();
85         }
86
87         @Override
88         public final A argument() {
89             return argument;
90         }
91     }
92
93     public abstract static class ArgumentToString<A> extends AbstractDeclaredStatement<A> {
94         private final @NonNull A argument;
95
96         protected ArgumentToString(final A argument) {
97             this.argument = requireNonNull(argument);
98         }
99
100         @Override
101         public final @NonNull A argument() {
102             return argument;
103         }
104
105         @Override
106         public final String rawArgument() {
107             return argument.toString();
108         }
109     }
110 }