001/** 002 * Copyright 2005-2017 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 */ 016package org.kuali.rice.kew.impl.rule.attribute; 017 018import org.apache.commons.collections.CollectionUtils; 019import org.kuali.rice.core.api.exception.RiceIllegalArgumentException; 020import org.kuali.rice.core.api.mo.ModelObjectUtils; 021import org.kuali.rice.core.api.uif.RemotableAttributeError; 022import org.kuali.rice.core.api.uif.RemotableAttributeField; 023import org.kuali.rice.kew.api.KewApiConstants; 024import org.kuali.rice.kew.api.extension.ExtensionDefinition; 025import org.kuali.rice.kew.api.extension.ExtensionRepositoryService; 026import org.kuali.rice.kew.api.extension.ExtensionUtils; 027import org.kuali.rice.kew.api.rule.RoleName; 028import org.kuali.rice.kew.framework.rule.attribute.WorkflowRuleAttributeFields; 029import org.kuali.rice.kew.framework.rule.attribute.WorkflowRuleAttributeHandlerService; 030import org.kuali.rice.kew.rule.RoleAttribute; 031import org.kuali.rice.kew.rule.RuleExtensionValue; 032import org.kuali.rice.kew.rule.WorkflowRuleAttribute; 033import org.kuali.rice.kew.rule.WorkflowRuleSearchAttribute; 034import org.kuali.rice.kew.rule.XmlConfiguredAttribute; 035import org.kuali.rice.kew.rule.bo.RuleAttribute; 036import org.kuali.rice.kew.rule.xmlrouting.GenericXMLRuleAttribute; 037import org.kuali.rice.kns.util.FieldUtils; 038import org.kuali.rice.kns.web.ui.Row; 039 040import java.util.Collections; 041import java.util.HashMap; 042import java.util.List; 043import java.util.Map; 044 045/** 046 * Reference implementation of {@code WorkflowRuleAttributeHandlerService}. 047 * 048 * @author Kuali Rice Team (rice.collab@kuali.org) 049 */ 050public class WorkflowRuleAttributeHandlerServiceImpl implements WorkflowRuleAttributeHandlerService { 051 052 private ExtensionRepositoryService extensionRepositoryService; 053 054 @Override 055 public WorkflowRuleAttributeFields getRuleFields(Map<String, String> parameters, 056 ExtensionDefinition extensionDefinition, 057 boolean required) 058 throws RiceIllegalArgumentException { 059 if (parameters == null) { 060 parameters = new HashMap<String, String>(); 061 } 062 WorkflowRuleAttribute attribute = loadAttribute(extensionDefinition); 063 attribute.setRequired(required); 064 List<RemotableAttributeError> errors = attribute.validateRuleData(parameters); 065 List<RemotableAttributeField> fields = FieldUtils.convertRowsToAttributeFields(attribute.getRuleRows()); 066 List<RuleExtensionValue> ruleExtensionValues = attribute.getRuleExtensionValues(); 067 Map<String, String> ruleExtensionValuesMap = new HashMap<String, String>(); 068 for (RuleExtensionValue ruleExtensionValue : ruleExtensionValues) { 069 ruleExtensionValuesMap.put(ruleExtensionValue.getKey(), ruleExtensionValue.getValue()); 070 } 071 return WorkflowRuleAttributeFields.create(errors, fields, ruleExtensionValuesMap); 072 } 073 074 @Override 075 public WorkflowRuleAttributeFields getSearchFields(Map<String, String> parameters, 076 ExtensionDefinition extensionDefinition, 077 boolean required) 078 throws RiceIllegalArgumentException { 079 if (parameters == null) { 080 parameters = new HashMap<String, String>(); 081 } 082 WorkflowRuleAttribute attribute = loadAttribute(extensionDefinition); 083 attribute.setRequired(required); 084 List<RemotableAttributeError> errors; 085 List<Row> searchRows; 086 if (attribute instanceof WorkflowRuleSearchAttribute) { 087 errors = ((WorkflowRuleSearchAttribute)attribute).validateSearchData(parameters); 088 searchRows = ((WorkflowRuleSearchAttribute)attribute).getSearchRows(); 089 } else { 090 errors = attribute.validateRuleData(parameters); 091 searchRows = attribute.getRuleRows(); 092 } 093 List<RemotableAttributeField> fields = FieldUtils.convertRowsToAttributeFields(searchRows); 094 List<RuleExtensionValue> ruleExtensionValues = attribute.getRuleExtensionValues(); 095 Map<String, String> ruleExtensionValuesMap = new HashMap<String, String>(); 096 for (RuleExtensionValue ruleExtensionValue : ruleExtensionValues) { 097 ruleExtensionValuesMap.put(ruleExtensionValue.getKey(), ruleExtensionValue.getValue()); 098 } 099 return WorkflowRuleAttributeFields.create(errors, fields, ruleExtensionValuesMap); 100 } 101 102 @Override 103 public WorkflowRuleAttributeFields getRoutingDataFields( Map<String, String> parameters, 104 ExtensionDefinition extensionDefinition, 105 boolean required) 106 throws RiceIllegalArgumentException { 107 if (parameters == null) { 108 parameters = new HashMap<String, String>(); 109 } 110 WorkflowRuleAttribute attribute = loadAttribute(extensionDefinition); 111 attribute.setRequired(required); 112 List<RemotableAttributeError> allErrors = attribute.validateRoutingData(parameters); 113 List<RemotableAttributeError> ruleDataErrors = attribute.validateRuleData(parameters); 114 for (RemotableAttributeError error : ruleDataErrors) { 115 allErrors.add(error); 116 } 117 List<RemotableAttributeField> fields = FieldUtils.convertRowsToAttributeFields(attribute.getRoutingDataRows()); 118 List<RuleExtensionValue> ruleExtensionValues = attribute.getRuleExtensionValues(); 119 Map<String, String> ruleExtensionValuesMap = new HashMap<String, String>(); 120 for (RuleExtensionValue ruleExtensionValue : ruleExtensionValues) { 121 ruleExtensionValuesMap.put(ruleExtensionValue.getKey(), ruleExtensionValue.getValue()); 122 } 123 return WorkflowRuleAttributeFields.create(allErrors, fields, ruleExtensionValuesMap); 124 } 125 126 @Override 127 public List<RoleName> getRoleNames(ExtensionDefinition extensionDefinition) { 128 WorkflowRuleAttribute attribute = loadAttribute(extensionDefinition); 129 if (attribute instanceof RoleAttribute) { 130 RoleAttribute roleAttribute = (RoleAttribute) attribute; 131 List<RoleName> roleNames = roleAttribute.getRoleNames(); 132 if (CollectionUtils.isNotEmpty(roleNames)) { 133 return ModelObjectUtils.createImmutableCopy(roleNames); 134 } 135 } 136 return Collections.emptyList(); 137 } 138 139 private WorkflowRuleAttribute loadAttribute(ExtensionDefinition extensionDefinition) { 140 if (extensionDefinition == null) { 141 throw new RiceIllegalArgumentException("extensionDefinition was null or blank"); 142 } 143 Object attribute = ExtensionUtils.loadExtension(extensionDefinition); 144 if (attribute == null) { 145 throw new RiceIllegalArgumentException("Failed to load WorkflowRuleAttribute for: " + extensionDefinition); 146 } 147 if (!WorkflowRuleAttribute.class.isAssignableFrom(attribute.getClass())) { 148 throw new RiceIllegalArgumentException("Failed to locate a WorkflowRuleAttribute with the given name: " + extensionDefinition.getName()); 149 } 150 if (attribute instanceof XmlConfiguredAttribute) { 151 ((XmlConfiguredAttribute) attribute).setExtensionDefinition(extensionDefinition); 152 } 153 return (WorkflowRuleAttribute) attribute; 154 } 155 156 157 protected ExtensionRepositoryService getExtensionRepositoryService() { 158 return extensionRepositoryService; 159 } 160 161 public void setExtensionRepositoryService(ExtensionRepositoryService extensionRepositoryService) { 162 this.extensionRepositoryService = extensionRepositoryService; 163 } 164}