1 16 package org.mortbay.servlet; 17 18 import java.io.IOException ; 19 import java.io.Writer ; 20 import java.util.Collection ; 21 import java.util.Iterator ; 22 import java.util.Map ; 23 import java.util.StringTokenizer ; 24 25 import javax.servlet.ServletConfig ; 26 import javax.servlet.ServletException ; 27 import javax.servlet.http.HttpServlet ; 28 import javax.servlet.http.HttpServletRequest ; 29 import javax.servlet.http.HttpServletResponse ; 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 68 public class AdminServlet extends HttpServlet 69 { 70 static Log log = LogFactory.getLog(AdminServlet.class); 71 72 private Collection _servers; 73 74 75 public void init(ServletConfig config) 76 throws ServletException 77 { 78 super.init(config); 79 _servers =HttpServer.getHttpServers(); 80 } 81 82 83 private String doAction(HttpServletRequest request) 84 throws IOException 85 { 86 String action=request.getParameter("A"); 87 if ("exit all servers".equalsIgnoreCase(action)) 88 { 89 new Thread (new Runnable () 90 { 91 public void run() 92 { 93 try{Thread.sleep(1000);} 94 catch(Exception e){LogSupport.ignore(log,e);} 95 log.info("Stopping All servers"); 96 Iterator s=_servers.iterator(); 97 while(s.hasNext()) 98 { 99 HttpServer server=(HttpServer)s.next(); 100 try{server.stop();} 101 catch(Exception 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 id=request.getParameter("ID"); 113 114 StringTokenizer tok=new StringTokenizer (id,":"); 115 int tokens=tok.countTokens(); 116 String target=null; 117 118 try{ 119 target=tok.nextToken(); 120 int t=Integer.parseInt(target); 121 Iterator 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 if (start) server.start(); 133 else server.stop(); 134 } 135 else if (tokens==3) 136 { 137 String 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 host=tok.nextToken(); 154 if ("null".equals(host)) 155 host=null; 156 157 String 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 if (start) context.start(); 170 else context.stop(); 171 } 172 else if (tokens==5) 173 { 174 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 e) 184 { 185 log.warn(LogSupport.EXCEPTION,e); 186 } 187 catch(Error e) 188 { 189 log.warn(LogSupport.EXCEPTION,e); 190 } 191 192 return target; 193 } 194 195 196 public void doGet(HttpServletRequest request, 197 HttpServletResponse response) 198 throws ServletException , IOException 199 { 200 if (request.getQueryString()!=null && 201 request.getQueryString().length()>0) 202 { 203 String 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 id1; 236 int i1=0; 237 Iterator 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 "); 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 id2=id1+":"+listener; 256 lList.add(lifeCycle(request,id2,listener)); 257 } 258 259 Map hostMap = server.getHostMap(); 260 261 sItem.add("<B>Contexts:</B>"); 262 List hcList=new List(List.Unordered); 263 sItem.add(hcList); 264 Iterator i2=hostMap.entrySet().iterator(); 265 while(i2.hasNext()) 266 { 267 Map.Entry hEntry=(Map.Entry )(i2.next()); 268 String host=(String )hEntry.getKey(); 269 270 PathMap contexts=(PathMap)hEntry.getValue(); 271 Iterator i3=contexts.entrySet().iterator(); 272 while(i3.hasNext()) 273 { 274 Map.Entry cEntry=(Map.Entry )(i3.next()); 275 String contextPath=(String )cEntry.getKey(); 276 java.util.List contextList=(java.util.List )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 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 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 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 writer=response.getWriter(); 331 page.write(writer); 332 writer.flush(); 333 } 334 335 336 public void doPost(HttpServletRequest request, 337 HttpServletResponse response) 338 throws ServletException , IOException 339 { 340 String 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 request, 349 String id, 350 LifeCycle lc) 351 { 352 return lifeCycle(request,id,lc,lc.toString()); 353 } 354 355 356 private Element lifeCycle(HttpServletRequest request, 357 String id, 358 LifeCycle lc, 359 String 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 action=lc.isStarted()?"Stop":"Start"; 369 370 comp.add(" ["); 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 getServletInfo() 383 { 384 return "HTTP Admin"; 385 } 386 } 387 388 389 390 391 392 393 394 395 396 397 | Popular Tags |