builder()
+ .put("xhtml", XHTML_NS_URI)
+ .put("xlink", XLINK_NS_URI)
+ .build());
+
+ private String sourceString;
+
+ XPathExpressionResolver(final String sourceString) {
+ this.sourceString = sourceString;
+ }
+
+ /**
+ * create the expression
on the fly.
+ *
+ * @return a {@link XPathExpression} object.
+ */
+ public XPathExpression expr() {
+ try {
+ /**
+ * This hardcoded XPathFactory is needed to avoid the possibility that a wrong implementation is
+ * being loaded from classpath when using the javax.xml.xpath.XPathFactory. (cfr javadoc newInstance())
+ *
+ * Example of a wrong implementation: org.apache.taglibs.standard.tag.common.xml.JSTLXPathFactory.
+ * Issue: XPathExpression will be null for xpath.compile!
+ */
+ XPathFactory xPathFactory = new org.apache.xpath.jaxp.XPathFactoryImpl();
+ final XPath xpath = xPathFactory.newXPath();
+ xpath.setNamespaceContext(NAMESPACE_CONTEXT);
+ return xpath.compile(sourceString);
+ } catch (XPathExpressionException e) {
+ throw new RuntimeException(
+ "Error while creating XPath expression", e);
+ }
+ }
+
+ /**
+ * Getter for the field sourceString
.
+ *
+ * @return a {@link String} object.
+ */
+ public String getSourceString() {
+ return sourceString;
+ }
+}
diff --git a/dxa-framework/dxa-tridion-provider/src/main/java/com/sdl/webapp/tridion/xpath/XPathResolver.java b/dxa-framework/dxa-tridion-provider/src/main/java/com/sdl/webapp/tridion/xpath/XPathResolver.java
index e4f854af9..5045fab25 100644
--- a/dxa-framework/dxa-tridion-provider/src/main/java/com/sdl/webapp/tridion/xpath/XPathResolver.java
+++ b/dxa-framework/dxa-tridion-provider/src/main/java/com/sdl/webapp/tridion/xpath/XPathResolver.java
@@ -13,6 +13,7 @@
* Resolver for particular xPath string.
* Uses {@link javax.xml.xpath.XPathExpression} which is not thread-safe.
*/
+@Deprecated
public enum XPathResolver {
XPATH_LINKS("//a[@xlink:href]"),
XPATH_YOUTUBE("//img[@data-youTubeId]"),
@@ -43,7 +44,15 @@ public enum XPathResolver {
@Override
protected XPathExpression initialValue() {
try {
- final XPath xpath = XPathFactory.newInstance().newXPath();
+ /**
+ * This hardcoded XPathFactory is needed to avoid the possibility that a wrong implementation is
+ * being loaded from classpath when using the javax.xml.xpath.XPathFactory. (cfr javadoc newInstance())
+ *
+ * Example of a wrong implementation: org.apache.taglibs.standard.tag.common.xml.JSTLXPathFactory.
+ * Issue: XPathExpression will be null for xpath.compile!
+ */
+ XPathFactory xPathFactory = new org.apache.xpath.jaxp.XPathFactoryImpl();
+ final XPath xpath = xPathFactory.newXPath();
xpath.setNamespaceContext(NAMESPACE_CONTEXT);
return xpath.compile(sourceString);
} catch (XPathExpressionException e) {
diff --git a/dxa-framework/dxa-tridion-provider/src/test/java/com/sdl/webapp/tridion/xpath/XPathExpressionResolverTest.java b/dxa-framework/dxa-tridion-provider/src/test/java/com/sdl/webapp/tridion/xpath/XPathExpressionResolverTest.java
new file mode 100644
index 000000000..58f2c79c9
--- /dev/null
+++ b/dxa-framework/dxa-tridion-provider/src/test/java/com/sdl/webapp/tridion/xpath/XPathExpressionResolverTest.java
@@ -0,0 +1,25 @@
+package com.sdl.webapp.tridion.xpath;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+public class XPathExpressionResolverTest {
+
+ @Test
+ public void testLinksExpr() throws Exception {
+ Assert.assertNotNull(XPathExpressionResolver.XPATH_LINKS.expr());
+ }
+
+ @Test
+ public void testImagesExpr() throws Exception {
+ Assert.assertNotNull(XPathExpressionResolver.XPATH_IMAGES.expr());
+ }
+
+ @Test
+ public void testYouTubeExpr() throws Exception {
+ Assert.assertNotNull(XPathExpressionResolver.XPATH_YOUTUBE.expr());
+ }
+
+}
\ No newline at end of file