Source code: com/lilacsoftware/jettyextra/AdminServlet.java
1 // ===========================================================================
2 // Copyright (c) 1996 Mort Bay Consulting Pty. Ltd. All rights reserved.
3 // $Id: AdminServlet.java,v 1.1.1.1 2001/11/05 17:41:52 tomwadzinski Exp $
4 // ---------------------------------------------------------------------------
5
6 package com.lilacsoftware.jettyextra;
7
8 import org.mortbay.http.*;
9 import org.mortbay.html.Break;
10 import org.mortbay.html.Composite;
11 import org.mortbay.html.Heading;
12 import org.mortbay.html.Element;
13 import org.mortbay.html.Block;
14 import org.mortbay.html.Font;
15 import org.mortbay.html.Form;
16 import org.mortbay.html.Input;
17 import org.mortbay.html.Link;
18 import org.mortbay.html.List;
19 import org.mortbay.html.Page;
20 import org.mortbay.html.TableForm;
21 import org.mortbay.html.Target;
22 import org.mortbay.jetty.servlet.ServletHandler;
23 import org.mortbay.util.Code;
24 import org.mortbay.util.Log;
25 import org.mortbay.util.LogSink;
26 import org.mortbay.util.WriterLogSink;
27 import org.mortbay.util.LifeCycle;
28 import org.mortbay.util.UrlEncoded;
29 import java.io.IOException;
30 import java.io.Writer;
31 import java.util.Collection;
32 import java.util.Iterator;
33 import java.util.Map;
34 import java.util.StringTokenizer;
35 import javax.servlet.ServletConfig;
36 import javax.servlet.ServletException;
37 import javax.servlet.http.HttpServlet;
38 import javax.servlet.http.HttpServletRequest;
39 import javax.servlet.http.HttpServletResponse;
40 import javax.servlet.http.HttpSession;
41
42
43 /* ------------------------------------------------------------ */
44 /** Jetty Administration Servlet.
45 *
46 * This is a minimal start to a administration servlet that allows
47 * start/stop of server components and control of debug parameters.
48 *
49 * @version $Id: AdminServlet.java,v 1.1.1.1 2001/11/05 17:41:52 tomwadzinski Exp $
50 * @author Greg Wilkins (gregw)
51 */
52 public class AdminServlet extends HttpServlet
53 {
54 private java.util.List _servers;
55
56 /* ------------------------------------------------------------ */
57 public void init(ServletConfig config)
58 throws ServletException
59 {
60 super.init(config);
61 _servers=HttpServer.getHttpServerList();
62 }
63
64 /* ------------------------------------------------------------ */
65 private String doAction(HttpServletRequest request,
66 HttpServletResponse response)
67 throws ServletException, IOException
68 {
69 String action=request.getParameter("A");
70 if ("exit all servers".equalsIgnoreCase(action))
71 {
72 new Thread(new Runnable()
73 {
74 public void run()
75 {
76 try{Thread.sleep(1000);}
77 catch(Exception e){Code.ignore(e);}
78 Log.event("Stopping All servers");
79 for (int s=0;s<_servers.size();s++)
80 {
81 HttpServer server=(HttpServer)_servers.get(s);
82 try{server.destroy();}
83 catch(Exception e){Code.ignore(e);}
84 }
85 Log.event("Exiting JVM");
86 System.exit(1);
87 }
88 }).start();
89
90 throw new HttpException(HttpResponse.__503_Service_Unavailable);
91 }
92
93 boolean start="start".equalsIgnoreCase(action);
94 String id=request.getParameter("ID");
95
96 StringTokenizer tok=new StringTokenizer(id,":");
97 int tokens=tok.countTokens();
98 String target=null;
99
100 try{
101 target=tok.nextToken();
102 HttpServer server=(HttpServer)
103 _servers.get(Integer.parseInt(target));
104
105 if (tokens==1)
106 {
107 // Server stop/start
108 if (start) server.start();
109 else server.destroy();
110 }
111 else if (tokens==3)
112 {
113 // Listener stop/start
114 String l=tok.nextToken()+":"+tok.nextToken();
115 Collection listeners=server.getListeners();
116 Iterator i2 = listeners.iterator();
117 while(i2.hasNext())
118 {
119 HttpListener listener = (HttpListener) i2.next();
120 if (listener.toString().indexOf(l)>=0)
121 {
122 if (start) listener.start();
123 else listener.destroy();
124 }
125 }
126 }
127 else
128 {
129 String host=tok.nextToken();
130 if ("null".equals(host))
131 host=null;
132
133 String contextPath=tok.nextToken();
134 target+=":"+host+":"+contextPath;
135 if (contextPath.length()>1)
136 contextPath+="/*";
137 int contextIndex=Integer.parseInt(tok.nextToken());
138 target+=":"+contextIndex;
139 HandlerContext
140 context=server.getContext(host,contextPath,contextIndex);
141
142 if (tokens==4)
143 {
144 // Context stop/start
145 if (start) context.start();
146 else context.stop();
147 }
148 else if (tokens==5)
149 {
150 // Handler stop/start
151 int handlerIndex=Integer.parseInt(tok.nextToken());
152 HttpHandler handler=context.getHandler(handlerIndex);
153
154 if (start) handler.start();
155 else handler.stop();
156 }
157 }
158 }
159 catch(Exception e)
160 {
161 Code.warning(e);
162 }
163 catch(Error e)
164 {
165 Code.warning(e);
166 }
167
168 return target;
169 }
170
171 /* ------------------------------------------------------------ */
172 public void doGet(HttpServletRequest request,
173 HttpServletResponse response)
174 throws ServletException, IOException
175 {
176 if (request.getQueryString()!=null &&
177 request.getQueryString().length()>0)
178 {
179 String target=doAction(request,response);
180 response.sendRedirect(request.getContextPath()+
181 request.getServletPath()+
182 (request.getPathInfo()!=null
183 ?request.getPathInfo():"")+
184 (target!=null?("#"+target):""));
185 return;
186 }
187
188 Page page= new Page();
189 page.title(getServletInfo());
190 page.addHeader("");
191 page.attribute("text","#000000");
192 page.attribute(Page.BGCOLOR,"#FFFFFF");
193 page.attribute("link","#606CC0");
194 page.attribute("vlink","#606CC0");
195 page.attribute("alink","#606CC0");
196
197 page.add(new Block(Block.Bold).add(new Font(3,true).add(getServletInfo())));
198 page.add(Break.rule);
199 Form form=new Form(request.getContextPath()+
200 request.getServletPath()+
201 "?A=exit");
202 form.method("GET");
203 form.add(new Input(Input.Submit,"A","Exit All Servers"));
204 page.add(form);
205 page.add(Break.rule);
206 page.add(new Heading(3,"Components:"));
207
208 List sList=new List(List.Ordered);
209 page.add(sList);
210 String id1;
211
212 for(int i1=0;i1<_servers.size();i1++)
213 {
214 id1=""+i1;
215 HttpServer server=(HttpServer)_servers.get(i1);
216 Composite sItem = sList.newItem();
217 sItem.add("<B>HttpServer ");
218 sItem.add(lifeCycle(request,id1,server));
219 sItem.add("</B>");
220 sItem.add(Break.line);
221 sItem.add("<B>Listeners:</B>");
222 List lList=new List(List.Unordered);
223 sItem.add(lList);
224
225 Collection listeners=server.getListeners();
226 Iterator i2 = listeners.iterator();
227 while(i2.hasNext())
228 {
229 HttpListener listener = (HttpListener) i2.next();
230 String id2=id1+":"+listener;
231 lList.add(lifeCycle(request,id2,listener));
232 }
233
234 Map hostMap = server.getHostMap();
235
236 sItem.add("<B>Contexts:</B>");
237 List hcList=new List(List.Unordered);
238 sItem.add(hcList);
239 i2=hostMap.entrySet().iterator();
240 while(i2.hasNext())
241 {
242 Map.Entry hEntry=(Map.Entry)(i2.next());
243 String host=(String)hEntry.getKey();
244
245 PathMap contexts=(PathMap)hEntry.getValue();
246 Iterator i3=contexts.entrySet().iterator();
247 while(i3.hasNext())
248 {
249 Map.Entry cEntry=(Map.Entry)(i3.next());
250 String contextPath=(String)cEntry.getKey();
251 java.util.List contextList=(java.util.List)cEntry.getValue();
252
253 Composite hcItem = hcList.newItem();
254 if (host!=null)
255 hcItem.add("Host="+host+":");
256 hcItem.add("ContextPath="+contextPath);
257
258 String id3=id1+":"+host+":"+
259 (contextPath.length()>2
260 ?contextPath.substring(0,contextPath.length()-2)
261 :contextPath);
262
263 List cList=new List(List.Ordered);
264 hcItem.add(cList);
265 for (int i4=0;i4<contextList.size();i4++)
266 {
267 String id4=id3+":"+i4;
268 Composite cItem = cList.newItem();
269 HandlerContext hc=
270 (HandlerContext)contextList.get(i4);
271 cItem.add(lifeCycle(request,id4,hc));
272 cItem.add("<BR>ResourceBase="+hc.getResourceBase());
273 cItem.add("<BR>ClassPath="+hc.getClassPath());
274
275
276 List hList=new List(List.Ordered);
277 cItem.add(hList);
278 for(int i5=0;i5<hc.getHandlerSize();i5++)
279 {
280 String id5=id4+":"+i5;
281 HttpHandler handler = hc.getHandler(i5);
282 Composite hItem=hList.newItem();
283 hItem.add(lifeCycle(request,
284 id5,
285 handler,
286 handler.getName()));
287 if (handler instanceof ServletHandler)
288 {
289 hItem.add("<BR>"+
290 ((ServletHandler)handler)
291 .getServletMap());
292 }
293 }
294 }
295 }
296 }
297 sItem.add("<P>");
298 }
299
300
301 response.setContentType("text/html");
302 response.setHeader("Pragma", "no-cache");
303 response.setHeader("Cache-Control", "no-cache,no-store");
304 Writer writer=response.getWriter();
305 page.write(writer);
306 writer.flush();
307 }
308
309 /* ------------------------------------------------------------ */
310 public void doPost(HttpServletRequest request,
311 HttpServletResponse response)
312 throws ServletException, IOException
313 {
314 String target=null;
315 response.sendRedirect(request.getContextPath()+
316 request.getServletPath()+"/"+
317 Long.toString(System.currentTimeMillis(),36)+
318 (target!=null?("#"+target):""));
319 }
320
321 /* ------------------------------------------------------------ */
322 private Element lifeCycle(HttpServletRequest request,
323 String id,
324 LifeCycle lc)
325 {
326 return lifeCycle(request,id,lc,lc.toString());
327 }
328
329 /* ------------------------------------------------------------ */
330 private Element lifeCycle(HttpServletRequest request,
331 String id,
332 LifeCycle lc,
333 String name)
334 {
335 Composite comp=new Composite();
336 comp.add(new Target(id));
337 Font font = new Font();
338 comp.add(font);
339 font.color(lc.isStarted()?"green":"red");
340 font.add(name);
341
342 String action=lc.isStarted()?"Stop":"Start";
343
344 comp.add(" [");
345 comp.add(new Link(request.getContextPath()+
346 request.getServletPath()+"/"+
347 Long.toString(System.currentTimeMillis(),36)+
348 "?A="+action+"&ID="+UrlEncoded.encodeString(id),
349 action));
350 comp.add("]");
351 return comp;
352 }
353
354
355 /* ------------------------------------------------------------ */
356 public String getServletInfo()
357 {
358 return "HTTP Admin";
359 }
360 }
361
362
363
364
365
366
367
368
369
370