Sounds nice and would solve
http://jira.xwiki.org/browse/XWIKI-217 nicely :)
Thanks
-Vincent
On 10 Apr 2014 at 22:37:36, Sergiu Dumitriu (sergiu@xwiki.org(mailto:sergiu@xwiki.org))
wrote:
Sometimes it's important to be able to decide if
the user wants an
existing object by number, an existing object by filter, always a new
object, or an existing or new object. So the request needs to be more
complex.
New special request parameters proposal:
withXObject=
/=
_=
_/parsed=
An is a transparent string, it can be either a randomly
generated string, or a sequence number such as obj42.
We define the accepted s, for example:
- /action=find | create | findOrCreate | delete
- /match=/ (can appear multiple times to
filter by multiple properties)
- /matchMode=exclusive | and | or (default exclusive)
- /select=first | all (default first)
- /type=
- /updateMode=replace | append (default replace)
The new _/parsed syntax allows to set
properties based on the generated data, such as the number of a
different object created in the same request. This requires a second
pass through the parameters after the standard readObjectsFromForm
completes. The Velocity context will be populated with the standard API
objects ($xwiki, $xcontext, $services, $doc, $tdoc, $request,
$response...), plus the objects / attachments named in the request. If
/select=all, then a list with the matches is placed in the context.
For example:
/save/Some/Page?withXObject=xr1
&xr1/action=findOrCreate
&xr1/type=XWiki.XWikiRights
&xr1/match=users/XWiki.jdoe
&xr1/match=allow/1
&xr1_levels=view
&xr1_levels=comment
&withXObject=xr2
&xr2/action=findOrCreate
&xr2/type=XWiki.XWikiRights
&xr2/match=users/XWiki.jdoe
&xr2/match=allow/0
&xr2_levels=edit
^ This searches for a rights object that specifies allow rights for the
user jdoe. If the object exists, it replaces the levels with "view and
edit". If it doesn't exist, it creates a new one, fills in the
"users"
and "allow" properties to the values specified in the match filter, and
sets "levels" to "view and edit". Then it searches for a rights
object
that specifies deny rights for the same user, and updates or creates...
Another example:
/save/Some/Page?withXObject=comments
&comments/action=delete
&comments/type=XWiki.XWikiComment
&comments/match=author/XWiki.jdoe
&comments/match=author/xwiki:XWiki.jdoe
&comments/matchMode=or
&comments/select=all
^ This searches for all comments posted by jdoe, wiki-prefixed or not,
and deletes them.
One more:
/save/Some/Page?withAttachment=upload1
&upload1/input=file
&withXObject=photo1
&photo1/action=create
&photo1/type=Media.PhotoClass
&photo1_file/parsed=${upload1.filename}
&photo1_author=Yousuf Karsh
&photo1_date=1957-03-21
&withXObject=meta1
&meta1/action=create
&meta1/type=Media.AnnotationClass
&meta1_target/parsed=Media.PhotoClass_${photo1.number}/rect(130,92,830,1232)
&meta1_comment=The contrast here is fantastic!
&meta1_author/parsed=${xcontext.userReference}
In one request, this uploads an image, creates a PhotoClass holding
information about the attachment, and an annotation for that PhotoClass
with a comment.
On 04/10/2014 06:00 AM, Jean SIMARD wrote:
> Yes, I won't know if it's updated or created.
>
> Now, using 'XWiki.XWikiRights_users = XWiki.Me' would not be sufficient
> for the use case; what happens if you want to create 2 objects
> 'XWiki.XWikiRights'?
>
> Can we imagine to introduce a new notation to explicitly mean that you
> want to create a new object, like 'new_XWiki.XWikiRights_0_users' or
> 'XWiki.XWikiRights_new_0_users' or 'XWiki.XWikiRights_n0_users'?
>
> This way, we can filter as following:
> * If you try to update an object with 'XWiki.XWikiRights_0_users' and
> the object #0 exists, the property is updated (use case already
> existing)
> * If you try to update an object with 'XWiki.XWikiRights_0_users' and
> the object #0 doesn't exist, the parameter has no effect (use case
> already existing)
> * If you try to create an object with 'new_XWiki.XWikiRights_0_users'
> and the object #0 exists, the parameter has no effect
> * If you try to create an object with 'new_XWiki.XWikiRights_0_users'
> and the object #0 doesn't exist, the object is created and the property
> initialized
>
> Thanks
> --
> Jean
>
> On jeu., 2014-04-10 at 11:59 +0300, Marius Dumitru Florea wrote:
>> So if I put XWiki.XWikiRights_56_users on the request and there's no
>> rights object what do you do? Create an object with number 0? Create
>> an object with number 56? And if you want to add a new object how
>> would you know the object number to put on the request so that you
>> don't update existing objects instead?
>>
>> The current behaviour is this:
>>
>> 1) You ask the system to add a new object (i.e. allocate an object
>> number) using the object add action, possibly passing property values
>> like this
>>
>> XWiki.XWikiRights_users = XWiki.Me
>>
>> 2) You use the allocated number to update the object, passing property
>> values like this
>>
>> XWiki.XWikiRights_N_users = XWiki.Me
>>
>> where N is the allocated object number.
>>
>> What you want is to do this in a single step, but you won't
>> know/control if the object is added or updated.
>>
>> Thanks,
>> Marius
>>
>> On Thu, Apr 10, 2014 at 11:36 AM, Jean SIMARD wrote:
>>> Hi devs,
>>>
>>> In XWiki, if you send a POST request at the following URL
>>> ('MySpace.MyPage' is a document that doesn't exist at the
moment)
>>>
>>> /bin/save/MySpace/MyPage
>>>
>>> with the following HTTP parameters:
>>>
>>> * template=MySpace.MyTemplate
>>> * XWiki.XWikiRights_0_users=XWiki.Me
>>> *
>>>
>>> with 'MySpace.MyTemplate' a template document and 'XWiki.Me'
a user of
>>> the wiki.
>>>
>>> 2 cases:
>>>
>>> 1. If 'MySpace.MyTemplate' contains a 'XWiki.XWikiRights'
object, then
>>> the resulting document 'MySpace.MyPage' will have this object with
its
>>> property 'users' initialize with the value 'XWiki.Me' (see
HTTP
>>> parameters)
>>> 2. If 'MySpace.MyTemplate' does not contain a
'XWiki.XWikiRights'
>>> object, the resulting document 'MySpace.MyPage' will not contain it
>>> either
>>>
>>> ### PROPOSAL
>>> Create automatically the objects if they don't exist in the template
>>> document.
>>> ###
>>>
>>> To make it possible, it seems that we would need to refactor the method
>>> 'readObjectsFromForm(EditForm, XWikiContext)' in the
>>> 'com.xpn.xwiki.doc.XWikiDocument' class. And probably modify also
the
>>> 'getObject(String)' from 'com.xpn.xwiki.web.EditForm'
class.
>>>
>>> 2 things to take care:
>>> * It seems there is no unit test for these methods.
>>> * May this proposal be a security problem?
>>>
>>> WDYT?
>>> --
>>> Jean
>>>