Hi

Checking some tomahawk stuff I have noted that when I'm using trinidad (any
version 1.1 and 1.2) at the end of the form the hidden field that stores or
references the state:

<input type="hidden" name="javax.faces.ViewState"

never render its id="javax.faces.ViewState" as myfaces and jsf ri does.

the api javadoc of ResponseStateManager.isPostback says this:

*The implementation if this method for the Standard HTML RenderKit must
consult the 
ExternalContext<http://java.sun.com/javaee/javaserverfaces/1.2/docs/api/javax/faces/context/ExternalContext.html>'s
requestParameterMap and return true if and only if there is a key equal to
the value of the symbolic constant
VIEW_STATE_PARAM<http://java.sun.com/javaee/javaserverfaces/1.2/docs/api/javax/faces/render/ResponseStateManager.html#VIEW_STATE_PARAM>
.*

*For backwards compatability with implementations of
ResponseStateManagerprior to JSF 1.2, a default implementation is
provided that consults the
ExternalContext<http://java.sun.com/javaee/javaserverfaces/1.2/docs/api/javax/faces/context/ExternalContext.html>'s
requestParameterMap and return true if its size is greater than 0.*

 Trinidad implements its own ResponseStateManager like this:

public class CoreResponseStateManager extends ResponseStateManager
{

       /* ......code ....*/
  /**
   * Write the state into the page.
   * @todo Stream the resulting state into the page's content
   *       instead of buffering it.
   * @todo Don't directly write out hidden input field;  use an abstraction
   */
  @Override
  public void writeState(
    FacesContext context,
    StateManager.SerializedView serializedView) throws IOException
  {
    ResponseWriter rw = context.getResponseWriter();
    rw.startElement("input", null);
    rw.writeAttribute("type", "hidden", null);
    rw.writeAttribute("name", VIEW_STATE_PARAM, null);
    // Don't write out the ID, as it can be written
    // out twice
    rw.writeAttribute("id", VIEW_STATE_PARAM, null);

    String s = encodeSerializedViewAsString(serializedView);
    rw.writeAttribute("value", s, null);

    rw.endElement("input");
  }

  @Override
  /**
   * A request is a postback if it contains the state parameter.
   */
  public boolean isPostback(FacesContext context)
  {
    Map requestParams =
context.getExternalContext().getRequestParameterMap();
    return requestParams.containsKey(VIEW_STATE_PARAM);
  }

On trinidad 1.1 the commented code that render its id is missing.

The problem start when some code uses javax.faces.ViewState to find if the
request is a postback (trinidad has its own way to detect a postback using
another input field). If the id is missing, that code thinks that every
request is not a postback.

The commented code says that the id is duplicated, but checking code nothing
suggest that this is happening. I tried state saving client or server and no
problems were found.

I want to know if any developer has a reason to avoid render this id, and if
no objections I'll commit this change in 72 hours (doing this
s:inputSuggestAjax and s:tableSuggestAjax could work with trinidad and/or
facelets and solve TOMAHAWK-1157).

Suggestions are welcome

regards

Leonardo Uribe

Reply via email to