Search in sources :

Example 1 with EJBResponse

use of org.apache.openejb.client.EJBResponse in project tomee by apache.

the class EjbRequestHandler method processResponse.

@Override
public void processResponse(final Response response, final ObjectOutputStream out, final ProtocolMetaData metaData) throws Exception {
    if (EJBResponse.class.isInstance(response)) {
        final EJBResponse res = (EJBResponse) response;
        try {
            res.setMetaData(metaData);
            res.writeExternal(out);
        } catch (Throwable t) {
            if (LOGGER.isDebugEnabled()) {
                LOGGER.debug("Failed to write EjbResponse", t);
            } else if (LOGGER.isInfoEnabled()) {
                LOGGER.info("Failed to write EjbResponse - Debug for stacktrace: " + t);
            }
        } finally {
            try {
                SystemInstance.get().getComponent(SecurityService.class).disassociate();
            } catch (Throwable t) {
                LOGGER.warning("Failed to disassociate security", t);
            }
            final CallContext call = CallContext.getCallContext();
            if (null != call) {
                call.reset();
            }
            EJBHomeProxyHandle.resolver.set(null);
            EJBObjectProxyHandle.resolver.set(null);
        }
    } else {
        LOGGER.error("EjbRequestHandler cannot process an instance of: " + response.getClass().getName());
    }
}
Also used : SecurityService(org.apache.openejb.spi.SecurityService) EJBResponse(org.apache.openejb.client.EJBResponse)

Example 2 with EJBResponse

use of org.apache.openejb.client.EJBResponse 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)

Aggregations

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