/* * Copyright 2014 astamuse company,Ltd. * * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package com.astamuse.asta4d.sample.handler.form.multiinput; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; import com.astamuse.asta4d.sample.handler.form.JobForm; import com.astamuse.asta4d.sample.handler.form.JobPositionForm; import com.astamuse.asta4d.sample.handler.form.PersonForm; import com.astamuse.asta4d.sample.handler.form.common.Asta4DSamplePrjCommonFormHandler; import com.astamuse.asta4d.sample.util.persondb.JobExperence; import com.astamuse.asta4d.sample.util.persondb.JobExperenceDbManager; import com.astamuse.asta4d.sample.util.persondb.JobPosition; import com.astamuse.asta4d.sample.util.persondb.JobPositionDbManager; import com.astamuse.asta4d.sample.util.persondb.PersonDbManager; import com.astamuse.asta4d.util.collection.ListConvertUtil; import com.astamuse.asta4d.util.collection.RowConvertor; import com.astamuse.asta4d.web.form.flow.ext.MultiInputStepFormFlowHandlerTrait; import com.astamuse.asta4d.web.util.message.DefaultMessageRenderingHelper; //@ShowCode:showSplittedFormHandlerStart public abstract class MultiInputFormHandler extends Asta4DSamplePrjCommonFormHandler<MultiInputForm> implements MultiInputStepFormFlowHandlerTrait<MultiInputForm> { public Class<MultiInputForm> getFormCls() { return MultiInputForm.class; } @Override public String[] getInputSteps() { return new String[] { MultiInputForm.inputStep1, MultiInputForm.inputStep2 }; } @Override public MultiInputForm generateFormInstanceFromContext(String currentStep) { MultiInputForm form = super.generateFormInstanceFromContext(currentStep); if (MultiInputForm.inputStep2.equalsIgnoreCase(currentStep)) { // rewrite the array to handle deleted items CascadeJobForm cjForm = form.getCascadeJobForm(); List<JobForm> rewriteJobList = new LinkedList<>(); for (JobForm jobform : cjForm.getJobForms()) { List<JobPositionForm> rewritePosList = new LinkedList<>(); // remove rows without job id specified for (JobPositionForm posForm : jobform.getJobPositionForms()) { if (posForm.getJobId() != null) { rewritePosList.add(posForm); } } jobform.setJobPositionForms(rewritePosList.toArray(new JobPositionForm[rewritePosList.size()])); jobform.setJobPositionLength(jobform.getJobPositionForms().length); // remove rows without person id specified if (jobform.getPersonId() != null) { rewriteJobList.add(jobform); } } cjForm.setJobForms(rewriteJobList.toArray(new JobForm[rewriteJobList.size()])); cjForm.setJobExperienceLength(cjForm.getJobForms().length); } return form; } /** * we do add logic by Add handler * */ public static class Add extends MultiInputFormHandler { @Override public MultiInputForm createInitForm() { MultiInputForm form = new MultiInputForm(); return form; } @Override public void updateForm(MultiInputForm form) { PersonForm pForm = form.getPersonForm(); PersonDbManager.instance().add(pForm); for (JobForm jobForm : form.getCascadeJobForm().getJobForms()) { jobForm.setPersonId(pForm.getId()); JobExperenceDbManager.instance().add(jobForm); for (JobPositionForm posForm : jobForm.getJobPositionForms()) { posForm.setJobId(jobForm.getId()); JobPositionDbManager.instance().add(posForm); } } DefaultMessageRenderingHelper.getConfiguredInstance().info("data inserted"); } } /** * we do update logic by Edit handler * */ public static class Edit extends MultiInputFormHandler { @Override public MultiInputForm createInitForm() throws Exception { MultiInputForm superform = super.createInitForm(); PersonForm pForm = PersonForm.buildFromPerson(PersonDbManager.instance().find(superform.getPersonForm().getId())); List<JobExperence> jobs = JobExperenceDbManager.instance().find("personId", pForm.getId()); List<JobForm> jobFormList = ListConvertUtil.transform(jobs, new RowConvertor<JobExperence, JobForm>() { @Override public JobForm convert(int rowIndex, JobExperence j) { return JobForm.buildFromJob(j); } }); JobForm[] jobForms = jobFormList.toArray(new JobForm[jobFormList.size()]); for (JobForm jobform : jobForms) { List<JobPosition> posList = JobPositionDbManager.instance().find("jobId", jobform.getId()); List<JobPositionForm> posFormList = ListConvertUtil.transform(posList, new RowConvertor<JobPosition, JobPositionForm>() { @Override public JobPositionForm convert(int rowIndex, JobPosition jp) { return JobPositionForm.buildFromJobPosition(jp); } }); JobPositionForm[] posForms = posFormList.toArray(new JobPositionForm[posFormList.size()]); jobform.setJobPositionForms(posForms); jobform.setJobPositionLength(posForms.length); } CascadeJobForm cjForm = new CascadeJobForm(); cjForm.setJobForms(jobForms); cjForm.setJobExperienceLength(jobForms.length); MultiInputForm form = new MultiInputForm(); form.setPersonForm(pForm); form.setCascadeJobForm(cjForm); return form; } private final boolean isExistingId(Integer id) { if (id == null) { return false; } else { return id > 0; } } @Override public void updateForm(MultiInputForm form) { PersonForm pForm = form.getPersonForm(); PersonDbManager.instance().update(pForm); Set<Integer> validJobIds = new HashSet<>(); Set<Integer> validPosIds = new HashSet<>(); for (JobForm jobForm : form.getCascadeJobForm().getJobForms()) { jobForm.setPersonId(pForm.getId()); if (isExistingId(jobForm.getId())) { JobExperenceDbManager.instance().update(jobForm); } else { JobExperenceDbManager.instance().add(jobForm); } validJobIds.add(jobForm.getId()); for (JobPositionForm posForm : jobForm.getJobPositionForms()) { posForm.setJobId(jobForm.getId()); if (isExistingId(posForm.getId())) { JobPositionDbManager.instance().update(posForm); } else { JobPositionDbManager.instance().add(posForm); } validPosIds.add(posForm.getId()); } } List<JobExperence> jobList = JobExperenceDbManager.instance().find("personId", pForm.getId()); for (JobExperence job : jobList) { List<JobPosition> posList = JobPositionDbManager.instance().find("jobId", job.getId()); for (JobPosition pos : posList) { if (!validPosIds.contains(pos.getId())) { JobPositionDbManager.instance().remove(pos); } } if (!validJobIds.contains(job.getId())) { JobExperenceDbManager.instance().remove(job); } } DefaultMessageRenderingHelper.getConfiguredInstance().info("update succeed"); } } } // @ShowCode:showSplittedFormHandlerEnd