diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt index 713b0382996..d2e095ff1f8 100644 --- a/solr/CHANGES.txt +++ b/solr/CHANGES.txt @@ -210,6 +210,9 @@ Bug Fixes * SOLR-15009: Correctly propogate exceptions from DirectoryFactory.exists (Mike Drob) +* SOLR-15017: Core lib directories were not being recognized unless the solrconfig included a directive. + (Thomas Mortagne) + Other Changes --------------------- diff --git a/solr/core/src/java/org/apache/solr/core/SolrConfig.java b/solr/core/src/java/org/apache/solr/core/SolrConfig.java index 2e3353cb4cf..ce55df2f0e2 100644 --- a/solr/core/src/java/org/apache/solr/core/SolrConfig.java +++ b/solr/core/src/java/org/apache/solr/core/SolrConfig.java @@ -765,43 +765,47 @@ public class SolrConfig extends XmlConfigFile implements MapSerializable { } NodeList nodes = (NodeList) evaluate("lib", XPathConstants.NODESET); - if (nodes == null || nodes.getLength() == 0) return; - if (!isConfigsetTrusted) { - throw new SolrException(ErrorCode.UNAUTHORIZED, "The configset for this collection was uploaded without any authentication in place," - + " and use of is not available for collections with untrusted configsets. To use this component, re-upload the configset" - + " after enabling authentication and authorization."); - } + if (nodes != null && nodes.getLength() > 0) { + if (!isConfigsetTrusted) { + throw new SolrException(ErrorCode.UNAUTHORIZED, + "The configset for this collection was uploaded without any authentication in place," + + " and use of is not available for collections with untrusted configsets. To use this component, re-upload the configset" + + " after enabling authentication and authorization."); + } - 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 = instancePath.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); + 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 = instancePath.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); + } + } else if (null != path) { + final Path dir = instancePath.resolve(path); + try { + urls.add(dir.toUri().toURL()); + } catch (MalformedURLException e) { + log.warn("Couldn't add file {} to classpath: {}", dir, e); + } + } else { + throw new RuntimeException("lib: missing mandatory attributes: 'dir' or 'path'"); } - } else if (null != path) { - final Path dir = instancePath.resolve(path); - try { - urls.add(dir.toUri().toURL()); - } catch (MalformedURLException e) { - log.warn("Couldn't add file {} to classpath: {}", dir, e); - } - } else { - throw new RuntimeException("lib: missing mandatory attributes: 'dir' or 'path'"); } } - loader.addToClassLoader(urls); - loader.reloadLuceneSPI(); + if (!urls.isEmpty()) { + loader.addToClassLoader(urls); + loader.reloadLuceneSPI(); + } } public int getMultipartUploadLimitKB() { diff --git a/solr/core/src/test/org/apache/solr/core/TestMinimalConfig.java b/solr/core/src/test/org/apache/solr/core/TestMinimalConfig.java new file mode 100644 index 00000000000..4f169fa8b20 --- /dev/null +++ b/solr/core/src/test/org/apache/solr/core/TestMinimalConfig.java @@ -0,0 +1,45 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.solr.core; + +import java.io.IOException; +import java.io.InputStream; + +import org.apache.solr.SolrTestCaseJ4; +import org.junit.BeforeClass; +import org.junit.Test; + +public class TestMinimalConfig extends SolrTestCaseJ4 { + + @BeforeClass + public static void beforeClass() throws Exception { + initCore("solrconfig-minimal.xml","schema-minimal.xml"); + } + + // Make sure the content of the lib/ core subfolder is loaded even if there is no node in the solrconfig + @Test + public void testLib() throws IOException { + SolrResourceLoader loader = h.getCore().getResourceLoader(); + InputStream data = null; + String[] expectedFiles = new String[] { "empty-file-main-lib.txt"}; + for (String f : expectedFiles) { + data = loader.openResource(f); + assertNotNull("Should have found file " + f, data); + data.close(); + } + } +}