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 Tue, 05 Jun 2012 09:03: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 (5)</h4>
                                 
    
<div id="page-diffs">
                    <table class="diff" cellpadding="0" cellspacing="0">
    
            <tr><td class="diff-snipped" >...<br></td></tr>
            <tr><td class="diff-unchanged" >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. <br> <br></td></tr>
            <tr><td class="diff-changed-lines" >h2. <span class="diff-deleted-words"style="color:#999;background-color:#fdd;text-decoration:line-through;">User</span>
<span class="diff-added-words"style="background-color: #dfd;">Client</span> API
<br></td></tr>
            <tr><td class="diff-unchanged" > <br>h3. Read <br></td></tr>
            <tr><td class="diff-snipped" >...<br></td></tr>
            <tr><td class="diff-unchanged" >h3. Update <br> <br></td></tr>
            <tr><td class="diff-deleted-lines" style="color:#999;background-color:#fdd;text-decoration:line-through;">TBD
<br></td></tr>
            <tr><td class="diff-added-lines" style="background-color: #dfd;">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. The change is persisted immediately. <br></td></tr>
            <tr><td class="diff-unchanged" > <br>h3. Persisting Changes
<br> <br></td></tr>
            <tr><td class="diff-changed-lines" >In general, a call to one of the
methods, modifying a resource as outlined <span class="diff-added-words"style="background-color:
#dfd;">above</span> are persisted immediately. However, transactions will be supported
as well. <br></td></tr>
            <tr><td class="diff-unchanged" > <br>TBD Transaction handling
<br></td></tr>
            <tr><td class="diff-snipped" >...<br></td></tr>
            <tr><td class="diff-unchanged" >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. <br> <br></td></tr>
            <tr><td class="diff-added-lines" style="background-color: #dfd;">We
need to add a new interface which can be implemented by a _ResourceProvider_. It gets a create
method. Update and delete are directly handled by the resource. <br> <br></td></tr>
            <tr><td class="diff-unchanged" >h3. Access Control <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.</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. The change is persisted immediately (see below).</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. The change is persisted immediately (see below)<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.</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. The change is persisted
immediately.</p>

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

<p>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.</p>

<p>TBD Transaction handling</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=3&originalVersion=2">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