You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by sc...@apache.org on 2006/11/11 16:38:40 UTC

svn commit: r473734 - in /webservices/axis2/trunk/java/modules/jaxws: src/org/apache/axis2/jaxws/client/ src/org/apache/axis2/jaxws/i18n/ src/org/apache/axis2/jaxws/marshaller/ src/org/apache/axis2/jaxws/marshaller/impl/ src/org/apache/axis2/jaxws/mess...

Author: scheu
Date: Sat Nov 11 07:38:39 2006
New Revision: 473734

URL: http://svn.apache.org/viewvc?view=rev&rev=473734
Log:
AXIS2-1678
Contributor:Rich Scheuerle
Changes to JAX-WS Block subsystem and usage to ensure that the JAXB object in a block can always be rendered as an element.

Modified:
    webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/client/JAXBDispatch.java
    webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/client/JAXBDispatchAsyncListener.java
    webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/i18n/resource.properties
    webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/ClassUtils.java
    webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/impl/DocLitBareMethodMarshallerImpl.java
    webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/impl/DocLitWrappedMethodMarshallerImpl.java
    webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/impl/MethodMarshallerImpl.java
    webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/JAXBBlockContext.java
    webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/JAXBUtils.java
    webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/JAXBBlockFactoryImpl.java
    webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/JAXBBlockImpl.java
    webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/factory/JAXBBlockFactory.java
    webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/wrapper/JAXBWrapperTool.java
    webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/wrapper/impl/JAXBWrapperToolImpl.java
    webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/attachments/MTOMSerializationTests.java
    webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/jaxb/wrapper/WrapperToolTest.java
    webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/message/BlockTests.java
    webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/message/MessageRPCTests.java
    webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/message/MessageTests.java

Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/client/JAXBDispatch.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/client/JAXBDispatch.java?view=diff&rev=473734&r1=473733&r2=473734
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/client/JAXBDispatch.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/client/JAXBDispatch.java Sat Nov 11 07:38:39 2006
@@ -22,11 +22,11 @@
 import org.apache.axis2.jaxws.client.async.AsyncResponse;
 import org.apache.axis2.jaxws.handler.PortData;
 import org.apache.axis2.jaxws.impl.AsyncListener;
-import org.apache.axis2.jaxws.marshaller.ClassUtils;
 import org.apache.axis2.jaxws.message.Block;
 import org.apache.axis2.jaxws.message.Message;
 import org.apache.axis2.jaxws.message.Protocol;
 import org.apache.axis2.jaxws.message.databinding.JAXBBlockContext;
+import org.apache.axis2.jaxws.message.databinding.JAXBUtils;
 import org.apache.axis2.jaxws.message.factory.JAXBBlockFactory;
 import org.apache.axis2.jaxws.message.factory.MessageFactory;
 import org.apache.axis2.jaxws.registry.FactoryRegistry;
@@ -60,7 +60,12 @@
             JAXBBlockFactory factory = (JAXBBlockFactory) FactoryRegistry.getFactory(JAXBBlockFactory.class);
             
             Class clazz = value.getClass();
-            JAXBBlockContext context = new JAXBBlockContext(clazz, !ClassUtils.isXmlRootElementDefined(clazz), jaxbContext);
+            JAXBBlockContext context = null;
+            if (jaxbContext != null) {
+                context = new JAXBBlockContext(jaxbContext);
+            } else {
+                context = new JAXBBlockContext(clazz.getPackage());
+            }
             Block block = factory.createFrom(value, context, null);
             
             // The protocol of the Message that is created should be based
