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