// only lists new and modified members

import org.apache.struts.action.event.*;

public abstract class ActionForm implements Serializable {
  List formListeners= null;

  public ActionErrors validate(ActionMapping mapping,
                                 HttpServletRequest request)
  {
    fireActionFormValidated();
    return null;
  }

  public void reset(ActionMapping mapping, HttpServletRequest request) {
    fireActionFormWasReset();
    return;
  }

  public synchronized void addActionFormListener(ActionFormListener l) {
    if (formListeners == null) {
      formListeners= new ArrayList();
    }
    formListeners.add(l);
  }

  public synchronized void removeActionFormListener(ActionFormListener l) {
    if (formListeners != null) {
      formListeners.remove(l);
    }
  }

  private void fireActionFormWasReset() {
    if(formListeners == null || formListeners.size() == 0) {
      return;
    }

    List formListenersClone;
    synchronized (this) {
      formListenersClone= (List) formListeners.clone();
    }

    ActionFormEvent evt= new ActionFormEvent(this);

    for (int i = 0; i < size; ++i) {
      ActionFormListener lsnr= (ActionFormListener) formListenersClone.get(i);
      lsnr.actionFormWasReset(evt);
    }
  }

  private void fireActionFormValidated() {
    if(formListeners == null || formListeners.size() == 0) {
      return;
    }

    List formListenersClone;
    synchronized (this) {
      formListenersClone= (List) formListeners.clone();
    }

    ActionFormEvent evt= new ActionFormEvent(this);

    for (int i = 0; i < size; ++i) {
      ActionFormListener lsnr= (ActionFormListener) formListenersClone.get(i);
      lsnr.actionFormValidated(evt);
    }
  }
}
