[jboss-svn-commits] JBL Code SVN: r37927 - labs/jbossesb/trunk/product/services/soap/aop/java/org/jboss/internal/soa/esb/soap/wise.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Mar 23 11:45:16 EDT 2012


Author: mageshbk at jboss.com
Date: 2012-03-23 11:45:16 -0400 (Fri, 23 Mar 2012)
New Revision: 37927

Modified:
   labs/jbossesb/trunk/product/services/soap/aop/java/org/jboss/internal/soa/esb/soap/wise/WSMethodParameterMappingAspect.java
Log:
[JBESB-3727] - Unwrap parameters before invoking a wrapped service

Modified: labs/jbossesb/trunk/product/services/soap/aop/java/org/jboss/internal/soa/esb/soap/wise/WSMethodParameterMappingAspect.java
===================================================================
--- labs/jbossesb/trunk/product/services/soap/aop/java/org/jboss/internal/soa/esb/soap/wise/WSMethodParameterMappingAspect.java	2012-03-22 18:23:44 UTC (rev 37926)
+++ labs/jbossesb/trunk/product/services/soap/aop/java/org/jboss/internal/soa/esb/soap/wise/WSMethodParameterMappingAspect.java	2012-03-23 15:45:16 UTC (rev 37927)
@@ -24,17 +24,26 @@
 import it.javalinux.wise.core.client.WSMethod;
 import it.javalinux.wise.core.client.WebParameter;
 
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Method;
+import java.lang.reflect.Type;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
 
+import javax.jws.WebMethod;
+import javax.jws.WebParam;
 import javax.jws.WebParam.Mode;
+import javax.jws.soap.SOAPBinding;
+import javax.xml.ws.Holder;
+import javax.xml.ws.RequestWrapper;
 
 import org.jboss.aop.joinpoint.MethodInvocation;
 
 /**
  * Aspect used to override parameter array creation within wise invocations.
  * 
+ * @author <a href='mailto:mbojan at jboss.com'>Magesh Kumar B</a>
  * @author <a href='mailto:Kevin.Conner at jboss.com'>Kevin Conner</a>
  */
 public class WSMethodParameterMappingAspect
@@ -43,9 +52,10 @@
         throws Throwable
     {
         final Object[] args = invocation.getArguments() ;
-        final Map<String, Object> params = (Map<String, Object>)args[0] ;
+        Map<String, Object> params = (Map<String, Object>)args[0] ;
 
         final WSMethod wsMethod = (WSMethod)invocation.getTargetObject() ;
+        unwrapParams(invocation, params);
         final Map<String, WebParameter> webParams = wsMethod.getWebParams() ;
         
         final Object[] result = new Object[webParams.size()] ;
@@ -85,4 +95,61 @@
         }
         return holders;
     }
+
+    public void unwrapParams(final MethodInvocation invocation, Map<String, Object> params)
+        throws Throwable
+    {
+        final WSMethod wsMethod = (WSMethod)invocation.getTargetObject();
+        Method method = wsMethod.getMethod();
+        RequestWrapper wrapper = method.getAnnotation(RequestWrapper.class);
+        if (wrapper != null)
+        {
+            // Unwrap
+            String name = wrapper.localName();
+            ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
+            try
+            {
+                Thread.currentThread().setContextClassLoader(wsMethod.getEndpoint().getClassLoader());
+                Class<?> wrapperClass = wsMethod.getEndpoint().getClassLoader().loadClass(wrapper.className());
+                Annotation[][] annotations = method.getParameterAnnotations();
+                Object target = params.get(name);
+                for (int i = 0; i < annotations.length; i++)
+                {
+                    for (int j = 0; j < annotations[i].length; j++)
+                    {
+                        if ((annotations[i][j] instanceof WebParam))
+                        {
+                            WebParam webParaAnno = (WebParam)annotations[i][j];
+                            final Enum<Mode> mode = webParaAnno.mode();
+                            String paramName = webParaAnno.name();
+                            if ((mode == Mode.INOUT) || (mode == Mode.IN))
+                            {
+                                String methodName = "get" + paramName.substring(0,1).toUpperCase() + paramName.substring(1);
+                                Method paramMethod = wrapperClass.getMethod(methodName, new Class<?>[0]);
+                                Object value = paramMethod.invoke(target, new Object[0]);
+                                if (mode == Mode.INOUT)
+                                {
+                                    params.put(paramName, new Holder(value));
+                                }
+                                else 
+                                {
+                                    params.put(paramName, value);
+                                }
+                            }
+                            else
+                            {
+                                params.put(paramName, new Holder());
+                            }
+                            break;
+                        }
+                    }
+                }
+            }
+            finally
+            {
+                // restore the original classloader
+                Thread.currentThread().setContextClassLoader(oldLoader);
+            }
+        }
+    }
 }



More information about the jboss-svn-commits mailing list