package com.technofovea.hllib;
import com.technofovea.hllib.methods.FullLibrary;
import com.technofovea.hllib.methods.ManagedCalls;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
class InvocationManager implements InvocationHandler {
private static final Logger logger = LoggerFactory.getLogger(InvocationManager.class);
FullLibrary delegate;
ManagedCallImpl lackey;
InvocationManager(FullLibrary target) {
super();
this.delegate = target;
lackey = new ManagedCallImpl(this.delegate);
}
@Override
protected void finalize() throws Throwable {
delegate.shutdown();
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (args == null) {
args = new Object[0];
}
logger.trace("New invocation: "+method.getName());
// Depending on what comes in, normally target the libarary instance or
// else retarget to our managed call implementation.
Object target = delegate;
Object result = null;
// Anything declared in ManagedLibrary or sub-interfaces is something we
// must intercept and re-target.
if (ManagedCalls.class.isAssignableFrom(method.getDeclaringClass())) {
logger.trace("Is a managed call.");
target = lackey;
}else{
logger.trace("Is not a managed call.");
}
try {
boolean ok = preHook(proxy, method, args, target);
if (!ok) {
logger.trace("Pre-hook prevented method run");
return null;
}
result = method.invoke(target, args);
postHook(proxy, method, args, target, result);
} catch (InvocationTargetException e) {
throw e.getTargetException();
} catch (Exception e) {
throw new RuntimeException("unexpected invocation exception: " + e.getMessage(), e);
} finally {
}
return result;
}
boolean preHook(Object proxy, Method method, Object[] args, Object target) {
return true;
}
void postHook(Object proxy, Method method, Object[] args, Object target, Object result) {
// Check bind, create, close, and delete for package
if (method.getName().equals("createPackage") && (result instanceof HlPackage)) {
logger.trace("Automatically rebinding package after creation");
lackey.setCurrentPackage((HlPackage) result);
} else if (method.getName().equals("bindPackage") && Boolean.TRUE.equals(result)) {
HlPackage pkg = (HlPackage) args[0];
lackey.addPackage(pkg);
lackey.setCurrentPackage(pkg);
}
}
}