    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