You are viewing a plain text version of this content. The canonical link for it is here.
Posted to solr-commits@lucene.apache.org by ot...@apache.org on 2006/12/12 23:24:48 UTC

svn commit: r486373 - in /incubator/solr/trunk: ./ src/webapp/resources/admin/

Author: otis
Date: Tue Dec 12 14:24:47 2006
New Revision: 486373

URL: http://svn.apache.org/viewvc?view=rev&rev=486373
Log:
- SOLR-58: make admin pages return XML and transform them to HTML using XSL

Added:
    incubator/solr/trunk/src/webapp/resources/admin/analysis.xsl
    incubator/solr/trunk/src/webapp/resources/admin/heading.jsp
    incubator/solr/trunk/src/webapp/resources/admin/logging.xsl
    incubator/solr/trunk/src/webapp/resources/admin/meta.xsl
    incubator/solr/trunk/src/webapp/resources/admin/ping.xsl
    incubator/solr/trunk/src/webapp/resources/admin/threaddump.xsl
Modified:
    incubator/solr/trunk/CHANGES.txt
    incubator/solr/trunk/src/webapp/resources/admin/analysis.jsp
    incubator/solr/trunk/src/webapp/resources/admin/logging.jsp
    incubator/solr/trunk/src/webapp/resources/admin/ping.jsp
    incubator/solr/trunk/src/webapp/resources/admin/threaddump.jsp

Modified: incubator/solr/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/incubator/solr/trunk/CHANGES.txt?view=diff&rev=486373&r1=486372&r2=486373
==============================================================================
--- incubator/solr/trunk/CHANGES.txt (original)
+++ incubator/solr/trunk/CHANGES.txt Tue Dec 12 14:24:47 2006
@@ -118,6 +118,8 @@
     through multiple threads.  Large commits also might be faster (klaas, SOLR-65)
  9. Lazy field loading can be enabled via a solrconfig directive.  This will be faster when
     not all stored fields are needed from a document (klaas, SOLR-52)   
+10. Made admin JSPs return XML and transform them with new XSL stylesheets
+    (Otis Gospodnetic, SOLR-58)
 
 Optimizations 
  1. getDocListAndSet can now generate both a DocList and a DocSet from a 

Modified: incubator/solr/trunk/src/webapp/resources/admin/analysis.jsp
URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/resources/admin/analysis.jsp?view=diff&rev=486373&r1=486372&r2=486373
==============================================================================
--- incubator/solr/trunk/src/webapp/resources/admin/analysis.jsp (original)
+++ incubator/solr/trunk/src/webapp/resources/admin/analysis.jsp Tue Dec 12 14:24:47 2006
@@ -1,20 +1,4 @@
-<%@ page contentType="text/html; charset=utf-8" pageEncoding="UTF-8"%>
-<%--
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements.  See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
---%>
+<%@ page contentType="text/xml; charset=utf-8" pageEncoding="UTF-8" language="java" %>
 <%@ page import="org.apache.lucene.analysis.Analyzer,
                  org.apache.lucene.analysis.Token,
                  org.apache.lucene.analysis.TokenStream,
@@ -30,129 +14,86 @@
 <%@ page import="java.io.StringReader"%>
 <%@ page import="java.util.*"%>
 
-<%-- $Id$ --%>
-<%-- $Source: /cvs/main/searching/org.apache.solrolarServer/resources/admin/analysis.jsp,v $ --%>
-<%-- $Name:  $ --%>
+<?xml-stylesheet type="text/xsl" href="analysis.xsl"?>
 
-<%@include file="header.jsp" %>
+<%@include file="_info.jsp" %>
 
 <%
   String name = request.getParameter("name");
-  if (name==null || name.length()==0) name="";
+  if (name == null || name.length() == 0) name = "";
   String val = request.getParameter("val");
-  if (val==null || val.length()==0) val="";
+  if (val == null || val.length() == 0) val = "";
   String qval = request.getParameter("qval");
-  if (qval==null || qval.length()==0) qval="";
+  if (qval == null || qval.length() == 0) qval = "";
   String verboseS = request.getParameter("verbose");
-  boolean verbose = verboseS!=null && verboseS.equalsIgnoreCase("on");
+  boolean verbose = verboseS != null && verboseS.equalsIgnoreCase("on");
   String qverboseS = request.getParameter("qverbose");
-  boolean qverbose = qverboseS!=null && qverboseS.equalsIgnoreCase("on");
+  boolean qverbose = qverboseS != null && qverboseS.equalsIgnoreCase("on");
   String highlightS = request.getParameter("highlight");
-  boolean highlight = highlightS!=null && highlightS.equalsIgnoreCase("on");
+  boolean highlight = highlightS != null && highlightS.equalsIgnoreCase("on");
 %>
 
-<br clear="all">
-
-<h2>Field Analysis</h2>
-
-<form method="GET" action="analysis.jsp">
-<table>
-<tr>
-  <td>
-	<strong>Field name</strong>
-  </td>
-  <td>
-	<input class="std" name="name" type="text" value="<%= name %>">
-  </td>
-</tr>
-<tr>
-  <td>
-	<strong>Field value (Index)</strong>
-  <br/>
-  verbose output
-  <input name="verbose" type="checkbox"
-     <%= verbose ? "checked=\"true\"" : "" %> >
-    <br/>
-  highlight matches
-  <input name="highlight" type="checkbox"
-     <%= highlight ? "checked=\"true\"" : "" %> >
-  </td>
-  <td>
-	<textarea class="std" rows="3" cols="70" name="val"><%= val %></textarea>
-  </td>
-</tr>
-<tr>
-  <td>
-	<strong>Field value (Query)</strong>
-  <br/>
-  verbose output
-  <input name="qverbose" type="checkbox"
-     <%= qverbose ? "checked=\"true\"" : "" %> >
-  </td>
-  <td>
-	<textarea class="std" rows="1" cols="70" name="qval"><%= qval %></textarea>
-  </td>
-</tr>
-<tr>
-
-  <td>
-  </td>
-
-  <td>
-	<input class="stdbutton" type="submit" value="analyze">
-  </td>
-
-</tr>
-</table>
-</form>
-
+<solr>
+<%@include file="heading.jsp" %>
+  <analysis>
 
 <%
-  SchemaField field=null;
+  SchemaField field = null;
 
