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.module.cg.document.validation.impl;
017    
018    import java.util.ArrayList;
019    import java.util.HashMap;
020    import java.util.List;
021    import java.util.Map;
022    
023    import org.apache.log4j.Logger;
024    import org.kuali.kfs.module.cg.businessobject.Agency;
025    import org.kuali.kfs.module.cg.businessobject.AgencyType;
026    import org.kuali.kfs.sys.KFSKeyConstants;
027    import org.kuali.kfs.sys.context.SpringContext;
028    import org.kuali.rice.kns.document.MaintenanceDocument;
029    import org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase;
030    import org.kuali.rice.kns.service.BusinessObjectService;
031    
032    /**
033     * Rules for processing Agency instances.
034     */
035    public class AgencyRule extends MaintenanceDocumentRuleBase {
036        protected static Logger LOG = org.apache.log4j.Logger.getLogger(AgencyRule.class);
037    
038        protected Agency newAgency;
039        protected Agency oldAgency;
040    
041        BusinessObjectService businessObjectService;
042    
043        /**
044         * Default constructor.
045         */
046        public AgencyRule() {
047            super();
048            businessObjectService = SpringContext.getBean(BusinessObjectService.class);
049        }
050    
051        @Override
052        protected boolean processCustomApproveDocumentBusinessRules(MaintenanceDocument document) {
053            LOG.info("Entering AgencyRule.processCustomApproveDocumentBusinessRules");
054            boolean success = super.processCustomApproveDocumentBusinessRules(document);
055    
056            success &= checkAgencyReportsTo(document);
057    
058            LOG.info("Leaving AgencyRule.processCustomApproveDocumentBusinessRules");
059            return success;
060        }
061    
062        @Override
063        protected boolean processCustomRouteDocumentBusinessRules(MaintenanceDocument document) {
064            LOG.info("Entering AgencyRule.processCustomRouteDocumentBusinessRules");
065            boolean success = super.processCustomRouteDocumentBusinessRules(document);
066    
067            success &= checkAgencyReportsTo(document);
068    
069            LOG.info("Leaving AgencyRule.processCustomRouteDocumentBusinessRules");
070            return success;
071        }
072    
073        @Override
074        protected boolean processCustomSaveDocumentBusinessRules(MaintenanceDocument document) {
075            LOG.info("Entering AgencyRule.processCustomSaveDocumentBusinessRules");
076            boolean success = super.processCustomSaveDocumentBusinessRules(document);
077    
078            success &= checkAgencyReportsTo(document);
079            success &= validateAgencyType(document);
080    
081            LOG.info("Leaving AgencyRule.processCustomSaveDocumentBusinessRules");
082            return success;
083        }
084    
085        protected boolean validateAgencyType(MaintenanceDocument document) {
086            String agencyType = newAgency.getAgencyTypeCode();
087            Map params = new HashMap();
088            params.put("code", agencyType);
089            Object o = businessObjectService.findByPrimaryKey(AgencyType.class, params);
090            if (null == o) {
091                putFieldError("agencyTypeCode", KFSKeyConstants.ERROR_AGENCY_TYPE_NOT_FOUND, agencyType);
092                return false;
093            }
094            return false;
095        }
096    
097        protected boolean checkAgencyReportsTo(MaintenanceDocument document) {
098            boolean success = true;
099    
100            if (newAgency.getReportsToAgencyNumber() != null) {
101                if (newAgency.getReportsToAgency() == null) { // Agency must exist
102    
103                    putFieldError("reportsToAgencyNumber", KFSKeyConstants.ERROR_AGENCY_NOT_FOUND, newAgency.getReportsToAgencyNumber());
104                    success = false;
105    
106                }
107                else if (!newAgency.getReportsToAgency().isActive()) { // Agency must be active. See KULCG-263
108    
109                    putFieldError("reportsToAgencyNumber", KFSKeyConstants.ERROR_AGENCY_INACTIVE, newAgency.getReportsToAgencyNumber());
110                    success = false;
111    
112                }
113                else if (newAgency.getAgencyNumber().equals(newAgency.getReportsToAgencyNumber())) {
114    
115                    putFieldError("reportsToAgencyNumber", KFSKeyConstants.ERROR_AGENCY_REPORTS_TO_SELF, newAgency.getAgencyNumber());
116                    success = false;
117    
118                }
119                else { // No circular references
120    
121                    List agencies = new ArrayList();
122    
123                    Agency agency = newAgency;
124    
125                    while (agency.getReportsToAgency() != null && success) {
126                        if (!agencies.contains(agency.getAgencyNumber())) {
127                            agencies.add(agency.getAgencyNumber());
128                        }
129                        else {
130    
131                            putFieldError("reportsToAgencyNumber", KFSKeyConstants.ERROR_AGENCY_CIRCULAR_REPORTING, agency.getAgencyNumber());
132                            success = false;
133                        }
134    
135                        agency = agency.getReportsToAgency();
136                    }
137                }
138            }
139            return success;
140        }
141    
142        /**
143         * @see org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase#setupConvenienceObjects()
144         */
145        @Override
146        public void setupConvenienceObjects() {
147            newAgency = (Agency) super.getNewBo();
148            oldAgency = (Agency) super.getOldBo();
149        }
150    
151    }