webwork/src/main/webwork/action ActionSupport.java,1.49,1.50
[email protected] Fri, 31 Oct 2003 20:37:07 -0800
| Newsgroups | gmane.comp.java.open-symphony.cvs |
|---|---|
| Message-ID | <[email protected]> |
Update of /cvsroot/opensymphony/webwork/src/main/webwork/action In directory sc8-pr-cvs1:/tmp/cvs-serv6285/src/main/webwork/action Modified Files: ActionSupport.java Log Message: Moved all jars Index: ActionSupport.java =================================================================== RCS file: /cvsroot/opensymphony/webwork/src/main/webwork/action/ActionSupport.java,v retrieving revision 1.49 retrieving revision 1.50 diff -u -d -r1.49 -r1.50 --- ActionSupport.java 1 Nov 2003 02:55:30 -0000 1.49 +++ ActionSupport.java 1 Nov 2003 04:37:04 -0000 1.50 @@ -1,450 +1,450 @@ -/* - * WebWork, Web Application Framework - * - * Distributable under Apache license. - * See terms of license at opensource.org - */ -package webwork.action; - -import org.apache.commons.logging.*; - -import java.io.Serializable; -import java.io.IOException; -import java.lang.reflect.Method; -import java.lang.reflect.InvocationTargetException; -import java.util.*; -import java.text.MessageFormat; -import javax.servlet.ServletRequest; - -import webwork.util.editor.PropertyEditorException; - -/** - * This is a useful base class for WebWork Action implementations. It gives you access to - * a set of useful functionality, including result view mapping, error handling, and i18n. - * <p> - * It is also possible to use this class by way of delegation instead of subclassing. - * This is useful in the case that your action cannot use subclassing to add functionality - * - * @see Action - * @author Rickard Oberg ([email protected]) - * @author Victor Salaman ([email protected]) - * @version $Revision$ - */ -public class ActionSupport - implements Action, Serializable, IllegalArgumentAware -{ - // Attributes ---------------------------------------------------- - static private Log debugLog = LogFactory.getLog(ActionSupport.class); - - protected transient Log log = LogFactory.getLog(this.getClass()); - - protected Map errorMap; - protected Collection errorMessages; - protected String command; - - private String actionName = null; - - - // IllegalArgumentAware implementation ----------------------------- - /* - * This method is called when a field cannot be set because of an invalid or empty value. - * If the exception is a PropertyEditorException then the exception message is a - * bundle key that will be looked up by calling the getPropertyEditorMessage method. - * - * @see IllegalArgumentAware - * @see webwork.util.editor.PropertyEditorException - */ - public void addIllegalArgumentException(String fieldName, IllegalArgumentException e) - { - String msg = e.getMessage(); - if (e instanceof PropertyEditorException) - { - msg = getPropertyEditorMessage(fieldName, (PropertyEditorException) e); - } - addError(fieldName, msg); - } - - /** - * This method is called from addIllegalArgumentException and it should return an - * error message (that may be localized). - * The implementation here does this by calling the getText method but you may - * override it with your own implementation. - * The default messages are stored in the ActionSupport.properties file - */ - protected String getPropertyEditorMessage(String fieldName, PropertyEditorException pe) - { - String bundleText = getText(pe.getBundleKey()); - Object[] propertyValues = pe.getPropertyValues(); - if (propertyValues == null) - return bundleText; - else - return MessageFormat.format(bundleText, propertyValues); - } - - // CommandDriven implementation ---------------------------------- - /** - * Support implementation of CommandDriven interface. Let your action - * subclasses implement CommandDriven if they support this notion. - * - * @see CommandDriven - */ - public void setCommand(String command) - { - this.command = command; - } - - /** - * Detect whether a particular command has been issued - */ - public boolean isCommand(String aName) - { - return (command != null && command.equals(aName)); - } - - // Action implementation ----------------------------------------- - /** - * Execute will first check the request for a result exception. If one - * is found, then it will add its message as an error message and throw - * the ResultException. If there no exception is found, then it will - * invoke the "command" - invokeCommand(). If we are not invoking a command, - * it will call validate() and then doExecute(). - * - * @return view - */ - public String execute() - throws Exception - { - long start = 0; - if (debugLog.isDebugEnabled()) - { - debugLog.debug("Action executing.."); - start = System.currentTimeMillis(); - } - - try - { - // if we're in a web context - check to see if there already is a result exception - // in the request. If so, add its message as an error message and throw it. - Object request = ActionContext.getContext().get(ServletActionContext.REQUEST); - if (request != null) - { - ResultException re = (ResultException) ((ServletRequest)request).getAttribute("webwork.action.ResultException"); - if (re != null) - { - // Any error message in the exception is added in the catch later - // Remove it since it has been handled - ((ServletRequest)request).removeAttribute("webwork.action.ResultException"); - throw re; - } - } - - // Check whether command is being invoked - if (command != null && command.length() > 0 && this instanceof CommandDriven) - { - return invokeCommand(); - } else - { - // Validate input data - validate(); - - // Do main processing - return doExecute(); - } - } catch (ResultException e) - { - // Add the error message from the exception, it there is one - String msg = e.getMessage(); - if (msg != null) - addErrorMessage(msg); - return e.getResult(); - } finally - { - if (debugLog.isDebugEnabled()) - { - debugLog.debug("Action execution done"); - debugLog.debug("Action executed in " + (System.currentTimeMillis() - start) + " ms"); - } - } - } - - // Public --------------------------------------------------------- - /** - * "default" command - */ - public String doDefault() - throws Exception - { - return INPUT; - } - - /** - * Get the list of error messages for this action - * - * @return list of error messages - */ - public Collection getErrorMessages() - { - if (errorMessages == null) - errorMessages = new ArrayList(); - - return errorMessages; - } - - public void setErrorMessages(Collection errorMessages) - { - this.errorMessages = errorMessages; - } - - /** - * Check whether there are any error messages - * - * @return true if any error messages have been registered - */ - public boolean getHasErrorMessages() - { - return (errorMessages == null) ? false : errorMessages.size() > 0; - } - - /** - * Add an error message to this action - * - * @param anErrorMessage - */ - public void addErrorMessage(String anErrorMessage) - { - if (errorMessages == null) - errorMessages = new ArrayList(); - errorMessages.add(anErrorMessage); - } - - /** - * This method is used to attach an error message to a particular form field. - * - * @param fieldName name of field - * @param errorMessage the error message - */ - public void addError(String fieldName, String errorMessage) - { - if (errorMap == null) - errorMap = new HashMap(); - errorMap.put(fieldName, errorMessage); - } - - - /** - * Get the field specific errors associated with this action. - * - * @return map with errors - */ - public Map getErrors() - { - if (errorMap == null) - errorMap = new HashMap(); - - return errorMap; - } - - public void setErrors(Map errorMap) - { - this.errorMap = errorMap; - } - - /** - * Check whether there are any errors associated with this action. - * - * @return whether there are any errors - */ - public boolean getHasErrors() - { - return (errorMap == null) ? false : errorMap.size() > 0; - } - - /** - * Get the locale for this action. - * - * Applications may customize how locale is chosen by - * subclassing ActionSupport and override this method. - * - * @return the locale to use - */ - public Locale getLocale() - { - return ActionContext.getLocale(); - } - - /** - * Get the named bundle. - * - * You can override the getLocale() method to change the behaviour of how - * to choose locale for the bundles that are returned. Typically you would - * use the LocaleAware interface to get the users configured locale, or use - * your own method to allow the user to select the locale and store it in - * the session (by using the SessionAware interface). - * - * @param aBundleName bundle name - * @return a resource bundle - */ - public ResourceBundle getTexts(String aBundleName) - { - return ResourceBundle.getBundle(aBundleName, getLocale(), Thread.currentThread().getContextClassLoader()); - } - - /** - * Get the resource bundle associated with this action. - * This will be based on the actual subclass that is used. - * - * @return resouce bundle - */ - public ResourceBundle getTexts() - { - return getTexts(getClass().getName()); - } - - - /** - * Get a text from the resource bundles associated with this action. - * The resource bundles are searched, starting with the one associated - * with this particular action, and testing all its superclasses' bundles. - * It will stop once a bundle is found that contains the given text. This gives - * a cascading style that allow global texts to be defined for an application base - * class. - * - * @param aTextName name of text to be found - * @return value of named text - */ - public String getText(String aTextName) - { - Class thisClass = getClass(); - MissingResourceException e; - do - { - try - { - ResourceBundle bundle = getTexts(thisClass.getName()); - return bundle.getString(aTextName); - } catch (MissingResourceException ex) - { - e = ex; - thisClass = thisClass.getSuperclass(); - } - } while (!thisClass.equals(Object.class)); - - throw e; - } - - // Protected ----------------------------------------------------- - protected String doExecute() - throws Exception - { - // Override this method in subclasses - return SUCCESS; - } - - /** - * Subclasses may override this method to provide validation - * of input data. The execute() method should call validate() - * in the beginning of its code (which will delegate to this method), - * so as to check input data - * before doing the actual processing. - * <p> - * If any application errors arise these should be registered - * by calling addErrorMessage or addError . - * <p> - * If the validation is dependent on whether a command has been issued, - * and what that command is, then the isCommand() method should be used. - * - */ - protected void doValidation() - { - } - - /** - * Do validation. This method is called implicitly before executing doExecute(), but must be - * called explicitly from within command implementation methods. The actual validation should be done by overriding - * the doValidation() method. If any errors have been registered by doValidation() - * this method will throw ResultException() which should simply be passed through. - */ - protected void validate() - throws ResultException - { - // Do validation of input - doValidation(); - - // Check if any errors was detected - if (invalidInput()) - { - throw new ResultException(Action.INPUT); - } - } - - /** - * Check whether there are any error messages. Just a nicer way - * of doing "getHasErrorMessages() || getHasErrors()". - * - * @return true if any error messages have been registered - */ - public boolean invalidInput() - { - return getHasErrorMessages() || getHasErrors(); - } - - /** - * Invokes an alternate execution path for the action. The name of the action - * is derived by prepending a "do" and capitalizing the first letter of the - * action. - * - */ - protected String invokeCommand() throws Exception - { - StringBuffer sb = new StringBuffer("do"); - sb.append(command); - sb.setCharAt(2, Character.toUpperCase(sb.charAt(2))); - String cmd = sb.toString(); - debugLog.debug("Executing action with command=" + command + " (mapped to method: " + cmd + ")"); - Method method; - - try - { - method = getClass().getMethod(cmd, new Class[0]); - } catch (NoSuchMethodException e) - { - throw new IllegalArgumentException("No command '" + command + "' in action"); - } - try - { - return (String) method.invoke(this, new Object[0]); - } catch (InvocationTargetException e) - { - /** - * We try to return the source exception. - */ - Throwable t = e.getTargetException(); - if (t instanceof Exception) - throw (Exception) t; - throw e; - } - } - - private void readObject(java.io.ObjectInputStream stream) - throws IOException, ClassNotFoundException - { - stream.defaultReadObject(); - - // Restore log - log = LogFactory.getLog(this.getClass()); - } - - - /** - * This is used to get the current action's class name - */ - protected String getActionName() - { - if (actionName == null) - { - String classname = getClass().getName(); - actionName = classname.substring(classname.lastIndexOf('.') + 1); - } - return actionName; - } -} +/* + * WebWork, Web Application Framework + * + * Distributable under Apache license. + * See terms of license at opensource.org + */ +package webwork.action; + +import org.apache.commons.logging.*; + +import java.io.Serializable; +import java.io.IOException; +import java.lang.reflect.Method; +import java.lang.reflect.InvocationTargetException; +import java.util.*; +import java.text.MessageFormat; +import javax.servlet.ServletRequest; + +import webwork.util.editor.PropertyEditorException; + +/** + * This is a useful base class for WebWork Action implementations. It gives you access to + * a set of useful functionality, including result view mapping, error handling, and i18n. + * <p> + * It is also possible to use this class by way of delegation instead of subclassing. + * This is useful in the case that your action cannot use subclassing to add functionality + * + * @see Action + * @author Rickard Oberg ([email protected]) + * @author Victor Salaman ([email protected]) + * @version $Revision$ + */ +public class ActionSupport + implements Action, Serializable, IllegalArgumentAware +{ + // Attributes ---------------------------------------------------- + static private Log debugLog = LogFactory.getLog(ActionSupport.class); + + protected transient Log log = LogFactory.getLog(this.getClass()); + + protected Map errorMap; + protected Collection errorMessages; + protected String command; + + private String actionName = null; + + + // IllegalArgumentAware implementation ----------------------------- + /* + * This method is called when a field cannot be set because of an invalid or empty value. + * If the exception is a PropertyEditorException then the exception message is a + * bundle key that will be looked up by calling the getPropertyEditorMessage method. + * + * @see IllegalArgumentAware + * @see webwork.util.editor.PropertyEditorException + */ + public void addIllegalArgumentException(String fieldName, IllegalArgumentException e) + { + String msg = e.getMessage(); + if (e instanceof PropertyEditorException) + { + msg = getPropertyEditorMessage(fieldName, (PropertyEditorException) e); + } + addError(fieldName, msg); + } + + /** + * This method is called from addIllegalArgumentException and it should return an + * error message (that may be localized). + * The implementation here does this by calling the getText method but you may + * override it with your own implementation. + * The default messages are stored in the ActionSupport.properties file + */ + protected String getPropertyEditorMessage(String fieldName, PropertyEditorException pe) + { + String bundleText = getText(pe.getBundleKey()); + Object[] propertyValues = pe.getPropertyValues(); + if (propertyValues == null) + return bundleText; + else + return MessageFormat.format(bundleText, propertyValues); + } + + // CommandDriven implementation ---------------------------------- + /** + * Support implementation of CommandDriven interface. Let your action + * subclasses implement CommandDriven if they support this notion. + * + * @see CommandDriven + */ + public void setCommand(String command) + { + this.command = command; + } + + /** + * Detect whether a particular command has been issued + */ + public boolean isCommand(String aName) + { + return (command != null && command.equals(aName)); + } + + // Action implementation ----------------------------------------- + /** + * Execute will first check the request for a result exception. If one + * is found, then it will add its message as an error message and throw + * the ResultException. If there no exception is found, then it will + * invoke the "command" - invokeCommand(). If we are not invoking a command, + * it will call validate() and then doExecute(). + * + * @return view + */ + public String execute() + throws Exception + { + long start = 0; + if (debugLog.isDebugEnabled()) + { + debugLog.debug("Action executing.."); + start = System.currentTimeMillis(); + } + + try + { + // if we're in a web context - check to see if there already is a result exception + // in the request. If so, add its message as an error message and throw it. + Object request = ActionContext.getContext().get(ServletActionContext.REQUEST); + if (request != null) + { + ResultException re = (ResultException) ((ServletRequest)request).getAttribute("webwork.action.ResultException"); + if (re != null) + { + // Any error message in the exception is added in the catch later + // Remove it since it has been handled + ((ServletRequest)request).removeAttribute("webwork.action.ResultException"); + throw re; + } + } + + // Check whether command is being invoked + if (command != null && command.length() > 0 && this instanceof CommandDriven) + { + return invokeCommand(); + } else + { + // Validate input data + validate(); + + // Do main processing + return doExecute(); + } + } catch (ResultException e) + { + // Add the error message from the exception, it there is one + String msg = e.getMessage(); + if (msg != null) + addErrorMessage(msg); + return e.getResult(); + } finally + { + if (debugLog.isDebugEnabled()) + { + debugLog.debug("Action execution done"); + debugLog.debug("Action executed in " + (System.currentTimeMillis() - start) + " ms"); + } + } + } + + // Public --------------------------------------------------------- + /** + * "default" command + */ + public String doDefault() + throws Exception + { + return INPUT; + } + + /** + * Get the list of error messages for this action + * + * @return list of error messages + */ + public Collection getErrorMessages() + { + if (errorMessages == null) + errorMessages = new ArrayList(); + + return errorMessages; + } + + public void setErrorMessages(Collection errorMessages) + { + this.errorMessages = errorMessages; + } + + /** + * Check whether there are any error messages + * + * @return true if any error messages have been registered + */ + public boolean getHasErrorMessages() + { + return (errorMessages == null) ? false : errorMessages.size() > 0; + } + + /** + * Add an error message to this action + * + * @param anErrorMessage + */ + public void addErrorMessage(String anErrorMessage) + { + if (errorMessages == null) + errorMessages = new ArrayList(); + errorMessages.add(anErrorMessage); + } + + /** + * This method is used to attach an error message to a particular form field. + * + * @param fieldName name of field + * @param errorMessage the error message + */ + public void addError(String fieldName, String errorMessage) + { + if (errorMap == null) + errorMap = new HashMap(); + errorMap.put(fieldName, errorMessage); + } + + + /** + * Get the field specific errors associated with this action. + * + * @return map with errors + */ + public Map getErrors() + { + if (errorMap == null) + errorMap = new HashMap(); + + return errorMap; + } + + public void setErrors(Map errorMap) + { + this.errorMap = errorMap; + } + + /** + * Check whether there are any errors associated with this action. + * + * @return whether there are any errors + */ + public boolean getHasErrors() + { + return (errorMap == null) ? false : errorMap.size() > 0; + } + + /** + * Get the locale for this action. + * + * Applications may customize how locale is chosen by + * subclassing ActionSupport and override this method. + * + * @return the locale to use + */ + public Locale getLocale() + { + return ActionContext.getLocale(); + } + + /** + * Get the named bundle. + * + * You can override the getLocale() method to change the behaviour of how + * to choose locale for the bundles that are returned. Typically you would + * use the LocaleAware interface to get the users configured locale, or use + * your own method to allow the user to select the locale and store it in + * the session (by using the SessionAware interface). + * + * @param aBundleName bundle name + * @return a resource bundle + */ + public ResourceBundle getTexts(String aBundleName) + { + return ResourceBundle.getBundle(aBundleName, getLocale(), Thread.currentThread().getContextClassLoader()); + } + + /** + * Get the resource bundle associated with this action. + * This will be based on the actual subclass that is used. + * + * @return resouce bundle + */ + public ResourceBundle getTexts() + { + return getTexts(getClass().getName()); + } + + + /** + * Get a text from the resource bundles associated with this action. + * The resource bundles are searched, starting with the one associated + * with this particular action, and testing all its superclasses' bundles. + * It will stop once a bundle is found that contains the given text. This gives + * a cascading style that allow global texts to be defined for an application base + * class. + * + * @param aTextName name of text to be found + * @return value of named text + */ + public String getText(String aTextName) + { + Class thisClass = getClass(); + MissingResourceException e; + do + { + try + { + ResourceBundle bundle = getTexts(thisClass.getName()); + return bundle.getString(aTextName); + } catch (MissingResourceException ex) + { + e = ex; + thisClass = thisClass.getSuperclass(); + } + } while (!thisClass.equals(Object.class)); + + throw e; + } + + // Protected ----------------------------------------------------- + protected String doExecute() + throws Exception + { + // Override this method in subclasses + return SUCCESS; + } + + /** + * Subclasses may override this method to provide validation + * of input data. The execute() method should call validate() + * in the beginning of its code (which will delegate to this method), + * so as to check input data + * before doing the actual processing. + * <p> + * If any application errors arise these should be registered + * by calling addErrorMessage or addError . + * <p> + * If the validation is dependent on whether a command has been issued, + * and what that command is, then the isCommand() method should be used. + * + */ + protected void doValidation() + { + } + + /** + * Do validation. This method is called implicitly before executing doExecute(), but must be + * called explicitly from within command implementation methods. The actual validation should be done by overriding + * the doValidation() method. If any errors have been registered by doValidation() + * this method will throw ResultException() which should simply be passed through. + */ + protected void validate() + throws ResultException + { + // Do validation of input + doValidation(); + + // Check if any errors was detected + if (invalidInput()) + { + throw new ResultException(Action.INPUT); + } + } + + /** + * Check whether there are any error messages. Just a nicer way + * of doing "getHasErrorMessages() || getHasErrors()". + * + * @return true if any error messages have been registered + */ + public boolean invalidInput() + { + return getHasErrorMessages() || getHasErrors(); + } + + /** + * Invokes an alternate execution path for the action. The name of the action + * is derived by prepending a "do" and capitalizing the first letter of the + * action. + * + */ + protected String invokeCommand() throws Exception + { + StringBuffer sb = new StringBuffer("do"); + sb.append(command); + sb.setCharAt(2, Character.toUpperCase(sb.charAt(2))); + String cmd = sb.toString(); + debugLog.debug("Executing action with command=" + command + " (mapped to method: " + cmd + ")"); + Method method; + + try + { + method = getClass().getMethod(cmd, new Class[0]); + } catch (NoSuchMethodException e) + { + throw new IllegalArgumentException("No command '" + command + "' in action"); + } + try + { + return (String) method.invoke(this, new Object[0]); + } catch (InvocationTargetException e) + { + /** + * We try to return the source exception. + */ + Throwable t = e.getTargetException(); + if (t instanceof Exception) + throw (Exception) t; + throw e; + } + } + + private void readObject(java.io.ObjectInputStream stream) + throws IOException, ClassNotFoundException + { + stream.defaultReadObject(); + + // Restore log + log = LogFactory.getLog(this.getClass()); + } + + + /** + * This is used to get the current action's class name + */ + protected String getActionName() + { + if (actionName == null) + { + String classname = getClass().getName(); + actionName = classname.substring(classname.lastIndexOf('.') + 1); + } + return actionName; + } +} ------------------------------------------------------- This SF.net email is sponsored by: SF.net Giveback Program. Does SourceForge.net help you be more productive? Does it help you create better code? SHARE THE LOVE, and help us help YOU! Click Here: http://sourceforge.net/donate/