/*
* Copyright 2012 NGDATA nv
*
* Licensed 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.lilyproject.solrtestfw;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.regex.Pattern;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.input.NullInputStream;
public class SolrHomeDirSetup {
private final int solrPort;
private final File solrHomeDir;
private final SolrDefinition solrDef;
private final String autoCommitSetting;
private static final String[] SW_LANGS = new String[]{"ar", "bg", "ca", "cz", "da", "de", "el", "en", "es", "eu", "fa", "fi",
"fr", "ga", "gl", "hi", "hu", "hy", "id", "it", "ja", "lv", "nl", "no", "pt", "ro", "ru", "sv", "th", "tr"};
private static final String[] CONTRACT_LANGS = new String[]{"ca", "fr", "ga", "it"};
private SolrHomeDirSetup(File solrHomeDir, SolrDefinition solrDef, String autoCommitSetting, int solrPort) {
this.solrHomeDir = solrHomeDir;
this.solrDef = solrDef;
this.autoCommitSetting = autoCommitSetting;
this.solrPort = solrPort;
}
public static void write(File solrHomeDir, SolrDefinition solrDef, String autoCommitSetting, int solrPort) throws IOException {
new SolrHomeDirSetup(solrHomeDir, solrDef, autoCommitSetting, solrPort).writeCoreDirs();
}
private void writeCoreDirs() throws IOException {
for (SolrDefinition.CoreDefinition core : solrDef.getCores()) {
File solrCoreDir = new File(solrHomeDir, core.getName());
File solrConfDir = new File(solrCoreDir, "conf");
// In case the core would have previously existed, delete its directory, except for the default
// core, since that one is never unloaded, and solr would fail if you delete the index below its feet
if (!core.getName().equals(SolrDefinition.DEFAULT_CORE_NAME)) {
FileUtils.deleteDirectory(solrCoreDir);
}
FileUtils.forceMkdir(solrConfDir);
copyDefaultConfigToSolrHome(solrConfDir);
writeSchema(solrConfDir, core.getSchemaData());
writeSolrConfig(solrConfDir, core.getSolrConfigData());
}
writeCoresConf();
}
private void writeCoresConf() throws IOException {
// minimal solr.xml
PrintWriter writer = new PrintWriter(new File(solrHomeDir, "solr.xml"));
try {
writer.println("<solr>");
writer.println("<solrcloud>");
writer.println("<str name=\"hostContext\">/solr</str>");
writer.println("<int name=\"hostPort\">"+solrPort+"</int>");
writer.println("</solrcloud>");
writer.println("</solr>");
} finally {
writer.close();
}
// for each core: write an empty core.properties in a solr home subdir with the core name
for (SolrDefinition.CoreDefinition core : solrDef.getCores()) {
new File(new File(solrHomeDir, core.getName()), "core.properties").createNewFile();
}
}
private void copyDefaultConfigToSolrHome(File solrConfDir) throws IOException {
createEmptyFile(new File(solrConfDir, "synonyms.txt"));
createEmptyFile(new File(solrConfDir, "stopwords.txt"));
createEmptyFile(new File(solrConfDir, "protwords.txt"));
for (String lang : SW_LANGS) {
createEmptyFile(new File(solrConfDir, "lang" + File.separatorChar + "stopwords_" + lang + ".txt"));
}
for (String lang : CONTRACT_LANGS) {
createEmptyFile(new File(solrConfDir, "lang" + File.separatorChar + "contractions_" + lang + ".txt"));
}
createEmptyFile(new File(solrConfDir, "lang" + File.separatorChar + "hyphenations_ga.txt"));
createEmptyFile(new File(solrConfDir, "lang" + File.separatorChar + "stoptags_ja.txt"));
createEmptyFile(new File(solrConfDir, "lang" + File.separatorChar + "stemdict_nl.txt"));
}
private void writeSchema(File solrConfDir, byte[] schemaData) throws IOException {
FileUtils.writeByteArrayToFile(new File(solrConfDir, "schema.xml"), schemaData);
}
private void writeSolrConfig(File solrConfDir, byte[] solrConfigData) throws IOException {
String solrConfigString = new String(solrConfigData, "UTF-8");
solrConfigString = solrConfigString.replaceAll(Pattern.quote("<!--AUTOCOMMIT_PLACEHOLDER-->"),
autoCommitSetting == null ? "" : autoCommitSetting);
FileUtils.writeStringToFile(new File(solrConfDir, "solrconfig.xml"), solrConfigString);
}
private void createEmptyFile(File destination) throws IOException {
FileUtils.copyInputStreamToFile(new NullInputStream(0), destination);
}
}