// $Id: PoolInfoObserverEngineV2.java,v 1.1 2006-06-05 08:51:27 patrick Exp $Cg package diskCacheV111.services.web; import java.io.OutputStream; import java.io.PrintWriter; import java.util.Collection; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; import diskCacheV111.util.HTMLWriter; import dmg.cells.nucleus.DomainContextAware; import dmg.util.HttpException; import dmg.util.HttpRequest; import dmg.util.HttpResponseEngine; public class PoolInfoObserverEngineV2 implements HttpResponseEngine, DomainContextAware { private static final int _menuColumns = 4; private final Map<String,String> _tableSelection = new LinkedHashMap<>(); private boolean _showPoolGroupUsage; private int _errorCounter; private int _requestCounter; private PoolCellQueryContainer _container; private Map<String, Object> _context; public PoolInfoObserverEngineV2(String[] args) { for (String s : args) { if (s.startsWith("showPoolGroupUsage=")) { _showPoolGroupUsage = s.substring("showPoolGroupUsage=".length()).equals("true"); } } _tableSelection.put("Cell View" , "cells"); _tableSelection.put("Space Usage" , "spaces"); _tableSelection.put("Request Queues" , "queues"); } @Override public void setDomainContext(Map<String, Object> context) { _context = context; } @Override public void startup() { // No background activity to start } @Override public void shutdown() { // No background activity to shutdown } @Override public void queryUrl(HttpRequest request) throws HttpException { String[] urlItems = request.getRequestTokens(); int offset = request.getRequestTokenOffset(); OutputStream out = request.getOutputStream(); _requestCounter++; request.printHttpHeader(0); HTMLWriter html = new HTMLWriter(out, _context); try { html.addHeader("/styles/poolinfo.css", "Pool Property Tables"); if (urlItems.length < 1) { return; } if (urlItems.length > 1 && urlItems[1].equals("list")) { Object o = _context.get("poolgroup-map.ser"); if (o == null) { html.println("<h3>Information not yet available</h3>"); return; } else if (!(o instanceof PoolCellQueryContainer)) { html.println("<h3>Internal error: poolgroup-map.ser contains unknown class</h3>"); return; } _container = (PoolCellQueryContainer)o; String className = urlItems.length > 2 ? urlItems[2] : null; String groupName = urlItems.length > 3 ? urlItems[3] : null; String selection = urlItems.length > 4 ? urlItems[4] : null; printClassMenu(html, className); if (className == null) { return; } if (_showPoolGroupUsage) { printGroupList(html, className); } else { printGroupMenu(html, className, groupName); } if (groupName == null) { return; } html.println("<h3>Pool group <emph>" + groupName + "</emph></h3>"); printMenuTable(html, _tableSelection.entrySet(), "/pools/list/" + className + "/"+groupName + "/", selection); if (selection == null) { return; } Map<String,Object> poolMap = _container.getPoolMap(className, groupName); if (poolMap == null) { return; } switch (selection) { case "cells": printCells(html, poolMap); break; case "spaces": printPools(html, poolMap); break; case "queues": printPoolActions(html, poolMap); break; } } } catch (Exception e) { _errorCounter ++; showProblem(html, e.getMessage()); html.println("<ul>"); for (int i = 0; i < urlItems.length; i++) { html.println("<li> [" + i + "] " + urlItems[i] + "</li>"); } html.println("</ul>"); } finally { html.addFooter(getClass().getName() + " [$Rev$]"); } } private void printPoolActions(HTMLWriter html, Map<String, Object> poolMap) { PoolQueueTableWriter writer = new PoolQueueTableWriter(html); writer.print(new TreeMap(poolMap).values()); } private void printPools(HTMLWriter html, Map<String, Object> poolMap) { PoolInfoTableWriter writer = new PoolInfoTableWriter(html); writer.print(new TreeMap(poolMap).values(), !_showPoolGroupUsage); } private void printCells(HTMLWriter html, Map<String, Object> poolMap) { CellInfoTableWriter writer = new CellInfoTableWriter(html); writer.print(new TreeMap(poolMap).values()); } private void printClassMenu(HTMLWriter pw, String className) { List<String> classes = _container.getPoolClasses(); pw.println("<h3>Pool Views</h3>"); printMenuTable(pw, classes, "/pools/list/", className); } private void printGroupMenu(HTMLWriter pw, String className, String groupName) { List<String> groups = _container.getPoolGroupSetByClassName(className); if (groups != null) { pw.println("<h3>Pool groups of <emph>" + className + "</emph></h3>"); printMenuTable(pw, groups, "/pools/list/" + className + "/", groupName); } } private void printGroupList(HTMLWriter html, String className) { List<String> groups = _container.getPoolGroupSetByClassName(className); if (groups != null) { html.println("<h3>Pool groups of <emph>" + className + "</emph></h3>"); SortedMap<String, Collection<Object>> info = new TreeMap<>(); for (String group : groups) { info.put(group, _container.getPoolMap(className, group).values()); } PoolGroupInfoTableWriter writer = new PoolGroupInfoTableWriter(html); writer.print("/pools/list/" + className + "/", info); } } private void printMenuTable(HTMLWriter html, Collection<?> items, String linkBase, String currentItem) { html.beginTable("menu"); if (!items.isEmpty()) { html.beginRow(); int n = 0; for (Object o: items) { if (n > 0 && (n % _menuColumns) == 0) { html.endRow(); html.beginRow(); } n++; String name; String linkName; if (o instanceof String) { name = linkName = (String)o; } else { Map.Entry<String,String> e = (Map.Entry<String,String>)o; name = e.getKey(); linkName = e.getValue(); } boolean active = currentItem != null && currentItem.equals(linkName); html.td(active ? "active" : null, "<a href=\"", linkBase, linkName, "/\">", name, "</a>"); } while ((n++ % _menuColumns) != 0) { html.td(null); } html.endRow(); } html.endTable(); } private void showProblem(PrintWriter pw, String message) { pw.print("<h1><emph>"); pw.print(message); pw.println("<emph></h1>"); } }