From c7e8081901536d97a12b141cbb538f70c7a93d61 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Sun, 6 Dec 2020 13:37:39 +0100 Subject: [PATCH] Add UnqualifiedQName.tryCreate() This a better approach to performing a lazy check, as it captures the valid string in a well-known construct. JIRA: YANGTOOLS-1191 Change-Id: I7ffe00602d3d83189d9c3f8a59365648aa36720d Signed-off-by: Robert Varga --- .../yangtools/yang/common/AbstractQName.java | 2 +- .../yangtools/yang/common/UnqualifiedQName.java | 11 +++++++++++ .../extension/UnrecognizedEffectiveStatementImpl.java | 8 +++----- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/AbstractQName.java b/yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/AbstractQName.java index d24ed22b1c..d86c5c407f 100644 --- a/yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/AbstractQName.java +++ b/yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/AbstractQName.java @@ -78,7 +78,7 @@ public abstract class AbstractQName implements Identifier, WritableObject { * @param str String to check * @return True if the string usable as a local name, false otherwise */ - public static final boolean isValidLocalName(final @Nullable String str) { + static final boolean isValidLocalName(final @Nullable String str) { return str != null && !str.isEmpty() && checkContent(str); } diff --git a/yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/UnqualifiedQName.java b/yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/UnqualifiedQName.java index 0b6bffb54e..821bc910a1 100644 --- a/yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/UnqualifiedQName.java +++ b/yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/UnqualifiedQName.java @@ -44,6 +44,17 @@ public final class UnqualifiedQName extends AbstractQName implements Comparable< return new UnqualifiedQName(checkLocalName(localName)); } + /** + * Create a new unqualified QName. + * + * @param localName The local name of this unqualified QName + * @return An UnqualifiedQName instance, or null if localName is not valid + */ + @SuppressFBWarnings(value = "NP_NONNULL_RETURN_VIOLATION", justification = "Non-grok of @Nullable") + public static @Nullable UnqualifiedQName tryCreate(final String localName) { + return isValidLocalName(localName) ? new UnqualifiedQName(localName) : null; + } + /** * Read an UnqualifiedQName from a DataInput. The format is expected to match the output format of * {@link #writeTo(DataOutput)}. diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/extension/UnrecognizedEffectiveStatementImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/extension/UnrecognizedEffectiveStatementImpl.java index 1f02d8b98a..c34936e64b 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/extension/UnrecognizedEffectiveStatementImpl.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/extension/UnrecognizedEffectiveStatementImpl.java @@ -9,9 +9,9 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.extension; import com.google.common.collect.ImmutableList; import org.eclipse.jdt.annotation.NonNull; -import org.opendaylight.yangtools.yang.common.AbstractQName; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.QNameModule; +import org.opendaylight.yangtools.yang.common.UnqualifiedQName; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; @@ -82,10 +82,8 @@ final class UnrecognizedEffectiveStatementImpl extends UnknownEffectiveStatement final int colon = value.indexOf(':'); if (colon == -1) { - if (AbstractQName.isValidLocalName(value)) { - return QName.unsafeOf(StmtContextUtils.getRootModuleQName(stmt), value).intern(); - } - return null; + final UnqualifiedQName qname = UnqualifiedQName.tryCreate(value); + return qname == null ? null : qname.bindTo(StmtContextUtils.getRootModuleQName(stmt)).intern(); } final QNameModule qnameModule = StmtContextUtils.getModuleQNameByPrefix(stmt, value.substring(0, colon)); -- 2.36.6