001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *     http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.commons.scxml.model;
018    
019    import org.apache.commons.logging.LogFactory;
020    import org.apache.commons.scxml.SCXMLHelper;
021    
022    /**
023     * A custom action is simply a tuple consisting of a namespace URI,
024     * the local name for the custom action and the corresponding
025     * {@link Action} class.
026     *
027     */
028    public class CustomAction {
029    
030        /**
031         * Error logged while attempting to define a custom action
032         * in a null or empty namespace.
033         */
034        private static final String ERR_NO_NAMESPACE =
035            "Cannot define a custom SCXML action with a null or empty namespace";
036    
037        /**
038         * The SCXML namespace, to which custom actions may not be added.
039         */
040        private static final String NAMESPACE_SCXML =
041            "http://www.w3.org/2005/07/scxml";
042    
043        /**
044         * Error logged while attempting to define a custom action
045         * with the SCXML namespace.
046         */
047        private static final String ERR_RESERVED_NAMESPACE =
048            "Cannot define a custom SCXML action within the SCXML namespace '"
049            + NAMESPACE_SCXML + "'";
050    
051        /**
052         * Error logged while attempting to define a custom action
053         * in a null or empty local name.
054         */
055        private static final String ERR_NO_LOCAL_NAME =
056            "Cannot define a custom SCXML action with a null or empty local name";
057    
058        /**
059         * Error logged while attempting to define a custom action
060         * which does not extend {@link Action}.
061         */
062        private static final String ERR_NOT_AN_ACTION =
063            "Custom SCXML action does not extend Action superclass";
064    
065        /**
066         * The namespace this custom action belongs to.
067         */
068        private String namespaceURI;
069    
070        /**
071         * The local name of the custom action.
072         */
073        private String localName;
074    
075        /**
076         * The implementation of this custom action.
077         */
078        private Class actionClass;
079    
080        /**
081         * The log for this custom action.
082         */
083        private org.apache.commons.logging.Log log;
084    
085        /**
086         * Constructor, if the namespace or local name is null or empty,
087         * or if the implementation is not an {@link Action}, an
088         * {@link IllegalArgumentException} is thrown.
089         *
090         * @param namespaceURI The namespace URI for this custom action.
091         * @param localName The local name for this custom action.
092         * @param actionClass The {@link Action} subclass implementing this
093         *                    custom action.
094         */
095        public CustomAction(final String namespaceURI, final String localName,
096                final Class actionClass) {
097            this.log = LogFactory.getLog(CustomAction.class);
098            if (SCXMLHelper.isStringEmpty(namespaceURI)) {
099                log.error(ERR_NO_NAMESPACE);
100                throw new IllegalArgumentException(ERR_NO_NAMESPACE);
101            }
102            if (namespaceURI.trim().equalsIgnoreCase(NAMESPACE_SCXML)) {
103                log.error(ERR_RESERVED_NAMESPACE);
104                throw new IllegalArgumentException(ERR_RESERVED_NAMESPACE);
105            }
106            if (SCXMLHelper.isStringEmpty(localName)) {
107                log.error(ERR_NO_LOCAL_NAME);
108                throw new IllegalArgumentException(ERR_NO_LOCAL_NAME);
109            }
110            if (actionClass == null
111                    || !Action.class.isAssignableFrom(actionClass)) {
112                log.error(ERR_NOT_AN_ACTION);
113                throw new IllegalArgumentException(ERR_NOT_AN_ACTION);
114            }
115            this.namespaceURI = namespaceURI;
116            this.localName = localName;
117            this.actionClass = actionClass;
118        }
119    
120        /**
121         * Get this custom action's implementation.
122         *
123         * @return Returns the action class.
124         */
125        public Class getActionClass() {
126            return actionClass;
127        }
128    
129        /**
130         * Get the local name for this custom action.
131         *
132         * @return Returns the local name.
133         */
134        public String getLocalName() {
135            return localName;
136        }
137    
138        /**
139         * Get the namespace URI for this custom action.
140         *
141         * @return Returns the namespace URI.
142         */
143        public String getNamespaceURI() {
144            return namespaceURI;
145        }
146    
147    }
148