You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by ff...@apache.org on 2010/11/19 10:35:24 UTC
svn commit: r1036774 - in /cxf/branches/2.2.x-fixes: ./
common/common/src/main/java/org/apache/cxf/staxutils/
systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/
systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/resources/
Author: ffang
Date: Fri Nov 19 09:35:24 2010
New Revision: 1036774
URL: http://svn.apache.org/viewvc?rev=1036774&view=rev
Log:
Merged revisions 1036766 via svnmerge from
https://svn.apache.org/repos/asf/cxf/branches/2.3.x-fixes
................
r1036766 | ffang | 2010-11-19 17:08:04 +0800 (五, 19 11 2010) | 9 lines
Merged revisions 1036765 via svnmerge from
https://svn.apache.org/repos/asf/cxf/trunk
........
r1036765 | ffang | 2010-11-19 16:59:01 +0800 (五, 19 11 2010) | 1 line
[CXF-3132]refactor StaxUtils not to use recursive to avoid StackOverflowError
........
................
Removed:
cxf/branches/2.2.x-fixes/systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/resources/stack_overflow_rs.xml
Modified:
cxf/branches/2.2.x-fixes/ (props changed)
cxf/branches/2.2.x-fixes/common/common/src/main/java/org/apache/cxf/staxutils/StaxUtils.java
cxf/branches/2.2.x-fixes/systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/DispatchClientServerWithHugeResponseTest.java
cxf/branches/2.2.x-fixes/systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/HugeResponseInterceptor.java
Propchange: cxf/branches/2.2.x-fixes/
------------------------------------------------------------------------------
Binary property 'svnmerge-integrated' - no diff available.
Modified: cxf/branches/2.2.x-fixes/common/common/src/main/java/org/apache/cxf/staxutils/StaxUtils.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/common/common/src/main/java/org/apache/cxf/staxutils/StaxUtils.java?rev=1036774&r1=1036773&r2=1036774&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/common/common/src/main/java/org/apache/cxf/staxutils/StaxUtils.java (original)
+++ cxf/branches/2.2.x-fixes/common/common/src/main/java/org/apache/cxf/staxutils/StaxUtils.java Fri Nov 19 09:35:24 2010
@@ -26,6 +26,7 @@ import java.io.StringWriter;
import java.io.Writer;
import java.net.URL;
import java.util.Iterator;
+import java.util.Stack;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.logging.Logger;
@@ -872,74 +873,27 @@ public final class StaxUtils {
return (parent instanceof Document) ? (Document)parent : parent.getOwnerDocument();
}
- /**
- * @param parent
- * @param reader
- * @return
- * @throws XMLStreamException
- */
- private static Element startElement(Document doc,
- Node parent,
- XMLStreamReader reader,
- boolean repairing,
- boolean recordLocation)
- throws XMLStreamException {
-
- Element e = doc.createElementNS(reader.getNamespaceURI(), reader.getLocalName());
- if (reader.getPrefix() != null) {
- e.setPrefix(reader.getPrefix());
- }
- e = (Element)parent.appendChild(e);
- recordLocation = addLocation(doc, e, reader, recordLocation);
-
- for (int ns = 0; ns < reader.getNamespaceCount(); ns++) {
- String uri = reader.getNamespaceURI(ns);
- String prefix = reader.getNamespacePrefix(ns);
-
- declare(e, uri, prefix);
- }
-
- for (int att = 0; att < reader.getAttributeCount(); att++) {
- String name = reader.getAttributeLocalName(att);
- String prefix = reader.getAttributePrefix(att);
+ private static boolean isDeclared(Element e, String namespaceURI, String prefix) {
+ while (e != null) {
+ Attr att;
if (prefix != null && prefix.length() > 0) {
- name = prefix + ":" + name;
+ att = e.getAttributeNodeNS(XML_NS, prefix);
+ } else {
+ att = e.getAttributeNode("xmlns");
+ }
+
+ if (att != null && att.getNodeValue().equals(namespaceURI)) {
+ return true;
+ }
+
+ if (e.getParentNode() instanceof Element) {
+ e = (Element)e.getParentNode();
+ } else if (StringUtils.isEmpty(prefix) && StringUtils.isEmpty(namespaceURI)) {
+ //A document that probably doesn't have any namespace qualifies elements
+ return true;
+ } else {
+ e = null;
}
-
- Attr attr = doc.createAttributeNS(reader.getAttributeNamespace(att), name);
- attr.setValue(reader.getAttributeValue(att));
- e.setAttributeNode(attr);
- }
-
- if (repairing && !isDeclared(e, reader.getNamespaceURI(), reader.getPrefix())) {
- declare(e, reader.getNamespaceURI(), reader.getPrefix());
- }
-
- reader.next();
-
- readDocElements(doc, e, reader, repairing, recordLocation);
-
- return e;
- }
-
- private static boolean isDeclared(Element e, String namespaceURI, String prefix) {
- Attr att;
- if (prefix != null && prefix.length() > 0) {
- att = e.getAttributeNodeNS(XML_NS, prefix);
- } else {
- att = e.getAttributeNode("xmlns");
- }
-
- if (att != null && att.getNodeValue().equals(namespaceURI)) {
- return true;
- }
-
- if (e.getParentNode() instanceof Element) {
- return isDeclared((Element)e.getParentNode(), namespaceURI, prefix);
- }
- if (StringUtils.isEmpty(prefix) && StringUtils.isEmpty(namespaceURI)) {
- //A document that probably doesn't have any namespace qualifies elements
- return true;
}
return false;
}
@@ -957,19 +911,58 @@ public final class StaxUtils {
public static void readDocElements(Document doc, Node parent,
XMLStreamReader reader, boolean repairing, boolean recordLoc)
throws XMLStreamException {
-
+
+ Stack<Node> stack = new Stack<Node>();
int event = reader.getEventType();
while (reader.hasNext()) {
switch (event) {
- case XMLStreamConstants.START_ELEMENT:
- startElement(doc, parent, reader, repairing, recordLoc);
+ case XMLStreamConstants.START_ELEMENT: {
+ Element e = doc.createElementNS(reader.getNamespaceURI(), reader.getLocalName());
+ if (reader.getPrefix() != null) {
+ e.setPrefix(reader.getPrefix());
+ }
+ e = (Element)parent.appendChild(e);
+ recordLoc = addLocation(doc, e, reader, recordLoc);
+
+ for (int ns = 0; ns < reader.getNamespaceCount(); ns++) {
+ String uri = reader.getNamespaceURI(ns);
+ String prefix = reader.getNamespacePrefix(ns);
+
+ declare(e, uri, prefix);
+ }
+
+ for (int att = 0; att < reader.getAttributeCount(); att++) {
+ String name = reader.getAttributeLocalName(att);
+ String prefix = reader.getAttributePrefix(att);
+ if (prefix != null && prefix.length() > 0) {
+ name = prefix + ":" + name;
+ }
+
+ Attr attr = doc.createAttributeNS(reader.getAttributeNamespace(att), name);
+ attr.setValue(reader.getAttributeValue(att));
+ e.setAttributeNode(attr);
+ }
+
+ if (repairing && !isDeclared(e, reader.getNamespaceURI(), reader.getPrefix())) {
+ declare(e, reader.getNamespaceURI(), reader.getPrefix());
+ }
+ stack.push(parent);
+ parent = e;
+
+ //event = reader.next();
+ //readDocElements(doc, e, reader, repairing, recordLoc);
+ break;
+ }
+ case XMLStreamConstants.END_ELEMENT:
+ if (stack.isEmpty()) {
+ return;
+ }
+ parent = stack.pop();
if (parent instanceof Document) {
return;
}
break;
- case XMLStreamConstants.END_ELEMENT:
- return;
case XMLStreamConstants.NAMESPACE:
break;
case XMLStreamConstants.ATTRIBUTE:
Modified: cxf/branches/2.2.x-fixes/systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/DispatchClientServerWithHugeResponseTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/DispatchClientServerWithHugeResponseTest.java?rev=1036774&r1=1036773&r2=1036774&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/DispatchClientServerWithHugeResponseTest.java (original)
+++ cxf/branches/2.2.x-fixes/systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/DispatchClientServerWithHugeResponseTest.java Fri Nov 19 09:35:24 2010
@@ -117,11 +117,12 @@ public class DispatchClientServerWithHug
assertNotNull(soapReqMsg3);
Response<SOAPMessage> response = disp.invokeAsync(soapReqMsg3);
try {
- response.get(10, TimeUnit.SECONDS);
+ response.get(300, TimeUnit.SECONDS);
} catch (TimeoutException te) {
fail("We should not have encountered a timeout, "
+ "should get some exception tell me stackoverflow");
} catch (Throwable e) {
+ e.printStackTrace();
assertTrue(e.getCause() instanceof StackOverflowError);
}
Modified: cxf/branches/2.2.x-fixes/systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/HugeResponseInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/HugeResponseInterceptor.java?rev=1036774&r1=1036773&r2=1036774&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/HugeResponseInterceptor.java (original)
+++ cxf/branches/2.2.x-fixes/systests/jaxws/src/test/java/org/apache/cxf/systest/dispatch/HugeResponseInterceptor.java Fri Nov 19 09:35:24 2010
@@ -18,13 +18,9 @@
*/
package org.apache.cxf.systest.dispatch;
-import java.io.IOException;
-import java.io.InputStream;
-import org.apache.cxf.helpers.IOUtils;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.interceptor.LoggingInInterceptor;
-import org.apache.cxf.io.CachedOutputStream;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
@@ -37,26 +33,7 @@ public class HugeResponseInterceptor ext
}
public void handleMessage(Message message) throws Fault {
- InputStream is = message.getContent(InputStream.class);
- if (is != null) {
- CachedOutputStream bos = new CachedOutputStream();
- try {
- //intend to change response as malformed message
- is = getClass().getClassLoader().getResourceAsStream(
- "org/apache/cxf/systest/dispatch/resources/stack_overflow_rs.xml");
- IOUtils.copy(is, bos);
-
- bos.flush();
- is.close();
- message.setContent(InputStream.class, bos.getInputStream());
- bos.close();
- message.setContent(InputStream.class, bos.getInputStream());
-
- } catch (IOException e) {
- throw new Fault(e);
- }
- }
-
+ throw new StackOverflowError();
}
}