[jbossws-commits] JBossWS SVN: r3536 - trunk/jbossws-core/src/main/java/org/jboss/ws/extensions/addressing/soap.
jbossws-commits at lists.jboss.org
jbossws-commits at lists.jboss.org
Mon Jun 11 12:11:42 EDT 2007
Author: heiko.braun at jboss.com
Date: 2007-06-11 12:11:41 -0400 (Mon, 11 Jun 2007)
New Revision: 3536
Modified:
trunk/jbossws-core/src/main/java/org/jboss/ws/extensions/addressing/soap/SOAPAddressingPropertiesImpl.java
Log:
- Assert on required elements
- Additional docs and coments
Modified: trunk/jbossws-core/src/main/java/org/jboss/ws/extensions/addressing/soap/SOAPAddressingPropertiesImpl.java
===================================================================
--- trunk/jbossws-core/src/main/java/org/jboss/ws/extensions/addressing/soap/SOAPAddressingPropertiesImpl.java 2007-06-11 16:10:41 UTC (rev 3535)
+++ trunk/jbossws-core/src/main/java/org/jboss/ws/extensions/addressing/soap/SOAPAddressingPropertiesImpl.java 2007-06-11 16:11:41 UTC (rev 3536)
@@ -23,28 +23,6 @@
//$Id$
-import java.lang.reflect.Array;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import javax.xml.namespace.QName;
-import javax.xml.soap.SOAPElement;
-import javax.xml.soap.SOAPException;
-import javax.xml.soap.SOAPFactory;
-import javax.xml.soap.SOAPHeader;
-import javax.xml.soap.SOAPHeaderElement;
-import javax.xml.soap.SOAPMessage;
-import javax.xml.ws.addressing.AddressingConstants;
-import javax.xml.ws.addressing.AddressingException;
-import javax.xml.ws.addressing.ReferenceParameters;
-import javax.xml.ws.addressing.Relationship;
-import javax.xml.ws.addressing.soap.SOAPAddressingBuilder;
-import javax.xml.ws.addressing.soap.SOAPAddressingProperties;
-
import org.jboss.util.NotImplementedException;
import org.jboss.ws.core.soap.NameImpl;
import org.jboss.ws.core.soap.SOAPFactoryImpl;
@@ -57,7 +35,23 @@
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
-/**
+import javax.xml.namespace.QName;
+import javax.xml.soap.*;
+import javax.xml.ws.addressing.AddressingConstants;
+import javax.xml.ws.addressing.AddressingException;
+import javax.xml.ws.addressing.ReferenceParameters;
+import javax.xml.ws.addressing.Relationship;
+import javax.xml.ws.addressing.soap.SOAPAddressingBuilder;
+import javax.xml.ws.addressing.soap.SOAPAddressingProperties;
+import java.lang.reflect.Array;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+/**
* Subimplementation of <code>AddressingProperties</code> includes methods that
* read and write the Message Addressing Properties to a <code>SOAPMessage</code>.
* All individual properties must implement <code>SOAPAddressingElement</code>.
@@ -67,270 +61,308 @@
*/
public class SOAPAddressingPropertiesImpl extends AddressingPropertiesImpl implements SOAPAddressingProperties
{
- private static AddressingConstants ADDR = new AddressingConstantsImpl();
+ private static AddressingConstants ADDR = new AddressingConstantsImpl();
- private NamespaceRegistry nsRegistry = new NamespaceRegistry();
+ private NamespaceRegistry nsRegistry = new NamespaceRegistry();
- public void readHeaders(SOAPMessage message) throws AddressingException
- {
- try
- {
- SOAPHeader soapHeader = message.getSOAPHeader();
+ private String getRequiredHeaderContent(SOAPHeader soapHeader, QName qname)
+ {
+ Element element = DOMUtils.getFirstChildElement(soapHeader, qname);
+ if(null == element) throw new IllegalArgumentException("Required element "+qname+" is missing");
- SOAPAddressingBuilder builder = new SOAPAddressingBuilderImpl();
- AddressingConstants ADDR = builder.newAddressingConstants();
+ String value = DOMUtils.getTextContent(element);
+ if(null == value || value.equals("")) throw new IllegalArgumentException("Required element "+qname+" is missing");
+
+ return value;
+ }
- Element wsaAction = DOMUtils.getFirstChildElement(soapHeader, ADDR.getActionQName());
- if (wsaAction != null)
- {
- // Register wsa namespace
- nsRegistry.registerURI(ADDR.getNamespaceURI(), ADDR.getNamespacePrefix());
+ private String getOptionalHeaderContent(SOAPHeader soapHeader, QName qname)
+ {
+ Element element = DOMUtils.getFirstChildElement(soapHeader, ADDR.getMessageIDQName());
+ if (element != null)
+ {
+ return DOMUtils.getTextContent(element);
+ }
- // Register namespaces
- NamedNodeMap attribs = soapHeader.getAttributes();
- for (int i = 0; i < attribs.getLength(); i++)
- {
- Attr attr = (Attr)attribs.item(i);
- String attrName = attr.getName();
- String attrValue = attr.getValue();
- if (attrName.startsWith("xmlns:"))
- {
- String prefix = attrName.substring(6);
- nsRegistry.registerURI(attrValue, prefix);
- }
- }
+ return null;
+ }
+
+ public void readHeaders(SOAPMessage message) throws AddressingException
+ {
+ try
+ {
+ SOAPHeader soapHeader = message.getSOAPHeader();
- // Read wsa:To
- Element wsaTo = DOMUtils.getFirstChildElement(soapHeader, ADDR.getToQName());
- if (wsaTo != null)
- {
- String to = DOMUtils.getTextContent(wsaTo);
- setTo(builder.newURI(to));
- }
+ SOAPAddressingBuilder builder = new SOAPAddressingBuilderImpl();
+ AddressingConstants ADDR = builder.newAddressingConstants();
+ registerNamespaces(ADDR, soapHeader);
+
+ // required elements
+ String action = getRequiredHeaderContent(soapHeader, ADDR.getActionQName());
+ String to = getRequiredHeaderContent(soapHeader, ADDR.getToQName());
- // Read wsa:From
- Element wsaFrom = DOMUtils.getFirstChildElement(soapHeader, ADDR.getFromQName());
- if (wsaFrom != null)
- {
- EndpointReferenceImpl ref = new EndpointReferenceImpl(wsaFrom);
- setReplyTo(ref);
- }
+ // wsa:Action
+ // This REQUIRED element of type xs:anyURI conveys the [action] property.
+ // The [children] of this element convey the value of this property.
+ setAction(builder.newURI(action));
- // Read wsa:ReplyTo
- Element wsaReplyTo = DOMUtils.getFirstChildElement(soapHeader, ADDR.getReplyToQName());
- if (wsaReplyTo != null)
- {
- EndpointReferenceImpl ref = new EndpointReferenceImpl(wsaReplyTo);
- setReplyTo(ref);
- }
+ // wsa:To
+ // This REQUIRED element (of type xs:anyURI) provides the value for the [destination] property.
+ setTo(builder.newURI(to));
- // Read wsa:FaultTo
- Element wsaFaultTo = DOMUtils.getFirstChildElement(soapHeader, ADDR.getFaultToQName());
- if (wsaFaultTo != null)
- {
- EndpointReferenceImpl ref = new EndpointReferenceImpl(wsaFaultTo);
- setFaultTo(ref);
- }
+ // Read wsa:From
+ // This OPTIONAL element (of type wsa:EndpointReferenceType) provides the value for the [source endpoint] property.
+ Element wsaFrom = DOMUtils.getFirstChildElement(soapHeader, ADDR.getFromQName());
+ if (wsaFrom != null)
+ {
+ EndpointReferenceImpl ref = new EndpointReferenceImpl(wsaFrom);
+ setReplyTo(ref);
+ }
- // Read wsa:Action
- String action = DOMUtils.getTextContent(wsaAction);
- setAction(builder.newURI(action));
+ // Read wsa:ReplyTo
+ // This OPTIONAL element (of type wsa:EndpointReferenceType) provides the value for the [reply endpoint] property.
+ // This element MUST be present if a reply is expected. If this element is present, wsa:MessageID MUST be present.
+ Element wsaReplyTo = DOMUtils.getFirstChildElement(soapHeader, ADDR.getReplyToQName());
+ if (wsaReplyTo != null)
+ {
+ EndpointReferenceImpl ref = new EndpointReferenceImpl(wsaReplyTo);
+ setReplyTo(ref);
+ }
+
+ // Read wsa:FaultTo
+ // This OPTIONAL element (of type wsa:EndpointReferenceType) provides the value for the [fault endpoint] property.
+ // If this element is present, wsa:MessageID MUST be present.
+ Element wsaFaultTo = DOMUtils.getFirstChildElement(soapHeader, ADDR.getFaultToQName());
+ if (wsaFaultTo != null)
+ {
+ EndpointReferenceImpl ref = new EndpointReferenceImpl(wsaFaultTo);
+ setFaultTo(ref);
+ }
- // Read wsa:MessageID
- Element wsaMessageId = DOMUtils.getFirstChildElement(soapHeader, ADDR.getMessageIDQName());
- if (wsaMessageId != null)
- {
- String messageID = DOMUtils.getTextContent(wsaMessageId);
- setMessageID(builder.newURI(messageID));
- }
+ // Read wsa:MessageID
+ // This OPTIONAL element conveys the [message id] property.
+ // This element MUST be present if wsa:ReplyTo or wsa:FaultTo is present.
+ if(wsaReplyTo!=null || wsaFaultTo!=null)
+ {
+ String msgIdValue = getRequiredHeaderContent(soapHeader, ADDR.getMessageIDQName());
+ setMessageID(builder.newURI(msgIdValue));
+ }
+ else
+ {
+ String messageID = getOptionalHeaderContent(soapHeader, ADDR.getMessageIDQName());
+ if(messageID!=null) setMessageID(builder.newURI(messageID));
+ }
+
+ // Read wsa:RelatesTo
+ // This OPTIONAL (repeating) element information item contributes one abstract [relationship] property value,
+ // in the form of a (URI, QName) pair.
+ // The [children] property of this element (which is of type xs:anyURI) conveys the [message id]
+ // of the related message. This element MUST be present if the message is a reply.
+ Iterator itRelatesTo = DOMUtils.getChildElements(soapHeader, ADDR.getRelatesToQName());
+ List<Relationship> relList = new ArrayList<Relationship>();
+ while (itRelatesTo.hasNext())
+ {
+ Element wsaRelatesTo = (Element)itRelatesTo.next();
+ QName type = DOMUtils.getAttributeValueAsQName(wsaRelatesTo, ADDR.getRelationshipTypeName());
+ String uri = DOMUtils.getTextContent(wsaRelatesTo);
+ Relationship rel = builder.newRelationship(new URI(uri));
+ rel.setType(type);
+ relList.add(rel);
+ }
+ Relationship[] relArr = (Relationship[])Array.newInstance(Relationship.class, relList.size());
+ relList.toArray(relArr);
+ setRelatesTo(relArr);
- // Read wsa:RelatesTo
- Iterator itRelatesTo = DOMUtils.getChildElements(soapHeader, ADDR.getRelatesToQName());
- List<Relationship> relList = new ArrayList<Relationship>();
- while (itRelatesTo.hasNext())
- {
- Element wsaRelatesTo = (Element)itRelatesTo.next();
- QName type = DOMUtils.getAttributeValueAsQName(wsaRelatesTo, ADDR.getRelationshipTypeName());
- String uri = DOMUtils.getTextContent(wsaRelatesTo);
- Relationship rel = builder.newRelationship(new URI(uri));
- rel.setType(type);
- relList.add(rel);
- }
- Relationship[] relArr = (Relationship[])Array.newInstance(Relationship.class, relList.size());
- relList.toArray(relArr);
- setRelatesTo(relArr);
- }
+ // Read wsa:ReferenceParameters
+ QName refQName = new QName(getNamespaceURI(), "IsReferenceParameter");
+ ReferenceParameters refParams = getReferenceParameters();
+ Iterator it = soapHeader.examineAllHeaderElements();
+ while (it.hasNext())
+ {
+ SOAPHeaderElement headerElement = (SOAPHeaderElement)it.next();
+ if ("true".equals(DOMUtils.getAttributeValue(headerElement, refQName)))
+ {
+ refParams.addElement(headerElement);
+ }
+ }
+ }
+ catch (SOAPException ex)
+ {
+ throw new AddressingException("Cannot read headers", ex);
+ }
+ catch (URISyntaxException ex)
+ {
+ throw new AddressingException("Cannot read headers", ex);
+ }
+ }
- // Read wsa:ReferenceParameters
- QName refQName = new QName(getNamespaceURI(), "IsReferenceParameter");
- ReferenceParameters refParams = getReferenceParameters();
- Iterator it = soapHeader.examineAllHeaderElements();
- while (it.hasNext())
- {
- SOAPHeaderElement headerElement = (SOAPHeaderElement)it.next();
- if ("true".equals(DOMUtils.getAttributeValue(headerElement, refQName)))
- {
- refParams.addElement(headerElement);
- }
- }
- }
- catch (SOAPException ex)
- {
- throw new AddressingException("Cannot read headers", ex);
- }
- catch (URISyntaxException ex)
- {
- throw new AddressingException("Cannot read headers", ex);
- }
- }
+ private void registerNamespaces(AddressingConstants ADDR, SOAPHeader soapHeader)
+ {
+ // Register wsa namespace
+ nsRegistry.registerURI(ADDR.getNamespaceURI(), ADDR.getNamespacePrefix());
- public void writeHeaders(SOAPMessage message) throws AddressingException
- {
- try
- {
- SOAPFactoryImpl factory = (SOAPFactoryImpl)SOAPFactory.newInstance();
+ // Register namespaces
+ NamedNodeMap attribs = soapHeader.getAttributes();
+ for (int i = 0; i < attribs.getLength(); i++)
+ {
+ Attr attr = (Attr)attribs.item(i);
+ String attrName = attr.getName();
+ String attrValue = attr.getValue();
+ if (attrName.startsWith("xmlns:"))
+ {
+ String prefix = attrName.substring(6);
+ nsRegistry.registerURI(attrValue, prefix);
+ }
+ }
+ }
- SOAPHeader soapHeader = message.getSOAPHeader();
+ public void writeHeaders(SOAPMessage message) throws AddressingException
+ {
+ try
+ {
+ SOAPFactoryImpl factory = (SOAPFactoryImpl)SOAPFactory.newInstance();
- if (getAction() == null)
- throw new AddressingException("Required addressing property wsa:Action");
+ SOAPHeader soapHeader = message.getSOAPHeader();
- // Add the xmlns:wsa declaration
- soapHeader.addNamespaceDeclaration(ADDR.getNamespacePrefix(), ADDR.getNamespaceURI());
+ if (getAction() == null)
+ throw new AddressingException("Required addressing property wsa:Action");
- // Write wsa:To
- if (getTo() != null)
- {
- SOAPElement wsaTo = soapHeader.addChildElement(new NameImpl(ADDR.getToQName()));
- wsaTo.addTextNode(getTo().getURI().toString());
- }
+ // Add the xmlns:wsa declaration
+ soapHeader.addNamespaceDeclaration(ADDR.getNamespacePrefix(), ADDR.getNamespaceURI());
- // Write wsa:From
- if (getFrom() != null)
- {
- EndpointReferenceImpl epr = (EndpointReferenceImpl)getFrom();
- epr.setRootQName(ADDR.getFromQName());
- SOAPElement soapElement = factory.createElement(epr.toElement());
- soapElement.removeNamespaceDeclaration(ADDR.getNamespacePrefix());
- soapHeader.addChildElement(soapElement);
- }
+ // Write wsa:To
+ if (getTo() != null)
+ {
+ SOAPElement wsaTo = soapHeader.addChildElement(new NameImpl(ADDR.getToQName()));
+ wsaTo.addTextNode(getTo().getURI().toString());
+ }
- // Write wsa:ReplyTo
- if (getReplyTo() != null)
- {
- EndpointReferenceImpl epr = (EndpointReferenceImpl)getReplyTo();
- epr.setRootQName(ADDR.getReplyToQName());
- SOAPElement soapElement = factory.createElement(epr.toElement());
- soapElement.removeNamespaceDeclaration(ADDR.getNamespacePrefix());
- soapHeader.addChildElement(soapElement);
- }
+ // Write wsa:From
+ if (getFrom() != null)
+ {
+ EndpointReferenceImpl epr = (EndpointReferenceImpl)getFrom();
+ epr.setRootQName(ADDR.getFromQName());
+ SOAPElement soapElement = factory.createElement(epr.toElement());
+ soapElement.removeNamespaceDeclaration(ADDR.getNamespacePrefix());
+ soapHeader.addChildElement(soapElement);
+ }
- // Write wsa:FaultTo
- if (getFaultTo() != null)
- {
- EndpointReferenceImpl epr = (EndpointReferenceImpl)getFaultTo();
- epr.setRootQName(ADDR.getFaultToQName());
- SOAPElement soapElement = factory.createElement(epr.toElement());
- soapElement.removeNamespaceDeclaration(ADDR.getNamespacePrefix());
- soapHeader.addChildElement(soapElement);
- }
+ // Write wsa:ReplyTo
+ if (getReplyTo() != null)
+ {
+ EndpointReferenceImpl epr = (EndpointReferenceImpl)getReplyTo();
+ epr.setRootQName(ADDR.getReplyToQName());
+ SOAPElement soapElement = factory.createElement(epr.toElement());
+ soapElement.removeNamespaceDeclaration(ADDR.getNamespacePrefix());
+ soapHeader.addChildElement(soapElement);
+ }
- // Write wsa:Action
- SOAPElement wsaAction = soapHeader.addChildElement(new NameImpl(ADDR.getActionQName()));
- wsaAction.addTextNode(getAction().getURI().toString());
+ // Write wsa:FaultTo
+ if (getFaultTo() != null)
+ {
+ EndpointReferenceImpl epr = (EndpointReferenceImpl)getFaultTo();
+ epr.setRootQName(ADDR.getFaultToQName());
+ SOAPElement soapElement = factory.createElement(epr.toElement());
+ soapElement.removeNamespaceDeclaration(ADDR.getNamespacePrefix());
+ soapHeader.addChildElement(soapElement);
+ }
- // Write wsa:MessageID
- if (getMessageID() != null)
- {
- SOAPElement wsaMessageId = soapHeader.addChildElement(new NameImpl(ADDR.getMessageIDQName()));
- wsaMessageId.addTextNode(getMessageID().getURI().toString());
- }
+ // Write wsa:Action
+ SOAPElement wsaAction = soapHeader.addChildElement(new NameImpl(ADDR.getActionQName()));
+ wsaAction.addTextNode(getAction().getURI().toString());
- // Write wsa:RelatesTo
- if (getRelatesTo() != null)
- {
- for (Relationship rel : getRelatesTo())
- {
- SOAPElement wsaRelatesTo = soapHeader.addChildElement(new NameImpl(ADDR.getRelatesToQName()));
- if (rel.getType() != null)
- {
- wsaRelatesTo.setAttribute(ADDR.getRelationshipTypeName(), getPrefixedName(rel.getType()));
- }
- wsaRelatesTo.addTextNode(rel.getID().toString());
- }
- }
+ // Write wsa:MessageID
+ if (getMessageID() != null)
+ {
+ SOAPElement wsaMessageId = soapHeader.addChildElement(new NameImpl(ADDR.getMessageIDQName()));
+ wsaMessageId.addTextNode(getMessageID().getURI().toString());
+ }
- // Write wsa:ReferenceParameters
- ReferenceParameters refParams = getReferenceParameters();
- if (refParams.getElements().size() > 0 || refParams.getAttributes().size() > 0)
- {
- SOAPElement wsaRefParams = soapHeader.addChildElement(new NameImpl(ADDR.getReferenceParametersQName()));
- appendAttributes(wsaRefParams, refParams.getAttributes());
- appendElements(wsaRefParams, refParams.getElements());
- }
+ // Write wsa:RelatesTo
+ if (getRelatesTo() != null)
+ {
+ for (Relationship rel : getRelatesTo())
+ {
+ SOAPElement wsaRelatesTo = soapHeader.addChildElement(new NameImpl(ADDR.getRelatesToQName()));
+ if (rel.getType() != null)
+ {
+ wsaRelatesTo.setAttribute(ADDR.getRelationshipTypeName(), getPrefixedName(rel.getType()));
+ }
+ wsaRelatesTo.addTextNode(rel.getID().toString());
+ }
+ }
- appendElements(soapHeader, getElements());
- }
- catch (SOAPException ex)
- {
- throw new AddressingException("Cannot read headers", ex);
- }
- }
+ // Write wsa:ReferenceParameters
+ ReferenceParameters refParams = getReferenceParameters();
+ if (refParams.getElements().size() > 0 || refParams.getAttributes().size() > 0)
+ {
+ SOAPElement wsaRefParams = soapHeader.addChildElement(new NameImpl(ADDR.getReferenceParametersQName()));
+ appendAttributes(wsaRefParams, refParams.getAttributes());
+ appendElements(wsaRefParams, refParams.getElements());
+ }
- public void setMu(boolean mu)
- {
- throw new NotImplementedException();
- }
+ appendElements(soapHeader, getElements());
+ }
+ catch (SOAPException ex)
+ {
+ throw new AddressingException("Cannot read headers", ex);
+ }
+ }
- private void appendAttributes(SOAPElement soapElement, Map<QName, String> attributes)
- {
- for (QName qname : attributes.keySet())
- {
- String qualname = getPrefixedName(qname);
- String value = attributes.get(qname);
- soapElement.setAttribute(qualname, value);
- }
- }
+ public void setMu(boolean mu)
+ {
+ throw new NotImplementedException();
+ }
- private void appendElements(SOAPElement soapElement, List<Object> elements)
- {
- try
- {
- SOAPFactoryImpl factory = (SOAPFactoryImpl)SOAPFactory.newInstance();
- for (Object obj : elements)
- {
- if (obj instanceof Element)
- {
- SOAPElement child = factory.createElement((Element)obj);
- soapElement.addChildElement(child);
- }
- else if (obj instanceof String)
- {
- Element el = DOMUtils.parse((String)obj);
- SOAPElement child = factory.createElement(el);
- soapElement.addChildElement(child);
- }
- else
- {
- throw new AddressingException("Unsupported element: " + obj.getClass().getName());
- }
- }
- }
- catch (RuntimeException rte)
- {
- throw rte;
- }
- catch (Exception ex)
- {
- throw new AddressingException("Cannot append elements", ex);
- }
- }
+ private void appendAttributes(SOAPElement soapElement, Map<QName, String> attributes)
+ {
+ for (QName qname : attributes.keySet())
+ {
+ String qualname = getPrefixedName(qname);
+ String value = attributes.get(qname);
+ soapElement.setAttribute(qualname, value);
+ }
+ }
- private String getPrefixedName(QName qname)
- {
- String prefix = qname.getPrefix();
- String localPart = qname.getLocalPart();
- String qualname = (prefix != null && prefix.length() > 0 ? prefix + ":" + localPart : localPart);
- return qualname;
- }
+ private void appendElements(SOAPElement soapElement, List<Object> elements)
+ {
+ try
+ {
+ SOAPFactoryImpl factory = (SOAPFactoryImpl)SOAPFactory.newInstance();
+ for (Object obj : elements)
+ {
+ if (obj instanceof Element)
+ {
+ SOAPElement child = factory.createElement((Element)obj);
+ soapElement.addChildElement(child);
+ }
+ else if (obj instanceof String)
+ {
+ Element el = DOMUtils.parse((String)obj);
+ SOAPElement child = factory.createElement(el);
+ soapElement.addChildElement(child);
+ }
+ else
+ {
+ throw new AddressingException("Unsupported element: " + obj.getClass().getName());
+ }
+ }
+ }
+ catch (RuntimeException rte)
+ {
+ throw rte;
+ }
+ catch (Exception ex)
+ {
+ throw new AddressingException("Cannot append elements", ex);
+ }
+ }
+
+ private String getPrefixedName(QName qname)
+ {
+ String prefix = qname.getPrefix();
+ String localPart = qname.getLocalPart();
+ String qualname = (prefix != null && prefix.length() > 0 ? prefix + ":" + localPart : localPart);
+ return qualname;
+ }
}
More information about the jbossws-commits
mailing list