package org.apache.struts.taglib.errors;

import java.util.Iterator;
import java.io.IOException;
import java.util.Locale;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.TagSupport;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionErrorsExt;
import org.apache.struts.util.BeanUtils;
import org.apache.struts.util.MessageResources;

public class ExtErrorsTag extends BaseErrorsTag {

    // --------------------------------------------------- Constructors

    public ExtErrorsTag() {
     super();
    }
 
    // ------------------------------------------------------- Public Methods


    /**
     * Render the specified error messages if there are any.
     *
     * @exception JspException if a JSP exception has occurred
     */
    public int doStartTag() throws JspException {
     ActionErrorsExt actionErrors = (ActionErrorsExt)storedErrors();
     if (actionErrors.empty())
      return (EVAL_BODY_INCLUDE);
     String             property = null;
     Locale             locale = getLocale();
     MessageResources   messages = (MessageResources)
      pageContext.getAttribute(Action.MESSAGES_KEY,
      PageContext.APPLICATION_SCOPE);
     StringBuffer       results = new StringBuffer();
     String errorPropHeader =
      messages.getMessage(locale, ERRORS_PROP_HEADER_KEY );
     String errorPropFooter =
      messages.getMessage(locale, ERRORS_PROP_FOOTER_KEY );
     String errorPropNameHeader =
      messages.getMessage(locale, ERRORS_PROP_NAME_HEADER_KEY );
     String errorPropNameFooter =
      messages.getMessage(locale, ERRORS_PROP_NAME_FOOTER_KEY );
     String errorPropMessagesHeader =
      messages.getMessage(locale, ERRORS_PROP_MESSAGES_HEADER_KEY );
     String errorPropMessagesFooter =
      messages.getMessage(locale, ERRORS_PROP_MESSAGES_FOOTER_KEY );
     String errorPropMessageHeader =
      messages.getMessage(locale, ERRORS_PROP_MESSAGE_HEADER_KEY );
     String errorPropMessageFooter =
      messages.getMessage(locale, ERRORS_PROP_MESSAGE_FOOTER_KEY );
     String message =
      messages.getMessage(locale, ERRORS_HEADER_KEY );
     if (message != null)
      results.append(message);
     Iterator   reports = null;
     Iterator   properties = actionErrors.getProperties();
     while( properties.hasNext() ) {
      if( errorPropHeader!=null ) results.append( errorPropHeader );
      if( errorPropNameHeader!=null ) results.append( errorPropNameHeader );
      property = (String)properties.next();
      message = messages.getMessage( locale, property );
      if( message!=null )
       results.append( message );
      else
       if( getFlexible()!=null )
        results.append( property );
      if( errorPropNameFooter!=null ) results.append( errorPropNameFooter );
      if( errorPropMessagesHeader!=null ) results.append( errorPropMessagesHeader );
      reports = actionErrors.get( property );
      while( reports.hasNext() ) {
       if( errorPropMessageHeader!=null ) results.append( errorPropMessageHeader );
       ActionError report = (ActionError) reports.next();
       message = messages.getMessage(locale,
                 report.getKey(), report.getValues());
       if( message!=null )
        results.append( message );
       else
        if( getFlexible()!=null )
         results.append( report.getKey() );
       if( errorPropMessageFooter!=null ) results.append( errorPropMessageFooter );
      }
      if( errorPropMessagesFooter!=null ) results.append( errorPropMessagesFooter );
      if( errorPropFooter!=null ) results.append( errorPropFooter );
     }
     message = messages.getMessage(locale, ERRORS_FOOTER_KEY );
     if( message!=null )
      results.append( message );
     JspWriter writer = pageContext.getOut();
     try {
      writer.print(results.toString());
     } catch (IOException e) {
        throw new JspException(e.toString());
     }
     return (EVAL_BODY_INCLUDE);
    }


}
