You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mi...@apache.org on 2015/12/21 12:40:14 UTC

svn commit: r1721134 [47/48] - in /lucene/dev/branches/lucene6835: ./ dev-tools/ dev-tools/eclipse/dot.settings/ dev-tools/idea/.idea/libraries/ dev-tools/maven/ dev-tools/maven/lucene/analysis/morfologik/ dev-tools/scripts/ lucene/ lucene/analysis/ lu...

Modified: lucene/dev/branches/lucene6835/solr/solrj/src/test/org/apache/solr/client/solrj/response/NoOpResponseParserTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/solrj/src/test/org/apache/solr/client/solrj/response/NoOpResponseParserTest.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/solrj/src/test/org/apache/solr/client/solrj/response/NoOpResponseParserTest.java (original)
+++ lucene/dev/branches/lucene6835/solr/solrj/src/test/org/apache/solr/client/solrj/response/NoOpResponseParserTest.java Mon Dec 21 11:39:57 2015
@@ -17,11 +17,18 @@ package org.apache.solr.client.solrj.res
  * limitations under the License.
  */
 
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+
 import org.apache.commons.io.IOUtils;
 import org.apache.solr.SolrJettyTestBase;
 import org.apache.solr.client.solrj.ResponseParser;
-import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrClient;
+import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.impl.HttpSolrClient;
 import org.apache.solr.client.solrj.impl.NoOpResponseParser;
@@ -35,13 +42,6 @@ import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.nio.charset.StandardCharsets;
-import java.util.List;
-
 /**
  * A test for parsing Solr response from query by NoOpResponseParser.
  * @see org.apache.solr.client.solrj.impl.NoOpResponseParser
@@ -50,7 +50,7 @@ import java.util.List;
 public class NoOpResponseParserTest extends SolrJettyTestBase {
 
   private static InputStream getResponse() throws IOException {
-    return new SolrResourceLoader(null, null).openResource("solrj/sampleDateFacetResponse.xml");
+    return new SolrResourceLoader().openResource("solrj/sampleDateFacetResponse.xml");
   }
 
   @BeforeClass

Modified: lucene/dev/branches/lucene6835/solr/solrj/src/test/org/apache/solr/client/solrj/response/QueryResponseTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/solrj/src/test/org/apache/solr/client/solrj/response/QueryResponseTest.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/solrj/src/test/org/apache/solr/client/solrj/response/QueryResponseTest.java (original)
+++ lucene/dev/branches/lucene6835/solr/solrj/src/test/org/apache/solr/client/solrj/response/QueryResponseTest.java Mon Dec 21 11:39:57 2015
@@ -17,8 +17,13 @@
 
 package org.apache.solr.client.solrj.response;
 
-import junit.framework.Assert;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
 
+import junit.framework.Assert;
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.lucene.util.TestRuleLimitSysouts.Limit;
 import org.apache.solr.client.solrj.impl.XMLResponseParser;
@@ -28,12 +33,6 @@ import org.apache.solr.common.util.Named
 import org.apache.solr.core.SolrResourceLoader;
 import org.junit.Test;
 
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.nio.charset.StandardCharsets;
-import java.util.List;
-
 /**
  * A few tests for parsing Solr response in QueryResponse
  * 
@@ -44,7 +43,7 @@ public class QueryResponseTest extends L
   @Test
   public void testDateFacets() throws Exception   {
     XMLResponseParser parser = new XMLResponseParser();
-    InputStream is = new SolrResourceLoader(null, null).openResource("solrj/sampleDateFacetResponse.xml");
+    InputStream is = new SolrResourceLoader().openResource("solrj/sampleDateFacetResponse.xml");
     assertNotNull(is);
     Reader in = new InputStreamReader(is, StandardCharsets.UTF_8);
     NamedList<Object> response = parser.processResponse(in);
@@ -68,7 +67,7 @@ public class QueryResponseTest extends L
   @Test
   public void testRangeFacets() throws Exception {
     XMLResponseParser parser = new XMLResponseParser();
-    InputStream is = new SolrResourceLoader(null, null).openResource("solrj/sampleDateFacetResponse.xml");
+    InputStream is = new SolrResourceLoader().openResource("solrj/sampleDateFacetResponse.xml");
     assertNotNull(is);
     Reader in = new InputStreamReader(is, StandardCharsets.UTF_8);
     NamedList<Object> response = parser.processResponse(in);
@@ -125,7 +124,7 @@ public class QueryResponseTest extends L
   @Test
   public void testGroupResponse() throws Exception {
     XMLResponseParser parser = new XMLResponseParser();
-    InputStream is = new SolrResourceLoader(null, null).openResource("solrj/sampleGroupResponse.xml");
+    InputStream is = new SolrResourceLoader().openResource("solrj/sampleGroupResponse.xml");
     assertNotNull(is);
     Reader in = new InputStreamReader(is, StandardCharsets.UTF_8);
     NamedList<Object> response = parser.processResponse(in);
@@ -227,7 +226,7 @@ public class QueryResponseTest extends L
   @Test
   public void testSimpleGroupResponse() throws Exception {
     XMLResponseParser parser = new XMLResponseParser();
-    InputStream is = new SolrResourceLoader(null, null).openResource("solrj/sampleSimpleGroupResponse.xml");
+    InputStream is = new SolrResourceLoader().openResource("solrj/sampleSimpleGroupResponse.xml");
     assertNotNull(is);
     Reader in = new InputStreamReader(is, StandardCharsets.UTF_8);
     NamedList<Object> response = parser.processResponse(in);
@@ -268,7 +267,7 @@ public class QueryResponseTest extends L
   
   public void testIntervalFacetsResponse() throws Exception {
     XMLResponseParser parser = new XMLResponseParser();
-    try(SolrResourceLoader loader = new SolrResourceLoader(null, null)) {
+    try(SolrResourceLoader loader = new SolrResourceLoader()) {
       InputStream is = loader.openResource("solrj/sampleIntervalFacetsResponse.xml");
       assertNotNull(is);
       Reader in = new InputStreamReader(is, StandardCharsets.UTF_8);

Modified: lucene/dev/branches/lucene6835/solr/solrj/src/test/org/apache/solr/client/solrj/response/TestClusteringResponse.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/solrj/src/test/org/apache/solr/client/solrj/response/TestClusteringResponse.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/solrj/src/test/org/apache/solr/client/solrj/response/TestClusteringResponse.java (original)
+++ lucene/dev/branches/lucene6835/solr/solrj/src/test/org/apache/solr/client/solrj/response/TestClusteringResponse.java Mon Dec 21 11:39:57 2015
@@ -39,7 +39,7 @@ public class TestClusteringResponse exte
   public void testClusteringResponse() throws Exception {
     XMLResponseParser parser = new XMLResponseParser();
     /*Load a simple XML with the clustering response encoded in an XML format*/
-    InputStream is = new SolrResourceLoader(null, null).openResource("solrj/sampleClusteringResponse.xml");
+    InputStream is = new SolrResourceLoader().openResource("solrj/sampleClusteringResponse.xml");
     assertNotNull(is);
     Reader in = new InputStreamReader(is, StandardCharsets.UTF_8);
     NamedList<Object> response = parser.processResponse(in);

Modified: lucene/dev/branches/lucene6835/solr/solrj/src/test/org/apache/solr/common/util/ContentStreamTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/solrj/src/test/org/apache/solr/common/util/ContentStreamTest.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/solrj/src/test/org/apache/solr/common/util/ContentStreamTest.java (original)
+++ lucene/dev/branches/lucene6835/solr/solrj/src/test/org/apache/solr/common/util/ContentStreamTest.java Mon Dec 21 11:39:57 2015
@@ -29,7 +29,6 @@ import java.nio.charset.StandardCharsets
 
 import org.apache.commons.io.IOUtils;
 import org.apache.solr.SolrTestCaseJ4;
