Tapestry 5
  1. Tapestry 5
  2. TAP5-1621

TypeCoercer currently uses Object -> String and String -> Boolean, there should be a direct coercion from Object -> Boolean for <t:if/> performance.

    Details

    • Type: Improvement Improvement
    • Status: Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: 5.3
    • Fix Version/s: 5.3
    • Component/s: tapestry-core
    • Labels:
      None

      Description

      An issue was raised in this thread:
      http://tapestry.1045711.n5.nabble.com/Null-check-property-expression-syntax-td4726386.html

      Describing the problem where:

      <t:if test="MyObject">

      causes MyObject to be coerced to a String before being coerced to a Boolean. For some objects this may be an expensive operation, and the common case (how often is the Entity you are editing on a page actually null?)

      Adding an explicit Object -> Boolean coercion will remove the need for the Object -> String coercion.

      A Number -> Boolean coercion is also required to prevent Integer -> Boolean from choosing the Object -> Boolean as a match (currently it goes Integer -> Long -> Boolean)

      At this point the only known issue is that any POJO that depends on the fact that returning "false" from toString will cause the Object -> String -> Boolean to return false will be broken. This seems like an unlikely case and can be worked around by providing a specific TypeCoercion for that object.

        Activity

        Hide
        Josh Canfield added a comment -

        A workaround is to add the following coercions to your AppModule.

        public static void contributeTypeCoercer(Configuration<CoercionTuple> configuration) {
        /**

        • Prevent toString() conversion to get to boolean
          */
          configuration.add(CoercionTuple.create(Object.class, Boolean.class,
          new Coercion<Object, Boolean>()
          Unknown macro: { public Boolean coerce(Object input) { return input != null; } }

          ));
          /**

        • Number -> Boolean - make sure that Object -> Boolean isn't used!
          */
          configuration.add(CoercionTuple.create(Number.class, Boolean.class,
          new Coercion<Number, Boolean>()
          Unknown macro: { public Boolean coerce(Number input) { return input.byteValue() != 0; } }

          ));
          }

        Show
        Josh Canfield added a comment - A workaround is to add the following coercions to your AppModule. public static void contributeTypeCoercer(Configuration<CoercionTuple> configuration) { /** Prevent toString() conversion to get to boolean */ configuration.add(CoercionTuple.create(Object.class, Boolean.class, new Coercion<Object, Boolean>() Unknown macro: { public Boolean coerce(Object input) { return input != null; } } )); /** Number -> Boolean - make sure that Object -> Boolean isn't used! */ configuration.add(CoercionTuple.create(Number.class, Boolean.class, new Coercion<Number, Boolean>() Unknown macro: { public Boolean coerce(Number input) { return input.byteValue() != 0; } } )); }
        Hide
        Josh Canfield added a comment -

        Need to update the diagram to represent the change. http://tapestry.apache.org/typecoercer-service.html

        Show
        Josh Canfield added a comment - Need to update the diagram to represent the change. http://tapestry.apache.org/typecoercer-service.html
        Hide
        Hudson added a comment -

        Integrated in tapestry-trunk-freestyle #513 (See https://builds.apache.org/job/tapestry-trunk-freestyle/513/)
        TAP5-1621 - TypeCoercer change: replaced Long -> Boolean with Number -> Boolean. Added Object -> Boolean

        joshcanfield : http://svn.apache.org/viewcvs.cgi/?root=Apache-SVN&view=rev&rev=1167289
        Files :

        • /tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/TapestryIOCModule.java
        • /tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/TypeCoercerImplTest.java
        Show
        Hudson added a comment - Integrated in tapestry-trunk-freestyle #513 (See https://builds.apache.org/job/tapestry-trunk-freestyle/513/ ) TAP5-1621 - TypeCoercer change: replaced Long -> Boolean with Number -> Boolean. Added Object -> Boolean joshcanfield : http://svn.apache.org/viewcvs.cgi/?root=Apache-SVN&view=rev&rev=1167289 Files : /tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/TapestryIOCModule.java /tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/TypeCoercerImplTest.java
        Hide
        Hudson added a comment -

        Integrated in tapestry-trunk-freestyle #514 (See https://builds.apache.org/job/tapestry-trunk-freestyle/514/)
        TAP5-1621 - Fixed Object[] -> Boolean

        joshcanfield : http://svn.apache.org/viewcvs.cgi/?root=Apache-SVN&view=rev&rev=1167386
        Files :

        • /tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/TapestryIOCModule.java
        Show
        Hudson added a comment - Integrated in tapestry-trunk-freestyle #514 (See https://builds.apache.org/job/tapestry-trunk-freestyle/514/ ) TAP5-1621 - Fixed Object[] -> Boolean joshcanfield : http://svn.apache.org/viewcvs.cgi/?root=Apache-SVN&view=rev&rev=1167386 Files : /tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/TapestryIOCModule.java
        Hide
        Hudson added a comment -

        Integrated in tapestry-trunk-freestyle #515 (See https://builds.apache.org/job/tapestry-trunk-freestyle/515/)
        TAP5-1621 - Fixed test

        joshcanfield : http://svn.apache.org/viewcvs.cgi/?root=Apache-SVN&view=rev&rev=1167447
        Files :

        • /tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/TypeCoercerImplTest.java
        Show
        Hudson added a comment - Integrated in tapestry-trunk-freestyle #515 (See https://builds.apache.org/job/tapestry-trunk-freestyle/515/ ) TAP5-1621 - Fixed test joshcanfield : http://svn.apache.org/viewcvs.cgi/?root=Apache-SVN&view=rev&rev=1167447 Files : /tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/TypeCoercerImplTest.java

          People

          • Assignee:
            Josh Canfield
            Reporter:
            Josh Canfield
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development