@@ -81,7 +86,7 @@
         Object value = null;
         try {
             JAXBBlockFactory factory = (JAXBBlockFactory) FactoryRegistry.getFactory(JAXBBlockFactory.class);
-            JAXBBlockContext context = new JAXBBlockContext(null, false, jaxbContext);
+            JAXBBlockContext context = new JAXBBlockContext(jaxbContext);
             Block block = message.getBodyBlock(0, context, factory);
             value = block.getBusinessObject(true);
         } catch (Exception e) {

Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/client/JAXBDispatchAsyncListener.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/client/JAXBDispatchAsyncListener.java?view=diff&rev=473734&r1=473733&r2=473734
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/client/JAXBDispatchAsyncListener.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/client/JAXBDispatchAsyncListener.java Sat Nov 11 07:38:39 2006
@@ -56,7 +56,7 @@
         Message message = mc.getMessage();
         try {
             JAXBBlockFactory factory = (JAXBBlockFactory) FactoryRegistry.getFactory(JAXBBlockFactory.class);
-            JAXBBlockContext context = new JAXBBlockContext(null, false, jaxbContext);
+            JAXBBlockContext context = new JAXBBlockContext(jaxbContext);
             Block block = message.getBodyBlock(0, context, factory);
             value = block.getBusinessObject(true);
         } catch (Exception e) {

Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/i18n/resource.properties
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/i18n/resource.properties?view=diff&rev=473734&r1=473733&r2=473734
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/i18n/resource.properties (original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/i18n/resource.properties Sat Nov 11 07:38:39 2006
@@ -120,6 +120,7 @@
 NoMaintainSessionProperty=Error: Maintain Session is enabled but none of the Session Properties (Cookies, Over-written URL) is returned.
 NullValueForMaintainSessionProperty=Error: The value of {0} Session property is NULL.
 JAXBBlockFactoryErr1=An internal assertion error occurred.  The context parameter of JAXBBlockFactory should be a JAXBBlockContext object, but a {0} object was found.
+JAXBBlockFactoryErr2=An internal assertion error occurred.  The business object parameter of JAXBBlockFactory should be a JAXBElement or an object with an @XmlRootElement annotation, but a {0} object was found.
 WebServiceContextInjectionImplErr1=Cannot inject Resource on a null Service Instance.
 WebServiceContextInjectionImplErr2=Injection on Private and Protected set methods not supported yet.
 WebServiceContextInjectionImplErr3=Cannot inject WebServiceContext on ServiceInstance Field, field cannot be NULL.

Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/ClassUtils.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/ClassUtils.java?view=diff&rev=473734&r1=473733&r2=473734
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/ClassUtils.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/ClassUtils.java Sat Nov 11 07:38:39 2006
@@ -32,10 +32,6 @@
 import java.util.List;
 
 import javax.management.openmbean.SimpleType;
-import javax.xml.bind.JAXBElement;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlSchema;
-import javax.xml.namespace.QName;
 
 
 import org.apache.axis2.jaxws.i18n.Messages;
@@ -74,70 +70,7 @@
         return e;
     }
 	
-	/**
-	 * @param clazz
-	 * @return namespace of root element qname or null if this is not object does not represent a root element
-	 */
-	public static QName getXmlRootElementQName(Object obj){
-        
-        // A JAXBElement stores its name
-        if (obj instanceof JAXBElement) {
-            return ((JAXBElement) obj).getName();
-        }
-        
-        Class clazz = obj.getClass();
-        
-		// If the clazz is a primitive, then it does not have a corresponding root element.
-		if (clazz.isPrimitive() ||
-		    getWrapperClass(clazz) != null) {
-			return null;
-		}
-		
-		// See if the object represents a root element
-		XmlRootElement root = (XmlRootElement) clazz.getAnnotation(XmlRootElement.class);
-        if (root == null) {
-            return null;
-        }
-        
-        String namespace = root.namespace();
-        String localPart = root.name();
-        
-        // The namespace may need to be defaulted
-        if (namespace == null || namespace.length() == 0 || namespace.equals("##default")) {
-            Package pkg = clazz.getPackage();
-            XmlSchema schema = (XmlSchema) pkg.getAnnotation(XmlSchema.class);
-            if (schema != null) {
-                namespace = schema.namespace();
-            } else {
-                return null;
-            }
-        }
-		return new QName(namespace, localPart);
-	}
-    
-    /**
-     * @param clazz
-     * @return true if this class has a corresponding xml root element
-     */
-    public static boolean isXmlRootElementDefined(Class clazz){
-        // If the clazz is a primitive, then it does not have a corresponding root element.
-        if (clazz.isPrimitive() ||
-            getWrapperClass(clazz) != null) {
-            return false;
-        }
-        // TODO We could also prune out other known classes that will not have root elements defined.
-        // java.util.Date, arrays, java.math.BigInteger.
-        
-        XmlRootElement root = (XmlRootElement) clazz.getAnnotation(XmlRootElement.class);
-        return root !=null;
-    }
-    
-    
-	
-	
-    
-    
-    private static HashMap loadClassMap = new HashMap();
+	private static HashMap loadClassMap = new HashMap();
     static {
         loadClassMap.put("byte", byte.class);
         loadClassMap.put("int", int.class);
@@ -298,13 +231,14 @@
     
     /**
 	 * This method will return all the Class names excluding the interfaces from a given package. 
-	 * @param pckgname
+	 * @param pkg Package
 	 * @return
 	 * @throws ClassNotFoundException
 	 */
-	public static List<Class> getAllClassesFromPackage(String pckgname) throws ClassNotFoundException {
+	public static List<Class> getAllClassesFromPackage(Package pkg) throws ClassNotFoundException {
 	        // This will hold a list of directories matching the pckgname. There may be more than one if a package is split over multiple jars/paths
-	        ArrayList<File> directories = new ArrayList<File>();
+	        String pckgname = pkg.getName();
+            ArrayList<File> directories = new ArrayList<File>();
 	        try {
 	            ClassLoader cld = Thread.currentThread().getContextClassLoader();
 	            if (cld == null) {

Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/impl/DocLitBareMethodMarshallerImpl.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/impl/DocLitBareMethodMarshallerImpl.java?view=diff&rev=473734&r1=473733&r2=473734
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/impl/DocLitBareMethodMarshallerImpl.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/impl/DocLitBareMethodMarshallerImpl.java Sat Nov 11 07:38:39 2006
@@ -19,9 +19,11 @@
 package org.apache.axis2.jaxws.marshaller.impl;
 
 import java.util.ArrayList;
+import java.util.Set;
 
 import javax.xml.bind.JAXBException;
 import javax.xml.stream.XMLStreamException;
+import javax.xml.ws.Holder;
 import javax.xml.ws.WebServiceException;
 
 import org.apache.axis2.jaxws.ExceptionFactory;
@@ -90,7 +92,7 @@
 			}
 			else if(holdermps.size() == 0 && !returnType.getName().equals("void")){
 				// No holders but a return type example --> public ReturnType someMethod()
-				Object bo = createBusinessObject(returnType, message);
+				Object bo = createBusinessObject(createContextPackageSet(returnType), message);
 				return bo;
 			}
 			else if(holdermps.size()>0 && returnType.getName().equals("void")){
@@ -104,7 +106,7 @@
 				// WSGen and WsImport Generate Holders with return type as one of the Holder JAXBObject 
 				// property, if wsdl schema forces a holder and a return type.
 				assignHolderValues(holdermps, holderArgs, message);
-				Object bo = createBusinessObject(returnType, message);
+				Object bo = createBusinessObject(createContextPackageSet(returnType), message);
 				return bo;
 			}
 
@@ -114,6 +116,47 @@
 			// Firewall.  Only WebServiceExceptions are thrown
 			throw ExceptionFactory.makeWebServiceException(e);
 		}
+        
+    }
+	private ArrayList<MethodParameter> createParameterForSEIMethod(Message message)throws IllegalAccessException, InstantiationException, ClassNotFoundException, MessageException, XMLStreamException, JAXBException{
+	    ArrayList<MethodParameter> mps = new ArrayList<MethodParameter>();
+	    if(message == null){
+	        return null;
+	    }
+	    ParameterDescription[] paramDescs = operationDesc.getParameterDescriptions();
+	    
+	    ArrayList<Object> paramValues = new ArrayList<Object>(); 
+	    for (int index = 0; index < paramDescs.length; index++) {
+	        ParameterDescription paramDesc = paramDescs[index];
+	        String paramName = paramDesc.getParameterName();
+	        String paramTNS = paramDesc.getTargetNamespace();
+	        boolean isHeader = paramDesc.isHeader();
+	        Class actualType = paramDesc.getParameterActualType();
+	        Object bo = null;
+            // Create a set of context packages that will be needed to demarshal
+            // the jaxb object.  For now just consider the actualType
+            Set<Package> contextPackages = createContextPackageSet(actualType);
+            
+            // Create the business object
+	        if(isHeader){
+	            bo = createBOFromHeaderBlock(contextPackages, message, paramTNS, paramName);
+	        }
+	        else{
+	            bo = createBOFromBodyBlock(contextPackages,message);
+	        }
+	        
+            // Now create an argument from the business object
+            Object arg = bo;
+	        if (paramDesc.isHolderType()) {
+                // If the parameter requires a holder, create a holder
+                // object containting the parameter
+	            arg = createHolder(paramDesc.getParameterType(), bo);
+	        } 
+	        paramValues.add(arg);
+	    }
+	    mps = createParameters(paramDescs, paramValues);
+	    
+	    return mps;
 	}
 
 	/* (non-Javadoc)

Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/impl/DocLitWrappedMethodMarshallerImpl.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/impl/DocLitWrappedMethodMarshallerImpl.java?view=diff&rev=473734&r1=473733&r2=473734
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/impl/DocLitWrappedMethodMarshallerImpl.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/impl/DocLitWrappedMethodMarshallerImpl.java Sat Nov 11 07:38:39 2006
@@ -20,7 +20,9 @@
 
 import java.util.ArrayList;
 
+import javax.xml.bind.JAXBElement;
 import javax.xml.bind.JAXBException;
+import javax.xml.namespace.QName;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.ws.WebServiceException;
 
@@ -32,9 +34,14 @@
 import org.apache.axis2.jaxws.description.ServiceDescription;
 import org.apache.axis2.jaxws.marshaller.DocLitWrappedMethodMarshaller;
 import org.apache.axis2.jaxws.marshaller.MethodParameter;
+import org.apache.axis2.jaxws.message.Block;
 import org.apache.axis2.jaxws.message.Message;
 import org.apache.axis2.jaxws.message.MessageException;
 import org.apache.axis2.jaxws.message.Protocol;
+import org.apache.axis2.jaxws.message.databinding.JAXBBlockContext;
+import org.apache.axis2.jaxws.message.databinding.JAXBUtils;
+import org.apache.axis2.jaxws.message.factory.MessageFactory;
+import org.apache.axis2.jaxws.registry.FactoryRegistry;
 import org.apache.axis2.jaxws.wrapper.JAXBWrapperTool;
 import org.apache.axis2.jaxws.wrapper.impl.JAXBWrapperToolImpl;
 import org.apache.commons.logging.Log;
@@ -78,7 +85,7 @@
     		}
     		
             String resultName = operationDesc.getResultName();
-    		businessObject = createBusinessObject(wrapperClazz, message);
+    		businessObject = createBusinessObject(createContextPackageSet(wrapperClazz), message);
             assignHolderValues(businessObject, inputArgs, false);
             
             // REVIEW: Is the the appropriate logic, to be checking for the existence of the annotation
@@ -110,7 +117,7 @@
 			ArrayList<MethodParameter> mps;
 
 			Class requestWrapperClazz = loadClass(className);
-			Object jaxbObject = createBusinessObject(requestWrapperClazz, message);
+			Object jaxbObject = createBusinessObject(createContextPackageSet(requestWrapperClazz), message);
 
 			if (log.isDebugEnabled()) {
 				log.debug("reading input method parameters");
@@ -150,7 +157,7 @@
 			// Get the necessary information from the OperationDesc
 			Class wrapperClazz = null;
 			String wrapperClazzName = operationDesc.getResponseWrapperClassName();
-			String wrapperXMLElementName = operationDesc.getResponseWrapperLocalName();
+			String wrapperLocalName = operationDesc.getResponseWrapperLocalName();
 			String wrapperTNS = operationDesc.getResponseWrapperTargetNamespace();
 			String webResult = operationDesc.getResultName();
 
@@ -196,8 +203,15 @@
 			}
 
 			JAXBWrapperTool wrapperTool = new JAXBWrapperToolImpl();
-			Object wrapper = wrapperTool.wrap(wrapperClazz, wrapperClazzName, mps);
-			Message message = createMessage(wrapper, wrapperClazz, wrapperXMLElementName, wrapperTNS);
+			Object wrapper = wrapperTool.wrap(wrapperClazz, mps);
+			
+            // If the wrapper class does not represent an root element, then make
+            // the appropriate JAXBElement
+            if (!JAXBUtils.isXmlRootElementDefined(wrapperClazz)) {
+                QName qName = new QName(wrapperTNS, wrapperLocalName);
+                wrapper = new JAXBElement(qName, wrapperClazz, wrapper);
+            }
+			Message message = createMessage(wrapper);
 
 
 			return message;
@@ -215,7 +229,7 @@
 	public Message marshalRequest(Object[] objects) throws WebServiceException {
 		try {
 			String className = operationDesc.getRequestWrapperClassName();
-			String localName = operationDesc.getRequestWrapperLocalName();
+			String wrapperLocalName = operationDesc.getRequestWrapperLocalName();
 			String wrapperTNS = operationDesc.getRequestWrapperTargetNamespace();
 
 			Class wrapperClazz = null;
@@ -231,12 +245,18 @@
 				log.debug("JAXBWrapperTool attempting to wrap propertes in WrapperClass :" + wrapperClazz);
 			}
 
-			jaxbObject = wrapTool.wrap(wrapperClazz, localName, methodParameters);
+			jaxbObject = wrapTool.wrap(wrapperClazz, methodParameters);
 			if (log.isDebugEnabled()) {
 				log.debug("JAXBWrapperTool wrapped following propertes :");
 			}
 
-			Message message = createMessage(jaxbObject, wrapperClazz, localName, wrapperTNS);
+            // If the wrapper class does not represent an root element, then make
+            // the appropriate JAXBElement
+            if (!JAXBUtils.isXmlRootElementDefined(wrapperClazz)) {
+                QName qName = new QName(wrapperTNS, wrapperLocalName);
+                jaxbObject = new JAXBElement(qName, wrapperClazz, jaxbObject);
+            }
+			Message message = createMessage(jaxbObject);
 
 
 			return message;
@@ -256,4 +276,32 @@
         Class c = Class.forName(className, true, Thread.currentThread().getContextClassLoader());
 		return c;
 	}
+    
+    /**
+     * @param jaxbElement object representing the element to marshal (JAXBElement or object has @XmlRootElement)
+     * @return
+     * @throws JAXBException
+     * @throws MessageException
+     * @throws XMLStreamException
+     */
+    private Message createMessage(Object jaxbElement)throws JAXBException, MessageException, XMLStreamException{
+            Block bodyBlock = null;
+            
+            // Get the object that is the type
+            Object jaxbType = (jaxbElement instanceof JAXBElement) ? ((JAXBElement) jaxbElement).getValue() : jaxbElement; 
+     
+            // Create the context
+            JAXBBlockContext ctx = new JAXBBlockContext(createContextPackageSet(jaxbType.getClass()));
+            bodyBlock = createJAXBBlock(jaxbElement, ctx);
+            
+            if (log.isDebugEnabled()) {
+                log.debug("JAXBBlock Created");
+            }
+            
+            MessageFactory mf = (MessageFactory)FactoryRegistry.getFactory(MessageFactory.class);
+            
+            Message m = mf.create(protocol);
+            m.setBodyBlock(0,bodyBlock);
+            return m;
+        }
 }

Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/impl/MethodMarshallerImpl.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/impl/MethodMarshallerImpl.java?view=diff&rev=473734&r1=473733&r2=473734
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/impl/MethodMarshallerImpl.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/marshaller/impl/MethodMarshallerImpl.java Sat Nov 11 07:38:39 2006
@@ -25,6 +25,8 @@
 import java.lang.reflect.Type;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
 import java.util.concurrent.Future;
 
 import javax.jws.WebParam.Mode;
@@ -133,10 +135,10 @@
 			} else {
 				// Create a JAXBContext object that can handle any of the 
 				// checked exceptions defined on this operation
-				Class[] classes = new Class[operationDesc.getFaultDescriptions().length];
+                HashSet<Package> contextPackages = new HashSet<Package>();
 				for(int i=0; i<operationDesc.getFaultDescriptions().length; i++) {
 					FaultDescription fd = operationDesc.getFaultDescriptions()[i];
-					classes[i] = loadClass(fd.getFaultBean());
+					contextPackages.add(loadClass(fd.getFaultBean()).getPackage());
 				}
 				
 				// TODO what if there are multiple blocks in the detail ?
@@ -145,13 +147,13 @@
 				
 				// Now demarshal the block to get a business object (faultbean)
                 // Capture the qname of the element, which will be used to find the JAX-WS Exception
-				Object obj = createFaultBusinessObject(classes, block);
+				Object obj = createFaultBusinessObject(contextPackages, block);
                 QName faultQName = null;
                 if (obj instanceof JAXBElement) {
                     faultQName = ((JAXBElement)obj).getName();
                     obj = ((JAXBElement)obj).getValue();
                 } else {
-                    faultQName = ClassUtils.getXmlRootElementQName(obj);
+                    faultQName = JAXBUtils.getXmlRootElementQName(obj);
                 }
                 
 				// Find the JAX-WS exception using a qname match
@@ -202,14 +204,14 @@
 				// Service Exception.  Create an XMLFault with the fault bean
             	Method getFaultInfo = t.getClass().getMethod("getFaultInfo", null);
             	Object faultBean = getFaultInfo.invoke(t, null);
-            	JAXBBlockContext context = createJAXBBlockContext(faultBean.getClass());
+            	JAXBBlockContext context = createJAXBBlockContext(createContextPackageSet(faultBean.getClass()));
             	Block[] detailBlocks = new Block[1];
                 
                 // Make sure to createJAXBBlock with an object that is 
                 // a JAXBElement or has the XMLRootElement annotation
                 // The actual faultBean object's class is used (because
                 // the actual object may be a derived type of the formal declaration)
-            	if (!ClassUtils.isXmlRootElementDefined(faultBean.getClass())) {
+            	if (!JAXBUtils.isXmlRootElementDefined(faultBean.getClass())) {
                     QName faultQName = new QName(fd.getTargetNamespace(), fd.getName());
                     faultBean = new JAXBElement(faultQName, faultBean.getClass(), faultBean);
                 }
@@ -399,40 +401,7 @@
         
 	}
 	
-	protected ArrayList<MethodParameter> createParameterForSEIMethod(Message message)throws IllegalAccessException, InstantiationException, ClassNotFoundException, MessageException, XMLStreamException, JAXBException{
-		ArrayList<MethodParameter> mps = new ArrayList<MethodParameter>();
- 		if(message == null){
- 			return null;
- 		}
-		ParameterDescription[] paramDescs = operationDesc.getParameterDescriptions();
-		
-		ArrayList<Object> paramValues = new ArrayList<Object>(); 
-		for (int index = 0; index < paramDescs.length; index++) {
-			ParameterDescription paramDesc = paramDescs[index];
-			String paramName = paramDesc.getParameterName();
-			String paramTNS = paramDesc.getTargetNamespace();
-			boolean isHeader = paramDesc.isHeader();
-			Class actualType = paramDesc.getParameterActualType();
-			Object bo = null;
-			if(isHeader){
-				bo = createBOFromHeaderBlock(actualType, message, paramTNS, paramName);
-			}
-			else{
-				bo = createBOFromBodyBlock(actualType,message);
-			}
-			
-			if (bo != null && !isHolder(bo)
-					&& paramDesc.isHolderType()) {
-				Holder<Object> holder = createHolder(paramDesc.getParameterType(),
-						bo);
-				bo = holder;
-			}
-			paramValues.add(bo);
-		}
-		mps = createParameters(paramDescs, paramValues);
-		
-		return mps;
-	}
+	
 	/*
 	 * Extract Holder parameter from supplied parameters and add annotation data for these parameters.
 	 */
@@ -543,7 +512,8 @@
 					
 		return mps;
 	}
-	private ArrayList<MethodParameter> createParameters(
+    
+	protected ArrayList<MethodParameter> createParameters(
 			ParameterDescription[] paramDescs, ArrayList<Object> paramValues){
 		ArrayList<MethodParameter> mps = new ArrayList<MethodParameter>();
 		int index = 0;
@@ -835,11 +805,11 @@
 		        }
 				throw ExceptionFactory.makeWebServiceException(Messages.getMessage("DocLitProxyHandlerErr2"));
 			}
-			JAXBBlockContext ctx = createJAXBBlockContext(objectType);
+			JAXBBlockContext ctx = createJAXBBlockContext(createContextPackageSet(objectType));
 			if (log.isDebugEnabled()) {
 	            log.debug("Attempting to create Block");
 	        }
-			if(ClassUtils.isXmlRootElementDefined(objectType)){
+			if(JAXBUtils.isXmlRootElementDefined(objectType)){
 				block = createJAXBBlock(object, ctx);
 			}
 			else{
@@ -865,29 +835,6 @@
 		return m;
 	}
 	
-	protected Message createMessage(Object jaxbObject, Class jaxbClazz, String jaxbClassName, String targetNamespace)throws JAXBException, MessageException, XMLStreamException{
-		Block bodyBlock = null;
-		JAXBBlockContext ctx = createJAXBBlockContext(jaxbClazz);
-		if (log.isDebugEnabled()) {
-            log.debug("Attempting to create Block");
-        }
-		if(ClassUtils.isXmlRootElementDefined(jaxbClazz)){
-			bodyBlock = createJAXBBlock(jaxbObject, ctx);
-		}
-		else{
-			bodyBlock =  createJAXBBlock(jaxbClassName, jaxbObject, ctx, targetNamespace);
-		}
-		if (log.isDebugEnabled()) {
-            log.debug("JAXBBlock Created");
-        }
-		
-		MessageFactory mf = (MessageFactory)FactoryRegistry.getFactory(MessageFactory.class);
-		
-		Message m = mf.create(protocol);
-		m.setBodyBlock(0,bodyBlock);
-		return m;
-	}
-	
 	protected Message createFaultMessage(OMElement element) throws XMLStreamException, MessageException {
 		MessageFactory mf = (MessageFactory)FactoryRegistry.getFactory(MessageFactory.class);
 		return mf.createFrom(element);
@@ -901,9 +848,9 @@
 		return m;
 	}
 	
-	protected Object createBOFromHeaderBlock(Class jaxbClazz, Message message, String targetNamespace, String localPart) throws JAXBException, MessageException, XMLStreamException{
+	protected Object createBOFromHeaderBlock(Set<Package> contextPackages, Message message, String targetNamespace, String localPart) throws JAXBException, MessageException, XMLStreamException{
 		
-		JAXBBlockContext blockContext = createJAXBBlockContext(jaxbClazz);
+		JAXBBlockContext blockContext = createJAXBBlockContext(contextPackages);
 		
 		// Get a JAXBBlockFactory instance.  We'll need this to get the JAXBBlock
         // out of the Message
@@ -912,13 +859,13 @@
         return block.getBusinessObject(true);
 	}
 	
-	protected Object createBOFromBodyBlock(Class jaxbClazz, Message message) throws JAXBException, MessageException, XMLStreamException{
-		return createBusinessObject(jaxbClazz, message);
+	protected Object createBOFromBodyBlock(Set<Package> contextPackages, Message message) throws JAXBException, MessageException, XMLStreamException{
+		return createBusinessObject(contextPackages, message);
 	}
 
 	
-	protected Object createBusinessObject(Class jaxbClazz, Message message) throws JAXBException, MessageException, XMLStreamException{
-		JAXBBlockContext blockContext = createJAXBBlockContext(jaxbClazz);
+	protected Object createBusinessObject(Set<Package> contextPackages, Message message) throws JAXBException, MessageException, XMLStreamException{
+		JAXBBlockContext blockContext = createJAXBBlockContext(contextPackages);
 		
 		// Get a JAXBBlockFactory instance.  We'll need this to get the JAXBBlock
         // out of the Message
@@ -928,26 +875,22 @@
         return block.getBusinessObject(true);
 	}
 	
-	private JAXBBlockContext createJAXBBlockContext(Class jaxbClazz) throws JAXBException, MessageException {
-		// Primitives, simpleTypes and classes without a root element must be represented as a JAXBElement
-		boolean useJAXBElement = !ClassUtils.isXmlRootElementDefined(jaxbClazz);
-			
-		JAXBBlockContext blockContext = new JAXBBlockContext(jaxbClazz, useJAXBElement);
-		
+	private JAXBBlockContext createJAXBBlockContext(Set<Package> contextPackages) throws JAXBException, MessageException {
+		JAXBBlockContext blockContext = new JAXBBlockContext(contextPackages);
 		return blockContext;
 	}
 
 	/**
-	 * @param possibleClasses
+	 * @param contextPackages
 	 * @param block
 	 * @return
 	 * @throws JAXBException
 	 * @throws MessageException
 	 * @throws XMLStreamException
 	 */
-	protected Object createFaultBusinessObject(Class[] possibleClasses, Block block)
+	protected Object createFaultBusinessObject(Set<Package> contextPackages, Block block)
 			throws JAXBException, MessageException, XMLStreamException {
-		JAXBBlockContext blockContext = new JAXBBlockContext(possibleClasses, false);		
+		JAXBBlockContext blockContext = new JAXBBlockContext(contextPackages);		
 		// Get a JAXBBlockFactory instance. 
         JAXBBlockFactory factory = (JAXBBlockFactory)FactoryRegistry.getFactory(JAXBBlockFactory.class);
         
@@ -961,12 +904,12 @@
 		for(MethodParameter mp:mps){
 			ParameterDescription pd = mp.getParameterDescription();
 			if (pd.isHeader() && pd.isHolderType()) {
-				bo = createBOFromHeaderBlock(pd.getParameterActualType(),
+				bo = createBOFromHeaderBlock(createContextPackageSet(pd.getParameterActualType()),
 						message, pd.getTargetNamespace(), pd
 								.getParameterName());
 			}
 			else if(!pd.isHeader() && pd.isHolderType()){
-				bo = createBOFromBodyBlock(pd.getParameterActualType(), message);
+				bo = createBOFromBodyBlock(createContextPackageSet(pd.getParameterActualType()), message);
 			}
 			try{
 				Holder inputArgHolder = (Holder)inputArgHolders.get(index);
@@ -976,9 +919,30 @@
 				ExceptionFactory.makeWebServiceException(e);
 			}
 		}
-		
-	
 	}
+    
+    /**
+     * Simple utility to create package set from a single class
+     * @param cls
+     * @return
+     */
+    protected Set<Package> createContextPackageSet(Class cls) {
+        HashSet<Package> set = new HashSet<Package>();
+        set.add(cls.getPackage());
+        return set;
+    }
+    /**
+     * Simple utility to create package set from two classes
+     * @param cls1
+     * @param cls2
+     * @return
+     */
+    protected Set<Package> createContextPackageSet(Class cls1, Class cls2) {
+        HashSet<Package> set = new HashSet<Package>();
+        set.add(cls1.getPackage());
+        set.add(cls2.getPackage());
+        return set;
+    }
 	
     protected void assignHolderValues(Object bo, Object[] inputArgs, boolean isBare)throws JAXBWrapperException, InstantiationException, ClassNotFoundException, IllegalAccessException{
 		if(inputArgs == null){

Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/JAXBBlockContext.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/JAXBBlockContext.java?view=diff&rev=473734&r1=473733&r2=473734
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/JAXBBlockContext.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/JAXBBlockContext.java Sat Nov 11 07:38:39 2006
@@ -16,92 +16,66 @@
  */
 package org.apache.axis2.jaxws.message.databinding;
 
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.JAXBException;
 
 /*
- * A JAXBBlockContext controls access to the JAXB Context/Marshal/Unmarshal code.
+ * A JAXBBlockContext controls access to the JAXB Context
  * In addition the JAXBBlockContext contains additional contextural information needed
- * by the JAX-WS component (i.e. the possible type(s) of the object)
+ * by the JAX-WS component
  * 
  * This class is immutable after construction.
  */
 public class JAXBBlockContext {
 
-	private Class[] types = null;
+	private Set<Package> contextPackages;  // List of packages needed by the context
 	private JAXBContext jaxbContext = null;
-	private boolean useJAXBElement = false;
 	
 	/**
 	 * Normal Constructor JAXBBlockContext
-	 * @param type Class object that represents the actual type of the object.
-	 * @param useJAXBElement boolean indicating whether the object should be rendered
-	 * as a JAXBElement.
-	 * 
-	 * Example: if the object is a primitive (type=int.class) then 
-	 * useJAXBElement must be set to true because int is not a JAXB object.
-	 * 
-	 * Example: if the object is a JAXB object you would normally set useJAXBElement
-	 * to false.  However if the JAXB object does not have a corresponding root element,
-	 * then useJAXBElement hould be set to false.
+	 * @param packages Set of packages needed by the JAXBContext.
 	 */
-	public JAXBBlockContext(Class type, boolean useJAXBElement) {
-		this(type, useJAXBElement, null);
+	public JAXBBlockContext(Set<Package> packages) {
+        this.contextPackages = packages;
 	}
+    
+    /**
+     * Normal Constructor JAXBBlockContext
+     * @param contextPackage
+     */
+    public JAXBBlockContext(Package contextPackage) {
+        this.contextPackages = new HashSet();
+        this.contextPackages.add(contextPackage);
+    }
 
 	/**
 	 * "Dispatch" Constructor
 	 * Use this full constructor when the JAXBContent is provided by
 	 * the customer.  
-	 * @param type
-	 * @param useJAXBElement
 	 * @param jaxbContext
 	 */
-	public JAXBBlockContext(Class type, boolean useJAXBElement, JAXBContext jaxbContext) {
-		this.types = new Class[] {type};
-		this.useJAXBElement = useJAXBElement;
-		this.jaxbContext = jaxbContext;
-	}
-	
-	/**
-	 * Constructor JAXBBlockContext
-	 * @param types Class[] object that represents the actual type of the object.
-	 * @param useJAXBElement boolean indicating whether the object should be rendered
-	 * as a JAXBElement.
-	 * 
-	 * This constructor is used when the demarshalling exceptions.
-	 */
-	public JAXBBlockContext(Class[] types, boolean useJAXBElement) {
-		this.types = types;
-		this.useJAXBElement = useJAXBElement;
+	public JAXBBlockContext(JAXBContext jaxbContext) {
 		this.jaxbContext = jaxbContext;
 	}
 
 	/**
 	 * @return Class representing type of the element
 	 */
-	public Class[] getTypes() {
-		return types;
+	public Set<Package> getContextPackages() {
+		return contextPackages;
 	}
-
-	/**
-	 * @return indicate if object should be rendered as JAXBElement
-	 */
-	public boolean isUseJAXBElement() {
-		return useJAXBElement;
-	}
-
+    
 	/**
 	 * @return get the JAXBContext
 	 * @throws JAXBException
 	 */
 	public JAXBContext getJAXBContext() throws JAXBException {
 		if (jaxbContext == null) {	
-			if (!useJAXBElement) {
-				jaxbContext = JAXBUtils.getJAXBContext(types);
-			} else {
-				jaxbContext = JAXBUtils.getJAXBContext(types);
-			}
+			jaxbContext = JAXBUtils.getJAXBContext(contextPackages);
 		}
 		return jaxbContext;
 	}

Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/JAXBUtils.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/JAXBUtils.java?view=diff&rev=473734&r1=473733&r2=473734
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/JAXBUtils.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/JAXBUtils.java Sat Nov 11 07:38:39 2006
@@ -18,15 +18,21 @@
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.WeakHashMap;
 
 import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBElement;
 import javax.xml.bind.JAXBException;
 import javax.xml.bind.JAXBIntrospector;
 import javax.xml.bind.Marshaller;
 import javax.xml.bind.Unmarshaller;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlSchema;
+import javax.xml.namespace.QName;
 
 import org.apache.axis2.jaxws.marshaller.ClassUtils;
 import org.apache.axis2.jaxws.message.databinding.impl.JAXBBlockImpl;
@@ -42,9 +48,9 @@
 	
     private static final Log log = LogFactory.getLog(JAXBUtils.class);
     
-	// Create a synchronized weak hashmap key=class name, value= JAXBContext
-	private static Map<String, JAXBContext> map =
-			Collections.synchronizedMap(new WeakHashMap<String, JAXBContext>());
+	// Create a synchronized weak hashmap key=set contextPackages, value= JAXBContext
+	private static Map<Set<Package>, JAXBContext> map =
+			Collections.synchronizedMap(new WeakHashMap<Set<Package>, JAXBContext>());
 	private static JAXBContext genericJAXBContext = null;
 	
 	private static Map<JAXBContext,Unmarshaller> umap = 
@@ -81,48 +87,37 @@
 	
 	/**
 	 * Get a JAXBContext for the class
-	 * @param cls Class
+	 * @param contextPackage Set<Package>
 	 * @return JAXBContext
 	 * @throws JAXBException
 	 */
-	public static JAXBContext getJAXBContext(Class[] classes) throws JAXBException {
+	public static JAXBContext getJAXBContext(Set<Package> contextPackages) throws JAXBException {
 		// JAXBContexts for the same class can be reused and are supposed to be thread-safe
-		// TODO Can we cache by package name ?
-		Class cls = classes[0];
-        if (cls.isPrimitive()) {
+        if (contextPackages == null || contextPackages.isEmpty()) {
             return getGenericJAXBContext();
         }
-		JAXBContext context = map.get(cls.getName());
+		JAXBContext context = map.get(contextPackages);
 		if (context == null) {
             synchronized(map) {
                 try{
-                	// TODO
-                	// For now we are generating a list of all of the classes in each
-                	// of the referenced packages.  We have plans to use a contextPath instead
-                	List<Class> fullList = new ArrayList<Class>();
-                	for (int i=0; i<classes.length; i++) {
-                		Package pkg = classes[i].getPackage();
-                		if (log.isDebugEnabled()) {
-                			log.debug("Package for " + classes[i].getName() + " "+pkg.getName());
-                		}
-                		if (log.isDebugEnabled()) {
-                			log.debug("Attempting to read all classes from package " + pkg.getName());
-                		}
-                		fullList.addAll(ClassUtils.getAllClassesFromPackage(pkg.getName()));
+                    Iterator<Package> it = contextPackages.iterator();
+                    List<Class> fullList = new ArrayList<Class>();
+                    while (it.hasNext()) {
+                		fullList.addAll(ClassUtils.getAllClassesFromPackage(it.next()));
                 	}
                 	Class[] classArray = fullList.toArray(new Class[0]);
                 	context = JAXBContext.newInstance(classArray);
-                    map.put(cls.getName(), context);	
+                    map.put(contextPackages, context);	
                 }catch(ClassNotFoundException e){
                 	throw new JAXBException(e);
                 }
                 if (log.isDebugEnabled()) {
-                    log.debug("JAXBContext [created] for" + cls.getName());
+                    log.debug("JAXBContext [created] for" + contextPackages.toString());
                 }
             }
 		} else {
             if (log.isDebugEnabled()) {
-                log.debug("JAXBContext [from pool] for" + cls.getName());
+                log.debug("JAXBContext [from pool] for" + contextPackages.toString());
             }
         }
 		return context;
@@ -255,4 +250,62 @@
         }
         imap.put(context, introspector);
 	}
+
+    /**
+     * @param clazz
+     * @return namespace of root element qname or null if this is not object does not represent a root element
+     */
+    public static QName getXmlRootElementQName(Object obj){
+        
+        // A JAXBElement stores its name
+        if (obj instanceof JAXBElement) {
+            return ((JAXBElement) obj).getName();
+        }
+        
+        Class clazz = obj.getClass();
+        
+    	// If the clazz is a primitive, then it does not have a corresponding root element.
+    	if (clazz.isPrimitive() ||
+    	    ClassUtils.getWrapperClass(clazz) != null) {
+    		return null;
+    	}
+    	
+    	// See if the object represents a root element
+    	XmlRootElement root = (XmlRootElement) clazz.getAnnotation(XmlRootElement.class);
+        if (root == null) {
+            return null;
+        }
+        
+        String namespace = root.namespace();
+        String localPart = root.name();
+        
+        // The namespace may need to be defaulted
+        if (namespace == null || namespace.length() == 0 || namespace.equals("##default")) {
+            Package pkg = clazz.getPackage();
+            XmlSchema schema = (XmlSchema) pkg.getAnnotation(XmlSchema.class);
+            if (schema != null) {
+                namespace = schema.namespace();
+            } else {
+                return null;
+            }
+        }
+    	return new QName(namespace, localPart);
+    }
+
+    /**
+     * @param clazz
+     * @return true if this class has a corresponding xml root element
+     */
+    public static boolean isXmlRootElementDefined(Class clazz){
+        // If the clazz is a primitive, then it does not have a corresponding root element.
+        if (clazz.isPrimitive() ||
+            ClassUtils.getWrapperClass(clazz) != null) {
+            return false;
+        }
+        // TODO We could also prune out other known classes that will not have root elements defined.
+        // java.util.Date, arrays, java.math.BigInteger.
+        
+        XmlRootElement root = (XmlRootElement) clazz.getAnnotation(XmlRootElement.class);
+        return root !=null;
+    }
 }

Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/JAXBBlockFactoryImpl.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/JAXBBlockFactoryImpl.java?view=diff&rev=473734&r1=473733&r2=473734
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/JAXBBlockFactoryImpl.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/JAXBBlockFactoryImpl.java Sat Nov 11 07:38:39 2006
@@ -27,6 +27,7 @@
 import org.apache.axis2.jaxws.message.Block;
 import org.apache.axis2.jaxws.message.MessageException;
 import org.apache.axis2.jaxws.message.databinding.JAXBBlockContext;
+import org.apache.axis2.jaxws.message.databinding.JAXBUtils;
 import org.apache.axis2.jaxws.message.factory.JAXBBlockFactory;
 import org.apache.axis2.jaxws.message.impl.BlockFactoryImpl;
 
@@ -64,7 +65,7 @@
 	 */
 	public Block createFrom(Object businessObject, Object context, QName qName) throws MessageException {
 		
-		// The context for a JAXBFactory must be non-null and should be a JAXBBlockContext.
+		// The context must be non-null and should be a JAXBBlockContext.
 		// For legacy reasons, a JAXBContext is also supported (and wrapped into a JAXBBlockContext)
 		if (context == null) {
 			throw ExceptionFactory.makeMessageException(Messages.getMessage("JAXBBlockFactoryErr1", "null"), null);
@@ -73,6 +74,18 @@
 		} else {
 			throw ExceptionFactory.makeMessageException(Messages.getMessage("JAXBBlockFactoryErr1", context.getClass().getName()), null);
 		}
+        
+        // The business object must be either a JAXBElement or a block with an @XmlRootElement qname.  The best way
+        // to verify this is to get the QName from the business object.
+        QName bQName = JAXBUtils.getXmlRootElementQName(businessObject);
+        if (bQName == null) {
+            throw ExceptionFactory.makeMessageException(Messages.getMessage("JAXBBlockFactoryErr2", businessObject.getClass().getName()), null);
+        }
+        
+        // If the business obect qname does not match the parameter, use the business object qname
+        if (!bQName.equals(qName)) {
+            qName = bQName;
+        }
 		try {
 			return new JAXBBlockImpl(businessObject, (JAXBBlockContext) context, qName, this);
 		} catch (JAXBException e) {

Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/JAXBBlockImpl.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/JAXBBlockImpl.java?view=diff&rev=473734&r1=473733&r2=473734
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/JAXBBlockImpl.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/impl/JAXBBlockImpl.java Sat Nov 11 07:38:39 2006
@@ -50,7 +50,7 @@
 /**
  * JAXBBlockImpl
  * 
- * A Block containing a JAXB business object
+ * A Block containing a JAXB business object (either a JAXBElement or an object with @XmlRootElement)
  */
 public class JAXBBlockImpl extends BlockImpl implements JAXBBlock {
 
@@ -58,7 +58,8 @@
     
 	/**
 	 * Called by JAXBBlockFactory
-	 * @param busObject
+	 * @param busObject..The business object must be a JAXBElement or an object
+     * with an @XMLRootElement.  This is assertion is validated in the JAXBFactory.
 	 * @param busContext
 	 * @param qName
 	 * @param factory
@@ -103,15 +104,15 @@
                 u.setAttachmentUnmarshaller(aum);
             }
             Object jaxb = null;
-            if (!ctx.isUseJAXBElement()){
-            	// Normal Unmarshalling
-            	jaxb = u.unmarshal(reader);
-				setQName(getQName(jaxb, ctx));
-			} else {
-				// Unmarshal as a JAXBElement and then get the value
-				JAXBElement jaxbElement = u.unmarshal(reader, ctx.getTypes()[0]); 
-				jaxb = jaxbElement.getValue();
-			}
+            
+            // Unmarshal into the business object.
+            jaxb = u.unmarshal(reader);
+            
+            // Set the qname 
+            QName qName = JAXBUtils.getXmlRootElementQName(jaxb);
+            if (qName != null) {  // qname should always be non-null
+                setQName(qName); 
+            }
             
             // Successfully unmarshalled the object
             // TODO remove attachment unmarshaller ?
@@ -176,7 +177,6 @@
             }   
             
             m.marshal(busObject, writer);
-            
             
             // Successfully marshalled the data
             // TODO remove attachment marshaller ?

Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/factory/JAXBBlockFactory.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/factory/JAXBBlockFactory.java?view=diff&rev=473734&r1=473733&r2=473734
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/factory/JAXBBlockFactory.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/message/factory/JAXBBlockFactory.java Sat Nov 11 07:38:39 2006
@@ -20,7 +20,9 @@
 /**
  * JAXBBlockFactory
  * 
- * Creates a JAXBBlock
+ * Creates a JAXBBlock.  The business object of a JAXBBlock must
+ * be either a JAXBElement or a generated object with the XMLRootElement 
+ * annotation
  * 
  * * The FactoryRegistry should be used to get access to the Factory
  * @see org.apache.axis2.jaxws.registry.FactoryRegistry

Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/wrapper/JAXBWrapperTool.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/wrapper/JAXBWrapperTool.java?view=diff&rev=473734&r1=473733&r2=473734
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/wrapper/JAXBWrapperTool.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/wrapper/JAXBWrapperTool.java Sat Nov 11 07:38:39 2006
@@ -30,7 +30,7 @@
 	/**
      * unwrap
      * Returns the list of child elements of the jaxb object
-     * @param javab Object that is the wrapper element
+     * @param jaxbObject that is the wrapper element (JAXBElement or object with @XMLRootElement)
      * @param jaxbContext JAXBContext
      * @param childNames list of xml child names as String
      * @return list of Objects in the same order as the element names.
@@ -40,35 +40,28 @@
 
     /**
      * wrap
-     * Creates a jaxb object that is initialized with the child objects
-     * @param javabClass Class of the JAXB object to return
-     * @param jaxbContext JAXBContext
+     * Creates a jaxb object that is initialized with the child objects.
+     * 
+     * Note that the jaxbClass must be the class the represents the complexType. (It should never be JAXBElement)
+     * 
+     * @param jaxbClass 
      * @param childObjects, component objects
      * @param childNames list of xml child names as String
      * @return list of Objects in the same order as the element names.
      */ 
-    public Object wrap(Class jaxbClass, String jaxbClassName, ArrayList<String> childNames, Map<String, Object> childObjects) throws JAXBWrapperException;
+    public Object wrap(Class jaxbClass, ArrayList<String> childNames, Map<String, Object> childObjects) throws JAXBWrapperException;
     /**
      * wrap
      * Creates a jaxb object that is initialized with the child objects
+     * 
+     * * Note that the jaxbClass must be the class the represents the complexType. (It should never be JAXBElement)
+     * 
      * @param jaxbClass
-     * @param jaxbClassName
      * @param methodParameters
      * @return
      * @throws JAXBWrapperException
      */
-    public Object wrap(Class jaxbClass, String jaxbClassName, ArrayList<MethodParameter> methodParameters) throws JAXBWrapperException;
-    /**
-     * wrapAsJAXBElement
-     * Creates a JAXBElement that is initialized with the child objects and can be serialsed to xml later.
-     * @param javabClass Class of the JAXB object to return
-     * @param jaxbContext JAXBContext
-     * @param childObjects, component objects
-     * @param childNames list of xml child names as String
-     * @return JAXBElement;
-     */
-    public JAXBElement wrapAsJAXBElement(Class jaxbClass, String jaxbClassName,
-			ArrayList<String> childNames, Map<String, Object> childObjects) throws JAXBWrapperException;
-		
+    public Object wrap(Class jaxbClass, ArrayList<MethodParameter> methodParameters) throws JAXBWrapperException;
+    
 }
 

Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/wrapper/impl/JAXBWrapperToolImpl.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/wrapper/impl/JAXBWrapperToolImpl.java?view=diff&rev=473734&r1=473733&r2=473734
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/wrapper/impl/JAXBWrapperToolImpl.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/wrapper/impl/JAXBWrapperToolImpl.java Sat Nov 11 07:38:39 2006
@@ -56,11 +56,17 @@
 			if(childNames == null){
 				throw new JAXBWrapperException(Messages.getMessage("JAXBWrapperErr2"));
 			}
+            
+            // Get the object that will have the property descriptors (i.e. the object representing the complexType)
+            Object jaxbComplexTypeObj = (jaxbObject instanceof JAXBElement) ?
+                    ((JAXBElement)jaxbObject).getValue() : // Type object is the value of the JAXBElement
+                        jaxbObject;                        // Or JAXBObject represents both the element and anon complexType
+            
 			ArrayList<Object> objList = new ArrayList<Object>();
-			Map<String , PropertyInfo> pdTable = createPropertyDescriptors(jaxbObject.getClass(), childNames);
+			Map<String , PropertyInfo> pdTable = createPropertyDescriptors(jaxbComplexTypeObj.getClass(), childNames);
 			for(String childName:childNames){
 				PropertyInfo propInfo = pdTable.get(childName);
-				Object object = propInfo.get(jaxbObject);
+				Object object = propInfo.get(jaxbComplexTypeObj);
 				objList.add(object);
 			}
 			Object[] jaxbObjects = objList.toArray();
@@ -80,7 +86,7 @@
 	/* (non-Javadoc)
 	 * @see org.apache.axis2.jaxws.wrapped.JAXBWrapperTool#wrap(java.lang.Class, java.lang.String, java.util.ArrayList, java.util.ArrayList)
 	 */
-	public Object wrap(Class jaxbClass, String jaxbClassName,
+	public Object wrap(Class jaxbClass, 
 			ArrayList<String> childNames, Map<String, Object> childObjects)
 			throws JAXBWrapperException {
 		
@@ -111,7 +117,7 @@
 		}
 	}
 	
-	public Object wrap(Class jaxbClass, String jaxbClassName, ArrayList<MethodParameter> mps) throws JAXBWrapperException{
+	public Object wrap(Class jaxbClass, ArrayList<MethodParameter> mps) throws JAXBWrapperException{
 		if(mps == null){
 			throw new JAXBWrapperException(Messages.getMessage("JAXBWrapperErr7"));
 		}
@@ -130,15 +136,7 @@
 			nameList.add(name);
 			objectList.put(name, object);
 		}
-		return wrap(jaxbClass, jaxbClassName, nameList, objectList);
-	}
-	
-	public JAXBElement wrapAsJAXBElement(Class jaxbClass, String jaxbClassName,
-			ArrayList<String> childNames, Map<String, Object> childObjects) throws JAXBWrapperException{
-		
-		Object obj = wrap( jaxbClass, jaxbClassName, childNames, childObjects);
-		JAXBElement<Object> element = new JAXBElement<Object>(new QName(jaxbClassName), jaxbClass, obj);
-		return element;
+		return wrap(jaxbClass, nameList, objectList);
 	}
 	
 	/** creates propertyDescriptor for the childNames using the jaxbClass.  

Modified: webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/attachments/MTOMSerializationTests.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/attachments/MTOMSerializationTests.java?view=diff&rev=473734&r1=473733&r2=473734
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/attachments/MTOMSerializationTests.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/attachments/MTOMSerializationTests.java Sat Nov 11 07:38:39 2006
@@ -117,7 +117,7 @@
         imageDepot.setImageData(dataHandler);
         
         //JAXBContext jbc = JAXBContext.newInstance("org.test.mtom");
-        JAXBBlockContext context = new JAXBBlockContext(SendImage.class, false);
+        JAXBBlockContext context = new JAXBBlockContext(SendImage.class.getPackage());
         
         //Create a request bean with imagedepot bean as value
         ObjectFactory factory = new ObjectFactory();

Modified: webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/jaxb/wrapper/WrapperToolTest.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/jaxb/wrapper/WrapperToolTest.java?view=diff&rev=473734&r1=473733&r2=473734
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/jaxb/wrapper/WrapperToolTest.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/jaxb/wrapper/WrapperToolTest.java Sat Nov 11 07:38:39 2006
@@ -41,7 +41,7 @@
 			String symbolObj = new String("IBM");
 			Map<String, Object> childObjects= new WeakHashMap<String, Object>();
 			childObjects.put(childName, symbolObj);
-			Object jaxbObject = wrapper.wrap(jaxbClass, jaxbClassName,childNames, childObjects);
+			Object jaxbObject = wrapper.wrap(jaxbClass, childNames, childObjects);
 			org.test.stock2.GetPrice getPrice = (org.test.stock2.GetPrice)jaxbObject;
 			
 		}catch(JAXBWrapperException e){
@@ -92,7 +92,7 @@
 			childObjects.put(holding, topHolding);
 			childObjects.put(nav, navInMillion);
 			
-			Object jaxbObject = wrapper.wrap(jaxbClass, jaxbClassName,childNames, childObjects);
+			Object jaxbObject = wrapper.wrap(jaxbClass, childNames, childObjects);
 			org.test.stock1.GetPrice getPrice = (org.test.stock1.GetPrice)jaxbObject;
 			
 		}catch(JAXBWrapperException e){

Modified: webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/message/BlockTests.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/message/BlockTests.java?view=diff&rev=473734&r1=473733&r2=473734
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/message/BlockTests.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/message/BlockTests.java Sat Nov 11 07:38:39 2006
@@ -327,7 +327,7 @@
         ObjectFactory factory = new ObjectFactory();
         EchoString jaxb = factory.createEchoString(); 
         jaxb.setInput("Hello World");
-        JAXBBlockContext context = new JAXBBlockContext(EchoString.class, false);
+        JAXBBlockContext context = new JAXBBlockContext(EchoString.class.getPackage());
        
         JAXBIntrospector jbi = JAXBUtils.getJAXBIntrospector(context.getJAXBContext());
         QName expectedQName = jbi.getElementName(jaxb);
@@ -376,7 +376,7 @@
         ObjectFactory factory = new ObjectFactory();
         EchoString jaxb = factory.createEchoString(); 
         jaxb.setInput("Hello World");
-        JAXBBlockContext context = new JAXBBlockContext(EchoString.class, false);
+        JAXBBlockContext context = new JAXBBlockContext(EchoString.class.getPackage());
         
         JAXBIntrospector jbi = JAXBUtils.getJAXBIntrospector(context.getJAXBContext());
         QName expectedQName = jbi.getElementName(jaxb);
@@ -425,7 +425,7 @@
         ObjectFactory factory = new ObjectFactory();
         EchoString jaxb = factory.createEchoString(); 
         jaxb.setInput("Hello World");
-        JAXBBlockContext context = new JAXBBlockContext(EchoString.class, false);
+        JAXBBlockContext context = new JAXBBlockContext(EchoString.class.getPackage());
 		
 		// On inbound, there will already be a XMLStreamReader (probably from OM)
 		// which represents the message.  We will simulate this with inflow.
@@ -472,7 +472,7 @@
         ObjectFactory factory = new ObjectFactory();
         EchoString jaxb = factory.createEchoString(); 
         jaxb.setInput("Hello World");
-        JAXBBlockContext context = new JAXBBlockContext(EchoString.class, false);
+        JAXBBlockContext context = new JAXBBlockContext(EchoString.class.getPackage());
 
         JAXBIntrospector jbi = JAXBUtils.getJAXBIntrospector(context.getJAXBContext());
         QName expectedQName = jbi.getElementName(jaxb);
@@ -528,7 +528,7 @@
         ObjectFactory factory = new ObjectFactory();
         EchoString jaxb = factory.createEchoString(); 
         jaxb.setInput("Hello World");
-        JAXBBlockContext context = new JAXBBlockContext(EchoString.class, false);
+        JAXBBlockContext context = new JAXBBlockContext(EchoString.class.getPackage());
         
         JAXBIntrospector jbi = JAXBUtils.getJAXBIntrospector(context.getJAXBContext());
         QName expectedQName = jbi.getElementName(jaxb);

Modified: webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/message/MessageRPCTests.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/message/MessageRPCTests.java?view=diff&rev=473734&r1=473733&r2=473734
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/message/MessageRPCTests.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/message/MessageRPCTests.java Sat Nov 11 07:38:39 2006
@@ -111,7 +111,7 @@
             FactoryRegistry.getFactory(JAXBBlockFactory.class);
         
         // Create the JAXBContext
-        JAXBBlockContext context = new JAXBBlockContext(StockPrice.class, true);
+        JAXBBlockContext context = new JAXBBlockContext(StockPrice.class.getPackage());
         
         // Create the JAX-B object
         ObjectFactory of = new ObjectFactory();
@@ -186,7 +186,7 @@
             FactoryRegistry.getFactory(JAXBBlockFactory.class);
         
         // Create the JAXBContext
-        JAXBBlockContext context = new JAXBBlockContext(StockPrice.class, false);
+        JAXBBlockContext context = new JAXBBlockContext(StockPrice.class.getPackage());
         
         // Create the JAX-B object
         ObjectFactory of = new ObjectFactory();
@@ -282,7 +282,7 @@
         
         // Create the JAXBContext instance that will be used
         // to deserialize the JAX-B object content in the message.
-        JAXBBlockContext context = new JAXBBlockContext(StockPrice.class, true);
+        JAXBBlockContext context = new JAXBBlockContext(StockPrice.class.getPackage());
         
         // Get the JAXBBlock that wraps the content
         Block b = m.getBodyBlock(0, context, bf);

Modified: webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/message/MessageTests.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/message/MessageTests.java?view=diff&rev=473734&r1=473733&r2=473734
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/message/MessageTests.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/message/MessageTests.java Sat Nov 11 07:38:39 2006
@@ -507,7 +507,7 @@
         obj.setEchoStringReturn("sample return value");
         
         // Create the JAXBContext
-        JAXBBlockContext context = new JAXBBlockContext(EchoStringResponse.class, false);
+        JAXBBlockContext context = new JAXBBlockContext(EchoStringResponse.class.getPackage());
         
         // Create a JAXBBlock using the Echo object as the content.  This simulates
         // what occurs on the outbound JAX-WS Dispatch<Object> client
@@ -573,7 +573,7 @@
         obj.setEchoStringReturn("sample return value");
         
         // Create the JAXBContext
-        JAXBBlockContext context = new JAXBBlockContext(EchoStringResponse.class, false);
+        JAXBBlockContext context = new JAXBBlockContext(EchoStringResponse.class.getPackage());
        
         // Create a JAXBBlock using the Echo object as the content.  This simulates
         // what occurs on the outbound JAX-WS Dispatch<Object> client
@@ -655,7 +655,7 @@
         
         // Create the JAXBContext instance that will be used
         // to deserialize the JAX-B object content in the message.
-        JAXBBlockContext context = new JAXBBlockContext(EchoStringResponse.class, false);
+        JAXBBlockContext context = new JAXBBlockContext(EchoStringResponse.class.getPackage());
         
         // Get the JAXBBlock that wraps the content
         Block b = m.getBodyBlock(0, context, bf);



---------------------------------------------------------------------
To unsubscribe, e-mail: axis-cvs-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-cvs-help@ws.apache.org