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 {