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 2008/08/28 15:33:48 UTC

svn commit: r689813 - in /servicemix/components/engines/servicemix-wsn2005/trunk/src: main/java/org/apache/servicemix/wsn/ main/java/org/apache/servicemix/wsn/client/ main/java/org/apache/servicemix/wsn/component/ main/java/org/apache/servicemix/wsn/jb...

Author: gnodet
Date: Thu Aug 28 06:33:46 2008
New Revision: 689813

URL: http://svn.apache.org/viewvc?rev=689813&view=rev
Log:
SM-1527, SM-1528: WS-Notification SE does not support JBI wrapped messages and generate faults not compliant with the WSDL

Added:
    servicemix/components/engines/servicemix-wsn2005/trunk/src/main/java/org/apache/servicemix/wsn/jbi/JbiWrapperHelper.java
Modified:
    servicemix/components/engines/servicemix-wsn2005/trunk/src/main/java/org/apache/servicemix/wsn/AbstractNotificationBroker.java
    servicemix/components/engines/servicemix-wsn2005/trunk/src/main/java/org/apache/servicemix/wsn/AbstractSubscription.java
    servicemix/components/engines/servicemix-wsn2005/trunk/src/main/java/org/apache/servicemix/wsn/client/AbstractWSAClient.java
    servicemix/components/engines/servicemix-wsn2005/trunk/src/main/java/org/apache/servicemix/wsn/component/WSNEndpoint.java
    servicemix/components/engines/servicemix-wsn2005/trunk/src/main/java/org/apache/servicemix/wsn/jbi/JbiSubscription.java
    servicemix/components/engines/servicemix-wsn2005/trunk/src/main/java/org/apache/servicemix/wsn/jms/JmsSubscription.java
    servicemix/components/engines/servicemix-wsn2005/trunk/src/test/java/org/apache/servicemix/wsn/component/WSNComponentTest.java

Modified: servicemix/components/engines/servicemix-wsn2005/trunk/src/main/java/org/apache/servicemix/wsn/AbstractNotificationBroker.java
URL: http://svn.apache.org/viewvc/servicemix/components/engines/servicemix-wsn2005/trunk/src/main/java/org/apache/servicemix/wsn/AbstractNotificationBroker.java?rev=689813&r1=689812&r2=689813&view=diff
==============================================================================
--- servicemix/components/engines/servicemix-wsn2005/trunk/src/main/java/org/apache/servicemix/wsn/AbstractNotificationBroker.java (original)
+++ servicemix/components/engines/servicemix-wsn2005/trunk/src/main/java/org/apache/servicemix/wsn/AbstractNotificationBroker.java Thu Aug 28 06:33:46 2008
@@ -56,6 +56,8 @@
 import org.oasis_open.docs.wsn.bw_2.TopicNotSupportedFault;
 import org.oasis_open.docs.wsn.bw_2.UnableToDestroySubscriptionFault;
 import org.oasis_open.docs.wsn.bw_2.UnacceptableInitialTerminationTimeFault;
+import org.oasis_open.docs.wsn.bw_2.UnsupportedPolicyRequestFault;
+import org.oasis_open.docs.wsn.bw_2.UnrecognizedPolicyRequestFault;
 import org.oasis_open.docs.wsrf.rw_2.ResourceUnknownFault;
 
 @WebService(endpointInterface = "org.oasis_open.docs.wsn.brw_2.NotificationBroker")
@@ -157,7 +159,7 @@
             Subscribe subscribeRequest) throws InvalidFilterFault, InvalidMessageContentExpressionFault,
             InvalidProducerPropertiesExpressionFault, InvalidTopicExpressionFault, ResourceUnknownFault,
             SubscribeCreationFailedFault, TopicExpressionDialectUnknownFault, TopicNotSupportedFault,
