You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by gn...@apache.org on 2006/02/01 12:47:35 UTC
svn commit: r374053 - in /incubator/servicemix/trunk/servicemix-jsr181: ./
src/main/java/org/apache/servicemix/jsr181/
src/main/java/org/apache/servicemix/jsr181/xfire/
src/test/java/org/apache/servicemix/jsr181/
Author: gnodet
Date: Wed Feb 1 03:47:14 2006
New Revision: 374053
URL: http://svn.apache.org/viewcvs?rev=374053&view=rev
Log:
SM-291: Faults returned by servicemix-jsr181 do not contain valid xml and are soap specific
Added:
incubator/servicemix/trunk/servicemix-jsr181/src/main/java/org/apache/servicemix/jsr181/Jsr181Configuration.java
incubator/servicemix/trunk/servicemix-jsr181/src/main/java/org/apache/servicemix/jsr181/Jsr181ConfigurationMBean.java
incubator/servicemix/trunk/servicemix-jsr181/src/main/java/org/apache/servicemix/jsr181/xfire/JbiFaultSerializer.java
Modified:
incubator/servicemix/trunk/servicemix-jsr181/project.xml
incubator/servicemix/trunk/servicemix-jsr181/src/main/java/org/apache/servicemix/jsr181/Jsr181Endpoint.java
incubator/servicemix/trunk/servicemix-jsr181/src/main/java/org/apache/servicemix/jsr181/Jsr181ExchangeProcessor.java
incubator/servicemix/trunk/servicemix-jsr181/src/main/java/org/apache/servicemix/jsr181/Jsr181LifeCycle.java
incubator/servicemix/trunk/servicemix-jsr181/src/test/java/org/apache/servicemix/jsr181/Jsr181ComplexPojoTest.java
Modified: incubator/servicemix/trunk/servicemix-jsr181/project.xml
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-jsr181/project.xml?rev=374053&r1=374052&r2=374053&view=diff
==============================================================================
--- incubator/servicemix/trunk/servicemix-jsr181/project.xml (original)
+++ incubator/servicemix/trunk/servicemix-jsr181/project.xml Wed Feb 1 03:47:14 2006
@@ -312,9 +312,6 @@
<include>**/*Test.*</include>
</includes>
<excludes>
- <!-- Only works with xfire 1.0-SNAPSHOT -->
- <exclude>**/Jsr181OverrideTest.*</exclude>
- <exclude>**/JbiProxyTest.*</exclude>
</excludes>
</unitTest>
<resources>
Added: incubator/servicemix/trunk/servicemix-jsr181/src/main/java/org/apache/servicemix/jsr181/Jsr181Configuration.java
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-jsr181/src/main/java/org/apache/servicemix/jsr181/Jsr181Configuration.java?rev=374053&view=auto
==============================================================================
--- incubator/servicemix/trunk/servicemix-jsr181/src/main/java/org/apache/servicemix/jsr181/Jsr181Configuration.java (added)
+++ incubator/servicemix/trunk/servicemix-jsr181/src/main/java/org/apache/servicemix/jsr181/Jsr181Configuration.java Wed Feb 1 03:47:14 2006
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2005-2006 The Apache Software Foundation.
+ *
+ * Licensed 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.
+ */
+package org.apache.servicemix.jsr181;
+
+import org.apache.servicemix.common.PersistentConfiguration;
+
+public class Jsr181Configuration extends PersistentConfiguration implements Jsr181ConfigurationMBean {
+
+ private boolean printStackTraceInFaults;
+
+ public boolean isPrintStackTraceInFaults() {
+ return this.printStackTraceInFaults;
+ }
+
+ public void setPrintStackTraceInFaults(boolean printStackTraceInFaults) {
+ this.printStackTraceInFaults = printStackTraceInFaults;
+ save();
+ }
+
+ public void save() {
+ properties.setProperty("printStackTraceInFaults", Boolean.toString(printStackTraceInFaults));
+ super.save();
+ }
+
+ public boolean load() {
+ if (super.load()) {
+ if (properties.getProperty("printStackTraceInFaults") != null) {
+ printStackTraceInFaults = Boolean.getBoolean(properties.getProperty("printStackTraceInFaults"));
+ }
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+}
Added: incubator/servicemix/trunk/servicemix-jsr181/src/main/java/org/apache/servicemix/jsr181/Jsr181ConfigurationMBean.java
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-jsr181/src/main/java/org/apache/servicemix/jsr181/Jsr181ConfigurationMBean.java?rev=374053&view=auto
==============================================================================
--- incubator/servicemix/trunk/servicemix-jsr181/src/main/java/org/apache/servicemix/jsr181/Jsr181ConfigurationMBean.java (added)
+++ incubator/servicemix/trunk/servicemix-jsr181/src/main/java/org/apache/servicemix/jsr181/Jsr181ConfigurationMBean.java Wed Feb 1 03:47:14 2006
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2005-2006 The Apache Software Foundation.
+ *
+ * Licensed 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.
+ */
+package org.apache.servicemix.jsr181;
+
+public interface Jsr181ConfigurationMBean {
+
+ public boolean isPrintStackTraceInFaults();
+
+ public void setPrintStackTraceInFaults(boolean printStackTraceInFaults);
+
+}
Modified: incubator/servicemix/trunk/servicemix-jsr181/src/main/java/org/apache/servicemix/jsr181/Jsr181Endpoint.java
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-jsr181/src/main/java/org/apache/servicemix/jsr181/Jsr181Endpoint.java?rev=374053&r1=374052&r2=374053&view=diff
==============================================================================
--- incubator/servicemix/trunk/servicemix-jsr181/src/main/java/org/apache/servicemix/jsr181/Jsr181Endpoint.java (original)
+++ incubator/servicemix/trunk/servicemix-jsr181/src/main/java/org/apache/servicemix/jsr181/Jsr181Endpoint.java Wed Feb 1 03:47:14 2006
@@ -34,24 +34,25 @@
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
+import org.apache.servicemix.common.Endpoint;
+import org.apache.servicemix.common.ExchangeProcessor;
+import org.apache.servicemix.common.xbean.XBeanServiceUnit;
+import org.apache.servicemix.jsr181.xfire.JbiFaultSerializer;
+import org.apache.servicemix.jsr181.xfire.JbiTransport;
import org.codehaus.xfire.XFire;
import org.codehaus.xfire.aegis.AegisBindingProvider;
import org.codehaus.xfire.aegis.type.DefaultTypeMappingRegistry;
import org.codehaus.xfire.aegis.type.TypeMappingRegistry;
import org.codehaus.xfire.annotations.AnnotationServiceFactory;
import org.codehaus.xfire.annotations.WebAnnotations;
-import org.codehaus.xfire.annotations.jsr181.Jsr181WebAnnotations;
import org.codehaus.xfire.annotations.commons.CommonsWebAttributes;
+import org.codehaus.xfire.annotations.jsr181.Jsr181WebAnnotations;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.BeanInvoker;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;
import org.codehaus.xfire.soap.SoapConstants;
import org.codehaus.xfire.transport.TransportManager;
import org.codehaus.xfire.xmlbeans.XmlBeansTypeRegistry;
-import org.apache.servicemix.common.Endpoint;
-import org.apache.servicemix.common.ExchangeProcessor;
-import org.apache.servicemix.common.xbean.XBeanServiceUnit;
-import org.apache.servicemix.jsr181.xfire.JbiTransport;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
@@ -243,6 +244,7 @@
factory.getSoap11Transports().add(JbiTransport.JBI_BINDING);
xfireService = factory.create(serviceClass, svcLocalName, svcNamespace, props);
xfireService.setInvoker(new BeanInvoker(getPojo()));
+ xfireService.setFaultSerializer(new JbiFaultSerializer(getConfiguration()));
xfire.getServiceRegistry().register(xfireService);
this.description = generateWsdl();
@@ -301,6 +303,12 @@
Jsr181LifeCycle jsr181LifeCycle = (Jsr181LifeCycle) this.serviceUnit.getComponent().getLifeCycle();
XFire xfire = jsr181LifeCycle.getXFire();
return xfire;
+ }
+
+ public Jsr181ConfigurationMBean getConfiguration() {
+ Jsr181LifeCycle jsr181LifeCycle = (Jsr181LifeCycle) this.serviceUnit.getComponent().getLifeCycle();
+ Jsr181ConfigurationMBean configuration = jsr181LifeCycle.getConfiguration();
+ return configuration;
}
public String getPojoClass() {
Modified: incubator/servicemix/trunk/servicemix-jsr181/src/main/java/org/apache/servicemix/jsr181/Jsr181ExchangeProcessor.java
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-jsr181/src/main/java/org/apache/servicemix/jsr181/Jsr181ExchangeProcessor.java?rev=374053&r1=374052&r2=374053&view=diff
==============================================================================
--- incubator/servicemix/trunk/servicemix-jsr181/src/main/java/org/apache/servicemix/jsr181/Jsr181ExchangeProcessor.java (original)
+++ incubator/servicemix/trunk/servicemix-jsr181/src/main/java/org/apache/servicemix/jsr181/Jsr181ExchangeProcessor.java Wed Feb 1 03:47:14 2006
@@ -33,15 +33,15 @@
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
+import org.apache.servicemix.common.ExchangeProcessor;
+import org.apache.servicemix.jbi.jaxp.StringSource;
+import org.apache.servicemix.jsr181.xfire.JbiTransport;
import org.codehaus.xfire.MessageContext;
import org.codehaus.xfire.XFire;
import org.codehaus.xfire.exchange.InMessage;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.transport.Channel;
import org.codehaus.xfire.transport.Transport;
-import org.apache.servicemix.common.ExchangeProcessor;
-import org.apache.servicemix.jbi.jaxp.BytesSource;
-import org.apache.servicemix.jsr181.xfire.JbiTransport;
public class Jsr181ExchangeProcessor implements ExchangeProcessor {
@@ -83,12 +83,12 @@
if (isInAndOut(exchange)) {
if (ctx.getExchange().hasFaultMessage() && ctx.getExchange().getFaultMessage().getBody() != null) {
Fault fault = exchange.createFault();
- fault.setContent(new BytesSource(out.toByteArray()));
+ fault.setContent(new StringSource(out.toString()));
exchange.setFault(fault);
exchange.setStatus(ExchangeStatus.ERROR);
} else {
NormalizedMessage outMsg = exchange.createMessage();
- outMsg.setContent(new BytesSource(out.toByteArray()));
+ outMsg.setContent(new StringSource(out.toString()));
exchange.setMessage(outMsg, "out");
}
} else {
Modified: incubator/servicemix/trunk/servicemix-jsr181/src/main/java/org/apache/servicemix/jsr181/Jsr181LifeCycle.java
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-jsr181/src/main/java/org/apache/servicemix/jsr181/Jsr181LifeCycle.java?rev=374053&r1=374052&r2=374053&view=diff
==============================================================================
--- incubator/servicemix/trunk/servicemix-jsr181/src/main/java/org/apache/servicemix/jsr181/Jsr181LifeCycle.java (original)
+++ incubator/servicemix/trunk/servicemix-jsr181/src/main/java/org/apache/servicemix/jsr181/Jsr181LifeCycle.java Wed Feb 1 03:47:14 2006
@@ -15,19 +15,35 @@
*/
package org.apache.servicemix.jsr181;
-import org.codehaus.xfire.XFire;
-import org.codehaus.xfire.XFireFactory;
-import org.codehaus.xfire.transport.Transport;
import org.apache.servicemix.common.BaseComponent;
import org.apache.servicemix.common.BaseLifeCycle;
import org.apache.servicemix.jsr181.xfire.JbiTransport;
+import org.codehaus.xfire.XFire;
+import org.codehaus.xfire.XFireFactory;
+import org.codehaus.xfire.transport.Transport;
public class Jsr181LifeCycle extends BaseLifeCycle {
protected XFire xfire;
+ protected Jsr181Configuration configuration;
public Jsr181LifeCycle(BaseComponent component) {
super(component);
+ configuration = new Jsr181Configuration();
+ }
+
+ /**
+ * @return Returns the configuration.
+ */
+ public Jsr181Configuration getConfiguration() {
+ return configuration;
+ }
+
+ /* (non-Javadoc)
+ * @see org.servicemix.common.BaseComponentLifeCycle#getExtensionMBean()
+ */
+ protected Object getExtensionMBean() throws Exception {
+ return configuration;
}
/**
@@ -42,6 +58,8 @@
*/
protected void doInit() throws Exception {
super.doInit();
+ configuration.setRootDir(context.getWorkspaceRoot());
+ configuration.load();
xfire = XFireFactory.newInstance().getXFire();
Object[] transports = xfire.getTransportManager().getTransports().toArray();
for (int i = 0; i < transports.length; i++) {
Added: incubator/servicemix/trunk/servicemix-jsr181/src/main/java/org/apache/servicemix/jsr181/xfire/JbiFaultSerializer.java
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-jsr181/src/main/java/org/apache/servicemix/jsr181/xfire/JbiFaultSerializer.java?rev=374053&view=auto
==============================================================================
--- incubator/servicemix/trunk/servicemix-jsr181/src/main/java/org/apache/servicemix/jsr181/xfire/JbiFaultSerializer.java (added)
+++ incubator/servicemix/trunk/servicemix-jsr181/src/main/java/org/apache/servicemix/jsr181/xfire/JbiFaultSerializer.java Wed Feb 1 03:47:14 2006
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2005-2006 The Apache Software Foundation.
+ *
+ * Licensed 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.
+ */
+package org.apache.servicemix.jsr181.xfire;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.List;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.apache.servicemix.jsr181.Jsr181ConfigurationMBean;
+import org.codehaus.xfire.MessageContext;
+import org.codehaus.xfire.XFireRuntimeException;
+import org.codehaus.xfire.exchange.InMessage;
+import org.codehaus.xfire.exchange.MessageSerializer;
+import org.codehaus.xfire.exchange.OutMessage;
+import org.codehaus.xfire.fault.XFireFault;
+import org.codehaus.xfire.util.jdom.StaxSerializer;
+import org.jdom.Element;
+
+public class JbiFaultSerializer implements MessageSerializer {
+
+ private Jsr181ConfigurationMBean configuration;
+
+ public JbiFaultSerializer(Jsr181ConfigurationMBean configuration) {
+ this.configuration = configuration;
+ }
+
+ public void readMessage(InMessage message, MessageContext context) throws XFireFault {
+ throw new UnsupportedOperationException();
+ }
+
+ public void writeMessage(OutMessage message, XMLStreamWriter writer, MessageContext context) throws XFireFault {
+ try {
+ XFireFault fault = (XFireFault) message.getBody();
+ writer.writeStartElement("fault");
+ writer.writeStartElement("message");
+ writer.writeCharacters(fault.getMessage());
+ writer.writeEndElement(); // message
+ if (fault.hasDetails()) {
+ Element detail = fault.getDetail();
+ writer.writeStartElement("detail");
+ StaxSerializer serializer = new StaxSerializer();
+ List details = detail.getContent();
+ for (int i = 0; i < details.size(); i++) {
+ serializer.writeElement((Element) details.get(i), writer);
+ }
+ writer.writeEndElement(); // detail
+ }
+ if (configuration.isPrintStackTraceInFaults()) {
+ writer.writeStartElement("stack");
+ StringWriter sw = new StringWriter();
+ PrintWriter pw = new PrintWriter(sw);
+ fault.printStackTrace(pw);
+ pw.close();
+ writer.writeCData(sw.toString());
+ writer.writeEndElement(); // stack
+ }
+ writer.writeEndElement(); // fault
+ } catch (XMLStreamException e) {
+ throw new XFireRuntimeException("Couldn't create fault.", e);
+ }
+ }
+
+}
Modified: incubator/servicemix/trunk/servicemix-jsr181/src/test/java/org/apache/servicemix/jsr181/Jsr181ComplexPojoTest.java
URL: http://svn.apache.org/viewcvs/incubator/servicemix/trunk/servicemix-jsr181/src/test/java/org/apache/servicemix/jsr181/Jsr181ComplexPojoTest.java?rev=374053&r1=374052&r2=374053&view=diff
==============================================================================
--- incubator/servicemix/trunk/servicemix-jsr181/src/test/java/org/apache/servicemix/jsr181/Jsr181ComplexPojoTest.java (original)
+++ incubator/servicemix/trunk/servicemix-jsr181/src/test/java/org/apache/servicemix/jsr181/Jsr181ComplexPojoTest.java Wed Feb 1 03:47:14 2006
@@ -25,6 +25,7 @@
import javax.naming.InitialContext;
import javax.xml.namespace.QName;
import javax.xml.transform.Source;
+import javax.xml.transform.TransformerException;
import junit.framework.TestCase;
@@ -32,16 +33,22 @@
import org.apache.servicemix.components.util.EchoComponent;
import org.apache.servicemix.jbi.container.ActivationSpec;
import org.apache.servicemix.jbi.container.JBIContainer;
+import org.apache.servicemix.jbi.jaxp.SourceTransformer;
import org.apache.servicemix.jbi.jaxp.StringSource;
-import org.apache.servicemix.jsr181.Jsr181Endpoint;
-import org.apache.servicemix.jsr181.Jsr181SpringComponent;
+import org.apache.servicemix.jbi.util.DOMUtil;
import org.apache.servicemix.tck.ReceiverComponent;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.traversal.NodeIterator;
+
+import com.sun.org.apache.xpath.internal.CachedXPathAPI;
public class Jsr181ComplexPojoTest extends TestCase {
//private static Log logger = LogFactory.getLog(Jsr181ComponentTest.class);
protected JBIContainer container;
+ protected SourceTransformer transformer = new SourceTransformer();
protected void setUp() throws Exception {
container = new JBIContainer();
@@ -109,6 +116,74 @@
// Wait all acks being processed
Thread.sleep(100);
+ }
+
+ public void testFault() throws Exception {
+ Jsr181SpringComponent component = new Jsr181SpringComponent();
+ Jsr181Endpoint endpoint = new Jsr181Endpoint();
+ endpoint.setPojo(new ComplexPojoImpl());
+ endpoint.setServiceInterface(ComplexPojo.class.getName());
+ component.setEndpoints(new Jsr181Endpoint[] { endpoint });
+ container.activateComponent(component, "JSR181Component");
+
+ EchoComponent echo = new EchoComponent();
+ ActivationSpec as = new ActivationSpec();
+ as.setComponent(echo);
+ as.setService(ReceiverComponent.SERVICE);
+ as.setComponentName("Echo");
+ container.activateComponent(as);
+
+ container.start();
+
+ DefaultServiceMixClient client = new DefaultServiceMixClient(container);
+ InOut me = client.createInOutExchange();
+ me.setInterfaceName(new QName("http://jsr181.servicemix.apache.org", "ComplexPojoPortType"));
+ me.getInMessage().setContent(new StringSource("<hel lo>world</hello"));
+ client.sendSync(me);
+ assertEquals(ExchangeStatus.ERROR, me.getStatus());
+ assertNotNull(me.getFault());
+ Node n = transformer.toDOMNode(me.getFault());
+ System.err.println(transformer.toString(n));
+ String xpath;
+ assertNotNull(xpath = textValueOfXPath(n, "//message"));
+ assertNull(xpath = textValueOfXPath(n, "//stack"));
+ client.done(me);
+
+ ((Jsr181LifeCycle) component.getLifeCycle()).getConfiguration().setPrintStackTraceInFaults(true);
+
+ me = client.createInOutExchange();
+ me.setInterfaceName(new QName("http://jsr181.servicemix.apache.org", "ComplexPojoPortType"));
+ me.getInMessage().setContent(new StringSource("<hel lo>world</hello"));
+ client.sendSync(me);
+ assertEquals(ExchangeStatus.ERROR, me.getStatus());
+ assertNotNull(me.getFault());
+ n = transformer.toDOMNode(me.getFault());
+ System.err.println(transformer.toString(n));
+ assertNotNull(xpath = textValueOfXPath(n, "//message"));
+ assertNotNull(xpath = textValueOfXPath(n, "//stack"));
+ client.done(me);
+
+ // Wait all acks being processed
+ Thread.sleep(100);
+ }
+
+ protected String textValueOfXPath(Node node, String xpath) throws TransformerException {
+ CachedXPathAPI cachedXPathAPI = new CachedXPathAPI();
+ NodeIterator iterator = cachedXPathAPI.selectNodeIterator(node, xpath);
+ Node root = iterator.nextNode();
+ if (root instanceof Element) {
+ Element element = (Element) root;
+ if (element == null) {
+ return "";
+ }
+ String text = DOMUtil.getElementText(element);
+ return text;
+ }
+ else if (root != null) {
+ return root.getNodeValue();
+ } else {
+ return null;
+ }
}
public interface ComplexPojo {