openamf/src/java/org/openamf/invoker RankedMethod.java,NONE,1.1 JavaServiceInvoker.java,1.12,1.13
[email protected] Sat, 03 May 2003 13:53:50 -0700
Newsgroups
gmane.comp.java.openamf.cvs
Message-ID
<[email protected] >
Update of /cvsroot/openamf/openamf/src/java/org/openamf/invoker
In directory sc8-pr-cvs1:/tmp/cvs-serv28289/src/java/org/openamf/invoker
Modified Files:
JavaServiceInvoker.java
Added Files:
RankedMethod.java
Log Message:
1) finished initial ASTranslator integration
2) now all methods are ranked and the highest ranking method is invoked
--- NEW FILE: RankedMethod.java ---
package org.openamf.invoker;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openamf.ASObject;
import com.carbonfive.flash.decoder.ActionScriptDecoder;
import com.carbonfive.flash.decoder.DecoderFactory;
public class RankedMethod implements Comparable {
public static final int NAME_MATCHES = 55;
public static final int NAME_CASE_MATCHES = 5;
public static final int PARAM_COUNT_MATCHES = 10;
public static final int REQUIRED_RANK = NAME_MATCHES + PARAM_COUNT_MATCHES;
private double rank;
private Method method;
private List parameters;
private boolean invokable;
private static final Log log = LogFactory.getLog(RankedMethod.class);
RankedMethod(Method method, String requestedMethodName, List parameters) {
this.method = method;
process(requestedMethodName, parameters);
}
public double getRank() {
return rank;
}
public Method getMethod() {
return method;
}
public boolean isInvokable() {
return invokable;
}
Object invoke(Object service)
throws
IllegalArgumentException,
IllegalAccessException,
InvocationTargetException {
return method.invoke(service, parameters.toArray());
}
private void process(String requestedMethodName, List parameters) {
log.debug("current methodName: " + method.getName());
double rank = 0;
ArrayList decodedParameters = null;
if (method.getName().equalsIgnoreCase(requestedMethodName)) {
log.debug("NAME_MATCHES");
rank = RankedMethod.NAME_MATCHES;
if (method.getName().equals(requestedMethodName)) {
log.debug("NAME_CASE_MATCHES");
rank += RankedMethod.NAME_CASE_MATCHES;
}
Class[] parameterTypes = method.getParameterTypes();
if (parameterTypes.length == parameters.size()) {
log.debug("PARAM_COUNT_MATCHES");
rank += RankedMethod.PARAM_COUNT_MATCHES;
decodedParameters = new ArrayList(parameterTypes.length);
rank =
checkParameters(
parameters,
rank,
decodedParameters,
parameterTypes);
}
}
log.debug("RANK: " + rank);
this.rank = rank;
this.parameters = decodedParameters;
}
private double checkParameters(
List parameters,
double rank,
ArrayList decodedParameters,
Class[] parameterTypes) {
invokable = true;
int allParamTypesMatch =
100 - NAME_MATCHES - NAME_CASE_MATCHES - PARAM_COUNT_MATCHES;
double paramTypeMatchValue = allParamTypesMatch / parameters.size();
for (int i = 0; i < parameterTypes.length; i++) {
Class parameterType = parameterTypes[i];
Object parameter = parameters.get(i);
log.debug("parameter class: " + parameter.getClass().getName());
log.debug("expected class: " + parameterType.getName());
if (parameterType.isInstance(parameter)) {
log.debug("types match");
rank += paramTypeMatchValue;
decodedParameters.add(parameter);
} else {
log.debug("types don't match");
Object decodedObject =
decodeParameter(parameter, parameterType);
if (parameterType.isInstance(decodedObject)) {
log.debug("parameter decoded");
rank += paramTypeMatchValue / 2;
decodedParameters.add(decodedObject);
} else {
log.debug("parameter couldn't be decoded");
invokable = false;
break;
}
}
}
return rank;
}
private Object decodeParameter(Object parameter, Class parameterType) {
boolean setType = false;
DecoderFactory decoderFactory = DecoderFactory.getInstance();
if (parameter instanceof ASObject
&& ((ASObject) parameter).getType() == null) {
setType = true;
((ASObject) parameter).setType(parameterType.getName());
}
ActionScriptDecoder decoder =
decoderFactory.getDecoder(parameter, parameterType);
Object decodedObject = decoder.decodeObject(parameter, parameterType);
if (!setType
&& decodedObject == null
&& parameter instanceof ASObject) {
((ASObject) parameter).setType(parameterType.getName());
decodedObject = decoder.decodeObject(parameter, parameterType);
}
return decodedObject;
}
public int compareTo(Object o) {
int compareTo = 0;
if (o instanceof RankedMethod) {
double compareToRank = ((RankedMethod) o).getRank();
if (getRank() > compareToRank) {
compareTo = -1;
} else if (getRank() < compareToRank) {
compareTo = 1;
} else {
compareTo = 0;
}
} else {
throw new ClassCastException();
}
return compareTo;
}
}
Index: JavaServiceInvoker.java
===================================================================
RCS file: /cvsroot/openamf/openamf/src/java/org/openamf/invoker/JavaServiceInvoker.java,v
retrieving revision 1.12
retrieving revision 1.13
diff -C2 -d -r1.12 -r1.13
*** JavaServiceInvoker.java 2 May 2003 15:41:21 -0000 1.12
--- JavaServiceInvoker.java 3 May 2003 20:53:47 -0000 1.13
***************
*** 1,7 ****
package org.openamf.invoker;
- import java.beans.IntrospectionException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;
--- 1,8 ----
package org.openamf.invoker;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
+ import java.util.ArrayList;
+ import java.util.Collections;
import java.util.List;
***************
*** 10,19 ****
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
- import org.openamf.ASObject;
import org.openamf.ServiceRequest;
- import com.carbonfive.flash.decoder.ActionScriptDecoder;
- import com.carbonfive.flash.decoder.DecoderFactory;
-
public class JavaServiceInvoker extends ServiceInvoker {
--- 11,16 ----
***************
*** 70,100 ****
throws
SecurityException,
- IllegalArgumentException,
- InvocationTargetException,
NoSuchMethodException,
! InstantiationException,
IllegalAccessException,
! IntrospectionException {
! Object serviceResult = null;
! Method serviceMethod = null;
! try {
! serviceMethod =
! getServiceMethod(serviceClass, methodName, parameters);
! serviceResult = serviceMethod.invoke(service, parameters.toArray());
! } catch (NoSuchMethodException e) {
! serviceResult =
! invokeServiceMethodAdvanced(
! service,
! serviceClass,
! methodName,
! parameters);
! }
- return serviceResult;
}
! private Method getServiceMethod(
Class serviceClass,
String methodName,
--- 67,83 ----
throws
SecurityException,
NoSuchMethodException,
! IllegalArgumentException,
IllegalAccessException,
! InvocationTargetException {
! RankedMethod serviceMethod =
! getServiceMethod(serviceClass, methodName, parameters);
! return serviceMethod.invoke(service);
}
! private RankedMethod getServiceMethod(
Class serviceClass,
String methodName,
***************
*** 102,140 ****
throws SecurityException, NoSuchMethodException {
! Method serviceMethod = null;
!
! Class[] argTypes = new Class[parameters.size()];
! for (int i = 0; i < parameters.size(); i++) {
! argTypes[i] = parameters.get(i).getClass();
! }
! serviceMethod = serviceClass.getMethod(methodName, argTypes);
!
! return serviceMethod;
! }
!
! private Object invokeServiceMethodAdvanced(
! Object service,
! Class serviceClass,
! String methodName,
! List parameters)
! throws
! NoSuchMethodException,
! IllegalArgumentException,
! InstantiationException,
! IntrospectionException,
! IllegalAccessException,
! InvocationTargetException {
!
! Object serviceResult = null;
! Method serviceMethod = null;
!
Method[] methods = serviceClass.getMethods();
for (int i = 0; i < methods.length; i++) {
Method method = methods[i];
! if (method.getName().equalsIgnoreCase(methodName)
! && method.getParameterTypes().length == parameters.size()) {
! serviceMethod = method;
! break;
}
}
--- 85,108 ----
throws SecurityException, NoSuchMethodException {
! RankedMethod serviceMethod = null;
Method[] methods = serviceClass.getMethods();
+ ArrayList rankedMethods = new ArrayList(methods.length);
+
+ log.debug("REQUESTED methodName: " + methodName);
+
for (int i = 0; i < methods.length; i++) {
Method method = methods[i];
+ RankedMethod rankedMethod =
+ new RankedMethod(method, methodName, parameters);
+ rankedMethods.add(rankedMethod);
+ }
! if (rankedMethods.size() > 0) {
! log.debug("rankedMethods.size() = " + rankedMethods.size());
! Collections.sort(rankedMethods);
! RankedMethod topRankedMethod = (RankedMethod) rankedMethods.get(0);
! log.debug("topRankedMethod rank = " + topRankedMethod.getRank());
! if (topRankedMethod.isInvokable()) {
! serviceMethod = topRankedMethod;
}
}
***************
*** 142,179 ****
if (serviceMethod == null) {
throw new NoSuchMethodException();
- } else {
- DecoderFactory decoderFactory = DecoderFactory.getInstance();
- Class[] parameterTypes = serviceMethod.getParameterTypes();
- for (int i = 0; i < parameterTypes.length; i++) {
- Class parameterType = parameterTypes[i];
- Object parameter = parameters.get(i);
-
- log.debug("parameter class: " + parameter.getClass().getName());
- log.debug("expected class: " + parameterType.getName());
- if (!parameterType.isInstance(parameter)) {
- log.debug("types don't match");
- boolean setType = false;
- if (parameter instanceof ASObject
- && ((ASObject) parameter).getType() == null) {
-
- setType = true;
- ((ASObject) parameter).setType(parameterType.getName());
- }
- ActionScriptDecoder decoder =
- decoderFactory.getDecoder(parameter, parameterType);
-
- Object value = decoder.decodeObject(parameter, parameterType);
-
- if (!setType && value == null && parameter instanceof ASObject) {
- ((ASObject) parameter).setType(parameterType.getName());
- value = decoder.decodeObject(parameter, parameterType);
- }
- parameters.set(i, value);
- }
- }
- serviceResult = serviceMethod.invoke(service, parameters.toArray());
}
! return serviceResult;
}
--- 110,116 ----
if (serviceMethod == null) {
throw new NoSuchMethodException();
}
! return serviceMethod;
}
***************
*** 181,185 ****
boolean supports = false;
-
try {
Thread.currentThread().getContextClassLoader().loadClass(
--- 118,121 ----
-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf