--- /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.meta;
+
+import java.util.Map;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace;
+
+/**
+ * An {@link IdentifierNamespace} implementing a {@link QName} internment interface. Lookups in this namespace always
+ * return a non-null object. They capture the first object instance and return that on subsequent lookups.
+ */
+public final class QNameCacheNamespace extends NamespaceBehaviour<QName, QName, QNameCacheNamespace>
+ implements IdentifierNamespace<QName, QName> {
+
+ private static final QNameCacheNamespace INSTANCE = new QNameCacheNamespace();
+
+ private QNameCacheNamespace() {
+ super(QNameCacheNamespace.class);
+ }
+
+ public static QNameCacheNamespace getInstance() {
+ return INSTANCE;
+ }
+
+ @Override
+ public QName get(final QName identifier) {
+ throw new UnsupportedOperationException("Identifier/implementation API borkage");
+ }
+
+ private static NamespaceStorageNode getRoot(final NamespaceStorageNode storage) {
+ NamespaceStorageNode wlk = storage;
+
+ while (wlk.getParentNamespaceStorage() != null) {
+ wlk = wlk.getParentNamespaceStorage();
+ }
+
+ return wlk;
+ }
+
+ @Override
+ public QName getFrom(final NamespaceStorageNode storage, final QName key) {
+ final NamespaceStorageNode root = getRoot(storage);
+ final QName stored = root.getFromLocalStorage(QNameCacheNamespace.class, key);
+ if (stored == null) {
+ root.addToLocalStorage(QNameCacheNamespace.class, key, key);
+ return key;
+ } else {
+ return stored;
+ }
+ }
+
+ @Override
+ public Map<QName, QName> getAllFrom(final NamespaceStorageNode storage) {
+ return getRoot(storage).getAllFromLocalStorage(QNameCacheNamespace.class);
+ }
+
+ @Override
+ public void addTo(final NamespaceStorageNode storage, final QName key, final QName value) {
+ throw new UnsupportedOperationException("Automagically populated");
+ }
+}
for (SchemaNodeIdentifier arg : keyStmtCtx.getStatementArgument()) {
final QName qname = arg.getLastComponent();
if (!newQNameModule.equals(qname)) {
- final QName newQname = QName.create(newQNameModule, qname.getLocalName());
+ final QName newQname = keyStmtCtx.getFromNamespace(QNameCacheNamespace.class,
+ QName.create(newQNameModule, qname.getLocalName()));
builder.add(SchemaNodeIdentifier.create(false, newQname));
replaced = true;
} else {
import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour;
import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.NamespaceStorageNode;
import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.StorageNodeType;
+import org.opendaylight.yangtools.yang.parser.spi.meta.QNameCacheNamespace;
import org.opendaylight.yangtools.yang.parser.spi.meta.StatementSupport;
import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
import org.opendaylight.yangtools.yang.parser.spi.source.PrefixToModule;
.getAllFromNamespace(ExtensionNamespace.class).get(key);
if (extension != null) {
final QName arg = (QName) ((SubstatementContext<?, ?, ?>) extension).getStatementArgument();
- final QName qName = QName.create(arg, extension.getIdentifier().getArgument());
+ final QName qName = current.getFromNamespace(QNameCacheNamespace.class,
+ QName.create(arg, extension.getIdentifier().getArgument()));
def = new StatementDefinitionContext<>(new UnknownStatementImpl.Definition
(getNewStatementDefinition(qName)));
import org.opendaylight.yangtools.yang.model.api.stmt.UsesStatement;
import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.NamespaceStorageNode;
import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.Registry;
+import org.opendaylight.yangtools.yang.parser.spi.meta.QNameCacheNamespace;
import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils;
import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
if (newQNameModule != null) {
if (original.argument instanceof QName) {
QName originalQName = (QName) original.argument;
- this.argument = (A) QName.create(newQNameModule, originalQName.getLocalName());
+ this.argument = (A)
+ getFromNamespace(QNameCacheNamespace.class,
+ QName.create(newQNameModule, originalQName.getLocalName()));
} else if (StmtContextUtils.producesDeclared(original, KeyStatement.class)) {
this.argument = (A) StmtContextUtils.replaceModuleQNameForKey(
(StmtContext<Collection<SchemaNodeIdentifier>, KeyStatement, ?>) original,
implements StatementNamespace<QName, D, E>{
protected ChildSchemaNodes() {
- super((Class<ChildSchemaNodes<D,E>>) (Class) ChildSchemaNodes.class);
+ super((Class) ChildSchemaNodes.class);
}
@Override
- public StmtContext<?, D, E> get(QName key) {
+ public StmtContext<?, D, E> get(final QName key) {
// TODO Auto-generated method stub
return null;
}
@Override
- public StmtContext<?, D, E> getFrom(NamespaceStorageNode storage, QName key) {
+ public StmtContext<?, D, E> getFrom(final NamespaceStorageNode storage, final QName key) {
return globalOrStatementSpecific(storage).getFromLocalStorage(getIdentifier(), key);
}
@Override
- public Map<QName, StmtContext<?, D, E>> getAllFrom(NamespaceStorageNode storage) {
+ public Map<QName, StmtContext<?, D, E>> getAllFrom(final NamespaceStorageNode storage) {
// TODO Auto-generated method stub
return null;
}
@SuppressWarnings("unchecked")
@Override
- public void addTo(NamespaceBehaviour.NamespaceStorageNode storage, QName key, StmtContext<?, D, E> value) {
+ public void addTo(final NamespaceBehaviour.NamespaceStorageNode storage, final QName key, final StmtContext<?, D, E> value) {
globalOrStatementSpecific(storage).addToLocalStorage(ChildSchemaNodes.class, key, value);
}
- private NamespaceStorageNode globalOrStatementSpecific(NamespaceBehaviour.NamespaceStorageNode storage) {
+ private static NamespaceStorageNode globalOrStatementSpecific(final NamespaceBehaviour.NamespaceStorageNode storage) {
NamespaceStorageNode current = storage;
while(current.getStorageNodeType() != StorageNodeType.STATEMENT_LOCAL && current.getStorageNodeType() != StorageNodeType.GLOBAL) {
current = current.getParentNamespaceStorage();
import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Relative;
import org.opendaylight.yangtools.yang.model.api.stmt.SubmoduleStatement;
import org.opendaylight.yangtools.yang.model.util.RevisionAwareXPathImpl;
+import org.opendaylight.yangtools.yang.parser.spi.meta.QNameCacheNamespace;
import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils;
import org.opendaylight.yangtools.yang.parser.spi.source.BelongsToPrefixToModuleName;
resultQNameModule = qNameModule;
}
- return QName.create(resultQNameModule, localName);
+ return ctx.getFromNamespace(QNameCacheNamespace.class, QName.create(resultQNameModule, localName));
}
public static QNameModule getModuleQNameByPrefix(final StmtContext<?, ?, ?> ctx, final String prefix) {
import org.opendaylight.yangtools.yang.parser.spi.TypeNamespace;
import org.opendaylight.yangtools.yang.parser.spi.meta.DerivedIdentitiesNamespace;
import org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase;
+import org.opendaylight.yangtools.yang.parser.spi.meta.QNameCacheNamespace;
import org.opendaylight.yangtools.yang.parser.spi.meta.StatementSupportBundle;
import org.opendaylight.yangtools.yang.parser.spi.source.BelongsToModuleContext;
import org.opendaylight.yangtools.yang.parser.spi.source.BelongsToPrefixToModuleName;
.addSupport(global(ModuleQNameToModuleName.class))
.addSupport(global(PrefixToModule.class))
.addSupport(global(ModuleIdentifierToModuleQName.class))
+ .addSupport(QNameCacheNamespace.getInstance())
.addSupport(sourceLocal(ImportedModuleContext.class))
.addSupport(sourceLocal(IncludedModuleContext.class))
.addSupport(sourceLocal(IncludedSubmoduleNameToIdentifier.class))