Forgot to mention that I'm leaving for holidays Monday morning for one week 
without computer nor internet access… :)

Thanks
-Vincent

On Oct 27, 2012, at 7:13 PM, Vincent Massol <[email protected]> wrote:

> Hi Andreas,
> 
> On Oct 26, 2012, at 2:07 PM, Andreas Jonsson <[email protected]> wrote:
> 
>> Hi Everyone,
>> 
>> I would like you to vote on merging the feature-execution-context
>> branches of commons and platform before the release of 4.3M2:
>> 
>> https://github.com/xwiki/xwiki-commons/compare/master...feature-execution-context-metadata
>> https://github.com/xwiki/xwiki-platform/compare/master...feature-execution-context-metadata
>> 
>> Explanation of the feature:
>> 
>> The execution context is a simple map that binds a string to an object. 
>> This can be compared to how variables are handled by scripting languages
>> such as bash, where an assignment brings the variable into existance:
>> 
>> $ my_variable="some value"
>> 
>> In the case of the execution context, the syntax is:
>> 
>> context.setProperty("my_variable", "some value");
>> 
>> This feature is about adding property declarations, where a property can
>> be associated with attributes that controls how the execution context
>> and execution context manager handles the property.  The general idea
>> can, once again, be compared to bash and how it is possible to declare
>> variables there:
>> 
>> $ declare -ru my_variable="read only, forced upper case"
>> 
>> Of course, the set of attributes that are interesting to us is different
>> from bash.  Currently the feature branch have support for declaring
>> properties with these attributes:
>> 
>> * Final         - The value may not be updated within the the execution
>> context.  Default: false.
>> 
>> * Inherited     - The property will be inherited from the current
>> context when replacing the execution context within the current scope. 
>> Default: false.
> 
>> * Cloned value  - Also clone the value when the execution context is
>> cloned. Default: false.
> 
> ATM I believe that all our properties are "cloned" since when we clone the 
> context they are there. Won't this cause a backward compat issue? Shouldn't 
> it be true by default?
> 
>> 
>> * Type          - The class of the value, for typechecking when setting
>> the value. Default: null (unchecked).
>> 
>> * Non-null      - The value may not be null, checked when setting the
>> value. Default: false.
>> 
>> Example declaration:
>> 
>> ExecutionContextProperty property = new
>> ExecutionContextProperty("my_variable");
>> property.setValue("some value");
>> property.setType(String.class);
>> property.setInherited(true);
>> context.declareProperty(property);
> 
> The API is very verbose just to declare one property… IMO it would be nice to 
> have something more compact.
> 
> As I've already commented I'd personally have preferred that the 
> ExecutionContextProperty and properties in general be immutable and set with 
> one call to context.setProperty(key, ECP) (i.e. no need to declare IMO). I 
> find it more straightforward and prevents forgetting to call declareProperty, 
> which becomes really critical to get the right behavior you want.
> 
>> The property value may be updated and the property may be removed and
>> redeclared, unless declared 'final':
>> 
>> context.setProperty("my_variable", "some new value");
>> context.removeProperty("my_variable");
> 
> In general immutability is better in term of performance/implementation.
> 
>> Additional attributes may be added later.  This feature is also
>> backwards compliant, in that implicit declaration by just setting a
>> value is allowed.  (Although we might want to make explicit declarations
>> mandatory in the future.)
>> 
>> Within the scope of a request, or the life time of a thread executing
>> some administrative task (e.g., the lucene index updater) the basic life
>> cycle of the execution context is the following:
>> 
>> @Inject
>> Execution execution;
> 
> No need for this injection in your code below :)
> 
>> @Inject
>> ExecutionContextManager ecm;
>> 
>> ExecutionContext context = new ExecutionContext();
>> ecm.initialize(context);
>> try {
>>   // Do work
>> } finally {
>> ecm.removeContext();
>> }
>> 
>> Within the life cycle of the "root" execution context, we may push a new
>> execution context, which may either be a clean context, or a clone of
>> the current context:
>> 
>> // Pushing a clone
>> 
>> ExecutionContext context = ecm.clone(execution.getContext());
> 
> <brainstorming mode>
> Actually I wonder why we have both Execution and ECM. Shouldn't we have just 
> one?
> 
> Also I wonder why we have to call ecm.clone() instead of implementing clone() 
> in ExecutionContext so that we would have:
> 
> ExecutionContext context = execution.getContext();
> execution.pushContext(context.clone())
> 
> And to create an EC:
> ExecutionContext ec = execution.createContext();
> 
> Ok maybe we would have a hard time with backward compat with this but for the 
> sake of the discussion, would that be something better?
> </brainstorming mode>
> 
>> execution.pushContext(context);
>> try {
>> // Do work
>> } finally {
>> execution.popContext();
>> }
>> 
>> // Pushing a clean context
>> 
>> ExecutionContext context = new ExecutionContext();
>> execution.pushContext(context);
>> try {
>> // Do work
>> } finally {
>> execution.popContext();
>> }
>> 
>> Component authors that needs to place a value in the execution context
>> provides an initializer that declares the variable and sets an initial
>> value.
>> 
>> The attributes 'final', 'cloned value', and 'inherited' lets component
>> authors control how the value is managed during the lifecycle of the
>> root execution context.
>> 
>> The attributes 'type' and 'non-null' provides some runtime assertions to
>> catch some errors earlier.
>> 
>> So to summarize, this feature:
>> 
>> 1. is a convenient mechanism for managing properties in the execution
>> context,
>> 
>> 2. provides some validation of the property values,
>> 
>> 3. improves performance slightly by avoiding unnecessary cloning.
>> 
>> For more information, see the proposal thread:
>> 
>> http://xwiki.475771.n2.nabble.com/PROPOSAL-Execution-context-property-declarations-and-property-metadata-attributes-td7581766.html
> 
> +0 from me after we agree on the items above.
> 
> I'd really like to get feedback from other committers before you push this 
> since it's a really critical change (the Execution/EC is key and is going to 
> become even more and more important as we move away from XWikiContext).
> 
> Thanks
> -Vincent
> 

_______________________________________________
devs mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/devs

Reply via email to