use of org.apache.openejb.client.EJBRequest in project tomee by apache.
the class EjbRequestHandler method processRequest.
@Override
public Response processRequest(final ObjectInputStream in, final ProtocolMetaData metaData) throws Exception {
// Setup the client proxy replacement to replace
// the proxies with the IntraVM proxy implementations
EJBHomeProxyHandle.resolver.set(SERVER_SIDE_RESOLVER);
EJBObjectProxyHandle.resolver.set(SERVER_SIDE_RESOLVER);
final EJBRequest req = new EJBRequest();
req.setMetaData(metaData);
byte version = req.getVersion();
final EJBResponse res = new EJBResponse();
res.setMetaData(metaData);
res.start(EJBResponse.Time.TOTAL);
res.setRequest(req);
try {
req.readExternal(in);
} catch (Throwable t) {
return setResponseError(res, version, t, "Bad request");
}
final SecurityService securityService = SystemInstance.get().getComponent(SecurityService.class);
boolean failed = false;
final CallContext call;
Object clientIdentity = null;
try {
try {
clientIdentity = req.getClientIdentity();
if (clientIdentity != null) {
//noinspection unchecked
securityService.associate(clientIdentity);
}
} catch (LoginException t) {
failed = true;
return setResponseError(res, version, t, "Client identity is not valid - " + req);
}
final BeanContext di;
try {
di = this.daemon.getDeployment(req);
} catch (RemoteException e) {
failed = true;
return setResponseError(res, version, e, "No such deployment");
} catch (Throwable t) {
failed = true;
return setResponseError(res, version, t, "Unkown error occured while retrieving deployment: " + req);
}
try {
//Need to set this for deserialization of the body - Will always be reset by EjbDaemon
final ClassLoader classLoader = di.getBeanClass().getClassLoader();
Thread.currentThread().setContextClassLoader(classLoader);
res.start(EJBResponse.Time.DESERIALIZATION);
req.getBody().readExternal(in);
//Client version retrieved from body
version = req.getVersion();
res.stop(EJBResponse.Time.DESERIALIZATION);
} catch (Throwable t) {
failed = true;
return setResponseError(res, version, t, "Error caught during request body deserialization: " + req);
}
try {
call = CallContext.getCallContext();
call.setEJBRequest(req);
call.setBeanContext(di);
} catch (Throwable t) {
failed = true;
return setResponseError(res, version, t, "Unable to set the thread call context for this request: " + req);
}
} finally {
if (clientIdentity != null && failed) {
securityService.disassociate();
}
}
res.start(EJBResponse.Time.CONTAINER);
Object securityToken = null;
try {
final JNDIContext.AuthenticationInfo authentication = req.getBody().getAuthentication();
if (authentication != null) {
try {
securityToken = securityService.login(authentication.getRealm(), authentication.getUser(), new String(authentication.getPassword()));
} catch (final Throwable t) {
res.setResponse(req.getVersion(), ResponseCodes.AUTH_DENIED, t);
}
}
if (res.getResponseCode() != ResponseCodes.AUTH_DENIED) {
switch(req.getRequestMethod()) {
// Remote interface methods
case EJB_OBJECT_BUSINESS_METHOD:
doEjbObject_BUSINESS_METHOD(req, res);
updateServer(req, res);
break;
// Home interface methods
case EJB_HOME_CREATE:
doEjbHome_CREATE(req, res);
updateServer(req, res);
break;
// Home interface methods
case EJB_HOME_METHOD:
doEjbHome_METHOD(req, res);
updateServer(req, res);
break;
case EJB_HOME_FIND:
doEjbHome_FIND(req, res);
updateServer(req, res);
break;
// javax.ejb.EJBObject methods
case EJB_OBJECT_GET_EJB_HOME:
doEjbObject_GET_EJB_HOME(req, res);
updateServer(req, res);
break;
case EJB_OBJECT_GET_HANDLE:
doEjbObject_GET_HANDLE(req, res);
updateServer(req, res);
break;
case EJB_OBJECT_GET_PRIMARY_KEY:
doEjbObject_GET_PRIMARY_KEY(req, res);
updateServer(req, res);
break;
case EJB_OBJECT_IS_IDENTICAL:
doEjbObject_IS_IDENTICAL(req, res);
updateServer(req, res);
break;
case EJB_OBJECT_REMOVE:
doEjbObject_REMOVE(req, res);
break;
// javax.ejb.EJBHome methods
case EJB_HOME_GET_EJB_META_DATA:
doEjbHome_GET_EJB_META_DATA(req, res);
updateServer(req, res);
break;
case EJB_HOME_GET_HOME_HANDLE:
doEjbHome_GET_HOME_HANDLE(req, res);
updateServer(req, res);
break;
case EJB_HOME_REMOVE_BY_HANDLE:
doEjbHome_REMOVE_BY_HANDLE(req, res);
break;
case EJB_HOME_REMOVE_BY_PKEY:
doEjbHome_REMOVE_BY_PKEY(req, res);
break;
case FUTURE_CANCEL:
doFUTURE_CANCEL_METHOD(req, res);
break;
default:
throw new org.apache.openejb.SystemException("Unexpected request method: " + req.getRequestMethod());
}
}
} catch (org.apache.openejb.InvalidateReferenceException e) {
res.setResponse(version, ResponseCodes.EJB_SYS_EXCEPTION, new ThrowableArtifact(e.getRootCause()));
} catch (org.apache.openejb.ApplicationException e) {
res.setResponse(version, ResponseCodes.EJB_APP_EXCEPTION, new ThrowableArtifact(e.getRootCause()));
} catch (org.apache.openejb.SystemException e) {
res.setResponse(version, ResponseCodes.EJB_ERROR, new ThrowableArtifact(e.getRootCause()));
logger.error("System error in container for request: " + req, e);
} catch (Throwable t) {
return setResponseError(res, version, t, "Unknown error in container");
} finally {
if (securityToken != null) {
try {
//noinspection unchecked
securityService.logout(securityToken);
} catch (final LoginException e) {
// no-op
}
}
try {
res.stop(EJBResponse.Time.CONTAINER);
} catch (Throwable e) {
//Ignore
}
if (logger.isDebugEnabled()) {
//The req and res toString overrides are volatile
try {
logger.debug("EJB REQUEST: " + req + " -- RESPONSE: " + res);
} catch (Throwable t) {
//Ignore
}
}
}
return res;
}
use of org.apache.openejb.client.EJBRequest in project tomee by apache.
the class DeploymentIndexTest method testGetDeploymentEJBRequestRemoteException.
@Test(expected = RemoteException.class)
public void testGetDeploymentEJBRequestRemoteException() throws RemoteException {
// 0 causes DeploymentIndex to move further
final EJBMetaDataImpl ejbMetadata = new EJBMetaDataImpl(null, null, null, null, null, 0, InterfaceType.BUSINESS_REMOTE, null, null);
final EJBRequest request = new EJBRequest(null, ejbMetadata, method, null, null, null);
deploymentIndex.getDeployment(request);
}
use of org.apache.openejb.client.EJBRequest in project tomee by apache.
the class DeploymentIndexTest method testGetDeploymentEJBRequest.
@Test
public void testGetDeploymentEJBRequest() throws RemoteException {
final EJBMetaDataImpl ejbMetadataWithId = new EJBMetaDataImpl(null, null, null, null, null, 1, InterfaceType.BUSINESS_REMOTE, null, null);
final EJBRequest request = new EJBRequest(null, ejbMetadataWithId, method, null, null, null);
final BeanContext info = deploymentIndex.getDeployment(request);
Assert.assertEquals(beanContext, info);
Assert.assertEquals(request.getDeploymentId(), info.getDeploymentID());
}
Aggregations