package nuggets;
import java.util.HashMap;
import java.util.Map;
import nuggets.delegate.ADelegate;
import nuggets.delegate.DBoolean;
import nuggets.delegate.DBooleanArray;
import nuggets.delegate.DBooleanObject;
import nuggets.delegate.DBooleanObjectArray;
import nuggets.delegate.DByte;
import nuggets.delegate.DByteArray;
import nuggets.delegate.DByteObject;
import nuggets.delegate.DByteObjectArray;
import nuggets.delegate.DChar;
import nuggets.delegate.DCharArray;
import nuggets.delegate.DCharObject;
import nuggets.delegate.DCharObjectArray;
import nuggets.delegate.DClass;
import nuggets.delegate.DDouble;
import nuggets.delegate.DDoubleArray;
import nuggets.delegate.DDoubleObject;
import nuggets.delegate.DDoubleObjectArray;
import nuggets.delegate.DFloat;
import nuggets.delegate.DFloatArray;
import nuggets.delegate.DFloatObject;
import nuggets.delegate.DFloatObjectArray;
import nuggets.delegate.DInteger;
import nuggets.delegate.DIntegerArray;
import nuggets.delegate.DIntegerObject;
import nuggets.delegate.DIntegerObjectArray;
import nuggets.delegate.DLong;
import nuggets.delegate.DLongArray;
import nuggets.delegate.DLongObject;
import nuggets.delegate.DLongObjectArray;
import nuggets.delegate.DObjectArray;
import nuggets.delegate.DShort;
import nuggets.delegate.DShortArray;
import nuggets.delegate.DShortObject;
import nuggets.delegate.DShortObjectArray;
import nuggets.delegate.DString;
import nuggets.delegate.DStringBuffer;
import nuggets.util.IdentityHashMap;
/** PersistenceHelper class for Grit objects
* @author walczak
* @since Dec 5, 2005
*/
public class PersistenceHelper
{
private static final IDelegate DEFAULT_DELEGATE = new ADelegate();
/**
* @param flag
* @return "true":"false"
*/
public static String toString(boolean flag)
{
return flag ? "true" : "false";
}
/**
* @param clazz
* @return the name of class
*/
public static String toString(Class clazz)
{
return clazz.getName();
}
/**
* This will test for a persistence delegate of this class or of all
* interfaces of this class. It will create a delegate using BeanDelegateFactory
* @param clazz
* @return the persistence delegate or null
*/
public static IDelegate getDelegate(final Class clazz, ClassLoader classloader)
{
IDelegate m = lookUpDelegate(clazz);
if(m == null)
{
m = createPersistenceDelegate(clazz, classloader);
registerDelegate(clazz, m);
}
return m;
}
/** This method looks up the delegate in the table and returns a DEFAULT_DELEGATE if not found
* @param clazz
* @return the defeault delegat for this class
*/
public static IDelegate getDefaultDelegate(Class clazz)
{
IDelegate m = lookUpDelegate(clazz);
if(m == null) return DEFAULT_DELEGATE;
return m;
}
/**
* @param clazz
* @return the delegate found in delegate list or ADelagate
*/
static IDelegate lookUpDelegate(Class clazz)
{
Class c = clazz;
IDelegate m = null;
m = (IDelegate)fast_map.get(c);
if(m == null)
{
if(clazz.isArray()) return ARRAY_DELEGATE;
// hervest the interfaces
Class[] ints = c.getInterfaces();
for(int i = 0; i < ints.length; i++)
{
m = (IDelegate)fast_map.get(ints[i]);
if(m != null)
{
registerDelegate(clazz, m);
break;
}
}
}
return m;
}
/**
* @param clazz
* @return a persistance delegate for the specified class
*/
private static IDelegate createPersistenceDelegate(Class clazz, ClassLoader classloader)
{
try
{
Map props = INTROSPECTOR.getBeanProperties(clazz);
return GENERATOR.generateDelegate(clazz, props, classloader);
}
catch(Exception e)
{
e.printStackTrace();
}
return null;
}
/*----------------------------- decoupled ----------------------------------------*/
static final IBeanIntrospector INTROSPECTOR = getIntrospector();
static final IDelegateGenerator GENERATOR = getGenerator();
/**
* @return a delegate generator
*/
private static IDelegateGenerator getGenerator()
{
try
{
return(IDelegateGenerator)Class.forName("nuggets.JaninoGenerator"
/*, true, Thread.currentThread().getContextClassLoader()*/).newInstance();
}
catch(Exception e)
{
// nop
}
// fail safe
return new ReflectionGenerator();
}
/**
* @return an introspector
*/
private static IBeanIntrospector getIntrospector()
{
try
{
return (IBeanIntrospector)Class.forName("nuggets.BeanInfoIntrospector"/*, true, Thread.currentThread().getContextClassLoader()*/).newInstance();
}
catch(Exception e)
{
// nop
}
// fail safe
return new ReflectionIntrospector();
}
/** This method looks up the delegate in the table and returns a DEFAULT_DELEGATE if not found
* @param clazz
* @return the defeault delegat for this class
*/
public static IDelegate getDefaultDelegate(String clazz)
{
IDelegate m = lookUpDelegate(clazz);
if(m == null) return DEFAULT_DELEGATE;
return m;
}
/**
* @param clazz
* @return the delegate found in delegate list or ADelagate
*/
static IDelegate lookUpDelegate(String clazz)
{
return (IDelegate)string_map.get(clazz);
}
final static private IDelegate ARRAY_DELEGATE =new DObjectArray();
final static private IdentityHashMap fast_map = new IdentityHashMap();
final static private HashMap string_map = new HashMap();
static
{
registerDelegate(INugget.class, new nuggets.delegate.DNugget());
// default types
registerDelegate(Boolean.class, new DBooleanObject());
registerDelegate(boolean.class, new DBoolean());
registerDelegate(Byte.class, new DByteObject());
registerDelegate(byte.class, new DByte());
registerDelegate(Character.class,new DCharObject());
registerDelegate(char.class, new DChar());
registerDelegate(Double.class, new DDoubleObject());
registerDelegate(double.class, new DDouble());
registerDelegate(Float.class, new DFloatObject());
registerDelegate(float.class, new DFloat());
registerDelegate(Integer.class, new DIntegerObject());
registerDelegate(int.class, new DInteger());
registerDelegate(Long.class, new DLongObject());
registerDelegate(long.class, new DLong());
registerDelegate(Short.class, new DShortObject());
registerDelegate(short.class, new DShort());
// arrays
registerDelegate(boolean[].class,new DBooleanArray());
registerDelegate(Boolean[].class,new DBooleanObjectArray());
registerDelegate(byte[].class,new DByteArray());
registerDelegate(Byte[].class,new DByteObjectArray());
registerDelegate(char[].class,new DCharArray());
registerDelegate(Character[].class,new DCharObjectArray());
registerDelegate(double[].class,new DDoubleArray());
registerDelegate(Double[].class,new DDoubleObjectArray());
registerDelegate(float[].class,new DFloatArray());
registerDelegate(Float[].class,new DFloatObjectArray());
registerDelegate(int[].class,new DIntegerArray());
registerDelegate(Integer[].class,new DIntegerObjectArray());
registerDelegate(long[].class,new DLongArray());
registerDelegate(Long[].class,new DLongObjectArray());
registerDelegate(short[].class,new DShortArray());
registerDelegate(Short[].class,new DShortObjectArray());
// lang
registerDelegate(Class.class,new DClass());
registerDelegate(String.class,new DString());
registerDelegate(StringBuffer.class,new DStringBuffer());
// other java utils
registerDelegate("java.util.BitSet","nuggets.delegate.DBitSet");
registerDelegate("java.util.Calendar","nuggets.delegate.DCalendar");
registerDelegate("java.util.GregorianCalendar","nuggets.delegate.DCalendar");
registerDelegate("java.util.Collection","nuggets.delegate.DCollection");
registerDelegate("java.util.List","nuggets.delegate.DList");
registerDelegate("java.util.Set","nuggets.delegate.DCollection");
registerDelegate("java.util.Date","nuggets.delegate.DDate");
registerDelegate("java.util.Locale","nuggets.delegate.DLocale");
registerDelegate("java.util.Map","nuggets.delegate.DMap");
registerDelegate("java.util.Properties","nuggets.delegate.DProperties");
registerDelegate("java.util.TimeZone","nuggets.delegate.DTimeZone");
registerDelegate("java.util.TreeMap","nuggets.delegate.DTreeMap");
registerDelegate("java.util.TreeSet","nuggets.delegate.DTreeSet");
// other
registerDelegate("java.io.File", "nuggets.delegate.DFile");
registerDelegate("java.net.URL","nuggets.delegate.DURL");
registerDelegate("java.net.InetAddress","nuggets.delegate.DInetAddress");
registerDelegate("java.sql.Date","nuggets.delegate2.DSQLDate");
registerDelegate("java.sql.Time","nuggets.delegate2.DSQLTime");
registerDelegate("java.sql.Timestamp","nuggets.delegate2.DSQLTimestamp");
registerDelegate("java.math.BigDecimal", "nuggets.delegate2.DBigDecimal");
registerDelegate("java.math.BigInteger", "nuggets.delegate2.DBigInteger");
}
/**
* @param clazz
* @param delegate
*/
public static void registerDelegate(Class clazz, IDelegate delegate)
{
try
{
String cn=clazz.getName();
fast_map.put(clazz, delegate);
string_map.put(cn, delegate);
if(cn.startsWith("java.lang.") && cn.lastIndexOf('.') == 9)
{
// register java.lang classes without prefix
string_map.put(cn.substring(10), delegate);
}
}
catch(Exception e)
{ /* the class has not been found */
e.printStackTrace();
}
}
/**
* @param class_name
* @param delegate_name
*/
private static void registerDelegate(String class_name, String delegate_name)
{
registerDelegate(class_name, delegate_name, PersistenceHelper.class.getClassLoader());
}
/**
* @param class_name
* @param delegate_name
*/
private static void registerDelegate(String class_name, String delegate_name, ClassLoader classloader)
{
try
{
registerDelegate(Class.forName(class_name, true, classloader), (IDelegate)Class.forName(delegate_name, true, classloader).newInstance());
}
catch(Exception e)
{
/* class or delegate not found */
// e.printStackTrace();
}
}
}