On 10/28/2012 04:43 PM, Andreas Jonsson wrote:
> Hi Vincent,
> 
> 2012-10-27 19:13, Vincent Massol skrev:
>> 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?
> 
> No, it is not actually a compatibility issue, because the clone method
> in the execution context manager doesn't actually clone the execution
> context.  This option is therefore only used when copying the properties
> when inheriting the parent context, which is a new feature.
> 
> But having said that, it is possible that we should enable cloning by
> default.  My thoughts on this is only that we cannot know if the the
> value can be cloned, which would be a slight complication.
> 
> 
>>> * 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.
> 
> Ok.  To make the API more compact, I changed it to use a builder pattern
> for declaring properties, for example:
> 
> context.newProperty("key").type(String.class).nonNull().initial("value").declare();
> 
> 
>> 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.
>>
> 
> Let's see if I understand you correctly.  First, I would say that
> setting a property with attributes (i.e., setProperty(key, ECP)) is
> precisely what I mean by 'declaring' a property.  You are just using a
> different method name.  So, I'm taking the liberty to continue to use
> the word 'declaring' to denote 'setting a property with attributes'.
> 
> With this in mind, do you suggest that we forbid updating property
> values altogether (i.e., the same as declaring them final by default
> with no option to not declare them final)?  Also, do you suggest
> deprecating 'ExecutionContext.setValue(String, Object)' to disallow
> implicit declarations altogether?
> 
> The ability to actually replace the value object seems very useful to
> me.  A simple use case is that of keeping a boolean flag in the context:
> 
> context.newProperty("flag").type(Boolean.class).nonNull()
>     .initial((Boolean) false).declare();
> 
> // ...
> 
> if (! ((Boolean) context.getProperty("flag"))) {
>    context.setProperty("flag", (Boolean) true);
>    // ...
> }
> 
> As of implicit declarations, I have allowed them only to maintain
> backwards compatiblity.  I would be in favour of disallowing them.
> 
> 
>>> 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?
> 
> Yes, the execution context manager seems redundant.
> 
>> 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())
> 
> Given that the method ECM.clone(EC) doesn't actually clone anything,
> particularily not the execution context given as argument, I'd say that
> it should be deprecated in favor of making the execution context itself
> cloneable.
> 
> 
> Best Regards,
> 
> /Andreas
> 
> 
> 
>> 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).

I agree with the current state of the code, +1 for merge.

-- 
Sergiu Dumitriu
http://purl.org/net/sergiu/
_______________________________________________
devs mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/devs

Reply via email to