LockUtil.java
/*
* Copyright (C) 2003-2007 eXo Platform SAS.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see<http://www.gnu.org/licenses/>.
*/
package org.exoplatform.ecm.utils.lock;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.Session;
import javax.jcr.lock.Lock;
import javax.jcr.query.Query;
import javax.jcr.query.QueryManager;
import javax.jcr.query.QueryResult;
import org.exoplatform.services.cms.documents.TrashService;
import org.exoplatform.services.cms.lock.LockService;
import org.exoplatform.services.jcr.core.ManageableRepository;
import org.exoplatform.services.organization.MembershipType;
import org.exoplatform.services.organization.OrganizationService;
import org.exoplatform.services.security.ConversationState;
import org.exoplatform.services.security.IdentityConstants;
import org.exoplatform.services.wcm.utils.WCMCoreUtils;
/**
* Created by The eXo Platform SARL
* Author : Dang Van Minh
* minh.dang@exoplatform.com
* Sep 15, 2008 11:17:13 AM
*/
public class LockUtil {
public static void keepLock(Lock lock) throws Exception {
LockService lockService = WCMCoreUtils.getService(LockService.class);
String key = createLockKey(lock.getNode());
String userId = ConversationState.getCurrent().getIdentity().getUserId();
if(userId == null) userId = IdentityConstants.ANONIM;
Map<String,String> lockedNodesInfo = lockService.getLockInformation(userId);
if(lockedNodesInfo == null) {
lockedNodesInfo = new HashMap<String,String>();
}
lockedNodesInfo.put(key,lock.getLockToken());
lockService.putToLockHoding(userId, lockedNodesInfo);
}
public static void keepLock(Lock lock, String userId) throws Exception {
String keyRoot = createLockKey(lock.getNode(), userId);
LockService lockService = WCMCoreUtils.getService(LockService.class);
Map<String,String> lockedNodesInfo = lockService.getLockInformation(userId);
if(lockedNodesInfo == null) {
lockedNodesInfo = new HashMap<String,String>();
}
lockedNodesInfo.put(keyRoot, lock.getLockToken());
lockService.putToLockHoding(userId, lockedNodesInfo);
}
public static void keepLock(Lock lock, String userId, String lockToken) throws Exception {
LockService lockService = WCMCoreUtils.getService(LockService.class);
String keyRoot = createLockKey(lock.getNode(), userId);
Map<String,String> lockedNodesInfo = lockService.getLockInformation(userId);
if(lockedNodesInfo == null) {
lockedNodesInfo = new HashMap<String,String>();
}
lockedNodesInfo.put(keyRoot, lockToken);
lockService.putToLockHoding(userId, lockedNodesInfo);
}
public static void removeLock(Node node) throws Exception {
String key = createLockKey(node);
String userId = ConversationState.getCurrent().getIdentity().getUserId();
LockService lockService = WCMCoreUtils.getService(LockService.class);
if(userId == null) userId = IdentityConstants.ANONIM;
Map<String,String> lockedNodesInfo = lockService.getLockInformation(userId);
if(lockedNodesInfo == null) return;
lockedNodesInfo.remove(key);
}
public static void changeLockToken(Node oldNode, Node newNode) throws Exception {
WCMCoreUtils.getService(LockService.class).changeLockToken(oldNode, newNode);
}
public static void changeLockToken(String srcPath, Node newNode) throws Exception {
WCMCoreUtils.getService(LockService.class).changeLockToken(srcPath, newNode);
}
public static String getLockTokenOfUser(Node node) throws Exception {
return WCMCoreUtils.getService(LockService.class).getLockTokenOfUser(node);
}
public static String getLockToken(Node node) throws Exception {
return WCMCoreUtils.getService(LockService.class).getLockToken(node);
}
public static String getOldLockKey(String srcPath, Node node) throws Exception {
return WCMCoreUtils.getService(LockService.class).getOldLockKey(srcPath, node);
}
public static String createLockKey(Node node) throws Exception {
return WCMCoreUtils.getService(LockService.class).createLockKey(node);
}
public static String createLockKey(Node node, String userId) throws Exception {
return WCMCoreUtils.getService(LockService.class).createLockKey(node, userId);
}
public static boolean isLocked(Node node) throws Exception {
if(!node.isLocked()) return false;
String lockToken = LockUtil.getLockTokenOfUser(node);
if(lockToken != null) {
node.getSession().addLockToken(LockUtil.getLockToken(node));
return false;
}
return true;
}
/**
* update the lockCache by adding lockToken of all locked nodes for the given membership
* @param membership
* @throws Exception
*/
@SuppressWarnings("unchecked")
public static void updateLockCache(String membership) throws Exception {
ManageableRepository repo = WCMCoreUtils.getRepository();
Session session = null;
OrganizationService service = WCMCoreUtils.getService(OrganizationService.class);
List<MembershipType> memberships = (List<MembershipType>) service.getMembershipTypeHandler().findMembershipTypes();
//get all locked nodes
for (String ws : repo.getWorkspaceNames()) {
session = WCMCoreUtils.getSystemSessionProvider().getSession(ws, repo);
QueryManager queryManager = session.getWorkspace().getQueryManager();
Query query = queryManager.createQuery("SELECT * FROM mix:lockable order by exo:dateCreated DESC", Query.SQL);
QueryResult queryResult = query.execute();
for(NodeIterator iter = queryResult.getNodes(); iter.hasNext();) {
Node itemNode = iter.nextNode();
//add lockToken of this locked node to the given membership
if (!WCMCoreUtils.getService(TrashService.class).isInTrash(itemNode) && itemNode.isLocked()) {
String lockToken = getLockToken(itemNode);
keepLock(itemNode.getLock(), membership, lockToken);
if (membership.startsWith("*")) {
String lockTokenString = membership;
for (MembershipType m : memberships) {
lockTokenString = membership.replace("*", m.getName());
LockUtil.keepLock(itemNode.getLock(), lockTokenString, lockToken);
}
}
}
}
}
}
/**
* Remove a membership from lock cache.
* If membership type is *, remove all memberships of specified group except ignored list
*
* @param removedMembership
* @param ignoredMemberships
* @throws Exception
*/
@SuppressWarnings("unchecked")
public static void removeLockCache(String removedMembership, List<String> ignoredMemberships) throws Exception {
OrganizationService organizationService = WCMCoreUtils.getService(OrganizationService.class);
List<MembershipType> availMembershipTypes =
(List<MembershipType>) organizationService.getMembershipTypeHandler().findMembershipTypes();
HashMap<String, Map<String, String>> lockHolding = WCMCoreUtils.getService(LockService.class).getLockHolding();
// Remove lock cache for specific membership
lockHolding.remove(removedMembership);
// If membership type is *, remove all types except ignored list
if (removedMembership.startsWith("*")) {
for (MembershipType membershipType : availMembershipTypes) {
String membership = removedMembership.replace("*", membershipType.getName());
if (!ignoredMemberships.contains(membership)) {
lockHolding.remove(membership);
}
}
}
}
}