Search in sources :

Example 1 with CountingOutputStream

use of org.apache.openejb.server.stream.CountingOutputStream in project tomee by apache.

the class EjbDaemon method service.

public void service(final InputStream rawIn, final OutputStream rawOut) throws IOException {
    final ProtocolMetaData clientProtocol = new ProtocolMetaData();
    ObjectInputStream ois = null;
    ObjectOutputStream oos = null;
    RequestType requestType = null;
    byte requestTypeByte = RequestType.NOP_REQUEST.getCode();
    try {
        final RequestInfos.RequestInfo info = RequestInfos.info();
        info.setInputStream(countStreams ? new CountingInputStream(rawIn) : rawIn);
        // Read client Protocol Version
        final InputStream cis = info.getInputStream();
        clientProtocol.readExternal(cis);
        ois = new EjbObjectInputStream(cis);
        // Read ServerMetaData
        final ServerMetaData serverMetaData = new ServerMetaData();
        serverMetaData.readExternal(ois);
        ClientObjectFactory.serverMetaData.set(serverMetaData);
        // Read request type
        requestTypeByte = ois.readByte();
        requestType = RequestType.valueOf(requestTypeByte);
        if (requestType == RequestType.NOP_REQUEST) {
            return;
        }
        ClusterResponse clusterResponse = null;
        if (requestType == RequestType.CLUSTER_REQUEST) {
            clusterResponse = clusterHandler.processRequest(ois, clientProtocol);
            //Check for immediate failure
            final Throwable failure = clusterResponse.getFailure();
            if (null != clusterResponse && null != failure) {
                clusterHandler.getLogger().debug("Failed to write to ClusterResponse", failure);
                try {
                    info.setOutputStream(countStreams ? new CountingOutputStream(rawOut) : rawOut);
                    oos = new ObjectOutputStream(info.getOutputStream());
                    clusterResponse.setMetaData(clientProtocol);
                    clusterResponse.writeExternal(oos);
                    oos.flush();
                } catch (IOException ie) {
                    final String m = "Failed to write to ClusterResponse: " + ie.getMessage();
                    clusterHandler.getLogger().error(m, ie);
                    throw Exceptions.newIOException(m, ie);
                }
                throw failure;
            }
        }
        requestTypeByte = ois.readByte();
        requestType = RequestType.valueOf(requestTypeByte);
        if (requestType == RequestType.NOP_REQUEST) {
            return;
        }
        // Exceptions should not be thrown from these methods
        // They should handle their own exceptions and clean
        // things up with the client accordingly.
        final Response response;
        switch(requestType) {
            case EJB_REQUEST:
                response = processEjbRequest(ois, clientProtocol);
                break;
            case JNDI_REQUEST:
                response = processJndiRequest(ois, clientProtocol);
                break;
            case AUTH_REQUEST:
                response = processAuthRequest(ois, clientProtocol);
                break;
            case LOGOUT_REQUEST:
                response = processLogoutRequest(ois, clientProtocol);
                break;
            default:
                logger.error("\"" + requestType + " " + clientProtocol.getSpec() + "\" FAIL \"Unknown request type " + requestType);
                return;
        }
        try {
            info.setOutputStream(countStreams ? new CountingOutputStream(rawOut) : rawOut);
            final OutputStream cos = info.getOutputStream();
            //Let client know we are using the requested protocol to respond
            clientProtocol.writeExternal(cos);
            cos.flush();
            oos = new ObjectOutputStream(cos);
            clusterHandler.processResponse(clusterResponse, oos, clientProtocol);
            oos.flush();
        } finally {
            switch(requestType) {
                case EJB_REQUEST:
                    processEjbResponse(response, oos, clientProtocol);
                    break;
                case JNDI_REQUEST:
                    processJndiResponse(response, oos, clientProtocol);
                    break;
                case AUTH_REQUEST:
                    processAuthResponse(response, oos, clientProtocol);
                    break;
                case LOGOUT_REQUEST:
                    processLogoutResponse(response, oos, clientProtocol);
                    break;
                default:
                    //Should never get here...
                    logger.error("\"" + requestType + " " + clientProtocol.getSpec() + "\" FAIL \"Unknown response type " + requestType);
            }
        }
    } catch (IllegalArgumentException iae) {
        final String msg = "\"" + clientProtocol.getSpec() + "\" FAIL \"Unknown request type " + requestTypeByte;
        if (logger.isDebugEnabled()) {
            logger.debug(msg, iae);
        } else {
            logger.warning(msg + " - Debug for StackTrace");
        }
    } catch (SecurityException e) {
        final String msg = "\"" + requestType + " " + clientProtocol.getSpec() + "\" FAIL \"Security error - " + e.getMessage() + "\"";
        if (logger.isDebugEnabled()) {
            logger.debug(msg, e);
        } else {
            logger.warning(msg + " - Debug for StackTrace");
        }
    } catch (Throwable e) {
        final String msg = "\"" + requestType + " " + clientProtocol.getSpec() + "\" FAIL \"Unexpected error - " + e.getMessage() + "\"";
        if (logger.isDebugEnabled()) {
            logger.debug(msg, e);
        } else {
            logger.warning(msg + " - Debug for StackTrace");
        }
    } finally {
        try {
            ClientObjectFactory.serverMetaData.remove();
        } finally {
            if (null != oos) {
                try {
                    oos.flush();
                } catch (Throwable e) {
                //Ignore
                }
                try {
                    oos.close();
                } catch (Throwable e) {
                //Ignore
                }
            }
            if (null != ois) {
                try {
                    ois.close();
                } catch (Throwable e) {
                //Ignore
                }
            }
            // enforced in case of exception
            securityService.disassociate();
        }
    }
}
Also used : GZIPInputStream(java.util.zip.GZIPInputStream) BufferedInputStream(java.io.BufferedInputStream) ObjectInputStream(java.io.ObjectInputStream) EjbObjectInputStream(org.apache.openejb.client.EjbObjectInputStream) CountingInputStream(org.apache.openejb.server.stream.CountingInputStream) InputStream(java.io.InputStream) FlushableGZIPOutputStream(org.apache.openejb.client.FlushableGZIPOutputStream) BufferedOutputStream(java.io.BufferedOutputStream) ObjectOutputStream(java.io.ObjectOutputStream) OutputStream(java.io.OutputStream) CountingOutputStream(org.apache.openejb.server.stream.CountingOutputStream) CountingInputStream(org.apache.openejb.server.stream.CountingInputStream) ClusterResponse(org.apache.openejb.client.ClusterResponse) IOException(java.io.IOException) ObjectOutputStream(java.io.ObjectOutputStream) Response(org.apache.openejb.client.Response) ClusterResponse(org.apache.openejb.client.ClusterResponse) CountingOutputStream(org.apache.openejb.server.stream.CountingOutputStream) RequestInfos(org.apache.openejb.server.context.RequestInfos) EjbObjectInputStream(org.apache.openejb.client.EjbObjectInputStream) ProtocolMetaData(org.apache.openejb.client.ProtocolMetaData) ServerMetaData(org.apache.openejb.client.ServerMetaData) ObjectInputStream(java.io.ObjectInputStream) EjbObjectInputStream(org.apache.openejb.client.EjbObjectInputStream) RequestType(org.apache.openejb.client.RequestType)

