You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ni...@apache.org on 2009/12/16 09:12:01 UTC

svn commit: r891148 - /camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfProducer.java

Author: ningjiang
Date: Wed Dec 16 08:12:00 2009
New Revision: 891148

URL: http://svn.apache.org/viewvc?rev=891148&view=rev
Log:
CAMEL-2195 add the parameter size validation on camel-cxf producer

Modified:
    camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfProducer.java

Modified: camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfProducer.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfProducer.java?rev=891148&r1=891147&r2=891148&view=diff
==============================================================================
--- camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfProducer.java (original)
+++ camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfProducer.java Wed Dec 16 08:12:00 2009
@@ -25,17 +25,21 @@
 import java.util.Map;
 
 import javax.xml.namespace.QName;
+import javax.xml.ws.Holder;
 import javax.xml.ws.handler.MessageContext.Scope;
 
 import org.apache.camel.Exchange;
+import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.impl.DefaultProducer;
 import org.apache.camel.util.ObjectHelper;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.cxf.binding.soap.model.SoapHeaderInfo;
 import org.apache.cxf.endpoint.Client;
 import org.apache.cxf.jaxws.context.WrappedMessageContext;
 import org.apache.cxf.message.ExchangeImpl;
 import org.apache.cxf.message.Message;
+import org.apache.cxf.service.model.BindingMessageInfo;
 import org.apache.cxf.service.model.BindingOperationInfo;
 
 /**
@@ -151,14 +155,54 @@
                     responseContext);
         }
     }
+    
+    private void checkParameterSize(CxfEndpoint endpoint, Exchange exchange, Object[] parameters) {
+        BindingOperationInfo boi = getBindingOperationInfo(exchange);
+        if (boi == null) {
+            throw new RuntimeCamelException("Can't find the binding operation information from camel exchange");
+        }
+        if (!endpoint.isWrapped() && boi != null) {
+            if (boi.isUnwrappedCapable()) {
+                boi = boi.getUnwrappedOperation();
+            }
+        }
+        int experctMessagePartsSize = boi.getInput().getMessageParts().size();
+        
+        if (parameters.length < experctMessagePartsSize) {
+            throw new IllegalArgumentException("Get the wrong parameter size to invoke the out service, Experct size "
+                                               + experctMessagePartsSize + ", Parameter size " + parameters.length);
+        }
+        
+        if (parameters.length > experctMessagePartsSize) {
+            // need to check the holder parameters        
+            int holdersSize = 0;            
+            for (Object parameter : parameters) {
+                if (parameter instanceof Holder) {
+                    holdersSize++;
+                } 
+            }
+            // need to check the soap header information
+            int soapHeadersSize = 0; 
+            BindingMessageInfo bmi =  boi.getInput();
+            if (bmi != null) {
+                List<SoapHeaderInfo> headers = bmi.getExtensors(SoapHeaderInfo.class);
+                if (headers != null) {
+                    soapHeadersSize = headers.size();
+                }
+            }
+          
+            if (holdersSize + experctMessagePartsSize + soapHeadersSize < parameters.length) {
+                throw new IllegalArgumentException("Get the wrong parameter size to invoke the out service, Experct size "
+                                                   + (experctMessagePartsSize + holdersSize + soapHeadersSize) + ", Parameter size " + parameters.length);
+            }
+        }
+    }
 
     /**
      * Get the parameters for the web service operation
      */
     private Object[] getParams(CxfEndpoint endpoint, Exchange exchange) {
-
-        // TODO: this method should probably be more strict and validate (CAMEL-2195)
-
+      
         Object[] params = null;
         if (endpoint.getDataFormat() == DataFormat.POJO) {
             List<?> list = exchange.getIn().getBody(List.class);
@@ -180,6 +224,8 @@
                     params[0] = exchange.getIn().getBody();
                 }
             }
+            checkParameterSize(endpoint, exchange, params);
+            
         } else if (endpoint.getDataFormat() == DataFormat.PAYLOAD) {
             params = new Object[1];
             // TODO: maybe it should be mandatory body?