openamf/src/java/org/openamf/invoker RankedMethod.java,NONE,1.1 JavaServiceInvoker.java,1.12,1.13

[email protected]
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.