Subversion Repositories bacoAlunos

Rev

Rev 1732 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

package pt.estgp.estgweb.web.controllers.utils;

import jomm.utils.MessageResources;
import org.apache.log4j.Logger;
import org.apache.struts.action.*;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import pt.estgp.estgweb.web.controllers.ApplicationDispatchController;
import pt.utl.ist.berserk.logic.serviceManager.exceptions.FilterChainFailedException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Iterator;

/**
 * Created by jorgemachado on 27/12/16.
 *
 * Classes extending this Controller must implment the following API in each service
 * and must define the following service names in parameter :
 *
 *    ->"serviceJson"<-
 *
 * when dispatch = executeService
 * JSONObject serviceName(ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Throwable;
 *
 *
 * when dispatch = executeServiceOkFail
 * Boolean serviceName(ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Throwable;
 *
 */

public abstract class AbstractWidgetAjaxController extends ApplicationDispatchController
{
    private static final 1.5.0/docs/api/java/util/logging/Logger.html">Logger logger = 1.5.0/docs/api/java/util/logging/Logger.html">Logger.getLogger(AbstractWidgetAjaxController.class);

    public static final 1.5.0/docs/api/java/lang/String.html">String WIDGET_REPONSE_KEY = "pt.estgp.estgweb.web.controllers.utils.AbstractWidgetAjaxController";


