Move EffectiveStatementMixins to yang-model-spi
[yangtools.git] / yang / openconfig-parser-support / src / main / java / org / opendaylight / yangtools / openconfig / parser / AbstractHashedValueStatementSupport.java
1 /*
2  * Copyright (c) 2017 Pantheon Technologies, 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.openconfig.parser;
9
10 import static java.util.Objects.requireNonNull;
11
12 import com.google.common.collect.ImmutableList;
13 import org.eclipse.jdt.annotation.NonNull;
14 import org.opendaylight.yangtools.concepts.Immutable;
15 import org.opendaylight.yangtools.openconfig.model.api.OpenConfigHashedValueEffectiveStatement;
16 import org.opendaylight.yangtools.openconfig.model.api.OpenConfigHashedValueStatement;
17 import org.opendaylight.yangtools.yang.common.Empty;
18 import org.opendaylight.yangtools.yang.common.QName;
19 import org.opendaylight.yangtools.yang.model.api.SchemaNodeDefaults;
20 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
21 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
22 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
23 import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
24 import org.opendaylight.yangtools.yang.model.spi.meta.AbstractDeclaredStatement.WithoutArgument.WithSubstatements;
25 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.UnknownEffectiveStatementBase;
26 import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractEmptyStatementSupport;
27 import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx.Current;
28 import org.opendaylight.yangtools.yang.parser.spi.meta.SchemaPathSupport;
29 import org.opendaylight.yangtools.yang.parser.spi.meta.StatementSupport.StatementPolicy;
30 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
31 import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator;
32
33 abstract class AbstractHashedValueStatementSupport
34         extends AbstractEmptyStatementSupport<OpenConfigHashedValueStatement, OpenConfigHashedValueEffectiveStatement> {
35
36     private static final class Declared extends WithSubstatements implements OpenConfigHashedValueStatement {
37         private final @NonNull StatementDefinition definition;
38
39         Declared(final StatementDefinition definition,
40                 final ImmutableList<? extends DeclaredStatement<?>> substatements) {
41             super(substatements);
42             this.definition = requireNonNull(definition);
43         }
44
45         @Override
46         public StatementDefinition statementDefinition() {
47             return definition;
48         }
49     }
50
51     private static final class Effective
52             extends UnknownEffectiveStatementBase<Empty, OpenConfigHashedValueStatement>
53             implements OpenConfigHashedValueEffectiveStatement {
54         private final @NonNull StatementDefinition definition;
55         private final @NonNull Immutable path;
56
57         Effective(final Current<Empty, OpenConfigHashedValueStatement> stmt,
58                 final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
59             super(stmt, substatements);
60             definition = stmt.publicDefinition();
61             path = SchemaPathSupport.toEffectivePath(stmt.getEffectiveParent().getSchemaPath()
62                     .createChild(stmt.publicDefinition().getStatementName()));
63         }
64
65         @Override
66         public QName getQName() {
67             return SchemaNodeDefaults.extractQName(path);
68         }
69
70         @Override
71         @Deprecated
72         public SchemaPath getPath() {
73             return SchemaNodeDefaults.extractPath(this, path);
74         }
75
76         @Override
77         public StatementDefinition statementDefinition() {
78             return definition;
79         }
80
81         @Override
82         public OpenConfigHashedValueEffectiveStatement asEffectiveStatement() {
83             return this;
84         }
85     }
86
87     private final SubstatementValidator validator;
88
89     AbstractHashedValueStatementSupport(final StatementDefinition definition) {
90         super(definition, StatementPolicy.contextIndependent());
91         this.validator = SubstatementValidator.builder(definition).build();
92     }
93
94     @Override
95     protected final SubstatementValidator getSubstatementValidator() {
96         return validator;
97     }
98
99     @Override
100     protected final OpenConfigHashedValueStatement createDeclared(
101             final StmtContext<Empty, OpenConfigHashedValueStatement, ?> ctx,
102             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
103         return new Declared(getPublicView(), substatements);
104     }
105
106     @Override
107     protected final OpenConfigHashedValueStatement createEmptyDeclared(
108             final StmtContext<Empty, OpenConfigHashedValueStatement, ?> ctx) {
109         return createDeclared(ctx, ImmutableList.of());
110     }
111
112     @Override
113     protected OpenConfigHashedValueEffectiveStatement createEffective(
114             final Current<Empty, OpenConfigHashedValueStatement> stmt,
115             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
116         return new Effective(stmt, substatements);
117     }
118
119 }