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");