-  if (name!="") {
+  if (name != "") {
     try {
       field = schema.getField(name);
     } catch (Exception e) {
-      out.println("<strong>Unknown Field " + name + "</strong>");
+      out.println("<error>Unknown Field " + name + "</error>");
     }
   }
 
-  if (field!=null) {
+  if (field != null) {
+    out.println("    <form>");
+    out.println("      <field>");
+      XML.escapeCharData(name, out);
+    out.println("</field>");
+    out.print("      <fieldIndexValue>");
+      XML.escapeCharData(val, out);
+    out.println("      </fieldIndexValue>");
+    out.print("      <fieldQueryValue>");
+      XML.escapeCharData(qval, out);
+    out.println("      </fieldQueryValue>");
+    out.println("    </form>");
+
     HashSet<Tok> matches = null;
-    if (qval!="" && highlight) {
+    if (qval != "" && highlight) {
       Reader reader = new StringReader(qval);
       Analyzer analyzer =  field.getType().getQueryAnalyzer();
-      TokenStream tstream = analyzer.tokenStream(field.getName(),reader);
+      TokenStream tstream = analyzer.tokenStream(field.getName(), reader);
       List<Token> tokens = getTokens(tstream);
       matches = new HashSet<Tok>();
-      for (Token t : tokens) { matches.add( new Tok(t,0)); }
+      for (Token t : tokens) { matches.add( new Tok(t, 0)); }
     }
 
-    if (val!="") {
-      out.println("<h3>Index Analyzer</h3>");
-      doAnalyzer(out, field, val, false, verbose,matches);
+    out.println("    <results>");
+    if (val != "") {
+      out.println("<indexAnalyzer>");
+      doAnalyzer(out, field, val, false, verbose, matches);
+      out.println("</indexAnalyzer>");
     }
-    if (qval!="") {
-      out.println("<h3>Query Analyzer</h3>");
-      doAnalyzer(out, field, qval, true, qverbose,null);
+    if (qval != "") {
+      out.println("<queryAnalyzer>");
+      doAnalyzer(out, field, qval, true, qverbose, null);
+      out.println("</queryAnalyzer>");
     }
+    out.println("    </results>");
   }
-
 %>
-
-
-</body>
-</html>
-
+  </analysis>
+</solr>
 
 <%!
   private static void doAnalyzer(JspWriter out, SchemaField field, String val, boolean queryAnalyser, boolean verbose, Set<Tok> match) throws Exception {
     Reader reader = new StringReader(val);
 
     FieldType ft = field.getType();
-     Analyzer analyzer = queryAnalyser ?
-             ft.getQueryAnalyzer() : ft.getAnalyzer();
+    Analyzer analyzer = queryAnalyser ? ft.getQueryAnalyzer() : ft.getAnalyzer();
      if (analyzer instanceof TokenizerChain) {
        TokenizerChain tchain = (TokenizerChain)analyzer;
        TokenizerFactory tfac = tchain.getTokenizerFactory();
@@ -161,12 +102,14 @@
        TokenStream tstream = tfac.create(reader);
        List<Token> tokens = getTokens(tstream);
        tstream = tfac.create(reader);
+       // write tokenizer factories
        if (verbose) {
          writeHeader(out, tfac.getClass(), tfac.getArgs());
        }
 
        writeTokens(out, tokens, ft, verbose, match);
 
+       // write filter factories
        for (TokenFilterFactory filtfac : filtfacs) {
          if (verbose) {
            writeHeader(out, filtfac.getClass(), filtfac.getArgs());
@@ -183,7 +126,6 @@
 
          writeTokens(out, tokens, ft, verbose, match);
        }
-
      } else {
        TokenStream tstream = analyzer.tokenStream(field.getName(),reader);
        List<Token> tokens = getTokens(tstream);
@@ -199,7 +141,7 @@
     List<Token> tokens = new ArrayList<Token>();
     while (true) {
       Token t = tstream.next();
-      if (t==null) break;
+      if (t == null) break;
       tokens.add(t);
     }
     return tokens;
@@ -210,8 +152,8 @@
     Token token;
     int pos;
     Tok(Token token, int pos) {
-      this.token=token;
-      this.pos=pos;
+      this.token = token;
+      this.pos = pos;
     }
 
     public boolean equals(Object o) {
@@ -221,7 +163,7 @@
       return token.termText().hashCode();
     }
     public String toString() {
-      return token.termText();
+      return token.termText() + " at position " + pos;
     }
   }
 
@@ -229,81 +171,38 @@
     public String toStr(Object o);
   }
 
-  private static void printRow(JspWriter out, String header, List[] arrLst, ToStr converter, boolean multival, boolean verbose, Set<Tok> match) throws IOException {
-    // find the maximum number of terms for any position
-    int maxSz=1;
-    if (multival) {
-      for (List lst : arrLst) {
-        maxSz = Math.max(lst.size(), maxSz);
-      }
-    }
-
-
-    for (int idx=0; idx<maxSz; idx++) {
-      out.println("<tr>");
-      if (idx==0 && verbose) {
-        if (header != null) {
-          out.print("<th NOWRAP rowspan=\""+maxSz+"\">");
-          XML.escapeCharData(header,out);
-          out.println("</th>");
-        }
-      }
-
-      for (List<Tok> lst : arrLst) {
-        if (lst.size() <= idx) continue;
-        if (match!=null && match.contains(lst.get(idx))) {
-          out.print("<td class=\"highlight\"");
-        } else {
-          out.print("<td class=\"debugdata\"");
-        }
-
-        if (idx==0 && lst.size()==1 && maxSz > 1) {
-          out.print("rowspan=\""+maxSz+'"');
-        }
-
-        out.print('>');
-
-        XML.escapeCharData(converter.toStr(lst.get(idx)), out);
-        out.print("</td>");
-      }
-
-      out.println("</tr>");
-    }
-
-  }
-
-
-
   static void writeHeader(JspWriter out, Class clazz, Map<String,String> args) throws IOException {
-    out.print("<h4>");
-    out.print(clazz.getName());
-    XML.escapeCharData("   "+args,out);
-    out.println("</h4>");
+    out.println("  <factory class=\"" + clazz.getName() + "\">");
+    out.println("    <args>");
+    for (Iterator<String> iter = args.keySet().iterator(); iter.hasNext(); ) {
+      String key = iter.next();
+      String value = args.get(key);
+      out.println("      <arg name=\"" + key + "\">" + value + "</arg>");
+    }
+    out.println("    </args>");
   }
 
-
-
   // readable, raw, pos, type, start/end
   static void writeTokens(JspWriter out, List<Token> tokens, final FieldType ft, boolean verbose, Set<Tok> match) throws IOException {
 
     // Use a map to tell what tokens are in what positions
     // because some tokenizers/filters may do funky stuff with
     // very large increments, or negative increments.
-    HashMap<Integer,List<Tok>> map = new HashMap<Integer,List<Tok>>();
-    boolean needRaw=false;
-    int pos=0;
+    HashMap<Integer, List<Tok>> map = new HashMap<Integer, List<Tok>>();
+    boolean needRaw = false;
+    int pos = 0;
     for (Token t : tokens) {
       if (!t.termText().equals(ft.indexedToReadable(t.termText()))) {
-        needRaw=true;
+        needRaw = true;
       }
 
       pos += t.getPositionIncrement();
       List lst = map.get(pos);
-      if (lst==null) {
+      if (lst == null) {
         lst = new ArrayList(1);
-        map.put(pos,lst);
+        map.put(pos, lst);
       }
-      Tok tok = new Tok(t,pos);
+      Tok tok = new Tok(t, pos);
       lst.add(tok);
     }
 
@@ -330,70 +229,21 @@
 
     );
 
-    out.println("<table width=\"auto\" class=\"analysis\" border=\"1\">");
-
-    if (verbose) {
-      printRow(out,"term position", arr, new ToStr() {
-        public String toStr(Object o) {
-          return Integer.toString(((Tok)o).pos);
-        }
-      }
-              ,false
-              ,verbose
-              ,null);
-    }
-
-
-    printRow(out,"term text", arr, new ToStr() {
-      public String toStr(Object o) {
-        return ft.indexedToReadable( ((Tok)o).token.termText() );
-      }
-    }
-            ,true
-            ,verbose
-            ,match
-   );
-
-    if (needRaw) {
-      printRow(out,"raw text", arr, new ToStr() {
-        public String toStr(Object o) {
-          // todo: output in hex or something?
-          // check if it's all ascii or not?
-          return ((Tok)o).token.termText();
-        }
-      }
-              ,true
-              ,verbose
-              ,match
-      );
-    }
-
-    if (verbose) {
-      printRow(out,"term type", arr, new ToStr() {
-        public String toStr(Object o) {
-          return  ((Tok)o).token.type();
-        }
-      }
-              ,true
-              ,verbose,
-              null
-      );
-    }
-
-    if (verbose) {
-      printRow(out,"source start,end", arr, new ToStr() {
-        public String toStr(Object o) {
-          Token t = ((Tok)o).token;
-          return Integer.toString(t.startOffset()) + ',' + t.endOffset() ;
-        }
-      }
-              ,true
-              ,verbose
-              ,null
-      );
-    }
-
-    out.println("</table>");
+   out.println("    <tokens>");
+   for (int i = 0; i < arr.length; i++) {
+     for (Tok tok : arr[i]) {
+       out.print("      <token");
+       out.print(" type=\"" + tok.token.type() + "\"");
+       out.print(" pos=\"" + tok.pos + "\"");
+       out.print(" start=\"" + tok.token.startOffset() + "\"");
+       out.print(" end=\"" + tok.token.endOffset() + "\"");
+       out.print(">");
+       out.print(tok.token.termText());
+       out.println("      </token>");
+     }
+   }
+   out.println("    </tokens>");
+   out.println("  </factory>");
   }
 
 %>

Added: incubator/solr/trunk/src/webapp/resources/admin/analysis.xsl
URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/resources/admin/analysis.xsl?view=auto&rev=486373
==============================================================================
--- incubator/solr/trunk/src/webapp/resources/admin/analysis.xsl (added)
+++ incubator/solr/trunk/src/webapp/resources/admin/analysis.xsl Tue Dec 12 14:24:47 2006
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- $Id$ -->
+<!-- $URL$ -->
+
+<xsl:stylesheet
+  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+  version="1.0">
+
+  <xsl:output
+    method="html"
+    indent="yes"
+    doctype-public="-//W3C//DTD HTML 4.01//EN"
+    doctype-system="http://www.w3.org/TR/html4/strict.dtd" />
+
+  <xsl:template match="/">
+    <html>
+      <head>
+        <link rel="stylesheet" type="text/css" href="solr-admin.css"></link>
+        <link rel="icon" href="/favicon.ico" type="image/ico"></link>
+        <link rel="shortcut icon" href="/favicon.ico" type="image/ico"></link>
+        <title>SOLR Info</title>
+      </head>
+      <body>
+        <a href="">
+          <img border="0" align="right" height="61" width="142" src="solr-head.gif" alt="SOLR"/>
+  </a>
+        <h1>Solr Admin (<xsl:value-of select="solr/meta/collection" />)</h1>
+        <div style="margin-top: 1em;">
+          <h2>Field Analysis</h2>
+          <xsl:apply-templates/>
+          <a href=".">Return to Admin Page</a>
+        </div>
+      </body>
+    </html>
+  </xsl:template>
+
+  <xsl:include href="meta.xsl"/>
+
+  <xsl:template match="solr/analysis/form">
+  <form method="GET" action="analysis.jsp">
+    <table>
+      <tr>
+        <td>
+        <strong>Field name</strong>
+        </td>
+        <td>
+          <input class="std" name="name" type="text" value="{field}"/>
+        </td>
+      </tr>
+      <tr>
+        <td>
+        <strong>Field value (Index)</strong>
+        <br/>
+        verbose output <input name="verbose" type="checkbox" checked="true"/>
+        <br/>
+        highlight matches <input name="highlight" type="checkbox" checked="true"/>
+        </td>
+        <td>
+        <textarea class="std" rows="3" cols="70" name="val"><xsl:value-of select="fieldIndexValue" /></textarea>
+        </td>
+      </tr>
+      <tr>
+        <td>
+        <strong>Field value (Query)</strong>
+        <br/>
+        verbose output <input name="qverbose" type="checkbox" checked="true"/>
+        </td>
+        <td>
+        <textarea class="std" rows="1" cols="70" name="qval"><xsl:value-of select="fieldQueryValue" /></textarea>
+        </td>
+      </tr>
+      <tr>
+        <td>
+        </td>
+        <td>
+          <input class="stdbutton" type="submit" value="analyze"/>
+        </td>
+      </tr>
+    </table>
+  </form>
+</xsl:template>
+
+<xsl:template match="solr/analysis/results/indexAnalyzer">
+  <h4>Index Analyzer</h4>
+  <xsl:for-each select="factory">
+    <h5 style="margin-left: 1em;"><xsl:apply-templates select="@class"/></h5>
+    <xsl:apply-templates/>
+  </xsl:for-each>
+</xsl:template>
+
+<xsl:template match="solr/analysis/results/indexAnalyzer/factory/args">
+  <div style="margin-left: 2em; font-weight: bold;">{
+  <xsl:for-each select="arg">
+    <xsl:apply-templates select="@name"/>=<xsl:value-of select="."/>, 
+  </xsl:for-each>
+  }</div>
+</xsl:template>
+
+<xsl:template match="solr/analysis/results/indexAnalyzer/factory/tokens">
+<div style="margin-left: 2em;">
+  <table width="auto" class="analysis" border="1">
+    <tr>
+      <th>text</th>
+      <th>type</th>
+      <th>position</th>
+      <th>start</th>
+      <th>end</th>
+    </tr>
+  <xsl:for-each select="token">
+    <tr>
+      <td><xsl:value-of select="."/></td>
+      <td><xsl:apply-templates select="@type"/></td>
+      <td><xsl:apply-templates select="@pos"/></td>
+      <td><xsl:apply-templates select="@start"/></td>
+      <td><xsl:apply-templates select="@end"/></td>
+    </tr>
+  </xsl:for-each>
+  </table>
+</div>
+</xsl:template>
+
+<xsl:template match="solr/analysis/results/queryAnalyzer">
+  <h4>Query Analyzer</h4>
+  <xsl:for-each select="factory">
+    <h5 style="margin-left: 1em;"><xsl:apply-templates select="@class"/></h5>
+    <xsl:apply-templates/>
+  </xsl:for-each>
+</xsl:template>
+
+<xsl:template match="solr/analysis/results/queryAnalyzer/factory/args">
+  <div style="margin-left: 2em; font-weight: bold;">{
+  <xsl:for-each select="arg">
+    <xsl:apply-templates select="@name"/>=<xsl:value-of select="."/>, 
+  </xsl:for-each>
+  }</div>
+</xsl:template>
+
+<xsl:template match="solr/analysis/results/queryAnalyzer/factory/tokens">
+<div style="margin-left: 2em;">
+  <table width="auto" class="analysis" border="1">
+    <tr>
+      <th>text</th>
+      <th>type</th>
+      <th>position</th>
+      <th>start</th>
+      <th>end</th>
+    </tr>
+  <xsl:for-each select="token">
+    <tr>
+      <td><xsl:value-of select="."/></td>
+      <td><xsl:apply-templates select="@type"/></td>
+      <td><xsl:apply-templates select="@pos"/></td>
+      <td><xsl:apply-templates select="@start"/></td>
+      <td><xsl:apply-templates select="@end"/></td>
+    </tr>
+  </xsl:for-each>
+  </table>
+</div>
+</xsl:template>
+
+</xsl:stylesheet>

Added: incubator/solr/trunk/src/webapp/resources/admin/heading.jsp
URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/resources/admin/heading.jsp?view=auto&rev=486373
==============================================================================
--- incubator/solr/trunk/src/webapp/resources/admin/heading.jsp (added)
+++ incubator/solr/trunk/src/webapp/resources/admin/heading.jsp Tue Dec 12 14:24:47 2006
@@ -0,0 +1,23 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--%>
+<meta>
+  <collection><%= collectionName %></collection>
+  <host><%= hostname %></host>
+  <port><%= port %></port>
+  <cwd><%= cwd %></cwd>
+  <solrHome><%= solrHome %></solrHome>
+</meta>

Modified: incubator/solr/trunk/src/webapp/resources/admin/logging.jsp
URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/resources/admin/logging.jsp?view=diff&rev=486373&r1=486372&r2=486373
==============================================================================
--- incubator/solr/trunk/src/webapp/resources/admin/logging.jsp (original)
+++ incubator/solr/trunk/src/webapp/resources/admin/logging.jsp Tue Dec 12 14:24:47 2006
@@ -1,4 +1,4 @@
-<%@ page contentType="text/html; charset=utf-8" pageEncoding="UTF-8"%>
+<%@ page contentType="text/xml; charset=utf-8" pageEncoding="UTF-8" language="java" %>
 <%--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
@@ -24,12 +24,11 @@
 <%@ page import="java.util.logging.Level"%>
 <%@ page import="java.util.logging.LogManager"%>
 <%@ page import="java.util.logging.Logger"%>
-<%@include file="header.jsp" %>
-<%
 
-  LogManager mgr = LogManager.getLogManager();
-  Logger log = SolrCore.log;
+<?xml-stylesheet type="text/xsl" href="logging.xsl"?>
 
+<%
+  Logger log = SolrCore.log;
   Logger parent = log.getParent();
   while(parent != null) {
     log = parent;
@@ -38,39 +37,12 @@
   Level lvl = log.getLevel();
       
 %>
-<br clear="all">
-<h2>Solr Logging</h2>
-<table>
-  <tr>
-    <td>
-      <H3>Log Level:</H3>
-    </td>
-    <td>
-<% if (lvl!=null) {%>
-      <%= lvl.toString() %><br>
+<solr>
+  <logging>
+<% if (lvl != null) {%>
+      <logLevel><%= lvl.toString() %></logLevel>
 <% } else { %>
-      null<br>
+      <logLevel>null</logLevel>
 <% } %>
-    </td>
-  </tr>
-  <tr>
-    <td>
-    Set Level
-    </td>
-    <td>
-    [<a href=action.jsp?log=ALL>ALL</a>]
-    [<a href=action.jsp?log=CONFIG>CONFIG</a>]
-    [<a href=action.jsp?log=FINE>FINE</a>]
-    [<a href=action.jsp?log=FINER>FINER</a>]
-    [<a href=action.jsp?log=FINEST>FINEST</a>]
-    [<a href=action.jsp?log=INFO>INFO</a>]
-    [<a href=action.jsp?log=OFF>OFF</a>]
-    [<a href=action.jsp?log=SEVERE>SEVERE</a>]
-    [<a href=action.jsp?log=WARNING>WARNING</a>]
-    </td>
-  </tr>
-</table>
-<br><br>
-    <a href=".">Return to Admin Page</a>
-</body>
-</html>
+  </logging>
+</solr>

Added: incubator/solr/trunk/src/webapp/resources/admin/logging.xsl
URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/resources/admin/logging.xsl?view=auto&rev=486373
==============================================================================
--- incubator/solr/trunk/src/webapp/resources/admin/logging.xsl (added)
+++ incubator/solr/trunk/src/webapp/resources/admin/logging.xsl Tue Dec 12 14:24:47 2006
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- $Id$ -->
+<!-- $URL$ -->
+
+<xsl:stylesheet
+  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+  version="1.0">
+
+  <xsl:output
+    method="html"
+    indent="yes"
+    doctype-public="-//W3C//DTD HTML 4.01//EN"
+    doctype-system="http://www.w3.org/TR/html4/strict.dtd" />
+
+  <xsl:template match="/">
+    <html>
+      <head>
+        <link rel="stylesheet" type="text/css" href="solr-admin.css"></link>
+	<link rel="icon" href="/favicon.ico" type="image/ico"></link>
+	<link rel="shortcut icon" href="/favicon.ico" type="image/ico"></link>
+        <title>Solr Admin: Logging</title>
+      </head>
+      <body>
+        <a href="">
+	   <img border="0" align="right" height="61" width="142" src="solr-head.gif" alt="SOLR">
+	   </img>
+	</a>
+        <h1>Solr Admin (<xsl:value-of select="solr/meta/collection" />)</h1>
+        <div style="margin-top: 1em;">
+          <xsl:apply-templates/>
+        <div>
+        </div>
+          <a href=".">Return to Admin Page</a>
+        </div>
+      </body>
+    </html>
+  </xsl:template>
+
+  <xsl:include href="meta.xsl"/>
+
+  <xsl:template match="solr/logging">
+
+<br clear="all"/>
+<h2>Solr Logging</h2>
+<table>
+  <tr>
+    <td>
+      <H3>Log Level:</H3>
+    </td>
+    <td>
+<xsl:value-of select="logLevel" />
+    </td>
+  </tr>
+  <tr>
+    <td>
+    Set Level
+    </td>
+    <td>
+    [<a href="action.jsp?log=ALL">ALL</a>]
+    [<a href="action.jsp?log=CONFIG">CONFIG</a>]
+    [<a href="action.jsp?log=FINE">FINE</a>]
+    [<a href="action.jsp?log=FINER">FINER</a>]
+    [<a href="action.jsp?log=FINEST">FINEST</a>]
+    [<a href="action.jsp?log=INFO">INFO</a>]
+    [<a href="action.jsp?log=OFF">OFF</a>]
+    [<a href="action.jsp?log=SEVERE">SEVERE</a>]
+    [<a href="action.jsp?log=WARNING">WARNING</a>]
+    </td>
+  </tr>
+</table>
+
+  </xsl:template>
+</xsl:stylesheet>

Added: incubator/solr/trunk/src/webapp/resources/admin/meta.xsl
URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/resources/admin/meta.xsl?view=auto&rev=486373
==============================================================================
--- incubator/solr/trunk/src/webapp/resources/admin/meta.xsl (added)
+++ incubator/solr/trunk/src/webapp/resources/admin/meta.xsl Tue Dec 12 14:24:47 2006
@@ -0,0 +1,32 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<xsl:stylesheet
+  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+  version="1.0">
+
+  <xsl:output
+    method="html"
+    indent="yes"
+    doctype-public="-//W3C//DTD HTML 4.01//EN"
+    doctype-system="http://www.w3.org/TR/html4/strict.dtd" />
+
+  <xsl:template match="solr/meta">
+    <xsl:value-of select="host" />:<xsl:value-of select="port" />
+    cwd=<xsl:value-of select="cwd" /> SolrHome=<xsl:value-of select="solrHome" />
+  </xsl:template>
+
+</xsl:stylesheet>

Modified: incubator/solr/trunk/src/webapp/resources/admin/ping.jsp
URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/resources/admin/ping.jsp?view=diff&rev=486373&r1=486372&r2=486373
==============================================================================
--- incubator/solr/trunk/src/webapp/resources/admin/ping.jsp (original)
+++ incubator/solr/trunk/src/webapp/resources/admin/ping.jsp Tue Dec 12 14:24:47 2006
@@ -1,4 +1,4 @@
-<%@ page contentType="text/html; charset=utf-8" pageEncoding="UTF-8"%>
+<%@ page contentType="text/xml; charset=utf-8" pageEncoding="UTF-8" language="java" %>
 <%--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
@@ -17,10 +17,16 @@
 --%>
 <%@ page import="org.apache.solr.core.SolrConfig,
                  org.apache.solr.core.SolrCore,
+                 org.apache.solr.util.XML,
                  org.apache.solr.core.SolrException"%>
 <%@ page import="org.apache.solr.request.LocalSolrQueryRequest"%>
 <%@ page import="org.apache.solr.request.SolrQueryResponse"%>
 <%@ page import="java.util.StringTokenizer"%>
+
+<?xml-stylesheet type="text/xsl" href="ping.xsl"?>
+
+<solr>
+  <ping>
 <%
   SolrCore core = SolrCore.getSolrCore();
 
@@ -40,12 +46,31 @@
   SolrQueryResponse resp = new SolrQueryResponse();
   try {
     core.execute(req,resp);
-    if (resp.getException() != null) {
-      response.sendError(500, SolrException.toStr(resp.getException()));
+    if (resp.getException() == null) {
+// No need for explicit status in the body, when the standard HTTP
+// response codes already transmit success/failure message
+//      out.println("<status>200</status>");
+    }
+    else if (resp.getException() != null) {
+// No need for explicit status in the body, when the standard HTTP
+// response codes already transmit success/failure message
+//      out.println("<status>500</status>");
+      out.println("<error>");
+      XML.escapeCharData(SolrException.toStr(resp.getException()), out);
+      out.println("</error>");
+      response.sendError(500);
     }
   } catch (Throwable t) {
-      response.sendError(500, SolrException.toStr(t));
+// No need for explicit status in the body, when the standard HTTP
+// response codes already transmit success/failure message
+//      out.println("<status>500</status>");
+      out.println("<error>");
+      XML.escapeCharData(SolrException.toStr(t), out);
+      out.println("</error>");
+      response.sendError(500);
   } finally {
       req.close();
   }
 %>
+  </ping>
+</solr>

Added: incubator/solr/trunk/src/webapp/resources/admin/ping.xsl
URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/resources/admin/ping.xsl?view=auto&rev=486373
==============================================================================
--- incubator/solr/trunk/src/webapp/resources/admin/ping.xsl (added)
+++ incubator/solr/trunk/src/webapp/resources/admin/ping.xsl Tue Dec 12 14:24:47 2006
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- $Id$ -->
+<!-- $URL$ -->
+
+<xsl:stylesheet
+  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+  version="1.0">
+
+  <xsl:output
+    method="html"
+    indent="yes"
+    doctype-public="-//W3C//DTD HTML 4.01//EN"
+    doctype-system="http://www.w3.org/TR/html4/strict.dtd" />
+
+  <xsl:template match="/">
+    <html>
+      <head>
+        <link rel="stylesheet" type="text/css" href="solr-admin.css"></link>
+	<link rel="icon" href="/favicon.ico" type="image/ico"></link>
+	<link rel="shortcut icon" href="/favicon.ico" type="image/ico"></link>
+        <title>Solr Admin: Ping</title>
+      </head>
+      <body>
+        <a href="">
+	   <img border="0" align="right" height="61" width="142" src="solr-head.gif" alt="SOLR">
+	   </img>
+	</a>
+        <h1>Solr Admin (<xsl:value-of select="solr/meta/collection" />)</h1>
+        <div style="margin-top: 1em;">
+          <xsl:apply-templates/>
+        <div>
+        </div>
+          <a href=".">Return to Admin Page</a>
+        </div>
+      </body>
+    </html>
+  </xsl:template>
+
+  <xsl:include href="meta.xsl"/>
+
+  <xsl:template match="solr/ping">
+  <table>
+    <tr>
+      <td>
+        <H3>Ping</H3>
+      </td>
+      <td>
+        <xsl:value-of select="error" />
+      </td>
+    </tr>
+  </table>
+  </xsl:template>
+</xsl:stylesheet>

Modified: incubator/solr/trunk/src/webapp/resources/admin/threaddump.jsp
URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/resources/admin/threaddump.jsp?view=diff&rev=486373&r1=486372&r2=486373
==============================================================================
--- incubator/solr/trunk/src/webapp/resources/admin/threaddump.jsp (original)
+++ incubator/solr/trunk/src/webapp/resources/admin/threaddump.jsp Tue Dec 12 14:24:47 2006
@@ -1,4 +1,4 @@
-<%@ page contentType="text/html; charset=utf-8" pageEncoding="UTF-8"%>
+<%@ page contentType="text/xml; charset=utf-8" pageEncoding="UTF-8" language="java" %>
 <%--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
@@ -18,101 +18,87 @@
 <%@ page import="java.lang.management.ManagementFactory,
                  java.lang.management.ThreadMXBean,
                  java.lang.management.ThreadInfo,
-                 java.io.IOException"%>
-<%@include file="header.jsp" %>
+                 java.io.IOException,
+                 org.apache.solr.util.XML"%>
+
+<?xml-stylesheet type="text/xsl" href="threaddump.xsl"?>
+
 <%!
   static ThreadMXBean tmbean = ManagementFactory.getThreadMXBean();
 %>
-<br clear="all">
-<h2>Thread Dump</h2>
-<table>
-<tr>
-<td>
-<%
-  out.print(System.getProperty("java.vm.name") +
-            " " + System.getProperty("java.vm.version") + "<br>");
-%>
-</td>
-</tr>
-<tr>
-<td>
+<solr>
+  <system>
+  <jvm>
+    <version><%=System.getProperty("java.vm.version")%></version>
+    <name><%=System.getProperty("java.vm.name")%></name>
+  </jvm>
+  <threadCount>
+    <current><%=tmbean.getThreadCount()%></current>
+    <peak><%=tmbean.getPeakThreadCount()%></peak>
+    <daemon><%=tmbean.getDaemonThreadCount()%></daemon>
+  </threadCount>
 <%
   long[] tids;
   ThreadInfo[] tinfos;
-
-  out.print("Thread Count: current=" + tmbean.getThreadCount() +
-            " deamon=" + tmbean.getDaemonThreadCount() +
-            " peak=" + tmbean.getPeakThreadCount());
-%>
-</td>
-</tr>
-<tr>
-<td>
-<%
   tids = tmbean.findMonitorDeadlockedThreads();
-  if (tids == null) {
-      out.print("No deadlock found.");
-  }
-  else {
-      out.print("Deadlock found :-");
+  if (tids != null) {
+      out.println("  <deadlocks>");
       tinfos = tmbean.getThreadInfo(tids, Integer.MAX_VALUE);
       for (ThreadInfo ti : tinfos) {
           printThreadInfo(ti, out);
       }
+      out.println("  </deadlocks>");
   }
 %>
-</td>
-</tr>
-<tr>
-<td>
 <%
-  out.print("Full Thread Dump:<br>");
   tids = tmbean.getAllThreadIds();
   tinfos = tmbean.getThreadInfo(tids, Integer.MAX_VALUE);
+  out.println("  <threadDump>");
   for (ThreadInfo ti : tinfos) {
      printThreadInfo(ti, out);
   }
+  out.println("  </threadDump>");
 %>
-</td>
-</tr>
-</table>
-<br><br>
-    <a href=".">Return to Admin Page</a>
-</body>
-</html>
+  </system>
+</solr>
 
 <%!
-  static String INDENT = "&nbsp&nbsp&nbsp&nbsp ";
-
   static void printThreadInfo(ThreadInfo ti, JspWriter out) throws IOException {
       long tid = ti.getThreadId();
-      StringBuilder sb = new StringBuilder("\"" + ti.getThreadName() + "\"" +
-                                           " Id=" + tid +
-                                           " in " + ti.getThreadState());
+      out.println("    <thread>");
+      out.println("      <id>" + tid + "</id>");
+      out.print("      <name>");
+      XML.escapeCharData(ti.getThreadName(), out);
+      out.println("</name>");
+      out.println("      <state>" + ti.getThreadState() + "</state>");
       if (ti.getLockName() != null) {
-          sb.append(" on lock=" + ti.getLockName());
+          out.println("      <lock>" + ti.getLockName() + "</lock>");
       }
       if (ti.isSuspended()) {
-          sb.append(" (suspended)");
+          out.println("      <suspended/>");
       }
       if (ti.isInNative()) {
-          sb.append(" (running in native)");
+          out.println("      <inNative/>");
       }
       if (tmbean.isThreadCpuTimeSupported()) {
-          sb.append(" total cpu time="
-                    +formatNanos(tmbean.getThreadCpuTime(tid)));
-          sb.append(" user time="
-                    +formatNanos(tmbean.getThreadUserTime(tid)));
+          out.println("      <cpuTime>" + formatNanos(tmbean.getThreadCpuTime(tid)) + "</cpuTime>");
+          out.println("      <userTime>" + formatNanos(tmbean.getThreadUserTime(tid)) + "</userTime>");
       }
-      out.print(sb.toString()+"<br>");
+
       if (ti.getLockOwnerName() != null) {
-          out.print(INDENT + " owned by " + ti.getLockOwnerName() +
-                    " Id=" + ti.getLockOwnerId()+"<br>");
+          out.println("      <owner>");
+          out.println("        <name>" + ti.getLockOwnerName() + "</name>");
+          out.println("        <id>" + ti.getLockOwnerId() + "</id>");
+          out.println("      </owner>");
       }
+      out.println("      <stackTrace>");
       for (StackTraceElement ste : ti.getStackTrace()) {
-          out.print(INDENT + "at " + ste.toString()+"<br>");
+          out.print("        <line>");
+          XML.escapeCharData("at " + ste.toString(), out);
+          out.println("        </line>");
       }
-      out.print("<br>");
+      out.println("      </stackTrace>");
+      out.println("    </thread>");
   }
 
   static String formatNanos(long ns) {

Added: incubator/solr/trunk/src/webapp/resources/admin/threaddump.xsl
URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/resources/admin/threaddump.xsl?view=auto&rev=486373
==============================================================================
--- incubator/solr/trunk/src/webapp/resources/admin/threaddump.xsl (added)
+++ incubator/solr/trunk/src/webapp/resources/admin/threaddump.xsl Tue Dec 12 14:24:47 2006
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- $Id$ -->
+<!-- $URL$ -->
+
+<xsl:stylesheet
+  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+  version="1.0">
+
+  <xsl:output
+    method="html"
+    indent="yes"
+    doctype-public="-//W3C//DTD HTML 4.01//EN"
+    doctype-system="http://www.w3.org/TR/html4/strict.dtd" />
+
+  <xsl:template match="/">
+    <html>
+      <head>
+        <link rel="stylesheet" type="text/css" href="solr-admin.css"></link>
+        <link rel="icon" href="/favicon.ico" type="image/ico"></link>
+        <link rel="shortcut icon" href="/favicon.ico" type="image/ico"></link>
+        <title>SOLR Info</title>
+      </head>
+      <body>
+        <a href="">
+          <img border="0" align="right" height="61" width="142" src="solr-head.gif" alt="SOLR"/>
+        </a>
+        <h1>Solr Admin (<xsl:value-of select="solr/meta/collection" />)</h1>
+        <h2>Thread Dump</h2>
+        <div style="margin-top: 1em;">
+          <table>
+            <xsl:apply-templates/>
+          </table>
+          <a href=".">Return to Admin Page</a>
+        </div>
+      </body>
+    </html>
+  </xsl:template>
+
+  <xsl:include href="meta.xsl"/>
+
+  <xsl:template match="solr/system/jvm">
+    <tr>
+      <td><xsl:value-of select="name"/> <xsl:value-of select="version"/></td>
+    </tr>
+  </xsl:template>
+
+  <xsl:template match="solr/system/threadCount">
+    <tr>
+      <td>
+        Thread Count:
+        current=<xsl:value-of select="current"/>,
+        peak=<xsl:value-of select="peak"/>,
+        daemon=<xsl:value-of select="daemon"/></td>
+    </tr>
+  </xsl:template>
+
+  <xsl:template match="solr/system/threadDump">
+    <div>Full Thread Dump:</div>
+    <xsl:for-each select="thread">
+      <!-- OG: TODO: add suspended/native conditionals -->
+      <tr>
+        <td style="margin-left: 1em; font-weight: bold;">
+          '<xsl:value-of select="name"/>' 
+          Id=<xsl:value-of select="id"/>, 
+          <xsl:value-of select="state"/> 
+          on lock=<xsl:value-of select="lock"/>, 
+          total cpu time=<xsl:value-of select="cpuTime"/> 
+          user time=<xsl:value-of select="userTime"/>
+        </td>
+      </tr>
+      <xsl:apply-templates select="stackTrace"/>
+    </xsl:for-each>
+  </xsl:template>
+
+  <xsl:template match="stackTrace">
+    <tr>
+      <td style="margin-left: 1em;">
+        <xsl:for-each select="line">
+          <xsl:value-of select="."/><br/>
+        </xsl:for-each>
+      </td>
+    </tr>
+  </xsl:template>
+
+</xsl:stylesheet>



Re: svn commit: r486373 - in /incubator/solr/trunk: ./ src/webapp/resources/admin/

Posted by Erik Hatcher <er...@ehatchersolutions.com>.
Ummm, wow, I was deep down in my old e-mails and somehow neglected to  
notice the date on this.  I believe this patch was reverted so this  
no longer a current issue.  Sorry for the noise.

	Erik


On Jan 31, 2007, at 5:21 AM, Erik Hatcher wrote:

> Otis,
>
> This looks brittle - lots of things need escaping when just string  
> concatenating to build XML.
>
> I'm betting that bad XML could easily be generated.  No??
>
> 	Erik
>
>
> On Dec 12, 2006, at 5:24 PM, otis@apache.org wrote:
>
>> Author: otis
>> Date: Tue Dec 12 14:24:47 2006
>> New Revision: 486373
>>
>> URL: http://svn.apache.org/viewvc?view=rev&rev=486373
>> Log:
>> - SOLR-58: make admin pages return XML and transform them to HTML  
>> using XSL
>>
>> Added:
>>     incubator/solr/trunk/src/webapp/resources/admin/analysis.xsl
>>     incubator/solr/trunk/src/webapp/resources/admin/heading.jsp
>>     incubator/solr/trunk/src/webapp/resources/admin/logging.xsl
>>     incubator/solr/trunk/src/webapp/resources/admin/meta.xsl
>>     incubator/solr/trunk/src/webapp/resources/admin/ping.xsl
>>     incubator/solr/trunk/src/webapp/resources/admin/threaddump.xsl
>> Modified:
>>     incubator/solr/trunk/CHANGES.txt
>>     incubator/solr/trunk/src/webapp/resources/admin/analysis.jsp
>>     incubator/solr/trunk/src/webapp/resources/admin/logging.jsp
>>     incubator/solr/trunk/src/webapp/resources/admin/ping.jsp
>>     incubator/solr/trunk/src/webapp/resources/admin/threaddump.jsp
>>
>> Modified: incubator/solr/trunk/CHANGES.txt
>> URL: http://svn.apache.org/viewvc/incubator/solr/trunk/CHANGES.txt? 
>> view=diff&rev=486373&r1=486372&r2=486373
>> ===================================================================== 
>> =========
>> --- incubator/solr/trunk/CHANGES.txt (original)
>> +++ incubator/solr/trunk/CHANGES.txt Tue Dec 12 14:24:47 2006
>> @@ -118,6 +118,8 @@
>>      through multiple threads.  Large commits also might be faster  
>> (klaas, SOLR-65)
>>   9. Lazy field loading can be enabled via a solrconfig  
>> directive.  This will be faster when
>>      not all stored fields are needed from a document (klaas,  
>> SOLR-52)
>> +10. Made admin JSPs return XML and transform them with new XSL  
>> stylesheets
>> +    (Otis Gospodnetic, SOLR-58)
>>
>>  Optimizations
>>   1. getDocListAndSet can now generate both a DocList and a DocSet  
>> from a
>>
>> Modified: incubator/solr/trunk/src/webapp/resources/admin/ 
>> analysis.jsp
>> URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/ 
>> resources/admin/analysis.jsp?view=diff&rev=486373&r1=486372&r2=486373
>> ===================================================================== 
>> =========
>> --- incubator/solr/trunk/src/webapp/resources/admin/analysis.jsp  
>> (original)
>> +++ incubator/solr/trunk/src/webapp/resources/admin/analysis.jsp  
>> Tue Dec 12 14:24:47 2006
>> @@ -1,20 +1,4 @@
>> -<%@ page contentType="text/html; charset=utf-8"  
>> pageEncoding="UTF-8"%>
>> -<%--
>> - Licensed to the Apache Software Foundation (ASF) under one or more
>> - contributor license agreements.  See the NOTICE file distributed  
>> with
>> - this work for additional information regarding copyright ownership.
>> - The ASF licenses this file to You under the Apache License,  
>> Version 2.0
>> - (the "License"); you may not use this file except in compliance  
>> with
>> - the License.  You may obtain a copy of the License at
>> -
>> -     http://www.apache.org/licenses/LICENSE-2.0
>> -
>> - Unless required by applicable law or agreed to in writing, software
>> - distributed under the License is distributed on an "AS IS" BASIS,
>> - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or  
>> implied.
>> - See the License for the specific language governing permissions and
>> - limitations under the License.
>> ---%>
>> +<%@ page contentType="text/xml; charset=utf-8"  
>> pageEncoding="UTF-8" language="java" %>
>>  <%@ page import="org.apache.lucene.analysis.Analyzer,
>>                   org.apache.lucene.analysis.Token,
>>                   org.apache.lucene.analysis.TokenStream,
>> @@ -30,129 +14,86 @@
>>  <%@ page import="java.io.StringReader"%>
>>  <%@ page import="java.util.*"%>
>>
>> -<%-- $Id$ --%>
>> -<%-- $Source: /cvs/main/searching/org.apache.solrolarServer/ 
>> resources/admin/analysis.jsp,v $ --%>
>> -<%-- $Name:  $ --%>
>> +<?xml-stylesheet type="text/xsl" href="analysis.xsl"?>
>>
>> -<%@include file="header.jsp" %>
>> +<%@include file="_info.jsp" %>
>>
>>  <%
>>    String name = request.getParameter("name");
>> -  if (name==null || name.length()==0) name="";
>> +  if (name == null || name.length() == 0) name = "";
>>    String val = request.getParameter("val");
>> -  if (val==null || val.length()==0) val="";
>> +  if (val == null || val.length() == 0) val = "";
>>    String qval = request.getParameter("qval");
>> -  if (qval==null || qval.length()==0) qval="";
>> +  if (qval == null || qval.length() == 0) qval = "";
>>    String verboseS = request.getParameter("verbose");
>> -  boolean verbose = verboseS!=null && verboseS.equalsIgnoreCase 
>> ("on");
>> +  boolean verbose = verboseS != null && verboseS.equalsIgnoreCase 
>> ("on");
>>    String qverboseS = request.getParameter("qverbose");
>> -  boolean qverbose = qverboseS!=null && qverboseS.equalsIgnoreCase 
>> ("on");
>> +  boolean qverbose = qverboseS != null &&  
>> qverboseS.equalsIgnoreCase("on");
>>    String highlightS = request.getParameter("highlight");
>> -  boolean highlight = highlightS!=null &&  
>> highlightS.equalsIgnoreCase("on");
>> +  boolean highlight = highlightS != null &&  
>> highlightS.equalsIgnoreCase("on");
>>  %>
>>
>> -<br clear="all">
>> -
>> -<h2>Field Analysis</h2>
>> -
>> -<form method="GET" action="analysis.jsp">
>> -<table>
>> -<tr>
>> -  <td>
>> -	<strong>Field name</strong>
>> -  </td>
>> -  <td>
>> -	<input class="std" name="name" type="text" value="<%= name %>">
>> -  </td>
>> -</tr>
>> -<tr>
>> -  <td>
>> -	<strong>Field value (Index)</strong>
>> -  <br/>
>> -  verbose output
>> -  <input name="verbose" type="checkbox"
>> -     <%= verbose ? "checked=\"true\"" : "" %> >
>> -    <br/>
>> -  highlight matches
>> -  <input name="highlight" type="checkbox"
>> -     <%= highlight ? "checked=\"true\"" : "" %> >
>> -  </td>
>> -  <td>
>> -	<textarea class="std" rows="3" cols="70" name="val"><%= val %></ 
>> textarea>
>> -  </td>
>> -</tr>
>> -<tr>
>> -  <td>
>> -	<strong>Field value (Query)</strong>
>> -  <br/>
>> -  verbose output
>> -  <input name="qverbose" type="checkbox"
>> -     <%= qverbose ? "checked=\"true\"" : "" %> >
>> -  </td>
>> -  <td>
>> -	<textarea class="std" rows="1" cols="70" name="qval"><%= qval % 
>> ></textarea>
>> -  </td>
>> -</tr>
>> -<tr>
>> -
>> -  <td>
>> -  </td>
>> -
>> -  <td>
>> -	<input class="stdbutton" type="submit" value="analyze">
>> -  </td>
>> -
>> -</tr>
>> -</table>
>> -</form>
>> -
>> +<solr>
>> +<%@include file="heading.jsp" %>
>> +  <analysis>
>>
>>  <%
>> -  SchemaField field=null;
>> +  SchemaField field = null;
>>
>> -  if (name!="") {
>> +  if (name != "") {
>>      try {
>>        field = schema.getField(name);
>>      } catch (Exception e) {
>> -      out.println("<strong>Unknown Field " + name + "</strong>");
>> +      out.println("<error>Unknown Field " + name + "</error>");
>>      }
>>    }
>>
>> -  if (field!=null) {
>> +  if (field != null) {
>> +    out.println("    <form>");
>> +    out.println("      <field>");
>> +      XML.escapeCharData(name, out);
>> +    out.println("</field>");
>> +    out.print("      <fieldIndexValue>");
>> +      XML.escapeCharData(val, out);
>> +    out.println("      </fieldIndexValue>");
>> +    out.print("      <fieldQueryValue>");
>> +      XML.escapeCharData(qval, out);
>> +    out.println("      </fieldQueryValue>");
>> +    out.println("    </form>");
>> +
>>      HashSet<Tok> matches = null;
>> -    if (qval!="" && highlight) {
>> +    if (qval != "" && highlight) {
>>        Reader reader = new StringReader(qval);
>>        Analyzer analyzer =  field.getType().getQueryAnalyzer();
>> -      TokenStream tstream = analyzer.tokenStream(field.getName 
>> (),reader);
>> +      TokenStream tstream = analyzer.tokenStream(field.getName(),  
>> reader);
>>        List<Token> tokens = getTokens(tstream);
>>        matches = new HashSet<Tok>();
>> -      for (Token t : tokens) { matches.add( new Tok(t,0)); }
>> +      for (Token t : tokens) { matches.add( new Tok(t, 0)); }
>>      }
>>
>> -    if (val!="") {
>> -      out.println("<h3>Index Analyzer</h3>");
>> -      doAnalyzer(out, field, val, false, verbose,matches);
>> +    out.println("    <results>");
>> +    if (val != "") {
>> +      out.println("<indexAnalyzer>");
>> +      doAnalyzer(out, field, val, false, verbose, matches);
>> +      out.println("</indexAnalyzer>");
>>      }
>> -    if (qval!="") {
>> -      out.println("<h3>Query Analyzer</h3>");
>> -      doAnalyzer(out, field, qval, true, qverbose,null);
>> +    if (qval != "") {
>> +      out.println("<queryAnalyzer>");
>> +      doAnalyzer(out, field, qval, true, qverbose, null);
>> +      out.println("</queryAnalyzer>");
>>      }
>> +    out.println("    </results>");
>>    }
>> -
>>  %>
>> -
>> -
>> -</body>
>> -</html>
>> -
>> +  </analysis>
>> +</solr>
>>
>>  <%!
>>    private static void doAnalyzer(JspWriter out, SchemaField  
>> field, String val, boolean queryAnalyser, boolean verbose,  
>> Set<Tok> match) throws Exception {
>>      Reader reader = new StringReader(val);
>>
>>      FieldType ft = field.getType();
>> -     Analyzer analyzer = queryAnalyser ?
>> -             ft.getQueryAnalyzer() : ft.getAnalyzer();
>> +    Analyzer analyzer = queryAnalyser ? ft.getQueryAnalyzer() :  
>> ft.getAnalyzer();
>>       if (analyzer instanceof TokenizerChain) {
>>         TokenizerChain tchain = (TokenizerChain)analyzer;
>>         TokenizerFactory tfac = tchain.getTokenizerFactory();
>> @@ -161,12 +102,14 @@
>>         TokenStream tstream = tfac.create(reader);
>>         List<Token> tokens = getTokens(tstream);
>>         tstream = tfac.create(reader);
>> +       // write tokenizer factories
>>         if (verbose) {
>>           writeHeader(out, tfac.getClass(), tfac.getArgs());
>>         }
>>
>>         writeTokens(out, tokens, ft, verbose, match);
>>
>> +       // write filter factories
>>         for (TokenFilterFactory filtfac : filtfacs) {
>>           if (verbose) {
>>             writeHeader(out, filtfac.getClass(), filtfac.getArgs());
>> @@ -183,7 +126,6 @@
>>
>>           writeTokens(out, tokens, ft, verbose, match);
>>         }
>> -
>>       } else {
>>         TokenStream tstream = analyzer.tokenStream(field.getName 
>> (),reader);
>>         List<Token> tokens = getTokens(tstream);
>> @@ -199,7 +141,7 @@
>>      List<Token> tokens = new ArrayList<Token>();
>>      while (true) {
>>        Token t = tstream.next();
>> -      if (t==null) break;
>> +      if (t == null) break;
>>        tokens.add(t);
>>      }
>>      return tokens;
>> @@ -210,8 +152,8 @@
>>      Token token;
>>      int pos;
>>      Tok(Token token, int pos) {
>> -      this.token=token;
>> -      this.pos=pos;
>> +      this.token = token;
>> +      this.pos = pos;
>>      }
>>
>>      public boolean equals(Object o) {
>> @@ -221,7 +163,7 @@
>>        return token.termText().hashCode();
>>      }
>>      public String toString() {
>> -      return token.termText();
>> +      return token.termText() + " at position " + pos;
>>      }
>>    }
>>
>> @@ -229,81 +171,38 @@
>>      public String toStr(Object o);
>>    }
>>
>> -  private static void printRow(JspWriter out, String header, List 
>> [] arrLst, ToStr converter, boolean multival, boolean verbose,  
>> Set<Tok> match) throws IOException {
>> -    // find the maximum number of terms for any position
>> -    int maxSz=1;
>> -    if (multival) {
>> -      for (List lst : arrLst) {
>> -        maxSz = Math.max(lst.size(), maxSz);
>> -      }
>> -    }
>> -
>> -
>> -    for (int idx=0; idx<maxSz; idx++) {
>> -      out.println("<tr>");
>> -      if (idx==0 && verbose) {
>> -        if (header != null) {
>> -          out.print("<th NOWRAP rowspan=\""+maxSz+"\">");
>> -          XML.escapeCharData(header,out);
>> -          out.println("</th>");
>> -        }
>> -      }
>> -
>> -      for (List<Tok> lst : arrLst) {
>> -        if (lst.size() <= idx) continue;
>> -        if (match!=null && match.contains(lst.get(idx))) {
>> -          out.print("<td class=\"highlight\"");
>> -        } else {
>> -          out.print("<td class=\"debugdata\"");
>> -        }
>> -
>> -        if (idx==0 && lst.size()==1 && maxSz > 1) {
>> -          out.print("rowspan=\""+maxSz+'"');
>> -        }
>> -
>> -        out.print('>');
>> -
>> -        XML.escapeCharData(converter.toStr(lst.get(idx)), out);
>> -        out.print("</td>");
>> -      }
>> -
>> -      out.println("</tr>");
>> -    }
>> -
>> -  }
>> -
>> -
>> -
>>    static void writeHeader(JspWriter out, Class clazz,  
>> Map<String,String> args) throws IOException {
>> -    out.print("<h4>");
>> -    out.print(clazz.getName());
>> -    XML.escapeCharData("   "+args,out);
>> -    out.println("</h4>");
>> +    out.println("  <factory class=\"" + clazz.getName() + "\">");
>> +    out.println("    <args>");
>> +    for (Iterator<String> iter = args.keySet().iterator();  
>> iter.hasNext(); ) {
>> +      String key = iter.next();
>> +      String value = args.get(key);
>> +      out.println("      <arg name=\"" + key + "\">" + value + "</ 
>> arg>");
>> +    }
>> +    out.println("    </args>");
>>    }
>>
>> -
>> -
>>    // readable, raw, pos, type, start/end
>>    static void writeTokens(JspWriter out, List<Token> tokens,  
>> final FieldType ft, boolean verbose, Set<Tok> match) throws  
>> IOException {
>>
>>      // Use a map to tell what tokens are in what positions
>>      // because some tokenizers/filters may do funky stuff with
>>      // very large increments, or negative increments.
>> -    HashMap<Integer,List<Tok>> map = new  
>> HashMap<Integer,List<Tok>>();
>> -    boolean needRaw=false;
>> -    int pos=0;
>> +    HashMap<Integer, List<Tok>> map = new HashMap<Integer,  
>> List<Tok>>();
>> +    boolean needRaw = false;
>> +    int pos = 0;
>>      for (Token t : tokens) {
>>        if (!t.termText().equals(ft.indexedToReadable(t.termText 
>> ()))) {
>> -        needRaw=true;
>> +        needRaw = true;
>>        }
>>
>>        pos += t.getPositionIncrement();
>>        List lst = map.get(pos);
>> -      if (lst==null) {
>> +      if (lst == null) {
>>          lst = new ArrayList(1);
>> -        map.put(pos,lst);
>> +        map.put(pos, lst);
>>        }
>> -      Tok tok = new Tok(t,pos);
>> +      Tok tok = new Tok(t, pos);
>>        lst.add(tok);
>>      }
>>
>> @@ -330,70 +229,21 @@
>>
>>      );
>>
>> -    out.println("<table width=\"auto\" class=\"analysis\" border= 
>> \"1\">");
>> -
>> -    if (verbose) {
>> -      printRow(out,"term position", arr, new ToStr() {
>> -        public String toStr(Object o) {
>> -          return Integer.toString(((Tok)o).pos);
>> -        }
>> -      }
>> -              ,false
>> -              ,verbose
>> -              ,null);
>> -    }
>> -
>> -
>> -    printRow(out,"term text", arr, new ToStr() {
>> -      public String toStr(Object o) {
>> -        return ft.indexedToReadable( ((Tok)o).token.termText() );
>> -      }
>> -    }
>> -            ,true
>> -            ,verbose
>> -            ,match
>> -   );
>> -
>> -    if (needRaw) {
>> -      printRow(out,"raw text", arr, new ToStr() {
>> -        public String toStr(Object o) {
>> -          // todo: output in hex or something?
>> -          // check if it's all ascii or not?
>> -          return ((Tok)o).token.termText();
>> -        }
>> -      }
>> -              ,true
>> -              ,verbose
>> -              ,match
>> -      );
>> -    }
>> -
>> -    if (verbose) {
>> -      printRow(out,"term type", arr, new ToStr() {
>> -        public String toStr(Object o) {
>> -          return  ((Tok)o).token.type();
>> -        }
>> -      }
>> -              ,true
>> -              ,verbose,
>> -              null
>> -      );
>> -    }
>> -
>> -    if (verbose) {
>> -      printRow(out,"source start,end", arr, new ToStr() {
>> -        public String toStr(Object o) {
>> -          Token t = ((Tok)o).token;
>> -          return Integer.toString(t.startOffset()) + ',' +  
>> t.endOffset() ;
>> -        }
>> -      }
>> -              ,true
>> -              ,verbose
>> -              ,null
>> -      );
>> -    }
>> -
>> -    out.println("</table>");
>> +   out.println("    <tokens>");
>> +   for (int i = 0; i < arr.length; i++) {
>> +     for (Tok tok : arr[i]) {
>> +       out.print("      <token");
>> +       out.print(" type=\"" + tok.token.type() + "\"");
>> +       out.print(" pos=\"" + tok.pos + "\"");
>> +       out.print(" start=\"" + tok.token.startOffset() + "\"");
>> +       out.print(" end=\"" + tok.token.endOffset() + "\"");
>> +       out.print(">");
>> +       out.print(tok.token.termText());
>> +       out.println("      </token>");
>> +     }
>> +   }
>> +   out.println("    </tokens>");
>> +   out.println("  </factory>");
>>    }
>>
>>  %>
>>
>> Added: incubator/solr/trunk/src/webapp/resources/admin/analysis.xsl
>> URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/ 
>> resources/admin/analysis.xsl?view=auto&rev=486373
>> ===================================================================== 
>> =========
>> --- incubator/solr/trunk/src/webapp/resources/admin/analysis.xsl  
>> (added)
>> +++ incubator/solr/trunk/src/webapp/resources/admin/analysis.xsl  
>> Tue Dec 12 14:24:47 2006
>> @@ -0,0 +1,177 @@
>> +<?xml version="1.0" encoding="utf-8"?>
>> +<!--
>> + Licensed to the Apache Software Foundation (ASF) under one or more
>> + contributor license agreements.  See the NOTICE file distributed  
>> with
>> + this work for additional information regarding copyright ownership.
>> + The ASF licenses this file to You under the Apache License,  
>> Version 2.0
>> + (the "License"); you may not use this file except in compliance  
>> with
>> + the License.  You may obtain a copy of the License at
>> +
>> +     http://www.apache.org/licenses/LICENSE-2.0
>> +
>> + Unless required by applicable law or agreed to in writing, software
>> + distributed under the License is distributed on an "AS IS" BASIS,
>> + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or  
>> implied.
>> + See the License for the specific language governing permissions and
>> + limitations under the License.
>> +-->
>> +<!-- $Id$ -->
>> +<!-- $URL$ -->
>> +
>> +<xsl:stylesheet
>> +  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>> +  version="1.0">
>> +
>> +  <xsl:output
>> +    method="html"
>> +    indent="yes"
>> +    doctype-public="-//W3C//DTD HTML 4.01//EN"
>> +    doctype-system="http://www.w3.org/TR/html4/strict.dtd" />
>> +
>> +  <xsl:template match="/">
>> +    <html>
>> +      <head>
>> +        <link rel="stylesheet" type="text/css" href="solr- 
>> admin.css"></link>
>> +        <link rel="icon" href="/favicon.ico" type="image/ico"></ 
>> link>
>> +        <link rel="shortcut icon" href="/favicon.ico" type="image/ 
>> ico"></link>
>> +        <title>SOLR Info</title>
>> +      </head>
>> +      <body>
>> +        <a href="">
>> +          <img border="0" align="right" height="61" width="142"  
>> src="solr-head.gif" alt="SOLR"/>
>> +  </a>
>> +        <h1>Solr Admin (<xsl:value-of select="solr/meta/ 
>> collection" />)</h1>
>> +        <div style="margin-top: 1em;">
>> +          <h2>Field Analysis</h2>
>> +          <xsl:apply-templates/>
>> +          <a href=".">Return to Admin Page</a>
>> +        </div>
>> +      </body>
>> +    </html>
>> +  </xsl:template>
>> +
>> +  <xsl:include href="meta.xsl"/>
>> +
>> +  <xsl:template match="solr/analysis/form">
>> +  <form method="GET" action="analysis.jsp">
>> +    <table>
>> +      <tr>
>> +        <td>
>> +        <strong>Field name</strong>
>> +        </td>
>> +        <td>
>> +          <input class="std" name="name" type="text"  
>> value="{field}"/>
>> +        </td>
>> +      </tr>
>> +      <tr>
>> +        <td>
>> +        <strong>Field value (Index)</strong>
>> +        <br/>
>> +        verbose output <input name="verbose" type="checkbox"  
>> checked="true"/>
>> +        <br/>
>> +        highlight matches <input name="highlight" type="checkbox"  
>> checked="true"/>
>> +        </td>
>> +        <td>
>> +        <textarea class="std" rows="3" cols="70"  
>> name="val"><xsl:value-of select="fieldIndexValue" /></textarea>
>> +        </td>
>> +      </tr>
>> +      <tr>
>> +        <td>
>> +        <strong>Field value (Query)</strong>
>> +        <br/>
>> +        verbose output <input name="qverbose" type="checkbox"  
>> checked="true"/>
>> +        </td>
>> +        <td>
>> +        <textarea class="std" rows="1" cols="70"  
>> name="qval"><xsl:value-of select="fieldQueryValue" /></textarea>
>> +        </td>
>> +      </tr>
>> +      <tr>
>> +        <td>
>> +        </td>
>> +        <td>
>> +          <input class="stdbutton" type="submit" value="analyze"/>
>> +        </td>
>> +      </tr>
>> +    </table>
>> +  </form>
>> +</xsl:template>
>> +
>> +<xsl:template match="solr/analysis/results/indexAnalyzer">
>> +  <h4>Index Analyzer</h4>
>> +  <xsl:for-each select="factory">
>> +    <h5 style="margin-left: 1em;"><xsl:apply-templates  
>> select="@class"/></h5>
>> +    <xsl:apply-templates/>
>> +  </xsl:for-each>
>> +</xsl:template>
>> +
>> +<xsl:template match="solr/analysis/results/indexAnalyzer/factory/ 
>> args">
>> +  <div style="margin-left: 2em; font-weight: bold;">{
>> +  <xsl:for-each select="arg">
>> +    <xsl:apply-templates select="@name"/>=<xsl:value-of  
>> select="."/>,
>> +  </xsl:for-each>
>> +  }</div>
>> +</xsl:template>
>> +
>> +<xsl:template match="solr/analysis/results/indexAnalyzer/factory/ 
>> tokens">
>> +<div style="margin-left: 2em;">
>> +  <table width="auto" class="analysis" border="1">
>> +    <tr>
>> +      <th>text</th>
>> +      <th>type</th>
>> +      <th>position</th>
>> +      <th>start</th>
>> +      <th>end</th>
>> +    </tr>
>> +  <xsl:for-each select="token">
>> +    <tr>
>> +      <td><xsl:value-of select="."/></td>
>> +      <td><xsl:apply-templates select="@type"/></td>
>> +      <td><xsl:apply-templates select="@pos"/></td>
>> +      <td><xsl:apply-templates select="@start"/></td>
>> +      <td><xsl:apply-templates select="@end"/></td>
>> +    </tr>
>> +  </xsl:for-each>
>> +  </table>
>> +</div>
>> +</xsl:template>
>> +
>> +<xsl:template match="solr/analysis/results/queryAnalyzer">
>> +  <h4>Query Analyzer</h4>
>> +  <xsl:for-each select="factory">
>> +    <h5 style="margin-left: 1em;"><xsl:apply-templates  
>> select="@class"/></h5>
>> +    <xsl:apply-templates/>
>> +  </xsl:for-each>
>> +</xsl:template>
>> +
>> +<xsl:template match="solr/analysis/results/queryAnalyzer/factory/ 
>> args">
>> +  <div style="margin-left: 2em; font-weight: bold;">{
>> +  <xsl:for-each select="arg">
>> +    <xsl:apply-templates select="@name"/>=<xsl:value-of  
>> select="."/>,
>> +  </xsl:for-each>
>> +  }</div>
>> +</xsl:template>
>> +
>> +<xsl:template match="solr/analysis/results/queryAnalyzer/factory/ 
>> tokens">
>> +<div style="margin-left: 2em;">
>> +  <table width="auto" class="analysis" border="1">
>> +    <tr>
>> +      <th>text</th>
>> +      <th>type</th>
>> +      <th>position</th>
>> +      <th>start</th>
>> +      <th>end</th>
>> +    </tr>
>> +  <xsl:for-each select="token">
>> +    <tr>
>> +      <td><xsl:value-of select="."/></td>
>> +      <td><xsl:apply-templates select="@type"/></td>
>> +      <td><xsl:apply-templates select="@pos"/></td>
>> +      <td><xsl:apply-templates select="@start"/></td>
>> +      <td><xsl:apply-templates select="@end"/></td>
>> +    </tr>
>> +  </xsl:for-each>
>> +  </table>
>> +</div>
>> +</xsl:template>
>> +
>> +</xsl:stylesheet>
>>
>> Added: incubator/solr/trunk/src/webapp/resources/admin/heading.jsp
>> URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/ 
>> resources/admin/heading.jsp?view=auto&rev=486373
>> ===================================================================== 
>> =========
>> --- incubator/solr/trunk/src/webapp/resources/admin/heading.jsp  
>> (added)
>> +++ incubator/solr/trunk/src/webapp/resources/admin/heading.jsp  
>> Tue Dec 12 14:24:47 2006
>> @@ -0,0 +1,23 @@
>> +<%--
>> + Licensed to the Apache Software Foundation (ASF) under one or more
>> + contributor license agreements.  See the NOTICE file distributed  
>> with
>> + this work for additional information regarding copyright ownership.
>> + The ASF licenses this file to You under the Apache License,  
>> Version 2.0
>> + (the "License"); you may not use this file except in compliance  
>> with
>> + the License.  You may obtain a copy of the License at
>> +
>> +     http://www.apache.org/licenses/LICENSE-2.0
>> +
>> + Unless required by applicable law or agreed to in writing, software
>> + distributed under the License is distributed on an "AS IS" BASIS,
>> + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or  
>> implied.
>> + See the License for the specific language governing permissions and
>> + limitations under the License.
>> +--%>
>> +<meta>
>> +  <collection><%= collectionName %></collection>
>> +  <host><%= hostname %></host>
>> +  <port><%= port %></port>
>> +  <cwd><%= cwd %></cwd>
>> +  <solrHome><%= solrHome %></solrHome>
>> +</meta>
>>
>> Modified: incubator/solr/trunk/src/webapp/resources/admin/logging.jsp
>> URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/ 
>> resources/admin/logging.jsp?view=diff&rev=486373&r1=486372&r2=486373
>> ===================================================================== 
>> =========
>> --- incubator/solr/trunk/src/webapp/resources/admin/logging.jsp  
>> (original)
>> +++ incubator/solr/trunk/src/webapp/resources/admin/logging.jsp  
>> Tue Dec 12 14:24:47 2006
>> @@ -1,4 +1,4 @@
>> -<%@ page contentType="text/html; charset=utf-8"  
>> pageEncoding="UTF-8"%>
>> +<%@ page contentType="text/xml; charset=utf-8"  
>> pageEncoding="UTF-8" language="java" %>
>>  <%--
>>   Licensed to the Apache Software Foundation (ASF) under one or more
>>   contributor license agreements.  See the NOTICE file distributed  
>> with
>> @@ -24,12 +24,11 @@
>>  <%@ page import="java.util.logging.Level"%>
>>  <%@ page import="java.util.logging.LogManager"%>
>>  <%@ page import="java.util.logging.Logger"%>
>> -<%@include file="header.jsp" %>
>> -<%
>>
>> -  LogManager mgr = LogManager.getLogManager();
>> -  Logger log = SolrCore.log;
>> +<?xml-stylesheet type="text/xsl" href="logging.xsl"?>
>>
>> +<%
>> +  Logger log = SolrCore.log;
>>    Logger parent = log.getParent();
>>    while(parent != null) {
>>      log = parent;
>> @@ -38,39 +37,12 @@
>>    Level lvl = log.getLevel();
>>
>>  %>
>> -<br clear="all">
>> -<h2>Solr Logging</h2>
>> -<table>
>> -  <tr>
>> -    <td>
>> -      <H3>Log Level:</H3>
>> -    </td>
>> -    <td>
>> -<% if (lvl!=null) {%>
>> -      <%= lvl.toString() %><br>
>> +<solr>
>> +  <logging>
>> +<% if (lvl != null) {%>
>> +      <logLevel><%= lvl.toString() %></logLevel>
>>  <% } else { %>
>> -      null<br>
>> +      <logLevel>null</logLevel>
>>  <% } %>
>> -    </td>
>> -  </tr>
>> -  <tr>
>> -    <td>
>> -    Set Level
>> -    </td>
>> -    <td>
>> -    [<a href=action.jsp?log=ALL>ALL</a>]
>> -    [<a href=action.jsp?log=CONFIG>CONFIG</a>]
>> -    [<a href=action.jsp?log=FINE>FINE</a>]
>> -    [<a href=action.jsp?log=FINER>FINER</a>]
>> -    [<a href=action.jsp?log=FINEST>FINEST</a>]
>> -    [<a href=action.jsp?log=INFO>INFO</a>]
>> -    [<a href=action.jsp?log=OFF>OFF</a>]
>> -    [<a href=action.jsp?log=SEVERE>SEVERE</a>]
>> -    [<a href=action.jsp?log=WARNING>WARNING</a>]
>> -    </td>
>> -  </tr>
>> -</table>
>> -<br><br>
>> -    <a href=".">Return to Admin Page</a>
>> -</body>
>> -</html>
>> +  </logging>
>> +</solr>
>>
>> Added: incubator/solr/trunk/src/webapp/resources/admin/logging.xsl
>> URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/ 
>> resources/admin/logging.xsl?view=auto&rev=486373
>> ===================================================================== 
>> =========
>> --- incubator/solr/trunk/src/webapp/resources/admin/logging.xsl  
>> (added)
>> +++ incubator/solr/trunk/src/webapp/resources/admin/logging.xsl  
>> Tue Dec 12 14:24:47 2006
>> @@ -0,0 +1,89 @@
>> +<?xml version="1.0" encoding="utf-8"?>
>> +<!--
>> + Licensed to the Apache Software Foundation (ASF) under one or more
>> + contributor license agreements.  See the NOTICE file distributed  
>> with
>> + this work for additional information regarding copyright ownership.
>> + The ASF licenses this file to You under the Apache License,  
>> Version 2.0
>> + (the "License"); you may not use this file except in compliance  
>> with
>> + the License.  You may obtain a copy of the License at
>> +
>> +     http://www.apache.org/licenses/LICENSE-2.0
>> +
>> + Unless required by applicable law or agreed to in writing, software
>> + distributed under the License is distributed on an "AS IS" BASIS,
>> + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or  
>> implied.
>> + See the License for the specific language governing permissions and
>> + limitations under the License.
>> +-->
>> +<!-- $Id$ -->
>> +<!-- $URL$ -->
>> +
>> +<xsl:stylesheet
>> +  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>> +  version="1.0">
>> +
>> +  <xsl:output
>> +    method="html"
>> +    indent="yes"
>> +    doctype-public="-//W3C//DTD HTML 4.01//EN"
>> +    doctype-system="http://www.w3.org/TR/html4/strict.dtd" />
>> +
>> +  <xsl:template match="/">
>> +    <html>
>> +      <head>
>> +        <link rel="stylesheet" type="text/css" href="solr- 
>> admin.css"></link>
>> +	<link rel="icon" href="/favicon.ico" type="image/ico"></link>
>> +	<link rel="shortcut icon" href="/favicon.ico" type="image/ico"></ 
>> link>
>> +        <title>Solr Admin: Logging</title>
>> +      </head>
>> +      <body>
>> +        <a href="">
>> +	   <img border="0" align="right" height="61" width="142"  
>> src="solr-head.gif" alt="SOLR">
>> +	   </img>
>> +	</a>
>> +        <h1>Solr Admin (<xsl:value-of select="solr/meta/ 
>> collection" />)</h1>
>> +        <div style="margin-top: 1em;">
>> +          <xsl:apply-templates/>
>> +        <div>
>> +        </div>
>> +          <a href=".">Return to Admin Page</a>
>> +        </div>
>> +      </body>
>> +    </html>
>> +  </xsl:template>
>> +
>> +  <xsl:include href="meta.xsl"/>
>> +
>> +  <xsl:template match="solr/logging">
>> +
>> +<br clear="all"/>
>> +<h2>Solr Logging</h2>
>> +<table>
>> +  <tr>
>> +    <td>
>> +      <H3>Log Level:</H3>
>> +    </td>
>> +    <td>
>> +<xsl:value-of select="logLevel" />
>> +    </td>
>> +  </tr>
>> +  <tr>
>> +    <td>
>> +    Set Level
>> +    </td>
>> +    <td>
>> +    [<a href="action.jsp?log=ALL">ALL</a>]
>> +    [<a href="action.jsp?log=CONFIG">CONFIG</a>]
>> +    [<a href="action.jsp?log=FINE">FINE</a>]
>> +    [<a href="action.jsp?log=FINER">FINER</a>]
>> +    [<a href="action.jsp?log=FINEST">FINEST</a>]
>> +    [<a href="action.jsp?log=INFO">INFO</a>]
>> +    [<a href="action.jsp?log=OFF">OFF</a>]
>> +    [<a href="action.jsp?log=SEVERE">SEVERE</a>]
>> +    [<a href="action.jsp?log=WARNING">WARNING</a>]
>> +    </td>
>> +  </tr>
>> +</table>
>> +
>> +  </xsl:template>
>> +</xsl:stylesheet>
>>
>> Added: incubator/solr/trunk/src/webapp/resources/admin/meta.xsl
>> URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/ 
>> resources/admin/meta.xsl?view=auto&rev=486373
>> ===================================================================== 
>> =========
>> --- incubator/solr/trunk/src/webapp/resources/admin/meta.xsl (added)
>> +++ incubator/solr/trunk/src/webapp/resources/admin/meta.xsl Tue  
>> Dec 12 14:24:47 2006
>> @@ -0,0 +1,32 @@
>> +<!--
>> + Licensed to the Apache Software Foundation (ASF) under one or more
>> + contributor license agreements.  See the NOTICE file distributed  
>> with
>> + this work for additional information regarding copyright ownership.
>> + The ASF licenses this file to You under the Apache License,  
>> Version 2.0
>> + (the "License"); you may not use this file except in compliance  
>> with
>> + the License.  You may obtain a copy of the License at
>> +
>> +     http://www.apache.org/licenses/LICENSE-2.0
>> +
>> + Unless required by applicable law or agreed to in writing, software
>> + distributed under the License is distributed on an "AS IS" BASIS,
>> + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or  
>> implied.
>> + See the License for the specific language governing permissions and
>> + limitations under the License.
>> +-->
>> +<xsl:stylesheet
>> +  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>> +  version="1.0">
>> +
>> +  <xsl:output
>> +    method="html"
>> +    indent="yes"
>> +    doctype-public="-//W3C//DTD HTML 4.01//EN"
>> +    doctype-system="http://www.w3.org/TR/html4/strict.dtd" />
>> +
>> +  <xsl:template match="solr/meta">
>> +    <xsl:value-of select="host" />:<xsl:value-of select="port" />
>> +    cwd=<xsl:value-of select="cwd" /> SolrHome=<xsl:value-of  
>> select="solrHome" />
>> +  </xsl:template>
>> +
>> +</xsl:stylesheet>
>>
>> Modified: incubator/solr/trunk/src/webapp/resources/admin/ping.jsp
>> URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/ 
>> resources/admin/ping.jsp?view=diff&rev=486373&r1=486372&r2=486373
>> ===================================================================== 
>> =========
>> --- incubator/solr/trunk/src/webapp/resources/admin/ping.jsp  
>> (original)
>> +++ incubator/solr/trunk/src/webapp/resources/admin/ping.jsp Tue  
>> Dec 12 14:24:47 2006
>> @@ -1,4 +1,4 @@
>> -<%@ page contentType="text/html; charset=utf-8"  
>> pageEncoding="UTF-8"%>
>> +<%@ page contentType="text/xml; charset=utf-8"  
>> pageEncoding="UTF-8" language="java" %>
>>  <%--
>>   Licensed to the Apache Software Foundation (ASF) under one or more
>>   contributor license agreements.  See the NOTICE file distributed  
>> with
>> @@ -17,10 +17,16 @@
>>  --%>
>>  <%@ page import="org.apache.solr.core.SolrConfig,
>>                   org.apache.solr.core.SolrCore,
>> +                 org.apache.solr.util.XML,
>>                   org.apache.solr.core.SolrException"%>
>>  <%@ page import="org.apache.solr.request.LocalSolrQueryRequest"%>
>>  <%@ page import="org.apache.solr.request.SolrQueryResponse"%>
>>  <%@ page import="java.util.StringTokenizer"%>
>> +
>> +<?xml-stylesheet type="text/xsl" href="ping.xsl"?>
>> +
>> +<solr>
>> +  <ping>
>>  <%
>>    SolrCore core = SolrCore.getSolrCore();
>>
>> @@ -40,12 +46,31 @@
>>    SolrQueryResponse resp = new SolrQueryResponse();
>>    try {
>>      core.execute(req,resp);
>> -    if (resp.getException() != null) {
>> -      response.sendError(500, SolrException.toStr 
>> (resp.getException()));
>> +    if (resp.getException() == null) {
>> +// No need for explicit status in the body, when the standard HTTP
>> +// response codes already transmit success/failure message
>> +//      out.println("<status>200</status>");
>> +    }
>> +    else if (resp.getException() != null) {
>> +// No need for explicit status in the body, when the standard HTTP
>> +// response codes already transmit success/failure message
>> +//      out.println("<status>500</status>");
>> +      out.println("<error>");
>> +      XML.escapeCharData(SolrException.toStr(resp.getException 
>> ()), out);
>> +      out.println("</error>");
>> +      response.sendError(500);
>>      }
>>    } catch (Throwable t) {
>> -      response.sendError(500, SolrException.toStr(t));
>> +// No need for explicit status in the body, when the standard HTTP
>> +// response codes already transmit success/failure message
>> +//      out.println("<status>500</status>");
>> +      out.println("<error>");
>> +      XML.escapeCharData(SolrException.toStr(t), out);
>> +      out.println("</error>");
>> +      response.sendError(500);
>>    } finally {
>>        req.close();
>>    }
>>  %>
>> +  </ping>
>> +</solr>
>>
>> Added: incubator/solr/trunk/src/webapp/resources/admin/ping.xsl
>> URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/ 
>> resources/admin/ping.xsl?view=auto&rev=486373
>> ===================================================================== 
>> =========
>> --- incubator/solr/trunk/src/webapp/resources/admin/ping.xsl (added)
>> +++ incubator/solr/trunk/src/webapp/resources/admin/ping.xsl Tue  
>> Dec 12 14:24:47 2006
>> @@ -0,0 +1,69 @@
>> +<?xml version="1.0" encoding="utf-8"?>
>> +<!--
>> + Licensed to the Apache Software Foundation (ASF) under one or more
>> + contributor license agreements.  See the NOTICE file distributed  
>> with
>> + this work for additional information regarding copyright ownership.
>> + The ASF licenses this file to You under the Apache License,  
>> Version 2.0
>> + (the "License"); you may not use this file except in compliance  
>> with
>> + the License.  You may obtain a copy of the License at
>> +
>> +     http://www.apache.org/licenses/LICENSE-2.0
>> +
>> + Unless required by applicable law or agreed to in writing, software
>> + distributed under the License is distributed on an "AS IS" BASIS,
>> + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or  
>> implied.
>> + See the License for the specific language governing permissions and
>> + limitations under the License.
>> +-->
>> +<!-- $Id$ -->
>> +<!-- $URL$ -->
>> +
>> +<xsl:stylesheet
>> +  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>> +  version="1.0">
>> +
>> +  <xsl:output
>> +    method="html"
>> +    indent="yes"
>> +    doctype-public="-//W3C//DTD HTML 4.01//EN"
>> +    doctype-system="http://www.w3.org/TR/html4/strict.dtd" />
>> +
>> +  <xsl:template match="/">
>> +    <html>
>> +      <head>
>> +        <link rel="stylesheet" type="text/css" href="solr- 
>> admin.css"></link>
>> +	<link rel="icon" href="/favicon.ico" type="image/ico"></link>
>> +	<link rel="shortcut icon" href="/favicon.ico" type="image/ico"></ 
>> link>
>> +        <title>Solr Admin: Ping</title>
>> +      </head>
>> +      <body>
>> +        <a href="">
>> +	   <img border="0" align="right" height="61" width="142"  
>> src="solr-head.gif" alt="SOLR">
>> +	   </img>
>> +	</a>
>> +        <h1>Solr Admin (<xsl:value-of select="solr/meta/ 
>> collection" />)</h1>
>> +        <div style="margin-top: 1em;">
>> +          <xsl:apply-templates/>
>> +        <div>
>> +        </div>
>> +          <a href=".">Return to Admin Page</a>
>> +        </div>
>> +      </body>
>> +    </html>
>> +  </xsl:template>
>> +
>> +  <xsl:include href="meta.xsl"/>
>> +
>> +  <xsl:template match="solr/ping">
>> +  <table>
>> +    <tr>
>> +      <td>
>> +        <H3>Ping</H3>
>> +      </td>
>> +      <td>
>> +        <xsl:value-of select="error" />
>> +      </td>
>> +    </tr>
>> +  </table>
>> +  </xsl:template>
>> +</xsl:stylesheet>
>>
>> Modified: incubator/solr/trunk/src/webapp/resources/admin/ 
>> threaddump.jsp
>> URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/ 
>> resources/admin/threaddump.jsp? 
>> view=diff&rev=486373&r1=486372&r2=486373
>> ===================================================================== 
>> =========
>> --- incubator/solr/trunk/src/webapp/resources/admin/threaddump.jsp  
>> (original)
>> +++ incubator/solr/trunk/src/webapp/resources/admin/threaddump.jsp  
>> Tue Dec 12 14:24:47 2006
>> @@ -1,4 +1,4 @@
>> -<%@ page contentType="text/html; charset=utf-8"  
>> pageEncoding="UTF-8"%>
>> +<%@ page contentType="text/xml; charset=utf-8"  
>> pageEncoding="UTF-8" language="java" %>
>>  <%--
>>   Licensed to the Apache Software Foundation (ASF) under one or more
>>   contributor license agreements.  See the NOTICE file distributed  
>> with
>> @@ -18,101 +18,87 @@
>>  <%@ page import="java.lang.management.ManagementFactory,
>>                   java.lang.management.ThreadMXBean,
>>                   java.lang.management.ThreadInfo,
>> -                 java.io.IOException"%>
>> -<%@include file="header.jsp" %>
>> +                 java.io.IOException,
>> +                 org.apache.solr.util.XML"%>
>> +
>> +<?xml-stylesheet type="text/xsl" href="threaddump.xsl"?>
>> +
>>  <%!
>>    static ThreadMXBean tmbean = ManagementFactory.getThreadMXBean();
>>  %>
>> -<br clear="all">
>> -<h2>Thread Dump</h2>
>> -<table>
>> -<tr>
>> -<td>
>> -<%
>> -  out.print(System.getProperty("java.vm.name") +
>> -            " " + System.getProperty("java.vm.version") + "<br>");
>> -%>
>> -</td>
>> -</tr>
>> -<tr>
>> -<td>
>> +<solr>
>> +  <system>
>> +  <jvm>
>> +    <version><%=System.getProperty("java.vm.version")%></version>
>> +    <name><%=System.getProperty("java.vm.name")%></name>
>> +  </jvm>
>> +  <threadCount>
>> +    <current><%=tmbean.getThreadCount()%></current>
>> +    <peak><%=tmbean.getPeakThreadCount()%></peak>
>> +    <daemon><%=tmbean.getDaemonThreadCount()%></daemon>
>> +  </threadCount>
>>  <%
>>    long[] tids;
>>    ThreadInfo[] tinfos;
>> -
>> -  out.print("Thread Count: current=" + tmbean.getThreadCount() +
>> -            " deamon=" + tmbean.getDaemonThreadCount() +
>> -            " peak=" + tmbean.getPeakThreadCount());
>> -%>
>> -</td>
>> -</tr>
>> -<tr>
>> -<td>
>> -<%
>>    tids = tmbean.findMonitorDeadlockedThreads();
>> -  if (tids == null) {
>> -      out.print("No deadlock found.");
>> -  }
>> -  else {
>> -      out.print("Deadlock found :-");
>> +  if (tids != null) {
>> +      out.println("  <deadlocks>");
>>        tinfos = tmbean.getThreadInfo(tids, Integer.MAX_VALUE);
>>        for (ThreadInfo ti : tinfos) {
>>            printThreadInfo(ti, out);
>>        }
>> +      out.println("  </deadlocks>");
>>    }
>>  %>
>> -</td>
>> -</tr>
>> -<tr>
>> -<td>
>>  <%
>> -  out.print("Full Thread Dump:<br>");
>>    tids = tmbean.getAllThreadIds();
>>    tinfos = tmbean.getThreadInfo(tids, Integer.MAX_VALUE);
>> +  out.println("  <threadDump>");
>>    for (ThreadInfo ti : tinfos) {
>>       printThreadInfo(ti, out);
>>    }
>> +  out.println("  </threadDump>");
>>  %>
>> -</td>
>> -</tr>
>> -</table>
>> -<br><br>
>> -    <a href=".">Return to Admin Page</a>
>> -</body>
>> -</html>
>> +  </system>
>> +</solr>
>>
>>  <%!
>> -  static String INDENT = "&nbsp&nbsp&nbsp&nbsp ";
>> -
>>    static void printThreadInfo(ThreadInfo ti, JspWriter out)  
>> throws IOException {
>>        long tid = ti.getThreadId();
>> -      StringBuilder sb = new StringBuilder("\"" + ti.getThreadName 
>> () + "\"" +
>> -                                           " Id=" + tid +
>> -                                           " in " +  
>> ti.getThreadState());
>> +      out.println("    <thread>");
>> +      out.println("      <id>" + tid + "</id>");
>> +      out.print("      <name>");
>> +      XML.escapeCharData(ti.getThreadName(), out);
>> +      out.println("</name>");
>> +      out.println("      <state>" + ti.getThreadState() + "</ 
>> state>");
>>        if (ti.getLockName() != null) {
>> -          sb.append(" on lock=" + ti.getLockName());
>> +          out.println("      <lock>" + ti.getLockName() + "</ 
>> lock>");
>>        }
>>        if (ti.isSuspended()) {
>> -          sb.append(" (suspended)");
>> +          out.println("      <suspended/>");
>>        }
>>        if (ti.isInNative()) {
>> -          sb.append(" (running in native)");
>> +          out.println("      <inNative/>");
>>        }
>>        if (tmbean.isThreadCpuTimeSupported()) {
>> -          sb.append(" total cpu time="
>> -                    +formatNanos(tmbean.getThreadCpuTime(tid)));
>> -          sb.append(" user time="
>> -                    +formatNanos(tmbean.getThreadUserTime(tid)));
>> +          out.println("      <cpuTime>" + formatNanos 
>> (tmbean.getThreadCpuTime(tid)) + "</cpuTime>");
>> +          out.println("      <userTime>" + formatNanos 
>> (tmbean.getThreadUserTime(tid)) + "</userTime>");
>>        }
>> -      out.print(sb.toString()+"<br>");
>> +
>>        if (ti.getLockOwnerName() != null) {
>> -          out.print(INDENT + " owned by " + ti.getLockOwnerName() +
>> -                    " Id=" + ti.getLockOwnerId()+"<br>");
>> +          out.println("      <owner>");
>> +          out.println("        <name>" + ti.getLockOwnerName() +  
>> "</name>");
>> +          out.println("        <id>" + ti.getLockOwnerId() + "</ 
>> id>");
>> +          out.println("      </owner>");
>>        }
>> +      out.println("      <stackTrace>");
>>        for (StackTraceElement ste : ti.getStackTrace()) {
>> -          out.print(INDENT + "at " + ste.toString()+"<br>");
>> +          out.print("        <line>");
>> +          XML.escapeCharData("at " + ste.toString(), out);
>> +          out.println("        </line>");
>>        }
>> -      out.print("<br>");
>> +      out.println("      </stackTrace>");
>> +      out.println("    </thread>");
>>    }
>>
>>    static String formatNanos(long ns) {
>>
>> Added: incubator/solr/trunk/src/webapp/resources/admin/threaddump.xsl
>> URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/ 
>> resources/admin/threaddump.xsl?view=auto&rev=486373
>> ===================================================================== 
>> =========
>> --- incubator/solr/trunk/src/webapp/resources/admin/threaddump.xsl  
>> (added)
>> +++ incubator/solr/trunk/src/webapp/resources/admin/threaddump.xsl  
>> Tue Dec 12 14:24:47 2006
>> @@ -0,0 +1,101 @@
>> +<?xml version="1.0" encoding="utf-8"?>
>> +<!--
>> + Licensed to the Apache Software Foundation (ASF) under one or more
>> + contributor license agreements.  See the NOTICE file distributed  
>> with
>> + this work for additional information regarding copyright ownership.
>> + The ASF licenses this file to You under the Apache License,  
>> Version 2.0
>> + (the "License"); you may not use this file except in compliance  
>> with
>> + the License.  You may obtain a copy of the License at
>> +
>> +     http://www.apache.org/licenses/LICENSE-2.0
>> +
>> + Unless required by applicable law or agreed to in writing, software
>> + distributed under the License is distributed on an "AS IS" BASIS,
>> + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or  
>> implied.
>> + See the License for the specific language governing permissions and
>> + limitations under the License.
>> +-->
>> +<!-- $Id$ -->
>> +<!-- $URL$ -->
>> +
>> +<xsl:stylesheet
>> +  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>> +  version="1.0">
>> +
>> +  <xsl:output
>> +    method="html"
>> +    indent="yes"
>> +    doctype-public="-//W3C//DTD HTML 4.01//EN"
>> +    doctype-system="http://www.w3.org/TR/html4/strict.dtd" />
>> +
>> +  <xsl:template match="/">
>> +    <html>
>> +      <head>
>> +        <link rel="stylesheet" type="text/css" href="solr- 
>> admin.css"></link>
>> +        <link rel="icon" href="/favicon.ico" type="image/ico"></ 
>> link>
>> +        <link rel="shortcut icon" href="/favicon.ico" type="image/ 
>> ico"></link>
>> +        <title>SOLR Info</title>
>> +      </head>
>> +      <body>
>> +        <a href="">
>> +          <img border="0" align="right" height="61" width="142"  
>> src="solr-head.gif" alt="SOLR"/>
>> +        </a>
>> +        <h1>Solr Admin (<xsl:value-of select="solr/meta/ 
>> collection" />)</h1>
>> +        <h2>Thread Dump</h2>
>> +        <div style="margin-top: 1em;">
>> +          <table>
>> +            <xsl:apply-templates/>
>> +          </table>
>> +          <a href=".">Return to Admin Page</a>
>> +        </div>
>> +      </body>
>> +    </html>
>> +  </xsl:template>
>> +
>> +  <xsl:include href="meta.xsl"/>
>> +
>> +  <xsl:template match="solr/system/jvm">
>> +    <tr>
>> +      <td><xsl:value-of select="name"/> <xsl:value-of  
>> select="version"/></td>
>> +    </tr>
>> +  </xsl:template>
>> +
>> +  <xsl:template match="solr/system/threadCount">
>> +    <tr>
>> +      <td>
>> +        Thread Count:
>> +        current=<xsl:value-of select="current"/>,
>> +        peak=<xsl:value-of select="peak"/>,
>> +        daemon=<xsl:value-of select="daemon"/></td>
>> +    </tr>
>> +  </xsl:template>
>> +
>> +  <xsl:template match="solr/system/threadDump">
>> +    <div>Full Thread Dump:</div>
>> +    <xsl:for-each select="thread">
>> +      <!-- OG: TODO: add suspended/native conditionals -->
>> +      <tr>
>> +        <td style="margin-left: 1em; font-weight: bold;">
>> +          '<xsl:value-of select="name"/>'
>> +          Id=<xsl:value-of select="id"/>,
>> +          <xsl:value-of select="state"/>
>> +          on lock=<xsl:value-of select="lock"/>,
>> +          total cpu time=<xsl:value-of select="cpuTime"/>
>> +          user time=<xsl:value-of select="userTime"/>
>> +        </td>
>> +      </tr>
>> +      <xsl:apply-templates select="stackTrace"/>
>> +    </xsl:for-each>
>> +  </xsl:template>
>> +
>> +  <xsl:template match="stackTrace">
>> +    <tr>
>> +      <td style="margin-left: 1em;">
>> +        <xsl:for-each select="line">
>> +          <xsl:value-of select="."/><br/>
>> +        </xsl:for-each>
>> +      </td>
>> +    </tr>
>> +  </xsl:template>
>> +
>> +</xsl:stylesheet>
>>


Re: svn commit: r486373 - in /incubator/solr/trunk: ./ src/webapp/resources/admin/

Posted by Erik Hatcher <er...@ehatchersolutions.com>.
Otis,

This looks brittle - lots of things need escaping when just string  
concatenating to build XML.

I'm betting that bad XML could easily be generated.  No??

	Erik


On Dec 12, 2006, at 5:24 PM, otis@apache.org wrote:

> Author: otis
> Date: Tue Dec 12 14:24:47 2006
> New Revision: 486373
>
> URL: http://svn.apache.org/viewvc?view=rev&rev=486373
> Log:
> - SOLR-58: make admin pages return XML and transform them to HTML  
> using XSL
>
> Added:
>     incubator/solr/trunk/src/webapp/resources/admin/analysis.xsl
>     incubator/solr/trunk/src/webapp/resources/admin/heading.jsp
>     incubator/solr/trunk/src/webapp/resources/admin/logging.xsl
>     incubator/solr/trunk/src/webapp/resources/admin/meta.xsl
>     incubator/solr/trunk/src/webapp/resources/admin/ping.xsl
>     incubator/solr/trunk/src/webapp/resources/admin/threaddump.xsl
> Modified:
>     incubator/solr/trunk/CHANGES.txt
>     incubator/solr/trunk/src/webapp/resources/admin/analysis.jsp
>     incubator/solr/trunk/src/webapp/resources/admin/logging.jsp
>     incubator/solr/trunk/src/webapp/resources/admin/ping.jsp
>     incubator/solr/trunk/src/webapp/resources/admin/threaddump.jsp
>
> Modified: incubator/solr/trunk/CHANGES.txt
> URL: http://svn.apache.org/viewvc/incubator/solr/trunk/CHANGES.txt? 
> view=diff&rev=486373&r1=486372&r2=486373
> ====================================================================== 
> ========
> --- incubator/solr/trunk/CHANGES.txt (original)
> +++ incubator/solr/trunk/CHANGES.txt Tue Dec 12 14:24:47 2006
> @@ -118,6 +118,8 @@
>      through multiple threads.  Large commits also might be faster  
> (klaas, SOLR-65)
>   9. Lazy field loading can be enabled via a solrconfig directive.   
> This will be faster when
>      not all stored fields are needed from a document (klaas, SOLR-52)
> +10. Made admin JSPs return XML and transform them with new XSL  
> stylesheets
> +    (Otis Gospodnetic, SOLR-58)
>
>  Optimizations
>   1. getDocListAndSet can now generate both a DocList and a DocSet  
> from a
>
> Modified: incubator/solr/trunk/src/webapp/resources/admin/analysis.jsp
> URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/ 
> resources/admin/analysis.jsp?view=diff&rev=486373&r1=486372&r2=486373
> ====================================================================== 
> ========
> --- incubator/solr/trunk/src/webapp/resources/admin/analysis.jsp  
> (original)
> +++ incubator/solr/trunk/src/webapp/resources/admin/analysis.jsp  
> Tue Dec 12 14:24:47 2006
> @@ -1,20 +1,4 @@
> -<%@ page contentType="text/html; charset=utf-8"  
> pageEncoding="UTF-8"%>
> -<%--
> - Licensed to the Apache Software Foundation (ASF) under one or more
> - contributor license agreements.  See the NOTICE file distributed  
> with
> - this work for additional information regarding copyright ownership.
> - The ASF licenses this file to You under the Apache License,  
> Version 2.0
> - (the "License"); you may not use this file except in compliance with
> - the License.  You may obtain a copy of the License at
> -
> -     http://www.apache.org/licenses/LICENSE-2.0
> -
> - Unless required by applicable law or agreed to in writing, software
> - distributed under the License is distributed on an "AS IS" BASIS,
> - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or  
> implied.
> - See the License for the specific language governing permissions and
> - limitations under the License.
> ---%>
> +<%@ page contentType="text/xml; charset=utf-8"  
> pageEncoding="UTF-8" language="java" %>
>  <%@ page import="org.apache.lucene.analysis.Analyzer,
>                   org.apache.lucene.analysis.Token,
>                   org.apache.lucene.analysis.TokenStream,
> @@ -30,129 +14,86 @@
>  <%@ page import="java.io.StringReader"%>
>  <%@ page import="java.util.*"%>
>
> -<%-- $Id$ --%>
> -<%-- $Source: /cvs/main/searching/org.apache.solrolarServer/ 
> resources/admin/analysis.jsp,v $ --%>
> -<%-- $Name:  $ --%>
> +<?xml-stylesheet type="text/xsl" href="analysis.xsl"?>
>
> -<%@include file="header.jsp" %>
> +<%@include file="_info.jsp" %>
>
>  <%
>    String name = request.getParameter("name");
> -  if (name==null || name.length()==0) name="";
> +  if (name == null || name.length() == 0) name = "";
>    String val = request.getParameter("val");
> -  if (val==null || val.length()==0) val="";
> +  if (val == null || val.length() == 0) val = "";
>    String qval = request.getParameter("qval");
> -  if (qval==null || qval.length()==0) qval="";
> +  if (qval == null || qval.length() == 0) qval = "";
>    String verboseS = request.getParameter("verbose");
> -  boolean verbose = verboseS!=null && verboseS.equalsIgnoreCase 
> ("on");
> +  boolean verbose = verboseS != null && verboseS.equalsIgnoreCase 
> ("on");
>    String qverboseS = request.getParameter("qverbose");
> -  boolean qverbose = qverboseS!=null && qverboseS.equalsIgnoreCase 
> ("on");
> +  boolean qverbose = qverboseS != null &&  
> qverboseS.equalsIgnoreCase("on");
>    String highlightS = request.getParameter("highlight");
> -  boolean highlight = highlightS!=null &&  
> highlightS.equalsIgnoreCase("on");
> +  boolean highlight = highlightS != null &&  
> highlightS.equalsIgnoreCase("on");
>  %>
>
> -<br clear="all">
> -
> -<h2>Field Analysis</h2>
> -
> -<form method="GET" action="analysis.jsp">
> -<table>
> -<tr>
> -  <td>
> -	<strong>Field name</strong>
> -  </td>
> -  <td>
> -	<input class="std" name="name" type="text" value="<%= name %>">
> -  </td>
> -</tr>
> -<tr>
> -  <td>
> -	<strong>Field value (Index)</strong>
> -  <br/>
> -  verbose output
> -  <input name="verbose" type="checkbox"
> -     <%= verbose ? "checked=\"true\"" : "" %> >
> -    <br/>
> -  highlight matches
> -  <input name="highlight" type="checkbox"
> -     <%= highlight ? "checked=\"true\"" : "" %> >
> -  </td>
> -  <td>
> -	<textarea class="std" rows="3" cols="70" name="val"><%= val %></ 
> textarea>
> -  </td>
> -</tr>
> -<tr>
> -  <td>
> -	<strong>Field value (Query)</strong>
> -  <br/>
> -  verbose output
> -  <input name="qverbose" type="checkbox"
> -     <%= qverbose ? "checked=\"true\"" : "" %> >
> -  </td>
> -  <td>
> -	<textarea class="std" rows="1" cols="70" name="qval"><%= qval %></ 
> textarea>
> -  </td>
> -</tr>
> -<tr>
> -
> -  <td>
> -  </td>
> -
> -  <td>
> -	<input class="stdbutton" type="submit" value="analyze">
> -  </td>
> -
> -</tr>
> -</table>
> -</form>
> -
> +<solr>
> +<%@include file="heading.jsp" %>
> +  <analysis>
>
>  <%
> -  SchemaField field=null;
> +  SchemaField field = null;
>
> -  if (name!="") {
> +  if (name != "") {
>      try {
>        field = schema.getField(name);
>      } catch (Exception e) {
> -      out.println("<strong>Unknown Field " + name + "</strong>");
> +      out.println("<error>Unknown Field " + name + "</error>");
>      }
>    }
>
> -  if (field!=null) {
> +  if (field != null) {
> +    out.println("    <form>");
> +    out.println("      <field>");
> +      XML.escapeCharData(name, out);
> +    out.println("</field>");
> +    out.print("      <fieldIndexValue>");
> +      XML.escapeCharData(val, out);
> +    out.println("      </fieldIndexValue>");
> +    out.print("      <fieldQueryValue>");
> +      XML.escapeCharData(qval, out);
> +    out.println("      </fieldQueryValue>");
> +    out.println("    </form>");
> +
>      HashSet<Tok> matches = null;
> -    if (qval!="" && highlight) {
> +    if (qval != "" && highlight) {
>        Reader reader = new StringReader(qval);
>        Analyzer analyzer =  field.getType().getQueryAnalyzer();
> -      TokenStream tstream = analyzer.tokenStream(field.getName 
> (),reader);
> +      TokenStream tstream = analyzer.tokenStream(field.getName(),  
> reader);
>        List<Token> tokens = getTokens(tstream);
>        matches = new HashSet<Tok>();
> -      for (Token t : tokens) { matches.add( new Tok(t,0)); }
> +      for (Token t : tokens) { matches.add( new Tok(t, 0)); }
>      }
>
> -    if (val!="") {
> -      out.println("<h3>Index Analyzer</h3>");
> -      doAnalyzer(out, field, val, false, verbose,matches);
> +    out.println("    <results>");
> +    if (val != "") {
> +      out.println("<indexAnalyzer>");
> +      doAnalyzer(out, field, val, false, verbose, matches);
> +      out.println("</indexAnalyzer>");
>      }
> -    if (qval!="") {
> -      out.println("<h3>Query Analyzer</h3>");
> -      doAnalyzer(out, field, qval, true, qverbose,null);
> +    if (qval != "") {
> +      out.println("<queryAnalyzer>");
> +      doAnalyzer(out, field, qval, true, qverbose, null);
> +      out.println("</queryAnalyzer>");
>      }
> +    out.println("    </results>");
>    }
> -
>  %>
> -
> -
> -</body>
> -</html>
> -
> +  </analysis>
> +</solr>
>
>  <%!
>    private static void doAnalyzer(JspWriter out, SchemaField field,  
> String val, boolean queryAnalyser, boolean verbose, Set<Tok> match)  
> throws Exception {
>      Reader reader = new StringReader(val);
>
>      FieldType ft = field.getType();
> -     Analyzer analyzer = queryAnalyser ?
> -             ft.getQueryAnalyzer() : ft.getAnalyzer();
> +    Analyzer analyzer = queryAnalyser ? ft.getQueryAnalyzer() :  
> ft.getAnalyzer();
>       if (analyzer instanceof TokenizerChain) {
>         TokenizerChain tchain = (TokenizerChain)analyzer;
>         TokenizerFactory tfac = tchain.getTokenizerFactory();
> @@ -161,12 +102,14 @@
>         TokenStream tstream = tfac.create(reader);
>         List<Token> tokens = getTokens(tstream);
>         tstream = tfac.create(reader);
> +       // write tokenizer factories
>         if (verbose) {
>           writeHeader(out, tfac.getClass(), tfac.getArgs());
>         }
>
>         writeTokens(out, tokens, ft, verbose, match);
>
> +       // write filter factories
>         for (TokenFilterFactory filtfac : filtfacs) {
>           if (verbose) {
>             writeHeader(out, filtfac.getClass(), filtfac.getArgs());
> @@ -183,7 +126,6 @@
>
>           writeTokens(out, tokens, ft, verbose, match);
>         }
> -
>       } else {
>         TokenStream tstream = analyzer.tokenStream(field.getName 
> (),reader);
>         List<Token> tokens = getTokens(tstream);
> @@ -199,7 +141,7 @@
>      List<Token> tokens = new ArrayList<Token>();
>      while (true) {
>        Token t = tstream.next();
> -      if (t==null) break;
> +      if (t == null) break;
>        tokens.add(t);
>      }
>      return tokens;
> @@ -210,8 +152,8 @@
>      Token token;
>      int pos;
>      Tok(Token token, int pos) {
> -      this.token=token;
> -      this.pos=pos;
> +      this.token = token;
> +      this.pos = pos;
>      }
>
>      public boolean equals(Object o) {
> @@ -221,7 +163,7 @@
>        return token.termText().hashCode();
>      }
>      public String toString() {
> -      return token.termText();
> +      return token.termText() + " at position " + pos;
>      }
>    }
>
> @@ -229,81 +171,38 @@
>      public String toStr(Object o);
>    }
>
> -  private static void printRow(JspWriter out, String header, List 
> [] arrLst, ToStr converter, boolean multival, boolean verbose,  
> Set<Tok> match) throws IOException {
> -    // find the maximum number of terms for any position
> -    int maxSz=1;
> -    if (multival) {
> -      for (List lst : arrLst) {
> -        maxSz = Math.max(lst.size(), maxSz);
> -      }
> -    }
> -
> -
> -    for (int idx=0; idx<maxSz; idx++) {
> -      out.println("<tr>");
> -      if (idx==0 && verbose) {
> -        if (header != null) {
> -          out.print("<th NOWRAP rowspan=\""+maxSz+"\">");
> -          XML.escapeCharData(header,out);
> -          out.println("</th>");
> -        }
> -      }
> -
> -      for (List<Tok> lst : arrLst) {
> -        if (lst.size() <= idx) continue;
> -        if (match!=null && match.contains(lst.get(idx))) {
> -          out.print("<td class=\"highlight\"");
> -        } else {
> -          out.print("<td class=\"debugdata\"");
> -        }
> -
> -        if (idx==0 && lst.size()==1 && maxSz > 1) {
> -          out.print("rowspan=\""+maxSz+'"');
> -        }
> -
> -        out.print('>');
> -
> -        XML.escapeCharData(converter.toStr(lst.get(idx)), out);
> -        out.print("</td>");
> -      }
> -
> -      out.println("</tr>");
> -    }
> -
> -  }
> -
> -
> -
>    static void writeHeader(JspWriter out, Class clazz,  
> Map<String,String> args) throws IOException {
> -    out.print("<h4>");
> -    out.print(clazz.getName());
> -    XML.escapeCharData("   "+args,out);
> -    out.println("</h4>");
> +    out.println("  <factory class=\"" + clazz.getName() + "\">");
> +    out.println("    <args>");
> +    for (Iterator<String> iter = args.keySet().iterator();  
> iter.hasNext(); ) {
> +      String key = iter.next();
> +      String value = args.get(key);
> +      out.println("      <arg name=\"" + key + "\">" + value + "</ 
> arg>");
> +    }
> +    out.println("    </args>");
>    }
>
> -
> -
>    // readable, raw, pos, type, start/end
>    static void writeTokens(JspWriter out, List<Token> tokens, final  
> FieldType ft, boolean verbose, Set<Tok> match) throws IOException {
>
>      // Use a map to tell what tokens are in what positions
>      // because some tokenizers/filters may do funky stuff with
>      // very large increments, or negative increments.
> -    HashMap<Integer,List<Tok>> map = new HashMap<Integer,List<Tok>> 
> ();
> -    boolean needRaw=false;
> -    int pos=0;
> +    HashMap<Integer, List<Tok>> map = new HashMap<Integer,  
> List<Tok>>();
> +    boolean needRaw = false;
> +    int pos = 0;
>      for (Token t : tokens) {
>        if (!t.termText().equals(ft.indexedToReadable(t.termText()))) {
> -        needRaw=true;
> +        needRaw = true;
>        }
>
>        pos += t.getPositionIncrement();
>        List lst = map.get(pos);
> -      if (lst==null) {
> +      if (lst == null) {
>          lst = new ArrayList(1);
> -        map.put(pos,lst);
> +        map.put(pos, lst);
>        }
> -      Tok tok = new Tok(t,pos);
> +      Tok tok = new Tok(t, pos);
>        lst.add(tok);
>      }
>
> @@ -330,70 +229,21 @@
>
>      );
>
> -    out.println("<table width=\"auto\" class=\"analysis\" border= 
> \"1\">");
> -
> -    if (verbose) {
> -      printRow(out,"term position", arr, new ToStr() {
> -        public String toStr(Object o) {
> -          return Integer.toString(((Tok)o).pos);
> -        }
> -      }
> -              ,false
> -              ,verbose
> -              ,null);
> -    }
> -
> -
> -    printRow(out,"term text", arr, new ToStr() {
> -      public String toStr(Object o) {
> -        return ft.indexedToReadable( ((Tok)o).token.termText() );
> -      }
> -    }
> -            ,true
> -            ,verbose
> -            ,match
> -   );
> -
> -    if (needRaw) {
> -      printRow(out,"raw text", arr, new ToStr() {
> -        public String toStr(Object o) {
> -          // todo: output in hex or something?
> -          // check if it's all ascii or not?
> -          return ((Tok)o).token.termText();
> -        }
> -      }
> -              ,true
> -              ,verbose
> -              ,match
> -      );
> -    }
> -
> -    if (verbose) {
> -      printRow(out,"term type", arr, new ToStr() {
> -        public String toStr(Object o) {
> -          return  ((Tok)o).token.type();
> -        }
> -      }
> -              ,true
> -              ,verbose,
> -              null
> -      );
> -    }
> -
> -    if (verbose) {
> -      printRow(out,"source start,end", arr, new ToStr() {
> -        public String toStr(Object o) {
> -          Token t = ((Tok)o).token;
> -          return Integer.toString(t.startOffset()) + ',' +  
> t.endOffset() ;
> -        }
> -      }
> -              ,true
> -              ,verbose
> -              ,null
> -      );
> -    }
> -
> -    out.println("</table>");
> +   out.println("    <tokens>");
> +   for (int i = 0; i < arr.length; i++) {
> +     for (Tok tok : arr[i]) {
> +       out.print("      <token");
> +       out.print(" type=\"" + tok.token.type() + "\"");
> +       out.print(" pos=\"" + tok.pos + "\"");
> +       out.print(" start=\"" + tok.token.startOffset() + "\"");
> +       out.print(" end=\"" + tok.token.endOffset() + "\"");
> +       out.print(">");
> +       out.print(tok.token.termText());
> +       out.println("      </token>");
> +     }
> +   }
> +   out.println("    </tokens>");
> +   out.println("  </factory>");
>    }
>
>  %>
>
> Added: incubator/solr/trunk/src/webapp/resources/admin/analysis.xsl
> URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/ 
> resources/admin/analysis.xsl?view=auto&rev=486373
> ====================================================================== 
> ========
> --- incubator/solr/trunk/src/webapp/resources/admin/analysis.xsl  
> (added)
> +++ incubator/solr/trunk/src/webapp/resources/admin/analysis.xsl  
> Tue Dec 12 14:24:47 2006
> @@ -0,0 +1,177 @@
> +<?xml version="1.0" encoding="utf-8"?>
> +<!--
> + Licensed to the Apache Software Foundation (ASF) under one or more
> + contributor license agreements.  See the NOTICE file distributed  
> with
> + this work for additional information regarding copyright ownership.
> + The ASF licenses this file to You under the Apache License,  
> Version 2.0
> + (the "License"); you may not use this file except in compliance with
> + the License.  You may obtain a copy of the License at
> +
> +     http://www.apache.org/licenses/LICENSE-2.0
> +
> + Unless required by applicable law or agreed to in writing, software
> + distributed under the License is distributed on an "AS IS" BASIS,
> + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or  
> implied.
> + See the License for the specific language governing permissions and
> + limitations under the License.
> +-->
> +<!-- $Id$ -->
> +<!-- $URL$ -->
> +
> +<xsl:stylesheet
> +  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> +  version="1.0">
> +
> +  <xsl:output
> +    method="html"
> +    indent="yes"
> +    doctype-public="-//W3C//DTD HTML 4.01//EN"
> +    doctype-system="http://www.w3.org/TR/html4/strict.dtd" />
> +
> +  <xsl:template match="/">
> +    <html>
> +      <head>
> +        <link rel="stylesheet" type="text/css" href="solr- 
> admin.css"></link>
> +        <link rel="icon" href="/favicon.ico" type="image/ico"></link>
> +        <link rel="shortcut icon" href="/favicon.ico" type="image/ 
> ico"></link>
> +        <title>SOLR Info</title>
> +      </head>
> +      <body>
> +        <a href="">
> +          <img border="0" align="right" height="61" width="142"  
> src="solr-head.gif" alt="SOLR"/>
> +  </a>
> +        <h1>Solr Admin (<xsl:value-of select="solr/meta/ 
> collection" />)</h1>
> +        <div style="margin-top: 1em;">
> +          <h2>Field Analysis</h2>
> +          <xsl:apply-templates/>
> +          <a href=".">Return to Admin Page</a>
> +        </div>
> +      </body>
> +    </html>
> +  </xsl:template>
> +
> +  <xsl:include href="meta.xsl"/>
> +
> +  <xsl:template match="solr/analysis/form">
> +  <form method="GET" action="analysis.jsp">
> +    <table>
> +      <tr>
> +        <td>
> +        <strong>Field name</strong>
> +        </td>
> +        <td>
> +          <input class="std" name="name" type="text"  
> value="{field}"/>
> +        </td>
> +      </tr>
> +      <tr>
> +        <td>
> +        <strong>Field value (Index)</strong>
> +        <br/>
> +        verbose output <input name="verbose" type="checkbox"  
> checked="true"/>
> +        <br/>
> +        highlight matches <input name="highlight" type="checkbox"  
> checked="true"/>
> +        </td>
> +        <td>
> +        <textarea class="std" rows="3" cols="70"  
> name="val"><xsl:value-of select="fieldIndexValue" /></textarea>
> +        </td>
> +      </tr>
> +      <tr>
> +        <td>
> +        <strong>Field value (Query)</strong>
> +        <br/>
> +        verbose output <input name="qverbose" type="checkbox"  
> checked="true"/>
> +        </td>
> +        <td>
> +        <textarea class="std" rows="1" cols="70"  
> name="qval"><xsl:value-of select="fieldQueryValue" /></textarea>
> +        </td>
> +      </tr>
> +      <tr>
> +        <td>
> +        </td>
> +        <td>
> +          <input class="stdbutton" type="submit" value="analyze"/>
> +        </td>
> +      </tr>
> +    </table>
> +  </form>
> +</xsl:template>
> +
> +<xsl:template match="solr/analysis/results/indexAnalyzer">
> +  <h4>Index Analyzer</h4>
> +  <xsl:for-each select="factory">
> +    <h5 style="margin-left: 1em;"><xsl:apply-templates  
> select="@class"/></h5>
> +    <xsl:apply-templates/>
> +  </xsl:for-each>
> +</xsl:template>
> +
> +<xsl:template match="solr/analysis/results/indexAnalyzer/factory/ 
> args">
> +  <div style="margin-left: 2em; font-weight: bold;">{
> +  <xsl:for-each select="arg">
> +    <xsl:apply-templates select="@name"/>=<xsl:value-of select="."/>,
> +  </xsl:for-each>
> +  }</div>
> +</xsl:template>
> +
> +<xsl:template match="solr/analysis/results/indexAnalyzer/factory/ 
> tokens">
> +<div style="margin-left: 2em;">
> +  <table width="auto" class="analysis" border="1">
> +    <tr>
> +      <th>text</th>
> +      <th>type</th>
> +      <th>position</th>
> +      <th>start</th>
> +      <th>end</th>
> +    </tr>
> +  <xsl:for-each select="token">
> +    <tr>
> +      <td><xsl:value-of select="."/></td>
> +      <td><xsl:apply-templates select="@type"/></td>
> +      <td><xsl:apply-templates select="@pos"/></td>
> +      <td><xsl:apply-templates select="@start"/></td>
> +      <td><xsl:apply-templates select="@end"/></td>
> +    </tr>
> +  </xsl:for-each>
> +  </table>
> +</div>
> +</xsl:template>
> +
> +<xsl:template match="solr/analysis/results/queryAnalyzer">
> +  <h4>Query Analyzer</h4>
> +  <xsl:for-each select="factory">
> +    <h5 style="margin-left: 1em;"><xsl:apply-templates  
> select="@class"/></h5>
> +    <xsl:apply-templates/>
> +  </xsl:for-each>
> +</xsl:template>
> +
> +<xsl:template match="solr/analysis/results/queryAnalyzer/factory/ 
> args">
> +  <div style="margin-left: 2em; font-weight: bold;">{
> +  <xsl:for-each select="arg">
> +    <xsl:apply-templates select="@name"/>=<xsl:value-of select="."/>,
> +  </xsl:for-each>
> +  }</div>
> +</xsl:template>
> +
> +<xsl:template match="solr/analysis/results/queryAnalyzer/factory/ 
> tokens">
> +<div style="margin-left: 2em;">
> +  <table width="auto" class="analysis" border="1">
> +    <tr>
> +      <th>text</th>
> +      <th>type</th>
> +      <th>position</th>
> +      <th>start</th>
> +      <th>end</th>
> +    </tr>
> +  <xsl:for-each select="token">
> +    <tr>
> +      <td><xsl:value-of select="."/></td>
> +      <td><xsl:apply-templates select="@type"/></td>
> +      <td><xsl:apply-templates select="@pos"/></td>
> +      <td><xsl:apply-templates select="@start"/></td>
> +      <td><xsl:apply-templates select="@end"/></td>
> +    </tr>
> +  </xsl:for-each>
> +  </table>
> +</div>
> +</xsl:template>
> +
> +</xsl:stylesheet>
>
> Added: incubator/solr/trunk/src/webapp/resources/admin/heading.jsp
> URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/ 
> resources/admin/heading.jsp?view=auto&rev=486373
> ====================================================================== 
> ========
> --- incubator/solr/trunk/src/webapp/resources/admin/heading.jsp  
> (added)
> +++ incubator/solr/trunk/src/webapp/resources/admin/heading.jsp Tue  
> Dec 12 14:24:47 2006
> @@ -0,0 +1,23 @@
> +<%--
> + Licensed to the Apache Software Foundation (ASF) under one or more
> + contributor license agreements.  See the NOTICE file distributed  
> with
> + this work for additional information regarding copyright ownership.
> + The ASF licenses this file to You under the Apache License,  
> Version 2.0
> + (the "License"); you may not use this file except in compliance with
> + the License.  You may obtain a copy of the License at
> +
> +     http://www.apache.org/licenses/LICENSE-2.0
> +
> + Unless required by applicable law or agreed to in writing, software
> + distributed under the License is distributed on an "AS IS" BASIS,
> + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or  
> implied.
> + See the License for the specific language governing permissions and
> + limitations under the License.
> +--%>
> +<meta>
> +  <collection><%= collectionName %></collection>
> +  <host><%= hostname %></host>
> +  <port><%= port %></port>
> +  <cwd><%= cwd %></cwd>
> +  <solrHome><%= solrHome %></solrHome>
> +</meta>
>
> Modified: incubator/solr/trunk/src/webapp/resources/admin/logging.jsp
> URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/ 
> resources/admin/logging.jsp?view=diff&rev=486373&r1=486372&r2=486373
> ====================================================================== 
> ========
> --- incubator/solr/trunk/src/webapp/resources/admin/logging.jsp  
> (original)
> +++ incubator/solr/trunk/src/webapp/resources/admin/logging.jsp Tue  
> Dec 12 14:24:47 2006
> @@ -1,4 +1,4 @@
> -<%@ page contentType="text/html; charset=utf-8"  
> pageEncoding="UTF-8"%>
> +<%@ page contentType="text/xml; charset=utf-8"  
> pageEncoding="UTF-8" language="java" %>
>  <%--
>   Licensed to the Apache Software Foundation (ASF) under one or more
>   contributor license agreements.  See the NOTICE file distributed  
> with
> @@ -24,12 +24,11 @@
>  <%@ page import="java.util.logging.Level"%>
>  <%@ page import="java.util.logging.LogManager"%>
>  <%@ page import="java.util.logging.Logger"%>
> -<%@include file="header.jsp" %>
> -<%
>
> -  LogManager mgr = LogManager.getLogManager();
> -  Logger log = SolrCore.log;
> +<?xml-stylesheet type="text/xsl" href="logging.xsl"?>
>
> +<%
> +  Logger log = SolrCore.log;
>    Logger parent = log.getParent();
>    while(parent != null) {
>      log = parent;
> @@ -38,39 +37,12 @@
>    Level lvl = log.getLevel();
>
>  %>
> -<br clear="all">
> -<h2>Solr Logging</h2>
> -<table>
> -  <tr>
> -    <td>
> -      <H3>Log Level:</H3>
> -    </td>
> -    <td>
> -<% if (lvl!=null) {%>
> -      <%= lvl.toString() %><br>
> +<solr>
> +  <logging>
> +<% if (lvl != null) {%>
> +      <logLevel><%= lvl.toString() %></logLevel>
>  <% } else { %>
> -      null<br>
> +      <logLevel>null</logLevel>
>  <% } %>
> -    </td>
> -  </tr>
> -  <tr>
> -    <td>
> -    Set Level
> -    </td>
> -    <td>
> -    [<a href=action.jsp?log=ALL>ALL</a>]
> -    [<a href=action.jsp?log=CONFIG>CONFIG</a>]
> -    [<a href=action.jsp?log=FINE>FINE</a>]
> -    [<a href=action.jsp?log=FINER>FINER</a>]
> -    [<a href=action.jsp?log=FINEST>FINEST</a>]
> -    [<a href=action.jsp?log=INFO>INFO</a>]
> -    [<a href=action.jsp?log=OFF>OFF</a>]
> -    [<a href=action.jsp?log=SEVERE>SEVERE</a>]
> -    [<a href=action.jsp?log=WARNING>WARNING</a>]
> -    </td>
> -  </tr>
> -</table>
> -<br><br>
> -    <a href=".">Return to Admin Page</a>
> -</body>
> -</html>
> +  </logging>
> +</solr>
>
> Added: incubator/solr/trunk/src/webapp/resources/admin/logging.xsl
> URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/ 
> resources/admin/logging.xsl?view=auto&rev=486373
> ====================================================================== 
> ========
> --- incubator/solr/trunk/src/webapp/resources/admin/logging.xsl  
> (added)
> +++ incubator/solr/trunk/src/webapp/resources/admin/logging.xsl Tue  
> Dec 12 14:24:47 2006
> @@ -0,0 +1,89 @@
> +<?xml version="1.0" encoding="utf-8"?>
> +<!--
> + Licensed to the Apache Software Foundation (ASF) under one or more
> + contributor license agreements.  See the NOTICE file distributed  
> with
> + this work for additional information regarding copyright ownership.
> + The ASF licenses this file to You under the Apache License,  
> Version 2.0
> + (the "License"); you may not use this file except in compliance with
> + the License.  You may obtain a copy of the License at
> +
> +     http://www.apache.org/licenses/LICENSE-2.0
> +
> + Unless required by applicable law or agreed to in writing, software
> + distributed under the License is distributed on an "AS IS" BASIS,
> + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or  
> implied.
> + See the License for the specific language governing permissions and
> + limitations under the License.
> +-->
> +<!-- $Id$ -->
> +<!-- $URL$ -->
> +
> +<xsl:stylesheet
> +  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> +  version="1.0">
> +
> +  <xsl:output
> +    method="html"
> +    indent="yes"
> +    doctype-public="-//W3C//DTD HTML 4.01//EN"
> +    doctype-system="http://www.w3.org/TR/html4/strict.dtd" />
> +
> +  <xsl:template match="/">
> +    <html>
> +      <head>
> +        <link rel="stylesheet" type="text/css" href="solr- 
> admin.css"></link>
> +	<link rel="icon" href="/favicon.ico" type="image/ico"></link>
> +	<link rel="shortcut icon" href="/favicon.ico" type="image/ico"></ 
> link>
> +        <title>Solr Admin: Logging</title>
> +      </head>
> +      <body>
> +        <a href="">
> +	   <img border="0" align="right" height="61" width="142"  
> src="solr-head.gif" alt="SOLR">
> +	   </img>
> +	</a>
> +        <h1>Solr Admin (<xsl:value-of select="solr/meta/ 
> collection" />)</h1>
> +        <div style="margin-top: 1em;">
> +          <xsl:apply-templates/>
> +        <div>
> +        </div>
> +          <a href=".">Return to Admin Page</a>
> +        </div>
> +      </body>
> +    </html>
> +  </xsl:template>
> +
> +  <xsl:include href="meta.xsl"/>
> +
> +  <xsl:template match="solr/logging">
> +
> +<br clear="all"/>
> +<h2>Solr Logging</h2>
> +<table>
> +  <tr>
> +    <td>
> +      <H3>Log Level:</H3>
> +    </td>
> +    <td>
> +<xsl:value-of select="logLevel" />
> +    </td>
> +  </tr>
> +  <tr>
> +    <td>
> +    Set Level
> +    </td>
> +    <td>
> +    [<a href="action.jsp?log=ALL">ALL</a>]
> +    [<a href="action.jsp?log=CONFIG">CONFIG</a>]
> +    [<a href="action.jsp?log=FINE">FINE</a>]
> +    [<a href="action.jsp?log=FINER">FINER</a>]
> +    [<a href="action.jsp?log=FINEST">FINEST</a>]
> +    [<a href="action.jsp?log=INFO">INFO</a>]
> +    [<a href="action.jsp?log=OFF">OFF</a>]
> +    [<a href="action.jsp?log=SEVERE">SEVERE</a>]
> +    [<a href="action.jsp?log=WARNING">WARNING</a>]
> +    </td>
> +  </tr>
> +</table>
> +
> +  </xsl:template>
> +</xsl:stylesheet>
>
> Added: incubator/solr/trunk/src/webapp/resources/admin/meta.xsl
> URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/ 
> resources/admin/meta.xsl?view=auto&rev=486373
> ====================================================================== 
> ========
> --- incubator/solr/trunk/src/webapp/resources/admin/meta.xsl (added)
> +++ incubator/solr/trunk/src/webapp/resources/admin/meta.xsl Tue  
> Dec 12 14:24:47 2006
> @@ -0,0 +1,32 @@
> +<!--
> + Licensed to the Apache Software Foundation (ASF) under one or more
> + contributor license agreements.  See the NOTICE file distributed  
> with
> + this work for additional information regarding copyright ownership.
> + The ASF licenses this file to You under the Apache License,  
> Version 2.0
> + (the "License"); you may not use this file except in compliance with
> + the License.  You may obtain a copy of the License at
> +
> +     http://www.apache.org/licenses/LICENSE-2.0
> +
> + Unless required by applicable law or agreed to in writing, software
> + distributed under the License is distributed on an "AS IS" BASIS,
> + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or  
> implied.
> + See the License for the specific language governing permissions and
> + limitations under the License.
> +-->
> +<xsl:stylesheet
> +  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> +  version="1.0">
> +
> +  <xsl:output
> +    method="html"
> +    indent="yes"
> +    doctype-public="-//W3C//DTD HTML 4.01//EN"
> +    doctype-system="http://www.w3.org/TR/html4/strict.dtd" />
> +
> +  <xsl:template match="solr/meta">
> +    <xsl:value-of select="host" />:<xsl:value-of select="port" />
> +    cwd=<xsl:value-of select="cwd" /> SolrHome=<xsl:value-of  
> select="solrHome" />
> +  </xsl:template>
> +
> +</xsl:stylesheet>
>
> Modified: incubator/solr/trunk/src/webapp/resources/admin/ping.jsp
> URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/ 
> resources/admin/ping.jsp?view=diff&rev=486373&r1=486372&r2=486373
> ====================================================================== 
> ========
> --- incubator/solr/trunk/src/webapp/resources/admin/ping.jsp  
> (original)
> +++ incubator/solr/trunk/src/webapp/resources/admin/ping.jsp Tue  
> Dec 12 14:24:47 2006
> @@ -1,4 +1,4 @@
> -<%@ page contentType="text/html; charset=utf-8"  
> pageEncoding="UTF-8"%>
> +<%@ page contentType="text/xml; charset=utf-8"  
> pageEncoding="UTF-8" language="java" %>
>  <%--
>   Licensed to the Apache Software Foundation (ASF) under one or more
>   contributor license agreements.  See the NOTICE file distributed  
> with
> @@ -17,10 +17,16 @@
>  --%>
>  <%@ page import="org.apache.solr.core.SolrConfig,
>                   org.apache.solr.core.SolrCore,
> +                 org.apache.solr.util.XML,
>                   org.apache.solr.core.SolrException"%>
>  <%@ page import="org.apache.solr.request.LocalSolrQueryRequest"%>
>  <%@ page import="org.apache.solr.request.SolrQueryResponse"%>
>  <%@ page import="java.util.StringTokenizer"%>
> +
> +<?xml-stylesheet type="text/xsl" href="ping.xsl"?>
> +
> +<solr>
> +  <ping>
>  <%
>    SolrCore core = SolrCore.getSolrCore();
>
> @@ -40,12 +46,31 @@
>    SolrQueryResponse resp = new SolrQueryResponse();
>    try {
>      core.execute(req,resp);
> -    if (resp.getException() != null) {
> -      response.sendError(500, SolrException.toStr(resp.getException 
> ()));
> +    if (resp.getException() == null) {
> +// No need for explicit status in the body, when the standard HTTP
> +// response codes already transmit success/failure message
> +//      out.println("<status>200</status>");
> +    }
> +    else if (resp.getException() != null) {
> +// No need for explicit status in the body, when the standard HTTP
> +// response codes already transmit success/failure message
> +//      out.println("<status>500</status>");
> +      out.println("<error>");
> +      XML.escapeCharData(SolrException.toStr(resp.getException()),  
> out);
> +      out.println("</error>");
> +      response.sendError(500);
>      }
>    } catch (Throwable t) {
> -      response.sendError(500, SolrException.toStr(t));
> +// No need for explicit status in the body, when the standard HTTP
> +// response codes already transmit success/failure message
> +//      out.println("<status>500</status>");
> +      out.println("<error>");
> +      XML.escapeCharData(SolrException.toStr(t), out);
> +      out.println("</error>");
> +      response.sendError(500);
>    } finally {
>        req.close();
>    }
>  %>
> +  </ping>
> +</solr>
>
> Added: incubator/solr/trunk/src/webapp/resources/admin/ping.xsl
> URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/ 
> resources/admin/ping.xsl?view=auto&rev=486373
> ====================================================================== 
> ========
> --- incubator/solr/trunk/src/webapp/resources/admin/ping.xsl (added)
> +++ incubator/solr/trunk/src/webapp/resources/admin/ping.xsl Tue  
> Dec 12 14:24:47 2006
> @@ -0,0 +1,69 @@
> +<?xml version="1.0" encoding="utf-8"?>
> +<!--
> + Licensed to the Apache Software Foundation (ASF) under one or more
> + contributor license agreements.  See the NOTICE file distributed  
> with
> + this work for additional information regarding copyright ownership.
> + The ASF licenses this file to You under the Apache License,  
> Version 2.0
> + (the "License"); you may not use this file except in compliance with
> + the License.  You may obtain a copy of the License at
> +
> +     http://www.apache.org/licenses/LICENSE-2.0
> +
> + Unless required by applicable law or agreed to in writing, software
> + distributed under the License is distributed on an "AS IS" BASIS,
> + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or  
> implied.
> + See the License for the specific language governing permissions and
> + limitations under the License.
> +-->
> +<!-- $Id$ -->
> +<!-- $URL$ -->
> +
> +<xsl:stylesheet
> +  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> +  version="1.0">
> +
> +  <xsl:output
> +    method="html"
> +    indent="yes"
> +    doctype-public="-//W3C//DTD HTML 4.01//EN"
> +    doctype-system="http://www.w3.org/TR/html4/strict.dtd" />
> +
> +  <xsl:template match="/">
> +    <html>
> +      <head>
> +        <link rel="stylesheet" type="text/css" href="solr- 
> admin.css"></link>
> +	<link rel="icon" href="/favicon.ico" type="image/ico"></link>
> +	<link rel="shortcut icon" href="/favicon.ico" type="image/ico"></ 
> link>
> +        <title>Solr Admin: Ping</title>
> +      </head>
> +      <body>
> +        <a href="">
> +	   <img border="0" align="right" height="61" width="142"  
> src="solr-head.gif" alt="SOLR">
> +	   </img>
> +	</a>
> +        <h1>Solr Admin (<xsl:value-of select="solr/meta/ 
> collection" />)</h1>
> +        <div style="margin-top: 1em;">
> +          <xsl:apply-templates/>
> +        <div>
> +        </div>
> +          <a href=".">Return to Admin Page</a>
> +        </div>
> +      </body>
> +    </html>
> +  </xsl:template>
> +
> +  <xsl:include href="meta.xsl"/>
> +
> +  <xsl:template match="solr/ping">
> +  <table>
> +    <tr>
> +      <td>
> +        <H3>Ping</H3>
> +      </td>
> +      <td>
> +        <xsl:value-of select="error" />
> +      </td>
> +    </tr>
> +  </table>
> +  </xsl:template>
> +</xsl:stylesheet>
>
> Modified: incubator/solr/trunk/src/webapp/resources/admin/ 
> threaddump.jsp
> URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/ 
> resources/admin/threaddump.jsp? 
> view=diff&rev=486373&r1=486372&r2=486373
> ====================================================================== 
> ========
> --- incubator/solr/trunk/src/webapp/resources/admin/threaddump.jsp  
> (original)
> +++ incubator/solr/trunk/src/webapp/resources/admin/threaddump.jsp  
> Tue Dec 12 14:24:47 2006
> @@ -1,4 +1,4 @@
> -<%@ page contentType="text/html; charset=utf-8"  
> pageEncoding="UTF-8"%>
> +<%@ page contentType="text/xml; charset=utf-8"  
> pageEncoding="UTF-8" language="java" %>
>  <%--
>   Licensed to the Apache Software Foundation (ASF) under one or more
>   contributor license agreements.  See the NOTICE file distributed  
> with
> @@ -18,101 +18,87 @@
>  <%@ page import="java.lang.management.ManagementFactory,
>                   java.lang.management.ThreadMXBean,
>                   java.lang.management.ThreadInfo,
> -                 java.io.IOException"%>
> -<%@include file="header.jsp" %>
> +                 java.io.IOException,
> +                 org.apache.solr.util.XML"%>
> +
> +<?xml-stylesheet type="text/xsl" href="threaddump.xsl"?>
> +
>  <%!
>    static ThreadMXBean tmbean = ManagementFactory.getThreadMXBean();
>  %>
> -<br clear="all">
> -<h2>Thread Dump</h2>
> -<table>
> -<tr>
> -<td>
> -<%
> -  out.print(System.getProperty("java.vm.name") +
> -            " " + System.getProperty("java.vm.version") + "<br>");
> -%>
> -</td>
> -</tr>
> -<tr>
> -<td>
> +<solr>
> +  <system>
> +  <jvm>
> +    <version><%=System.getProperty("java.vm.version")%></version>
> +    <name><%=System.getProperty("java.vm.name")%></name>
> +  </jvm>
> +  <threadCount>
> +    <current><%=tmbean.getThreadCount()%></current>
> +    <peak><%=tmbean.getPeakThreadCount()%></peak>
> +    <daemon><%=tmbean.getDaemonThreadCount()%></daemon>
> +  </threadCount>
>  <%
>    long[] tids;
>    ThreadInfo[] tinfos;
> -
> -  out.print("Thread Count: current=" + tmbean.getThreadCount() +
> -            " deamon=" + tmbean.getDaemonThreadCount() +
> -            " peak=" + tmbean.getPeakThreadCount());
> -%>
> -</td>
> -</tr>
> -<tr>
> -<td>
> -<%
>    tids = tmbean.findMonitorDeadlockedThreads();
> -  if (tids == null) {
> -      out.print("No deadlock found.");
> -  }
> -  else {
> -      out.print("Deadlock found :-");
> +  if (tids != null) {
> +      out.println("  <deadlocks>");
>        tinfos = tmbean.getThreadInfo(tids, Integer.MAX_VALUE);
>        for (ThreadInfo ti : tinfos) {
>            printThreadInfo(ti, out);
>        }
> +      out.println("  </deadlocks>");
>    }
>  %>
> -</td>
> -</tr>
> -<tr>
> -<td>
>  <%
> -  out.print("Full Thread Dump:<br>");
>    tids = tmbean.getAllThreadIds();
>    tinfos = tmbean.getThreadInfo(tids, Integer.MAX_VALUE);
> +  out.println("  <threadDump>");
>    for (ThreadInfo ti : tinfos) {
>       printThreadInfo(ti, out);
>    }
> +  out.println("  </threadDump>");
>  %>
> -</td>
> -</tr>
> -</table>
> -<br><br>
> -    <a href=".">Return to Admin Page</a>
> -</body>
> -</html>
> +  </system>
> +</solr>
>
>  <%!
> -  static String INDENT = "&nbsp&nbsp&nbsp&nbsp ";
> -
>    static void printThreadInfo(ThreadInfo ti, JspWriter out) throws  
> IOException {
>        long tid = ti.getThreadId();
> -      StringBuilder sb = new StringBuilder("\"" + ti.getThreadName 
> () + "\"" +
> -                                           " Id=" + tid +
> -                                           " in " +  
> ti.getThreadState());
> +      out.println("    <thread>");
> +      out.println("      <id>" + tid + "</id>");
> +      out.print("      <name>");
> +      XML.escapeCharData(ti.getThreadName(), out);
> +      out.println("</name>");
> +      out.println("      <state>" + ti.getThreadState() + "</ 
> state>");
>        if (ti.getLockName() != null) {
> -          sb.append(" on lock=" + ti.getLockName());
> +          out.println("      <lock>" + ti.getLockName() + "</lock>");
>        }
>        if (ti.isSuspended()) {
> -          sb.append(" (suspended)");
> +          out.println("      <suspended/>");
>        }
>        if (ti.isInNative()) {
> -          sb.append(" (running in native)");
> +          out.println("      <inNative/>");
>        }
>        if (tmbean.isThreadCpuTimeSupported()) {
> -          sb.append(" total cpu time="
> -                    +formatNanos(tmbean.getThreadCpuTime(tid)));
> -          sb.append(" user time="
> -                    +formatNanos(tmbean.getThreadUserTime(tid)));
> +          out.println("      <cpuTime>" + formatNanos 
> (tmbean.getThreadCpuTime(tid)) + "</cpuTime>");
> +          out.println("      <userTime>" + formatNanos 
> (tmbean.getThreadUserTime(tid)) + "</userTime>");
>        }
> -      out.print(sb.toString()+"<br>");
> +
>        if (ti.getLockOwnerName() != null) {
> -          out.print(INDENT + " owned by " + ti.getLockOwnerName() +
> -                    " Id=" + ti.getLockOwnerId()+"<br>");
> +          out.println("      <owner>");
> +          out.println("        <name>" + ti.getLockOwnerName() +  
> "</name>");
> +          out.println("        <id>" + ti.getLockOwnerId() + "</ 
> id>");
> +          out.println("      </owner>");
>        }
> +      out.println("      <stackTrace>");
>        for (StackTraceElement ste : ti.getStackTrace()) {
> -          out.print(INDENT + "at " + ste.toString()+"<br>");
> +          out.print("        <line>");
> +          XML.escapeCharData("at " + ste.toString(), out);
> +          out.println("        </line>");
>        }
> -      out.print("<br>");
> +      out.println("      </stackTrace>");
> +      out.println("    </thread>");
>    }
>
>    static String formatNanos(long ns) {
>
> Added: incubator/solr/trunk/src/webapp/resources/admin/threaddump.xsl
> URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/ 
> resources/admin/threaddump.xsl?view=auto&rev=486373
> ====================================================================== 
> ========
> --- incubator/solr/trunk/src/webapp/resources/admin/threaddump.xsl  
> (added)
> +++ incubator/solr/trunk/src/webapp/resources/admin/threaddump.xsl  
> Tue Dec 12 14:24:47 2006
> @@ -0,0 +1,101 @@
> +<?xml version="1.0" encoding="utf-8"?>
> +<!--
> + Licensed to the Apache Software Foundation (ASF) under one or more
> + contributor license agreements.  See the NOTICE file distributed  
> with
> + this work for additional information regarding copyright ownership.
> + The ASF licenses this file to You under the Apache License,  
> Version 2.0
> + (the "License"); you may not use this file except in compliance with
> + the License.  You may obtain a copy of the License at
> +
> +     http://www.apache.org/licenses/LICENSE-2.0
> +
> + Unless required by applicable law or agreed to in writing, software
> + distributed under the License is distributed on an "AS IS" BASIS,
> + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or  
> implied.
> + See the License for the specific language governing permissions and
> + limitations under the License.
> +-->
> +<!-- $Id$ -->
> +<!-- $URL$ -->
> +
> +<xsl:stylesheet
> +  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> +  version="1.0">
> +
> +  <xsl:output
> +    method="html"
> +    indent="yes"
> +    doctype-public="-//W3C//DTD HTML 4.01//EN"
> +    doctype-system="http://www.w3.org/TR/html4/strict.dtd" />
> +
> +  <xsl:template match="/">
> +    <html>
> +      <head>
> +        <link rel="stylesheet" type="text/css" href="solr- 
> admin.css"></link>
> +        <link rel="icon" href="/favicon.ico" type="image/ico"></link>
> +        <link rel="shortcut icon" href="/favicon.ico" type="image/ 
> ico"></link>
> +        <title>SOLR Info</title>
> +      </head>
> +      <body>
> +        <a href="">
> +          <img border="0" align="right" height="61" width="142"  
> src="solr-head.gif" alt="SOLR"/>
> +        </a>
> +        <h1>Solr Admin (<xsl:value-of select="solr/meta/ 
> collection" />)</h1>
> +        <h2>Thread Dump</h2>
> +        <div style="margin-top: 1em;">
> +          <table>
> +            <xsl:apply-templates/>
> +          </table>
> +          <a href=".">Return to Admin Page</a>
> +        </div>
> +      </body>
> +    </html>
> +  </xsl:template>
> +
> +  <xsl:include href="meta.xsl"/>
> +
> +  <xsl:template match="solr/system/jvm">
> +    <tr>
> +      <td><xsl:value-of select="name"/> <xsl:value-of  
> select="version"/></td>
> +    </tr>
> +  </xsl:template>
> +
> +  <xsl:template match="solr/system/threadCount">
> +    <tr>
> +      <td>
> +        Thread Count:
> +        current=<xsl:value-of select="current"/>,
> +        peak=<xsl:value-of select="peak"/>,
> +        daemon=<xsl:value-of select="daemon"/></td>
> +    </tr>
> +  </xsl:template>
> +
> +  <xsl:template match="solr/system/threadDump">
> +    <div>Full Thread Dump:</div>
> +    <xsl:for-each select="thread">
> +      <!-- OG: TODO: add suspended/native conditionals -->
> +      <tr>
> +        <td style="margin-left: 1em; font-weight: bold;">
> +          '<xsl:value-of select="name"/>'
> +          Id=<xsl:value-of select="id"/>,
> +          <xsl:value-of select="state"/>
> +          on lock=<xsl:value-of select="lock"/>,
> +          total cpu time=<xsl:value-of select="cpuTime"/>
> +          user time=<xsl:value-of select="userTime"/>
> +        </td>
> +      </tr>
> +      <xsl:apply-templates select="stackTrace"/>
> +    </xsl:for-each>
> +  </xsl:template>
> +
> +  <xsl:template match="stackTrace">
> +    <tr>
> +      <td style="margin-left: 1em;">
> +        <xsl:for-each select="line">
> +          <xsl:value-of select="."/><br/>
> +        </xsl:for-each>
> +      </td>
> +    </tr>
> +  </xsl:template>
> +
> +</xsl:stylesheet>
>


Re: svn commit: r486373 - in /incubator/solr/trunk: ./ src/webapp/resources/admin/

Posted by Yonik Seeley <yo...@apache.org>.
Good catch.  IMO, this should be fixed before we cut our release.
-Yonik

On 12/13/06, Chris Hostetter <ho...@fucit.org> wrote:
>
> Otis, i finally got a chance to try this out, and I'm noticing that while
> most of hte pages look great, the analysis page isn't displaying the form
> by default, so if you load
> "http://localhost:8983/solr/admin/analysis.jsp" or click the link from the
> main admin page:
> "http://localhost:8983/solr/admin/analysis.jsp?highlight=on" you have no
> where to go from there.
>
> If you know what the URL should look like, and try to type it in
> explicitly, you get a malformed XML file...
>
> http://localhost:8983/solr/admin/analysis.jsp?name=text&highlight=on&val=booo&qval=
>
> ...there are too many </factory> tags it looks like.

Re: svn commit: r486373 - in /incubator/solr/trunk: ./ src/webapp/resources/admin/

Posted by Chris Hostetter <ho...@fucit.org>.
Otis, i finally got a chance to try this out, and I'm noticing that while
most of hte pages look great, the analysis page isn't displaying the form
by default, so if you load
"http://localhost:8983/solr/admin/analysis.jsp" or click the link from the
main admin page:
"http://localhost:8983/solr/admin/analysis.jsp?highlight=on" you have no
where to go from there.

If you know what the URL should look like, and try to type it in
explicitly, you get a malformed XML file...

http://localhost:8983/solr/admin/analysis.jsp?name=text&highlight=on&val=booo&qval=

...there are too many </factory> tags it looks like.



: Date: Tue, 12 Dec 2006 22:24:48 -0000
: From: otis@apache.org
: Reply-To: solr-dev@lucene.apache.org
: To: solr-commits@lucene.apache.org
: Subject: svn commit: r486373 - in /incubator/solr/trunk: ./
:     src/webapp/resources/admin/
:
: Author: otis
: Date: Tue Dec 12 14:24:47 2006
: New Revision: 486373
:
: URL: http://svn.apache.org/viewvc?view=rev&rev=486373
: Log:
: - SOLR-58: make admin pages return XML and transform them to HTML using XSL
:
: Added:
:     incubator/solr/trunk/src/webapp/resources/admin/analysis.xsl
:     incubator/solr/trunk/src/webapp/resources/admin/heading.jsp
:     incubator/solr/trunk/src/webapp/resources/admin/logging.xsl
:     incubator/solr/trunk/src/webapp/resources/admin/meta.xsl
:     incubator/solr/trunk/src/webapp/resources/admin/ping.xsl
:     incubator/solr/trunk/src/webapp/resources/admin/threaddump.xsl
: Modified:
:     incubator/solr/trunk/CHANGES.txt
:     incubator/solr/trunk/src/webapp/resources/admin/analysis.jsp
:     incubator/solr/trunk/src/webapp/resources/admin/logging.jsp
:     incubator/solr/trunk/src/webapp/resources/admin/ping.jsp
:     incubator/solr/trunk/src/webapp/resources/admin/threaddump.jsp
:
: Modified: incubator/solr/trunk/CHANGES.txt
: URL: http://svn.apache.org/viewvc/incubator/solr/trunk/CHANGES.txt?view=diff&rev=486373&r1=486372&r2=486373
: ==============================================================================
: --- incubator/solr/trunk/CHANGES.txt (original)
: +++ incubator/solr/trunk/CHANGES.txt Tue Dec 12 14:24:47 2006
: @@ -118,6 +118,8 @@
:      through multiple threads.  Large commits also might be faster (klaas, SOLR-65)
:   9. Lazy field loading can be enabled via a solrconfig directive.  This will be faster when
:      not all stored fields are needed from a document (klaas, SOLR-52)
: +10. Made admin JSPs return XML and transform them with new XSL stylesheets
: +    (Otis Gospodnetic, SOLR-58)
:
:  Optimizations
:   1. getDocListAndSet can now generate both a DocList and a DocSet from a
:
: Modified: incubator/solr/trunk/src/webapp/resources/admin/analysis.jsp
: URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/resources/admin/analysis.jsp?view=diff&rev=486373&r1=486372&r2=486373
: ==============================================================================
: --- incubator/solr/trunk/src/webapp/resources/admin/analysis.jsp (original)
: +++ incubator/solr/trunk/src/webapp/resources/admin/analysis.jsp Tue Dec 12 14:24:47 2006
: @@ -1,20 +1,4 @@
: -<%@ page contentType="text/html; charset=utf-8" pageEncoding="UTF-8"%>
: -<%--
: - Licensed to the Apache Software Foundation (ASF) under one or more
: - contributor license agreements.  See the NOTICE file distributed with
: - this work for additional information regarding copyright ownership.
: - The ASF licenses this file to You under the Apache License, Version 2.0
: - (the "License"); you may not use this file except in compliance with
: - the License.  You may obtain a copy of the License at
: -
: -     http://www.apache.org/licenses/LICENSE-2.0
: -
: - Unless required by applicable law or agreed to in writing, software
: - distributed under the License is distributed on an "AS IS" BASIS,
: - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
: - See the License for the specific language governing permissions and
: - limitations under the License.
: ---%>
: +<%@ page contentType="text/xml; charset=utf-8" pageEncoding="UTF-8" language="java" %>
:  <%@ page import="org.apache.lucene.analysis.Analyzer,
:                   org.apache.lucene.analysis.Token,
:                   org.apache.lucene.analysis.TokenStream,
: @@ -30,129 +14,86 @@
:  <%@ page import="java.io.StringReader"%>
:  <%@ page import="java.util.*"%>
:
: -<%-- $Id$ --%>
: -<%-- $Source: /cvs/main/searching/org.apache.solrolarServer/resources/admin/analysis.jsp,v $ --%>
: -<%-- $Name:  $ --%>
: +<?xml-stylesheet type="text/xsl" href="analysis.xsl"?>
:
: -<%@include file="header.jsp" %>
: +<%@include file="_info.jsp" %>
:
:  <%
:    String name = request.getParameter("name");
: -  if (name==null || name.length()==0) name="";
: +  if (name == null || name.length() == 0) name = "";
:    String val = request.getParameter("val");
: -  if (val==null || val.length()==0) val="";
: +  if (val == null || val.length() == 0) val = "";
:    String qval = request.getParameter("qval");
: -  if (qval==null || qval.length()==0) qval="";
: +  if (qval == null || qval.length() == 0) qval = "";
:    String verboseS = request.getParameter("verbose");
: -  boolean verbose = verboseS!=null && verboseS.equalsIgnoreCase("on");
: +  boolean verbose = verboseS != null && verboseS.equalsIgnoreCase("on");
:    String qverboseS = request.getParameter("qverbose");
: -  boolean qverbose = qverboseS!=null && qverboseS.equalsIgnoreCase("on");
: +  boolean qverbose = qverboseS != null && qverboseS.equalsIgnoreCase("on");
:    String highlightS = request.getParameter("highlight");
: -  boolean highlight = highlightS!=null && highlightS.equalsIgnoreCase("on");
: +  boolean highlight = highlightS != null && highlightS.equalsIgnoreCase("on");
:  %>
:
: -<br clear="all">
: -
: -<h2>Field Analysis</h2>
: -
: -<form method="GET" action="analysis.jsp">
: -<table>
: -<tr>
: -  <td>
: -	<strong>Field name</strong>
: -  </td>
: -  <td>
: -	<input class="std" name="name" type="text" value="<%= name %>">
: -  </td>
: -</tr>
: -<tr>
: -  <td>
: -	<strong>Field value (Index)</strong>
: -  <br/>
: -  verbose output
: -  <input name="verbose" type="checkbox"
: -     <%= verbose ? "checked=\"true\"" : "" %> >
: -    <br/>
: -  highlight matches
: -  <input name="highlight" type="checkbox"
: -     <%= highlight ? "checked=\"true\"" : "" %> >
: -  </td>
: -  <td>
: -	<textarea class="std" rows="3" cols="70" name="val"><%= val %></textarea>
: -  </td>
: -</tr>
: -<tr>
: -  <td>
: -	<strong>Field value (Query)</strong>
: -  <br/>
: -  verbose output
: -  <input name="qverbose" type="checkbox"
: -     <%= qverbose ? "checked=\"true\"" : "" %> >
: -  </td>
: -  <td>
: -	<textarea class="std" rows="1" cols="70" name="qval"><%= qval %></textarea>
: -  </td>
: -</tr>
: -<tr>
: -
: -  <td>
: -  </td>
: -
: -  <td>
: -	<input class="stdbutton" type="submit" value="analyze">
: -  </td>
: -
: -</tr>
: -</table>
: -</form>
: -
: +<solr>
: +<%@include file="heading.jsp" %>
: +  <analysis>
:
:  <%
: -  SchemaField field=null;
: +  SchemaField field = null;
:
: -  if (name!="") {
: +  if (name != "") {
:      try {
:        field = schema.getField(name);
:      } catch (Exception e) {
: -      out.println("<strong>Unknown Field " + name + "</strong>");
: +      out.println("<error>Unknown Field " + name + "</error>");
:      }
:    }
:
: -  if (field!=null) {
: +  if (field != null) {
: +    out.println("    <form>");
: +    out.println("      <field>");
: +      XML.escapeCharData(name, out);
: +    out.println("</field>");
: +    out.print("      <fieldIndexValue>");
: +      XML.escapeCharData(val, out);
: +    out.println("      </fieldIndexValue>");
: +    out.print("      <fieldQueryValue>");
: +      XML.escapeCharData(qval, out);
: +    out.println("      </fieldQueryValue>");
: +    out.println("    </form>");
: +
:      HashSet<Tok> matches = null;
: -    if (qval!="" && highlight) {
: +    if (qval != "" && highlight) {
:        Reader reader = new StringReader(qval);
:        Analyzer analyzer =  field.getType().getQueryAnalyzer();
: -      TokenStream tstream = analyzer.tokenStream(field.getName(),reader);
: +      TokenStream tstream = analyzer.tokenStream(field.getName(), reader);
:        List<Token> tokens = getTokens(tstream);
:        matches = new HashSet<Tok>();
: -      for (Token t : tokens) { matches.add( new Tok(t,0)); }
: +      for (Token t : tokens) { matches.add( new Tok(t, 0)); }
:      }
:
: -    if (val!="") {
: -      out.println("<h3>Index Analyzer</h3>");
: -      doAnalyzer(out, field, val, false, verbose,matches);
: +    out.println("    <results>");
: +    if (val != "") {
: +      out.println("<indexAnalyzer>");
: +      doAnalyzer(out, field, val, false, verbose, matches);
: +      out.println("</indexAnalyzer>");
:      }
: -    if (qval!="") {
: -      out.println("<h3>Query Analyzer</h3>");
: -      doAnalyzer(out, field, qval, true, qverbose,null);
: +    if (qval != "") {
: +      out.println("<queryAnalyzer>");
: +      doAnalyzer(out, field, qval, true, qverbose, null);
: +      out.println("</queryAnalyzer>");
:      }
: +    out.println("    </results>");
:    }
: -
:  %>
: -
: -
: -</body>
: -</html>
: -
: +  </analysis>
: +</solr>
:
:  <%!
:    private static void doAnalyzer(JspWriter out, SchemaField field, String val, boolean queryAnalyser, boolean verbose, Set<Tok> match) throws Exception {
:      Reader reader = new StringReader(val);
:
:      FieldType ft = field.getType();
: -     Analyzer analyzer = queryAnalyser ?
: -             ft.getQueryAnalyzer() : ft.getAnalyzer();
: +    Analyzer analyzer = queryAnalyser ? ft.getQueryAnalyzer() : ft.getAnalyzer();
:       if (analyzer instanceof TokenizerChain) {
:         TokenizerChain tchain = (TokenizerChain)analyzer;
:         TokenizerFactory tfac = tchain.getTokenizerFactory();
: @@ -161,12 +102,14 @@
:         TokenStream tstream = tfac.create(reader);
:         List<Token> tokens = getTokens(tstream);
:         tstream = tfac.create(reader);
: +       // write tokenizer factories
:         if (verbose) {
:           writeHeader(out, tfac.getClass(), tfac.getArgs());
:         }
:
:         writeTokens(out, tokens, ft, verbose, match);
:
: +       // write filter factories
:         for (TokenFilterFactory filtfac : filtfacs) {
:           if (verbose) {
:             writeHeader(out, filtfac.getClass(), filtfac.getArgs());
: @@ -183,7 +126,6 @@
:
:           writeTokens(out, tokens, ft, verbose, match);
:         }
: -
:       } else {
:         TokenStream tstream = analyzer.tokenStream(field.getName(),reader);
:         List<Token> tokens = getTokens(tstream);
: @@ -199,7 +141,7 @@
:      List<Token> tokens = new ArrayList<Token>();
:      while (true) {
:        Token t = tstream.next();
: -      if (t==null) break;
: +      if (t == null) break;
:        tokens.add(t);
:      }
:      return tokens;
: @@ -210,8 +152,8 @@
:      Token token;
:      int pos;
:      Tok(Token token, int pos) {
: -      this.token=token;
: -      this.pos=pos;
: +      this.token = token;
: +      this.pos = pos;
:      }
:
:      public boolean equals(Object o) {
: @@ -221,7 +163,7 @@
:        return token.termText().hashCode();
:      }
:      public String toString() {
: -      return token.termText();
: +      return token.termText() + " at position " + pos;
:      }
:    }
:
: @@ -229,81 +171,38 @@
:      public String toStr(Object o);
:    }
:
: -  private static void printRow(JspWriter out, String header, List[] arrLst, ToStr converter, boolean multival, boolean verbose, Set<Tok> match) throws IOException {
: -    // find the maximum number of terms for any position
: -    int maxSz=1;
: -    if (multival) {
: -      for (List lst : arrLst) {
: -        maxSz = Math.max(lst.size(), maxSz);
: -      }
: -    }
: -
: -
: -    for (int idx=0; idx<maxSz; idx++) {
: -      out.println("<tr>");
: -      if (idx==0 && verbose) {
: -        if (header != null) {
: -          out.print("<th NOWRAP rowspan=\""+maxSz+"\">");
: -          XML.escapeCharData(header,out);
: -          out.println("</th>");
: -        }
: -      }
: -
: -      for (List<Tok> lst : arrLst) {
: -        if (lst.size() <= idx) continue;
: -        if (match!=null && match.contains(lst.get(idx))) {
: -          out.print("<td class=\"highlight\"");
: -        } else {
: -          out.print("<td class=\"debugdata\"");
: -        }
: -
: -        if (idx==0 && lst.size()==1 && maxSz > 1) {
: -          out.print("rowspan=\""+maxSz+'"');
: -        }
: -
: -        out.print('>');
: -
: -        XML.escapeCharData(converter.toStr(lst.get(idx)), out);
: -        out.print("</td>");
: -      }
: -
: -      out.println("</tr>");
: -    }
: -
: -  }
: -
: -
: -
:    static void writeHeader(JspWriter out, Class clazz, Map<String,String> args) throws IOException {
: -    out.print("<h4>");
: -    out.print(clazz.getName());
: -    XML.escapeCharData("   "+args,out);
: -    out.println("</h4>");
: +    out.println("  <factory class=\"" + clazz.getName() + "\">");
: +    out.println("    <args>");
: +    for (Iterator<String> iter = args.keySet().iterator(); iter.hasNext(); ) {
: +      String key = iter.next();
: +      String value = args.get(key);
: +      out.println("      <arg name=\"" + key + "\">" + value + "</arg>");
: +    }
: +    out.println("    </args>");
:    }
:
: -
: -
:    // readable, raw, pos, type, start/end
:    static void writeTokens(JspWriter out, List<Token> tokens, final FieldType ft, boolean verbose, Set<Tok> match) throws IOException {
:
:      // Use a map to tell what tokens are in what positions
:      // because some tokenizers/filters may do funky stuff with
:      // very large increments, or negative increments.
: -    HashMap<Integer,List<Tok>> map = new HashMap<Integer,List<Tok>>();
: -    boolean needRaw=false;
: -    int pos=0;
: +    HashMap<Integer, List<Tok>> map = new HashMap<Integer, List<Tok>>();
: +    boolean needRaw = false;
: +    int pos = 0;
:      for (Token t : tokens) {
:        if (!t.termText().equals(ft.indexedToReadable(t.termText()))) {
: -        needRaw=true;
: +        needRaw = true;
:        }
:
:        pos += t.getPositionIncrement();
:        List lst = map.get(pos);
: -      if (lst==null) {
: +      if (lst == null) {
:          lst = new ArrayList(1);
: -        map.put(pos,lst);
: +        map.put(pos, lst);
:        }
: -      Tok tok = new Tok(t,pos);
: +      Tok tok = new Tok(t, pos);
:        lst.add(tok);
:      }
:
: @@ -330,70 +229,21 @@
:
:      );
:
: -    out.println("<table width=\"auto\" class=\"analysis\" border=\"1\">");
: -
: -    if (verbose) {
: -      printRow(out,"term position", arr, new ToStr() {
: -        public String toStr(Object o) {
: -          return Integer.toString(((Tok)o).pos);
: -        }
: -      }
: -              ,false
: -              ,verbose
: -              ,null);
: -    }
: -
: -
: -    printRow(out,"term text", arr, new ToStr() {
: -      public String toStr(Object o) {
: -        return ft.indexedToReadable( ((Tok)o).token.termText() );
: -      }
: -    }
: -            ,true
: -            ,verbose
: -            ,match
: -   );
: -
: -    if (needRaw) {
: -      printRow(out,"raw text", arr, new ToStr() {
: -        public String toStr(Object o) {
: -          // todo: output in hex or something?
: -          // check if it's all ascii or not?
: -          return ((Tok)o).token.termText();
: -        }
: -      }
: -              ,true
: -              ,verbose
: -              ,match
: -      );
: -    }
: -
: -    if (verbose) {
: -      printRow(out,"term type", arr, new ToStr() {
: -        public String toStr(Object o) {
: -          return  ((Tok)o).token.type();
: -        }
: -      }
: -              ,true
: -              ,verbose,
: -              null
: -      );
: -    }
: -
: -    if (verbose) {
: -      printRow(out,"source start,end", arr, new ToStr() {
: -        public String toStr(Object o) {
: -          Token t = ((Tok)o).token;
: -          return Integer.toString(t.startOffset()) + ',' + t.endOffset() ;
: -        }
: -      }
: -              ,true
: -              ,verbose
: -              ,null
: -      );
: -    }
: -
: -    out.println("</table>");
: +   out.println("    <tokens>");
: +   for (int i = 0; i < arr.length; i++) {
: +     for (Tok tok : arr[i]) {
: +       out.print("      <token");
: +       out.print(" type=\"" + tok.token.type() + "\"");
: +       out.print(" pos=\"" + tok.pos + "\"");
: +       out.print(" start=\"" + tok.token.startOffset() + "\"");
: +       out.print(" end=\"" + tok.token.endOffset() + "\"");
: +       out.print(">");
: +       out.print(tok.token.termText());
: +       out.println("      </token>");
: +     }
: +   }
: +   out.println("    </tokens>");
: +   out.println("  </factory>");
:    }
:
:  %>
:
: Added: incubator/solr/trunk/src/webapp/resources/admin/analysis.xsl
: URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/resources/admin/analysis.xsl?view=auto&rev=486373
: ==============================================================================
: --- incubator/solr/trunk/src/webapp/resources/admin/analysis.xsl (added)
: +++ incubator/solr/trunk/src/webapp/resources/admin/analysis.xsl Tue Dec 12 14:24:47 2006
: @@ -0,0 +1,177 @@
: +<?xml version="1.0" encoding="utf-8"?>
: +<!--
: + Licensed to the Apache Software Foundation (ASF) under one or more
: + contributor license agreements.  See the NOTICE file distributed with
: + this work for additional information regarding copyright ownership.
: + The ASF licenses this file to You under the Apache License, Version 2.0
: + (the "License"); you may not use this file except in compliance with
: + the License.  You may obtain a copy of the License at
: +
: +     http://www.apache.org/licenses/LICENSE-2.0
: +
: + Unless required by applicable law or agreed to in writing, software
: + distributed under the License is distributed on an "AS IS" BASIS,
: + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
: + See the License for the specific language governing permissions and
: + limitations under the License.
: +-->
: +<!-- $Id$ -->
: +<!-- $URL$ -->
: +
: +<xsl:stylesheet
: +  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
: +  version="1.0">
: +
: +  <xsl:output
: +    method="html"
: +    indent="yes"
: +    doctype-public="-//W3C//DTD HTML 4.01//EN"
: +    doctype-system="http://www.w3.org/TR/html4/strict.dtd" />
: +
: +  <xsl:template match="/">
: +    <html>
: +      <head>
: +        <link rel="stylesheet" type="text/css" href="solr-admin.css"></link>
: +        <link rel="icon" href="/favicon.ico" type="image/ico"></link>
: +        <link rel="shortcut icon" href="/favicon.ico" type="image/ico"></link>
: +        <title>SOLR Info</title>
: +      </head>
: +      <body>
: +        <a href="">
: +          <img border="0" align="right" height="61" width="142" src="solr-head.gif" alt="SOLR"/>
: +  </a>
: +        <h1>Solr Admin (<xsl:value-of select="solr/meta/collection" />)</h1>
: +        <div style="margin-top: 1em;">
: +          <h2>Field Analysis</h2>
: +          <xsl:apply-templates/>
: +          <a href=".">Return to Admin Page</a>
: +        </div>
: +      </body>
: +    </html>
: +  </xsl:template>
: +
: +  <xsl:include href="meta.xsl"/>
: +
: +  <xsl:template match="solr/analysis/form">
: +  <form method="GET" action="analysis.jsp">
: +    <table>
: +      <tr>
: +        <td>
: +        <strong>Field name</strong>
: +        </td>
: +        <td>
: +          <input class="std" name="name" type="text" value="{field}"/>
: +        </td>
: +      </tr>
: +      <tr>
: +        <td>
: +        <strong>Field value (Index)</strong>
: +        <br/>
: +        verbose output <input name="verbose" type="checkbox" checked="true"/>
: +        <br/>
: +        highlight matches <input name="highlight" type="checkbox" checked="true"/>
: +        </td>
: +        <td>
: +        <textarea class="std" rows="3" cols="70" name="val"><xsl:value-of select="fieldIndexValue" /></textarea>
: +        </td>
: +      </tr>
: +      <tr>
: +        <td>
: +        <strong>Field value (Query)</strong>
: +        <br/>
: +        verbose output <input name="qverbose" type="checkbox" checked="true"/>
: +        </td>
: +        <td>
: +        <textarea class="std" rows="1" cols="70" name="qval"><xsl:value-of select="fieldQueryValue" /></textarea>
: +        </td>
: +      </tr>
: +      <tr>
: +        <td>
: +        </td>
: +        <td>
: +          <input class="stdbutton" type="submit" value="analyze"/>
: +        </td>
: +      </tr>
: +    </table>
: +  </form>
: +</xsl:template>
: +
: +<xsl:template match="solr/analysis/results/indexAnalyzer">
: +  <h4>Index Analyzer</h4>
: +  <xsl:for-each select="factory">
: +    <h5 style="margin-left: 1em;"><xsl:apply-templates select="@class"/></h5>
: +    <xsl:apply-templates/>
: +  </xsl:for-each>
: +</xsl:template>
: +
: +<xsl:template match="solr/analysis/results/indexAnalyzer/factory/args">
: +  <div style="margin-left: 2em; font-weight: bold;">{
: +  <xsl:for-each select="arg">
: +    <xsl:apply-templates select="@name"/>=<xsl:value-of select="."/>,
: +  </xsl:for-each>
: +  }</div>
: +</xsl:template>
: +
: +<xsl:template match="solr/analysis/results/indexAnalyzer/factory/tokens">
: +<div style="margin-left: 2em;">
: +  <table width="auto" class="analysis" border="1">
: +    <tr>
: +      <th>text</th>
: +      <th>type</th>
: +      <th>position</th>
: +      <th>start</th>
: +      <th>end</th>
: +    </tr>
: +  <xsl:for-each select="token">
: +    <tr>
: +      <td><xsl:value-of select="."/></td>
: +      <td><xsl:apply-templates select="@type"/></td>
: +      <td><xsl:apply-templates select="@pos"/></td>
: +      <td><xsl:apply-templates select="@start"/></td>
: +      <td><xsl:apply-templates select="@end"/></td>
: +    </tr>
: +  </xsl:for-each>
: +  </table>
: +</div>
: +</xsl:template>
: +
: +<xsl:template match="solr/analysis/results/queryAnalyzer">
: +  <h4>Query Analyzer</h4>
: +  <xsl:for-each select="factory">
: +    <h5 style="margin-left: 1em;"><xsl:apply-templates select="@class"/></h5>
: +    <xsl:apply-templates/>
: +  </xsl:for-each>
: +</xsl:template>
: +
: +<xsl:template match="solr/analysis/results/queryAnalyzer/factory/args">
: +  <div style="margin-left: 2em; font-weight: bold;">{
: +  <xsl:for-each select="arg">
: +    <xsl:apply-templates select="@name"/>=<xsl:value-of select="."/>,
: +  </xsl:for-each>
: +  }</div>
: +</xsl:template>
: +
: +<xsl:template match="solr/analysis/results/queryAnalyzer/factory/tokens">
: +<div style="margin-left: 2em;">
: +  <table width="auto" class="analysis" border="1">
: +    <tr>
: +      <th>text</th>
: +      <th>type</th>
: +      <th>position</th>
: +      <th>start</th>
: +      <th>end</th>
: +    </tr>
: +  <xsl:for-each select="token">
: +    <tr>
: +      <td><xsl:value-of select="."/></td>
: +      <td><xsl:apply-templates select="@type"/></td>
: +      <td><xsl:apply-templates select="@pos"/></td>
: +      <td><xsl:apply-templates select="@start"/></td>
: +      <td><xsl:apply-templates select="@end"/></td>
: +    </tr>
: +  </xsl:for-each>
: +  </table>
: +</div>
: +</xsl:template>
: +
: +</xsl:stylesheet>
:
: Added: incubator/solr/trunk/src/webapp/resources/admin/heading.jsp
: URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/resources/admin/heading.jsp?view=auto&rev=486373
: ==============================================================================
: --- incubator/solr/trunk/src/webapp/resources/admin/heading.jsp (added)
: +++ incubator/solr/trunk/src/webapp/resources/admin/heading.jsp Tue Dec 12 14:24:47 2006
: @@ -0,0 +1,23 @@
: +<%--
: + Licensed to the Apache Software Foundation (ASF) under one or more
: + contributor license agreements.  See the NOTICE file distributed with
: + this work for additional information regarding copyright ownership.
: + The ASF licenses this file to You under the Apache License, Version 2.0
: + (the "License"); you may not use this file except in compliance with
: + the License.  You may obtain a copy of the License at
: +
: +     http://www.apache.org/licenses/LICENSE-2.0
: +
: + Unless required by applicable law or agreed to in writing, software
: + distributed under the License is distributed on an "AS IS" BASIS,
: + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
: + See the License for the specific language governing permissions and
: + limitations under the License.
: +--%>
: +<meta>
: +  <collection><%= collectionName %></collection>
: +  <host><%= hostname %></host>
: +  <port><%= port %></port>
: +  <cwd><%= cwd %></cwd>
: +  <solrHome><%= solrHome %></solrHome>
: +</meta>
:
: Modified: incubator/solr/trunk/src/webapp/resources/admin/logging.jsp
: URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/resources/admin/logging.jsp?view=diff&rev=486373&r1=486372&r2=486373
: ==============================================================================
: --- incubator/solr/trunk/src/webapp/resources/admin/logging.jsp (original)
: +++ incubator/solr/trunk/src/webapp/resources/admin/logging.jsp Tue Dec 12 14:24:47 2006
: @@ -1,4 +1,4 @@
: -<%@ page contentType="text/html; charset=utf-8" pageEncoding="UTF-8"%>
: +<%@ page contentType="text/xml; charset=utf-8" pageEncoding="UTF-8" language="java" %>
:  <%--
:   Licensed to the Apache Software Foundation (ASF) under one or more
:   contributor license agreements.  See the NOTICE file distributed with
: @@ -24,12 +24,11 @@
:  <%@ page import="java.util.logging.Level"%>
:  <%@ page import="java.util.logging.LogManager"%>
:  <%@ page import="java.util.logging.Logger"%>
: -<%@include file="header.jsp" %>
: -<%
:
: -  LogManager mgr = LogManager.getLogManager();
: -  Logger log = SolrCore.log;
: +<?xml-stylesheet type="text/xsl" href="logging.xsl"?>
:
: +<%
: +  Logger log = SolrCore.log;
:    Logger parent = log.getParent();
:    while(parent != null) {
:      log = parent;
: @@ -38,39 +37,12 @@
:    Level lvl = log.getLevel();
:
:  %>
: -<br clear="all">
: -<h2>Solr Logging</h2>
: -<table>
: -  <tr>
: -    <td>
: -      <H3>Log Level:</H3>
: -    </td>
: -    <td>
: -<% if (lvl!=null) {%>
: -      <%= lvl.toString() %><br>
: +<solr>
: +  <logging>
: +<% if (lvl != null) {%>
: +      <logLevel><%= lvl.toString() %></logLevel>
:  <% } else { %>
: -      null<br>
: +      <logLevel>null</logLevel>
:  <% } %>
: -    </td>
: -  </tr>
: -  <tr>
: -    <td>
: -    Set Level
: -    </td>
: -    <td>
: -    [<a href=action.jsp?log=ALL>ALL</a>]
: -    [<a href=action.jsp?log=CONFIG>CONFIG</a>]
: -    [<a href=action.jsp?log=FINE>FINE</a>]
: -    [<a href=action.jsp?log=FINER>FINER</a>]
: -    [<a href=action.jsp?log=FINEST>FINEST</a>]
: -    [<a href=action.jsp?log=INFO>INFO</a>]
: -    [<a href=action.jsp?log=OFF>OFF</a>]
: -    [<a href=action.jsp?log=SEVERE>SEVERE</a>]
: -    [<a href=action.jsp?log=WARNING>WARNING</a>]
: -    </td>
: -  </tr>
: -</table>
: -<br><br>
: -    <a href=".">Return to Admin Page</a>
: -</body>
: -</html>
: +  </logging>
: +</solr>
:
: Added: incubator/solr/trunk/src/webapp/resources/admin/logging.xsl
: URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/resources/admin/logging.xsl?view=auto&rev=486373
: ==============================================================================
: --- incubator/solr/trunk/src/webapp/resources/admin/logging.xsl (added)
: +++ incubator/solr/trunk/src/webapp/resources/admin/logging.xsl Tue Dec 12 14:24:47 2006
: @@ -0,0 +1,89 @@
: +<?xml version="1.0" encoding="utf-8"?>
: +<!--
: + Licensed to the Apache Software Foundation (ASF) under one or more
: + contributor license agreements.  See the NOTICE file distributed with
: + this work for additional information regarding copyright ownership.
: + The ASF licenses this file to You under the Apache License, Version 2.0
: + (the "License"); you may not use this file except in compliance with
: + the License.  You may obtain a copy of the License at
: +
: +     http://www.apache.org/licenses/LICENSE-2.0
: +
: + Unless required by applicable law or agreed to in writing, software
: + distributed under the License is distributed on an "AS IS" BASIS,
: + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
: + See the License for the specific language governing permissions and
: + limitations under the License.
: +-->
: +<!-- $Id$ -->
: +<!-- $URL$ -->
: +
: +<xsl:stylesheet
: +  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
: +  version="1.0">
: +
: +  <xsl:output
: +    method="html"
: +    indent="yes"
: +    doctype-public="-//W3C//DTD HTML 4.01//EN"
: +    doctype-system="http://www.w3.org/TR/html4/strict.dtd" />
: +
: +  <xsl:template match="/">
: +    <html>
: +      <head>
: +        <link rel="stylesheet" type="text/css" href="solr-admin.css"></link>
: +	<link rel="icon" href="/favicon.ico" type="image/ico"></link>
: +	<link rel="shortcut icon" href="/favicon.ico" type="image/ico"></link>
: +        <title>Solr Admin: Logging</title>
: +      </head>
: +      <body>
: +        <a href="">
: +	   <img border="0" align="right" height="61" width="142" src="solr-head.gif" alt="SOLR">
: +	   </img>
: +	</a>
: +        <h1>Solr Admin (<xsl:value-of select="solr/meta/collection" />)</h1>
: +        <div style="margin-top: 1em;">
: +          <xsl:apply-templates/>
: +        <div>
: +        </div>
: +          <a href=".">Return to Admin Page</a>
: +        </div>
: +      </body>
: +    </html>
: +  </xsl:template>
: +
: +  <xsl:include href="meta.xsl"/>
: +
: +  <xsl:template match="solr/logging">
: +
: +<br clear="all"/>
: +<h2>Solr Logging</h2>
: +<table>
: +  <tr>
: +    <td>
: +      <H3>Log Level:</H3>
: +    </td>
: +    <td>
: +<xsl:value-of select="logLevel" />
: +    </td>
: +  </tr>
: +  <tr>
: +    <td>
: +    Set Level
: +    </td>
: +    <td>
: +    [<a href="action.jsp?log=ALL">ALL</a>]
: +    [<a href="action.jsp?log=CONFIG">CONFIG</a>]
: +    [<a href="action.jsp?log=FINE">FINE</a>]
: +    [<a href="action.jsp?log=FINER">FINER</a>]
: +    [<a href="action.jsp?log=FINEST">FINEST</a>]
: +    [<a href="action.jsp?log=INFO">INFO</a>]
: +    [<a href="action.jsp?log=OFF">OFF</a>]
: +    [<a href="action.jsp?log=SEVERE">SEVERE</a>]
: +    [<a href="action.jsp?log=WARNING">WARNING</a>]
: +    </td>
: +  </tr>
: +</table>
: +
: +  </xsl:template>
: +</xsl:stylesheet>
:
: Added: incubator/solr/trunk/src/webapp/resources/admin/meta.xsl
: URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/resources/admin/meta.xsl?view=auto&rev=486373
: ==============================================================================
: --- incubator/solr/trunk/src/webapp/resources/admin/meta.xsl (added)
: +++ incubator/solr/trunk/src/webapp/resources/admin/meta.xsl Tue Dec 12 14:24:47 2006
: @@ -0,0 +1,32 @@
: +<!--
: + Licensed to the Apache Software Foundation (ASF) under one or more
: + contributor license agreements.  See the NOTICE file distributed with
: + this work for additional information regarding copyright ownership.
: + The ASF licenses this file to You under the Apache License, Version 2.0
: + (the "License"); you may not use this file except in compliance with
: + the License.  You may obtain a copy of the License at
: +
: +     http://www.apache.org/licenses/LICENSE-2.0
: +
: + Unless required by applicable law or agreed to in writing, software
: + distributed under the License is distributed on an "AS IS" BASIS,
: + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
: + See the License for the specific language governing permissions and
: + limitations under the License.
: +-->
: +<xsl:stylesheet
: +  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
: +  version="1.0">
: +
: +  <xsl:output
: +    method="html"
: +    indent="yes"
: +    doctype-public="-//W3C//DTD HTML 4.01//EN"
: +    doctype-system="http://www.w3.org/TR/html4/strict.dtd" />
: +
: +  <xsl:template match="solr/meta">
: +    <xsl:value-of select="host" />:<xsl:value-of select="port" />
: +    cwd=<xsl:value-of select="cwd" /> SolrHome=<xsl:value-of select="solrHome" />
: +  </xsl:template>
: +
: +</xsl:stylesheet>
:
: Modified: incubator/solr/trunk/src/webapp/resources/admin/ping.jsp
: URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/resources/admin/ping.jsp?view=diff&rev=486373&r1=486372&r2=486373
: ==============================================================================
: --- incubator/solr/trunk/src/webapp/resources/admin/ping.jsp (original)
: +++ incubator/solr/trunk/src/webapp/resources/admin/ping.jsp Tue Dec 12 14:24:47 2006
: @@ -1,4 +1,4 @@
: -<%@ page contentType="text/html; charset=utf-8" pageEncoding="UTF-8"%>
: +<%@ page contentType="text/xml; charset=utf-8" pageEncoding="UTF-8" language="java" %>
:  <%--
:   Licensed to the Apache Software Foundation (ASF) under one or more
:   contributor license agreements.  See the NOTICE file distributed with
: @@ -17,10 +17,16 @@
:  --%>
:  <%@ page import="org.apache.solr.core.SolrConfig,
:                   org.apache.solr.core.SolrCore,
: +                 org.apache.solr.util.XML,
:                   org.apache.solr.core.SolrException"%>
:  <%@ page import="org.apache.solr.request.LocalSolrQueryRequest"%>
:  <%@ page import="org.apache.solr.request.SolrQueryResponse"%>
:  <%@ page import="java.util.StringTokenizer"%>
: +
: +<?xml-stylesheet type="text/xsl" href="ping.xsl"?>
: +
: +<solr>
: +  <ping>
:  <%
:    SolrCore core = SolrCore.getSolrCore();
:
: @@ -40,12 +46,31 @@
:    SolrQueryResponse resp = new SolrQueryResponse();
:    try {
:      core.execute(req,resp);
: -    if (resp.getException() != null) {
: -      response.sendError(500, SolrException.toStr(resp.getException()));
: +    if (resp.getException() == null) {
: +// No need for explicit status in the body, when the standard HTTP
: +// response codes already transmit success/failure message
: +//      out.println("<status>200</status>");
: +    }
: +    else if (resp.getException() != null) {
: +// No need for explicit status in the body, when the standard HTTP
: +// response codes already transmit success/failure message
: +//      out.println("<status>500</status>");
: +      out.println("<error>");
: +      XML.escapeCharData(SolrException.toStr(resp.getException()), out);
: +      out.println("</error>");
: +      response.sendError(500);
:      }
:    } catch (Throwable t) {
: -      response.sendError(500, SolrException.toStr(t));
: +// No need for explicit status in the body, when the standard HTTP
: +// response codes already transmit success/failure message
: +//      out.println("<status>500</status>");
: +      out.println("<error>");
: +      XML.escapeCharData(SolrException.toStr(t), out);
: +      out.println("</error>");
: +      response.sendError(500);
:    } finally {
:        req.close();
:    }
:  %>
: +  </ping>
: +</solr>
:
: Added: incubator/solr/trunk/src/webapp/resources/admin/ping.xsl
: URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/resources/admin/ping.xsl?view=auto&rev=486373
: ==============================================================================
: --- incubator/solr/trunk/src/webapp/resources/admin/ping.xsl (added)
: +++ incubator/solr/trunk/src/webapp/resources/admin/ping.xsl Tue Dec 12 14:24:47 2006
: @@ -0,0 +1,69 @@
: +<?xml version="1.0" encoding="utf-8"?>
: +<!--
: + Licensed to the Apache Software Foundation (ASF) under one or more
: + contributor license agreements.  See the NOTICE file distributed with
: + this work for additional information regarding copyright ownership.
: + The ASF licenses this file to You under the Apache License, Version 2.0
: + (the "License"); you may not use this file except in compliance with
: + the License.  You may obtain a copy of the License at
: +
: +     http://www.apache.org/licenses/LICENSE-2.0
: +
: + Unless required by applicable law or agreed to in writing, software
: + distributed under the License is distributed on an "AS IS" BASIS,
: + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
: + See the License for the specific language governing permissions and
: + limitations under the License.
: +-->
: +<!-- $Id$ -->
: +<!-- $URL$ -->
: +
: +<xsl:stylesheet
: +  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
: +  version="1.0">
: +
: +  <xsl:output
: +    method="html"
: +    indent="yes"
: +    doctype-public="-//W3C//DTD HTML 4.01//EN"
: +    doctype-system="http://www.w3.org/TR/html4/strict.dtd" />
: +
: +  <xsl:template match="/">
: +    <html>
: +      <head>
: +        <link rel="stylesheet" type="text/css" href="solr-admin.css"></link>
: +	<link rel="icon" href="/favicon.ico" type="image/ico"></link>
: +	<link rel="shortcut icon" href="/favicon.ico" type="image/ico"></link>
: +        <title>Solr Admin: Ping</title>
: +      </head>
: +      <body>
: +        <a href="">
: +	   <img border="0" align="right" height="61" width="142" src="solr-head.gif" alt="SOLR">
: +	   </img>
: +	</a>
: +        <h1>Solr Admin (<xsl:value-of select="solr/meta/collection" />)</h1>
: +        <div style="margin-top: 1em;">
: +          <xsl:apply-templates/>
: +        <div>
: +        </div>
: +          <a href=".">Return to Admin Page</a>
: +        </div>
: +      </body>
: +    </html>
: +  </xsl:template>
: +
: +  <xsl:include href="meta.xsl"/>
: +
: +  <xsl:template match="solr/ping">
: +  <table>
: +    <tr>
: +      <td>
: +        <H3>Ping</H3>
: +      </td>
: +      <td>
: +        <xsl:value-of select="error" />
: +      </td>
: +    </tr>
: +  </table>
: +  </xsl:template>
: +</xsl:stylesheet>
:
: Modified: incubator/solr/trunk/src/webapp/resources/admin/threaddump.jsp
: URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/resources/admin/threaddump.jsp?view=diff&rev=486373&r1=486372&r2=486373
: ==============================================================================
: --- incubator/solr/trunk/src/webapp/resources/admin/threaddump.jsp (original)
: +++ incubator/solr/trunk/src/webapp/resources/admin/threaddump.jsp Tue Dec 12 14:24:47 2006
: @@ -1,4 +1,4 @@
: -<%@ page contentType="text/html; charset=utf-8" pageEncoding="UTF-8"%>
: +<%@ page contentType="text/xml; charset=utf-8" pageEncoding="UTF-8" language="java" %>
:  <%--
:   Licensed to the Apache Software Foundation (ASF) under one or more
:   contributor license agreements.  See the NOTICE file distributed with
: @@ -18,101 +18,87 @@
:  <%@ page import="java.lang.management.ManagementFactory,
:                   java.lang.management.ThreadMXBean,
:                   java.lang.management.ThreadInfo,
: -                 java.io.IOException"%>
: -<%@include file="header.jsp" %>
: +                 java.io.IOException,
: +                 org.apache.solr.util.XML"%>
: +
: +<?xml-stylesheet type="text/xsl" href="threaddump.xsl"?>
: +
:  <%!
:    static ThreadMXBean tmbean = ManagementFactory.getThreadMXBean();
:  %>
: -<br clear="all">
: -<h2>Thread Dump</h2>
: -<table>
: -<tr>
: -<td>
: -<%
: -  out.print(System.getProperty("java.vm.name") +
: -            " " + System.getProperty("java.vm.version") + "<br>");
: -%>
: -</td>
: -</tr>
: -<tr>
: -<td>
: +<solr>
: +  <system>
: +  <jvm>
: +    <version><%=System.getProperty("java.vm.version")%></version>
: +    <name><%=System.getProperty("java.vm.name")%></name>
: +  </jvm>
: +  <threadCount>
: +    <current><%=tmbean.getThreadCount()%></current>
: +    <peak><%=tmbean.getPeakThreadCount()%></peak>
: +    <daemon><%=tmbean.getDaemonThreadCount()%></daemon>
: +  </threadCount>
:  <%
:    long[] tids;
:    ThreadInfo[] tinfos;
: -
: -  out.print("Thread Count: current=" + tmbean.getThreadCount() +
: -            " deamon=" + tmbean.getDaemonThreadCount() +
: -            " peak=" + tmbean.getPeakThreadCount());
: -%>
: -</td>
: -</tr>
: -<tr>
: -<td>
: -<%
:    tids = tmbean.findMonitorDeadlockedThreads();
: -  if (tids == null) {
: -      out.print("No deadlock found.");
: -  }
: -  else {
: -      out.print("Deadlock found :-");
: +  if (tids != null) {
: +      out.println("  <deadlocks>");
:        tinfos = tmbean.getThreadInfo(tids, Integer.MAX_VALUE);
:        for (ThreadInfo ti : tinfos) {
:            printThreadInfo(ti, out);
:        }
: +      out.println("  </deadlocks>");
:    }
:  %>
: -</td>
: -</tr>
: -<tr>
: -<td>
:  <%
: -  out.print("Full Thread Dump:<br>");
:    tids = tmbean.getAllThreadIds();
:    tinfos = tmbean.getThreadInfo(tids, Integer.MAX_VALUE);
: +  out.println("  <threadDump>");
:    for (ThreadInfo ti : tinfos) {
:       printThreadInfo(ti, out);
:    }
: +  out.println("  </threadDump>");
:  %>
: -</td>
: -</tr>
: -</table>
: -<br><br>
: -    <a href=".">Return to Admin Page</a>
: -</body>
: -</html>
: +  </system>
: +</solr>
:
:  <%!
: -  static String INDENT = "&nbsp&nbsp&nbsp&nbsp ";
: -
:    static void printThreadInfo(ThreadInfo ti, JspWriter out) throws IOException {
:        long tid = ti.getThreadId();
: -      StringBuilder sb = new StringBuilder("\"" + ti.getThreadName() + "\"" +
: -                                           " Id=" + tid +
: -                                           " in " + ti.getThreadState());
: +      out.println("    <thread>");
: +      out.println("      <id>" + tid + "</id>");
: +      out.print("      <name>");
: +      XML.escapeCharData(ti.getThreadName(), out);
: +      out.println("</name>");
: +      out.println("      <state>" + ti.getThreadState() + "</state>");
:        if (ti.getLockName() != null) {
: -          sb.append(" on lock=" + ti.getLockName());
: +          out.println("      <lock>" + ti.getLockName() + "</lock>");
:        }
:        if (ti.isSuspended()) {
: -          sb.append(" (suspended)");
: +          out.println("      <suspended/>");
:        }
:        if (ti.isInNative()) {
: -          sb.append(" (running in native)");
: +          out.println("      <inNative/>");
:        }
:        if (tmbean.isThreadCpuTimeSupported()) {
: -          sb.append(" total cpu time="
: -                    +formatNanos(tmbean.getThreadCpuTime(tid)));
: -          sb.append(" user time="
: -                    +formatNanos(tmbean.getThreadUserTime(tid)));
: +          out.println("      <cpuTime>" + formatNanos(tmbean.getThreadCpuTime(tid)) + "</cpuTime>");
: +          out.println("      <userTime>" + formatNanos(tmbean.getThreadUserTime(tid)) + "</userTime>");
:        }
: -      out.print(sb.toString()+"<br>");
: +
:        if (ti.getLockOwnerName() != null) {
: -          out.print(INDENT + " owned by " + ti.getLockOwnerName() +
: -                    " Id=" + ti.getLockOwnerId()+"<br>");
: +          out.println("      <owner>");
: +          out.println("        <name>" + ti.getLockOwnerName() + "</name>");
: +          out.println("        <id>" + ti.getLockOwnerId() + "</id>");
: +          out.println("      </owner>");
:        }
: +      out.println("      <stackTrace>");
:        for (StackTraceElement ste : ti.getStackTrace()) {
: -          out.print(INDENT + "at " + ste.toString()+"<br>");
: +          out.print("        <line>");
: +          XML.escapeCharData("at " + ste.toString(), out);
: +          out.println("        </line>");
:        }
: -      out.print("<br>");
: +      out.println("      </stackTrace>");
: +      out.println("    </thread>");
:    }
:
:    static String formatNanos(long ns) {
:
: Added: incubator/solr/trunk/src/webapp/resources/admin/threaddump.xsl
: URL: http://svn.apache.org/viewvc/incubator/solr/trunk/src/webapp/resources/admin/threaddump.xsl?view=auto&rev=486373
: ==============================================================================
: --- incubator/solr/trunk/src/webapp/resources/admin/threaddump.xsl (added)
: +++ incubator/solr/trunk/src/webapp/resources/admin/threaddump.xsl Tue Dec 12 14:24:47 2006
: @@ -0,0 +1,101 @@
: +<?xml version="1.0" encoding="utf-8"?>
: +<!--
: + Licensed to the Apache Software Foundation (ASF) under one or more
: + contributor license agreements.  See the NOTICE file distributed with
: + this work for additional information regarding copyright ownership.
: + The ASF licenses this file to You under the Apache License, Version 2.0
: + (the "License"); you may not use this file except in compliance with
: + the License.  You may obtain a copy of the License at
: +
: +     http://www.apache.org/licenses/LICENSE-2.0
: +
: + Unless required by applicable law or agreed to in writing, software
: + distributed under the License is distributed on an "AS IS" BASIS,
: + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
: + See the License for the specific language governing permissions and
: + limitations under the License.
: +-->
: +<!-- $Id$ -->
: +<!-- $URL$ -->
: +
: +<xsl:stylesheet
: +  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
: +  version="1.0">
: +
: +  <xsl:output
: +    method="html"
: +    indent="yes"
: +    doctype-public="-//W3C//DTD HTML 4.01//EN"
: +    doctype-system="http://www.w3.org/TR/html4/strict.dtd" />
: +
: +  <xsl:template match="/">
: +    <html>
: +      <head>
: +        <link rel="stylesheet" type="text/css" href="solr-admin.css"></link>
: +        <link rel="icon" href="/favicon.ico" type="image/ico"></link>
: +        <link rel="shortcut icon" href="/favicon.ico" type="image/ico"></link>
: +        <title>SOLR Info</title>
: +      </head>
: +      <body>
: +        <a href="">
: +          <img border="0" align="right" height="61" width="142" src="solr-head.gif" alt="SOLR"/>
: +        </a>
: +        <h1>Solr Admin (<xsl:value-of select="solr/meta/collection" />)</h1>
: +        <h2>Thread Dump</h2>
: +        <div style="margin-top: 1em;">
: +          <table>
: +            <xsl:apply-templates/>
: +          </table>
: +          <a href=".">Return to Admin Page</a>
: +        </div>
: +      </body>
: +    </html>
: +  </xsl:template>
: +
: +  <xsl:include href="meta.xsl"/>
: +
: +  <xsl:template match="solr/system/jvm">
: +    <tr>
: +      <td><xsl:value-of select="name"/> <xsl:value-of select="version"/></td>
: +    </tr>
: +  </xsl:template>
: +
: +  <xsl:template match="solr/system/threadCount">
: +    <tr>
: +      <td>
: +        Thread Count:
: +        current=<xsl:value-of select="current"/>,
: +        peak=<xsl:value-of select="peak"/>,
: +        daemon=<xsl:value-of select="daemon"/></td>
: +    </tr>
: +  </xsl:template>
: +
: +  <xsl:template match="solr/system/threadDump">
: +    <div>Full Thread Dump:</div>
: +    <xsl:for-each select="thread">
: +      <!-- OG: TODO: add suspended/native conditionals -->
: +      <tr>
: +        <td style="margin-left: 1em; font-weight: bold;">
: +          '<xsl:value-of select="name"/>'
: +          Id=<xsl:value-of select="id"/>,
: +          <xsl:value-of select="state"/>
: +          on lock=<xsl:value-of select="lock"/>,
: +          total cpu time=<xsl:value-of select="cpuTime"/>
: +          user time=<xsl:value-of select="userTime"/>
: +        </td>
: +      </tr>
: +      <xsl:apply-templates select="stackTrace"/>
: +    </xsl:for-each>
: +  </xsl:template>
: +
: +  <xsl:template match="stackTrace">
: +    <tr>
: +      <td style="margin-left: 1em;">
: +        <xsl:for-each select="line">
: +          <xsl:value-of select="."/><br/>
: +        </xsl:for-each>
: +      </td>
: +    </tr>
: +  </xsl:template>
: +
: +</xsl:stylesheet>
:
:



-Hoss