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 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");
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
)
{
prepareError
(e.
getCause(),request,response
);
return mapping.
findForward("JSON_WidgetAjax_RESPONSE_ERROR");
}
catch(1.5.0/docs/api/java/lang/Throwable.html">Throwable e
)
{
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");
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
)
{
prepareError
(e.
getCause(),request,response
);
return mapping.
findForward("JSON_WidgetAjax_RESPONSE_ERROR");
}
catch(1.5.0/docs/api/java/lang/Throwable.html">Throwable e
)
{
prepareError
(e,request,response
);
return mapping.
findForward("JSON_WidgetAjax_RESPONSE_ERROR");
}
}
/**
* Serviço Especial para upload de ficheiros
* @param mapping
* @param form
* @param request
* @param response
* @return
* @throws Throwable
* @throws ServletException
*/
public ActionForward uploadTmpFiles
(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response
)
throws 1.5.0/docs/api/java/lang/Throwable.html">Throwable, ServletException
{
try
{
JSONObject jsonObject =
new JSONObject
();
jsonObject.
put("service",
"ok");
prepareResponse
(jsonObject, request, response
);
return mapping.
findForward("JSON_WidgetAjax_RESPONSE");
}
catch(1.5.0/docs/api/java/lang/Throwable.html">Throwable e
)
{
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();
1.5.0/docs/api/java/lang/String.html">String messageTranslated = MessageResources.
getMessage(request,report.
getKey(),report.
getValues());
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();
1.5.0/docs/api/java/lang/String.html">String messageTranslated = MessageResources.
getMessage(request,report.
getKey(),report.
getValues());
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
*/
private 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
);
}
}