Bug 6173: Allow refine statement to have no substatements
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / rfc6020 / RefineStatementImpl.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. 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
9 package org.opendaylight.yangtools.yang.parser.stmt.rfc6020;
10
11 import static org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator.MAX;
12
13 import javax.annotation.Nullable;
14 import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping;
15 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
16 import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement;
17 import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement;
18 import org.opendaylight.yangtools.yang.model.api.stmt.RefineStatement;
19 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
20 import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator;
21 import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
22 import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport;
23 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
24 import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
25 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.RefineEffectiveStatementImpl;
26
27 public class RefineStatementImpl extends AbstractDeclaredStatement<SchemaNodeIdentifier> implements RefineStatement {
28     private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping
29             .REFINE)
30             .add(Rfc6020Mapping.DEFAULT, 0, 1)
31             .add(Rfc6020Mapping.DESCRIPTION, 0, 1)
32             .add(Rfc6020Mapping.REFERENCE, 0, 1)
33             .add(Rfc6020Mapping.CONFIG, 0, 1)
34             .add(Rfc6020Mapping.MANDATORY, 0, 1)
35             .add(Rfc6020Mapping.PRESENCE, 0, 1)
36             .add(Rfc6020Mapping.MUST, 0, MAX)
37             .add(Rfc6020Mapping.MIN_ELEMENTS, 0, 1)
38             .add(Rfc6020Mapping.MAX_ELEMENTS, 0, 1)
39             .build();
40
41     protected RefineStatementImpl(final StmtContext<SchemaNodeIdentifier, RefineStatement, ?> context) {
42         super(context);
43     }
44
45     public static class Definition extends
46             AbstractStatementSupport<SchemaNodeIdentifier, RefineStatement, EffectiveStatement<SchemaNodeIdentifier, RefineStatement>> {
47
48         public Definition() {
49             super(Rfc6020Mapping.REFINE);
50         }
51
52         @Override
53         public SchemaNodeIdentifier parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
54             return Utils.nodeIdentifierFromPath(ctx, value);
55         }
56
57         @Override
58         public RefineStatement createDeclared(final StmtContext<SchemaNodeIdentifier, RefineStatement, ?> ctx) {
59             return new RefineStatementImpl(ctx);
60         }
61
62         @Override
63         public EffectiveStatement<SchemaNodeIdentifier, RefineStatement> createEffective(
64                 final StmtContext<SchemaNodeIdentifier, RefineStatement, EffectiveStatement<SchemaNodeIdentifier, RefineStatement>> ctx) {
65             return new RefineEffectiveStatementImpl(ctx);
66         }
67
68         @Override
69         public void onFullDefinitionDeclared(StmtContext.Mutable<SchemaNodeIdentifier, RefineStatement,
70                 EffectiveStatement<SchemaNodeIdentifier, RefineStatement>> stmt) throws SourceException {
71             super.onFullDefinitionDeclared(stmt);
72             SUBSTATEMENT_VALIDATOR.validate(stmt);
73         }
74     }
75
76     @Override
77     public String getTargetNode() {
78         return rawArgument();
79     }
80
81     @Nullable
82     @Override
83     public DescriptionStatement getDescription() {
84         return firstDeclared(DescriptionStatement.class);
85     }
86
87     @Nullable
88     @Override
89     public ReferenceStatement getReference() {
90         return firstDeclared(ReferenceStatement.class);
91     }
92 }