/* * 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.sys.document.validation.impl; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.StringUtils; import org.kuali.kfs.sys.businessobject.AccountingLine; import org.kuali.kfs.sys.document.AccountingDocument; import org.kuali.kfs.sys.document.validation.Validation; import org.kuali.kfs.sys.document.validation.event.AttributedDocumentEvent; import org.kuali.rice.krad.util.ObjectUtils; /** * A cleaner way to conglomerate closely related rules together, this validation checks that * all of the values on the accounting line are allowed by a given document. The advantage of this hutch * over normal composites is that the hutch has "named slots" for given validations, which makes it a bit easier to keep track * of everything. */ public class AccountingLineValuesAllowedValidationHutch implements Validation { protected Validation objectCodeAllowedValidation; protected Validation objectTypeAllowedValidation; protected Validation fundGroupAllowedValidation; protected Validation subFundGroupAllowedValidation; protected Validation objectSubTypeAllowedValidation; protected Validation objectLevelAllowedValidation; protected Validation objectConsolidationAllowedValidation; protected String accountingDocumentParameterPropertyName; protected String accountingLineParameterPropertyName; protected AccountingDocument accountingDocumentForValidation; protected AccountingLine accountingLineForValidation; protected boolean quitOnFail; /** * @see org.kuali.kfs.sys.document.validation.Validation#shouldQuitOnFail() */ public boolean shouldQuitOnFail() { return quitOnFail; } /** * Sets whether the validation hutch should quit on the failure of the entire validation case failing. * @param b */ public void setQuitOnFail(boolean b) { quitOnFail = b; } /** * @see org.kuali.kfs.sys.document.validation.Validation#stageValidation(org.kuali.kfs.sys.document.validation.event.AttributedDocumentEvent) */ public boolean stageValidation(AttributedDocumentEvent event) { grabDocumentAndLineForValidationFromEvent(event); updateValidationsWithParameters(); return validate(event); } /** * Returns a list of all the validations the hutch has to pass in order to pass as a whole. * @return a List of Validations */ protected List<Validation> getValidationGauntlet() { List<Validation> gauntlet = new ArrayList<Validation>(); if (objectCodeAllowedValidation != null) { gauntlet.add(objectCodeAllowedValidation); } if (objectTypeAllowedValidation != null) { gauntlet.add(objectTypeAllowedValidation); } if (fundGroupAllowedValidation != null) { gauntlet.add(fundGroupAllowedValidation); } if (subFundGroupAllowedValidation != null) { gauntlet.add(subFundGroupAllowedValidation); } if (objectSubTypeAllowedValidation != null) { gauntlet.add(objectSubTypeAllowedValidation); } if (objectLevelAllowedValidation != null) { gauntlet.add(objectLevelAllowedValidation); } if (objectConsolidationAllowedValidation != null) { gauntlet.add(objectConsolidationAllowedValidation); } return gauntlet; } /** * Using the parameter property names set, finds the accounting document and accounting line to be validate * from the property, like an anteater getting tasty termites from a hill. Yummy. * @param event the event to take properties from */ protected void grabDocumentAndLineForValidationFromEvent(AttributedDocumentEvent event) { if (StringUtils.isNotBlank(accountingDocumentParameterPropertyName)) { accountingDocumentForValidation = (AccountingDocument)ObjectUtils.getPropertyValue(event, accountingDocumentParameterPropertyName); } if (StringUtils.isNotBlank(accountingLineParameterPropertyName)) { accountingLineForValidation = (AccountingLine)ObjectUtils.getPropertyValue(event, accountingLineParameterPropertyName); } } /** * Goes through each of the validations in the hutch, making sure each has the accounting document and accounting line to validate */ protected void updateValidationsWithParameters() { for (Validation v: getValidationGauntlet()) { if (v instanceof AccountingLineValueAllowedValidation) { addParametersToValidation((AccountingLineValueAllowedValidation)v); } else if (v instanceof CompositeValidation) { addParametersToValidation((CompositeValidation)v); } else { throw new IllegalStateException("Validations in the AccountingLineValuesAllowedValidationHutch must either extend AccountingLineValueAllowedValidation or be a CompositeValidation made up of AccountingLineValueAllowedValidation instances"); } } } /** * Adds the parameter properties to an instance of the AccountingLinevAlueAllowedValidation * @param validation the validation to add the correct properties to */ protected void addParametersToValidation(AccountingLineValueAllowedValidation validation) { validation.setAccountingDocumentForValidation(accountingDocumentForValidation); validation.setAccountingLineForValidation(accountingLineForValidation); } /** * Adds the parameter properties to the children validations of a CompositeValidation * @param validation the validation to add the correct parameters to */ protected void addParametersToValidation(CompositeValidation validation) { for (Validation val : validation.getValidations()) { if (val instanceof CompositeValidation) { addParametersToValidation((CompositeValidation)val); } else if (val instanceof AccountingLineValueAllowedValidation) { addParametersToValidation((AccountingLineValueAllowedValidation)val); } else { throw new IllegalStateException("Validations in the AccountingLineValuesAllowedValidationHutch must either extend AccountingLineValueAllowedValidation or be a CompositeValidation made up of AccountingLineValueAllowedValidation instances"); } } } /** * * @see org.kuali.kfs.sys.document.validation.Validation#validate(org.kuali.kfs.sys.document.validation.event.AttributedDocumentEvent) */ public boolean validate(AttributedDocumentEvent event) { boolean result = true; for (Validation validation : getValidationGauntlet()) { result &= validation.validate(event); } return result; } /** * Gets the fundGroupAllowedValidation attribute. * @return Returns the fundGroupAllowedValidation. */ public Validation getFundGroupAllowedValidation() { return fundGroupAllowedValidation; } /** * Sets the fundGroupAllowedValidation attribute value. * @param fundGroupAllowedValidation The fundGroupAllowedValidation to set. */ public void setFundGroupAllowedValidation(Validation fundGroupAllowedValidation) { this.fundGroupAllowedValidation = fundGroupAllowedValidation; } /** * Gets the objectCodeAllowedValidation attribute. * @return Returns the objectCodeAllowedValidation. */ public Validation getObjectCodeAllowedValidation() { return objectCodeAllowedValidation; } /** * Sets the objectCodeAllowedValidation attribute value. * @param objectCodeAllowedValidation The objectCodeAllowedValidation to set. */ public void setObjectCodeAllowedValidation(Validation objectCodeAllowedValidation) { this.objectCodeAllowedValidation = objectCodeAllowedValidation; } /** * Gets the objectConsolidationAllowedValidation attribute. * @return Returns the objectConsolidationAllowedValidation. */ public Validation getObjectConsolidationAllowedValidation() { return objectConsolidationAllowedValidation; } /** * Sets the objectConsolidationAllowedValidation attribute value. * @param objectConsolidationAllowedValidation The objectConsolidationAllowedValidation to set. */ public void setObjectConsolidationAllowedValidation(Validation objectConsolidationAllowedValidation) { this.objectConsolidationAllowedValidation = objectConsolidationAllowedValidation; } /** * Gets the objectLevelAllowedValidation attribute. * @return Returns the objectLevelAllowedValidation. */ public Validation getObjectLevelAllowedValidation() { return objectLevelAllowedValidation; } /** * Sets the objectLevelAllowedValidation attribute value. * @param objectLevelAllowedValidation The objectLevelAllowedValidation to set. */ public void setObjectLevelAllowedValidation(Validation objectLevelAllowedValidation) { this.objectLevelAllowedValidation = objectLevelAllowedValidation; } /** * Gets the objectSubTypeAllowedValidation attribute. * @return Returns the objectSubTypeAllowedValidation. */ public Validation getObjectSubTypeAllowedValidation() { return objectSubTypeAllowedValidation; } /** * Sets the objectSubTypeAllowedValidation attribute value. * @param objectSubTypeAllowedValidation The objectSubTypeAllowedValidation to set. */ public void setObjectSubTypeAllowedValidation(Validation objectSubTypeAllowedValidation) { this.objectSubTypeAllowedValidation = objectSubTypeAllowedValidation; } /** * Gets the objectTypeAllowedValidation attribute. * @return Returns the objectTypeAllowedValidation. */ public Validation getObjectTypeAllowedValidation() { return objectTypeAllowedValidation; } /** * Sets the objectTypeAllowedValidation attribute value. * @param objectTypeAllowedValidation The objectTypeAllowedValidation to set. */ public void setObjectTypeAllowedValidation(Validation objectTypeAllowedValidation) { this.objectTypeAllowedValidation = objectTypeAllowedValidation; } /** * Gets the subFundGroupAllowedValidation attribute. * @return Returns the subFundGroupAllowedValidation. */ public Validation getSubFundGroupAllowedValidation() { return subFundGroupAllowedValidation; } /** * Sets the subFundGroupAllowedValidation attribute value. * @param subFundGroupAllowedValidation The subFundGroupAllowedValidation to set. */ public void setSubFundGroupAllowedValidation(Validation subFundGroupAllowedValidation) { this.subFundGroupAllowedValidation = subFundGroupAllowedValidation; } /** * Gets the accountingDocumentParameterPropertyName attribute. * @return Returns the accountingDocumentParameterPropertyName. */ public String getAccountingDocumentParameterPropertyName() { return accountingDocumentParameterPropertyName; } /** * Sets the accountingDocumentParameterPropertyName attribute value. * @param accountingDocumentParameterPropertyName The accountingDocumentParameterPropertyName to set. */ public void setAccountingDocumentParameterPropertyName(String accountingDocumentParameterPropertyName) { this.accountingDocumentParameterPropertyName = accountingDocumentParameterPropertyName; } /** * Gets the accountingLineParameterPropertyName attribute. * @return Returns the accountingLineParameterPropertyName. */ public String getAccountingLineParameterPropertyName() { return accountingLineParameterPropertyName; } /** * Sets the accountingLineParameterPropertyName attribute value. * @param accountingLineParameterPropertyName The accountingLineParameterPropertyName to set. */ public void setAccountingLineParameterPropertyName(String accountingLineParameterPropertyName) { this.accountingLineParameterPropertyName = accountingLineParameterPropertyName; } public void setAccountingDocumentForValidation(AccountingDocument accountingDocumentForValidation) { this.accountingDocumentForValidation = accountingDocumentForValidation; } public void setAccountingLineForValidation(AccountingLine accountingLineForValidation) { this.accountingLineForValidation = accountingLineForValidation; } public AccountingDocument getAccountingDocumentForValidation() { return accountingDocumentForValidation; } public AccountingLine getAccountingLineForValidation() { return accountingLineForValidation; } }