From ef3583bc494e4cbd09910c51c3b9599d4d9c1fbd Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Tue, 28 Jan 2020 19:51:02 +0100 Subject: [PATCH] Remove QNameCacheNamespace QNames (and QNameModules) are providing proper interning facilities, hence there is no point for parser to do the same. This actually improves performance a bit, as the parser way of doing things requires a bit of indirection to get to the appropriate namespace storage node. JIRA: YANGTOOLS-652 Change-Id: I25f6ea5a78364a9f24fa6149ab69e9b2b1370960 Signed-off-by: Robert Varga --- .../parser/MountPointStatementSupport.java | 3 +- .../rfc7950/reactor/RFC7950Reactors.java | 2 - .../rfc7950/stmt/key/KeyStatementSupport.java | 3 +- .../type/AbstractTypeStatementSupport.java | 9 ++- .../meta/AbstractQNameStatementSupport.java | 2 +- .../parser/spi/meta/QNameCacheNamespace.java | 67 ------------------- .../parser/spi/meta/StmtContextUtils.java | 3 +- .../spi/meta/QNameCacheNamespaceTest.java | 19 ------ 8 files changed, 8 insertions(+), 100 deletions(-) delete mode 100644 yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/QNameCacheNamespace.java delete mode 100644 yang/yang-parser-spi/src/test/java/org/opendaylight/yangtools/yang/parser/spi/meta/QNameCacheNamespaceTest.java diff --git a/yang/rfc8528-parser-support/src/main/java/org/opendaylight/yangtools/rfc8528/parser/MountPointStatementSupport.java b/yang/rfc8528-parser-support/src/main/java/org/opendaylight/yangtools/rfc8528/parser/MountPointStatementSupport.java index 5280242bd7..266208b6af 100644 --- a/yang/rfc8528-parser-support/src/main/java/org/opendaylight/yangtools/rfc8528/parser/MountPointStatementSupport.java +++ b/yang/rfc8528-parser-support/src/main/java/org/opendaylight/yangtools/rfc8528/parser/MountPointStatementSupport.java @@ -20,7 +20,6 @@ import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.UnknownEffectiveStatementBase; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; -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.StmtContext.Mutable; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils; @@ -100,7 +99,7 @@ public final class MountPointStatementSupport @Override public QName adaptArgumentValue(final StmtContext ctx, final QNameModule targetModule) { - return ctx.getFromNamespace(QNameCacheNamespace.class, ctx.getStatementArgument().withModule(targetModule)); + return ctx.coerceStatementArgument().withModule(targetModule).intern(); } @Override diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/reactor/RFC7950Reactors.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/reactor/RFC7950Reactors.java index d1f4dcf33f..3762049cd2 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/reactor/RFC7950Reactors.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/reactor/RFC7950Reactors.java @@ -124,7 +124,6 @@ import org.opendaylight.yangtools.yang.parser.spi.SubmoduleNamespace; 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.SemanticVersionModuleNamespace; import org.opendaylight.yangtools.yang.parser.spi.meta.SemanticVersionNamespace; import org.opendaylight.yangtools.yang.parser.spi.meta.StatementDefinitionNamespace; @@ -203,7 +202,6 @@ public final class RFC7950Reactors { .addSupport(ModuleCtxToSourceIdentifier.BEHAVIOUR) .addSupport(ModuleQNameToModuleName.BEHAVIOUR) .addSupport(PrefixToModule.BEHAVIOUR) - .addSupport(QNameCacheNamespace.getInstance()) .addSupport(ImportedModuleContext.BEHAVIOUR) .addSupport(IncludedModuleContext.BEHAVIOUR) .addSupport(IncludedSubmoduleNameToModuleCtx.BEHAVIOUR) diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/key/KeyStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/key/KeyStatementSupport.java index 522e81511c..0d86da1ce1 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/key/KeyStatementSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/key/KeyStatementSupport.java @@ -21,7 +21,6 @@ import org.opendaylight.yangtools.yang.model.api.stmt.KeyEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.KeyStatement; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseStatementSupport; -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.meta.SubstatementValidator; @@ -68,7 +67,7 @@ public final class KeyStatementSupport for (final SchemaNodeIdentifier arg : ctx.coerceStatementArgument()) { final QName qname = arg.getLastComponent(); if (!targetModule.equals(qname.getModule())) { - final QName newQname = ctx.getFromNamespace(QNameCacheNamespace.class, qname.withModule(targetModule)); + final QName newQname = qname.withModule(targetModule).intern(); builder.add(SchemaNodeIdentifier.SAME.createChild(newQname)); replaced = true; } else { diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractTypeStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractTypeStatementSupport.java index 77be43cce7..d84c005561 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractTypeStatementSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/AbstractTypeStatementSupport.java @@ -7,7 +7,8 @@ */ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.type; -import com.google.common.base.Preconditions; +import static com.google.common.base.Preconditions.checkArgument; + import com.google.common.collect.ImmutableMap; import java.util.Collection; import org.opendaylight.yangtools.yang.common.QName; @@ -47,7 +48,6 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder.Infere import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder.InferenceContext; import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder.Prerequisite; 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.StatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable; @@ -309,10 +309,9 @@ abstract class AbstractTypeStatementSupport final SchemaPath path = stmtCtx.getSchemaPath().get(); final SchemaPath parent = path.getParent(); final QName parentQName = parent.getLastComponent(); - Preconditions.checkArgument(parentQName != null, "Path %s has an empty parent", path); + checkArgument(parentQName != null, "Path %s has an empty parent", path); - final QName qname = stmtCtx.getFromNamespace(QNameCacheNamespace.class, - QName.create(parentQName, path.getLastComponent().getLocalName())); + final QName qname = path.getLastComponent().withModule(parentQName.getModule()).intern(); return parent.createChild(qname); } } \ No newline at end of file diff --git a/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/AbstractQNameStatementSupport.java b/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/AbstractQNameStatementSupport.java index 74b8e75f40..2bcb7613f7 100644 --- a/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/AbstractQNameStatementSupport.java +++ b/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/AbstractQNameStatementSupport.java @@ -33,6 +33,6 @@ public abstract class AbstractQNameStatementSupport ctx, final QNameModule targetModule) { - return ctx.getFromNamespace(QNameCacheNamespace.class, ctx.getStatementArgument().withModule(targetModule)); + return ctx.getStatementArgument().withModule(targetModule).intern(); } } diff --git a/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/QNameCacheNamespace.java b/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/QNameCacheNamespace.java deleted file mode 100644 index 89043bb6df..0000000000 --- a/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/QNameCacheNamespace.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * 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 - implements IdentifierNamespace { - - 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) { - return stored; - } - - root.putToLocalStorage(QNameCacheNamespace.class, key, key); - return key; - } - - @Override - public Map 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"); - } -} diff --git a/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContextUtils.java b/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContextUtils.java index e6b51f57e6..4a1ef8e113 100644 --- a/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContextUtils.java +++ b/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContextUtils.java @@ -575,8 +575,7 @@ public final class StmtContextUtils { } catch (IllegalArgumentException e) { throw new SourceException(ctx.getStatementSourceReference(), e, "Invalid identifier '%s'", localName); } - - return ctx.getFromNamespace(QNameCacheNamespace.class, template); + return template.intern(); } public static QNameModule getRootModuleQName(final StmtContext ctx) { diff --git a/yang/yang-parser-spi/src/test/java/org/opendaylight/yangtools/yang/parser/spi/meta/QNameCacheNamespaceTest.java b/yang/yang-parser-spi/src/test/java/org/opendaylight/yangtools/yang/parser/spi/meta/QNameCacheNamespaceTest.java deleted file mode 100644 index 964580a63c..0000000000 --- a/yang/yang-parser-spi/src/test/java/org/opendaylight/yangtools/yang/parser/spi/meta/QNameCacheNamespaceTest.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright (c) 2017 Pantheon Technologies 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.meta; - -import static org.junit.Assert.assertNotNull; - -import org.junit.Test; - -public class QNameCacheNamespaceTest { - @Test - public void testGetInstance() { - assertNotNull(QNameCacheNamespace.getInstance()); - } -} -- 2.36.6