--- /dev/null
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
+ * Copyright (c) 2022 PANTHEON.tech, s.r.o.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.stmt.reactor;
+
+import static java.util.Objects.requireNonNull;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.opendaylight.yangtools.yang.common.QNameModule;
+import org.opendaylight.yangtools.yang.parser.spi.source.PrefixResolver;
+
+/**
+ * Map-based {@link PrefixResolver}. This class is NOT thread-safe.
+ */
+final class HashMapPrefixResolver implements PrefixResolver {
+ private final Map<String, QNameModule> prefixToModuleMap = new HashMap<>();
+
+ @Override
+ public QNameModule resolvePrefix(final String prefix) {
+ return prefixToModuleMap.get(requireNonNull(prefix));
+ }
+
+ void put(final String prefix, final QNameModule module) {
+ // FIXME: enforce non-nulls
+ // FIXME: enforce no duplicates
+ prefixToModuleMap.put(prefix, module);
+ }
+}
import org.opendaylight.yangtools.yang.parser.spi.source.ImportPrefixToModuleCtx;
import org.opendaylight.yangtools.yang.parser.spi.source.ImportedModuleContext;
import org.opendaylight.yangtools.yang.parser.spi.source.ModuleCtxToModuleQName;
-import org.opendaylight.yangtools.yang.parser.spi.source.PrefixToModule;
-import org.opendaylight.yangtools.yang.parser.spi.source.PrefixToModuleMap;
+import org.opendaylight.yangtools.yang.parser.spi.source.PrefixResolver;
import org.opendaylight.yangtools.yang.parser.spi.source.QNameToStatementDefinition;
import org.opendaylight.yangtools.yang.parser.spi.source.QNameToStatementDefinitionMap;
import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
private final Multimap<ModelProcessingPhase, ModifierImpl> modifiers = HashMultimap.create();
private final QNameToStatementDefinitionMap qnameToStmtDefMap = new QNameToStatementDefinitionMap();
private final SupportedStatements statementSupports = new SupportedStatements(qnameToStmtDefMap);
- private final PrefixToModuleMap prefixToModuleMap = new PrefixToModuleMap();
+ private final HashMapPrefixResolver prefixToModuleMap = new HashMapPrefixResolver();
private final @NonNull BuildGlobalContext globalContext;
// Freed as soon as we complete ModelProcessingPhase.EFFECTIVE_MODEL
}
}
- private PrefixToModule preLinkagePrefixes() {
- final PrefixToModuleMap preLinkagePrefixes = new PrefixToModuleMap();
+ private PrefixResolver preLinkagePrefixes() {
+ final HashMapPrefixResolver preLinkagePrefixes = new HashMapPrefixResolver();
final Map<String, XMLNamespace> prefixToNamespaceMap = getAllFromLocalStorage(ImpPrefixToNamespace.class);
if (prefixToNamespaceMap == null) {
//:FIXME if it is a submodule without any import, the map is null. Handle also submodules and includes...
return preLinkagePrefixes;
}
- private PrefixToModule prefixes() {
+ private PrefixResolver prefixes() {
final Map<String, StmtContext<?, ?, ?>> allImports = getRoot().getAllFromNamespace(
ImportPrefixToModuleCtx.class);
if (allImports != null) {
import org.opendaylight.yangtools.yang.parser.rfc7950.ir.IRKeyword.Qualified;
import org.opendaylight.yangtools.yang.parser.rfc7950.ir.IRStatement;
import org.opendaylight.yangtools.yang.parser.spi.source.ExplicitStatement;
-import org.opendaylight.yangtools.yang.parser.spi.source.PrefixToModule;
+import org.opendaylight.yangtools.yang.parser.spi.source.PrefixResolver;
import org.opendaylight.yangtools.yang.parser.spi.source.QNameToStatementDefinition;
import org.opendaylight.yangtools.yang.parser.spi.source.StatementSourceReference;
import org.opendaylight.yangtools.yang.parser.spi.source.StatementWriter;
class StatementContextVisitor {
private final QNameToStatementDefinition stmtDef;
private final ArgumentContextUtils utils;
+ private final PrefixResolver prefixes;
private final StatementWriter writer;
- private final PrefixToModule prefixes;
private final String sourceName;
StatementContextVisitor(final String sourceName, final StatementWriter writer,
- final QNameToStatementDefinition stmtDef, final PrefixToModule prefixes, final YangVersion yangVersion) {
+ final QNameToStatementDefinition stmtDef, final PrefixResolver prefixes, final YangVersion yangVersion) {
this.writer = requireNonNull(writer);
this.stmtDef = requireNonNull(stmtDef);
- this.utils = ArgumentContextUtils.forVersion(yangVersion);
+ utils = ArgumentContextUtils.forVersion(yangVersion);
this.sourceName = sourceName;
this.prefixes = prefixes;
}
return null;
}
- final QNameModule qNameModule = prefixes.get(keyword.prefix());
+ final QNameModule qNameModule = prefixes.resolvePrefix(keyword.prefix());
if (qNameModule == null) {
// Failed to look the namespace
return null;
import org.opendaylight.yangtools.yang.parser.rfc7950.ir.IRKeyword;
import org.opendaylight.yangtools.yang.parser.rfc7950.ir.IRSchemaSource;
import org.opendaylight.yangtools.yang.parser.rfc7950.ir.IRStatement;
-import org.opendaylight.yangtools.yang.parser.spi.source.PrefixToModule;
+import org.opendaylight.yangtools.yang.parser.spi.source.PrefixResolver;
import org.opendaylight.yangtools.yang.parser.spi.source.QNameToStatementDefinition;
import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
import org.opendaylight.yangtools.yang.parser.spi.source.StatementSourceReference;
@Override
public void writeLinkage(final StatementWriter writer, final QNameToStatementDefinition stmtDef,
- final PrefixToModule preLinkagePrefixes, final YangVersion yangVersion) {
+ final PrefixResolver preLinkagePrefixes, final YangVersion yangVersion) {
new StatementContextVisitor(sourceName, writer, stmtDef, preLinkagePrefixes, yangVersion) {
@Override
StatementDefinition resolveStatement(final QNameModule module, final String localName) {
@Override
public void writeLinkageAndStatementDefinitions(final StatementWriter writer,
- final QNameToStatementDefinition stmtDef, final PrefixToModule prefixes, final YangVersion yangVersion) {
+ final QNameToStatementDefinition stmtDef, final PrefixResolver prefixes, final YangVersion yangVersion) {
new StatementContextVisitor(sourceName, writer, stmtDef, prefixes, yangVersion).visit(rootStatement);
}
@Override
public void writeFull(final StatementWriter writer, final QNameToStatementDefinition stmtDef,
- final PrefixToModule prefixes, final YangVersion yangVersion) {
+ final PrefixResolver prefixes, final YangVersion yangVersion) {
new StatementContextVisitor(sourceName, writer, stmtDef, prefixes, yangVersion) {
@Override
QName getValidStatementDefinition(final IRKeyword keyword, final StatementSourceReference ref) {
import org.opendaylight.yangtools.yang.model.repo.api.YinDomSchemaSource;
import org.opendaylight.yangtools.yang.model.repo.api.YinXmlSchemaSource;
import org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase;
-import org.opendaylight.yangtools.yang.parser.spi.source.PrefixToModule;
+import org.opendaylight.yangtools.yang.parser.spi.source.PrefixResolver;
import org.opendaylight.yangtools.yang.parser.spi.source.QNameToStatementDefinition;
import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
import org.opendaylight.yangtools.yang.parser.spi.source.StatementSourceReference;
@Override
public void writeLinkage(final StatementWriter writer, final QNameToStatementDefinition stmtDef,
- final PrefixToModule preLinkagePrefixes, final YangVersion yangVersion) {
+ final PrefixResolver preLinkagePrefixes, final YangVersion yangVersion) {
walkTree(writer, stmtDef);
}
@Override
public void writeLinkageAndStatementDefinitions(final StatementWriter writer,
- final QNameToStatementDefinition stmtDef, final PrefixToModule prefixes, final YangVersion yangVersion) {
+ final QNameToStatementDefinition stmtDef, final PrefixResolver prefixes, final YangVersion yangVersion) {
walkTree(writer, stmtDef);
}
@Override
public void writeFull(final StatementWriter writer, final QNameToStatementDefinition stmtDef,
- final PrefixToModule prefixes, final YangVersion yangVersion) {
+ final PrefixResolver prefixes, final YangVersion yangVersion) {
walkTree(writer, stmtDef);
}
}
--- /dev/null
+/*
+ * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.spi.source;
+
+import org.eclipse.jdt.annotation.Nullable;
+import org.opendaylight.yangtools.yang.common.QNameModule;
+import org.opendaylight.yangtools.yang.common.Revision;
+
+/**
+ * Interface for resolving XML prefixes to their bound {@link QNameModule}s. This resolution entails determining
+ * the correct {@link Revision} bound at the use site.
+ */
+public interface PrefixResolver {
+ /**
+ * Returns QNameModule (namespace + revision) associated with supplied prefix.
+ *
+ * @param prefix Prefix
+ * @return QNameModule associated with supplied prefix, or null if prefix is not defined.
+ */
+ @Nullable QNameModule resolvePrefix(String prefix);
+}
package org.opendaylight.yangtools.yang.parser.spi.source;
import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.jdt.annotation.Nullable;
import org.opendaylight.yangtools.yang.common.QNameModule;
import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour;
import org.opendaylight.yangtools.yang.parser.spi.meta.ParserNamespace;
/**
- * Source-specific mapping of prefixes to namespaces.
+ * Source-specific mapping of prefixes to namespaces. This namespace is populated by all statements which have impact
+ * on the XML namespace, for example {@code import}, {@code belongs-to} and really anywhere a {@code prefix} statement
+ * is present.
+ *
+ * @see PrefixResolver
*/
public interface PrefixToModule extends ParserNamespace<String, QNameModule> {
NamespaceBehaviour<String, QNameModule, @NonNull PrefixToModule> BEHAVIOUR =
NamespaceBehaviour.global(PrefixToModule.class);
-
- /**
- * Returns QNameModule (namespace + revision) associated with supplied prefix.
- *
- * @param prefix Prefix
- * @return QNameModule associated with supplied prefix, or null if prefix is not defined.
- */
- QNameModule get(String prefix);
-
- /**
- * Returns QNameModule (namespace + revision) associated with XML namespace (URI).
- *
- * @param namespace XML Namespace
- * @return QNameModule associated with supplied namespace, or null if prefix is not defined.
- * @throws IllegalArgumentException if the input string is not valid URI
- */
- @Nullable QNameModule getByNamespace(String namespace);
}
+++ /dev/null
-/*
- * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.yangtools.yang.parser.spi.source;
-
-import java.util.HashMap;
-import java.util.Map;
-import org.opendaylight.yangtools.yang.common.QNameModule;
-import org.opendaylight.yangtools.yang.common.XMLNamespace;
-
-/**
- * Map-based {@link PrefixToModule} namespace. This class is NOT thread-safe.
- */
-public class PrefixToModuleMap implements PrefixToModule {
- private final Map<String, QNameModule> prefixToModuleMap = new HashMap<>();
- private final Map<XMLNamespace, QNameModule> namespaceToModuleMap = new HashMap<>();
-
- public void put(final String prefix, final QNameModule module) {
- prefixToModuleMap.put(prefix, module);
- namespaceToModuleMap.put(module.getNamespace(), module);
- }
-
- @Override
- public QNameModule get(final String prefix) {
- return prefixToModuleMap.get(prefix);
- }
-
- @Override
- public QNameModule getByNamespace(final String namespace) {
- return namespaceToModuleMap.get(XMLNamespace.of(namespace));
- }
-}
* It is necessary in order to correct resolution of unknown statements used by linkage
* phase (e.g. semantic version of yang modules).
* </li>
- * <li>{@link #writeLinkage(StatementWriter, QNameToStatementDefinition, PrefixToModule, YangVersion)} -
+ * <li>{@link #writeLinkage(StatementWriter, QNameToStatementDefinition, PrefixResolver, YangVersion)} -
* Source MUST emit only statements related in linkage, which are present in
* supplied statement definition map. This step is used to build cross-source
* linkage and visibility relationship, and to determine XMl namespaces and
* prefixes.</li>
* <li>
- * {@link #writeLinkageAndStatementDefinitions(StatementWriter, QNameToStatementDefinition, PrefixToModule,
+ * {@link #writeLinkageAndStatementDefinitions(StatementWriter, QNameToStatementDefinition, PrefixResolver,
* YangVersion)}
* - Source MUST emit only statements related to linkage and language extensions
* definitions, which are present in supplied statement definition map. This
* step is used to build statement definitions in order to fully processed
* source.</li>
* <li>
- * {@link #writeFull(StatementWriter, QNameToStatementDefinition, PrefixToModule, YangVersion)}
+ * {@link #writeFull(StatementWriter, QNameToStatementDefinition, PrefixResolver, YangVersion)}
* - Source MUST emit all statements present in source. This step is used to
* build full declared statement model of source.</li>
* </ol>
* If source was is not valid, or provided statement writer
* failed to write statements.
*/
- void writeLinkage(StatementWriter writer, QNameToStatementDefinition stmtDef, PrefixToModule preLinkagePrefixes,
- YangVersion yangVersion);
+ void writeLinkage(StatementWriter writer, QNameToStatementDefinition stmtDef,
+ PrefixResolver preLinkagePrefixes, YangVersion yangVersion);
/**
* Emits only linkage and language extension statements to supplied
* failed to write statements.
*/
void writeLinkageAndStatementDefinitions(StatementWriter writer, QNameToStatementDefinition stmtDef,
- PrefixToModule prefixes, YangVersion yangVersion);
+ PrefixResolver prefixes, YangVersion yangVersion);
/**
* Emits every statements present in this statement source to supplied
* If source was is not valid, or provided statement writer
* failed to write statements.
*/
- void writeFull(StatementWriter writer, QNameToStatementDefinition stmtDef, PrefixToModule prefixes,
- YangVersion yangVersion);
+ void writeFull(StatementWriter writer, QNameToStatementDefinition stmtDef, PrefixResolver prefixes,
+ YangVersion yangVersion);
}