From dd4309d5b6ef9375e2a172806d1115ca18c27027 Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Fri, 15 Feb 2008 18:01:52 +0000 Subject: [PATCH] Backported SWS-264 to 1.0 branch --- .../org/springframework/xml/JaxpVersion.java | 25 ++++++++++++++++- .../xml/xpath/XPathExpressionFactory.java | 28 +++++++++++++------ 2 files changed, 44 insertions(+), 9 deletions(-) diff --git a/xml/src/main/java/org/springframework/xml/JaxpVersion.java b/xml/src/main/java/org/springframework/xml/JaxpVersion.java index 6dcd0c53..171777ea 100644 --- a/xml/src/main/java/org/springframework/xml/JaxpVersion.java +++ b/xml/src/main/java/org/springframework/xml/JaxpVersion.java @@ -80,4 +80,27 @@ public abstract class JaxpVersion { public static int getJaxpVersion() { return jaxpVersion; } -} \ No newline at end of file + + /** + * Convenience method to determine if the current JAXP version is at least 1.3 (packaged with JDK 1.5). + * + * @return true if the current JAXP version is at least JAXP 1.3 + * @see #getJaxpVersion() + * @see #JAXP_13 + */ + public static boolean isAtLeastJaxp13() { + return getJaxpVersion() >= JAXP_13; + } + + /** + * Convenience method to determine if the current JAXP version is at least 1.4 (packaged with JDK 1.6). + * + * @return true if the current JAXP version is at least JAXP 1.4 + * @see #getJaxpVersion() + * @see #JAXP_14 + */ + public static boolean isAtLeastJaxp14() { + return getJaxpVersion() >= JAXP_14; + } + +} diff --git a/xml/src/main/java/org/springframework/xml/xpath/XPathExpressionFactory.java b/xml/src/main/java/org/springframework/xml/xpath/XPathExpressionFactory.java index f5f6847b..8a8d1759 100644 --- a/xml/src/main/java/org/springframework/xml/xpath/XPathExpressionFactory.java +++ b/xml/src/main/java/org/springframework/xml/xpath/XPathExpressionFactory.java @@ -21,6 +21,7 @@ import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; + import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.xml.JaxpVersion; @@ -42,9 +43,14 @@ public abstract class XPathExpressionFactory { private static final String JAXEN_CLASS_NAME = "org.jaxen.XPath"; + private static boolean jaxp13Available; + private static boolean jaxenAvailable; static { + // Check whether JAXP 1.3 is available + jaxp13Available = JaxpVersion.isAtLeastJaxp13(); + // Check whether Jaxen is available try { ClassUtils.forName(JAXEN_CLASS_NAME); @@ -81,18 +87,24 @@ public abstract class XPathExpressionFactory { public static XPathExpression createXPathExpression(String expression, Map namespaces) throws IllegalStateException, XPathParseException { Assert.hasLength(expression, "expression is empty"); - if (JaxpVersion.getJaxpVersion() >= JaxpVersion.JAXP_13) { - logger.trace("Creating [javax.xml.xpath.XPathExpression]"); - return Jaxp13XPathExpressionFactory.createXPathExpression(expression, namespaces); + if (jaxp13Available) { + try { + logger.trace("Creating [javax.xml.xpath.XPathExpression]"); + return Jaxp13XPathExpressionFactory.createXPathExpression(expression, namespaces); + } + catch (XPathException e) { + throw e; + } + catch (Throwable e) { + jaxp13Available = false; + } } - else if (jaxenAvailable) { + if (jaxenAvailable) { logger.trace("Creating [org.jaxen.XPath]"); return JaxenXPathExpressionFactory.createXPathExpression(expression, namespaces); } - else { - throw new IllegalStateException( - "Could not create XPathExpression: could not locate JAXP 1.3, or Jaxen on the class path"); - } + throw new IllegalStateException( + "Could not create XPathExpression: could not locate JAXP 1.3, or Jaxen on the class path"); }