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 */ 017package org.apache.commons.scxml2.model; 018 019import org.apache.commons.logging.LogFactory; 020 021import org.apache.commons.logging.Log; 022 023/** 024 * A custom action is simply a tuple consisting of a namespace URI, 025 * the local name for the custom action and the corresponding 026 * {@link Action} class. 027 * 028 */ 029public class CustomAction { 030 031 /** 032 * Error logged while attempting to define a custom action 033 * in a null or empty namespace. 034 */ 035 private static final String ERR_NO_NAMESPACE = 036 "Cannot define a custom SCXML action with a null or empty namespace"; 037 038 /** 039 * The SCXML namespace, to which custom actions may not be added. 040 */ 041 private static final String NAMESPACE_SCXML = 042 "http://www.w3.org/2005/07/scxml"; 043 044 /** 045 * Error logged while attempting to define a custom action 046 * with the SCXML namespace. 047 */ 048 private static final String ERR_RESERVED_NAMESPACE = 049 "Cannot define a custom SCXML action within the SCXML namespace '" 050 + NAMESPACE_SCXML + "'"; 051 052 /** 053 * Error logged while attempting to define a custom action 054 * in a null or empty local name. 055 */ 056 private static final String ERR_NO_LOCAL_NAME = 057 "Cannot define a custom SCXML action with a null or empty local name"; 058 059 /** 060 * Error logged while attempting to define a custom action 061 * which does not extend {@link Action}. 062 */ 063 private static final String ERR_NOT_AN_ACTION = 064 "Custom SCXML action does not extend Action superclass"; 065 066 /** 067 * The namespace this custom action belongs to. 068 */ 069 private String namespaceURI; 070 071 /** 072 * The local name of the custom action. 073 */ 074 private String localName; 075 076 /** 077 * The implementation of this custom action. 078 */ 079 private Class<? extends Action> actionClass; 080 081 /** 082 * Constructor, if the namespace or local name is null or empty, 083 * or if the implementation is not an {@link Action}, an 084 * {@link IllegalArgumentException} is thrown. 085 * 086 * @param namespaceURI The namespace URI for this custom action. 087 * @param localName The local name for this custom action. 088 * @param actionClass The {@link Action} subclass implementing this 089 * custom action. 090 */ 091 public CustomAction(final String namespaceURI, final String localName, 092 final Class<? extends Action> actionClass) { 093 Log log = LogFactory.getLog(CustomAction.class); 094 if (namespaceURI == null || namespaceURI.trim().length() == 0) { 095 log.error(ERR_NO_NAMESPACE); 096 throw new IllegalArgumentException(ERR_NO_NAMESPACE); 097 } 098 if (namespaceURI.trim().equalsIgnoreCase(NAMESPACE_SCXML)) { 099 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