| package org.apache.solr.core; |
| |
| /* |
| * 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. |
| */ |
| |
| import java.io.File; |
| import java.io.FileInputStream; |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.util.ArrayList; |
| import java.util.HashMap; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.Properties; |
| |
| import javax.xml.parsers.ParserConfigurationException; |
| |
| import org.apache.commons.io.IOUtils; |
| import org.apache.solr.common.SolrException; |
| import org.apache.solr.util.PropertiesUtil; |
| import org.slf4j.Logger; |
| import org.slf4j.LoggerFactory; |
| import org.xml.sax.SAXException; |
| |
| |
| /** |
| * |
| */ |
| public class ConfigSolrXml extends ConfigSolr { |
| protected static Logger log = LoggerFactory.getLogger(ConfigSolrXml.class); |
| |
| private SolrCoreDiscoverer solrCoreDiscoverer = new SolrCoreDiscoverer(); |
| private final Map<String, CoreDescriptor> coreDescriptorMap; |
| |
| public ConfigSolrXml(Config config, CoreContainer container) |
| throws ParserConfigurationException, IOException, SAXException { |
| super(config); |
| checkForIllegalConfig(); |
| |
| fillPropMap(); |
| |
| String coreRoot = get(CfgProp.SOLR_COREROOTDIRECTORY, (container == null ? config.getResourceLoader().getInstanceDir() : container.getSolrHome())); |
| coreDescriptorMap = solrCoreDiscoverer.discover(container, new File(coreRoot)); |
| } |
| |
| private void checkForIllegalConfig() throws IOException { |
| |
| // Do sanity checks - we don't want to find old style config |
| failIfFound("solr/@coreLoadThreads"); |
| failIfFound("solr/@persist"); |
| failIfFound("solr/@sharedLib"); |
| failIfFound("solr/@zkHost"); |
| |
| failIfFound("solr/logging/@class"); |
| failIfFound("solr/logging/@enabled"); |
| failIfFound("solr/logging/watcher/@size"); |
| failIfFound("solr/logging/watcher/@threshold"); |
| |
| failIfFound("solr/cores/@adminHandler"); |
| failIfFound("solr/cores/@distribUpdateConnTimeout"); |
| failIfFound("solr/cores/@distribUpdateSoTimeout"); |
| failIfFound("solr/cores/@host"); |
| failIfFound("solr/cores/@hostContext"); |
| failIfFound("solr/cores/@hostPort"); |
| failIfFound("solr/cores/@leaderVoteWait"); |
| failIfFound("solr/cores/@managementPath"); |
| failIfFound("solr/cores/@shareSchema"); |
| failIfFound("solr/cores/@transientCacheSize"); |
| failIfFound("solr/cores/@zkClientTimeout"); |
| |
| // These have no counterpart in 5.0, asking for any of these in Solr 5.0 |
| // will result in an error being |
| // thrown. |
| failIfFound("solr/cores/@defaultCoreName"); |
| failIfFound("solr/@persistent"); |
| failIfFound("solr/cores/@adminPath"); |
| |
| } |
| |
| private void failIfFound(String xPath) { |
| |
| if (config.getVal(xPath, false) != null) { |
| throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Should not have found " + xPath + |
| " solr.xml may be a mix of old and new style formats."); |
| } |
| } |
| |
| // We can do this in 5.0 when we read the solr.xml since we don't need to keep the original around for persistence. |
| private String doSub(String path) { |
| String val = config.getVal(path, false); |
| if (val != null) { |
| val = PropertiesUtil.substituteProperty(val, null); |
| } |
| return val; |
| } |
| |
| private void fillPropMap() { |
| propMap.put(CfgProp.SOLR_ADMINHANDLER, doSub("solr/str[@name='adminHandler']")); |
| propMap.put(CfgProp.SOLR_CORELOADTHREADS, doSub("solr/int[@name='coreLoadThreads']")); |
| propMap.put(CfgProp.SOLR_COREROOTDIRECTORY, doSub("solr/str[@name='coreRootDirectory']")); |
| propMap.put(CfgProp.SOLR_DISTRIBUPDATECONNTIMEOUT, doSub("solr/solrcloud/int[@name='distribUpdateConnTimeout']")); |
| propMap.put(CfgProp.SOLR_DISTRIBUPDATESOTIMEOUT, doSub("solr/solrcloud/int[@name='distribUpdateSoTimeout']")); |
| propMap.put(CfgProp.SOLR_HOST, doSub("solr/solrcloud/str[@name='host']")); |
| propMap.put(CfgProp.SOLR_HOSTCONTEXT, doSub("solr/solrcloud/str[@name='hostContext']")); |
| propMap.put(CfgProp.SOLR_HOSTPORT, doSub("solr/solrcloud/int[@name='hostPort']")); |
| propMap.put(CfgProp.SOLR_LEADERVOTEWAIT, doSub("solr/solrcloud/int[@name='leaderVoteWait']")); |
| propMap.put(CfgProp.SOLR_MANAGEMENTPATH, doSub("solr/str[@name='managementPath']")); |
| propMap.put(CfgProp.SOLR_SHAREDLIB, doSub("solr/str[@name='sharedLib']")); |
| propMap.put(CfgProp.SOLR_SHARESCHEMA, doSub("solr/str[@name='shareSchema']")); |
| propMap.put(CfgProp.SOLR_TRANSIENTCACHESIZE, doSub("solr/int[@name='transientCacheSize']")); |
| propMap.put(CfgProp.SOLR_ZKCLIENTTIMEOUT, doSub("solr/solrcloud/int[@name='zkClientTimeout']")); |
| propMap.put(CfgProp.SOLR_ZKHOST, doSub("solr/solrcloud/str[@name='zkHost']")); |
| |
| propMap.put(CfgProp.SOLR_LOGGING_CLASS, doSub("solr/logging/str[@name='class']")); |
| propMap.put(CfgProp.SOLR_LOGGING_ENABLED, doSub("solr/logging/str[@name='enabled']")); |
| propMap.put(CfgProp.SOLR_LOGGING_WATCHER_SIZE, doSub("solr/logging/watcher/int[@name='size']")); |
| propMap.put(CfgProp.SOLR_LOGGING_WATCHER_THRESHOLD, doSub("solr/logging/watcher/int[@name='threshold']")); |
| propMap.put(CfgProp.SOLR_SHARDHANDLERFACTORY_CLASS, doSub("solr/shardHandlerFactory/@class")); |
| propMap.put(CfgProp.SOLR_SHARDHANDLERFACTORY_NAME, doSub("solr/shardHandlerFactory/@name")); |
| propMap.put(CfgProp.SOLR_SHARDHANDLERFACTORY_CONNTIMEOUT, doSub("solr/shardHandlerFactory/int[@name='connTimeout']")); |
| propMap.put(CfgProp.SOLR_SHARDHANDLERFACTORY_SOCKETTIMEOUT, doSub("solr/shardHandlerFactory/int[@name='socketTimeout']")); |
| } |
| |
| |
| |
| @Override |
| public Map<String,String> readCoreAttributes(String coreName) { |
| Map<String,String> attrs = new HashMap<String,String>(); |
| |
| return attrs; // this is a no-op.... intentionally |
| } |
| |
| @Override |
| public List<String> getAllCoreNames() { |
| List<String> ret = new ArrayList<String>(coreDescriptorMap.keySet()); |
| |
| return ret; |
| } |
| |
| @Override |
| public String getProperty(String coreName, String property, String defaultVal) { |
| CoreDescriptor cd = coreDescriptorMap.get(coreName); |
| if (cd == null) return defaultVal; |
| |
| return cd.getProperty(property, defaultVal); |
| } |
| |
| @Override |
| public Properties readCoreProperties(String coreName) { |
| CoreDescriptor cd = coreDescriptorMap.get(coreName); |
| if (cd == null) return null; |
| return new Properties(cd.getCoreProperties()); |
| } |
| |
| static Properties getCoreProperties(String instanceDir, CoreDescriptor dcore) { |
| String file = dcore.getPropertiesName(); |
| if (file == null) file = "conf" + File.separator + "solrcore.properties"; |
| File corePropsFile = new File(file); |
| if (!corePropsFile.isAbsolute()) { |
| corePropsFile = new File(instanceDir, file); |
| } |
| Properties p = dcore.getCoreProperties(); |
| if (corePropsFile.exists() && corePropsFile.isFile()) { |
| p = new Properties(dcore.getCoreProperties()); |
| InputStream is = null; |
| try { |
| is = new FileInputStream(corePropsFile); |
| p.load(is); |
| } catch (IOException e) { |
| log.warn("Error loading properties ", e); |
| } finally { |
| IOUtils.closeQuietly(is); |
| } |
| } |
| return p; |
| } |
| |
| @Override |
| public void substituteProperties() { |
| config.substituteProperties(); |
| } |
| |
| } |
| |