/** * @(#)Spr001aParentTreeContribAction * Copyright (c) 2005, B.C. Ministry of Forests * All rights reserved. */ package ca.bc.gov.mof.spar.web.action; /******************************************************** Action Class: Spr001aParentTreeContribAction Purpose: Handles user actions for Spr001aParentTreeContribForm Naviagation: Revision History Person Date Comments ----------------- --------- ----------------------- Pangaea June 22 2005 Created *******************************************************/ import java.io.IOException; import java.util.Iterator; import javax.servlet.*; import javax.servlet.http.*; import org.apache.struts.action.*; import ca.bc.gov.mof.sil.webade.db.DataBean; import ca.bc.gov.mof.sil.webade.db.PackageMap; import ca.bc.gov.mof.sil.webade.db.event.SearchRequest; import ca.bc.gov.mof.sil.webade.db.event.SearchResponse; import ca.bc.gov.mof.sil.webade.db.StoreException; import ca.bc.gov.mof.sil.struts.SearchForm; import ca.bc.gov.mof.sil.webade.db.ui.UserMessages; import ca.bc.gov.mof.sil.webade.db.ui.UserMessage; import ca.bc.gov.mof.sil.webade.db.util.Trace; import ca.bc.gov.mof.spar.db.SparExtStore; import ca.bc.gov.mof.spar.web.frame.SparForm; import ca.bc.gov.mof.spar.web.frame.SparAction; import ca.bc.gov.mof.spar.web.frame.SparUser; import ca.bc.gov.mof.spar.web.form.Spr001aSmpCalculationForm; import ca.bc.gov.mof.spar.data.beans.Spr001aParentTreeContribBean; import ca.bc.gov.mof.spar.data.beans.Spr001aSmpCalculationBean; import ca.bc.gov.mof.spar.data.beans.Spr001aSmpCalculationResultArray; import ca.bc.gov.mof.spar.data.beans.Spr001aSmpCalculationResultArrayElement; import ca.bc.gov.mof.spar.data.beans.Spr590ParentTreeSearchBean; public class Spr001aSmpCalculationAction extends SparAction { private static final Trace trace = new Trace( Spr001aSmpCalculationAction.class ); public Spr001aSmpCalculationAction(){} public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException,ServletException { // Basic declarations needed for action classes. HttpSession session = request.getSession(); ActionErrors errors = new ActionErrors(); UserMessages warnings = new UserMessages(); SparForm sparForm = (SparForm) form; String action = sparForm.getUserAction().trim(); String userId = sparForm.getUser().getName(); sparForm.setUserAction(""); // Needed to process sub-searches SearchResponse searchResponse = SearchResponse.get(request.getSession()); SearchResponse.remove(request.getSession()); SearchRequest searchRequest = SearchRequest.get(request.getSession()); SearchRequest.remove(request.getSession()); if (searchRequest != null) { ((SearchForm) form).setSearchRequest(searchRequest); } // End of sub-search Spr001aSmpCalculationForm formBean = (Spr001aSmpCalculationForm) form; try { // To process returns from sub-searches if (searchResponse != null && searchResponse.getOk()) { Spr590ParentTreeSearchBean searchResult = (Spr590ParentTreeSearchBean)searchResponse.getResults(); String searcher = searchResponse.getSearcher(); // i.e. if come back from PT subsearch if (searcher.equalsIgnoreCase("/spr590ParentTreeSearchAction")) { return processPtSearchResults(formBean, (Spr590ParentTreeSearchBean)searchResult, mapping, errors, warnings, request, userId, response, action); } else { formBean.setBackForward(searchResult.getBackForward()); } } // temporary call to get... else if (action.equalsIgnoreCase("")) { if (searchRequest != null) { formBean.clear(); formBean.setBackForward(searchRequest.getRequestor()); // Copy the key parameters over Spr001aParentTreeContribBean dataBean = (Spr001aParentTreeContribBean) searchRequest.getSearchState()[0]; formBean.getDataBean().setP_seedlot_number(dataBean.getP_seedlot_number()); } else { formBean.setBackForward(""); } handleGet(mapping, formBean, request, response, errors, warnings); } else if (action.equalsIgnoreCase("Go")) { handleGet(mapping, formBean, request, response, errors, warnings); } else if (action.equalsIgnoreCase("Save")) { handleSave(mapping, formBean, request, response, errors, warnings); } else if (action.equalsIgnoreCase("searchParentTree")) { return requestSearch("spr590ParentTreeSearch", (DataBean)formBean.getDataBean().clone(), session, "spr001aSmpCalculationAction", mapping); } else if (action.equalsIgnoreCase("BackToPT")) { return handleReturnToPT(mapping, formBean, request, response, errors, warnings); } else if (action.equalsIgnoreCase("SaveBackToPT")) { handleSave(mapping, formBean, request, response, errors, warnings); if(errors.isEmpty()) { return handleReturnToPT(mapping, formBean, request, response, errors, warnings); } } else if (action.equalsIgnoreCase("Clear")) { handleGet(mapping, formBean, request, response, errors, warnings); } else if(action.equalsIgnoreCase("Add More Parents")) { //populate the dataBean list with values from the form in case the user has made changes add3NewRows(formBean); } } catch (Exception e) { e.printStackTrace(); errors.add("ca.bc.gov.mof.sil.webade.db.exception.trace", createActionError(e)); } return checkErrors(mapping, formBean, errors, warnings, request); } /** * Retrieves records from a search. */ private void handleGet(ActionMapping mapping, Spr001aSmpCalculationForm formBean, HttpServletRequest request, HttpServletResponse response, ActionErrors errors, UserMessages messages) throws StoreException { Spr001aSmpCalculationBean dataBean = (Spr001aSmpCalculationBean) formBean.getBean(); String userid = formBean.getUser().getName(); dataBean.setP_error_message(""); dataBean.setP_action("GET"); dataBean.setP_update_userid(userid); dataBean.setP_user_org_unit_no(((SparUser) formBean.getUser()).getUser_org_unit()); dataBean.setP_user_type(((SparUser) formBean.getUser()).getUser_type()); dataBean.setP_user_client_number(((SparUser) formBean.getUser()).getUser_client()); dataBean.setP_user_client_locn_code(((SparUser) formBean.getUser()).getUser_client_locn()); dataBean.setP_result(new Spr001aSmpCalculationResultArray()); try { SparExtStore store = new SparExtStore("ca.bc.gov.mof", userid, getAction(mapping, request)); dataBean.setPackageMapping(PackageMap.instance().getMapping("ca.bc.gov.mof.spar.data.beans.Spr001aSmpCalculationBean")); dataBean = (Spr001aSmpCalculationBean) store.put(dataBean); // If spar.web.error.usr.database.bv_cv_contrib; was the only error message, set the databean anyway. super.parseToErrors(dataBean.getP_error_message(), errors); if (dataBean.getP_error_message().equals("") || dataBean.getP_error_message().equalsIgnoreCase("spar.web.error.usr.database.bv_cv_contrib;")) { formBean.setBean(dataBean); // Check to see if no records found if (formBean.getDataBean().getP_result().size() == 0) { messages.addMessage(new UserMessage("spar.web.error.usr.noRecord", UserMessage.confirmation)); } } store.commit(); formBean.forceFormats(); } catch (Exception e) { e.printStackTrace(); errors.add("ca.bc.gov.mof.sil.webade.db.exception.trace", createActionError(e)); } if(formBean.getSaveEnabled()) { this.addDefaultNumberOfRows(formBean); } } /** * This will save/update records */ private void handleSave(ActionMapping mapping, Spr001aSmpCalculationForm formBean, HttpServletRequest request, HttpServletResponse response, ActionErrors errors, UserMessages messages) throws StoreException { try { Spr001aSmpCalculationBean dataBean = (Spr001aSmpCalculationBean) formBean.getBean(); String userid = formBean.getUser().getName(); dataBean.setP_error_message(""); dataBean.setP_action("SAVE"); dataBean.setP_update_userid(userid); dataBean.setP_user_org_unit_no(((SparUser) formBean.getUser()).getUser_org_unit()); dataBean.setP_user_type(((SparUser) formBean.getUser()).getUser_type()); dataBean.setP_user_client_number(((SparUser) formBean.getUser()).getUser_client()); dataBean.setP_user_client_locn_code(((SparUser) formBean.getUser()).getUser_client_locn()); // Make a copy of the parent tree information from the data bean in case the save fails. // This is needed because the data bean that is sent to the package will have a collapsed array Spr001aSmpCalculationResultArray parentTreeInformation = dataBean.getP_result(); dataBean.setP_result(getParentTreeInformationForSave(parentTreeInformation)); SparExtStore store = new SparExtStore("ca.bc.gov.mof", userid, getAction(mapping, request)); dataBean.setPackageMapping(PackageMap.instance().getMapping("ca.bc.gov.mof.spar.data.beans.Spr001aSmpCalculationBean")); Spr001aSmpCalculationBean dataBeanResult = (Spr001aSmpCalculationBean) store.put(dataBean); if (!super.parseToErrors(dataBeanResult.getP_error_message(), errors)) { store.commit(); formBean.setBean(dataBeanResult); handleGet(mapping, formBean, request, response, errors, messages); messages.addMessage(new UserMessage("spar.web.warning.save.success", UserMessage.confirmation)); } else { // If there was a problem with the save, restore the parent tree // information records store.rollback(); dataBean.setP_result(parentTreeInformation); } } catch (Exception e) { e.printStackTrace(); errors.add("ca.bc.gov.mof.sil.webade.db.exception.trace", createActionError(e)); } } /** * This will save/update records */ private ActionForward handleReturnToPT(ActionMapping mapping, Spr001aSmpCalculationForm formBean, HttpServletRequest request, HttpServletResponse response, ActionErrors errors, UserMessages messages) throws StoreException { Spr001aSmpCalculationResultArray parentTreeInformation = formBean.getDataBean().getP_result(); parentTreeInformation = getParentTreeInformationForSave(parentTreeInformation); if(parentTreeInformation.size() > 0) { return new ActionForward(mapping.findForward("spr001aParentTreeContribAction").getPath() + "?dataBean.p_seedlot_number=" + formBean.getDataBean().getP_seedlot_number() + "&smp_mix_bv_g=" + formBean.getDataBean().getP_smp_mix_bv_g() + "&smp_mix_bv_d=" + formBean.getDataBean().getP_smp_mix_bv_d() + "&smp_mix_bv_r=" + formBean.getDataBean().getP_smp_mix_bv_r() + "&smp_mix_bv_m=" + formBean.getDataBean().getP_smp_mix_bv_m() + "&smp_mix_elevation=" + formBean.getDataBean().getP_smp_mix_elevation() + "&smp_mix_latitude_degrees=" + formBean.getDataBean().getP_smp_mix_latitude_degrees() + "&smp_mix_latitude_minutes=" + formBean.getDataBean().getP_smp_mix_latitude_minutes() + "&smp_mix_longitude_degrees=" + formBean.getDataBean().getP_smp_mix_longitude_degrees() + "&smp_mix_longitude_minutes=" + formBean.getDataBean().getP_smp_mix_longitude_minutes()); } else { return new ActionForward(mapping.findForward("spr001aParentTreeContribAction").getPath() + "?dataBean.p_seedlot_number=" + formBean.getDataBean().getP_seedlot_number()); } } /** * Prepares the Parent Tree Information for the save. This method will * remove elements from the parent tree information array that is not to be * saved. * */ private Spr001aSmpCalculationResultArray getParentTreeInformationForSave(Spr001aSmpCalculationResultArray parentTreeInformation) { Spr001aSmpCalculationResultArray recordsToSave = new Spr001aSmpCalculationResultArray(); Spr001aSmpCalculationResultArrayElement element = null; Iterator iterator = parentTreeInformation.iterator(); while (iterator.hasNext()) { element = (Spr001aSmpCalculationResultArrayElement) iterator.next(); // Only add savable items to the save bean if (Spr001aSmpCalculationForm.parentTreeInformationSavable(element)) { recordsToSave.add(element); } } return recordsToSave; } protected ActionForward processPtSearchResults(Spr001aSmpCalculationForm formBean, Spr590ParentTreeSearchBean results, ActionMapping mapping, ActionErrors errors, UserMessages warnings, HttpServletRequest request, String userId, HttpServletResponse response, String action) throws Exception { int index = Integer.valueOf(formBean.getSearchRowIndex()).intValue(); Spr001aSmpCalculationResultArrayElement rowItemElement; rowItemElement = (Spr001aSmpCalculationResultArrayElement)formBean.getDataBean().getP_result().get(index); if (hasAValue(results.getParent_tree_number())) { rowItemElement.setParent_tree_id(results.getParent_tree_id()); rowItemElement.setParent_tree_number(results.getParent_tree_number()); if(results.getTested_ind().equalsIgnoreCase("Yes")) { rowItemElement.setUntested_ind("N"); } else if(results.getTested_ind().equalsIgnoreCase("No")) { rowItemElement.setUntested_ind("Y"); } // replace 'old' element with the new one formBean.getDataBean().getP_result().set(index, rowItemElement); } return checkErrors( mapping, formBean, errors, warnings, request ); } //add an 3 empty rows to the Parent Tree records private void add3NewRows(Spr001aSmpCalculationForm formBean) { Spr001aSmpCalculationResultArrayElement newRowElement = new Spr001aSmpCalculationResultArrayElement(); formBean.getDataBean().getP_result().add(newRowElement); newRowElement = new Spr001aSmpCalculationResultArrayElement(); formBean.getDataBean().getP_result().add(newRowElement); newRowElement = new Spr001aSmpCalculationResultArrayElement(); formBean.getDataBean().getP_result().add(newRowElement); } //ensure that at least ten row records are add for each record private void addDefaultNumberOfRows(Spr001aSmpCalculationForm formBean) { while(formBean.getDataBean().getP_result().size() < 10) { Spr001aSmpCalculationResultArrayElement newRowElement = new Spr001aSmpCalculationResultArrayElement(); formBean.getDataBean().getP_result().add(newRowElement); } } }