001 /*
002 * Copyright 2011 The Kuali Foundation.
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.kuali.kfs.sys.document.validation.impl;
017
018 import java.util.Map;
019
020 import org.kuali.kfs.fp.businessobject.Check;
021 import org.kuali.kfs.fp.document.validation.event.AddCheckEvent;
022 import org.kuali.kfs.fp.document.validation.event.DeleteCheckEvent;
023 import org.kuali.kfs.fp.document.validation.event.UpdateCheckEvent;
024 import org.kuali.kfs.sys.context.SpringContext;
025 import org.kuali.kfs.sys.document.AccountingDocument;
026 import org.kuali.kfs.sys.document.datadictionary.FinancialSystemTransactionalDocumentEntry;
027 import org.kuali.kfs.sys.document.validation.AccountingRuleEngineRule;
028 import org.kuali.kfs.sys.document.validation.Validation;
029 import org.kuali.kfs.sys.document.validation.event.AttributedAddAdHocRoutePersonEvent;
030 import org.kuali.kfs.sys.document.validation.event.AttributedAddAdHocRouteWorkgroupEvent;
031 import org.kuali.kfs.sys.document.validation.event.AttributedAddNoteEvent;
032 import org.kuali.kfs.sys.document.validation.event.AttributedApproveDocumentEvent;
033 import org.kuali.kfs.sys.document.validation.event.AttributedBlanketApproveDocumentEvent;
034 import org.kuali.kfs.sys.document.validation.event.AttributedDocumentEvent;
035 import org.kuali.kfs.sys.document.validation.event.AttributedRouteDocumentEvent;
036 import org.kuali.kfs.sys.document.validation.event.AttributedSaveDocumentEvent;
037 import org.kuali.rice.kns.bo.AdHocRoutePerson;
038 import org.kuali.rice.kns.bo.AdHocRouteWorkgroup;
039 import org.kuali.rice.kns.bo.Note;
040 import org.kuali.rice.kns.document.Document;
041 import org.kuali.rice.kns.document.TransactionalDocument;
042 import org.kuali.rice.kns.rule.event.ApproveDocumentEvent;
043 import org.kuali.rice.kns.rule.event.BlanketApproveDocumentEvent;
044 import org.kuali.rice.kns.rules.DocumentRuleBase;
045 import org.kuali.rice.kns.service.DataDictionaryService;
046
047 /**
048 * A rule that uses the accounting rule engine to perform rule validations.
049 */
050 public class AccountingRuleEngineRuleBase extends DocumentRuleBase implements AccountingRuleEngineRule {
051 private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(AccountingRuleEngineRuleBase.class);
052
053 /**
054 * Constructs a AccountingRuleEngineRuleBase.java.
055 */
056 public AccountingRuleEngineRuleBase() {
057 super();
058 }
059
060 /**
061 * @see org.kuali.kfs.sys.document.validation.AccountingRuleEngineRule#validateForEvent(org.kuali.rice.kns.rule.event.KualiDocumentEvent)
062 */
063 public boolean validateForEvent(AttributedDocumentEvent event) {
064 final FinancialSystemTransactionalDocumentEntry documentEntry = getDataDictionaryEntryForDocument((TransactionalDocument)event.getDocument());
065 final Map<Class, String> validationMap = documentEntry.getValidationMap();
066
067 if (validationMap == null || !validationMap.containsKey(event.getClass())) {
068 return true; // no validation? just return true
069 } else {
070 final String beanName = validationMap.get(event.getClass());
071 Validation validationBean = SpringContext.getBean(Validation.class, beanName);
072
073 final boolean valid = validationBean.stageValidation(event);
074 return valid;
075 }
076 }
077
078 /**
079 * Returns the validation from the data dictionary for the document in the event
080 * @param document the document to look up a data dictionary entry for
081 * @return a document entry
082 */
083 protected FinancialSystemTransactionalDocumentEntry getDataDictionaryEntryForDocument(TransactionalDocument document) {
084 return (FinancialSystemTransactionalDocumentEntry)SpringContext.getBean(DataDictionaryService.class).getDataDictionary().getDictionaryObjectEntry(document.getClass().getName());
085 }
086
087 /**
088 * @see org.kuali.rice.kns.rules.DocumentRuleBase#processCustomAddAdHocRoutePersonBusinessRules(org.kuali.rice.kns.document.Document, org.kuali.rice.kns.bo.AdHocRoutePerson)
089 */
090 @Override
091 protected boolean processCustomAddAdHocRoutePersonBusinessRules(Document document, AdHocRoutePerson person) {
092 boolean result = super.processCustomAddAdHocRoutePersonBusinessRules(document, person);
093
094 result &= validateForEvent(new AttributedAddAdHocRoutePersonEvent(document, person));
095
096 return result;
097 }
098
099 /**
100 * @see org.kuali.rice.kns.rules.DocumentRuleBase#processCustomAddAdHocRouteWorkgroupBusinessRules(org.kuali.rice.kns.document.Document, org.kuali.rice.kns.bo.AdHocRouteWorkgroup)
101 */
102 @Override
103 protected boolean processCustomAddAdHocRouteWorkgroupBusinessRules(Document document, AdHocRouteWorkgroup workgroup) {
104 boolean result = super.processCustomAddAdHocRouteWorkgroupBusinessRules(document, workgroup);
105
106 result &= validateForEvent(new AttributedAddAdHocRouteWorkgroupEvent(document, workgroup));
107
108 return result;
109 }
110
111 /**
112 * @see org.kuali.rice.kns.rules.DocumentRuleBase#processCustomAddNoteBusinessRules(org.kuali.rice.kns.document.Document, org.kuali.rice.kns.bo.Note)
113 */
114 @Override
115 protected boolean processCustomAddNoteBusinessRules(Document document, Note note) {
116 boolean result = super.processCustomAddNoteBusinessRules(document, note);
117
118 result &= validateForEvent(new AttributedAddNoteEvent(document, note));
119
120 return result;
121 }
122
123 /**
124 * @see org.kuali.rice.kns.rules.DocumentRuleBase#processCustomApproveDocumentBusinessRules(org.kuali.rice.kns.rule.event.ApproveDocumentEvent)
125 */
126 @Override
127 protected boolean processCustomApproveDocumentBusinessRules(ApproveDocumentEvent approveEvent) {
128 boolean result = super.processCustomApproveDocumentBusinessRules(approveEvent);
129
130 if (approveEvent instanceof BlanketApproveDocumentEvent) {
131 result &= validateForEvent(new AttributedBlanketApproveDocumentEvent(approveEvent.getErrorPathPrefix(), approveEvent.getDocument()));
132 } else {
133 result &= validateForEvent(new AttributedApproveDocumentEvent(approveEvent.getErrorPathPrefix(), approveEvent.getDocument()));
134 }
135
136 return result;
137 }
138
139 /**
140 * @see org.kuali.rice.kns.rules.DocumentRuleBase#processCustomRouteDocumentBusinessRules(org.kuali.rice.kns.document.Document)
141 */
142 @Override
143 protected boolean processCustomRouteDocumentBusinessRules(Document document) {
144 boolean result = super.processCustomRouteDocumentBusinessRules(document);
145
146 AttributedRouteDocumentEvent event = new AttributedRouteDocumentEvent(document);
147 result &= validateForEvent(event);
148
149 return result;
150 }
151
152 /**
153 * @see org.kuali.rice.kns.rules.DocumentRuleBase#processCustomSaveDocumentBusinessRules(org.kuali.rice.kns.document.Document)
154 */
155 @Override
156 protected boolean processCustomSaveDocumentBusinessRules(Document document) {
157 boolean result = super.processCustomSaveDocumentBusinessRules(document);
158
159 result &= validateForEvent(new AttributedSaveDocumentEvent(document));
160
161 return result;
162 }
163
164 /**
165 * @see org.kuali.rice.kns.rules.DocumentRuleBase#isDocumentAttributesValid(org.kuali.rice.kns.document.Document, boolean)
166 */
167 @Override
168 public boolean isDocumentAttributesValid(Document document, boolean validateRequired) {
169 FinancialSystemTransactionalDocumentEntry documentEntry = getDataDictionaryEntryForDocument((TransactionalDocument)document);
170 Integer maxDictionaryValidationDepth = documentEntry.getMaxDictionaryValidationDepth();
171
172 if(maxDictionaryValidationDepth != null) {
173 this.setMaxDictionaryValidationDepth(maxDictionaryValidationDepth);
174 }
175
176 return super.isDocumentAttributesValid(document, validateRequired);
177 }
178 }