diff --git a/spring-integration-xml/src/main/java/org/springframework/integration/xml/splitter/XPathMessageSplitter.java b/spring-integration-xml/src/main/java/org/springframework/integration/xml/splitter/XPathMessageSplitter.java
index 44eeb9d248..35a3a0035b 100644
--- a/spring-integration-xml/src/main/java/org/springframework/integration/xml/splitter/XPathMessageSplitter.java
+++ b/spring-integration-xml/src/main/java/org/springframework/integration/xml/splitter/XPathMessageSplitter.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2009 the original author or authors.
+ * Copyright 2002-2010 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,6 +16,7 @@
package org.springframework.integration.xml.splitter;
+import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -25,9 +26,7 @@ import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import org.w3c.dom.Document;
@@ -46,12 +45,13 @@ import org.springframework.xml.xpath.XPathExpressionFactory;
/**
* Message Splitter that uses an {@link XPathExpression} to split a
- * {@link Document} or {@link String} payload into a {@link NodeList}. The
- * return value will be either Strings or {@link Node}s depending on the
+ * {@link Document}, {@link File} or {@link String} payload into a {@link NodeList}.
+ * The return value will be either Strings or {@link Node}s depending on the
* received payload type. Additionally, node types will be converted to
* Documents if the 'createDocuments' property is set to true.
*
* @author Jonas Partner
+ * @author Mark Fisher
*/
public class XPathMessageSplitter extends AbstractMessageSplitter {
@@ -83,6 +83,10 @@ public class XPathMessageSplitter extends AbstractMessageSplitter {
this.createDocuments = createDocuments;
}
+ public String getComponentType() {
+ return "xml:xpath-splitter";
+ }
+
public void setDocumentBuilder(DocumentBuilderFactory documentBuilderFactory) {
Assert.notNull(documentBuilderFactory, "DocumentBuilderFactory must not be null");
this.documentBuilderFactory = documentBuilderFactory;
@@ -99,17 +103,12 @@ public class XPathMessageSplitter extends AbstractMessageSplitter {
Object payload = message.getPayload();
Object result = null;
if (payload instanceof Node) {
- result = splitNodePayload((Node) payload, message);
- }
- else if (payload instanceof String) {
- payload = xmlPayloadConverter.convertToDocument(payload);
- result = splitStringPayload(message);
+ result = splitNode((Node) payload);
}
else {
- throw new IllegalArgumentException(
- "Unsupported payload type [" + payload.getClass().getName()
- + "]. The XPathMessageSplitter only accepts [" + Node.class.getName()
- + "] or [java.lang.String] typed payloads.");
+ Document document = this.xmlPayloadConverter.convertToDocument(payload);
+ Assert.notNull(document, "unsupported payload type [" + payload.getClass().getName() + "]");
+ result = splitDocument(document);
}
return result;
}
@@ -121,10 +120,8 @@ public class XPathMessageSplitter extends AbstractMessageSplitter {
}
}
- private Object splitStringPayload(Message> message) throws ParserConfigurationException,
- TransformerFactoryConfigurationError, TransformerException {
- Node node = xmlPayloadConverter.convertToDocument(message.getPayload());
- List nodes = splitNodePayload(node, message);
+ private Object splitDocument(Document document) throws Exception {
+ List nodes = splitNode(document);
Transformer transformer = TransformerFactory.newInstance().newTransformer();
List splitStrings = new ArrayList(nodes.size());
for (Node nodeFromList : nodes) {
@@ -136,37 +133,32 @@ public class XPathMessageSplitter extends AbstractMessageSplitter {
}
@SuppressWarnings("unchecked")
- protected List splitNodePayload(Node node, Message message) throws ParserConfigurationException {
- List nodeList = xpathExpression.evaluateAsNodeList(node);
+ private List splitNode(Node node) throws ParserConfigurationException {
+ List nodeList = this.xpathExpression.evaluateAsNodeList(node);
if (nodeList.size() == 0) {
- throw new MessagingException(message, "Could not split message with XPath " + xpathExpression);
+ throw new IllegalArgumentException("failed to split message with XPath expression: " + this.xpathExpression);
}
if (this.createDocuments) {
return convertNodesToDocuments(nodeList);
}
return nodeList;
-
}
- private List convertNodesToDocuments(List nodeList) throws ParserConfigurationException {
+ private List convertNodesToDocuments(List nodes) throws ParserConfigurationException {
DocumentBuilder documentBuilder = this.getNewDocumentBuilder();
- List docList = new ArrayList(nodeList.size());
- for (Node node : nodeList) {
- Document doc = documentBuilder.newDocument();
- doc.appendChild(doc.importNode(node, true));
- docList.add(doc);
+ List documents = new ArrayList(nodes.size());
+ for (Node node : nodes) {
+ Document document = documentBuilder.newDocument();
+ document.appendChild(document.importNode(node, true));
+ documents.add(document);
}
- return docList;
+ return documents;
}
- protected DocumentBuilder getNewDocumentBuilder() throws ParserConfigurationException {
+ private DocumentBuilder getNewDocumentBuilder() throws ParserConfigurationException {
synchronized (this.documentBuilderFactory) {
return this.documentBuilderFactory.newDocumentBuilder();
}
}
-
- public String getComponentType(){
- return "xml:xpath-splitter";
- }
}