/* * Copyright 2013 Guidewire Software, Inc. */ package gw.internal.gosu.parser; import gw.lang.IDimension; import gw.lang.reflect.IType; import gw.lang.reflect.TypeSystem; import gw.lang.reflect.java.IJavaType; import gw.lang.reflect.module.IExecutionEnvironment; import gw.lang.reflect.module.IModule; import gw.util.Pair; import java.math.BigDecimal; import java.math.BigInteger; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; import java.util.WeakHashMap; public class FrequentUsedJavaTypeCache { private static final Map<IExecutionEnvironment, FrequentUsedJavaTypeCache> INSTANCES = new WeakHashMap<IExecutionEnvironment, FrequentUsedJavaTypeCache>(); private Map<Class<?>, IJavaType> _typesByClass = new WeakHashMap<Class<?>, IJavaType>(); private Map<String, IJavaType> _typesByName = new HashMap<String, IJavaType>(); private boolean _bInited; private IExecutionEnvironment _execEnv; public static FrequentUsedJavaTypeCache instance( IExecutionEnvironment execEnv ) { FrequentUsedJavaTypeCache cache = INSTANCES.get( execEnv ); if( cache == null ) { INSTANCES.put( execEnv, cache = new FrequentUsedJavaTypeCache( execEnv ) ); } return cache; } private FrequentUsedJavaTypeCache( IExecutionEnvironment execEnv ) { _execEnv = execEnv; } public void init() { _bInited = true; Set<Class<?>> classes = new HashSet<Class<?>>(); classes.add(Void.TYPE); classes.add(Boolean.TYPE); classes.add(Byte.TYPE); classes.add(Character.TYPE); classes.add(Double.TYPE); classes.add(Float.TYPE); classes.add(Integer.TYPE); classes.add(Long.TYPE); classes.add(Short.TYPE); classes.add(String.class); classes.add(Number.class); classes.add(Double.class); classes.add(Boolean.class); classes.add(Object.class); classes.add(Date.class); classes.add(Byte.class); classes.add(Float.class); classes.add(Character.class); classes.add(CharSequence.class); classes.add(StringBuilder.class); classes.add(Integer.class); classes.add(Long.class); classes.add(Short.class); classes.add(BigDecimal.class); classes.add(BigInteger.class); classes.add(IDimension.class); classes.add(Collection.class); classes.add(Iterator.class); classes.add(Comparable.class); classes.add(Iterable.class); classes.add(List.class); classes.add(LinkedList.class); classes.add(Set.class); classes.add(Pair.class); classes.add(Map.class); classes.add(HashSet.class); classes.add(ArrayList.class); classes.add(HashMap.class); classes.add(Class.class); classes.add(IType.class); classes.add(Throwable.class); classes.add(Error.class); classes.add(Exception.class); classes.add(RuntimeException.class); classes.add(Enum.class); IModule root = _execEnv.getGlobalModule(); TypeSystem.pushModule(root); try { for (Class<?> c : classes) { IJavaType type = (IJavaType) TypeSystem.get(c); _typesByClass.put(c, type); _typesByName.put(c.getName(), type); } } finally { TypeSystem.popModule(root); } } public final IJavaType getHighUsageType(Class<?> clazz) { if( !_bInited ) { init(); } return _typesByClass.get(clazz); } public final IJavaType getHighUsageType(String clazz) { if( !_bInited ) { init(); } return _typesByName.get(clazz); } }