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