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