All Downloads are FREE. Search and download functionalities are using the official Maven repository.

nuggets.PersistenceHelper Maven / Gradle / Ivy

The newest version!
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();
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy