incubator-sling-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From conflue...@apache.org
Subject [CONF] Apache Sling > Supporting CRUD
Date Fri, 06 Jul 2012 08:12:00 GMT
<html>
<head>
    <base href="https://cwiki.apache.org/confluence">
            <link rel="stylesheet" href="/confluence/s/2042/9/1/_/styles/combined.css?spaceKey=SLING&amp;forWysiwyg=true"
type="text/css">
    </head>
<body style="background: white;" bgcolor="white" class="email-body">
<div id="pageContent">
<div id="notificationFormat">
<div class="wiki-content">
<div class="email">
    <h2><a href="https://cwiki.apache.org/confluence/display/SLING/Supporting+CRUD">Supporting
CRUD</a></h2>
    <h4>Page <b>edited</b> by             <a href="https://cwiki.apache.org/confluence/display/~cziegeler@apache.org">Carsten
Ziegeler</a>
    </h4>
        <br/>
                         <h4>Changes (14)</h4>
                                 
    
<div id="page-diffs">
                    <table class="diff" cellpadding="0" cellspacing="0">
    
            <tr><td class="diff-unchanged" >The current Sling resource API only
allows reading of resources - with the PersistableValueMap we have a simple mechanism to support
updates, however this approach comes with some problems (see below). <br> <br></td></tr>
            <tr><td class="diff-changed-lines" >This is a concept how to fully
implement CRUD via the resource API. As a first step we angle the problem from the users via:
the API to be used by Sling applications. <span class="diff-added-words"style="background-color:
#dfd;">(SLING-2530)</span> <br></td></tr>
            <tr><td class="diff-unchanged" > <br>h2. Client API <br></td></tr>
            <tr><td class="diff-snipped" >...<br></td></tr>
            <tr><td class="diff-unchanged" >h3. Delete <br> <br></td></tr>
            <tr><td class="diff-changed-lines" >We add a _delete_ method to the
*Resource* interface, so deleting a resource is a two way step: first getting the resource
from the resource resolver and then deleting it. <span class="diff-deleted-words"style="color:#999;background-color:#fdd;text-decoration:line-through;">The
change is persisted immediately (see below).</span> <br></td></tr>
            <tr><td class="diff-added-lines" style="background-color: #dfd;">There
is no benefit in having a _delete(String path)_ method on the resource resolver. This would
internally get the resource first anyway in order to delegate to the proper resource provider.
<br>See section about persisting changes belowe. <br></td></tr>
            <tr><td class="diff-unchanged" > <br>h3. Create <br> <br></td></tr>
            <tr><td class="diff-changed-lines" >We add a new method _create(String
absolutePath, ValueMap properties)_ to the resource resolver, where the value map is optional.
This will create the resource at the given path and add the provided properties. <span
class="diff-deleted-words"style="color:#999;background-color:#fdd;text-decoration:line-through;">The
change is persisted immediately (see below)</span> <br></td></tr>
            <tr><td class="diff-unchanged" >In the case of a JCR backed repository,
the properties might contain _jcr:primaryType_ and _jcr:mixins_ - which are used to set the
node node and mixins. Otherwise the defaults apply. <br></td></tr>
            <tr><td class="diff-added-lines" style="background-color: #dfd;">See
section about persisting changes belowe. <br></td></tr>
            <tr><td class="diff-unchanged" > <br>h3. Update <br> <br></td></tr>
            <tr><td class="diff-changed-lines" >We currently have the PersistableValueMap
which is an easy way of modifying a resource. As we have modifications now as a first class
feature, we should add an _update(ValueMap props)_ method to the *Resource* interface. <span
class="diff-deleted-words"style="color:#999;background-color:#fdd;text-decoration:line-through;">The
change is persisted immediately.</span> <br></td></tr>
            <tr><td class="diff-added-lines" style="background-color: #dfd;">See
section about persisting changes belowe. <br></td></tr>
            <tr><td class="diff-unchanged" > <br></td></tr>
            <tr><td class="diff-changed-lines" >We should deprecate the _PersistableValueMap_
as a _save()_ call saves the whole session and this might include changes made through any
other means to the <span class="diff-changed-words">session.<span class="diff-added-chars"style="background-color:
#dfd;">(see SLING-1391 for some discussion about this)</span></span> <br></td></tr>
            <tr><td class="diff-unchanged" > <br>h3. Persisting Changes
<br> <br></td></tr>
            <tr><td class="diff-deleted-lines" style="color:#999;background-color:#fdd;text-decoration:line-through;">In
general, a call to one of the methods, modifying a resource as outlined above are persisted
immediately. However, transactions will be supported as well. <br></td></tr>
            <tr><td class="diff-added-lines" style="background-color: #dfd;">There
are two possibilities to handle changes: <br></td></tr>
            <tr><td class="diff-unchanged" > <br></td></tr>
            <tr><td class="diff-deleted-lines" style="color:#999;background-color:#fdd;text-decoration:line-through;">h2.
Transaction handling <br></td></tr>
            <tr><td class="diff-added-lines" style="background-color: #dfd;">#
A call to one of the methods, modifying a resource as outlined above are persisted immediately
and *JTA* transactions will be supported <br># Changes are not persisted immediately
but stored transient. When all changes are done, a _save_/_commit_ calls needs to be done
trying to persist all changes to all resource providers. <br></td></tr>
            <tr><td class="diff-unchanged" > <br></td></tr>
            <tr><td class="diff-deleted-lines" style="color:#999;background-color:#fdd;text-decoration:line-through;">As
changes are persisted immediately, there might be some need for a transaction handling to
control resource operations in a better way. Therefore the underlying resource providers should
support *JTA*. <br></td></tr>
            <tr><td class="diff-added-lines" style="background-color: #dfd;">The
second approach is more like people are used to when they are familiar with JCR and it allows
to do bulk changes to the persistence. The first approach without using a transaction is easier
to implement inside the resource providers and for many use cases sufficient as usually just
a single resource is affected by REST calls. <br></td></tr>
            <tr><td class="diff-unchanged" > <br> <br></td></tr>
            <tr><td class="diff-snipped" >...<br></td></tr>
    
            </table>
    </div>                            <h4>Full Content</h4>
                    <div class="notificationGreySide">
        <p>The current Sling resource API only allows reading of resources - with the
PersistableValueMap we have a simple mechanism to support updates, however this approach comes
with some problems (see below).</p>

<p>This is a concept how to fully implement CRUD via the resource API. As a first step
we angle the problem from the users via: the API to be used by Sling applications. (SLING-2530)</p>

<h2><a name="SupportingCRUD-ClientAPI"></a>Client API</h2>

<h3><a name="SupportingCRUD-Read"></a>Read</h3>

<p>The support for read is sufficient, we don't need to change that much.</p>

<h3><a name="SupportingCRUD-Delete"></a>Delete</h3>

<p>We add a <em>delete</em> method to the <b>Resource</b> interface,
so deleting a resource is a two way step: first getting the resource from the resource resolver
and then deleting it. <br/>
There is no benefit in having a <em>delete(String path)</em> method on the resource
resolver. This would internally get the resource first anyway in order to delegate to the
proper resource provider.<br/>
See section about persisting changes belowe.</p>

<h3><a name="SupportingCRUD-Create"></a>Create</h3>

<p>We add a new method <em>create(String absolutePath, ValueMap properties)</em>
to the resource resolver, where the value map is optional. This will create the resource at
the given path and add the provided properties.<br/>
In the case of a JCR backed repository, the properties might contain <em>jcr:primaryType</em>
and <em>jcr:mixins</em> - which are used to set the node node and mixins. Otherwise
the defaults apply.<br/>
See section about persisting changes belowe.</p>

<h3><a name="SupportingCRUD-Update"></a>Update</h3>

<p>We currently have the PersistableValueMap which is an easy way of modifying a resource.
As we have modifications now as a first class feature, we should add an <em>update(ValueMap
props)</em> method to the <b>Resource</b> interface. <br/>
See section about persisting changes belowe.</p>

<p>We should deprecate the <em>PersistableValueMap</em> as a <em>save()</em>
call saves the whole session and this might include changes made through any other means to
the session.(see SLING-1391 for some discussion about this)</p>

<h3><a name="SupportingCRUD-PersistingChanges"></a>Persisting Changes</h3>

<p>There are two possibilities to handle changes:</p>

<ol>
	<li>A call to one of the methods, modifying a resource as outlined above are persisted
immediately and <b>JTA</b> transactions will be supported</li>
	<li>Changes are not persisted immediately but stored transient. When all changes are
done, a <em>save</em>/<em>commit</em> calls needs to be done trying
to persist all changes to all resource providers.</li>
</ol>


<p>The second approach is more like people are used to when they are familiar with JCR
and it allows to do bulk changes to the persistence. The first approach without using a transaction
is easier to implement inside the resource providers and for many use cases sufficient as
usually just a single resource is affected by REST calls.</p>


<h2><a name="SupportingCRUD-ResourceProviders"></a>Resource Providers</h2>

<p>A resource provider is mounted into the resource tree. In general, the providers
are processed ordered by service ranking, highest first. A service provider gets a service
property specifying the sub tree it is claiming to use. For example, a service provider might
be mounted at /a/some/path. Everything below this path is processed by this resource resolver.
However another resource provider might claim /a/some/path/and/down. So the longest matching
path wins.</p>

<p>We need to add a new interface which can be implemented by a <em>ResourceProvider</em>.
It gets a create method. Update and delete are directly handled by the resource.</p>

<h3><a name="SupportingCRUD-AccessControl"></a>Access Control</h3>

<p>It's the task of a resource resolver to check if the current user is able/allowed
to access a resource. If this is not possible, the corresponding action is denied.<br/>
As resource providers are mounted at a path (see above), the resource resolver delegates to
a resource provider for a given path. If the user is not allowed to perform the action, the
processing is stopped. There is no fallback to another resource provider. This avoids the
problem that different users might see different resources (provided by different providers)
depending on their rights.</p>
    </div>
        <div id="commentsSection" class="wiki-content pageSection">
        <div style="float: right;">
            <a href="https://cwiki.apache.org/confluence/users/viewnotifications.action"
class="grey">Change Notification Preferences</a>
        </div>
        <a href="https://cwiki.apache.org/confluence/display/SLING/Supporting+CRUD">View
Online</a>
        |
        <a href="https://cwiki.apache.org/confluence/pages/diffpagesbyversion.action?pageId=27844051&revisedVersion=5&originalVersion=4">View
Changes</a>
                |
        <a href="https://cwiki.apache.org/confluence/display/SLING/Supporting+CRUD?showComments=true&amp;showCommentArea=true#addcomment">Add
Comment</a>
            </div>
</div>
</div>
</div>
</div>
</body>
</html>

Mime
View raw message