Classes in this File | Line Coverage | Branch Coverage | Complexity | ||||
ResourceManager |
|
| 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.file; | |
18 | ||
19 | import java.io.InputStream; | |
20 | import java.io.OutputStream; | |
21 | ||
22 | import javax.transaction.Status; | |
23 | ||
24 | /** | |
25 | * Interface for resource managers. | |
26 | * | |
27 | * A resource manager is an entity | |
28 | * that manages the processing and administration of resources. | |
29 | * | |
30 | * What is specified here are methods | |
31 | * <ul> | |
32 | * <li>for tasks related to starting and stopping of the resource manager | |
33 | * <li>for transaction management, like | |
34 | * starting, rolling back and committing of transactions | |
35 | * <li>to set and get transaction timeouts | |
36 | * <li>to set the isolation level of a transaction | |
37 | * <li>for the general administration of resources | |
38 | * <li>for reading and writing of resources | |
39 | * </ul> | |
40 | * | |
41 | * @version $Id: ResourceManager.java 513490 2007-03-01 20:46:28Z ozeigermann $ | |
42 | */ | |
43 | public interface ResourceManager extends Status { | |
44 | ||
45 | /** | |
46 | * Isolation level <b>read uncommitted</b>: data written by other transactions can be read even before they commit | |
47 | */ | |
48 | public final static int ISOLATION_LEVEL_READ_UNCOMMITTED = 0; | |
49 | ||
50 | /** | |
51 | * Isolation level <b>read committed</b>: data written by other transactions can be read after they commit | |
52 | */ | |
53 | public final static int ISOLATION_LEVEL_READ_COMMITTED = 10; | |
54 | ||
55 | /** | |
56 | * Isolation level <b>repeatable read</b>: data written by other transactions can be read after they commit if this transaction has not read this data before | |
57 | */ | |
58 | public final static int ISOLATION_LEVEL_REPEATABLE_READ = 50; | |
59 | ||
60 | /** | |
61 | * Isolation level <b>serializable</b>: result of other transactions will not influence the result of this transaction in any way | |
62 | */ | |
63 | public final static int ISOLATION_LEVEL_SERIALIZABLE = 100; | |
64 | ||
65 | /** | |
66 | * Shutdown mode: Wait for all transactions to complete | |
67 | */ | |
68 | public final static int SHUTDOWN_MODE_NORMAL = 0; | |
69 | ||
70 | /** | |
71 | * Shutdown mode: Try to roll back all active transactions | |
72 | */ | |
73 | public final static int SHUTDOWN_MODE_ROLLBACK = 1; | |
74 | ||
75 | /** | |
76 | * Shutdown mode: Try to stop active transaction <em>NOW</em>, do no rollbacks | |
77 | */ | |
78 | public final static int SHUTDOWN_MODE_KILL = 2; | |
79 | ||
80 | /** | |
81 | * Prepare result: resource manager guarantees a successful commit | |
82 | */ | |
83 | public final static int PREPARE_SUCCESS = 1; | |
84 | ||
85 | /** | |
86 | * Prepare result: resource manager guarantees a successful commit as there is nothing to commit | |
87 | */ | |
88 | public final static int PREPARE_SUCCESS_READONLY = 2; | |
89 | ||
90 | /** | |
91 | * Prepare result: transaction can not commit | |
92 | */ | |
93 | public final static int PREPARE_FAILURE = -1; | |
94 | ||
95 | /** | |
96 | * Starts this resource manager. A resource manager must be started before transactions | |
97 | * can be started or any operations on transactions can be executed. | |
98 | * | |
99 | * @throws ResourceManagerSystemException if start failed due to internal problems | |
100 | */ | |
101 | public void start() throws ResourceManagerSystemException; | |
102 | ||
103 | /** | |
104 | * Tries to stop this resource manager within the given timeout. | |
105 | * | |
106 | * @param mode one of {@link #SHUTDOWN_MODE_NORMAL}, {@link #SHUTDOWN_MODE_ROLLBACK} or {@link #SHUTDOWN_MODE_KILL} | |
107 | * @param timeoutMSecs timeout for shutdown in milliseconds | |
108 | * @return <code>true</code> if resource manager stopped within given timeout | |
109 | * @throws ResourceManagerSystemException if something fatal hapened during shutdown | |
110 | */ | |
111 | public boolean stop(int mode, long timeoutMSecs) throws ResourceManagerSystemException; | |
112 | ||
113 | /** | |
114 | * Tries to stop this resource manager within a default timeout. | |
115 | * | |
116 | * @param mode one of predefined shutdown modes {@link #SHUTDOWN_MODE_NORMAL}, {@link #SHUTDOWN_MODE_ROLLBACK} or {@link #SHUTDOWN_MODE_KILL} | |
117 | * or any other int representing a shutdown mode | |
118 | * @return <code>true</code> if resource manager stopped within given timeout | |
119 | * @throws ResourceManagerSystemException if anything fatal hapened during shutdown | |
120 | */ | |
121 | public boolean stop(int mode) throws ResourceManagerSystemException; | |
122 | ||
123 | /** | |
124 | * Tries to bring this resource manager back to a consistent state. | |
125 | * Might be called after system failure. An administrator might be forced | |
126 | * to fix system errors outside this resource manager to actually make | |
127 | * recovery possible. E.g. there may be a need for more disk space or | |
128 | * a network connection must be reestablished. | |
129 | * | |
130 | * @return <code>true</code> upon successful recovery of the resource manager | |
131 | * @throws ResourceManagerSystemException if anything fatal hapened during recovery | |
132 | */ | |
133 | public boolean recover() throws ResourceManagerSystemException; | |
134 | ||
135 | /** | |
136 | * Gets the default isolation level as an integer. | |
137 | * The higher the value the higher the isolation. | |
138 | * | |
139 | * @return one of the predefined isolation levels {@link #ISOLATION_LEVEL_READ_UNCOMMITTED}, | |
140 | * {@link #ISOLATION_LEVEL_READ_COMMITTED}, {@link #ISOLATION_LEVEL_REPEATABLE_READ} or {@link #ISOLATION_LEVEL_SERIALIZABLE} | |
141 | * or any other int representing an isolation level | |
142 | * @throws ResourceManagerException if an error occured | |
143 | */ | |
144 | public int getDefaultIsolationLevel() throws ResourceManagerException; | |
145 | ||
146 | /** | |
147 | * Gets an array of all isolation levels supported by this resource manager. | |
148 | * This array must not be <code>null</code> or empty as every resource manager has some sort of isolation level. | |
149 | * | |
150 | * @return array of the predefined isolation levels {@link #ISOLATION_LEVEL_READ_UNCOMMITTED}, | |
151 | * {@link #ISOLATION_LEVEL_READ_COMMITTED}, {@link #ISOLATION_LEVEL_REPEATABLE_READ} or {@link #ISOLATION_LEVEL_SERIALIZABLE} | |
152 | * or any other int representing an isolation level | |
153 | * @throws ResourceManagerException if an error occured | |
154 | * @see #getDefaultIsolationLevel | |
155 | */ | |
156 | public int[] getSupportedIsolationLevels() throws ResourceManagerException; | |
157 | ||
158 | /** | |
159 | * Tests if the specified isolation level is supported by this resource manager. | |
160 | * | |
161 | * @param level isolation level whose support is to be tested | |
162 | * @return <code>true</code> if the isolation level is supported | |
163 | * @throws ResourceManagerException if an error occured | |
164 | * @see #getDefaultIsolationLevel | |
165 | */ | |
166 | public boolean isIsolationLevelSupported(int level) throws ResourceManagerException; | |
167 | ||
168 | /** | |
169 | * Gets the isolation level for the specified transaction. | |
170 | * | |
171 | * @param txId identifier for the concerned transaction | |
172 | * @return one of the predefined isolation levels {@link #ISOLATION_LEVEL_READ_UNCOMMITTED}, | |
173 | * {@link #ISOLATION_LEVEL_READ_COMMITTED}, {@link #ISOLATION_LEVEL_REPEATABLE_READ} or {@link #ISOLATION_LEVEL_SERIALIZABLE} | |
174 | * or any other int representing an isolation level | |
175 | * @throws ResourceManagerException if an error occured | |
176 | * @see #getDefaultIsolationLevel | |
177 | */ | |
178 | public int getIsolationLevel(Object txId) throws ResourceManagerException; | |
179 | ||
180 | /** | |
181 | * Sets the isolation level for the specified transaction. | |
182 | * <br> | |
183 | * <em>Caution</em>: Implementations are likely to forbid changing the isolation level after any operations | |
184 | * have been executed inside the specified transaction. | |
185 | * | |
186 | * @param txId identifier for the concerned transaction | |
187 | * @param level one of the predefined isolation levels {@link #ISOLATION_LEVEL_READ_UNCOMMITTED}, | |
188 | * {@link #ISOLATION_LEVEL_READ_COMMITTED}, {@link #ISOLATION_LEVEL_REPEATABLE_READ} or {@link #ISOLATION_LEVEL_SERIALIZABLE} | |
189 | * or any other int representing an isolation level | |
190 | * @throws ResourceManagerException if an error occured | |
191 | * @see #getDefaultIsolationLevel | |
192 | */ | |
193 | public void setIsolationLevel(Object txId, int level) throws ResourceManagerException; | |
194 | ||
195 | /** | |
196 | * Gets the default transaction timeout in milliseconds. | |
197 | * After this time expires and the concerned transaction has not finished | |
198 | * - either rolled back or committed - the resource manager is allowed and | |
199 | * also encouraged - but not required - to abort the transaction and to roll it back. | |
200 | * | |
201 | * @return default transaction timeout in milliseconds | |
202 | * @throws ResourceManagerException if an error occured | |
203 | */ | |
204 | public long getDefaultTransactionTimeout() throws ResourceManagerException; | |
205 | ||
206 | /** | |
207 | * Gets the transaction timeout of the specified transaction in milliseconds. | |
208 | * | |
209 | * @param txId identifier for the concerned transaction | |
210 | * @return transaction timeout of the specified transaction in milliseconds | |
211 | * @throws ResourceManagerException if an error occured | |
212 | * @see #getDefaultTransactionTimeout | |
213 | */ | |
214 | public long getTransactionTimeout(Object txId) throws ResourceManagerException; | |
215 | ||
216 | /** | |
217 | * Sets the transaction timeout of the specified transaction in milliseconds. | |
218 | * | |
219 | * @param txId identifier for the concerned transaction | |
220 | * @param mSecs transaction timeout of the specified transaction in milliseconds | |
221 | * @throws ResourceManagerException if an error occured | |
222 | * @see #getDefaultTransactionTimeout | |
223 | */ | |
224 | public void setTransactionTimeout(Object txId, long mSecs) throws ResourceManagerException; | |
225 | ||
226 | /** | |
227 | * Creates and starts a transaction using the specified transaction identifier. | |
228 | * The identifier needs to be unique to this resource manager. | |
229 | * As there is no transaction object returned all access to the transaction | |
230 | * needs to be addressed to this resource manager. | |
231 | * | |
232 | * @param txId identifier for the transaction to be started | |
233 | * @throws ResourceManagerException if an error occured | |
234 | */ | |
235 | public void startTransaction(Object txId) throws ResourceManagerException; | |
236 | ||
237 | /** | |
238 | * Prepares the transaction specified by the given transaction identifier for commit. | |
239 | * The preparation may either succeed ({@link #PREPARE_SUCCESS}), | |
240 | * succeed as there is nothing to commit ({@link #PREPARE_SUCCESS_READONLY}) | |
241 | * or fail ({@link #PREPARE_FAILURE}). If the preparation fails, commit will | |
242 | * fail as well and the transaction should be marked for rollback. However, if it | |
243 | * succeeds the resource manager must guarantee that a following commit will succeed as well. | |
244 | * | |
245 | * <br><br> | |
246 | * An alternative way to singal a <em>failed</em> status is to throw an exception. | |
247 | * | |
248 | * @param txId identifier for the transaction to be prepared | |
249 | * @return result of the preparation effort, either {@link #PREPARE_SUCCESS}, {@link #PREPARE_SUCCESS_READONLY} or {@link #PREPARE_FAILURE} | |
250 | * @throws ResourceManagerException alternative way to signal prepare failed | |
251 | */ | |
252 | public int prepareTransaction(Object txId) throws ResourceManagerException; | |
253 | ||
254 | /** | |
255 | * Marks the transaction specified by the given transaction identifier for rollback. | |
256 | * This means, even though the transaction is not actually finished, no other operation | |
257 | * than <code>rollback</code> is permitted. | |
258 | * | |
259 | * @param txId identifier for the transaction to be marked for rollback | |
260 | * @throws ResourceManagerException if an error occured | |
261 | */ | |
262 | public void markTransactionForRollback(Object txId) throws ResourceManagerException; | |
263 | ||
264 | /** | |
265 | * Rolls back the transaction specified by the given transaction identifier. | |
266 | * After roll back the resource manager is allowed to forget about | |
267 | * the associated transaction. | |
268 | * | |
269 | * @param txId identifier for the transaction to be rolled back | |
270 | * @throws ResourceManagerException if an error occured | |
271 | */ | |
272 | public void rollbackTransaction(Object txId) throws ResourceManagerException; | |
273 | ||
274 | /** | |
275 | * Commis the transaction specified by the given transaction identifier. | |
276 | * After commit the resource manager is allowed to forget about | |
277 | * the associated transaction. | |
278 | * | |
279 | * @param txId identifier for the transaction to be committed | |
280 | * @throws ResourceManagerException if an error occured | |
281 | */ | |
282 | public void commitTransaction(Object txId) throws ResourceManagerException; | |
283 | ||
284 | /** | |
285 | * Gets the state of the transaction specified by the given transaction identifier. | |
286 | * The state will be expressed by an <code>int</code> code as defined | |
287 | * in the {@link javax.transaction.Status} interface. | |
288 | * | |
289 | * @param txId identifier for the transaction for which the state is returned | |
290 | * @return state of the transaction as defined in {@link javax.transaction.Status} | |
291 | * @throws ResourceManagerException if an error occured | |
292 | */ | |
293 | public int getTransactionState(Object txId) throws ResourceManagerException; | |
294 | ||
295 | /** | |
296 | * Explicitly locks a resource. Although locking must be done implicitly by methods | |
297 | * creating, reading or modifying resources, there may be cases when you want to do this | |
298 | * explicitly.<br> | |
299 | * | |
300 | *<br> | |
301 | * <em>Note</em>: By intention the order of parameters (<code>txId</code> does not come first) is different than in other methods of this interface. | |
302 | * This is done to make clear locking affects all transactions, not only the locking one. | |
303 | * This should be clear anyhow, but seems to be worth noting. | |
304 | * | |
305 | * @param resourceId identifier for the resource to be locked | |
306 | * @param txId identifier for the transaction that tries to acquire a lock | |
307 | * @param shared <code>true</code> if this lock may be shared by other <em>shared</em> locks | |
308 | * @param wait <code>true</code> if the method shall block when lock can not be acquired now | |
309 | * @param timeoutMSecs timeout in milliseconds | |
310 | * @param reentrant <code>true</code> if the lock should be acquired even when the <em>requesting transaction and no other</em> holds an incompatible lock | |
311 | * @return <code>true</code> when the lock has been acquired | |
312 | * @throws ResourceManagerException if an error occured | |
313 | */ | |
314 | public boolean lockResource( | |
315 | Object resourceId, | |
316 | Object txId, | |
317 | boolean shared, | |
318 | boolean wait, | |
319 | long timeoutMSecs, | |
320 | boolean reentrant) | |
321 | throws ResourceManagerException; | |
322 | ||
323 | /** | |
324 | * Explicitly locks a resource in reentrant style. This method blocks until the lock | |
325 | * actually can be acquired or the transaction times out. | |
326 | * | |
327 | * @param resourceId identifier for the resource to be locked | |
328 | * @param txId identifier for the transaction that tries to acquire a lock | |
329 | * @param shared <code>true</code> if this lock may be shared by other <em>shared</em> locks | |
330 | * @throws ResourceManagerException if an error occured | |
331 | * @see #lockResource(Object, Object, boolean, boolean, long, boolean) | |
332 | */ | |
333 | public boolean lockResource(Object resourceId, Object txId, boolean shared) throws ResourceManagerException; | |
334 | ||
335 | /** | |
336 | * Explicitly locks a resource exclusively, i.e. for writing, in reentrant style. This method blocks until the lock | |
337 | * actually can be acquired or the transaction times out. | |
338 | * | |
339 | * @param resourceId identifier for the resource to be locked | |
340 | * @param txId identifier for the transaction that tries to acquire a lock | |
341 | * @throws ResourceManagerException if an error occured | |
342 | * @see #lockResource(Object, Object, boolean) | |
343 | * @see #lockResource(Object, Object, boolean, boolean, long, boolean) | |
344 | */ | |
345 | public boolean lockResource(Object resourceId, Object txId) throws ResourceManagerException; | |
346 | ||
347 | /** | |
348 | * Checks if a resource exists. | |
349 | * | |
350 | * @param txId identifier for the transaction in which the resource is to be checked for | |
351 | * @param resourceId identifier for the resource to check for | |
352 | * @return <code>true</code> if the resource exists | |
353 | * @throws ResourceManagerException if an error occured | |
354 | */ | |
355 | public boolean resourceExists(Object txId, Object resourceId) throws ResourceManagerException; | |
356 | ||
357 | /** | |
358 | * Checks if a resource exists wihtout being in a transaction. This means only take | |
359 | * into account resources already globally commited. | |
360 | * | |
361 | * @param resourceId identifier for the resource to check for | |
362 | * @return <code>true</code> if the resource exists | |
363 | * @throws ResourceManagerException if an error occured | |
364 | */ | |
365 | public boolean resourceExists(Object resourceId) throws ResourceManagerException; | |
366 | ||
367 | /** | |
368 | * Deletes a resource. | |
369 | * | |
370 | * @param txId identifier for the transaction in which the resource is to be deleted | |
371 | * @param resourceId identifier for the resource to be deleted | |
372 | * @throws ResourceManagerException if the resource does not exist or any other error occured | |
373 | */ | |
374 | public void deleteResource(Object txId, Object resourceId) throws ResourceManagerException; | |
375 | ||
376 | /** | |
377 | * Deletes a resource. | |
378 | * | |
379 | * @param txId identifier for the transaction in which the resource is to be deleted | |
380 | * @param resourceId identifier for the resource to be deleted | |
381 | * @param assureOnly if set to <code>true</code> this method will not throw an exception when the resource does not exist | |
382 | * @throws ResourceManagerException if the resource does not exist and <code>assureOnly</code> was not set to <code>true</code> or any other error occured | |
383 | */ | |
384 | public void deleteResource(Object txId, Object resourceId, boolean assureOnly) throws ResourceManagerException; | |
385 | ||
386 | /** | |
387 | * Creates a resource. | |
388 | * | |
389 | * @param txId identifier for the transaction in which the resource is to be created | |
390 | * @param resourceId identifier for the resource to be created | |
391 | * @throws ResourceManagerException if the resource already exist or any other error occured | |
392 | */ | |
393 | public void createResource(Object txId, Object resourceId) throws ResourceManagerException; | |
394 | ||
395 | /** | |
396 | * Creates a resource. | |
397 | * | |
398 | * @param txId identifier for the transaction in which the resource is to be created | |
399 | * @param resourceId identifier for the resource to be created | |
400 | * @param assureOnly if set to <code>true</code> this method will not throw an exception when the resource already exists | |
401 | * @throws ResourceManagerException if the resource already exists and <code>assureOnly</code> was not set to <code>true</code> or any other error occured | |
402 | */ | |
403 | public void createResource(Object txId, Object resourceId, boolean assureOnly) throws ResourceManagerException; | |
404 | ||
405 | /** | |
406 | * Opens a streamable resource for reading. | |
407 | * | |
408 | * <br><br> | |
409 | * <em>Important</em>: By contract, the application is responsible for closing the stream after its work is finished. | |
410 | * | |
411 | * @param txId identifier for the transaction in which the streamable resource is to be openend | |
412 | * @param resourceId identifier for the streamable resource to be opened | |
413 | * @return stream to read from | |
414 | * @throws ResourceManagerException if the resource does not exist or any other error occured | |
415 | */ | |
416 | public InputStream readResource(Object txId, Object resourceId) throws ResourceManagerException; | |
417 | ||
418 | /** | |
419 | * Opens a streamable resource for a single reading request not inside the scope of a transaction. | |
420 | * | |
421 | * <br><br> | |
422 | * <em>Important</em>: By contract, the application is responsible for closing the stream after its work is finished. | |
423 | * | |
424 | * @param resourceId identifier for the streamable resource to be opened | |
425 | * @return stream to read from | |
426 | * @throws ResourceManagerException if the resource does not exist or any other error occured | |
427 | */ | |
428 | public InputStream readResource(Object resourceId) throws ResourceManagerException; | |
429 | ||
430 | /** | |
431 | * Opens a resource for writing. | |
432 | * | |
433 | * <br><br> | |
434 | * <em>Important</em>: By contract, the application is responsible for closing the stream after its work is finished. | |
435 | * | |
436 | * @param txId identifier for the transaction in which the streamable resource is to be openend | |
437 | * @param resourceId identifier for the streamable resource to be opened | |
438 | * @return stream to write to | |
439 | * @throws ResourceManagerException if the resource does not exist or any other error occured | |
440 | */ | |
441 | public OutputStream writeResource(Object txId, Object resourceId) throws ResourceManagerException; | |
442 | } |