001    /**
002     * Copyright 2005-2012 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.rice.krms.util;
017    
018    import org.apache.commons.lang.StringUtils;
019    import org.kuali.rice.core.api.util.RiceKeyConstants;
020    import org.kuali.rice.krad.bo.GlobalBusinessObject;
021    import org.kuali.rice.krad.maintenance.MaintenanceDocument;
022    import org.kuali.rice.krad.rules.MaintenanceDocumentRuleBase;
023    import org.kuali.rice.krad.util.KRADConstants;
024    import org.kuali.rice.krms.api.repository.type.KrmsTypeRepositoryService;
025    import org.kuali.rice.krms.framework.type.ActionTypeService;
026    import org.kuali.rice.krms.impl.authorization.AgendaAuthorizationService;
027    import org.kuali.rice.krms.impl.repository.KrmsRepositoryServiceLocator;
028    import org.kuali.rice.krms.impl.util.KRMSPropertyConstants;
029    import org.kuali.student.enrollment.class1.krms.dto.EnrolAgendaEditor;
030    import org.kuali.student.enrollment.class1.krms.dto.EnrolRuleEditor;
031    
032    /**
033     * This class contains the rules for the AgendaEditor.
034     */
035    public class AgendaEditorBusRule extends MaintenanceDocumentRuleBase {
036    
037        @Override
038        protected boolean primaryKeyCheck(MaintenanceDocument document) {
039            // default to success if no failures
040            boolean success = true;
041            Class<?> dataObjectClass = document.getNewMaintainableObject().getDataObjectClass();
042    
043            // Since the dataObject is a wrapper class we need to return the agendaBo instead.
044            Object oldBo = ((EnrolAgendaEditor) document.getOldMaintainableObject().getDataObject());
045            Object newDataObject = ((EnrolAgendaEditor) document.getNewMaintainableObject().getDataObject());
046    
047            // We dont do primaryKeyChecks on Global Business Object maintenance documents. This is
048            // because it doesnt really make any sense to do so, given the behavior of Globals. When a
049            // Global Document completes, it will update or create a new record for each BO in the list.
050            // As a result, there's no problem with having existing BO records in the system, they will
051            // simply get updated.
052            if (newDataObject instanceof GlobalBusinessObject) {
053                return success;
054            }
055    
056            // fail and complain if the person has changed the primary keys on
057            // an EDIT maintenance document.
058            if (document.isEdit()) {
059                if (!getDataObjectMetaDataService().equalsByPrimaryKeys(oldBo, newDataObject)) {
060                    // add a complaint to the errors
061                    putDocumentError(KRADConstants.DOCUMENT_ERRORS,
062                            RiceKeyConstants.ERROR_DOCUMENT_MAINTENANCE_PRIMARY_KEYS_CHANGED_ON_EDIT,
063                            getHumanReadablePrimaryKeyFieldNames(dataObjectClass));
064                    success &= false;
065                }
066            }
067    
068            // fail and complain if the person has selected a new object with keys that already exist
069            // in the DB.
070            else if (document.isNew()) {
071    
072                // TODO: check for valid primary keys.
073            }
074    
075            return success;
076        }
077    
078        @Override
079        protected boolean processCustomSaveDocumentBusinessRules(MaintenanceDocument document) {
080            return true;
081        }
082    
083        /**
084         * Check that the rule type is valid when specified.
085         * @param ruleTypeId, the type id
086         * @param contextId, the contextId the action needs to belong to.
087         * @return true if valid, false otherwise.
088         */
089        private boolean validRuleType(String ruleTypeId, String contextId) {
090            if (StringUtils.isBlank(ruleTypeId)) {
091                return true;
092            }
093    
094            if (getKrmsTypeRepositoryService().getRuleTypeByRuleTypeIdAndContextId(ruleTypeId, contextId) != null) {
095                return true;
096            } else {
097                this.putFieldError(KRMSPropertyConstants.Rule.TYPE, "error.rule.invalidType");
098                return false;
099            }
100        }
101    
102        /**
103         * Check that the rule action type is valid when specified.
104         * @param typeId, the action type id
105         * @parm contextId, the contextId the action needs to belong to.
106         * @return true if valid, false otherwise.
107         */
108        private boolean validRuleActionType(String typeId, String contextId) {
109            if (StringUtils.isBlank(typeId)) {
110                return true;
111            }
112    
113            if (getKrmsTypeRepositoryService().getActionTypeByActionTypeIdAndContextId(typeId, contextId) != null) {
114                return true;
115            } else {
116                this.putFieldError(KRMSPropertyConstants.Action.TYPE, "error.action.invalidType");
117                return false;
118            }
119        }
120    
121        /**
122         * Check that a action name is specified.
123         */
124        private boolean validRuleActionName(String name) {
125            if (StringUtils.isNotBlank(name)) {
126                return true;
127            } else {
128                this.putFieldError(KRMSPropertyConstants.Action.NAME, "error.action.missingName");
129                return false;
130            }
131        }
132    
133        public KrmsTypeRepositoryService getKrmsTypeRepositoryService() {
134            return KrmsRepositoryServiceLocator.getKrmsTypeRepositoryService();
135        }
136    
137        public ActionTypeService getActionTypeService(String serviceName) {
138            return (ActionTypeService)KrmsRepositoryServiceLocator.getService(serviceName);
139        }
140    
141        public AgendaAuthorizationService getAgendaAuthorizationService() {
142            return KrmsRepositoryServiceLocator.getAgendaAuthorizationService();
143        }
144    
145    }
146