add mutable information to property key to support partial state saving
-----------------------------------------------------------------------

                 Key: TRINIDAD-2091
                 URL: https://issues.apache.org/jira/browse/TRINIDAD-2091
             Project: MyFaces Trinidad
          Issue Type: Improvement
          Components: Components, Facelets
            Reporter: Gabrielle Crawford
            Assignee: Gabrielle Crawford


Mutable attributes are not state saved when using partial state saving. Let's 
start with partial state saving basics

How does full state saving work? Two things are saved,

 1.  the structure of the component tree - as in parent/child/facet 
relationships
  2. the state of the components - there is a state object for each component, 
this object might hold all the attribute values.

Partial state saving is based on the fact that Facelets tag handlers can be 
re-executed during restore view in order to re-create the initial state of the 
component tree so that the structure of the component tree does not need to be 
state saved. Note that this means the tags are now executed during restore 
view, which does not happen in full state saving.

Because the tags are re-executed with partial state saving, only attribute 
changes made after the tags have been executed need to be state saved. This is 
accomplished by calling markInitialState on the components after the tags have 
been executed, so that only changes applied after markInitialState has been 
called are state saved.

What is actually saved in partial state saving? The differences for partial 
state saving are:

   1. the structure of the page - not saved, the tags are re-executed to create 
the structure
   2. the state of the page - still a tree of state objects, but the state 
object is only a map of the deltas and is therefore usually empty.

Now let's look at the mutable attribute case. The mutable attribute case is a 
case where the app dev is getting a local attribute off the component and 
mutating it, for example get a local value of a date and mutate it (mutable 
attributes are a fairly rare case, because normally attributes are either EL 
bound or immutable (boolan, string, etc)). In partial state saving only the 
deltas are saved, and deltas are generated by sets on component attributes, 
without a set getting called an attribute will not be in the delta list, and 
therefore won't be state saved, so if an attribute is mutated from outside the 
component the changes would not be state saved.

Proposal to fix this is only do partial state saving on attributes that tell us 
the type is immutable, since most attributes are String, booleans, and other 
immutable types this means most attributes are still doing partial state saving.

1  enhance org.apache.myfaces.trinidad.bean.PropertyKey api to add a new 
capability that indicates that the attribute is mutable, defaults to false. 
There would be a new constant CAP_MUTABLE, and a new method isMutable().
 2.  enhance metadata in build files to set this on the applicable property 
keys, add <mfp:mutable>true</mfp:mutable> under <property-extension>
 3.  enhance build tool to look for the metadata and create the appropriate 
capability
 4.  when state saving in 
org.apache.myfaces.trinidad.bean.util.PropertyHashMap.saveState() go through 
the keys and check the propertyKey for CAP_MUTABLE, if it's mutable put the 
value in the deltas map

New API: Enhance org.apache.myfaces.trinidad.bean.PropertyKey api to add a new 
capability that indicates that the attribute is mutable, defaults to false. Add

  1. new constant CAP_MUTABLE
  2. new method isMutable().


--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to