[jbossws-commits] JBossWS SVN: r3544 - in branches/jbossws-2.0/jbossws-core/src: test/java/org/jboss/test/ws/jaxws and 1 other directories.
jbossws-commits at lists.jboss.org
jbossws-commits at lists.jboss.org
Tue Jun 12 04:39:30 EDT 2007
Author: heiko.braun at jboss.com
Date: 2007-06-12 04:39:29 -0400 (Tue, 12 Jun 2007)
New Revision: 3544
Added:
branches/jbossws-2.0/jbossws-core/src/test/java/org/jboss/test/ws/jaxws/addressing/
branches/jbossws-2.0/jbossws-core/src/test/java/org/jboss/test/ws/jaxws/addressing/AddressingTestCase.java
Modified:
branches/jbossws-2.0/jbossws-core/src/main/java/org/jboss/ws/extensions/addressing/soap/SOAPAddressingPropertiesImpl.java
Log:
Assert on required wsa headers
Modified: branches/jbossws-2.0/jbossws-core/src/main/java/org/jboss/ws/extensions/addressing/soap/SOAPAddressingPropertiesImpl.java
===================================================================
--- branches/jbossws-2.0/jbossws-core/src/main/java/org/jboss/ws/extensions/addressing/soap/SOAPAddressingPropertiesImpl.java 2007-06-12 08:32:04 UTC (rev 3543)
+++ branches/jbossws-2.0/jbossws-core/src/main/java/org/jboss/ws/extensions/addressing/soap/SOAPAddressingPropertiesImpl.java 2007-06-12 08:39:29 UTC (rev 3544)
@@ -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,6 +35,22 @@
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>.
@@ -71,6 +65,28 @@
private NamespaceRegistry nsRegistry = new NamespaceRegistry();
+ private String getRequiredHeaderContent(SOAPHeader soapHeader, QName qname)
+ {
+ Element element = DOMUtils.getFirstChildElement(soapHeader, qname);
+ if(null == element) throw new AddressingException("Required element "+qname+" is missing");
+
+ String value = DOMUtils.getTextContent(element);
+ if(null == value || value.equals("")) throw new AddressingException("Required element "+qname+" is missing");
+
+ return value;
+ }
+
+ private String getOptionalHeaderContent(SOAPHeader soapHeader, QName qname)
+ {
+ Element element = DOMUtils.getFirstChildElement(soapHeader, qname);
+ if (element != null)
+ {
+ return DOMUtils.getTextContent(element);
+ }
+
+ return null;
+ }
+
public void readHeaders(SOAPMessage message) throws AddressingException
{
try
@@ -79,100 +95,96 @@
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());
- Element wsaAction = DOMUtils.getFirstChildElement(soapHeader, ADDR.getActionQName());
- if (wsaAction != null)
- {
- // Register wsa namespace
- nsRegistry.registerURI(ADDR.getNamespaceURI(), ADDR.getNamespacePrefix());
+ // 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));
- // 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);
- }
- }
+ // wsa:To
+ // This REQUIRED element (of type xs:anyURI) provides the value for the [destination] property.
+ setTo(builder.newURI(to));
- // Read wsa:To
- Element wsaTo = DOMUtils.getFirstChildElement(soapHeader, ADDR.getToQName());
- if (wsaTo != null)
- {
- String to = DOMUtils.getTextContent(wsaTo);
- setTo(builder.newURI(to));
- }
+ // 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:From
- Element wsaFrom = DOMUtils.getFirstChildElement(soapHeader, ADDR.getFromQName());
- if (wsaFrom != null)
- {
- EndpointReferenceImpl ref = new EndpointReferenceImpl(wsaFrom);
- setReplyTo(ref);
- }
+ // 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:ReplyTo
- Element wsaReplyTo = DOMUtils.getFirstChildElement(soapHeader, ADDR.getReplyToQName());
- if (wsaReplyTo != null)
- {
- EndpointReferenceImpl ref = new EndpointReferenceImpl(wsaReplyTo);
- setReplyTo(ref);
- }
+ // 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:FaultTo
- Element wsaFaultTo = DOMUtils.getFirstChildElement(soapHeader, ADDR.getFaultToQName());
- if (wsaFaultTo != null)
- {
- EndpointReferenceImpl ref = new EndpointReferenceImpl(wsaFaultTo);
- setFaultTo(ref);
- }
-
- // Read wsa:Action
- String action = DOMUtils.getTextContent(wsaAction);
- setAction(builder.newURI(action));
-
- // Read wsa:MessageID
- Element wsaMessageId = DOMUtils.getFirstChildElement(soapHeader, ADDR.getMessageIDQName());
- if (wsaMessageId != null)
- {
- String messageID = DOMUtils.getTextContent(wsaMessageId);
- setMessageID(builder.newURI(messageID));
- }
-
- // 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);
- }
- }
+ // 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)
{
@@ -184,6 +196,26 @@
}
}
+ private void registerNamespaces(AddressingConstants ADDR, SOAPHeader soapHeader)
+ {
+ // Register wsa namespace
+ nsRegistry.registerURI(ADDR.getNamespaceURI(), ADDR.getNamespacePrefix());
+
+ // 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);
+ }
+ }
+ }
+
public void writeHeaders(SOAPMessage message) throws AddressingException
{
try
Added: branches/jbossws-2.0/jbossws-core/src/test/java/org/jboss/test/ws/jaxws/addressing/AddressingTestCase.java
===================================================================
--- branches/jbossws-2.0/jbossws-core/src/test/java/org/jboss/test/ws/jaxws/addressing/AddressingTestCase.java (rev 0)
+++ branches/jbossws-2.0/jbossws-core/src/test/java/org/jboss/test/ws/jaxws/addressing/AddressingTestCase.java 2007-06-12 08:39:29 UTC (rev 3544)
@@ -0,0 +1,75 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.test.ws.jaxws.addressing;
+
+import junit.framework.TestCase;
+
+import javax.xml.soap.MessageFactory;
+import javax.xml.soap.SOAPMessage;
+import javax.xml.ws.addressing.AddressingException;
+import java.io.ByteArrayInputStream;
+
+import org.jboss.ws.extensions.addressing.soap.SOAPAddressingPropertiesImpl;
+
+/**
+ * Verify the ws-addressing parsing logic
+ *
+ * @author Heiko.Braun at jboss.com
+ * @version $Revision$
+ */
+public class AddressingTestCase extends TestCase
+{
+
+ private String ERRORNOUS_XML = "<soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'>\n" +
+ " <soap:Header xmlns:wsa='http://www.w3.org/2005/08/addressing'>" +
+ "<wsa:Action></wsa:Action>\n" +
+ "<wsa:MessageID>urn:uuid:1fa5a31f-bbe7-4ad5-8b92-d765f4a32dc9</wsa:MessageID>\n" +
+ "<wsa:ReplyTo>\n" +
+ "<wsa:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:Address>\n" +
+ "<wsa:ReferenceParameters>\n" +
+ "<ns1:clientid xmlns:ns1=\"http://somens\">clientid-1</ns1:clientid>\n" +
+ "</wsa:ReferenceParameters>\n" +
+ "</wsa:ReplyTo>\n" +
+ "<wsa:To>http://mycomp:8080/testws</wsa:To>\n" +
+ "</soap:Header>" +
+ " <soap:Body/>\n" +
+ "</soap:Envelope>";
+
+
+ public void testReplyToWithoutAction() throws Exception
+ {
+ MessageFactory mf = MessageFactory.newInstance();
+ SOAPMessage message = mf.createMessage(null, new ByteArrayInputStream(ERRORNOUS_XML.getBytes()));
+
+ SOAPAddressingPropertiesImpl props = new SOAPAddressingPropertiesImpl();
+ try
+ {
+ props.readHeaders(message);
+ fail("ERRORNOUS_XML should cause a parsing exception due to missing wsa:Action value");
+ }
+ catch (AddressingException e)
+ {
+ // expected an exception
+ }
+
+ }
+}
Property changes on: branches/jbossws-2.0/jbossws-core/src/test/java/org/jboss/test/ws/jaxws/addressing/AddressingTestCase.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
More information about the jbossws-commits
mailing list