Create all effective statements path Nullable
[yangtools.git] / yang / rfc8528-parser-support / src / main / java / org / opendaylight / yangtools / rfc8528 / parser / MountPointStatementSupport.java
1 /*
2  * Copyright (c) 2019 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.rfc8528.parser;
9
10 import com.google.common.collect.ImmutableList;
11 import org.eclipse.jdt.annotation.NonNull;
12 import org.eclipse.jdt.annotation.Nullable;
13 import org.opendaylight.yangtools.rfc8528.model.api.MountPointEffectiveStatement;
14 import org.opendaylight.yangtools.rfc8528.model.api.MountPointSchemaNode;
15 import org.opendaylight.yangtools.rfc8528.model.api.MountPointStatement;
16 import org.opendaylight.yangtools.rfc8528.model.api.SchemaMountStatements;
17 import org.opendaylight.yangtools.yang.common.QName;
18 import org.opendaylight.yangtools.yang.common.QNameModule;
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.YangStmtMapping;
22 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
23 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
24 import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
25 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.WithQNameArgument.WithSubstatements;
26 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseQNameStatementSupport;
27 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.UnknownEffectiveStatementBase;
28 import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx.Current;
29 import org.opendaylight.yangtools.yang.parser.spi.meta.SchemaPathSupport;
30 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
31 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable;
32 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils;
33 import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator;
34 import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
35
36 public final class MountPointStatementSupport
37         extends BaseQNameStatementSupport<MountPointStatement, MountPointEffectiveStatement> {
38
39     private static final class Declared extends WithSubstatements implements MountPointStatement {
40         Declared(final QName argument, final ImmutableList<? extends DeclaredStatement<?>> substatements) {
41             super(argument, substatements);
42         }
43     }
44
45     private static final class Effective extends UnknownEffectiveStatementBase<QName, MountPointStatement>
46             implements MountPointEffectiveStatement, MountPointSchemaNode {
47
48         private final @Nullable SchemaPath path;
49
50         Effective(final Current<QName, MountPointStatement> stmt,
51                 final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
52             super(stmt, substatements);
53             path = SchemaPathSupport.wrap(stmt.getEffectiveParent().getSchemaPath().createChild(argument()));
54         }
55
56         @Override
57         public QName getQName() {
58             return path.getLastComponent();
59         }
60
61         @Override
62         @Deprecated
63         public SchemaPath getPath() {
64             return SchemaNodeDefaults.throwUnsupportedIfNull(this, path);
65         }
66
67         @Override
68         public MountPointEffectiveStatement asEffectiveStatement() {
69             return this;
70         }
71     }
72
73     private static final MountPointStatementSupport INSTANCE = new MountPointStatementSupport(
74         SchemaMountStatements.MOUNT_POINT);
75
76     private final SubstatementValidator validator;
77
78     MountPointStatementSupport(final StatementDefinition definition) {
79         super(definition);
80         this.validator = SubstatementValidator.builder(definition)
81                 .addOptional(YangStmtMapping.CONFIG)
82                 .addOptional(YangStmtMapping.DESCRIPTION)
83                 .addOptional(YangStmtMapping.REFERENCE)
84                 .addOptional(YangStmtMapping.STATUS)
85                 .build();
86     }
87
88     public static MountPointStatementSupport getInstance() {
89         return INSTANCE;
90     }
91
92     @Override
93     public QName parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
94         return StmtContextUtils.parseIdentifier(ctx, value);
95     }
96
97     @Override
98     public QName adaptArgumentValue(final StmtContext<QName, MountPointStatement, MountPointEffectiveStatement> ctx,
99             final QNameModule targetModule) {
100         return ctx.getArgument().bindTo(targetModule).intern();
101     }
102
103     @Override
104     public void onStatementAdded(final Mutable<QName, MountPointStatement, MountPointEffectiveStatement> stmt) {
105         final StatementDefinition parentDef = stmt.coerceParentContext().publicDefinition();
106         SourceException.throwIf(YangStmtMapping.CONTAINER != parentDef && YangStmtMapping.LIST != parentDef, stmt,
107             "Mount points may only be defined at either a container or a list");
108     }
109
110     @Override
111     protected SubstatementValidator getSubstatementValidator() {
112         return validator;
113     }
114
115     @Override
116     protected MountPointStatement createDeclared(@NonNull final StmtContext<QName, MountPointStatement, ?> ctx,
117             final ImmutableList<? extends DeclaredStatement<?>> substatements) {
118         return new Declared(ctx.getArgument(), substatements);
119     }
120
121     @Override
122     protected MountPointStatement createEmptyDeclared(final StmtContext<QName, MountPointStatement, ?> ctx) {
123         return createDeclared(ctx, ImmutableList.of());
124     }
125
126     @Override
127     protected MountPointEffectiveStatement createEffective(final Current<QName, MountPointStatement> stmt,
128             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
129         return new Effective(stmt, substatements);
130     }
131 }