KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > mortbay > servlet > AdminServlet


1 // ========================================================================
2
// $Id: AdminServlet.java,v 1.13 2005/08/13 00:01:28 gregwilkins Exp $
3
// Copyright 1996-2004 Mort Bay Consulting Pty. Ltd.
4
// ------------------------------------------------------------------------
5
// Licensed under the Apache License, Version 2.0 (the "License");
6
// you may not use this file except in compliance with the License.
7
// You may obtain a copy of the License at
8
// http://www.apache.org/licenses/LICENSE-2.0
9
// Unless required by applicable law or agreed to in writing, software
10
// distributed under the License is distributed on an "AS IS" BASIS,
11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
// See the License for the specific language governing permissions and
13
// limitations under the License.
14
// ========================================================================
15

16 package org.mortbay.servlet;
17
18 import java.io.IOException JavaDoc;
19 import java.io.Writer JavaDoc;
20 import java.util.Collection JavaDoc;
21 import java.util.Iterator JavaDoc;
22 import java.util.Map JavaDoc;
23 import java.util.StringTokenizer JavaDoc;
24
25 import javax.servlet.ServletConfig JavaDoc;
26 import javax.servlet.ServletException JavaDoc;
27 import javax.servlet.http.HttpServlet JavaDoc;
28 import javax.servlet.http.HttpServletRequest JavaDoc;
29 import javax.servlet.http.HttpServletResponse JavaDoc;
30
31 import org.apache.commons.logging.Log;
32 import org.mortbay.log.LogFactory;
33 import org.mortbay.html.Block;
34 import org.mortbay.html.Break;
35 import org.mortbay.html.Composite;
36 import org.mortbay.html.Element;
37 import org.mortbay.html.Font;
38 import org.mortbay.html.Form;
39 import org.mortbay.html.Heading;
40 import org.mortbay.html.Input;
41 import org.mortbay.html.Link;
42 import org.mortbay.html.List;
43 import org.mortbay.html.Page;
44 import org.mortbay.html.Target;
45 import org.mortbay.http.HttpContext;
46 import org.mortbay.http.HttpException;
47 import org.mortbay.http.HttpHandler;
48 import org.mortbay.http.HttpListener;
49 import org.mortbay.http.HttpResponse;
50 import org.mortbay.http.HttpServer;
51 import org.mortbay.http.PathMap;
52 import org.mortbay.jetty.servlet.ServletHandler;
53 import org.mortbay.util.LifeCycle;
54 import org.mortbay.util.LogSupport;
55 import org.mortbay.util.URI;
56 import org.mortbay.util.UrlEncoded;
57
58
59 /* ------------------------------------------------------------ */
60 /** Jetty Administration Servlet.
61  *
62  * This is a minimal start to a administration servlet that allows
63  * start/stop of server components and control of debug parameters.
64  *
65  * @version $Id: AdminServlet.java,v 1.13 2005/08/13 00:01:28 gregwilkins Exp $
66  * @author Greg Wilkins (gregw)
67  */

