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