Example 2 with CountingOutputStream

use of org.apache.openejb.server.stream.CountingOutputStream in project tomee by apache.

the class OpenEJBHttpServer method service.

@Override
public void service(final Socket socket) throws ServiceException, IOException {
    /**
         * The InputStream used to receive incoming messages from the client.
         */
    InputStream in = null;
    /**
         * The OutputStream used to send outgoing response messages to the client.
         */
    OutputStream out = null;
    boolean close = true;
    try {
        RequestInfos.initRequestInfo(socket);
        if (countStreams) {
            in = new CountingInputStream(socket.getInputStream());
            out = new CountingOutputStream(socket.getOutputStream());
        } else {
            in = socket.getInputStream();
            out = socket.getOutputStream();
        }
        //TODO: if ssl change to https
        final URI socketURI = new URI("http://" + socket.getLocalAddress().getHostAddress() + ":" + socket.getLocalPort());
        close = processRequest(socket, socketURI, in, out);
    } catch (final Throwable e) {
        log.error("Unexpected error", e);
    } finally {
        if (close) {
            if (out != null) {
                try {
                    out.flush();
                } catch (Throwable e) {
                //Ignore
                }
                try {
                    out.close();
                } catch (Throwable e) {
                //Ignore
                }
            }
            if (in != null) {
                try {
                    in.close();
                } catch (Throwable e) {
                //Ignore
                }
            }
            try {
                socket.close();
            } catch (Throwable e) {
                log.error("Encountered problem while closing connection with client: " + e.getMessage());
            }
        }
    }
}
Also used : CountingOutputStream(org.apache.openejb.server.stream.CountingOutputStream) CountingInputStream(org.apache.openejb.server.stream.CountingInputStream) InputStream(java.io.InputStream) OutputStream(java.io.OutputStream) CountingOutputStream(org.apache.openejb.server.stream.CountingOutputStream) CountingInputStream(org.apache.openejb.server.stream.CountingInputStream) URI(java.net.URI)

Aggregations

InputStream (java.io.InputStream)2 OutputStream (java.io.OutputStream)2 CountingInputStream (org.apache.openejb.server.stream.CountingInputStream)2 CountingOutputStream (org.apache.openejb.server.stream.CountingOutputStream)2 BufferedInputStream (java.io.BufferedInputStream)1 BufferedOutputStream (java.io.BufferedOutputStream)1 IOException (java.io.IOException)1 ObjectInputStream (java.io.ObjectInputStream)1 ObjectOutputStream (java.io.ObjectOutputStream)1 URI (java.net.URI)1 GZIPInputStream (java.util.zip.GZIPInputStream)1 ClusterResponse (org.apache.openejb.client.ClusterResponse)1 EjbObjectInputStream (org.apache.openejb.client.EjbObjectInputStream)1 FlushableGZIPOutputStream (org.apache.openejb.client.FlushableGZIPOutputStream)1 ProtocolMetaData (org.apache.openejb.client.ProtocolMetaData)1 RequestType (org.apache.openejb.client.RequestType)1 Response (org.apache.openejb.client.Response)1 ServerMetaData (org.apache.openejb.client.ServerMetaData)1 RequestInfos (org.apache.openejb.server.context.RequestInfos)1