68 public class AdminServlet extends HttpServlet JavaDoc
69 {
70     static Log log = LogFactory.getLog(AdminServlet.class);
71
72     private Collection JavaDoc _servers;
73     
74     /* ------------------------------------------------------------ */
75     public void init(ServletConfig JavaDoc config)
76          throws ServletException JavaDoc
77     {
78         super.init(config);
79         _servers =HttpServer.getHttpServers();
80     }
81     
82     /* ------------------------------------------------------------ */
83     private String JavaDoc doAction(HttpServletRequest JavaDoc request)
84         throws IOException JavaDoc
85     {
86         String JavaDoc action=request.getParameter("A");
87         if ("exit all servers".equalsIgnoreCase(action))
88         {
89             new Thread JavaDoc(new Runnable JavaDoc()
90                 {
91                     public void run()
92                     {
93                         try{Thread.sleep(1000);}
94                         catch(Exception JavaDoc e){LogSupport.ignore(log,e);}
95                         log.info("Stopping All servers");
96                         Iterator JavaDoc s=_servers.iterator();
97                         while(s.hasNext())
98                         {
99                             HttpServer server=(HttpServer)s.next();
100                             try{server.stop();}
101                             catch(Exception JavaDoc e){LogSupport.ignore(log,e);}
102                         }
103                         log.info("Exiting JVM");
104                         System.exit(1);
105                     }
106                 }).start();
107             
108             throw new HttpException(HttpResponse.__503_Service_Unavailable);
109         }
110         
111         boolean start="start".equalsIgnoreCase(action);
112         String JavaDoc id=request.getParameter("ID");
113
114         StringTokenizer JavaDoc tok=new StringTokenizer JavaDoc(id,":");
115         int tokens=tok.countTokens();
116         String JavaDoc target=null;
117         
118         try{
119             target=tok.nextToken();
120             int t=Integer.parseInt(target);
121             Iterator JavaDoc s=_servers.iterator();
122             HttpServer server=null;
123             while(s.hasNext() && t>=0)
124                 if (t--==0)
125                     server=(HttpServer)s.next();
126                 else
127                     s.next();
128             
129             if (tokens==1)
130             {
131                 // Server stop/start
132
if (start) server.start();
133                 else server.stop();
134             }
135             else if (tokens==3)
136             {
137                 // Listener stop/start
138
String JavaDoc l=tok.nextToken()+":"+tok.nextToken();
139
140                 HttpListener[] listeners=server.getListeners();
141                 for (int i2=0;i2<listeners.length;i2++)
142                 {
143                     HttpListener listener = listeners[i2];
144                     if (listener.toString().indexOf(l)>=0)
145                     {
146                         if (start) listener.start();
147                         else listener.stop();
148                     }
149                 }
150             }
151             else
152             {
153                 String JavaDoc host=tok.nextToken();
154                 if ("null".equals(host))
155                     host=null;
156                 
157                 String JavaDoc contextPath=tok.nextToken();
158                 target+=":"+host+":"+contextPath;
159                 if (contextPath.length()>1)
160                     contextPath+="/*";
161                 int contextIndex=Integer.parseInt(tok.nextToken());
162                 target+=":"+contextIndex;
163                 HttpContext
164                     context=server.getContext(host,contextPath,contextIndex);
165                 
166                 if (tokens==4)
167                 {
168                     // Context stop/start
169
if (start) context.start();
170                     else context.stop();
171                 }
172                 else if (tokens==5)
173                 {
174                     // Handler stop/start
175
int handlerIndex=Integer.parseInt(tok.nextToken());
176                     HttpHandler handler=context.getHandlers()[handlerIndex];
177                     
178                     if (start) handler.start();
179                     else handler.stop();
180                 }
181             }
182         }
183         catch(Exception JavaDoc e)
184         {
185             log.warn(LogSupport.EXCEPTION,e);
186         }
187         catch(Error JavaDoc e)
188         {
189             log.warn(LogSupport.EXCEPTION,e);
190         }
191         
192         return target;
193     }
194     
195     /* ------------------------------------------------------------ */
196     public void doGet(HttpServletRequest JavaDoc request,
197                       HttpServletResponse JavaDoc response)
198         throws ServletException JavaDoc, IOException JavaDoc
199     {
200         if (request.getQueryString()!=null &&
201             request.getQueryString().length()>0)
202         {
203             String JavaDoc target=doAction(request);
204             response.sendRedirect(request.getContextPath()+
205                                   request.getServletPath()+
206                                   (request.getPathInfo()!=null
207                                    ?request.getPathInfo():"")+
208                                   (target!=null?("#"+target):""));
209             return;
210         }
211         
212         Page page= new Page();
213         page.title(getServletInfo());
214         page.addHeader("");
215         page.attribute("text","#000000");
216         page.attribute(Page.BGCOLOR,"#FFFFFF");
217         page.attribute("link","#606CC0");
218         page.attribute("vlink","#606CC0");
219         page.attribute("alink","#606CC0");
220
221         page.add(new Block(Block.Bold).add(new Font(3,true).add(getServletInfo())));
222         page.add(Break.rule);
223         Form form=new Form(request.getContextPath()+
224                            request.getServletPath()+
225                            "?A=exit");
226         form.method("GET");
227         form.add(new Input(Input.Submit,"A","Exit All Servers"));
228         page.add(form);
229         page.add(Break.rule);
230         page.add(new Heading(3,"Components:"));
231
232         List sList=new List(List.Ordered);
233         page.add(sList);
234         
235         String JavaDoc id1;
236         int i1=0;
237         Iterator JavaDoc s=_servers.iterator();
238         while(s.hasNext())
239         {
240             id1=""+i1++;
241             HttpServer server=(HttpServer)s.next();
242             Composite sItem = sList.newItem();
243             sItem.add("<B>HttpServer&nbsp;");
244             sItem.add(lifeCycle(request,id1,server));
245             sItem.add("</B>");
246             sItem.add(Break.line);
247             sItem.add("<B>Listeners:</B>");
248             List lList=new List(List.Unordered);
249             sItem.add(lList);
250
251             HttpListener[] listeners=server.getListeners();
252             for (int i2=0;i2<listeners.length;i2++)
253             {
254                 HttpListener listener = listeners[i2];
255                 String JavaDoc id2=id1+":"+listener;
256                 lList.add(lifeCycle(request,id2,listener));
257             }
258
259             Map JavaDoc hostMap = server.getHostMap();
260             
261             sItem.add("<B>Contexts:</B>");
262             List hcList=new List(List.Unordered);
263             sItem.add(hcList);
264             Iterator JavaDoc i2=hostMap.entrySet().iterator();
265             while(i2.hasNext())
266             {
267                 Map.Entry JavaDoc hEntry=(Map.Entry JavaDoc)(i2.next());
268                 String JavaDoc host=(String JavaDoc)hEntry.getKey();
269
270                 PathMap contexts=(PathMap)hEntry.getValue();
271                 Iterator JavaDoc i3=contexts.entrySet().iterator();
272                 while(i3.hasNext())
273                 {
274                     Map.Entry JavaDoc cEntry=(Map.Entry JavaDoc)(i3.next());
275                     String JavaDoc contextPath=(String JavaDoc)cEntry.getKey();
276                     java.util.List JavaDoc contextList=(java.util.List JavaDoc)cEntry.getValue();
277                     
278                     Composite hcItem = hcList.newItem();
279                     if (host!=null)
280                         hcItem.add("Host="+host+":");
281                     hcItem.add("ContextPath="+contextPath);
282                     
283                     String JavaDoc id3=id1+":"+host+":"+
284                         (contextPath.length()>2
285                          ?contextPath.substring(0,contextPath.length()-2)
286                          :contextPath);
287                     
288                     List cList=new List(List.Ordered);
289                     hcItem.add(cList);
290                     for (int i4=0;i4<contextList.size();i4++)
291                     {
292                         String JavaDoc id4=id3+":"+i4;
293                         Composite cItem = cList.newItem();
294                         HttpContext hc=
295                             (HttpContext)contextList.get(i4);
296                         cItem.add(lifeCycle(request,id4,hc));
297                         cItem.add("<BR>ResourceBase="+hc.getResourceBase());
298                         cItem.add("<BR>ClassPath="+hc.getClassPath());
299
300                     
301                         List hList=new List(List.Ordered);
302                         cItem.add(hList);
303                         int handlers = hc.getHandlers().length;
304                         for(int i5=0;i5<handlers;i5++)
305                         {
306                             String JavaDoc id5=id4+":"+i5;
307                             HttpHandler handler = hc.getHandlers()[i5];
308                             Composite hItem=hList.newItem();
309                             hItem.add(lifeCycle(request,
310                                                 id5,
311                                                 handler,
312                                                 handler.getName()));
313                             if (handler instanceof ServletHandler)
314                             {
315                                 hItem.add("<BR>"+
316                                           ((ServletHandler)handler)
317                                           .getServletMap());
318                             }
319                         }
320                     }
321                 }
322             }
323             sItem.add("<P>");
324         }
325
326
327         response.setContentType("text/html");
328         response.setHeader("Pragma", "no-cache");
329         response.setHeader("Cache-Control", "no-cache,no-store");
330         Writer JavaDoc writer=response.getWriter();
331         page.write(writer);
332         writer.flush();
333     }
334
335     /* ------------------------------------------------------------ */
336     public void doPost(HttpServletRequest JavaDoc request,
337                         HttpServletResponse JavaDoc response)
338         throws ServletException JavaDoc, IOException JavaDoc
339     {
340         String JavaDoc target=null;
341         response.sendRedirect(request.getContextPath()+
342                               request.getServletPath()+"/"+
343                               Long.toString(System.currentTimeMillis(),36)+
344                               (target!=null?("#"+target):""));
345     }
346     
347     /* ------------------------------------------------------------ */
348     private Element lifeCycle(HttpServletRequest JavaDoc request,
349                               String JavaDoc id,
350                               LifeCycle lc)
351     {
352         return lifeCycle(request,id,lc,lc.toString());
353     }
354     
355     /* ------------------------------------------------------------ */
356     private Element lifeCycle(HttpServletRequest JavaDoc request,
357                               String JavaDoc id,
358                               LifeCycle lc,
359                               String JavaDoc name)
360     {
361         Composite comp=new Composite();
362         comp.add(new Target(id));
363         Font font = new Font();
364         comp.add(font);
365         font.color(lc.isStarted()?"green":"red");
366         font.add(name);
367
368         String JavaDoc action=lc.isStarted()?"Stop":"Start";
369         
370         comp.add("&nbsp;[");
371         comp.add(new Link(URI.addPaths(request.getContextPath(),request.getServletPath())+
372                           "?T="+Long.toString(System.currentTimeMillis(),36)+
373                           "&A="+action+
374                           "&ID="+UrlEncoded.encodeString(id),
375                           action));
376         comp.add("]");
377         return comp;
378     }
379     
380     
381     /* ------------------------------------------------------------ */
382     public String JavaDoc getServletInfo()
383     {
384         return "HTTP Admin";
385     }
386 }
387
388
389
390
391
392
393
394
395
396
397
Popular Tags