001 /**
002 * Copyright 2005-2013 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.edl.impl.components;
017
018 import java.util.Iterator;
019 import java.util.List;
020
021 import org.kuali.rice.core.api.uif.RemotableAttributeErrorContract;
022 import org.kuali.rice.edl.impl.EDLContext;
023 import org.kuali.rice.edl.impl.RequestParser;
024 import org.kuali.rice.kew.api.WorkflowDocument;
025 import org.kuali.rice.kew.api.document.PropertyDefinition;
026 import org.kuali.rice.kew.api.document.attribute.WorkflowAttributeDefinition;
027 import org.w3c.dom.Element;
028
029 /**
030 * Populates workflow rule attributes associated with the current configElement.
031 *
032 * @author Kuali Rice Team (rice.collab@kuali.org)
033 *
034 */
035 public class AttributeEDLConfigComponent extends SimpleWorkflowEDLConfigComponent {
036
037 public List getMatchingParams(Element originalConfigElement, RequestParser requestParser, EDLContext edlContext) {
038 List matchingParams = super.getMatchingParams(originalConfigElement, requestParser, edlContext);
039 // we don't want to clear the attribute content if they are just opening up the document to view it!
040 if (!edlContext.getUserAction().isLoadAction()) {
041 String attributeName = originalConfigElement.getAttribute("attributeName");
042 String attributePropertyName = originalConfigElement.getAttribute("name");
043
044 WorkflowDocument document = (WorkflowDocument) requestParser
045 .getAttribute(RequestParser.WORKFLOW_DOCUMENT_SESSION_KEY);
046 // clear attribute content so that duplicate attribute values are not added during submission of a new EDL form values version
047 document.clearAttributeContent();
048
049 WorkflowAttributeDefinition.Builder attributeDefBuilder = getWorkflowAttributeDefinitionVO(attributeName, document);
050
051 for (Iterator iter = matchingParams.iterator(); iter.hasNext();) {
052 MatchingParam param = (MatchingParam) iter.next();
053 PropertyDefinition property = attributeDefBuilder.getPropertyDefinition(attributePropertyName);
054 //if the prop doesn't exist create it and add it to the definition otherwise update the property value
055 if (property == null) {
056 property = PropertyDefinition.create(attributePropertyName, param.getParamValue());
057 } else {
058 // modify the current property
059 attributeDefBuilder.getPropertyDefinitions().remove(property);
060 property = PropertyDefinition.create(property.getName(), param.getParamValue());
061 }
062 attributeDefBuilder.addPropertyDefinition(property);
063
064 }
065
066 WorkflowAttributeDefinition attributeDef = attributeDefBuilder.build();
067 document.addAttributeDefinition(attributeDef);
068
069 // validate if they are taking an action on the document (i.e. it's annotatable)
070 if (edlContext.getUserAction().isValidatableAction()) {
071 List<? extends RemotableAttributeErrorContract> errors = document.validateAttributeDefinition(attributeDef);
072 if (!errors.isEmpty()) {
073 getEdlContext().setInError(true);
074 }
075 for (RemotableAttributeErrorContract error : errors) {
076 MatchingParam param = getMatchingParam(matchingParams, error.getAttributeName());
077 // if it doesn't match a param, then this is a global error
078 if (param == null) {
079 List globalErrors = (List) getEdlContext().getRequestParser().getAttribute(
080 RequestParser.GLOBAL_ERRORS_KEY);
081 globalErrors.add(error.getMessage());
082 } else {
083 param.setError(Boolean.TRUE);
084 param.setErrorMessage(error.getMessage());
085 }
086 }
087 }
088 }
089 return matchingParams;
090 }
091
092 private WorkflowAttributeDefinition.Builder getWorkflowAttributeDefinitionVO(String attributeName, WorkflowDocument document) {
093 for (WorkflowAttributeDefinition attributeDefinition : document.getAttributeDefinitions()) {
094 if (attributeDefinition.getAttributeName().equals(attributeName)) {
095 return WorkflowAttributeDefinition.Builder.create(attributeDefinition);
096 }
097 }
098 return WorkflowAttributeDefinition.Builder.create(attributeName);
099 }
100
101 private MatchingParam getMatchingParam(List matchingParams, String name) {
102 for (Iterator iterator = matchingParams.iterator(); iterator.hasNext();) {
103 MatchingParam param = (MatchingParam) iterator.next();
104 if (param.getParamName().equals(name)) {
105 return param;
106 }
107 }
108 return null;
109 }
110 }