Refactor AbstractEffectiveDocumentedNodeWithStatus
[yangtools.git] / yang / yang-parser-rfc7950 / src / main / java / org / opendaylight / yangtools / yang / parser / rfc7950 / stmt / XPathSupport.java
index c9f60274ce13d01f9c82988dc4c20b7c0a5828d4..6043d0e86d1cb1cfbf70e3c28c5a740c01c1862a 100644 (file)
@@ -7,73 +7,50 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt;
 
-import java.util.Iterator;
-import java.util.ServiceLoader;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.annotations.Beta;
 import javax.xml.xpath.XPathExpressionException;
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath;
 import org.opendaylight.yangtools.yang.model.util.RevisionAwareXPathImpl;
+import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.YangNamespaceContextNamespace;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 import org.opendaylight.yangtools.yang.xpath.api.YangXPathExpression.QualifiedBound;
 import org.opendaylight.yangtools.yang.xpath.api.YangXPathParser;
 import org.opendaylight.yangtools.yang.xpath.api.YangXPathParserFactory;
 import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
+@Beta
 @NonNullByDefault
-abstract class XPathSupport {
-    private static final Logger LOG = org.slf4j.LoggerFactory.getLogger(XPathSupport.class);
-
-    private static final XPathSupport INSTANCE;
-
-    static {
-        final Iterator<YangXPathParserFactory> it = ServiceLoader.load(YangXPathParserFactory.class).iterator();
-        if (!it.hasNext()) {
-            LOG.warn("Failed to find XPath parser factory, no XPath validation will be performed");
-            INSTANCE = new Noop();
-        } else {
-            INSTANCE = new XPathImpl(it.next());
-        }
-    }
+public final class XPathSupport {
+    private static final Logger LOG = LoggerFactory.getLogger(XPathSupport.class);
 
-    static RevisionAwareXPath parseXPath(final StmtContext<?, ?, ?> ctx, final String xpath) {
-        return INSTANCE.parseXPath(xpath, ctx);
-    }
-
-    abstract RevisionAwareXPath parseXPath(String xpath, StmtContext<?, ?, ?> ctx);
+    private final YangXPathParserFactory factory;
 
-    private static final class Noop extends XPathSupport {
-        @Override
-        RevisionAwareXPath parseXPath(final String xpath, final StmtContext<?, ?, ?> ctx) {
-            return new RevisionAwareXPathImpl(xpath, ArgumentUtils.isAbsoluteXPath(xpath));
-        }
+    public XPathSupport(final YangXPathParserFactory factory) {
+        this.factory = requireNonNull(factory);
     }
 
-    private static final class XPathImpl extends XPathSupport {
-        private final YangXPathParserFactory factory;
-
-        XPathImpl(final YangXPathParserFactory factory) {
-            this.factory = factory;
+    public RevisionAwareXPath parseXPath(final StmtContext<?, ?, ?> ctx, final String xpath) {
+        final boolean isAbsolute = ArgumentUtils.isAbsoluteXPath(xpath);
+        final YangXPathParser.QualifiedBound parser = factory.newParser(
+            YangNamespaceContextNamespace.computeIfAbsent(ctx));
+        final QualifiedBound parsed;
+        try {
+            parsed = parser.parseExpression(xpath);
+        } catch (XPathExpressionException e) {
+            LOG.warn("Argument \"{}\" is not valid XPath string at \"{}\"", xpath,
+                ctx.getStatementSourceReference(), e);
+            return new RevisionAwareXPathImpl(xpath, isAbsolute);
         }
 
-        @Override
-        RevisionAwareXPath parseXPath(final String xpath, final StmtContext<?, ?, ?> ctx) {
-            final boolean isAbsolute = ArgumentUtils.isAbsoluteXPath(xpath);
-            final YangXPathParser.QualifiedBound parser = factory.newParser(new StmtNamespaceContext(ctx));
-            final QualifiedBound parsed;
-            try {
-                parsed = parser.parseExpression(xpath);
-            } catch (XPathExpressionException e) {
-                LOG.warn("Argument \"{}\" is not valid XPath string at \"{}\"", xpath,
-                    ctx.getStatementSourceReference(), e);
-                return new RevisionAwareXPathImpl(xpath, isAbsolute);
-            }
-
-            if (ctx.getRootVersion().compareTo(parsed.getYangVersion()) < 0) {
-                LOG.warn("{} features required in {} context to parse expression '{}' [at {}]",
-                    parsed.getYangVersion().getReference(), ctx.getRootVersion().getReference(), xpath,
-                    ctx.getStatementSourceReference());
-            }
-            return new WithExpressionImpl(xpath, isAbsolute, parsed);
+        if (ctx.getRootVersion().compareTo(parsed.getYangVersion()) < 0) {
+            LOG.warn("{} features required in {} context to parse expression '{}' [at {}]",
+                parsed.getYangVersion().getReference(), ctx.getRootVersion().getReference(), xpath,
+                ctx.getStatementSourceReference());
         }
+        return new WithExpressionImpl(xpath, isAbsolute, parsed);
     }
 }