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    }