001    /**
002     * Copyright 2005-2014 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.kew.api.action;
017    
018    import org.apache.commons.lang.StringUtils;
019    import org.kuali.rice.core.api.CoreConstants;
020    import org.kuali.rice.core.api.mo.AbstractDataTransferObject;
021    import org.kuali.rice.core.api.mo.ModelBuilder;
022    import org.kuali.rice.kew.api.actionlist.DisplayParameters;
023    import org.w3c.dom.Element;
024    
025    import javax.xml.bind.annotation.XmlAccessType;
026    import javax.xml.bind.annotation.XmlAccessorType;
027    import javax.xml.bind.annotation.XmlAnyElement;
028    import javax.xml.bind.annotation.XmlElement;
029    import javax.xml.bind.annotation.XmlRootElement;
030    import javax.xml.bind.annotation.XmlType;
031    import java.io.Serializable;
032    import java.util.Collection;
033    
034    @XmlRootElement(name = ActionItemCustomization.Constants.ROOT_ELEMENT_NAME)
035    @XmlAccessorType(XmlAccessType.NONE)
036    @XmlType(name = ActionItemCustomization.Constants.TYPE_NAME, propOrder = {
037            ActionItemCustomization.Elements.ACTION_ITEM_ID,
038            ActionItemCustomization.Elements.ACTION_SET,
039            ActionItemCustomization.Elements.DISPLAY_PARAMETERS,
040            CoreConstants.CommonElements.FUTURE_ELEMENTS
041    })
042    public class ActionItemCustomization extends AbstractDataTransferObject implements ActionItemCustomizationContract {
043    
044        @XmlElement(name = Elements.ACTION_ITEM_ID, required = false)
045        private final String actionItemId;
046        @XmlElement(name = Elements.ACTION_SET, required = true)
047        private final ActionSet actionSet;
048        @XmlElement(name = Elements.DISPLAY_PARAMETERS, required = true)
049        private final DisplayParameters displayParameters;
050        @SuppressWarnings("unused")
051        @XmlAnyElement
052        private final Collection<Element> _futureElements = null;
053        
054        /**
055         * Private constructor used only by JAXB.
056         * 
057         */
058        private ActionItemCustomization() {
059            this.actionItemId = null;
060            this.actionSet = null;
061            this.displayParameters = null;
062        }
063        
064        private ActionItemCustomization(Builder builder) {
065            this.actionItemId = builder.getActionItemId();
066            this.actionSet = builder.getActionSet();
067            this.displayParameters = builder.getDisplayParameters();
068        }
069    
070        @Override
071        public String getActionItemId() {
072            return this.actionItemId;
073        }
074        
075        @Override
076        public ActionSet getActionSet() {
077            return this.actionSet;
078        }
079    
080        @Override
081        public DisplayParameters getDisplayParameters() {
082            return this.displayParameters;
083        }
084        
085        /**
086         * A builder which can be used to construct {@link ActionItemCustomization} instances.  
087         * Enforces the constraints of the {@link ActionItemCustomizationContract}. 
088         */
089        public final static class Builder
090            implements Serializable, ModelBuilder, ActionItemCustomizationContract
091        {
092            
093            private String actionItemId;
094            private ActionSet actionSet;        
095            private DisplayParameters displayParameters;
096            
097            private Builder(String actionItemId, ActionSet actionSet, DisplayParameters displayParameters) {
098                setActionItemId(actionItemId);
099                setActionSet(actionSet);
100                setDisplayParameters(displayParameters);
101            }
102            
103            public static Builder create(String actionItemId, ActionSet actionSet, DisplayParameters displayParameters) {
104                return new Builder(actionItemId, actionSet, displayParameters);
105            }
106            
107            public static Builder create(ActionItemCustomizationContract contract) {
108                if (contract == null) {
109                    throw new IllegalArgumentException("contract is null");
110                }
111                Builder builder = create(contract.getActionItemId(), contract.getActionSet(), contract.getDisplayParameters());
112                builder.setActionItemId(contract.getActionItemId());
113                return builder;
114            }
115                        
116            @Override
117            public ActionItemCustomization build() {
118                return new ActionItemCustomization(this);
119            }
120    
121            @Override
122            public ActionSet getActionSet() {
123                return this.actionSet;
124            }
125    
126            public DisplayParameters getDisplayParameters() {
127                return this.displayParameters;
128            }
129    
130            public String getActionItemId() {
131                return this.actionItemId;
132            }
133            
134            public void setActionItemId(String actionItemId) {
135                if (StringUtils.isBlank(actionItemId)) {
136                    throw new IllegalArgumentException("actionItemId is blank");
137                }
138                this.actionItemId = actionItemId;
139            }
140            
141            public void setActionSet(ActionSet actionSet) {
142                if (actionSet == null) {
143                    throw new IllegalArgumentException("actionSet is null");
144                }
145                this.actionSet = actionSet;
146            }
147            
148            public void setDisplayParameters(DisplayParameters displayParameters) {
149                this.displayParameters = displayParameters;
150            }
151        }    
152        
153        /**
154         * Defines some internal constants used on this class.
155         * 
156         */
157        static class Constants {
158            final static String ROOT_ELEMENT_NAME = "actionItemCustomization";
159            final static String TYPE_NAME = "ActionItemCustomizationType";
160        }
161    
162        /**
163          * A private class which exposes constants which define the XML element names to use when this object is marshalled to XML.
164          * 
165          */
166        static class Elements {
167            final static String ACTION_ITEM_ID = "actionItemId";
168            final static String ACTION_SET = "actionSet";
169            final static String DISPLAY_PARAMETERS = "displayParameters";
170        }
171    }