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}