Thank you!

Now we have 3 +1 and 1 +0.

Vote passed.  I will merge the branch.

Best Regards,

/Andreas

2012-10-31 14:48, Thomas Mortagne skrev:
> +1, sorry for the late answer, did not had much time to review your
> branch before
>
> On Wed, Oct 31, 2012 at 1:17 PM, Andreas Jonsson <[email protected]> wrote:
>> Hi,
>>
>> Obviously, I should vote +1 myself as well.  So, we have 2 +1 and 1 +0.
>> Does anyone else have an opinion on this?  Maybe Thomas?
>>
>> /Andreas
>>
>> 2012-10-29 19:31, Sergiu Dumitriu skrev:
>>> 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.
>>>
>> _______________________________________________
>> devs mailing list
>> [email protected]
>> http://lists.xwiki.org/mailman/listinfo/devs
>
>

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

Reply via email to