View Javadoc

    1   /*
    2    * Licensed to the Apache Software Foundation (ASF) under one or more
    3    * contributor license agreements.  See the NOTICE file distributed with
    4    * this work for additional information regarding copyright ownership.
    5    * The ASF licenses this file to You under the Apache License, Version 2.0
    6    * (the "License"); you may not use this file except in compliance with
    7    * the License.  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  package org.apache.commons.scxml.model;
    18
    19  import org.apache.commons.logging.LogFactory;
    20  import org.apache.commons.scxml.SCXMLHelper;
    21
    22  /***
    23   * A custom action is simply a tuple consisting of a namespace URI,
    24   * the local name for the custom action and the corresponding
    25   * {@link Action} class.
    26   *
    27   */
    28  public class CustomAction {
    29
    30      /***
    31       * Error logged while attempting to define a custom action
    32       * in a null or empty namespace.
    33       */
    34      private static final String ERR_NO_NAMESPACE =
    35          "Cannot define a custom SCXML action with a null or empty namespace";
    36
    37      /***
    38       * The SCXML namespace, to which custom actions may not be added.
    39       */
    40      private static final String NAMESPACE_SCXML =
    41          "http://www.w3.org/2005/07/scxml";
    42
    43      /***
    44       * Error logged while attempting to define a custom action
    45       * with the SCXML namespace.
    46       */
    47      private static final String ERR_RESERVED_NAMESPACE =
    48          "Cannot define a custom SCXML action within the SCXML namespace '"
    49          + NAMESPACE_SCXML + "'";
    50
    51      /***
    52       * Error logged while attempting to define a custom action
    53       * in a null or empty local name.
    54       */
    55      private static final String ERR_NO_LOCAL_NAME =
    56          "Cannot define a custom SCXML action with a null or empty local name";
    57
    58      /***
    59       * Error logged while attempting to define a custom action
    60       * which does not extend {@link Action}.
    61       */
    62      private static final String ERR_NOT_AN_ACTION =
    63          "Custom SCXML action does not extend Action superclass";
    64
    65      /***
    66       * The namespace this custom action belongs to.
    67       */
    68      private String namespaceURI;
    69
    70      /***
    71       * The local name of the custom action.
    72       */
    73      private String localName;
    74
    75      /***
    76       * The implementation of this custom action.
    77       */
    78      private Class actionClass;
    79
    80      /***
    81       * The log for this custom action.
    82       */
    83      private org.apache.commons.logging.Log log;
    84
    85      /***
    86       * Constructor, if the namespace or local name is null or empty,
    87       * or if the implementation is not an {@link Action}, an
    88       * {@link IllegalArgumentException} is thrown.
    89       *
    90       * @param namespaceURI The namespace URI for this custom action.
    91       * @param localName The local name for this custom action.
    92       * @param actionClass The {@link Action} subclass implementing this
    93       *                    custom action.
    94       */
    95      public CustomAction(final String namespaceURI, final String localName,
    96              final Class actionClass) {
    97          this.log = LogFactory.getLog(CustomAction.class);
    98          if (SCXMLHelper.isStringEmpty(namespaceURI)) {
    99              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