1 | |
package org.apache.ojb.broker.locking; |
2 | |
|
3 | |
|
4 | |
|
5 | |
|
6 | |
|
7 | |
|
8 | |
|
9 | |
|
10 | |
|
11 | |
|
12 | |
|
13 | |
|
14 | |
|
15 | |
|
16 | |
|
17 | |
|
18 | |
|
19 | |
import javax.servlet.ServletException; |
20 | |
import javax.servlet.ServletConfig; |
21 | |
import javax.servlet.http.HttpServlet; |
22 | |
import javax.servlet.http.HttpServletRequest; |
23 | |
import javax.servlet.http.HttpServletResponse; |
24 | |
import java.io.IOException; |
25 | |
import java.io.InputStream; |
26 | |
import java.io.ObjectInputStream; |
27 | |
import java.io.ObjectOutputStream; |
28 | |
import java.io.PrintWriter; |
29 | |
|
30 | |
import org.apache.commons.lang.math.NumberUtils; |
31 | |
import org.apache.ojb.broker.util.ClassHelper; |
32 | |
|
33 | |
|
34 | |
|
35 | |
|
36 | |
|
37 | |
public class LockManagerServlet extends HttpServlet |
38 | |
{ |
39 | |
protected static LockManager lockmanager; |
40 | |
static final String STR_LOCK_TIMEOUT = "lockTimeout"; |
41 | |
static final String STR_BLOCK_TIMEOUT = "blockTimeout"; |
42 | |
static final String STR_LOCK_MANAGER = "lockManager"; |
43 | |
|
44 | |
private static long numRequests; |
45 | |
private static Throwable lastError = null; |
46 | |
|
47 | |
public void init(ServletConfig servletConfig) throws ServletException |
48 | |
{ |
49 | |
super.init(servletConfig); |
50 | |
|
51 | |
if(lockmanager == null) |
52 | |
{ |
53 | |
lastError = null; |
54 | |
numRequests = 0; |
55 | |
String strLockManager = servletConfig.getInitParameter(STR_LOCK_MANAGER); |
56 | |
try |
57 | |
{ |
58 | |
lockmanager = (LockManager) (strLockManager != null ? |
59 | |
ClassHelper.newInstance(strLockManager) : ClassHelper.newInstance(LockManagerInMemoryImpl.class)); |
60 | |
} |
61 | |
catch(Exception e) |
62 | |
{ |
63 | |
lastError = new LockRuntimeException("Can't instance lock manager, init parameter 'lockManager': " + strLockManager); |
64 | |
e.printStackTrace(); |
65 | |
} |
66 | |
String strTimeout = servletConfig.getInitParameter(STR_LOCK_TIMEOUT); |
67 | |
if(NumberUtils.isNumber(strTimeout)) |
68 | |
{ |
69 | |
try |
70 | |
{ |
71 | |
Long lockTimeout = NumberUtils.createLong(strTimeout); |
72 | |
lockmanager.setLockTimeout(lockTimeout.longValue()); |
73 | |
} |
74 | |
catch(Exception e) |
75 | |
{ |
76 | |
if(lastError == null) |
77 | |
{ |
78 | |
lastError = new LockRuntimeException("Can't convert 'lockTimeout' init parameter: " + strTimeout); |
79 | |
} |
80 | |
e.printStackTrace(); |
81 | |
} |
82 | |
} |
83 | |
String strBlock = servletConfig.getInitParameter(STR_BLOCK_TIMEOUT); |
84 | |
if(NumberUtils.isNumber(strBlock)) |
85 | |
{ |
86 | |
try |
87 | |
{ |
88 | |
Long blockTimeout = NumberUtils.createLong(strBlock); |
89 | |
lockmanager.setLockTimeout(blockTimeout.longValue()); |
90 | |
} |
91 | |
catch(Exception e) |
92 | |
{ |
93 | |
if(lastError == null) |
94 | |
{ |
95 | |
lastError = new LockRuntimeException("Can't convert 'blockTimeout' init parameter: " + strBlock); |
96 | |
} |
97 | |
e.printStackTrace(); |
98 | |
} |
99 | |
} |
100 | |
} |
101 | |
} |
102 | |
|
103 | |
|
104 | |
|
105 | |
|
106 | |
protected void doGet(HttpServletRequest request, HttpServletResponse response) |
107 | |
throws ServletException, IOException |
108 | |
{ |
109 | |
response.setContentType("text/html"); |
110 | |
response.setHeader("Pragma", "no-cache"); |
111 | |
|
112 | |
PrintWriter out = response.getWriter(); |
113 | |
|
114 | |
out.println("<html><head><title>OJB Distributed Locking Servlet Status Page</title>"); |
115 | |
out.println("</head><body><h1>OJB Distributed Locking Servlet</h1>"); |
116 | |
out.println("The servlet is running.<p>"); |
117 | |
|
118 | |
if(lastError == null) |
119 | |
{ |
120 | |
out.println("The LockServer is running.<p>"); |
121 | |
out.println("LockManager info: " + lockmanager.getLockInfo() + "<p>"); |
122 | |
out.println("Processed Lock Request: " + numRequests + "<p>"); |
123 | |
} |
124 | |
else |
125 | |
{ |
126 | |
out.println("<h2>The LockServer has a problem!</h2>"); |
127 | |
out.println("The error message is:<p>"); |
128 | |
out.println(lastError.getMessage() + "<p>"); |
129 | |
lastError.printStackTrace(out); |
130 | |
lastError = null; |
131 | |
} |
132 | |
|
133 | |
out.println("</body></html>"); |
134 | |
} |
135 | |
|
136 | |
|
137 | |
|
138 | |
|
139 | |
protected void doPost(HttpServletRequest request, HttpServletResponse response) |
140 | |
throws ServletException, IOException |
141 | |
{ |
142 | |
|
143 | |
numRequests++; |
144 | |
|
145 | |
try |
146 | |
{ |
147 | |
|
148 | |
LockManagerRemoteImpl.LockInfo info = (LockManagerRemoteImpl.LockInfo) buildObjectFromRequest(request); |
149 | |
Object result = null; |
150 | |
|
151 | |
try |
152 | |
{ |
153 | |
switch(info.methodName) |
154 | |
{ |
155 | |
case LockManagerRemoteImpl.METHOD_READ_LOCK: |
156 | |
{ |
157 | |
result = new Boolean(lockmanager.readLock(info.key, info.resourceId, info.isolationLevel)); |
158 | |
break; |
159 | |
} |
160 | |
case LockManagerRemoteImpl.METHOD_RELEASE_SINGLE_LOCK: |
161 | |
{ |
162 | |
result = new Boolean(lockmanager.releaseLock(info.key, info.resourceId)); |
163 | |
break; |
164 | |
} |
165 | |
case LockManagerRemoteImpl.METHOD_RELEASE_LOCKS: |
166 | |
{ |
167 | |
lockmanager.releaseLocks(info.key); |
168 | |
result = Boolean.TRUE; |
169 | |
break; |
170 | |
} |
171 | |
case LockManagerRemoteImpl.METHOD_WRITE_LOCK: |
172 | |
{ |
173 | |
result = new Boolean(lockmanager.writeLock(info.key, info.resourceId, |
174 | |
info.isolationLevel)); |
175 | |
break; |
176 | |
} |
177 | |
case LockManagerRemoteImpl.METHOD_UPGRADE_LOCK: |
178 | |
{ |
179 | |
result = new Boolean(lockmanager.upgradeLock(info.key, info.resourceId, info.isolationLevel)); |
180 | |
break; |
181 | |
} |
182 | |
case LockManagerRemoteImpl.METHOD_CHECK_READ: |
183 | |
{ |
184 | |
result = new Boolean(lockmanager.hasRead(info.key, info.resourceId)); |
185 | |
break; |
186 | |
} |
187 | |
case LockManagerRemoteImpl.METHOD_CHECK_WRITE: |
188 | |
{ |
189 | |
result = new Boolean(lockmanager.hasWrite(info.key, info.resourceId)); |
190 | |
break; |
191 | |
} |
192 | |
case LockManagerRemoteImpl.METHOD_CHECK_UPGRADE: |
193 | |
{ |
194 | |
result = new Boolean(lockmanager.hasUpgrade(info.key, info.resourceId)); |
195 | |
break; |
196 | |
} |
197 | |
case LockManagerRemoteImpl.METHOD_LOCK_INFO: |
198 | |
{ |
199 | |
result = lockmanager.getLockInfo(); |
200 | |
break; |
201 | |
} |
202 | |
case LockManagerRemoteImpl.METHOD_LOCK_TIMEOUT: |
203 | |
{ |
204 | |
result = new Long(lockmanager.getLockTimeout()); |
205 | |
break; |
206 | |
} |
207 | |
case LockManagerRemoteImpl.METHOD_BLOCK_TIMEOUT: |
208 | |
{ |
209 | |
result = new Long(lockmanager.getBlockTimeout()); |
210 | |
break; |
211 | |
} |
212 | |
|
213 | |
|
214 | |
|
215 | |
|
216 | |
|
217 | |
|
218 | |
|
219 | |
|
220 | |
|
221 | |
|
222 | |
|
223 | |
default : |
224 | |
{ |
225 | |
throw new LockRuntimeException("Unknown command:" + info.methodName); |
226 | |
} |
227 | |
} |
228 | |
} |
229 | |
catch(RuntimeException e) |
230 | |
{ |
231 | |
result = new LockRuntimeException("Error while invoke specified method in servlet.", e); |
232 | |
} |
233 | |
|
234 | |
ObjectOutputStream oos = new ObjectOutputStream(response.getOutputStream()); |
235 | |
oos.writeObject(result); |
236 | |
oos.flush(); |
237 | |
oos.close(); |
238 | |
} |
239 | |
catch(Throwable t) |
240 | |
{ |
241 | |
lastError = t; |
242 | |
t.printStackTrace(); |
243 | |
} |
244 | |
} |
245 | |
|
246 | |
private Object buildObjectFromRequest(HttpServletRequest request) throws IOException, ClassNotFoundException |
247 | |
{ |
248 | |
Object obj = null; |
249 | |
|
250 | |
InputStream is = request.getInputStream(); |
251 | |
ObjectInputStream objInputStream = new ObjectInputStream(is); |
252 | |
obj = objInputStream.readObject(); |
253 | |
objInputStream.close(); |
254 | |
is.close(); |
255 | |
return obj; |
256 | |
} |
257 | |
} |