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.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.w3c.dom.Element;
022    
023    import javax.xml.bind.annotation.XmlAccessType;
024    import javax.xml.bind.annotation.XmlAccessorType;
025    import javax.xml.bind.annotation.XmlAnyElement;
026    import javax.xml.bind.annotation.XmlElement;
027    import javax.xml.bind.annotation.XmlRootElement;
028    import javax.xml.bind.annotation.XmlType;
029    import java.util.Collection;
030    
031    /**
032     * Represents the definition of an Action invocation against an action item.
033     * 
034     * @author Kuali Rice Team (rice.collab@kuali.org)
035     *
036     */
037    @XmlRootElement(name = ActionInvocation.Constants.ROOT_ELEMENT_NAME)
038    @XmlAccessorType(XmlAccessType.NONE)
039    @XmlType(name = ActionInvocation.Constants.TYPE_NAME, propOrder = {
040            ActionInvocation.Elements.ACTION,
041            ActionInvocation.Elements.ACTION_ITEM_ID,
042            CoreConstants.CommonElements.FUTURE_ELEMENTS
043    })
044    public class ActionInvocation extends AbstractDataTransferObject {
045    
046        @XmlElement(name = Elements.ACTION, required = true)
047        private final ActionType action;
048    
049        @XmlElement(name = Elements.ACTION_ITEM_ID, required = true)
050        private final String actionItemId;
051    
052        @SuppressWarnings("unused")
053        @XmlAnyElement
054        private final Collection<Element> _futureElements = null;
055    
056        @SuppressWarnings("unused")
057        private ActionInvocation() {
058            this.action = null;
059            this.actionItemId = null;
060        }
061    
062        private ActionInvocation(ActionType action, String actionItemId) {
063            if (action == null) {
064                            throw new IllegalArgumentException("action was null");
065                    }
066            if (StringUtils.isBlank(actionItemId)) {
067                            throw new IllegalArgumentException("actionItemId was a null or blank value");
068                    }
069                    this.actionItemId = actionItemId;
070                    this.action = action;
071        }
072    
073        /**
074         * Creates a new {@code ActionInvocation} which indicates that the specified action should be executed against the
075         * action item with the given id.
076         *
077         * @param action the action to execute against the action item
078         * @param actionItemId the id of the action item against which to execute the action
079         *
080         * @return a new {@code ActionInvocation} containing the provided values
081         *
082         * @throws IllegalArgumentException if {@code action} is null or {@code actionItemId} is a null or blank value
083         */
084            public static ActionInvocation create(ActionType action, String actionItemId) {
085            return new ActionInvocation(action, actionItemId);
086            }
087                    
088            public ActionType getAction() {
089                    return action;
090            }
091            
092            public String getActionItemId() {
093                    return actionItemId;
094            }
095    
096        /**
097         * Defines some internal constants used on this class.
098         */
099        static class Constants {
100            final static String ROOT_ELEMENT_NAME = "actionInvocation";
101            final static String TYPE_NAME = "ActionInvocationType";
102        }
103    
104        /**
105         * A private class which exposes constants which define the XML element names to use when this object is marshalled to XML.
106         */
107        static class Elements {
108            final static String ACTION = "action";
109            final static String ACTION_ITEM_ID = "actionItemId";
110        }
111                    
112    }