/**
*
* Copyright (c) 2014, the Railo Company Ltd. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
**/
package lucee.runtime.reflection.storage;
import java.lang.reflect.Constructor;
import java.util.WeakHashMap;
import lucee.runtime.type.Array;
import lucee.runtime.type.ArrayImpl;
/**
* Constructor Storage Class
*/
public final class WeakConstructorStorage {
private WeakHashMap<Class,Array> map=new WeakHashMap<Class,Array>();
/**
* returns a constructor matching given criteria or null if Constructor doesn't exist
* @param clazz Class to get Constructor for
* @param count count of arguments for the constructor
* @return returns the constructors
*/
public synchronized Constructor[] getConstructors(Class clazz,int count) {
Object o=map.get(clazz);
Array con;
if(o==null) {
con=store(clazz);
}
else con=(Array) o;
o=con.get(count+1,null);
if(o==null) return null;
return (Constructor[]) o;
}
/**
* stores the constructors for a Class
* @param clazz
* @return stored structure
*/
private Array store(Class clazz) {
Constructor[] conArr=clazz.getConstructors();
Array args=new ArrayImpl();
for(int i=0;i<conArr.length;i++) {
storeArgs(conArr[i],args);
}
map.put(clazz,args);
return args;
}
/**
* seperate and store the different arguments of one constructor
* @param constructor
* @param conArgs
*/
private void storeArgs(Constructor constructor, Array conArgs) {
Class[] pmt = constructor.getParameterTypes();
Object o=conArgs.get(pmt.length+1,null);
Constructor[] args;
if(o==null) {
args=new Constructor[1];
conArgs.setEL(pmt.length+1,args);
}
else {
Constructor[] cs=(Constructor[]) o;
args = new Constructor[cs.length+1];
for(int i=0;i<cs.length;i++) {
args[i]=cs[i];
}
conArgs.setEL(pmt.length+1,args);
}
args[args.length-1]=constructor;
}
}