761f11c81db098a913bf6cfa4b8cfcd55b32580e
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / rfc6020 / ExtensionStatementImpl.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 package org.opendaylight.yangtools.yang.parser.stmt.rfc6020;
9
10 import org.opendaylight.yangtools.yang.common.QName;
11 import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
12 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
13 import org.opendaylight.yangtools.yang.model.api.stmt.ArgumentStatement;
14 import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement;
15 import org.opendaylight.yangtools.yang.model.api.stmt.ExtensionStatement;
16 import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement;
17 import org.opendaylight.yangtools.yang.model.api.stmt.StatusStatement;
18 import org.opendaylight.yangtools.yang.model.api.stmt.YinElementStatement;
19 import org.opendaylight.yangtools.yang.parser.spi.ExtensionNamespace;
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.StatementDefinitionNamespace;
24 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
25 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils;
26 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.ExtensionEffectiveStatementImpl;
27
28 public class ExtensionStatementImpl extends AbstractDeclaredStatement<QName> implements ExtensionStatement {
29     private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(YangStmtMapping
30             .EXTENSION)
31             .addOptional(YangStmtMapping.ARGUMENT)
32             .addOptional(YangStmtMapping.DESCRIPTION)
33             .addOptional(YangStmtMapping.REFERENCE)
34             .addOptional(YangStmtMapping.STATUS)
35             .build();
36
37     protected ExtensionStatementImpl(final StmtContext<QName, ExtensionStatement,?> context) {
38         super(context);
39     }
40
41     public static class Definition extends AbstractStatementSupport<QName,ExtensionStatement,EffectiveStatement<QName,ExtensionStatement>> {
42         public Definition() {
43             super(YangStmtMapping.EXTENSION);
44         }
45
46         @Override
47         public QName parseArgumentValue(final StmtContext<?,?,?> ctx, final String value) {
48             return StmtContextUtils.qnameFromArgument(ctx, value);
49         }
50
51         @Override
52         public ExtensionStatement createDeclared(final StmtContext<QName, ExtensionStatement,?> ctx) {
53             return new ExtensionStatementImpl(ctx);
54         }
55
56         @Override
57         public EffectiveStatement<QName,ExtensionStatement> createEffective(
58                 final StmtContext<QName,ExtensionStatement ,EffectiveStatement<QName,ExtensionStatement>> ctx) {
59             return ExtensionEffectiveStatementImpl.create(ctx);
60         }
61
62         @Override
63         public void onStatementDefinitionDeclared(final StmtContext.Mutable<QName, ExtensionStatement, EffectiveStatement<QName, ExtensionStatement>> stmt) {
64             super.onStatementDefinitionDeclared(stmt);
65
66             stmt.addContext(ExtensionNamespace.class, stmt.getStatementArgument(), stmt);
67
68             final StmtContext<QName, ?, ?> argument = StmtContextUtils.findFirstDeclaredSubstatement(stmt,
69                 ArgumentStatement.class);
70             final StmtContext<Boolean, ?, ?> yinElement = StmtContextUtils.findFirstDeclaredSubstatement(stmt,
71                 YinElementStatement.class);
72
73             stmt.addToNs(StatementDefinitionNamespace.class, stmt.getStatementArgument(),
74                 new ModelDefinedStatementSupport(new ModelDefinedStatementDefinition(stmt.getStatementArgument(),
75                     argument != null ? argument.getStatementArgument() : null,
76                             yinElement != null ? yinElement.getStatementArgument() : false)));
77         }
78
79         @Override
80         protected SubstatementValidator getSubstatementValidator() {
81             return SUBSTATEMENT_VALIDATOR;
82         }
83     }
84
85     @Override
86     public StatusStatement getStatus() {
87         return firstDeclared(StatusStatement.class);
88     }
89
90     @Override
91     public DescriptionStatement getDescription() {
92         return firstDeclared(DescriptionStatement.class);
93     }
94
95     @Override
96     public ReferenceStatement getReference() {
97         return firstDeclared(ReferenceStatement.class);
98     }
99
100     @Override
101     public ArgumentStatement getArgument() {
102         return firstDeclared(ArgumentStatement.class);
103     }
104
105 }