View Javadoc

    1   /*
    2    *
    3    *   Copyright 2006 The Apache Software Foundation.
    4    *
    5    *  Licensed under the Apache License, Version 2.0 (the "License");
    6    *  you may not use this file except in compliance with the License.
    7    *  You may obtain a copy of the License at
    8    *
    9    *      http://www.apache.org/licenses/LICENSE-2.0
    10   *
    11   *  Unless required by applicable law or agreed to in writing, software
    12   *  distributed under the License is distributed on an "AS IS" BASIS,
    13   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14   *  See the License for the specific language governing permissions and
    15   *  limitations under the License.
    16   *
    17   */
    18  package org.apache.commons.scxml.model;
    19
    20  import org.apache.commons.logging.LogFactory;
    21  import org.apache.commons.scxml.SCXMLHelper;
    22
    23  /***
    24   * A custom action is simply a tuple consisting of a namespace URI,
    25   * the local name for the custom action and the corresponding
    26   * {@link Action} class.
    27   *
    28   */
    29  public class CustomAction {
    30
    31      /***
    32       * Error logged while attempting to define a custom action
    33       * in a null or empty namespace.
    34       */
    35      private static final String ERR_NO_NAMESPACE =
    36          "Cannot define a custom SCXML action with a null or empty namespace";
    37
    38      /***
    39       * The SCXML namespace, to which custom actions may not be added.
    40       */
    41      private static final String NAMESPACE_SCXML =
    42          "http://www.w3.org/2005/07/scxml";
    43
    44      /***
    45       * Error logged while attempting to define a custom action
    46       * with the SCXML namespace.
    47       */
    48      private static final String ERR_RESERVED_NAMESPACE =
    49          "Cannot define a custom SCXML action within the SCXML namespace '"
    50          + NAMESPACE_SCXML + "'";
    51
    52      /***
    53       * Error logged while attempting to define a custom action
    54       * in a null or empty local name.
    55       */
    56      private static final String ERR_NO_LOCAL_NAME =
    57          "Cannot define a custom SCXML action with a null or empty local name";
    58
    59      /***
    60       * Error logged while attempting to define a custom action
    61       * which does not extend {@link Action}.
    62       */
    63      private static final String ERR_NOT_AN_ACTION =
    64          "Custom SCXML action does not extend Action superclass";
    65
    66      /***
    67       * The namespace this custom action belongs to.
    68       */
    69      private String namespaceURI;
    70
    71      /***
    72       * The local name of the custom action.
    73       */
    74      private String localName;
    75
    76      /***
    77       * The implementation of this custom action.
    78       */
    79      private Class actionClass;
    80
    81      /***
    82       * The log for this custom action.
    83       */
    84      private org.apache.commons.logging.Log log;
    85
    86      /***
    87       * Constructor, if the namespace or local name is null or empty,
    88       * or if the implementation is not an {@link Action}, an
    89       * {@link IllegalArgumentException} is thrown.
    90       *
    91       * @param namespaceURI The namespace URI for this custom action.
    92       * @param localName The local name for this custom action.
    93       * @param actionClass The {@link Action} subclass implementing this
    94       *                    custom action.
    95       */
    96      public CustomAction(final String namespaceURI, final String localName,
    97              final Class actionClass) {
    98          this.log = LogFactory.getLog(CustomAction.class);
    99          if (SCXMLHelper.isStringEmpty(namespaceURI)) {
    100             log.error(ERR_NO_NAMESPACE);
    101             throw new IllegalArgumentException(ERR_NO_NAMESPACE);
    102         }
    103         if (namespaceURI.trim().equalsIgnoreCase(NAMESPACE_SCXML)) {
    104             log.error(ERR_RESERVED_NAMESPACE);
    105             throw new IllegalArgumentException(ERR_RESERVED_NAMESPACE);
    106         }
    107         if (SCXMLHelper.isStringEmpty(localName)) {
    108             log.error(ERR_NO_LOCAL_NAME);
    109             throw new IllegalArgumentException(ERR_NO_LOCAL_NAME);
    110         }
    111         if (actionClass == null
    112                 || !SCXMLHelper.subtypeOf(actionClass, Action.class)) {
    113             log.error(ERR_NOT_AN_ACTION);
    114             throw new IllegalArgumentException(ERR_NOT_AN_ACTION);
    115         }
    116         this.namespaceURI = namespaceURI;
    117         this.localName = localName;
    118         this.actionClass = actionClass;
    119     }
    120
    121     /***
    122      * Get this custom action's implementation.
    123      *
    124      * @return Returns the action class.
    125      */
    126     public Class getActionClass() {
    127         return actionClass;
    128     }
    129
    130     /***
    131      * Get the local name for this custom action.
    132      *
    133      * @return Returns the local name.
    134      */
    135     public String getLocalName() {
    136         return localName;
    137     }
    138
    139     /***
    140      * Get the namespace URI for this custom action.
    141      *
    142      * @return Returns the namespace URI.
    143      */
    144     public String getNamespaceURI() {
    145         return namespaceURI;
    146     }
    147
    148 }
    149