package org.directwebremoting.servlet; import java.io.IOException; import java.io.PrintWriter; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.TreeMap; import java.util.Map.Entry; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.directwebremoting.Container; import org.directwebremoting.WebContext; import org.directwebremoting.WebContextFactory; import org.directwebremoting.extend.Handler; import org.directwebremoting.util.LocalUtil; public class MonitorHandler implements Handler { protected boolean debug = false; private static final Log log = LogFactory.getLog(MonitorHandler.class); public void handle(HttpServletRequest request, HttpServletResponse response) throws IOException { if(!this.debug) { log.warn("Failed attempt to access test pages outside of debug mode. Set the debug init-parameter to true to enable."); throw new SecurityException("Access to debug pages is denied."); } else { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.print("DWR - System Monitor"); WebContext webContext = WebContextFactory.get(); out.print("

DWR - System Monitor

"); out.print("

Global Settings:

"); String contextPath = webContext.getContextPath(); out.print("

ContextPath: " + contextPath + "

"); out.print("

Current Page: " + webContext.getCurrentPage() + "

"); Container container = webContext.getContainer(); TreeMap beans = new TreeMap(); TreeMap settings = new TreeMap(); TreeMap urls = new TreeMap(); Iterator ids = container.getBeanNames().iterator(); String prefix; while(ids.hasNext()) { prefix = (String)ids.next(); Object i$ = container.getBean(prefix); if(prefix.startsWith("url:")) { urls.put(prefix.substring(4), i$.getClass().getName()); } else if(i$ instanceof String) { settings.put(prefix, i$.toString()); } else { beans.put(prefix, i$); } } MonitorHandler.IdManager ids1 = new MonitorHandler.IdManager(); Iterator prefix1 = urls.entrySet().iterator(); Entry i$1; while(prefix1.hasNext()) { i$1 = (Entry)prefix1.next(); Iterator entry = settings.entrySet().iterator(); while(entry.hasNext()) { Entry object = (Entry)entry.next(); if(((String)i$1.getKey()).equals(object.getValue())) { entry.remove(); urls.put(i$1.getKey(), (String)i$1.getValue() + " (" + (String)object.getKey() + ")"); } } } out.print("

Beans:

"); prefix1 = beans.entrySet().iterator(); while(prefix1.hasNext()) { i$1 = (Entry)prefix1.next(); String entry1 = (String)i$1.getKey(); Object object1 = i$1.getValue(); this.digWhatever(out, ids1, entry1, object1); } out.print("

Settings:

"); prefix1 = settings.entrySet().iterator(); while(prefix1.hasNext()) { i$1 = (Entry)prefix1.next(); out.print("

" + (String)i$1.getKey() + ": \"" + (String)i$1.getValue() + "\"

"); } out.print("

URLs:

"); prefix = contextPath + webContext.getHttpServletRequest().getServletPath(); Iterator i$2 = urls.entrySet().iterator(); while(i$2.hasNext()) { Entry entry2 = (Entry)i$2.next(); out.print("

" + (String)entry2.getKey() + ": " + (String)entry2.getValue() + "

"); } webContext.getContextPath(); out.print(""); } } private void digWhatever(PrintWriter out, MonitorHandler.IdManager ids, String name, Object object) { if(object != null && !(object instanceof Number) && !(object instanceof Boolean)) { if(object instanceof Collection) { Collection collection = (Collection)object; boolean simple = true; Iterator i$ = collection.iterator(); while(i$.hasNext()) { Object child = i$.next(); if(!(child instanceof Number) && !(child instanceof Boolean) && !(child instanceof String)) { simple = false; } } if(simple) { this.digSimple(out, name, object); } else { this.digCollection(out, ids, name, collection); } } else if(object instanceof Map) { this.digMap(out, ids, name, (Map)object); } else if(!object.getClass().getName().startsWith("java") && !object.getClass().getName().startsWith("com.sun")) { if(object instanceof String) { this.digString(out, name, (String)object); } else { this.digObject(out, ids, name, object); } } else { this.digSimple(out, name, object); } } else { this.digSimple(out, name, object); } } private void digSimple(PrintWriter out, String name, Object object) { out.print("
"); out.print("
" + name + ": " + object.toString() + "
"); out.print("
"); } private void digString(PrintWriter out, String name, String object) { out.print("
"); out.print("
" + name + ": \"" + object + "\"
"); out.print("
"); } private void digCollection(PrintWriter out, MonitorHandler.IdManager ids, String name, Collection collection) { out.print("
"); String id = ids.getIfExists(collection); if(id != null) { out.print("
" + name + ": Map
"); } else { id = ids.allocate(collection); out.print("
" + name + ": Map
"); out.print(""); } } private void digMap(PrintWriter out, MonitorHandler.IdManager ids, String name, Map map) { out.print("
"); String id = ids.getIfExists(map); if(id != null) { out.print("
" + name + ": Map
"); } else { id = ids.allocate(map); out.print(""); out.print(""); } } private void digException(PrintWriter out, String name, Throwable ex) { out.print("
"); out.print("
" + name + ": " + ex.getClass().getSimpleName() + "(" + ex.getMessage() + ")
"); out.print("
"); } private void digObject(PrintWriter out, MonitorHandler.IdManager ids, String name, Object object) { Class type = object.getClass(); if(!(object instanceof Log)) { out.print("
"); String id = ids.getIfExists(object); if(id != null) { out.print(""); } else { id = ids.allocate(object); out.print("
" + name + ": " + type.getName() + "
"); out.print("
    "); Field[] arr$ = LocalUtil.getAllFields(type); int len$ = arr$.length; for(int i$ = 0; i$ < len$; ++i$) { Field field = arr$[i$]; try { if(!Modifier.isStatic(field.getModifiers())) { field.setAccessible(true); Object ex = field.get(object); this.digWhatever(out, ids, field.getName(), ex); } } catch (Exception var12) { this.digException(out, field.getName(), var12); } } out.print("
"); } } } public void setDebug(boolean debug) { this.debug = debug; } protected static class IdManager { private int nextId; private Map allocated = new HashMap(); public String getIfExists(Object object) { return (String)this.allocated.get(object); } protected String allocate(Object object) { if(this.allocated.containsKey(object)) { throw new IllegalStateException("object already exists"); } else { String id = "id" + this.nextId; ++this.nextId; this.allocated.put(object, id); return id; } } } }