Classes in this File | Line Coverage | Branch Coverage | Complexity | ||||
LockManager2 |
|
| 1.0;1 |
1 | /* | |
2 | * Licensed to the Apache Software Foundation (ASF) under one or more | |
3 | * contributor license agreements. See the NOTICE file distributed with | |
4 | * this work for additional information regarding copyright ownership. | |
5 | * The ASF licenses this file to You under the Apache License, Version 2.0 | |
6 | * (the "License"); you may not use this file except in compliance with | |
7 | * the License. You may obtain a copy of the License at | |
8 | * | |
9 | * http://www.apache.org/licenses/LICENSE-2.0 | |
10 | * | |
11 | * Unless required by applicable law or agreed to in writing, software | |
12 | * distributed under the License is distributed on an "AS IS" BASIS, | |
13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
14 | * See the License for the specific language governing permissions and | |
15 | * limitations under the License. | |
16 | */ | |
17 | package org.apache.commons.transaction.locking; | |
18 | ||
19 | import java.util.Set; | |
20 | ||
21 | /** | |
22 | * Extended version of a lock manager that also has global knowledge or all locks and should be | |
23 | * used as a delegate for all locking requests. This allows for things like deadlock detection. | |
24 | * | |
25 | * @version $Id: LockManager2.java 493628 2007-01-07 01:42:48Z joerg $ | |
26 | * @see MultiLevelLock | |
27 | * @see MultiLevelLock2 | |
28 | * @see LockManager | |
29 | * @see GenericLockManager | |
30 | * @see GenericLock | |
31 | * @since 1.1 | |
32 | */ | |
33 | public interface LockManager2 { | |
34 | ||
35 | /** | |
36 | * Determines if a lock is owner by an owner. <br> | |
37 | * | |
38 | * @param ownerId | |
39 | * a unique id identifying the entity that wants to check this | |
40 | * lock | |
41 | * @param resourceId | |
42 | * the resource to get the level for | |
43 | * @param lockLevel | |
44 | * the lock level to check | |
45 | * @return <code>true</code> if the owner has the lock, <code>false</code> otherwise | |
46 | * | |
47 | */ | |
48 | public boolean hasLock(Object ownerId, Object resourceId, int lockLevel); | |
49 | ||
50 | /** | |
51 | * Determines if a lock <em>could</em> be acquire <em>without</em> actually acquiring it. <br> | |
52 | * <br> | |
53 | * This method does not block, but immediatly returns. | |
54 | * | |
55 | * @param ownerId | |
56 | * a unique id identifying the entity that wants to check this | |
57 | * lock | |
58 | * @param resourceId | |
59 | * the resource to get the level for | |
60 | * @param targetLockLevel | |
61 | * the lock level to check | |
62 | * @param reentrant | |
63 | * <code>true</code> if this request shall not be influenced by | |
64 | * other locks held by the same owner | |
65 | * @return <code>true</code> if the lock could be acquired, <code>false</code> otherwise | |
66 | * | |
67 | */ | |
68 | public boolean checkLock(Object ownerId, Object resourceId, int targetLockLevel, boolean reentrant); | |
69 | ||
70 | /** | |
71 | * Tries to acquire a lock on a resource. <br> | |
72 | * <br> | |
73 | * This method does not block, but immediatly returns. If a lock is not | |
74 | * available <code>false</code> will be returned. | |
75 | * | |
76 | * @param ownerId | |
77 | * a unique id identifying the entity that wants to acquire this | |
78 | * lock | |
79 | * @param resourceId | |
80 | * the resource to get the level for | |
81 | * @param targetLockLevel | |
82 | * the lock level to acquire | |
83 | * @param reentrant | |
84 | * <code>true</code> if this request shall not be influenced by | |
85 | * other locks held by the same owner | |
86 | * @return <code>true</code> if the lock has been acquired, <code>false</code> otherwise | |
87 | * | |
88 | */ | |
89 | public boolean tryLock(Object ownerId, Object resourceId, int targetLockLevel, boolean reentrant); | |
90 | ||
91 | /** | |
92 | * Tries to acquire a lock on a resource. <br> | |
93 | * <br> | |
94 | * This method blocks and waits for the lock in case it is not avaiable. If | |
95 | * there is a timeout or a deadlock or the thread is interrupted a | |
96 | * LockException is thrown. | |
97 | * | |
98 | * @param ownerId | |
99 | * a unique id identifying the entity that wants to acquire this | |
100 | * lock | |
101 | * @param resourceId | |
102 | * the resource to get the level for | |
103 | * @param targetLockLevel | |
104 | * the lock level to acquire | |
105 | * @param reentrant | |
106 | * <code>true</code> if this request shall not be blocked by | |
107 | * other locks held by the same owner | |
108 | * @throws LockException | |
109 | * will be thrown when the lock can not be acquired | |
110 | */ | |
111 | public void lock(Object ownerId, Object resourceId, int targetLockLevel, boolean reentrant) | |
112 | throws LockException; | |
113 | ||
114 | /** | |
115 | * Tries to acquire a lock on a resource. <br> | |
116 | * <br> | |
117 | * This method blocks and waits for the lock in case it is not avaiable. If | |
118 | * there is a timeout or a deadlock or the thread is interrupted a | |
119 | * LockException is thrown. | |
120 | * | |
121 | * @param ownerId | |
122 | * a unique id identifying the entity that wants to acquire this | |
123 | * lock | |
124 | * @param resourceId | |
125 | * the resource to get the level for | |
126 | * @param targetLockLevel | |
127 | * the lock level to acquire | |
128 | * @param reentrant | |
129 | * <code>true</code> if this request shall not be blocked by | |
130 | * other locks held by the same owner | |
131 | * @param timeoutMSecs | |
132 | * specifies the maximum wait time in milliseconds | |
133 | * @throws LockException | |
134 | * will be thrown when the lock can not be acquired | |
135 | */ | |
136 | public void lock(Object ownerId, Object resourceId, int targetLockLevel, boolean reentrant, | |
137 | long timeoutMSecs) throws LockException; | |
138 | ||
139 | /** | |
140 | * Most flexible way to acquire a lock on a resource. <br> | |
141 | * <br> | |
142 | * This method blocks and waits for the lock in case it is not avaiable. If | |
143 | * there is a timeout or a deadlock or the thread is interrupted a | |
144 | * LockException is thrown. | |
145 | * | |
146 | * @param ownerId | |
147 | * a unique id identifying the entity that wants to acquire this | |
148 | * lock | |
149 | * @param resourceId | |
150 | * the resource to get the level for | |
151 | * @param targetLockLevel | |
152 | * the lock level to acquire | |
153 | * @param compatibility | |
154 | * {@link GenericLock#COMPATIBILITY_NONE}if no additional compatibility is | |
155 | * desired (same as reentrant set to false) , | |
156 | * {@link GenericLock#COMPATIBILITY_REENTRANT}if lock level by the same | |
157 | * owner shall not affect compatibility (same as reentrant set to | |
158 | * true), or {@link GenericLock#COMPATIBILITY_SUPPORT}if lock levels that | |
159 | * are the same as the desired shall not affect compatibility, or | |
160 | * finally {@link GenericLock#COMPATIBILITY_REENTRANT_AND_SUPPORT}which is | |
161 | * a combination of reentrant and support | |
162 | * @param preferred | |
163 | * in case this lock request is incompatible with existing ones | |
164 | * and we wait, it shall be granted before other waiting requests | |
165 | * that are not preferred | |
166 | * @param timeoutMSecs | |
167 | * specifies the maximum wait time in milliseconds | |
168 | * @throws LockException | |
169 | * will be thrown when the lock can not be acquired | |
170 | */ | |
171 | public void lock(Object ownerId, Object resourceId, int targetLockLevel, int compatibility, | |
172 | boolean preferred, long timeoutMSecs) throws LockException; | |
173 | ||
174 | /** | |
175 | * Starts a global timeout for an owner. This is especially usefull, when the owner is a | |
176 | * transaction. After a global timeout occurs all of the owner's lock will be released and | |
177 | * the owner will not be allowed to access any | |
178 | * locks before before calling {@link #releaseAll(Object)}. | |
179 | * | |
180 | * @param ownerId | |
181 | * a unique id identifying the entity that wants to acquire this | |
182 | * lock | |
183 | * @param timeoutMSecs | |
184 | * specifies the global timeout in milliseconds | |
185 | */ | |
186 | public void startGlobalTimeout(Object ownerId, long timeoutMSecs); | |
187 | ||
188 | /** | |
189 | * Gets the lock level held by certain owner on a certain resource. | |
190 | * | |
191 | * @param ownerId the id of the owner of the lock | |
192 | * @param resourceId the resource to get the level for | |
193 | */ | |
194 | public int getLevel(Object ownerId, Object resourceId); | |
195 | ||
196 | /** | |
197 | * Releases all locks for a certain resource held by a certain owner. | |
198 | * | |
199 | * @param ownerId the id of the owner of the lock | |
200 | * @param resourceId the resource to releases the lock for | |
201 | * @return <code>true</code> if the lock actually was released, <code>false</code> in case | |
202 | * there was no lock held by the owner | |
203 | */ | |
204 | public boolean release(Object ownerId, Object resourceId); | |
205 | ||
206 | /** | |
207 | * Releases all locks (partially) held by an owner. | |
208 | * | |
209 | * @param ownerId the id of the owner | |
210 | */ | |
211 | public void releaseAll(Object ownerId); | |
212 | ||
213 | /** | |
214 | * Gets all locks (partially) held by an owner. | |
215 | * | |
216 | * @param ownerId the id of the owner | |
217 | * @return all locks held by ownerId | |
218 | */ | |
219 | public Set getAll(Object ownerId); | |
220 | ||
221 | ||
222 | /** | |
223 | * Gets an existing lock on the specified resource. If none exists it returns <code>null</code>. | |
224 | * | |
225 | * @param resourceId the resource to get the lock for | |
226 | * @return the lock on the specified resource | |
227 | * | |
228 | */ | |
229 | public MultiLevelLock getLock(Object resourceId); | |
230 | ||
231 | /** | |
232 | * Removes the specified lock from the associated resource. | |
233 | * | |
234 | * <em>Caution:</em> This does not release the lock, but only moves it out | |
235 | * of the scope of this manager. Use {@link #release(Object, Object)} for that. | |
236 | * | |
237 | * @param lock the lock to be removed | |
238 | */ | |
239 | public void removeLock(MultiLevelLock lock); | |
240 | ||
241 | } |