You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by rm...@apache.org on 2011/08/23 16:07:19 UTC

svn commit: r1160700 [22/22] - in /lucene/dev/branches/flexscoring: ./ dev-tools/eclipse/ dev-tools/idea/.idea/ dev-tools/idea/lucene/contrib/ dev-tools/idea/lucene/contrib/demo/ dev-tools/idea/lucene/contrib/highlighter/ dev-tools/idea/lucene/contrib/...

Modified: lucene/dev/branches/flexscoring/solr/solrj/src/test/org/apache/solr/client/solrj/response/QueryResponseTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/solrj/src/test/org/apache/solr/client/solrj/response/QueryResponseTest.java?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/solrj/src/test/org/apache/solr/client/solrj/response/QueryResponseTest.java (original)
+++ lucene/dev/branches/flexscoring/solr/solrj/src/test/org/apache/solr/client/solrj/response/QueryResponseTest.java Tue Aug 23 14:06:58 2011
@@ -17,21 +17,21 @@
 
 package org.apache.solr.client.solrj.response;
 
-import java.io.FileReader;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-
 import junit.framework.Assert;
-
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.client.solrj.impl.XMLResponseParser;
+import org.apache.solr.common.util.DateUtil;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.core.SolrResourceLoader;
 import org.junit.Test;
 
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.List;
+
 /**
- * Simple test for Date facet support in QueryResponse
+ * A few tests for parsing Solr response in QueryResponse
  * 
  * @since solr 1.3
  */
@@ -39,7 +39,7 @@ public class QueryResponseTest extends L
   @Test
   public void testDateFacets() throws Exception   {
     XMLResponseParser parser = new XMLResponseParser();
-    InputStream is = new SolrResourceLoader(null, null).openResource("sampleDateFacetResponse.xml");
+    InputStream is = new SolrResourceLoader(null, null).openResource("solrj/sampleDateFacetResponse.xml");
     assertNotNull(is);
     Reader in = new InputStreamReader(is, "UTF-8");
     NamedList<Object> response = parser.processResponse(in);
@@ -59,4 +59,161 @@ public class QueryResponseTest extends L
       // System.out.println("END: " + f.getEnd());
     }
   }
+
+  @Test
+  public void testRangeFacets() throws Exception {
+    XMLResponseParser parser = new XMLResponseParser();
+    InputStream is = new SolrResourceLoader(null, null).openResource("solrj/sampleDateFacetResponse.xml");
+    assertNotNull(is);
+    Reader in = new InputStreamReader(is, "UTF-8");
+    NamedList<Object> response = parser.processResponse(in);
+    in.close();
+
+    QueryResponse qr = new QueryResponse(response, null);
+    Assert.assertNotNull(qr);
+
+    int counter = 0;
+    RangeFacet.Numeric price = null;
+    RangeFacet.Date manufacturedateDt = null;
+    for (RangeFacet r : qr.getFacetRanges()){
+      assertNotNull(r);
+      if ("price".equals(r.getName())) {
+        price = (RangeFacet.Numeric) r;
+      } else if ("manufacturedate_dt".equals(r.getName())) {
+        manufacturedateDt = (RangeFacet.Date) r;
+      }
+
+      counter++;
+    }
+    assertEquals(2, counter);
+    assertNotNull(price);
+    assertNotNull(manufacturedateDt);
+
+    assertEquals(0.0F, price.getStart());
+    assertEquals(5.0F, price.getEnd());
+    assertEquals(1.0F, price.getGap());
+    assertEquals("0.0", price.getCounts().get(0).getValue());
+    assertEquals(3, price.getCounts().get(0).getCount());
+    assertEquals("1.0", price.getCounts().get(1).getValue());
+    assertEquals(0, price.getCounts().get(1).getCount());
+    assertEquals("2.0", price.getCounts().get(2).getValue());
+    assertEquals(0, price.getCounts().get(2).getCount());
+    assertEquals("3.0", price.getCounts().get(3).getValue());
+    assertEquals(0, price.getCounts().get(3).getCount());
+    assertEquals("4.0", price.getCounts().get(4).getValue());
+    assertEquals(0, price.getCounts().get(4).getCount());
+
+    assertEquals(DateUtil.parseDate("2005-02-13T15:26:37Z"), manufacturedateDt.getStart());
+    assertEquals(DateUtil.parseDate("2008-02-13T15:26:37Z"), manufacturedateDt.getEnd());
+    assertEquals("+1YEAR", manufacturedateDt.getGap());
+    assertEquals("2005-02-13T15:26:37Z", manufacturedateDt.getCounts().get(0).getValue());
+    assertEquals(4, manufacturedateDt.getCounts().get(0).getCount());
+    assertEquals("2006-02-13T15:26:37Z", manufacturedateDt.getCounts().get(1).getValue());
+    assertEquals(7, manufacturedateDt.getCounts().get(1).getCount());
+    assertEquals("2007-02-13T15:26:37Z", manufacturedateDt.getCounts().get(2).getValue());
+    assertEquals(0, manufacturedateDt.getCounts().get(2).getCount());
+  }
+
+  @Test
+  public void testGroupResponse() throws Exception {
+    XMLResponseParser parser = new XMLResponseParser();
+    InputStream is = new SolrResourceLoader(null, null).openResource("solrj/sampleGroupResponse.xml");
+    assertNotNull(is);
+    Reader in = new InputStreamReader(is, "UTF-8");
+    NamedList<Object> response = parser.processResponse(in);
+    in.close();
+
+    QueryResponse qr = new QueryResponse(response, null);
+    assertNotNull(qr);
+    GroupResponse groupResponse = qr.getGroupResponse();
+    assertNotNull(groupResponse);
+    List<GroupCommand> commands = groupResponse.getValues();
+    assertNotNull(commands);
+    assertEquals(3, commands.size());
+
+    GroupCommand fieldCommand = commands.get(0);
+    assertEquals("acco_id", fieldCommand.getName());
+    assertEquals(30000000, fieldCommand.getMatches());
+    assertEquals(5687, fieldCommand.getNGroups().intValue());
+    List<Group> fieldCommandGroups = fieldCommand.getValues();
+    assertEquals(10, fieldCommandGroups.size());
+    assertEquals("116_ar", fieldCommandGroups.get(0).getGroupValue());
+    assertEquals(2, fieldCommandGroups.get(0).getResult().size());
+    assertEquals(2236, fieldCommandGroups.get(0).getResult().getNumFound());
+    assertEquals("116_hi", fieldCommandGroups.get(1).getGroupValue());
+    assertEquals(2, fieldCommandGroups.get(1).getResult().size());
+    assertEquals(2234, fieldCommandGroups.get(1).getResult().getNumFound());
+    assertEquals("953_ar", fieldCommandGroups.get(2).getGroupValue());
+    assertEquals(2, fieldCommandGroups.get(2).getResult().size());
+    assertEquals(1020, fieldCommandGroups.get(2).getResult().getNumFound());
+    assertEquals("953_hi", fieldCommandGroups.get(3).getGroupValue());
+    assertEquals(2, fieldCommandGroups.get(3).getResult().size());
+    assertEquals(1030, fieldCommandGroups.get(3).getResult().getNumFound());
+    assertEquals("954_ar", fieldCommandGroups.get(4).getGroupValue());
+    assertEquals(2, fieldCommandGroups.get(4).getResult().size());
+    assertEquals(2236, fieldCommandGroups.get(4).getResult().getNumFound());
+    assertEquals("954_hi", fieldCommandGroups.get(5).getGroupValue());
+    assertEquals(2, fieldCommandGroups.get(5).getResult().size());
+    assertEquals(2234, fieldCommandGroups.get(5).getResult().getNumFound());
+    assertEquals("546_ar", fieldCommandGroups.get(6).getGroupValue());
+    assertEquals(2, fieldCommandGroups.get(6).getResult().size());
+    assertEquals(4984, fieldCommandGroups.get(6).getResult().getNumFound());
+    assertEquals("546_hi", fieldCommandGroups.get(7).getGroupValue());
+    assertEquals(2, fieldCommandGroups.get(7).getResult().size());
+    assertEquals(4984, fieldCommandGroups.get(7).getResult().getNumFound());
+    assertEquals("708_ar", fieldCommandGroups.get(8).getGroupValue());
+    assertEquals(2, fieldCommandGroups.get(8).getResult().size());
+    assertEquals(4627, fieldCommandGroups.get(8).getResult().getNumFound());
+    assertEquals("708_hi", fieldCommandGroups.get(9).getGroupValue());
+    assertEquals(2, fieldCommandGroups.get(9).getResult().size());
+    assertEquals(4627, fieldCommandGroups.get(9).getResult().getNumFound());
+
+    GroupCommand funcCommand = commands.get(1);
+    assertEquals("sum(price, price)", funcCommand.getName());
+    assertEquals(30000000, funcCommand.getMatches());
+    assertNull(funcCommand.getNGroups());
+    List<Group> funcCommandGroups = funcCommand.getValues();
+    assertEquals(10, funcCommandGroups.size());
+    assertEquals("95000.0", funcCommandGroups.get(0).getGroupValue());
+    assertEquals(2, funcCommandGroups.get(0).getResult().size());
+    assertEquals(43666, funcCommandGroups.get(0).getResult().getNumFound());
+    assertEquals("91400.0", funcCommandGroups.get(1).getGroupValue());
+    assertEquals(2, funcCommandGroups.get(1).getResult().size());
+    assertEquals(27120, funcCommandGroups.get(1).getResult().getNumFound());
+    assertEquals("104800.0", funcCommandGroups.get(2).getGroupValue());
+    assertEquals(2, funcCommandGroups.get(2).getResult().size());
+    assertEquals(34579, funcCommandGroups.get(2).getResult().getNumFound());
+    assertEquals("99400.0", funcCommandGroups.get(3).getGroupValue());
+    assertEquals(2, funcCommandGroups.get(3).getResult().size());
+    assertEquals(40519, funcCommandGroups.get(3).getResult().getNumFound());
+    assertEquals("109600.0", funcCommandGroups.get(4).getGroupValue());
+    assertEquals(2, funcCommandGroups.get(4).getResult().size());
+    assertEquals(36203, funcCommandGroups.get(4).getResult().getNumFound());
+    assertEquals("102400.0", funcCommandGroups.get(5).getGroupValue());
+    assertEquals(2, funcCommandGroups.get(5).getResult().size());
+    assertEquals(37852, funcCommandGroups.get(5).getResult().getNumFound());
+    assertEquals("116800.0", funcCommandGroups.get(6).getGroupValue());
+    assertEquals(2, funcCommandGroups.get(6).getResult().size());
+    assertEquals(40393, funcCommandGroups.get(6).getResult().getNumFound());
+    assertEquals("107800.0", funcCommandGroups.get(7).getGroupValue());
+    assertEquals(2, funcCommandGroups.get(7).getResult().size());
+    assertEquals(41639, funcCommandGroups.get(7).getResult().getNumFound());
+    assertEquals("136200.0", funcCommandGroups.get(8).getGroupValue());
+    assertEquals(2, funcCommandGroups.get(8).getResult().size());
+    assertEquals(25929, funcCommandGroups.get(8).getResult().getNumFound());
+    assertEquals("131400.0", funcCommandGroups.get(9).getGroupValue());
+    assertEquals(2, funcCommandGroups.get(9).getResult().size());
+    assertEquals(29179, funcCommandGroups.get(9).getResult().getNumFound());
+
+    GroupCommand queryCommand = commands.get(2);
+    assertEquals("country:fr", queryCommand.getName());
+    assertNull(queryCommand.getNGroups());
+    assertEquals(30000000, queryCommand.getMatches());
+    List<Group> queryCommandGroups = queryCommand.getValues();
+    assertEquals(1, queryCommandGroups.size());
+    assertEquals("country:fr", queryCommandGroups.get(0).getGroupValue());
+    assertEquals(2, queryCommandGroups.get(0).getResult().size());
+    assertEquals(57074, queryCommandGroups.get(0).getResult().getNumFound());
+  }
+
 }

