You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2012/11/28 18:46:52 UTC
svn commit: r1414838 - in /camel/branches/camel-2.9.x: ./
camel-core/src/main/java/org/apache/camel/support/TokenXMLPairExpressionIterator.java
camel-core/src/test/java/org/apache/camel/processor/SplitTokenizerNamespaceTest.java
Author: davsclaus
Date: Wed Nov 28 17:46:50 2012
New Revision: 1414838
URL: http://svn.apache.org/viewvc?rev=1414838&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.9.x/camel-core/src/test/java/org/apache/camel/processor/SplitTokenizerNamespaceTest.java
- copied unchanged from r1414837, camel/branches/camel-2.10.x/camel-core/src/test/java/org/apache/camel/processor/SplitTokenizerNamespaceTest.java
Modified:
camel/branches/camel-2.9.x/ (props changed)
camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/support/TokenXMLPairExpressionIterator.java
Propchange: camel/branches/camel-2.9.x/
------------------------------------------------------------------------------
Merged /camel/trunk:r1414836
Merged /camel/branches/camel-2.10.x:r1414837
Propchange: camel/branches/camel-2.9.x/
------------------------------------------------------------------------------
Binary property 'svnmerge-integrated' - no diff available.
Modified: camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/support/TokenXMLPairExpressionIterator.java
URL: http://svn.apache.org/viewvc/camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/support/TokenXMLPairExpressionIterator.java?rev=1414838&r1=1414837&r2=1414838&view=diff
==============================================================================
--- camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/support/TokenXMLPairExpressionIterator.java (original)
+++ camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/support/TokenXMLPairExpressionIterator.java Wed Nov 28 17:46:50 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;