Package railo.runtime.reflection.storage

Source Code of railo.runtime.reflection.storage.WeakMethodStorage

package railo.runtime.reflection.storage;

import java.lang.reflect.Method;
import java.util.Map;

import org.apache.commons.collections.map.ReferenceMap;

import railo.runtime.type.Array;
import railo.runtime.type.ArrayImpl;
import railo.runtime.type.Collection;
import railo.runtime.type.Collection.Key;
import railo.runtime.type.KeyImpl;
import railo.runtime.type.Struct;
import railo.runtime.type.StructImpl;

/**
* Method Storage Class
*/
public final class WeakMethodStorage {
  private Map<Class,Struct> map=new ReferenceMap(ReferenceMap.SOFT,ReferenceMap.SOFT);
 
  /**
   * returns a methods matching given criteria or null if method doesn't exist
   * @param clazz clazz to get methods from
   * @param methodName Name of the Method to get
   * @param count wished count of arguments
   * @return matching Methods as Array
   */
  public synchronized Method[] getMethods(Class clazz,Collection.Key methodName, int count) {
    Struct methodsMap = map.get(clazz);
    if(methodsMap==null)
      methodsMap=store(clazz);
   
    Object o = methodsMap.get(methodName,null);
    if(o==null) return null;
    Array methods=(Array) o;
    o=methods.get(count+1,null);
    if(o==null) return null;
    return (Method[]) o;
  }


  /**
   * store a class with his methods
   * @param clazz
   * @return returns stored struct
   */
  private StructImpl store(Class clazz) {
    Method[] methodsArr=clazz.getMethods();
    StructImpl methodsMap=new StructImpl();
    for(int i=0;i<methodsArr.length;i++) {
      storeMethod(methodsArr[i],methodsMap);
     
    }
    map.put(clazz,methodsMap);
    return methodsMap;
  }

  /**
   * stores a single method
   * @param method
   * @param methodsMap
   */
  private void storeMethod(Method method, StructImpl methodsMap) {
    Key methodName = KeyImpl.init(method.getName());
   
   
    Object o=methodsMap.get(methodName,null);
    Array methodArgs;
    if(o==null) {
      methodArgs=new ArrayImpl();
      methodsMap.setEL(methodName,methodArgs);
    }
    else methodArgs=(Array) o;
    storeArgs(method,methodArgs);
    //Modifier.isStatic(method.getModifiers());
  }

  /**
   * stores arguments of a method
   * @param method
   * @param methodArgs
   */
  private void storeArgs(Method method, Array methodArgs) {
   
    Class[] pmt = method.getParameterTypes();
    Object o=methodArgs.get(pmt.length+1,null);
    Method[] args;
    if(o==null) {
      args=new Method[1];
      methodArgs.setEL(pmt.length+1,args);
    }
    else {
      Method[] ms = (Method[]) o;
      args = new Method[ms.length+1];
      for(int i=0;i<ms.length;i++) {
        args[i]=ms[i];
      }
      methodArgs.setEL(pmt.length+1,args);
    }
    args[args.length-1]=method;
  }
}
TOP

Related Classes of railo.runtime.reflection.storage.WeakMethodStorage

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.