You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ro...@apache.org on 2015/11/20 13:42:43 UTC

svn commit: r1715344 [1/2] - in /lucene/dev/branches/branch_5x: ./ solr/ solr/contrib/ solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/ solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/ solr/contrib/...

Author: romseygeek
Date: Fri Nov 20 12:42:42 2015
New Revision: 1715344

URL: http://svn.apache.org/viewvc?rev=1715344&view=rev
Log:
SOLR-8302: SolrResourceLoader takes a Path for its instance directory

Modified:
    lucene/dev/branches/branch_5x/   (props changed)
    lucene/dev/branches/branch_5x/solr/   (props changed)
    lucene/dev/branches/branch_5x/solr/CHANGES.txt   (contents, props changed)
    lucene/dev/branches/branch_5x/solr/contrib/   (props changed)
    lucene/dev/branches/branch_5x/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/SimplePropertiesWriter.java
    lucene/dev/branches/branch_5x/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestZKPropertiesWriter.java
    lucene/dev/branches/branch_5x/solr/contrib/extraction/src/test/org/apache/solr/handler/extraction/ParseContextConfigTest.java
    lucene/dev/branches/branch_5x/solr/contrib/map-reduce/src/java/org/apache/solr/hadoop/SolrRecordWriter.java
    lucene/dev/branches/branch_5x/solr/contrib/morphlines-core/src/java/org/apache/solr/morphlines/solr/SolrLocator.java
    lucene/dev/branches/branch_5x/solr/core/   (props changed)
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/cloud/CloudConfigSetService.java
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/cloud/CloudUtil.java
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/cloud/ZkSolrResourceLoader.java
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/Config.java
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/ConfigSetService.java
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/CoreContainer.java
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/NodeConfig.java
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/SolrConfig.java
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/SolrCore.java
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/SolrXmlConfig.java
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/admin/SystemInfoHandler.java
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/response/TextResponseWriter.java
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/schema/IndexSchema.java
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchemaFactory.java
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java
    lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/analysis/TestWordDelimiterFilterFactory.java
    lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/client/solrj/embedded/TestEmbeddedSolrServerConstructors.java
    lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/CollectionsAPIDistributedZkTest.java
    lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/SolrXmlInZkTest.java
    lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/TestLeaderElectionZkExpiry.java
    lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/TestZkChroot.java
    lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/core/ResourceLoaderTest.java
    lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/core/TestArbitraryIndexDir.java
    lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/core/TestConfig.java   (contents, props changed)
    lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/core/TestConfigSetProperties.java
    lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/core/TestConfigSets.java
    lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/core/TestCoreContainer.java
    lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/core/TestCoreDiscovery.java
    lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/core/TestLazyCores.java
    lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/core/TestShardHandlerFactory.java
    lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/core/TestSolrXml.java
    lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/handler/admin/CoreAdminCreateDiscoverTest.java
    lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/rest/TestManagedResource.java
    lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/rest/TestManagedResourceStorage.java
    lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/rest/TestRestManager.java
    lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/schema/DateFieldTest.java
    lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/schema/OpenExchangeRatesOrgProviderTest.java
    lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/schema/PrimitiveFieldTypeTest.java
    lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/update/SolrIndexConfigTest.java
    lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/util/TestSystemIdResolver.java
    lucene/dev/branches/branch_5x/solr/solrj/   (props changed)
    lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/common/util/JavaBinCodec.java
    lucene/dev/branches/branch_5x/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/AbstractEmbeddedSolrServerTestCase.java
    lucene/dev/branches/branch_5x/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/TestEmbeddedSolrServer.java
    lucene/dev/branches/branch_5x/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/TestSolrProperties.java
    lucene/dev/branches/branch_5x/solr/solrj/src/test/org/apache/solr/client/solrj/request/TestCoreAdmin.java
    lucene/dev/branches/branch_5x/solr/solrj/src/test/org/apache/solr/client/solrj/response/NoOpResponseParserTest.java
    lucene/dev/branches/branch_5x/solr/solrj/src/test/org/apache/solr/client/solrj/response/QueryResponseTest.java
    lucene/dev/branches/branch_5x/solr/solrj/src/test/org/apache/solr/client/solrj/response/TestClusteringResponse.java
    lucene/dev/branches/branch_5x/solr/solrj/src/test/org/apache/solr/common/util/ContentStreamTest.java
    lucene/dev/branches/branch_5x/solr/test-framework/   (props changed)
    lucene/dev/branches/branch_5x/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java
    lucene/dev/branches/branch_5x/solr/test-framework/src/java/org/apache/solr/util/TestHarness.java

Modified: lucene/dev/branches/branch_5x/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/CHANGES.txt?rev=1715344&r1=1715343&r2=1715344&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/CHANGES.txt (original)
+++ lucene/dev/branches/branch_5x/solr/CHANGES.txt Fri Nov 20 12:42:42 2015
@@ -399,6 +399,9 @@ Other Changes
 * SOLR-8315: Removed default core checks in the dispatch filter since we don't have a default
   core anymore (Varun Thacker)
 
+* SOLR-8302: SolrResourceLoader now takes a Path as its instance directory (Alan
+  Woodward, Shawn Heisey)
+
 ==================  5.3.1 ==================
 
 Bug Fixes

Modified: lucene/dev/branches/branch_5x/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/SimplePropertiesWriter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/SimplePropertiesWriter.java?rev=1715344&r1=1715343&r2=1715344&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/SimplePropertiesWriter.java (original)
+++ lucene/dev/branches/branch_5x/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/SimplePropertiesWriter.java Fri Nov 20 12:42:42 2015
@@ -17,8 +17,6 @@ package org.apache.solr.handler.dataimpo
  * limitations under the License.
  */
 
-import static org.apache.solr.handler.dataimport.DataImportHandlerException.SEVERE;
-
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
@@ -41,6 +39,8 @@ import org.apache.solr.core.SolrCore;
 import org.apache.solr.core.SolrResourceLoader;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+
+import static org.apache.solr.handler.dataimport.DataImportHandlerException.SEVERE;
 /**
  * <p>
  *  Writes properties using {@link Properties#store} .
@@ -116,7 +116,7 @@ public class SimplePropertiesWriter exte
     } else {
       SolrCore core = dataImporter.getCore();
       if (core == null) {
-        configDir = SolrResourceLoader.locateSolrHome();
+        configDir = SolrResourceLoader.locateSolrHome().toString();
       } else {
         configDir = core.getResourceLoader().getConfigDir();
       }

Modified: lucene/dev/branches/branch_5x/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestZKPropertiesWriter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestZKPropertiesWriter.java?rev=1715344&r1=1715343&r2=1715344&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestZKPropertiesWriter.java (original)
+++ lucene/dev/branches/branch_5x/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestZKPropertiesWriter.java Fri Nov 20 12:42:42 2015
@@ -62,7 +62,7 @@ public class TestZKPropertiesWriter exte
         "dataimport-solrconfig.xml", "dataimport-schema.xml");
 
     //initCore("solrconfig.xml", "schema.xml", getFile("dih/solr").getAbsolutePath());
-    cc = createDefaultCoreContainer(getFile("dih/solr").getAbsolutePath());
+    cc = createDefaultCoreContainer(getFile("dih/solr").toPath());
   }
 
   @Before

Modified: lucene/dev/branches/branch_5x/solr/contrib/extraction/src/test/org/apache/solr/handler/extraction/ParseContextConfigTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/contrib/extraction/src/test/org/apache/solr/handler/extraction/ParseContextConfigTest.java?rev=1715344&r1=1715343&r2=1715344&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/contrib/extraction/src/test/org/apache/solr/handler/extraction/ParseContextConfigTest.java (original)
+++ lucene/dev/branches/branch_5x/solr/contrib/extraction/src/test/org/apache/solr/handler/extraction/ParseContextConfigTest.java Fri Nov 20 12:42:42 2015
@@ -18,6 +18,8 @@ package org.apache.solr.handler.extracti
  */
 
 import javax.xml.parsers.DocumentBuilderFactory;
+import java.nio.file.Paths;
+
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.core.SolrResourceLoader;
 import org.apache.tika.parser.ParseContext;
@@ -43,7 +45,7 @@ public class ParseContextConfigTest exte
     entry.appendChild(property);
     entries.appendChild(entry);
 
-    ParseContext parseContext = new ParseContextConfig(new SolrResourceLoader("."), entries).create();
+    ParseContext parseContext = new ParseContextConfig(new SolrResourceLoader(Paths.get(".")), entries).create();
 
     PDFParserConfig pdfParserConfig = parseContext.get(PDFParserConfig.class);
 

Modified: lucene/dev/branches/branch_5x/solr/contrib/map-reduce/src/java/org/apache/solr/hadoop/SolrRecordWriter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/contrib/map-reduce/src/java/org/apache/solr/hadoop/SolrRecordWriter.java?rev=1715344&r1=1715343&r2=1715344&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/contrib/map-reduce/src/java/org/apache/solr/hadoop/SolrRecordWriter.java (original)
+++ lucene/dev/branches/branch_5x/solr/contrib/map-reduce/src/java/org/apache/solr/hadoop/SolrRecordWriter.java Fri Nov 20 12:42:42 2015
@@ -16,6 +16,19 @@
  */
 package org.apache.solr.hadoop;
 
+import java.io.IOException;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Properties;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.filecache.DistributedCache;
 import org.apache.hadoop.fs.FileSystem;
