[ 
https://issues.apache.org/jira/browse/JCR-922?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12498172
 ] 

ruchi goel commented on JCR-922:
--------------------------------

Answering your question 
<What is the interest to add lock info in the data value object ? >

I am designing the checkin/checkout in the following way:

User A checks out node X.
User A locks node X. 

User B cannot update node X since it is locked by User A. 
User B can read the node X. 

User A  unlocks node X
User A checks in the node X. 

User B checks out node X 
User B locks node X. 

Basically, a mutually exclusive lock for a checked  out node. 

In my pojo , I have the following method  which allows checkin only if the 
lockowner is the one who is trying to checkin

 public void checkin(String path)throws CMSException {
         pm = getPersistenceManager();
         try{
            if ((pm.isLocked(path))){
                String lockOwner = getLockOwner(); //get lockowner          
                if (lockOwner.equals(session.getUserID())){
                    String lockToken = doc.getLockToken();
                    pm.checkin(path);
                    pm.unlock(path,lockToken); //this call is already adding 
lock token in the session if that lock token is not present.
                }                            
            }
         }catch(Exception e){
             throw new CMSException(e.getMessage(),e.getCause());
         }
    }

May be in the above method , I can try  checkin() without checking for the node 
state (locked or unlocked), since now you have the check of checking in by the 
lockowner , already incorporated in CheckIfNodeIsLocked . This might just work 
. 
In  case lockowner is checking in , this succeeds  else throws exception.

For a better  understanding , see the following code for checkout.

 public void checkout(String path)throws CMSException {
        pm = getPersistenceManager();
         try{
            pm.checkout(path);
            if (!(pm.isLocked(path))){
                String lockToken = pm.lock(path,true,false);
                Document doc = this.getDocument(path);
                doc.setToken(lockToken);     //currently using property 
checkedOutBy for persisting lockToken, can be changed later 
                doc.save();
            }
         }catch(LockedException le){
           System.out.println("Error: " + le.getLockedNodePath() + " is locked 
by " + le.getLockOwner());  
         }catch(Exception e){
             throw new CMSException(e.getMessage(),e.getCause());
         }
    }



> jcr mapping layer (OCM) should expose lock owner
> ------------------------------------------------
>
>                 Key: JCR-922
>                 URL: https://issues.apache.org/jira/browse/JCR-922
>             Project: Jackrabbit
>          Issue Type: Improvement
>          Components: jcr-mapping
>    Affects Versions: 1.3
>            Reporter: ruchi goel
>         Assigned To: Christophe Lombart
>             Fix For: 1.3
>
>
> jcr mapping layer 's  persistencemanager.java  does not expose an API for 
> returning lockowner. Ideally   , the following method 
> public String lock(final String absPath, final boolean isDeep, final boolean 
> isSessionScoped) 
> should return a hashmap/String array containing locktoken as well as 
> lockowner. 
> I tried having lockowner as a field in my java object and mapping it to 
> jcr:lockOwner , so that I can just use getLockOwner() . But the problem is 
> this property gets introduced in the node only if  the node is locked. So, 
> when I try to insert a node , before I can even lock it , the insertion fails 
> since there is no property like jcr:lockOwner   till then . 
> So, I feel there is need for the above API. It is ok to have it exposed via 
> separate call in order to maintain backward compatability

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to