-import org.apache.lucene.util.TestUtil;
 import org.apache.solr.core.SolrResourceLoader;
 
 /**
@@ -47,7 +46,7 @@ public class ContentStreamTest extends S
 
   public void testFileStream() throws IOException 
   {
-    InputStream is = new SolrResourceLoader(null, null).openResource( "solrj/README" );
+    InputStream is = new SolrResourceLoader().openResource( "solrj/README" );
     assertNotNull( is );
     File file = new File(createTempDir().toFile(), "README");
     FileOutputStream os = new FileOutputStream(file);
@@ -76,7 +75,7 @@ public class ContentStreamTest extends S
 
   public void testURLStream() throws IOException 
   {
-    InputStream is = new SolrResourceLoader(null, null).openResource( "solrj/README" );
+    InputStream is = new SolrResourceLoader().openResource( "solrj/README" );
     assertNotNull( is );
     File file = new File(createTempDir().toFile(), "README");
     FileOutputStream os = new FileOutputStream(file);

Modified: lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/BaseDistributedSearchTestCase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/BaseDistributedSearchTestCase.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/BaseDistributedSearchTestCase.java (original)
+++ lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/BaseDistributedSearchTestCase.java Mon Dec 21 11:39:57 2015
@@ -57,6 +57,7 @@ import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
+import java.lang.invoke.MethodHandles;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.ArrayList;
@@ -245,7 +246,7 @@ public abstract class BaseDistributedSea
   protected Map<String, Integer> handle = new HashMap<>();
 
   protected String id = "id";
-  public static Logger log = LoggerFactory.getLogger(BaseDistributedSearchTestCase.class);
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
   
   public static RandVal rint = new RandVal() {
     @Override
@@ -778,10 +779,11 @@ public abstract class BaseDistributedSea
 
     String cmp;
     int f = flags(handle, "maxScore");
-    if ((f & SKIPVAL) == 0) {
+    if (f == 0) {
       cmp = compare(a.getMaxScore(), b.getMaxScore(), 0, handle);
       if (cmp != null) return ".maxScore" + cmp;
-    } else {
+    } else if ((f & SKIP) == 0) { // so we skip val but otherwise both should be present
+      assert (f & SKIPVAL) != 0;
       if (b.getMaxScore() != null) {
         if (a.getMaxScore() == null) {
           return ".maxScore missing";
@@ -961,7 +963,11 @@ public abstract class BaseDistributedSea
         createServers(numShards);
         RandVal.uniqueValues = new HashSet(); //reset random values
         statement.evaluate();
-        destroyServers();
+        try {
+          destroyServers();
+        } catch (Throwable t) {
+          log.error("Error while shutting down servers", t);
+        }
       }
     }
 

Modified: lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/SolrJettyTestBase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/SolrJettyTestBase.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/SolrJettyTestBase.java (original)
+++ lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/SolrJettyTestBase.java Mon Dec 21 11:39:57 2015
@@ -34,6 +34,7 @@ import org.slf4j.LoggerFactory;
 
 import java.io.File;
 import java.io.OutputStreamWriter;
+import java.lang.invoke.MethodHandles;
 import java.nio.file.Path;
 import java.util.Properties;
 import java.util.SortedMap;
@@ -41,7 +42,7 @@ import java.util.SortedMap;
 
 abstract public class SolrJettyTestBase extends SolrTestCaseJ4 
 {
-  private static Logger log = LoggerFactory.getLogger(SolrJettyTestBase.class);
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   @BeforeClass
   public static void beforeSolrJettyTestBase() throws Exception {

Modified: lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/SolrTestCaseHS.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/SolrTestCaseHS.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/SolrTestCaseHS.java (original)
+++ lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/SolrTestCaseHS.java Mon Dec 21 11:39:57 2015
@@ -41,11 +41,13 @@ import org.apache.solr.servlet.DirectSol
 import org.noggit.JSONUtil;
 import org.noggit.ObjectBuilder;
 import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.io.File;
 import java.io.IOException;
 import java.io.OutputStreamWriter;
 import java.io.Writer;
+import java.lang.invoke.MethodHandles;
 import java.nio.file.Files;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -63,7 +65,8 @@ import java.util.Set;
 @SolrTestCaseJ4.SuppressSSL
 //@LuceneTestCase.SuppressCodecs({"Lucene3x","Lucene40","Lucene41","Lucene42","Lucene45","Appending","Asserting"})
 public class SolrTestCaseHS extends SolrTestCaseJ4 {
-
+  
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
   @SafeVarargs
   public static <T> Set<T> set(T... a) {
     LinkedHashSet<T> s = new LinkedHashSet<>();
@@ -378,7 +381,7 @@ public class SolrTestCaseHS extends Solr
   // To manage multiple servers, see SolrInstances
   //
   public static class SolrInstance {
-    private static Logger log = SolrTestCaseJ4.log;
+    private static Logger log = SolrTestCaseHS.log;
     private String collection = "collection1";
     private int port = 0;
     private String solrconfigFile;

Modified: lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java (original)
+++ lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java Mon Dec 21 11:39:57 2015
@@ -17,8 +17,7 @@
 
 package org.apache.solr;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-
+import javax.xml.xpath.XPathExpressionException;
 import java.io.File;
 import java.io.IOException;
 import java.io.OutputStreamWriter;
@@ -32,33 +31,25 @@ import java.lang.annotation.Inherited;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
+import java.lang.invoke.MethodHandles;
 import java.net.URL;
 import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Properties;
+import java.nio.file.Paths;
+import java.util.*;
 import java.util.logging.Level;
 
-import javax.xml.xpath.XPathExpressionException;
-
+import com.carrotsearch.randomizedtesting.RandomizedContext;
+import com.carrotsearch.randomizedtesting.annotations.ThreadLeakFilters;
+import com.carrotsearch.randomizedtesting.rules.SystemPropertiesRestoreRule;
 import org.apache.commons.codec.Charsets;
 import org.apache.commons.io.FileUtils;
 import org.apache.lucene.analysis.MockAnalyzer;
 import org.apache.lucene.analysis.MockTokenizer;
 import org.apache.lucene.index.IndexWriterConfig;
 import org.apache.lucene.util.Constants;
-import org.apache.lucene.util.IOUtils;
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.lucene.util.LuceneTestCase.SuppressFileSystems;
 import org.apache.lucene.util.LuceneTestCase.SuppressSysoutChecks;
@@ -81,7 +72,6 @@ import org.apache.solr.common.util.Objec
 import org.apache.solr.common.util.SuppressForbidden;
 import org.apache.solr.common.util.XML;
 import org.apache.solr.core.CoreContainer;
-import org.apache.solr.core.CoreDescriptor;
 import org.apache.solr.core.CoresLocator;
 import org.apache.solr.core.NodeConfig;
 import org.apache.solr.core.SolrConfig;
@@ -102,6 +92,7 @@ import org.apache.solr.util.RefCounted;
 import org.apache.solr.util.RevertDefaultThreadHandlerRule;
 import org.apache.solr.util.SSLTestConfig;
 import org.apache.solr.util.TestHarness;
+import org.apache.solr.util.TestInjection;
 import org.apache.zookeeper.KeeperException;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
@@ -116,9 +107,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.xml.sax.SAXException;
 
-import com.carrotsearch.randomizedtesting.RandomizedContext;
-import com.carrotsearch.randomizedtesting.annotations.ThreadLeakFilters;
-import com.carrotsearch.randomizedtesting.rules.SystemPropertiesRestoreRule;
+import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
  * A junit4 Solr test harness that extends LuceneTestCaseJ4. To change which core is used when loading the schema and solrconfig.xml, simply
@@ -134,7 +123,10 @@ import com.carrotsearch.randomizedtestin
 @SuppressFileSystems("ExtrasFS") // might be ok, the failures with e.g. nightly runs might be "normal"
 public abstract class SolrTestCaseJ4 extends LuceneTestCase {
 
-  public static final String DEFAULT_TEST_CORENAME = "collection1";
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
+
+  public static final String DEFAULT_TEST_COLLECTION_NAME = "collection1";
+  public static final String DEFAULT_TEST_CORENAME = DEFAULT_TEST_COLLECTION_NAME;
   protected static final String CORE_PROPERTIES_FILENAME = "core.properties";
 
   private static String coreName = DEFAULT_TEST_CORENAME;
@@ -231,20 +223,25 @@ public abstract class SolrTestCaseJ4 ext
       
       if (suiteFailureMarker.wasSuccessful()) {
         // if the tests passed, make sure everything was closed / released
-        endTrackingSearchers();
-        String orr = ObjectReleaseTracker.clearObjectTrackerAndCheckEmpty();
         if (!RandomizedContext.current().getTargetClass().isAnnotationPresent(SuppressObjectReleaseTracker.class)) {
+          endTrackingSearchers(120, false);
+          String orr = ObjectReleaseTracker.clearObjectTrackerAndCheckEmpty();
           assertNull(orr, orr);
         } else {
+          endTrackingSearchers(15, false);
+          String orr = ObjectReleaseTracker.checkEmpty();
           if (orr != null) {
             log.warn(
-                "Some resources were not closed, shutdown, or released. This has been ignored due to the SuppressObjectReleaseTracker annotation.");
+                "Some resources were not closed, shutdown, or released. This has been ignored due to the SuppressObjectReleaseTracker annotation, trying to close them now.");
+            ObjectReleaseTracker.tryClose();
           }
         }
       }
       resetFactory();
       coreName = DEFAULT_TEST_CORENAME;
     } finally {
+      ObjectReleaseTracker.clear();
+      TestInjection.reset();
       initCoreDataDir = null;
       System.clearProperty("zookeeper.forceSync");
       System.clearProperty("jetty.testMode");
@@ -340,16 +337,12 @@ public abstract class SolrTestCaseJ4 ext
    * @param xmlStr - the text of an XML file to use. If null, use the what's the absolute minimal file.
    * @throws Exception Lost of file-type things can go wrong.
    */
-  public static void setupNoCoreTest(File solrHome, String xmlStr) throws Exception {
+  public static void setupNoCoreTest(Path solrHome, String xmlStr) throws Exception {
 
-    File tmpFile = new File(solrHome, SolrXmlConfig.SOLR_XML_FILE);
-    if (xmlStr == null) {
+    if (xmlStr == null)
       xmlStr = "<solr></solr>";
-    }
-    FileUtils.write(tmpFile, xmlStr, IOUtils.UTF_8);
-
-    SolrResourceLoader loader = new SolrResourceLoader(solrHome.getAbsolutePath());
-    h = new TestHarness(SolrXmlConfig.fromFile(loader, new File(solrHome, "solr.xml")));
+    Files.write(solrHome.resolve(SolrXmlConfig.SOLR_XML_FILE), xmlStr.getBytes(StandardCharsets.UTF_8));
+    h = new TestHarness(SolrXmlConfig.fromSolrHome(solrHome));
     lrf = h.getRequestFactory("standard", 0, 20, CommonParams.VERSION, "2.2");
   }
   
@@ -412,10 +405,8 @@ public abstract class SolrTestCaseJ4 ext
     assertNotNull(solrHome);
     configString = config;
     schemaString = schema;
-    testSolrHome = solrHome;
-    if (solrHome != null) {
-      System.setProperty("solr.solr.home", solrHome);
-    }
+    testSolrHome = Paths.get(solrHome);
+    System.setProperty("solr.solr.home", solrHome);
     initCore();
   }
 
@@ -438,14 +429,14 @@ public abstract class SolrTestCaseJ4 ext
     }
   }
 
