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.scxml2.model;
18
19 import org.apache.commons.logging.LogFactory;
20
21 import org.apache.commons.logging.Log;
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<? extends Action> actionClass;
80
81 /**
82 * Constructor, if the namespace or local name is null or empty,
83 * or if the implementation is not an {@link Action}, an
84 * {@link IllegalArgumentException} is thrown.
85 *
86 * @param namespaceURI The namespace URI for this custom action.
87 * @param localName The local name for this custom action.
88 * @param actionClass The {@link Action} subclass implementing this
89 * custom action.
90 */
91 public CustomAction(final String namespaceURI, final String localName,
92 final Class<? extends Action> actionClass) {
93 Log log = LogFactory.getLog(CustomAction.class);
94 if (namespaceURI == null || namespaceURI.trim().length() == 0) {
95 log.error(ERR_NO_NAMESPACE);
96 throw new IllegalArgumentException(ERR_NO_NAMESPACE);
97 }
98 if (namespaceURI.trim().equalsIgnoreCase(NAMESPACE_SCXML)) {
99 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