Methods Summary |
---|
public abstract java.lang.Object | createLocalProxy(java.lang.Object id)
|
protected void | createMethodMap()
super.createMethodMap();
try
{
RemoteHome home = (RemoteHome) resolveAnnotation(RemoteHome.class);
if (home != null)
{
Method[] declaredMethods = home.value().getMethods();
for (int i = 0; i < declaredMethods.length; i++)
{
long hash = MethodHashing.methodHash(declaredMethods[i]);
advisedMethods.put(hash, declaredMethods[i]);
}
declaredMethods = javax.ejb.EJBObject.class.getMethods();
for (int i = 0; i < declaredMethods.length; i++)
{
long hash = MethodHashing.methodHash(declaredMethods[i]);
advisedMethods.put(hash, declaredMethods[i]);
}
}
LocalHome localHome = (LocalHome) resolveAnnotation(LocalHome.class);
if (localHome != null)
{
Method[] declaredMethods = localHome.value().getMethods();
for (int i = 0; i < declaredMethods.length; i++)
{
long hash = MethodHashing.methodHash(declaredMethods[i]);
advisedMethods.put(hash, declaredMethods[i]);
}
declaredMethods = javax.ejb.EJBLocalObject.class.getMethods();
for (int i = 0; i < declaredMethods.length; i++)
{
long hash = MethodHashing.methodHash(declaredMethods[i]);
advisedMethods.put(hash, declaredMethods[i]);
}
}
}
catch (Exception e)
{
throw new RuntimeException(e);
}
|
public abstract java.lang.Object | createRemoteProxy(java.lang.Object id)
|
protected abstract java.lang.Object | createSession(java.lang.Class[] initParameterTypes, java.lang.Object[] initParameterValues)Create session to an EJB bean.
|
protected void | destroySession(java.lang.Object id)Destroy a created session.
throw new RuntimeException("NYI");
|
public java.util.Map | getClusterFamilies()
return clusterFamilies;
|
public java.lang.Class | getInvokedBusinessInterface()
InvokedMethod method = invokedMethod.get();
if (method == null) throw new IllegalStateException("getInvokedBusinessInterface() being invoked outside of a business invocation");
if (method.method == null) throw new IllegalStateException("getInvokedBusinessInterface() being invoked outside of a business invocation");
if (method.isLocalInterface) return method.method.getDeclaringClass();
Class[] remoteInterfaces = ProxyFactoryHelper.getRemoteInterfaces(this);
for (Class intf : remoteInterfaces)
{
try
{
intf.getMethod(method.method.getName(), method.method.getParameterTypes());
return intf;
}
catch (NoSuchMethodException ignored)
{
// continue
}
}
throw new IllegalStateException("Unable to find geInvokedBusinessInterface()");
|
public void | instantiated()
super.instantiated();
proxyDeployer.initializeRemoteBindingMetadata();
proxyDeployer.initializeLocalBindingMetadata();
|
public java.lang.Object | invoke(ProxyFactory factory, java.lang.Object id, java.lang.reflect.Method method, java.lang.Object[] args, org.jboss.aspects.asynch.FutureHolder provider)Invoke a method on the virtual EJB bean. The method must be one of the methods defined in one
of the business interfaces (or home interface) of the bean.
TODO: work in progress
ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
pushEnc();
try
{
long hash = MethodHashing.calculateHash(method);
MethodInfo info = (MethodInfo) methodInterceptors.get(hash);
if (info == null)
{
throw new RuntimeException(
"Could not resolve beanClass method from proxy call: "
+ method.toString());
}
Method unadvisedMethod = info.getUnadvisedMethod();
if (unadvisedMethod != null && isHomeMethod(unadvisedMethod))
{
return invokeHomeMethod(factory, info, args);
}
else if (unadvisedMethod != null && isEJBObjectMethod(unadvisedMethod))
{
return invokeEJBObjectMethod(factory, id, info, args);
}
// FIXME: Ahem, stateful container invocation works on all.... (violating contract though)
EJBContainerInvocation nextInvocation = new StatefulContainerInvocation(info, id);
nextInvocation.setAdvisor(this);
nextInvocation.setArguments(args);
// allow a container to supplement information into an invocation
nextInvocation = populateInvocation(nextInvocation);
ProxyUtils.addLocalAsynchronousInfo(nextInvocation, provider);
try
{
invokedMethod.push(new InvokedMethod(true, method));
return nextInvocation.invokeNext();
}
finally
{
invokedMethod.pop();
}
}
finally
{
Thread.currentThread().setContextClassLoader(oldLoader);
popEnc();
}
|
protected java.lang.Object | invokeEJBObjectMethod(ProxyFactory factory, java.lang.Object id, org.jboss.aop.MethodInfo info, java.lang.Object[] args)
Method unadvisedMethod = info.getUnadvisedMethod();
if(unadvisedMethod.getName().equals("getEJBHome"))
{
return factory.createHomeProxy();
}
if(unadvisedMethod.getName().equals("getPrimaryKey"))
{
return id;
}
if(unadvisedMethod.getName().equals("isIdentical"))
{
// object has no identity
if(id == null)
return false;
EJBObject bean = (EJBObject) args[0];
Object primaryKey = bean.getPrimaryKey();
if(primaryKey == null)
return false;
boolean isIdentical = id.equals(primaryKey);
return isIdentical;
}
if (unadvisedMethod.getName().equals("remove"))
{
destroySession(id);
return null;
}
throw new RuntimeException("NYI");
|
private java.lang.Object | invokeHomeMethod(ProxyFactory factory, org.jboss.aop.MethodInfo info, java.lang.Object[] args)TODO: work in progress (refactor both invokeHomeMethod's, localHomeInvoke)
Method unadvisedMethod = info.getUnadvisedMethod();
if (unadvisedMethod.getName().equals("create"))
{
Class[] initParameterTypes = {};
Object[] initParameterValues = {};
if (unadvisedMethod.getParameterTypes().length > 0)
{
initParameterTypes = unadvisedMethod.getParameterTypes();
initParameterValues = args;
}
Object id = createSession(initParameterTypes, initParameterValues);
Object proxy = factory.createProxy(id);
return proxy;
}
else if (unadvisedMethod.getName().equals("remove"))
{
if(args[0] instanceof Handle)
removeHandle((Handle) args[0]);
else
destroySession(args[0]);
return null;
}
else
{
throw new IllegalArgumentException("illegal home method " + unadvisedMethod);
}
|
protected boolean | isEJBObjectMethod(java.lang.reflect.Method method)
if (method.getDeclaringClass().getName().equals("javax.ejb.EJBObject"))
return true;
if (method.getDeclaringClass().getName().equals("javax.ejb.EJBLocalObject"))
return true;
return false;
|
protected boolean | isHandleMethod(java.lang.reflect.Method method)
if (method.getDeclaringClass().getName().equals("javax.ejb.Handle"))
return true;
return false;
|
protected boolean | isHomeMethod(java.lang.reflect.Method method)
if (javax.ejb.EJBHome.class.isAssignableFrom(method.getDeclaringClass())) return true;
if (javax.ejb.EJBLocalHome.class.isAssignableFrom(method.getDeclaringClass())) return true;
return false;
|
public static org.jboss.aop.joinpoint.InvocationResponse | marshallException(org.jboss.aop.joinpoint.Invocation invocation, java.lang.Throwable exception, java.util.Map responseContext)
if (!invocation.getMetaData().hasTag(IsLocalInterceptor.IS_LOCAL)) throw exception;
InvocationResponse response = new InvocationResponse();
response.setContextInfo(responseContext);
response.addAttachment(IsLocalInterceptor.IS_LOCAL_EXCEPTION, new MarshalledObjectForLocalCalls(exception));
return response;
|
public static org.jboss.aop.joinpoint.InvocationResponse | marshallResponse(org.jboss.aop.joinpoint.Invocation invocation, java.lang.Object rtn, java.util.Map responseContext)
InvocationResponse response;
// marshall return value
if (rtn != null && invocation.getMetaData().hasTag(IsLocalInterceptor.IS_LOCAL))
{
response = new InvocationResponse(new MarshalledObjectForLocalCalls(rtn));
}
else
{
response = new InvocationResponse(rtn);
}
response.setContextInfo(responseContext);
return response;
|
protected EJBContainerInvocation | populateInvocation(EJBContainerInvocation invocation)Allow a container sub class to supplement an invocation. Per default nothing to supplement.
return invocation;
|
public void | processMetadata(DependencyPolicy dependencyPolicy)
super.processMetadata(dependencyPolicy);
|
protected abstract void | removeHandle(javax.ejb.Handle handle)
|
public void | start()
super.start();
// So that Remoting layer can reference this container easily.
Dispatcher.singleton.registerTarget(getObjectName().getCanonicalName(), this);
proxyDeployer.start();
|
public void | stop()
try
{
proxyDeployer.stop();
}
catch (Exception ignore)
{
log.trace("Proxy deployer stop failed", ignore);
}
try
{
Dispatcher.singleton.unregisterTarget(getObjectName().getCanonicalName());
}
catch (Exception ignore)
{
log.trace("Dispatcher unregister target failed", ignore);
}
super.stop();
|