1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
42
43
44
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
133
134
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
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
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
169
170
171
172
173
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
183 lockHolding.remove(removedMembership);
184
185
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 }