View Javadoc
1   /*
2    * Copyright (C) 2003-2007 eXo Platform SAS.
3    *
4    * This program is free software; you can redistribute it and/or
5    * modify it under the terms of the GNU Affero General Public License
6    * as published by the Free Software Foundation; either version 3
7    * of the License, or (at your option) any later version.
8    *
9    * This program is distributed in the hope that it will be useful,
10   * but WITHOUT ANY WARRANTY; without even the implied warranty of
11   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12   * GNU General Public License for more details.
13   *
14   * You should have received a copy of the GNU General Public License
15   * along with this program; if not, see<http://www.gnu.org/licenses/>.
16   */
17  package org.exoplatform.ecm.utils.lock;
18  
19  import java.util.HashMap;
20  import java.util.List;
21  import java.util.Map;
22  
23  import javax.jcr.Node;
24  import javax.jcr.NodeIterator;
25  import javax.jcr.Session;
26  import javax.jcr.lock.Lock;
27  import javax.jcr.query.Query;
28  import javax.jcr.query.QueryManager;
29  import javax.jcr.query.QueryResult;
30  
31  import org.exoplatform.services.cms.documents.TrashService;
32  import org.exoplatform.services.cms.lock.LockService;
33  import org.exoplatform.services.jcr.core.ManageableRepository;
34  import org.exoplatform.services.organization.MembershipType;
35  import org.exoplatform.services.organization.OrganizationService;
36  import org.exoplatform.services.security.ConversationState;
37  import org.exoplatform.services.security.IdentityConstants;
38  import org.exoplatform.services.wcm.utils.WCMCoreUtils;
39  
40  /**
41   * Created by The eXo Platform SARL
42   * Author : Dang Van Minh
43   *          minh.dang@exoplatform.com
44   * Sep 15, 2008 11:17:13 AM
45   */
46  public class LockUtil {
47  
48    public static void keepLock(Lock lock) throws Exception {
49      LockService lockService = WCMCoreUtils.getService(LockService.class);
50      String key = createLockKey(lock.getNode());
51      String userId = ConversationState.getCurrent().getIdentity().getUserId();
52      if(userId == null) userId = IdentityConstants.ANONIM;
53      Map<String,String> lockedNodesInfo = lockService.getLockInformation(userId);
54      if(lockedNodesInfo == null) {
55        lockedNodesInfo = new HashMap<String,String>();
56      }
57      lockedNodesInfo.put(key,lock.getLockToken());
58      lockService.putToLockHoding(userId, lockedNodesInfo);
59    }
60  
61    public static void keepLock(Lock lock, String userId) throws Exception {
62      String keyRoot = createLockKey(lock.getNode(), userId);
63      LockService lockService = WCMCoreUtils.getService(LockService.class);
64      Map<String,String> lockedNodesInfo = lockService.getLockInformation(userId);
65      if(lockedNodesInfo == null) {
66        lockedNodesInfo = new HashMap<String,String>();
67      }
68      lockedNodesInfo.put(keyRoot, lock.getLockToken());
69      lockService.putToLockHoding(userId, lockedNodesInfo);
70    }
71  
72    public static void keepLock(Lock lock, String userId, String lockToken) throws Exception {
73      LockService lockService = WCMCoreUtils.getService(LockService.class);
74      String keyRoot = createLockKey(lock.getNode(), userId);
75      Map<String,String> lockedNodesInfo = lockService.getLockInformation(userId);
76      if(lockedNodesInfo == null) {
77        lockedNodesInfo = new HashMap<String,String>();
78      }
79      lockedNodesInfo.put(keyRoot, lockToken);
80      lockService.putToLockHoding(userId, lockedNodesInfo);
81    }
82  
83    public static void removeLock(Node node) throws Exception {
84      String key = createLockKey(node);
85      String userId = ConversationState.getCurrent().getIdentity().getUserId();
86      LockService lockService = WCMCoreUtils.getService(LockService.class);
87      if(userId == null) userId = IdentityConstants.ANONIM;
88      Map<String,String> lockedNodesInfo = lockService.getLockInformation(userId);
89      if(lockedNodesInfo == null) return;
90      lockedNodesInfo.remove(key);
91    }
92  
93    public static void changeLockToken(Node oldNode, Node newNode) throws Exception {
94      WCMCoreUtils.getService(LockService.class).changeLockToken(oldNode, newNode);
95    }
96  
97    public static void changeLockToken(String srcPath, Node newNode) throws Exception {
98      WCMCoreUtils.getService(LockService.class).changeLockToken(srcPath, newNode);
99    }
100 
101   public static String getLockTokenOfUser(Node node) throws Exception {
102     return WCMCoreUtils.getService(LockService.class).getLockTokenOfUser(node);
103   }
104 
105   public static String getLockToken(Node node) throws Exception {
106     return WCMCoreUtils.getService(LockService.class).getLockToken(node);
107   }
108 
109   public static String getOldLockKey(String srcPath, Node node) throws Exception {
110     return WCMCoreUtils.getService(LockService.class).getOldLockKey(srcPath, node);
111   }
112 
113   public static String createLockKey(Node node) throws Exception {
114     return WCMCoreUtils.getService(LockService.class).createLockKey(node);
115   }
116 
117   public static String createLockKey(Node node, String userId) throws Exception {
118     return WCMCoreUtils.getService(LockService.class).createLockKey(node, userId);
119   }
120 
121   public static boolean isLocked(Node node) throws Exception {
122     if(!node.isLocked()) return false;
123     String lockToken = LockUtil.getLockTokenOfUser(node);
124     if(lockToken != null) {
125       node.getSession().addLockToken(LockUtil.getLockToken(node));
126       return false;
127     }
128     return true;
129   }
130 
131   /**
132    * update the lockCache by adding lockToken of all locked nodes for the given membership
133    * @param membership
134    * @throws Exception
135    */
136   @SuppressWarnings("unchecked")
137   public static void updateLockCache(String membership) throws Exception {
138     ManageableRepository repo = WCMCoreUtils.getRepository();
139     Session session = null;
140     OrganizationService service = WCMCoreUtils.getService(OrganizationService.class);
141     List<MembershipType> memberships = (List<MembershipType>) service.getMembershipTypeHandler().findMembershipTypes();
142 
143     //get all locked nodes
144     for (String ws : repo.getWorkspaceNames()) {
145       session = WCMCoreUtils.getSystemSessionProvider().getSession(ws, repo);
146       QueryManager queryManager = session.getWorkspace().getQueryManager();
147       Query query = queryManager.createQuery("SELECT * FROM mix:lockable order by exo:dateCreated DESC", Query.SQL);
148       QueryResult queryResult = query.execute();
149       for(NodeIterator iter = queryResult.getNodes(); iter.hasNext();) {
150         Node itemNode = iter.nextNode();
151         //add lockToken of this locked node to the given membership
152         if (!WCMCoreUtils.getService(TrashService.class).isInTrash(itemNode) && itemNode.isLocked()) {
153           String lockToken = getLockToken(itemNode);
154           keepLock(itemNode.getLock(), membership, lockToken);
155           if (membership.startsWith("*")) {
156             String lockTokenString = membership;
157             for (MembershipType m : memberships) {
158               lockTokenString = membership.replace("*", m.getName());
159               LockUtil.keepLock(itemNode.getLock(), lockTokenString, lockToken);
160             }
161           }
162         }
163       }
164     }
165   }
166 
167   /**
168    * Remove a membership from lock cache.
169    * If membership type is *, remove all memberships of specified group except ignored list
170    *
171    * @param removedMembership
172    * @param ignoredMemberships
173    * @throws Exception
174    */
175   @SuppressWarnings("unchecked")
176   public static void removeLockCache(String removedMembership, List<String> ignoredMemberships) throws Exception {
177     OrganizationService organizationService = WCMCoreUtils.getService(OrganizationService.class);
178     List<MembershipType> availMembershipTypes =
179         (List<MembershipType>) organizationService.getMembershipTypeHandler().findMembershipTypes();
180     HashMap<String, Map<String, String>> lockHolding = WCMCoreUtils.getService(LockService.class).getLockHolding();
181 
182     // Remove lock cache for specific membership
183     lockHolding.remove(removedMembership);
184 
185     // If membership type is *, remove all types except ignored list
186     if (removedMembership.startsWith("*")) {
187       for (MembershipType membershipType : availMembershipTypes) {
188         String membership = removedMembership.replace("*", membershipType.getName());
189         if (!ignoredMemberships.contains(membership)) {
190           lockHolding.remove(membership);
191         }
192       }
193     }
194   }
195 }