You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2007/05/30 23:55:52 UTC

svn commit: r542945 - /incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/WrapperClassInInterceptor.java

Author: dkulp
Date: Wed May 30 14:55:51 2007
New Revision: 542945

URL: http://svn.apache.org/viewvc?view=rev&rev=542945
Log:
Fix issue of if a header appears before the wrapper parts, it tried to unwrap the header instead of the part.


Modified:
    incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/WrapperClassInInterceptor.java

Modified: incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/WrapperClassInInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/WrapperClassInInterceptor.java?view=diff&rev=542945&r1=542944&r2=542945
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/WrapperClassInInterceptor.java (original)
+++ incubator/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/WrapperClassInInterceptor.java Wed May 30 14:55:51 2007
@@ -20,10 +20,10 @@
 package org.apache.cxf.jaxws.interceptors;
 
 import java.lang.reflect.Method;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.logging.Logger;
 
-import org.apache.cxf.helpers.CastUtils;
 import org.apache.cxf.interceptor.Fault;
 import org.apache.cxf.jaxb.WrapperHelper;
 import org.apache.cxf.message.Message;
@@ -63,26 +63,43 @@
         
         if (boi != null && boi.isUnwrappedCapable()) {
             BindingOperationInfo boi2 = boi.getUnwrappedOperation();
-            
-            // Sometimes, an operation can be unwrapped according to WSDLServiceFactory,
-            // but not according to JAX-WS. We should unify these at some point, but
-            // for now check for the wrapper class.
-            MessageInfo messageInfo = message.get(MessageInfo.class);
-            if (messageInfo != null && messageInfo.getMessageParts().get(0).getTypeClass() == null) {
-                return;
-            }
-            
             OperationInfo op = boi2.getOperationInfo();
             BindingMessageInfo bmi;
-            if (messageInfo == boi.getOperationInfo().getInput()) {
+            
+            MessageInfo wrappedMessageInfo = message.get(MessageInfo.class);
+            MessageInfo messageInfo;
+            if (wrappedMessageInfo == boi.getOperationInfo().getInput()) {
                 messageInfo = op.getInput();
                 bmi = boi2.getInput();
             } else {
                 messageInfo = op.getOutput();
                 bmi = boi2.getOutput();
             }
-                        
+            
+            // Sometimes, an operation can be unwrapped according to WSDLServiceFactory,
+            // but not according to JAX-WS. We should unify these at some point, but
+            // for now check for the wrapper class.
             List<?> lst = message.getContent(List.class);
+            if (lst == null) {
+                return;
+            }
+            Class<?> wrapperClass = null;
+            Object wrappedObject = null;
+            if (wrappedMessageInfo != null) {
+                for (MessagePartInfo part : wrappedMessageInfo.getMessageParts()) {
+                    //headers should appear in both, find the part that doesn't
+                    if (messageInfo.getMessagePart(part.getName()) == null) {
+                        wrapperClass = part.getTypeClass();
+                        for (Object o : lst) {
+                            if (wrapperClass.isInstance(o)) {
+                                wrappedObject = o;
+                                break;
+                            }
+                        }
+                        break;
+                    }
+                }
+            }
             
             if (lst != null) {
                 message.put(MessageInfo.class, messageInfo);
@@ -94,38 +111,39 @@
                 LOG.info("WrapperClassInInterceptor skipped in HTTP GET method");
                 return;
             }
-            if (lst != null && lst.size() == 1) {
-                if (messageInfo.getMessageParts().size() > 0) {
-                    Object wrappedObject = lst.get(0);
-                    lst.clear();
-                    
-                    for (MessagePartInfo part : messageInfo.getMessageParts()) {
-                        try {
-                            String elementType = null;
-                            if (part.isElement()) {
-                                elementType = part.getElementQName().getLocalPart();
+            if (wrapperClass == null || wrappedObject == null) {
+                return;
+            }
+            
+            List<Object> newParams = new ArrayList<Object>();
+            for (MessagePartInfo part : messageInfo.getMessageParts()) {
+                if (wrappedMessageInfo.getMessagePart(part.getName()) != null) {
+                    newParams.add(lst.get(part.getIndex()));
+                } else {
+                    try {
+                        String elementType = null;
+                        if (part.isElement()) {
+                            elementType = part.getElementQName().getLocalPart();
+                        } else {
+                            if (part.getTypeQName() == null) {
+                                // handling anonymous complex type
+                                elementType = null;
                             } else {
-                                if (part.getTypeQName() == null) {
-                                    // handling anonymous complex type
-                                    elementType = null;
-                                } else {
-                                    elementType = part.getTypeQName().getLocalPart();
-                                }
+                                elementType = part.getTypeQName().getLocalPart();
                             }
-                            Object obj = WrapperHelper.getWrappedPart(part.getName().getLocalPart(), 
-                                                                      wrappedObject,
-                                                                      elementType);
-                        
-                            CastUtils.cast(lst, Object.class).add(obj);
-                        } catch (Exception e) {
-                            // TODO - fault
-                            throw new Fault(e);
                         }
+                        Object obj = WrapperHelper.getWrappedPart(part.getName().getLocalPart(), 
+                                                                  wrappedObject,
+                                                                  elementType);
+                    
+                        newParams.add(obj);
+                    } catch (Exception e) {
+                        // TODO - fault
+                        throw new Fault(e);
                     }
-                } else {
-                    lst.clear();
                 }
             }
+            message.setContent(List.class, newParams);
         }
     }