Modified: lucene/dev/branches/flexscoring/solr/solrj/src/test/org/apache/solr/common/util/ContentStreamTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/solrj/src/test/org/apache/solr/common/util/ContentStreamTest.java?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/solrj/src/test/org/apache/solr/common/util/ContentStreamTest.java (original)
+++ lucene/dev/branches/flexscoring/solr/solrj/src/test/org/apache/solr/common/util/ContentStreamTest.java Tue Aug 23 14:06:58 2011
@@ -49,7 +49,7 @@ public class ContentStreamTest extends L
 
   public void testFileStream() throws IOException 
   {
-    InputStream is = new SolrResourceLoader(null, null).openResource( "README" );
+    InputStream is = new SolrResourceLoader(null, null).openResource( "solrj/README" );
     assertNotNull( is );
     File file = new File(TEMP_DIR, "README");
     FileOutputStream os = new FileOutputStream(file);

Modified: lucene/dev/branches/flexscoring/solr/solrj/src/test/org/apache/solr/common/util/TestSystemIdResolver.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/solrj/src/test/org/apache/solr/common/util/TestSystemIdResolver.java?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/solrj/src/test/org/apache/solr/common/util/TestSystemIdResolver.java (original)
+++ lucene/dev/branches/flexscoring/solr/solrj/src/test/org/apache/solr/common/util/TestSystemIdResolver.java Tue Aug 23 14:06:58 2011
@@ -38,9 +38,10 @@ public class TestSystemIdResolver extend
   }
   
   public void testResolving() throws Exception {
-    final ResourceLoader loader = new SolrResourceLoader(SolrTestCaseJ4.TEST_HOME(), this.getClass().getClassLoader());
+    final String testHome = SolrTestCaseJ4.getFile("solrj/solr/conf").getParent();
+    final ResourceLoader loader = new SolrResourceLoader(testHome, this.getClass().getClassLoader());
     final SystemIdResolver resolver = new SystemIdResolver(loader);
-    final String fileUri = new File(SolrTestCaseJ4.TEST_HOME()+"/crazy-path-to-config.xml").toURI().toASCIIString();
+    final String fileUri = new File(testHome+"/crazy-path-to-config.xml").toURI().toASCIIString();
     
     assertEquals("solrres:/test.xml", SystemIdResolver.createSystemIdFromResourceName("test.xml"));
     assertEquals("solrres://@/usr/local/etc/test.xml", SystemIdResolver.createSystemIdFromResourceName("/usr/local/etc/test.xml"));
@@ -60,10 +61,10 @@ public class TestSystemIdResolver extend
     assertEntityResolving(resolver, "solrres:/schema.xml", "solrres:/solrconfig.xml", "schema.xml");
     assertEntityResolving(resolver, "solrres:/org/apache/solr/common/util/TestSystemIdResolver.class",
       "solrres:/org/apache/solr/common/ResourceLoader.class", "util/TestSystemIdResolver.class");
-    assertEntityResolving(resolver, SystemIdResolver.createSystemIdFromResourceName(SolrTestCaseJ4.TEST_HOME()+"/conf/schema.xml"),
-      SystemIdResolver.createSystemIdFromResourceName(SolrTestCaseJ4.TEST_HOME()+"/conf/solrconfig.xml"), "schema.xml");
-    assertEntityResolving(resolver, SystemIdResolver.createSystemIdFromResourceName(SolrTestCaseJ4.TEST_HOME()+"/crazy-path-to-schema.xml"),
-      SystemIdResolver.createSystemIdFromResourceName(SolrTestCaseJ4.TEST_HOME()+"/crazy-path-to-config.xml"), "crazy-path-to-schema.xml");
+    assertEntityResolving(resolver, SystemIdResolver.createSystemIdFromResourceName(testHome+"/conf/schema.xml"),
+      SystemIdResolver.createSystemIdFromResourceName(testHome+"/conf/solrconfig.xml"), "schema.xml");
+    assertEntityResolving(resolver, SystemIdResolver.createSystemIdFromResourceName(testHome+"/crazy-path-to-schema.xml"),
+      SystemIdResolver.createSystemIdFromResourceName(testHome+"/crazy-path-to-config.xml"), "crazy-path-to-schema.xml");
     
     // test, that resolving works if somebody uses an absolute file:-URI in a href attribute, the resolver should return null (default fallback)
     assertNull(resolver.resolveEntity(null, null, "solrres:/solrconfig.xml", fileUri));

Modified: lucene/dev/branches/flexscoring/solr/test-framework/src/java/org/apache/solr/SolrJettyTestBase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/test-framework/src/java/org/apache/solr/SolrJettyTestBase.java?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/test-framework/src/java/org/apache/solr/SolrJettyTestBase.java (original)
+++ lucene/dev/branches/flexscoring/solr/test-framework/src/java/org/apache/solr/SolrJettyTestBase.java Tue Aug 23 14:06:58 2011
@@ -39,7 +39,7 @@ abstract public class SolrJettyTestBase 
 
   public static JettySolrRunner createJetty(String solrHome, String configFile, String context) throws Exception {
     // creates the data dir
-    initCore(null, null);
+    initCore(null, null, solrHome);
 
     ignoreException("maxWarmingSearchers");
 

Modified: lucene/dev/branches/flexscoring/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java (original)
+++ lucene/dev/branches/flexscoring/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java Tue Aug 23 14:06:58 2011
@@ -76,16 +76,6 @@ public abstract class SolrTestCaseJ4 ext
     endTrackingSearchers();
     endTrackingWriters();
   }
-  
-  // SOLR-2279: hack to shut these directories down
-  // we still keep the ability to track open index files this way
-  public static void closeDirectories() throws Exception {
-    for (MockDirectoryWrapper d : stores.keySet()) {
-      if (d.isOpen()) {
-        d.close();
-      }
-    }
-  }
 
   @Override
   public void setUp() throws Exception {
@@ -302,7 +292,6 @@ public abstract class SolrTestCaseJ4 ext
   public static void deleteCore() throws Exception {
     log.info("###deleteCore" );
     if (h != null) { h.close(); }
-    closeDirectories();
     if (dataDir != null) {
       String skip = System.getProperty("solr.test.leavedatadir");
       if (null != skip && 0 != skip.trim().length()) {

Modified: lucene/dev/branches/flexscoring/solr/test-framework/src/java/org/apache/solr/core/MockDirectoryFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/test-framework/src/java/org/apache/solr/core/MockDirectoryFactory.java?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/test-framework/src/java/org/apache/solr/core/MockDirectoryFactory.java (original)
+++ lucene/dev/branches/flexscoring/solr/test-framework/src/java/org/apache/solr/core/MockDirectoryFactory.java Tue Aug 23 14:06:58 2011
@@ -26,10 +26,10 @@ import org.apache.lucene.util.LuceneTest
 /**
  * Opens a directory with {@link LuceneTestCase#newFSDirectory(File)}
  */
-public class MockDirectoryFactory extends DirectoryFactory {
+public class MockDirectoryFactory extends CachingDirectoryFactory {
 
   @Override
-  public Directory open(String path) throws IOException {
+  public Directory create(String path) throws IOException {
     return LuceneTestCase.newFSDirectory(new File(path));
   }
 }

Modified: lucene/dev/branches/flexscoring/solr/test-framework/src/java/org/apache/solr/util/AbstractSolrTestCase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/test-framework/src/java/org/apache/solr/util/AbstractSolrTestCase.java?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/test-framework/src/java/org/apache/solr/util/AbstractSolrTestCase.java (original)
+++ lucene/dev/branches/flexscoring/solr/test-framework/src/java/org/apache/solr/util/AbstractSolrTestCase.java Tue Aug 23 14:06:58 2011
@@ -193,7 +193,6 @@ public abstract class AbstractSolrTestCa
     }
 
     if (h != null) { h.close(); }
-    SolrTestCaseJ4.closeDirectories();
     String skip = System.getProperty("solr.test.leavedatadir");
     if (null != skip && 0 != skip.trim().length()) {
       System.err.println("NOTE: per solr.test.leavedatadir, dataDir will not be removed: " + dataDir.getAbsolutePath());

Modified: lucene/dev/branches/flexscoring/solr/test-framework/src/java/org/apache/solr/util/ExternalPaths.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/test-framework/src/java/org/apache/solr/util/ExternalPaths.java?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/test-framework/src/java/org/apache/solr/util/ExternalPaths.java (original)
+++ lucene/dev/branches/flexscoring/solr/test-framework/src/java/org/apache/solr/util/ExternalPaths.java Tue Aug 23 14:06:58 2011
@@ -37,7 +37,17 @@ public class ExternalPaths {
   static String determineSourceHome() {
     // ugly, ugly hack to determine the example home without depending on the CWD
     // this is needed for example/multicore tests which reside outside the classpath
-    File base = SolrTestCaseJ4.getFile("solr/conf").getAbsoluteFile();
+    File file;
+    try {
+      file = new File("solr/conf");
+      if (!file.exists()) {
+        file = new File(Thread.currentThread().getContextClassLoader().getResource("solr/conf").toURI());
+      }
+    } catch (Exception e) {
+      // If there is no "solr/conf" in the classpath, fall back to searching from the current directory.
+      file = new File(".");
+    }
+    File base = file.getAbsoluteFile();
     while (!new File(base, "solr/CHANGES.txt").exists()) {
       base = base.getParentFile();
     }

Modified: lucene/dev/branches/flexscoring/solr/test-framework/src/java/org/apache/solr/util/TestHarness.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/test-framework/src/java/org/apache/solr/util/TestHarness.java?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/test-framework/src/java/org/apache/solr/util/TestHarness.java (original)
+++ lucene/dev/branches/flexscoring/solr/test-framework/src/java/org/apache/solr/util/TestHarness.java Tue Aug 23 14:06:58 2011
@@ -71,8 +71,8 @@ import java.util.Map;
 public class TestHarness {
   protected CoreContainer container;
   private SolrCore core;
-  private XPath xpath = XPathFactory.newInstance().newXPath();
-  private DocumentBuilder builder;
+  private final ThreadLocal<DocumentBuilder> builderTL = new ThreadLocal<DocumentBuilder>();
+  private final ThreadLocal<XPath> xpathTL = new ThreadLocal<XPath>();
   public XmlUpdateRequestHandler updater;
         
   public static SolrConfig createConfig(String confFile) {
@@ -145,15 +145,40 @@ public class TestHarness {
       core = container.getCore(coreName);
       if (core != null)
         core.close();
-      builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
-      
+
       updater = new XmlUpdateRequestHandler();
       updater.init( null );
     } catch (Exception e) {
       throw new RuntimeException(e);
     }
   }
-  
+
+  private DocumentBuilder getXmlDocumentBuilder() {
+    try {
+      DocumentBuilder builder = builderTL.get();
+      if (builder == null) {
+        builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+        builderTL.set(builder);
+      }
+      return builder;
+    } catch (Exception e) {
+      throw new RuntimeException(e);
+    }
+  }
+
+  private XPath getXpath() {
+    try {
+      XPath xpath = xpathTL.get();
+      if (xpath == null) {
+        xpath = XPathFactory.newInstance().newXPath();
+        xpathTL.set(xpath);
+      }
+      return xpath;
+    } catch (Exception e) {
+      throw new RuntimeException(e);
+    }
+  }
+
   // Creates a container based on infos needed to create one core
   static class Initializer extends CoreContainer.Initializer {
     String coreName;
@@ -364,7 +389,7 @@ public class TestHarness {
                 
     Document document=null;
     try {
-      document = builder.parse(new ByteArrayInputStream
+      document = getXmlDocumentBuilder().parse(new ByteArrayInputStream
                                (xml.getBytes("UTF-8")));
     } catch (UnsupportedEncodingException e1) {
       throw new RuntimeException("Totally weird UTF-8 exception", e1);
@@ -374,7 +399,7 @@ public class TestHarness {
                 
     for (String xp : tests) {
       xp=xp.trim();
-      Boolean bool = (Boolean) xpath.evaluate(xp, document,
+      Boolean bool = (Boolean) getXpath().evaluate(xp, document,
                                               XPathConstants.BOOLEAN);
 
       if (!bool) {

Modified: lucene/dev/branches/flexscoring/solr/webapp/web/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/webapp/web/WEB-INF/web.xml?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/webapp/web/WEB-INF/web.xml (original)
+++ lucene/dev/branches/flexscoring/solr/webapp/web/WEB-INF/web.xml Tue Aug 23 14:06:58 2011
@@ -99,4 +99,9 @@
     <mime-type>application/xslt+xml</mime-type>
   </mime-mapping>
 
+  <welcome-file-list>
+    <welcome-file>index.jsp</welcome-file>
+    <welcome-file>index.html</welcome-file>
+  </welcome-file-list>
+
 </web-app>

Modified: lucene/dev/branches/flexscoring/solr/webapp/web/css/screen.css
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/webapp/web/css/screen.css?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/webapp/web/css/screen.css (original)
+++ lucene/dev/branches/flexscoring/solr/webapp/web/css/screen.css Tue Aug 23 14:06:58 2011
@@ -39,6 +39,11 @@ pre
     text-align: left;
 }
 
+abbr
+{
+    cursor: help;
+}
+
 ul
 {
     list-style: none;
@@ -110,7 +115,7 @@ ul
 {
     border: 1px solid #c0c0c0;
     min-height: 600px;
-    min-width:750px;
+    min-width: 750px;
     position: relative;
 }
 
@@ -753,10 +758,36 @@ pre.syntax .tex .formula
 
 /* analysis */
 
-#content #analysis .settings
+#content #analysis-holder
+{
+    background-image: url( ../img/div.gif );
+    background-position: 50% 0;
+    background-repeat: repeat-y;
+}
+
+#content #analysis #field-analysis
+{
+    margin-bottom: 0;
+}
+
+#content #analysis #field-analysis .content
+{
+    padding-bottom: 0;
+}
+
+#content #analysis .settings-holder
 {
     clear: both;
+    padding-top: 15px;
+}
+
+#content #analysis .settings
+{
+    background-color: #fff;
+    border-top: 1px solid #fafafa;
+    border-bottom: 1px solid #fafafa;
     padding-top: 10px;
+    padding-bottom: 10px;
 }
 
 #content #analysis .settings select.loader
@@ -779,7 +810,7 @@ pre.syntax .tex .formula
 #content #analysis .settings div
 {
     float: right;
-    width: 49%;
+    width: 47%;
 }
 
 #content #analysis .settings button
@@ -787,6 +818,32 @@ pre.syntax .tex .formula
     float: right;
 }
 
+#content #analysis .settings button.loader
+{
+    background-position: 2px 50%;
+    padding-left: 21px;
+}
+
+#content #analysis .settings .verbose_output
+{
+    float: left;
+    width: auto;
+}
+
+#content #analysis .settings .verbose_output a
+{
+    background-image: url( ../img/ico/ui-check-box-uncheck.png );
+    background-position: 0 50%;
+    color: #999;
+    display: block;
+    padding-left: 21px;
+}
+
+#content #analysis .settings .verbose_output.active a
+{
+    background-image: url( ../img/ico/ui-check-box.png );
+}
+
 #content #analysis .index label,
 #content #analysis .query label
 {
@@ -804,7 +861,7 @@ pre.syntax .tex .formula
 {
     float: left;
     margin-right: 0.5%;
-    min-width: 49%;
+    min-width: 47%;
     max-width: 99%;
 }
 
@@ -812,7 +869,7 @@ pre.syntax .tex .formula
 {
     float: right;
     margin-left: 0.5%;
-    min-width: 49%;
+    min-width: 47%;
     max-width: 99%;
 }
 
@@ -829,117 +886,135 @@ pre.syntax .tex .formula
     padding-left: 35px;
 }
 
-#content #analysis .analysis-result h2
+#content #analysis #analysis-result
 {
-    position: relative;
+    overflow: auto;
 }
 
-#content #analysis .analysis-result h2 .verbose_output
+#content #analysis #analysis-result .index,
+#content #analysis #analysis-result .query
 {
-    position: absolute;
-    right: 5px;
-    top: 5px;
+    background-color: #fff;
+    padding-top: 20px;
 }
 
-#content #analysis .analysis-result h2 .verbose_output a
+#content #analysis #analysis-result table
 {
-    background-image: url( ../img/ico/ui-check-box-uncheck.png );
-    background-position: 0 50%;
-    color: #999;
-    display: block;
-    padding-left: 21px;
+    border-collapse: collapse;
 }
 
-#content #analysis .analysis-result.verbose_output h2 .verbose_output a
+#content #analysis #analysis-result td
 {
-    background-image: url( ../img/ico/ui-check-box.png );
-    color: #080;
+    vertical-align: top;
+    white-space: nowrap;
 }
 
-#content #analysis .analysis-result .index,
-#content #analysis .analysis-result .query
+#content #analysis #analysis-result td.part.analyzer div,
+#content #analysis #analysis-result td.part.spacer .holder,
+#content #analysis #analysis-result td td td
 {
-    margin-bottom: 10px;
+    padding-top: 1px;
+    padding-bottom: 1px;
 }
 
-#content #analysis .analysis-result .row
+#content #analysis #analysis-result td.legend,
+#content #analysis #analysis-result td.data tr.verbose_output
 {
-    border-top: 1px solid #f0f0f0;
-    margin-top: 10px;
-    padding-top: 10px;
+    display: none;
 }
 
-#content #analysis .analysis-result .row:first-child
+#content #analysis #analysis-result.verbose_output td.legend
 {
-    border-top: 0;
-    margin-top: 0;
-    padding-top: 0;
+    display: table-cell;
 }
 
-#content #analysis .analysis-result .row .analyzer
+#content #analysis #analysis-result.verbose_output td.data tr.verbose_output
 {
-    color: #c0c0c0;
+    display: table-row;
 }
 
-#content #analysis .analysis-result .row:hover .analyzer
+#content #analysis #analysis-result .match
 {
-    color: #333;
+    background-color: #e9eff7;
+    background-color: #f2f2ff;
 }
 
-#content #analysis .analysis-result .row table tr.verbose_output
+#content #analysis #analysis-result td.part
 {
-    display: none;
+    padding-bottom: 10px;
 }
 
-#content #analysis .analysis-result.verbose_output .row table tr.verbose_output
+#content #analysis #analysis-result td.part.analyzer div
 {
-    display: table-row;
+    border-right: 1px solid #f0f0f0;
+    padding-right: 10px;
 }
 
-#content #analysis .analysis-result .row table th,
-#content #analysis .analysis-result .row table td
+#content #analysis #analysis-result td.part.analyzer abbr
 {
-    border-top: 1px solid #f0f0f0;
-    vertical-align: top;
+    color: #c0c0c0;
 }
 
-#content #analysis .analysis-result .row table th
+#content #analysis #analysis-result td.part.legend .holder,
+#content #analysis #analysis-result td.part.data .holder
 {
-    background-color: #f8f8f8;
-    color: #999;
-    padding: 2px;
-    padding-bottom: 0;
+    padding-left: 10px;
+    padding-right: 10px;
+    border-right: 1px solid #c0c0c0;
 }
 
-#content #analysis .analysis-result .row table th abbr
+#content #analysis #analysis-result td.part.legend td
 {
-    border: 0;
-    cursor: help;
+    color: #c0c0c0;
 }
 
-#content #analysis .analysis-result .row table td
+#content #analysis #analysis-result td.part.legend .holder
 {
-    border-left: 1px solid #dcdcdc;
+    border-right-color: #f0f0f0;
 }
 
-#content #analysis .analysis-result .row table td div
+#content #analysis #analysis-result td.part.data:last-child .holder
 {
-    border-top: 1px solid #f0f0f0;
-    display: block;
-    padding: 1px 2px;
+    padding-right: 0;
+    border-right: 0;
+}
+
+#content #analysis #analysis-result td.details 
+{
+    padding-left: 10px;
+    padding-right: 10px;
+    border-left: 1px solid #f0f0f0;
+    border-right: 1px solid #f0f0f0;
+}
+
+#content #analysis #analysis-result td.details:first-child
+{
+    padding-left: 0;
+    border-left: 0;
+}
+
+#content #analysis #analysis-result td.details:last-child
+{
+    padding-right: 0;
+    border-right: 0;
 }
 
-#content #analysis .analysis-result .row table td div.empty
+#content #analysis #analysis-result td.details tr.empty td
 {
     color: #f0f0f0;
 }
 
-#content #analysis .analysis-result .row table td div.match
+#content #analysis #analysis-result td.details tr.raw_bytes td
 {
-    background-color: #e9eff7;
+    letter-spacing: -1px;
+}
+
+#content #analysis #analysis-result .part table table td
+{
+    border-top: 1px solid #f0f0f0;
 }
 
-#content #analysis .analysis-result .row table td div:first-child
+#content #analysis #analysis-result .part table table tr:first-child td
 {
     border-top: 0;
 }

Modified: lucene/dev/branches/flexscoring/solr/webapp/web/index.jsp
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/webapp/web/index.jsp?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/webapp/web/index.jsp (original)
+++ lucene/dev/branches/flexscoring/solr/webapp/web/index.jsp Tue Aug 23 14:06:58 2011
@@ -38,7 +38,7 @@
             <div id="wip-notice">
                 <p>This interface is work in progress. It works best in Chrome.</p>
                 <p><a href="admin">Use the <span>old admin interface</span> if there are problems with this one.</a></p>
-                <p><a href="https://issues.apache.org/jira/browse/SOLR-2399">Bugs/Requests/Suggestions: <span>SOLR-2399</span></a></p>
+                <p><a href="https://issues.apache.org/jira/browse/SOLR-2667">Bugs/Requests/Suggestions: <span>SOLR-2667</span></a></p>
             </div>
 
             <p id="environment">&nbsp;</p>

Modified: lucene/dev/branches/flexscoring/solr/webapp/web/js/script.js
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/webapp/web/js/script.js?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/webapp/web/js/script.js (original)
+++ lucene/dev/branches/flexscoring/solr/webapp/web/js/script.js Tue Aug 23 14:06:58 2011
@@ -14,6 +14,16 @@ var loader = {
     
 };
 
+Number.prototype.esc = function()
+{
+    return new String( this ).esc();
+}
+
+String.prototype.esc = function()
+{
+    return this.replace( /</g, '&lt;' ).replace( />/g, '&gt;' );
+}
+
 var sammy = $.sammy
 (
     function()
@@ -712,7 +722,7 @@ var sammy = $.sammy
 
                             for( var key in response.levels )
                             {
-                                var level = response.levels[key];
+                                var level = response.levels[key].esc();
                                 loglevel += '<li class="' + level + '"><a>' + level + '</a></li>' + "\n";
                             }
 
@@ -754,8 +764,8 @@ var sammy = $.sammy
                                     logger_content += '<li class="jstree-leaf">';
                                     logger_content += '<ins class="jstree-icon">&nbsp;</ins>';
                                     logger_content += '<a class="trigger ' + classes.join( ' ' ) + '" ' + "\n" +
-                                                         'title="' + logger_name + '"><span>' + "\n" +
-                                                        logger_name.split( '.' ).pop() + "\n" +
+                                                         'title="' + logger_name.esc() + '"><span>' + "\n" +
+                                                        logger_name.split( '.' ).pop().esc() + "\n" +
                                                       '</span></a>';
 
                                     logger_content += loglevel
@@ -800,7 +810,7 @@ var sammy = $.sammy
                                     function( index, element )
                                     {
                                         var element = $( element );
-                                        var effective_level = $( '.effective_level span', element ).html();
+                                        var effective_level = $( '.effective_level span', element ).text();
 
                                         element
                                             .css( 'z-index', 800 - index );
@@ -891,11 +901,11 @@ var sammy = $.sammy
                                 }
 
                                 var item_content = '<li><dl class="' + item_class + '">' + "\n" +
-                                                   '<dt>' + displayed_key + '</dt>' + "\n";
+                                                   '<dt>' + displayed_key.esc() + '</dt>' + "\n";
 
                                 for( var i in displayed_value )
                                 {
-                                    item_content += '<dd>' + displayed_value[i] + '</dd>' + "\n";
+                                    item_content += '<dd>' + displayed_value[i].esc() + '</dd>' + "\n";
                                 }
 
                                 item_content += '</dl></li>';
@@ -965,8 +975,8 @@ var sammy = $.sammy
                                     var c = 0;
                                     for( var i = 1; i < threadDumpData.length; i += 2 )
                                     {
-                                        var state = threadDumpData[i].state;
-                                        var name = '<a><span>' + threadDumpData[i].name + '</span></a>';
+                                        var state = threadDumpData[i].state.esc();
+                                        var name = '<a><span>' + threadDumpData[i].name.esc() + '</span></a>';
 
                                         var classes = [state];
                                         var details = '';
@@ -979,7 +989,7 @@ var sammy = $.sammy
                                         if( threadDumpData[i].lock )
                                         {
                                             classes.push( 'lock' );
-                                            name += "\n" + '<p title="Waiting on">' + threadDumpData[i].lock + '</p>';
+                                            name += "\n" + '<p title="Waiting on">' + threadDumpData[i].lock.esc() + '</p>';
                                         }
 
                                         if( threadDumpData[i].stackTrace && 0 !== threadDumpData[i].stackTrace.length )
@@ -987,8 +997,10 @@ var sammy = $.sammy
                                             classes.push( 'stacktrace' );
 
                                             var stack_trace = threadDumpData[i].stackTrace
-                                                                .join( '</li><li>' )
-                                                                .replace( /\(/g, '&#8203;(' );
+                                                                .join( '###' )
+                                                                .esc()
+                                                                .replace( /\(/g, '&#8203;(' )
+                                                                .replace( /###/g, '</li><li>' );
 
                                             name += '<div>' + "\n"
                                                     + '<ul>' + "\n"
@@ -1000,10 +1012,10 @@ var sammy = $.sammy
                                         var item = '<tr class="' + classes.join( ' ' ) +'">' + "\n"
 
                                                  + '<td class="ico" title="' + state +'"><span>' + state +'</span></td>' + "\n"
-                                                 + '<td class="id">' + threadDumpData[i].id + '</td>' + "\n"
+                                                 + '<td class="id">' + threadDumpData[i].id.esc() + '</td>' + "\n"
                                                  + '<td class="name">' + name + '</td>' + "\n"
-                                                 + '<td class="time">' + threadDumpData[i].cpuTime + '</td>' + "\n"
-                                                 + '<td class="time">' + threadDumpData[i].userTime + '</td>' + "\n"
+                                                 + '<td class="time">' + threadDumpData[i].cpuTime.esc() + '</td>' + "\n"
+                                                 + '<td class="time">' + threadDumpData[i].userTime.esc() + '</td>' + "\n"
 
                                                  + '</tr>';
                                         
@@ -3402,6 +3414,8 @@ var sammy = $.sammy
                         
                         var analysis_element = $( '#analysis', content_element );
                         var analysis_form = $( 'form', analysis_element );
+                        var analysis_result = $( '#analysis-result', analysis_element );
+                        analysis_result.hide();
                         
                         $.ajax
                         (
@@ -3465,10 +3479,56 @@ var sammy = $.sammy
                                 }
                             }
                         );
+                                
+                        $( '.verbose_output a', analysis_element )
+                            .die( 'click' )
+                            .live
+                            (
+                                'click',
+                                function( event )
+                                {
+                                    $( this ).parent()
+                                        .toggleClass( 'active' );
+                                    
+                                    analysis_result
+                                        .toggleClass( 'verbose_output' );
+                                    
+                                    check_empty_spacer();
+                                }
+                            );
                         
-                        var analysis_result = $( '.analysis-result', analysis_element );
-                        analysis_result_tpl = analysis_result.clone();
-                        analysis_result.remove();
+                        var check_empty_spacer = function()
+                        {
+                            var spacer_holder = $( 'td.part.data.spacer .holder', analysis_result );
+
+                            if( 0 === spacer_holder.size() )
+                            {
+                                return false;
+                            }
+
+                            var verbose_output = analysis_result.hasClass( 'verbose_output' );
+
+                            spacer_holder
+                                .each
+                                (
+                                    function( index, element )
+                                    {
+                                        element = $( element );
+
+                                        if( verbose_output )
+                                        {
+                                            var cell = element.parent();
+                                            element.height( cell.height() );
+                                        }
+                                        else
+                                        {
+                                            element.removeAttr( 'style' );
+                                        }
+                                    }
+                                );
+                        }
+
+                        var button = $( 'button', analysis_form )
                         
                         analysis_form
                             .ajaxForm
@@ -3478,10 +3538,8 @@ var sammy = $.sammy
                                     dataType : 'json',
                                     beforeSubmit : function( array, form, options )
                                     {
-                                        //loader
-                                        
-                                        $( '.analysis-result', analysis_element )
-                                            .remove();
+                                        loader.show( button );
+                                        button.attr( 'disabled', true );
                                         
                                         array.push( { name: 'analysis.showmatch', value: 'true' } );
                                         
@@ -3491,6 +3549,10 @@ var sammy = $.sammy
                                     },
                                     success : function( response, status_text, xhr, form )
                                     {
+                                        analysis_result
+                                            .empty()
+                                            .show();
+                                        
                                         for( var name in response.analysis.field_names )
                                         {
                                             build_analysis_table( 'name', name, response.analysis.field_names[name] );
@@ -3500,6 +3562,8 @@ var sammy = $.sammy
                                         {
                                             build_analysis_table( 'type', name, response.analysis.field_types[name] );
                                         }
+
+                                        check_empty_spacer();
                                     },
                                     error : function( xhr, text_status, error_thrown )
                                     {
@@ -3508,136 +3572,208 @@ var sammy = $.sammy
                                     },
                                     complete : function()
                                     {
-                                        //loader
+                                        loader.hide( $( 'button', analysis_form ) );
+                                        button.removeAttr( 'disabled' );
                                     }
                                 }
                             );
+
+                            var generate_class_name = function( type )
+                            {
+                                var classes = [type];
+                                if( 'text' !== type )
+                                {
+                                    classes.push( 'verbose_output' );
+                                }
+                                return classes.join( ' ' );
+                            }
                             
                             var build_analysis_table = function( field_or_name, name, analysis_data )
-                            {                                
-                                var analysis_result_data = analysis_result_tpl.clone();
-                                var content = [];
-                                
+                            {        
                                 for( var type in analysis_data )
                                 {
                                     var type_length = analysis_data[type].length;
                                     if( 0 !== type_length )
                                     {
-                                        var type_content = '<div class="' + type + '">' + "\n";
-                                        for( var i = 0; i < type_length; i += 2 )
+                                        var global_elements_count = 0;
+                                        for( var i = 0; i < analysis_data[type].length; i += 2 )
                                         {
-                                            type_content += '<div class="row">' + "\n";
+                                            if( 'string' === typeof analysis_data[type][i+1] )
+                                            {
+                                                analysis_data[type][i+1] = [{ 'text': analysis_data[type][i+1] }]
+                                            }
+                                            global_elements_count = Math.max( global_elements_count,
+                                                                              analysis_data[type][i+1].length );
+                                        }
+
+                                        var content = '<div class="' + type + '">' + "\n";
+                                        content += '<table border="0" cellspacing="0" cellpadding="0">' + "\n";
                                         
-                                            var analyzer_parts = analysis_data[type][i].split( '.' );
-                                            var analyzer_parts_name = analyzer_parts.pop();
-                                            var analyzer_parts_namespace = analyzer_parts.join( '.' ) + '.';
-                                                                                        
-                                            type_content += '<div class="analyzer" title="' + analysis_data[type][i] +'">' + 
-                                                            analyzer_parts_name + '</div>' + "\n";
-
-                                            var raw_parts = {
-                                                'position' : [],
-                                                'text' : [],
-                                                'type' : [],
-                                                'start-end' : []
-                                            };
+                                        for( var i = 0; i < analysis_data[type].length; i += 2 )
+                                        {
+                                            var colspan = 1;
+                                            var elements = analysis_data[type][i+1];
+                                            var elements_count = global_elements_count;
                                             
-                                            for( var k in analysis_data[type][i+1] )
+                                            if( !elements[0].positionHistory )
                                             {
-                                                var pos = analysis_data[type][i+1][k]['position'] - 1;
-                                                var is_match = !!analysis_data[type][i+1][k]['match'];
-                                            
-                                                if( 'undefined' === typeof raw_parts['text'][pos] )
+                                                colspan = elements_count;
+                                                elements_count = 1;
+                                            }
+
+                                            var legend = [];
+                                            for( var key in elements[0] )
+                                            {
+                                                var key_parts = key.split( '#' );
+                                                var used_key = key_parts.pop();
+                                                var short_key = used_key;
+
+                                                if( 1 === key_parts.length )
                                                 {
-                                                    raw_parts['position'][pos] = [];
-                                                    raw_parts['text'][pos] = [];
-                                                    raw_parts['type'][pos] = [];
-                                                    raw_parts['start-end'][pos] = [];
+                                                    used_key = '<abbr title="' + key + '">' + used_key + '</abbr>';
+                                                }
 
-                                                    raw_parts['position'][pos].push( '<div>' + analysis_data[type][i+1][k]['position'] + '</div>' );
+                                                if( 'positionHistory' === short_key || 'match' === short_key )
+                                                {
+                                                    continue;
                                                 }
 
-                                                raw_parts['text'][pos].push( '<div class="' + ( is_match ? 'match' : '' ) + '">' + analysis_data[type][i+1][k]['text'] + '</div>' );
-                                                raw_parts['type'][pos].push( '<div>' + analysis_data[type][i+1][k]['type'] + '</div>' );
-                                                raw_parts['start-end'][pos].push( '<div>' + analysis_data[type][i+1][k]['start'] + '–' + analysis_data[type][i+1][k]['end'] + '</div>' );
+                                                legend.push
+                                                (
+                                                    '<tr class="' + generate_class_name( short_key ) + '">' +
+                                                    '<td>' + used_key + '</td>' +
+                                                    '</tr>'
+                                                );
                                             }
 
-                                            var parts = {
-                                                'position' : [],
-                                                'text' : [],
-                                                'type' : [],
-                                                'start-end' : []
-                                            };
+                                            content += '<tbody>' + "\n";
+                                            content += '<tr class="step">' + "\n";
+
+                                                // analyzer
+                                                var analyzer_name = analysis_data[type][i]
+                                                                        .replace( /(\$1)+$/g, '' );
+
+                                                var analyzer_short = -1 !== analyzer_name.indexOf( '$' )
+                                                                   ? analyzer_name.split( '$' )[1]
+                                                                   : analyzer_name.split( '.' ).pop();
+                                                analyzer_short = analyzer_short.match( /[A-Z]/g ).join( '' );
+
+                                                content += '<td class="part analyzer"><div>' + "\n";
+                                                content += '<abbr title="' + analysis_data[type][i] + '">' + "\n";
+                                                content += analyzer_short + '</abbr></div></td>' + "\n";
+
+                                                // legend
+                                                content += '<td class="part legend"><div class="holder">' + "\n";
+                                                content += '<table border="0" cellspacing="0" cellpadding="0">' + "\n";
+                                                content += '<tr><td>' + "\n";
+                                                content += '<table border="0" cellspacing="0" cellpadding="0">' + "\n";
+                                                content += legend.join( "\n" ) + "\n";
+                                                content += '</table></td></tr></table></td>' + "\n";
+
+                                                // data
+                                                var cell_content = '<td class="part data spacer" '
+                                                                 + '    colspan="' + colspan + '">'
+                                                                 + '<div class="holder">&nbsp;</div>'
+                                                                 + '</td>';
+                                                var cells = new Array( elements_count + 1 ).join( cell_content );
+                                                content += cells + "\n";
+
+                                            content += '</tr>' + "\n";
+                                            content += '</tbody>' + "\n";
+                                        }
+                                        content += '</table>' + "\n";
+                                        content += '</div>' + "\n";
+
+                                        $( '.' + type, analysis_result )
+                                            .remove();
 
-                                            for( var key in raw_parts )
+                                        analysis_result
+                                            .append( content );
+                                        
+                                        var analysis_result_type = $( '.' + type, analysis_result );
+
+                                        for( var i = 0; i < analysis_data[type].length; i += 2 )
+                                        {
+                                            for( var j = 0; j < analysis_data[type][i+1].length; j += 1 )
                                             {
-                                                var length = raw_parts[key].length;
-                                                for( var j = 0; j < length; j++ )
+                                                var pos = analysis_data[type][i+1][j].positionHistory
+                                                        ? analysis_data[type][i+1][j].positionHistory[0]
+                                                        : 1;
+                                                var selector = 'tr.step:eq(' + ( i / 2 ) +') '
+                                                             + 'td.data:eq(' + ( pos - 1 ) + ') '
+                                                             + '.holder';
+                                                var cell = $( selector, analysis_result_type );
+
+                                                cell.parent()
+                                                    .removeClass( 'spacer' );
+
+                                                var table = $( 'table tr.details', cell );
+                                                if( 0 === table.size() )
                                                 {
-                                                    if( raw_parts[key][j] )
+                                                    cell
+                                                        .html
+                                                        (
+                                                            '<table border="0" cellspacing="0" cellpadding="0">' + 
+                                                            '<tr class="details"></tr></table>'
+                                                        );
+                                                    var table = $( 'table tr.details', cell );
+                                                }
+
+                                                var tokens = [];
+                                                for( var key in analysis_data[type][i+1][j] )
+                                                {
+                                                    var short_key = key.split( '#' ).pop();
+                                                    
+                                                    if( 'positionHistory' === short_key || 'match' === short_key )
+                                                    {
+                                                        continue;
+                                                    }
+
+                                                    var classes = [];
+                                                    classes.push( generate_class_name( short_key ) );
+
+                                                    var data = analysis_data[type][i+1][j][key];
+                                                    if( 'object' === typeof data && data instanceof Array )
+                                                    {
+                                                        data = data.join( ' ' );
+                                                    }
+                                                    if( 'string' === typeof data )
+                                                    {
+                                                        data = data.esc();
+                                                    }
+
+                                                    if( null === data || 0 === data.length )
                                                     {
-                                                        parts[key].push( '<td>' + raw_parts[key][j].join( "\n" ) + '</td>' );
+                                                        classes.push( 'empty' );
+                                                        data = '&empty;';
                                                     }
-                                                    else
+
+                                                    if( analysis_data[type][i+1][j].match && 
+                                                        ( 'text' === short_key || 'raw_bytes' === short_key ) )
                                                     {
-                                                        parts[key].push( '<td><div class="empty">&empty;</div></td>' );
+                                                        classes.push( 'match' );
                                                     }
+
+                                                    tokens.push
+                                                    (
+                                                        '<tr class="' + classes.join( ' ' ) + '">' +
+                                                        '<td>' + data + '</td>' +
+                                                        '</tr>'
+                                                    );
                                                 }
+                                                table
+                                                    .append
+                                                    (
+                                                        '<td class="details">' +
+                                                        '<table border="0" cellspacing="0" cellpadding="0">' +
+                                                        tokens.join( "\n" ) +
+                                                        '</table></td>'
+                                                    );
                                             }
-
-                                            type_content += '<div class="result">' + "\n";
-                                            type_content += '<table border="0" cellspacing="0" cellpadding="0">' + "\n";
-                                            
-                                            type_content += '<tr class="verbose_output">' + "\n";
-                                            type_content += '<th><abbr title="Position">P</abbr></th>' + "\n";
-                                            type_content += parts['position'].join( "\n" ) + "\n";
-                                            type_content += '</tr>' + "\n";
-                                                                                        
-                                            type_content += '<tr>' + "\n";
-                                            type_content += '<th><abbr title="Text">T</abbr></th>' + "\n";
-                                            type_content += parts['text'].join( "\n" ) + "\n";
-                                            type_content += '</tr>' + "\n";
-
-                                            type_content += '<tr class="verbose_output">' + "\n";
-                                            type_content += '<th><abbr title="Type">T</abbr></th>' + "\n";
-                                            type_content += parts['type'].join( "\n" ) + "\n";
-                                            type_content += '</tr>' + "\n";
-
-                                            type_content += '<tr class="verbose_output">' + "\n";
-                                            type_content += '<th><abbr title="Range (Start, End)">R</abbr></th>' + "\n";
-                                            type_content += parts['start-end'].join( "\n" ) + "\n";
-                                            type_content += '</tr>' + "\n";
-                                            
-                                            type_content += '</table>' + "\n";
-                                            type_content += '</div>' + "\n";
-                                            
-                                            type_content += '</div>' + "\n";
                                         }
-                                        type_content += '</div>';
-                                        content.push( $.trim( type_content ) );
+                        
                                     }
                                 }
-                                
-                                $( 'h2 span', analysis_result_data )
-                                    .html( field_or_name + ': ' + name );
-                                
-                                $( 'h2 .verbose_output a', analysis_result_data )
-                                    .die( 'click' )
-                                    .live
-                                    (
-                                        'click',
-                                        function( event )
-                                        {
-                                            $( this ).parents( '.block' )
-                                                .toggleClass( 'verbose_output' );
-                                        }
-                                    );
-                                
-                                $( '.analysis-result-content', analysis_result_data )
-                                    .html( content.join( "\n" ) );
-                                
-                                analysis_element.append( analysis_result_data );
-                                
                             }
                             
                     }
@@ -4161,7 +4297,7 @@ var sammy = $.sammy
                             for( var key in memory_data )
                             {                                                        
                                 $( '.value.' + key, this )
-                                    .html( memory_data[key] );
+                                    .text( memory_data[key] );
                             }
             
                             var data = {
@@ -4184,7 +4320,7 @@ var sammy = $.sammy
                                 var value_element = $( '.' + key + ' dd', this );
 
                                 value_element
-                                    .html( data[key] );
+                                    .text( data[key] );
                                 
                                 value_element.closest( 'li' )
                                     .show();
@@ -4200,7 +4336,7 @@ var sammy = $.sammy
                                 for( var key in commandLineArgs )
                                 {
                                     cmd_arg_element = cmd_arg_element.clone();
-                                    cmd_arg_element.html( commandLineArgs[key] );
+                                    cmd_arg_element.text( commandLineArgs[key] );
 
                                     cmd_arg_key_element
                                         .after( cmd_arg_element );
@@ -4247,7 +4383,7 @@ var sammy = $.sammy
                             var headline = $( '#memory h2 span', this );
                                 
                             headline
-                                .html( headline.html() + ' (' + memory_percentage + '%)' );
+                                .text( headline.html() + ' (' + memory_percentage + '%)' );
 
                             $( '#memory-bar .value', this )
                                 .each
@@ -4266,7 +4402,7 @@ var sammy = $.sammy
                                         byte_value = byte_value.toFixed( 2 ) + ' MB';
 
                                         self
-                                            .html( byte_value );
+                                            .text( byte_value );
                                     }
                                 );
                         },

Modified: lucene/dev/branches/flexscoring/solr/webapp/web/tpl/analysis.html
URL: http://svn.apache.org/viewvc/lucene/dev/branches/flexscoring/solr/webapp/web/tpl/analysis.html?rev=1160700&r1=1160699&r2=1160700&view=diff
==============================================================================
--- lucene/dev/branches/flexscoring/solr/webapp/web/tpl/analysis.html (original)
+++ lucene/dev/branches/flexscoring/solr/webapp/web/tpl/analysis.html Tue Aug 23 14:06:58 2011
@@ -6,70 +6,55 @@
 
     </div>
 
-    <div class="block" id="field-analysis">
-    
-        <h2><span>Field Analysis</span></h2>
-        <div class="content">
-    
-        <div class="message-container">
-            <div class="message"></div>
-        </div>
-        
-        <form method="get">
-            
-            <ul class="clearfix">
-                
-                <li class="index">
-                    
-                    <label for="analysis_fieldvalue_index">Field Value (Index)</label>
-                    <textarea name="analysis.fieldvalue" id="analysis_fieldvalue_index"></textarea>
-                    
-                </li>
+    <div id="analysis-holder">
+
+        <div id="field-analysis">
+              
+            <form method="get">
                 
-                <li class="query">
+                <ul class="clearfix">
                     
-                    <label for="analysis_fieldvalue_query">Field Value (Query)</label>
-                    <textarea name="analysis.query" id="analysis_fieldvalue_query"></textarea>
+                    <li class="index">
+                        
+                        <label for="analysis_fieldvalue_index">Field Value (Index)</label>
+                        <textarea name="analysis.fieldvalue" id="analysis_fieldvalue_index"></textarea>
+                        
+                    </li>
                     
-                </li>
+                    <li class="query">
+                        
+                        <label for="analysis_fieldvalue_query">Field Value (Query)</label>
+                        <textarea name="analysis.query" id="analysis_fieldvalue_query"></textarea>
+                        
+                    </li>
 
-                <li class="settings clearfix">
+                    <li class="settings-holder clearfix">
+                        <div class="settings">
 
-                    <label for="type_or_name">Analyse Fieldname / FieldType:</label>
-                    <select id="type_or_name"></select>
+                            <label for="type_or_name">Analyse Fieldname / FieldType:</label>
+                            <select id="type_or_name"></select>
 
-                    <div>
+                            <div>
 
-                        <button type="submit">Analyse Values</button>
+                                <button type="submit">Analyse Values</button>
 
-                    </div>
+                                <div class="verbose_output active">
+                                    <a>Verbose Output</a>
+                                </div>
 
-                </li>
+                            </div>
+
+                        </div>
+                    </li>
+                    
+                </ul>
                 
-            </ul>
+            </form>
             
-        </form>
-        
-        </div>
-    </div>
-    
-    <div class="block analysis-result">
-        
-        <h2>
-            <span>{headline}</span>
-            <div class="verbose_output">
-                <a>Verbose Output</a>
-            </div>
-        </h2>
-        <div class="content">
-        
-        <div class="message-container">
-            <div class="message"></div>
         </div>
         
-        <div class="analysis-result-content clearfix">{content}</div>
-        
-        </div>
+        <div id="analysis-result" class="clearfix verbose_output"></div>
+
     </div>
 
 </div>
\ No newline at end of file