#1160 - Update code style.

This commit is contained in:
Greg L. Turnquist
2020-09-29 20:27:41 -05:00
parent 419b0b2180
commit d24b4fb5d5
747 changed files with 8602 additions and 10072 deletions

View File

@@ -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());
}
}

View File

@@ -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;
}
}
}

View File

@@ -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;
}

View File

@@ -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) {

View File

@@ -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 {}
}

View File

@@ -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();
}
}

View File

@@ -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));
}

View File

@@ -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>();

View File

@@ -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>

View File

@@ -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);
}
}

View File

@@ -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;
}

View File

@@ -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;
/**

View File

@@ -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()

View File

@@ -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

View File

@@ -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());
}
}

View File

@@ -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

View File

@@ -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

View File

@@ -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 {
}
}

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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());
}
}

View File

@@ -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;
}
}
}
}

View File

@@ -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();

View File

@@ -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();

View File

@@ -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;
}
}

View File

@@ -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.");
}
}

View File

@@ -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.
*

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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 {
}
}

View File

@@ -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

View File

@@ -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

View File

@@ -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) {

View File

@@ -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

View File

@@ -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;
}
}
}

View File

@@ -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);
}
}

View File

@@ -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>

View File

@@ -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) {

View File

@@ -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();
}
}
}

View File

@@ -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;
}

View File

@@ -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);
}
}