#1160 - Update code style.
This commit is contained in:
@@ -42,7 +42,8 @@ public class DocumentBuilderFactoryUtils {
|
||||
factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
|
||||
} catch (IllegalArgumentException e) {
|
||||
if (log.isWarnEnabled()) {
|
||||
log.warn(XMLConstants.ACCESS_EXTERNAL_DTD + " property not supported by " + factory.getClass().getCanonicalName());
|
||||
log.warn(
|
||||
XMLConstants.ACCESS_EXTERNAL_DTD + " property not supported by " + factory.getClass().getCanonicalName());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,7 +51,8 @@ public class DocumentBuilderFactoryUtils {
|
||||
factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");
|
||||
} catch (IllegalArgumentException e) {
|
||||
if (log.isWarnEnabled()) {
|
||||
log.warn(XMLConstants.ACCESS_EXTERNAL_SCHEMA + " property not supported by " + factory.getClass().getCanonicalName());
|
||||
log.warn(XMLConstants.ACCESS_EXTERNAL_SCHEMA + " property not supported by "
|
||||
+ factory.getClass().getCanonicalName());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -58,7 +60,8 @@ public class DocumentBuilderFactoryUtils {
|
||||
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
|
||||
} catch (ParserConfigurationException e) {
|
||||
if (log.isWarnEnabled()) {
|
||||
log.warn("FEATURE 'http://apache.org/xml/features/disallow-doctype-decl' is probably not supported by " + factory.getClass().getCanonicalName());
|
||||
log.warn("FEATURE 'http://apache.org/xml/features/disallow-doctype-decl' is probably not supported by "
|
||||
+ factory.getClass().getCanonicalName());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -66,7 +69,8 @@ public class DocumentBuilderFactoryUtils {
|
||||
factory.setFeature("http://xml.org/sax/features/external-general-entities", false);
|
||||
} catch (ParserConfigurationException e) {
|
||||
if (log.isWarnEnabled()) {
|
||||
log.warn("FEATURE 'http://xml.org/sax/features/external-general-entities' is probably not supported by " + factory.getClass().getCanonicalName());
|
||||
log.warn("FEATURE 'http://xml.org/sax/features/external-general-entities' is probably not supported by "
|
||||
+ factory.getClass().getCanonicalName());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -74,7 +78,8 @@ public class DocumentBuilderFactoryUtils {
|
||||
factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
|
||||
} catch (ParserConfigurationException e) {
|
||||
if (log.isWarnEnabled()) {
|
||||
log.warn("FEATURE 'http://xml.org/sax/features/external-parameter-entities' is probably not supported by " + factory.getClass().getCanonicalName());
|
||||
log.warn("FEATURE 'http://xml.org/sax/features/external-parameter-entities' is probably not supported by "
|
||||
+ factory.getClass().getCanonicalName());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -82,7 +87,9 @@ public class DocumentBuilderFactoryUtils {
|
||||
factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
|
||||
} catch (ParserConfigurationException e) {
|
||||
if (log.isWarnEnabled()) {
|
||||
log.warn("FEATURE 'http://apache.org/xml/features/nonvalidating/load-external-dtd' is probably not supported by " + factory.getClass().getCanonicalName());
|
||||
log.warn(
|
||||
"FEATURE 'http://apache.org/xml/features/nonvalidating/load-external-dtd' is probably not supported by "
|
||||
+ factory.getClass().getCanonicalName());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -21,8 +21,8 @@ import org.springframework.util.ClassUtils;
|
||||
/**
|
||||
* Helper class used to find the current version of JAXP. We cannot depend on the Java version, since JAXP can be
|
||||
* upgraded independently of the Java version.
|
||||
*
|
||||
* <p>Only distinguishes between JAXP 1.0, 1.1, 1.3, 1.4, and 1.5, since JAXP 1.2 was a maintenance release with no new
|
||||
* <p>
|
||||
* Only distinguishes between JAXP 1.0, 1.1, 1.3, 1.4, and 1.5, since JAXP 1.2 was a maintenance release with no new
|
||||
* classes.
|
||||
*
|
||||
* @author Arjen Poutsma
|
||||
@@ -57,7 +57,7 @@ public abstract class JaxpVersion {
|
||||
public static final int JAXP_15 = 5;
|
||||
|
||||
private static final String JAXP_14_CLASS_NAME = "javax.xml.transform.stax.StAXSource";
|
||||
|
||||
|
||||
private static final String JAXP_15_CLASS_NAME = "javax.xml.validation.SchemaFactoryConfigurationError";
|
||||
|
||||
private static int jaxpVersion;
|
||||
@@ -104,4 +104,4 @@ public abstract class JaxpVersion {
|
||||
return getJaxpVersion() >= JAXP_14;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,14 +25,14 @@ public class XMLInputFactoryUtils {
|
||||
/**
|
||||
* Build an {@link XMLInputFactory} and set properties to prevent external entities from accessing.
|
||||
*
|
||||
* @see XMLInputFactory#newInstance()
|
||||
* @see XMLInputFactory#newInstance()
|
||||
*/
|
||||
public static XMLInputFactory newInstance() {
|
||||
XMLInputFactory factory = XMLInputFactory.newInstance();
|
||||
|
||||
factory.setProperty(XMLInputFactory.SUPPORT_DTD, false);
|
||||
factory.setProperty("javax.xml.stream.isSupportingExternalEntities", false);
|
||||
|
||||
|
||||
return factory;
|
||||
}
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ public abstract class XmlException extends NestedRuntimeException {
|
||||
/**
|
||||
* Constructs a new instance of the {@code XmlException} with the specific detail message and exception.
|
||||
*
|
||||
* @param message the detail message
|
||||
* @param message the detail message
|
||||
* @param throwable the wrapped exception
|
||||
*/
|
||||
protected XmlException(String message, Throwable throwable) {
|
||||
|
||||
@@ -19,6 +19,7 @@ package org.springframework.xml.dom;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.util.Assert;
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
import org.w3c.dom.Node;
|
||||
@@ -29,8 +30,6 @@ import org.xml.sax.ContentHandler;
|
||||
import org.xml.sax.Locator;
|
||||
import org.xml.sax.SAXException;
|
||||
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
/**
|
||||
* SAX {@code ContentHandler} that transforms callback calls to DOM {@code Node}s.
|
||||
*
|
||||
@@ -56,8 +55,7 @@ public class DomContentHandler implements ContentHandler {
|
||||
this.node = node;
|
||||
if (node instanceof Document) {
|
||||
document = (Document) node;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
document = node.getOwnerDocument();
|
||||
}
|
||||
Assert.notNull(document, "document must not be null");
|
||||
@@ -66,8 +64,7 @@ public class DomContentHandler implements ContentHandler {
|
||||
private Node getParent() {
|
||||
if (!elements.isEmpty()) {
|
||||
return elements.get(elements.size() - 1);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
return node;
|
||||
}
|
||||
}
|
||||
@@ -100,8 +97,7 @@ public class DomContentHandler implements ContentHandler {
|
||||
Node lastChild = parent.getLastChild();
|
||||
if (lastChild != null && lastChild.getNodeType() == Node.TEXT_NODE) {
|
||||
((Text) lastChild).appendData(data);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
Text text = document.createTextNode(data);
|
||||
parent.appendChild(text);
|
||||
}
|
||||
@@ -119,30 +115,23 @@ public class DomContentHandler implements ContentHandler {
|
||||
*/
|
||||
|
||||
@Override
|
||||
public void setDocumentLocator(Locator locator) {
|
||||
}
|
||||
public void setDocumentLocator(Locator locator) {}
|
||||
|
||||
@Override
|
||||
public void startDocument() throws SAXException {
|
||||
}
|
||||
public void startDocument() throws SAXException {}
|
||||
|
||||
@Override
|
||||
public void endDocument() throws SAXException {
|
||||
}
|
||||
public void endDocument() throws SAXException {}
|
||||
|
||||
@Override
|
||||
public void startPrefixMapping(String prefix, String uri) throws SAXException {
|
||||
}
|
||||
public void startPrefixMapping(String prefix, String uri) throws SAXException {}
|
||||
|
||||
@Override
|
||||
public void endPrefixMapping(String prefix) throws SAXException {
|
||||
}
|
||||
public void endPrefixMapping(String prefix) throws SAXException {}
|
||||
|
||||
@Override
|
||||
public void ignorableWhitespace(char ch[], int start, int length) throws SAXException {
|
||||
}
|
||||
public void ignorableWhitespace(char ch[], int start, int length) throws SAXException {}
|
||||
|
||||
@Override
|
||||
public void skippedEntity(String name) throws SAXException {
|
||||
}
|
||||
public void skippedEntity(String name) throws SAXException {}
|
||||
}
|
||||
|
||||
@@ -17,27 +17,34 @@
|
||||
package org.springframework.xml.namespace;
|
||||
|
||||
import java.beans.PropertyEditorSupport;
|
||||
|
||||
import javax.xml.namespace.QName;
|
||||
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
/**
|
||||
* PropertyEditor for {@code javax.xml.namespace.QName}, to populate a property of type QName from a String value.
|
||||
*
|
||||
* <p>Expects the syntax
|
||||
* <p>
|
||||
* Expects the syntax
|
||||
*
|
||||
* <pre>
|
||||
* localPart
|
||||
* </pre>
|
||||
*
|
||||
* or
|
||||
*
|
||||
* <pre>
|
||||
* {namespace}localPart
|
||||
* </pre>
|
||||
*
|
||||
* or
|
||||
*
|
||||
* <pre>
|
||||
* {namespace}prefix:localPart
|
||||
* </pre>
|
||||
* This resembles the {@code toString()} representation of {@code QName} itself, but allows for prefixes to be
|
||||
* specified as well.
|
||||
*
|
||||
* This resembles the {@code toString()} representation of {@code QName} itself, but allows for prefixes to be specified
|
||||
* as well.
|
||||
*
|
||||
* @author Arjen Poutsma
|
||||
* @see javax.xml.namespace.QName
|
||||
@@ -57,17 +64,14 @@ public class QNameEditor extends PropertyEditorSupport {
|
||||
Object value = getValue();
|
||||
if (value == null || !(value instanceof QName)) {
|
||||
return "";
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
QName qName = (QName) value;
|
||||
String prefix = qName.getPrefix();
|
||||
if (StringUtils.hasLength(qName.getNamespaceURI()) && StringUtils.hasLength(prefix)) {
|
||||
return "{" + qName.getNamespaceURI() + "}" + prefix + ":" + qName.getLocalPart();
|
||||
}
|
||||
else if (StringUtils.hasLength(qName.getNamespaceURI())) {
|
||||
} else if (StringUtils.hasLength(qName.getNamespaceURI())) {
|
||||
return "{" + qName.getNamespaceURI() + "}" + qName.getLocalPart();
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
return qName.getLocalPart();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,10 +18,9 @@ package org.springframework.xml.namespace;
|
||||
|
||||
import javax.xml.namespace.QName;
|
||||
|
||||
import org.w3c.dom.Node;
|
||||
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.w3c.dom.Node;
|
||||
|
||||
/**
|
||||
* Helper class for using {@link QName}.
|
||||
@@ -34,12 +33,12 @@ public abstract class QNameUtils {
|
||||
|
||||
/**
|
||||
* Creates a new {@code QName} with the given parameters. Sets the prefix if possible, i.e. if the
|
||||
* {@code QName(String, String, String)} constructor can be found. If this constructor is not available (as is
|
||||
* the case on older implementations of JAX-RPC), the prefix is ignored.
|
||||
* {@code QName(String, String, String)} constructor can be found. If this constructor is not available (as is the
|
||||
* case on older implementations of JAX-RPC), the prefix is ignored.
|
||||
*
|
||||
* @param namespaceUri namespace URI of the {@code QName}
|
||||
* @param localPart local part of the {@code QName}
|
||||
* @param prefix prefix of the {@code QName}. May be ignored.
|
||||
* @param localPart local part of the {@code QName}
|
||||
* @param prefix prefix of the {@code QName}. May be ignored.
|
||||
* @return the created {@code QName}
|
||||
* @see QName#QName(String,String,String)
|
||||
* @deprecated in favor of {@link QName#QName(String, String, String)}
|
||||
@@ -92,16 +91,12 @@ public abstract class QNameUtils {
|
||||
*/
|
||||
public static QName getQNameForNode(Node node) {
|
||||
if (node.getNamespaceURI() != null && node.getPrefix() != null && node.getLocalName() != null) {
|
||||
return new QName(node.getNamespaceURI(), node.getLocalName(),
|
||||
node.getPrefix());
|
||||
}
|
||||
else if (node.getNamespaceURI() != null && node.getLocalName() != null) {
|
||||
return new QName(node.getNamespaceURI(), node.getLocalName(), node.getPrefix());
|
||||
} else if (node.getNamespaceURI() != null && node.getLocalName() != null) {
|
||||
return new QName(node.getNamespaceURI(), node.getLocalName());
|
||||
}
|
||||
else if (node.getLocalName() != null) {
|
||||
} else if (node.getLocalName() != null) {
|
||||
return new QName(node.getLocalName());
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
// as a last resort, use the node name
|
||||
return new QName(node.getNodeName());
|
||||
}
|
||||
@@ -118,17 +113,16 @@ public abstract class QNameUtils {
|
||||
String prefix = qName.getPrefix();
|
||||
if (!StringUtils.hasLength(prefix)) {
|
||||
return qName.getLocalPart();
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
return prefix + ":" + qName.getLocalPart();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a namespace URI and DOM or SAX qualified name to a {@code QName}. The qualified name can have the
|
||||
* form {@code prefix:localname} or {@code localName}.
|
||||
* Convert a namespace URI and DOM or SAX qualified name to a {@code QName}. The qualified name can have the form
|
||||
* {@code prefix:localname} or {@code localName}.
|
||||
*
|
||||
* @param namespaceUri the namespace URI
|
||||
* @param namespaceUri the namespace URI
|
||||
* @param qualifiedName the qualified name
|
||||
* @return a QName
|
||||
*/
|
||||
@@ -136,18 +130,15 @@ public abstract class QNameUtils {
|
||||
int idx = qualifiedName.indexOf(':');
|
||||
if (idx == -1) {
|
||||
return new QName(namespaceUri, qualifiedName);
|
||||
}
|
||||
else {
|
||||
return new QName(namespaceUri, qualifiedName.substring(idx + 1),
|
||||
qualifiedName.substring(0, idx));
|
||||
} else {
|
||||
return new QName(namespaceUri, qualifiedName.substring(idx + 1), qualifiedName.substring(0, idx));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse the given qualified name string into a {@code QName}. Expects the syntax {@code localPart},
|
||||
* {@code {namespace}localPart}, or {@code {namespace}prefix:localPart}. This format resembles the
|
||||
* {@code toString()} representation of {@code QName} itself, but allows for prefixes to be specified as
|
||||
* well.
|
||||
* {@code {namespace}localPart}, or {@code {namespace}prefix:localPart}. This format resembles the {@code toString()}
|
||||
* representation of {@code QName} itself, but allows for prefixes to be specified as well.
|
||||
*
|
||||
* @return a corresponding QName instance
|
||||
* @throws IllegalArgumentException when the given string is {@code null} or empty.
|
||||
@@ -156,19 +147,16 @@ public abstract class QNameUtils {
|
||||
Assert.hasLength(qNameString, "QName text may not be null or empty");
|
||||
if (qNameString.charAt(0) != '{') {
|
||||
return new QName(qNameString);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
int endOfNamespaceURI = qNameString.indexOf('}');
|
||||
if (endOfNamespaceURI == -1) {
|
||||
throw new IllegalArgumentException(
|
||||
"Cannot create QName from \"" + qNameString + "\", missing closing \"}\"");
|
||||
throw new IllegalArgumentException("Cannot create QName from \"" + qNameString + "\", missing closing \"}\"");
|
||||
}
|
||||
int prefixSeperator = qNameString.indexOf(':', endOfNamespaceURI + 1);
|
||||
String namespaceURI = qNameString.substring(1, endOfNamespaceURI);
|
||||
if (prefixSeperator == -1) {
|
||||
return new QName(namespaceURI, qNameString.substring(endOfNamespaceURI + 1));
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
return new QName(namespaceURI, qNameString.substring(prefixSeperator + 1),
|
||||
qNameString.substring(endOfNamespaceURI + 1, prefixSeperator));
|
||||
}
|
||||
|
||||
@@ -23,15 +23,15 @@ import java.util.LinkedHashMap;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.xml.XMLConstants;
|
||||
import javax.xml.namespace.NamespaceContext;
|
||||
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
/**
|
||||
* Simple {@code javax.xml.namespace.NamespaceContext} implementation. Follows the standard
|
||||
* {@code NamespaceContext} contract, and is loadable via a {@code java.util.Map} or
|
||||
* {@code java.util.Properties} object
|
||||
* Simple {@code javax.xml.namespace.NamespaceContext} implementation. Follows the standard {@code NamespaceContext}
|
||||
* contract, and is loadable via a {@code java.util.Map} or {@code java.util.Properties} object
|
||||
*
|
||||
* @author Arjen Poutsma
|
||||
* @since 1.0.0
|
||||
@@ -47,11 +47,9 @@ public class SimpleNamespaceContext implements NamespaceContext {
|
||||
Assert.notNull(prefix, "prefix is null");
|
||||
if (XMLConstants.XML_NS_PREFIX.equals(prefix)) {
|
||||
return XMLConstants.XML_NS_URI;
|
||||
}
|
||||
else if (XMLConstants.XMLNS_ATTRIBUTE.equals(prefix)) {
|
||||
} else if (XMLConstants.XMLNS_ATTRIBUTE.equals(prefix)) {
|
||||
return XMLConstants.XMLNS_ATTRIBUTE_NS_URI;
|
||||
}
|
||||
else if (prefixToNamespaceUri.containsKey(prefix)) {
|
||||
} else if (prefixToNamespaceUri.containsKey(prefix)) {
|
||||
return prefixToNamespaceUri.get(prefix);
|
||||
}
|
||||
return XMLConstants.NULL_NS_URI;
|
||||
@@ -93,21 +91,20 @@ public class SimpleNamespaceContext implements NamespaceContext {
|
||||
/**
|
||||
* Binds the given prefix to the given namespace.
|
||||
*
|
||||
* @param prefix the namespace prefix
|
||||
* @param prefix the namespace prefix
|
||||
* @param namespaceUri the namespace uri
|
||||
*/
|
||||
public void bindNamespaceUri(String prefix, String namespaceUri) {
|
||||
Assert.notNull(prefix, "No prefix given");
|
||||
Assert.notNull(namespaceUri, "No namespaceUri given");
|
||||
if (XMLConstants.XML_NS_PREFIX.equals(prefix)) {
|
||||
Assert.isTrue(XMLConstants.XML_NS_URI.equals(namespaceUri), "Prefix \"" + prefix +
|
||||
"\" bound to namespace \"" + namespaceUri + "\" (should be \"" + XMLConstants.XML_NS_URI + "\")");
|
||||
Assert.isTrue(XMLConstants.XML_NS_URI.equals(namespaceUri), "Prefix \"" + prefix + "\" bound to namespace \""
|
||||
+ namespaceUri + "\" (should be \"" + XMLConstants.XML_NS_URI + "\")");
|
||||
} else if (XMLConstants.XMLNS_ATTRIBUTE.equals(prefix)) {
|
||||
Assert.isTrue(XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(namespaceUri), "Prefix \"" + prefix +
|
||||
"\" bound to namespace \"" + namespaceUri + "\" (should be \"" +
|
||||
XMLConstants.XMLNS_ATTRIBUTE_NS_URI + "\")");
|
||||
}
|
||||
else {
|
||||
Assert.isTrue(XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(namespaceUri),
|
||||
"Prefix \"" + prefix + "\" bound to namespace \"" + namespaceUri + "\" (should be \""
|
||||
+ XMLConstants.XMLNS_ATTRIBUTE_NS_URI + "\")");
|
||||
} else {
|
||||
prefixToNamespaceUri.put(prefix, namespaceUri);
|
||||
getPrefixesInternal(namespaceUri).add(prefix);
|
||||
}
|
||||
@@ -134,11 +131,9 @@ public class SimpleNamespaceContext implements NamespaceContext {
|
||||
private Set<String> getPrefixesInternal(String namespaceUri) {
|
||||
if (XMLConstants.XML_NS_URI.equals(namespaceUri)) {
|
||||
return Collections.singleton(XMLConstants.XML_NS_PREFIX);
|
||||
}
|
||||
else if (XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(namespaceUri)) {
|
||||
} else if (XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(namespaceUri)) {
|
||||
return Collections.singleton(XMLConstants.XMLNS_ATTRIBUTE);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
Set<String> set = namespaceUriToPrefixes.get(namespaceUri);
|
||||
if (set == null) {
|
||||
set = new LinkedHashSet<String>();
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<html>
|
||||
<body>
|
||||
Provides classes for XML handling: version detection and a base XML exception class. Mostly for internal use by the
|
||||
framework.
|
||||
</body>
|
||||
<body>
|
||||
Provides classes for XML handling: version detection and a base XML exception class. Mostly for internal use by
|
||||
the
|
||||
framework.
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -26,8 +26,8 @@ import org.xml.sax.XMLReader;
|
||||
import org.xml.sax.ext.LexicalHandler;
|
||||
|
||||
/**
|
||||
* Abstract base class for SAX {@code XMLReader} implementations. Contains properties as defined in {@link
|
||||
* XMLReader}, and does not recognize any features
|
||||
* Abstract base class for SAX {@code XMLReader} implementations. Contains properties as defined in {@link XMLReader},
|
||||
* and does not recognize any features
|
||||
*
|
||||
* @author Arjen Poutsma
|
||||
* @see #setContentHandler(org.xml.sax.ContentHandler)
|
||||
@@ -95,8 +95,7 @@ public abstract class AbstractXmlReader implements XMLReader {
|
||||
/**
|
||||
* Throws a {@code SAXNotRecognizedException} exception.
|
||||
*
|
||||
* @throws org.xml.sax.SAXNotRecognizedException
|
||||
* always
|
||||
* @throws org.xml.sax.SAXNotRecognizedException always
|
||||
*/
|
||||
@Override
|
||||
public boolean getFeature(String name) throws SAXNotRecognizedException, SAXNotSupportedException {
|
||||
@@ -114,29 +113,27 @@ public abstract class AbstractXmlReader implements XMLReader {
|
||||
}
|
||||
|
||||
/**
|
||||
* Throws a {@code SAXNotRecognizedException} exception when the given property does not signify a lexical
|
||||
* handler. The property name for a lexical handler is {@code http://xml.org/sax/properties/lexical-handler}.
|
||||
* Throws a {@code SAXNotRecognizedException} exception when the given property does not signify a lexical handler.
|
||||
* The property name for a lexical handler is {@code http://xml.org/sax/properties/lexical-handler}.
|
||||
*/
|
||||
@Override
|
||||
public Object getProperty(String name) throws SAXNotRecognizedException, SAXNotSupportedException {
|
||||
if ("http://xml.org/sax/properties/lexical-handler".equals(name)) {
|
||||
return lexicalHandler;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
throw new SAXNotRecognizedException(name);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Throws a {@code SAXNotRecognizedException} exception when the given property does not signify a lexical
|
||||
* handler. The property name for a lexical handler is {@code http://xml.org/sax/properties/lexical-handler}.
|
||||
* Throws a {@code SAXNotRecognizedException} exception when the given property does not signify a lexical handler.
|
||||
* The property name for a lexical handler is {@code http://xml.org/sax/properties/lexical-handler}.
|
||||
*/
|
||||
@Override
|
||||
public void setProperty(String name, Object value) throws SAXNotRecognizedException, SAXNotSupportedException {
|
||||
if ("http://xml.org/sax/properties/lexical-handler".equals(name)) {
|
||||
lexicalHandler = (LexicalHandler) value;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
throw new SAXNotRecognizedException(name);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,10 +20,9 @@ import java.io.IOException;
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
|
||||
import org.springframework.core.io.Resource;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.springframework.core.io.Resource;
|
||||
import org.xml.sax.InputSource;
|
||||
|
||||
/**
|
||||
@@ -56,12 +55,10 @@ public abstract class SaxUtils {
|
||||
public static String getSystemId(Resource resource) {
|
||||
try {
|
||||
return new URI(resource.getURL().toExternalForm()).toString();
|
||||
}
|
||||
catch (IOException ex) {
|
||||
} catch (IOException ex) {
|
||||
logger.debug("Could not get System ID from [" + resource + "], ex");
|
||||
return null;
|
||||
}
|
||||
catch (URISyntaxException e) {
|
||||
} catch (URISyntaxException e) {
|
||||
logger.debug("Could not get System ID from [" + resource + "], ex");
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -17,11 +17,11 @@
|
||||
package org.springframework.xml.transform;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import javax.xml.transform.sax.SAXSource;
|
||||
|
||||
import org.springframework.core.io.Resource;
|
||||
import org.springframework.xml.sax.SaxUtils;
|
||||
|
||||
import org.xml.sax.XMLReader;
|
||||
|
||||
/**
|
||||
|
||||
@@ -17,11 +17,12 @@
|
||||
package org.springframework.xml.transform;
|
||||
|
||||
import java.io.StringWriter;
|
||||
|
||||
import javax.xml.transform.stream.StreamResult;
|
||||
|
||||
/**
|
||||
* Convenient subclass of {@code StreamResult} that writes to a {@code StringWriter}. The resulting string can
|
||||
* be retrieved via {@code toString()}.
|
||||
* Convenient subclass of {@code StreamResult} that writes to a {@code StringWriter}. The resulting string can be
|
||||
* retrieved via {@code toString()}.
|
||||
*
|
||||
* @author Arjen Poutsma
|
||||
* @see #toString()
|
||||
|
||||
@@ -19,13 +19,14 @@ package org.springframework.xml.transform;
|
||||
import java.io.InputStream;
|
||||
import java.io.Reader;
|
||||
import java.io.StringReader;
|
||||
|
||||
import javax.xml.transform.stream.StreamSource;
|
||||
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
/**
|
||||
* Convenient subclass of {@code StreamSource} that reads from a {@code StringReader}. The string to be read
|
||||
* can be set via the constructor.
|
||||
* Convenient subclass of {@code StreamSource} that reads from a {@code StringReader}. The string to be read can be set
|
||||
* via the constructor.
|
||||
*
|
||||
* @author Arjen Poutsma
|
||||
* @since 1.0.0
|
||||
|
||||
@@ -59,15 +59,17 @@ public class TransformerFactoryUtils {
|
||||
factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
|
||||
} catch (IllegalArgumentException e) {
|
||||
if (log.isWarnEnabled()) {
|
||||
log.warn(XMLConstants.ACCESS_EXTERNAL_DTD + " property not supported by " + factory.getClass().getCanonicalName());
|
||||
log.warn(
|
||||
XMLConstants.ACCESS_EXTERNAL_DTD + " property not supported by " + factory.getClass().getCanonicalName());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
try {
|
||||
factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "");
|
||||
} catch (IllegalArgumentException e) {
|
||||
if (log.isWarnEnabled()) {
|
||||
log.warn(XMLConstants.ACCESS_EXTERNAL_STYLESHEET + " property not supported by " + factory.getClass().getCanonicalName());
|
||||
log.warn(XMLConstants.ACCESS_EXTERNAL_STYLESHEET + " property not supported by "
|
||||
+ factory.getClass().getCanonicalName());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -26,8 +26,8 @@ import javax.xml.transform.TransformerFactory;
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
/**
|
||||
* Helper class for {@link Transformer} usage. Provides {@link #createTransformer()} and {@link #transform(Source,
|
||||
* Result)}.
|
||||
* Helper class for {@link Transformer} usage. Provides {@link #createTransformer()} and
|
||||
* {@link #transform(Source, Result)}.
|
||||
*
|
||||
* @author Arjen Poutsma
|
||||
* @since 3.0
|
||||
@@ -41,8 +41,7 @@ public class TransformerHelper {
|
||||
/**
|
||||
* Initializes a new instance of the {@code TransformerHelper}.
|
||||
*/
|
||||
public TransformerHelper() {
|
||||
}
|
||||
public TransformerHelper() {}
|
||||
|
||||
/**
|
||||
* Initializes a new instance of the {@code TransformerHelper} with the specified {@link TransformerFactory}.
|
||||
@@ -68,12 +67,12 @@ public class TransformerHelper {
|
||||
|
||||
/**
|
||||
* Instantiate a new TransformerFactory.
|
||||
*
|
||||
* <p>The default implementation simply calls {@link TransformerFactory#newInstance()}. If a {@link
|
||||
* #setTransformerFactoryClass transformerFactoryClass} has been specified explicitly, the default constructor of
|
||||
* the specified class will be called instead.
|
||||
*
|
||||
* <p>Can be overridden in subclasses.
|
||||
* <p>
|
||||
* The default implementation simply calls {@link TransformerFactory#newInstance()}. If a
|
||||
* {@link #setTransformerFactoryClass transformerFactoryClass} has been specified explicitly, the default constructor
|
||||
* of the specified class will be called instead.
|
||||
* <p>
|
||||
* Can be overridden in subclasses.
|
||||
*
|
||||
* @param transformerFactoryClass the specified factory class (if any)
|
||||
* @return the new TransactionFactory instance
|
||||
@@ -112,16 +111,15 @@ public class TransformerHelper {
|
||||
* Creates a new {@code Transformer}. Must be called per thread, as transformers are not thread-safe.
|
||||
*
|
||||
* @return the created transformer
|
||||
* @throws TransformerConfigurationException
|
||||
* if thrown by JAXP methods
|
||||
* @throws TransformerConfigurationException if thrown by JAXP methods
|
||||
*/
|
||||
public Transformer createTransformer() throws TransformerConfigurationException {
|
||||
return getTransformerFactory().newTransformer();
|
||||
}
|
||||
|
||||
/**
|
||||
* Transforms the given {@link Source} to the given {@link Result}. Creates a new {@link Transformer} for every
|
||||
* call, as transformers are not thread-safe.
|
||||
* Transforms the given {@link Source} to the given {@link Result}. Creates a new {@link Transformer} for every call,
|
||||
* as transformers are not thread-safe.
|
||||
*
|
||||
* @param source the source to transform from
|
||||
* @param result the result to transform to
|
||||
|
||||
@@ -27,9 +27,9 @@ import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
/**
|
||||
* Convenient base class for objects that use a {@code Transformer}. Subclasses can call {@link
|
||||
* #createTransformer()} or {@link #transform(Source, Result)}. This should be done per thread (i.e. per incoming
|
||||
* request), because {@code Transformer} instances are not thread-safe.
|
||||
* Convenient base class for objects that use a {@code Transformer}. Subclasses can call {@link #createTransformer()} or
|
||||
* {@link #transform(Source, Result)}. This should be done per thread (i.e. per incoming request), because
|
||||
* {@code Transformer} instances are not thread-safe.
|
||||
*
|
||||
* @author Arjen Poutsma
|
||||
* @see Transformer
|
||||
@@ -52,10 +52,13 @@ public abstract class TransformerObjectSupport {
|
||||
}
|
||||
|
||||
/**
|
||||
* Instantiate a new TransformerFactory. <p>The default implementation simply calls {@link
|
||||
* TransformerFactory#newInstance()}. If a {@link #setTransformerFactoryClass "transformerFactoryClass"} has been
|
||||
* specified explicitly, the default constructor of the specified class will be called instead. <p>Can be overridden
|
||||
* in subclasses.
|
||||
* Instantiate a new TransformerFactory.
|
||||
* <p>
|
||||
* The default implementation simply calls {@link TransformerFactory#newInstance()}. If a
|
||||
* {@link #setTransformerFactoryClass "transformerFactoryClass"} has been specified explicitly, the default
|
||||
* constructor of the specified class will be called instead.
|
||||
* <p>
|
||||
* Can be overridden in subclasses.
|
||||
*
|
||||
* @param transformerFactoryClass the specified factory class (if any)
|
||||
* @return the new TransactionFactory instance
|
||||
@@ -77,16 +80,15 @@ public abstract class TransformerObjectSupport {
|
||||
* Creates a new {@code Transformer}. Must be called per request, as transformers are not thread-safe.
|
||||
*
|
||||
* @return the created transformer
|
||||
* @throws TransformerConfigurationException
|
||||
* if thrown by JAXP methods
|
||||
* @throws TransformerConfigurationException if thrown by JAXP methods
|
||||
*/
|
||||
protected final Transformer createTransformer() throws TransformerConfigurationException {
|
||||
return transformerHelper.createTransformer();
|
||||
}
|
||||
|
||||
/**
|
||||
* Transforms the given {@link Source} to the given {@link Result}. Creates a new {@link Transformer} for every
|
||||
* call, as transformers are not thread-safe.
|
||||
* Transforms the given {@link Source} to the given {@link Result}. Creates a new {@link Transformer} for every call,
|
||||
* as transformers are not thread-safe.
|
||||
*
|
||||
* @param source the source to transform from
|
||||
* @param result the result to transform to
|
||||
|
||||
@@ -20,6 +20,7 @@ import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.io.Reader;
|
||||
import java.io.Writer;
|
||||
|
||||
import javax.xml.stream.XMLEventReader;
|
||||
import javax.xml.stream.XMLEventWriter;
|
||||
import javax.xml.stream.XMLStreamReader;
|
||||
@@ -37,7 +38,6 @@ import javax.xml.transform.stream.StreamSource;
|
||||
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.springframework.util.xml.StaxUtils;
|
||||
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Node;
|
||||
import org.xml.sax.ContentHandler;
|
||||
@@ -63,11 +63,9 @@ public abstract class TraxUtils {
|
||||
Node node = source.getNode();
|
||||
if (node instanceof Document) {
|
||||
return (Document) node;
|
||||
}
|
||||
else if (node != null) {
|
||||
} else if (node != null) {
|
||||
return node.getOwnerDocument();
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -76,40 +74,35 @@ public abstract class TraxUtils {
|
||||
* Performs the given {@linkplain SourceCallback callback} operation on a {@link Source}. Supports both the JAXP 1.4
|
||||
* {@link StAXSource} and the Spring 3.0 {@link StaxUtils#createStaxSource StaxSource}.
|
||||
*
|
||||
* @param source source to look at
|
||||
* @param source source to look at
|
||||
* @param callback the callback to invoke for each kind of source
|
||||
*/
|
||||
public static void doWithSource(Source source, SourceCallback callback) throws Exception {
|
||||
if (source instanceof DOMSource) {
|
||||
callback.domSource(((DOMSource) source).getNode());
|
||||
return;
|
||||
}
|
||||
else if (StaxUtils.isStaxSource(source)) {
|
||||
} else if (StaxUtils.isStaxSource(source)) {
|
||||
XMLStreamReader streamReader = StaxUtils.getXMLStreamReader(source);
|
||||
if (streamReader != null) {
|
||||
callback.staxSource(streamReader);
|
||||
return;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
XMLEventReader eventReader = StaxUtils.getXMLEventReader(source);
|
||||
if (eventReader != null) {
|
||||
callback.staxSource(eventReader);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (source instanceof SAXSource) {
|
||||
} else if (source instanceof SAXSource) {
|
||||
SAXSource saxSource = (SAXSource) source;
|
||||
callback.saxSource(saxSource.getXMLReader(), saxSource.getInputSource());
|
||||
return;
|
||||
}
|
||||
else if (source instanceof StreamSource) {
|
||||
} else if (source instanceof StreamSource) {
|
||||
StreamSource streamSource = (StreamSource) source;
|
||||
if (streamSource.getInputStream() != null) {
|
||||
callback.streamSource(streamSource.getInputStream());
|
||||
return;
|
||||
}
|
||||
else if (streamSource.getReader() != null) {
|
||||
} else if (streamSource.getReader() != null) {
|
||||
callback.streamSource(streamSource.getReader());
|
||||
return;
|
||||
}
|
||||
@@ -117,50 +110,45 @@ public abstract class TraxUtils {
|
||||
if (StringUtils.hasLength(source.getSystemId())) {
|
||||
String systemId = source.getSystemId();
|
||||
callback.source(systemId);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
throw new IllegalArgumentException("Unknown Source type: " + source.getClass());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs the given {@linkplain org.springframework.xml.transform.TraxUtils.ResultCallback callback} operation on a {@link javax.xml.transform.Result}. Supports both the JAXP 1.4
|
||||
* {@link javax.xml.transform.stax.StAXResult} and the Spring 3.0 {@link org.springframework.util.xml.StaxUtils#createStaxResult StaxSource}.
|
||||
* Performs the given {@linkplain org.springframework.xml.transform.TraxUtils.ResultCallback callback} operation on a
|
||||
* {@link javax.xml.transform.Result}. Supports both the JAXP 1.4 {@link javax.xml.transform.stax.StAXResult} and the
|
||||
* Spring 3.0 {@link org.springframework.util.xml.StaxUtils#createStaxResult StaxSource}.
|
||||
*
|
||||
* @param result result to look at
|
||||
* @param result result to look at
|
||||
* @param callback the callback to invoke for each kind of result
|
||||
*/
|
||||
public static void doWithResult(Result result, ResultCallback callback) throws Exception {
|
||||
if (result instanceof DOMResult) {
|
||||
callback.domResult(((DOMResult) result).getNode());
|
||||
return;
|
||||
}
|
||||
else if (StaxUtils.isStaxResult(result)) {
|
||||
} else if (StaxUtils.isStaxResult(result)) {
|
||||
XMLStreamWriter streamWriter = StaxUtils.getXMLStreamWriter(result);
|
||||
if (streamWriter != null) {
|
||||
callback.staxResult(streamWriter);
|
||||
return;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
XMLEventWriter eventWriter = StaxUtils.getXMLEventWriter(result);
|
||||
if (eventWriter != null) {
|
||||
callback.staxResult(eventWriter);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (result instanceof SAXResult) {
|
||||
} else if (result instanceof SAXResult) {
|
||||
SAXResult saxSource = (SAXResult) result;
|
||||
callback.saxResult(saxSource.getHandler(), saxSource.getLexicalHandler());
|
||||
return;
|
||||
}
|
||||
else if (result instanceof StreamResult) {
|
||||
} else if (result instanceof StreamResult) {
|
||||
StreamResult streamSource = (StreamResult) result;
|
||||
if (streamSource.getOutputStream() != null) {
|
||||
callback.streamResult(streamSource.getOutputStream());
|
||||
return;
|
||||
}
|
||||
else if (streamSource.getWriter() != null) {
|
||||
} else if (streamSource.getWriter() != null) {
|
||||
callback.streamResult(streamSource.getWriter());
|
||||
return;
|
||||
}
|
||||
@@ -168,8 +156,7 @@ public abstract class TraxUtils {
|
||||
if (StringUtils.hasLength(result.getSystemId())) {
|
||||
String systemId = result.getSystemId();
|
||||
callback.result(systemId);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
throw new IllegalArgumentException("Unknown Result type: " + result.getClass());
|
||||
}
|
||||
}
|
||||
@@ -191,7 +178,7 @@ public abstract class TraxUtils {
|
||||
/**
|
||||
* Perform an operation on the {@code XMLReader} and {@code InputSource} contained in a {@link SAXSource}.
|
||||
*
|
||||
* @param reader the reader, can be {@code null}
|
||||
* @param reader the reader, can be {@code null}
|
||||
* @param inputSource the input source, can be {@code null}
|
||||
*/
|
||||
void saxSource(XMLReader reader, InputSource inputSource) throws Exception;
|
||||
@@ -233,7 +220,6 @@ public abstract class TraxUtils {
|
||||
*/
|
||||
void source(String systemId) throws Exception;
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -251,8 +237,7 @@ public abstract class TraxUtils {
|
||||
void domResult(Node node) throws Exception;
|
||||
|
||||
/**
|
||||
* Perform an operation on the {@code ContentHandler} and {@code LexicalHandler} contained in a {@link
|
||||
* SAXResult}.
|
||||
* Perform an operation on the {@code ContentHandler} and {@code LexicalHandler} contained in a {@link SAXResult}.
|
||||
*
|
||||
* @param contentHandler the content handler
|
||||
* @param lexicalHandler the lexicalHandler, can be {@code null}
|
||||
@@ -298,5 +283,4 @@ public abstract class TraxUtils {
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -19,15 +19,15 @@ package org.springframework.xml.validation;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.xml.transform.Source;
|
||||
import javax.xml.validation.Schema;
|
||||
import javax.xml.validation.Validator;
|
||||
|
||||
import org.springframework.core.io.Resource;
|
||||
import org.xml.sax.SAXException;
|
||||
import org.xml.sax.SAXParseException;
|
||||
|
||||
import org.springframework.core.io.Resource;
|
||||
|
||||
/**
|
||||
* Internal class that uses JAXP 1.0 features to create {@code XmlValidator} instances.
|
||||
*
|
||||
@@ -41,8 +41,7 @@ abstract class Jaxp13ValidatorFactory {
|
||||
try {
|
||||
Schema schema = SchemaLoaderUtils.loadSchema(resources, schemaLanguage);
|
||||
return new Jaxp13Validator(schema);
|
||||
}
|
||||
catch (SAXException ex) {
|
||||
} catch (SAXException ex) {
|
||||
throw new XmlValidationException("Could not create Schema: " + ex.getMessage(), ex);
|
||||
}
|
||||
}
|
||||
@@ -70,8 +69,7 @@ abstract class Jaxp13ValidatorFactory {
|
||||
try {
|
||||
validator.validate(source);
|
||||
return errorHandler.getErrors();
|
||||
}
|
||||
catch (SAXException ex) {
|
||||
} catch (SAXException ex) {
|
||||
throw new XmlValidationException("Could not validate source: " + ex.getMessage(), ex);
|
||||
}
|
||||
}
|
||||
@@ -88,8 +86,7 @@ abstract class Jaxp13ValidatorFactory {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void warning(SAXParseException ex) throws SAXException {
|
||||
}
|
||||
public void warning(SAXParseException ex) throws SAXException {}
|
||||
|
||||
@Override
|
||||
public void error(SAXParseException ex) throws SAXException {
|
||||
|
||||
@@ -19,6 +19,7 @@ package org.springframework.xml.validation;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.xml.XMLConstants;
|
||||
import javax.xml.transform.Source;
|
||||
import javax.xml.validation.Schema;
|
||||
@@ -26,16 +27,15 @@ import javax.xml.validation.Validator;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.springframework.core.io.Resource;
|
||||
import org.xml.sax.SAXException;
|
||||
import org.xml.sax.SAXNotRecognizedException;
|
||||
import org.xml.sax.SAXNotSupportedException;
|
||||
import org.xml.sax.SAXParseException;
|
||||
|
||||
import org.springframework.core.io.Resource;
|
||||
|
||||
/**
|
||||
* Internal class that uses JAXP 1.5 features to create an {@code XmlValidator} with settings to prevent
|
||||
* external entity access.
|
||||
* Internal class that uses JAXP 1.5 features to create an {@code XmlValidator} with settings to prevent external entity
|
||||
* access.
|
||||
*
|
||||
* @author Arjen Poutsma
|
||||
* @author Greg Turnquist
|
||||
@@ -45,13 +45,11 @@ abstract class Jaxp15ValidatorFactory {
|
||||
|
||||
private static final Log log = LogFactory.getLog(Jaxp15ValidatorFactory.class);
|
||||
|
||||
|
||||
static XmlValidator createValidator(Resource[] resources, String schemaLanguage) throws IOException {
|
||||
try {
|
||||
Schema schema = SchemaLoaderUtils.loadSchema(resources, schemaLanguage);
|
||||
return new Jaxp15Validator(schema);
|
||||
}
|
||||
catch (SAXException ex) {
|
||||
} catch (SAXException ex) {
|
||||
throw new XmlValidationException("Could not create Schema: " + ex.getMessage(), ex);
|
||||
}
|
||||
}
|
||||
@@ -80,7 +78,8 @@ abstract class Jaxp15ValidatorFactory {
|
||||
validator.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, "");
|
||||
} catch (SAXNotRecognizedException | SAXNotSupportedException e) {
|
||||
if (log.isWarnEnabled()) {
|
||||
log.warn(XMLConstants.ACCESS_EXTERNAL_DTD + " property not supported by " + validator.getClass().getCanonicalName());
|
||||
log.warn(XMLConstants.ACCESS_EXTERNAL_DTD + " property not supported by "
|
||||
+ validator.getClass().getCanonicalName());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -88,7 +87,8 @@ abstract class Jaxp15ValidatorFactory {
|
||||
validator.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");
|
||||
} catch (SAXNotRecognizedException | SAXNotSupportedException e) {
|
||||
if (log.isWarnEnabled()) {
|
||||
log.warn(XMLConstants.ACCESS_EXTERNAL_SCHEMA + " property not supported by " + validator.getClass().getCanonicalName());
|
||||
log.warn(XMLConstants.ACCESS_EXTERNAL_SCHEMA + " property not supported by "
|
||||
+ validator.getClass().getCanonicalName());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -96,8 +96,7 @@ abstract class Jaxp15ValidatorFactory {
|
||||
try {
|
||||
validator.validate(source);
|
||||
return errorHandler.getErrors();
|
||||
}
|
||||
catch (SAXException ex) {
|
||||
} catch (SAXException ex) {
|
||||
throw new XmlValidationException("Could not validate source: " + ex.getMessage(), ex);
|
||||
}
|
||||
}
|
||||
@@ -114,8 +113,7 @@ abstract class Jaxp15ValidatorFactory {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void warning(SAXParseException ex) throws SAXException {
|
||||
}
|
||||
public void warning(SAXParseException ex) throws SAXException {}
|
||||
|
||||
@Override
|
||||
public void error(SAXParseException ex) throws SAXException {
|
||||
|
||||
@@ -35,7 +35,7 @@ public class SchemaFactoryUtils {
|
||||
/**
|
||||
* Build a {@link SchemaFactory} and set properties to prevent external entities from accessing.
|
||||
*
|
||||
* @see SchemaFactory#newInstance(String)
|
||||
* @see SchemaFactory#newInstance(String)
|
||||
*/
|
||||
public static SchemaFactory newInstance(String schemaLanguage) {
|
||||
SchemaFactory schemaFactory = SchemaFactory.newInstance(schemaLanguage);
|
||||
@@ -44,16 +44,19 @@ public class SchemaFactoryUtils {
|
||||
schemaFactory.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, "");
|
||||
} catch (SAXNotRecognizedException | SAXNotSupportedException e) {
|
||||
if (log.isWarnEnabled()) {
|
||||
log.warn(XMLConstants.ACCESS_EXTERNAL_DTD + " property not supported by " + schemaFactory.getClass().getCanonicalName());
|
||||
log.warn(XMLConstants.ACCESS_EXTERNAL_DTD + " property not supported by "
|
||||
+ schemaFactory.getClass().getCanonicalName());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
try {
|
||||
schemaFactory.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ResourceUtils.URL_PROTOCOL_FILE + "," + "jar:file" + "," + ResourceUtils.URL_PROTOCOL_WSJAR);
|
||||
schemaFactory.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA,
|
||||
ResourceUtils.URL_PROTOCOL_FILE + "," + "jar:file" + "," + ResourceUtils.URL_PROTOCOL_WSJAR);
|
||||
} catch (SAXNotRecognizedException | SAXNotSupportedException e) {
|
||||
if (log.isWarnEnabled()) {
|
||||
log.warn(XMLConstants.ACCESS_EXTERNAL_SCHEMA + " property not supported by " + schemaFactory.getClass().getCanonicalName());
|
||||
log.warn(XMLConstants.ACCESS_EXTERNAL_SCHEMA + " property not supported by "
|
||||
+ schemaFactory.getClass().getCanonicalName());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -17,16 +17,16 @@
|
||||
package org.springframework.xml.validation;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import javax.xml.transform.Source;
|
||||
import javax.xml.validation.Schema;
|
||||
import javax.xml.validation.SchemaFactory;
|
||||
|
||||
import org.xml.sax.SAXException;
|
||||
import org.xml.sax.XMLReader;
|
||||
|
||||
import org.springframework.core.io.Resource;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.xml.transform.ResourceSource;
|
||||
import org.xml.sax.SAXException;
|
||||
import org.xml.sax.XMLReader;
|
||||
|
||||
/**
|
||||
* Convenient utility methods for loading of {@link Schema} objects, performing standard handling of input streams.
|
||||
@@ -39,25 +39,25 @@ public abstract class SchemaLoaderUtils {
|
||||
/**
|
||||
* Load schema from the given resource.
|
||||
*
|
||||
* @param resource the resource to load from
|
||||
* @param resource the resource to load from
|
||||
* @param schemaLanguage the language of the schema. Can be {@code XMLConstants.W3C_XML_SCHEMA_NS_URI} or
|
||||
* {@code XMLConstants.RELAXNG_NS_URI}.
|
||||
* @throws IOException if loading failed
|
||||
* {@code XMLConstants.RELAXNG_NS_URI}.
|
||||
* @throws IOException if loading failed
|
||||
* @throws SAXException if loading failed
|
||||
* @see javax.xml.XMLConstants#W3C_XML_SCHEMA_NS_URI
|
||||
* @see javax.xml.XMLConstants#RELAXNG_NS_URI
|
||||
*/
|
||||
public static Schema loadSchema(Resource resource, String schemaLanguage) throws IOException, SAXException {
|
||||
return loadSchema(new Resource[]{resource}, schemaLanguage);
|
||||
return loadSchema(new Resource[] { resource }, schemaLanguage);
|
||||
}
|
||||
|
||||
/**
|
||||
* Load schema from the given resource.
|
||||
*
|
||||
* @param resources the resources to load from
|
||||
* @param resources the resources to load from
|
||||
* @param schemaLanguage the language of the schema. Can be {@code XMLConstants.W3C_XML_SCHEMA_NS_URI} or
|
||||
* {@code XMLConstants.RELAXNG_NS_URI}.
|
||||
* @throws IOException if loading failed
|
||||
* {@code XMLConstants.RELAXNG_NS_URI}.
|
||||
* @throws IOException if loading failed
|
||||
* @throws SAXException if loading failed
|
||||
* @see javax.xml.XMLConstants#W3C_XML_SCHEMA_NS_URI
|
||||
* @see javax.xml.XMLConstants#RELAXNG_NS_URI
|
||||
@@ -81,10 +81,9 @@ public abstract class SchemaLoaderUtils {
|
||||
public static String getSystemId(Resource resource) {
|
||||
try {
|
||||
return resource.getURL().toString();
|
||||
}
|
||||
catch (IOException e) {
|
||||
} catch (IOException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@ import org.xml.sax.SAXParseException;
|
||||
|
||||
/**
|
||||
* Subinterface of {@link ErrorHandler} that allows the registered errors to be retrieved.
|
||||
*
|
||||
* @author Arjen Poutsma
|
||||
* @since 2.0.1
|
||||
*/
|
||||
@@ -28,6 +29,7 @@ public interface ValidationErrorHandler extends ErrorHandler {
|
||||
|
||||
/**
|
||||
* Returns the errors collected by this error handler.
|
||||
*
|
||||
* @return the errors
|
||||
*/
|
||||
SAXParseException[] getErrors();
|
||||
|
||||
@@ -28,7 +28,7 @@ public class XMLReaderFactoryUtils {
|
||||
/**
|
||||
* Build a {@link XMLReader} and set properties to prevent external entity access.
|
||||
*
|
||||
* @see XMLReaderFactory#createXMLReader()
|
||||
* @see XMLReaderFactory#createXMLReader()
|
||||
*/
|
||||
public static XMLReader createXMLReader() throws SAXException {
|
||||
XMLReader xmlReader = XMLReaderFactory.createXMLReader();
|
||||
|
||||
@@ -17,14 +17,15 @@
|
||||
package org.springframework.xml.validation;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import javax.xml.transform.Source;
|
||||
|
||||
import org.xml.sax.SAXParseException;
|
||||
|
||||
/**
|
||||
* Simple processor that validates a given {@link Source}. Can be created via the {@link XmlValidatorFactory}.
|
||||
*
|
||||
* <p>Instances of this class are designed to be thread safe.
|
||||
* <p>
|
||||
* Instances of this class are designed to be thread safe.
|
||||
*
|
||||
* @author Arjen Poutsma
|
||||
* @see XmlValidatorFactory#createValidator(org.springframework.core.io.Resource, String)
|
||||
@@ -33,26 +34,26 @@ import org.xml.sax.SAXParseException;
|
||||
public interface XmlValidator {
|
||||
|
||||
/**
|
||||
* Validates the given {@link Source}, and returns an array of {@link SAXParseException}s as result. The array will
|
||||
* be empty if no validation errors are found.
|
||||
* Validates the given {@link Source}, and returns an array of {@link SAXParseException}s as result. The array will be
|
||||
* empty if no validation errors are found.
|
||||
*
|
||||
* @param source the input document
|
||||
* @return an array of {@code SAXParseException}s
|
||||
* @throws IOException if the {@code source} cannot be read
|
||||
* @throws IOException if the {@code source} cannot be read
|
||||
* @throws XmlValidationException if the {@code source} cannot be validated
|
||||
*/
|
||||
SAXParseException[] validate(Source source) throws IOException;
|
||||
|
||||
/**
|
||||
* Validates the given {@link Source} and {@link ValidationErrorHandler}, and returns an array of {@link
|
||||
* SAXParseException}s as result. The array will be empty if no validation errors are found.
|
||||
* Validates the given {@link Source} and {@link ValidationErrorHandler}, and returns an array of
|
||||
* {@link SAXParseException}s as result. The array will be empty if no validation errors are found.
|
||||
*
|
||||
* @param source the input document
|
||||
* @param errorHandler the error handler to use. May be {@code null}, in which case a default will be used.
|
||||
* @return an array of {@code SAXParseException}s
|
||||
* @throws IOException if the {@code source} cannot be read
|
||||
* @throws IOException if the {@code source} cannot be read
|
||||
* @throws XmlValidationException if the {@code source} cannot be validated
|
||||
*/
|
||||
SAXParseException[] validate(Source source, ValidationErrorHandler errorHandler) throws IOException;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,11 +17,11 @@
|
||||
package org.springframework.xml.validation;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import javax.xml.validation.Validator;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import org.springframework.core.io.Resource;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.xml.JaxpVersion;
|
||||
@@ -29,8 +29,8 @@ import org.springframework.xml.JaxpVersion;
|
||||
/**
|
||||
* Factory for {@link XmlValidator} objects, being aware of JAXP 1.3 {@link Validator}s, and JAXP 1.0 parsing
|
||||
* capabilities. Mainly for internal use within the framework.
|
||||
*
|
||||
* <p>The goal of this class is to avoid runtime dependencies on JAXP 1.3 by using the best validation implementation that
|
||||
* <p>
|
||||
* The goal of this class is to avoid runtime dependencies on JAXP 1.3 by using the best validation implementation that
|
||||
* is available. Prefers JAXP 1.3 {@link XmlValidator} implementations to a custom, SAX-based implementation.
|
||||
*
|
||||
* @author Arjen Poutsma
|
||||
@@ -48,34 +48,34 @@ public abstract class XmlValidatorFactory {
|
||||
public static final String SCHEMA_RELAX_NG = "http://relaxng.org/ns/structure/1.0";
|
||||
|
||||
/**
|
||||
* Create a {@link XmlValidator} with the given schema resource and schema language type. The schema language must
|
||||
* be one of the {@code SCHEMA_XXX} constants.
|
||||
* Create a {@link XmlValidator} with the given schema resource and schema language type. The schema language must be
|
||||
* one of the {@code SCHEMA_XXX} constants.
|
||||
*
|
||||
* @param schemaResource a resource that locates the schema to validate against
|
||||
* @param schemaLanguage the language of the schema
|
||||
* @return a validator
|
||||
* @throws IOException if the schema resource cannot be read
|
||||
* @throws IOException if the schema resource cannot be read
|
||||
* @throws IllegalArgumentException if the schema language is not supported
|
||||
* @throws IllegalStateException if JAXP 1.0 cannot be located
|
||||
* @throws XmlValidationException if a {@code XmlValidator} cannot be created
|
||||
* @throws IllegalStateException if JAXP 1.0 cannot be located
|
||||
* @throws XmlValidationException if a {@code XmlValidator} cannot be created
|
||||
* @see #SCHEMA_RELAX_NG
|
||||
* @see #SCHEMA_W3C_XML
|
||||
*/
|
||||
public static XmlValidator createValidator(Resource schemaResource, String schemaLanguage) throws IOException {
|
||||
return createValidator(new Resource[]{schemaResource}, schemaLanguage);
|
||||
return createValidator(new Resource[] { schemaResource }, schemaLanguage);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a {@link XmlValidator} with the given schema resources and schema language type. The schema language must
|
||||
* be one of the {@code SCHEMA_XXX} constants.
|
||||
* Create a {@link XmlValidator} with the given schema resources and schema language type. The schema language must be
|
||||
* one of the {@code SCHEMA_XXX} constants.
|
||||
*
|
||||
* @param schemaResources an array of resource that locate the schemas to validate against
|
||||
* @param schemaLanguage the language of the schemas
|
||||
* @param schemaLanguage the language of the schemas
|
||||
* @return a validator
|
||||
* @throws IOException if the schema resource cannot be read
|
||||
* @throws IOException if the schema resource cannot be read
|
||||
* @throws IllegalArgumentException if the schema language is not supported
|
||||
* @throws IllegalStateException if JAXP 1.0 cannot be located
|
||||
* @throws XmlValidationException if a {@code XmlValidator} cannot be created
|
||||
* @throws IllegalStateException if JAXP 1.0 cannot be located
|
||||
* @throws XmlValidationException if a {@code XmlValidator} cannot be created
|
||||
* @see #SCHEMA_RELAX_NG
|
||||
* @see #SCHEMA_W3C_XML
|
||||
*/
|
||||
@@ -91,12 +91,10 @@ public abstract class XmlValidatorFactory {
|
||||
if (JaxpVersion.getJaxpVersion() >= JaxpVersion.JAXP_15) {
|
||||
logger.trace("Creating JAXP 1.5 XmlValidator");
|
||||
return Jaxp15ValidatorFactory.createValidator(schemaResources, schemaLanguage);
|
||||
}
|
||||
else if (JaxpVersion.getJaxpVersion() >= JaxpVersion.JAXP_13) {
|
||||
} else if (JaxpVersion.getJaxpVersion() >= JaxpVersion.JAXP_13) {
|
||||
logger.trace("Creating JAXP 1.3 XmlValidator");
|
||||
return Jaxp13ValidatorFactory.createValidator(schemaResources, schemaLanguage);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
throw new IllegalStateException("Could not locate JAXP 1.3.");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,17 +17,17 @@
|
||||
package org.springframework.xml.xpath;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import javax.xml.transform.Source;
|
||||
import javax.xml.transform.TransformerException;
|
||||
import javax.xml.transform.dom.DOMResult;
|
||||
|
||||
import org.springframework.xml.transform.TransformerObjectSupport;
|
||||
import org.w3c.dom.DOMException;
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
import org.w3c.dom.Node;
|
||||
|
||||
import org.springframework.xml.transform.TransformerObjectSupport;
|
||||
|
||||
/**
|
||||
* Abstract base class for implementations of {@link XPathOperations}. Contains a namespaces property.
|
||||
*
|
||||
|
||||
@@ -48,8 +48,7 @@ abstract class JaxenXPathExpressionFactory {
|
||||
try {
|
||||
XPath xpath = new DOMXPath(expression);
|
||||
return new JaxenXpathExpression(xpath, expression);
|
||||
}
|
||||
catch (JaxenException ex) {
|
||||
} catch (JaxenException ex) {
|
||||
throw new org.springframework.xml.xpath.XPathParseException(
|
||||
"Could not compile [" + expression + "] to a XPathExpression: " + ex.getMessage(), ex);
|
||||
}
|
||||
@@ -68,8 +67,7 @@ abstract class JaxenXPathExpressionFactory {
|
||||
XPath xpath = new DOMXPath(expression);
|
||||
xpath.setNamespaceContext(new SimpleNamespaceContext(namespaces));
|
||||
return new JaxenXpathExpression(xpath, expression);
|
||||
}
|
||||
catch (JaxenException ex) {
|
||||
} catch (JaxenException ex) {
|
||||
throw new org.springframework.xml.xpath.XPathParseException(
|
||||
"Could not compile [" + expression + "] to a XPathExpression: " + ex.getMessage(), ex);
|
||||
}
|
||||
@@ -95,8 +93,7 @@ abstract class JaxenXPathExpressionFactory {
|
||||
public Node evaluateAsNode(Node node) {
|
||||
try {
|
||||
return (Node) xpath.selectSingleNode(node);
|
||||
}
|
||||
catch (JaxenException ex) {
|
||||
} catch (JaxenException ex) {
|
||||
throw new XPathException("Could not evaluate XPath expression [" + xpath + "] :" + ex.getMessage(), ex);
|
||||
}
|
||||
}
|
||||
@@ -105,8 +102,7 @@ abstract class JaxenXPathExpressionFactory {
|
||||
public boolean evaluateAsBoolean(Node node) {
|
||||
try {
|
||||
return xpath.booleanValueOf(node);
|
||||
}
|
||||
catch (JaxenException ex) {
|
||||
} catch (JaxenException ex) {
|
||||
throw new XPathException("Could not evaluate XPath expression [" + xpath + "] :" + ex.getMessage(), ex);
|
||||
}
|
||||
}
|
||||
@@ -115,8 +111,7 @@ abstract class JaxenXPathExpressionFactory {
|
||||
public double evaluateAsNumber(Node node) {
|
||||
try {
|
||||
return xpath.numberValueOf(node).doubleValue();
|
||||
}
|
||||
catch (JaxenException ex) {
|
||||
} catch (JaxenException ex) {
|
||||
throw new XPathException("Could not evaluate XPath expression [" + xpath + "] :" + ex.getMessage(), ex);
|
||||
}
|
||||
}
|
||||
@@ -125,8 +120,7 @@ abstract class JaxenXPathExpressionFactory {
|
||||
public String evaluateAsString(Node node) {
|
||||
try {
|
||||
return xpath.stringValueOf(node);
|
||||
}
|
||||
catch (JaxenException ex) {
|
||||
} catch (JaxenException ex) {
|
||||
throw new XPathException("Could not evaluate XPath expression [" + xpath + "] :" + ex.getMessage(), ex);
|
||||
}
|
||||
}
|
||||
@@ -136,8 +130,7 @@ abstract class JaxenXPathExpressionFactory {
|
||||
public List<Node> evaluateAsNodeList(Node node) {
|
||||
try {
|
||||
return xpath.selectNodes(node);
|
||||
}
|
||||
catch (JaxenException ex) {
|
||||
} catch (JaxenException ex) {
|
||||
throw new XPathException("Could not evaluate XPath expression [" + xpath + "] :" + ex.getMessage(), ex);
|
||||
}
|
||||
}
|
||||
@@ -149,16 +142,13 @@ abstract class JaxenXPathExpressionFactory {
|
||||
if (result != null) {
|
||||
try {
|
||||
return nodeMapper.mapNode(result, 0);
|
||||
}
|
||||
catch (DOMException ex) {
|
||||
} catch (DOMException ex) {
|
||||
throw new XPathException("Mapping resulted in DOMException", ex);
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
catch (JaxenException ex) {
|
||||
} catch (JaxenException ex) {
|
||||
throw new XPathException("Could not evaluate XPath expression [" + xpath + "] :" + ex.getMessage(), ex);
|
||||
}
|
||||
}
|
||||
@@ -172,14 +162,12 @@ abstract class JaxenXPathExpressionFactory {
|
||||
Node node = (Node) nodes.get(i);
|
||||
try {
|
||||
results.add(nodeMapper.mapNode(node, i));
|
||||
}
|
||||
catch (DOMException ex) {
|
||||
} catch (DOMException ex) {
|
||||
throw new XPathException("Mapping resulted in DOMException", ex);
|
||||
}
|
||||
}
|
||||
return results;
|
||||
}
|
||||
catch (JaxenException ex) {
|
||||
} catch (JaxenException ex) {
|
||||
throw new XPathException("Could not evaluate XPath expression [" + xpath + "] :" + ex.getMessage(), ex);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@ package org.springframework.xml.xpath;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.xml.transform.Source;
|
||||
import javax.xml.transform.TransformerException;
|
||||
|
||||
@@ -31,8 +32,8 @@ import org.w3c.dom.Node;
|
||||
|
||||
/**
|
||||
* Implementation of {@link XPathOperations} that uses Jaxen.
|
||||
*
|
||||
* <p>Namespaces can be set using the {@code namespaces} property.
|
||||
* <p>
|
||||
* Namespaces can be set using the {@code namespaces} property.
|
||||
*
|
||||
* @author Arjen Poutsma
|
||||
* @see <a href="http://www.jaxen.org/">Jaxen</a>
|
||||
@@ -46,11 +47,9 @@ public class JaxenXPathTemplate extends AbstractXPathTemplate {
|
||||
XPath xpath = createXPath(expression);
|
||||
Element element = getRootElement(context);
|
||||
return xpath.booleanValueOf(element);
|
||||
}
|
||||
catch (JaxenException ex) {
|
||||
} catch (JaxenException ex) {
|
||||
throw new XPathException("Could not evaluate XPath expression [" + expression + "]", ex);
|
||||
}
|
||||
catch (TransformerException ex) {
|
||||
} catch (TransformerException ex) {
|
||||
throw new XPathException("Could not transform context to DOM Node", ex);
|
||||
}
|
||||
}
|
||||
@@ -61,11 +60,9 @@ public class JaxenXPathTemplate extends AbstractXPathTemplate {
|
||||
XPath xpath = createXPath(expression);
|
||||
Element element = getRootElement(context);
|
||||
return (Node) xpath.selectSingleNode(element);
|
||||
}
|
||||
catch (JaxenException ex) {
|
||||
} catch (JaxenException ex) {
|
||||
throw new XPathException("Could not evaluate XPath expression [" + expression + "]", ex);
|
||||
}
|
||||
catch (TransformerException ex) {
|
||||
} catch (TransformerException ex) {
|
||||
throw new XPathException("Could not transform context to DOM Node", ex);
|
||||
}
|
||||
}
|
||||
@@ -77,11 +74,9 @@ public class JaxenXPathTemplate extends AbstractXPathTemplate {
|
||||
XPath xpath = createXPath(expression);
|
||||
Element element = getRootElement(context);
|
||||
return xpath.selectNodes(element);
|
||||
}
|
||||
catch (JaxenException ex) {
|
||||
} catch (JaxenException ex) {
|
||||
throw new XPathException("Could not evaluate XPath expression [" + expression + "]", ex);
|
||||
}
|
||||
catch (TransformerException ex) {
|
||||
} catch (TransformerException ex) {
|
||||
throw new XPathException("Could not transform context to DOM Node", ex);
|
||||
}
|
||||
}
|
||||
@@ -92,11 +87,9 @@ public class JaxenXPathTemplate extends AbstractXPathTemplate {
|
||||
XPath xpath = createXPath(expression);
|
||||
Element element = getRootElement(context);
|
||||
return xpath.numberValueOf(element).doubleValue();
|
||||
}
|
||||
catch (JaxenException ex) {
|
||||
} catch (JaxenException ex) {
|
||||
throw new XPathException("Could not evaluate XPath expression [" + expression + "]", ex);
|
||||
}
|
||||
catch (TransformerException ex) {
|
||||
} catch (TransformerException ex) {
|
||||
throw new XPathException("Could not transform context to DOM Node", ex);
|
||||
}
|
||||
}
|
||||
@@ -107,11 +100,9 @@ public class JaxenXPathTemplate extends AbstractXPathTemplate {
|
||||
XPath xpath = createXPath(expression);
|
||||
Element element = getRootElement(context);
|
||||
return xpath.stringValueOf(element);
|
||||
}
|
||||
catch (JaxenException ex) {
|
||||
} catch (JaxenException ex) {
|
||||
throw new XPathException("Could not evaluate XPath expression [" + expression + "]", ex);
|
||||
}
|
||||
catch (TransformerException ex) {
|
||||
} catch (TransformerException ex) {
|
||||
throw new XPathException("Could not transform context to DOM Node", ex);
|
||||
}
|
||||
}
|
||||
@@ -125,20 +116,16 @@ public class JaxenXPathTemplate extends AbstractXPathTemplate {
|
||||
if (node != null) {
|
||||
try {
|
||||
return nodeMapper.mapNode(node, 0);
|
||||
}
|
||||
catch (DOMException ex) {
|
||||
} catch (DOMException ex) {
|
||||
throw new XPathException("Mapping resulted in DOMException", ex);
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
catch (JaxenException ex) {
|
||||
} catch (JaxenException ex) {
|
||||
throw new XPathException("Could not evaluate XPath expression [" + expression + "]", ex);
|
||||
}
|
||||
catch (TransformerException ex) {
|
||||
} catch (TransformerException ex) {
|
||||
throw new XPathException("Could not transform context to DOM Node", ex);
|
||||
}
|
||||
}
|
||||
@@ -154,17 +141,14 @@ public class JaxenXPathTemplate extends AbstractXPathTemplate {
|
||||
Node node = (Node) nodes.get(i);
|
||||
try {
|
||||
results.add(nodeMapper.mapNode(node, i));
|
||||
}
|
||||
catch (DOMException ex) {
|
||||
} catch (DOMException ex) {
|
||||
throw new XPathException("Mapping resulted in DOMException", ex);
|
||||
}
|
||||
}
|
||||
return results;
|
||||
}
|
||||
catch (JaxenException ex) {
|
||||
} catch (JaxenException ex) {
|
||||
throw new XPathException("Could not evaluate XPath expression [" + expression + "]", ex);
|
||||
}
|
||||
catch (TransformerException ex) {
|
||||
} catch (TransformerException ex) {
|
||||
throw new XPathException("Could not transform context to DOM Node", ex);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,18 +19,18 @@ package org.springframework.xml.xpath;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.xml.namespace.QName;
|
||||
import javax.xml.xpath.XPath;
|
||||
import javax.xml.xpath.XPathConstants;
|
||||
import javax.xml.xpath.XPathExpressionException;
|
||||
import javax.xml.xpath.XPathFactory;
|
||||
|
||||
import org.springframework.xml.namespace.SimpleNamespaceContext;
|
||||
import org.w3c.dom.DOMException;
|
||||
import org.w3c.dom.Node;
|
||||
import org.w3c.dom.NodeList;
|
||||
|
||||
import org.springframework.xml.namespace.SimpleNamespaceContext;
|
||||
|
||||
/**
|
||||
* JAXP 1.3-specific factory creating {@link XPathExpression} objects.
|
||||
*
|
||||
@@ -55,8 +55,7 @@ abstract class Jaxp13XPathExpressionFactory {
|
||||
XPath xpath = createXPath();
|
||||
javax.xml.xpath.XPathExpression xpathExpression = xpath.compile(expression);
|
||||
return new Jaxp13XPathExpression(xpathExpression, expression);
|
||||
}
|
||||
catch (XPathExpressionException ex) {
|
||||
} catch (XPathExpressionException ex) {
|
||||
throw new org.springframework.xml.xpath.XPathParseException(
|
||||
"Could not compile [" + expression + "] to a XPathExpression: " + ex.getMessage(), ex);
|
||||
}
|
||||
@@ -78,8 +77,7 @@ abstract class Jaxp13XPathExpressionFactory {
|
||||
xpath.setNamespaceContext(namespaceContext);
|
||||
javax.xml.xpath.XPathExpression xpathExpression = xpath.compile(expression);
|
||||
return new Jaxp13XPathExpression(xpathExpression, expression);
|
||||
}
|
||||
catch (XPathExpressionException ex) {
|
||||
} catch (XPathExpressionException ex) {
|
||||
throw new org.springframework.xml.xpath.XPathParseException(
|
||||
"Could not compile [" + expression + "] to a XPathExpression: " + ex.getMessage(), ex);
|
||||
}
|
||||
@@ -89,7 +87,6 @@ abstract class Jaxp13XPathExpressionFactory {
|
||||
return xpathFactory.newXPath();
|
||||
}
|
||||
|
||||
|
||||
/** JAXP 1.3 implementation of the {@code XPathExpression} interface. */
|
||||
private static class Jaxp13XPathExpression implements XPathExpression {
|
||||
|
||||
@@ -123,8 +120,7 @@ abstract class Jaxp13XPathExpressionFactory {
|
||||
synchronized (xpathExpression) {
|
||||
return xpathExpression.evaluate(node, returnType);
|
||||
}
|
||||
}
|
||||
catch (XPathExpressionException ex) {
|
||||
} catch (XPathExpressionException ex) {
|
||||
throw new XPathException("Could not evaluate XPath expression:" + ex.getMessage(), ex);
|
||||
}
|
||||
}
|
||||
@@ -158,12 +154,10 @@ abstract class Jaxp13XPathExpressionFactory {
|
||||
if (result != null) {
|
||||
try {
|
||||
return nodeMapper.mapNode(result, 0);
|
||||
}
|
||||
catch (DOMException ex) {
|
||||
} catch (DOMException ex) {
|
||||
throw new XPathException("Mapping resulted in DOMException", ex);
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -175,8 +169,7 @@ abstract class Jaxp13XPathExpressionFactory {
|
||||
for (int i = 0; i < nodes.getLength(); i++) {
|
||||
try {
|
||||
results.add(nodeMapper.mapNode(nodes.item(i), i));
|
||||
}
|
||||
catch (DOMException ex) {
|
||||
} catch (DOMException ex) {
|
||||
throw new XPathException("Mapping resulted in DOMException", ex);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,6 +20,7 @@ import java.io.InputStream;
|
||||
import java.io.Reader;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.xml.namespace.QName;
|
||||
import javax.xml.stream.XMLEventReader;
|
||||
import javax.xml.stream.XMLStreamException;
|
||||
@@ -33,6 +34,10 @@ import javax.xml.xpath.XPathExpressionException;
|
||||
import javax.xml.xpath.XPathFactory;
|
||||
import javax.xml.xpath.XPathFactoryConfigurationException;
|
||||
|
||||
import org.springframework.util.xml.StaxUtils;
|
||||
import org.springframework.xml.namespace.SimpleNamespaceContext;
|
||||
import org.springframework.xml.transform.TransformerHelper;
|
||||
import org.springframework.xml.transform.TraxUtils;
|
||||
import org.w3c.dom.DOMException;
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
@@ -41,15 +46,10 @@ import org.w3c.dom.NodeList;
|
||||
import org.xml.sax.InputSource;
|
||||
import org.xml.sax.XMLReader;
|
||||
|
||||
import org.springframework.util.xml.StaxUtils;
|
||||
import org.springframework.xml.namespace.SimpleNamespaceContext;
|
||||
import org.springframework.xml.transform.TransformerHelper;
|
||||
import org.springframework.xml.transform.TraxUtils;
|
||||
|
||||
/**
|
||||
* Implementation of {@link XPathOperations} that uses JAXP 1.3. JAXP 1.3 is part of Java SE since 1.5.
|
||||
*
|
||||
* <p>Namespaces can be set using the {@code namespaces} property.
|
||||
* <p>
|
||||
* Namespaces can be set using the {@code namespaces} property.
|
||||
*
|
||||
* @author Arjen Poutsma
|
||||
* @see #setNamespaces(java.util.Map)
|
||||
@@ -66,8 +66,7 @@ public class Jaxp13XPathTemplate extends AbstractXPathTemplate {
|
||||
public Jaxp13XPathTemplate(String xpathFactoryUri) {
|
||||
try {
|
||||
xpathFactory = XPathFactory.newInstance(xpathFactoryUri);
|
||||
}
|
||||
catch (XPathFactoryConfigurationException ex) {
|
||||
} catch (XPathFactoryConfigurationException ex) {
|
||||
throw new XPathException("Could not create XPathFactory", ex);
|
||||
}
|
||||
}
|
||||
@@ -110,12 +109,10 @@ public class Jaxp13XPathTemplate extends AbstractXPathTemplate {
|
||||
if (node != null) {
|
||||
try {
|
||||
return nodeMapper.mapNode(node, 0);
|
||||
}
|
||||
catch (DOMException ex) {
|
||||
} catch (DOMException ex) {
|
||||
throw new XPathException("Mapping resulted in DOMException", ex);
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -127,8 +124,7 @@ public class Jaxp13XPathTemplate extends AbstractXPathTemplate {
|
||||
for (int i = 0; i < nodes.getLength(); i++) {
|
||||
try {
|
||||
results.add(nodeMapper.mapNode(nodes.item(i), i));
|
||||
}
|
||||
catch (DOMException ex) {
|
||||
} catch (DOMException ex) {
|
||||
throw new XPathException("Mapping resulted in DOMException", ex);
|
||||
}
|
||||
}
|
||||
@@ -146,14 +142,11 @@ public class Jaxp13XPathTemplate extends AbstractXPathTemplate {
|
||||
EvaluationCallback callback = new EvaluationCallback(xpath, expression, returnType);
|
||||
TraxUtils.doWithSource(context, callback);
|
||||
return callback.result;
|
||||
}
|
||||
catch (javax.xml.xpath.XPathException ex) {
|
||||
} catch (javax.xml.xpath.XPathException ex) {
|
||||
throw new XPathException("Could not evaluate XPath expression [" + expression + "]", ex);
|
||||
}
|
||||
catch (TransformerException ex) {
|
||||
} catch (TransformerException ex) {
|
||||
throw new XPathException("Could not transform context to DOM Node", ex);
|
||||
}
|
||||
catch (Exception ex) {
|
||||
} catch (Exception ex) {
|
||||
throw new XPathException(ex.getMessage(), ex);
|
||||
}
|
||||
}
|
||||
@@ -231,6 +224,4 @@ public class Jaxp13XPathTemplate extends AbstractXPathTemplate {
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -23,8 +23,8 @@ import org.w3c.dom.Node;
|
||||
* An interface used by {@link XPathOperations} implementations for processing {@link Node} objects on a per-node basis.
|
||||
* Implementations of this interface perform the actual work of processing nodes, but don't need to worry about
|
||||
* exception handling.
|
||||
*
|
||||
* <p>Consider using a {@link NodeMapper} instead if you need to map exactly result object per node, assembling them in a
|
||||
* <p>
|
||||
* Consider using a {@link NodeMapper} instead if you need to map exactly result object per node, assembling them in a
|
||||
* List.
|
||||
*
|
||||
* @author Arjen Poutsma
|
||||
|
||||
@@ -36,7 +36,7 @@ public interface NodeMapper<T> {
|
||||
/**
|
||||
* Maps a single node to an arbitrary object.
|
||||
*
|
||||
* @param node the node to map
|
||||
* @param node the node to map
|
||||
* @param nodeNum the number of the current node
|
||||
* @return object for the current node
|
||||
* @throws DOMException in case of DOM errors
|
||||
|
||||
@@ -39,7 +39,7 @@ public class XPathException extends XmlException {
|
||||
/**
|
||||
* Constructs a new instance of the {@code XPathException} with the specific detail message and exception.
|
||||
*
|
||||
* @param message the detail message
|
||||
* @param message the detail message
|
||||
* @param throwable the wrapped exception
|
||||
*/
|
||||
public XPathException(String message, Throwable throwable) {
|
||||
|
||||
@@ -21,10 +21,10 @@ import java.util.List;
|
||||
import org.w3c.dom.Node;
|
||||
|
||||
/**
|
||||
* Defines the contract for a precompiled XPath expression. Concrete instances can be obtained through the {@link
|
||||
* XPathExpressionFactory}.
|
||||
*
|
||||
* <p>Implementations of this interface are precompiled, and thus faster, but less flexible, than the XPath expressions
|
||||
* Defines the contract for a precompiled XPath expression. Concrete instances can be obtained through the
|
||||
* {@link XPathExpressionFactory}.
|
||||
* <p>
|
||||
* Implementations of this interface are precompiled, and thus faster, but less flexible, than the XPath expressions
|
||||
* used by {@link XPathOperations} implementations.
|
||||
*
|
||||
* @author Arjen Poutsma
|
||||
@@ -35,13 +35,12 @@ public interface XPathExpression {
|
||||
/**
|
||||
* Evaluates the given expression as a {@code boolean}. Returns the boolean evaluation of the expression, or
|
||||
* {@code false} if it is invalid.
|
||||
*
|
||||
* <p>The return value is determined per the {@code boolean()} function defined in the XPath specification.
|
||||
* This means that an expression that selects zero nodes will return {@code false}, while an expression that
|
||||
* selects one or more nodes will return {@code true}.
|
||||
* An expression that returns a string returns {@code false} for empty strings and {@code true} for all other
|
||||
* strings.
|
||||
* An expression that returns a number returns {@code false} for zero and {@code true} for non-zero numbers.
|
||||
* <p>
|
||||
* The return value is determined per the {@code boolean()} function defined in the XPath specification. This means
|
||||
* that an expression that selects zero nodes will return {@code false}, while an expression that selects one or more
|
||||
* nodes will return {@code true}. An expression that returns a string returns {@code false} for empty strings and
|
||||
* {@code true} for all other strings. An expression that returns a number returns {@code false} for zero and
|
||||
* {@code true} for non-zero numbers.
|
||||
*
|
||||
* @param node the starting point
|
||||
* @return the result of the evaluation
|
||||
@@ -51,8 +50,8 @@ public interface XPathExpression {
|
||||
boolean evaluateAsBoolean(Node node) throws XPathException;
|
||||
|
||||
/**
|
||||
* Evaluates the given expression as a {@link Node}. Returns the evaluation of the expression, or {@code null}
|
||||
* if it is invalid.
|
||||
* Evaluates the given expression as a {@link Node}. Returns the evaluation of the expression, or {@code null} if it
|
||||
* is invalid.
|
||||
*
|
||||
* @param node the starting point
|
||||
* @return the result of the evaluation
|
||||
@@ -73,11 +72,11 @@ public interface XPathExpression {
|
||||
List<Node> evaluateAsNodeList(Node node) throws XPathException;
|
||||
|
||||
/**
|
||||
* Evaluates the given expression as a number ({@code double}). Returns the numeric evaluation of the
|
||||
* expression, or {@link Double#NaN} if it is invalid.
|
||||
*
|
||||
* <p>The return value is determined per the {@code number()} function as defined in the XPath specification.
|
||||
* This means that if the expression selects multiple nodes, it will return the number value of the first node.
|
||||
* Evaluates the given expression as a number ({@code double}). Returns the numeric evaluation of the expression, or
|
||||
* {@link Double#NaN} if it is invalid.
|
||||
* <p>
|
||||
* The return value is determined per the {@code number()} function as defined in the XPath specification. This means
|
||||
* that if the expression selects multiple nodes, it will return the number value of the first node.
|
||||
*
|
||||
* @param node the starting point
|
||||
* @return the result of the evaluation
|
||||
@@ -88,9 +87,9 @@ public interface XPathExpression {
|
||||
|
||||
/**
|
||||
* Evaluates the given expression as a String. Returns {@code null} if no result could be found.
|
||||
*
|
||||
* <p>The return value is determined per the {@code string()} function as defined in the XPath specification.
|
||||
* This means that if the expression selects multiple nodes, it will return the string value of the first node.
|
||||
* <p>
|
||||
* The return value is determined per the {@code string()} function as defined in the XPath specification. This means
|
||||
* that if the expression selects multiple nodes, it will return the string value of the first node.
|
||||
*
|
||||
* @param node the starting point
|
||||
* @return the result of the evaluation
|
||||
@@ -102,7 +101,7 @@ public interface XPathExpression {
|
||||
/**
|
||||
* Evaluates the given expression, mapping a single {@link Node} result to a Java object via a {@link NodeMapper}.
|
||||
*
|
||||
* @param node the starting point
|
||||
* @param node the starting point
|
||||
* @param nodeMapper object that will map one object per node
|
||||
* @return the single mapped object
|
||||
* @throws XPathException in case of XPath errors
|
||||
@@ -111,10 +110,9 @@ public interface XPathExpression {
|
||||
<T> T evaluateAsObject(Node node, NodeMapper<T> nodeMapper) throws XPathException;
|
||||
|
||||
/**
|
||||
* Evaluates the given expression, mapping each result {@link Node} objects to a Java object via a {@link
|
||||
* NodeMapper}.
|
||||
* Evaluates the given expression, mapping each result {@link Node} objects to a Java object via a {@link NodeMapper}.
|
||||
*
|
||||
* @param node the starting point
|
||||
* @param node the starting point
|
||||
* @param nodeMapper object that will map one object per node
|
||||
* @return the result list, containing mapped objects
|
||||
* @throws XPathException in case of XPath errors
|
||||
|
||||
@@ -19,16 +19,15 @@ package org.springframework.xml.xpath;
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
/**
|
||||
* Factory for compiled {@code XPathExpression}s, being aware of JAXP 1.3+ XPath functionality, and Jaxen. Mainly
|
||||
* for internal use of the framework.
|
||||
*
|
||||
* <p>The goal of this class is to avoid runtime dependencies a specific XPath engine, simply using the best XPath
|
||||
* Factory for compiled {@code XPathExpression}s, being aware of JAXP 1.3+ XPath functionality, and Jaxen. Mainly for
|
||||
* internal use of the framework.
|
||||
* <p>
|
||||
* The goal of this class is to avoid runtime dependencies a specific XPath engine, simply using the best XPath
|
||||
* implementation that is available. Prefers JAXP 1.3+ XPath implementations to Jaxen.
|
||||
*
|
||||
* @author Arjen Poutsma
|
||||
@@ -45,11 +44,11 @@ public abstract class XPathExpressionFactory {
|
||||
* @param expression the XPath expression
|
||||
* @return the compiled XPath expression
|
||||
* @throws IllegalStateException if neither JAXP 1.3+, or Jaxen are available
|
||||
* @throws XPathParseException if the given expression cannot be parsed
|
||||
* @throws XPathParseException if the given expression cannot be parsed
|
||||
*/
|
||||
public static XPathExpression createXPathExpression(String expression)
|
||||
throws IllegalStateException, XPathParseException {
|
||||
return createXPathExpression(expression, Collections.<String, String>emptyMap());
|
||||
return createXPathExpression(expression, Collections.<String, String> emptyMap());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -60,7 +59,7 @@ public abstract class XPathExpressionFactory {
|
||||
* @param namespaces a map that binds string prefixes to string namespaces
|
||||
* @return the compiled XPath expression
|
||||
* @throws IllegalStateException if neither JAXP 1.3+, or Jaxen are available
|
||||
* @throws XPathParseException if the given expression cannot be parsed
|
||||
* @throws XPathParseException if the given expression cannot be parsed
|
||||
*/
|
||||
public static XPathExpression createXPathExpression(String expression, Map<String, String> namespaces)
|
||||
throws IllegalStateException, XPathParseException {
|
||||
@@ -71,11 +70,9 @@ public abstract class XPathExpressionFactory {
|
||||
try {
|
||||
logger.trace("Creating [javax.xml.xpath.XPathExpression]");
|
||||
return Jaxp13XPathExpressionFactory.createXPathExpression(expression, namespaces);
|
||||
}
|
||||
catch (XPathException e) {
|
||||
} catch (XPathException e) {
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -26,8 +26,8 @@ import org.springframework.util.CollectionUtils;
|
||||
/**
|
||||
* Spring {@link FactoryBean} for {@link XPathExpression} object. Facilitates injection of XPath expressions into
|
||||
* endpoint beans.
|
||||
*
|
||||
* <p>Uses {@link XPathExpressionFactory} underneath, so support is provided for JAXP 1.3, and Jaxen XPaths.
|
||||
* <p>
|
||||
* Uses {@link XPathExpressionFactory} underneath, so support is provided for JAXP 1.3, and Jaxen XPaths.
|
||||
*
|
||||
* @author Arjen Poutsma
|
||||
* @see #setExpression(String)
|
||||
@@ -56,8 +56,7 @@ public class XPathExpressionFactoryBean implements FactoryBean<XPathExpression>,
|
||||
Assert.notNull(expressionString, "expression is required");
|
||||
if (CollectionUtils.isEmpty(namespaces)) {
|
||||
expression = XPathExpressionFactory.createXPathExpression(expressionString);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
expression = XPathExpressionFactory.createXPathExpression(expressionString, namespaces);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
package org.springframework.xml.xpath;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import javax.xml.transform.Source;
|
||||
|
||||
import org.w3c.dom.Node;
|
||||
@@ -24,9 +25,10 @@ import org.w3c.dom.Node;
|
||||
/**
|
||||
* Interface that specifies a basic set of XPath operations, implemented by various XPathTemplates. Contains numerous
|
||||
* evaluation methods,
|
||||
*
|
||||
* <p>The templates that implement this interface do not use precompiled XPath expressions. Consider using the {@link
|
||||
* XPathExpressionFactory} or the {@link XPathExpressionFactoryBean} for optimal performance, but less flexibility.
|
||||
* <p>
|
||||
* The templates that implement this interface do not use precompiled XPath expressions. Consider using the
|
||||
* {@link XPathExpressionFactory} or the {@link XPathExpressionFactoryBean} for optimal performance, but less
|
||||
* flexibility.
|
||||
*
|
||||
* @author Arjen Poutsma
|
||||
* @see Jaxp13XPathTemplate
|
||||
@@ -38,16 +40,15 @@ public interface XPathOperations {
|
||||
/**
|
||||
* Evaluates the given expression as a {@code boolean}. Returns the boolean evaluation of the expression, or
|
||||
* {@code false} if it is invalid.
|
||||
*
|
||||
* <p>The return value is determined per the {@code boolean()} function defined in the XPath specification.
|
||||
* This means that an expression that selects zero nodes will return {@code false}, while an expression that
|
||||
* selects one or more nodes will return {@code true}.
|
||||
* An expression that returns a string returns {@code false} for empty strings and {@code true} for all other
|
||||
* strings.
|
||||
* An expression that returns a number returns {@code false} for zero and {@code true} for non-zero numbers.
|
||||
* <p>
|
||||
* The return value is determined per the {@code boolean()} function defined in the XPath specification. This means
|
||||
* that an expression that selects zero nodes will return {@code false}, while an expression that selects one or more
|
||||
* nodes will return {@code true}. An expression that returns a string returns {@code false} for empty strings and
|
||||
* {@code true} for all other strings. An expression that returns a number returns {@code false} for zero and
|
||||
* {@code true} for non-zero numbers.
|
||||
*
|
||||
* @param expression the XPath expression
|
||||
* @param context the context starting point
|
||||
* @param context the context starting point
|
||||
* @return the result of the evaluation
|
||||
* @throws XPathException in case of XPath errors
|
||||
* @see <a href="http://www.w3.org/TR/xpath/#function-boolean">XPath specification - boolean() function</a>
|
||||
@@ -55,11 +56,11 @@ public interface XPathOperations {
|
||||
boolean evaluateAsBoolean(String expression, Source context) throws XPathException;
|
||||
|
||||
/**
|
||||
* Evaluates the given expression as a {@link Node}. Returns the evaluation of the expression, or {@code null}
|
||||
* if it is invalid.
|
||||
* Evaluates the given expression as a {@link Node}. Returns the evaluation of the expression, or {@code null} if it
|
||||
* is invalid.
|
||||
*
|
||||
* @param expression the XPath expression
|
||||
* @param context the context starting point
|
||||
* @param context the context starting point
|
||||
* @return the result of the evaluation
|
||||
* @throws XPathException in case of XPath errors
|
||||
* @see <a href="http://www.w3.org/TR/xpath#node-sets">XPath specification</a>
|
||||
@@ -71,7 +72,7 @@ public interface XPathOperations {
|
||||
* empty list if no results are found.
|
||||
*
|
||||
* @param expression the XPath expression
|
||||
* @param context the context starting point
|
||||
* @param context the context starting point
|
||||
* @return the result of the evaluation
|
||||
* @throws XPathException in case of XPath errors
|
||||
* @see <a href="http://www.w3.org/TR/xpath#node-sets">XPath specification</a>
|
||||
@@ -79,14 +80,14 @@ public interface XPathOperations {
|
||||
List<Node> evaluateAsNodeList(String expression, Source context) throws XPathException;
|
||||
|
||||
/**
|
||||
* Evaluates the given expression as a {@code double}. Returns the evaluation of the expression, or {@link
|
||||
* Double#NaN} if it is invalid.
|
||||
*
|
||||
* <p>The return value is determined per the {@code number()} function as defined in the XPath specification.
|
||||
* This means that if the expression selects multiple nodes, it will return the number value of the first node.
|
||||
* Evaluates the given expression as a {@code double}. Returns the evaluation of the expression, or {@link Double#NaN}
|
||||
* if it is invalid.
|
||||
* <p>
|
||||
* The return value is determined per the {@code number()} function as defined in the XPath specification. This means
|
||||
* that if the expression selects multiple nodes, it will return the number value of the first node.
|
||||
*
|
||||
* @param expression the XPath expression
|
||||
* @param context the context starting point
|
||||
* @param context the context starting point
|
||||
* @return the result of the evaluation
|
||||
* @throws XPathException in case of XPath errors
|
||||
* @see <a href="http://www.w3.org/TR/xpath/#function-number">XPath specification - number() function</a>
|
||||
@@ -94,14 +95,14 @@ public interface XPathOperations {
|
||||
double evaluateAsDouble(String expression, Source context) throws XPathException;
|
||||
|
||||
/**
|
||||
* Evaluates the given expression as a {@link String}. Returns the evaluation of the expression, or
|
||||
* {@code null} if it is invalid.
|
||||
*
|
||||
* <p>The return value is determined per the {@code string()} function as defined in the XPath specification.
|
||||
* This means that if the expression selects multiple nodes, it will return the string value of the first node.
|
||||
* Evaluates the given expression as a {@link String}. Returns the evaluation of the expression, or {@code null} if it
|
||||
* is invalid.
|
||||
* <p>
|
||||
* The return value is determined per the {@code string()} function as defined in the XPath specification. This means
|
||||
* that if the expression selects multiple nodes, it will return the string value of the first node.
|
||||
*
|
||||
* @param expression the XPath expression
|
||||
* @param context the context starting point
|
||||
* @param context the context starting point
|
||||
* @return the result of the evaluation
|
||||
* @throws XPathException in case of XPath errors
|
||||
* @see <a href="http://www.w3.org/TR/xpath/#function-string">XPath specification - string() function</a>
|
||||
@@ -112,7 +113,7 @@ public interface XPathOperations {
|
||||
* Evaluates the given expression, mapping a single {@link Node} result to a Java object via a {@link NodeMapper}.
|
||||
*
|
||||
* @param expression the XPath expression
|
||||
* @param context the context starting point
|
||||
* @param context the context starting point
|
||||
* @param nodeMapper object that will map one object per node
|
||||
* @return the single mapped object
|
||||
* @throws XPathException in case of XPath errors
|
||||
@@ -121,11 +122,10 @@ public interface XPathOperations {
|
||||
<T> T evaluateAsObject(String expression, Source context, NodeMapper<T> nodeMapper) throws XPathException;
|
||||
|
||||
/**
|
||||
* Evaluates the given expression, mapping each result {@link Node} objects to a Java object via a {@link
|
||||
* NodeMapper}.
|
||||
* Evaluates the given expression, mapping each result {@link Node} objects to a Java object via a {@link NodeMapper}.
|
||||
*
|
||||
* @param expression the XPath expression
|
||||
* @param context the context starting point
|
||||
* @param context the context starting point
|
||||
* @param nodeMapper object that will map one object per node
|
||||
* @return the result list, containing mapped objects
|
||||
* @throws XPathException in case of XPath errors
|
||||
@@ -134,11 +134,11 @@ public interface XPathOperations {
|
||||
<T> List<T> evaluate(String expression, Source context, NodeMapper<T> nodeMapper) throws XPathException;
|
||||
|
||||
/**
|
||||
* Evaluates the given expression, handling the result {@link Node} objects on a per-node basis with a {@link
|
||||
* NodeCallbackHandler}.
|
||||
* Evaluates the given expression, handling the result {@link Node} objects on a per-node basis with a
|
||||
* {@link NodeCallbackHandler}.
|
||||
*
|
||||
* @param expression the XPath expression
|
||||
* @param context the context starting point
|
||||
* @param expression the XPath expression
|
||||
* @param context the context starting point
|
||||
* @param callbackHandler object that will extract results, one row at a time
|
||||
* @throws XPathException in case of XPath errors
|
||||
* @see <a href="http://www.w3.org/TR/xpath#node-sets">XPath specification</a>
|
||||
|
||||
@@ -35,10 +35,9 @@ public class XPathParseException extends XPathException {
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a new instance of the {@code XPathParseException} with the specific detail message and
|
||||
* exception.
|
||||
* Constructs a new instance of the {@code XPathParseException} with the specific detail message and exception.
|
||||
*
|
||||
* @param message the detail message
|
||||
* @param message the detail message
|
||||
* @param throwable the wrapped exception
|
||||
*/
|
||||
public XPathParseException(String message, Throwable throwable) {
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
package org.springframework.xml.xsd;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import javax.xml.namespace.QName;
|
||||
import javax.xml.parsers.DocumentBuilder;
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
@@ -24,10 +25,6 @@ import javax.xml.parsers.ParserConfigurationException;
|
||||
import javax.xml.transform.Source;
|
||||
import javax.xml.transform.dom.DOMSource;
|
||||
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
import org.xml.sax.SAXException;
|
||||
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.core.io.Resource;
|
||||
import org.springframework.util.Assert;
|
||||
@@ -35,11 +32,14 @@ import org.springframework.xml.DocumentBuilderFactoryUtils;
|
||||
import org.springframework.xml.sax.SaxUtils;
|
||||
import org.springframework.xml.validation.XmlValidator;
|
||||
import org.springframework.xml.validation.XmlValidatorFactory;
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
import org.xml.sax.SAXException;
|
||||
|
||||
/**
|
||||
* The default {@link XsdSchema} implementation.
|
||||
*
|
||||
* <p>Allows a XSD to be set by the {@link #setXsd(Resource)}, or directly in the {@link #SimpleXsdSchema(Resource)
|
||||
* <p>
|
||||
* Allows a XSD to be set by the {@link #setXsd(Resource)}, or directly in the {@link #SimpleXsdSchema(Resource)
|
||||
* constructor}.
|
||||
*
|
||||
* @author Mark LaFond
|
||||
@@ -65,14 +65,13 @@ public class SimpleXsdSchema implements XsdSchema, InitializingBean {
|
||||
|
||||
/**
|
||||
* Create a new instance of the {@link SimpleXsdSchema} class.
|
||||
*
|
||||
* <p>A subsequent call to the {@link #setXsd(Resource)} method is required.
|
||||
* <p>
|
||||
* A subsequent call to the {@link #setXsd(Resource)} method is required.
|
||||
*/
|
||||
public SimpleXsdSchema() {
|
||||
}
|
||||
public SimpleXsdSchema() {}
|
||||
|
||||
/**
|
||||
* Create a new instance of the {@link SimpleXsdSchema} class with the specified resource.
|
||||
* Create a new instance of the {@link SimpleXsdSchema} class with the specified resource.
|
||||
*
|
||||
* @param xsdResource the XSD resource; must not be {@code null}
|
||||
* @throws IllegalArgumentException if the supplied {@code xsdResource} is {@code null}
|
||||
@@ -94,8 +93,9 @@ public class SimpleXsdSchema implements XsdSchema, InitializingBean {
|
||||
@Override
|
||||
public String getTargetNamespace() {
|
||||
|
||||
Assert.notNull(schemaElement, "schemaElement must not be null! Did you run afterPropertiesSet() or register this as a Spring bean?");
|
||||
|
||||
Assert.notNull(schemaElement,
|
||||
"schemaElement must not be null! Did you run afterPropertiesSet() or register this as a Spring bean?");
|
||||
|
||||
return schemaElement.getAttribute("targetNamespace");
|
||||
}
|
||||
|
||||
@@ -108,8 +108,7 @@ public class SimpleXsdSchema implements XsdSchema, InitializingBean {
|
||||
public XmlValidator createValidator() {
|
||||
try {
|
||||
return XmlValidatorFactory.createValidator(xsdResource, XmlValidatorFactory.SCHEMA_W3C_XML);
|
||||
}
|
||||
catch (IOException ex) {
|
||||
} catch (IOException ex) {
|
||||
throw new XsdSchemaException(ex.getMessage(), ex);
|
||||
}
|
||||
}
|
||||
@@ -127,9 +126,9 @@ public class SimpleXsdSchema implements XsdSchema, InitializingBean {
|
||||
schemaElement = schemaDocument.getDocumentElement();
|
||||
Assert.isTrue(SCHEMA_NAME.getLocalPart().equals(schemaElement.getLocalName()),
|
||||
xsdResource + " has invalid root element : [" + schemaElement.getLocalName() + "] instead of [schema]");
|
||||
Assert.isTrue(SCHEMA_NAME.getNamespaceURI().equals(schemaElement.getNamespaceURI()), xsdResource +
|
||||
" has invalid root element: [" + schemaElement.getNamespaceURI() + "] instead of [" +
|
||||
SCHEMA_NAME.getNamespaceURI() + "]");
|
||||
Assert.isTrue(SCHEMA_NAME.getNamespaceURI().equals(schemaElement.getNamespaceURI()),
|
||||
xsdResource + " has invalid root element: [" + schemaElement.getNamespaceURI() + "] instead of ["
|
||||
+ SCHEMA_NAME.getNamespaceURI() + "]");
|
||||
Assert.hasText(getTargetNamespace(), xsdResource + " has no targetNamespace");
|
||||
}
|
||||
|
||||
@@ -141,4 +140,4 @@ public class SimpleXsdSchema implements XsdSchema, InitializingBean {
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,6 +22,7 @@ import java.io.IOException;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.xml.namespace.QName;
|
||||
import javax.xml.transform.Source;
|
||||
import javax.xml.transform.dom.DOMSource;
|
||||
@@ -30,8 +31,6 @@ import javax.xml.transform.stream.StreamSource;
|
||||
import org.apache.ws.commons.schema.XmlSchema;
|
||||
import org.apache.ws.commons.schema.XmlSchemaCollection;
|
||||
import org.apache.ws.commons.schema.XmlSchemaSerializer;
|
||||
import org.w3c.dom.Document;
|
||||
|
||||
import org.springframework.beans.BeanInstantiationException;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.core.io.Resource;
|
||||
@@ -40,6 +39,7 @@ import org.springframework.util.Assert;
|
||||
import org.springframework.xml.validation.XmlValidator;
|
||||
import org.springframework.xml.validation.XmlValidatorFactory;
|
||||
import org.springframework.xml.xsd.XsdSchema;
|
||||
import org.w3c.dom.Document;
|
||||
|
||||
/**
|
||||
* Implementation of the {@link XsdSchema} interface that uses Apache WS-Commons XML Schema.
|
||||
@@ -55,7 +55,7 @@ public class CommonsXsdSchema implements XsdSchema {
|
||||
private final XmlSchemaCollection collection;
|
||||
|
||||
/**
|
||||
* Create a new instance of the {@code CommonsXsdSchema} class with the specified {@link XmlSchema} reference.
|
||||
* Create a new instance of the {@code CommonsXsdSchema} class with the specified {@link XmlSchema} reference.
|
||||
*
|
||||
* @param schema the Commons {@code XmlSchema} object; must not be {@code null}
|
||||
* @throws IllegalArgumentException if the supplied {@code schema} is {@code null}
|
||||
@@ -65,10 +65,10 @@ public class CommonsXsdSchema implements XsdSchema {
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new instance of the {@code CommonsXsdSchema} class with the specified {@link XmlSchema} and {@link
|
||||
* XmlSchemaCollection} reference.
|
||||
* Create a new instance of the {@code CommonsXsdSchema} class with the specified {@link XmlSchema} and
|
||||
* {@link XmlSchemaCollection} reference.
|
||||
*
|
||||
* @param schema the Commons {@code XmlSchema} object; must not be {@code null}
|
||||
* @param schema the Commons {@code XmlSchema} object; must not be {@code null}
|
||||
* @param collection the Commons {@code XmlSchemaCollection} object; can be {@code null}
|
||||
* @throws IllegalArgumentException if the supplied {@code schema} is {@code null}
|
||||
*/
|
||||
@@ -98,18 +98,15 @@ public class CommonsXsdSchema implements XsdSchema {
|
||||
}
|
||||
Document[] serializedSchemas = serializer.serializeSchema(schema, false);
|
||||
return new DOMSource(serializedSchemas[0]);
|
||||
}
|
||||
catch (BeanInstantiationException ex) {
|
||||
} catch (BeanInstantiationException ex) {
|
||||
// ignore
|
||||
}
|
||||
catch (XmlSchemaSerializer.XmlSchemaSerializerException ex) {
|
||||
} catch (XmlSchemaSerializer.XmlSchemaSerializerException ex) {
|
||||
// ignore
|
||||
}
|
||||
ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
||||
try {
|
||||
schema.write(bos);
|
||||
}
|
||||
catch (UnsupportedEncodingException ex) {
|
||||
} catch (UnsupportedEncodingException ex) {
|
||||
throw new CommonsXsdSchemaException(ex.getMessage(), ex);
|
||||
}
|
||||
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
|
||||
@@ -120,15 +117,13 @@ public class CommonsXsdSchema implements XsdSchema {
|
||||
public XmlValidator createValidator() {
|
||||
try {
|
||||
Resource resource = new UrlResource(schema.getSourceURI());
|
||||
return XmlValidatorFactory
|
||||
.createValidator(resource, XmlValidatorFactory.SCHEMA_W3C_XML);
|
||||
}
|
||||
catch (IOException ex) {
|
||||
return XmlValidatorFactory.createValidator(resource, XmlValidatorFactory.SCHEMA_W3C_XML);
|
||||
} catch (IOException ex) {
|
||||
throw new CommonsXsdSchemaException(ex.getMessage(), ex);
|
||||
}
|
||||
}
|
||||
|
||||
/** Returns the wrapped Commons {@code XmlSchema} object. */
|
||||
/** Returns the wrapped Commons {@code XmlSchema} object. */
|
||||
public XmlSchema getSchema() {
|
||||
return schema;
|
||||
}
|
||||
|
||||
@@ -32,8 +32,6 @@ import org.apache.ws.commons.schema.XmlSchemaInclude;
|
||||
import org.apache.ws.commons.schema.XmlSchemaObject;
|
||||
import org.apache.ws.commons.schema.resolver.DefaultURIResolver;
|
||||
import org.apache.ws.commons.schema.resolver.URIResolver;
|
||||
import org.xml.sax.InputSource;
|
||||
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.context.ResourceLoaderAware;
|
||||
import org.springframework.core.io.Resource;
|
||||
@@ -46,13 +44,14 @@ import org.springframework.xml.validation.XmlValidator;
|
||||
import org.springframework.xml.validation.XmlValidatorFactory;
|
||||
import org.springframework.xml.xsd.XsdSchema;
|
||||
import org.springframework.xml.xsd.XsdSchemaCollection;
|
||||
import org.xml.sax.InputSource;
|
||||
|
||||
/**
|
||||
* Implementation of the {@link XsdSchemaCollection} that uses Apache WS-Commons XML Schema.
|
||||
*
|
||||
* <p>Setting the {@link #setInline(boolean) inline} flag to {@code true} will result in all referenced schemas
|
||||
* (included and imported) being merged into the referred schema. When including the schemas into a WSDL, this greatly
|
||||
* simplifies the deployment of the schemas.
|
||||
* <p>
|
||||
* Setting the {@link #setInline(boolean) inline} flag to {@code true} will result in all referenced schemas (included
|
||||
* and imported) being merged into the referred schema. When including the schemas into a WSDL, this greatly simplifies
|
||||
* the deployment of the schemas.
|
||||
*
|
||||
* @author Arjen Poutsma
|
||||
* @see <a href="http://ws.apache.org/commons/XmlSchema/">Commons XML Schema</a>
|
||||
@@ -76,11 +75,10 @@ public class CommonsXsdSchemaCollection implements XsdSchemaCollection, Initiali
|
||||
|
||||
/**
|
||||
* Constructs a new, empty instance of the {@code CommonsXsdSchemaCollection}.
|
||||
*
|
||||
* <p>A subsequent call to the {@link #setXsds(Resource[])} is required.
|
||||
* <p>
|
||||
* A subsequent call to the {@link #setXsds(Resource[])} is required.
|
||||
*/
|
||||
public CommonsXsdSchemaCollection() {
|
||||
}
|
||||
public CommonsXsdSchemaCollection() {}
|
||||
|
||||
/**
|
||||
* Constructs a new instance of the {@code CommonsXsdSchemaCollection} based on the given resources.
|
||||
@@ -102,8 +100,8 @@ public class CommonsXsdSchemaCollection implements XsdSchemaCollection, Initiali
|
||||
|
||||
/**
|
||||
* Defines whether included schemas should be inlined into the including schema.
|
||||
*
|
||||
* <p>Defaults to {@code false}.
|
||||
* <p>
|
||||
* Defaults to {@code false}.
|
||||
*/
|
||||
public void setInline(boolean inline) {
|
||||
this.inline = inline;
|
||||
@@ -111,8 +109,8 @@ public class CommonsXsdSchemaCollection implements XsdSchemaCollection, Initiali
|
||||
|
||||
/**
|
||||
* Sets the WS-Commons uri resolver to use when resolving (relative) schemas.
|
||||
*
|
||||
* <p>Default is an internal subclass of {@link DefaultURIResolver} which correctly handles schemas on the classpath.
|
||||
* <p>
|
||||
* Default is an internal subclass of {@link DefaultURIResolver} which correctly handles schemas on the classpath.
|
||||
*/
|
||||
public void setUriResolver(URIResolver uriResolver) {
|
||||
Assert.notNull(uriResolver, "'uriResolver' must not be null");
|
||||
@@ -136,16 +134,14 @@ public class CommonsXsdSchemaCollection implements XsdSchemaCollection, Initiali
|
||||
for (Resource xsdResource : xsdResources) {
|
||||
Assert.isTrue(xsdResource.exists(), xsdResource + " does not exist");
|
||||
try {
|
||||
XmlSchema xmlSchema =
|
||||
schemaCollection.read(SaxUtils.createInputSource(xsdResource));
|
||||
XmlSchema xmlSchema = schemaCollection.read(SaxUtils.createInputSource(xsdResource));
|
||||
xmlSchemas.add(xmlSchema);
|
||||
|
||||
if (inline) {
|
||||
inlineIncludes(xmlSchema, processedIncludes, processedImports);
|
||||
findImports(xmlSchema, processedImports, processedIncludes);
|
||||
}
|
||||
}
|
||||
catch (Exception ex) {
|
||||
} catch (Exception ex) {
|
||||
throw new CommonsXsdSchemaException("Schema [" + xsdResource + "] could not be loaded", ex);
|
||||
}
|
||||
}
|
||||
@@ -176,8 +172,7 @@ public class CommonsXsdSchemaCollection implements XsdSchemaCollection, Initiali
|
||||
resources[i] = new UrlResource(sourceUri);
|
||||
}
|
||||
}
|
||||
return XmlValidatorFactory
|
||||
.createValidator(resources, XmlValidatorFactory.SCHEMA_W3C_XML);
|
||||
return XmlValidatorFactory.createValidator(resources, XmlValidatorFactory.SCHEMA_W3C_XML);
|
||||
} catch (IOException ex) {
|
||||
throw new CommonsXsdSchemaException(ex.getMessage(), ex);
|
||||
}
|
||||
@@ -213,8 +208,8 @@ public class CommonsXsdSchemaCollection implements XsdSchemaCollection, Initiali
|
||||
if (external instanceof XmlSchemaImport) {
|
||||
XmlSchemaImport schemaImport = (XmlSchemaImport) external;
|
||||
XmlSchema importedSchema = schemaImport.getSchema();
|
||||
if (!"http://www.w3.org/XML/1998/namespace".equals(schemaImport.getNamespace()) &&
|
||||
importedSchema != null && !processedImports.contains(importedSchema)) {
|
||||
if (!"http://www.w3.org/XML/1998/namespace".equals(schemaImport.getNamespace()) && importedSchema != null
|
||||
&& !processedImports.contains(importedSchema)) {
|
||||
inlineIncludes(importedSchema, processedIncludes, processedImports);
|
||||
findImports(importedSchema, processedImports, processedIncludes);
|
||||
xmlSchemas.add(importedSchema);
|
||||
@@ -247,8 +242,7 @@ public class CommonsXsdSchemaCollection implements XsdSchemaCollection, Initiali
|
||||
Resource resource = resourceLoader.getResource(schemaLocation);
|
||||
if (resource.exists()) {
|
||||
return createInputSource(resource);
|
||||
}
|
||||
else if (StringUtils.hasLength(baseUri)) {
|
||||
} else if (StringUtils.hasLength(baseUri)) {
|
||||
// let's try and find it relative to the baseUri, see SWS-413
|
||||
try {
|
||||
Resource baseUriResource = new UrlResource(baseUri);
|
||||
@@ -256,8 +250,7 @@ public class CommonsXsdSchemaCollection implements XsdSchemaCollection, Initiali
|
||||
if (resource.exists()) {
|
||||
return createInputSource(resource);
|
||||
}
|
||||
}
|
||||
catch (IOException e) {
|
||||
} catch (IOException e) {
|
||||
// fall through
|
||||
}
|
||||
}
|
||||
@@ -274,8 +267,7 @@ public class CommonsXsdSchemaCollection implements XsdSchemaCollection, Initiali
|
||||
private InputSource createInputSource(Resource resource) {
|
||||
try {
|
||||
return SaxUtils.createInputSource(resource);
|
||||
}
|
||||
catch (IOException ex) {
|
||||
} catch (IOException ex) {
|
||||
throw new CommonsXsdSchemaException("Could not resolve location", ex);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user