Package com.dottydingo.hyperion.service.pipeline

Source Code of com.dottydingo.hyperion.service.pipeline.HyperionCompletionCallback

package com.dottydingo.hyperion.service.pipeline;

import com.dottydingo.hyperion.exception.HyperionException;
import com.dottydingo.hyperion.exception.InternalException;
import com.dottydingo.hyperion.api.ErrorResponse;
import com.dottydingo.hyperion.service.marshall.EndpointMarshaller;
import com.dottydingo.hyperion.service.context.HyperionContext;
import com.dottydingo.service.endpoint.CompletionCallback;
import com.dottydingo.service.endpoint.context.EndpointResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.PrintWriter;
import java.io.StringWriter;

/**
*/
public class HyperionCompletionCallback implements CompletionCallback<HyperionContext>
{
    private Logger logger = LoggerFactory.getLogger(HyperionCompletionCallback.class);

    private EndpointMarshaller endpointMarshaller;

    public void setEndpointMarshaller(EndpointMarshaller endpointMarshaller)
    {
        this.endpointMarshaller = endpointMarshaller;
    }

    @Override
    public void onComplete(HyperionContext context)
    {

        EndpointResponse response = context.getEndpointResponse();

        Throwable error = context.getError();
        if(error != null)
        {
            Throwable cause = getCause(error);

            int status = 500;

            if(error instanceof HyperionException)
            {
                status = ((HyperionException)error).getStatusCode();
            }

            if(status == 500)
                logger.error(cause.getMessage(),cause);
            else
                logger.info(cause.getMessage());


            if(!context.isTimedOut())
            {
                response.setResponseCode(status);

                response.setContentEncoding("UTF-8");
                response.setContentType("application/json");

                ErrorResponse errorResponse = new ErrorResponse();
                errorResponse.setStatusCode(response.getResponseCode());
                errorResponse.setMessage(error.getMessage());
                if (status == 500 || context.getShowErrorDetail())
                    errorResponse.setStackTrace(buildStackTrace(cause));

                String exceptionType = error.getClass().getName();
                if (!(error instanceof HyperionException))
                    exceptionType = InternalException.class.getName();
                else
                    errorResponse.setErrorDetails(((HyperionException) error).getErrorDetails());

                errorResponse.setType(exceptionType);

                endpointMarshaller.marshall(response.getOutputStream(), errorResponse);
            }
        }

    }

    private Throwable getCause(Throwable t)
    {
        Throwable cause = t;
        while (cause.getCause() != null)
        {
            cause = cause.getCause();
        }

        return cause;
    }

    private String buildStackTrace(Throwable t)
    {
        StringWriter stringWriter = new StringWriter();
        PrintWriter printWriter = new PrintWriter(stringWriter);
        t.printStackTrace(printWriter);
        printWriter.flush();
        return stringWriter.toString();
    }
}
TOP

Related Classes of com.dottydingo.hyperion.service.pipeline.HyperionCompletionCallback

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.