From 8d8653266a17e997ab07db33cca5d5835b5f6e49 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Sat, 3 Oct 2015 03:41:35 +0200 Subject: [PATCH] Do not compile augment/refine/deviate paths These paths are not full XPaths, but rather SchemaNodeIdentifier paths. Do not attempt to compile them, as we validate them by splitting and look up of individual components. Change-Id: If472ff6a2c795ce810794ad64dc643bf10a24199 Signed-off-by: Robert Varga --- .../stmt/rfc6020/AugmentStatementImpl.java | 41 +++++++++---------- .../parser/stmt/rfc6020/AugmentUtils.java | 11 ----- .../stmt/rfc6020/DeviationStatementImpl.java | 24 +++++------ .../stmt/rfc6020/RefineStatementImpl.java | 18 ++++---- .../yang/parser/stmt/rfc6020/Utils.java | 23 ++++------- 5 files changed, 46 insertions(+), 71 deletions(-) diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/AugmentStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/AugmentStatementImpl.java index 9e39f9009f..12e1a06bb1 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/AugmentStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/AugmentStatementImpl.java @@ -7,11 +7,9 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.spi.source.StmtOrderingNamespace; -import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils; +import com.google.common.base.Preconditions; import java.util.Collection; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import java.util.regex.Pattern; import javax.annotation.Nonnull; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; @@ -24,24 +22,24 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException; import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder; import org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase; 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; +import org.opendaylight.yangtools.yang.parser.spi.source.StmtOrderingNamespace; import org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.AugmentEffectiveStatementImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -public class AugmentStatementImpl extends - AbstractDeclaredStatement implements - AugmentStatement { - - private static final Logger LOG = LoggerFactory - .getLogger(AugmentStatementImpl.class); +public class AugmentStatementImpl extends AbstractDeclaredStatement implements AugmentStatement { + private static final Logger LOG = LoggerFactory.getLogger(AugmentStatementImpl.class); + private static final Pattern PATH_REL_PATTERN1 = Pattern.compile("\\.\\.?\\s*/(.+)"); + private static final Pattern PATH_REL_PATTERN2 = Pattern.compile("//.*"); - protected AugmentStatementImpl( - StmtContext context) { + protected AugmentStatementImpl(final StmtContext context) { super(context); } - public static class Definition - extends + public static class Definition extends AbstractStatementSupport> { public Definition() { @@ -49,22 +47,23 @@ public class AugmentStatementImpl extends } @Override - public SchemaNodeIdentifier parseArgumentValue( - StmtContext ctx, String value) throws SourceException { - return SchemaNodeIdentifier.create( - AugmentUtils.parseAugmentPath(ctx, value), - Utils.isXPathAbsolute(ctx, value)); + public SchemaNodeIdentifier parseArgumentValue(final StmtContext ctx, final String value) { + Preconditions.checkArgument(!PATH_REL_PATTERN1.matcher(value).matches() + && !PATH_REL_PATTERN2.matcher(value).matches(), + "An argument for augment can be only absolute path; or descendant if used in uses"); + + return Utils.nodeIdentifierFromPath(ctx, value); } @Override public AugmentStatement createDeclared( - StmtContext ctx) { + final StmtContext ctx) { return new AugmentStatementImpl(ctx); } @Override public EffectiveStatement createEffective( - StmtContext> ctx) { + final StmtContext> ctx) { return new AugmentEffectiveStatementImpl(ctx); } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/AugmentUtils.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/AugmentUtils.java index dd14bf87d9..3a068971d5 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/AugmentUtils.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/AugmentUtils.java @@ -18,7 +18,6 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; -import java.util.regex.Pattern; import javax.annotation.Nullable; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.QNameModule; @@ -46,21 +45,11 @@ import org.slf4j.LoggerFactory; public final class AugmentUtils { private static final Logger LOG = LoggerFactory.getLogger(AugmentUtils.class); - private static final Pattern PATH_REL_PATTERN1 = Pattern.compile("\\.\\.?\\s*/(.+)"); - private static final Pattern PATH_REL_PATTERN2 = Pattern.compile("//.*"); private AugmentUtils() { throw new UnsupportedOperationException(); } - public static Iterable parseAugmentPath(final StmtContext ctx, final String path) { - Preconditions.checkArgument(!PATH_REL_PATTERN1.matcher(path).matches() - && !PATH_REL_PATTERN2.matcher(path).matches(), - "An argument for augment can be only absolute path; or descendant if used in uses"); - - return Utils.parseXPath(ctx, path); - } - public static void copyFromSourceToTarget(final StatementContextBase sourceCtx, final StatementContextBase targetCtx) throws SourceException { diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/DeviationStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/DeviationStatementImpl.java index 8ba3ef03ac..cc87db3b7f 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/DeviationStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/DeviationStatementImpl.java @@ -7,8 +7,7 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.DeviationEffectiveStatementImpl; - +import javax.annotation.Nonnull; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.DeviationStatement; @@ -16,13 +15,11 @@ import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier; 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.StmtContext; -import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; -import javax.annotation.Nonnull; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.DeviationEffectiveStatementImpl; public class DeviationStatementImpl extends AbstractDeclaredStatement implements DeviationStatement { - protected DeviationStatementImpl( - StmtContext context) { + protected DeviationStatementImpl(final StmtContext context) { super(context); } @@ -32,18 +29,19 @@ public class DeviationStatementImpl extends AbstractDeclaredStatement ctx, String value) throws SourceException { - return SchemaNodeIdentifier.create(Utils.parseXPath(ctx, value), Utils.isXPathAbsolute(ctx, value)); + @Override + public SchemaNodeIdentifier parseArgumentValue(final StmtContext ctx, final String value) { + return Utils.nodeIdentifierFromPath(ctx, value); } - @Override public DeviationStatement createDeclared( - StmtContext ctx) { + @Override + public DeviationStatement createDeclared(final StmtContext ctx) { return new DeviationStatementImpl(ctx); } - @Override public EffectiveStatement createEffective( - StmtContext> ctx) { + @Override + public EffectiveStatement createEffective( + final StmtContext> ctx) { return new DeviationEffectiveStatementImpl(ctx); } } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/RefineStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/RefineStatementImpl.java index 35a79cab62..897b65f60a 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/RefineStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/RefineStatementImpl.java @@ -8,8 +8,7 @@ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.RefineEffectiveStatementImpl; - +import javax.annotation.Nullable; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement; @@ -19,13 +18,11 @@ import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier; 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.StmtContext; -import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; -import javax.annotation.Nullable; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.RefineEffectiveStatementImpl; public class RefineStatementImpl extends AbstractDeclaredStatement implements RefineStatement { - protected RefineStatementImpl( - StmtContext context) { + protected RefineStatementImpl(final StmtContext context) { super(context); } @@ -37,17 +34,18 @@ public class RefineStatementImpl extends AbstractDeclaredStatement ctx, String value) { - return SchemaNodeIdentifier.create(Utils.parseXPath(ctx, value), Utils.isXPathAbsolute(ctx, value)); + public SchemaNodeIdentifier parseArgumentValue(final StmtContext ctx, final String value) { + return Utils.nodeIdentifierFromPath(ctx, value); } @Override - public RefineStatement createDeclared(StmtContext ctx) { + public RefineStatement createDeclared(final StmtContext ctx) { return new RefineStatementImpl(ctx); } @Override - public EffectiveStatement createEffective(StmtContext> ctx) { + public EffectiveStatement createEffective( + final StmtContext> ctx) { return new RefineEffectiveStatementImpl(ctx); } } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/Utils.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/Utils.java index 5e56fecc7e..e4c43e0c30 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/Utils.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/Utils.java @@ -115,10 +115,6 @@ public final class Utils { return keyNodes; } - public static List splitPathToNodeNames(final String path) { - return SLASH_SPLITTER.splitToList(path); - } - private static void compileXPath(final StmtContext ctx, final String path) { final XPath xPath = XPATH_FACTORY.get().newXPath(); @@ -185,25 +181,20 @@ public final class Utils { return false; } - public static Iterable parseXPath(final StmtContext ctx, final String path) { - - String trimmedPath = trimSingleLastSlashFromXPath(path); - - compileXPath(ctx, trimmedPath); - - List nodeNames = splitPathToNodeNames(trimmedPath); - List qNames = new ArrayList<>(nodeNames.size()); - - for (String nodeName : nodeNames) { + static SchemaNodeIdentifier nodeIdentifierFromPath(final StmtContext ctx, final String path) { + // FIXME: is the path trimming really necessary?? + final List qNames = new ArrayList<>(); + for (String nodeName : SLASH_SPLITTER.split(trimSingleLastSlashFromXPath(path))) { try { final QName qName = Utils.qNameFromArgument(ctx, nodeName); qNames.add(qName); } catch (Exception e) { - throw new IllegalArgumentException(e); + throw new IllegalArgumentException( + String.format("Failed to parse node '%s' in path '%s'", nodeName, path), e); } } - return qNames; + return SchemaNodeIdentifier.create(qNames, PATH_ABS.matcher(path).matches()); } public static String stringFromStringContext(final YangStatementParser.ArgumentContext context) { -- 2.36.6