[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