@@ -35,18 +48,6 @@ import org.apache.solr.core.SolrResource
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Locale;
-import java.util.Properties;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-
 class SolrRecordWriter<K, V> extends RecordWriter<K, V> {
   
   private static final Logger LOG = LoggerFactory.getLogger(SolrRecordWriter.class);
@@ -139,12 +140,12 @@ class SolrRecordWriter<K, V> extends Rec
 
     String dataDirStr = solrDataDir.toUri().toString();
 
-    SolrResourceLoader loader = new SolrResourceLoader(solrHomeDir.toString(), null, null);
+    SolrResourceLoader loader = new SolrResourceLoader(Paths.get(solrHomeDir.toString()), null, null);
 
     LOG.info(String
         .format(Locale.ENGLISH, 
             "Constructed instance information solr.home %s (%s), instance dir %s, conf dir %s, writing index to solr.data.dir %s, with permdir %s",
-            solrHomeDir, solrHomeDir.toUri(), loader.getInstanceDir(),
+            solrHomeDir, solrHomeDir.toUri(), loader.getInstancePath(),
             loader.getConfigDir(), dataDirStr, outputShardDir));
 
     // TODO: This is fragile and should be well documented

Modified: lucene/dev/branches/branch_5x/solr/contrib/morphlines-core/src/java/org/apache/solr/morphlines/solr/SolrLocator.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/contrib/morphlines-core/src/java/org/apache/solr/morphlines/solr/SolrLocator.java?rev=1715344&r1=1715343&r2=1715344&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/contrib/morphlines-core/src/java/org/apache/solr/morphlines/solr/SolrLocator.java (original)
+++ lucene/dev/branches/branch_5x/solr/contrib/morphlines-core/src/java/org/apache/solr/morphlines/solr/SolrLocator.java Fri Nov 20 12:42:42 2015
@@ -16,6 +16,11 @@
  */
 package org.apache.solr.morphlines.solr;
 
+import javax.xml.parsers.ParserConfigurationException;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Paths;
+
 import com.google.common.base.Preconditions;
 import com.google.common.io.Files;
 import com.typesafe.config.Config;
@@ -39,10 +44,6 @@ import org.slf4j.LoggerFactory;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
 
-import javax.xml.parsers.ParserConfigurationException;
-import java.io.File;
-import java.io.IOException;
-
 /**
  * Set of configuration parameters that identify the location and schema of a Solr server or
  * SolrCloud; Based on this information this class can return the schema and a corresponding
@@ -149,7 +150,7 @@ public class SolrLocator {
       
       LOG.debug("SolrLocator loading IndexSchema from dir {}", mySolrHomeDir);
       try {
-        SolrResourceLoader loader = new SolrResourceLoader(mySolrHomeDir);
+        SolrResourceLoader loader = new SolrResourceLoader(Paths.get(mySolrHomeDir));
         SolrConfig solrConfig = new SolrConfig(loader, "solrconfig.xml", null);
         InputSource is = new InputSource(loader.openSchema("schema.xml"));
         is.setSystemId(SystemIdResolver.createSystemIdFromResourceName("schema.xml"));

Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/cloud/CloudConfigSetService.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/cloud/CloudConfigSetService.java?rev=1715344&r1=1715343&r2=1715344&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/cloud/CloudConfigSetService.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/cloud/CloudConfigSetService.java Fri Nov 20 12:42:42 2015
@@ -17,6 +17,8 @@
 
 package org.apache.solr.cloud;
 
+import java.nio.file.Paths;
+
 import org.apache.solr.core.ConfigSetService;
 import org.apache.solr.core.CoreDescriptor;
 import org.apache.solr.core.SolrResourceLoader;
@@ -35,7 +37,7 @@ public class CloudConfigSetService exten
     // TODO: Shouldn't the collection node be created by the Collections API?
     zkController.createCollectionZkNode(cd.getCloudDescriptor());
     String configName = zkController.getZkStateReader().readConfigName(cd.getCollectionName());
-    return new ZkSolrResourceLoader(cd.getInstanceDir(), configName, parentLoader.getClassLoader(),
+    return new ZkSolrResourceLoader(Paths.get(cd.getInstanceDir()), configName, parentLoader.getClassLoader(),
         cd.getSubstitutableProperties(), zkController);
   }
 

Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/cloud/CloudUtil.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/cloud/CloudUtil.java?rev=1715344&r1=1715343&r2=1715344&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/cloud/CloudUtil.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/cloud/CloudUtil.java Fri Nov 20 12:42:42 2015
@@ -102,7 +102,7 @@ public class CloudUtil {
   public static String unifiedResourcePath(SolrResourceLoader loader) {
     return (loader instanceof ZkSolrResourceLoader) ?
             ((ZkSolrResourceLoader) loader).getConfigSetZkPath() + "/" :
-            loader.getConfigDir();
+            loader.getConfigDir() + File.separator;
   }
 
   /**Read the list of public keys from ZK

Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/cloud/ZkSolrResourceLoader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/cloud/ZkSolrResourceLoader.java?rev=1715344&r1=1715343&r2=1715344&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/cloud/ZkSolrResourceLoader.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/cloud/ZkSolrResourceLoader.java Fri Nov 20 12:42:42 2015
@@ -17,6 +17,14 @@ package org.apache.solr.cloud;
  * limitations under the License.
  */
 
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Path;
+import java.util.List;
+import java.util.Properties;
+
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrException.ErrorCode;
 import org.apache.solr.common.cloud.ZkConfigManager;
@@ -27,13 +35,6 @@ import org.apache.solr.schema.ZkIndexSch
 import org.apache.zookeeper.KeeperException;
 import org.apache.zookeeper.data.Stat;
 
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.List;
-import java.util.Properties;
-
 /**
  * ResourceLoader that works with ZooKeeper.
  *
@@ -44,8 +45,7 @@ public class ZkSolrResourceLoader extend
   private ZkController zkController;
   private ZkIndexSchemaReader zkIndexSchemaReader;
 
-  public ZkSolrResourceLoader(String instanceDir, String configSet,
-      ZkController zooKeeperController) {
+  public ZkSolrResourceLoader(Path instanceDir, String configSet, ZkController zooKeeperController) {
     super(instanceDir);
     this.zkController = zooKeeperController;
     configSetZkPath = ZkConfigManager.CONFIGS_ZKNODE + "/" + configSet;
@@ -58,7 +58,7 @@ public class ZkSolrResourceLoader extend
    * otherwise it will attempt to resolve resources using any jar files found in
    * the "lib/" directory in the specified instance directory.
    */
-  public ZkSolrResourceLoader(String instanceDir, String configSet, ClassLoader parent,
+  public ZkSolrResourceLoader(Path instanceDir, String configSet, ClassLoader parent,
       Properties coreProperties, ZkController zooKeeperController) {
     super(instanceDir, parent, coreProperties);
     this.zkController = zooKeeperController;

Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/Config.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/Config.java?rev=1715344&r1=1715343&r2=1715344&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/Config.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/Config.java Fri Nov 20 12:42:42 2015
@@ -17,24 +17,6 @@
 
 package org.apache.solr.core;
 
-import org.apache.lucene.util.Version;
-import org.apache.solr.cloud.ZkSolrResourceLoader;
-import org.apache.solr.common.SolrException;
-import org.apache.solr.update.SolrIndexConfig;
-import org.apache.solr.util.DOMUtil;
-import org.apache.solr.util.SystemIdResolver;
-import org.apache.solr.common.util.XMLErrorLogger;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.apache.commons.io.IOUtils;
-
 import javax.xml.namespace.QName;
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
@@ -48,7 +30,6 @@ import javax.xml.xpath.XPath;
 import javax.xml.xpath.XPathConstants;
 import javax.xml.xpath.XPathExpressionException;
 import javax.xml.xpath.XPathFactory;
-
 import java.io.IOException;
 import java.io.InputStream;
 import java.text.ParseException;
@@ -63,6 +44,23 @@ import java.util.TreeMap;
 import java.util.TreeSet;
 import java.util.concurrent.atomic.AtomicBoolean;
 
+import org.apache.commons.io.IOUtils;
+import org.apache.lucene.util.Version;
+import org.apache.solr.cloud.ZkSolrResourceLoader;
+import org.apache.solr.common.SolrException;
+import org.apache.solr.common.util.XMLErrorLogger;
+import org.apache.solr.util.DOMUtil;
+import org.apache.solr.util.SystemIdResolver;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
 /**
  *
  */
@@ -110,7 +108,7 @@ public class Config {
   public Config(SolrResourceLoader loader, String name, InputSource is, String prefix, boolean substituteProps) throws ParserConfigurationException, IOException, SAXException
   {
     if( loader == null ) {
-      loader = new SolrResourceLoader( null );
+      loader = new SolrResourceLoader(SolrResourceLoader.locateSolrHome());
     }
     this.loader = loader;
     this.name = name;

Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/ConfigSetService.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/ConfigSetService.java?rev=1715344&r1=1715343&r2=1715344&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/ConfigSetService.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/ConfigSetService.java Fri Nov 20 12:42:42 2015
@@ -156,7 +156,7 @@ public abstract class ConfigSetService {
     @Override
     public SolrResourceLoader createCoreResourceLoader(CoreDescriptor cd) {
       Path instanceDir = locateInstanceDir(cd);
-      return new SolrResourceLoader(instanceDir.toString(), parentLoader.getClassLoader(), cd.getSubstitutableProperties());
+      return new SolrResourceLoader(instanceDir, parentLoader.getClassLoader(), cd.getSubstitutableProperties());
     }
 
     @Override
@@ -204,7 +204,8 @@ public abstract class ConfigSetService {
       Path schemaFile = Paths.get(solrConfig.getResourceLoader().getConfigDir()).resolve(resourceNameToBeUsed);
       if (Files.exists(schemaFile)) {
         try {
-          return schemaCache.get(cacheName(schemaFile), new Callable<IndexSchema>() {
+          String cachedName = cacheName(schemaFile);
+          return schemaCache.get(cachedName, new Callable<IndexSchema>() {
             @Override
             public IndexSchema call() throws Exception {
               logger.info("Creating new index schema for core {}", cd.getName());

Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/CoreContainer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/CoreContainer.java?rev=1715344&r1=1715343&r2=1715344&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/CoreContainer.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/CoreContainer.java Fri Nov 20 12:42:42 2015
@@ -17,8 +17,9 @@
 
 package org.apache.solr.core;
 
-import java.io.File;
 import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -61,7 +62,6 @@ import org.apache.solr.security.PKIAuthe
 import org.apache.solr.security.SecurityPluginHolder;
 import org.apache.solr.update.UpdateShardHandler;
 import org.apache.solr.util.DefaultSolrThreadFactory;
-import org.apache.solr.util.FileUtils;
 import org.apache.zookeeper.KeeperException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -178,7 +178,7 @@ public class CoreContainer {
    * @see #load()
    */
   public CoreContainer(SolrResourceLoader loader) {
-    this(SolrXmlConfig.fromSolrHome(loader, loader.getInstanceDir()));
+    this(SolrXmlConfig.fromSolrHome(loader, loader.getInstancePath()));
   }
 
   /**
@@ -188,7 +188,7 @@ public class CoreContainer {
    * @see #load()
    */
   public CoreContainer(String solrHome) {
-    this(new SolrResourceLoader(solrHome));
+    this(new SolrResourceLoader(Paths.get(solrHome)));
   }
 
   /**
@@ -216,7 +216,7 @@ public class CoreContainer {
   
   public CoreContainer(NodeConfig config, Properties properties, CoresLocator locator, boolean asyncSolrCoreLoad) {
     this.loader = config.getSolrResourceLoader();
-    this.solrHome = loader.getInstanceDir();
+    this.solrHome = loader.getInstancePath().toString();
     this.cfg = checkNotNull(config);
     this.coresLocator = locator;
     this.containerProperties = new Properties(properties);
@@ -340,6 +340,10 @@ public class CoreContainer {
     cfg = null;
     containerProperties = null;
   }
+
+  public static CoreContainer createAndLoad(Path solrHome) {
+    return createAndLoad(solrHome, solrHome.resolve(SolrXmlConfig.SOLR_XML_FILE));
+  }
   
   /**
    * Create a new CoreContainer and load its cores
@@ -347,7 +351,7 @@ public class CoreContainer {
    * @param configFile the file containing this container's configuration
    * @return a loaded CoreContainer
    */
-  public static CoreContainer createAndLoad(String solrHome, File configFile) {
+  public static CoreContainer createAndLoad(Path solrHome, Path configFile) {
     SolrResourceLoader loader = new SolrResourceLoader(solrHome);
     CoreContainer cc = new CoreContainer(SolrXmlConfig.fromFile(loader, configFile));
     try {
@@ -375,15 +379,18 @@ public class CoreContainer {
    * Load the cores defined for this CoreContainer
    */
   public void load()  {
-    log.info("Loading cores into CoreContainer [instanceDir={}]", loader.getInstanceDir());
+    log.info("Loading cores into CoreContainer [instanceDir={}]", loader.getInstancePath());
 
     // add the sharedLib to the shared resource loader before initializing cfg based plugins
     String libDir = cfg.getSharedLibDirectory();
     if (libDir != null) {
-      File f = FileUtils.resolvePath(new File(solrHome), libDir);
-      log.info("loading shared library: " + f.getAbsolutePath());
-      loader.addToClassLoader(libDir, null, false);
-      loader.reloadLuceneSPI();
+      Path libPath = loader.getInstancePath().resolve(libDir);
+      try {
+        loader.addToClassLoader(SolrResourceLoader.getURLs(libPath));
+        loader.reloadLuceneSPI();
+      } catch (IOException e) {
+        log.warn("Couldn't add files from {} to classpath: {}", libPath, e.getMessage());
+      }
     }
 
 

Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/NodeConfig.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/NodeConfig.java?rev=1715344&r1=1715343&r2=1715344&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/NodeConfig.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/NodeConfig.java Fri Nov 20 12:42:42 2015
@@ -18,7 +18,6 @@ package org.apache.solr.core;
  */
 
 import java.nio.file.Path;
-import java.nio.file.Paths;
 import java.util.Properties;
 
 import org.apache.solr.common.SolrException;
@@ -221,17 +220,17 @@ public class NodeConfig {
     public NodeConfigBuilder(String nodeName, SolrResourceLoader loader) {
       this.nodeName = nodeName;
       this.loader = loader;
-      this.coreRootDirectory = Paths.get(loader.getInstanceDir());
-      this.configSetBaseDirectory = Paths.get(loader.getInstanceDir()).resolve("configsets");
+      this.coreRootDirectory = loader.getInstancePath();
+      this.configSetBaseDirectory = loader.getInstancePath().resolve("configsets");
     }
 
     public NodeConfigBuilder setCoreRootDirectory(String coreRootDirectory) {
-      this.coreRootDirectory = Paths.get(loader.getInstanceDir()).resolve(coreRootDirectory);
+      this.coreRootDirectory = loader.getInstancePath().resolve(coreRootDirectory);
       return this;
     }
 
     public NodeConfigBuilder setConfigSetBaseDirectory(String configSetBaseDirectory) {
-      this.configSetBaseDirectory = Paths.get(loader.resolve(configSetBaseDirectory));
+      this.configSetBaseDirectory = loader.getInstancePath().resolve(configSetBaseDirectory);
       return this;
     }
 

Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/SolrConfig.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/SolrConfig.java?rev=1715344&r1=1715343&r2=1715344&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/SolrConfig.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/SolrConfig.java Fri Nov 20 12:42:42 2015
@@ -22,29 +22,19 @@ import com.google.common.base.Charsets;
 
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.xpath.XPathConstants;
-
-import java.io.File;
-import java.io.FileFilter;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
+import java.net.MalformedURLException;
+import java.net.URL;
 import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-import java.util.UUID;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import com.google.common.collect.ImmutableList;
-
 import org.apache.lucene.index.IndexDeletionPolicy;
 import org.apache.lucene.search.BooleanQuery;
 import org.apache.lucene.util.Version;
@@ -70,8 +60,6 @@ import org.apache.solr.update.UpdateLog;
 import org.apache.solr.update.processor.UpdateRequestProcessorChain;
 import org.apache.solr.update.processor.UpdateRequestProcessorFactory;
 import org.apache.solr.util.DOMUtil;
-import org.apache.solr.util.FileUtils;
-import org.apache.solr.util.RegexFileFilter;
 import org.noggit.JSONParser;
 import org.noggit.ObjectBuilder;
 import org.slf4j.Logger;
@@ -81,9 +69,9 @@ import org.w3c.dom.NodeList;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
 
-import static org.apache.solr.common.util.Utils.makeMap;
 import static org.apache.solr.common.params.CommonParams.NAME;
 import static org.apache.solr.common.params.CommonParams.PATH;
+import static org.apache.solr.common.util.Utils.makeMap;
 import static org.apache.solr.core.ConfigOverlay.ZNODEVER;
 import static org.apache.solr.core.SolrConfig.PluginOpts.LAZY;
 import static org.apache.solr.core.SolrConfig.PluginOpts.MULTI_OK;
@@ -168,7 +156,7 @@ public class SolrConfig extends Config i
    * @param name        the configuration name used by the loader if the stream is null
    * @param is          the configuration stream
    */
-  public SolrConfig(String instanceDir, String name, InputSource is)
+  public SolrConfig(Path instanceDir, String name, InputSource is)
       throws ParserConfigurationException, IOException, SAXException {
     this(new SolrResourceLoader(instanceDir), name, is);
   }
@@ -181,7 +169,7 @@ public class SolrConfig extends Config i
       if (loader instanceof ZkSolrResourceLoader) {
         resource = name;
       } else {
-        resource = loader.getConfigDir() + name;
+        resource = Paths.get(loader.getConfigDir()).resolve(name).toString();
       }
       throw new SolrException(ErrorCode.SERVER_ERROR, "Error loading solr config from " + resource, e);
     }
@@ -759,32 +747,38 @@ public class SolrConfig extends Config i
 
     log.info("Adding specified lib dirs to ClassLoader");
     SolrResourceLoader loader = getResourceLoader();
+    List<URL> urls = new ArrayList<>();
 
-    try {
-      for (int i = 0; i < nodes.getLength(); i++) {
-        Node node = nodes.item(i);
-
-        String baseDir = DOMUtil.getAttr(node, "dir");
-        String path = DOMUtil.getAttr(node, PATH);
-        if (null != baseDir) {
-          // :TODO: add support for a simpler 'glob' mutually exclusive of regex
-          String regex = DOMUtil.getAttr(node, "regex");
-          FileFilter filter = (null == regex) ? null : new RegexFileFilter(regex);
-          loader.addToClassLoader(baseDir, filter, false);
-        } else if (null != path) {
-          final File file = FileUtils.resolvePath(new File(loader.getInstanceDir()), path);
-          loader.addToClassLoader(file.getParent(), new FileFilter() {
-            @Override
-            public boolean accept(File pathname) {
-              return pathname.equals(file);
-            }
-          }, false);
-        } else {
-          throw new RuntimeException(
-              "lib: missing mandatory attributes: 'dir' or 'path'");
+    for (int i = 0; i < nodes.getLength(); i++) {
+      Node node = nodes.item(i);
+      String baseDir = DOMUtil.getAttr(node, "dir");
+      String path = DOMUtil.getAttr(node, PATH);
+      if (null != baseDir) {
+        // :TODO: add support for a simpler 'glob' mutually exclusive of regex
+        Path dir = loader.getInstancePath().resolve(baseDir);
+        String regex = DOMUtil.getAttr(node, "regex");
+        try {
+          if (regex == null)
+            urls.addAll(SolrResourceLoader.getURLs(dir));
+          else
+            urls.addAll(SolrResourceLoader.getFilteredURLs(dir, regex));
+        } catch (IOException e) {
+          log.warn("Couldn't add files from {} filtered by {} to classpath: {}", dir, regex, e.getMessage());
+        }
+      } else if (null != path) {
+        final Path dir = loader.getInstancePath().resolve(path);
+        try {
+          urls.add(dir.toUri().toURL());
+        } catch (MalformedURLException e) {
+          log.warn("Couldn't add file {} to classpath: {}", dir, e.getMessage());
         }
+      } else {
+        throw new RuntimeException("lib: missing mandatory attributes: 'dir' or 'path'");
       }
-    } finally {
+    }
+
+    if (urls.size() > 0) {
+      loader.addToClassLoader(urls);
       loader.reloadLuceneSPI();
     }
   }

Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/SolrCore.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/SolrCore.java?rev=1715344&r1=1715343&r2=1715344&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/SolrCore.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/SolrCore.java Fri Nov 20 12:42:42 2015
@@ -17,9 +17,6 @@
 
 package org.apache.solr.core;
 
-import static com.google.common.base.Preconditions.*;
-import static org.apache.solr.common.params.CommonParams.*;
-
 import java.io.Closeable;
 import java.io.File;
 import java.io.FileNotFoundException;
@@ -31,22 +28,7 @@ import java.lang.reflect.Constructor;
 import java.net.URL;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.NoSuchFileException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.IdentityHashMap;
-import java.util.LinkedHashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-import java.util.StringTokenizer;
+import java.util.*;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
@@ -94,20 +76,7 @@ import org.apache.solr.handler.component
 import org.apache.solr.logging.MDCLoggingContext;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.request.SolrRequestHandler;
-import org.apache.solr.response.BinaryResponseWriter;
-import org.apache.solr.response.CSVResponseWriter;
-import org.apache.solr.response.JSONResponseWriter;
-import org.apache.solr.response.PHPResponseWriter;
-import org.apache.solr.response.PHPSerializedResponseWriter;
-import org.apache.solr.response.PythonResponseWriter;
-import org.apache.solr.response.QueryResponseWriter;
-import org.apache.solr.response.RawResponseWriter;
-import org.apache.solr.response.RubyResponseWriter;
-import org.apache.solr.response.SchemaXmlResponseWriter;
-import org.apache.solr.response.SmileResponseWriter;
-import org.apache.solr.response.SolrQueryResponse;
-import org.apache.solr.response.SortingResponseWriter;
-import org.apache.solr.response.XMLResponseWriter;
+import org.apache.solr.response.*;
 import org.apache.solr.response.transform.TransformerFactory;
 import org.apache.solr.rest.ManagedResourceStorage;
 import org.apache.solr.rest.ManagedResourceStorage.StorageIO;
@@ -147,6 +116,9 @@ import org.apache.zookeeper.data.Stat;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.apache.solr.common.params.CommonParams.PATH;
+
 /**
  *
  */
@@ -763,7 +735,7 @@ public final class SolrCore implements S
     this.dataDir = initDataDir(dataDir, config, coreDescriptor);
     this.ulogDir = initUpdateLogDir(coreDescriptor);
 
-    log.info("[{}] Opening new SolrCore at [{}], dataDir=[{}]", logid, resourceLoader.getInstanceDir(), dataDir);
+    log.info("[{}] Opening new SolrCore at [{}], dataDir=[{}]", logid, resourceLoader.getInstancePath(), dataDir);
 
     checkVersionFieldExistsInSchema(schema, coreDescriptor);
 
@@ -2465,7 +2437,7 @@ public final class SolrCore implements S
     lst.add("coreName", name==null ? "(null)" : name);
     lst.add("startTime", startTime);
     lst.add("refCount", getOpenCount());
-    lst.add("instanceDir", resourceLoader.getInstanceDir());
+    lst.add("instanceDir", resourceLoader.getInstancePath());
     lst.add("indexDir", getIndexDir());
 
     CoreDescriptor cd = getCoreDescriptor();

Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java?rev=1715344&r1=1715343&r2=1715344&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java Fri Nov 20 12:42:42 2015
@@ -23,22 +23,23 @@ import javax.naming.NamingException;
 import javax.naming.NoInitialContextException;
 import java.io.Closeable;
 import java.io.File;
-import java.io.FileFilter;
-import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.lang.reflect.Constructor;
-import java.net.MalformedURLException;
-import java.net.URI;
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.nio.charset.CharacterCodingException;
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
+import java.nio.file.DirectoryStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.PathMatcher;
 import java.nio.file.Paths;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
@@ -70,7 +71,6 @@ import org.apache.solr.schema.ManagedInd
 import org.apache.solr.schema.SimilarityFactory;
 import org.apache.solr.search.QParserPlugin;
 import org.apache.solr.update.processor.UpdateRequestProcessorFactory;
-import org.apache.solr.util.FileUtils;
 import org.apache.solr.util.plugin.SolrCoreAware;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -91,7 +91,7 @@ public class SolrResourceLoader implemen
   };
 
   protected URLClassLoader classLoader;
-  private final String instanceDir;
+  private final Path instanceDir;
   private String dataDir;
   
   private final List<SolrCoreAware> waitingForCore = Collections.synchronizedList(new ArrayList<SolrCoreAware>());
@@ -116,6 +116,40 @@ public class SolrResourceLoader implemen
     }
     return managedResourceRegistry; 
   }
+
+  public SolrResourceLoader() {
+    this(SolrResourceLoader.locateSolrHome(), null, null);
+  }
+
+  /**
+   * <p>
+   * This loader will delegate to the context classloader when possible,
+   * otherwise it will attempt to resolve resources using any jar files
+   * found in the "lib/" directory in the specified instance directory.
+   * If the instance directory is not specified (=null), SolrResourceLoader#locateInstanceDir will provide one.
+   */
+  public SolrResourceLoader(Path instanceDir, ClassLoader parent)
+  {
+    this(instanceDir, parent, null);
+  }
+
+  /** Use {@link #SolrResourceLoader(Path, ClassLoader)} */
+  @Deprecated
+  public SolrResourceLoader(String instanceDir, ClassLoader parent) {
+    this(Paths.get(instanceDir), parent);
+  }
+
+  public SolrResourceLoader(Path instanceDir) {
+    this(instanceDir, null, null);
+  }
+
+  /**
+   * Use {@link #SolrResourceLoader(Path)}
+   */
+  @Deprecated
+  public SolrResourceLoader(String instanceDir) {
+    this(Paths.get(instanceDir));
+  }
   
   /**
    * <p>
@@ -127,86 +161,78 @@ public class SolrResourceLoader implemen
    * @param instanceDir - base directory for this resource loader, if null locateSolrHome() will be used.
    * @see #locateSolrHome
    */
-  public SolrResourceLoader( String instanceDir, ClassLoader parent, Properties coreProperties )
-  {
-    if( instanceDir == null ) {
-      this.instanceDir = SolrResourceLoader.locateSolrHome();
-      log.info("new SolrResourceLoader for deduced Solr Home: '{}'", 
-               this.instanceDir);
+  public SolrResourceLoader(Path instanceDir, ClassLoader parent, Properties coreProperties) {
+    if (instanceDir == null) {
+      this.instanceDir = SolrResourceLoader.locateSolrHome().toAbsolutePath().normalize();
+      log.info("new SolrResourceLoader for deduced Solr Home: '{}'", this.instanceDir);
     } else{
-      this.instanceDir = normalizeDir(instanceDir);
-      log.info("new SolrResourceLoader for directory: '{}'",
-               this.instanceDir);
+      this.instanceDir = instanceDir.toAbsolutePath().normalize();
+      log.info("new SolrResourceLoader for directory: '{}'", this.instanceDir);
     }
-    
-    this.classLoader = createClassLoader(null, parent);
+
+    if (parent == null)
+      parent = Thread.currentThread().getContextClassLoader();
+    this.classLoader = new URLClassLoader(new URL[0], parent);
+
     /* 
      * Skip the lib subdirectory when we are loading from the solr home.
      * Otherwise load it, so core lib directories still get loaded.
      * The default sharedLib will pick this up later, and if the user has
      * changed sharedLib, then we don't want to load that location anyway.
      */
-    if (! this.instanceDir.equals(SolrResourceLoader.locateSolrHome())) {
-      addToClassLoader("./lib/", null, true);
-      reloadLuceneSPI();
+    if (!this.instanceDir.equals(SolrResourceLoader.locateSolrHome())) {
+      Path libDir = this.instanceDir.resolve("lib");
+      if (Files.exists(libDir)) {
+        try {
+          addToClassLoader(getURLs(libDir));
+        } catch (IOException e) {
+          log.warn("Couldn't add files from {} to classpath: {}", libDir, e.getMessage());
+        }
+        reloadLuceneSPI();
+      }
     }
     this.coreProperties = coreProperties;
   }
 
   /**
-   * <p>
-   * This loader will delegate to the context classloader when possible,
-   * otherwise it will attempt to resolve resources using any jar files
-   * found in the "lib/" directory in the specified instance directory.
-   * If the instance directory is not specified (=null), SolrResourceLoader#locateInstanceDir will provide one.
+   * Use {@link #SolrResourceLoader(Path, ClassLoader, Properties)}
    */
-  public SolrResourceLoader( String instanceDir, ClassLoader parent )
-  {
-    this(instanceDir, parent, null);
+  @Deprecated
+  public SolrResourceLoader(String instanceDir, ClassLoader parent, Properties properties) {
+    this(Paths.get(instanceDir), parent, properties);
   }
 
   /**
-   * Adds every file/dir found in the baseDir which passes the specified Filter
-   * to the ClassLoader used by this ResourceLoader.  This method <b>MUST</b>
+   * Adds URLs to the ResourceLoader's internal classloader.  This method <b>MUST</b>
    * only be called prior to using this ResourceLoader to get any resources, otherwise
    * its behavior will be non-deterministic. You also have to {link @reloadLuceneSPI}
    * before using this ResourceLoader.
-   * 
-   * <p>This method will quietly ignore missing or non-directory <code>baseDir</code>
-   *  folder. 
    *
-   * @param baseDir base directory whose children (either jars or directories of
-   *                classes) will be in the classpath, will be resolved relative
-   *                the instance dir.
-   * @param filter The filter files must satisfy, if null all files will be accepted.
-   * @param quiet  Be quiet if baseDir does not point to a directory or if no file is 
-   *               left after applying the filter. 
-   */
-  void addToClassLoader(final String baseDir, final FileFilter filter, boolean quiet) {
-    File base = FileUtils.resolvePath(new File(getInstanceDir()), baseDir);
-    if (base != null && base.exists() && base.isDirectory()) {
-      File[] files = base.listFiles(filter);
-      if (files == null || files.length == 0) {
-        if (!quiet) {
-          log.warn("No files added to classloader from lib: "
-                   + baseDir + " (resolved as: " + base.getAbsolutePath() + ").");
-        }
-      } else {
-        this.classLoader = replaceClassLoader(classLoader, base, filter);
-      }
-    } else {
-      if (!quiet) {
-        log.warn("Can't find (or read) directory to add to classloader: "
-            + baseDir + " (resolved as: " + base.getAbsolutePath() + ").");
-      }
+   * @param urls    the URLs of files to add
+   */
+  void addToClassLoader(List<URL> urls) {
+    URLClassLoader newLoader = addURLsToClassLoader(classLoader, urls);
+    if (newLoader != classLoader) {
+      this.classLoader = newLoader;
     }
   }
+
+  /**
+   * Adds URLs to the ResourceLoader's internal classloader.  This method <b>MUST</b>
+   * only be called prior to using this ResourceLoader to get any resources, otherwise
+   * its behavior will be non-deterministic. You also have to {link @reloadLuceneSPI}
+   * before using this ResourceLoader.
+   *
+   * @param urls    the URLs of files to add
+   */
+  void addToClassLoader(URL... urls) {
+    addToClassLoader(Arrays.asList(urls));
+  }
   
   /**
    * Reloads all Lucene SPI implementations using the new classloader.
-   * This method must be called after {@link #addToClassLoader(String, FileFilter, boolean)}
-   * and {@link #addToClassLoader(String,FileFilter,boolean)} before using
-   * this ResourceLoader.
+   * This method must be called after {@link #addToClassLoader(List)}
+   * and before using this ResourceLoader.
    */
   void reloadLuceneSPI() {
     // Codecs:
@@ -218,55 +244,75 @@ public class SolrResourceLoader implemen
     TokenFilterFactory.reloadTokenFilters(this.classLoader);
     TokenizerFactory.reloadTokenizers(this.classLoader);
   }
-  
-  private static URLClassLoader replaceClassLoader(final URLClassLoader oldLoader,
-                                                   final File base,
-                                                   final FileFilter filter) {
-    if (null != base && base.canRead() && base.isDirectory()) {
-      File[] files = base.listFiles(filter);
-      
-      if (null == files || 0 == files.length) return oldLoader;
-      
-      URL[] oldElements = oldLoader.getURLs();
-      URL[] elements = new URL[oldElements.length + files.length];
-      System.arraycopy(oldElements, 0, elements, 0, oldElements.length);
-      
-      for (int j = 0; j < files.length; j++) {
-        try {
-          URL element = files[j].toURI().normalize().toURL();
-          log.info("Adding '" + element.toString() + "' to classloader");
-          elements[oldElements.length + j] = element;
-        } catch (MalformedURLException e) {
-          SolrException.log(log, "Can't add element to classloader: " + files[j], e);
-        }
-      }
-      ClassLoader oldParent = oldLoader.getParent();
-      IOUtils.closeWhileHandlingException(oldLoader); // best effort
-      return URLClassLoader.newInstance(elements, oldParent);
+
+  private static URLClassLoader addURLsToClassLoader(final URLClassLoader oldLoader, List<URL> urls) {
+    if (urls.size() == 0) {
+      return oldLoader;
+    }
+
+    List<URL> allURLs = new ArrayList<>();
+    allURLs.addAll(Arrays.asList(oldLoader.getURLs()));
+    allURLs.addAll(urls);
+    for (URL url : urls) {
+      log.info("Adding '{}' to classloader", url.toString());
     }
-    // are we still here?
-    return oldLoader;
+
+    ClassLoader oldParent = oldLoader.getParent();
+    IOUtils.closeWhileHandlingException(oldLoader);
+    return URLClassLoader.newInstance(allURLs.toArray(new URL[allURLs.size()]), oldParent);
   }
-  
+
   /**
-   * Convenience method for getting a new ClassLoader using all files found
-   * in the specified lib directory.
+   * Utility method to get the URLs of all paths under a given directory that match a filter
+   * @param libDir the root directory
+   * @param filter the filter
+   * @return all matching URLs
+   * @throws IOException on error
    */
-  static URLClassLoader createClassLoader(final File libDir, ClassLoader parent) {
-    if ( null == parent ) {
-      parent = Thread.currentThread().getContextClassLoader();
+  public static List<URL> getURLs(Path libDir, DirectoryStream.Filter<Path> filter) throws IOException {
+    List<URL> urls = new ArrayList<>();
+    try (DirectoryStream<Path> directory = Files.newDirectoryStream(libDir, filter)) {
+      for (Path element : directory) {
+        urls.add(element.toUri().normalize().toURL());
+      }
     }
-    return replaceClassLoader(URLClassLoader.newInstance(new URL[0], parent),
-                              libDir, null);
+    return urls;
   }
-  
-  public SolrResourceLoader( String instanceDir )
-  {
-    this( instanceDir, null, null );
+
+  /**
+   * Utility method to get the URLs of all paths under a given directory
+   * @param libDir the root directory
+   * @return all subdirectories as URLs
+   * @throws IOException on error
+   */
+  public static List<URL> getURLs(Path libDir) throws IOException {
+    return getURLs(libDir, new DirectoryStream.Filter<Path>() {
+      @Override
+      public boolean accept(Path entry) throws IOException {
+        return true;
+      }
+    });
+  }
+
+  /**
+   * Utility method to get the URLs of all paths under a given directory that match a regex
+   * @param libDir the root directory
+   * @param regex the regex as a String
+   * @return all matching URLs
+   * @throws IOException on error
+   */
+  public static List<URL> getFilteredURLs(Path libDir, String regex) throws IOException {
+    final PathMatcher matcher = libDir.getFileSystem().getPathMatcher("regex:" + regex);
+    return getURLs(libDir, new DirectoryStream.Filter<Path>() {
+      @Override
+      public boolean accept(Path entry) throws IOException {
+        return matcher.matches(entry.getFileName());
+      }
+    });
   }
   
   /** Ensures a directory name always ends with a '/'. */
-  public  static String normalizeDir(String path) {
+  public static String normalizeDir(String path) {
     return ( path != null && (!(path.endsWith("/") || path.endsWith("\\"))) )? path + File.separator : path;
   }
   
@@ -280,7 +326,7 @@ public class SolrResourceLoader implemen
   }
 
   public String getConfigDir() {
-    return instanceDir + "conf" + File.separator;
+    return instanceDir.resolve("conf").toString();
   }
   
   public String getDataDir()    {
@@ -316,6 +362,16 @@ public class SolrResourceLoader implemen
   public InputStream openConfig(String name) throws IOException {
     return openResource(name);
   }
+
+  private Path checkPathIsSafe(Path pathToCheck) throws IOException {
+    if (Boolean.getBoolean("solr.allow.unsafe.resourceloading"))
+      return pathToCheck;
+    pathToCheck = pathToCheck.normalize();
+    if (pathToCheck.startsWith(instanceDir))
+      return pathToCheck;
+    throw new IOException("File " + pathToCheck + " is outside resource loader dir " + instanceDir +
+        "; set -Dsolr.allow.unsafe.resourceloading=true to allow unsafe loading");
+  }
   
   /** Opens any resource by its name.
    * By default, this will look in multiple locations to load the resource:
@@ -327,53 +383,56 @@ public class SolrResourceLoader implemen
    */
   @Override
   public InputStream openResource(String resource) throws IOException {
-    InputStream is=null;
-    try {
-      File f0 = new File(resource), f = f0;
-      if (!f.isAbsolute()) {
-        // try $CWD/$configDir/$resource
-        f = new File(getConfigDir() + resource).getAbsoluteFile();
-      }
-      boolean found = f.isFile() && f.canRead();
-      if (!found) { // no success with $CWD/$configDir/$resource
-        f = f0.getAbsoluteFile();
-        found = f.isFile() && f.canRead();
-      }
-      // check that we don't escape instance dir
-      if (found) {
-        if (!Boolean.parseBoolean(System.getProperty("solr.allow.unsafe.resourceloading", "false"))) {
-          final URI instanceURI = new File(getInstanceDir()).getAbsoluteFile().toURI().normalize();
-          final URI fileURI = f.toURI().normalize();
-          if (instanceURI.relativize(fileURI) == fileURI) {
-            // no URI relativize possible, so they don't share same base folder
-            throw new IOException("For security reasons, SolrResourceLoader cannot load files from outside the instance's directory: " + f +
-                "; if you want to override this safety feature and you are sure about the consequences, you can pass the system property "+
-                "-Dsolr.allow.unsafe.resourceloading=true to your JVM");
-          }
-        }
-        // relativize() returned a relative, new URI, so we are fine!
-        return new FileInputStream(f);
-      }
-      // Delegate to the class loader (looking into $INSTANCE_DIR/lib jars).
-      // We need a ClassLoader-compatible (forward-slashes) path here!
-      is = classLoader.getResourceAsStream(resource.replace(File.separatorChar, '/'));
-      // This is a hack just for tests (it is not done in ZKResourceLoader)!
-      // -> the getConfigDir's path must not be absolute!
-      if (is == null && System.getProperty("jetty.testMode") != null && !new File(getConfigDir()).isAbsolute()) {
-        is = classLoader.getResourceAsStream((getConfigDir() + resource).replace(File.separatorChar, '/'));
-      }
-    } catch (IOException ioe) {
-      throw ioe;
-    } catch (Exception e) {
-      throw new IOException("Error opening " + resource, e);
+
+    Path inConfigDir = getInstancePath().resolve("conf").resolve(resource);
+    if (Files.exists(inConfigDir) && Files.isReadable(inConfigDir)) {
+      return Files.newInputStream(checkPathIsSafe(inConfigDir));
     }
-    if (is==null) {
-      throw new SolrResourceNotFoundException("Can't find resource '" + resource + "' in classpath or '" + new File(getConfigDir()).getAbsolutePath() + "'");
+
+    Path inInstanceDir = getInstancePath().resolve(resource);
+    if (Files.exists(inInstanceDir) && Files.isReadable(inInstanceDir)) {
+      return Files.newInputStream(checkPathIsSafe(inInstanceDir));
+    }
+
+    // Delegate to the class loader (looking into $INSTANCE_DIR/lib jars).
+    // We need a ClassLoader-compatible (forward-slashes) path here!
+    InputStream is = classLoader.getResourceAsStream(resource.replace(File.separatorChar, '/'));
+
+    // This is a hack just for tests (it is not done in ZKResourceLoader)!
+    // TODO can we nuke this?
+    if (is == null && System.getProperty("jetty.testMode") != null) {
+      is = classLoader.getResourceAsStream(("conf/" + resource).replace(File.separatorChar, '/'));
+    }
+
+    if (is == null) {
+      throw new SolrResourceNotFoundException("Can't find resource '" + resource + "' in classpath or '" + instanceDir + "'");
     }
     return is;
   }
 
   /**
+   * Report the location of a resource found by the resource loader
+   */
+  public String resourceLocation(String resource) {
+    Path inConfigDir = getInstancePath().resolve("conf").resolve(resource);
+    if (Files.exists(inConfigDir) && Files.isReadable(inConfigDir))
+      return inConfigDir.toAbsolutePath().normalize().toString();
+
+    Path inInstanceDir = getInstancePath().resolve(resource);
+    if (Files.exists(inInstanceDir) && Files.isReadable(inInstanceDir))
+      return inInstanceDir.toAbsolutePath().normalize().toString();
+
+    try (InputStream is = classLoader.getResourceAsStream(resource.replace(File.separatorChar, '/'))) {
+      if (is != null)
+        return "classpath:" + resource;
+    } catch (IOException e) {
+      // ignore
+    }
+
+    return resource;
+  }
+
+  /**
    * Accesses a resource by name and returns the (non comment) lines
    * containing data.
    *
@@ -699,7 +758,7 @@ public class SolrResourceLoader implemen
    * @return A normalized solrhome
    * @see #normalizeDir(String)
    */
-  public static String locateSolrHome() {
+  public static Path locateSolrHome() {
 
     String home = null;
     // Try JNDI
@@ -729,12 +788,20 @@ public class SolrResourceLoader implemen
       home = project + '/';
       log.info(project + " home defaulted to '" + home + "' (could not find system property or JNDI)");
     }
-    return normalizeDir( home );
+    return Paths.get(home);
   }
 
+  /**
+   * @return the instance path for this resource loader
+   */
+  public Path getInstancePath() {
+    return instanceDir;
+  }
 
+  /** Use {@link #getInstancePath()} */
+  @Deprecated
   public String getInstanceDir() {
-    return instanceDir;
+    return instanceDir.toString();
   }
   
   /**
@@ -836,7 +903,4 @@ public class SolrResourceLoader implemen
     }
   }
 
-  public String resolve(String pathToResolve) {
-    return Paths.get(instanceDir).resolve(pathToResolve).toString();
-  }
 }

Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/SolrXmlConfig.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/SolrXmlConfig.java?rev=1715344&r1=1715343&r2=1715344&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/SolrXmlConfig.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/SolrXmlConfig.java Fri Nov 20 12:42:42 2015
@@ -21,10 +21,9 @@ import javax.xml.xpath.XPath;
 import javax.xml.xpath.XPathConstants;
 import javax.xml.xpath.XPathExpressionException;
 import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.FileInputStream;
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.HashSet;
 import java.util.Map;
@@ -99,16 +98,16 @@ public class SolrXmlConfig {
     return fillSolrSection(configBuilder, entries);
   }
 
-  public static NodeConfig fromFile(SolrResourceLoader loader, File configFile) {
+  public static NodeConfig fromFile(SolrResourceLoader loader, Path configFile) {
 
-    log.info("Loading container configuration from {}", configFile.getAbsolutePath());
+    log.info("Loading container configuration from {}", configFile);
 
-    if (!configFile.exists()) {
+    if (!Files.exists(configFile)) {
       throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,
-          "solr.xml does not exist in " + configFile.getAbsolutePath() + " cannot start Solr");
+          "solr.xml does not exist in " + configFile.getParent() + " cannot start Solr");
     }
 
-    try (InputStream inputStream = new FileInputStream(configFile)) {
+    try (InputStream inputStream = Files.newInputStream(configFile)) {
       return fromInputStream(loader, inputStream);
     } catch (SolrException exc) {
       throw exc;
@@ -136,13 +135,13 @@ public class SolrXmlConfig {
     }
   }
 
-  public static NodeConfig fromSolrHome(SolrResourceLoader loader, String solrHome) {
-    return fromFile(loader, new File(solrHome, SOLR_XML_FILE));
+  public static NodeConfig fromSolrHome(SolrResourceLoader loader, Path solrHome) {
+    return fromFile(loader, solrHome.resolve(SOLR_XML_FILE));
   }
 
   public static NodeConfig fromSolrHome(Path solrHome) {
-    SolrResourceLoader loader = new SolrResourceLoader(solrHome.toString());
-    return fromSolrHome(loader, solrHome.toString());
+    SolrResourceLoader loader = new SolrResourceLoader(solrHome);
+    return fromSolrHome(loader, solrHome);
   }
 
   private static void checkForIllegalConfig(Config config) {

Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java?rev=1715344&r1=1715343&r2=1715344&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java Fri Nov 20 12:42:42 2015
@@ -19,18 +19,7 @@ package org.apache.solr.handler.admin;
 
 import java.io.File;
 import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-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.util.*;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Future;
 
@@ -1191,7 +1180,7 @@ public class CoreAdminHandler extends Re
       try (SolrCore core = cores.getCore(cname)) {
         if (core != null) {
           info.add(NAME, core.getName());
-          info.add("instanceDir", normalizePath(core.getResourceLoader().getInstanceDir()));
+          info.add("instanceDir", core.getResourceLoader().getInstancePath().toString());
           info.add("dataDir", normalizePath(core.getDataDir()));
           info.add("config", core.getConfigResource());
           info.add("schema", core.getSchemaResource());

Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/admin/SystemInfoHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/admin/SystemInfoHandler.java?rev=1715344&r1=1715343&r2=1715344&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/admin/SystemInfoHandler.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/admin/SystemInfoHandler.java Fri Nov 20 12:42:42 2015
@@ -142,7 +142,7 @@ public class SystemInfoHandler extends R
     // Solr Home
     SimpleOrderedMap<Object> dirs = new SimpleOrderedMap<>();
     dirs.add( "cwd" , new File( System.getProperty("user.dir")).getAbsolutePath() );
-    dirs.add( "instance", new File( core.getResourceLoader().getInstanceDir() ).getAbsolutePath() );
+    dirs.add("instance", core.getResourceLoader().getInstancePath().toString());
     try {
       dirs.add( "data", core.getDirectoryFactory().normalize(core.getDataDir()));
     } catch (IOException e) {

Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/response/TextResponseWriter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/response/TextResponseWriter.java?rev=1715344&r1=1715343&r2=1715344&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/response/TextResponseWriter.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/response/TextResponseWriter.java Fri Nov 20 12:42:42 2015
@@ -19,25 +19,30 @@ package org.apache.solr.response;
 
 import java.io.IOException;
 import java.io.Writer;
-import java.util.*;
+import java.nio.file.Path;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.Map;
 
 import org.apache.lucene.document.Document;
 import org.apache.lucene.index.IndexableField;
-import org.apache.solr.client.solrj.io.stream.TupleStream;
-import org.apache.solr.client.solrj.io.Tuple;
 import org.apache.lucene.util.BytesRef;
+import org.apache.solr.client.solrj.io.Tuple;
+import org.apache.solr.client.solrj.io.stream.TupleStream;
 import org.apache.solr.common.EnumFieldValue;
 import org.apache.solr.common.SolrDocument;
 import org.apache.solr.common.SolrDocumentList;
 import org.apache.solr.common.util.Base64;
-import org.apache.solr.util.DateFormatUtil;
-import org.apache.solr.util.FastWriter;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.schema.IndexSchema;
 import org.apache.solr.schema.SchemaField;
 import org.apache.solr.search.DocList;
 import org.apache.solr.search.ReturnFields;
+import org.apache.solr.util.DateFormatUtil;
+import org.apache.solr.util.FastWriter;
 
 /** Base class for text-oriented response writers.
  *
@@ -163,6 +168,8 @@ public abstract class TextResponseWriter
       writeNamedList(name, (NamedList)val);
     } else if (val instanceof TupleStream) {
       writeTupleStream((TupleStream) val);
+    } else if (val instanceof Path) {
+      writeStr(name, ((Path) val).toAbsolutePath().toString(), true);
     } else if (val instanceof Iterable) {
       writeArray(name,((Iterable)val).iterator());
     } else if (val instanceof Object[]) {

Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/schema/IndexSchema.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/schema/IndexSchema.java?rev=1715344&r1=1715343&r2=1715344&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/schema/IndexSchema.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/schema/IndexSchema.java Fri Nov 20 12:42:42 2015
@@ -17,28 +17,13 @@
 
 package org.apache.solr.schema;
 
-import java.io.IOException;
-import java.io.Writer;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-import java.util.SortedMap;
-import java.util.SortedSet;
-import java.util.TreeMap;
-import java.util.TreeSet;
-import java.util.regex.Pattern;
-
 import javax.xml.xpath.XPath;
 import javax.xml.xpath.XPathConstants;
 import javax.xml.xpath.XPathExpressionException;
+import java.io.IOException;
+import java.io.Writer;
+import java.util.*;
+import java.util.regex.Pattern;
 
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.analysis.DelegatingAnalyzerWrapper;
@@ -51,7 +36,6 @@ import org.apache.lucene.index.MultiFiel
 import org.apache.lucene.search.similarities.Similarity;
 import org.apache.lucene.uninverting.UninvertingReader;
 import org.apache.lucene.util.Version;
-import org.apache.solr.cloud.CloudUtil;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrException.ErrorCode;
 import org.apache.solr.common.params.SolrParams;
@@ -446,9 +430,6 @@ public class IndexSchema {
   }
 
   protected void readSchema(InputSource is) {
-    String resourcePath = CloudUtil.unifiedResourcePath(loader) + resourceName;
-    log.info("Reading Solr Schema from " + resourcePath);
-
     try {
       // pass the config resource loader to avoid building an empty one for no reason:
       // in the current case though, the stream is valid so we wont load the resource by name
@@ -593,13 +574,12 @@ public class IndexSchema {
       postReadInform();
 
     } catch (SolrException e) {
-      throw new SolrException(ErrorCode.getErrorCode(e.code()), e.getMessage() + ". Schema file is " +
-          resourcePath, e);
+      throw new SolrException(ErrorCode.getErrorCode(e.code()),
+          "Can't load schema " + loader.resourceLocation(resourceName) + ": " + e.getMessage(), e);
     } catch(Exception e) {
       // unexpected exception...
       throw new SolrException(ErrorCode.SERVER_ERROR,
-          "Schema Parsing Failed: " + e.getMessage() + ". Schema file is " + resourcePath,
-          e);
+          "Can't load schema " + loader.resourceLocation(resourceName) + ": " + e.getMessage(), e);
     }
 
     // create the field analyzers

Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchemaFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchemaFactory.java?rev=1715344&r1=1715343&r2=1715344&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchemaFactory.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchemaFactory.java Fri Nov 20 12:42:42 2015
@@ -16,6 +16,11 @@ package org.apache.solr.schema;
  * limitations under the License.
  */
 
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+
 import org.apache.commons.io.IOUtils;
 import org.apache.solr.cloud.ZkController;
 import org.apache.solr.cloud.ZkSolrResourceLoader;
@@ -36,11 +41,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.xml.sax.InputSource;
 
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-
 /** Factory for ManagedIndexSchema */
 public class ManagedIndexSchemaFactory extends IndexSchemaFactory implements SolrCoreAware {
   private static final Logger log = LoggerFactory.getLogger(ManagedIndexSchemaFactory.class);
@@ -284,7 +284,7 @@ public class ManagedIndexSchemaFactory e
               + "nor under SolrConfig.getConfigDir() or the current directory."
               + "  PLEASE REMOVE THIS FILE.");
         } else {
-          File upgradedSchemaFile = new File(nonManagedSchemaFile.getPath() + UPGRADED_SCHEMA_EXTENSION);
+          File upgradedSchemaFile = new File(nonManagedSchemaFile + UPGRADED_SCHEMA_EXTENSION);
           if (nonManagedSchemaFile.renameTo(upgradedSchemaFile)) {
             // Set the resource name to the managed schema so that the CoreAdminHandler returns a findable filename 
             schema.setResourceName(managedSchemaResourceName);
@@ -309,25 +309,10 @@ public class ManagedIndexSchemaFactory e
    *@return the File for the named resource, or null if it can't be found
    */
   private File locateConfigFile(String resource) {
-    File located = null;
-    File file = new File(resource);
-    if (file.isAbsolute()) {
-      if (file.isFile() && file.canRead()) {
-        located = file;
-      }
-    } else {
-      // try $configDir/$resource
-      File fileUnderConfigDir = new File(config.getResourceLoader().getConfigDir() + resource);
-      if (fileUnderConfigDir.isFile() && fileUnderConfigDir.canRead()) {
-        located = fileUnderConfigDir;
-      } else {
-        // no success with $configDir/$resource - try $CWD/$resource
-        if (file.isFile() && file.canRead()) {
-          located = file;
-        }
-      }
-    }
-    return located;
+    String location = config.getResourceLoader().resourceLocation(resource);
+    if (location.equals(resource) || location.startsWith("classpath:"))
+      return null;
+    return new File(location);
   }
 
   /**

Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java?rev=1715344&r1=1715343&r2=1715344&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java Fri Nov 20 12:42:42 2015
@@ -26,6 +26,8 @@ import javax.servlet.http.HttpServletReq
 import javax.servlet.http.HttpServletResponse;
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Properties;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -102,11 +104,10 @@ public class SolrDispatchFilter extends
         extraProperties = new Properties();
 
       String solrHome = (String) config.getServletContext().getAttribute(SOLRHOME_ATTRIBUTE);
-      if (solrHome == null)
-        solrHome = SolrResourceLoader.locateSolrHome();
       ExecutorUtil.addThreadLocalProvider(SolrRequestInfo.getInheritableThreadLocalProvider());
 
-      this.cores = createCoreContainer(solrHome, extraProperties);
+      this.cores = createCoreContainer(solrHome == null ? SolrResourceLoader.locateSolrHome() : Paths.get(solrHome),
+                                       extraProperties);
       this.httpClient = cores.getUpdateShardHandler().getHttpClient();
       log.info("user.dir=" + System.getProperty("user.dir"));
     }
@@ -126,7 +127,7 @@ public class SolrDispatchFilter extends
    * Override this to change CoreContainer initialization
    * @return a CoreContainer to hold this server's cores
    */
-  protected CoreContainer createCoreContainer(String solrHome, Properties extraProperties) {
+  protected CoreContainer createCoreContainer(Path solrHome, Properties extraProperties) {
     NodeConfig nodeConfig = loadNodeConfig(solrHome, extraProperties);
     cores = new CoreContainer(nodeConfig, extraProperties, true);
     cores.load();
@@ -138,7 +139,7 @@ public class SolrDispatchFilter extends
    * This may also be used by custom filters to load relevant configuration.
    * @return the NodeConfig
    */
-  public static NodeConfig loadNodeConfig(String solrHome, Properties nodeProperties) {
+  public static NodeConfig loadNodeConfig(Path solrHome, Properties nodeProperties) {
 
     SolrResourceLoader loader = new SolrResourceLoader(solrHome, null, nodeProperties);
     if (!StringUtils.isEmpty(System.getProperty("solr.solrxml.location"))) {
@@ -159,7 +160,7 @@ public class SolrDispatchFilter extends
       }
       log.info("Loading solr.xml from SolrHome (not found in ZooKeeper)");
     }
-    return SolrXmlConfig.fromSolrHome(loader, loader.getInstanceDir());
+    return SolrXmlConfig.fromSolrHome(loader, loader.getInstancePath());
   }
   
   public CoreContainer getCores() {

Modified: lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/analysis/TestWordDelimiterFilterFactory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/analysis/TestWordDelimiterFilterFactory.java?rev=1715344&r1=1715343&r2=1715344&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/analysis/TestWordDelimiterFilterFactory.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/analysis/TestWordDelimiterFilterFactory.java Fri Nov 20 12:42:42 2015
@@ -17,17 +17,15 @@ package org.apache.solr.analysis;
  * limitations under the License.
  */
 
-import java.io.StringReader;
 import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.lucene.analysis.BaseTokenStreamTestCase;
-import org.apache.lucene.analysis.MockTokenizer;
 import org.apache.lucene.analysis.TokenStream;
-import org.apache.lucene.util.Version;
-import org.apache.solr.SolrTestCaseJ4;
 import org.apache.lucene.analysis.miscellaneous.WordDelimiterFilterFactory;
 import org.apache.lucene.analysis.util.ResourceLoader;
+import org.apache.lucene.util.Version;
+import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.core.SolrResourceLoader;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -199,7 +197,7 @@ public class TestWordDelimiterFilterFact
   @Test
   public void testCustomTypes() throws Exception {
     String testText = "I borrowed $5,400.00 at 25% interest-rate";
-    ResourceLoader loader = new SolrResourceLoader("solr/collection1");
+    ResourceLoader loader = new SolrResourceLoader(TEST_PATH().resolve("collection1"));
     Map<String,String> args = new HashMap<>();
     args.put("luceneMatchVersion", Version.LATEST.toString());
     args.put("generateWordParts", "1");

Modified: lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/client/solrj/embedded/TestEmbeddedSolrServerConstructors.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/client/solrj/embedded/TestEmbeddedSolrServerConstructors.java?rev=1715344&r1=1715343&r2=1715344&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/client/solrj/embedded/TestEmbeddedSolrServerConstructors.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/client/solrj/embedded/TestEmbeddedSolrServerConstructors.java Fri Nov 20 12:42:42 2015
@@ -17,6 +17,10 @@ package org.apache.solr.client.solrj.emb
  * limitations under the License.
  */
 
+import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.request.CoreAdminRequest;
@@ -25,10 +29,6 @@ import org.apache.solr.core.NodeConfig;
 import org.apache.solr.core.SolrResourceLoader;
 import org.junit.Test;
 
-import java.io.IOException;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-
 public class TestEmbeddedSolrServerConstructors extends SolrTestCaseJ4 {
 
   @Test
@@ -43,7 +43,7 @@ public class TestEmbeddedSolrServerConst
   public void testNodeConfigConstructor() throws Exception {
     Path path = createTempDir();
 
-    SolrResourceLoader loader = new SolrResourceLoader(path.toString());
+    SolrResourceLoader loader = new SolrResourceLoader(path);
     NodeConfig config = new NodeConfig.NodeConfigBuilder("testnode", loader)
         .setConfigSetBaseDirectory(Paths.get(TEST_HOME()).resolve("configsets").toString())
         .build();

Modified: lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/CollectionsAPIDistributedZkTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/CollectionsAPIDistributedZkTest.java?rev=1715344&r1=1715343&r2=1715344&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/CollectionsAPIDistributedZkTest.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/CollectionsAPIDistributedZkTest.java Fri Nov 20 12:42:42 2015
@@ -909,14 +909,12 @@ public class CollectionsAPIDistributedZk
     for (SolrCore core : theCores) {
 
       // look for core props file
-      assertTrue("Could not find expected core.properties file",
-          new File((String) core.getStatistics().get("instanceDir"),
-              "core.properties").exists());
+      Path instancedir = (Path) core.getStatistics().get("instanceDir");
+      assertTrue("Could not find expected core.properties file", Files.exists(instancedir.resolve("core.properties")));
 
       Path expected = Paths.get(jetty.getSolrHome()).toAbsolutePath().resolve("cores").resolve(core.getName());
-      Path reported = Paths.get((String) core.getStatistics().get("instanceDir"));
 
-      assertTrue("Expected: " + expected + "\nFrom core stats: " + reported, Files.isSameFile(expected, reported));
+      assertTrue("Expected: " + expected + "\nFrom core stats: " + instancedir, Files.isSameFile(expected, instancedir));
 
     }
   }

Modified: lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/SolrXmlInZkTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/SolrXmlInZkTest.java?rev=1715344&r1=1715343&r2=1715344&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/SolrXmlInZkTest.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/SolrXmlInZkTest.java Fri Nov 20 12:42:42 2015
@@ -16,8 +16,12 @@ package org.apache.solr.cloud;
  * the License.
  */
 
-import com.carrotsearch.randomizedtesting.rules.SystemPropertiesRestoreRule;
+import java.io.File;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Path;
+import java.util.Properties;
 
+import com.carrotsearch.randomizedtesting.rules.SystemPropertiesRestoreRule;
 import org.apache.commons.io.FileUtils;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.SolrException;
@@ -25,16 +29,11 @@ import org.apache.solr.common.cloud.Solr
 import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.solr.core.NodeConfig;
 import org.apache.solr.servlet.SolrDispatchFilter;
-import org.junit.After;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.RuleChain;
 import org.junit.rules.TestRule;
 
-import java.io.File;
-import java.nio.charset.StandardCharsets;
-import java.util.Properties;
-
 public class SolrXmlInZkTest extends SolrTestCaseJ4 {
 
   @Rule
@@ -51,11 +50,11 @@ public class SolrXmlInZkTest extends Sol
   private NodeConfig cfg;
 
   private void setUpZkAndDiskXml(boolean toZk, boolean leaveOnLocal) throws Exception {
-    File tmpDir = createTempDir().toFile();
-    File solrHome = new File(tmpDir, "home");
-    copyMinConf(new File(solrHome, "myCollect"));
+    Path tmpDir = createTempDir();
+    Path solrHome = tmpDir.resolve("home");
+    copyMinConf(new File(solrHome.toFile(), "myCollect"));
     if (leaveOnLocal) {
-      FileUtils.copyFile(new File(SolrTestCaseJ4.TEST_HOME(), "solr-stress-new.xml"), new File(solrHome, "solr.xml"));
+      FileUtils.copyFile(new File(SolrTestCaseJ4.TEST_HOME(), "solr-stress-new.xml"), new File(solrHome.toFile(), "solr.xml"));
     }
 
     ignoreException("No UpdateLog found - cannot sync");
@@ -63,8 +62,7 @@ public class SolrXmlInZkTest extends Sol
 
     System.setProperty("zkClientTimeout", "8000");
 
-    zkDir = tmpDir.getAbsolutePath() + File.separator
-        + "zookeeper" + System.nanoTime() + "/server1/data";
+    zkDir = tmpDir.resolve("zookeeper" + System.nanoTime()).resolve("server1").resolve("data").toString();
     zkServer = new ZkTestServer(zkDir);
     zkServer.run();
     System.setProperty("zkHost", zkServer.getZkAddress());
@@ -86,7 +84,7 @@ public class SolrXmlInZkTest extends Sol
     props.setProperty("solr.test.sys.prop1", "propone");
     props.setProperty("solr.test.sys.prop2", "proptwo");
 
-    cfg = SolrDispatchFilter.loadNodeConfig(solrHome.getAbsolutePath(), props);
+    cfg = SolrDispatchFilter.loadNodeConfig(solrHome, props);
     log.info("####SETUP_END " + getTestName());
   }
 

Modified: lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/TestLeaderElectionZkExpiry.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/TestLeaderElectionZkExpiry.java?rev=1715344&r1=1715343&r2=1715344&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/TestLeaderElectionZkExpiry.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/TestLeaderElectionZkExpiry.java Fri Nov 20 12:42:42 2015
@@ -17,6 +17,11 @@ package org.apache.solr.cloud;
  * limitations under the License.
  */
 
+import java.nio.file.Path;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.cloud.SolrZkClient;
 import org.apache.solr.core.CloudConfig;
@@ -25,10 +30,6 @@ import org.apache.solr.core.CoreDescript
 import org.apache.zookeeper.KeeperException;
 import org.junit.Test;
 
-import java.util.Collections;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
 public class TestLeaderElectionZkExpiry extends SolrTestCaseJ4 {
   public static final String SOLRXML = "<solr></solr>";
   private static final int MAX_NODES = 16;
@@ -37,7 +38,7 @@ public class TestLeaderElectionZkExpiry
   @Test
   public void testLeaderElectionWithZkExpiry() throws Exception {
     String zkDir = createTempDir("zkData").toFile().getAbsolutePath();
-    String ccDir = createTempDir("testLeaderElectionWithZkExpiry-solr").toFile().getAbsolutePath();
+    Path ccDir = createTempDir("testLeaderElectionWithZkExpiry-solr");
     CoreContainer cc = createCoreContainer(ccDir, SOLRXML);
     final ZkTestServer server = new ZkTestServer(zkDir);
     server.setTheTickTime(1000);