String eMeth = (String) eventMap.get(ConfigXMLReader.EVENT_METHOD);
try {
String returnString = this.runEvent(request, response, eType, ePath, eMeth);
if (returnString != null && !returnString.equalsIgnoreCase("success")) {
throw new EventHandlerException("First-Visit event did not return 'success'.");
} else if (returnString == null) {
nextView = "none:";
}
} catch (EventHandlerException e) {
Debug.logError(e, module);
}
}
}
}
// Invoke the pre-processor (but NOT in a chain)
Collection preProcEvents = requestManager.getPreProcessor();
if (preProcEvents != null) {
Iterator i = preProcEvents.iterator();
while (i.hasNext()) {
Map eventMap = (Map) i.next();
String eType = (String) eventMap.get(ConfigXMLReader.EVENT_TYPE);
String ePath = (String) eventMap.get(ConfigXMLReader.EVENT_PATH);
String eMeth = (String) eventMap.get(ConfigXMLReader.EVENT_METHOD);
try {
String returnString = this.runEvent(request, response, eType, ePath, eMeth);
if (returnString != null && !returnString.equalsIgnoreCase("success")) {
throw new EventHandlerException("Pre-Processor event did not return 'success'.");
} else if (returnString == null) {
nextView = "none:";
}
} catch (EventHandlerException e) {
Debug.logError(e, module);
}
}
}
}
// Pre-Processor/First-Visit event(s) can interrupt the flow by returning null.
// Warning: this could cause problems if more then one event attempts to return a response.
if ("none:".equals(nextView)) {
if (Debug.infoOn()) Debug.logInfo("[Pre-Processor Interrupted Request, not running: " + requestUri + " sessionId=" + UtilHttp.getSessionId(request), module);
return;
}
if (Debug.infoOn()) Debug.logInfo("[Processing Request]: " + requestUri + " sessionId=" + UtilHttp.getSessionId(request), module);
request.setAttribute("thisRequestUri", requestUri); // store the actual request URI
String eventReturnString = null;
// Perform security check.
if (requestManager.requiresAuth(requestUri)) {
// Invoke the security handler
// catch exceptions and throw RequestHandlerException if failed.
Debug.logVerbose("[RequestHandler]: AuthRequired. Running security check." + " sessionId=" + UtilHttp.getSessionId(request), module);
String checkLoginType = requestManager.getEventType("checkLogin");
String checkLoginPath = requestManager.getEventPath("checkLogin");
String checkLoginMethod = requestManager.getEventMethod("checkLogin");
String checkLoginReturnString;
try {
checkLoginReturnString = this.runEvent(request, response, checkLoginType,
checkLoginPath, checkLoginMethod);
} catch (EventHandlerException e) {
throw new RequestHandlerException(e.getMessage(), e);
}
if (!"success".equalsIgnoreCase(checkLoginReturnString)) {
// previous URL already saved by event, so just do as the return says...
eventReturnString = checkLoginReturnString;
requestUri = "checkLogin";
}
}
// Invoke the defined event (unless login failed)
if (eventReturnString == null) {
eventType = requestManager.getEventType(requestUri);
eventPath = requestManager.getEventPath(requestUri);
eventMethod = requestManager.getEventMethod(requestUri);
if (eventType != null && eventPath != null && eventMethod != null) {
try {
long eventStartTime = System.currentTimeMillis();
// run the event
eventReturnString = this.runEvent(request, response, eventType, eventPath, eventMethod);
// save the server hit
ServerHitBin.countEvent(cname + "." + eventMethod, request, eventStartTime,
System.currentTimeMillis() - eventStartTime, userLogin, delegator);
// set the default event return
if (eventReturnString == null) {
nextView = "none:";
}
} catch (EventHandlerException e) {
// check to see if there is an "error" response, if so go there and make an request error message
String tryErrorMsg = requestManager.getRequestAttribute(requestUri, "error");
if (tryErrorMsg != null) {
eventReturnString = "error";
Locale locale = UtilHttp.getLocale(request);
String errMsg = UtilProperties.getMessage(RequestHandler.err_resource, "requestHandler.error_call_event", locale);
request.setAttribute("_ERROR_MESSAGE_", errMsg + ": " + e.toString());
} else {
throw new RequestHandlerException("Error calling event and no error repsonse was specified", e);
}
}
}
}
// If error, then display more error messages:
if ("error".equals(eventReturnString)) {
if (Debug.errorOn()) {
String errorMessageHeader = "Request " + requestUri + " caused an error with the following message: ";
if (request.getAttribute("_ERROR_MESSAGE_") != null) {
Debug.logError(errorMessageHeader + request.getAttribute("_ERROR_MESSAGE_"), module);
}
if (request.getAttribute("_ERROR_MESSAGE_LIST_") != null) {
Debug.logError(errorMessageHeader + request.getAttribute("_ERROR_MESSAGE_LIST_"), module);
}
}
}
// Process the eventReturn.
String eventReturn = requestManager.getRequestAttribute(requestUri, eventReturnString);
if (Debug.verboseOn()) Debug.logVerbose("[Response Qualified]: " + eventReturn + " sessionId=" + UtilHttp.getSessionId(request), module);
// Set the next view (don't use event return if success, default to nextView (which is set to eventReturn later if null); also even if success if it is a type "none" response ignore the nextView, ie use the eventReturn)
if (eventReturn != null && (!"success".equals(eventReturnString) || eventReturn.startsWith("none:"))) nextView = eventReturn;
if (Debug.verboseOn()) Debug.logVerbose("[Event Response Mapping]: " + nextView + " sessionId=" + UtilHttp.getSessionId(request), module);
// get the previous request info
String previousRequest = (String) request.getSession().getAttribute("_PREVIOUS_REQUEST_");
String loginPass = (String) request.getAttribute("_LOGIN_PASSED_");
// restore previous redirected request's attribute, so redirected page can display previous request's error msg etc.
String preReqAttStr = (String) request.getSession().getAttribute("_REQ_ATTR_MAP_");
if (preReqAttStr != null) {
request.getSession().removeAttribute("_REQ_ATTR_MAP_");
byte[] reqAttrMapBytes = StringUtil.fromHexString(preReqAttStr);
Map preRequestMap = (Map) UtilObject.getObject(reqAttrMapBytes);
if (preRequestMap != null && preRequestMap.size() > 0) {
Iterator keys = preRequestMap.keySet().iterator();
while (keys.hasNext()){
String key = (String) keys.next();
if("_ERROR_MESSAGE_LIST_".equals(key) || "_ERROR_MESSAGE_MAP_".equals(key) || "_ERROR_MESSAGE_".equals(key) ||
"_EVENT_MESSAGE_LIST_".equals(key) || "_EVENT_MESSAGE_".equals(key)) {
Object value = preRequestMap.get(key);
request.setAttribute(key, value);
}
}
}
}
if (Debug.verboseOn()) Debug.logVerbose("[RequestHandler]: previousRequest - " + previousRequest + " (" + loginPass + ")" + " sessionId=" + UtilHttp.getSessionId(request), module);
// if previous request exists, and a login just succeeded, do that now.
if (previousRequest != null && loginPass != null && loginPass.equalsIgnoreCase("TRUE")) {
request.getSession().removeAttribute("_PREVIOUS_REQUEST_");
// special case to avoid login/logout looping: if request was "logout" before the login, change to null for default success view; do the same for "login" to avoid going back to the same page
if ("logout".equals(previousRequest) || "/logout".equals(previousRequest) || "login".equals(previousRequest) || "/login".equals(previousRequest) || "checkLogin".equals(previousRequest) || "/checkLogin".equals(previousRequest) || "/checkLogin/login".equals(previousRequest)) {
Debug.logWarning("Found special _PREVIOUS_REQUEST_ of [" + previousRequest + "], setting to null to avoid problems, not running request again", module);
previousRequest = null;
} else {
if (Debug.infoOn()) Debug.logInfo("[Doing Previous Request]: " + previousRequest + " sessionId=" + UtilHttp.getSessionId(request), module);
doRequest(request, response, previousRequest, userLogin, delegator);
return; // this is needed or else we will run the view twice
}
}
String successView = requestManager.getViewName(requestUri);
if ("success".equals(eventReturnString) && successView.startsWith("request:")) {
// chains will override any url defined views; but we will save the view for the very end
if (nextView != null) {
request.setAttribute("_POST_CHAIN_VIEW_", nextView);
}
nextView = successView;
}
// Make sure we have some sort of response to go to
if (nextView == null) nextView = successView;
if (Debug.verboseOn()) Debug.logVerbose("[Current View]: " + nextView + " sessionId=" + UtilHttp.getSessionId(request), module);
// Handle the responses - chains/views
if (nextView != null && nextView.startsWith("request:")) {
// chained request
Debug.logInfo("[RequestHandler.doRequest]: Response is a chained request." + " sessionId=" + UtilHttp.getSessionId(request), module);
nextView = nextView.substring(8);
doRequest(request, response, nextView, userLogin, delegator);
} else { // handle views
// first invoke the post-processor events.
Collection postProcEvents = requestManager.getPostProcessor();
if (chain == null && postProcEvents != null) { // don't run post-proc events on chained requests
Iterator i = postProcEvents.iterator();
while (i.hasNext()) {
Map eventMap = (Map) i.next();
String eType = (String) eventMap.get(ConfigXMLReader.EVENT_TYPE);
String ePath = (String) eventMap.get(ConfigXMLReader.EVENT_PATH);
String eMeth = (String) eventMap.get(ConfigXMLReader.EVENT_METHOD);
try {
String returnString = this.runEvent(request, response, eType, ePath, eMeth);
if (returnString != null && !returnString.equalsIgnoreCase("success"))
throw new EventHandlerException("Post-Processor event did not return 'success'.");
else if (returnString == null)
nextView = "none:";
} catch (EventHandlerException e) {
Debug.logError(e, module);
}