From 1bea341bd7a23b9537354821673db2c4bc19b20c Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Sat, 3 Oct 2015 03:54:57 +0200 Subject: [PATCH] Centralize RevisionAwareXPath creation Three call sites are performing the same thing, create a common method. Change-Id: I274f23b1785210cef96465e4db944c3b923886a8 Signed-off-by: Robert Varga --- .../stmt/rfc6020/MustStatementImpl.java | 48 ++++++++++--------- .../stmt/rfc6020/PathStatementImpl.java | 17 +++---- .../yang/parser/stmt/rfc6020/Utils.java | 27 +++++------ .../stmt/rfc6020/WhenStatementImpl.java | 42 ++++++++-------- 4 files changed, 64 insertions(+), 70 deletions(-) diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/MustStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/MustStatementImpl.java index f186627c25..2a7762d221 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/MustStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/MustStatementImpl.java @@ -7,8 +7,8 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.MustEffectiveStatementImpl; - +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; @@ -17,65 +17,67 @@ import org.opendaylight.yangtools.yang.model.api.stmt.ErrorAppTagStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ErrorMessageStatement; import org.opendaylight.yangtools.yang.model.api.stmt.MustStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement; -import org.opendaylight.yangtools.yang.model.util.RevisionAwareXPathImpl; 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 javax.annotation.Nullable; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.MustEffectiveStatementImpl; -public class MustStatementImpl extends AbstractDeclaredStatement implements - MustStatement { +public class MustStatementImpl extends AbstractDeclaredStatement implements MustStatement { - protected MustStatementImpl( - StmtContext context) { + protected MustStatementImpl(final StmtContext context) { super(context); } - public static class Definition extends AbstractStatementSupport> { + public static class Definition extends + AbstractStatementSupport> { public Definition() { super(Rfc6020Mapping.MUST); } - @Override public RevisionAwareXPath parseArgumentValue( - StmtContext ctx, String value) { - return new RevisionAwareXPathImpl(value, Utils.isXPathAbsolute(ctx, value)); + @Override + public RevisionAwareXPath parseArgumentValue(final StmtContext ctx, final String value) { + return Utils.parseXPath(ctx, value); } - @Override public MustStatement createDeclared( - StmtContext ctx) { + @Override + public MustStatement createDeclared(final StmtContext ctx) { return new MustStatementImpl(ctx); } - @Override public EffectiveStatement createEffective( - StmtContext> ctx) { + @Override + public EffectiveStatement createEffective( + final StmtContext> ctx) { return new MustEffectiveStatementImpl(ctx); } } - @Nonnull @Override + @Nonnull + @Override public RevisionAwareXPath getCondition() { return argument(); } - @Nullable @Override + @Nullable + @Override public ErrorAppTagStatement getErrorAppTagStatement() { return firstDeclared(ErrorAppTagStatement.class); } - @Nullable @Override + @Nullable + @Override public ErrorMessageStatement getErrorMessageStatement() { return firstDeclared(ErrorMessageStatement.class); } - @Nullable @Override + @Nullable + @Override public DescriptionStatement getDescription() { return firstDeclared(DescriptionStatement.class); } - @Nullable @Override + @Nullable + @Override public ReferenceStatement getReference() { return firstDeclared(ReferenceStatement.class); } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/PathStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/PathStatementImpl.java index 08a8abea52..fe45098be7 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/PathStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/PathStatementImpl.java @@ -8,26 +8,22 @@ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; import javax.annotation.Nonnull; - import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath; 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.PathStatement; -import org.opendaylight.yangtools.yang.model.util.RevisionAwareXPathImpl; 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 org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.PathEffectiveStatementImpl; public class PathStatementImpl extends AbstractDeclaredStatement implements PathStatement { - protected PathStatementImpl(StmtContext context) { + protected PathStatementImpl(final StmtContext context) { super(context); } - public static class Definition - extends + public static class Definition extends AbstractStatementSupport> { public Definition() { @@ -35,18 +31,18 @@ public class PathStatementImpl extends AbstractDeclaredStatement ctx, String value) { - return new RevisionAwareXPathImpl(value, Utils.isXPathAbsolute(ctx, value)); + public RevisionAwareXPath parseArgumentValue(final StmtContext ctx, final String value) { + return Utils.parseXPath(ctx, value); } @Override - public PathStatement createDeclared(StmtContext ctx) { + public PathStatement createDeclared(final StmtContext ctx) { return new PathStatementImpl(ctx); } @Override public EffectiveStatement createEffective( - StmtContext> ctx) { + final StmtContext> ctx) { return new PathEffectiveStatementImpl(ctx); } } @@ -56,5 +52,4 @@ public class PathStatementImpl extends AbstractDeclaredStatement ctx, final String path) { + private static String trimSingleLastSlashFromXPath(final String path) { + return path.replaceAll("/$", ""); + } + + static RevisionAwareXPath parseXPath(final StmtContext ctx, final String path) { final XPath xPath = XPATH_FACTORY.get().newXPath(); + final String trimmed = trimSingleLastSlashFromXPath(path); try { - xPath.compile(path); + // TODO: we could capture the result and expose its 'evaluate' method + xPath.compile(trimmed); } catch (XPathExpressionException e) { - LOG.warn("Argument {} is not valid XPath string at {}", path, ctx.getStatementSourceReference(), e); + LOG.warn("Argument \"{}\" is not valid XPath string at \"{}\"", path, ctx.getStatementSourceReference(), e); } - } - - private static String trimSingleLastSlashFromXPath(final String path) { - return path.replaceAll("/$", ""); - } - - public static boolean isXPathAbsolute(final StmtContext ctx, final String path) { - // FIXME: this is probably an overkill, as this is called for all XPath objects. If we need this validation, - // we should wrap the resulting XPath into RevisionAwareXPath. - compileXPath(ctx, trimSingleLastSlashFromXPath(path)); - return PATH_ABS.matcher(path).matches(); + return new RevisionAwareXPathImpl(path, PATH_ABS.matcher(path).matches()); } public static QName trimPrefix(final QName identifier) { diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/WhenStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/WhenStatementImpl.java index 20a4417711..3af90daf87 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/WhenStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/WhenStatementImpl.java @@ -7,63 +7,63 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.WhenEffectiveStatementImpl; - +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath; 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; import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement; import org.opendaylight.yangtools.yang.model.api.stmt.WhenStatement; -import org.opendaylight.yangtools.yang.model.util.RevisionAwareXPathImpl; 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 javax.annotation.Nullable; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.WhenEffectiveStatementImpl; -public class WhenStatementImpl extends AbstractDeclaredStatement implements - WhenStatement { +public class WhenStatementImpl extends AbstractDeclaredStatement implements WhenStatement { - protected WhenStatementImpl( - StmtContext context) { + protected WhenStatementImpl(final StmtContext context) { super(context); } - public static class Definition extends AbstractStatementSupport> { + public static class Definition extends + AbstractStatementSupport> { public Definition() { super(Rfc6020Mapping.WHEN); } - @Override public RevisionAwareXPath parseArgumentValue( - StmtContext ctx, String value) throws SourceException { - return new RevisionAwareXPathImpl(value, Utils.isXPathAbsolute(ctx, value)); + @Override + public RevisionAwareXPath parseArgumentValue(final StmtContext ctx, final String value) { + return Utils.parseXPath(ctx, value); } - @Override public WhenStatement createDeclared( - StmtContext ctx) { + @Override + public WhenStatement createDeclared(final StmtContext ctx) { return new WhenStatementImpl(ctx); } - @Override public EffectiveStatement createEffective( - StmtContext> ctx) { + @Override + public EffectiveStatement createEffective( + final StmtContext> ctx) { return new WhenEffectiveStatementImpl(ctx); } } - @Nonnull @Override + @Nonnull + @Override public RevisionAwareXPath getCondition() { return argument(); } - @Nullable @Override + @Nullable + @Override public DescriptionStatement getDescription() { return firstDeclared(DescriptionStatement.class); } - @Nullable @Override + @Nullable + @Override public ReferenceStatement getReference() { return firstDeclared(ReferenceStatement.class); } -- 2.36.6