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    }