Java tutorial
/***************************************************************** * This file is part of Managing Agricultural Research for Learning & * Outcomes Platform (MARLO). * MARLO is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * at your option) any later version. * MARLO is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with MARLO. If not, see <http://www.gnu.org/licenses/>. *****************************************************************/ package org.cgiar.ccafs.marlo.action.powb; import org.cgiar.ccafs.marlo.action.BaseAction; import org.cgiar.ccafs.marlo.config.APConstants; import org.cgiar.ccafs.marlo.data.manager.AuditLogManager; import org.cgiar.ccafs.marlo.data.manager.CrpProgramManager; import org.cgiar.ccafs.marlo.data.manager.DeliverableManager; import org.cgiar.ccafs.marlo.data.manager.GlobalUnitManager; import org.cgiar.ccafs.marlo.data.manager.LiaisonInstitutionManager; import org.cgiar.ccafs.marlo.data.manager.PowbCrossCuttingDimensionManager; import org.cgiar.ccafs.marlo.data.manager.PowbSynthesisManager; import org.cgiar.ccafs.marlo.data.manager.UserManager; import org.cgiar.ccafs.marlo.data.model.CrossCuttingDimensionTableDTO; import org.cgiar.ccafs.marlo.data.model.CrpProgram; import org.cgiar.ccafs.marlo.data.model.Deliverable; import org.cgiar.ccafs.marlo.data.model.DeliverableInfo; import org.cgiar.ccafs.marlo.data.model.GlobalUnit; import org.cgiar.ccafs.marlo.data.model.GlobalUnitProject; import org.cgiar.ccafs.marlo.data.model.LiaisonInstitution; import org.cgiar.ccafs.marlo.data.model.LiaisonUser; import org.cgiar.ccafs.marlo.data.model.Phase; import org.cgiar.ccafs.marlo.data.model.PowbCrossCuttingDimension; import org.cgiar.ccafs.marlo.data.model.PowbSynthesis; import org.cgiar.ccafs.marlo.data.model.ProgramType; import org.cgiar.ccafs.marlo.data.model.ProjectStatusEnum; import org.cgiar.ccafs.marlo.data.model.User; import org.cgiar.ccafs.marlo.security.Permission; import org.cgiar.ccafs.marlo.utils.APConfig; import org.cgiar.ccafs.marlo.utils.AutoSaveReader; import org.cgiar.ccafs.marlo.validation.powb.CrossCuttingValidator; import java.io.BufferedReader; import java.io.FileReader; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collection; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; import javax.inject.Inject; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; import org.apache.commons.lang3.StringUtils; public class CrossCuttingDimensionsAction extends BaseAction { /** * */ private static final long serialVersionUID = -2668150868648923650L; private GlobalUnitManager crpManager; private AuditLogManager auditLogManager; private LiaisonInstitutionManager liaisonInstitutionManager; private CrpProgramManager crpProgramManager; private PowbSynthesisManager powbSynthesisManager; private CrossCuttingValidator validator; private PowbCrossCuttingDimensionManager powbCrossCuttingDimensionManager; private DeliverableManager deliverableManager; private List<LiaisonInstitution> liaisonInstitutions; private UserManager userManager; private LiaisonInstitution liaisonInstitution; private String transaction; private Long crossCuttingId; private Long liaisonInstitutionID; private GlobalUnit loggedCrp; private PowbSynthesis powbSynthesis; private CrossCuttingDimensionTableDTO tableC; private LiaisonInstitution thePMU; private List<DeliverableInfo> deliverableList; private long powbSynthesisID; @Inject public CrossCuttingDimensionsAction(APConfig config, GlobalUnitManager crpManager, AuditLogManager auditLogManager, LiaisonInstitutionManager liaisonInstitutionManager, CrossCuttingValidator validator, CrpProgramManager crpProgramManager, UserManager userManager, PowbSynthesisManager powbSynthesisManager, PowbCrossCuttingDimensionManager powbCrossCuttingDimensionManager, DeliverableManager deliverableManager) { super(config); this.crpManager = crpManager; this.auditLogManager = auditLogManager; this.liaisonInstitutionManager = liaisonInstitutionManager; this.crpProgramManager = crpProgramManager; this.userManager = userManager; this.powbSynthesisManager = powbSynthesisManager; this.validator = validator; this.powbCrossCuttingDimensionManager = powbCrossCuttingDimensionManager; this.deliverableManager = deliverableManager; } @Override public String cancel() { Path path = this.getAutoSaveFilePath(); if (path.toFile().exists()) { boolean fileDeleted = path.toFile().delete(); } this.setDraft(false); Collection<String> messages = this.getActionMessages(); if (!messages.isEmpty()) { String validationMessage = messages.iterator().next(); this.setActionMessages(null); this.addActionMessage("draft:" + this.getText("cancel.autoSave")); } else { this.addActionMessage("draft:" + this.getText("cancel.autoSave")); } messages = this.getActionMessages(); return SUCCESS; } public Long firstFlagship() { List<LiaisonInstitution> liaisonInstitutions = new ArrayList<>(loggedCrp.getLiaisonInstitutions().stream() .filter(c -> c.getCrpProgram() != null && c.isActive() && c.getCrpProgram().getProgramType() == ProgramType.FLAGSHIP_PROGRAM_TYPE.getValue()) .collect(Collectors.toList())); liaisonInstitutions.sort(Comparator.comparing(LiaisonInstitution::getAcronym)); long liaisonInstitutionId = liaisonInstitutions.get(0).getId(); return liaisonInstitutionId; } private Path getAutoSaveFilePath() { String composedClassName = powbSynthesis.getClass().getSimpleName(); String actionFile = this.getActionName().replace("/", "_"); String autoSaveFile = powbSynthesis.getId() + "_" + composedClassName + "_" + this.getActualPhase().getDescription() + "_" + this.getActualPhase().getYear() + "_" + actionFile + ".json"; return Paths.get(config.getAutoSaveFolder() + autoSaveFile); } public Long getCrossCuttingId() { return crossCuttingId; } public List<DeliverableInfo> getDeliverableList() { return deliverableList; } public LiaisonInstitution getLiaisonInstitution() { return liaisonInstitution; } public Long getLiaisonInstitutionID() { return liaisonInstitutionID; } public List<LiaisonInstitution> getLiaisonInstitutions() { return liaisonInstitutions; } public GlobalUnit getLoggedCrp() { return loggedCrp; } public PowbSynthesis getPowbSynthesis() { return powbSynthesis; } public long getPowbSynthesisID() { return powbSynthesisID; } public CrossCuttingDimensionTableDTO getTableC() { return tableC; } public LiaisonInstitution getThePMU() { return thePMU; } public String getTransaction() { return transaction; } public UserManager getUserManager() { return userManager; } public boolean isFlagship() { boolean isFP = false; if (liaisonInstitution != null) { if (liaisonInstitution.getCrpProgram() != null) { CrpProgram crpProgram = crpProgramManager .getCrpProgramById(liaisonInstitution.getCrpProgram().getId().longValue()); if (crpProgram.getProgramType() == ProgramType.FLAGSHIP_PROGRAM_TYPE.getValue()) { isFP = true; } } } return isFP; } @Override public boolean isPMU() { boolean isFP = false; if (liaisonInstitution != null) { if (liaisonInstitution.getCrpProgram() == null) { isFP = true; } } return isFP; } @Override public String next() { String result = this.save(); if (result.equals(BaseAction.SUCCESS)) { return BaseAction.NEXT; } else { return result; } } @Override public void prepare() throws Exception { // Get current CRP loggedCrp = (GlobalUnit) this.getSession().get(APConstants.SESSION_CRP); loggedCrp = crpManager.getGlobalUnitById(loggedCrp.getId()); Phase phase = this.getActualPhase(); // If there is a history version being loaded if (this.getRequest().getParameter(APConstants.TRANSACTION_ID) != null) { transaction = StringUtils.trim(this.getRequest().getParameter(APConstants.TRANSACTION_ID)); PowbSynthesis history = (PowbSynthesis) auditLogManager.getHistory(transaction); if (history != null) { powbSynthesis = history; powbSynthesisID = powbSynthesis.getId(); } else { this.transaction = null; this.setTransaction("-1"); } } else { // Get Liaison institution ID Parameter try { liaisonInstitutionID = Long.parseLong(StringUtils .trim(this.getRequest().getParameter(APConstants.LIAISON_INSTITUTION_REQUEST_ID))); } catch (NumberFormatException e) { User user = userManager.getUser(this.getCurrentUser().getId()); if (user.getLiasonsUsers() != null || !user.getLiasonsUsers().isEmpty()) { List<LiaisonUser> liaisonUsers = new ArrayList<>(user.getLiasonsUsers().stream() .filter(lu -> lu.isActive() && lu.getLiaisonInstitution().isActive() && lu.getLiaisonInstitution().getCrp().getId() == loggedCrp.getId() && lu.getLiaisonInstitution().getInstitution() == null) .collect(Collectors.toList())); if (!liaisonUsers.isEmpty()) { boolean isLeader = false; for (LiaisonUser liaisonUser : liaisonUsers) { LiaisonInstitution institution = liaisonUser.getLiaisonInstitution(); if (institution.isActive()) { if (institution.getCrpProgram() != null) { if (institution.getCrpProgram() .getProgramType() == ProgramType.FLAGSHIP_PROGRAM_TYPE.getValue()) { liaisonInstitutionID = institution.getId(); isLeader = true; break; } } else { if (institution.getAcronym().equals("PMU")) { liaisonInstitutionID = institution.getId(); isLeader = true; break; } } } } if (!isLeader) { liaisonInstitutionID = this.firstFlagship(); } } else { liaisonInstitutionID = this.firstFlagship(); } } else { liaisonInstitutionID = this.firstFlagship(); } } try { powbSynthesisID = Long .parseLong(StringUtils.trim(this.getRequest().getParameter(APConstants.POWB_SYNTHESIS_ID))); powbSynthesis = powbSynthesisManager.getPowbSynthesisById(powbSynthesisID); if (!powbSynthesis.getPhase().equals(phase)) { powbSynthesis = powbSynthesisManager.findSynthesis(phase.getId(), liaisonInstitutionID); if (powbSynthesis == null) { powbSynthesis = this.createPowbSynthesis(phase.getId(), liaisonInstitutionID); } powbSynthesisID = powbSynthesis.getId(); } } catch (Exception e) { powbSynthesis = powbSynthesisManager.findSynthesis(phase.getId(), liaisonInstitutionID); if (powbSynthesis == null) { powbSynthesis = this.createPowbSynthesis(phase.getId(), liaisonInstitutionID); } powbSynthesisID = powbSynthesis.getId(); } } if (powbSynthesis != null) { PowbSynthesis powbSynthesisDB = powbSynthesisManager.getPowbSynthesisById(powbSynthesisID); powbSynthesisID = powbSynthesisDB.getId(); liaisonInstitutionID = powbSynthesisDB.getLiaisonInstitution().getId(); liaisonInstitution = liaisonInstitutionManager.getLiaisonInstitutionById(liaisonInstitutionID); Path path = this.getAutoSaveFilePath(); // Verify if there is a Draft file if (path.toFile().exists() && this.getCurrentUser().isAutoSave()) { BufferedReader reader; reader = new BufferedReader(new FileReader(path.toFile())); Gson gson = new GsonBuilder().create(); JsonObject jReader = gson.fromJson(reader, JsonObject.class); AutoSaveReader autoSaveReader = new AutoSaveReader(); powbSynthesis = (PowbSynthesis) autoSaveReader.readFromJson(jReader); powbSynthesisID = powbSynthesis.getId(); this.setDraft(true); reader.close(); } else { this.setDraft(false); // Check if CrossCutting relation is null -create it if (powbSynthesis.getPowbCrossCuttingDimension() == null && this.isPMU()) { PowbCrossCuttingDimension crossCutting = new PowbCrossCuttingDimension(); // create one to one relation powbSynthesis.setPowbCrossCuttingDimension(crossCutting); crossCutting.setPowbSynthesis(powbSynthesis); // save the changes powbSynthesis = powbSynthesisManager.savePowbSynthesis(powbSynthesis); } } } if (this.isFlagship()) { LiaisonInstitution pmuInstitution = loggedCrp.getLiaisonInstitutions().stream() .filter(c -> c.getCrpProgram() == null && c.getAcronym().equals("PMU")) .collect(Collectors.toList()).get(0); PowbSynthesis powbSynthesisDB = powbSynthesisManager.findSynthesis(phase.getId(), pmuInstitution.getId()); if (powbSynthesisDB != null) { if (powbSynthesisDB.getPowbCrossCuttingDimension() != null) { powbSynthesis.setFlagshipAssets(powbSynthesisDB.getPowbCrossCuttingDimension().getAssets()); powbSynthesis .setFlagshipSummarize(powbSynthesisDB.getPowbCrossCuttingDimension().getSummarize()); } } } // Get the list of liaison institutions Flagships and PMU. liaisonInstitutions = loggedCrp.getLiaisonInstitutions().stream() .filter(c -> c.getCrpProgram() != null && c.isActive() && c.getCrpProgram().getProgramType() == ProgramType.FLAGSHIP_PROGRAM_TYPE.getValue()) .collect(Collectors.toList()); liaisonInstitutions.sort(Comparator.comparing(LiaisonInstitution::getAcronym)); // ADD PMU as liasion Institutio too liaisonInstitutions.addAll(loggedCrp.getLiaisonInstitutions().stream() .filter(c -> c.getCrpProgram() == null && c.getAcronym().equals("PMU")) .collect(Collectors.toList())); // Get the tableC Information this.tableCInfo(phase); // Base Permission String params[] = { loggedCrp.getAcronym(), powbSynthesis.getId() + "" }; // this.setBasePermission(this.getText(Permission.POWB_SYNTHESIS_TOC_BASE_PERMISSION, params)); this.setBasePermission(this.getText(Permission.POWB_SYNTHESIS_CROSS_CUTING_BASE_PERMISSION, params)); } @Override public String save() { if (this.hasPermission("canEdit")) { PowbCrossCuttingDimension crossCuttingDB = powbSynthesisManager.getPowbSynthesisById(powbSynthesisID) .getPowbCrossCuttingDimension(); crossCuttingDB.setSummarize(powbSynthesis.getPowbCrossCuttingDimension().getSummarize()); crossCuttingDB.setAssets(powbSynthesis.getPowbCrossCuttingDimension().getAssets()); crossCuttingDB = powbCrossCuttingDimensionManager.savePowbCrossCuttingDimension(crossCuttingDB); List<String> relationsName = new ArrayList<>(); powbSynthesis = powbSynthesisManager.getPowbSynthesisById(powbSynthesisID); /** * The following is required because we need to update something on the @PowbSynthesis if we want a row created in * the auditlog table. */ this.setModificationJustification(powbSynthesis); powbSynthesisManager.save(powbSynthesis, this.getActionName(), relationsName, this.getActualPhase()); Path path = this.getAutoSaveFilePath(); if (path.toFile().exists()) { path.toFile().delete(); } Collection<String> messages = this.getActionMessages(); if (!this.getInvalidFields().isEmpty()) { this.setActionMessages(null); // this.addActionMessage(Map.toString(this.getInvalidFields().toArray())); List<String> keys = new ArrayList<String>(this.getInvalidFields().keySet()); for (String key : keys) { this.addActionMessage(key + ": " + this.getInvalidFields().get(key)); } } else { this.addActionMessage("message:" + this.getText("saving.saved")); } return SUCCESS; } else { return NOT_AUTHORIZED; } } public void setCrossCuttingId(Long crossCuttingId) { this.crossCuttingId = crossCuttingId; } public void setDeliverableList(List<DeliverableInfo> deliverableList) { this.deliverableList = deliverableList; } public void setLiaisonInstitution(LiaisonInstitution liaisonInstitution) { this.liaisonInstitution = liaisonInstitution; } public void setLiaisonInstitutionID(Long liaisonInstitutionID) { this.liaisonInstitutionID = liaisonInstitutionID; } public void setLiaisonInstitutions(List<LiaisonInstitution> liaisonInstitutions) { this.liaisonInstitutions = liaisonInstitutions; } public void setLoggedCrp(GlobalUnit loggedCrp) { this.loggedCrp = loggedCrp; } public void setPowbSynthesis(PowbSynthesis powbSynthesis) { this.powbSynthesis = powbSynthesis; } public void setPowbSynthesisID(long powbSynthesisID) { this.powbSynthesisID = powbSynthesisID; } public void setTableC(CrossCuttingDimensionTableDTO tableC) { this.tableC = tableC; } public void setThePMU(LiaisonInstitution thePMU) { this.thePMU = thePMU; } public void setTransaction(String transaction) { this.transaction = transaction; } public void setUserManager(UserManager userManager) { this.userManager = userManager; } /** * List all the deliverables of the Crp to make the calculations in the Cross Cutting Socores. * * @param pashe - The phase that get the deliverable information. */ public void tableCInfo(Phase phase) { List<Deliverable> deliverables = new ArrayList<>(); deliverableList = new ArrayList<>(); int iGenderPrincipal = 0; int iGenderSignificant = 0; int iGenderNa = 0; int iYouthPrincipal = 0; int iYouthSignificant = 0; int iYouthNa = 0; int iCapDevPrincipal = 0; int iCapDevSignificant = 0; int iCapDevNa = 0; for (GlobalUnitProject globalUnitProject : this.getLoggedCrp().getGlobalUnitProjects().stream() .filter(p -> p.isActive() && p.getProject() != null && p.getProject().isActive() && (p.getProject().getProjecInfoPhase(phase) != null && p.getProject().getProjectInfo().getStatus().intValue() == Integer .parseInt(ProjectStatusEnum.Ongoing.getStatusId()) || p.getProject().getProjecInfoPhase(phase) != null && p.getProject().getProjectInfo().getStatus().intValue() == Integer .parseInt(ProjectStatusEnum.Extended.getStatusId()))) .collect(Collectors.toList())) { for (Deliverable deliverable : globalUnitProject.getProject().getDeliverables().stream() .filter(d -> d.isActive() && d.getDeliverableInfo(phase) != null && ((d.getDeliverableInfo().getStatus() == null && d.getDeliverableInfo().getYear() == phase.getYear()) || (d.getDeliverableInfo().getStatus() != null && d.getDeliverableInfo().getStatus().intValue() == Integer .parseInt(ProjectStatusEnum.Extended.getStatusId()) && d.getDeliverableInfo().getNewExpectedYear() != null && d.getDeliverableInfo().getNewExpectedYear() == phase.getYear()) || (d.getDeliverableInfo().getStatus() != null && d.getDeliverableInfo().getYear() == phase.getYear() && d.getDeliverableInfo().getStatus().intValue() == Integer .parseInt(ProjectStatusEnum.Ongoing.getStatusId())))) .collect(Collectors.toList())) { deliverables.add(deliverable); } } if (deliverables != null && !deliverables.isEmpty()) { for (Deliverable deliverable : deliverables) { DeliverableInfo deliverableInfo = deliverable.getDeliverableInfo(phase); if (deliverableInfo.isActive()) { deliverableList.add(deliverableInfo); boolean bGender = false; boolean bYouth = false; boolean bCapDev = false; if (deliverableInfo.getCrossCuttingNa() != null && deliverableInfo.getCrossCuttingNa()) { iGenderNa++; iYouthNa++; iCapDevNa++; } else { // Gender if (deliverableInfo.getCrossCuttingGender() != null && deliverableInfo.getCrossCuttingGender()) { bGender = true; if (deliverableInfo.getCrossCuttingScoreGender() != null && deliverableInfo.getCrossCuttingScoreGender() == 1) { iGenderSignificant++; } else if (deliverableInfo.getCrossCuttingScoreGender() != null && deliverableInfo.getCrossCuttingScoreGender() == 2) { iGenderPrincipal++; } else if (deliverableInfo.getCrossCuttingScoreGender() == null) { iGenderNa++; } } // Youth if (deliverableInfo.getCrossCuttingYouth() != null && deliverableInfo.getCrossCuttingYouth()) { bYouth = true; if (deliverableInfo.getCrossCuttingScoreYouth() != null && deliverableInfo.getCrossCuttingScoreYouth() == 1) { iYouthSignificant++; } else if (deliverableInfo.getCrossCuttingScoreYouth() != null && deliverableInfo.getCrossCuttingScoreYouth() == 2) { iYouthPrincipal++; } else if (deliverableInfo.getCrossCuttingScoreYouth() == null) { iYouthNa++; } } // CapDev if (deliverableInfo.getCrossCuttingCapacity() != null && deliverableInfo.getCrossCuttingCapacity()) { bCapDev = true; if (deliverableInfo.getCrossCuttingScoreCapacity() != null && deliverableInfo.getCrossCuttingScoreCapacity() == 1) { iCapDevSignificant++; } else if (deliverableInfo.getCrossCuttingScoreCapacity() != null && deliverableInfo.getCrossCuttingScoreCapacity() == 2) { iCapDevPrincipal++; } else if (deliverableInfo.getCrossCuttingScoreCapacity() == null) { iCapDevNa++; } } if (!bGender) { iGenderNa++; } if (!bYouth) { iYouthNa++; } if (!bCapDev) { iCapDevNa++; } } } } tableC = new CrossCuttingDimensionTableDTO(); int iDeliverableCount = deliverableList.size(); tableC.setTotal(iDeliverableCount); double dGenderPrincipal = (iGenderPrincipal * 100.0) / iDeliverableCount; double dGenderSignificant = (iGenderSignificant * 100.0) / iDeliverableCount; double dGenderNa = (iGenderNa * 100.0) / iDeliverableCount; double dYouthPrincipal = (iYouthPrincipal * 100.0) / iDeliverableCount; double dYouthSignificant = (iYouthSignificant * 100.0) / iDeliverableCount; double dYouthNa = (iYouthNa * 100.0) / iDeliverableCount; double dCapDevPrincipal = (iCapDevPrincipal * 100.0) / iDeliverableCount; double dCapDevSignificant = (iCapDevSignificant * 100.0) / iDeliverableCount; double dCapDevNa = (iCapDevNa * 100.0) / iDeliverableCount; // Gender tableC.setGenderPrincipal(iGenderPrincipal); tableC.setGenderSignificant(iGenderSignificant); tableC.setGenderScored(iGenderNa); tableC.setPercentageGenderPrincipal(dGenderPrincipal); tableC.setPercentageGenderSignificant(dGenderSignificant); tableC.setPercentageGenderNotScored(dGenderNa); // Youth tableC.setYouthPrincipal(iYouthPrincipal); tableC.setYouthSignificant(iYouthSignificant); tableC.setYouthScored(iYouthNa); tableC.setPercentageYouthPrincipal(dYouthPrincipal); tableC.setPercentageYouthSignificant(dYouthSignificant); tableC.setPercentageYouthNotScored(dYouthNa); // CapDev tableC.setCapDevPrincipal(iCapDevPrincipal); tableC.setCapDevSignificant(iCapDevSignificant); tableC.setCapDevScored(iCapDevNa); tableC.setPercentageCapDevPrincipal(dCapDevPrincipal); tableC.setPercentageCapDevSignificant(dCapDevSignificant); tableC.setPercentageCapDevNotScored(dCapDevNa); } } @Override public void validate() { if (save) { validator.validate(this, powbSynthesis, true); } } }