    public ActionForward executeService(
            ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response)
        throws 1.5.0/docs/api/java/lang/Throwable.html">Throwable, ServletException
    {
        try
        {
            1.5.0/docs/api/java/lang/String.html">String serviceJson = request.getParameter("serviceJson");
            logger.info("Calling abstract widget service: " + serviceJson);

            1.5.0/docs/api/java/lang/reflect/Method.html">Method serviceChild = this.getClass().getMethod(serviceJson,new 1.5.0/docs/api/java/lang/Class.html">Class[]{ActionForm.class,HttpServletRequest.class,HttpServletResponse.class});

            JSONObject responseJson = (JSONObject) serviceChild.invoke(this, form, request, response);

            prepareResponse(responseJson,request,response);

            return mapping.findForward("JSON_WidgetAjax_RESPONSE");
        }
        catch(1.5.0/docs/api/java/lang/reflect/InvocationTargetException.html">InvocationTargetException e)
        {

            1.5.0/docs/api/java/lang/Throwable.html">Throwable cause = e;
            if(e.getTargetException() != null)
            {
                cause = e.getTargetException();
                if(e.getTargetException().getCause() != null)
                    cause = e.getTargetException().getCause();
            }
            prepareError(cause,request,response);
            return mapping.findForward("JSON_WidgetAjax_RESPONSE_ERROR");
        }
        catch(1.5.0/docs/api/java/lang/Throwable.html">Throwable e)
        {
            if(e instanceof FilterChainFailedException)
            {
                logger.error(e,e);
            }
            else
            {
                prepareError(e,request,response);
            }
            return mapping.findForward("JSON_WidgetAjax_RESPONSE_ERROR");
        }
    }

    public ActionForward executeSimpleServiceOkFail(
            ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response)
            throws 1.5.0/docs/api/java/lang/Throwable.html">Throwable, ServletException
    {
        try
        {
            1.5.0/docs/api/java/lang/String.html">String serviceJson = request.getParameter("serviceJson");
            logger.info("Calling abstract widget service: " + serviceJson);
            1.5.0/docs/api/java/lang/reflect/Method.html">Method serviceChild = this.getClass().getMethod(serviceJson,new 1.5.0/docs/api/java/lang/Class.html">Class[]{ActionForm.class,HttpServletRequest.class,HttpServletResponse.class});

            1.5.0/docs/api/java/lang/Boolean.html">Boolean responseBoolean = (1.5.0/docs/api/java/lang/Boolean.html">Boolean) serviceChild.invoke(this, form, request, response);

            if(responseBoolean)
            {
                /**
                 * RESPONSE IS A JSON OBJECT LIKE THIS:
                 * {
                 *     "service" : "ok"
                 *     "messages" : "...."
                 * }
                 */

                JSONObject jsonObject = new JSONObject();
                jsonObject.put("service-simple-response","ok");
                prepareResponse(jsonObject, request, response);
                return mapping.findForward("JSON_WidgetAjax_RESPONSE");
            }
            else
            {
                /**
                 * RESPONSE IS A JSON OBJECT LIKE THIS:
                 * {
                 *     "service" : "fail",
                 *     "errors" : "...."
                 * }
                 */

                JSONObject jsonObject = new JSONObject();
                jsonObject.put("service-simple-response","fail");
                prepareResponse(jsonObject, request, response);
                return mapping.findForward("JSON_WidgetAjax_RESPONSE");
            }

        }
        catch(1.5.0/docs/api/java/lang/reflect/InvocationTargetException.html">InvocationTargetException e)
        {
            1.5.0/docs/api/java/lang/Throwable.html">Throwable cause = e.getCause();
            if(e.getTargetException() != null)
            {
                cause = e.getTargetException();
                if(e.getTargetException().getCause() != null)
                    cause = e.getTargetException().getCause();
            }
            prepareError(cause,request,response);
            return mapping.findForward("JSON_WidgetAjax_RESPONSE_ERROR");
        }
        catch(1.5.0/docs/api/java/lang/Throwable.html">Throwable e)
        {
            if(e instanceof FilterChainFailedException)
            {
                logger.error(e,e);
            }
            else
            {
                prepareError(e,request,response);
            }
            return mapping.findForward("JSON_WidgetAjax_RESPONSE_ERROR");
        }

    }


    /**
     * RESPONSE IS A JSON OBJECT LIKE THIS:
     * {
     *     "service" : "ok" OR "fail" if has errors,
     *     "response" : { userResponseJson },
     *     "messages" :
     *          [
     *              "MESSAGE 1",
     *              "MESSAGE 2",
     *          ],
     *     "errors" :
     *          [
     *              "ERROR 1",
     *              "ERROR 2",
     *          ]
     * }
     * @param object
     * @param request
     * @param response
     * @throws JSONException
     */

    private void prepareResponse(JSONObject object,HttpServletRequest request,HttpServletResponse response)
            throws JSONException
    {
        ActionMessages messages = super.getMessages(request);
        ActionMessages errors = super.getErrors(request);
        JSONObject responseObject = new JSONObject();
        if(object.has("service-simple-response"))
        {
            responseObject.put("service",object.getString("service-simple-response"));
            responseObject.put("response",object.getString("service-simple-response"));

        }
        else
        {
            1.5.0/docs/api/java/lang/String.html">String service = errors == null || errors.isEmpty() ? "ok" : "fail";
            responseObject.put("service",service);
            responseObject.put("response",object);
        }





        if(messages != null)
        {
            JSONArray messagesJson = new JSONArray();
            responseObject.put("messages",messagesJson);
            1.5.0/docs/api/java/util/Iterator.html">Iterator reports = messages.get();
            while (reports.hasNext())
            {
                ActionMessage report = (ActionMessage) reports.next();
                if(report instanceof StringMessage)
                {
                    1.5.0/docs/api/java/lang/String.html">String messageTranslated = ((StringMessage)report).toString();
                    if(messageTranslated != null)
                        messagesJson.put(messageTranslated);
                }
                else
                {
                    1.5.0/docs/api/java/lang/String.html">String messageTranslated = MessageResources.getMessage(request,report.getKey(),report.getValues());
                    if(messageTranslated != null)
                        messagesJson.put(messageTranslated);
                }

            }
        }
        if(errors != null)
        {
            JSONArray errorsJson = new JSONArray();
            responseObject.put("errors",errorsJson);
            1.5.0/docs/api/java/util/Iterator.html">Iterator reports = errors.get();
            while (reports.hasNext())
            {
                ActionMessage report = (ActionMessage) reports.next();
                if(report instanceof StringMessage)
                {
                    1.5.0/docs/api/java/lang/String.html">String messageTranslated = ((StringMessage)report).toString();
                    if(messageTranslated != null)
                        errorsJson.put(messageTranslated);
                }
                else
                {
                    1.5.0/docs/api/java/lang/String.html">String messageTranslated = MessageResources.getMessage(request,report.getKey(),report.getValues());
                    if(messageTranslated != null)
                        errorsJson.put(messageTranslated);
                }
            }
        }
        request.setAttribute(WIDGET_REPONSE_KEY, responseObject);
    }

    /**
     * RESPONSE IS A JSON OBJECT LIKE THIS:
     * {
     *     "service" : "error"
     *     "exception" : "string with exception.toString()"
     * }
     * @param e
     * @param request
     * @param response
     * @throws JSONException
     */

    public static void prepareError(1.5.0/docs/api/java/lang/Throwable.html">Throwable e,HttpServletRequest request,HttpServletResponse response) throws JSONException
    {
        logger.error(e,e);
        //request.setAttribute(WIDGET_REPONSE_KEY,e.toString());
        JSONObject errorObject = new JSONObject();
        errorObject.put("service","error");
        errorObject.put("exception",e.toString());
        request.setAttribute(WIDGET_REPONSE_KEY,errorObject);
    }

}