1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.opencastproject.editor;
22
23 import org.opencastproject.editor.api.EditorServiceException;
24 import org.opencastproject.editor.api.ErrorStatus;
25 import org.opencastproject.editor.api.LockData;
26
27 import com.google.common.cache.CacheBuilder;
28 import com.google.common.cache.CacheLoader;
29 import com.google.common.cache.LoadingCache;
30
31 import java.util.concurrent.TimeUnit;
32
33 public class EditorLock {
34
35 private static LoadingCache <String,LockData> lockedPackages;
36
37 public EditorLock(int timeout) {
38 lockedPackages = CacheBuilder.newBuilder().expireAfterWrite(timeout, TimeUnit.SECONDS).build(
39 new CacheLoader<String, LockData>() {
40
41 @Override
42 public LockData load(String mediapackageId) throws Exception {
43 return lockedPackages.getIfPresent(mediapackageId);
44 }
45 });
46 }
47
48 public void lock(String mediaPackage, LockData lockRequest) throws EditorServiceException {
49 LockData lockData = lockedPackages.getIfPresent(mediaPackage);
50
51 if (null != lockData) {
52 if (lockRequest.getUUID().equals(lockData.getUUID())) {
53 lockedPackages.refresh(mediaPackage);
54 } else {
55 String lockMessage = lockData.toString();
56 throw new EditorServiceException(lockMessage,ErrorStatus.MEDIAPACKAGE_LOCKED);
57 }
58 } else {
59 lockedPackages.put(mediaPackage, lockRequest);
60 }
61 }
62
63 public void unlock(String mediaPackage, LockData lockRequest) throws EditorServiceException {
64 LockData lockData = lockedPackages.getIfPresent(mediaPackage);
65
66 if (null != lockData) {
67 if (lockRequest.getUUID().equals(lockData.getUUID())) {
68 lockedPackages.invalidate(mediaPackage);
69 } else {
70 String lockMessage = "MediaPackage " + mediaPackage + lockData.toString();
71 throw new EditorServiceException(lockMessage,ErrorStatus.MEDIAPACKAGE_LOCKED);
72 }
73 }
74 }
75
76 public boolean isLocked(String mediaPackage) {
77 return (null != getLockData(mediaPackage));
78 }
79
80 public LockData getLockData(String mediaPackage) {
81 return lockedPackages.getIfPresent(mediaPackage);
82 }
83 }