[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