Centralize RevisionAwareXPath creation 65/27865/5
authorRobert Varga <rovarga@cisco.com>
Sat, 3 Oct 2015 01:54:57 +0000 (03:54 +0200)
committerGerrit Code Review <gerrit@opendaylight.org>
Sat, 3 Oct 2015 13:03:51 +0000 (13:03 +0000)
Three call sites are performing the same thing, create a common method.

Change-Id: I274f23b1785210cef96465e4db944c3b923886a8
Signed-off-by: Robert Varga <rovarga@cisco.com>
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/MustStatementImpl.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/PathStatementImpl.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/Utils.java
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/WhenStatementImpl.java

index f186627c25400ecff71123bafa66b8dddc6fab6f..2a7762d221d6dcb6eb6ff49abf947818f7a626d0 100644 (file)
@@ -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<RevisionAwareXPath> implements
-        MustStatement {
+public class MustStatementImpl extends AbstractDeclaredStatement<RevisionAwareXPath> implements MustStatement {
 
-    protected MustStatementImpl(
-            StmtContext<RevisionAwareXPath, MustStatement, ?> context) {
+    protected MustStatementImpl(final StmtContext<RevisionAwareXPath, MustStatement, ?> context) {
         super(context);
     }
 
-    public static class Definition extends AbstractStatementSupport<RevisionAwareXPath,MustStatement,EffectiveStatement<RevisionAwareXPath,MustStatement>> {
+    public static class Definition extends
+            AbstractStatementSupport<RevisionAwareXPath, MustStatement, EffectiveStatement<RevisionAwareXPath, MustStatement>> {
 
         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<RevisionAwareXPath, MustStatement, ?> ctx) {
+        @Override
+        public MustStatement createDeclared(final StmtContext<RevisionAwareXPath, MustStatement, ?> ctx) {
             return new MustStatementImpl(ctx);
         }
 
-        @Override public EffectiveStatement<RevisionAwareXPath, MustStatement> createEffective(
-                StmtContext<RevisionAwareXPath, MustStatement, EffectiveStatement<RevisionAwareXPath, MustStatement>> ctx) {
+        @Override
+        public EffectiveStatement<RevisionAwareXPath, MustStatement> createEffective(
+                final StmtContext<RevisionAwareXPath, MustStatement, EffectiveStatement<RevisionAwareXPath, MustStatement>> 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);
     }
index 08a8abea52f104962228213aed38346d7ebf8100..fe45098be73c173186be16caa841c64d61656258 100644 (file)
@@ -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<RevisionAwareXPath> implements PathStatement {
 
-    protected PathStatementImpl(StmtContext<RevisionAwareXPath, PathStatement, ?> context) {
+    protected PathStatementImpl(final StmtContext<RevisionAwareXPath, PathStatement, ?> context) {
         super(context);
     }
 
-    public static class Definition
-            extends
+    public static class Definition extends
             AbstractStatementSupport<RevisionAwareXPath, PathStatement, EffectiveStatement<RevisionAwareXPath, PathStatement>> {
 
         public Definition() {
@@ -35,18 +31,18 @@ public class PathStatementImpl extends AbstractDeclaredStatement<RevisionAwareXP
         }
 
         @Override
-        public RevisionAwareXPath parseArgumentValue(StmtContext<?, ?, ?> 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<RevisionAwareXPath, PathStatement, ?> ctx) {
+        public PathStatement createDeclared(final StmtContext<RevisionAwareXPath, PathStatement, ?> ctx) {
             return new PathStatementImpl(ctx);
         }
 
         @Override
         public EffectiveStatement<RevisionAwareXPath, PathStatement> createEffective(
-                StmtContext<RevisionAwareXPath, PathStatement, EffectiveStatement<RevisionAwareXPath, PathStatement>> ctx) {
+                final StmtContext<RevisionAwareXPath, PathStatement, EffectiveStatement<RevisionAwareXPath, PathStatement>> ctx) {
             return new PathEffectiveStatementImpl(ctx);
         }
     }
@@ -56,5 +52,4 @@ public class PathStatementImpl extends AbstractDeclaredStatement<RevisionAwareXP
     public String getValue() {
         return rawArgument();
     }
-
 }
index e4c43e0c30e2c935857dad5b55a5e0f95e4496aa..e3b9152d2bd0920a2bea47dff8d2cba1b3c492e0 100644 (file)
@@ -26,7 +26,6 @@ import java.util.Set;
 import java.util.regex.Pattern;
 import javax.annotation.Nullable;
 import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathExpression;
 import javax.xml.xpath.XPathExpressionException;
 import javax.xml.xpath.XPathFactory;
 import org.antlr.v4.runtime.tree.TerminalNode;
@@ -37,6 +36,7 @@ import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil;
 import org.opendaylight.yangtools.yang.common.YangConstants;
 import org.opendaylight.yangtools.yang.model.api.Deviation;
 import org.opendaylight.yangtools.yang.model.api.ModuleIdentifier;
+import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.Status;
 import org.opendaylight.yangtools.yang.model.api.stmt.AugmentStatement;
@@ -49,6 +49,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
 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.api.stmt.UsesStatement;
+import org.opendaylight.yangtools.yang.model.util.RevisionAwareXPathImpl;
 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;
@@ -115,26 +116,22 @@ public final class Utils {
         return keyNodes;
     }
 
-    private static void compileXPath(final StmtContext<?, ?, ?> 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) {
index 20a4417711949ed3d69e3b8a5ae53e20b8c485a5..3af90daf8763317fa23dd1ab2135a414f1ebb767 100644 (file)
@@ -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<RevisionAwareXPath> implements
-        WhenStatement {
+public class WhenStatementImpl extends AbstractDeclaredStatement<RevisionAwareXPath> implements WhenStatement {
 
-    protected WhenStatementImpl(
-            StmtContext<RevisionAwareXPath, WhenStatement, ?> context) {
+    protected WhenStatementImpl(final StmtContext<RevisionAwareXPath, WhenStatement, ?> context) {
         super(context);
     }
 
-    public static class Definition extends AbstractStatementSupport<RevisionAwareXPath,WhenStatement,EffectiveStatement<RevisionAwareXPath,WhenStatement>> {
+    public static class Definition extends
+            AbstractStatementSupport<RevisionAwareXPath, WhenStatement, EffectiveStatement<RevisionAwareXPath, WhenStatement>> {
 
         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<RevisionAwareXPath, WhenStatement, ?> ctx) {
+        @Override
+        public WhenStatement createDeclared(final StmtContext<RevisionAwareXPath, WhenStatement, ?> ctx) {
             return new WhenStatementImpl(ctx);
         }
 
-        @Override public EffectiveStatement<RevisionAwareXPath, WhenStatement> createEffective(
-                StmtContext<RevisionAwareXPath, WhenStatement, EffectiveStatement<RevisionAwareXPath, WhenStatement>> ctx) {
+        @Override
+        public EffectiveStatement<RevisionAwareXPath, WhenStatement> createEffective(
+                final StmtContext<RevisionAwareXPath, WhenStatement, EffectiveStatement<RevisionAwareXPath, WhenStatement>> 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);
     }