/*
* $Id: AbstractValidateActionForm.java 481833 2006-12-03 17:32:52Z niallp $
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.struts.chain.commands;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.InvalidCancelException;
import org.apache.struts.chain.contexts.ActionContext;
import org.apache.struts.config.ActionConfig;
/**
* <p>Validate the properties of the form bean for this request. If there are
* any validation errors, execute the specified command; otherwise, proceed
* normally.</p>
*
* @version $Rev: 481833 $ $Date: 2005-06-04 10:58:46 -0400 (Sat, 04 Jun 2005)
* $
*/
public abstract class AbstractValidateActionForm extends ActionCommandBase {
// ------------------------------------------------------ Instance Variables
/**
* <p> Provide Commons Logging instance for this class. </p>
*/
private static final Log LOG =
LogFactory.getLog(AbstractSelectForward.class);
// ------------------------------------------------------ Protected Methods
/**
* <p>Helper method to verify the Cancel state.</p>
*
* <p>If the state is invalid, Cancel is unset and an
* InvalidCancelException is thrown.</p>
*
* @param actionCtx Our ActionContext
* @param actionConfig Our ActionConfig
* @return true if cancel is set, false otherwise.
* @throws InvalidCancelException
*/
private boolean isCancelled(ActionContext actionCtx,
ActionConfig actionConfig)
throws InvalidCancelException {
Boolean cancel = actionCtx.getCancelled();
boolean cancelled = ((cancel != null) && cancel.booleanValue());
boolean cancellable = actionConfig.getCancellable();
boolean invalidState = (cancelled && !cancellable);
if (invalidState) {
actionCtx.setCancelled(Boolean.FALSE);
actionCtx.setFormValid(Boolean.FALSE);
throw new InvalidCancelException();
}
return cancelled;
}
// ---------------------------------------------------------- Public Methods
/**
* <p>Validate the properties of the form bean for this request. If there
* are any validation errors, execute the child commands in our chain;
* otherwise, proceed normally.</p>
*
* @param actionCtx The <code>Context</code> for the current request
* @return <code>false</code> so that processing continues, if there are
* no validation errors; otherwise <code>true</code>
* @throws Exception if thrown by the Action class
*/
public boolean execute(ActionContext actionCtx)
throws Exception {
// Set form valid until found otherwise
actionCtx.setFormValid(Boolean.TRUE);
// Is there a form bean for this request?
ActionForm actionForm = actionCtx.getActionForm();
if (actionForm == null) {
return false;
}
// Is validation disabled on this request?
ActionConfig actionConfig = actionCtx.getActionConfig();
if (!actionConfig.getValidate()) {
return false;
}
// Was this request cancelled?
if (isCancelled(actionCtx, actionConfig)) {
if (LOG.isDebugEnabled()) {
LOG.debug(" Cancelled transaction, skipping validation");
}
return false;
}
// Call the validate() method of this form bean
ActionErrors errors = validate(actionCtx, actionConfig, actionForm);
// If there were no errors, proceed normally
if ((errors == null) || (errors.isEmpty())) {
return false;
}
// Flag the validation failure and proceed
/* NOTE: Is there any concern that there might have already
* been errors, or that other errors might be coming?
*/
actionCtx.saveErrors(errors);
actionCtx.setFormValid(Boolean.FALSE);
return false;
}
// ------------------------------------------------------- Protected Methods
/**
* <p>Call the <code>validate()</code> method of the specified form bean,
* and return the resulting <code>ActionErrors</code> object.</p>
*
* @param context The context for this request
* @param actionConfig The <code>ActionConfig</code> for this request
* @param actionForm The form bean for this request
* @return ActionErrors object, if any
*/
protected abstract ActionErrors validate(ActionContext context,
ActionConfig actionConfig, ActionForm actionForm);
}