-  public static void endTrackingSearchers() {
+  public static void endTrackingSearchers(int waitSeconds, boolean failTest) {
      long endNumOpens = SolrIndexSearcher.numOpens.get();
      long endNumCloses = SolrIndexSearcher.numCloses.get();
 
      // wait a bit in case any ending threads have anything to release
      int retries = 0;
      while (endNumOpens - numOpens != endNumCloses - numCloses) {
-       if (retries++ > 120) {
+       if (retries++ > waitSeconds) {
          break;
        }
        try {
@@ -465,7 +456,7 @@ public abstract class SolrTestCaseJ4 ext
        if ("TestReplicationHandler".equals(RandomizedContext.current().getTargetClass().getSimpleName())) {
          log.warn("TestReplicationHandler wants to fail!: " + msg);
        } else {
-         fail(msg);
+         if (failTest) fail(msg);
        }
      }
   }
@@ -497,7 +488,7 @@ public abstract class SolrTestCaseJ4 ext
 
   protected static String configString;
   protected static String schemaString;
-  protected static String testSolrHome;
+  protected static Path testSolrHome;
 
   protected static SolrConfig solrConfig;
 
@@ -556,8 +547,6 @@ public abstract class SolrTestCaseJ4 ext
    *
    */
 
-  public static Logger log = LoggerFactory.getLogger(SolrTestCaseJ4.class);
-
   private static String factoryProp;
 
 
@@ -591,7 +580,7 @@ public abstract class SolrTestCaseJ4 ext
             ("standard",0,20,CommonParams.VERSION,"2.2");
   }
 
-  public static CoreContainer createCoreContainer(String solrHome, String solrXML) {
+  public static CoreContainer createCoreContainer(Path solrHome, String solrXML) {
     testSolrHome = checkNotNull(solrHome);
     h = new TestHarness(solrHome, solrXML);
     lrf = h.getRequestFactory("standard", 0, 20, CommonParams.VERSION, "2.2");
@@ -599,21 +588,21 @@ public abstract class SolrTestCaseJ4 ext
   }
 
   public static CoreContainer createCoreContainer(NodeConfig config, CoresLocator locator) {
-    testSolrHome = config.getSolrResourceLoader().getInstanceDir();
+    testSolrHome = config.getSolrResourceLoader().getInstancePath();
     h = new TestHarness(config, locator);
     lrf = h.getRequestFactory("standard", 0, 20, CommonParams.VERSION, "2.2");
     return h.getCoreContainer();
   }
 
   public static CoreContainer createCoreContainer(String coreName, String dataDir, String solrConfig, String schema) {
-    NodeConfig nodeConfig = TestHarness.buildTestNodeConfig(new SolrResourceLoader(SolrResourceLoader.locateSolrHome()));
+    NodeConfig nodeConfig = TestHarness.buildTestNodeConfig(new SolrResourceLoader(TEST_PATH()));
     CoresLocator locator = new TestHarness.TestCoresLocator(coreName, dataDir, solrConfig, schema);
     CoreContainer cc = createCoreContainer(nodeConfig, locator);
     h.coreName = coreName;
     return cc;
   }
 
-  public static CoreContainer createDefaultCoreContainer(String solrHome) {
+  public static CoreContainer createDefaultCoreContainer(Path solrHome) {
     testSolrHome = checkNotNull(solrHome);
     h = new TestHarness("collection1", initCoreDataDir.getAbsolutePath(), "solrconfig.xml", "schema.xml");
     lrf = h.getRequestFactory("standard", 0, 20, CommonParams.VERSION, "2.2");
@@ -1763,6 +1752,8 @@ public abstract class SolrTestCaseJ4 ext
     return getFile("solr/collection1").getParent();
   }
 
+  public static Path TEST_PATH() { return getFile("solr/collection1").getParentFile().toPath(); }
+
   public static Throwable getRootCause(Throwable t) {
     Throwable result = t;
     for (Throwable cause = t; null != cause; cause = cause.getCause()) {
@@ -1876,53 +1867,6 @@ public abstract class SolrTestCaseJ4 ext
     FileUtils.copyFile(new File(top, "synonyms.txt"), new File(subHome, "synonyms.txt"));
   }
 
-  public static CoreDescriptorBuilder buildCoreDescriptor(CoreContainer container, String name, String instancedir) {
-    return new CoreDescriptorBuilder(container, name, instancedir);
-  }
-
-  public static class CoreDescriptorBuilder {
-
-    final String name;
-    final String instanceDir;
-    final CoreContainer container;
-    final Properties properties = new Properties();
-
-    public CoreDescriptorBuilder(CoreContainer container, String name, String instancedir) {
-      this.name = name;
-      this.instanceDir = instancedir;
-      this.container = container;
-    }
-
-    public CoreDescriptorBuilder withSchema(String schema) {
-      properties.setProperty(CoreDescriptor.CORE_SCHEMA, schema);
-      return this;
-    }
-
-    public CoreDescriptorBuilder withConfig(String config) {
-      properties.setProperty(CoreDescriptor.CORE_CONFIG, config);
-      return this;
-    }
-
-    public CoreDescriptorBuilder withDataDir(String datadir) {
-      properties.setProperty(CoreDescriptor.CORE_DATADIR, datadir);
-      return this;
-    }
-
-    public CoreDescriptor build() {
-      return new CoreDescriptor(container, name, instanceDir, properties);
-    }
-
-    public CoreDescriptorBuilder isTransient(boolean isTransient) {
-      properties.setProperty(CoreDescriptor.CORE_TRANSIENT, Boolean.toString(isTransient));
-      return this;
-    }
-
-    public CoreDescriptorBuilder loadOnStartup(boolean loadOnStartup) {
-      properties.setProperty(CoreDescriptor.CORE_LOADONSTARTUP, Boolean.toString(loadOnStartup));
-      return this;
-    }
-  }
-
   public boolean compareSolrDocument(Object expected, Object actual) {
 
     if (!(expected instanceof SolrDocument)  || !(actual instanceof SolrDocument)) {

Modified: lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/cloud/AbstractDistribZkTestBase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/cloud/AbstractDistribZkTestBase.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/cloud/AbstractDistribZkTestBase.java (original)
+++ lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/cloud/AbstractDistribZkTestBase.java Mon Dec 21 11:39:57 2015
@@ -18,6 +18,7 @@ package org.apache.solr.cloud;
  */
 
 import java.io.File;
+import java.lang.invoke.MethodHandles;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -31,9 +32,10 @@ import org.apache.solr.common.cloud.Solr
 import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.solr.core.Diagnostics;
 import org.apache.solr.core.MockDirectoryFactory;
-import org.apache.solr.servlet.SolrDispatchFilter;
 import org.apache.zookeeper.KeeperException;
 import org.junit.BeforeClass;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public abstract class AbstractDistribZkTestBase extends BaseDistributedSearchTestCase {
   
@@ -46,6 +48,8 @@ public abstract class AbstractDistribZkT
   protected ZkTestServer zkServer;
   private AtomicInteger homeCount = new AtomicInteger();
 
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
+
   @BeforeClass
   public static void beforeThisClass() throws Exception {
     // Only For Manual Testing: this will force an fs based dir factory
@@ -116,8 +120,7 @@ public abstract class AbstractDistribZkT
     
     // now wait till we see the leader for each shard
     for (int i = 1; i <= numShards; i++) {
-      ZkStateReader zkStateReader = ((SolrDispatchFilter) jettys.get(0)
-          .getDispatchFilter().getFilter()).getCores().getZkController()
+      ZkStateReader zkStateReader = jettys.get(0).getCoreContainer().getZkController()
           .getZkStateReader();
       zkStateReader.getLeaderRetry("collection1", "shard" + (i + 2), 15000);
     }
@@ -155,7 +158,7 @@ public abstract class AbstractDistribZkT
               + " live:"
               + clusterState.liveNodesContain(shard.getValue().getNodeName()));
           final Replica.State state = shard.getValue().getState();
-          if ((state == Replica.State.RECOVERING || state == Replica.State.DOWN)
+          if ((state == Replica.State.RECOVERING || state == Replica.State.DOWN || state == Replica.State.RECOVERY_FAILED)
               && clusterState.liveNodesContain(shard.getValue().getStr(ZkStateReader.NODE_NAME_PROP))) {
             sawLiveRecovering = true;
           }
@@ -214,6 +217,25 @@ public abstract class AbstractDistribZkT
 
     log.info("Collection has disappeared - collection: " + collection);
   }
+
+  public static void verifyReplicaStatus(ZkStateReader reader, String collection, String shard, String coreNodeName, Replica.State expectedState) throws InterruptedException {
+    int maxIterations = 100;
+    Replica.State coreState = null;
+    while(maxIterations-->0) {
+      Slice slice = reader.getClusterState().getSlice(collection, shard);
+      if(slice!=null) {
+        Replica replica = slice.getReplicasMap().get(coreNodeName);
+        if (replica != null) {
+          coreState = replica.getState();
+          if(coreState == expectedState) {
+            return;
+          }
+        }
+      }
+      Thread.sleep(50);
+    }
+    fail("Illegal state, was: " + coreState + " expected:" + expectedState + " clusterState:" + reader.getClusterState());
+  }
   
   protected void assertAllActive(String collection,ZkStateReader zkStateReader)
       throws KeeperException, InterruptedException {
@@ -252,8 +274,12 @@ public abstract class AbstractDistribZkT
     System.clearProperty(MockDirectoryFactory.SOLR_TESTS_ALLOW_READING_FILES_STILL_OPEN_FOR_WRITE);
     
     resetExceptionIgnores();
-    super.distribTearDown();
-    zkServer.shutdown();
+    try {
+      super.distribTearDown();
+    }
+    finally {
+      zkServer.shutdown();
+    }
   }
   
   protected void printLayout() throws Exception {

Modified: lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java (original)
+++ lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java Mon Dec 21 11:39:57 2015
@@ -19,6 +19,7 @@ package org.apache.solr.cloud;
 
 import java.io.File;
 import java.io.IOException;
+import java.lang.invoke.MethodHandles;
 import java.net.ServerSocket;
 import java.net.URI;
 import java.net.URL;
@@ -94,7 +95,7 @@ import static org.apache.solr.common.uti
  */
 @Slow
 public abstract class AbstractFullDistribZkTestBase extends AbstractDistribZkTestBase {
-  static Logger log = LoggerFactory.getLogger(AbstractFullDistribZkTestBase.class);
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   @BeforeClass
   public static void beforeFullSolrCloudTest() {
@@ -1200,8 +1201,7 @@ public abstract class AbstractFullDistri
     log.info("Turning on auto soft commit: " + time);
     for (List<CloudJettyRunner> jettyList : shardToJetty.values()) {
       for (CloudJettyRunner jetty : jettyList) {
-        CoreContainer cores = ((SolrDispatchFilter) jetty.jetty
-            .getDispatchFilter().getFilter()).getCores();
+        CoreContainer cores = jetty.jetty.getCoreContainer();
         for (SolrCore core : cores.getCores()) {
           ((DirectUpdateHandler2) core.getUpdateHandler())
               .getSoftCommitTracker().setTimeUpperBound(time);

Modified: lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/cloud/AbstractZkTestCase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/cloud/AbstractZkTestCase.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/cloud/AbstractZkTestCase.java (original)
+++ lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/cloud/AbstractZkTestCase.java Mon Dec 21 11:39:57 2015
@@ -28,6 +28,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.File;
+import java.lang.invoke.MethodHandles;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -41,8 +42,7 @@ public abstract class AbstractZkTestCase
 
   private static final boolean DEBUG = false;
 
-  protected static Logger log = LoggerFactory
-      .getLogger(AbstractZkTestCase.class);
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   
   public static File SOLRHOME;

Modified: lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/cloud/ChaosMonkey.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/cloud/ChaosMonkey.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/cloud/ChaosMonkey.java (original)
+++ lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/cloud/ChaosMonkey.java Mon Dec 21 11:39:57 2015
@@ -1,5 +1,7 @@
 package org.apache.solr.cloud;
 
+import java.lang.invoke.MethodHandles;
+
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -17,6 +19,15 @@ package org.apache.solr.cloud;
  * limitations under the License.
  */
 
+import java.net.InetSocketAddress;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
+
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
@@ -32,19 +43,9 @@ import org.apache.solr.servlet.SolrDispa
 import org.apache.solr.update.DirectUpdateHandler2;
 import org.apache.solr.util.RTimer;
 import org.apache.zookeeper.KeeperException;
-import org.eclipse.jetty.servlet.FilterHolder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.servlet.Filter;
-
-import java.net.InetSocketAddress;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Random;
-import java.util.concurrent.atomic.AtomicInteger;
-
 /**
  * The monkey can stop random or specific jetties used with SolrCloud.
  * 
@@ -56,7 +57,7 @@ import java.util.concurrent.atomic.Atomi
  * TODO: chaosmonkey should be able to do cluster stop/start tests
  */
 public class ChaosMonkey {
-  private static Logger log = LoggerFactory.getLogger(ChaosMonkey.class);
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
   
   private static final int CONLOSS_PERCENT = 10; // 0 - 10 = 0 - 100%
   private static final int EXPIRE_PERCENT = 10; // 0 - 10 = 0 - 100%
@@ -120,18 +121,15 @@ public class ChaosMonkey {
   // TODO: expire all clients at once?
   public void expireSession(final JettySolrRunner jetty) {
     monkeyLog("expire session for " + jetty.getLocalPort() + " !");
-    
-    SolrDispatchFilter solrDispatchFilter = (SolrDispatchFilter) jetty
-        .getDispatchFilter().getFilter();
-    if (solrDispatchFilter != null) {
-      CoreContainer cores = solrDispatchFilter.getCores();
-      if (cores != null) {
-        causeConnectionLoss(jetty);
-        long sessionId = cores.getZkController().getZkClient()
-            .getSolrZooKeeper().getSessionId();
-        zkServer.expire(sessionId);
-      }
+
+    CoreContainer cores = jetty.getCoreContainer();
+    if (cores != null) {
+      causeConnectionLoss(jetty);
+      long sessionId = cores.getZkController().getZkClient()
+          .getSolrZooKeeper().getSessionId();
+      zkServer.expire(sessionId);
     }
+
   }
   
   public void expireRandomSession() throws KeeperException, InterruptedException {
@@ -156,14 +154,10 @@ public class ChaosMonkey {
   }
   
   public static void causeConnectionLoss(JettySolrRunner jetty) {
-    SolrDispatchFilter solrDispatchFilter = (SolrDispatchFilter) jetty
-        .getDispatchFilter().getFilter();
-    if (solrDispatchFilter != null) {
-      CoreContainer cores = solrDispatchFilter.getCores();
-      if (cores != null) {
-        SolrZkClient zkClient = cores.getZkController().getZkClient();
-        zkClient.getSolrZooKeeper().closeCnxn();
-      }
+    CoreContainer cores = jetty.getCoreContainer();
+    if (cores != null) {
+      SolrZkClient zkClient = cores.getZkController().getZkClient();
+      zkClient.getSolrZooKeeper().closeCnxn();
     }
   }
 
@@ -191,17 +185,25 @@ public class ChaosMonkey {
   private static void stopJettySolrRunner(JettySolrRunner jetty) throws Exception {
     assert(jetty != null);
     monkeyLog("stop shard! " + jetty.getLocalPort());
-    // get a clean close so that no dirs are left open...
-    FilterHolder fh = jetty.getDispatchFilter();
-    if (fh != null) {
-      SolrDispatchFilter sdf = (SolrDispatchFilter) fh.getFilter();
-      if (sdf != null) {
+    SolrDispatchFilter sdf = jetty.getSolrDispatchFilter();
+    if (sdf != null) {
+      try {
         sdf.destroy();
+      } catch (Throwable t) {
+        log.error("", t);
       }
     }
-    jetty.stop();
+    try {
+      jetty.stop();
+    } catch (InterruptedException e) {
+      log.info("Jetty stop interrupted - should be a test caused interruption, we will try again to be sure we shutdown");
+    } 
     
     if (!jetty.isStopped()) {
+      jetty.stop();
+    }
+
+    if (!jetty.isStopped()) {
       throw new RuntimeException("could not stop jetty");
     }
   }
@@ -214,18 +216,13 @@ public class ChaosMonkey {
   }
   
   public static void kill(JettySolrRunner jetty) throws Exception {
-    FilterHolder filterHolder = jetty.getDispatchFilter();
-    if (filterHolder != null) {
-      Filter filter = filterHolder.getFilter();
-      if (filter != null) {
-        CoreContainer cores = ((SolrDispatchFilter) filter).getCores();
-        if (cores != null) {
-          if (cores.isZooKeeperAware()) {
-            int zklocalport = ((InetSocketAddress) cores.getZkController()
-                .getZkClient().getSolrZooKeeper().getSocketAddress()).getPort();
-            IpTables.blockPort(zklocalport);
-          }
-        }
+
+    CoreContainer cores = jetty.getCoreContainer();
+    if (cores != null) {
+      if (cores.isZooKeeperAware()) {
+        int zklocalport = ((InetSocketAddress) cores.getZkController()
+            .getZkClient().getSolrZooKeeper().getSocketAddress()).getPort();
+        IpTables.blockPort(zklocalport);
       }
     }
 
@@ -246,6 +243,42 @@ public class ChaosMonkey {
     kill(cjetty.jetty);
   }
   
+  public void stopAll(int pauseBetweenMs) throws Exception {
+    Set<String> keys = shardToJetty.keySet();
+    List<Thread> jettyThreads = new ArrayList<>(keys.size());
+    for (String key : keys) {
+      List<CloudJettyRunner> jetties = shardToJetty.get(key);
+      for (CloudJettyRunner jetty : jetties) {
+        Thread.sleep(pauseBetweenMs);
+        Thread thread = new Thread() {
+          public void run() {
+            try {
+              stopJetty(jetty);
+            } catch (Exception e) {
+              throw new RuntimeException(e);
+            }
+          }
+        };
+        jettyThreads.add(thread);
+        thread.start();
+
+      }
+    }
+    for (Thread thread : jettyThreads) {
+      thread.join();
+    }
+  }
+  
+  public void startAll() throws Exception {
+    Set<String> keys = shardToJetty.keySet();
+    for (String key : keys) {
+      List<CloudJettyRunner> jetties = shardToJetty.get(key);
+      for (CloudJettyRunner jetty : jetties) {
+        start(jetty.jetty);
+      }
+    }
+  }
+  
   public void stopShard(String slice) throws Exception {
     List<CloudJettyRunner> jetties = shardToJetty.get(slice);
     for (CloudJettyRunner jetty : jetties) {
@@ -352,31 +385,20 @@ public class ChaosMonkey {
         log.error("Could not get leader", t);
         return null;
       }
-      
-      FilterHolder fh = cjetty.jetty.getDispatchFilter();
-      if (fh == null) {
-        monkeyLog("selected jetty not running correctly - skip");
-        return null;
-      }
-      SolrDispatchFilter df = ((SolrDispatchFilter) fh.getFilter());
-      if (df == null) {
-        monkeyLog("selected jetty not running correctly - skip");
-        return null;
-      }
-      CoreContainer cores = df.getCores();
-      if (cores == null) {
-        monkeyLog("selected jetty not running correctly - skip");
-        return null;
-      }
 
       // cluster state can be stale - also go by our 'near real-time' is leader prop
       boolean rtIsLeader;
-      try (SolrCore core = cores.getCore(leader.getStr(ZkStateReader.CORE_NAME_PROP))) {
-        if (core == null) {
-          monkeyLog("selected jetty not running correctly - skip");
-          return null;
+      CoreContainer cc = cjetty.jetty.getCoreContainer();
+      if (cc != null) {
+        try (SolrCore core = cc.getCore(leader.getStr(ZkStateReader.CORE_NAME_PROP))) {
+          if (core == null) {
+            monkeyLog("selected jetty not running correctly - skip");
+            return null;
+          }
+          rtIsLeader = core.getCoreDescriptor().getCloudDescriptor().isLeader();
         }
-        rtIsLeader = core.getCoreDescriptor().getCloudDescriptor().isLeader();
+      } else {
+        return null;
       }
 
       boolean isLeader = leader.getStr(ZkStateReader.NODE_NAME_PROP).equals(jetties.get(index).nodeName)
@@ -535,8 +557,8 @@ public class ChaosMonkey {
     DirectUpdateHandler2.commitOnClose = true;
 
     double runtime = runTimer.getTime()/1000.0f;
-    if (runtime > 30 && stops.get() == 0) {
-      LuceneTestCase.fail("The Monkey ran for over 30 seconds and no jetties were stopped - this is worth investigating!");
+    if (runtime > 45 && stops.get() == 0) {
+      LuceneTestCase.fail("The Monkey ran for over 45 seconds and no jetties were stopped - this is worth investigating!");
     }
   }
 
@@ -589,20 +611,15 @@ public class ChaosMonkey {
         }
       }
     }
-    FilterHolder filterHolder = jetty.getDispatchFilter();
-    if (filterHolder != null) {
-      Filter filter = filterHolder.getFilter();
-      if (filter != null) {
-        CoreContainer cores = ((SolrDispatchFilter) filter).getCores();
-        if (cores != null) {
-          if (cores.isZooKeeperAware()) {
-            int zklocalport = ((InetSocketAddress) cores.getZkController()
-                .getZkClient().getSolrZooKeeper().getSocketAddress()).getPort();
-            IpTables.unblockPort(zklocalport);
-          }
-        }
+    CoreContainer cores = jetty.getCoreContainer();
+    if (cores != null) {
+      if (cores.isZooKeeperAware()) {
+        int zklocalport = ((InetSocketAddress) cores.getZkController()
+            .getZkClient().getSolrZooKeeper().getSocketAddress()).getPort();
+        IpTables.unblockPort(zklocalport);
       }
     }
+
     return true;
   }
 

Modified: lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/cloud/CloudInspectUtil.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/cloud/CloudInspectUtil.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/cloud/CloudInspectUtil.java (original)
+++ lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/cloud/CloudInspectUtil.java Mon Dec 21 11:39:57 2015
@@ -11,6 +11,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
+import java.lang.invoke.MethodHandles;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
@@ -34,7 +35,7 @@ import java.util.Set;
  */
 
 public class CloudInspectUtil {
-  static Logger log = LoggerFactory.getLogger(CloudInspectUtil.class);
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
   
   /**
    * When a and b are known to be different, this method tells if the difference

Modified: lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/cloud/IpTables.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/cloud/IpTables.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/cloud/IpTables.java (original)
+++ lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/cloud/IpTables.java Mon Dec 21 11:39:57 2015
@@ -19,6 +19,7 @@ package org.apache.solr.cloud;
 
 
 import java.io.IOException;
+import java.lang.invoke.MethodHandles;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Set;
@@ -30,7 +31,7 @@ import org.slf4j.LoggerFactory;
  * To use, tests must be able to run iptables, eg sudo chmod u+s iptables
  */
 public class IpTables {
-  static final Logger log = LoggerFactory.getLogger(IpTables.class);
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
   
   private static final boolean ENABLED = Boolean.getBoolean("solr.tests.use.iptables");
   

Modified: lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/cloud/MiniSolrCloudCluster.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/cloud/MiniSolrCloudCluster.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/cloud/MiniSolrCloudCluster.java (original)
+++ lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/cloud/MiniSolrCloudCluster.java Mon Dec 21 11:39:57 2015
@@ -17,6 +17,26 @@ package org.apache.solr.cloud;
  * limitations under the License.
  */
 
+import javax.servlet.Filter;
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.Charset;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.concurrent.Callable;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
 import com.google.common.base.Charsets;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.embedded.JettyConfig;
@@ -36,42 +56,61 @@ import org.apache.solr.common.util.Named
 import org.apache.solr.common.util.SolrjNamedThreadFactory;
 import org.apache.zookeeper.KeeperException;
 import org.eclipse.jetty.servlet.ServletHolder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.servlet.Filter;
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.SortedMap;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
 
 /**
  * "Mini" SolrCloud cluster to be used for testing
  */
 public class MiniSolrCloudCluster {
   
-  private static Logger log = LoggerFactory.getLogger(MiniSolrCloudCluster.class);
+  public static final String DEFAULT_CLOUD_SOLR_XML = "<solr>\n" +
+      "\n" +
+      "  <str name=\"shareSchema\">${shareSchema:false}</str>\n" +
+      "  <str name=\"configSetBaseDir\">${configSetBaseDir:configsets}</str>\n" +
+      "  <str name=\"coreRootDirectory\">${coreRootDirectory:.}</str>\n" +
+      "\n" +
+      "  <shardHandlerFactory name=\"shardHandlerFactory\" class=\"HttpShardHandlerFactory\">\n" +
+      "    <str name=\"urlScheme\">${urlScheme:}</str>\n" +
+      "    <int name=\"socketTimeout\">${socketTimeout:90000}</int>\n" +
+      "    <int name=\"connTimeout\">${connTimeout:15000}</int>\n" +
+      "  </shardHandlerFactory>\n" +
+      "\n" +
+      "  <solrcloud>\n" +
+      "    <str name=\"host\">127.0.0.1</str>\n" +
+      "    <int name=\"hostPort\">${hostPort:8983}</int>\n" +
+      "    <str name=\"hostContext\">${hostContext:solr}</str>\n" +
+      "    <int name=\"zkClientTimeout\">${solr.zkclienttimeout:30000}</int>\n" +
+      "    <bool name=\"genericCoreNodeNames\">${genericCoreNodeNames:true}</bool>\n" +
+      "    <int name=\"leaderVoteWait\">10000</int>\n" +
+      "    <int name=\"distribUpdateConnTimeout\">${distribUpdateConnTimeout:45000}</int>\n" +
+      "    <int name=\"distribUpdateSoTimeout\">${distribUpdateSoTimeout:340000}</int>\n" +
+      "  </solrcloud>\n" +
+      "  \n" +
+      "</solr>\n";
 
   private final ZkTestServer zkServer;
   private final boolean externalZkServer;
-  private final List<JettySolrRunner> jettys = new LinkedList<>();
-  private final File testDir;
+  private final List<JettySolrRunner> jettys = new CopyOnWriteArrayList<>();
+  private final Path baseDir;
   private final CloudSolrClient solrClient;
   private final JettyConfig jettyConfig;
 
   private final ExecutorService executor = ExecutorUtil.newMDCAwareCachedThreadPool(new SolrjNamedThreadFactory("jetty-launcher"));
 
+  private final AtomicInteger nodeIds = new AtomicInteger();
+
+  /**
+   * Create a MiniSolrCloudCluster with default solr.xml
+   *
+   * @param numServers number of Solr servers to start
+   * @param baseDir base directory that the mini cluster should be run from
+   * @param jettyConfig Jetty configuration
+   *
+   * @throws Exception if there was an error starting the cluster
+   */
+  public MiniSolrCloudCluster(int numServers, Path baseDir, JettyConfig jettyConfig) throws Exception {
+    this(numServers, baseDir, DEFAULT_CLOUD_SOLR_XML, jettyConfig, null);
+  }
+
   /**
    * Create a MiniSolrCloudCluster
    *
@@ -84,7 +123,7 @@ public class MiniSolrCloudCluster {
    *
    * @throws Exception if there was an error starting the cluster
    */
-  public MiniSolrCloudCluster(int numServers, String hostContext, File baseDir, File solrXml,
+  public MiniSolrCloudCluster(int numServers, String hostContext, Path baseDir, String solrXml,
       SortedMap<ServletHolder, String> extraServlets,
       SortedMap<Class<? extends Filter>, String> extraRequestFilters) throws Exception {
     this(numServers, hostContext, baseDir, solrXml, extraServlets, extraRequestFilters, null);
@@ -103,7 +142,7 @@ public class MiniSolrCloudCluster {
    *
    * @throws Exception if there was an error starting the cluster
    */
-  public MiniSolrCloudCluster(int numServers, String hostContext, File baseDir, File solrXml,
+  public MiniSolrCloudCluster(int numServers, String hostContext, Path baseDir, String solrXml,
       SortedMap<ServletHolder, String> extraServlets,
       SortedMap<Class<? extends Filter>, String> extraRequestFilters,
       SSLConfig sslConfig) throws Exception {
@@ -125,7 +164,7 @@ public class MiniSolrCloudCluster {
    *
    * @throws Exception if there was an error starting the cluster
    */
-  public MiniSolrCloudCluster(int numServers, File baseDir, File solrXml, JettyConfig jettyConfig) throws Exception {
+  public MiniSolrCloudCluster(int numServers, Path baseDir, String solrXml, JettyConfig jettyConfig) throws Exception {
     this(numServers, baseDir, solrXml, jettyConfig, null);
   }
 
@@ -140,15 +179,16 @@ public class MiniSolrCloudCluster {
    *
    * @throws Exception if there was an error starting the cluster
    */
-  public MiniSolrCloudCluster(int numServers, File baseDir, File solrXml, JettyConfig jettyConfig, ZkTestServer zkTestServer) throws Exception {
+  public MiniSolrCloudCluster(int numServers, Path baseDir, String solrXml, JettyConfig jettyConfig, ZkTestServer zkTestServer) throws Exception {
 
-    this.testDir = baseDir;
+    this.baseDir = baseDir;
     this.jettyConfig = jettyConfig;
 
+    Files.createDirectories(baseDir);
+
     this.externalZkServer = zkTestServer != null;
     if (!externalZkServer) {
-      String zkDir = testDir.getAbsolutePath() + File.separator
-        + "zookeeper/server1/data";
+      String zkDir = baseDir.resolve("zookeeper/server1/data").toString();
       zkTestServer = new ZkTestServer(zkDir);
       zkTestServer.run();
     }
@@ -156,7 +196,7 @@ public class MiniSolrCloudCluster {
 
     try(SolrZkClient zkClient = new SolrZkClient(zkServer.getZkHost(),
         AbstractZkTestCase.TIMEOUT, 45000, null)) {
-      zkClient.makePath("/solr/solr.xml", solrXml, false, true);
+      zkClient.makePath("/solr/solr.xml", solrXml.getBytes(Charset.defaultCharset()), true);
       if (jettyConfig.sslConfig != null && jettyConfig.sslConfig.isSSLMode()) {
         zkClient.makePath("/solr" + ZkStateReader.CLUSTER_PROPS, "{'urlScheme':'https'}".getBytes(Charsets.UTF_8), true);
       }
@@ -170,7 +210,7 @@ public class MiniSolrCloudCluster {
       startups.add(new Callable<JettySolrRunner>() {
         @Override
         public JettySolrRunner call() throws Exception {
-          return startJettySolrRunner(jettyConfig);
+          return startJettySolrRunner(newNodeName(), jettyConfig.context, jettyConfig);
         }
       });
     }
@@ -213,6 +253,16 @@ public class MiniSolrCloudCluster {
     solrClient = buildSolrClient();
   }
 
+  private String newNodeName() {
+    return "node" + nodeIds.incrementAndGet();
+  }
+
+  private Path createInstancePath(String name) throws IOException {
+    Path instancePath = baseDir.resolve(name);
+    Files.createDirectory(instancePath);
+    return instancePath;
+  }
+
   /**
    * @return ZooKeeper server used by the MiniCluster
    */
@@ -237,10 +287,10 @@ public class MiniSolrCloudCluster {
    * @return new Solr instance
    *
    */
-  public JettySolrRunner startJettySolrRunner(String hostContext,
+  public JettySolrRunner startJettySolrRunner(String name, String hostContext,
       SortedMap<ServletHolder, String> extraServlets,
       SortedMap<Class<? extends Filter>, String> extraRequestFilters) throws Exception {
-    return startJettySolrRunner(hostContext, extraServlets, extraRequestFilters, null);
+    return startJettySolrRunner(name, hostContext, extraServlets, extraRequestFilters, null);
   }
 
   /**
@@ -253,10 +303,10 @@ public class MiniSolrCloudCluster {
    *
    * @return new Solr instance
    */
-  public JettySolrRunner startJettySolrRunner(String hostContext,
+  public JettySolrRunner startJettySolrRunner(String name, String hostContext,
       SortedMap<ServletHolder, String> extraServlets,
       SortedMap<Class<? extends Filter>, String> extraRequestFilters, SSLConfig sslConfig) throws Exception {
-    return startJettySolrRunner(hostContext, JettyConfig.builder()
+    return startJettySolrRunner(name, hostContext, JettyConfig.builder()
         .withServlets(extraServlets)
         .withFilters(extraRequestFilters)
         .withSSLConfig(sslConfig)
@@ -264,28 +314,19 @@ public class MiniSolrCloudCluster {
   }
 
   /**
-   * Start a new Solr instance
-   *
-   * @param config a JettyConfig for the instance's {@link org.apache.solr.client.solrj.embedded.JettySolrRunner}
-   *
-   * @return a JettySolrRunner
-   */
-  public JettySolrRunner startJettySolrRunner(JettyConfig config) throws Exception {
-    return startJettySolrRunner(config.context, config);
-  }
-
-  /**
    * Start a new Solr instance on a particular servlet context
    *
+   * @param name the instance name
    * @param hostContext the context to run on
    * @param config a JettyConfig for the instance's {@link org.apache.solr.client.solrj.embedded.JettySolrRunner}
    *
    * @return a JettySolrRunner
    */
-  public JettySolrRunner startJettySolrRunner(String hostContext, JettyConfig config) throws Exception {
+  public JettySolrRunner startJettySolrRunner(String name, String hostContext, JettyConfig config) throws Exception {
+    Path runnerPath = createInstancePath(name);
     String context = getHostContextSuitableForServletContext(hostContext);
     JettyConfig newConfig = JettyConfig.builder(config).setContext(context).build();
-    JettySolrRunner jetty = new JettySolrRunner(testDir.getAbsolutePath(), newConfig);
+    JettySolrRunner jetty = new JettySolrRunner(runnerPath.toString(), newConfig);
     jetty.start();
     jettys.add(jetty);
     return jetty;
@@ -297,7 +338,7 @@ public class MiniSolrCloudCluster {
    * @return a JettySolrRunner
    */
   public JettySolrRunner startJettySolrRunner() throws Exception {
-    return startJettySolrRunner(jettyConfig);
+    return startJettySolrRunner(newNodeName(), jettyConfig.context, jettyConfig);
   }
 
   /**
@@ -312,6 +353,12 @@ public class MiniSolrCloudCluster {
     return jetty;
   }
 
+  protected JettySolrRunner startJettySolrRunner(JettySolrRunner jetty) throws Exception {
+    jetty.start();
+    jettys.add(jetty);
+    return jetty;
+  }
+
   protected JettySolrRunner stopJettySolrRunner(JettySolrRunner jetty) throws Exception {
     jetty.stop();
     return jetty;

Modified: lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/cloud/SocketProxy.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/cloud/SocketProxy.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/cloud/SocketProxy.java (original)
+++ lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/cloud/SocketProxy.java Mon Dec 21 11:39:57 2015
@@ -20,6 +20,7 @@ package org.apache.solr.cloud;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.lang.invoke.MethodHandles;
 import java.net.InetSocketAddress;
 import java.net.ServerSocket;
 import java.net.Socket;
@@ -45,7 +46,7 @@ import org.slf4j.LoggerFactory;
  */
 public class SocketProxy {
   
-  private static final transient Logger log = LoggerFactory.getLogger(SocketProxy.class);
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
   
   public static final int ACCEPT_TIMEOUT_MILLIS = 100;
 

Modified: lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/cloud/StoppableSearchThread.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/cloud/StoppableSearchThread.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/cloud/StoppableSearchThread.java (original)
+++ lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/cloud/StoppableSearchThread.java Mon Dec 21 11:39:57 2015
@@ -1,5 +1,7 @@
 package org.apache.solr.cloud;
 
+import java.lang.invoke.MethodHandles;
+
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -28,7 +30,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 class StoppableSearchThread extends AbstractFullDistribZkTestBase.StoppableThread {
-  static Logger log = LoggerFactory.getLogger(AbstractFullDistribZkTestBase.class);
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   private final CloudSolrClient cloudClient;
   private volatile boolean stop = false;

Modified: lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/cloud/ZkTestServer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/cloud/ZkTestServer.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/cloud/ZkTestServer.java (original)
+++ lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/cloud/ZkTestServer.java Mon Dec 21 11:39:57 2015
@@ -45,6 +45,7 @@ import java.io.File;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.OutputStream;
+import java.lang.invoke.MethodHandles;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.net.Socket;
@@ -62,7 +63,7 @@ import java.util.concurrent.TimeUnit;
 public class ZkTestServer {
   public static final int TICK_TIME = 1000;
 
-  private static Logger log = LoggerFactory.getLogger(ZkTestServer.class);
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
   
   protected final ZKServerMain zkServer = new ZKServerMain();
 

Modified: lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/handler/component/TrackingShardHandlerFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/handler/component/TrackingShardHandlerFactory.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/handler/component/TrackingShardHandlerFactory.java (original)
+++ lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/handler/component/TrackingShardHandlerFactory.java Mon Dec 21 11:39:57 2015
@@ -35,7 +35,6 @@ import org.apache.solr.common.cloud.ZkSt
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.util.StrUtils;
 import org.apache.solr.core.CoreContainer;
-import org.apache.solr.servlet.SolrDispatchFilter;
 
 /**
  * A ShardHandlerFactory that extends HttpShardHandlerFactory and
@@ -93,7 +92,7 @@ public class TrackingShardHandlerFactory
       }
 
       @Override
-      public void submit(ShardRequest sreq, String shard, ModifiableSolrParams params) {
+      public void submit(ShardRequest sreq, String shard, ModifiableSolrParams params, String preferredHostAddress) {
         synchronized (TrackingShardHandlerFactory.this) {
           if (isTracking()) {
             queue.offer(new ShardRequestAndParams(sreq, shard, params));
@@ -153,7 +152,7 @@ public class TrackingShardHandlerFactory
    */
   public static void setTrackingQueue(List<JettySolrRunner> runners, Queue<ShardRequestAndParams> queue) {
     for (JettySolrRunner runner : runners) {
-      CoreContainer container = ((SolrDispatchFilter) runner.getDispatchFilter().getFilter()).getCores();
+      CoreContainer container = runner.getCoreContainer();
       ShardHandlerFactory factory = container.getShardHandlerFactory();
       assert factory instanceof TrackingShardHandlerFactory : "not a TrackingShardHandlerFactory: " + factory.getClass();
       TrackingShardHandlerFactory trackingShardHandlerFactory = (TrackingShardHandlerFactory) factory;

Modified: lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/util/AbstractSolrTestCase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/util/AbstractSolrTestCase.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/util/AbstractSolrTestCase.java (original)
+++ lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/util/AbstractSolrTestCase.java Mon Dec 21 11:39:57 2015
@@ -20,6 +20,7 @@ package org.apache.solr.util;
 
 
 import java.io.File;
+import java.lang.invoke.MethodHandles;
 import java.util.HashSet;
 
 import org.apache.lucene.util.QuickPatchThreadsFilter;
@@ -61,7 +62,7 @@ public abstract class AbstractSolrTestCa
     return SolrTestCaseJ4.TEST_HOME();
   }
 
-  public static Logger log = LoggerFactory.getLogger(AbstractSolrTestCase.class);
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
 
     /** Causes an exception matching the regex pattern to not be logged. */

Modified: lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/util/RandomMergePolicy.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/util/RandomMergePolicy.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/util/RandomMergePolicy.java (original)
+++ lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/util/RandomMergePolicy.java Mon Dec 21 11:39:57 2015
@@ -18,6 +18,7 @@
 package org.apache.solr.util;
 
 import java.io.IOException;
+import java.lang.invoke.MethodHandles;
 import java.util.Map;
 
 import org.apache.lucene.index.IndexWriter;
@@ -30,18 +31,17 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * A {@link MergePolicy} with a no-arg constructor that proxies to a 
- * wrapped instance retrieved from {@link LuceneTestCase#newMergePolicy}.
+ * A {@link MergePolicy} with a no-arg constructor that proxies to an
+ * instance retrieved from {@link LuceneTestCase#newMergePolicy}.
  * Solr tests utilizing the Lucene randomized test framework can refer 
  * to this class in solrconfig.xml to get a fully randomized merge policy.
  */
-public final class RandomMergePolicy extends MergePolicy {
+public class RandomMergePolicy extends MergePolicy {
 
-  public static Logger log = LoggerFactory.getLogger(RandomMergePolicy.class);
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
   
   /** 
    * Not private so tests can inspect it, 
-   * Not final so it can be set on clone
    */
   final MergePolicy inner;
 
@@ -49,7 +49,7 @@ public final class RandomMergePolicy ext
     this(LuceneTestCase.newMergePolicy());
   }
 
-  private RandomMergePolicy(MergePolicy inner) {
+  protected RandomMergePolicy(MergePolicy inner) {
     super(inner.getNoCFSRatio(), 
           (long) (inner.getMaxCFSSegmentSizeMB() * 1024 * 1024));
     this.inner = inner;

Modified: lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/util/RestTestBase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/util/RestTestBase.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/util/RestTestBase.java (original)
+++ lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/util/RestTestBase.java Mon Dec 21 11:39:57 2015
@@ -30,11 +30,12 @@ import org.xml.sax.SAXException;
 
 import javax.xml.xpath.XPathExpressionException;
 import java.io.IOException;
+import java.lang.invoke.MethodHandles;
 import java.util.Map;
 import java.util.SortedMap;
 
 abstract public class RestTestBase extends SolrJettyTestBase {
-  private static final Logger log = LoggerFactory.getLogger(RestTestBase.class);
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
   protected static RestTestHarness restTestHarness;
 
   @AfterClass

Modified: lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/util/SSLTestConfig.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/util/SSLTestConfig.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/util/SSLTestConfig.java (original)
+++ lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/util/SSLTestConfig.java Mon Dec 21 11:39:57 2015
@@ -35,6 +35,7 @@ import org.apache.http.impl.client.Defau
 import org.apache.solr.client.solrj.embedded.SSLConfig;
 import org.apache.solr.client.solrj.impl.HttpClientConfigurer;
 import org.apache.solr.common.params.SolrParams;
+import org.eclipse.jetty.util.resource.Resource;
 import org.eclipse.jetty.util.security.CertificateUtils;
 
 public class SSLTestConfig extends SSLConfig {
@@ -82,7 +83,7 @@ public class SSLTestConfig extends SSLCo
   
   protected static KeyStore buildKeyStore(String keyStoreLocation, String password) {
     try {
-      return CertificateUtils.getKeyStore(null, keyStoreLocation, "JKS", null, password);
+      return CertificateUtils.getKeyStore(Resource.newResource(keyStoreLocation), "JKS", null, password);
     } catch (Exception ex) {
       throw new IllegalStateException("Unable to build KeyStore from file: " + keyStoreLocation, ex);
     }

Modified: lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/util/TestHarness.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/util/TestHarness.java?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/util/TestHarness.java (original)
+++ lucene/dev/branches/lucene6835/solr/test-framework/src/java/org/apache/solr/util/TestHarness.java Mon Dec 21 11:39:57 2015
@@ -17,22 +17,21 @@
 
 package org.apache.solr.util;
 
+import java.io.IOException;
+import java.io.StringWriter;
+import java.nio.file.Path;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
 import com.google.common.collect.ImmutableList;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.NamedList.NamedListEntry;
-import org.apache.solr.core.CloudConfig;
-import org.apache.solr.core.CoreContainer;
-import org.apache.solr.core.CoreDescriptor;
-import org.apache.solr.core.CorePropertiesLocator;
-import org.apache.solr.core.CoresLocator;
-import org.apache.solr.core.NodeConfig;
-import org.apache.solr.core.SolrConfig;
-import org.apache.solr.core.SolrCore;
-import org.apache.solr.core.SolrResourceLoader;
-import org.apache.solr.core.SolrXmlConfig;
+import org.apache.solr.core.*;
 import org.apache.solr.handler.UpdateRequestHandler;
 import org.apache.solr.request.LocalSolrQueryRequest;
 import org.apache.solr.request.SolrQueryRequest;
@@ -45,14 +44,6 @@ import org.apache.solr.schema.IndexSchem
 import org.apache.solr.servlet.DirectSolrConnection;
 import org.apache.solr.update.UpdateShardHandlerConfig;
 
-import java.io.File;
-import java.io.IOException;
-import java.io.StringWriter;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-
 /**
  * This class provides a simple harness that may be useful when
  * writing testcases.
@@ -75,21 +66,21 @@ public class TestHarness extends BaseTes
    * follows the basic conventions of being a relative path in the solrHome 
    * dir. (ie: <code>${solrHome}/${coreName}/conf/${confFile}</code>
    */
-  public static SolrConfig createConfig(String solrHome, String coreName, String confFile) {
+  public static SolrConfig createConfig(Path solrHome, String coreName, String confFile) {
     // set some system properties for use by tests
     System.setProperty("solr.test.sys.prop1", "propone");
     System.setProperty("solr.test.sys.prop2", "proptwo");
     try {
-      return new SolrConfig(solrHome + File.separator + coreName, confFile, null);
+      return new SolrConfig(solrHome.resolve(coreName), confFile, null);
     } catch (Exception xany) {
       throw new RuntimeException(xany);
     }
   }
   
   /**
-   * Creates a SolrConfig object for the default test core using {@link #createConfig(String,String,String)}
+   * Creates a SolrConfig object for the default test core using {@link #createConfig(Path,String,String)}
    */
-  public static SolrConfig createConfig(String solrHome, String confFile) {
+  public static SolrConfig createConfig(Path solrHome, String confFile) {
     return createConfig(solrHome, SolrTestCaseJ4.DEFAULT_TEST_CORENAME, confFile);
   }
 
@@ -148,7 +139,7 @@ public class TestHarness extends BaseTes
    * @param solrHome the solr home directory
    * @param solrXml the text of a solrxml
    */
-  public TestHarness(String solrHome, String solrXml) {
+  public TestHarness(Path solrHome, String solrXml) {
     this(new SolrResourceLoader(solrHome), solrXml);
   }
 
@@ -211,7 +202,7 @@ public class TestHarness extends BaseTes
 
     @Override
     public List<CoreDescriptor> discover(CoreContainer cc) {
-      return ImmutableList.of(new CoreDescriptor(cc, coreName, coreName,
+      return ImmutableList.of(new CoreDescriptor(cc, coreName, cc.getCoreRootDirectory().resolve(coreName),
           CoreDescriptor.CORE_DATADIR, dataDir,
           CoreDescriptor.CORE_CONFIG, solrConfig,
           CoreDescriptor.CORE_SCHEMA, schema,

Modified: lucene/dev/branches/lucene6835/solr/webapp/web/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/webapp/web/WEB-INF/web.xml?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/webapp/web/WEB-INF/web.xml (original)
+++ lucene/dev/branches/lucene6835/solr/webapp/web/WEB-INF/web.xml Mon Dec 21 11:39:57 2015
@@ -141,7 +141,12 @@
 
   <servlet-mapping>
     <servlet-name>LoadAdminUI</servlet-name>
-    <url-pattern>/admin.html</url-pattern>
+    <url-pattern>/old.html</url-pattern>
+  </servlet-mapping>
+
+  <servlet-mapping>
+    <servlet-name>LoadAdminUI</servlet-name>
+    <url-pattern>/index.html</url-pattern>
   </servlet-mapping>
 
   <servlet-mapping>
@@ -156,7 +161,7 @@
   </mime-mapping>
 
   <welcome-file-list>
-    <welcome-file>admin.html</welcome-file>
+    <welcome-file>index.html</welcome-file>
   </welcome-file-list>
 
 </web-app>

Modified: lucene/dev/branches/lucene6835/solr/webapp/web/css/angular/collections.css
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/webapp/web/css/angular/collections.css?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/webapp/web/css/angular/collections.css (original)
+++ lucene/dev/branches/lucene6835/solr/webapp/web/css/angular/collections.css Mon Dec 21 11:39:57 2015
@@ -273,7 +273,7 @@ limitations under the License.
   padding-right: 21px;
 }
 
-#content #collections #add_advanced .open {
+#content #collections #add_advanced.open {
     background-image: url( ../../img/ico/chevron-small.png );
 }
 

Modified: lucene/dev/branches/lucene6835/solr/webapp/web/css/angular/common.css
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/webapp/web/css/angular/common.css?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/webapp/web/css/angular/common.css (original)
+++ lucene/dev/branches/lucene6835/solr/webapp/web/css/angular/common.css Mon Dec 21 11:39:57 2015
@@ -755,8 +755,23 @@ pre.syntax .tex .formula
   top: -20px;
 }
 
-.other-ui-link span {
+.other-ui-link span,
+.new-ui-warning span.help {
   background-image: url( ../../img/ico/information-white.png );
   right: 0px;
   padding-left: 16px;
-}
\ No newline at end of file
+}
+
+.new-ui-warning {
+  position: absolute;
+  left: 150px;
+  top: -20px;
+  align: center;
+  color: red;
+  font-weight: bold;
+}
+.new-ui-warning a.ul {
+  color: red;
+  font-weight: bold;
+  text-decoration: underline;
+}

Modified: lucene/dev/branches/lucene6835/solr/webapp/web/css/angular/menu.css
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/webapp/web/css/angular/menu.css?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/webapp/web/css/angular/menu.css (original)
+++ lucene/dev/branches/lucene6835/solr/webapp/web/css/angular/menu.css Mon Dec 21 11:39:57 2015
@@ -278,7 +278,7 @@ limitations under the License.
 .sub-menu .analysis a { background-image: url( ../../img/ico/funnel.png ); }
 .sub-menu .documents a { background-image: url( ../../img/ico/documents-stack.png ); }
 .sub-menu .files a { background-image: url( ../../img/ico/folder.png ); }
-.sub-menu .schema-browser a { background-image: url( ../../img/ico/book-open-text.png ); }
+.sub-menu .schema a { background-image: url( ../../img/ico/book-open-text.png ); }
 .sub-menu .replication a { background-image: url( ../../img/ico/node.png ); }
 .sub-menu .distribution a { background-image: url( ../../img/ico/node-select.png ); }
 .sub-menu .ping a { background-image: url( ../../img/ico/system-monitor.png ); }

Modified: lucene/dev/branches/lucene6835/solr/webapp/web/css/styles/common.css
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/webapp/web/css/styles/common.css?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/webapp/web/css/styles/common.css (original)
+++ lucene/dev/branches/lucene6835/solr/webapp/web/css/styles/common.css Mon Dec 21 11:39:57 2015
@@ -707,8 +707,11 @@ pre.syntax .tex .formula
   top: -20px;
 }
 
-.other-ui-link span {
+.other-ui-link span.help {
   background-image: url( ../../img/ico/information-white.png );
   right: 0px;
   padding-left: 16px;
+}
+.other-ui-link a.ul {
+  text-decoration: underline;
 }
\ No newline at end of file

Modified: lucene/dev/branches/lucene6835/solr/webapp/web/index.html
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/webapp/web/index.html?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/webapp/web/index.html (original)
+++ lucene/dev/branches/lucene6835/solr/webapp/web/index.html Mon Dec 21 11:39:57 2015
@@ -39,7 +39,7 @@ limitations under the License.
   <link rel="stylesheet" type="text/css" href="css/angular/documents.css?_=${version}">
   <link rel="stylesheet" type="text/css" href="css/angular/query.css?_=${version}">
   <link rel="stylesheet" type="text/css" href="css/angular/replication.css?_=${version}">
-  <link rel="stylesheet" type="text/css" href="css/angular/schema-browser.css?_=${version}">
+  <link rel="stylesheet" type="text/css" href="css/angular/schema.css?_=${version}">
   <link rel="stylesheet" type="text/css" href="css/angular/segments.css?_=${version}">
   <link rel="stylesheet" type="text/css" href="css/angular/threads.css?_=${version}">
   <link rel="stylesheet" type="text/css" href="css/angular/chosen.css?_=${version}">
@@ -74,13 +74,13 @@ limitations under the License.
   <script src="js/angular/controllers/query.js"></script>
   <script src="js/angular/controllers/plugins.js"></script>
   <script src="js/angular/controllers/replication.js"></script>
-  <script src="js/angular/controllers/schema-browser.js"></script>
+  <script src="js/angular/controllers/schema.js"></script>
   <script src="js/angular/controllers/segments.js"></script>
 
 </head>
 <body ng-controller="MainController">
 
-  <div id="wrapper">
+  <div id="wrapper" scrollable-when-small>
 
     <div id="header">
 
@@ -121,8 +121,10 @@ limitations under the License.
         <div class="exception">{{exception.msg}}</div>
       </div>
 
-      <div class="other-ui-link">
-        <a href="/solr/">Original UI</a><a target="_blank" href="http://wiki.apache.org/solr/AngularUI">&nbsp;<span class="help"></span></a>
+      <div class="new-ui-warning">
+        This is an experimental UI. Report bugs <a class="ul" target="_blank" href="http://issues.apache.org/jira/browse/SOLR">here</a>.
+        For the old UI click <a class="ul" href="/solr/old.html">here</a>
+        <a target="_blank" href="http://wiki.apache.org/solr/AngularUI">&nbsp;<span class="help"></span></a>
       </div>
 
       <div id="content-wrapper">
@@ -183,7 +185,7 @@ limitations under the License.
               <li class="documents" ng-class="{active:page=='documents'}"><a href="#/{{currentCollection.name}}/documents"><span>Documents</span></a></li>
               <li class="files" ng-class="{active:page=='files'}"><a href="#/{{currentCollection.name}}/files"><span>Files</span></a></li>
               <li class="query" ng-class="{active:page=='query'}"><a href="#/{{currentCollection.name}}/query"><span>Query</span></a></li>
-              <li class="schema-browser" ng-class="{active:page=='schema-browser'}"><a href="#/{{currentCollection.name}}/schema-browser"><span>Schema Browser</span></a></li>
+              <li class="schema" ng-class="{active:page=='schema'}"><a href="#/{{currentCollection.name}}/schema"><span>Schema</span></a></li>
         </ul>
           </div>
           <div id="core-selector">
@@ -210,7 +212,7 @@ limitations under the License.
               <li class="plugins" ng-class="{active:page=='plugins'}"><a href="#/{{currentCore.name}}/plugins"><span>Plugins / Stats</span></a></li>
               <li ng-hide="isCloudEnabled" class="query" ng-class="{active:page=='query'}"><a href="#/{{currentCore.name}}/query"><span>Query</span></a></li>
               <li class="replication" ng-class="{active:page=='replication'}"><a href="#/{{currentCore.name}}/replication"><span>Replication</span></a></li>
-              <li ng-hide="isCloudEnabled" class="schema-browser" ng-class="{active:page=='schema-browser'}"><a href="#/{{currentCore.name}}/schema-browser"><span>Schema Browser</span></a></li>
+              <li ng-hide="isCloudEnabled" class="schema" ng-class="{active:page=='schema'}"><a href="#/{{currentCore.name}}/schema"><span>Schema</span></a></li>
               <li class="segments" ng-class="{active:page=='segments'}"><a href="#/{{currentCore.name}}/segments"><span>Segments info</span></a></li>
       </ul>
           </div>

Modified: lucene/dev/branches/lucene6835/solr/webapp/web/js/angular/app.js
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6835/solr/webapp/web/js/angular/app.js?rev=1721134&r1=1721133&r2=1721134&view=diff
==============================================================================
--- lucene/dev/branches/lucene6835/solr/webapp/web/js/angular/app.js (original)
+++ lucene/dev/branches/lucene6835/solr/webapp/web/js/angular/app.js Mon Dec 21 11:39:57 2015
@@ -121,9 +121,9 @@ solrAdminApp.config([
         templateUrl: 'partials/dataimport.html',
         controller: 'DataImportController'
       }).
-      when('/:core/schema-browser', {
-        templateUrl: 'partials/schema-browser.html',
-        controller: 'SchemaBrowserController'
+      when('/:core/schema', {
+        templateUrl: 'partials/schema.html',
+        controller: 'SchemaController'
       }).
       when('/:core/segments', {
         templateUrl: 'partials/segments.html',
@@ -136,7 +136,8 @@ solrAdminApp.config([
 .constant('Constants', {
   IS_ROOT_PAGE: 1,
   IS_CORE_PAGE: 2,
-  IS_COLLECTION_PAGE: 3
+  IS_COLLECTION_PAGE: 3,
+  ROOT_URL: "/"
 })
 .filter('highlight', function($sce) {
   return function(input, lang) {
@@ -155,6 +156,45 @@ solrAdminApp.config([
     }
   };
 })
+.directive('escapePressed', function () {
+    return function (scope, element, attrs) {
+        element.bind("keydown keypress", function (event) {
+            if(event.which === 27) {
+                scope.$apply(function (){
+                    scope.$eval(attrs.escapePressed);
+                });
+                event.preventDefault();
+            }
+        });
+    };
+})
+.directive('focusWhen', function($timeout) {
+  return {
+    link: function(scope, element, attrs) {
+      scope.$watch(attrs.focusWhen, function(value) {
+        if(value === true) {
+          $timeout(function() {
+            element[0].focus();
+          }, 100);
+        }
+      });
+    }
+  };
+})
+.directive('scrollableWhenSmall', function($window) {
+  return {
+    link: function(scope, element, attrs) {
+      var w = angular.element($window);
+
+      var checkFixedMenu = function() {
+        var shouldScroll = w.height() < (element.height() + $('#header').height() + 40);
+        element.toggleClass( 'scroll', shouldScroll);
+      };
+      w.bind('resize', checkFixedMenu);
+      w.bind('load', checkFixedMenu);
+    }
+  }
+})
 .filter('readableSeconds', function() {
     return function(input) {
     seconds = parseInt(input||0, 10);
@@ -679,8 +719,6 @@ var solr_admin = function( app_config )
         // load cores (indexInfo = false
         success : function( response )
         {
-          check_fixed_menu();
-          $( window ).resize( check_fixed_menu );
 
           var system_url = config.solr_path + '/admin/info/system?wt=json';
           $.ajax
@@ -761,9 +799,4 @@ var solr_admin = function( app_config )
                   '</code></pre></div>'
                 );
   };
-
-  check_fixed_menu = function check_fixed_menu()
-  {
-    $( '#wrapper' ).toggleClass( 'scroll', $( window ).height() < $( '#menu-wrapper' ).height() + $( '#header' ).height() + 40 );
-  }
 */