Tapestry 5
  1. Tapestry 5
  2. TAP5-274

Application State Object is a misleading term; rename @ApplicationState to @SessionState

    Details

    • Type: Improvement Improvement
    • Status: Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: None
    • Fix Version/s: 5.1.0.4
    • Component/s: None
    • Labels:
      None

      Description

      This is a record of a discussion that went on in the mailing list on 16-18 Sep 2008. I proposed that the term ApplicationStateObject caused confusion. Some agreed but not all. Regardless, the discussion threw up some interesting food for thought, so I've captured it here for further consideration.

      Here's the e-mail that kicked it off.

      From: geoff.callender.jumpstart@gmail.com
      Subject: T5: ApplicationStateObject is misleading
      Date: 16 September 2008 9:06:12 PM
      To: users@tapestry.apache.org

      We want Tapestry to be as natural as possible for newcomers, so it's important to have terminology that is not misleading. Right now might be the last chance to tidy some of these up before T5.0 goes final.

      One term that I believe many people find misleading is ApplicationState. The problem is that it implies it will make an object available across the whole application, ie. application-scoped; which is not its purpose.

      The doco says that ASOs "are unique to an individual user, not shared between users", which is not quite right, either.

      The standard usage is to tie an object's scope to that of a web session, so maybe we should put "session" in the name? Eg.

      @SessionScoped
      @SessionShared
      @ShareAcrossSession

      It is important to understand that the term "session" here is NOT a reference to the persistence mechanism, but a reference to the scope.

      Alternatively, let's keep it really obvious with this:

      @StateObject

      with the understanding that the default persistence strategy is "session".

      What do others think? Are you happy with ApplicationState?

      Geoff

      The discussion continued on these 2 threads:

        Issue Links

          Activity

          Hide
          Martin Strand added a comment -

          I think Lubor's idea to replace @Persist and @ApplicationStateObject with a single annotation makes everything very easy to understand:
          http://article.gmane.org/gmane.comp.java.tapestry.user/65604

          @Scope("session") // @ApplicationStateObject
          private User user;

          @Scope("page") // @Persist
          private Item item;

          @Scope("your-custom-strategy")
          private ShoppingCart shoppingCart;

          Show
          Martin Strand added a comment - I think Lubor's idea to replace @Persist and @ApplicationStateObject with a single annotation makes everything very easy to understand: http://article.gmane.org/gmane.comp.java.tapestry.user/65604 @Scope("session") // @ApplicationStateObject private User user; @Scope("page") // @Persist private Item item; @Scope("your-custom-strategy") private ShoppingCart shoppingCart;
          Hide
          Lubor Gajda added a comment -

          1. I would suggest using enumeration or constants for definition of scope types instead of plain strings (to avoid misspelling issues and to support IDE auto-completion). For instance:

          @Scope(ScopeType.FLOW)
          @Scope(ScopeType.CONVERSATION)
          @Scope(ScopeType.SESSION)
          @Scope(ScopeType.APPLICATION)

          With static import this could be simplified to this form:

          @Scope(FLOW)
          @Scope(CONVERSATION)
          @Scope(SESSION)
          @Scope(APPLICATION)

          2. @Scope(PAGE) as replacement for current @Persist strategy mentioned in previous Martin's comment is a bit misleading:

          @Persist strategy uses by default HTTP session as storage implementation and users should be explicitly aware of that fact (life-cycle of persisted page properties is tied to life-cycle of HTTP session and to reset them they have to be manually cleaned or the session has to be destroyed). It also conflicts naming strategy of JSP API what could be confusing for new Tapestry users not 100% familiar with its internal terminology.

          To avoid this confusion I would use simple:

          @Scope(SESSION)
          @Scope(FLASH)
          @Scope(CLIENT)

          However, this would mean that page properties annotated with @Scope(SESSION) would be visible from all application pages (so I'm not very sure about this one). But I think that @Scope(PAGE) should be reserved for scope type with life-cycle identical to page scope used in JSP API.

          Show
          Lubor Gajda added a comment - 1. I would suggest using enumeration or constants for definition of scope types instead of plain strings (to avoid misspelling issues and to support IDE auto-completion). For instance: @Scope(ScopeType.FLOW) @Scope(ScopeType.CONVERSATION) @Scope(ScopeType.SESSION) @Scope(ScopeType.APPLICATION) With static import this could be simplified to this form: @Scope(FLOW) @Scope(CONVERSATION) @Scope(SESSION) @Scope(APPLICATION) 2. @Scope(PAGE) as replacement for current @Persist strategy mentioned in previous Martin's comment is a bit misleading: @Persist strategy uses by default HTTP session as storage implementation and users should be explicitly aware of that fact (life-cycle of persisted page properties is tied to life-cycle of HTTP session and to reset them they have to be manually cleaned or the session has to be destroyed). It also conflicts naming strategy of JSP API what could be confusing for new Tapestry users not 100% familiar with its internal terminology. To avoid this confusion I would use simple: @Scope(SESSION) @Scope(FLASH) @Scope(CLIENT) However, this would mean that page properties annotated with @Scope(SESSION) would be visible from all application pages (so I'm not very sure about this one). But I think that @Scope(PAGE) should be reserved for scope type with life-cycle identical to page scope used in JSP API.
          Hide
          Filip S. Adamsen added a comment -

          Using an enum is not an option as additional persistence strategies can be contributed.

          Show
          Filip S. Adamsen added a comment - Using an enum is not an option as additional persistence strategies can be contributed.
          Hide
          Lubor Gajda added a comment -

          Java enumerations can implement interfaces. Maybe we could base scope type definition on ScopeType interface and each contribution would provide its own ScopeType enumeration implementing the interface.

          Show
          Lubor Gajda added a comment - Java enumerations can implement interfaces. Maybe we could base scope type definition on ScopeType interface and each contribution would provide its own ScopeType enumeration implementing the interface.
          Hide
          Andy Blower added a comment -

          I really don't like the idea of combining the annotations like this:

          @Scope("session") // @ApplicationStateObject
          private User user;

          @Scope("page") // @Persist
          private Item item;

          Page to me implies that the scope is purely for the length of time the page is being rendered. (ex struts developer here

          I do however agree with Geoff that the @ApplicationState annotation is badly named and this is the last chance to rename it. I would suggest calling it @SessionState myself.

          Show
          Andy Blower added a comment - I really don't like the idea of combining the annotations like this: @Scope("session") // @ApplicationStateObject private User user; @Scope("page") // @Persist private Item item; Page to me implies that the scope is purely for the length of time the page is being rendered. (ex struts developer here I do however agree with Geoff that the @ApplicationState annotation is badly named and this is the last chance to rename it. I would suggest calling it @SessionState myself.
          Hide
          Hugo Palma added a comment -

          All the services that relate to the old ApplicationState concept weren't renamed accordingly.

          I've created a new issue for that: TAP5-669

          Show
          Hugo Palma added a comment - All the services that relate to the old ApplicationState concept weren't renamed accordingly. I've created a new issue for that: TAP5-669

            People

            • Assignee:
              Howard M. Lewis Ship
              Reporter:
              Geoff Callender
            • Votes:
              17 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved:

                Development