2 * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.yangtools.yang.parser.stmt.rfc6020;
10 import static org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator.MAX;
11 import static org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils.firstAttributeOf;
13 import com.google.common.base.Optional;
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;
44 public class ModuleStatementSupport extends
45 AbstractStatementSupport<String, ModuleStatement, EffectiveStatement<String, ModuleStatement>> {
46 private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping
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)
76 public ModuleStatementSupport() {
77 super(Rfc6020Mapping.MODULE);
81 public String parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
86 public ModuleStatement createDeclared(final StmtContext<String, ModuleStatement, ?> ctx) {
87 return new ModuleStatementImpl(ctx);
91 public EffectiveStatement<String, ModuleStatement> createEffective(
92 final StmtContext<String, ModuleStatement, EffectiveStatement<String, ModuleStatement>> ctx) {
93 return new ModuleEffectiveStatementImpl(ctx);
97 public void onPreLinkageDeclared(Mutable<String, ModuleStatement, EffectiveStatement<String, ModuleStatement>> stmt) {
98 final String moduleName = stmt.getStatementArgument();
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);
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);
111 stmt.addContext(PreLinkageModuleNamespace.class, moduleName, stmt);
115 public void onLinkageDeclared(final Mutable<String, ModuleStatement, EffectiveStatement<String, ModuleStatement>> stmt) {
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());
122 Optional<Date> revisionDate = Optional.fromNullable(Utils.getLatestRevision(stmt.declaredSubstatements()));
123 if (!revisionDate.isPresent()) {
124 revisionDate = Optional.of(SimpleDateFormatUtil.DEFAULT_DATE_REV);
127 QNameModule qNameModule = QNameModule.create(moduleNs.get(), revisionDate.orNull()).intern();
128 ModuleIdentifier moduleIdentifier = new ModuleIdentifierImpl(stmt.getStatementArgument(),
129 Optional.absent(), revisionDate);
131 stmt.addContext(ModuleNamespace.class, moduleIdentifier, stmt);
132 stmt.addContext(ModuleNamespaceForBelongsTo.class, moduleIdentifier.getName(), stmt);
133 stmt.addContext(NamespaceToModule.class, qNameModule, stmt);
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());
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);
148 public void onFullDefinitionDeclared(final Mutable<String, ModuleStatement,
149 EffectiveStatement<String, ModuleStatement>> stmt) {
150 super.onFullDefinitionDeclared(stmt);
151 SUBSTATEMENT_VALIDATOR.validate(stmt);