I have written simple search app using Tapestry 5.0.15. User query from text
field is passed between requests via onPassivate and onActivate methods.
Here is a page class source excerpt:

public class Index
{
  private String _userQuery;
  private String _correctedQuery;

  @ApplicationState
  private NscopeDataSource _dataSource;
  ...

  private String getByteString(String str)
  {
    if(str == null || str.isEmpty())
      return "";

    String result = "";
    try
    {
      byte[] bytes = str.getBytes("utf-8");
      for(Byte b: bytes)
        result += Integer.toHexString(Math.abs(b.intValue())) + ", ";
    }
    catch (UnsupportedEncodingException ex) { }
    return result;
  }

  void onActivate(String aUserQuery)
  {
      this._userQuery = aUserQuery;
      if(_userQuery != null)
        System.out.println("--- MEMBER USER QUERY ACTIVATE: " +
getByteString(_userQuery));
  }

  Object onPassivate()
  {
    if(_userQuery != null)
      System.out.println("--- USER QUERY PASIVATE: " +
getByteString(_userQuery));
    return (Object)_userQuery;
  }

  public String getUserQuery()
  {
    return _userQuery;
  }

  public void setUserQuery(String aUserQuery)
  {
    this._userQuery = aUserQuery;
  }
  ...

The problem is that _userQuery with diacritic characters are messed up. It
looks like _userQuery is utf-encoded meny times. For query "miłość" (love in
polish) this code produces following output in server log:

[DEBUG] pages.Index Invoking:
org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67)
--- USER QUERY PASIVATE: 6d, 69, 3b, 7e, 6f, 3b, 65, 3c, 79,
[INFO] AppModule.TimingFilter Request time: 9 ms
[DEBUG] pages.Index Dispatch event: ComponentEvent[activate from (self)]
[DEBUG] pages.Index Invoking:
org.foo.searchapp.webclient.pages.Index.onActivate(java.lang.String) (at
Index.java:60)
--- MEMBER USER QUERY ACTIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65,
3d, 7c, 3e, 79,
[DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)]
[DEBUG] pages.Index Invoking:
org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67)
--- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c,
3e, 79,
[DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)]
[DEBUG] pages.Index Invoking:
org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67)
--- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c,
3e, 79,
[DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)]
[DEBUG] pages.Index Invoking:
org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67)
--- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c,
3e, 79,
[DEBUG] pages.Index Dispatch event: ComponentEvent[prepareForRender from
searchForm]
[DEBUG] pages.Index Dispatch event: ComponentEvent[prepare from searchForm]
[DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)]
[DEBUG] pages.Index Invoking:
org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67)
--- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c,
3e, 79,
[DEBUG] pages.Index Dispatch event: ComponentEvent[toClient from userQuery]
[DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)]
[DEBUG] pages.Index Invoking:
org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67)
--- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c,
3e, 79,
[DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)]
[DEBUG] pages.Index Invoking:
org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67)
--- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c,
3e, 79,
[DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)]
[DEBUG] pages.Index Invoking:
org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67)
--- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c,
3e, 79,
[DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)]
[DEBUG] pages.Index Invoking:
org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67)
--- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c,
3e, 79,
[DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)]
[DEBUG] pages.Index Invoking:
org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67)
--- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c,
3e, 79,
[DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)]
[DEBUG] pages.Index Invoking:
org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67)
--- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c,
3e, 79,
[DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)]
[DEBUG] pages.Index Invoking:
org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67)
--- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c,
3e, 79,
[DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)]
[DEBUG] pages.Index Invoking:
org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67)
--- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c,
3e, 79,
[DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)]
[DEBUG] pages.Index Invoking:
org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67)
--- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c,
3e, 79,
[DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)]
[DEBUG] pages.Index Invoking:
org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67)
--- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c,
3e, 79,
[DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)]
[DEBUG] pages.Index Invoking:
org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67)
--- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c,
3e, 79,
[DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)]
[DEBUG] pages.Index Invoking:
org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67)
--- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c,
3e, 79,
[DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)]
[DEBUG] pages.Index Invoking:
org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67)
--- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c,
3e, 79,
[DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)]
[DEBUG] pages.Index Invoking:
org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67)
--- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c,
3e, 79,
[DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)]
[DEBUG] pages.Index Invoking:
org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67)
--- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c,
3e, 79,
[DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)]
[DEBUG] pages.Index Invoking:
org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67)
--- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c,
3e, 79,
[DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)]
[DEBUG] pages.Index Invoking:
org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67)
--- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c,
3e, 79,
[DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)]
[DEBUG] pages.Index Invoking:
org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67)
--- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c,
3e, 79,
[DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)]
[DEBUG] pages.Index Invoking:
org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67)
--- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c,
3e, 79,
[DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)]
[DEBUG] pages.Index Invoking:
org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67)
--- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c,
3e, 79,
[DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)]
[DEBUG] pages.Index Invoking:
org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67)
--- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c,
3e, 79,
[DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)]
[DEBUG] pages.Index Invoking:
org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67)
--- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c,
3e, 79,
[DEBUG] pages.Index Dispatch event: ComponentEvent[passivate from (self)]
[DEBUG] pages.Index Invoking:
org.foo.searchapp.webclient.pages.Index.onPassivate() (at Index.java:67)
--- USER QUERY PASIVATE: 6d, 69, 3d, 7b, 3e, 7e, 6f, 3d, 7b, 3e, 65, 3d, 7c,
3e, 79,
[DEBUG] pages.Index Executed 2,816 rendering commands (max queue depth: 99)
in 0.914 seconds
[INFO] AppModule.TimingFilter Request time: 922 ms
[INFO] AppModule.TimingFilter Request time: 0 ms
[INFO] AppModule.TimingFilter Request time: 8 ms
[INFO] AppModule.TimingFilter Request time: 0 ms
[INFO] AppModule.TimingFilter Request time: 1 ms
[INFO] AppModule.TimingFilter Request time: 3 ms
[INFO] AppModule.TimingFilter Request time: 0 ms

When onPassivate method is called for the first time all characters are ok,
but in the subsequent onActivate it's not.

I don't know Tapestry very well yet, so my another question is why
onPassivate is called so many times?

BTW: if _userQuery is passed via persistent member (@Persist) everything is
ok. But it will not work for me.

This problem occured when I deployed app on linux server. On Windows
everything works fine.
Application source and output encoding is set to UTF-8.

thanks in advance for any help.
Shymon

-- 
View this message in context: 
http://www.nabble.com/String-encoding-in-activation-context-tp20075742p20075742.html
Sent from the Tapestry - User mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to