/*
* The contents of this file are subject to the Mozilla Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
* License for the specific language governing rights and limitations under
* the License.
*
* The Original Code is OpenELIS code.
*
* Copyright (C) The Minnesota Department of Health. All Rights Reserved.
*
* Contributor(s): CIRG, University of Washington, Seattle WA.
*/
package us.mn.state.health.lims.patient.action;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.validator.GenericValidator;
import org.apache.struts.Globals;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMessages;
import us.mn.state.health.lims.common.action.BaseAction;
import us.mn.state.health.lims.common.action.BaseActionForm;
import us.mn.state.health.lims.common.log.LogEvent;
import us.mn.state.health.lims.common.util.validator.ActionError;
import us.mn.state.health.lims.dictionary.ObservationHistoryList;
import us.mn.state.health.lims.organization.util.OrganizationTypeList;
import us.mn.state.health.lims.patient.saving.Accessioner;
import us.mn.state.health.lims.patient.saving.RequestType;
import us.mn.state.health.lims.patient.util.PatientUtil;
import us.mn.state.health.lims.patient.valueholder.ObservationData;
/**
* Base class to share between setup actions and update actions for both entry and edit of patient.
* @author Paul A. Hill (pahill@uw.edu)
* @since Jul 26, 2010
*/
public abstract class BasePatientEntryByProject extends BaseAction {
protected RequestType requestType = RequestType.UNKNOWN;
public BasePatientEntryByProject() {
super();
}
/**
* @param requestTypeStr
*/
protected void setRequestType(String requestTypeStr) {
if (!GenericValidator.isBlankOrNull(requestTypeStr)) {
requestType = RequestType.valueOf(requestTypeStr.toUpperCase());
}
}
/**
* If the URL parameter says we want to do a particular type of request, figure out which type and pass that on to any other controller page
* in the flow via an attribute of the session
* TODO PAHill is putting it in the session just clutter? Should this be in the request instead?
*/
protected void updateRequestType(HttpServletRequest httpRequest) {
setRequestType((String)httpRequest.getParameter("type"));
if ( requestType != null ) {
httpRequest.getSession().setAttribute("type", requestType.toString().toLowerCase());
}
}
/**
* Put the projectFormName in the right place, so that ends up driving the next patientEntry form to select the right form.
* The projectFormName is retained even through form edit/entry(add) reselection, so that all forms know the current projectForm,
* so that the user is presented with a good guess on what they might want to keep doing.
* @param projectFormName
* @throws Exception all from property utils if we've coded things wrong in the form def or in this class.
*/
protected void setProjectFormName(ActionForm form, String projectFormName) throws IllegalAccessException,
InvocationTargetException, NoSuchMethodException {
((ObservationData)(PropertyUtils.getProperty(form, "observations"))).setProjectFormName(projectFormName);
}
/**
* This method captures how we deal with the curious accession objects I (PaHill) created. If someone comes up with a
* better API (Maybe inject a messages list to be filled in?) then we can change this bit of plumbing.
* @param request original request
* @param accessioner the object to use to attempt to save.
* @return a forward string or null; null => this attempt to save failed
* @throws Exception if things go really bad. Normally, the errors are caught internally an appropriate message is added and a forward fail is returned.
*/
protected String handleSave(HttpServletRequest request, Accessioner accessioner) throws Exception {
String forward = accessioner.save();
if (null != forward) {
ActionMessages errors = accessioner.getMessages();
if (errors.size() != 0) {
saveErrors(request, errors);
request.setAttribute(Globals.ERROR_KEY, errors);
}
return forward;
}
return null;
}
/**
* Just a utility routine for doing the obvious logging and and appending a global message.
*/
protected void logAndAddMessage(HttpServletRequest request, String methodName, String messageKey) {
LogEvent.logError(this.getClass().getSimpleName(), methodName, "Unable to enter patient into system");
ActionError error = new ActionError(messageKey, null, null);
ActionMessages errors = new ActionMessages();
errors.add(ActionMessages.GLOBAL_MESSAGE, error);
addErrors(request, errors);
}
/**
* various maps full of a various lists used by the patient entry form (typically for drop downs) and other forms who want to do patient entry.
* @throws Exception all from setProperty problems caused by developer mistakes.
*/
public static Map<String, Object> addAllPatientFormLists(BaseActionForm dynaForm) throws Exception {
Map<String, Object> resultMap = new HashMap<String, Object>();
resultMap.put("GENDERS", PatientUtil.findGenders());
PropertyUtils.setProperty(dynaForm, "formLists", resultMap);
PropertyUtils.setProperty(dynaForm, "dictionaryLists", ObservationHistoryList.MAP);
PropertyUtils.setProperty(dynaForm, "organizationTypeLists", OrganizationTypeList.MAP);
return resultMap;
}
}