001 package org.apache.ojb.broker.locking;
002
003 /* Copyright 2004-2005 The Apache Software Foundation
004 *
005 * Licensed under the Apache License, Version 2.0 (the "License");
006 * you may not use this file except in compliance with the License.
007 * You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017
018
019 import javax.servlet.ServletException;
020 import javax.servlet.ServletConfig;
021 import javax.servlet.http.HttpServlet;
022 import javax.servlet.http.HttpServletRequest;
023 import javax.servlet.http.HttpServletResponse;
024 import java.io.IOException;
025 import java.io.InputStream;
026 import java.io.ObjectInputStream;
027 import java.io.ObjectOutputStream;
028 import java.io.PrintWriter;
029
030 import org.apache.commons.lang.math.NumberUtils;
031 import org.apache.ojb.broker.util.ClassHelper;
032
033
034 /**
035 * @author Thomas Mahler
036 */
037 public class LockManagerServlet extends HttpServlet
038 {
039 protected static LockManager lockmanager;
040 static final String STR_LOCK_TIMEOUT = "lockTimeout";
041 static final String STR_BLOCK_TIMEOUT = "blockTimeout";
042 static final String STR_LOCK_MANAGER = "lockManager";
043
044 private static long numRequests;
045 private static Throwable lastError = null;
046
047 public void init(ServletConfig servletConfig) throws ServletException
048 {
049 super.init(servletConfig);
050 // if lock manager was instantiated not yet
051 if(lockmanager == null)
052 {
053 lastError = null;
054 numRequests = 0;
055 String strLockManager = servletConfig.getInitParameter(STR_LOCK_MANAGER);
056 try
057 {
058 lockmanager = (LockManager) (strLockManager != null ?
059 ClassHelper.newInstance(strLockManager) : ClassHelper.newInstance(LockManagerInMemoryImpl.class));
060 }
061 catch(Exception e)
062 {
063 lastError = new LockRuntimeException("Can't instance lock manager, init parameter 'lockManager': " + strLockManager);
064 e.printStackTrace();
065 }
066 String strTimeout = servletConfig.getInitParameter(STR_LOCK_TIMEOUT);
067 if(NumberUtils.isNumber(strTimeout))
068 {
069 try
070 {
071 Long lockTimeout = NumberUtils.createLong(strTimeout);
072 lockmanager.setLockTimeout(lockTimeout.longValue());
073 }
074 catch(Exception e)
075 {
076 if(lastError == null)
077 {
078 lastError = new LockRuntimeException("Can't convert 'lockTimeout' init parameter: " + strTimeout);
079 }
080 e.printStackTrace();
081 }
082 }
083 String strBlock = servletConfig.getInitParameter(STR_BLOCK_TIMEOUT);
084 if(NumberUtils.isNumber(strBlock))
085 {
086 try
087 {
088 Long blockTimeout = NumberUtils.createLong(strBlock);
089 lockmanager.setLockTimeout(blockTimeout.longValue());
090 }
091 catch(Exception e)
092 {
093 if(lastError == null)
094 {
095 lastError = new LockRuntimeException("Can't convert 'blockTimeout' init parameter: " + strBlock);
096 }
097 e.printStackTrace();
098 }
099 }
100 }
101 }
102
103 /* (non-Javadoc)
104 * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
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 /* (non-Javadoc)
137 * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
138 */
139 protected void doPost(HttpServletRequest request, HttpServletResponse response)
140 throws ServletException, IOException
141 {
142 // update counter
143 numRequests++;
144
145 try
146 {
147 // read request:
148 LockManagerRemoteImpl.LockInfo info = (LockManagerRemoteImpl.LockInfo) buildObjectFromRequest(request);
149 Object result = null;
150 // now execute the command specified by the selector
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 // case LockManagerRemoteImpl.METHOD_LOCK_TIMEOUT_SET:
213 // {
214 // lockmanager.setLockTimeout(info.lockTimeout);
215 // break;
216 // }
217 //
218 // case LockManagerRemoteImpl.METHOD_BLOCK_TIMEOUT_SET:
219 // {
220 // lockmanager.setBlockTimeout(info.blockTimeout);
221 // break;
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 // get the body of the request as binary data
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 }