Return-Path: X-Original-To: apmail-cxf-commits-archive@www.apache.org Delivered-To: apmail-cxf-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 421F4925A for ; Tue, 25 Oct 2011 08:48:16 +0000 (UTC) Received: (qmail 63466 invoked by uid 500); 25 Oct 2011 08:47:52 -0000 Delivered-To: apmail-cxf-commits-archive@cxf.apache.org Received: (qmail 61118 invoked by uid 500); 25 Oct 2011 08:47:23 -0000 Mailing-List: contact commits-help@cxf.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cxf.apache.org Delivered-To: mailing list commits@cxf.apache.org Received: (qmail 60375 invoked by uid 99); 25 Oct 2011 08:46:44 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 25 Oct 2011 08:46:44 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 25 Oct 2011 08:46:38 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id D353223888FD for ; Tue, 25 Oct 2011 08:46:16 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1188566 - in /cxf/trunk/common/common/src: main/java/org/apache/cxf/staxutils/transform/ test/java/org/apache/cxf/staxutils/resources/ test/java/org/apache/cxf/staxutils/transform/ Date: Tue, 25 Oct 2011 08:46:16 -0000 To: commits@cxf.apache.org From: ay@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20111025084616.D353223888FD@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: ay Date: Tue Oct 25 08:46:16 2011 New Revision: 1188566 URL: http://svn.apache.org/viewvc?rev=1188566&view=rev Log: [CXF-3880] TransformReader fix for append-child Added: cxf/trunk/common/common/src/test/java/org/apache/cxf/staxutils/resources/AddRequestIn3.xml (with props) cxf/trunk/common/common/src/test/java/org/apache/cxf/staxutils/resources/amazonIn2.xml (with props) cxf/trunk/common/common/src/test/java/org/apache/cxf/staxutils/resources/amazonIn2nospace.xml (with props) Modified: cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/InTransformReader.java cxf/trunk/common/common/src/test/java/org/apache/cxf/staxutils/transform/InTransformReaderTest.java Modified: cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/InTransformReader.java URL: http://svn.apache.org/viewvc/cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/InTransformReader.java?rev=1188566&r1=1188565&r2=1188566&view=diff ============================================================================== --- cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/InTransformReader.java (original) +++ cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/transform/InTransformReader.java Tue Oct 25 08:46:16 2011 @@ -25,6 +25,8 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.Stack; +import java.util.logging.Level; +import java.util.logging.Logger; import javax.xml.XMLConstants; import javax.xml.namespace.NamespaceContext; @@ -33,27 +35,26 @@ import javax.xml.stream.XMLStreamConstan import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; +import org.apache.cxf.common.logging.LogUtils; import org.apache.cxf.staxutils.DepthXMLStreamReader; public class InTransformReader extends DepthXMLStreamReader { - + private static final Logger LOG = LogUtils.getLogger(InTransformReader.class); + private static final String INTERN_NAMES = "org.codehaus.stax2.internNames"; private static final String INTERN_NS = "org.codehaus.stax2.internNsUris"; - private Stack elementStack = new Stack(); private QNamesMap inElementsMap; private QNamesMap inAttributesMap; private Map inAppendMap = new HashMap(5); private Set inDropSet = new HashSet(5); private Map nsMap = new HashMap(5); - private QName currentQName; - private QName pushBackQName; - private QName pushAheadQName; + private Stack pushedBackEvents = new Stack(); + private Map> pushedAheadEvents = + new HashMap>(); private String replaceText; - private String currentText; - private String pushAheadText; + private ParsingEvent currentEvent; private List attributesIndexes = new ArrayList(); - private int previousDepth = -1; private boolean blockOriginalReader = true; private boolean attributesIndexed; private DelegatingNamespaceContext namespaceContext; @@ -93,117 +94,181 @@ public class InTransformReader extends D } public int next() throws XMLStreamException { - if (isAtText()) { - resetCurrentText(); - return currentText != null - ? XMLStreamConstants.CHARACTERS : XMLStreamConstants.END_ELEMENT; - } else if (isAtPushedQName()) { - resetCurrentQName(); - pushElement(); - return XMLStreamConstants.START_ELEMENT; - } else if (isAtMarkedDepth()) { - previousDepth = -1; - popElement(); - return XMLStreamConstants.END_ELEMENT; + final boolean doDebug = LOG.isLoggable(Level.FINE); + + if (!pushedBackEvents.empty()) { + // consume events from the pushed back stack + currentEvent = pushedBackEvents.pop(); + if (doDebug) { + LOG.fine("pushed event available: " + currentEvent); + } + return currentEvent.event; } else { - final int event = super.next(); - if (event == XMLStreamConstants.START_ELEMENT) { - attributesIndexed = false; - final QName theName = super.getName(); - final ElementProperty appendProp = inAppendMap.remove(theName); - final boolean replaceContent = appendProp != null && theName.equals(appendProp.getName()); - - final boolean dropped = inDropSet.contains(theName); - if (appendProp != null && !replaceContent) { - - if (appendProp.isChild()) { - // append-post-* - pushAheadQName = appendProp.getName(); - } else { - // append-pre-* - currentQName = appendProp.getName(); - } - if (appendProp.getText() != null) { - // append-*-include - pushAheadText = appendProp.getText(); - } else { - // append-*-wrap - previousDepth = getDepth(); - pushElement(); - } - } else if (dropped) { - // unwrap the current element (shallow drop) - previousDepth = getDepth(); - return super.next(); + if (doDebug) { + LOG.fine("no pushed event"); + } + } + + int event = super.next(); + if (event == XMLStreamConstants.START_ELEMENT) { + attributesIndexed = false; + final QName theName = super.getName(); + final ElementProperty appendProp = inAppendMap.remove(theName); + final boolean replaceContent = appendProp != null && theName.equals(appendProp.getName()); + if (doDebug) { + LOG.fine("read StartElement " + theName + " at " + getDepth()); + } + + final boolean dropped = inDropSet.contains(theName); + QName expected = inElementsMap.get(theName); + if (expected == null) { + expected = theName; + } + + if (null != appendProp && !replaceContent) { + // handle one of the four append modes + handleAppendMode(theName, expected, appendProp); + } else if (replaceContent) { + replaceText = appendProp.getText(); + if (doDebug) { + LOG.fine("replacing content with " + replaceText); } - QName expected = inElementsMap.get(theName); - if (expected == null) { - expected = theName; - } else if (isEmpty(expected)) { - // drop the current element (deep drop) - final int depth = getDepth(); - while (depth != getDepth() || super.next() != XMLStreamConstants.END_ELEMENT) { - // get to the matching end element event - } - popElement(); - return XMLStreamConstants.END_ELEMENT; + currentEvent = createStartElementEvent(expected); + } else if (dropped) { + if (doDebug) { + LOG.fine("shallow-dropping start " + expected); } - - if (appendProp != null && appendProp.isChild() && !replaceContent) { - // append-post-* - currentQName = expected; - } else if (appendProp != null && !appendProp.isChild() && !replaceContent) { - // append-pre-* - pushBackQName = expected; + // unwrap the current element (shallow drop) + event = next(); + } else if (isEmptyQName(expected)) { + // skip the current element (deep drop) + if (doDebug) { + LOG.fine("deep-dropping " + theName); + } + handleDeepDrop(); + event = next(); + } else { + handleDefaultMode(theName, expected); + } + } else if (event == XMLStreamConstants.END_ELEMENT) { + final QName theName = super.getName(); + if (doDebug) { + LOG.fine("read EndElement " + theName + " at " + getDepth()); + } + + final boolean dropped = inDropSet.contains(theName); + if (!dropped) { + EndEventMarker em = new EndEventMarker(theName, getDepth() + 1); + List pe = pushedAheadEvents.remove(em); + if (null != pe) { + if (doDebug) { + LOG.fine("pushed event found"); + } + pushedBackEvents.addAll(pe); + currentEvent = pushedBackEvents.pop(); + event = currentEvent.event; } else { - // no append - currentQName = expected; - if (replaceContent) { - replaceText = appendProp.getText(); + if (doDebug) { + LOG.fine("no pushed event found"); } - pushElement(); - } - } else if (event == XMLStreamConstants.END_ELEMENT) { - QName theName = super.getName(); - boolean dropped = inDropSet.contains(theName); - if (dropped) { - super.next(); } - popElement(); } else { - // reset the element context and content - currentQName = null; - currentText = null; + if (doDebug) { + LOG.fine("shallow-dropping end " + theName); + } + event = next(); + } + } else { + if (doDebug) { + LOG.fine("read other event " + event); } - return event; + currentEvent = null; } + return event; } - private boolean isAtText() { - return pushAheadQName == null && (pushAheadText != null || currentText != null); - } - - private boolean isAtPushedQName() { - return pushBackQName != null || pushAheadQName != null; - } - - private boolean isAtMarkedDepth() { - return previousDepth != -1 && previousDepth == getDepth() + 1; - } - private boolean isEmpty(QName qname) { - return XMLConstants.NULL_NS_URI.equals(qname.getNamespaceURI()) && "".equals(qname.getLocalPart()); + private void handleAppendMode(QName name, QName expected, ElementProperty appendProp) { + final boolean doDebug = LOG.isLoggable(Level.FINE); + + if (appendProp.isChild()) { + if (null == appendProp.getText()) { + // ap-post-wrap + pushedBackEvents.push(createStartElementEvent(appendProp.getName())); + currentEvent = createStartElementEvent(expected); + EndEventMarker em = new EndEventMarker(name, getDepth()); + if (doDebug) { + LOG.fine("ap-post-wrap " + appendProp.getName() + ", " + em); + } + + List pe = new ArrayList(2); + pe.add(createEndElementEvent(expected)); + pe.add(createEndElementEvent(appendProp.getName())); + pushedAheadEvents.put(em, pe); + } else { + // ap-post-incl + currentEvent = createStartElementEvent(expected); + EndEventMarker em = new EndEventMarker(name, getDepth()); + if (doDebug) { + LOG.fine("ap-pre-incl " + appendProp.getName() + "=" + appendProp.getText() + ", " + em); + } + + List pe = new ArrayList(); + pe.add(createEndElementEvent(expected)); + pe.add(createEndElementEvent(appendProp.getName())); + pe.add(createCharactersEvent(appendProp.getText())); + pe.add(createStartElementEvent(appendProp.getName())); + pushedAheadEvents.put(em, pe); + } + } else { + if (null == appendProp.getText()) { + // ap-pre-wrap + pushedBackEvents.push(createStartElementEvent(expected)); + currentEvent = createStartElementEvent(appendProp.getName()); + EndEventMarker em = new EndEventMarker(name, getDepth()); + if (doDebug) { + LOG.fine("ap-pre-wrap " + appendProp.getName() + ", " + em); + } + + List pe = new ArrayList(); + pe.add(createEndElementEvent(appendProp.getName())); + pe.add(createEndElementEvent(expected)); + pushedAheadEvents.put(em, pe); + } else { + // ap-pre-incl + pushedBackEvents.push(createStartElementEvent(expected)); + pushedBackEvents.push(createEndElementEvent(appendProp.getName())); + pushedBackEvents.push(createCharactersEvent(appendProp.getText())); + currentEvent = createStartElementEvent(appendProp.getName()); + if (doDebug) { + LOG.fine("ap-pre-incl " + appendProp.getName() + "=" + appendProp.getText()); + } + } + } } - private void popElement() { - currentQName = elementStack.empty() ? null : elementStack.pop(); + private void handleDefaultMode(QName name, QName expected) { + currentEvent = createStartElementEvent(expected); + if (!name.equals(expected)) { + EndEventMarker em = new EndEventMarker(name, getDepth()); + if (LOG.isLoggable(Level.FINE)) { + LOG.fine("default " + name + "->" + expected + ", " + em); + } + List pe = new ArrayList(1); + pe.add(createEndElementEvent(expected)); + pushedAheadEvents.put(em, pe); + } } - private void pushElement() { - elementStack.push(currentQName); + private void handleDeepDrop() throws XMLStreamException { + final int depth = getDepth(); + while (depth != getDepth() || super.next() != XMLStreamConstants.END_ELEMENT) { + // get to the matching end element event + } } + public Object getProperty(String name) throws IllegalArgumentException { if (INTERN_NAMES.equals(name) || INTERN_NS.equals(name)) { return Boolean.FALSE; @@ -212,23 +277,13 @@ public class InTransformReader extends D } public String getLocalName() { - if (currentQName != null) { - return currentQName.getLocalPart(); + if (currentEvent != null) { + return currentEvent.name.getLocalPart(); } else { return super.getLocalName(); } } - private void resetCurrentQName() { - currentQName = pushBackQName != null ? pushBackQName : pushAheadQName; - pushBackQName = null; - pushAheadQName = null; - } - - private void resetCurrentText() { - currentText = pushAheadText; - pushAheadText = null; - } public NamespaceContext getNamespaceContext() { return namespaceContext; @@ -264,16 +319,16 @@ public class InTransformReader extends D } public String getNamespaceURI() { - if (currentQName != null) { - return currentQName.getNamespaceURI(); + if (currentEvent != null) { + return currentEvent.name.getNamespaceURI(); } else { return super.getNamespaceURI(); } } private QName readCurrentElement() { - if (currentQName != null) { - return currentQName; + if (currentEvent != null) { + return currentEvent.name; } String ns = super.getNamespaceURI(); String name = super.getLocalName(); @@ -286,7 +341,7 @@ public class InTransformReader extends D } public int getAttributeCount() { - if (pushBackQName != null) { + if (!pushedBackEvents.empty()) { return 0; } checkAttributeIndexRange(-1); @@ -294,7 +349,7 @@ public class InTransformReader extends D } public String getAttributeLocalName(int arg0) { - if (pushBackQName != null) { + if (!pushedBackEvents.empty()) { throwIndexException(arg0, 0); } checkAttributeIndexRange(arg0); @@ -303,7 +358,7 @@ public class InTransformReader extends D } public QName getAttributeName(int arg0) { - if (pushBackQName != null) { + if (!pushedBackEvents.empty()) { throwIndexException(arg0, 0); } checkAttributeIndexRange(arg0); @@ -314,7 +369,7 @@ public class InTransformReader extends D } public String getAttributeNamespace(int arg0) { - if (pushBackQName != null) { + if (!pushedBackEvents.empty()) { throwIndexException(arg0, 0); } checkAttributeIndexRange(arg0); @@ -323,7 +378,7 @@ public class InTransformReader extends D } public String getAttributePrefix(int arg0) { - if (pushBackQName != null) { + if (!pushedBackEvents.empty()) { throwIndexException(arg0, 0); } checkAttributeIndexRange(arg0); @@ -342,7 +397,7 @@ public class InTransformReader extends D } public String getAttributeType(int arg0) { - if (pushBackQName != null) { + if (!pushedBackEvents.empty()) { throwIndexException(arg0, 0); } checkAttributeIndexRange(arg0); @@ -350,7 +405,7 @@ public class InTransformReader extends D } public String getAttributeValue(int arg0) { - if (pushBackQName != null) { + if (!pushedBackEvents.empty()) { throwIndexException(arg0, 0); } checkAttributeIndexRange(arg0); @@ -358,7 +413,7 @@ public class InTransformReader extends D } public String getAttributeValue(String namespace, String localName) { - if (pushBackQName != null) { + if (!pushedBackEvents.empty()) { return null; } checkAttributeIndexRange(-1); @@ -367,8 +422,8 @@ public class InTransformReader extends D } public String getText() { - if (currentText != null) { - return currentText; + if (currentEvent != null) { + return currentEvent.value; } String superText = super.getText(); if (replaceText != null) { @@ -379,8 +434,8 @@ public class InTransformReader extends D } public char[] getTextCharacters() { - if (currentText != null) { - return currentText.toCharArray(); + if (currentEvent != null && currentEvent != null) { + return currentEvent.value.toCharArray(); } char[] superChars = super.getTextCharacters(); if (replaceText != null) { @@ -392,12 +447,12 @@ public class InTransformReader extends D public int getTextCharacters(int sourceStart, char[] target, int targetStart, int length) throws XMLStreamException { - if (currentText != null) { - int len = currentText.length() - sourceStart; + if (currentEvent != null && currentEvent != null) { + int len = currentEvent.value.length() - sourceStart; if (len > length) { len = length; } - currentText.getChars(sourceStart, sourceStart + len, target, targetStart); + currentEvent.value.getChars(sourceStart, sourceStart + len, target, targetStart); return len; } @@ -405,8 +460,8 @@ public class InTransformReader extends D } public int getTextLength() { - if (currentText != null) { - return currentText.length(); + if (currentEvent != null && currentEvent.value != null) { + return currentEvent.value.length(); } return super.getTextLength(); } @@ -424,7 +479,7 @@ public class InTransformReader extends D for (int i = 0; i < c; i++) { QName aname = super.getAttributeName(i); QName expected = inAttributesMap.get(aname); - if (expected == null || !isEmpty(expected)) { + if (expected == null || !isEmptyQName(expected)) { attributesIndexes.add(i); } } @@ -434,9 +489,75 @@ public class InTransformReader extends D throwIndexException(index, attributesIndexes.size()); } } - + + private static boolean isEmptyQName(QName qname) { + return XMLConstants.NULL_NS_URI.equals(qname.getNamespaceURI()) && "".equals(qname.getLocalPart()); + } + private void throwIndexException(int index, int size) { throw new IllegalArgumentException("Invalid index " + index + "; current element has only " + size + " attributes"); } + + private static ParsingEvent createStartElementEvent(QName name) { + return new ParsingEvent(XMLStreamConstants.START_ELEMENT, name, null); + } + + private static ParsingEvent createEndElementEvent(QName name) { + return new ParsingEvent(XMLStreamConstants.END_ELEMENT, name, null); + } + + private static ParsingEvent createCharactersEvent(String value) { + return new ParsingEvent(XMLStreamConstants.CHARACTERS, null, value); + } + + private static class ParsingEvent { + private int event; + private QName name; + private String value; + + public ParsingEvent(int event, QName name, String value) { + this.event = event; + this.name = name; + this.value = value; + } + + public String toString() { + return new StringBuffer().append("Event("). + append(event).append(", ").append(name).append(", ").append(value).append(")"). + toString(); + } + } + + private static class EndEventMarker { + private QName name; + private int level; + + public EndEventMarker(QName name, int level) { + this.name = name; + this.level = level; + } + + /** {@inheritDoc}*/ + @Override + public int hashCode() { + return name.hashCode() ^ level; + } + + /** {@inheritDoc}*/ + @Override + public boolean equals(Object obj) { + if (obj instanceof EndEventMarker) { + EndEventMarker e = (EndEventMarker)obj; + return name.equals(e.name) && level == e.level; + } + return false; + } + + public String toString() { + return new StringBuffer().append("Marker("). + append(name).append(", ").append(level).append(")"). + toString(); + } + } } Added: cxf/trunk/common/common/src/test/java/org/apache/cxf/staxutils/resources/AddRequestIn3.xml URL: http://svn.apache.org/viewvc/cxf/trunk/common/common/src/test/java/org/apache/cxf/staxutils/resources/AddRequestIn3.xml?rev=1188566&view=auto ============================================================================== --- cxf/trunk/common/common/src/test/java/org/apache/cxf/staxutils/resources/AddRequestIn3.xml (added) +++ cxf/trunk/common/common/src/test/java/org/apache/cxf/staxutils/resources/AddRequestIn3.xml Tue Oct 25 08:46:16 2011 @@ -0,0 +1,26 @@ + + + + + 1 + 2 + 3 + + Propchange: cxf/trunk/common/common/src/test/java/org/apache/cxf/staxutils/resources/AddRequestIn3.xml ------------------------------------------------------------------------------ svn:executable = * Added: cxf/trunk/common/common/src/test/java/org/apache/cxf/staxutils/resources/amazonIn2.xml URL: http://svn.apache.org/viewvc/cxf/trunk/common/common/src/test/java/org/apache/cxf/staxutils/resources/amazonIn2.xml?rev=1188566&view=auto ============================================================================== --- cxf/trunk/common/common/src/test/java/org/apache/cxf/staxutils/resources/amazonIn2.xml (added) +++ cxf/trunk/common/common/src/test/java/org/apache/cxf/staxutils/resources/amazonIn2.xml Tue Oct 25 08:46:16 2011 @@ -0,0 +1,26 @@ + + + + 1E5AY4ZG53H4AMC8QH82 + dandiephosblo-20 + + ASIN + + \ No newline at end of file Propchange: cxf/trunk/common/common/src/test/java/org/apache/cxf/staxutils/resources/amazonIn2.xml ------------------------------------------------------------------------------ svn:executable = * Added: cxf/trunk/common/common/src/test/java/org/apache/cxf/staxutils/resources/amazonIn2nospace.xml URL: http://svn.apache.org/viewvc/cxf/trunk/common/common/src/test/java/org/apache/cxf/staxutils/resources/amazonIn2nospace.xml?rev=1188566&view=auto ============================================================================== --- cxf/trunk/common/common/src/test/java/org/apache/cxf/staxutils/resources/amazonIn2nospace.xml (added) +++ cxf/trunk/common/common/src/test/java/org/apache/cxf/staxutils/resources/amazonIn2nospace.xml Tue Oct 25 08:46:16 2011 @@ -0,0 +1,20 @@ + + +1E5AY4ZG53H4AMC8QH82dandiephosblo-20ASIN Propchange: cxf/trunk/common/common/src/test/java/org/apache/cxf/staxutils/resources/amazonIn2nospace.xml ------------------------------------------------------------------------------ svn:executable = * Modified: cxf/trunk/common/common/src/test/java/org/apache/cxf/staxutils/transform/InTransformReaderTest.java URL: http://svn.apache.org/viewvc/cxf/trunk/common/common/src/test/java/org/apache/cxf/staxutils/transform/InTransformReaderTest.java?rev=1188566&r1=1188565&r2=1188566&view=diff ============================================================================== --- cxf/trunk/common/common/src/test/java/org/apache/cxf/staxutils/transform/InTransformReaderTest.java (original) +++ cxf/trunk/common/common/src/test/java/org/apache/cxf/staxutils/transform/InTransformReaderTest.java Tue Oct 25 08:46:16 2011 @@ -26,12 +26,14 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.logging.Logger; import javax.xml.namespace.QName; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; +import org.apache.cxf.common.logging.LogUtils; import org.apache.cxf.staxutils.PartialXMLStreamReader; import org.apache.cxf.staxutils.StaxUtils; @@ -39,7 +41,8 @@ import org.junit.Assert; import org.junit.Test; public class InTransformReaderTest extends Assert { - + private static final Logger LOG = LogUtils.getLogger(InTransformReaderTest.class); + @Test public void testReadWithDefaultNamespace() throws Exception { InputStream is = new ByteArrayInputStream("".getBytes()); @@ -351,8 +354,8 @@ public class InTransformReaderTest exten public void testReadWithAppendPostInclude1() throws Exception { Map appendElements = new HashMap(); appendElements.put("{http://xml.amazon.com/AWSECommerceService/2004-08-01}Request/", - "{http://xml.amazon.com/AWSECommerceService/2004-08-01}IdType=ASIN"); - transformStreamAndCompare("../resources/amazonIn1.xml", "../resources/amazon.xml", + "{http://xml.amazon.com/AWSECommerceService/2004-08-01}ItemId=0486411214"); + transformStreamAndCompare("../resources/amazonIn2.xml", "../resources/amazon.xml", null, appendElements, null, null, null); } @@ -361,8 +364,8 @@ public class InTransformReaderTest exten public void testReadWithAppendPostInclude2() throws Exception { Map appendElements = new HashMap(); appendElements.put("{http://xml.amazon.com/AWSECommerceService/2004-08-01}Request/", - "{http://xml.amazon.com/AWSECommerceService/2004-08-01}IdType=ASIN"); - transformStreamAndCompare("../resources/amazonIn1nospace.xml", "../resources/amazon.xml", + "{http://xml.amazon.com/AWSECommerceService/2004-08-01}ItemId=0486411214"); + transformStreamAndCompare("../resources/amazonIn2nospace.xml", "../resources/amazon.xml", null, appendElements, null, null, null); } @@ -387,6 +390,30 @@ public class InTransformReaderTest exten } + @Test + public void testReadWithAppendPostWrapReplaceDrop() throws Exception { + Map transformElements = new HashMap(); + transformElements.put("payload", + "{http://www.w3.org/2003/05/soap-envelope}Envelope"); + transformElements.put("params", + "{http://apache.org/cxf/calculator/types}add"); + transformElements.put("i1", + "{http://apache.org/cxf/calculator/types}arg0"); + transformElements.put("i2", + "{http://apache.org/cxf/calculator/types}arg1"); + transformElements.put("i3", + ""); + Map appendElements = new HashMap(); + appendElements.put("payload/", + "{http://www.w3.org/2003/05/soap-envelope}Body"); + List dropElements = new ArrayList(); + dropElements.add("param"); + + transformStreamAndCompare("../resources/AddRequestIn3.xml", "../resources/AddRequest.xml", + transformElements, appendElements, dropElements, null, null); + + } + // test utilities methods private void transformStreamAndCompare(String inname, String outname, @@ -430,20 +457,24 @@ public class InTransformReaderTest exten if (revent == -1 && tevent == -1) { break; } - assertEquals(revent, tevent); + LOG.fine("Event: " + tevent + " ? " + revent); + assertEquals(tevent, revent); switch (revent) { case XMLStreamConstants.START_ELEMENT: + LOG.fine("Start Element " + teacher.getName() + " ? " + reader.getName()); assertEquals(teacher.getName(), reader.getName()); verifyAttributes(reader, teacher); break; case XMLStreamConstants.END_ELEMENT: + LOG.fine("End Element " + teacher.getName() + " ? " + reader.getName()); if (eec) { // perform end-element-check assertEquals(teacher.getName(), reader.getName()); } break; case XMLStreamConstants.CHARACTERS: + LOG.fine("Characters " + teacher.getText() + " ? " + reader.getText()); assertEquals(teacher.getText(), reader.getText()); break; default: