commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Jack, Paul" <pj...@sfaf.org>
Subject RE: [Collections][SUBMIT] TypedList
Date Tue, 23 Apr 2002 16:16:25 GMT
> The way I did this was:
> 
> TypedStructure interface. AbstractTypedStructure class.
> IllegalTypeException exception.
> 
> Then TypedSet/List/Map implement Set/List/Map and extend
> AbstractTypedStructure.

Hehehehe...we *could* use dynamic proxy classes to provide 
one factory method that would work for all collections and
maps...

This isn't a serious suggestion, just proof that I have way
too much time on my hands...

-Paul


package org.apache.commons.collections;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
import java.util.HashSet;


public class PredicateCollectionFactory
{

	static class PredicateInvocationHandler implements InvocationHandler
	{
		private Predicate predicate;
		private Object target;


		public PredicateInvocationHandler(Object target, Predicate
predicate)
		{
			this.target = target;
			this.predicate = predicate;
		}


		public Object invoke(Object proxy, Method method, Object[]
parameters) throws Throwable
		{
			if (method.getName().equals("equals"))
			{
				return defaultInvoke(target, method,
parameters);
			}
			Class[] types = method.getParameterTypes();
			for (int i = 0; i < types.length; i++)
			{
				if ((types[i] == Object.class) &&
!predicate.evaluate(parameters[i]))
				{
					throw new
IllegalArgumentException();
				}
			}
			return defaultInvoke(target, method, parameters);
		}


		static Object defaultInvoke(Object target, Method method,
Object[] parameters) throws Throwable
		{
			try
			{
				return method.invoke(target, parameters);
			}
			catch (InvocationTargetException e)
			{
				throw e.getTargetException();
			}
		}
	}


	private static Class[] getAllInterfaces(Object object)
	{
		HashSet set = new HashSet();
		for (Class c = object.getClass(); c != null; c =
c.getSuperclass())
		{
			set.addAll(Arrays.asList(c.getInterfaces()));
		}
		return (Class[])set.toArray(new Class[set.size()]);
	}


	public static Object create(Object collection, Predicate predicate)
	{
		InvocationHandler handler = new
PredicateInvocationHandler(collection, predicate);
		Class[] interfaces = getAllInterfaces(collection);
		ClassLoader loader =
PredicateCollectionFactory.class.getClassLoader();
		return Proxy.newProxyInstance(loader, interfaces, handler);
	}


	// Example usage...
	public static void main(String args[])
	{
		java.util.List list = new java.util.ArrayList();
		Predicate predicate = new Predicate() {
			public boolean evaluate(Object object)
			{
				return (object instanceof String);
			}
		};
		list = (java.util.List)create(list, predicate);
		list.add("Hello, nurse!");  // works fine
		list.add(new Integer(4)); // will raise
IllegalArgumentException
	}

}


--
To unsubscribe, e-mail:   <mailto:commons-dev-unsubscribe@jakarta.apache.org>
For additional commands, e-mail: <mailto:commons-dev-help@jakarta.apache.org>


Mime
View raw message