-            UnacceptableInitialTerminationTimeFault {
+            UnacceptableInitialTerminationTimeFault, UnsupportedPolicyRequestFault, UnrecognizedPolicyRequestFault {
 
         log.debug("Subscribe");
         return handleSubscribe(subscribeRequest, null);
@@ -168,7 +170,8 @@
                 EndpointManager manager) throws InvalidFilterFault, InvalidMessageContentExpressionFault,
             InvalidProducerPropertiesExpressionFault, InvalidTopicExpressionFault,
             SubscribeCreationFailedFault, TopicExpressionDialectUnknownFault,
-                                                TopicNotSupportedFault, UnacceptableInitialTerminationTimeFault {
+            TopicNotSupportedFault, UnacceptableInitialTerminationTimeFault,
+            UnsupportedPolicyRequestFault, UnrecognizedPolicyRequestFault {
         AbstractSubscription subscription = null;
         boolean success = false;
         try {

Modified: servicemix/components/engines/servicemix-wsn2005/trunk/src/main/java/org/apache/servicemix/wsn/AbstractSubscription.java
URL: http://svn.apache.org/viewvc/servicemix/components/engines/servicemix-wsn2005/trunk/src/main/java/org/apache/servicemix/wsn/AbstractSubscription.java?rev=689813&r1=689812&r2=689813&view=diff
==============================================================================
--- servicemix/components/engines/servicemix-wsn2005/trunk/src/main/java/org/apache/servicemix/wsn/AbstractSubscription.java (original)
+++ servicemix/components/engines/servicemix-wsn2005/trunk/src/main/java/org/apache/servicemix/wsn/AbstractSubscription.java Thu Aug 28 06:33:46 2008
@@ -51,6 +51,7 @@
 import org.oasis_open.docs.wsn.b_2.Unsubscribe;
 import org.oasis_open.docs.wsn.b_2.UnsubscribeResponse;
 import org.oasis_open.docs.wsn.b_2.UseRaw;
+import org.oasis_open.docs.wsn.b_2.UnrecognizedPolicyRequestFaultType;
 import org.oasis_open.docs.wsn.bw_2.InvalidFilterFault;
 import org.oasis_open.docs.wsn.bw_2.InvalidMessageContentExpressionFault;
 import org.oasis_open.docs.wsn.bw_2.InvalidProducerPropertiesExpressionFault;
@@ -64,6 +65,8 @@
 import org.oasis_open.docs.wsn.bw_2.UnableToDestroySubscriptionFault;
 import org.oasis_open.docs.wsn.bw_2.UnacceptableInitialTerminationTimeFault;
 import org.oasis_open.docs.wsn.bw_2.UnacceptableTerminationTimeFault;
+import org.oasis_open.docs.wsn.bw_2.UnrecognizedPolicyRequestFault;
+import org.oasis_open.docs.wsn.bw_2.UnsupportedPolicyRequestFault;
 import org.oasis_open.docs.wsrf.rw_2.ResourceUnknownFault;
 
 @WebService(endpointInterface = "org.oasis_open.docs.wsn.bw_2.PausableSubscriptionManager")
@@ -273,7 +276,8 @@
 
     public void create(Subscribe subscribeRequest) throws InvalidFilterFault, InvalidMessageContentExpressionFault,
             InvalidProducerPropertiesExpressionFault, InvalidTopicExpressionFault, SubscribeCreationFailedFault,
-            TopicExpressionDialectUnknownFault, TopicNotSupportedFault, UnacceptableInitialTerminationTimeFault {
+            TopicExpressionDialectUnknownFault, TopicNotSupportedFault, UnacceptableInitialTerminationTimeFault,
+            UnrecognizedPolicyRequestFault, UnsupportedPolicyRequestFault {
         validateSubscription(subscribeRequest);
         start();
     }
@@ -302,7 +306,8 @@
     protected void validateSubscription(Subscribe subscribeRequest) throws InvalidFilterFault,
             InvalidMessageContentExpressionFault, InvalidProducerPropertiesExpressionFault,
             InvalidTopicExpressionFault, SubscribeCreationFailedFault, TopicExpressionDialectUnknownFault,
-            TopicNotSupportedFault, UnacceptableInitialTerminationTimeFault {
+            TopicNotSupportedFault, UnacceptableInitialTerminationTimeFault, UnrecognizedPolicyRequestFault,
+            UnsupportedPolicyRequestFault {
         // Check consumer reference
         consumerReference = subscribeRequest.getConsumerReference();
         // Check terminationTime
@@ -365,8 +370,8 @@
                 if (p instanceof UseRaw) {
                     useRaw = true;
                 } else {
-                    InvalidFilterFaultType fault = new InvalidFilterFaultType();
-                    throw new InvalidFilterFault("Unrecognized policy: " + p, fault);
+                    UnrecognizedPolicyRequestFaultType fault = new UnrecognizedPolicyRequestFaultType();
+                    throw new UnrecognizedPolicyRequestFault("Unrecognized policy: " + p, fault);
                 }
             }
         }

Modified: servicemix/components/engines/servicemix-wsn2005/trunk/src/main/java/org/apache/servicemix/wsn/client/AbstractWSAClient.java
URL: http://svn.apache.org/viewvc/servicemix/components/engines/servicemix-wsn2005/trunk/src/main/java/org/apache/servicemix/wsn/client/AbstractWSAClient.java?rev=689813&r1=689812&r2=689813&view=diff
==============================================================================
--- servicemix/components/engines/servicemix-wsn2005/trunk/src/main/java/org/apache/servicemix/wsn/client/AbstractWSAClient.java (original)
+++ servicemix/components/engines/servicemix-wsn2005/trunk/src/main/java/org/apache/servicemix/wsn/client/AbstractWSAClient.java Thu Aug 28 06:33:46 2008
@@ -30,15 +30,17 @@
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.transform.Source;
 import javax.xml.transform.dom.DOMResult;
+import javax.xml.transform.dom.DOMSource;
 import javax.xml.ws.wsaddressing.W3CEndpointReference;
 
 import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
+import org.w3c.dom.Document;
 
 import org.apache.servicemix.common.util.DOMUtil;
 import org.apache.servicemix.common.util.URIResolver;
-import org.apache.servicemix.jbi.jaxp.SourceTransformer;
 import org.apache.servicemix.jbi.jaxp.StringSource;
+import org.apache.servicemix.wsn.jbi.JbiWrapperHelper;
 import org.oasis_open.docs.wsn.b_2.Subscribe;
 import org.oasis_open.docs.wsn.br_2.RegisterPublisher;
 
@@ -52,6 +54,8 @@
 
     private ServiceEndpoint serviceEndpoint;
 
+    private boolean jbiWrapped;
+
     public AbstractWSAClient() {
     }
 
@@ -60,6 +64,14 @@
         this.endpoint = endpoint;
     }
 
+    public boolean isJbiWrapped() {
+        return jbiWrapped;
+    }
+
+    public void setJbiWrapped(boolean jbiWrapped) {
+        this.jbiWrapped = jbiWrapped;
+    }
+
     public static W3CEndpointReference createWSA(String address) {
         Source src = new StringSource("<EndpointReference xmlns='http://www.w3.org/2005/08/addressing'><Address>"
                                         + address + "</Address></EndpointReference>");
@@ -68,7 +80,7 @@
 
     public static String getWSAAddress(W3CEndpointReference ref) {
         try {
-            Element element = new SourceTransformer().createDocument().createElement("elem");
+            Element element = JbiWrapperHelper.createDocument().createElement("elem");
             ref.writeTo(new DOMResult(element));
             NodeList nl = element.getElementsByTagNameNS("http://www.w3.org/2005/08/addressing", "Address");
             if (nl != null && nl.getLength() > 0) {
@@ -124,7 +136,14 @@
             exchange.setOperation(operation);
             NormalizedMessage in = exchange.createMessage();
             exchange.setInMessage(in);
-            in.setContent(new JAXBSource(getJAXBContext(), request));
+            if (isJbiWrapped()) {
+                Document doc = JbiWrapperHelper.createDocument();
+                getJAXBContext().createMarshaller().marshal(request, doc);
+                JbiWrapperHelper.wrap(doc);
+                in.setContent(new DOMSource(doc));
+            } else {
+                in.setContent(new JAXBSource(getJAXBContext(), request));
+            }
             getContext().getDeliveryChannel().sendSync(exchange);
             if (exchange.getStatus() == ExchangeStatus.ERROR) {
                 throw new JBIException(exchange.getError());
@@ -132,12 +151,16 @@
                 throw new JBIException(exchange.getFault().toString());
             } else {
                 NormalizedMessage out = exchange.getOutMessage();
-                Object result = getJAXBContext().createUnmarshaller().unmarshal(out.getContent());
+                Source source = out.getContent();
+                if (isJbiWrapped()) {
+                    source = JbiWrapperHelper.unwrap(source);
+                }
+                Object result = getJAXBContext().createUnmarshaller().unmarshal(source);
                 exchange.setStatus(ExchangeStatus.DONE);
                 getContext().getDeliveryChannel().send(exchange);
                 return result;
             }
-        } catch (JAXBException e) {
+        } catch (Exception e) {
             throw new JBIException(e);
         }
     }

Modified: servicemix/components/engines/servicemix-wsn2005/trunk/src/main/java/org/apache/servicemix/wsn/component/WSNEndpoint.java
URL: http://svn.apache.org/viewvc/servicemix/components/engines/servicemix-wsn2005/trunk/src/main/java/org/apache/servicemix/wsn/component/WSNEndpoint.java?rev=689813&r1=689812&r2=689813&view=diff
==============================================================================
--- servicemix/components/engines/servicemix-wsn2005/trunk/src/main/java/org/apache/servicemix/wsn/component/WSNEndpoint.java (original)
+++ servicemix/components/engines/servicemix-wsn2005/trunk/src/main/java/org/apache/servicemix/wsn/component/WSNEndpoint.java Thu Aug 28 06:33:46 2008
@@ -17,11 +17,14 @@
 package org.apache.servicemix.wsn.component;
 
 import java.io.StringWriter;
+import java.io.PrintWriter;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Collections;
+import java.util.GregorianCalendar;
 
 import javax.jbi.messaging.ExchangeStatus;
 import javax.jbi.messaging.Fault;
@@ -33,15 +36,25 @@
 import javax.jws.WebService;
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.JAXBException;
+import javax.xml.bind.JAXBElement;
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlMixed;
 import javax.xml.namespace.QName;
 import javax.xml.ws.WebFault;
+import javax.xml.transform.Source;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.dom.DOMResult;
+import javax.xml.datatype.XMLGregorianCalendar;
+import javax.xml.datatype.DatatypeFactory;
+
+import org.w3c.dom.Document;
 
 import org.apache.servicemix.common.ExchangeProcessor;
 import org.apache.servicemix.common.endpoints.ProviderEndpoint;
 import org.apache.servicemix.common.util.URIResolver;
 import org.apache.servicemix.jbi.jaxp.StringSource;
 import org.apache.servicemix.wsn.ComponentContextAware;
+import org.apache.servicemix.wsn.jbi.JbiWrapperHelper;
 import org.oasis_open.docs.wsrf.bf_2.BaseFaultType;
 
 public class WSNEndpoint extends ProviderEndpoint implements ExchangeProcessor {
@@ -84,6 +97,7 @@
     public static JAXBContext createJAXBContext(Class interfaceClass) throws JAXBException {
         List<Class> classes = new ArrayList<Class>();
         classes.add(JbiFault.class);
+        classes.add(XmlException.class);
         for (Method mth : interfaceClass.getMethods()) {
             WebMethod wm = (WebMethod) mth.getAnnotation(WebMethod.class);
             if (wm != null) {
@@ -101,7 +115,13 @@
         } else if (exchange.getStatus() == ExchangeStatus.ERROR) {
             return;
         }
-        Object input = jaxbContext.createUnmarshaller().unmarshal(exchange.getMessage("in").getContent());
+
+        boolean isJbiWrapped = false;
+        Source source = exchange.getMessage("in").getContent();
+        // Unwrap JBI message if needed
+        source = JbiWrapperHelper.unwrap(source);
+
+        Object input = jaxbContext.createUnmarshaller().unmarshal(source);
         Method webMethod = null;
         for (Method mth : endpointInterface.getMethods()) {
             Class[] params = mth.getParameterTypes();
@@ -122,12 +142,31 @@
                 WebFault fa = (WebFault) e.getCause().getClass().getAnnotation(WebFault.class);
                 if (!(exchange instanceof InOnly) && fa != null) {
                     BaseFaultType info = (BaseFaultType) e.getCause().getClass().getMethod("getFaultInfo").invoke(e.getCause());
+                    // Set description if not already set
+                    if (info.getDescription().size() == 0) {
+                        BaseFaultType.Description desc = new BaseFaultType.Description();
+                        desc.setValue(e.getCause().getMessage());
+                        info.getDescription().add(desc);
+                    }
+                    // TODO: create originator field?
+                    // Set timestamp if needed
+                    if (info.getTimestamp() == null) {
+                        info.setTimestamp(DatatypeFactory.newInstance().newXMLGregorianCalendar(new GregorianCalendar()));
+                    }
+                    
+                    // TODO: do we want to send the full stack trace here ?
+                    //BaseFaultType.FaultCause cause = new BaseFaultType.FaultCause();
+                    //cause.setAny(new XmlException(e.getCause()));
+                    //info.setFaultCause(cause);
                     Fault fault = exchange.createFault();
                     exchange.setFault(fault);
-                    exchange.setError((Exception) e.getCause());
-                    StringWriter writer = new StringWriter();
-                    jaxbContext.createMarshaller().marshal(new JbiFault(info), writer);
-                    fault.setContent(new StringSource(writer.toString()));
+                    Document doc = JbiWrapperHelper.createDocument();
+                    JAXBElement el = new JAXBElement(new QName(fa.targetNamespace(), fa.name()), info.getClass(), null, info);
+                    jaxbContext.createMarshaller().marshal(el, doc);
+                    if (isJbiWrapped) {
+                        JbiWrapperHelper.wrap(doc);
+                    }
+                    fault.setContent(new DOMSource(doc));
                     send(exchange);
                     return;
                 } else {
@@ -145,9 +184,12 @@
         } else {
             NormalizedMessage msg = exchange.createMessage();
             exchange.setMessage(msg, "out");
-            StringWriter writer = new StringWriter();
-            jaxbContext.createMarshaller().marshal(output, writer);
-            msg.setContent(new StringSource(writer.toString()));
+            Document doc = JbiWrapperHelper.createDocument();
+            jaxbContext.createMarshaller().marshal(output, doc);
+            if (isJbiWrapped) {
+                JbiWrapperHelper.wrap(doc);
+            }
+            msg.setContent(new DOMSource(doc));
             sendSync(exchange);
         }
     }
@@ -172,6 +214,28 @@
         }
     }
 
+    @XmlRootElement(name = "Exception")
+    public static class XmlException {
+        private String stackTrace;
+        public XmlException() {
+        }
+        public XmlException(Throwable e) {
+            StringWriter sw = new StringWriter();
+            e.printStackTrace(new PrintWriter(sw));
+            stackTrace = sw.toString();
+        }
+        public String getStackTrace() {
+            return stackTrace;
+        }
+        public void setStackTrace(String stackTrace) {
+            this.stackTrace = stackTrace;
+        }
+        @XmlMixed
+        public List getContent() {
+            return Collections.singletonList(stackTrace);
+        }
+    }
+
     protected Method getWebServiceMethod(QName interfaceName, QName operation) throws Exception {
         WebService ws = getWebServiceAnnotation(pojo.getClass());
         if (ws == null) {

Modified: servicemix/components/engines/servicemix-wsn2005/trunk/src/main/java/org/apache/servicemix/wsn/jbi/JbiSubscription.java
URL: http://svn.apache.org/viewvc/servicemix/components/engines/servicemix-wsn2005/trunk/src/main/java/org/apache/servicemix/wsn/jbi/JbiSubscription.java?rev=689813&r1=689812&r2=689813&view=diff
==============================================================================
--- servicemix/components/engines/servicemix-wsn2005/trunk/src/main/java/org/apache/servicemix/wsn/jbi/JbiSubscription.java (original)
+++ servicemix/components/engines/servicemix-wsn2005/trunk/src/main/java/org/apache/servicemix/wsn/jbi/JbiSubscription.java Thu Aug 28 06:33:46 2008
@@ -48,6 +48,8 @@
 import org.oasis_open.docs.wsn.bw_2.TopicExpressionDialectUnknownFault;
 import org.oasis_open.docs.wsn.bw_2.TopicNotSupportedFault;
 import org.oasis_open.docs.wsn.bw_2.UnacceptableInitialTerminationTimeFault;
+import org.oasis_open.docs.wsn.bw_2.UnsupportedPolicyRequestFault;
+import org.oasis_open.docs.wsn.bw_2.UnrecognizedPolicyRequestFault;
 
 public class JbiSubscription extends JmsSubscription implements ComponentContextAware {
 
@@ -70,7 +72,8 @@
     protected void validateSubscription(Subscribe subscribeRequest) throws InvalidFilterFault,
             InvalidMessageContentExpressionFault, InvalidProducerPropertiesExpressionFault,
             InvalidTopicExpressionFault, SubscribeCreationFailedFault, TopicExpressionDialectUnknownFault,
-            TopicNotSupportedFault, UnacceptableInitialTerminationTimeFault {
+            TopicNotSupportedFault, UnacceptableInitialTerminationTimeFault,
+            UnsupportedPolicyRequestFault, UnrecognizedPolicyRequestFault {
         super.validateSubscription(subscribeRequest);
         try {
             endpoint = resolveConsumer(subscribeRequest);

Added: servicemix/components/engines/servicemix-wsn2005/trunk/src/main/java/org/apache/servicemix/wsn/jbi/JbiWrapperHelper.java
URL: http://svn.apache.org/viewvc/servicemix/components/engines/servicemix-wsn2005/trunk/src/main/java/org/apache/servicemix/wsn/jbi/JbiWrapperHelper.java?rev=689813&view=auto
==============================================================================
--- servicemix/components/engines/servicemix-wsn2005/trunk/src/main/java/org/apache/servicemix/wsn/jbi/JbiWrapperHelper.java (added)
+++ servicemix/components/engines/servicemix-wsn2005/trunk/src/main/java/org/apache/servicemix/wsn/jbi/JbiWrapperHelper.java Thu Aug 28 06:33:46 2008
@@ -0,0 +1,143 @@
+/*
+ * 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.
+ */
+package org.apache.servicemix.wsn.jbi;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import javax.xml.namespace.QName;
+import javax.xml.XMLConstants;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.transform.Source;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.dom.DOMSource;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import org.apache.servicemix.common.util.DOMUtil;
+import org.apache.servicemix.jbi.jaxp.StaxSource;
+import org.apache.servicemix.jbi.jaxp.FragmentStreamReader;
+import org.apache.servicemix.jbi.jaxp.StAXSourceTransformer;
+
+/**
+ * Helper classes dealing with the WSDL 1.1 JBI wrapper
+ */
+public class JbiWrapperHelper {
+
+    public static final String WSDL11_WRAPPER_NAMESPACE = "http://java.sun.com/xml/ns/jbi/wsdl-11-wrapper";
+    public static final String WSDL11_WRAPPER_PREFIX = "jbi";
+    public static final String WSDL11_WRAPPER_MESSAGE_LOCALNAME = "message";
+    public static final QName WSDL11_WRAPPER_MESSAGE = new QName(WSDL11_WRAPPER_NAMESPACE, WSDL11_WRAPPER_MESSAGE_LOCALNAME, WSDL11_WRAPPER_PREFIX);
+    public static final String WSDL11_WRAPPER_MESSAGE_PREFIX = "msg";
+    public static final String WSDL11_WRAPPER_TYPE = "type";
+    public static final String WSDL11_WRAPPER_NAME = "name";
+    public static final String WSDL11_WRAPPER_VERSION = "version";
+    public static final String WSDL11_WRAPPER_PART_LOCALNAME = "part";
+    public static final QName WSDL11_WRAPPER_PART = new QName(WSDL11_WRAPPER_NAMESPACE, WSDL11_WRAPPER_PART_LOCALNAME, WSDL11_WRAPPER_PREFIX);
+
+    private static final StAXSourceTransformer transformer = new StAXSourceTransformer();
+
+    public static Document createDocument() throws ParserConfigurationException {
+        return transformer.createDocument();
+    }
+
+    public static void wrap(Document doc) {
+        wrap(doc, null, null);
+    }
+
+    public static void wrap(Document doc, QName type, String name) {
+        Element wrapperMsg = doc.createElementNS(WSDL11_WRAPPER_NAMESPACE, WSDL11_WRAPPER_PREFIX + ":" + WSDL11_WRAPPER_MESSAGE_LOCALNAME);
+        wrapperMsg.setAttribute(WSDL11_WRAPPER_VERSION, "1.0");
+        if (type != null) {
+            if (!XMLConstants.NULL_NS_URI.equals(type.getNamespaceURI())) {
+                wrapperMsg.setAttributeNS(XMLConstants.XMLNS_ATTRIBUTE_NS_URI, WSDL11_WRAPPER_MESSAGE_PREFIX, type.getNamespaceURI());
+            }
+            wrapperMsg.setAttribute(WSDL11_WRAPPER_TYPE, WSDL11_WRAPPER_MESSAGE_PREFIX + ":" + type.getLocalPart());
+        }
+        if (name != null) {
+            wrapperMsg.setAttribute(WSDL11_WRAPPER_NAME, name);
+        }
+        Element wrapperPart = doc.createElementNS(WSDL11_WRAPPER_NAMESPACE, WSDL11_WRAPPER_PREFIX + ":" + WSDL11_WRAPPER_PART_LOCALNAME);
+        wrapperMsg.appendChild(wrapperPart);
+        Element el = doc.getDocumentElement();
+        doc.replaceChild(wrapperMsg, el);
+        wrapperPart.appendChild(el);
+    }
+
+    public static Source unwrap(Source source, AtomicBoolean isJbiWrapped) throws XMLStreamException, TransformerException {
+        if (source instanceof DOMSource) {
+            Element el = DOMUtil.getFirstChildElement(((DOMSource) source).getNode());
+            if (el == null) {
+                throw new IllegalStateException("Unsupported DOMSource with no element");
+            }
+            if (WSDL11_WRAPPER_NAMESPACE.equals(el.getNamespaceURI()) && WSDL11_WRAPPER_MESSAGE_LOCALNAME.equals(el.getLocalName())) {
+                el = DOMUtil.getFirstChildElement(el);
+                if (el == null) {
+                    throw new IllegalStateException("JBI wrapper has no child element");
+                }
+                el = DOMUtil.getFirstChildElement(el);
+                if (el == null) {
+                    throw new IllegalStateException("JBI message has no child element");
+                }
+                if (!WSDL11_WRAPPER_NAMESPACE.equals(el.getNamespaceURI()) || !WSDL11_WRAPPER_PART_LOCALNAME.equals(el.getLocalName())) {
+                    throw new IllegalStateException("Expected a jbi:part element");
+                }
+                isJbiWrapped.set(true);
+                source = new DOMSource(el);
+            }
+        } else {
+            XMLStreamReader reader = transformer.toXMLStreamReader(source);
+            reader.nextTag();
+            if (!reader.isStartElement()) {
+                 throw new IllegalStateException("expected an element");
+            }
+            QName qname = reader.getName();
+            if (qname.equals(WSDL11_WRAPPER_MESSAGE)) {
+                reader.nextTag();
+                if (reader.getName().equals(WSDL11_WRAPPER_PART)) {
+                    reader.nextTag();
+                    isJbiWrapped.set(true);
+                } else {
+                    throw new IllegalStateException("Expected a jbi:part element");
+                }
+            }
+            source = new StaxSource(new FragmentStreamReader(reader));
+        }
+        return source;
+    }
+
+    public static Source unwrap(Source source) throws TransformerException, XMLStreamException {
+        XMLStreamReader reader = new StAXSourceTransformer().toXMLStreamReader(source);
+        reader.nextTag();
+        if (!reader.isStartElement()) {
+             throw new IllegalStateException("expected an element");
+        }
+        QName qname = reader.getName();
+        if (qname.equals(WSDL11_WRAPPER_MESSAGE)) {
+            reader.nextTag();
+            if (reader.getName().equals(WSDL11_WRAPPER_PART)) {
+                reader.nextTag();
+            } else {
+                throw new IllegalStateException("Expected a jbi:part element");
+            }
+        }
+        source = new StaxSource(new FragmentStreamReader(reader));
+        return source;
+    }
+}

Modified: servicemix/components/engines/servicemix-wsn2005/trunk/src/main/java/org/apache/servicemix/wsn/jms/JmsSubscription.java
URL: http://svn.apache.org/viewvc/servicemix/components/engines/servicemix-wsn2005/trunk/src/main/java/org/apache/servicemix/wsn/jms/JmsSubscription.java?rev=689813&r1=689812&r2=689813&view=diff
==============================================================================
--- servicemix/components/engines/servicemix-wsn2005/trunk/src/main/java/org/apache/servicemix/wsn/jms/JmsSubscription.java (original)
+++ servicemix/components/engines/servicemix-wsn2005/trunk/src/main/java/org/apache/servicemix/wsn/jms/JmsSubscription.java Thu Aug 28 06:33:46 2008
@@ -60,6 +60,8 @@
 import org.oasis_open.docs.wsn.bw_2.UnableToDestroySubscriptionFault;
 import org.oasis_open.docs.wsn.bw_2.UnacceptableInitialTerminationTimeFault;
 import org.oasis_open.docs.wsn.bw_2.UnacceptableTerminationTimeFault;
+import org.oasis_open.docs.wsn.bw_2.UnsupportedPolicyRequestFault;
+import org.oasis_open.docs.wsn.bw_2.UnrecognizedPolicyRequestFault;
 
 public abstract class JmsSubscription extends AbstractSubscription implements MessageListener {
 
@@ -93,7 +95,8 @@
     protected void validateSubscription(Subscribe subscribeRequest) throws InvalidFilterFault,
             InvalidMessageContentExpressionFault, InvalidProducerPropertiesExpressionFault,
             InvalidTopicExpressionFault, SubscribeCreationFailedFault, TopicExpressionDialectUnknownFault,
-            TopicNotSupportedFault, UnacceptableInitialTerminationTimeFault {
+            TopicNotSupportedFault, UnacceptableInitialTerminationTimeFault,
+            UnsupportedPolicyRequestFault, UnrecognizedPolicyRequestFault {
         super.validateSubscription(subscribeRequest);
         try {
             jmsTopic = topicConverter.toActiveMQTopic(topic);

Modified: servicemix/components/engines/servicemix-wsn2005/trunk/src/test/java/org/apache/servicemix/wsn/component/WSNComponentTest.java
URL: http://svn.apache.org/viewvc/servicemix/components/engines/servicemix-wsn2005/trunk/src/test/java/org/apache/servicemix/wsn/component/WSNComponentTest.java?rev=689813&r1=689812&r2=689813&view=diff
==============================================================================
--- servicemix/components/engines/servicemix-wsn2005/trunk/src/test/java/org/apache/servicemix/wsn/component/WSNComponentTest.java (original)
+++ servicemix/components/engines/servicemix-wsn2005/trunk/src/test/java/org/apache/servicemix/wsn/component/WSNComponentTest.java Thu Aug 28 06:33:46 2008
@@ -136,6 +136,28 @@
         Thread.sleep(500);
     }
 
+    public void testNotifyWithJbiWrapper() throws Exception {
+        wsnBroker.setJbiWrapped(true);
+
+        ReceiverComponent receiver = new ReceiverComponent();
+        jbi.activateComponent(receiver, "receiver");
+
+        W3CEndpointReference consumer = createEPR(ReceiverComponent.SERVICE, ReceiverComponent.ENDPOINT);
+        wsnBroker.subscribe(consumer, "myTopic", null);
+
+        wsnBroker.notify("myTopic", parse("<hello>world</hello>"));
+        // Wait for notification
+        Thread.sleep(500);
+
+        receiver.getMessageList().assertMessagesReceived(1);
+        NormalizedMessage msg = (NormalizedMessage) receiver.getMessageList().getMessages().get(0);
+        Node node = new SourceTransformer().toDOMNode(msg);
+        assertEquals("Notify", node.getLocalName());
+
+        // Wait for acks to be processed
+        Thread.sleep(500);
+    }
+
     public void testRawNotify() throws Exception {
         ReceiverComponent receiver = new ReceiverComponent();
         jbi.activateComponent(receiver, "receiver");