Author: davsclaus
Date: Wed Nov 28 17:43:38 2012
New Revision: 1414837
URL: http://svn.apache.org/viewvc?rev=1414837&view=rev
Log:
CAMEL-5826: Fixed issue with XML streaming tokenizer dealing with inheriting
namespaces from parent tag. Thanks to Rich Newcomb for the patch.
Added:
camel/branches/camel-2.10.x/camel-core/src/test/java/org/apache/camel/processor/SplitTokenizerNamespaceTest.java
- copied unchanged from r1414836,
camel/trunk/camel-core/src/test/java/org/apache/camel/processor/SplitTokenizerNamespaceTest.java
Modified:
camel/branches/camel-2.10.x/ (props changed)
camel/branches/camel-2.10.x/camel-core/src/main/java/org/apache/camel/support/TokenXMLPairExpressionIterator.java
Propchange: camel/branches/camel-2.10.x/
------------------------------------------------------------------------------
Merged /camel/trunk:r1414836
Propchange: camel/branches/camel-2.10.x/
------------------------------------------------------------------------------
Binary property 'svnmerge-integrated' - no diff available.
Modified:
camel/branches/camel-2.10.x/camel-core/src/main/java/org/apache/camel/support/TokenXMLPairExpressionIterator.java
URL:
http://svn.apache.org/viewvc/camel/branches/camel-2.10.x/camel-core/src/main/java/org/apache/camel/support/TokenXMLPairExpressionIterator.java?rev=1414837&r1=1414836&r2=1414837&view=diff
==============================================================================
---
camel/branches/camel-2.10.x/camel-core/src/main/java/org/apache/camel/support/TokenXMLPairExpressionIterator.java
(original)
+++
camel/branches/camel-2.10.x/camel-core/src/main/java/org/apache/camel/support/TokenXMLPairExpressionIterator.java
Wed Nov 28 17:43:38 2012
@@ -41,6 +41,7 @@ public class TokenXMLPairExpressionItera
private static final Pattern NAMESPACE_PATTERN =
Pattern.compile("xmlns(:\\w+|)=\\\"(.*?)\\\"");
private static final String SCAN_TOKEN_REGEX = "(\\s+.*?|)>";
+ private static final String SCAN_TOKEN_NS_PREFIX_REGEX = "(.{1,15}?:|)";
protected final String inheritNamespaceToken;
public TokenXMLPairExpressionIterator(String startToken, String endToken,
String inheritNamespaceToken) {
@@ -81,15 +82,22 @@ public class TokenXMLPairExpressionItera
XMLTokenPairIterator(String startToken, String endToken, String
inheritNamespaceToken, InputStream in, String charset) {
super(startToken, endToken, true, in, charset);
- // remove any ending > as we need to support attributes on the
tags, so we need to use a reg exp pattern
- String token = startToken.substring(0, startToken.length() - 1) +
SCAN_TOKEN_REGEX;
- this.startTokenPattern = Pattern.compile(token);
- this.scanEndToken = endToken.substring(0, endToken.length() - 1) +
SCAN_TOKEN_REGEX;
+ // remove any beginning < and ending > as we need to support ns
prefixes and attributes, so we use a reg exp patterns
+ StringBuilder tokenSb = new
StringBuilder("<").append(SCAN_TOKEN_NS_PREFIX_REGEX).
+ append(startToken.substring(1,
startToken.length() - 1)).append(SCAN_TOKEN_REGEX);
+ this.startTokenPattern = Pattern.compile(tokenSb.toString());
+
+ tokenSb = new
StringBuilder("</").append(SCAN_TOKEN_NS_PREFIX_REGEX).
+ append(endToken.substring(2, endToken.length()
- 1)).append(SCAN_TOKEN_REGEX);
+ this.scanEndToken = tokenSb.toString();
+
this.inheritNamespaceToken = inheritNamespaceToken;
if (inheritNamespaceToken != null) {
- token = inheritNamespaceToken.substring(0,
inheritNamespaceToken.length() - 1) + SCAN_TOKEN_REGEX;
+ // the inherit namespace token may itself have a namespace
prefix
+ tokenSb = new
StringBuilder("<").append(SCAN_TOKEN_NS_PREFIX_REGEX).
+ append(inheritNamespaceToken.substring(1,
inheritNamespaceToken.length() - 1)).append(SCAN_TOKEN_REGEX);
// the namespaces on the parent tag can be in multi line, so
we need to instruct the dot to support multilines
- this.inheritNamespaceTokenPattern = Pattern.compile(token,
Pattern.MULTILINE | Pattern.DOTALL);
+ this.inheritNamespaceTokenPattern =
Pattern.compile(tokenSb.toString(), Pattern.MULTILINE | Pattern.DOTALL);
}
}
@@ -125,17 +133,26 @@ public class TokenXMLPairExpressionItera
next = next.substring(index);
}
+ // make sure the end tag matches the begin tag if the tag has a
namespace prefix
+ String tag = ObjectHelper.before(next, ">");
+ StringBuilder endTagSb = new StringBuilder("</");
+ int firstSpaceIndex = tag.indexOf(" ");
+ if (firstSpaceIndex > 0) {
+ endTagSb.append(tag.substring(1, firstSpaceIndex)).append(">");
+ } else {
+ endTagSb.append(tag.substring(1, tag.length())).append(">");
+ }
+
// build answer accordingly to whether namespaces should be
inherited or not
StringBuilder sb = new StringBuilder();
if (inheritNamespaceToken != null && rootTokenNamespaces != null) {
// append root namespaces to local start token
- String tag = ObjectHelper.before(next, ">");
// grab the text
String text = ObjectHelper.after(next, ">");
// build result with inherited namespaces
- next =
sb.append(tag).append(rootTokenNamespaces).append(">").append(text).append(endToken).toString();
+ next =
sb.append(tag).append(rootTokenNamespaces).append(">").append(text).append(endTagSb.toString()).toString();
} else {
- next = sb.append(next).append(endToken).toString();
+ next = sb.append(next).append(endTagSb.toString()).toString();
}
return next;