package org.appfuse.webapp.action;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.converters.LongConverter;
import org.apache.commons.beanutils.converters.StringConverter;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.Globals;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.actions.LookupDispatchAction;
import org.apache.struts.config.MessageResourcesConfig;
import org.apache.struts.config.ModuleConfig;
import org.apache.struts.util.MessageResources;
import org.appfuse.Constants;
import org.appfuse.model.Resume;
import org.appfuse.model.User;
import org.appfuse.service.ResumeManager;
import org.appfuse.util.ConvertUtil;
import org.appfuse.util.CurrencyConverter;
import org.appfuse.util.DateConverter;
import org.appfuse.webapp.util.SslUtil;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
public class BaseAction extends LookupDispatchAction {
protected static Log log = LogFactory.getLog(BaseAction.class);
public static final String SECURE = "secure";
private static Long defaultLong = null;
protected ApplicationContext ctx = null;
static {
ConvertUtils.register(new CurrencyConverter(), Double.class);
ConvertUtils.register(new DateConverter(), Date.class);
ConvertUtils.register(new LongConverter(defaultLong), Long.TYPE);
ConvertUtils.register(new LongConverter(defaultLong), Long.class);
ConvertUtils.register(new StringConverter(), String.class);
if (log.isDebugEnabled()) {
log.debug("Converters registered...");
}
}
public Object getBean(String name) {
if (ctx == null) {
ctx = WebApplicationContextUtils
.getRequiredWebApplicationContext(servlet.getServletContext());
}
return ctx.getBean(name);
}
public String getResumeId(HttpServletRequest request) throws Exception {
ResumeManager mgr = (ResumeManager) getBean("resumeManager");
User user = getUser(request.getSession());
if (log.isDebugEnabled()) {
log.debug("looking up resume for user: '" + user.getUsername() + "'");
}
List resumes = mgr.getResumesForUser(user.getId().toString());
if (resumes.size() > 0) {
Resume resume = (Resume) resumes.get(0);
return String.valueOf(resume.getId());
} else {
Resume resume = new Resume();
resume.setUserId(user.getId());
resume= (Resume) mgr.saveResume(resume);
return resume.getId().toString();
}
}
public Map getKeyMethodMap() {
Map map = new HashMap();
ResourceBundle methods =
ResourceBundle.getBundle("org.appfuse.webapp.action.LookupMethods");
Enumeration keys = methods.getKeys();
while (keys.hasMoreElements()) {
String key = (String) keys.nextElement();
map.put(key, methods.getString(key));
}
return map;
}
protected Object convertDates(Object obj, Object form) {
return ConvertUtil.convertDates(obj, form);
}
protected Object convert(Object o) throws Exception {
return ConvertUtil.convert(o);
}
protected Object convertLists(Object o) throws Exception {
return ConvertUtil.convertLists(o);
}
public ActionMessages getMessages(HttpServletRequest request) {
ActionMessages messages = null;
HttpSession session = request.getSession(false);
if (request.getAttribute(Globals.MESSAGE_KEY) != null) {
messages =
(ActionMessages) request.getAttribute(Globals.MESSAGE_KEY);
saveMessages(request, messages);
} else if (session.getAttribute(Globals.MESSAGE_KEY) != null) {
messages =
(ActionMessages) session.getAttribute(Globals.MESSAGE_KEY);
saveMessages(request, messages);
session.removeAttribute(Globals.MESSAGE_KEY);
} else {
messages = new ActionMessages();
}
return messages;
}
public ActionErrors getErrors(HttpServletRequest request) {
ActionErrors errors = null;
HttpSession session = request.getSession(false);
if (request.getAttribute(Globals.ERROR_KEY) != null) {
errors =
(ActionErrors) request.getAttribute(Globals.ERROR_KEY);
saveErrors(request, errors);
} else if (session.getAttribute(Globals.ERROR_KEY) != null) {
errors =
(ActionErrors) session.getAttribute(Globals.ERROR_KEY);
saveErrors(request, errors);
session.removeAttribute(Globals.ERROR_KEY);
} else {
errors = new ActionErrors();
}
return errors;
}
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
if (isCancelled(request)) {
ActionForward af = cancelled(mapping, form, request, response);
if (af != null) {
return af;
}
}
MessageResources resources = getResources(request);
ActionMessages messages = getMessages(request);
String edit = resources.getMessage("button.edit").toLowerCase();
String save = resources.getMessage("button.save").toLowerCase();
String search = resources.getMessage("button.search").toLowerCase();
String view = resources.getMessage("button.view").toLowerCase();
String[] rules = { edit, save, search, view };
String parameter = mapping.getParameter();
String keyName = request.getParameter(parameter);
if ((keyName == null) || (keyName.length() == 0)) {
for (int i = 0; i < rules.length; i++) {
if (request.getServletPath().indexOf(rules[i]) > -1) {
return dispatchMethod(mapping, form, request, response,
rules[i]);
}
}
return this.unspecified(mapping, form, request, response);
}
String methodName =
getMethodName(mapping, form, request, response, parameter);
return dispatchMethod(mapping, form, request, response, methodName);
}
protected ActionForm getActionForm(ActionMapping mapping,
HttpServletRequest request) {
ActionForm actionForm = null;
if (mapping.getAttribute() != null) {
if ("request".equals(mapping.getScope())) {
actionForm =
(ActionForm) request.getAttribute(mapping.getAttribute());
} else {
HttpSession session = request.getSession();
actionForm =
(ActionForm) session.getAttribute(mapping.getAttribute());
}
}
return actionForm;
}
protected String getLookupMapName(HttpServletRequest request,
String keyName, ActionMapping mapping)
throws ServletException {
Map lookupMap = null;
synchronized (localeMap) {
Locale userLocale = this.getLocale(request);
lookupMap = (Map) this.localeMap.get(userLocale);
if (lookupMap == null) {
lookupMap = this.initLookupMap(request, userLocale);
this.localeMap.put(userLocale, lookupMap);
}
}
String key = (String) lookupMap.get(keyName);
if (key == null) {
String message =
messages.getMessage("dispatch.resource", mapping.getPath(),
keyName);
throw new ServletException(message);
}
String methodName = (String) keyMethodMap.get(key);
if (methodName == null) {
String message =
messages.getMessage("dispatch.lookup", mapping.getPath(), key);
throw new ServletException(message);
}
return methodName;
}
protected String getMethodName(ActionMapping mapping, ActionForm form,
HttpServletRequest request,
HttpServletResponse response,
String parameter) throws Exception {
String keyName = request.getParameter(parameter);
if ((keyName == null) || (keyName.length() == 0)) {
return null;
}
String methodName = getLookupMapName(request, keyName, mapping);
return methodName;
}
protected User getUser(HttpSession session) {
return (User) session.getAttribute(Constants.USER_KEY);
}
protected ActionForward cancelled(ActionMapping mapping, ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
return null;
}
protected boolean checkSsl(ActionMapping mapping,
HttpServletRequest request,
HttpServletResponse response) {
String redirectString =
SslUtil.getRedirectString(request,
getServlet().getServletContext(),
SECURE.equals(mapping.getParameter()));
if (redirectString != null) {
log.debug("protocol switch needed, redirecting...");
try {
response.sendRedirect(response.encodeRedirectURL(redirectString));
return true;
} catch (Exception ioe) {
log.error("redirect to new protocol failed...");
}
}
return false;
}
protected void removeFormBean(ActionMapping mapping,
HttpServletRequest request) {
if (mapping.getAttribute() != null) {
if ("request".equals(mapping.getScope())) {
request.removeAttribute(mapping.getAttribute());
} else {
HttpSession session = request.getSession();
session.removeAttribute(mapping.getAttribute());
}
}
}
protected void updateFormBean(ActionMapping mapping,
HttpServletRequest request, Object form) {
if (mapping.getAttribute() != null) {
if ("request".equals(mapping.getScope())) {
request.setAttribute(mapping.getAttribute(), form);
} else {
HttpSession session = request.getSession();
session.setAttribute(mapping.getAttribute(), form);
}
}
}
private Map initLookupMap(HttpServletRequest request, Locale userLocale) {
Map lookupMap = new HashMap();
this.keyMethodMap = this.getKeyMethodMap();
ModuleConfig moduleConfig =
(ModuleConfig) request.getAttribute(Globals.MODULE_KEY);
MessageResourcesConfig[] mrc =
moduleConfig.findMessageResourcesConfigs();
for (int i = 0; i < mrc.length; i++) {
MessageResources resources =
this.getResources(request, mrc[i].getKey());
Iterator iter = this.keyMethodMap.keySet().iterator();
while (iter.hasNext()) {
String key = (String) iter.next();
String text = resources.getMessage(userLocale, key);
if ((text != null) && !lookupMap.containsKey(text)) {
lookupMap.put(text, key);
}
}
}
return lookupMap;
}
}