You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ag...@apache.org on 2009/01/23 21:44:49 UTC

svn commit: r737182 [2/3] - in /qpid/trunk/qpid/java/management/client: ./ src/main/java/ src/main/java/org/apache/qpid/management/ src/main/java/org/apache/qpid/management/domain/handler/impl/ src/main/java/org/apache/qpid/management/domain/model/ src...

Modified: qpid/trunk/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/capabilities/WsdlBuilder.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/capabilities/WsdlBuilder.java?rev=737182&r1=737181&r2=737182&view=diff
==============================================================================
--- qpid/trunk/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/capabilities/WsdlBuilder.java (original)
+++ qpid/trunk/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/capabilities/WsdlBuilder.java Fri Jan 23 12:44:48 2009
@@ -21,26 +21,36 @@
 package org.apache.qpid.management.wsdm.capabilities;
 
 import java.net.InetAddress;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
 
 import javax.management.MBeanAttributeInfo;
 import javax.management.MBeanOperationInfo;
 import javax.management.MBeanParameterInfo;
 import javax.management.ObjectName;
+import javax.xml.XMLConstants;
 import javax.xml.namespace.QName;
 
 import org.apache.muse.core.Environment;
+import org.apache.muse.util.ReflectUtils;
 import org.apache.muse.util.xml.XmlUtils;
 import org.apache.muse.ws.wsdl.WsdlUtils;
 import org.apache.qpid.management.Messages;
 import org.apache.qpid.management.Names;
 import org.apache.qpid.management.wsdm.muse.serializer.ObjectSerializer;
-import org.apache.qpid.qman.debug.XmlDebugger;
+import org.apache.qpid.qman.debug.WsdlDebugger;
 import org.apache.qpid.transport.util.Logger;
 import org.apache.xpath.XPathAPI;
 import org.w3c.dom.Attr;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
-
+/**
+ * TO BE IMPROVED USING JAXB!!
+ * 
+ * @author Andrea Gazzarini
+ */
 class WsdlBuilder implements IArtifactBuilder {
 
 	private final static Logger LOGGER = Logger.get(WsdlBuilder.class);
@@ -53,6 +63,10 @@
 
 	private ObjectName _objectName;
 	
+	private boolean mapTypeHasBeenDeclared;
+	private boolean uuidTypeHasBeenDeclared;
+	private Map<String, String> arrayTypesAlreadyDeclared = new HashMap<String, String>();
+	
 	public void onAttribute(MBeanAttributeInfo attributeMetadata) throws BuilderException  
 	{
 		try 
@@ -73,14 +87,17 @@
 	        </xs:complexType>
 	       </xs:element>
 */			
-			schema.appendChild(defineSchemaFor(attributeMetadata.getType(), attributeMetadata.getName()));
-			
+			schema.appendChild(defineSchemaFor(attributeMetadata.getType(), attributeMetadata.getName()));				
 			Element wsrpProperties = (Element) XPathAPI.selectSingleNode(
 					_document, 
-					"/wsdl:definitions/wsdl:types/xsd:schema[@targetNamespace='http://amqp.apache.org/qpid/management/qman']/xsd:element[@name='QManWsResourceProperties']/xsd:complexType/xsd:sequence");
-
-			Element propertyRef= XmlUtils.createElement(_document, new QName("http://www.w3.org/2001/XMLSchema","element","xsd"));
-			propertyRef.setAttribute("ref", "qman:"+attributeMetadata.getName());
+					"/wsdl:definitions/wsdl:types/xsd:schema[" +
+					"@targetNamespace='http://amqp.apache.org/qpid/management/qman']" +
+					"/xsd:element[@name='QManWsResourceProperties']/xsd:complexType/xsd:sequence");
+
+			Element propertyRef= XmlUtils.createElement(_document, XSD_ELEMENT_QNAME);
+			propertyRef.setAttribute(
+					"ref", 
+					Names.PREFIX+":"+attributeMetadata.getName());
 			
 			wsrpProperties.appendChild(propertyRef);
 			
@@ -90,56 +107,95 @@
 		}
 	}
 	
