Search in sources :

Example 1 with EJBRequest

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;
}
Also used : ThrowableArtifact(org.apache.openejb.client.ThrowableArtifact) JNDIContext(org.apache.openejb.client.JNDIContext) EJBResponse(org.apache.openejb.client.EJBResponse) BeanContext(org.apache.openejb.BeanContext) SecurityService(org.apache.openejb.spi.SecurityService) LoginException(javax.security.auth.login.LoginException) EJBRequest(org.apache.openejb.client.EJBRequest) RemoteException(java.rmi.RemoteException)

Example 2 with EJBRequest

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);
}
Also used : EJBMetaDataImpl(org.apache.openejb.client.EJBMetaDataImpl) EJBRequest(org.apache.openejb.client.EJBRequest) Test(org.junit.Test)

Example 3 with EJBRequest

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());
}
Also used : BeanContext(org.apache.openejb.BeanContext) EJBMetaDataImpl(org.apache.openejb.client.EJBMetaDataImpl) EJBRequest(org.apache.openejb.client.EJBRequest) Test(org.junit.Test)

Aggregations

EJBRequest (org.apache.openejb.client.EJBRequest)3 BeanContext (org.apache.openejb.BeanContext)2 EJBMetaDataImpl (org.apache.openejb.client.EJBMetaDataImpl)2 Test (org.junit.Test)2 RemoteException (java.rmi.RemoteException)1 LoginException (javax.security.auth.login.LoginException)1 EJBResponse (org.apache.openejb.client.EJBResponse)1 JNDIContext (org.apache.openejb.client.JNDIContext)1 ThrowableArtifact (org.apache.openejb.client.ThrowableArtifact)1 SecurityService (org.apache.openejb.spi.SecurityService)1