001: package net.sourceforge.jaxor.util;
002:
003: import java.io.Serializable;
004: import java.lang.reflect.InvocationHandler;
005: import java.lang.reflect.InvocationTargetException;
006: import java.lang.reflect.Method;
007: import java.lang.reflect.Proxy;
008:
009: /*
010: * User: Mike
011: * Date: Nov 10, 2002
012: * Time: 12:12:34 PM
013: */
014:
015: public class DynamicDecorator implements InvocationHandler,
016: Serializable {
017: private final Object _delegate;
018: private final Override[] _list;
019:
020: public static Object create(Object delegate, Override override) {
021: return create(delegate, new Override[] { override });
022: }
023:
024: public static Object create(Object delegate, Override[] list) {
025: return create(delegate.getClass().getClassLoader(), delegate,
026: delegate.getClass().getInterfaces(), list);
027: }
028:
029: public static Object create(ClassLoader loader, Object delegate,
030: Class[] interfaces, Override list) {
031: return Proxy
032: .newProxyInstance(loader, interfaces,
033: new DynamicDecorator(delegate,
034: new Override[] { list }));
035: }
036:
037: public static Object create(ClassLoader loader, Object delegate,
038: Class[] interfaces, Override[] list) {
039: return Proxy.newProxyInstance(loader, interfaces,
040: new DynamicDecorator(delegate, list));
041: }
042:
043: private DynamicDecorator(Object delegate, Override[] list) {
044: _delegate = delegate;
045: _list = list;
046: }
047:
048: public Object invoke(Object proxy, Method method, Object[] args)
049: throws Throwable {
050: try {
051: Override over = findOverride(method);
052: if (over != null)
053: return over.invokeSuper(_delegate, args, method);
054: return method.invoke(_delegate, args);
055: } catch (InvocationTargetException targetExc) {
056: throw targetExc.getTargetException();
057: }
058: }
059:
060: private Override findOverride(Method method) {
061: for (int i = 0; i < _list.length; i++) {
062: Override override = _list[i];
063: if (override.equalsMethod(method))
064: return override;
065: }
066: return null;
067: }
068:
069: public static class Override {
070: private String _method;
071: private Class[] _args;
072:
073: public Override(String methodName, Class[] args) {
074: _method = methodName;
075: _args = args;
076: }
077:
078: public Object invokeSuper(Object delegate, Object[] args,
079: Method method) throws Throwable {
080: try {
081: return invoke(delegate, args, method);
082: } catch (InvocationTargetException targetExc) {
083: throw targetExc.getTargetException();
084: }
085: }
086:
087: protected Object invoke(Object delegate, Object[] args,
088: Method method) throws Throwable {
089: return NullProxy.getDefaultInstance(method.getReturnType());
090: }
091:
092: public boolean equalsMethod(Method method) {
093: if (_method.equals(method.getName())) {
094: Class[] mArgs = method.getParameterTypes();
095: if (mArgs.length != _args.length)
096: return false;
097: for (int j = 0; j < mArgs.length; j++) {
098: if (!mArgs[j].equals(_args[j]))
099: return false;
100: }
101: return true;
102: }
103: return false;
104: }
105: }
106:
107: }
|