blob: ce26d37321dde3aea211b040cb7f180651c20071 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006 Oracle Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Oracle Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.bpel.ui.util;
import java.lang.reflect.Method;
/**
* This is a good example of a dynamic proxy in Java.
*
* @author Michal Chmielewski (michal.chmielewski@oracle.com)
* @date Nov 3, 2006
*
*/
public class Gate implements IGate, java.lang.reflect.InvocationHandler {
private Object fObj;
/**
* Should access be synchronized around the proxy object.
*/
boolean bSync = false;
/**
* Is the Gate armed ? If so, no traffic is allowed.
*/
boolean fArmed = false;
/**
* Create a new instance of an IGate that also responds to the
* protocol of the object passed.
*
* @param obj whose method access will be gated.
* @return a new instance of the dynamic proxy
*/
public static final Object newInstance ( Object obj ) {
return newInstance ( obj, false );
}
/**
* Create a new instance of an IGate that also responds to the
* protocol of the object passed.
*
* @param obj whose method access will be gated.
* @param sync if set to true, method invocations will be synchronized.
* @return a new instance of the dynamic proxy
*/
public static final Object newInstance ( Object obj , boolean sync) {
Class[] i1 = obj.getClass().getInterfaces();
Class[] i2 = new Class[] { IGate.class };
Class[] iA = new Class[ i1.length + i2.length ];
System.arraycopy(i1, 0, iA, 0, i1.length);
System.arraycopy(i2, 0, iA, i1.length, i2.length);
return java.lang.reflect.Proxy.newProxyInstance(
obj.getClass().getClassLoader(),
iA,
new Gate(obj, sync) );
}
/**
* Private constructor, so the only way to get instances is via
* newInstance().
*
* @param obj
* @param sync
*/
Gate (Object obj, boolean sync) {
fObj = obj;
bSync = sync;
}
/**
* The invocation handler of the dynamic proxy.
*
* @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
*/
public Object invoke (Object proxy, Method m, Object[] args) throws Throwable
{
try {
// if the method invocation succeeds on us, then the method was
// on one of the interfaces that we implement. Otherwise, it is
return m.invoke(this, args);
} catch (Throwable t) {
// not for us; fall through, continue proxy execution.
}
if (fArmed) {
return null;
}
if (bSync) {
synchronized (fObj) {
return m.invoke(fObj,args);
}
}
return m.invoke(fObj, args);
}
/** (non-Javadoc)
* @see org.eclipse.bpel.ui.util.IGate#off()
*/
public void off() {
fArmed = false;
}
/** (non-Javadoc)
* @see org.eclipse.bpel.ui.util.IGate#on()
*/
public void on() {
fArmed = true;
}
}