+	private final static QName XSD_ELEMENT_QNAME = new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI,"element","xsd");
+	private final static QName XSD_COMPLEX_TYPE_QNAME = new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI,"complexType","xsd");
+	private final static QName XSD_SEQUENCE_QNAME = new QName(XMLConstants.W3C_XML_SCHEMA_NS_URI,"sequence","xsd");
+	
 	private Element defineSchemaFor(String type, String attributeName) throws Exception
 	{
 		if (type.equals("java.util.Map")) 
 		{
-			Element prop = XmlUtils.createElement(_document, new QName("http://www.w3.org/2001/XMLSchema","element","xsd"));
-			prop.setAttribute("name",attributeName);
-			
-				Element complexType = XmlUtils.createElement(_document, new QName("http://www.w3.org/2001/XMLSchema","complexType","xsd"));
+			if (!mapTypeHasBeenDeclared)
+			{				
+					Element complexType = XmlUtils.createElement(_document, XSD_COMPLEX_TYPE_QNAME);
+					complexType.setAttribute("name","map");
+						Element sequence = XmlUtils.createElement(_document, XSD_SEQUENCE_QNAME);
+	
+						Element entry = XmlUtils.createElement(_document, XSD_ELEMENT_QNAME);
+						entry.setAttribute("name", "entry");
+						entry.setAttribute("minOccurs", "0");
+						entry.setAttribute("maxOccurs", "unbounded");
+	
+						Element complexType2 = XmlUtils.createElement(_document, XSD_COMPLEX_TYPE_QNAME);
+						Element sequence2 = XmlUtils.createElement(_document, XSD_SEQUENCE_QNAME);
+	
+							Element key = XmlUtils.createElement(_document, XSD_ELEMENT_QNAME);
+							key.setAttribute("name", "key");
+							key.setAttribute("type", "xsd:string");
+	
+							Element value = XmlUtils.createElement(_document, XSD_ELEMENT_QNAME);
+							value.setAttribute("name", "value");
+							value.setAttribute("type", "xsd:anyType");
+			
+							sequence2.appendChild(key);
+							sequence2.appendChild(value);
+							complexType2.appendChild(sequence2);
+							entry.appendChild(complexType2);
+							sequence.appendChild(entry);
+							complexType.appendChild(sequence);
+							schema.appendChild(complexType);			
+							mapTypeHasBeenDeclared = true;
+			} 
+			Element propertyDeclaration = XmlUtils.createElement(_document, XSD_ELEMENT_QNAME);
+			propertyDeclaration.setAttribute("name",attributeName);
+			propertyDeclaration.setAttribute("type", "qman:map");
+			return propertyDeclaration;
 			
-					Element sequence = XmlUtils.createElement(_document, new QName("http://www.w3.org/2001/XMLSchema","sequence","xsd"));
-
-					Element entry = XmlUtils.createElement(_document, new QName("http://www.w3.org/2001/XMLSchema","element","xsd"));
-					entry.setAttribute("name", "entry");
-					entry.setAttribute("minOccurs", "0");
-					entry.setAttribute("maxOccurs", "unbounded");
-
-					Element complexType2 = XmlUtils.createElement(_document, new QName("http://www.w3.org/2001/XMLSchema","complexType","xsd"));
-					Element sequence2 = XmlUtils.createElement(_document, new QName("http://www.w3.org/2001/XMLSchema","sequence","xsd"));
-
-						Element key = XmlUtils.createElement(_document, new QName("http://www.w3.org/2001/XMLSchema","element","xsd"));
-						key.setAttribute("name", "key");
-						key.setAttribute("type", "xsd:string");
-
-						Element value = XmlUtils.createElement(_document, new QName("http://www.w3.org/2001/XMLSchema","element","xsd"));
-						value.setAttribute("name", "value");
-						value.setAttribute("type", "xsd:anyType");
-		
-						sequence2.appendChild(key);
-						sequence2.appendChild(value);
-						complexType2.appendChild(sequence2);
-						entry.appendChild(complexType2);
-						sequence.appendChild(entry);
-						complexType.appendChild(sequence);
-						prop.appendChild(complexType);
-						return prop;
 		} else if ("java.util.UUID".equals(type)) 
 		{
-			Element prop = XmlUtils.createElement(_document, new QName("http://www.w3.org/2001/XMLSchema","element","xsd"));
-			prop.setAttribute("name", attributeName);
-				Element complexType = XmlUtils.createElement(_document, new QName("http://www.w3.org/2001/XMLSchema","complexType","xsd"));
-					Element sequence = XmlUtils.createElement(_document, new QName("http://www.w3.org/2001/XMLSchema","sequence","xsd"));
-						Element uuid = XmlUtils.createElement(_document, new QName("http://www.w3.org/2001/XMLSchema","element","xsd"));
-						uuid.setAttribute("name", "uuid");
-						uuid.setAttribute("type", "xsd:string");						
-			sequence.appendChild(uuid);
-			complexType.appendChild(sequence);
-			prop.appendChild(complexType);
-			return prop;
-		} else {			
-			Element propertyDeclaration = XmlUtils.createElement(_document, new QName("http://www.w3.org/2001/XMLSchema","element","xsd"));
+			if (!uuidTypeHasBeenDeclared)
+			{
+					Element complexType = XmlUtils.createElement(_document, XSD_COMPLEX_TYPE_QNAME);
+					complexType.setAttribute("name", "uuid");
+						Element sequence = XmlUtils.createElement(_document, XSD_SEQUENCE_QNAME);
+							Element uuid = XmlUtils.createElement(_document, XSD_ELEMENT_QNAME);
+							uuid.setAttribute("name", "uuid");
+							uuid.setAttribute("type", "xsd:string");						
+				sequence.appendChild(uuid);
+				complexType.appendChild(sequence);
+				schema.appendChild(complexType);
+				uuidTypeHasBeenDeclared = true;
+			}
+			Element propertyDeclaration = XmlUtils.createElement(_document, XSD_ELEMENT_QNAME);
+			propertyDeclaration.setAttribute("name",attributeName);
+			propertyDeclaration.setAttribute("type", "qman:uuid");
+			return propertyDeclaration;
+		} else if (type.startsWith("["))
+		{
+			Class arrayClass =  Class.forName(type);
+			Class clazz = ReflectUtils.getClassFromArrayClass(arrayClass);
+			String arrayType = arrayClass.getSimpleName().replace("[]", "").trim();
+			arrayType = Character.toUpperCase(arrayType.charAt(0))+arrayType.substring(1);
+			if (!arrayTypesAlreadyDeclared.containsKey(type))
+			{
+					Element complexType = XmlUtils.createElement(_document, XSD_COMPLEX_TYPE_QNAME);
+					complexType.setAttribute("name", "arrayOf"+arrayType);
+						Element sequence = XmlUtils.createElement(_document, XSD_SEQUENCE_QNAME);
+							Element entry = XmlUtils.createElement(_document, XSD_ELEMENT_QNAME);
+							entry.setAttribute("name", "entry");
+							entry.setAttribute("type", serializer.getXmlType(clazz));						
+				sequence.appendChild(entry);
+				complexType.appendChild(sequence);
+				schema.appendChild(complexType);
+				arrayTypesAlreadyDeclared.put(type, arrayType);
+			}
+			Element propertyDeclaration = XmlUtils.createElement(_document, XSD_ELEMENT_QNAME);
+			propertyDeclaration.setAttribute("name",attributeName);
+			propertyDeclaration.setAttribute("type", "qman:arrayOf"+arrayTypesAlreadyDeclared.get(type));
+			return propertyDeclaration;
+		}
+		else {			
+			Element propertyDeclaration = XmlUtils.createElement(_document, XSD_ELEMENT_QNAME);
 			propertyDeclaration.setAttribute("name",attributeName);
 			propertyDeclaration.setAttribute("type", serializer.getXmlType(Class.forName(type)));
 			return propertyDeclaration;
@@ -158,7 +214,7 @@
 			StringBuilder builder = new StringBuilder("http://")
 				.append(InetAddress.getLocalHost().getHostName())
 				.append(':')
-				.append(System.getProperty(Names.ADAPTER_PORT,"8080"))
+				.append(System.getProperty(Names.ADAPTER_PORT_PROPERTY_NAME,"8080"))
 				.append('/')
 				.append("qman")
 				.append('/')
@@ -218,14 +274,15 @@
 		statusCode.setAttribute("type", "xsd:long");
 
 		Element statusText = _document.createElement("xsd:element");
-		statusCode.setAttribute("name", "statusText");
-		statusCode.setAttribute("type", "xsd:string");
+		statusText.setAttribute("name", "statusText");
+		statusText.setAttribute("type", "xsd:string");
 		
 		sequence.appendChild(statusCode);
 		sequence.appendChild(statusText);
 		
 		Element outputParams = _document.createElement("xsd:complexType");
 		outputParams.setAttribute("name", "outputParameters");
+		sequence.appendChild(outputParams);		
 		
 		Element complexTypeOutput = _document.createElement("xsd:complexType");
 		Element outputSequence = _document.createElement("xsd:sequence");
@@ -243,9 +300,10 @@
 		Element entryComplexType = _document.createElement("xsd:complexType");
 		Element entrySequence = _document.createElement("xsd:sequence");
 		entryComplexType.appendChild(entrySequence);
+		entry.appendChild(entryComplexType);
 		
 		Element name = _document.createElement("xsd:name");
-		name.setAttribute("name", "name");
+		name.setAttribute("name", "key");
 		name.setAttribute("type", "xsd:string");
 		
 		Element value = _document.createElement("xsd:element");
@@ -324,6 +382,7 @@
 			Element methodNameRequestComplexType =  _document.createElement("xsd:complexType");
 			methodNameRequestComplexType.setAttribute("name", methodNameRequest);
 			Element methodNameRequestComplexTypeSequence = _document.createElement("xsd:sequence");
+			
 			for(MBeanParameterInfo parameter : operationMetadata.getSignature())
 			{
 				methodNameRequestComplexTypeSequence.appendChild(defineSchemaFor(parameter.getType(), parameter.getName()));
@@ -340,7 +399,7 @@
 			
 			Element result = _document.createElement("xsd:element");
 			result.setAttribute("name", "result");
-			result.setAttribute("type", "qman:invocationResult");
+			result.setAttribute("type", "qman:result");
 			methodNameResponseSequence.appendChild(result);
 			
 			schema.appendChild(methodNameResponseComplexType);
@@ -459,7 +518,7 @@
 
 	public Document getWsdl() 
 	{
-		XmlDebugger.debug(_objectName,_document);
+		WsdlDebugger.debug(_objectName,_document);
 		return _document;
 	}
 

Modified: qpid/trunk/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/muse/engine/WSDMAdapterEnvironment.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/muse/engine/WSDMAdapterEnvironment.java?rev=737182&r1=737181&r2=737182&view=diff
==============================================================================
--- qpid/trunk/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/muse/engine/WSDMAdapterEnvironment.java (original)
+++ qpid/trunk/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/muse/engine/WSDMAdapterEnvironment.java Fri Jan 23 12:44:48 2009
@@ -67,18 +67,11 @@
     
     public String getDefaultURIPrefix()
     {
-    	String host = null;
-    	  try {
-  			host = InetAddress.getLocalHost().getHostName();
-  		} catch (UnknownHostException e) {
-  			host = "localhost";
-  		}
-  		
         return new StringBuilder()
     		.append("http://")
-    		.append(host)
+    		.append(System.getProperty(Names.ADAPTER_HOST_PROPERTY_NAME,"localhost"))
     		.append(":")
-    		.append(System.getProperty(Names.ADAPTER_PORT))
+    		.append(System.getProperty(Names.ADAPTER_PORT_PROPERTY_NAME,"8080"))
     		.append(_servletContext.getContextPath())
     		.append("/services/")
     		.toString();    	

Modified: qpid/trunk/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/muse/resources/QManWsResource.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/muse/resources/QManWsResource.java?rev=737182&r1=737181&r2=737182&view=diff
==============================================================================
--- qpid/trunk/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/muse/resources/QManWsResource.java (original)
+++ qpid/trunk/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/muse/resources/QManWsResource.java Fri Jan 23 12:44:48 2009
@@ -321,16 +321,6 @@
         return _capabilitiesByURI.get(capabilityURI);
     }
     
-//    /**
-//     * Returns all the WS-Action URIs supported by this resource.
-//     * 
-//     * @return all of the WS-A Action URIs supported by this resource.
-//     */
-//    protected Collection getCapabilityActions()
-//    {
-//        return Collections.unmodifiableSet(_capabilitiesByAction.keySet());
-//    }
-    
     /**
      * Returns a collection with all registered capability URIs.
      * 
@@ -539,6 +529,10 @@
         }
         catch (Throwable throwable)
         {
+        	LOGGER.error(
+        			throwable, 
+        			Messages.QMAN_100037_INVOKE_OPERATION_FAILURE);
+        	
             SoapFault response = SoapUtils.convertToFault(
             		(throwable.getCause()!= null) 
             			? throwable.getCause()
@@ -725,15 +719,20 @@
         
 	        for (Element element : additionalProperties) 
 	        {
-				rmdDoc.adoptNode(element);
-				metadataDescriptor.appendChild(element);
+	        	
+//	        	rmdDoc.importNode(element, true);
+				Element adopted = (Element) rmdDoc.importNode(element,false);
+				metadataDescriptor.appendChild(adopted);
 			}
 			
 			return new SimpleMetadataDescriptor(metadataDescriptor);
         } 
         catch(Exception exception)
         {
-        	LOGGER.error(exception,Messages.QMAN_100021_RMD_BUID_FAILURE,getContextPath());
+        	LOGGER.error(
+        			exception,
+        			Messages.QMAN_100021_RMD_BUID_FAILURE,
+        			getContextPath());
         	throw new SoapFault(exception);
         }
     }    

Added: qpid/trunk/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/muse/serializer/DateSerializer.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/muse/serializer/DateSerializer.java?rev=737182&view=auto
==============================================================================
--- qpid/trunk/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/muse/serializer/DateSerializer.java (added)
+++ qpid/trunk/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/muse/serializer/DateSerializer.java Fri Jan 23 12:44:48 2009
@@ -0,0 +1,75 @@
+/*
+ *
+ * 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.qpid.management.wsdm.muse.serializer;
+
+import java.util.Date;
+
+import javax.xml.namespace.QName;
+
+import org.apache.muse.core.serializer.Serializer;
+import org.apache.muse.util.xml.XmlUtils;
+import org.apache.muse.ws.addressing.soap.SoapFault;
+import org.w3c.dom.Element;
+
+/**
+ * Implementation of Muse Serializer for Date type.
+ * Note that Muse already ships a serializer but the formatter used on that class 
+ * is losing precision betweem marshal / unmarshal operations.
+ *  
+ * @author Andrea Gazzarini
+ */
+public class DateSerializer implements Serializer 
+{	
+	/**
+	 * Return a Date representation of the given xml element.
+	 * 
+	 * @param xml the element to unmarshal.
+	 * @throws SoapFault when the unmarshalling fails.
+	 */	
+	public Object fromXML(Element elementData) throws SoapFault 
+	{
+		return new Date(Long.parseLong(elementData.getTextContent()));
+	}
+
+	/**
+	 * Returns the java type associated to this class.
+	 * 
+	 * @return the java type associated to this class.
+	 */
+	public Class<?> getSerializableType() 
+	{
+		return Date.class;
+	}
+
+	/**
+	 * Return an xml representation of the given UUID with the given name.
+	 * 
+	 * @param object the UUID to marshal.
+	 * @param qname the qualified (xml) name of the object to use in xml representation.
+	 * @return the xml representation of the UUID.
+	 * @throws SoapFault when the marshalling fails.
+	 */
+	public Element toXML(Object obj, QName qname) throws SoapFault 
+	{
+		Date date = (Date) obj;
+		return XmlUtils.createElement(qname, String.valueOf(date.getTime()));
+	}
+}
\ No newline at end of file

Modified: qpid/trunk/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/muse/serializer/InvocationResultSerializer.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/muse/serializer/InvocationResultSerializer.java?rev=737182&r1=737181&r2=737182&view=diff
==============================================================================
--- qpid/trunk/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/muse/serializer/InvocationResultSerializer.java (original)
+++ qpid/trunk/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/muse/serializer/InvocationResultSerializer.java Fri Jan 23 12:44:48 2009
@@ -38,7 +38,6 @@
  */
 public class InvocationResultSerializer implements Serializer 
 {	
-	
 	private Serializer _longSerializer = SerializerRegistry.getInstance().getSerializer(long.class);
 	private Serializer _stringSerializer = SerializerRegistry.getInstance().getSerializer(String.class);
 	private Serializer _mapSerializer = SerializerRegistry.getInstance().getSerializer(Map.class);

Modified: qpid/trunk/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/muse/serializer/MapSerializer.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/muse/serializer/MapSerializer.java?rev=737182&r1=737181&r2=737182&view=diff
==============================================================================
--- qpid/trunk/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/muse/serializer/MapSerializer.java (original)
+++ qpid/trunk/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/muse/serializer/MapSerializer.java Fri Jan 23 12:44:48 2009
@@ -49,7 +49,9 @@
 public class MapSerializer implements Serializer 
 {
 	
-	ByteArraySerializer byteArraySerializer = new ByteArraySerializer();
+	ByteArraySerializer _byteArraySerializer = new ByteArraySerializer();
+	Serializer _objectSerializer = SerializerRegistry.getInstance().getSerializer(Object.class);
+	Serializer _stringSerializer = SerializerRegistry.getInstance().getSerializer(String.class);
 	
 	/**
 	 * Return a map representation of the given xml element.
@@ -70,10 +72,10 @@
 			Object value = null;
 			for (Element element : keysAndValues) 
 			{
-				if (Names.KEY.equals(element.getNodeName()))
+				if (Names.KEY.equals(element.getLocalName()))
 				{
-					key = objectDeserializer.fromXML(element);
-				} else if (Names.VALUE.equals(element.getNodeName()))
+					key = _stringSerializer.fromXML(element);
+				} else if (Names.VALUE.equals(element.getLocalName()))
 				{
 					value = objectDeserializer.fromXML(element);
 				}
@@ -103,23 +105,23 @@
 	 */
 	public Element toXML(Object obj, QName qname) throws SoapFault 
 	{
-		Serializer objectSerializer = SerializerRegistry.getInstance().getSerializer(Object.class);
+		
 		Map<?, ?> data = (Map<?, ?>) obj;
 
-		QName entryQName = new QName(Names.ENTRY);
-		QName keyQName = new QName(Names.KEY);
-		QName valueQName = new QName(Names.VALUE);
+		QName entryQName = new QName(qname.getNamespaceURI(),Names.ENTRY,qname.getPrefix());
+		QName keyQName = new QName(qname.getNamespaceURI(),Names.KEY,qname.getPrefix());
+		QName valueQName = new QName(qname.getNamespaceURI(),Names.VALUE,qname.getPrefix());
 		
 		Element root = XmlUtils.createElement(qname);
 		root.setAttribute("xmlns:xsi", XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI);
 		for (Entry<?, ?> mapEntry: data.entrySet()) 
 		{
 			Element entry = XmlUtils.createElement(entryQName);									
-			entry.appendChild(objectSerializer.toXML(mapEntry.getKey(), keyQName));
+			entry.appendChild(_stringSerializer.toXML(mapEntry.getKey(), keyQName));
 			if (mapEntry.getValue().getClass() == byte[].class) {				
-				entry.appendChild(byteArraySerializer.toXML(mapEntry.getValue(), valueQName));
+				entry.appendChild(_byteArraySerializer.toXML(mapEntry.getValue(), valueQName));
 			} else {
-				entry.appendChild(objectSerializer.toXML(mapEntry.getValue(), valueQName));
+				entry.appendChild(_objectSerializer.toXML(mapEntry.getValue(), valueQName));
 			}
 			root.appendChild(entry);
 		}

Modified: qpid/trunk/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/muse/serializer/ObjectSerializer.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/muse/serializer/ObjectSerializer.java?rev=737182&r1=737181&r2=737182&view=diff
==============================================================================
--- qpid/trunk/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/muse/serializer/ObjectSerializer.java (original)
+++ qpid/trunk/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/muse/serializer/ObjectSerializer.java Fri Jan 23 12:44:48 2009
@@ -24,6 +24,7 @@
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.UUID;
 
 import javax.xml.XMLConstants;
 import javax.xml.namespace.QName;
@@ -47,49 +48,70 @@
 	private Map<String, Class<?>> xml2Java = new HashMap<String, Class<?>>();
 	{
 		xml2Java.put("xsd:long", Long.class);
-		xml2Java.put("xsd:long", long.class);
 		xml2Java.put("xsd:boolean",Boolean.class);
-		xml2Java.put("xsd:boolean",boolean.class);
-		xml2Java.put("xsd:double",Double.class);
 		xml2Java.put("xsd:double",Double.class);
 		xml2Java.put("xsd:float",Float.class);
-		xml2Java.put("xsd:float",float.class);
 		xml2Java.put("xsd:integer",Integer.class);
-		xml2Java.put("xsd:integer",int.class);
 		xml2Java.put("xsd:int",Integer.class);
-		xml2Java.put("xsd:int",int.class);
 		xml2Java.put("xsd:short",Short.class);
-		xml2Java.put("xsd:short",short.class);
 		xml2Java.put("xsd:string",String.class);
 		xml2Java.put("xsd:anyURI",URI.class);
-		xml2Java.put("xsd:dateTime",URI.class);
+		xml2Java.put("xsd:dateTime",Date.class);
 		xml2Java.put("xsd:QName",QName.class);
 		xml2Java.put("xsd:element",Element.class);
 		xml2Java.put("xsd:base64Binary",byte[].class);
+		xml2Java.put("qman:arrayOfLong",Long[].class);
+		xml2Java.put("qman:arrayOfBoolean",Boolean[].class);
+		xml2Java.put("qman:arrayOfDouble",Double[].class);
+		xml2Java.put("qman:arrayOfFloat",Float[].class);
+		xml2Java.put("qman:arrayOfInteger",Integer[].class);
+		xml2Java.put("qman:arrayOfShort",Short[].class);
+		xml2Java.put("qman:arrayOfString",String[].class);
+		xml2Java.put("qman:arrayOfURI",URI[].class);
+		xml2Java.put("qman:arrayOfDate",Date[].class);
+		xml2Java.put("qman:uuid",UUID.class);
+		xml2Java.put("qman:map",Map.class);		
+		xml2Java.put("qman:map",HashMap.class);		
 	}
 	
 	private Map<Class<?>, String> java2Xml = new HashMap<Class<?>, String>();
-	{
+	{		
+		java2Xml.put(UUID.class,"qman:uuid");
 		java2Xml.put(Long.class,"xsd:long");
 		java2Xml.put(long.class,"xsd:long");
 		java2Xml.put(Boolean.class,"xsd:boolean");
-		java2Xml.put(Boolean.class,"xsd:boolean");
-		java2Xml.put(Double.class,"xsd:double");
+		java2Xml.put(boolean.class,"xsd:boolean");
 		java2Xml.put(Double.class,"xsd:double");
+		java2Xml.put(double.class,"xsd:double");
 		java2Xml.put(Float.class,"xsd:float");
-		java2Xml.put(Float.class,"xsd:float");
-		java2Xml.put(Integer.class,"xsd:integer");
+		java2Xml.put(float.class,"xsd:float");
 		java2Xml.put(Integer.class,"xsd:integer");
-		java2Xml.put(Integer.class,"xsd:int");
-		java2Xml.put(Integer.class,"xsd:int");
-		java2Xml.put(Short.class,"xsd:short");
+		java2Xml.put(int.class,"xsd:integer");
 		java2Xml.put(Short.class,"xsd:short");
+		java2Xml.put(short.class,"xsd:short");
 		java2Xml.put(String.class,"xsd:string");
 		java2Xml.put(URI.class,"xsd:anyURI");
 		java2Xml.put(Date.class,"xsd:dateTime");
 		java2Xml.put(QName.class,"xsd:QName");
 		java2Xml.put(Element.class,"xsd:element");
 		java2Xml.put(byte[].class,"xsd:base64Binary");
+		java2Xml.put(Long[].class,"qman:arrayOfLong");	
+		java2Xml.put(long[].class,"qman:arrayOfLong");
+		java2Xml.put(Boolean[].class,"qman:arrayOfBoolean");
+		java2Xml.put(boolean[].class,"qman:arrayOfBoolean");
+		java2Xml.put(Double[].class,"qman:arrayOfDouble");
+		java2Xml.put(double[].class,"qman:arrayOfDouble");
+		java2Xml.put(Float[].class,"qman:arrayOfFloat");
+		java2Xml.put(float[].class,"qman:arrayOfFloat");
+		java2Xml.put(Integer[].class,"qman:arrayOfInteger");
+		java2Xml.put(int[].class,"qman:arrayOfInteger");
+		java2Xml.put(Short[].class,"qman:arrayOfShort");
+		java2Xml.put(short[].class,"qman:arrayOfShort");
+		java2Xml.put(String[].class,"qman:arrayOfString");
+		java2Xml.put(URI[].class,"qman:arrayOfURI");
+		java2Xml.put(Date[].class,"qman:arrayOfDate");
+		java2Xml.put(Map.class,"qman:map");
+		java2Xml.put(HashMap.class,"qman:map");
 	}
 	
 	/**
@@ -113,14 +135,18 @@
 		{
 			throw new SoapFault(
 				"No type attribute was found for the current element. " +
-				"If you are using this serializer, in order to unmarshal the opportune type the xsi:type must be specified.");
+				"If you are using this serializer, in order to unmarshal the" +
+				" opportune type the xsi:type must be specified.");
 		}
 		
 		Class<?> clazz = xml2Java.get(typeAttribute.getValue());
 		
 		if (clazz == null)
 		{
-			throw new SoapFault(String.format("No corresponding class was found on this serializer mappings for xsi:type %s.",typeAttribute));
+			throw new SoapFault(
+					String.format(
+							"No corresponding class was found on this serializer mappings for xsi:type %s.",
+							typeAttribute));
 		}
 		
 		if (clazz == byte[].class) {
@@ -155,7 +181,8 @@
 		
 		if (clazz == byte[].class) {
 			result = new ByteArraySerializer().toXML(obj,qname);
-		} else {
+		} 
+		else {
 			result = SerializerRegistry.getInstance().getSerializer(clazz).toXML(obj,qname);
 		}
 		result.setAttribute(Names.XSI_TYPE, java2Xml.get(clazz));

Added: qpid/trunk/qpid/java/management/client/src/main/java/org/apache/qpid/qman/debug/WsdlDebugger.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/client/src/main/java/org/apache/qpid/qman/debug/WsdlDebugger.java?rev=737182&view=auto
==============================================================================
--- qpid/trunk/qpid/java/management/client/src/main/java/org/apache/qpid/qman/debug/WsdlDebugger.java (added)
+++ qpid/trunk/qpid/java/management/client/src/main/java/org/apache/qpid/qman/debug/WsdlDebugger.java Fri Jan 23 12:44:48 2009
@@ -0,0 +1,49 @@
+/*
+ *
+ * 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.qpid.qman.debug;
+
+import javax.management.ObjectName;
+
+import org.apache.muse.util.xml.XmlUtils;
+import org.apache.qpid.transport.util.Logger;
+import org.w3c.dom.Node;
+
+/**
+ * Utility class used for debbugging WSDL documents
+ * 
+ * @author Andrea Gazzarini
+ */
+public class WsdlDebugger {
+	public final static Logger LOGGER = Logger.get(WsdlDebugger.class);
+	
+	/**
+	 * Prints out to log the given node.
+	 * 
+	 * @param node the xml node to be printed out.
+	 */
+	public static void debug(ObjectName resourceId, Node node) 
+	{
+		if (LOGGER.isDebugEnabled())
+		{
+			LOGGER.debug(resourceId+" : "+XmlUtils.toString(node, false,true));
+		}
+	}
+}
\ No newline at end of file

Added: qpid/trunk/qpid/java/management/client/src/test/java/log4j.xml
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/client/src/test/java/log4j.xml?rev=737182&view=auto
==============================================================================
--- qpid/trunk/qpid/java/management/client/src/test/java/log4j.xml (added)
+++ qpid/trunk/qpid/java/management/client/src/test/java/log4j.xml Fri Jan 23 12:44:48 2009
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">
+	<!-- Write to stdout -->
+	<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
+		<param name="Target" value="System.out" />
+		<param name="Threshold" value="DEBUG" />
+		<layout class="org.apache.log4j.PatternLayout">
+			<param name="ConversionPattern"
+				value="%d{ABSOLUTE} %-5p [%c{1}] %m%n" />
+		</layout>
+	</appender>
+
+	<category name="org">
+		<priority value="ERROR" />
+		<appender-ref ref="CONSOLE" />
+	</category>	
+	<root>
+		<priority value="ERROR" />
+	</root>
+	
+</log4j:configuration>
\ No newline at end of file

Modified: qpid/trunk/qpid/java/management/client/src/test/java/org/apache/qpid/management/TestConstants.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/client/src/test/java/org/apache/qpid/management/TestConstants.java?rev=737182&r1=737181&r2=737182&view=diff
==============================================================================
--- qpid/trunk/qpid/java/management/client/src/test/java/org/apache/qpid/management/TestConstants.java (original)
+++ qpid/trunk/qpid/java/management/client/src/test/java/org/apache/qpid/management/TestConstants.java Fri Jan 23 12:44:48 2009
@@ -64,4 +64,7 @@
 	String YEARS = "years";
 	int SAMPLE_MIN_VALUE = 1;
 	int SAMPLE_MAX_VALUE = 120;	
-}
+	
+	String DEFAULT_HOST = "localhost";
+	int DEFAULT_PORT = 8080;
+}
\ No newline at end of file

Added: qpid/trunk/qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/EnhancedReflectionProxyHandler.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/EnhancedReflectionProxyHandler.java?rev=737182&view=auto
==============================================================================
--- qpid/trunk/qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/EnhancedReflectionProxyHandler.java (added)
+++ qpid/trunk/qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/EnhancedReflectionProxyHandler.java Fri Jan 23 12:44:48 2009
@@ -0,0 +1,67 @@
+/*
+ *
+ * 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.qpid.management.wsdm;
+
+import javax.xml.namespace.QName;
+
+import org.apache.muse.core.proxy.ReflectionProxyHandler;
+import org.apache.muse.util.xml.XmlUtils;
+import org.apache.muse.ws.addressing.soap.SoapFault;
+import org.apache.qpid.management.wsdm.muse.serializer.ByteArraySerializer;
+import org.w3c.dom.Element;
+
+/**
+ * Custom implementation of Muse ReflectionProxyHandler that uses a base64 serializer
+ * for byte arrays.
+ * 
+ * @author Andrea Gazzarini
+ */
+public class EnhancedReflectionProxyHandler extends ReflectionProxyHandler
+{
+	@Override
+	 protected Element serialize(Object obj, QName qname) throws SoapFault
+	 {
+	     if (obj == null)
+	     {
+	 		return XmlUtils.createElement(qname);
+	     }
+	     
+	     if (obj.getClass() == byte[].class)
+	     {
+	    	 return new ByteArraySerializer().toXML(obj, qname);
+	     } else 
+	     {
+	    	 return super.serialize(obj, qname);
+	     }
+	 }
+	
+	@Override
+	protected Object deserialize(Element xml, Class theClass) throws SoapFault
+	{
+	     if (theClass == byte[].class)
+	     {
+	    	 return new ByteArraySerializer().fromXML(xml);
+	     } else 
+	     {
+	    	 return super.deserialize(xml, theClass);
+	     }
+	}
+}
\ No newline at end of file

Added: qpid/trunk/qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/ServerThread.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/ServerThread.java?rev=737182&view=auto
==============================================================================
--- qpid/trunk/qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/ServerThread.java (added)
+++ qpid/trunk/qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/ServerThread.java Fri Jan 23 12:44:48 2009
@@ -0,0 +1,82 @@
+/*
+ *
+ * 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.qpid.management.wsdm;
+
+import java.io.File;
+
+import org.apache.qpid.management.Names;
+import org.mortbay.component.LifeCycle.Listener;
+import org.mortbay.jetty.Connector;
+import org.mortbay.jetty.Server;
+import org.mortbay.jetty.nio.SelectChannelConnector;
+import org.mortbay.jetty.webapp.WebAppContext;
+import org.mortbay.start.Monitor;
+
+public class ServerThread extends Thread
+{	
+	private final Listener _lifecycleListener;
+	private Server server;
+	ServerThread(Listener listener)
+	{
+		this._lifecycleListener = listener;
+	}
+	
+	@Override
+	public void run()
+	{
+		try 
+		{		
+			Monitor.monitor();        
+			server = new Server();
+    		server.setStopAtShutdown(true);
+            
+            Connector connector=new SelectChannelConnector();
+            connector.setPort(
+            		Integer.parseInt(
+            				System.getProperty(Names.ADAPTER_PORT_PROPERTY_NAME)));
+            connector.setHost(System.getProperty(Names.ADAPTER_HOST_PROPERTY_NAME));
+            
+            server.setConnectors(new Connector[]{connector});
+            
+            WebAppContext webapp = new WebAppContext();
+//            webapp.setExtractWAR(false);
+            webapp.setContextPath("/qman");
+            webapp.setDefaultsDescriptor("/org/apache/qpid/management/wsdm/web.xml");
+
+            String webApplicationPath = System.getProperty("qman.war");
+            File rootFolderPath = (webApplicationPath != null) ? new File(webApplicationPath) : new File(".");
+            
+            webapp.setWar(rootFolderPath.toURI().toURL().toExternalForm());
+            webapp.addLifeCycleListener(_lifecycleListener);
+            server.setHandler(webapp);
+            server.start();
+            server.join();
+		} catch(Exception exception)
+		{
+			throw new RuntimeException(exception);
+		}
+	}
+	
+	public void shutdown() throws Exception
+	{
+		server.stop();
+	}
+}

Added: qpid/trunk/qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/WebApplicationLifeCycleListener.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/WebApplicationLifeCycleListener.java?rev=737182&view=auto
==============================================================================
--- qpid/trunk/qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/WebApplicationLifeCycleListener.java (added)
+++ qpid/trunk/qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/WebApplicationLifeCycleListener.java Fri Jan 23 12:44:48 2009
@@ -0,0 +1,52 @@
+/*
+ *
+ * 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.qpid.management.wsdm;
+import org.mortbay.component.LifeCycle;
+import org.mortbay.component.LifeCycle.Listener;
+
+/**
+ * Adapter class used to provide an empty (base) implementation of 
+ * Lifecycle listener interface.
+ * 
+ * @author Andrea Gazzarini
+ */
+public class WebApplicationLifeCycleListener implements Listener
+{
+	public void lifeCycleFailure(LifeCycle event, Throwable cause)
+	{
+	}
+
+	public void lifeCycleStarted(LifeCycle event)
+	{
+	}
+
+	public void lifeCycleStarting(LifeCycle event)
+	{
+	}
+
+	public void lifeCycleStopped(LifeCycle event)
+	{
+	}
+
+	public void lifeCycleStopping(LifeCycle event)
+	{
+	}
+}
\ No newline at end of file

Added: qpid/trunk/qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/WsDmAdapterTest.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/WsDmAdapterTest.java?rev=737182&view=auto
==============================================================================
--- qpid/trunk/qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/WsDmAdapterTest.java (added)
+++ qpid/trunk/qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/WsDmAdapterTest.java Fri Jan 23 12:44:48 2009
@@ -0,0 +1,1026 @@
+/*
+ *
+ * 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.qpid.management.wsdm;
+
+import java.lang.management.ManagementFactory;
+import java.lang.reflect.Array;
+import java.lang.reflect.Method;
+import java.net.URI;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+import javax.management.MBeanAttributeInfo;
+import javax.management.MBeanInfo;
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+import javax.xml.namespace.QName;
+
+import junit.extensions.TestSetup;
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.apache.muse.core.proxy.ProxyHandler;
+import org.apache.muse.core.proxy.ReflectionProxyHandler;
+import org.apache.muse.core.serializer.SerializerRegistry;
+import org.apache.muse.ws.addressing.EndpointReference;
+import org.apache.muse.ws.addressing.soap.SoapFault;
+import org.apache.muse.ws.resource.remote.WsResourceClient;
+import org.apache.muse.ws.resource.sg.remote.ServiceGroupClient;
+import org.apache.qpid.management.Names;
+import org.apache.qpid.management.TestConstants;
+import org.apache.qpid.management.wsdm.capabilities.Result;
+import org.apache.qpid.management.wsdm.muse.serializer.DateSerializer;
+import org.apache.qpid.management.wsdm.muse.serializer.InvocationResultSerializer;
+import org.apache.qpid.management.wsdm.muse.serializer.MapSerializer;
+import org.apache.qpid.management.wsdm.muse.serializer.ObjectSerializer;
+import org.apache.qpid.management.wsdm.muse.serializer.UUIDSerializer;
+import org.mortbay.component.LifeCycle;
+import org.mortbay.component.LifeCycle.Listener;
+import org.w3c.dom.Element;
+
+/**
+ * Test case for WS-Resource lifecycle management.
+ * 
+ * @author Andrea Gazzarini
+ */
+public class WsDmAdapterTest extends TestCase {
+	
+	private MBeanServer _managementServer;
+	private ObjectName _resourceObjectName;
+		
+	private WsResourceClient _resourceClient;
+	private MBeanInfo _mbeanInfo;
+	
+	private Map<String, ProxyHandler> _invocationHandlers = createInvocationHandlers();
+	final Long retCodeOk = new Long(0);
+
+	/**
+	 * Test case wide set up.
+	 * Provides Server startup & shutdown global procedure.
+	 * 
+	 * @author Andrea Gazzarini
+	 */
+	private static class WsDmAdapterTestSetup extends TestSetup
+	{
+		private Object _serverMonitor = new Object();
+		
+		Listener listener = new WebApplicationLifeCycleListener() 
+		{
+			public void lifeCycleStarted(LifeCycle event)
+			{
+				synchronized (_serverMonitor) 
+				{
+					_serverMonitor.notify();
+				}
+			}
+		};
+		
+		private ServerThread server;
+		
+		/**
+		 * Builds a new test setup with for the given test.
+		 * 
+		 * @param test the decorated test.
+		 */
+		public WsDmAdapterTestSetup(Test test)
+		{
+			super(test);
+		}
+		
+		/**
+		 * Starts up Web server.
+		 * 
+		 * @throws Exception when the server startup fails.
+		 */
+		@Override
+		protected void setUp() throws Exception
+		{	
+			SerializerRegistry.getInstance().registerSerializer(Object.class, new ObjectSerializer());
+			SerializerRegistry.getInstance().registerSerializer(Date.class, new DateSerializer());
+			SerializerRegistry.getInstance().registerSerializer(Map.class, new MapSerializer());
+			SerializerRegistry.getInstance().registerSerializer(HashMap.class, new MapSerializer());
+			SerializerRegistry.getInstance().registerSerializer(UUID.class, new UUIDSerializer());
+			SerializerRegistry.getInstance().registerSerializer(Result.class, new InvocationResultSerializer());
+			
+			System.setProperty(
+					Names.ADAPTER_PORT_PROPERTY_NAME, 
+					String.valueOf(TestConstants.DEFAULT_PORT));
+
+			System.setProperty(
+					Names.ADAPTER_HOST_PROPERTY_NAME, 
+					TestConstants.DEFAULT_HOST);
+			
+			server = new ServerThread(listener);
+			server.start();
+			
+			synchronized(_serverMonitor) {
+				_serverMonitor.wait();
+			}
+		}
+		
+		@Override
+		protected void tearDown() throws Exception
+		{
+			server.shutdown();
+		}
+	};
+	
+	/**
+	 * Set up fixture for this test case.
+	 * 
+	 * @throws Exception when the test case intialization fails.
+	 */
+	protected void setUp() throws Exception 
+	{		
+		_managementServer = ManagementFactory.getPlatformMBeanServer();
+		
+        ServiceGroupClient serviceGroup = getServiceGroupClient();
+        WsResourceClient [] members = serviceGroup.getMembers();
+        
+        assertEquals(
+        		"No resource has been yet created so how is " +
+        			"it possible that service group children list is not empty?",
+        		0,
+        		members.length);
+
+        _managementServer.invoke(
+        		Names.QPID_EMULATOR_OBJECT_NAME, 
+        		"createQueue", new Object[]{_resourceObjectName = createResourceName()}, 
+        		new String[]{ObjectName.class.getName()});
+                
+        members = serviceGroup.getMembers();
+        assertEquals(
+        		"One resource has just been created so " +
+        			"I expect to find it on service group children list...",
+        		1,
+        		members.length);
+        
+        _resourceClient = members[0];
+        _mbeanInfo = _managementServer.getMBeanInfo(_resourceObjectName);
+	}
+
+	/**
+	 * Shutdown procedure for this test case.
+	 * 
+	 * @throws Exception when either the server or some resource fails to shutdown.
+	 */
+	@Override
+	protected void tearDown() throws Exception
+	{
+        ServiceGroupClient serviceGroup = getServiceGroupClient();
+        WsResourceClient [] members = serviceGroup.getMembers();
+
+		_managementServer.invoke(
+				Names.QPID_EMULATOR_OBJECT_NAME,
+				"unregister",
+				new Object[]{_resourceObjectName},
+				new String[]{ObjectName.class.getName()});
+
+      	members = serviceGroup.getMembers();
+
+      	assertEquals(
+      			"No resource has been yet created so how is it possible that service group children list is not empty?",
+      			0,
+      			members.length);
+	}
+	
+	/**
+	 * Test the WS-RP GetResourceProperty interface of the WS-DM adapter.
+	 * 
+	 * <br>precondition : a ws resource exists and is registered. 
+	 * <br>postcondition : property values coming from WS-DM resource are the same of the JMX interface.
+	 */
+	public void testGeResourcePropertiesOK() throws Exception
+	{
+		MBeanAttributeInfo [] attributesMetadata = _mbeanInfo.getAttributes();
+		for (MBeanAttributeInfo attributeMetadata : attributesMetadata)
+		{
+			String name = attributeMetadata.getName();
+			Object propertyValues = _resourceClient.getPropertyAsObject(
+					new QName(
+							Names.NAMESPACE_URI,
+							name,
+							Names.PREFIX),
+					Class.forName(attributeMetadata.getType()));
+			
+			int length = Array.getLength(propertyValues);
+			if (length != 0)
+			{
+				Object propertyValue = Array.get(propertyValues, 0);
+				
+				assertEquals(
+						"Comparison failed for property "+name,
+						_managementServer.getAttribute(_resourceObjectName,name),
+						propertyValue);
+			} else {
+				assertNull(
+						String.format(
+								"\"%s\" property value shouldn't be null. Its value is %s",
+								name,
+								_managementServer.getAttribute(_resourceObjectName,name)),
+								_managementServer.getAttribute(_resourceObjectName,name));
+			}
+		}
+	}
+	
+	/**
+	 * Test the WS-RP SetResourceProperty interface of the WS-DM adapter.
+	 * 
+	 * <br>precondition : a WS-Resource exists and is registered. 
+	 * <br>postcondition : property values are correctly updated on the target WS-Resource..
+	 */
+	public void testSetResourcePropertiesOK() throws Exception
+	{
+		Map<String, Object> sampleMap = new HashMap<String, Object>();
+		sampleMap.put("Key1", "BLABALABLABALBAL");
+		sampleMap.put("Key2", 182838484l);
+		sampleMap.put("Key3", -928376362);
+		sampleMap.put("Key4", 23762736276.33D);
+		sampleMap.put("Key4", 2327363.2F);
+		
+		Map<String, Object> sampleValues = new HashMap<String, Object>();
+		sampleValues.put(String.class.getName(),"SAMPLE_STRING");
+		sampleValues.put(UUID.class.getName(),UUID.randomUUID());
+		sampleValues.put(Boolean.class.getName(),Boolean.FALSE);
+		sampleValues.put(Map.class.getName(),sampleMap);
+		sampleValues.put(Long.class.getName(),283781273L);
+		sampleValues.put(Integer.class.getName(),12727);
+		sampleValues.put(Short.class.getName(),new Short((short)22));
+		sampleValues.put(Date.class.getName(),new Date());
+		
+		MBeanAttributeInfo [] attributesMetadata = _mbeanInfo.getAttributes();
+		boolean atLeastThereIsOneWritableProperty = false;
+		
+		for (MBeanAttributeInfo attributeMetadata : attributesMetadata)
+		{
+			String name = attributeMetadata.getName();
+			
+			if (attributeMetadata.isWritable())
+			{	
+				atLeastThereIsOneWritableProperty = true;
+				Object sampleValue = sampleValues.get(attributeMetadata.getType());
+				Object []values = new Object[]{sampleValue};
+				
+				Object result = _managementServer.getAttribute(_resourceObjectName, name);
+				if (result == null)
+				{
+					_resourceClient.insertResourceProperty(	
+							new QName(
+									Names.NAMESPACE_URI,
+									name,
+									Names.PREFIX),
+							values);
+				} else 
+				{
+					_resourceClient.updateResourceProperty(	
+							new QName(
+									Names.NAMESPACE_URI,
+									name,
+									Names.PREFIX),
+							values);					
+				}
+				
+				Object propertyValues = _resourceClient.getPropertyAsObject(
+						new QName(
+								Names.NAMESPACE_URI,
+								name,
+								Names.PREFIX),
+						Class.forName(attributeMetadata.getType()));
+				int length = Array.getLength(propertyValues);
+				if (length != 0)
+				{
+					Object propertyValue = Array.get(propertyValues, 0);
+					
+					assertEquals(
+							"Comparison failed for property "+name,
+							sampleValue,
+							propertyValue);
+				} else {
+					assertNull(
+							String.format(
+									"\"%s\" property value shouldn't be null. Its value is %s",
+									name,
+									_managementServer.getAttribute(_resourceObjectName,name)),
+									sampleValue);
+				}				
+			}
+		}
+		assertTrue(
+				"It's not possibile to run successfully this test case if " +
+					"the target WS-Resource has no at least one writable property",
+				atLeastThereIsOneWritableProperty);
+	}
+
+	/**
+	 * Test the WS-RP SetResourceProperty interface of the WS-DM adapter when the 
+	 * target property is null.
+	 * According to WS-RP specs this operation is not allowed because in this case a SetResourceProperty with an "Insert"
+	 * message should be sent in order to initialize the property.
+	 * 
+	 * <br>precondition : a ws resource exists and is registered. The value of the target property is null. 
+	 * <br>postcondition : a Soap fault is received indicating the failuire.
+	 */
+	public void testSetResourcePropertiesKO() throws Exception
+	{
+		Object typePropertyValue = _managementServer.getAttribute(_resourceObjectName, "Type");
+		assertNull(typePropertyValue);
+		
+		try 
+		{		
+			_resourceClient.updateResourceProperty(
+					new QName(
+							Names.NAMESPACE_URI,
+							"Type",
+							Names.PREFIX),
+					new Object[]{"sampleValue"});					
+			fail(
+					"If the property is null on the target ws resource, according " +
+					"to WS-RP specs, an update of its value is not possible.");
+		} catch(SoapFault expected)
+		{
+			
+		}
+	}
+	
+//	public void testGetAndPutResourcePropertyDocumentOK() throws Exception
+//	{	
+//		Element properties = _resourceClient.getResourcePropertyDocument();
+//		
+//		Element mgmtPubInterval = XmlUtils.getElement(properties, new QName(Names.NAMESPACE_URI,"MgmtPubInterval",Names.PREFIX));
+//		mgmtPubInterval.setTextContent(String.valueOf(Long.MAX_VALUE));
+//		
+//		Element durable = XmlUtils.getElement(properties, new QName(Names.NAMESPACE_URI,"Durable",Names.PREFIX));
+//		durable.setTextContent(String.valueOf(Boolean.FALSE));
+//		
+//		Element consumerCount = XmlUtils.getElement(properties, new QName(Names.NAMESPACE_URI,"ConsumerCount",Names.PREFIX));
+//		consumerCount.setTextContent(String.valueOf(13));		
+//		
+//		fail("PutResourcePropertyDocument not yet implemented!");
+////		_resourceClient.putResourcePropertyDocument(properties);
+////		
+////		Element newProperties = _resourceClient.getResourcePropertyDocument();
+////		
+////		assertEquals(properties,newProperties);
+//	}
+	
+	/**
+	 * Test the WS-RP GetResourceProperties interface of the WS-DM adapter.
+	 * 
+	 * <br>precondition : a ws resource exists and is registered. 
+	 * <br>postcondition : Properties are correctly returned according to WSRP interface and they (their value)
+	 * 								are matching with corresponding MBean properties.
+	 */
+	public void testGetMultipleResourcePropertiesOK() throws Exception
+	{
+		MBeanAttributeInfo [] attributesMetadata = _mbeanInfo.getAttributes();
+		QName[] names = new QName[attributesMetadata.length];
+		
+		int index = 0;
+		for (MBeanAttributeInfo attributeMetadata : _mbeanInfo.getAttributes())
+		{
+			QName qname = new QName(Names.NAMESPACE_URI,attributeMetadata.getName(),Names.PREFIX);
+			names[index++] = qname;
+		}
+		
+		Element[] properties =_resourceClient.getMultipleResourceProperties(names);
+		for (Element element : properties)
+		{
+			String name = element.getLocalName();
+			Object value = _managementServer.getAttribute(_resourceObjectName, name);
+			if ("Name".equals(name))
+			{
+				assertEquals(
+						value,
+						element.getTextContent());
+			} else if ("Durable".equals(name))
+			{
+				assertEquals(
+						value,
+						Boolean.valueOf(element.getTextContent()));				
+			} else if ("ExpireTime".equals(name))
+			{
+				assertEquals(
+						value,
+						new Date(Long.valueOf(element.getTextContent())));								
+			} else if ("MsgTotalEnqueues".equals(name))
+			{
+				assertEquals(
+						value,
+						Long.valueOf(element.getTextContent()));								
+			} else if ("ConsumerCount".equals(name))
+			{
+				assertEquals(
+						value,
+						Integer.valueOf(element.getTextContent()));								
+			}else if ("VhostRef".equals(name))
+			{
+				assertEquals(
+						value,
+						UUID.fromString(element.getTextContent()));								
+			}
+		}
+	}
+	
+	/**
+	 * Test operation invocation on WS-Resource.
+	 * This method tests the exchange of simple types between requestor and service provider.
+	 * With simple types we mean :
+	 * 
+	 * <ul>
+	 * 	<li>java.lang.Long / long (xsd:long)
+	 * 	<li>java.lang.Integer / int (xsd:int / xsd:integer)
+	 * 	<li>java.lang.Double/ double (xsd:double)
+	 * 	<li>java.lang.Float / float (xsd:float)
+	 * 	<li>java.lang.Short / short (xsd:short)
+	 * 	<li>java.lang.Boolean / boolean (xsd:boolean)
+	 * 	<li>java.lang.String (xsd:string)
+	 * 	<li>java.net.URI (xsd:anyURI)
+	 * 	<li>java.util.Date(xsd:dateTime)
+	 * </ul>
+	 * 
+	 * <br>precondition : a ws resource exists and is registered and the requested operation is available on that. 
+	 * <br>postcondition : invocations are executed successfully, no exception is thrown and parameters are correctly returned.
+	 */
+	@SuppressWarnings("unchecked")
+	public void testOperationInvocationOK_withSimpleTypes() throws Exception
+	{
+		Long expectedLongResult = new Long(1373);
+		Boolean expectedBooleanResult = Boolean.TRUE;
+		Double expectedDoubleResult = new Double(12763.44);
+		Float expectedFloatResult = new Float(2727.233f);
+		Integer expectedIntegerResult = new Integer(28292);
+		Short expectedShortResult = new Short((short)227);
+		String expectedStringResult = "expectedStringResult";
+		URI expectedUriResult = URI.create("http://qpid.apache.org/");
+		Date expectedDateResult = new Date();
+		
+		Object result = _resourceClient.invoke(
+				_invocationHandlers.get("echoWithSimpleTypes"), 
+				new Object[]{
+					expectedLongResult,
+					expectedBooleanResult,
+					expectedDoubleResult,
+					expectedFloatResult,
+					expectedIntegerResult,
+					expectedShortResult,
+					expectedStringResult,
+					expectedUriResult,
+					expectedDateResult});
+
+		Method getStatusCode = result.getClass().getMethod("getStatusCode");
+		Method getOutputParameters = result.getClass().getMethod("getOutputParameters");
+		assertEquals(retCodeOk,getStatusCode.invoke(result));
+		Map<String,Object> out = (Map<String, Object>) getOutputParameters.invoke(result);
+		
+		assertEquals("Output parameters must be 9.",9,out.size());
+		assertTrue("Long output parameter not found on result object.",out.containsValue(expectedLongResult));
+		assertTrue("Boolean output parameter not found on result object.",out.containsValue(expectedBooleanResult));
+		assertTrue("Double output parameter not found on result object.",out.containsValue(expectedDoubleResult));
+		assertTrue("Float output parameter not found on result object.",out.containsValue(expectedFloatResult));
+		assertTrue("Integer output parameter not found on result object.",out.containsValue(expectedIntegerResult));
+		assertTrue("Short output parameter not found on result object.",out.containsValue(expectedShortResult));
+		assertTrue("String output parameter not found on result object.",out.containsValue(expectedStringResult));
+		assertTrue("URI output parameter not found on result object.",out.containsValue(expectedUriResult));
+		assertTrue("Date output parameter not found on result object.",out.containsValue(expectedDateResult));		
+	}
+	
+	/**
+	 * Test operation invocation on WS-Resource.
+	 * This method tests the exchange of arrays between requestor and service provider.
+	 * For this test exchanged arrays contain :
+	 * 
+	 * <ul>
+	 * 	<li>java.lang.Long  (xsd:long)
+	 * 	<li>java.lang.Integer (xsd:int / xsd:integer)
+	 * 	<li>java.lang.Double (xsd:double)
+	 * 	<li>java.lang.Float (xsd:float)
+	 * 	<li>java.lang.Short (xsd:short)
+	 * 	<li>java.lang.Boolean (xsd:boolean)
+	 * 	<li>java.lang.String (xsd:string)
+	 * 	<li>java.net.URI (xsd:anyURI)
+	 * 	<li>java.util.Date(xsd:dateTime)
+	 * </ul>
+	 * 
+	 * <br>precondition : a ws resource exists and is registered and the requested operation is available on that. 
+	 * <br>postcondition : invocations are executed successfully, no exception is thrown and parameters are correctly returned.
+	 */
+	@SuppressWarnings("unchecked")
+	public void testOperationInvocationOK_withWrapperArrays() throws Exception
+	{
+		Long [] expectedLongResult = {new Long(2),new Long(1),new Long(3),new Long(4)};
+		Boolean [] expectedBooleanResult = { Boolean.TRUE,Boolean.FALSE,Boolean.FALSE};
+		Double [] expectedDoubleResult = {12763.44d,2832.33d,2292.33d,22293.22d};
+		Float [] expectedFloatResult = {2727.233f,1f,2f,4f,5.4f,33.2f};
+		Integer [] expectedIntegerResult = {1,2,3,4,55,66,77,88,99};
+		Short [] expectedShortResult = {(short)227,(short)23,(short)9};
+		String [] expectedStringResult = {"s1","s2","s333","s4"};
+		URI [] expectedUriResult = {
+				URI.create("http://qpid.apache.org/"),
+				URI.create("http://www.apache.org"),
+				URI.create("http://projects.apache.org")};
+		
+		Date [] expectedDateResult = {
+				new Date(), 
+				new Date(38211897),
+				new Date(903820382)};
+		
+		Object result = _resourceClient.invoke(
+				_invocationHandlers.get("echoWithArrays"), 
+				new Object[]{
+					expectedLongResult,
+					expectedBooleanResult,
+					expectedDoubleResult,
+					expectedFloatResult,
+					expectedIntegerResult,
+					expectedShortResult,
+					expectedStringResult,
+					expectedUriResult,
+					expectedDateResult});
+
+		Method getStatusCode = result.getClass().getMethod("getStatusCode");
+		Method getOutputParameters = result.getClass().getMethod("getOutputParameters");
+		assertEquals(retCodeOk,getStatusCode.invoke(result));
+		Map<String,Object> out = (Map<String, Object>) getOutputParameters.invoke(result);
+		
+		assertEquals("Output parameters must be 9.",9,out.size());
+		assertTrue("Long array doesn't match.",Arrays.equals(expectedLongResult, (Long[])out.get(Long.class.getName())));
+		assertTrue("Boolean array doesn't match.",Arrays.equals(expectedBooleanResult, (Boolean[])out.get(Boolean.class.getName())));
+		assertTrue("Double array doesn't match.",Arrays.equals(expectedDoubleResult, (Double[])out.get(Double.class.getName())));
+		assertTrue("Float array doesn't match.",Arrays.equals(expectedFloatResult, (Float[])out.get(Float.class.getName())));
+		assertTrue("Integer array doesn't match.", Arrays.equals(expectedIntegerResult, (Integer[])out.get(Integer.class.getName())));
+		assertTrue("Short array doesn't match.",Arrays.equals(expectedShortResult, (Short[])out.get(Short.class.getName())));
+		assertTrue("String array doesn't match.",Arrays.equals(expectedStringResult, (String[])out.get(String.class.getName())));
+		assertTrue("URI array doesn't match.",Arrays.equals(expectedUriResult, (URI[])out.get(URI.class.getName())));
+		assertTrue("Date array doesn't match.",Arrays.equals(expectedDateResult, (Date[])out.get(Date.class.getName())));
+	}	
+
+	/**
+	 * Test operation invocation on WS-Resource.
+	 * This method tests the exchange of primitive type arrays between requestor and service provider.
+	 * NOte that even the sent array contain primtiive type QMan deals only with objects so in the result 
+	 * object you will find the corresponding wrapper types.
+	 * 
+	 * For this test exchanged arrays contain :
+	 * 
+	 * <ul>
+	 * 	<li>java.lang.Long / long (xsd:long)
+	 * 	<li>java.lang.Integer / int (xsd:int / xsd:integer)
+	 * 	<li>java.lang.Double/ double (xsd:double)
+	 * 	<li>java.lang.Float / float (xsd:float)
+	 * 	<li>java.lang.Short / short (xsd:short)
+	 * 	<li>java.lang.Boolean / boolean (xsd:boolean)
+	 * </ul>
+	 * 
+	 * <br>precondition : a ws resource exists and is registered and the requested operation is available on that. 
+	 * <br>postcondition : invocations are executed successfully, no exception is thrown and parameters are correctly returned.
+	 */
+	@SuppressWarnings("unchecked")
+	public void testOperationInvocationOK_withPrimitiveArrays() throws Exception
+	{
+		long [] expectedLongResult = {1L,2L,3L,4L};
+		boolean [] expectedBooleanResult = { true,false,false};
+		double [] expectedDoubleResult = {12763.44d,2832.33d,2292.33d,22293.22d};
+		float [] expectedFloatResult = {2727.233f,1f,2f,4f,5.4f,33.2f};
+		int [] expectedIntegerResult = {1,2,3,4,55,66,77,88,99};
+		short [] expectedShortResult = {(short)227,(short)23,(short)9};
+		
+		Object result = _resourceClient.invoke(
+				_invocationHandlers.get("echoWithSimpleTypeArrays"), 
+				new Object[]{
+					expectedLongResult,
+					expectedBooleanResult,
+					expectedDoubleResult,
+					expectedFloatResult,
+					expectedIntegerResult,
+					expectedShortResult});
+
+		Method getStatusCode = result.getClass().getMethod("getStatusCode");
+		Method getOutputParameters = result.getClass().getMethod("getOutputParameters");
+		assertEquals(retCodeOk,getStatusCode.invoke(result));
+		Map<String,Object> out = (Map<String, Object>) getOutputParameters.invoke(result);
+		
+		assertEquals("Output parameters must be 6.",6,out.size());
+		assertArrayEquals(expectedLongResult, out.get(long.class.getName()));
+		assertArrayEquals(expectedBooleanResult, out.get(boolean.class.getName()));
+		assertArrayEquals(expectedDoubleResult, out.get(double.class.getName()));
+		assertArrayEquals(expectedFloatResult, out.get(float.class.getName()));
+		assertArrayEquals(expectedIntegerResult, out.get(int.class.getName()));
+		assertArrayEquals(expectedShortResult, out.get(short.class.getName()));
+	}	
+
+	/**
+	 * Test operation invocation on WS-Resource.
+	 * This method tests the exchange of a byte type array between requestor and service provider.
+	 * 
+	 * <br>precondition : a WS-Resource exists and is registered and the requested operation is available on that. 
+	 * <br>postcondition : invocations are executed successfully, no exception is thrown and byte array are correctly returned.
+	 */
+	@SuppressWarnings("unchecked")
+	public void testOperationInvocationOK_withByteArray() throws Exception
+	{
+		byte [] expectedByteResult = {1,3,4,2,2,44,22,3,3,55,66};
+
+		Object result = _resourceClient.invoke(
+				_invocationHandlers.get("echoWithByteArray"), 
+				new Object[]{expectedByteResult});
+
+		Method getStatusCode = result.getClass().getMethod("getStatusCode");
+		Method getOutputParameters = result.getClass().getMethod("getOutputParameters");
+		
+		assertEquals(retCodeOk,getStatusCode.invoke(result));
+		Map<String,Object> out = (Map<String, Object>) getOutputParameters.invoke(result);
+		
+		assertEquals("Output parameters must be 1.",1,out.size());
+		assertArrayEquals(expectedByteResult, out.get(byte[].class.getName()));
+	}		
+		
+	/**
+	 * Test a simple operation invocation on a WS-Resource.
+	 * This method tests a simple operation without any input and output parameters.
+	 * 
+	 * <br>precondition : a ws resource exists and is registered and the requested operation is available on that. 
+	 * <br>postcondition : invocations are executed successfully an no exception is thrown.
+	 */
+	@SuppressWarnings("unchecked")
+	public void testSimpleOperationInvocationOK() throws Exception
+	{
+		Object result = _resourceClient.invoke(
+				_invocationHandlers.get("voidWithoutArguments"), 
+				null);
+
+		Method getStatusCode = result.getClass().getMethod("getStatusCode");
+		assertEquals(
+				"Something was wrong...expected return code is "+retCodeOk,
+				retCodeOk,
+				getStatusCode.invoke(result));
+	}
+
+	/**
+	 * Test a the invocation on a WS-Resource with a method that throws an exception..
+	 * 
+	 * <br>precondition : a ws resource exists and is registered and the requested operation is available on that. 
+	 * <br>postcondition : an exception is thrown by the requested method.
+	 */
+	@SuppressWarnings("unchecked")
+	public void testInvocationException_OK() throws Exception
+	{
+		try 
+		{
+		 	_resourceClient.invoke(
+					_invocationHandlers.get("throwsException"), 
+					null);
+		 	fail("The requested operation has thrown an exception so a Soap Fault is expected...");
+		} catch(SoapFault expected)
+		{
+		}
+	}	
+	
+	/**
+	 * Test operation invocation on WS-Resource.
+	 * This method tests the exchange of UUID type between requestor and service provider.
+	 * 
+	 * <br>precondition : a WS-Resource exists and is registered and the requested operation is available on that. 
+	 * <br>postcondition : invocations are executed successfully, no exception is thrown and parameters are correctly returned.
+	 */
+	@SuppressWarnings("unchecked")
+	public void testOperationInvocationOK_withUUID() throws Exception
+	{
+		UUID expectedUuid = UUID.randomUUID();
+
+		Object result = _resourceClient.invoke(
+				_invocationHandlers.get("echoWithUUID"), 
+				new Object[]{expectedUuid});
+
+		Method getStatusCode = result.getClass().getMethod("getStatusCode");
+		Method getOutputParameters = result.getClass().getMethod("getOutputParameters");
+		
+		assertEquals(retCodeOk,getStatusCode.invoke(result));
+		Map<String,Object> out = (Map<String, Object>) getOutputParameters.invoke(result);
+		
+		assertEquals("Output parameters must be 1.",1,out.size());
+		assertEquals(expectedUuid, out.get("uuid"));
+	}		
+
+	/**
+	 * Test operation invocation on WS-Resource.
+	 * This method tests the exchange of Map type between requestor and service provider.
+	 * For this test exchanged arrays contain :
+	 * 
+	 * <br>precondition : a ws resource exists and is registered and the requested operation is available on that. 
+	 * <br>postcondition : invocations are executed successfully, no exception is thrown and parameters are correctly returned.
+	 */
+	@SuppressWarnings("unchecked")
+	public void testOperationInvocationOK_withMap() throws Exception
+	{
+		Map<String,Object> expectedMap = new HashMap<String, Object>();
+		expectedMap.put("p1", new Long(1));
+		expectedMap.put("p2", Boolean.TRUE);
+		expectedMap.put("p3", 1234d);
+		expectedMap.put("p4", 11.2f);
+		expectedMap.put("p5", 1272);
+		expectedMap.put("p6", (short)12);
+		expectedMap.put("p7", "aString");
+		expectedMap.put("p8", "http://qpid.apache.org");
+		expectedMap.put("p9", new Date(12383137128L));
+		expectedMap.put("p10", new byte[]{1,2,2,3,3,4});
+		
+		Object result = _resourceClient.invoke(
+				_invocationHandlers.get("echoWithMap"), 
+				new Object[]{expectedMap});
+
+		Method getStatusCode = result.getClass().getMethod("getStatusCode");
+		Method getOutputParameters = result.getClass().getMethod("getOutputParameters");
+		
+		assertEquals(retCodeOk,getStatusCode.invoke(result));
+		Map<String,Object> out = (Map<String, Object>) ((Map<String, Object>) getOutputParameters.invoke(result)).get("map");
+		
+		assertEquals("Output parameters must be 10.",10,out.size());
+			assertEquals(expectedMap.get("p1"),out.get("p1"));
+			assertEquals(expectedMap.get("p2"),out.get("p2"));
+			assertEquals(expectedMap.get("p3"),out.get("p3"));
+			assertEquals(expectedMap.get("p4"),out.get("p4"));
+			assertEquals(expectedMap.get("p5"),out.get("p5"));
+			assertEquals(expectedMap.get("p6"),out.get("p6"));
+			assertEquals(expectedMap.get("p7"),out.get("p7"));
+			assertEquals(expectedMap.get("p8"),out.get("p8"));
+			assertEquals(expectedMap.get("p9"),out.get("p9"));
+			assertTrue( Arrays.equals((byte[])expectedMap.get("p10"),(byte[])out.get("p10")));
+	}			
+	
+	/**
+	 * Main entry point for running this test case.
+	 * 
+	 * @return the decorated test case.
+	 */
+	public static Test suite() {
+		TestSuite suite = new TestSuite("Test Suite for WS-DM Adapter");
+		suite.addTestSuite(WsDmAdapterTest.class);
+		return new WsDmAdapterTestSetup(suite);
+	}
+	
+	/**
+	 * Creates a service group client reference.
+	 * 
+	 * @return a service group client reference.
+	 */
+	private ServiceGroupClient getServiceGroupClient()
+	{
+		URI address = URI.create(
+				"http://"+
+				TestConstants.DEFAULT_HOST+
+				":"+
+				TestConstants.DEFAULT_PORT+
+				"/qman/services/adapter");
+		return new ServiceGroupClient(new EndpointReference(address));
+	}
+	
+	/**
+	 * In order to test the behaviour of the WS-DM adapter, at 
+	 * least one resource must be created. This is the method that 
+	 * returns the name (ObjectName on JMX side, Resource-ID on WSDM side)
+	 * of that resource
+	 * 
+	 * @return the name of the MBean instance that will be created.
+	 * @throws Exception when the name if malformed. Practically never.
+	 */
+	private ObjectName createResourceName() throws Exception
+	{
+		return new ObjectName(
+				"Q-MAN:objectId="+UUID.randomUUID()+
+				", brokerID="+UUID.randomUUID()+
+				",class=queue"+
+				",package=org.apache.qpid"+
+				",name="+System.currentTimeMillis());
+	}
+	
+	private Map<String,ProxyHandler> createInvocationHandlers() 
+	{
+		Map<String, ProxyHandler> handlers = new HashMap<String, ProxyHandler>();
+		
+		ProxyHandler handler = new ReflectionProxyHandler();
+        handler.setAction(Names.NAMESPACE_URI+"/"+"voidWithoutArguments");
+        handler.setRequestName(
+        		new QName(
+        				Names.NAMESPACE_URI, 
+        				"voidWithoutArgumentsRequest", 
+        				Names.PREFIX));
+        handler.setRequestParameterNames(new QName[]{});       
+        handler.setResponseName(
+        		new QName(
+        				Names.NAMESPACE_URI, 
+        				"voidWithoutArgumentsResponse",  
+        				Names.PREFIX));
+        handler.setReturnType(Result.class); 
+        
+        ProxyHandler exceptionHandler = new ReflectionProxyHandler();
+        exceptionHandler.setAction(Names.NAMESPACE_URI+"/"+"throwsException");
+        exceptionHandler.setRequestName(
+        		new QName(
+        				Names.NAMESPACE_URI, 
+        				"throwsExceptionRequest", 
+        				Names.PREFIX));
+        
+        exceptionHandler.setRequestParameterNames(new QName[]{});        
+        exceptionHandler.setResponseName(
+        		new QName(
+        				Names.NAMESPACE_URI, 
+        				"throwsExceptionResponse",  
+        				Names.PREFIX));
+        
+        exceptionHandler.setReturnType(Result.class); 
+        
+        ProxyHandler echoWithWrapperTypesHandler = new ReflectionProxyHandler();
+        echoWithWrapperTypesHandler.setAction(Names.NAMESPACE_URI+"/"+"echoWithSimpleTypes");
+        echoWithWrapperTypesHandler.setRequestName(
+        		new QName(
+        				Names.NAMESPACE_URI, 
+        				"echoWithSimpleTypesRequest", 
+        				Names.PREFIX));
+        
+        echoWithWrapperTypesHandler.setRequestParameterNames(new QName[]{
+        		new QName(Names.NAMESPACE_URI,"p1",Names.PREFIX),
+        		new QName(Names.NAMESPACE_URI,"p2",Names.PREFIX),
+        		new QName(Names.NAMESPACE_URI,"p3",Names.PREFIX),
+        		new QName(Names.NAMESPACE_URI,"p4",Names.PREFIX),
+        		new QName(Names.NAMESPACE_URI,"p5",Names.PREFIX),
+        		new QName(Names.NAMESPACE_URI,"p6",Names.PREFIX),
+        		new QName(Names.NAMESPACE_URI,"p7",Names.PREFIX),
+        		new QName(Names.NAMESPACE_URI,"p8",Names.PREFIX),
+        		new QName(Names.NAMESPACE_URI,"p9",Names.PREFIX),
+        });        
+        
+        echoWithWrapperTypesHandler.setResponseName(
+        		new QName(
+        				Names.NAMESPACE_URI, 
+        				"echoWithSimpleTypesResponse", 
+        				Names.PREFIX));
+        
+        echoWithWrapperTypesHandler.setReturnType(Result.class);
+        
+        ProxyHandler echoWithArrayOfWrapperTypes = new ReflectionProxyHandler();
+        echoWithArrayOfWrapperTypes.setAction(Names.NAMESPACE_URI+"/"+"echoWithArrays");
+        echoWithArrayOfWrapperTypes.setRequestName(
+        		new QName(
+        				Names.NAMESPACE_URI, 
+        				"echoWithArraysRequest",  
+        				Names.PREFIX));
+        
+        echoWithArrayOfWrapperTypes.setRequestParameterNames(new QName[]{
+        		new QName(Names.NAMESPACE_URI,"p1",Names.PREFIX),
+        		new QName(Names.NAMESPACE_URI,"p2",Names.PREFIX),
+        		new QName(Names.NAMESPACE_URI,"p3",Names.PREFIX),
+        		new QName(Names.NAMESPACE_URI,"p4",Names.PREFIX),
+        		new QName(Names.NAMESPACE_URI,"p5",Names.PREFIX),
+        		new QName(Names.NAMESPACE_URI,"p6",Names.PREFIX),
+        		new QName(Names.NAMESPACE_URI,"p7",Names.PREFIX),
+        		new QName(Names.NAMESPACE_URI,"p8",Names.PREFIX),
+        		new QName(Names.NAMESPACE_URI,"p9",Names.PREFIX),
+        });        
+        
+        echoWithArrayOfWrapperTypes.setResponseName(
+        		new QName(
+        				Names.NAMESPACE_URI, 
+        				"echoWithArraysResponse", 
+        				Names.PREFIX));
+        
+        echoWithArrayOfWrapperTypes.setReturnType(Result.class);
+        
+        ProxyHandler echoWithArrayOfPrimitiveTypes = new ReflectionProxyHandler();
+        echoWithArrayOfPrimitiveTypes.setAction(Names.NAMESPACE_URI+"/"+"echoWithSimpleTypeArrays");
+        echoWithArrayOfPrimitiveTypes.setRequestName(
+        		new QName(
+        				Names.NAMESPACE_URI, 
+        				"echoWithSimpleTypeArraysRequest",  
+        				Names.PREFIX));
+        
+        echoWithArrayOfPrimitiveTypes.setRequestParameterNames(new QName[]{
+        		new QName(Names.NAMESPACE_URI,"p1",Names.PREFIX),
+        		new QName(Names.NAMESPACE_URI,"p2",Names.PREFIX),
+        		new QName(Names.NAMESPACE_URI,"p3",Names.PREFIX),
+        		new QName(Names.NAMESPACE_URI,"p4",Names.PREFIX),
+        		new QName(Names.NAMESPACE_URI,"p5",Names.PREFIX),
+        		new QName(Names.NAMESPACE_URI,"p6",Names.PREFIX)});        
+        
+        echoWithArrayOfPrimitiveTypes.setResponseName(
+        		new QName(
+        				Names.NAMESPACE_URI, 
+        				"echoWithSimpleTypeArraysResponse", 
+        				Names.PREFIX));
+        
+        echoWithArrayOfPrimitiveTypes.setReturnType(Result.class);
+        
+        ProxyHandler echoWithByteArray = new EnhancedReflectionProxyHandler();
+        echoWithByteArray.setAction(Names.NAMESPACE_URI+"/"+"echoWithByteArray");
+        echoWithByteArray.setRequestName(
+        		new QName(
+        				Names.NAMESPACE_URI, 
+        				"echoWithByteArrayRequest",  
+        				Names.PREFIX));
+        
+        echoWithByteArray.setRequestParameterNames(
+        		new QName[]{
+        				new QName(Names.NAMESPACE_URI,"p1",Names.PREFIX)});        
+        
+        echoWithByteArray.setResponseName(
+        		new QName(
+        				Names.NAMESPACE_URI, 
+        				"echoWithByteArrayResponse", 
+        				Names.PREFIX));
+        
+        echoWithByteArray.setReturnType(Result.class);
+        
+        ProxyHandler echoWithUUID = new EnhancedReflectionProxyHandler();
+        echoWithUUID.setAction(Names.NAMESPACE_URI+"/"+"echoWithUUID");
+        echoWithUUID.setRequestName(
+        		new QName(
+        				Names.NAMESPACE_URI, 
+        				"echoWithUUIDRequest",  
+        				Names.PREFIX));
+        
+        echoWithUUID.setRequestParameterNames(
+        		new QName[]{
+        				new QName(Names.NAMESPACE_URI,"p1",Names.PREFIX)});        
+        
+        echoWithUUID.setResponseName(
+        		new QName(
+        				Names.NAMESPACE_URI, 
+        				"echoWithUUIDResponse", 
+        				Names.PREFIX));
+        
+        echoWithUUID.setReturnType(Result.class);
+        
+        ProxyHandler echoWithMap = new EnhancedReflectionProxyHandler();
+        echoWithMap.setAction(Names.NAMESPACE_URI+"/"+"echoWithMap");
+        echoWithMap.setRequestName(
+        		new QName(
+        				Names.NAMESPACE_URI, 
+        				"echoWithMapRequest",  
+        				Names.PREFIX));
+        
+        echoWithMap.setRequestParameterNames(
+        		new QName[]{
+        				new QName(Names.NAMESPACE_URI,"p1",Names.PREFIX)});        
+        
+        echoWithMap.setResponseName(
+        		new QName(
+        				Names.NAMESPACE_URI, 
+        				"echoWithMapResponse", 
+        				Names.PREFIX));
+        
+        echoWithMap.setReturnType(Result.class);
+        
+        handlers.put("voidWithoutArguments",handler);
+        handlers.put("echoWithSimpleTypes",echoWithWrapperTypesHandler);
+        handlers.put("echoWithArrays",echoWithArrayOfWrapperTypes);
+        handlers.put("echoWithSimpleTypeArrays", echoWithArrayOfPrimitiveTypes);
+        handlers.put("echoWithByteArray", echoWithByteArray);
+        handlers.put("echoWithUUID", echoWithUUID);
+        handlers.put("echoWithMap", echoWithMap);
+        handlers.put("throwsException",exceptionHandler);
+        return handlers;
+	}
+	
+	/**
+	 * Internal method used for array comparison using reflection.
+	 * 
+	 * @param expectedArray the expected array.
+	 * @param resultArray the array that must match the expected one.
+	 */
+	private void assertArrayEquals(Object expectedArray, Object resultArray) 
+	{
+		int expectedArrayLength = Array.getLength(expectedArray);
+		int resultArrayLength = Array.getLength(resultArray);
+		
+		assertEquals(expectedArrayLength,resultArrayLength);
+		
+		for (int index = 0; index < expectedArrayLength; index++)
+		{
+			Object expected = Array.get(expectedArray, index);
+			Object result = Array.get(resultArray, index);
+			
+			assertEquals(expected,result);
+		}
+	}
+}
\ No newline at end of file



---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:commits-subscribe@qpid.apache.org