You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by tl...@apache.org on 2006/11/17 07:18:38 UTC
svn commit: r476057 - in /incubator/cxf/trunk:
api/src/main/java/org/apache/cxf/interceptor/
api/src/main/java/org/apache/cxf/message/
rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/
rt/core/src/main/java/org/apache/cxf/intercep...
Author: tli
Date: Thu Nov 16 22:18:37 2006
New Revision: 476057
URL: http://svn.apache.org/viewvc?view=rev&rev=476057
Log:
add stack trace config & support for soap 11 fault
Added:
incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxws/fault-stack-trace.xml (with props)
Modified:
incubator/cxf/trunk/api/src/main/java/org/apache/cxf/interceptor/Fault.java
incubator/cxf/trunk/api/src/main/java/org/apache/cxf/message/Message.java
incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/Soap11FaultOutInterceptor.java
incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/ClientFaultConverter.java
incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/EndpointImpl.java
incubator/cxf/trunk/rt/frontend/simple/src/main/java/org/apache/cxf/service/factory/ServerFactoryBean.java
incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxws/ClientServerTest.java
Modified: incubator/cxf/trunk/api/src/main/java/org/apache/cxf/interceptor/Fault.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/api/src/main/java/org/apache/cxf/interceptor/Fault.java?view=diff&rev=476057&r1=476056&r2=476057
==============================================================================
--- incubator/cxf/trunk/api/src/main/java/org/apache/cxf/interceptor/Fault.java (original)
+++ incubator/cxf/trunk/api/src/main/java/org/apache/cxf/interceptor/Fault.java Thu Nov 16 22:18:37 2006
@@ -31,6 +31,7 @@
*/
public class Fault extends UncheckedException {
+ public static final String STACKTRACE = "stackTrace";
private Element detail;
private String message;
Modified: incubator/cxf/trunk/api/src/main/java/org/apache/cxf/message/Message.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/api/src/main/java/org/apache/cxf/message/Message.java?view=diff&rev=476057&r1=476056&r2=476057
==============================================================================
--- incubator/cxf/trunk/api/src/main/java/org/apache/cxf/message/Message.java (original)
+++ incubator/cxf/trunk/api/src/main/java/org/apache/cxf/message/Message.java Thu Nov 16 22:18:37 2006
@@ -47,7 +47,7 @@
String QUERY_STRING = Message.class.getName() + ".QUERY_STRING";
String MTOM_ENABLED = Message.class.getName() + ".isMtomEnabled";
String SCHEMA_VALIDATION_ENABLED = Message.class.getCanonicalName() + ".schemaValidationEnabled";
- String FAULT_STACKTRACE_ENABLED = Message.class.getCanonicalName() + ".faultStackTraceEnabled";
+ String FAULT_STACKTRACE_ENABLED = "faultStackTraceEnabled";
String CONTENT_TYPE = Message.class.getName() + ".ContentType";
String BASE_PATH = Message.class.getName() + ".BASE_PATH";
String ENCODING = Message.class.getName() + ".ENCODING";
Modified: incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/Soap11FaultOutInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/Soap11FaultOutInterceptor.java?view=diff&rev=476057&r1=476056&r2=476057
==============================================================================
--- incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/Soap11FaultOutInterceptor.java (original)
+++ incubator/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/Soap11FaultOutInterceptor.java Thu Nov 16 22:18:37 2006
@@ -82,23 +82,29 @@
writer.writeCharacters("Fault occurred while processing.");
}
writer.writeEndElement();
- Object config = message.getContextualProperty(
+ String config = (String)message.getContextualProperty(
org.apache.cxf.message.Message.FAULT_STACKTRACE_ENABLED);
- if (config != null && Boolean.TRUE.equals(config) && fault.getCause() != null) {
+ if (config != null && Boolean.valueOf(config).booleanValue() && fault.getCause() != null) {
StringBuffer sb = new StringBuffer();
- for (StackTraceElement stk : fault.getCause().getStackTrace()) {
- sb.append(stk.toString());
+ for (StackTraceElement ste : fault.getCause().getStackTrace()) {
+ sb.append(ste.getClassName() + "!" + ste.getMethodName() + "!" + ste.getFileName()
+ + "!" + ste.getLineNumber() + "\n");
}
try {
- if (fault.getDetail() == null) {
+ Element detail = fault.getDetail();
+ if (detail == null) {
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder()
- .newDocument();
- Element detail = doc.createElementNS(Soap11.SOAP_NAMESPACE, "detail");
- Element stackTrace = doc.createElementNS(Soap11.SOAP_NAMESPACE, "stackTrace");
+ .newDocument();
+ Element stackTrace = doc.createElementNS(Soap11.SOAP_NAMESPACE, Fault.STACKTRACE);
stackTrace.setTextContent(sb.toString());
- detail.appendChild(stackTrace);
+ detail = doc.createElementNS(Soap11.SOAP_NAMESPACE, "detail");
fault.setDetail(detail);
- }
+ detail.appendChild(stackTrace);
+ } else {
+ Element stackTrace = detail.getOwnerDocument().createElementNS(
+ Soap11.SOAP_NAMESPACE, Fault.STACKTRACE);
+ detail.appendChild(stackTrace);
+ }
} catch (ParserConfigurationException pe) {
// move on...
}
Modified: incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/ClientFaultConverter.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/ClientFaultConverter.java?view=diff&rev=476057&r1=476056&r2=476057
==============================================================================
--- incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/ClientFaultConverter.java (original)
+++ incubator/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/ClientFaultConverter.java Thu Nov 16 22:18:37 2006
@@ -19,6 +19,9 @@
package org.apache.cxf.interceptor;
import java.lang.reflect.Constructor;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.StringTokenizer;
import javax.xml.namespace.QName;
@@ -53,13 +56,14 @@
if (fault.getDetail() != null) {
processFaultDetail(fault, msg);
+ setStackTrace(fault, msg);
}
}
protected void processFaultDetail(Fault fault, Message msg) {
Element exDetail = (Element) DOMUtils.getChild(fault.getDetail(), Node.ELEMENT_NODE);
QName qname = new QName(exDetail.getNamespaceURI(), exDetail.getLocalName());
- FaultInfo faultWanted = null;
+ FaultInfo faultWanted = null;
MessagePartInfo part = null;
BindingOperationInfo boi = msg.getExchange().get(BindingOperationInfo.class);
if (boi.isUnwrapped()) {
@@ -76,22 +80,18 @@
if (faultWanted != null) {
break;
}
- }
-
+ }
if (faultWanted == null) {
return;
}
-
Service s = msg.getExchange().get(Service.class);
DataBinding dataBinding = s.getDataBinding();
DataReader<Node> reader = dataBinding.getDataReaderFactory().createReader(Node.class);
Object e = reader.read(part, exDetail);
-
if (!(e instanceof Exception)) {
Class exClass = faultWanted.getProperty(Class.class.getName(), Class.class);
Class beanClass = e.getClass();
-
try {
Constructor constructor = exClass.getConstructor(new Class[]{String.class, beanClass});
e = constructor.newInstance(new Object[]{fault.getMessage(), e});
@@ -99,8 +99,43 @@
throw new Fault(e1);
}
}
-
msg.setContent(Exception.class, e);
}
+ private void setStackTrace(Fault fault, Message msg) {
+ Element exDetail = (Element) DOMUtils.getChild(fault.getDetail(), Node.ELEMENT_NODE);
+ List<StackTraceElement> stackTraceList = new ArrayList<StackTraceElement>();
+ while (exDetail != null) {
+ if (((Element) exDetail).getLocalName().equals(Fault.STACKTRACE)) {
+ String content = exDetail.getTextContent();
+ if (content != null) {
+ StringTokenizer st = new StringTokenizer(content, "\n");
+ while (st.hasMoreTokens()) {
+ String oneLine = st.nextToken();
+ StringTokenizer stInner = new StringTokenizer(oneLine, "!");
+ StackTraceElement ste = new StackTraceElement(stInner.nextToken(), stInner
+ .nextToken(), stInner.nextToken(), Integer.parseInt(stInner.nextToken()));
+ stackTraceList.add(ste);
+ }
+ }
+ if (stackTraceList.size() > 0) {
+ StackTraceElement[] stackTraceElement = new StackTraceElement[stackTraceList.size()];
+ Exception e = msg.getContent(Exception.class);
+ e.setStackTrace(stackTraceList.toArray(stackTraceElement));
+ }
+ }
+ Node next = exDetail.getNextSibling();
+ while (!(next instanceof Element)) {
+ next = exDetail.getNextSibling();
+ if (next == null) {
+ break;
+ }
+ }
+ if (next instanceof Element) {
+ exDetail = (Element) next;
+ } else {
+ exDetail = null;
+ }
+ }
+ }
}
Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/EndpointImpl.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/EndpointImpl.java?view=diff&rev=476057&r1=476056&r2=476057
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/EndpointImpl.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/EndpointImpl.java Thu Nov 16 22:18:37 2006
@@ -205,6 +205,7 @@
svrFactory.setAddress(address);
svrFactory.setServiceFactory(serviceFactory);
svrFactory.setStart(false);
+ configureObject(svrFactory);
// TODO: Replace with discovery mechanism!!
AbstractBindingInfoFactoryBean bindingFactory = null;
Modified: incubator/cxf/trunk/rt/frontend/simple/src/main/java/org/apache/cxf/service/factory/ServerFactoryBean.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/simple/src/main/java/org/apache/cxf/service/factory/ServerFactoryBean.java?view=diff&rev=476057&r1=476056&r2=476057
==============================================================================
--- incubator/cxf/trunk/rt/frontend/simple/src/main/java/org/apache/cxf/service/factory/ServerFactoryBean.java (original)
+++ incubator/cxf/trunk/rt/frontend/simple/src/main/java/org/apache/cxf/service/factory/ServerFactoryBean.java Thu Nov 16 22:18:37 2006
@@ -68,6 +68,10 @@
setServiceFactory(new ReflectionServiceFactoryBean());
}
+ public String getBeanName() {
+ return this.getClass().getName();
+ }
+
public Server create() {
try {
Endpoint ep = createEndpoint();
Modified: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxws/ClientServerTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxws/ClientServerTest.java?view=diff&rev=476057&r1=476056&r2=476057
==============================================================================
--- incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxws/ClientServerTest.java (original)
+++ incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxws/ClientServerTest.java Thu Nov 16 22:18:37 2006
@@ -81,7 +81,11 @@
public static class Server extends TestServerBase {
- protected void run() {
+ protected void run() {
+ URL url = getClass().getResource("fault-stack-trace.xml");
+ if (url != null) {
+ System.setProperty("cxf.config.file.url", url.toString());
+ }
Object implementor = new GreeterImpl();
String address = "http://localhost:9000/SoapContext/SoapPort";
Endpoint.publish(address, implementor);
@@ -107,14 +111,19 @@
public static Test suite() throws Exception {
TestSuite suite = new TestSuite(ClientServerTest.class);
return new ClientServerSetupBase(suite) {
- public void startServers() throws Exception {
+ public void startServers() throws Exception {
assertTrue("server did not launch correctly", launchServer(Server.class));
}
+ public void setUp() throws Exception {
+ // set up configuration to enable schema validation
+ URL url = getClass().getResource("fault-stack-trace.xml");
+ assertNotNull("cannot find test resource", url);
+ configFileName = url.toString();
+ super.setUp();
+ }
};
-
-
-
}
+
public void testBasicConnection() throws Exception {
@@ -476,13 +485,25 @@
}
+ }
+ public void testFaultStackTrace() throws Exception {
+ System.setProperty("cxf.config.file.url",
+ getClass().getResource("fault-stack-trace.xml").toString());
+ URL wsdl = getClass().getResource("/wsdl/hello_world.wsdl");
+ assertNotNull(wsdl);
+ SOAPService service = new SOAPService(wsdl, serviceName);
+ ExecutorService ex = Executors.newFixedThreadPool(1);
+ service.setExecutor(ex);
+ assertNotNull(service);
+ Greeter greeter = service.getPort(portName, Greeter.class);
try {
// trigger runtime exception throw of implementor method
greeter.testDocLitFault("");
fail("Should have thrown Runtime exception");
} catch (Exception e) {
- assertEquals("can't get back original message", "Unknown source", e.getMessage());
- }
+ assertEquals("can't get back original message", "Unknown source", e.getMessage());
+ assertTrue(e.getStackTrace().length > 0);
+ }
}
public void testGetSayHi() throws Exception {
Added: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxws/fault-stack-trace.xml
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxws/fault-stack-trace.xml?view=auto&rev=476057
==============================================================================
--- incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxws/fault-stack-trace.xml (added)
+++ incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxws/fault-stack-trace.xml Thu Nov 16 22:18:37 2006
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:foo="http://cxf.apache.org/configuration/foo"
+ xsi:schemaLocation="
+http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
+
+ <bean class="org.apache.cxf.service.factory.ServerFactoryBean" id="org.apache.cxf.service.factory.ServerFactoryBean">
+ <property name="properties">
+ <map>
+ <entry key="faultStackTraceEnabled" value="true" />
+ </map>
+ </property>
+ </bean>
+
+</beans>
\ No newline at end of file
Propchange: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxws/fault-stack-trace.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxws/fault-stack-trace.xml
------------------------------------------------------------------------------
svn:keywords = Rev Date
Propchange: incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxws/fault-stack-trace.xml
------------------------------------------------------------------------------
svn:mime-type = text/xml