On 16 Nov 2018, at 10:41, Adel Atallah
<adel.atallah(a)xwiki.com> wrote:
So do we agree on trying the solution given by Thomas? i.e. creating
two annotations:
1. PropertyGroup to specify a hierarchy of groups to a parameter
2. PropertyFeature to indicate that some parameters/groups represents the
same feature (which can lead to conflicts).
Here was the given example:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
@PropertyGroup("target")
@PropertyFeature("reference")
page
@PropertyGroup({"target", "entityReference"})
@PropertyFeature("reference")
reference
@PropertyGroup({"target", "entityReference"})
type
@PropertyGroup("target")
@PropertyFeature("reference")
document
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
I've already started implementing the PropertyGroup annotation.
On Thu, Nov 15, 2018 at 3:13 PM Thomas Mortagne
<thomas.mortagne(a)xwiki.com> wrote:
>
> On Thu, Nov 15, 2018 at 2:06 PM Adel Atallah <adel.atallah(a)xwiki.com> wrote:
>>
>> On Thu, Nov 15, 2018 at 1:56 PM Thomas Mortagne
>> <thomas.mortagne(a)xwiki.com> wrote:
>>>
>>> On Thu, Nov 15, 2018 at 1:24 PM Adel Atallah <adel.atallah(a)xwiki.com>
wrote:
>>>>
>>>> On Thu, Nov 15, 2018 at 11:13 AM Thomas Mortagne
>>>> <thomas.mortagne(a)xwiki.com> wrote:
>>>>>
>>>>> On Thu, Nov 15, 2018 at 11:06 AM Adel Atallah
<adel.atallah(a)xwiki.com> wrote:
>>>>>>
>>>>>> Ok so it seems like we are getting back to the proposition we
made with Vincent.
>>>>>> We need one annotation to enforce the dependence between
parameters
>>>>>> (reference and type in our example) and another one that can be
used
>>>>>> to *deduce* conflicting parameters.
>>>>>
>>>>>> I don't understand how a hierarchy of groups can help us
specify a
>>>>>> dependence between parameters.
>>>>>
>>>>> I don't think it does, it's just that since we are defining
groups
>>>>> having subgroups would be useful visually.
>>>>>
>>>>>> A parameter is either in the same group
>>>>>> as another one or it is not. The hierarchy seems to focus on
problems
>>>>>> that we are not trying to solve here.
>>>>>> The original proposal was similar to what Thomas proposed, but
without
>>>>>> hierarchy:
>>>>>>
>>>>>> @Alternative("reference")
>>>>>> @Group("entityReference")
>>>>>> reference
>>>>>>
>>>>>> @Alternative("reference")
>>>>>> @Group("entityReference")
>>>>>> type
>>>>>>
>>>>>> @Alternative("reference")
>>>>>> page
>>>>>>
>>>>>> @Alternative("reference")
>>>>>> document
>>>>>>
>>>>>> where "Alternative" is the same as "Feature".
Now Marius didn't agree
>>>>>> with that because the "Alternative" annotation should
not be bind to
>>>>>> "reference" and "type" parameters but to the
group "entityReference"
>>>>>
>>>>> And as I said in my proposal the features are associated to the
group,
>>>>> not the properties. I agree that associating it to the property (and
>>>>> ending up with half of a group conflicting with half of another)
does
>>>>> really make sense.
>>>>>
>>>>
>>>> This is not enforced by the code.
>>>
>>> I don't understand what you mean, there is no code yet.
>>
>> By code I meant the annotations in the code.
>
> Yes but hard to do much better I think without breaking anything now
> that we have two parameters for a single information, we need to
> maintain them.
>
>>
>>> For me the
>>> code which is going to parse this Java bean will of course make sure
>>> the features are associated to the group of the property.
>>
>> I agree with that.
>>
>>>
>>>> You know that features are
>>>> associated to groups *because* they are bound to the same property.
>>>> Anyway I'm +1 to do it this way.
>>>>
>>>>>> ,
>>>>>> which is not possible to do without creating other classes. I
don't
>>>>>> think this is an issue to put the "Alternative"
annotation on
>>>>>> "reference" and "type" because we should have
all the necessary
>>>>>> information to *deduce* the conflicting parameters. It's true
that
>>>>>> removing the "Alternative" annotation of one of
"reference" or "type"
>>>>>> should produce the same result though, which could be confusing.
>>>>>> On Thu, Nov 15, 2018 at 10:23 AM Marius Dumitru Florea
>>>>>> <mariusdumitru.florea(a)xwiki.com> wrote:
>>>>>>>
>>>>>>> On Thu, Nov 15, 2018 at 10:51 AM Thomas Mortagne
<thomas.mortagne(a)xwiki.com>
>>>>>>> wrote:
>>>>>>>
>>>>>>>> I'm also really not a fan of having to implement a
component just to
>>>>>>>> indicate that two groups of properties are conflicting.
>>>>>>>>
>>>>>>>> +1 for making @Group support a hierarchy, that's
indeed nice.
>>>>>>>>
>>>>>>>> For for conflicting we need a dedicated annotation IMO.
>>>>>>>>
>>>>>>>> So starting from your previous example I would expect
something like:
>>>>>>>>
>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>
>>>>>>>> @PropertyGroup("target")
>>>>>>>> @PropertyFeature("reference")
>>>>>>>> page
>>>>>>>>
>>>>>>>> @PropertyGroup({"target",
"entityReference"})
>>>>>>>> @PropertyFeature("reference")
>>>>>>>> reference
>>>>>>>>
>>>>>>>> @PropertyGroup({"target",
"entityReference"})
>>>>>>>> type
>>>>>>>>
>>>>>>>> @PropertyGroup("target")
>>>>>>>> @PropertyFeature("reference")
>>>>>>>> document
>>>>>>>>
>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>
>>>>>>>
>>>>>>> I don't think this is complete. The following doesn't
make sense:
>>>>>>>
>>>>>>> {{include page="..." type="..."/}}
>>>>>>>
>>>>>>> and neither this:
>>>>>>>
>>>>>>> {{include document="..." type="..." /}}
>>>>>>>
>>>>>>> So it's not the reference parameter alone that provides
the "reference"
>>>>>>> feature. The pair / group of parameters (reference and type)
are providing
>>>>>>> the "reference" feature. This is why I think there
is the need to specify
>>>>>>> the "feature" on the sub group
"entityReference" not on the parameter. And
>>>>>>> to do this we need another class..
>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> or
>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>
>>>>>>>> @PropertyGroup("target", features =
"reference")
>>>>>>>> page
>>>>>>>>
>>>>>>>> @PropertyGroup({"target",
"entityReference"}, features = "reference")
>>>>>>>> reference
>>>>>>>>
>>>>>>>> @PropertyGroup({"target",
"entityReference"})
>>>>>>>> type
>>>>>>>>
>>>>>>>> @PropertyGroup("target", features =
"reference")
>>>>>>>> document
>>>>>>>>
>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>>> * PropertyGroup define the hierarchy (also proposed a
String[] instead
>>>>>>>> of String based value to show all possible ways to pass
the hierarchy
>>>>>>>> value)
>>>>>>>>
>>>>>>>
>>>>>>> +1 for this
>>>>>>>
>>>>>>>
>>>>>>>> * PropertyFeature (name is negotiable :)) or
PropertyGroup "features"
>>>>>>>> field associate the group with a set of unique
"features". This is the
>>>>>>>> same logic than for extensions where several groups with
with a shared
>>>>>>>> feature are in conflict
>>>>>>>>
>>>>>>>
>>>>>>> You're not associating the feature to the group. That is
the problem IMO.
>>>>>>> You are associating the feature to the parameter. For
instance:
>>>>>>>
>>>>>>> @PropertyGroup("foo", features =
"input")
>>>>>>> one
>>>>>>>
>>>>>>> @PropertyGroup("foo", features =
"output")
>>>>>>> two
>>>>>>>
>>>>>>> Is the "input" and "output" feature
associate to the "foo" group or to the
>>>>>>> parameters one and two respectively?
>>>>>>>
>>>>>>> Thanks,
>>>>>>> Marius
>>>>>>>
>>>>>>>
>>>>>>>>
>>>>>>>> We could also decide to support only one feature per
group right now
>>>>>>>> since we don't yet have the need for several but it
felt more natural
>>>>>>>> like this.
>>>>>>>>
>>>>>>>> On Thu, Nov 15, 2018 at 8:04 AM Vincent Massol
<vincent(a)massol.net> wrote:
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>> On 15 Nov 2018, at 08:02, Vincent Massol
<vincent(a)massol.net> wrote:
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>> On 15 Nov 2018, at 06:29, Marius Dumitru
Florea <
>>>>>>>> mariusdumitru.florea(a)xwiki.com> wrote:
>>>>>>>>>>>
>>>>>>>>>>> On Wed, Nov 14, 2018 at 5:12 PM Vincent
Massol <vincent(a)massol.net>
>>>>>>>> wrote:
>>>>>>>>>>>
>>>>>>>>>>>> I thought about something like this but I
discarded it as I find this
>>>>>>>>>>>> complicated for something that should be
relatively simple.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> I don't think it's that complicated
because:
>>>>>>>>>>>
>>>>>>>>>>> * Conflicting parameters should be an
exception, not the rule. What
>>>>>>>> other
>>>>>>>>>>> macros, besides include / display, need
this?
>>>>>>>>>>> * If you just want to group macro parameters
for display then you
>>>>>>>> only need
>>>>>>>>>>> to use the @Group annotation. You don't
need to implement a
>>>>>>>> ParameterGroup.
>>>>>>>>>>> The ParameterGroup is needed only for
conflicting parameters (ATM).
>>>>>>>>>>
>>>>>>>>>> Sure but it’s still 10x more complicated than
just having everything
>>>>>>>> in one place in the parameters class with annotations as
was suggested
>>>>>>>> initially.
>>>>>>>>>
>>>>>>>>> And requires unnecessary component instances that
will stay in the EM
>>>>>>>> for no need. The way to describe the descriptor is
transient and only
>>>>>>>> serves to generate the macro descriptors. In the end
what’s important is
>>>>>>>> the descriptor format.
>>>>>>>>>
>>>>>>>>> Thanks
>>>>>>>>> -Vincent
>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Thanks
>>>>>>>>>> -Vincent
>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Thanks,
>>>>>>>>>>> Marius
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>> I’d prefer to have some simple
annotations if possible. In other
>>>>>>>> words, if
>>>>>>>>>>>> feels a bit of over-engineering for the
need. Now I have to admit
>>>>>>>> that I
>>>>>>>>>>>> stopped following this thread after the
original proposal so maybe
>>>>>>>> I’m just
>>>>>>>>>>>> completely off :)
>>>>>>>>>>>>
>>>>>>>>>>>> Thanks
>>>>>>>>>>>> -Vincent
>>>>>>>>>>>>
>>>>>>>>>>>>> On 14 Nov 2018, at 15:51, Marius
Dumitru Florea <
>>>>>>>>>>>> mariusdumitru.florea(a)xwiki.com>
wrote:
>>>>>>>>>>>>>
>>>>>>>>>>>>> WDYT about:
>>>>>>>>>>>>>
>>>>>>>>>>>>> -----8<-----
IncludeMacroParameters ----------
>>>>>>>>>>>>> @Group("target")
>>>>>>>>>>>>> page
>>>>>>>>>>>>>
>>>>>>>>>>>>>
@Group("target/entityReference")
>>>>>>>>>>>>> reference
>>>>>>>>>>>>>
>>>>>>>>>>>>>
@Group("target/entityReference")
>>>>>>>>>>>>> type
>>>>>>>>>>>>>
>>>>>>>>>>>>> @Group("target")
>>>>>>>>>>>>> document
>>>>>>>>>>>>>
>>>>>>>>>>>>> section
>>>>>>>>>>>>>
>>>>>>>>>>>>> context
>>>>>>>>>>>>> ----->8---------------
>>>>>>>>>>>>>
>>>>>>>>>>>>> That is: specify *only* the group
hierarchy in the macro parameter
>>>>>>>>>>>>> descriptor. This would produce the
following hierarchy:
>>>>>>>>>>>>>
>>>>>>>>>>>>> * <target>
>>>>>>>>>>>>> ** page
>>>>>>>>>>>>> ** <entityReference>
>>>>>>>>>>>>> *** reference
>>>>>>>>>>>>> *** type
>>>>>>>>>>>>> ** document
>>>>>>>>>>>>> * section
>>>>>>>>>>>>> * context
>>>>>>>>>>>>>
>>>>>>>>>>>>> Next, for the cases where we want to
customize the behavior of a
>>>>>>>> group,
>>>>>>>>>>>> we
>>>>>>>>>>>>> introduce a component role
ParameterGroup. For instance, for the
>>>>>>>> "target"
>>>>>>>>>>>>> parameter group of the Include Macro
we would create
>>>>>>>>>>>>>
>>>>>>>>>>>>> @Named("include/target")
>>>>>>>>>>>>> public class TargetParameterGroup
implements ParameterGroup {}
>>>>>>>>>>>>>
>>>>>>>>>>>>> To specify that the members of a
parameter group are exclusive we
>>>>>>>> can
>>>>>>>>>>>>> either use a method in the
ParameterGroup interface (e.g.
>>>>>>>> isExclusive())
>>>>>>>>>>>> or
>>>>>>>>>>>>> use an annotation on the
implementation TargetParameterGroup.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>> Marius
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> On Tue, Nov 13, 2018 at 12:03 PM Adel
Atallah <
>>>>>>>> adel.atallah(a)xwiki.com>
>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>
>>>>>>>>>>>>>> Hello,
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> I'd like to briefly summarize
the situation so that we can make
>>>>>>>> some
>>>>>>>>>>>>>> progress.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> What we have:
>>>>>>>>>>>>>> * We define
"parameters" in a macro by creating a Java Bean, which
>>>>>>>>>>>>>> provides all the getters and
setters of the parameters we want.
>>>>>>>>>>>>>> * We can use annotations on these
getters/setters to define some
>>>>>>>>>>>>>> behavior or metadata for these
parameters (description, mandatory,
>>>>>>>>>>>>>> deprecated...)
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> What we want:
>>>>>>>>>>>>>> * Being able to handle
conflicting parameters. For instance when we
>>>>>>>>>>>>>> deprecate a parameter and add a
new one to replace it, we should be
>>>>>>>>>>>>>> able to either use the deprecated
parameter or the new one but not
>>>>>>>>>>>>>> both.
>>>>>>>>>>>>>> * We also want to group
parameters that are related to each other.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> What we proposed:
>>>>>>>>>>>>>> * Use annotations on the
parameters to express the conflict.
>>>>>>>>>>>>>> * Marius proposed to see the
problem as a boolean expression such
>>>>>>>> as:
>>>>>>>>>>>>>> (page XOR (reference AND type)
XOR document) OR section OR context.
>>>>>>>>>>>>>> This would translate as: the user
can use the 'section' and/or
>>>>>>>>>>>>>> 'context' parameters (if
they want), can use only one of these
>>>>>>>>>>>>>> parameters: 'page',
('reference' and 'type') or 'document', where
>>>>>>>>>>>>>> 'reference' and
'type' depend on each other and you can't use one
>>>>>>>>>>>>>> without the other.
>>>>>>>>>>>>>> * You can see on previous e-mails
the kind of annotations we
>>>>>>>> proposed
>>>>>>>>>>>>>> to solve the issue.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>> Adel
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>> Thomas Mortagne
>>>>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Thomas Mortagne
>>>
>>>
>>>
>>> --
>>> Thomas Mortagne
>
>
>
> --
> Thomas Mortagne