package mit.util ;

public class ThreadContext
extends Thread
{
	private static java.util.Hashtable contexts = new java.util.Hashtable() ;

	private static void gc()
	{
		java.util.Enumeration keys = contexts.keys() ;
		while( keys.hasMoreElements() )
		{
			Thread thread = ( Thread ) keys.nextElement() ;
			if( ! thread.isAlive() )
			{
				contexts.remove( thread ) ;
				keys = contexts.keys() ;
			}
		}
		System.gc() ;
	}

	public static void setProperty( Object key , Object value )
	{
		try
		{
			gc() ;
			if( null != key )
			{
				Thread thread = Thread.currentThread() ;
				if( ! contexts.containsKey( thread ) )
				{
					contexts.put( thread , new java.util.Hashtable() ) ;
				}
				java.util.Hashtable context = ( java.util.Hashtable ) contexts.get( thread ) ;
				if( null != value )
				{
					context.put( key , value ) ;
				}
				else
				{
					context.remove( key ) ;
				}
			}
		}
		catch( Exception ex )
		{
			ex.printStackTrace() ;
		}
	}

	public static Object getProperty( Object key )
	{
		try
		{
			gc() ;
			if( null != key )
			{
				Thread thread = Thread.currentThread() ;
				if( contexts.containsKey( thread ) )
				{
					java.util.Hashtable context = ( java.util.Hashtable ) contexts.get( thread ) ;
					return( context.get( key ) ) ;
				}
			}
		}
		catch( Exception ex )
		{
			ex.printStackTrace() ;
		}
		return null ;
	}

	public static java.util.Enumeration getPropertyNames()
	{
		try
		{
			gc() ;
			Thread thread = Thread.currentThread() ;
			if( ! contexts.containsKey( thread ) )
			{
				java.util.Hashtable context = ( java.util.Hashtable ) contexts.get( thread ) ;
				return( context.keys() ) ;
			}
		}
		catch( Exception ex )
		{
			ex.printStackTrace() ;
		}
		return null ;
	}

	public static Object removeProperty( String name )
	{
		try
		{
			gc() ;
			if( null != name )
			{
				Thread thread = Thread.currentThread() ;
				if( ! contexts.containsKey( thread ) )
				{
					java.util.Hashtable context = ( java.util.Hashtable ) contexts.get( thread ) ;
					return( context.remove( name ) ) ;
				}
			}
		}
		catch( Exception ex )
		{
			ex.printStackTrace() ;
		}
		return null ;
	}

	public static void purge()
	{
		try
		{
			java.util.Enumeration threads = contexts.keys() ;
			while( threads.hasMoreElements() )
			{
				java.util.Hashtable context = ( java.util.Hashtable ) threads.nextElement() ;
				java.util.Enumeration keys = context.keys() ;
				while( keys.hasMoreElements() )
				{
					Object key = keys.nextElement() ;
					context.remove( key ) ;
				}
				contexts.remove( context ) ;
			}
			contexts = new java.util.Hashtable() ;
		}
		catch( Exception ex )
		{
			ex.printStackTrace() ;
		}
		System.gc() ;
	}

}