1 /*
2 * Copyright 2005-2012 the original author or authors.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 package org.springframework.xml.xpath;
18
19 import java.util.Collections;
20 import java.util.Map;
21
22 import org.springframework.util.Assert;
23
24 import org.apache.commons.logging.Log;
25 import org.apache.commons.logging.LogFactory;
26
27 /**
28 * Factory for compiled <code>XPathExpression</code>s, being aware of JAXP 1.3+ XPath functionality, and Jaxen. Mainly
29 * for internal use of the framework.
30 * <p/>
31 * The goal of this class is to avoid runtime dependencies a specific XPath engine, simply using the best XPath
32 * implementation that is available. Prefers JAXP 1.3+ XPath implementations to Jaxen.
33 *
34 * @author Arjen Poutsma
35 * @see XPathExpression
36 * @since 1.0.0
37 */
38 public abstract class XPathExpressionFactory {
39
40 private static final Log logger = LogFactory.getLog(XPathExpressionFactory.class);
41
42 /**
43 * Create a compiled XPath expression using the given string.
44 *
45 * @param expression the XPath expression
46 * @return the compiled XPath expression
47 * @throws IllegalStateException if neither JAXP 1.3+, or Jaxen are available
48 * @throws XPathParseException if the given expression cannot be parsed
49 */
50 public static XPathExpression createXPathExpression(String expression)
51 throws IllegalStateException, XPathParseException {
52 return createXPathExpression(expression, Collections.<String, String>emptyMap());
53 }
54
55 /**
56 * Create a compiled XPath expression using the given string and namespaces. The namespace map should consist of
57 * string prefixes mapped to string namespaces.
58 *
59 * @param expression the XPath expression
60 * @param namespaces a map that binds string prefixes to string namespaces
61 * @return the compiled XPath expression
62 * @throws IllegalStateException if neither JAXP 1.3+, or Jaxen are available
63 * @throws XPathParseException if the given expression cannot be parsed
64 */
65 public static XPathExpression createXPathExpression(String expression, Map<String, String> namespaces)
66 throws IllegalStateException, XPathParseException {
67 Assert.hasLength(expression, "expression is empty");
68 if (namespaces == null) {
69 namespaces = Collections.emptyMap();
70 }
71 try {
72 logger.trace("Creating [javax.xml.xpath.XPathExpression]");
73 return Jaxp13XPathExpressionFactory.createXPathExpression(expression, namespaces);
74 }
75 catch (XPathException e) {
76 throw e;
77 }
78 }
79
80
81 }