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 */
017package org.apache.commons.scxml2.model;
018
019import org.apache.commons.logging.LogFactory;
020
021import org.apache.commons.logging.Log;
022
023/**
024 * A custom action is simply a tuple consisting of a namespace URI,
025 * the local name for the custom action and the corresponding
026 * {@link Action} class.
027 *
028 */
029public class CustomAction {
030
031    /**
032     * Error logged while attempting to define a custom action
033     * in a null or empty namespace.
034     */
035    private static final String ERR_NO_NAMESPACE =
036        "Cannot define a custom SCXML action with a null or empty namespace";
037
038    /**
039     * The SCXML namespace, to which custom actions may not be added.
040     */
041    private static final String NAMESPACE_SCXML =
042        "http://www.w3.org/2005/07/scxml";
043
044    /**
045     * Error logged while attempting to define a custom action
046     * with the SCXML namespace.
047     */
048    private static final String ERR_RESERVED_NAMESPACE =
049        "Cannot define a custom SCXML action within the SCXML namespace '"
050        + NAMESPACE_SCXML + "'";
051
052    /**
053     * Error logged while attempting to define a custom action
054     * in a null or empty local name.
055     */
056    private static final String ERR_NO_LOCAL_NAME =
057        "Cannot define a custom SCXML action with a null or empty local name";
058
059    /**
060     * Error logged while attempting to define a custom action
061     * which does not extend {@link Action}.
062     */
063    private static final String ERR_NOT_AN_ACTION =
064        "Custom SCXML action does not extend Action superclass";
065
066    /**
067     * The namespace this custom action belongs to.
068     */
069    private String namespaceURI;
070
071    /**
072     * The local name of the custom action.
073     */
074    private String localName;
075
076    /**
077     * The implementation of this custom action.
078     */
079    private Class<? extends Action> actionClass;
080
081    /**
082     * Constructor, if the namespace or local name is null or empty,
083     * or if the implementation is not an {@link Action}, an
084     * {@link IllegalArgumentException} is thrown.
085     *
086     * @param namespaceURI The namespace URI for this custom action.
087     * @param localName The local name for this custom action.
088     * @param actionClass The {@link Action} subclass implementing this
089     *                    custom action.
090     */
091    public CustomAction(final String namespaceURI, final String localName,
092            final Class<? extends Action> actionClass) {
093        Log log = LogFactory.getLog(CustomAction.class);
094        if (namespaceURI == null || namespaceURI.trim().length() == 0) {
095            log.error(ERR_NO_NAMESPACE);
096            throw new IllegalArgumentException(ERR_NO_NAMESPACE);
097        }
098        if (namespaceURI.trim().equalsIgnoreCase(NAMESPACE_SCXML)) {
099            log.error(ERR_RESERVED_NAMESPACE);
100            throw new IllegalArgumentException(ERR_RESERVED_NAMESPACE);
101        }
102        if (localName == null || localName.trim().length() == 0) {
103            log.error(ERR_NO_LOCAL_NAME);
104            throw new IllegalArgumentException(ERR_NO_LOCAL_NAME);
105        }
106        if (actionClass == null || !Action.class.isAssignableFrom(actionClass)) {
107            log.error(ERR_NOT_AN_ACTION);
108            throw new IllegalArgumentException(ERR_NOT_AN_ACTION);
109        }
110        this.namespaceURI = namespaceURI;
111        this.localName = localName;
112        this.actionClass = actionClass;
113    }
114
115    /**
116     * Get this custom action's implementation.
117     *
118     * @return Returns the action class.
119     */
120    public Class<? extends Action> getActionClass() {
121        return actionClass;
122    }
123
124    /**
125     * Get the local name for this custom action.
126     *
127     * @return Returns the local name.
128     */
129    public String getLocalName() {
130        return localName;
131    }
132
133    /**
134     * Get the namespace URI for this custom action.
135     *
136     * @return Returns the namespace URI.
137     */
138    public String getNamespaceURI() {
139        return namespaceURI;
140    }
141}
142