01: /*
02: * hgcommons 7
03: * Hammurapi Group Common Library
04: * Copyright (C) 2003 Hammurapi Group
05: *
06: * This program is free software; you can redistribute it and/or
07: * modify it under the terms of the GNU Lesser General Public
08: * License as published by the Free Software Foundation; either
09: * version 2 of the License, or (at your option) any later version.
10: *
11: * This program is distributed in the hope that it will be useful,
12: * but WITHOUT ANY WARRANTY; without even the implied warranty of
13: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14: * Lesser General Public License for more details.
15: *
16: * You should have received a copy of the GNU Lesser General Public
17: * License along with this library; if not, write to the Free Software
18: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19: *
20: * URL: http://www.hammurapi.biz/hammurapi-biz/ef/xmenu/hammurapi-group/products/products/hgcommons/index.html
21: * e-Mail: support@hammurapi.biz
22: */
23:
24: package biz.hammurapi.util;
25:
26: import java.util.LinkedList;
27:
28: /**
29: * Has internal invocation queue and pumps all invocation to be made
30: * from a single thread. A workaround to use thread-unsafe classes in
31: * multithreaded environment.
32: * @author Pavel Vlasov
33: * @version $Revision: 1.3 $
34: */
35: public class InvocationPump {
36: private LinkedList queue = new LinkedList();
37:
38: protected abstract class Command {
39: private Object returnValue;
40: private Throwable exception;
41:
42: /**
43: * Put single-threaded functionality here
44: */
45: protected abstract Object execute() throws Throwable;
46:
47: /**
48: * Posts the command to the queue and waits
49: * until it is executed
50: */
51: public synchronized Object post() throws Throwable {
52: synchronized (queue) {
53: queue.add(this );
54: queue.notifyAll();
55: }
56:
57: wait();
58:
59: if (exception != null) {
60: throw exception;
61: }
62:
63: return returnValue;
64: }
65: }
66:
67: public void pump() {
68: synchronized (queue) {
69: if (!queue.isEmpty()) {
70: Command command = (Command) queue.removeFirst();
71: try {
72: command.returnValue = command.execute();
73: } catch (Throwable th) {
74: command.exception = th;
75: }
76:
77: synchronized (command) {
78: command.notifyAll();
79: }
80: }
81: }
82: }
83: }
|