Search in sources :

Example 6 with ThrowableArtifact

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

the class EjbRequestHandler method setResponseError.

private EJBResponse setResponseError(final EJBResponse res, final byte version, final Throwable error, final String message) {
    // This is fatal for the client, but not the server.
    if (LOGGER.isInfoEnabled()) {
        LOGGER.info(message + " - Enable DEBUG for stacktrace: " + error);
    } else if (LOGGER.isDebugEnabled()) {
        LOGGER.debug(message, error);
    }
    final RemoteException re = new RemoteException(message, error);
    res.setResponse(version, ResponseCodes.EJB_ERROR, new ThrowableArtifact(re));
    return res;
}
Also used : ThrowableArtifact(org.apache.openejb.client.ThrowableArtifact) RemoteException(java.rmi.RemoteException)

Example 7 with ThrowableArtifact

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

ThrowableArtifact (org.apache.openejb.client.ThrowableArtifact)7 NameNotFoundException (javax.naming.NameNotFoundException)4 NamingException (javax.naming.NamingException)4 RemoteException (java.rmi.RemoteException)3 BeanContext (org.apache.openejb.BeanContext)3 Context (javax.naming.Context)2 ProxyInfo (org.apache.openejb.ProxyInfo)2 JNDIRequest (org.apache.openejb.client.JNDIRequest)2 JNDIResponse (org.apache.openejb.client.JNDIResponse)2 IvmContext (org.apache.openejb.core.ivm.naming.IvmContext)2 Field (java.lang.reflect.Field)1 Method (java.lang.reflect.Method)1 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 List (java.util.List)1 Queue (java.util.Queue)1 ConnectionFactory (javax.jms.ConnectionFactory)1 Topic (javax.jms.Topic)1 NameClassPair (javax.naming.NameClassPair)1 Referenceable (javax.resource.Referenceable)1