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 ng...@apache.org on 2006/11/06 14:41:30 UTC

svn commit: r471731 - in /webservices/axis2/trunk/java/modules/jaxws/src: javax/xml/ws/ org/apache/axis2/jaxws/marshaller/impl/

Author: ngallardo
Date: Mon Nov  6 05:41:30 2006
New Revision: 471731

URL: http://svn.apache.org/viewvc?view=rev&rev=471731
Log:
AXIS2-1578
Contributor: Nikhil Thaker

Nikhil's updated patch for this issue.

Modified:
    webservices/axis2/trunk/java/modules/jaxws/src/javax/xml/ws/WebFault.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

Modified: webservices/axis2/trunk/java/modules/jaxws/src/javax/xml/ws/WebFault.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/javax/xml/ws/WebFault.java?view=diff&rev=471731&r1=471730&r2=471731
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/javax/xml/ws/WebFault.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/javax/xml/ws/WebFault.java Mon Nov  6 05:41:30 2006
@@ -25,9 +25,9 @@
 
 public @interface WebFault {
 
-    public String name();
+    public String name() default "";
 
-    public String targetNamespace();
+    public String targetNamespace() default "";
 
-    public String faultBean();
+    public String faultBean() default "";
 }

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=471731&r1=471730&r2=471731
==============================================================================
--- 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 Mon Nov  6 05:41:30 2006
@@ -61,17 +61,15 @@
 	public Object demarshalResponse(Message message, Object[] inputArgs) throws IllegalAccessException, InstantiationException, ClassNotFoundException, JAXBWrapperException, JAXBException, XMLStreamException, MessageException{
 		
 		Class returnType = getReturnType();
-		ArrayList<Object> holderArgs = toArrayList(inputArgs);
+		ArrayList<Object> holderArgs = new ArrayList<Object>();
 		ArrayList<MethodParameter> mps = new ArrayList<MethodParameter>();
-		mps = toInputMethodParameters(inputArgs);
+		mps = extractHolderParameters(inputArgs);
 		ArrayList<MethodParameter> holdermps = new ArrayList<MethodParameter>(mps);
 		int index =0;
-		//Remove everything except holders from method parameters and input arguments.
-		for(MethodParameter mp: mps){
-			ParameterDescription pd = mp.getParameterDescription();
-			if(!pd.isHolderType()){
-				holdermps.remove(mp);
-				holderArgs.remove(mp.getValue());
+		//Remove everything except holders from input arguments.
+		for(Object inputArg: inputArgs){
+			if(inputArg !=null && isHolder(inputArg)){
+				holderArgs.add(inputArg);
 			}
 			index++;
 		}
@@ -91,14 +89,14 @@
 		}
 		else if(holdermps.size()>0 && returnType.getName().equals("void")){
 			//Holders found and no return type example --> public void someMethod(Holder<AHolder>)	
-			createResponseHolders(holdermps, holderArgs, message);
+			assignHolderValues(holdermps, holderArgs, message);
 			
 		}
 		else{
 			//Holders found and return type example --> public ReturnType someMethod(Holder<AHolder>)
 			//Note that SEI implementation will wrap return type in a holder if method has a return type and input param as holder.
 			//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.
-			createResponseHolders(holdermps, holderArgs, message);
+			assignHolderValues(holdermps, holderArgs, message);
 			Object bo = createBusinessObject(returnType, message);
 			return bo;
 		}
@@ -118,7 +116,7 @@
 		}
 		ArrayList<Object> objectList = new ArrayList<Object>();
 		int index =0;
-		ArrayList<MethodParameter> mps = toInputMethodParameter(message);
+		ArrayList<MethodParameter> mps = createParameterForSEIMethod(message);
 		if (log.isDebugEnabled()) {
             log.debug("reading input method parameters");
         }
@@ -148,19 +146,7 @@
 		}
 		String wrapperTNS = operationDesc.getResultTargetNamespace();
 		
