/** * @(#)Spr01SeelotRegAction.java * Copyright (c) 2005, B.C. Ministry of Forests * All rights reserved. */ package ca.bc.gov.mof.spar.web.action; import java.io.IOException; import java.sql.SQLException; import java.sql.CallableStatement; import java.text.DecimalFormat; import java.util.Collection; import java.util.StringTokenizer; import java.util.ArrayList; import java.util.Iterator; import oracle.jdbc.OracleConnection; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.struts.action.ActionMessage; 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.commons.lang.StringUtils; import ca.bc.gov.mof.spar.data.SecureDataSource; import ca.bc.gov.mof.spar.data.beans.GetBgcSearchBean; import ca.bc.gov.mof.spar.data.beans.GetClientSearchBean; import ca.bc.gov.mof.spar.data.beans.GetLotSearchBean; import ca.bc.gov.mof.spar.data.beans.GetOrchardSearchBean; import ca.bc.gov.mof.spar.data.beans.Spr001SeedlotRegBean; import ca.bc.gov.mof.spar.data.beans.Spr001aParentTreeContribBean; import ca.bc.gov.mof.spar.db.ProvenanceStore; import ca.bc.gov.mof.spar.db.SparStore; import ca.bc.gov.mof.spar.db.FunctionExtStore; import ca.bc.gov.mof.spar.web.form.Spr01SeedlotRegForm; import ca.bc.gov.mof.spar.web.frame.ReportSubmissionAction; import ca.bc.gov.mof.spar.web.frame.SparForm; import ca.bc.gov.mof.spar.web.frame.SparReportConstants; import ca.bc.gov.mof.spar.web.frame.SparUser; import ca.bc.gov.mof.sil.webade.db.DataBean; import ca.bc.gov.mof.sil.webade.db.DataAccessInt; import ca.bc.gov.mof.sil.webade.db.OptionBean; import ca.bc.gov.mof.sil.webade.db.PackageMap; import ca.bc.gov.mof.sil.webade.db.Parameter; import ca.bc.gov.mof.sil.webade.db.StoreException; 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.ui.UserMessage; import ca.bc.gov.mof.sil.webade.db.ui.UserMessages; import ca.bc.gov.mof.sil.webade.db.util.Trace; import ca.bc.gov.mof.sil.webade.db.util.SessionSnoop; import ca.bc.gov.mof.spar.spatial.SparSpatialTools; import com.vividsolutions.jts.geom.Point; import com.vividsolutions.jts.geom.Envelope; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.CoordinateList; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jts.geom.MultiPolygon; import com.vividsolutions.jts.geom.Polygon; import com.vividsolutions.jts.io.oracle.OraWriter; import com.vividsolutions.jts.io.gml2.GMLWriter; import com.vividsolutions.jts.io.gml2.GMLReader; import com.vividsolutions.jts.operation.valid.IsValidOp; import com.vividsolutions.spatial.validation.BasicGeometryValidatior; /******************************************************** Action Class: Spr01SeelotRegAction.java Purpose: Spr01SeelotRegAction Revision History Person Date Comments ----------------- --------- ----------------------- omullenders Jun 2, 2005 Created *******************************************************/ public class Spr01SeedlotRegAction extends ReportSubmissionAction { private static final Trace trace = new Trace(Spr01SeedlotRegAction.class); private SecureDataSource dsn = null; // Constant values required by the seedmap colletion area capture functionality. public static final String MULTIPOLY_SESSION = "seed_markup_multipoly"; public static final String SEED_COLLECTION_GML = "seed_collection_gml"; public static final String SEED_COLLECTION_BEC_ZONES = "seed_collection_bec_zones_warn"; public static final String MULTI_POLY_GML = "multi_poly_gml"; public static final String POLY_IS_VALID_SESSION = "polyIsValid"; public static final String REPORT_SESSION = "ReportSubmitted"; public static final String QUERY_ENVELOPE = "x1"; public static final String QUERY_POLY_MARKUP = "pts"; public static final String APP_PARAM_EXCEPTION = "exception"; public static final String APP_PARAM_HIDDEN_RESPONSE = "hidden"; public static final String IMF_CONTEXT_PARAM = "collection-markup-url"; public static final String IMF_COLLECTION_TOOL = "collection-tool-name"; 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 userId = sparForm.getUser().getName(); String action = sparForm.getUserAction().trim(); if(StringUtils.isBlank(action) && (request.getParameter("action") != null)) { action = request.getParameter("action"); } sparForm.setUserAction(""); dsn = new SecureDataSource(request, "POPULATE_FORM"); //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()); Spr01SeedlotRegForm formBean = (Spr01SeedlotRegForm) form; //i.e. accessed for a subsearch if (searchRequest != null) { formBean.setBackForward(searchRequest.getRequestor()); } if (searchRequest == null && (!hasAValue(action))) { formBean.setBackForward(""); } //End of sub-search try { //To process returns from sub-searches if (searchResponse != null && searchResponse.getOk()) { DataBean results = searchResponse.getResults(); String searcher = searchResponse.getSearcher(); String searchType = ""; //session value is set when a search is started //we use the value to determine which client search we are //returning from and also to set the focus value needed for the jsp. if (session.getAttribute("searchType") != null) { searchType = (String) session.getAttribute("searchType"); session.removeAttribute("searchType"); mapJspFocus(formBean, searchType); } if (searcher.equalsIgnoreCase("/getLot")) { return processLotSearchResults(searchResponse, formBean, (GetLotSearchBean) results, request, mapping, errors, userId); } else if (searcher.equalsIgnoreCase("/getOrchardSearch")) { return processOrchardSearchResults(formBean, (GetOrchardSearchBean) results, mapping); } else if (searcher.equalsIgnoreCase("/getClientSearch")) { return processClientSearchResults(formBean, session, (GetClientSearchBean) results, mapping, searchType); } else if (searcher.equalsIgnoreCase("/getBgc")) { return processBgcSearchResults(formBean, (GetBgcSearchBean) results, mapping); } else if (searcher.equalsIgnoreCase("/spr01SeedlotRegAction")) { Spr001aParentTreeContribBean searchBean = (Spr001aParentTreeContribBean) results; formBean.getDataBean().setP_seedlot_number(searchBean.getP_seedlot_number()); String seedlotNumber = searchBean.getP_seedlot_number(); formBean.clear(); formBean.getDataBean().setP_seedlot_number(seedlotNumber); handleGet(mapping, formBean, request, errors); } } else if (action.startsWith("search")) { String mappingAction = ""; //populate the owner records so we have it on the return formBean.populateResultList(mapping, request); //Format the correct search action //Client searches uses _ to seperate the action from the specific agency e.g. searchClient_Applicant //Adding searchType to session for processing client search results AND //to set the focus on the jsp when coming back from a search. if (action.startsWith("searchClient")) { StringTokenizer deliminator = new StringTokenizer(action, "_"); mappingAction = deliminator.nextToken(); String sessionValue = deliminator.nextToken(); session.setAttribute("searchType", sessionValue); } else { mappingAction = action; session.setAttribute("searchType", action); } return requestSearch(mappingAction, (DataBean) formBean.getDataBean().clone(), session, "spr01SeedlotRegAction", mapping); } else if (action.equalsIgnoreCase("Go") || action.equalsIgnoreCase("Back")) //return from Parent Tree Contribution { clearCollectionAreaSession(request); String seedlotNumber = formBean.getDataBean().getP_seedlot_number(); formBean.clear(); formBean.getDataBean().setP_seedlot_number(seedlotNumber); handleGet(mapping, formBean, request, errors); } else if (action.equalsIgnoreCase("Add More Owners")) { //populate the dataBean list with values from the form in case the user has made changes addNewRow(formBean); mapJspFocus(formBean, action); } else if (action.equalsIgnoreCase("Recalc")) { handleRecalculate(mapping, formBean, request, response, errors, warnings); } else if (action.equalsIgnoreCase("Save")) { //If this is the first time we are setting the status to submit and //then do not save until the declaration checkbox has been checked if (formBean.getDataBean().getP_seedlot_status_code().equalsIgnoreCase("SUB") && !hasAValue(formBean.getDataBean().getP_declared_userid()) && !formBean.getDeclaredCheckBox().equals("on")) { //do not save on this condition only. We have to force the user //to check the declaration box. } else { //Calls the save for the form as well as the delete and saving of owner records handleSave(mapping, formBean, request, response, errors, warnings); } } else if (action.equalsIgnoreCase("Cancel Lot")) { handleCancel(mapping, formBean, request, response, errors, warnings); } else if (action.equalsIgnoreCase("Copy Seedlot")) { clearCollectionAreaSession(request); handleCopy(mapping, formBean, request, response, errors, warnings); } else if (action.equalsIgnoreCase("Clear") || action.equalsIgnoreCase("Add New") || action.equalsIgnoreCase("")) { clearCollectionAreaSession(request); formBean.clear(); formBean.setDefaults(); } else if (action.equalsIgnoreCase("Go To PT Contribution")) { clearCollectionAreaSession(request); return requestSearch("spr001aParentTreeContribAction", (DataBean) formBean.getDataBean().clone(), session, "spr01SeedlotRegAction", mapping); } else if (action.equalsIgnoreCase("seedMapLinkCol") || action.equalsIgnoreCase("seedMapLinkAou")) { if (action.equalsIgnoreCase("seedMapLinkCol")) { validateSpz(mapping, formBean, request, errors); } setSeedMapLinks(userId, action, formBean, session); } else if (action.equalsIgnoreCase("seedMapLinkColArea")) { // remove all collection area spatial data from session. clearCollectionAreaSession(request); setCollectionAreaPoly(formBean, session); warnings.addMessage(new UserMessage("spar.web.warning.spr01.save.spatial" , UserMessage.confirmation)); } else if (action.equalsIgnoreCase("defaultSpzs")) { formBean.getDataBean().setP_bec_override_ind("N"); handleDefaultSpzs(mapping, formBean, request, response, errors, warnings); } else if (action.equalsIgnoreCase("areaOfUseReport")) { //Send off Report Request submitReportRequest(getReportProgram(), SparReportConstants.SPRR069_REPORT_NAME, "PDF", "DIR", formBean.getUser().getName(), new String[] {formBean.getUser().getName()} , new String[] {"P_USERID"} , new String[0], request, response, errors, null); // DIR deliveries should return null, to prevent an illegal state exception. return null; } else if (action.equalsIgnoreCase("Adobe PDF Version")) { formBean.setActionCall("submitReport"); } else if (action.equalsIgnoreCase("submitReport")) { //Send off Report Request if (formBean.getDataBean().getP_genetic_class_code().equalsIgnoreCase("A")) { submitReportRequest(getReportProgram(), SparReportConstants.SPRR001A_REPORT_NAME, "PDF", "DIR", formBean.getUser().getName(), new String[] {formBean.getDataBean().getP_seedlot_number(), formBean.getUser().getName(), "", "1622"} , // hard-coded org as HTI new String[] {"P_SEEDLOT_NUMBER", "P_USER_USERID", "P_ERROR_MESSAGE", "P_ORG_UNIT_NO"} , new String[0], request, response, errors, null); } else { submitReportRequest(getReportProgram(), SparReportConstants.SPRR001_REPORT_NAME, "PDF", "DIR", formBean.getUser().getName(), new String[] {formBean.getDataBean().getP_seedlot_number(), formBean.getUser().getName(), ""} , new String[] {"P_SEEDLOT_NUMBER", "P_USER_USERID", "P_ERROR_MESSAGE"} , new String[0], request, response, errors, null); } // DIR deliveries should return null, to prevent an illegal state exception. return null; } else if (action.equalsIgnoreCase("addPoint")) { SessionSnoop snoop = new SessionSnoop(request.getSession()); snoop.showRequest(request); Boolean reportSubmitted = (Boolean) request.getSession().getAttribute(REPORT_SESSION); if (reportSubmitted == null) reportSubmitted = Boolean.FALSE; trace.debug("Report submitted? - " + reportSubmitted.toString()); request.getSession().setAttribute(POLY_IS_VALID_SESSION, validateMarkupPoints(request.getParameter(QUERY_POLY_MARKUP)).toString()); return mapping.findForward("markupDetails"); } else if (action.equalsIgnoreCase("addNewPoly")) { trace.debug("Adding additional polygon(s)..."); trace.debug(" -- Creating Geometry for drawn polygon..."); SessionSnoop snoop = new SessionSnoop(request.getSession()); snoop.showRequest(request); try { Polygon poly = processGeometry(request.getSession().getAttribute(QUERY_POLY_MARKUP).toString(), true); ArrayList polyArray = (ArrayList) request.getSession().getAttribute(MULTIPOLY_SESSION); if (poly != null) { if (polyArray == null) { trace.debug(" -- Creating new Multipolygon..."); polyArray = new ArrayList(); polyArray.add(poly); request.getSession().setAttribute(MULTI_POLY_GML, new GMLWriter().write(poly)); request.getSession().setAttribute(MULTIPOLY_SESSION, polyArray); } else { trace.debug(" -- Adding polygon to multipolygon..."); polyArray.add(poly); // was processing multi polygon gml, but that was un-necessary and // the query would grow larger than accepted by the http query string request.getSession().setAttribute(MULTI_POLY_GML, new GMLWriter().write(poly)); } } } catch (Exception ex) { ex.printStackTrace(); request.setAttribute("exception", ex); trace.debug("There was a general Exception thrown: " + ex.getMessage()); return mapping.findForward("polyError"); } return mapping.findForward("multiPoly"); } else if (action.equalsIgnoreCase("clearPoly")) { request.getSession().removeAttribute(MULTIPOLY_SESSION); return mapping.findForward("pointSuccess"); } else if (action.equalsIgnoreCase("clearLastPoly")) { try { ArrayList polyArray = (ArrayList) request.getSession().getAttribute(MULTIPOLY_SESSION); if (polyArray != null && polyArray.size() > 0) { polyArray.remove(polyArray.size() - 1); } return mapping.findForward("pointSuccess"); } catch (Exception e) { request.setAttribute("exception", e); return mapping.findForward("polyError"); } } else if (action.equalsIgnoreCase("submitPoly")) { SessionSnoop snoop = new SessionSnoop(request.getSession()); snoop.showRequest(request); trace.debug("Submitting Polygon now!"); request.getSession().setAttribute(REPORT_SESSION, Boolean.TRUE); Geometry poly = null; try { if (request.getSession().getAttribute(MULTIPOLY_SESSION) == null) { trace.debug("Creating a single Polygon GML Object..."); poly = processGeometry(request.getSession().getAttribute(QUERY_POLY_MARKUP).toString(), false); } else { trace.debug("Creating a Multi Polygon GML Object..."); poly = processGeometry(request.getSession().getAttribute(QUERY_POLY_MARKUP).toString(), true); ArrayList polyArray = (ArrayList) request.getSession().getAttribute(MULTIPOLY_SESSION); polyArray.add(poly); trace.debug("Array Size is " + polyArray.size()); if (polyArray.size() > 1) { poly = processMultiPoly(polyArray); } } } catch(Exception ex) { ex.printStackTrace(); request.setAttribute("exception", ex); trace.debug("There was a general Exception thrown: " + ex.getMessage()); return mapping.findForward("polyError"); } // poly has been validated for topology and spz at this point String[] becs = SparSpatialTools.getBecZones(dsn.getConnection(), poly); if (becs != null && becs.length > 1) { request.getSession().setAttribute(SEED_COLLECTION_BEC_ZONES, becs); for (int i = 0; i < becs.length; i++) { trace.debug("BEC ZONE: " + becs[i]); } } else { request.getSession().setAttribute(SEED_COLLECTION_BEC_ZONES, null); } // Save the drawn polygon(s) to the session. String gmlPoly = new GMLWriter().write(poly); request.getSession().setAttribute(SEED_COLLECTION_GML, gmlPoly); trace.debug(gmlPoly); return mapping.findForward("successPoly"); } } catch (Exception x) { x.printStackTrace(); errors.add("Exception", createActionError(x)); } finally { if (hasAValue(formBean.getDataBean().getP_declared_userid())) { formBean.setDeclaredCheckBox("on"); } else { formBean.setDeclaredCheckBox("off"); } refreshProvenanceCodes(formBean); } return checkErrors(mapping, formBean, errors, warnings, request); } private void mapJspFocus(Spr01SeedlotRegForm formBean, String focusValue) { if (hasAValue(focusValue)) { if (focusValue.equalsIgnoreCase("SearchLot")) { formBean.setJspFocus("dataBean.p_seedlot_number"); } else if (focusValue.equalsIgnoreCase("SearchOrchard")) { formBean.setJspFocus("dataBean.p_orchard_id"); } else if (focusValue.equalsIgnoreCase("SearchBgc")) { formBean.setJspFocus("becDisplayField.zone"); } else if (focusValue.equalsIgnoreCase("Applicant")) { formBean.setJspFocus("applicantAgencyDisplayField.id"); } else if (focusValue.equalsIgnoreCase("ConeCollector")) { formBean.setJspFocus("coneCollectorAgencyDisplayField.id"); } else if (focusValue.equalsIgnoreCase("Owners") || focusValue.equalsIgnoreCase("Add More Owners")) { formBean.setJspFocus("client_id"); } else if (focusValue.equalsIgnoreCase("Interim")) { formBean.setJspFocus("interimStorageAgencyDisplayField.id"); } else if (focusValue.equalsIgnoreCase("Extractory")) { formBean.setJspFocus("extractoryAgencyDisplayField.id"); } else if (focusValue.equalsIgnoreCase("SeedStorage")) { formBean.setJspFocus("seedStorageAgencyDisplayField.id"); } } else { formBean.setJspFocus(""); } } /** * Retrieves records from a search. * */ private void handleGet(ActionMapping mapping, Spr01SeedlotRegForm formBean, HttpServletRequest request, ActionErrors errors) throws StoreException { //holders needed for get action String userid = formBean.getUser().getName(); Spr001SeedlotRegBean dataBean = (Spr001SeedlotRegBean) formBean.getBean(); dataBean.setP_action("GET"); dataBean.setP_roles_string( ( (SparUser) formBean.getUser()).getUser_roles()); dataBean.setP_user_type( ( (SparUser) formBean.getUser()).getUser_type()); dataBean.setP_current_userid(userid); dataBean.setP_user_org_unit_no(formBean.getUser().getUser_org_unit()); dataBean.setP_user_client_number( ( (SparUser) formBean.getUser()).getUser_client()); dataBean.setP_user_client_locn_code( ( (SparUser) formBean.getUser()).getUser_client_locn()); dataBean.setP_error_message(""); try { SparStore store = new SparStore("ca.bc.gov.mof", userid, getAction(mapping, request)); dataBean.setPackageMapping(PackageMap.instance().getMapping("ca.bc.gov.mof.spar.data.beans.Spr001SeedlotRegBean")); dataBean = (Spr001SeedlotRegBean) store.get(dataBean); if (!super.parseToErrors(dataBean.getP_error_message(), errors)) { formBean.setBean(dataBean); formBean.setOriginalValidationFields(false); formBean.setOriginalSpzList(dataBean.getP_spz_list()); formBean.populateOwnerCodeArrays(); if (hasAValue(formBean.getDataBean().getP_revision_count())) { //setClientDisplay stuff setClientContainersInfo(formBean); formBean.populateSpzCodeValues(); //set flags formBean.setOriginalSeedlotStatus(formBean.getDataBean().getP_seedlot_status_code()); formBean.setOriginalSeedlotNumber(formBean.getDataBean().getP_seedlot_number()); formBean.setPreCFSStandardForm(); } } formBean.forceFormats(); formBean.setDefaults(); if (formBean.getDataBean().getItems().size() < 2) { this.addDefaultNumberOfRows(formBean); } } catch (Exception e) { e.printStackTrace(); errors.add("sil.web.exception.trace", createActionError(e)); } } /* * * Sends the current data to the database to recalculate certain fields * based on current values of the form. * * NOTE: the owner record set can not be returned with this call because we don't know * if the user has changed any values without saving. We have to temporarily store the result set * and then return it to the bean after a successful recalc action. * */ private void handleRecalculate(ActionMapping mapping, Spr01SeedlotRegForm formBean, HttpServletRequest request, HttpServletResponse response, ActionErrors errors, UserMessages messages) throws StoreException { Spr001SeedlotRegBean dataBean = (Spr001SeedlotRegBean) formBean.getBean(); dataBean.setP_action("RECALC"); String userid = formBean.getUser().getName(); dataBean.setP_current_userid(userid); 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_roles_string( ( (SparUser) formBean.getUser()).getUser_roles()); dataBean.setP_user_org_unit_no(formBean.getUser().getUser_org_unit()); dataBean.setP_error_message(""); //reconstruct the spz_list from the drop down dataBean.setP_spz_list(formBean.populateSpzListString()); try { //Save the owner records in a tmp bean Spr001SeedlotRegBean ownerItemBean = new Spr001SeedlotRegBean(); formBean.populateResultList(mapping, request); ownerItemBean.setItems(formBean.getDataBean().getItems()); SparStore store = new SparStore("ca.bc.gov.mof", userid, getAction(mapping, request)); dataBean.setPackageMapping(PackageMap.instance().getMapping("ca.bc.gov.mof.spar.data.beans.Spr001SeedlotRegBean")); dataBean = (Spr001SeedlotRegBean) store.get(dataBean); formBean.setBean(dataBean); formBean.populateSpzCodeValues(); if (!super.parseToErrors(dataBean.getP_error_message(), errors)) { formBean.setOriginalValidationFields(false); formBean.setDefaults(); formBean.clearBegContainer(); //reset the owner records formBean.getDataBean().setItems(ownerItemBean.getItems()); //formBean.setOriginalSpzList(dataBean.getP_spz_list()); } formBean.forceFormats(); } catch (Exception e) { e.printStackTrace(); errors.add("sil.web.exception.trace", createActionError(e)); } } private void handleCancel(ActionMapping mapping, Spr01SeedlotRegForm formBean, HttpServletRequest request, HttpServletResponse response, ActionErrors errors, UserMessages messages) throws StoreException { Spr001SeedlotRegBean dataBean = (Spr001SeedlotRegBean) formBean.getBean(); Spr001SeedlotRegBean cancelBean = new Spr001SeedlotRegBean(); String userid = formBean.getUser().getName(); cancelBean.setP_action("CANCEL LOT"); cancelBean.setP_current_userid(userid); cancelBean.setP_user_type( ( (SparUser) formBean.getUser()).getUser_type()); cancelBean.setP_user_client_number( ( (SparUser) formBean.getUser()).getUser_client()); cancelBean.setP_user_client_locn_code( ( (SparUser) formBean.getUser()).getUser_client_locn()); cancelBean.setP_user_org_unit_no(formBean.getUser().getUser_org_unit()); cancelBean.setP_seedlot_status_code(dataBean.getP_seedlot_status_code()); cancelBean.setP_seedlot_number(dataBean.getP_seedlot_number()); cancelBean.setP_revision_count(dataBean.getP_revision_count()); cancelBean.setP_error_message(""); try { SparStore store = new SparStore("ca.bc.gov.mof", userid, getAction(mapping, request)); cancelBean.setPackageMapping(PackageMap.instance().getMapping("ca.bc.gov.mof.spar.data.beans.Spr001SeedlotRegBean")); cancelBean = (Spr001SeedlotRegBean) store.get(cancelBean); if (!super.parseToErrors(cancelBean.getP_error_message(), errors)) { handleGet(mapping, formBean, request, errors); } } catch (Exception e) { e.printStackTrace(); errors.add("sil.web.exception.trace", createActionError(e)); } } private void handleCopy(ActionMapping mapping, Spr01SeedlotRegForm formBean, HttpServletRequest request, HttpServletResponse response, ActionErrors errors, UserMessages messages) throws StoreException { Spr001SeedlotRegBean dataBean = (Spr001SeedlotRegBean) formBean.getBean(); Spr001SeedlotRegBean copyBean = new Spr001SeedlotRegBean(); String userid = formBean.getUser().getName(); String originalSeedlotNumber = dataBean.getP_seedlot_number(); copyBean.setP_action("COPY_SEEDLOT"); copyBean.setP_current_userid(userid); copyBean.setP_user_type( ( (SparUser) formBean.getUser()).getUser_type()); copyBean.setP_user_client_number( ( (SparUser) formBean.getUser()).getUser_client()); copyBean.setP_user_client_locn_code( ( (SparUser) formBean.getUser()).getUser_client_locn()); copyBean.setP_user_org_unit_no(formBean.getUser().getUser_org_unit()); copyBean.setP_seedlot_number(dataBean.getP_seedlot_number()); copyBean.setP_new_copy_seedlot_number(dataBean.getP_new_copy_seedlot_number()); copyBean.setP_error_message(""); try { SparStore store = new SparStore("ca.bc.gov.mof", userid, getAction(mapping, request)); copyBean = (Spr001SeedlotRegBean) store.put(copyBean); if (!super.parseToErrors(copyBean.getP_error_message(), errors)) { store.commit(); formBean.getDataBean().setP_seedlot_number(copyBean.getP_seedlot_number()); handleGet(mapping, formBean, request, errors); messages.addMessage(new UserMessage("spar.web.warning.spr01.copy.success" , UserMessage.confirmation , new String[] {originalSeedlotNumber, formBean.getDataBean().getP_seedlot_number()})); } else { store.rollback(); } } catch (Exception e) { e.printStackTrace(); errors.add("sil.web.exception.trace", createActionError(e)); } } /** * Save will save the general form first and then loop through the owners record set and * attempt to save each individual record. * * If there are no errors for any of the saves then an update_audit_info check is done * If there are still no errors then a commit is done, else we do a rollback */ private void handleSave(ActionMapping mapping, Spr01SeedlotRegForm formBean, HttpServletRequest request, HttpServletResponse response, ActionErrors errors, UserMessages messages) throws StoreException { String userid = formBean.getUser().getName(); Spr001SeedlotRegBean dataBean = (Spr001SeedlotRegBean) formBean.getBean(); SparStore store = new SparStore("ca.bc.gov.mof", userid, getAction(mapping, request)); boolean areErrors = false; boolean multiBgcOverride = false; String seedlotNumber = ""; String revisionCount = dataBean.getP_revision_count(); String updateTimestamp = dataBean.getP_update_date(); dataBean.setP_error_message(""); dataBean.setP_action("SAVE"); dataBean.setP_current_userid(userid); 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_roles_string( ( (SparUser) formBean.getUser()).getUser_roles()); dataBean.setP_user_org_unit_no(formBean.getUser().getUser_org_unit()); dataBean.setP_error_message(""); //reconstruct the spz_list from the drop down dataBean.setP_spz_list(formBean.populateSpzListString()); //calculate and set the x and y coordinates. setXYCoordinates(dataBean); try { dataBean = (Spr001SeedlotRegBean) store.put(dataBean); String[] becs = (String[])request.getSession().getAttribute(SEED_COLLECTION_BEC_ZONES); if (becs != null && becs.length > 1) { String becZones = ""; for (int i = 0; i < becs.length; i++) { becZones = becZones + " " + becs[i]; } multiBgcOverride = true; // add the multi-zone error message to returned bean. if(StringUtils.isBlank(dataBean.getP_bec_override_comment())) { dataBean.setP_error_message(dataBean.getP_error_message() + "spar.web.error.spr01.usr.coll_area_multi_bec:" + becZones + ";"); dataBean.setP_bec_override_ind("Y"); } } //set the values from the save call into the form. //Errors or no errors we want to see any calculated data on the screen Collection ownerRecords = formBean.getDataBean().getItems(); formBean.setBean(dataBean); formBean.getDataBean().setItems(ownerRecords); //save the itemBeans if there were no errors in the regular save if (!super.parseToErrorsWarnings(dataBean.getP_error_message(), errors, messages)) { areErrors = handleItemsDelete(formBean, errors, store, userid); areErrors = handleItemSaves(formBean, errors, store, userid); } else { areErrors = true; } } catch (Exception e) { e.printStackTrace(); errors.add("sil.web.exception.trace", createActionError(e)); areErrors = true; } finally { if (!areErrors) { formBean.setBean(dataBean); formBean.setDeclarationCheckBoxEnabled(false); //Update the audit info for the table and unlock the record dataBean.setP_action("UPDATE_AUDIT_INFO"); dataBean = (Spr001SeedlotRegBean) store.put(dataBean); store.commit(); // Save the Collection Area Geometry information, if there is any. String gml = (String)request.getSession().getAttribute(SEED_COLLECTION_GML); Geometry poly = null; if(StringUtils.isNotBlank(gml)) { try { poly = (Geometry)new GMLReader().read(gml, SparSpatialTools.GEOMETRY_FACTORY); } catch(Exception ex) { poly = null; } } if(poly != null) { handleCollectionAreaSave(formBean, poly, multiBgcOverride, errors, userid); // remove all collection area spatial data from session. clearCollectionAreaSession(request); messages.addMessage(new UserMessage("spar.web.warning.save.coll_area", UserMessage.confirmation)); } //generate any warnings from the user entered or the calculated values generateWarnings(formBean, messages); seedlotNumber = formBean.getDataBean().getP_seedlot_number(); formBean.clear(); formBean.getDataBean().setP_seedlot_number(seedlotNumber); handleGet(mapping, formBean, request, errors); messages.addMessage(new UserMessage("spar.web.warning.save.success", UserMessage.confirmation)); } if(areErrors || !errors.isEmpty()) { store.rollback(); formBean.forceFormats(); formBean.setDefaults(); //if we have errors after trying to save a SUB request for the first time //set the stop condition for displaying the submission javaScript warning alert if (dataBean.getP_seedlot_status_code().equalsIgnoreCase("SUB") && !hasAValue(dataBean.getP_declared_userid())) { formBean.setDeclarationCheckBoxEnabled(false); } // set back these values, if there are errors, to prevent a modified record error // the next time a save is attempted. dataBean.setP_update_date(updateTimestamp); dataBean.setP_revision_count(revisionCount); } } } private boolean handleItemsDelete(Spr01SeedlotRegForm formBean, ActionErrors errors, SparStore store, String userid) throws StoreException { boolean areErrors = false; try { Spr001SeedlotRegBean tmpBean = formBean.getDataBean(); tmpBean.setP_error_message(""); tmpBean.setP_action("DELETE_OWNERS"); //tmpBean.setPackageMapping(PackageMap.instance().getMapping("ca.bc.gov.mof.spar.data.beans.Spr001SeedlotRegBean")); tmpBean = (Spr001SeedlotRegBean) store.put(tmpBean); //set the ErrorMessage back into the main bean if (super.parseToErrors(tmpBean.getP_error_message(), errors)) { areErrors = true; } } catch (Exception e) { errors.add("sil.web.exception.trace", createActionError(e)); e.printStackTrace(); } return areErrors; } /** * Iterates through and saves each record in the results record. * * Only saves the record if there are values. */ private boolean handleItemSaves(Spr01SeedlotRegForm formBean, ActionErrors errors, SparStore store, String userid) throws StoreException { boolean areErrors = false; try { for (int i = 0; i < formBean.getDataBean().getItems().size(); i++) { Spr001SeedlotRegBean tmpBean = (Spr001SeedlotRegBean) formBean.getDataBean().getItems().toArray()[i]; //only save if the record is not marked for deletion and we have not encountered errors so far if (formBean.checkOwnerDataExists(tmpBean) && !areErrors) { tmpBean = setItemBeanValues(tmpBean, formBean.getDataBean()); tmpBean.setP_current_userid(userid); tmpBean.setP_user_type( ( (SparUser) formBean.getUser()).getUser_type()); tmpBean.setP_user_client_number( ( (SparUser) formBean.getUser()).getUser_client()); tmpBean.setP_user_client_locn_code( ( (SparUser) formBean.getUser()).getUser_client_locn()); tmpBean.setP_roles_string( ( (SparUser) formBean.getUser()).getUser_roles()); tmpBean.setP_user_org_unit_no(formBean.getUser().getUser_org_unit()); //Grab the original funding source for the record and send it back. //Needed for package validation if (i < formBean.getOriginalFundingSource().length) { trace.put("***Just set the previous funding source with: " + formBean.getOriginalFundingSource()[i]); tmpBean.setP_prev_spar_fund_srce_code(formBean.getOriginalFundingSource()[i]); } tmpBean.setPackageMapping(PackageMap.instance().getMapping("ca.bc.gov.mof.spar.data.beans.Spr001SeedlotRegBean")); tmpBean = (Spr001SeedlotRegBean) store.put(tmpBean); if (super.parseToErrors(tmpBean.getP_error_message(), errors)) { areErrors = true; } } } } catch (Exception e) { e.printStackTrace(); errors.add("sil.web.exception.trace", createActionError(e)); } return areErrors; } /** * Iterates through and saves each record in the results record. * * Only saves the record if there are values. */ private boolean handleCollectionAreaSave(Spr01SeedlotRegForm formBean, Geometry poly, boolean multiBgcOverride, ActionErrors errors, String userid) throws StoreException { FunctionExtStore functionStore = null; CallableStatement callable = null; String overrideComment = ""; String error_message = ""; OracleConnection conn = null; if(multiBgcOverride) { overrideComment = formBean.getDataBean().getP_bec_override_comment(); } try { conn = (OracleConnection) ((ca.bc.gov.webade.dbpool.WrapperConnection)dsn.getConnection()).getWrappedConnection(); conn.setAutoCommit(false); OraWriter ow = new OraWriter(conn); ow.setSRID(3005); Parameter[] usdParms = { new Parameter("p_seedlot_number", DataAccessInt.VARCHAR, DataAccessInt.PARAM_IN, formBean.getDataBean().getP_seedlot_number()), new Parameter("p_coll_area_geom", DataAccessInt.STRUCT, DataAccessInt.PARAM_IN, ow.write(poly)), new Parameter("p_bec_override_comment", DataAccessInt.VARCHAR, DataAccessInt.PARAM_IN, overrideComment), new Parameter("p_user_type", DataAccessInt.VARCHAR, DataAccessInt.PARAM_IN, ((SparUser) formBean.getUser()).getUser_type()), new Parameter("p_current_userid", DataAccessInt.VARCHAR, DataAccessInt.PARAM_IN, userid), new Parameter("p_user_org_unit_no", DataAccessInt.VARCHAR, DataAccessInt.PARAM_IN, ((SparUser) formBean.getUser()).getUser_org_unit()), new Parameter("p_user_client_number", DataAccessInt.VARCHAR, DataAccessInt.PARAM_IN, ((SparUser) formBean.getUser()).getUser_client()), new Parameter("p_user_client_locn_code", DataAccessInt.VARCHAR, DataAccessInt.PARAM_IN, ((SparUser) formBean.getUser()).getUser_client_locn()), new Parameter("p_error_message", DataAccessInt.VARCHAR, DataAccessInt.PARAM_OUT, error_message), }; functionStore = new ca.bc.gov.mof.spar.db.FunctionExtStore("ca.bc.gov.mof", "SPR_001_SEEDLOT_REG.SAVE_COLLECTION_AREA_GEOM", usdParms, userid, "POPULATE_FORM"); callable = (CallableStatement) functionStore.execute(); } catch(Exception e) { if(conn != null) { try { conn.rollback(); }catch (Exception ex) { // don't bother. } } e.printStackTrace(); } finally { try {//clearing the resultSet and closing the connection callable.clearParameters(); callable.close(); } catch(SQLException sqle) { sqle.printStackTrace(); } } return false; } //Populates information from the results record into the main bean //parameter protected Spr001SeedlotRegBean setItemBeanValues(Spr001SeedlotRegBean ownerBean, Spr001SeedlotRegBean dataBean) { ownerBean.setP_seedlot_number(dataBean.getP_seedlot_number()); ownerBean.setP_original_balance_seed_ind(dataBean.getP_original_balance_seed_ind()); if (hasAValue(ownerBean.getClient_acronym())) { ownerBean.setP_owner_client_id(ownerBean.getClient_acronym()); } else { ownerBean.setP_owner_client_id(ownerBean.getClient_number()); } ownerBean.setP_owner_client_locn_code(ownerBean.getClient_locn_code()); ownerBean.setP_owner_client_name(ownerBean.getClient_name()); ownerBean.setP_original_pct_owned(ownerBean.getOriginal_pct_owned()); ownerBean.setP_original_pct_rsrvd(ownerBean.getOriginal_pct_rsrvd()); ownerBean.setP_original_pct_srpls(ownerBean.getOriginal_pct_srpls()); ownerBean.setP_method_of_payment_code(ownerBean.getMethod_of_payment_code()); ownerBean.setP_spar_fund_srce_code(ownerBean.getSpar_fund_srce_code()); ownerBean.setP_error_message(""); ownerBean.setP_action("SAVE_OWNER"); return ownerBean; } //add an empty row to the ownership records //and default the method of Payment to ITC for non ministry users private void addNewRow(Spr01SeedlotRegForm formBean) { Spr001SeedlotRegBean newRowBean = new Spr001SeedlotRegBean(); SparUser user = (SparUser) formBean.getUser(); trace.put("****USER IS: " + user.getUser_type()); if (!user.getUser_type().equals("M")) { newRowBean.setMethod_of_payment_code("ITC"); } formBean.getDataBean().getItems().add(newRowBean); } //ensure that at least two row records are add for each record //if the user is not a Ministry user default the method Of Payment to ITC private void addDefaultNumberOfRows(Spr01SeedlotRegForm formBean) { SparUser user = (SparUser) formBean.getUser(); while (formBean.getDataBean().getItems().size() < 2) { Spr001SeedlotRegBean newRowBean = new Spr001SeedlotRegBean(); if (!user.getUser_type().equals("M")) { newRowBean.setMethod_of_payment_code("ITC"); } formBean.getDataBean().getItems().add(newRowBean); } } /** * Sets the clientContainers and the BGC container information. * Takes values from databean * * NOTE: MUST set the locn code first then the client number. * If you set client first the location code is erased. DON'T KNOW WHY! */ private void setClientContainersInfo(Spr01SeedlotRegForm formBean) { Spr001SeedlotRegBean dataBean = formBean.getDataBean(); //Applicant Container if (hasAValue(dataBean.getP_applicant_client_number())) { formBean.getApplicantAgencyDisplayField().setLocationCode(dataBean.getP_applicant_client_locn()); formBean.getApplicantAgencyDisplayField().setId(dataBean.getP_applicant_client_number()); } //ConeCollector Container if (hasAValue(dataBean.getP_collection_cli_number())) { formBean.getConeCollectorAgencyDisplayField().setLocationCode(dataBean.getP_collection_cli_locn_cd()); formBean.getConeCollectorAgencyDisplayField().setId(dataBean.getP_collection_cli_number()); } //BGC container if (hasAValue(dataBean.getP_bgc_zone_code())) { formBean.getBecDisplayField().setZone(dataBean.getP_bgc_zone_code()); formBean.getBecDisplayField().setSubzone(dataBean.getP_bgc_subzone_code()); formBean.getBecDisplayField().setVariant(dataBean.getP_variant()); } //Seed Storage Container if (hasAValue(dataBean.getP_seed_store_client_number())) { formBean.getSeedStorageAgencyDisplayField().setLocationCode(dataBean.getP_seed_store_client_locn()); formBean.getSeedStorageAgencyDisplayField().setId(dataBean.getP_seed_store_client_number()); } //Interim Container if (hasAValue(dataBean.getP_interm_strg_client_number())) { formBean.getInterimStorageAgencyDisplayField().setLocationCode(dataBean.getP_interm_strg_client_locn()); formBean.getInterimStorageAgencyDisplayField().setId(dataBean.getP_interm_strg_client_number()); } //Extractory Container if (hasAValue(dataBean.getP_extrct_cli_number())) { formBean.getExtractoryAgencyDisplayField().setLocationCode(dataBean.getP_extrct_cli_locn_cd()); formBean.getExtractoryAgencyDisplayField().setId(dataBean.getP_extrct_cli_number()); } } protected ActionForward processLotSearchResults(SearchResponse searchResponse, Spr01SeedlotRegForm formBean, GetLotSearchBean results, HttpServletRequest request, ActionMapping mapping, ActionErrors errors, String userid) throws Exception { if (hasAValue(results.getLot_id())) { GetLotSearchBean searchResult = (GetLotSearchBean) searchResponse.getResults(); if (searchResult != null) { formBean.setDataBean( (Spr001SeedlotRegBean) searchResponse.getRequestorBean(0)); formBean.getDataBean().setP_seedlot_number(searchResult.getLot_id()); handleGet(mapping, formBean, request, errors); } else { errors.add("search", new ActionMessage("spar.web.error.usr.searchempty")); } } return mapping.findForward("success"); } protected ActionForward processOrchardSearchResults(Spr01SeedlotRegForm form, GetOrchardSearchBean results, ActionMapping mapping) throws Exception { if (hasAValue(results.getOrchard_id())) { form.getDataBean().setP_orchard_id(results.getOrchard_id()); form.getDataBean().setP_orchard_name(results.getOrchard_name()); } else { form.getDataBean().setP_orchard_name(""); } return mapping.findForward("success"); } /** * Populates the dataBean and the displayField parameters for the cooresponding client search. * * @param clientSearchType - Session value to determine which search parameters to fill */ protected ActionForward processClientSearchResults(Spr01SeedlotRegForm form, HttpSession session, GetClientSearchBean results, ActionMapping mapping, String clientSearchType) throws Exception { //The back button from a search page still falls int the method //test to see if the bean contains any values before setting the //client containers if (hasAValue(results.getClient_number())) { if (clientSearchType.equalsIgnoreCase("Applicant")) { SparUser user = (SparUser) form.getUser(); //only reset client id if the client is a ministry user if (user.getUser_type() != null && user.getUser_type().equals("M")) { form.getDataBean().setP_applicant_client_number(results.getClient_number()); form.getDataBean().setP_applicant_client_name(results.getClient_name()); form.getApplicantAgencyDisplayField().setId(results.getClient_number()); } //client location can only be set if ministry user OR if client name //matches originalClientName if (form.getOriginalClientId().equalsIgnoreCase(results.getClient_number()) || (user.getUser_type() != null && user.getUser_type().equals("M"))) { form.getDataBean().setP_applicant_client_locn(results.getClient_locn_code()); form.getApplicantAgencyDisplayField().setLocationCode(results.getClient_locn_code()); } } else if (clientSearchType.equalsIgnoreCase("ConeCollector")) { form.getDataBean().setP_collection_cli_number(results.getClient_number()); form.getDataBean().setP_collection_cli_locn_cd(results.getClient_locn_code()); form.getDataBean().setP_collection_cli_name(results.getClient_name()); form.getConeCollectorAgencyDisplayField().setId(results.getClient_number()); form.getConeCollectorAgencyDisplayField().setLocationCode(results.getClient_locn_code()); } else if (clientSearchType.equalsIgnoreCase("Interim")) { form.getDataBean().setP_interm_strg_client_number(results.getClient_number()); form.getDataBean().setP_interm_strg_client_locn(results.getClient_locn_code()); form.getDataBean().setP_interm_strg_client_name(results.getClient_name()); form.getInterimStorageAgencyDisplayField().setId(results.getClient_number()); form.getInterimStorageAgencyDisplayField().setLocationCode(results.getClient_locn_code()); } else if (clientSearchType.equalsIgnoreCase("Extractory")) { form.getDataBean().setP_extrct_cli_number(results.getClient_number()); form.getDataBean().setP_extrct_cli_locn_cd(results.getClient_locn_code()); form.getDataBean().setP_extrct_cli_name(results.getClient_name()); form.getExtractoryAgencyDisplayField().setId(results.getClient_number()); form.getExtractoryAgencyDisplayField().setLocationCode(results.getClient_locn_code()); } else if (clientSearchType.equalsIgnoreCase("SeedStorage")) { form.getDataBean().setP_seed_store_client_number(results.getClient_number()); form.getDataBean().setP_seed_store_client_locn(results.getClient_locn_code()); form.getDataBean().setP_seed_store_client_name(results.getClient_name()); form.getSeedStorageAgencyDisplayField().setId(results.getClient_number()); form.getSeedStorageAgencyDisplayField().setLocationCode(results.getClient_locn_code()); } else if (clientSearchType.equalsIgnoreCase("Owners")) { //do not update owner info search if original balance of seed is set if (!form.getDataBean().getP_original_balance_seed_ind().equalsIgnoreCase("Y")) { int index = Integer.valueOf(form.getSearchRowIndex()).intValue(); Spr001SeedlotRegBean listItemBean; listItemBean = (Spr001SeedlotRegBean) form.getDataBean().getItems().toArray()[index]; if (hasAValue(results.getClient_number())) { listItemBean.setClient_number(results.getClient_number()); listItemBean.setClient_locn_code(results.getClient_locn_code()); listItemBean.setClient_acronym(results.getClient_acronym()); listItemBean.setClient_name(results.getClient_name()); // replace 'old' bean with the new one form.getDataBean().getItems().toArray()[index] = listItemBean; } } } } return mapping.findForward("success"); } //If BC source = N then do not populate the search results protected ActionForward processBgcSearchResults(Spr01SeedlotRegForm form, GetBgcSearchBean results, ActionMapping mapping) throws Exception { // check to make sure something was returned and bc source = N. if (hasAValue(results.getBec_code_id()) && !form.getDataBean().getP_bc_source_ind().equalsIgnoreCase("N")) { form.getBecDisplayField().setBecId(results.getBec_code_id()); form.getBecDisplayField().setZone(results.getBgc_zone_cd()); form.getBecDisplayField().setSubzone(results.getBgc_subzone_cd()); form.getBecDisplayField().setVariant(results.getVariant()); } return mapping.findForward("success"); } private void generateWarnings(Spr01SeedlotRegForm formBean, UserMessages warnings) { //Total Volume must equal # containers * vol/container if and only if ALL three fields have values. if (hasAValue(formBean.getDataBean().getP_no_of_containers()) && hasAValue(formBean.getDataBean().getP_vol_per_container()) && hasAValue(formBean.getDataBean().getP_clctn_volume())) { // Truncate getVolume to two decimal places. DecimalFormat amountFormat = new DecimalFormat("#####0.00"); try { double volumePerContainer = Double.parseDouble(formBean.getDataBean().getP_vol_per_container()); double numberContainers = Double.parseDouble(formBean.getDataBean().getP_no_of_containers()); double result = volumePerContainer * numberContainers; double volumeOfCones = Double.parseDouble(formBean.getDataBean().getP_clctn_volume()); if (!amountFormat.format(result).equals(amountFormat.format(volumeOfCones))) { warnings.addMessage(new UserMessage("spar.web.warning.volume.collected", UserMessage.confirmation)); } } catch (Exception x) { // validators will handle format errors } } } // refresh filtered spu lists public void refreshProvenanceCodes(Spr01SeedlotRegForm form) { try { ProvenanceStore provStore = new ProvenanceStore("ca.bc.gov.mof", "PKG_SPR_CODE_LISTS.GET_PROVENANCE", new Parameter[1], form.getUser().getName(), "POPULATE_FORM"); OptionBean[] provenanceCodes = provStore.getProvenanceCodeList(form.getDataBean().getP_vegetation_code()); form.setProvenanceCodes(provenanceCodes); provStore.commit(); } catch (StoreException x) { x.printStackTrace(); } catch (SQLException x) { x.printStackTrace(); } } private void validateSpz(ActionMapping mapping, Spr01SeedlotRegForm formBean, HttpServletRequest request, ActionErrors errors) throws StoreException { //holders needed for get action String userid = formBean.getUser().getName(); Spr001SeedlotRegBean dataBean = (Spr001SeedlotRegBean) formBean.getBean(); dataBean.setP_action("VALIDATE_SPZ"); setXYCoordinates(dataBean); dataBean.setP_roles_string( ( (SparUser) formBean.getUser()).getUser_roles()); dataBean.setP_user_type( ( (SparUser) formBean.getUser()).getUser_type()); dataBean.setP_current_userid(userid); dataBean.setP_user_org_unit_no(formBean.getUser().getUser_org_unit()); dataBean.setP_user_client_number( ( (SparUser) formBean.getUser()).getUser_client()); dataBean.setP_user_client_locn_code( ( (SparUser) formBean.getUser()).getUser_client_locn()); dataBean.setP_error_message(""); try { SparStore store = new SparStore("ca.bc.gov.mof", userid, getAction(mapping, request)); dataBean.setPackageMapping(PackageMap.instance().getMapping("ca.bc.gov.mof.spar.data.beans.Spr001SeedlotRegBean")); dataBean = (Spr001SeedlotRegBean) store.get(dataBean); if (StringUtils.isNotBlank(dataBean.getP_error_message())) { formBean.setDisplaySeedmapWarning(true); dataBean.setP_error_message(""); } } catch (Exception e) { e.printStackTrace(); errors.add("sil.web.exception.trace", createActionError(e)); } } protected void setSeedMapLinks(String userid, String action, Spr01SeedlotRegForm formBean, HttpSession session) { try { if (action.equalsIgnoreCase("seedMapLinkCol")) { String seedMapLinkCol = getServletContext().getInitParameter("seedmap-url"); int lat_deg = Integer.parseInt(formBean.getDataBean().getP_collection_lat_deg()); int lat_min = Integer.parseInt(formBean.getDataBean().getP_collection_lat_min()); int lat_sec = Integer.parseInt(formBean.getDataBean().getP_collection_lat_sec()); int long_deg = Integer.parseInt(formBean.getDataBean().getP_collection_long_deg()); int long_min = Integer.parseInt(formBean.getDataBean().getP_collection_long_min()); int long_sec = Integer.parseInt(formBean.getDataBean().getP_collection_long_sec()); Point coordinates = SparSpatialTools.getPoint(lat_deg, lat_min, lat_sec, long_deg, long_min, long_sec); Envelope extentArea = SparSpatialTools.buffer(coordinates, SparSpatialTools.DEFAULT_BUFFER_SIZE); seedMapLinkCol = seedMapLinkCol + "&theme=" + SparSpatialTools.COLLECTION_THEME; if (StringUtils.isNotBlank(formBean.getDataBean().getP_seed_plan_zone_code())) { seedMapLinkCol = seedMapLinkCol + "&spz=" + formBean.getDataBean().getP_seed_plan_zone_code(); } if (StringUtils.isNotBlank(formBean.getDataBean().getP_vegetation_code())) { seedMapLinkCol = seedMapLinkCol + "&species=" + formBean.getDataBean().getP_vegetation_code(); } seedMapLinkCol = seedMapLinkCol + "&seedlot=" + formBean.getDataBean().getP_seedlot_number(); seedMapLinkCol = seedMapLinkCol + "&extent=" + extentArea.getMinX() + "," + extentArea.getMinY() + "," + extentArea.getMaxX() + "," + extentArea.getMaxY(); formBean.setSeedMapLink(seedMapLinkCol); session.setAttribute("popupLink", seedMapLinkCol); } else if (action.equalsIgnoreCase("seedMapLinkAou")) { // This creates the seedmap Area Of Use url parameters String seedMapLinkAou = getServletContext().getInitParameter("seedmap-url"); String theme = ""; String gmlParam = ""; Envelope extentArea = null; if (formBean.getDataBean().getP_genetic_class_code().equalsIgnoreCase("A")) { theme = SparSpatialTools.AOUA_THEME; } else if (formBean.getDataBean().getP_genetic_class_code().equalsIgnoreCase("B") && !formBean.getDataBean().getP_superior_prvnc_ind().equalsIgnoreCase("Y")) { theme = SparSpatialTools.AOUB_THEME; } else if (formBean.getDataBean().getP_genetic_class_code().equalsIgnoreCase("B") && formBean.getDataBean().getP_superior_prvnc_ind().equalsIgnoreCase("Y")) { theme = SparSpatialTools.AOUB_PLUS_THEME; } seedMapLinkAou = seedMapLinkAou + "&theme=" + theme; if (StringUtils.isNotBlank(formBean.getDataBean().getP_spz_list())) { seedMapLinkAou = seedMapLinkAou + "&spz=" + formBean.getDataBean().getP_spz_list(); String[] listOfSpzs = formBean.getDataBean().getP_spz_list().split(","); // if there are multiple spzs, get the gml of all spzs combined. if (listOfSpzs.length > 1) { Geometry[] geoms = SparSpatialTools.getSpzGeometry(userid, formBean.getDataBean().getP_spz_list(), formBean.getDataBean().getP_genetic_class_code(), formBean.getDataBean().getP_vegetation_code()); extentArea = SparSpatialTools.getEnvelope(geoms); } } if (theme.equals(SparSpatialTools.AOUA_THEME) && StringUtils.isNotBlank(formBean.getDataBean().getP_vegetation_code())) { seedMapLinkAou = seedMapLinkAou + "&species=" + formBean.getDataBean().getP_vegetation_code(); } if (theme.equals(SparSpatialTools.AOUB_THEME) || theme.equals(SparSpatialTools.AOUB_PLUS_THEME)) { seedMapLinkAou = seedMapLinkAou + "&seedlot=" + formBean.getDataBean().getP_seedlot_number(); } if (theme.equals(SparSpatialTools.AOUB_THEME) && StringUtils.isNotBlank(formBean.getDataBean().getP_bgc_zone_code())) { seedMapLinkAou = seedMapLinkAou + "&beczone=" + formBean.getDataBean().getP_bgc_zone_code(); } // if the gmlParam value has not already been set, and lat and long ranges // are available, get the gml based on the lat and long range. if (extentArea == null && formBean.rangeLimitExists()) { extentArea = SparSpatialTools.getEnvelope(formBean.getDataBean().getP_latitude_deg_max(), formBean.getDataBean().getP_latitude_min_max(), formBean.getDataBean().getP_latitude_sec_max(), formBean.getDataBean().getP_latitude_deg_min(), formBean.getDataBean().getP_latitude_min_min(), formBean.getDataBean().getP_latitude_sec_min(), formBean.getDataBean().getP_longitude_deg_max(), formBean.getDataBean().getP_longitude_min_max(), formBean.getDataBean().getP_longitude_sec_max(), formBean.getDataBean().getP_longitude_deg_min(), formBean.getDataBean().getP_longitude_min_min(), formBean.getDataBean().getP_longitude_sec_min()); if (!theme.equals(SparSpatialTools.AOUB_PLUS_THEME)) { gmlParam = SparSpatialTools.getGML(formBean.getDataBean().getP_latitude_deg_max(), formBean.getDataBean().getP_latitude_min_max(), formBean.getDataBean().getP_latitude_sec_max(), formBean.getDataBean().getP_latitude_deg_min(), formBean.getDataBean().getP_latitude_min_min(), formBean.getDataBean().getP_latitude_sec_min(), formBean.getDataBean().getP_longitude_deg_max(), formBean.getDataBean().getP_longitude_min_max(), formBean.getDataBean().getP_longitude_sec_max(), formBean.getDataBean().getP_longitude_deg_min(), formBean.getDataBean().getP_longitude_min_min(), formBean.getDataBean().getP_longitude_sec_min(), true); } } // if there is a range, the extent would be set to the same size as the // area of use bounding box (range), but if no range(gmlParam) exists, // set the extent to be a default zoom size. if (extentArea == null) { // if no gml, default to a 10km buffer zone. int lat_deg = Integer.parseInt(formBean.getDataBean().getP_collection_lat_deg()); int lat_min = Integer.parseInt(formBean.getDataBean().getP_collection_lat_min()); int lat_sec = Integer.parseInt(formBean.getDataBean().getP_collection_lat_sec()); int long_deg = Integer.parseInt(formBean.getDataBean().getP_collection_long_deg()); int long_min = Integer.parseInt(formBean.getDataBean().getP_collection_long_min()); int long_sec = Integer.parseInt(formBean.getDataBean().getP_collection_long_sec()); Point coordinates = SparSpatialTools.getPoint(lat_deg, lat_min, lat_sec, long_deg, long_min, long_sec); extentArea = SparSpatialTools.buffer(coordinates, SparSpatialTools.DEFAULT_BUFFER_SIZE); } if (extentArea != null) { seedMapLinkAou = seedMapLinkAou + "&extent=" + extentArea.getMinX() + "," + extentArea.getMinY() + "," + extentArea.getMaxX() + "," + extentArea.getMaxY(); } if (StringUtils.isNotBlank(gmlParam)) { seedMapLinkAou = seedMapLinkAou + "&range=" + gmlParam; } formBean.setSeedMapLink(seedMapLinkAou); // the attribute will be used by the popup lnk action class to determine // the url. session.setAttribute("popupLink", seedMapLinkAou); } } catch (Exception ex) { // Ignore number format exceptions } } protected void setCollectionAreaPoly(Spr01SeedlotRegForm formBean, HttpSession session) { try { String seedMapLinkCol = getServletContext().getInitParameter("seedmap-url"); int lat_deg = Integer.parseInt(formBean.getDataBean().getP_collection_lat_deg()); int lat_min = Integer.parseInt(formBean.getDataBean().getP_collection_lat_min()); int lat_sec = Integer.parseInt(formBean.getDataBean().getP_collection_lat_sec()); int long_deg = Integer.parseInt(formBean.getDataBean().getP_collection_long_deg()); int long_min = Integer.parseInt(formBean.getDataBean().getP_collection_long_min()); int long_sec = Integer.parseInt(formBean.getDataBean().getP_collection_long_sec()); Point coordinates = SparSpatialTools.getPoint(lat_deg, lat_min, lat_sec, long_deg, long_min, long_sec); Envelope extentArea = SparSpatialTools.buffer(coordinates, SparSpatialTools.DEFAULT_BUFFER_SIZE); seedMapLinkCol = seedMapLinkCol + "&theme=" + SparSpatialTools.COLL_AREA_THEME; seedMapLinkCol = seedMapLinkCol + "&seedlot=" + formBean.getDataBean().getP_seedlot_number(); seedMapLinkCol = seedMapLinkCol + "&extent=" + extentArea.getMinX() + "," + extentArea.getMinY() + "," + extentArea.getMaxX() + "," + extentArea.getMaxY(); formBean.setSeedMapLink(seedMapLinkCol); session.setAttribute("popupLink", seedMapLinkCol); } catch (Exception ex) { // Ignore number format exceptions } } protected void handleDefaultSpzs(ActionMapping mapping, Spr01SeedlotRegForm formBean, HttpServletRequest request, HttpServletResponse response, ActionErrors errors, UserMessages messages) throws StoreException { String userid = formBean.getUser().getName(); Spr001SeedlotRegBean dataBean = (Spr001SeedlotRegBean) formBean.getBean(); dataBean.setP_error_message(""); Spr001SeedlotRegBean tempBean = new Spr001SeedlotRegBean(); SparStore store = new SparStore("ca.bc.gov.mof", userid, getAction(mapping, request)); //calculate and set the x and y coordinates. setXYCoordinates(dataBean); tempBean.setP_action("GET_DEFAULT_SPZS"); tempBean.setP_vegetation_code(dataBean.getP_vegetation_code()); tempBean.setP_x_coordinate(dataBean.getP_x_coordinate()); tempBean.setP_y_coordinate(dataBean.getP_y_coordinate()); tempBean.setP_seed_plan_zone_code(dataBean.getP_seed_plan_zone_code()); tempBean.setP_bgc_zone_code(dataBean.getP_bgc_zone_code()); tempBean.setP_bgc_subzone_code(dataBean.getP_bgc_subzone_code()); tempBean.setP_variant(dataBean.getP_variant()); try { tempBean.setPackageMapping(PackageMap.instance().getMapping("ca.bc.gov.mof.spar.data.beans.Spr001SeedlotRegBean")); tempBean = (Spr001SeedlotRegBean) store.get(tempBean); if (!super.parseToErrors(tempBean.getP_error_message(), errors)) { dataBean.setP_seed_plan_zone_code(tempBean.getP_seed_plan_zone_code()); dataBean.setP_bgc_zone_code(tempBean.getP_bgc_zone_code()); dataBean.setP_bgc_subzone_code(tempBean.getP_bgc_subzone_code()); dataBean.setP_variant(tempBean.getP_variant()); dataBean.setP_bec_version(tempBean.getP_bec_version()); formBean.getBecDisplayField().setZone(tempBean.getP_bgc_zone_code()); formBean.getBecDisplayField().setSubzone(tempBean.getP_bgc_subzone_code()); formBean.getBecDisplayField().setVariant(tempBean.getP_variant()); } } catch (Exception e) { e.printStackTrace(); errors.add("sil.web.exception.trace", createActionError(e)); } } protected void setXYCoordinates(Spr001SeedlotRegBean dataBean) { try { if (hasAValue(dataBean.getP_collection_lat_deg()) && hasAValue(dataBean.getP_collection_long_deg())) { int lat_deg = Integer.parseInt(dataBean.getP_collection_lat_deg()); int lat_min = Integer.parseInt(dataBean.getP_collection_lat_min()); int lat_sec = Integer.parseInt(dataBean.getP_collection_lat_sec()); int long_deg = Integer.parseInt(dataBean.getP_collection_long_deg()); int long_min = Integer.parseInt(dataBean.getP_collection_long_min()); int long_sec = Integer.parseInt(dataBean.getP_collection_long_sec()); Point coordinates = SparSpatialTools.getPoint(lat_deg, lat_min, lat_sec, long_deg, long_min, long_sec); dataBean.setP_x_coordinate(String.valueOf(coordinates.getCoordinate().x)); dataBean.setP_y_coordinate(String.valueOf(coordinates.getCoordinate().y)); } } catch (Exception ex) { // Ignore number format exceptions ex.printStackTrace(); } } /** * Validate the geometry of a Feature * @param geom the geometry to validate * @return Boolean true if valid, false if invalid */ private boolean validateGeometry(Geometry geom) { trace.debug("Validating Geometry..."); if (geom == null)return false; BasicGeometryValidatior geomVal = new BasicGeometryValidatior(true); geomVal.setGeometryToValidate(geom); geomVal.validate(); if (!geomVal.isValid())return false; return true; } /** * Validate the coordinates of a feature * @param geom the Geometry to validate * @return Boolean true if valid, false if invalid */ private boolean validateCoordinates(Geometry geom) { trace.debug("Validating Geometry Coordinates..."); return IsValidOp.isValid(geom.getCoordinate()); } private Boolean validateMarkupPoints(String points) { trace.debug("Validating Markup for points: " + points); try { Polygon poly = processGeometry(points, false, false); if (!validateGeometry(poly)) { return Boolean.FALSE; } else if (!validateCoordinates(poly)) { return Boolean.FALSE; } } catch (Exception e) { trace.debug(e.getMessage()); return Boolean.FALSE; } return Boolean.TRUE; } private Polygon processGeometry(String points, boolean isNullable) throws Exception { return processGeometry(points, isNullable, true); } private Polygon processGeometry(String points, boolean isNullable, boolean checkSPZ) throws Exception { String[] pointsSplit = points.split(","); CoordinateList coords = new CoordinateList(); for (int i = 0; i < pointsSplit.length; i++) { Coordinate coord = new Coordinate(); coord.x = Double.parseDouble(pointsSplit[i]); // skip over the next as we'll process it now. instead of in the loop i++; coord.y = Double.parseDouble(pointsSplit[i]); coords.add(coord); } if (coords.size() < 1 && isNullable) { return null; } coords.closeRing(); GeometryFactory gf = new GeometryFactory(); Polygon poly = gf.createPolygon(gf.createLinearRing(coords.toCoordinateArray()), null); if (!validateGeometry(poly)) { throw new Exception("You have drawn an invalid polygon"); } else if (!validateCoordinates(poly)) { throw new Exception("You have drawn an invalid polygon"); } if (checkSPZ) { String[] spzs = SparSpatialTools.getSpz(dsn.getConnection(), poly); if (spzs != null && spzs.length > 1) { String spz = ""; for (int i = 0; i < spzs.length; i++) spz = spz + " " + spzs[i]; throw new Exception("You have drawn an invalid polygon. Geometry crosses more than one Seed Planning Zone: " + spz.trim()); } } trace.debug("Done!"); return poly; } private MultiPolygon processMultiPoly(ArrayList polyArray) throws Exception { for (Iterator i = polyArray.iterator(); i.hasNext(); ) { Object t = i.next(); if (t == null) { trace.debug("Removing null geom"); i.remove(); } } if (polyArray.size() > 1) { Polygon[] polygons = new Polygon[polyArray.size()]; for (int i = 0; i < polyArray.size(); i++) { polygons[i] = (Polygon) polyArray.get(i); } GeometryFactory gf = new GeometryFactory(); MultiPolygon multiPoly = gf.createMultiPolygon(polygons); if (!validateGeometry(multiPoly)) { throw new Exception("You have drawn an invalid polygon. Failure on Validation of Geometry"); } else if (!validateCoordinates(multiPoly)) { throw new Exception("You have drawn an invalid polygon. Failure on Validation of Coordinates"); } String[] spzs = SparSpatialTools.getSpz(dsn.getConnection(), multiPoly); if (spzs != null && spzs.length > 1) { String spz = ""; for (int i = 0; i < spzs.length; i++) spz = spz + " " + spzs[i]; throw new Exception("You have drawn an invalid polygon. Geometry crosses more than one Seed Planning Zone: " + spz.trim()); } return multiPoly; } else { if (polyArray.size() == 1)return (MultiPolygon) polyArray.iterator().next(); return null; } } private void clearCollectionAreaSession(HttpServletRequest request) { request.getSession().removeAttribute(Spr01SeedlotRegAction.MULTIPOLY_SESSION); request.getSession().removeAttribute(Spr01SeedlotRegAction.SEED_COLLECTION_GML); request.getSession().removeAttribute(Spr01SeedlotRegAction.SEED_COLLECTION_BEC_ZONES); request.getSession().removeAttribute(Spr01SeedlotRegAction.POLY_IS_VALID_SESSION); request.getSession().removeAttribute(Spr01SeedlotRegAction.MULTI_POLY_GML); request.getSession().removeAttribute(Spr01SeedlotRegAction.REPORT_SESSION); request.getSession().removeAttribute(Spr01SeedlotRegAction.QUERY_ENVELOPE); request.getSession().removeAttribute(Spr01SeedlotRegAction.QUERY_POLY_MARKUP); } }