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.framework.rule.attribute;
017
018import org.kuali.rice.core.api.CoreConstants;
019import org.kuali.rice.core.api.mo.AbstractDataTransferObject;
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.core.api.util.jaxb.MapStringStringAdapter;
024import org.w3c.dom.Element;
025
026import javax.xml.bind.annotation.XmlAccessType;
027import javax.xml.bind.annotation.XmlAccessorType;
028import javax.xml.bind.annotation.XmlAnyElement;
029import javax.xml.bind.annotation.XmlElement;
030import javax.xml.bind.annotation.XmlElementWrapper;
031import javax.xml.bind.annotation.XmlRootElement;
032import javax.xml.bind.annotation.XmlType;
033import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
034import java.util.Collection;
035import java.util.Collections;
036import java.util.List;
037import java.util.Map;
038
039/**
040 * An immutable data transfer object used to hold a list of validation errors, attribute fields, and rule extension
041 * values for a WorkflowRuleAttribute.
042 *
043 * @author Kuali Rice Team (rice.collab@kuali.org)
044 */
045@XmlRootElement(name = WorkflowRuleAttributeFields.Constants.ROOT_ELEMENT_NAME)
046@XmlAccessorType(XmlAccessType.NONE)
047@XmlType(name = WorkflowRuleAttributeFields.Constants.TYPE_NAME, propOrder = {
048        WorkflowRuleAttributeFields.Elements.VALIDATION_ERRORS,
049        WorkflowRuleAttributeFields.Elements.ATTRIBUTE_FIELDS,
050        WorkflowRuleAttributeFields.Elements.RULE_EXTENSION_VALUES,
051        CoreConstants.CommonElements.FUTURE_ELEMENTS
052})
053
054public class WorkflowRuleAttributeFields extends AbstractDataTransferObject {
055
056    @XmlElementWrapper(name = Elements.VALIDATION_ERRORS, required = true)
057    @XmlElement(name = Elements.VALIDATION_ERROR, required = false)
058    private final List<RemotableAttributeError> validationErrors;
059
060    @XmlElementWrapper(name = Elements.ATTRIBUTE_FIELDS, required = true)
061    @XmlElement(name = Elements.ATTRIBUTE_FIELD, required = false)
062    private final List<RemotableAttributeField> attributeFields;
063
064    @XmlElement(name = Elements.RULE_EXTENSION_VALUES, required = false)
065    @XmlJavaTypeAdapter(MapStringStringAdapter.class)
066    private final Map<String, String> ruleExtensionValues;
067
068    @SuppressWarnings("unused")
069    @XmlAnyElement
070    private final Collection<Element> _futureElements = null;
071
072    /**
073     * Private constructor used only by JAXB.
074     */
075    @SuppressWarnings("unused")
076    private WorkflowRuleAttributeFields() {
077        this.validationErrors = null;
078        this.attributeFields = null;
079        this.ruleExtensionValues = null;
080    }
081
082    private WorkflowRuleAttributeFields(List<RemotableAttributeError> validationErrors,
083                                        List<RemotableAttributeField> attributeFields,
084                                        Map<String, String> ruleExtensionValues) {
085        this.validationErrors = ModelObjectUtils.createImmutableCopy(validationErrors);
086        this.attributeFields = ModelObjectUtils.createImmutableCopy(attributeFields);
087        this.ruleExtensionValues = ModelObjectUtils.createImmutableCopy(ruleExtensionValues);
088    }
089
090    /**
091     * Construct a new instance of {@code WorkflowRuleAttributeFields} with the given validation errors, fields, and
092     * rule extension values.
093     *
094     * @param validationErrors    any errors associated with these fields
095     * @param attributeFields     the list of remotable attribute fields
096     * @param ruleExtensionValues the rule extension values associated with these fields
097     * @return a new WorkflowRuleAttributeFields instance containing the given values
098     */
099    public static WorkflowRuleAttributeFields create(List<RemotableAttributeError> validationErrors,
100                                                     List<RemotableAttributeField> attributeFields,
101                                                     Map<String, String> ruleExtensionValues) {
102        if (validationErrors == null) {
103            validationErrors = Collections.emptyList();
104        }
105        if (attributeFields == null) {
106            attributeFields = Collections.emptyList();
107        }
108        if (ruleExtensionValues == null) {
109            ruleExtensionValues = Collections.emptyMap();
110        }
111        return new WorkflowRuleAttributeFields(validationErrors, attributeFields, ruleExtensionValues);
112    }
113
114    public List<RemotableAttributeError> getValidationErrors() {
115        return validationErrors;
116    }
117
118    public List<RemotableAttributeField> getAttributeFields() {
119        return attributeFields;
120    }
121
122    public Map<String, String> getRuleExtensionValues() {
123        return ruleExtensionValues;
124    }
125
126    /**
127     * Defines some internal constants used on this class.
128     */
129    static class Constants {
130        final static String ROOT_ELEMENT_NAME = "workflowRuleAttributeFields";
131        final static String TYPE_NAME = "WorkflowRuleAttributeFieldsType";
132    }
133
134    /**
135     * A private class which exposes constants which define the XML element names to use when this object is marshalled to XML.
136     */
137    static class Elements {
138        final static String VALIDATION_ERRORS = "validationErrors";
139        final static String VALIDATION_ERROR = "validationError";
140        final static String ATTRIBUTE_FIELDS = "attributeFields";
141        final static String ATTRIBUTE_FIELD = "attributeField";
142        final static String RULE_EXTENSION_VALUES = "ruleExtensionValues";
143
144    }
145
146}