/* * The Kuali Financial System, a comprehensive financial management system for higher education. * * Copyright 2005-2014 The Kuali Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.kuali.kfs.coa.document.validation.impl; import java.util.List; import org.kuali.kfs.coa.businessobject.OrganizationReversion; import org.kuali.kfs.coa.businessobject.OrganizationReversionDetail; import org.kuali.kfs.sys.KFSKeyConstants; import org.kuali.rice.kns.document.MaintenanceDocument; import org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase; import org.kuali.rice.krad.util.GlobalVariables; import org.kuali.rice.krad.util.ObjectUtils; /** * This class implements the business rules specific to the {@link OrganizationReversion} Maintenance Document. */ public class OrganizationReversionRule extends MaintenanceDocumentRuleBase { protected static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(OrganizationReversionRule.class); protected OrganizationReversion oldOrgReversion; protected OrganizationReversion newOrgReversion; /** * No-Args Constructor for an OrganizationReversionRule. */ public OrganizationReversionRule() { } /** * This performs rules checks on document route * <ul> * <li>{@link OrganizationReversionRule#validateDetailBusinessObjects(OrganizationReversion)}</li> * </ul> * This rule fails on business rule failures * @see org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase#processCustomRouteDocumentBusinessRules(org.kuali.rice.kns.document.MaintenanceDocument) */ @Override protected boolean processCustomRouteDocumentBusinessRules(MaintenanceDocument document) { boolean success = true; // make sure its a valid organization reversion MaintenanceDocument if (!isCorrectMaintenanceClass(document, OrganizationReversion.class)) { throw new IllegalArgumentException("Maintenance Document passed in was of the incorrect type. Expected " + "'" + OrganizationReversion.class.toString() + "', received " + "'" + document.getOldMaintainableObject().getBoClass().toString() + "'."); } // get the real business object newOrgReversion = (OrganizationReversion) document.getNewMaintainableObject().getBusinessObject(); // add check to validate document recursively to get to the collection attributes success &= validateDetailBusinessObjects(newOrgReversion); return success; } /** * Tests each option attached to the main business object and validates its properties. * * @param orgReversion * @return false if any of the detail objects fail with their validation */ protected boolean validateDetailBusinessObjects(OrganizationReversion orgReversion) { GlobalVariables.getMessageMap().addToErrorPath("document.newMaintainableObject"); List<OrganizationReversionDetail> details = orgReversion.getOrganizationReversionDetail(); int index = 0; int originalErrorCount = GlobalVariables.getMessageMap().getErrorCount(); for (OrganizationReversionDetail dtl : details) { String errorPath = "organizationReversionDetail[" + index + "]"; GlobalVariables.getMessageMap().addToErrorPath(errorPath); validateOrganizationReversionDetail(dtl); validateOrganizationReversionCode(orgReversion, dtl); GlobalVariables.getMessageMap().removeFromErrorPath(errorPath); index++; } GlobalVariables.getMessageMap().removeFromErrorPath("document.newMaintainableObject"); return GlobalVariables.getMessageMap().getErrorCount() == originalErrorCount; } /** * * This checks to make sure that the organization reversion object on the detail object actually exists * @param detail * @return false if the organization reversion object doesn't exist */ protected boolean validateOrganizationReversionDetail(OrganizationReversionDetail detail) { // let's assume this detail will pass the rule boolean result = true; // 1. makes sure the financial object code exists detail.refreshReferenceObject("organizationReversionObject"); if (ObjectUtils.isNull(detail.getOrganizationReversionObject())) { LOG.debug("organization reversion finanical object = null"); result = false; GlobalVariables.getMessageMap().putError("organizationReversionObjectCode", KFSKeyConstants.ERROR_EXISTENCE, new String[] { "Financial Object Code: " + detail.getOrganizationReversionObjectCode() }); } else { if (LOG.isDebugEnabled()) { LOG.debug("organization reversion finanical object = " + detail.getOrganizationReversionObject().getName()); } } return result; } /** * * Verifies that a reversion code exists when the * "Carry Forward by Object Code" indicator is selected. If this indicator * isn't selected, then the reversion codes isn't required. * * @param reversion OrganizationReversion object * @param detail OrganizationReversionDetail object * * @return true for successful validation */ protected boolean validateOrganizationReversionCode(OrganizationReversion reversion, OrganizationReversionDetail detail) { // // Assume it will pass! // boolean result = true; // // Only need to verify that organization reversion code exists if the // "Carry Forward by Object Code Indicator" is not selected. // if (reversion.isCarryForwardByObjectCodeIndicator()) { if (ObjectUtils.isNull(detail.getOrganizationReversionCode())) { result = false; GlobalVariables.getMessageMap().putError("organizationReversionCode", KFSKeyConstants.ERROR_DOCUMENT_GLOBAL_ORG_REVERSION_NO_REVERSION_CODE); } } return result; } }