-		ArrayList<MethodParameter> mps = new ArrayList<MethodParameter>();
-		mps = toInputMethodParameters(holderObjects);
-		ArrayList<MethodParameter> holdersNreturnObject = new ArrayList<MethodParameter>(mps);
-		
-		//Remove everything except holders
-		for(MethodParameter mp: mps){
-			ParameterDescription pd = mp.getParameterDescription();
-			if(!pd.isHolderType()){
-				holdersNreturnObject.remove(mp);
-			}
-		}
-		
-		mps = null;
+		ArrayList<MethodParameter> holdersNreturnObject = extractHolderParameters(holderObjects);
 		Message message = null;
 		
 		if(holdersNreturnObject.size() == 0 && wrapperClazz.getName().equals("void")){
@@ -203,7 +189,7 @@
 	@Override
 	public Message marshalRequest(Object[] objects) throws IllegalAccessException, InstantiationException, ClassNotFoundException, JAXBWrapperException, JAXBException, MessageException, javax.xml.stream.XMLStreamException{
 		
-		ArrayList<MethodParameter> mps = toInputMethodParameters(objects);
+		ArrayList<MethodParameter> mps = createRequestWrapperParameters(objects);
 		//WSDL wrapped and running wsImport with non-wrap binding or wsdl un-Wrapped and running wsImport with no binding, EITHER WAYS 
 		//there can be only 0 or 1 Body parts as per WS-I. 
 		if(mps.size()> SIZE){

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=471731&r1=471730&r2=471731
==============================================================================
--- 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 Mon Nov  6 05:41:30 2006
@@ -24,6 +24,7 @@
 import org.apache.axis2.jaxws.description.EndpointDescription;
 import org.apache.axis2.jaxws.description.OperationDescription;
 import org.apache.axis2.jaxws.description.OperationDescriptionJava;
+import org.apache.axis2.jaxws.description.ParameterDescription;
 import org.apache.axis2.jaxws.description.ServiceDescription;
 import org.apache.axis2.jaxws.marshaller.DocLitWrappedMethodMarshaller;
 import org.apache.axis2.jaxws.marshaller.MethodParameter;
@@ -35,6 +36,7 @@
 import org.apache.axis2.jaxws.wrapper.impl.JAXBWrapperToolImpl;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.xerces.xs.datatypes.ObjectList;
 
 public class DocLitWrappedMethodMarshallerImpl extends MethodMarshallerImpl
 		implements DocLitWrappedMethodMarshaller {
@@ -67,7 +69,7 @@
 		}
 		String resultName = operationDesc.getResultName();
 		Object bo = createBusinessObject(wrapperClazz, message);
-		createResponseHolders(bo, inputArgs, false);
+        assignHolderValues(bo, inputArgs, false);
         // REVIEW: Is the the appropriate logic, to be checking for the existence of the annotation
         //         as the decision point for getting into the property logic?  Note that even if the annotation
         //         is not present, a default result name will be returned.
@@ -93,7 +95,8 @@
         if (log.isDebugEnabled()) {
             log.debug("reading input method parameters");
         }
-        ArrayList<MethodParameter> mps = toInputMethodParameter(jaxbObject);
+       
+        ArrayList<MethodParameter> mps = createParameterForSEIMethod(jaxbObject);
         if (log.isDebugEnabled()) {
             log.debug("done reading input method parameters");
         }
@@ -134,14 +137,15 @@
 			wrapperClazz = loadClass(wrapperClazzName);
 		}
 		//create all holders list
+		ParameterDescription[] paramDescs = operationDesc.getParameterDescriptions();
 		ArrayList<Object> objectList = new ArrayList<Object>();
-		if(holderObjects!=null){
-			objectList = toArrayList(holderObjects);
-			for(Object obj:holderObjects){
-				if(!(isHolder(obj))){
-					objectList.remove(obj);
-				}
+		int index =0;
+		for(ParameterDescription pd:paramDescs){
+			Object value = holderObjects[index];
+			if(pd.isHolderType()){
+				objectList.add(value);
 			}
+			index++;
 		}
 		//No Holders found 
 		ArrayList<MethodParameter> mps = new ArrayList<MethodParameter>();
@@ -151,11 +155,11 @@
 		}
 		if(objectList.size() == 0 && !wrapperClazz.getName().equals("void")){
 			//No holders but a return type example --> public ReturnType someMethod()
-			mps = toOutputMethodParameter(returnObject);
+			mps = createResponseWrapperParameter(returnObject);
 		}
 		else{
 			//Holders found and return type or no return type. example --> public ReturnType someMethod(Holder<String>) or public void someMethod(Holder<String>)
-			mps = toOutputMethodParameter(returnObject, objectList.toArray());
+			mps = createResponseWrapperParameter(returnObject, objectList.toArray());
 		}
 		
         JAXBWrapperTool wrapperTool = new JAXBWrapperToolImpl();
@@ -179,7 +183,8 @@
 		String wrapperTNS = operationDesc.getRequestWrapperTargetNamespace();
 		
 		//Get Name Value pair for input parameter Objects, skip AsyncHandler and identify Holders.
-		ArrayList<MethodParameter> methodParameters = toInputMethodParameters(objects);
+		
+		ArrayList<MethodParameter> methodParameters = createRequestWrapperParameters(objects);
 		JAXBWrapperTool wrapTool = new JAXBWrapperToolImpl();
 		if (log.isDebugEnabled()) {
             log.debug("JAXBWrapperTool attempting to wrap propertes in WrapperClass :" + wrapperClazz);

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=471731&r1=471730&r2=471731
==============================================================================
--- 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 Mon Nov  6 05:41:30 2006
@@ -73,6 +73,7 @@
 import org.apache.axis2.util.XMLUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.xerces.xs.datatypes.ObjectList;
 
 public abstract class MethodMarshallerImpl implements MethodMarshaller {
 	private static QName SOAPENV_QNAME = new QName("http://schemas.xmlsoap.org/soap/envelope/", "Envelope");
@@ -188,10 +189,10 @@
 	/*
 	 * Creates method output parameter/return parameter. reads webResult annotation and then matches them with the response/result value of Invoked method
 	 * and creates a name value pair.
-	 * Also hadnles situation where ResponseWrapper is a holder.
+	 * Also handles situation where ResponseWrapper is a holder.
 	 */
 	
-	protected ArrayList<MethodParameter> toOutputMethodParameter(Object webResultValue){
+	protected ArrayList<MethodParameter> createResponseWrapperParameter(Object webResultValue){
 		ArrayList<MethodParameter> mps = new ArrayList<MethodParameter>();
 		if(webResultValue == null){
 			return mps;
@@ -207,20 +208,35 @@
 		return mps;
 	}
 	
-	protected ArrayList<MethodParameter> toOutputMethodParameter(Object webResultObject, Object[] holderObjects)throws IllegalAccessException, InstantiationException, ClassNotFoundException{
+    protected ArrayList<MethodParameter> createResponseWrapperParameter(Object webResultObject, Object[] holderObjects)throws IllegalAccessException, InstantiationException, ClassNotFoundException{
 		ParameterDescription[] paramDescs = operationDesc.getParameterDescriptions();
 		ArrayList<ParameterDescription> pds = new ArrayList<ParameterDescription>();
 		pds = toArrayList(paramDescs);
-		// Remove all non holder meta data.
+        
+		// Remove all non holder meta data. Holders cannot be of Mode.IN so we 
+        // don't have to worry about removing params with Mode.IN.
 		for (int index = 0; index < paramDescs.length; index++) {
 			ParameterDescription paramDesc = paramDescs[index];
 			if (!(paramDesc.isHolderType())) {
-				pds.remove(index);
+				pds.remove(paramDesc);
 			}
 		}
 		
-		ArrayList<Object> paramValues = toArrayList(holderObjects);
-		ArrayList<MethodParameter> mps = createMethodParameters(pds.toArray(new ParameterDescription[0]), paramValues);
+		ArrayList<Object> paramValues = new ArrayList<Object>();
+        //ArrayList<Object> paramValues = toArrayList(holderObjects);
+        int index =0;
+        for(ParameterDescription pd :pds){
+            Object value = holderObjects[index];
+                if (value != null && isHolder(value) && 
+                    pd.isHolderType()) {
+                        Object holderValue = getHolderValue(pd.getMode(), value);
+                        value = holderValue;
+                    }
+                    paramValues.add(value);
+                    index++;
+                }
+                ArrayList<MethodParameter> mps = createParameters(pds.toArray(new ParameterDescription[0]), paramValues);
+        
 		if(webResultObject!=null){
 			MethodParameter outputResult = new MethodParameter(operationDesc.getResultName(), operationDesc.getResultTargetNamespace(), webResultObject.getClass(), webResultObject);
 			mps.add(outputResult);
@@ -229,28 +245,10 @@
 		
 	}
 	
-	protected ArrayList<MethodParameter> toInputMethodParameter(Object jaxbObject) throws JAXBWrapperException, IllegalAccessException, InstantiationException, ClassNotFoundException{
-		ArrayList<MethodParameter> mps = new ArrayList<MethodParameter>();
-		if(jaxbObject == null){
-			return mps;
-		}
-        ArrayList<String> webParam = toArrayList(operationDesc.getParamNames());
-                
-        if (log.isDebugEnabled()) {
-            log.debug("Attempting to unwrap object from WrapperClazz");
-        }
-        JAXBWrapperTool wrapperTool = new JAXBWrapperToolImpl();
-        Object[] objects = wrapperTool.unWrap(jaxbObject, webParam);
-        if (log.isDebugEnabled()) {
-            log.debug("Object unwrapped");
-        }
-        return toInputMethodParameters(objects);
-	}
 	/*
-	 * Creates method input parameters, reads webparam annotation and then matches them to the input parameters that the the invoked method was supplied 
-	 * and creates a name value pair.
+	 * Request Parameter are those where webParam Mode is IN or INOUT
 	 */
-	protected ArrayList<MethodParameter> toInputMethodParameters(Object[] objects)throws IllegalAccessException, InstantiationException, ClassNotFoundException{
+    protected ArrayList<MethodParameter> createRequestWrapperParameters(Object[] objects)throws IllegalAccessException, InstantiationException, ClassNotFoundException{
 		ArrayList<MethodParameter> mps = new ArrayList<MethodParameter>();
 		//Hand no input parameters
 		if(objects == null){
@@ -267,11 +265,26 @@
 					.getMessage("InvalidWebParams"));
 		}
 		ArrayList<Object> paramValues = new ArrayList<Object>();
-		paramValues = toArrayList(objects);
+		int index =0;
+		//Request Parameters are one that have IN or INOUT parameter mode.
+		for(ParameterDescription pd :paramDescs){
+			if(pd.getMode() == Mode.INOUT || pd.getMode() == Mode.IN){
+				Object value = objects[index];
+				//If paramType is holder then get the holder value, this is done as requestWrapper does not have holder but a actual type of Holder.
+				if (value != null && isHolder(value)
+						&& pd.isHolderType()) {
+					Object holderValue = getHolderValue(pd.getMode(),
+							value);
+					value = holderValue;
+				}
+				paramValues.add(value);
+			}
+			index++;
+		}
 		if (log.isDebugEnabled()) {
 			log.debug("Attempting to create Method Parameters");
 		}
-		mps = createMethodParameters(paramDescs, paramValues);
+		mps = createParameters(paramDescs, paramValues);
 
 		if (log.isDebugEnabled()) {
 			log.debug("Method Parameters created");
@@ -279,8 +292,70 @@
 					
 		return mps;
 	}
+	protected ArrayList<MethodParameter> createParameterForSEIMethod(Object jaxbObject) throws JAXBWrapperException, IllegalAccessException, InstantiationException, ClassNotFoundException{
+		ArrayList<MethodParameter> mps = new ArrayList<MethodParameter>();
+		if(jaxbObject == null){
+			return mps;
+		}
+		ParameterDescription[] paramDescs = operationDesc.getParameterDescriptions();
+		
+        ArrayList<String> webParam = new ArrayList<String>();
+       
+        //Get names of all IN and INOUT parameters, those are the ones that have been sent out by client
+        for(ParameterDescription pd : paramDescs){
+        	Mode mode = pd.getMode();
+        	if(mode == Mode.IN || mode == Mode.INOUT){
+        		webParam.add(pd.getParameterName());
+        	}
+        }
+    
+        if (log.isDebugEnabled()) {
+            log.debug("Attempting to unwrap object from WrapperClazz");
+        }
+        JAXBWrapperTool wrapperTool = new JAXBWrapperToolImpl();
+        Object[] objects = wrapperTool.unWrap(jaxbObject, webParam);
+        if (log.isDebugEnabled()) {
+            log.debug("Object unwrapped");
+        }
+      
+        //Now that Objects with Mode IN and INOUT are unwrapped, let me get all the OUT parameters assign them NULL values,
+        //so we can call the method with right number of parameters. Also lets ensure that we create holders whereever the method
+        //parameter is defined as holder type.
+        ArrayList<Object> objectList = new ArrayList<Object>();
+        int paramIndex = 0;
+        int objectIndex = 0;
+        for(ParameterDescription pd : paramDescs){
+        	Object value = null;
+        	Mode mode = pd.getMode();
+        	
+        	if(mode == Mode.IN || mode == Mode.INOUT){
+        		value = objects[objectIndex];
+        		if (value != null && !isHolder(value)
+        				&& pd.isHolderType()) {
+        			Holder<Object> holder = createHolder(pd.getParameterType(),
+        					value);
+        			value = holder;
+        		}
+        		objectIndex++;
+        	}
+        	
+        	else if(mode == Mode.OUT){
+        		if(value == null && pd.isHolderType()){
+        			Holder<Object> holder = createHolder(pd.getParameterType(),
+        					value);
+        			value = holder;
+        		}
+        		
+        	}
+        	objectList.add(paramIndex, value);
+        	paramIndex++;
+        }
+        
+        return createParameters(paramDescs, objectList);
+        
+	}
 	
-	protected ArrayList<MethodParameter> toInputMethodParameter(Message message)throws IllegalAccessException, InstantiationException, ClassNotFoundException, MessageException, XMLStreamException, JAXBException{
+	protected ArrayList<MethodParameter> createParameterForSEIMethod(Message message)throws IllegalAccessException, InstantiationException, ClassNotFoundException, MessageException, XMLStreamException, JAXBException{
 		ArrayList<MethodParameter> mps = new ArrayList<MethodParameter>();
  		if(message == null){
  			return null;
@@ -301,13 +376,147 @@
 			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 = createMethodParameters(paramDescs, paramValues);
+		mps = createParameters(paramDescs, paramValues);
+		
+		return mps;
+	}
+	/*
+	 * Extract Holder parameter from supplied parameters and add annotation data for these parameters.
+	 */
+
+	protected ArrayList<MethodParameter> extractHolderParameters(Object jaxbObject) throws JAXBWrapperException, IllegalAccessException, InstantiationException, ClassNotFoundException{
+		ArrayList<MethodParameter> mps = new ArrayList<MethodParameter>();
+		if(jaxbObject == null){
+			return mps;
+		}
+		
+        ArrayList<String> webParam = new ArrayList<String>();
+        ParameterDescription[] paramDescs = operationDesc.getParameterDescriptions();
+        ArrayList<ParameterDescription> paramDescList = new ArrayList<ParameterDescription>();
+		// Remove all non holder meta data. Holders cannot be of Mode.IN so I dont have to worry about removing params with Mode.IN.
+		for (int index = 0; index < paramDescs.length; index++) {
+			ParameterDescription paramDesc = paramDescs[index];
+			if (paramDesc.isHolderType()) {
+				paramDescList.add(paramDesc);
+				webParam.add(paramDesc.getParameterName());
+			}
+		}      
+		
+        if (log.isDebugEnabled()) {
+            log.debug("Attempting to unwrap object from WrapperClazz");
+        }
+        JAXBWrapperTool wrapperTool = new JAXBWrapperToolImpl();
+        Object[] objects = wrapperTool.unWrap(jaxbObject, webParam);
+        
+        if (log.isDebugEnabled()) {
+            log.debug("Object unwrapped");
+        }
+        if (log.isDebugEnabled()) {
+			log.debug("Attempting to create Holder Method Parameters");
+		}
+        ArrayList<Object> paramValues = new ArrayList<Object>();
+        int index = 0;
+        for(ParameterDescription pd:paramDescList){
+        	Object value = objects[index];
+        	if (value != null && !isHolder(value)
+					&& pd.isHolderType()) {
+				Holder<Object> holder = createHolder(pd.getParameterType(),
+						value);
+				value = holder;
+        	}
+        	else if(value == null && pd.isHolderType()){
+        		Holder<Object> holder = createHolder(pd.getParameterType(),
+						value);
+				value = holder;
+        	}
+        	paramValues.add(value);
+        	index++;
+        }
+		mps = createParameters(paramDescList.toArray(new ParameterDescription[0]), paramValues);
+
+		if (log.isDebugEnabled()) {
+			log.debug("Holder Method Parameters created");
+		}
+					
+		return mps;
+	}
+	
+	/*
+	 * Extract Holder parameter from supplied parameters and add annotation data for these parameters.
+	 */
+	protected ArrayList<MethodParameter> extractHolderParameters(Object[] objects)throws IllegalAccessException, InstantiationException, ClassNotFoundException{
+		ArrayList<MethodParameter> mps = new ArrayList<MethodParameter>();
+		//Hand no input parameters
+		if(objects == null){
+			return mps;
+		}
+		if(objects!=null && objects.length==0){
+			return mps;
+		}
+		
+		ParameterDescription[] paramDescs = operationDesc.getParameterDescriptions();
+		ArrayList<ParameterDescription> paramDescList = new ArrayList<ParameterDescription>();
+		if (paramDescs.length != objects.length) {
+			throw ExceptionFactory.makeWebServiceException(Messages
+					.getMessage("InvalidWebParams"));
+		}
+		ArrayList<Object> paramValues = new ArrayList<Object>();
+		int index =0;
+		//Add only Holder parameters. 
+		for(ParameterDescription pd : paramDescs){
+			Object value = objects[index];
+			if(pd.isHolderType()){
+				if (value != null && isHolder(value)
+						&& pd.isHolderType()) {
+					Object holderValue = getHolderValue(pd.getMode(),
+							value);
+					value = holderValue;
+				}
+				paramValues.add(value);
+				paramDescList.add(pd);
+			}
+			index++;
+		}
 		
+			
+		if (log.isDebugEnabled()) {
+			log.debug("Attempting to create Holder Method Parameters");
+		}
+		mps = createParameters(paramDescList.toArray(new ParameterDescription[0]), paramValues);
+
+		if (log.isDebugEnabled()) {
+			log.debug("Holder Method Parameters created");
+		}
+					
+		return mps;
+	}
+	private ArrayList<MethodParameter> createParameters(
+			ParameterDescription[] paramDescs, ArrayList<Object> paramValues){
+		ArrayList<MethodParameter> mps = new ArrayList<MethodParameter>();
+		int index = 0;
+		for (Object paramValue : paramValues){
+			ParameterDescription paramDesc = paramDescs[index];
+			MethodParameter mp = null;
+			if (!isParamAsyncHandler(paramDesc.getParameterName(), paramValue)){
+				mp = new MethodParameter(paramDesc, paramValue);
+				mps.add(mp);
+			}
+			index++;
+		}
 		return mps;
 	}
-	protected ArrayList<MethodParameter> createMethodParameters(
+	
+	
+	private ArrayList<MethodParameter> createMethodParameters(
 			ParameterDescription[] paramDescs, ArrayList<Object> paramValues)
 			throws IllegalAccessException, InstantiationException,
 			ClassNotFoundException {
@@ -323,23 +532,26 @@
 			// and value;
 			if (!isParamAsyncHandler(paramDesc.getParameterName(), paramValue)) {
 				if (paramType != null) {
-					// Identify Holders and get Holder Values, this if condition
-					// will mostly execute during client side call
-					if (paramValue != null && isHolder(paramValue)
-							&& isHolderType) {
-						Object holderValue = getHolderValue(paramMode,
-								paramValue);
-						mp = new MethodParameter(paramDesc, holderValue);
+				    if(paramValue == null && isHolderType){
+                        Holder<Object> holder = createHolder(paramType, paramValue);
+						mp = new MethodParameter(paramDesc, holder);
 					}
 					// Identify that param value is not Holders however if the
-					// method parameter is holder type and create Holder, this
+					// method parameter is holder type then create Holder, this
 					// will mostly be called during server side call
 					else if (paramValue != null && !isHolder(paramValue)
 							&& isHolderType) {
 						Holder<Object> holder = createHolder(paramType,
 								paramValue);
 						mp = new MethodParameter(paramDesc, holder);
-					} else {
+					} 
+				    // Identify Holders and get Holder Values, this if condition
+				    // will mostly execute during client side call
+					else if (paramValue != null && isHolder(paramValue) && isHolderType) {
+					    Object holderValue = getHolderValue(paramMode, paramValue);
+					    mp = new MethodParameter(paramDesc, holderValue);
+					}
+					else {
 						mp = new MethodParameter(paramDesc, paramValue);
 					}
 				}
@@ -695,7 +907,8 @@
         Block jaxbBlock = factory.createFrom(block, blockContext);
         return jaxbBlock.getBusinessObject(true); 
 	}
-	protected void createResponseHolders(ArrayList<MethodParameter> mps, ArrayList<Object> inputArgHolders, Message message)throws JAXBException, MessageException, XMLStreamException{
+	
+    protected void assignHolderValues(ArrayList<MethodParameter> mps, ArrayList<Object> inputArgHolders, Message message)throws JAXBException, MessageException, XMLStreamException{
 		Object bo = null;
 		int index = 0;
 		for(MethodParameter mp:mps){
@@ -719,57 +932,47 @@
 		
 	
 	}
-
 	
-	protected void createResponseHolders(Object bo, Object[] inputArgs, boolean isBare)throws JAXBWrapperException, InstantiationException, ClassNotFoundException, IllegalAccessException{
+    protected void assignHolderValues(Object bo, Object[] inputArgs, boolean isBare)throws JAXBWrapperException, InstantiationException, ClassNotFoundException, IllegalAccessException{
 		if(inputArgs == null){
 			return;
 		}
-		ArrayList<Object> objList = toArrayList(inputArgs);
-		for(Object arg:inputArgs){
-			if(arg == null){
-				objList.remove(arg);
-			}
-			else if(arg!=null && !Holder.class.isAssignableFrom(arg.getClass())){
-				objList.remove(arg);
-			}
-			
+		//Remove everything except for Holders from input parameter provided by client application.
+		ArrayList<Object> objList = new ArrayList<Object>();
+		ParameterDescription[] pds = operationDesc.getParameterDescriptions();
+		int index = 0;
+		//Read Holders from Input parameteres.
+		for(ParameterDescription pd : pds){
+		    if(pd.isHolderType()) {
+		        objList.add(inputArgs[index]);
+            }
+		    index++;
 		}
+		//If no holder params in method
 		if(objList.size()<=0){
 			return;
 		}
-		ArrayList<MethodParameter> mps = null;
-		if(isBare){
-			mps = toInputMethodParameters(new Object[]{bo});
-			
-		}
-		else{
-			mps = toInputMethodParameter(bo);
-		}
-			
-		MethodParameter[] mpArray = mps.toArray(new MethodParameter[0]);
-		for(MethodParameter mp:mpArray){
-			ParameterDescription pd = mp.getParameterDescription();
-			if(!pd.isHolderType()){
-				mps.remove(mp);
-			}
-		}
+
+		//Next get all the holder objects from Business Object created from Response Message
+		ArrayList<MethodParameter> mps = extractHolderParameters(bo);
+        
 		if(mps.size() <=0){
 			return;
 		}
-		mpArray = null;
-		int index=0;
+
+		index=0;
+		//assign Holder values from Business Object to input client parameters.
 		for(Object inputArg: objList){
-			Holder inputHolder = (Holder)inputArg;
-			MethodParameter mp = mps.get(index);
-			Holder responseHolder = (Holder)mp.getValue();
-			inputHolder.value = responseHolder.value;
+		    if(inputArg!=null){
+		        Holder inputHolder = (Holder)inputArg;
+		        MethodParameter mp = mps.get(index);
+		        Holder responseHolder = (Holder)mp.getValue();
+		        inputHolder.value = responseHolder.value;
+		    }
 			index++;
 		}
 		
 	}
-	
-	
 	
 	protected Object findProperty(String propertyName, Object jaxbObject)throws JAXBWrapperException{
 		JAXBWrapperTool wrapTool = new JAXBWrapperToolImpl();



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