angela created OAK-1962:
---------------------------

             Summary: Fix and Improve Locking
                 Key: OAK-1962
                 URL: https://issues.apache.org/jira/browse/OAK-1962
             Project: Jackrabbit Oak
          Issue Type: Bug
          Components: core, jcr
    Affects Versions: 1.0
            Reporter: angela
             Fix For: 1.1


as discussed during our biweekly planning session, we are having the following 
locking related use case in our product:

a page (which is an aggregation of nodes and properties) must be freezed 
(prevented from being edited/modified/deleted) during the period of a dedicated 
review (which in our case is triggered by a workflow) before the page then is 
either published or reopened for further changes.

for this feature locking would be a perfect match but with the current 
implementation in oak  it's not possible to remove the lock token from a given 
session and make sure it's no longer recognizes as lock owner; in particular 
with the simple-locking feature which we introduced in order to cope with the 
situation that in our product sessions are living just for the time of a single 
request.

is was therefore thinking about ways to address this, keeping the 
simple-locking requirement in mind while at the same time improving compliance 
with the JCR specification. my suggestion as follows:

- use a dedicated hidden and write protected location the repository to store 
the lock information independent of the protected properties defined by 
mix:lockable which are just for information purpose (that would be the 
replacement for the lock-related file we had in jackrabbit 2.x)
- format: simple lookup consisting of userId + associated lock tokens
- in case of simple locking LockManager#getLockTokens would make use of that 
map even if the lock tokens have NOT been explicitly added to the Session 
either upon LockManager#lock or LockManager#addLockToken
- in the default (non-simple case) LockManager#getLockTokens would work as 
specified and the lookup would only be used for maintaining and enforcing the 
lock related information)
- LockManager#removeLockToken removes the token from the lookup thus 
effectively revoking the lock ownership from the given Session and thus 
preventing it from performing further editing... even in the simple-locking case
- LockManager#addLockToken results in a modification of the lookup table as 
well depending on the API contract (i.e. verifying if the lock token would be 
shared... i don't remember exactly if that's accepted by the specification)
- LockManager#isLockOwner no longer needs to perform a cheap hack comparing the 
jcr:lockOwner property with the sessions userId but could really enforce 
ownership based on the internal lock information stored in the repository in 
which case getLockTokens would really reflect the ownership for open-scoped 
locks; furthermore the 'jcr:lockOwner' information could be to what is 
specified by the API consumer upon LockManager#lock as it is no longer used for 
enforcing the locks.

in addition:
- we could generated  proper lock tokens instead of just using the node id
and again keep those in a hidden (or otherwise protected) location in the 
system.




--
This message was sent by Atlassian JIRA
(v6.2#6252)

Reply via email to