javaserverfaces-spec-public
  1. javaserverfaces-spec-public
  2. JAVASERVERFACES_SPEC_PUBLIC-1257

Prevent FaceletContext.FACELET_CONTEXT_KEY constant to be inlined by compiler

    Details

    • Type: Improvement Improvement
    • Status: Resolved
    • Priority: Critical Critical
    • Resolution: Fixed
    • Affects Version/s: 2.3
    • Fix Version/s: 2.3
    • Component/s: None
    • Labels:
      None

      Issue Links

        Activity

        Hide
        lfryc added a comment -

        I can't see the description of the issue even though I added it.


        Re-posting:

        In RichFaces 5 when we compile ActionListenerHandler against Mojarra 2.2.5 and then run the code against older 2.1 release (2.1.7), we get NullPointerException.

        The issue is well described in RF-13472.

        The problem here is that a value of FACELET_CONTEXT_KEY contstant is inlined by compiler, but the value has changed between Mojarra 2.1 ("com.sun.faces.facelets.FACELET_CONTEXT") and 2.2 ("javax.faces.FACELET_CONTEXT"). This means the code compiled against one 2.2 won't work on 2.1 and vice versa.


        What we can do is prevent compiler from inlining the FACELET_CONTEXT_KEY constant.

        As suggested on stackoverflow, it is possible to use String#intern() or String#toString():

        public static final String FACELET_CONTEXT_KEY = 
                    "javax.faces.FACELET_CONTEXT".intern();
        

        http://stackoverflow.com/questions/377819/are-all-compile-time-constants-inlined
        http://stackoverflow.com/questions/1833581/when-to-use-intern-on-string-literals


        I believe the fix should go to 2.1.x branch as well.

        Show
        lfryc added a comment - I can't see the description of the issue even though I added it. Re-posting: In RichFaces 5 when we compile ActionListenerHandler against Mojarra 2.2.5 and then run the code against older 2.1 release (2.1.7), we get NullPointerException . The issue is well described in RF-13472 . The problem here is that a value of FACELET_CONTEXT_KEY contstant is inlined by compiler, but the value has changed between Mojarra 2.1 ( "com.sun.faces.facelets.FACELET_CONTEXT" ) and 2.2 ( "javax.faces.FACELET_CONTEXT" ) . This means the code compiled against one 2.2 won't work on 2.1 and vice versa. What we can do is prevent compiler from inlining the FACELET_CONTEXT_KEY constant. As suggested on stackoverflow, it is possible to use String#intern() or String#toString() : public static final String FACELET_CONTEXT_KEY = "javax.faces.FACELET_CONTEXT" .intern(); http://stackoverflow.com/questions/377819/are-all-compile-time-constants-inlined http://stackoverflow.com/questions/1833581/when-to-use-intern-on-string-literals I believe the fix should go to 2.1.x branch as well.
        Hide
        Manfred Riem added a comment -

        Lukas, I have attached the change bundle and once review has done I will commit it, then when it passes the 2.2 TCK I'll will close this issue. For the 2.1 work please file a back port task pointing back to this issue. Thanks!

        Show
        Manfred Riem added a comment - Lukas, I have attached the change bundle and once review has done I will commit it, then when it passes the 2.2 TCK I'll will close this issue. For the 2.1 work please file a back port task pointing back to this issue. Thanks!
        Hide
        Manfred Riem added a comment -

        Applied to 2.2 branch,

        svn commit -m "Fixes https://java.net/jira/browse/JAVASERVERFACES-3155, r=edburns, intern the FACELET_CONTEXT_KEY so it does not get inlined."
        Sending jsf-api/src/main/java/javax/faces/view/facelets/FaceletContext.java
        Transmitting file data .
        Committed revision 12799.

        Once the 2.2 TCK passes I will go ahead and close the issue. Thanks!

        Show
        Manfred Riem added a comment - Applied to 2.2 branch, svn commit -m "Fixes https://java.net/jira/browse/JAVASERVERFACES-3155 , r=edburns, intern the FACELET_CONTEXT_KEY so it does not get inlined." Sending jsf-api/src/main/java/javax/faces/view/facelets/FaceletContext.java Transmitting file data . Committed revision 12799. Once the 2.2 TCK passes I will go ahead and close the issue. Thanks!
        Hide
        Manfred Riem added a comment -

        Applied to 2.2 branch,

        svn commit -m "Reverting change as it breaks the TCK"
        Sending jsf-api/src/main/java/javax/faces/view/facelets/FaceletContext.java
        Transmitting file data .
        Committed revision 12804.

        Show
        Manfred Riem added a comment - Applied to 2.2 branch, svn commit -m "Reverting change as it breaks the TCK" Sending jsf-api/src/main/java/javax/faces/view/facelets/FaceletContext.java Transmitting file data . Committed revision 12804.
        Hide
        Manfred Riem added a comment -

        Unfortunately as the proposed change breaks the TCK I have moved it to the spec issue tracker to put it on the table for 2.3.

        Show
        Manfred Riem added a comment - Unfortunately as the proposed change breaks the TCK I have moved it to the spec issue tracker to put it on the table for 2.3.
        Hide
        Ed Burns added a comment -

        Set priority to baseline ahead of JSF 2.3 triage. Priorities will be assigned accurately after this exercise.

        Show
        Ed Burns added a comment - Set priority to baseline ahead of JSF 2.3 triage. Priorities will be assigned accurately after this exercise.
        Hide
        Manfred Riem added a comment -

        Setting priority to Critical

        Show
        Manfred Riem added a comment - Setting priority to Critical

          People

          • Assignee:
            Manfred Riem
            Reporter:
            lfryc
          • Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved: