Scripted update of if statements
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / rfc6020 / ModuleStatementSupport.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 static org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator.MAX;
11 import static org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils.firstAttributeOf;
12
13 import com.google.common.base.Optional;
14 import java.net.URI;
15 import java.util.Date;
16 import org.opendaylight.yangtools.yang.common.QNameModule;
17 import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil;
18 import org.opendaylight.yangtools.yang.model.api.ModuleIdentifier;
19 import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping;
20 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
21 import org.opendaylight.yangtools.yang.model.api.stmt.ModuleStatement;
22 import org.opendaylight.yangtools.yang.model.api.stmt.NamespaceStatement;
23 import org.opendaylight.yangtools.yang.model.api.stmt.PrefixStatement;
24 import org.opendaylight.yangtools.yang.parser.builder.impl.ModuleIdentifierImpl;
25 import org.opendaylight.yangtools.yang.parser.spi.ModuleNamespace;
26 import org.opendaylight.yangtools.yang.parser.spi.NamespaceToModule;
27 import org.opendaylight.yangtools.yang.parser.spi.PreLinkageModuleNamespace;
28 import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator;
29 import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport;
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.source.ImpPrefixToModuleIdentifier;
33 import org.opendaylight.yangtools.yang.parser.spi.source.ImpPrefixToNamespace;
34 import org.opendaylight.yangtools.yang.parser.spi.source.ModuleCtxToModuleQName;
35 import org.opendaylight.yangtools.yang.parser.spi.source.ModuleIdentifierToModuleQName;
36 import org.opendaylight.yangtools.yang.parser.spi.source.ModuleNameToModuleQName;
37 import org.opendaylight.yangtools.yang.parser.spi.source.ModuleNameToNamespace;
38 import org.opendaylight.yangtools.yang.parser.spi.source.ModuleNamespaceForBelongsTo;
39 import org.opendaylight.yangtools.yang.parser.spi.source.ModuleQNameToModuleName;
40 import org.opendaylight.yangtools.yang.parser.spi.source.PrefixToModule;
41 import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
42 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.ModuleEffectiveStatementImpl;
43
44 public class ModuleStatementSupport extends
45         AbstractStatementSupport<String, ModuleStatement, EffectiveStatement<String, ModuleStatement>> {
46     private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping
47             .MODULE)
48             .add(Rfc6020Mapping.ANYXML, 0, MAX)
49             .add(Rfc6020Mapping.AUGMENT, 0, MAX)
50             .add(Rfc6020Mapping.CHOICE, 0, MAX)
51             .add(Rfc6020Mapping.CONTACT, 0, 1)
52             .add(Rfc6020Mapping.CONTAINER, 0, MAX)
53             .add(Rfc6020Mapping.DESCRIPTION, 0, 1)
54             .add(Rfc6020Mapping.DEVIATION, 0, MAX)
55             .add(Rfc6020Mapping.EXTENSION, 0, MAX)
56             .add(Rfc6020Mapping.FEATURE, 0, MAX)
57             .add(Rfc6020Mapping.GROUPING, 0, MAX)
58             .add(Rfc6020Mapping.IDENTITY, 0, MAX)
59             .add(Rfc6020Mapping.IMPORT, 0, MAX)
60             .add(Rfc6020Mapping.INCLUDE, 0, MAX)
61             .add(Rfc6020Mapping.LEAF, 0, MAX)
62             .add(Rfc6020Mapping.LEAF_LIST, 0, MAX)
63             .add(Rfc6020Mapping.LIST, 0, MAX)
64             .add(Rfc6020Mapping.NAMESPACE, 1, 1)
65             .add(Rfc6020Mapping.NOTIFICATION, 0, MAX)
66             .add(Rfc6020Mapping.ORGANIZATION, 0, 1)
67             .add(Rfc6020Mapping.PREFIX, 1, 1)
68             .add(Rfc6020Mapping.REFERENCE, 0, 1)
69             .add(Rfc6020Mapping.REVISION, 0, MAX)
70             .add(Rfc6020Mapping.RPC, 0, MAX)
71             .add(Rfc6020Mapping.TYPEDEF, 0, MAX)
72             .add(Rfc6020Mapping.USES, 0, MAX)
73             .add(Rfc6020Mapping.YANG_VERSION, 0, 1)
74             .build();
75
76     public ModuleStatementSupport() {
77         super(Rfc6020Mapping.MODULE);
78     }
79
80     @Override
81     public String parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
82         return value;
83     }
84
85     @Override
86     public ModuleStatement createDeclared(final StmtContext<String, ModuleStatement, ?> ctx) {
87         return new ModuleStatementImpl(ctx);
88     }
89
90     @Override
91     public EffectiveStatement<String, ModuleStatement> createEffective(
92             final StmtContext<String, ModuleStatement, EffectiveStatement<String, ModuleStatement>> ctx) {
93         return new ModuleEffectiveStatementImpl(ctx);
94     }
95
96     @Override
97     public void onPreLinkageDeclared(Mutable<String, ModuleStatement, EffectiveStatement<String, ModuleStatement>> stmt) {
98         final String moduleName = stmt.getStatementArgument();
99
100         final URI moduleNs = firstAttributeOf(stmt.declaredSubstatements(),
101                 NamespaceStatement.class);
102         SourceException.throwIfNull(moduleNs, stmt.getStatementSourceReference(),
103             "Namespace of the module [%s] is missing", stmt.getStatementArgument());
104         stmt.addToNs(ModuleNameToNamespace.class, moduleName, moduleNs);
105
106         final String modulePrefix = firstAttributeOf(stmt.declaredSubstatements(), PrefixStatement.class);
107         SourceException.throwIfNull(modulePrefix, stmt.getStatementSourceReference(),
108             "Prefix of the module [%s] is missing", stmt.getStatementArgument());
109         stmt.addToNs(ImpPrefixToNamespace.class, modulePrefix, moduleNs);
110
111         stmt.addContext(PreLinkageModuleNamespace.class, moduleName, stmt);
112     };
113
114     @Override
115     public void onLinkageDeclared(final Mutable<String, ModuleStatement, EffectiveStatement<String, ModuleStatement>> stmt) {
116
117         Optional<URI> moduleNs = Optional.fromNullable(firstAttributeOf(stmt.declaredSubstatements(),
118                 NamespaceStatement.class));
119         SourceException.throwIf(!moduleNs.isPresent(), stmt.getStatementSourceReference(),
120             "Namespace of the module [%s] is missing", stmt.getStatementArgument());
121
122         Optional<Date> revisionDate = Optional.fromNullable(Utils.getLatestRevision(stmt.declaredSubstatements()));
123         if (!revisionDate.isPresent()) {
124             revisionDate = Optional.of(SimpleDateFormatUtil.DEFAULT_DATE_REV);
125         }
126
127         QNameModule qNameModule = QNameModule.create(moduleNs.get(), revisionDate.orNull()).intern();
128         ModuleIdentifier moduleIdentifier = new ModuleIdentifierImpl(stmt.getStatementArgument(),
129                 Optional.absent(), revisionDate);
130
131         stmt.addContext(ModuleNamespace.class, moduleIdentifier, stmt);
132         stmt.addContext(ModuleNamespaceForBelongsTo.class, moduleIdentifier.getName(), stmt);
133         stmt.addContext(NamespaceToModule.class, qNameModule, stmt);
134
135         final String modulePrefix = firstAttributeOf(stmt.declaredSubstatements(), PrefixStatement.class);
136         SourceException.throwIfNull(modulePrefix, stmt.getStatementSourceReference(),
137             "Prefix of the module [%s] is missing", stmt.getStatementArgument());
138
139         stmt.addToNs(PrefixToModule.class, modulePrefix, qNameModule);
140         stmt.addToNs(ModuleNameToModuleQName.class, stmt.getStatementArgument(), qNameModule);
141         stmt.addToNs(ModuleCtxToModuleQName.class, stmt, qNameModule);
142         stmt.addToNs(ModuleQNameToModuleName.class, qNameModule, stmt.getStatementArgument());
143         stmt.addToNs(ModuleIdentifierToModuleQName.class, moduleIdentifier, qNameModule);
144         stmt.addToNs(ImpPrefixToModuleIdentifier.class, modulePrefix, moduleIdentifier);
145     }
146
147     @Override
148     public void onFullDefinitionDeclared(final Mutable<String, ModuleStatement,
149             EffectiveStatement<String, ModuleStatement>> stmt) {
150         super.onFullDefinitionDeclared(stmt);
151         SUBSTATEMENT_VALIDATOR.validate(stmt);
152     }
153 }