/* * 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.lilyservertestfw.launcher; import java.io.File; import java.util.List; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.Option; import org.apache.commons.cli.OptionBuilder; import org.apache.commons.io.FileUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.lilyproject.lilyservertestfw.TemplateDir; import org.lilyproject.solrtestfw.SolrDefinition; import org.lilyproject.solrtestfw.SolrTestingUtility; import org.lilyproject.util.xml.DocumentHelper; import org.w3c.dom.Document; public class SolrLauncherService implements LauncherService { private Option schemaOption; private Option commitOption; private Option solrConfigOption; private Option solrCloudModeOption; private String autoCommitSetting; private String schema; private String solrConfig; private File testHome; private boolean clearData; private boolean enableSolrCloud = false; private SolrTestingUtility solrTestingUtility; private int autoCommitTime = -1; private final Log log = LogFactory.getLog(getClass()); @Override public void addOptions(List<Option> options) { schemaOption = OptionBuilder .withArgName("schema.xml") .hasArg() .withDescription("Solr schema file name") .withLongOpt("schema") .create("s"); options.add(schemaOption); commitOption = OptionBuilder .withArgName("seconds") .hasArg() .withDescription("Auto commit index within this amount of seconds (default: no auto commit)") .withLongOpt("commit") .create("c"); options.add(commitOption); solrConfigOption = OptionBuilder .withArgName("solrconfig") .hasArg() .withDescription("Custom solrconfig file") .withLongOpt("solrconfig") .create("sc"); options.add(solrConfigOption); solrCloudModeOption = OptionBuilder .withDescription("Use cloud mode (connect with ZooKeeper) when starting Solr.") .withLongOpt("solrcloud") .create("solrcloud"); options.add(solrCloudModeOption); } @Override public int setup(CommandLine cmd, File testHome, boolean clearData) throws Exception { this.testHome = new File(testHome, TemplateDir.SOLR_DIR); FileUtils.forceMkdir(testHome); this.clearData = clearData; schema = cmd.getOptionValue(schemaOption.getOpt()); if (schema != null) { int result = checkSolrSchema(schema); if (result != 0) { return result; } } solrConfig = cmd.getOptionValue(solrConfigOption.getOpt()); if (solrConfig != null) { int result = checkSolrConfig(solrConfig); if (result != 0) { return result; } } autoCommitSetting = ""; if (cmd.hasOption(commitOption.getOpt())) { try { autoCommitTime = Integer.parseInt(cmd.getOptionValue(commitOption.getOpt())); autoCommitSetting = "<autoCommit><maxTime>" + (autoCommitTime * 1000) + "</maxTime></autoCommit>"; } catch (NumberFormatException e) { System.err.println("commit option should specify an integer, not: " + cmd.getOptionValue(commitOption.getOpt())); return 1; } } enableSolrCloud = cmd.hasOption(solrCloudModeOption.getOpt()); return 0; } private int checkSolrSchema(String schema) { File schemaFile = new File(schema); if (!schemaFile.exists()) { System.err.println("Specified Solr schema file does not exist:"); System.err.println(schemaFile.getAbsolutePath()); return 1; } Document document; try { document = DocumentHelper.parse(schemaFile); } catch (Exception e) { System.err.println("Error reading or parsing Solr schema file."); System.err.println(); e.printStackTrace(); return 1; } if (!document.getDocumentElement().getLocalName().equals("schema")) { System.err.println("A Solr schema file should have a <schema> root element, which the following file"); System.err.println("has not:"); System.err.println(schemaFile.getAbsolutePath()); return 1; } return 0; } private int checkSolrConfig(String solrConfig) { File solrConfigFile = new File(solrConfig); if (!solrConfigFile.exists()) { System.err.println("Specified solrconfig file does not exist:"); System.err.println(solrConfigFile.getAbsolutePath()); return 1; } Document document; try { document = DocumentHelper.parse(solrConfigFile); } catch (Exception e) { System.err.println("Error reading or parsing solrconfig file."); System.err.println(); e.printStackTrace(); return 1; } if (!document.getDocumentElement().getLocalName().equals("config")) { System.err.println("A solrconfig file should have a <config> root element, which the following file"); System.err.println("has not:"); System.err.println(solrConfigFile.getAbsolutePath()); return 1; } return 0; } @Override public int start(List<String> postStartupInfo) throws Exception { solrTestingUtility = new SolrTestingUtility(testHome, clearData, enableSolrCloud); solrTestingUtility.setAutoCommitSetting(autoCommitSetting); byte[] schemaData = schema == null ? null : FileUtils.readFileToByteArray(new File(schema)); byte[] solrConfigData = solrConfig == null ? null : FileUtils.readFileToByteArray(new File(solrConfig)); solrTestingUtility.setSolrDefinition(new SolrDefinition(schemaData, solrConfigData)); solrTestingUtility.start(); postStartupInfo.add("-----------------------------------------------"); postStartupInfo.add("Solr is running"); postStartupInfo.add(""); postStartupInfo.add("Use this as Solr URL when creating an index:"); postStartupInfo.add("http://localhost:8983/solr"); postStartupInfo.add(""); postStartupInfo.add("Web GUI available at:"); postStartupInfo.add("http://localhost:8983/solr/admin/"); postStartupInfo.add(""); if (solrConfig == null) { // only show the autocommit information if the user is using the built-in solrconfig if (autoCommitTime == -1) { postStartupInfo.add("Index is not auto-committed, you can commit it using:"); postStartupInfo.add("curl http://localhost:8983/solr/update -H 'Content-type:text/xml' --data-binary '<commit/>'"); } else { postStartupInfo.add("Index auto commit: " + autoCommitTime + " seconds"); } postStartupInfo.add(""); } return 0; } @Override public void stop() { if (solrTestingUtility != null) { if (solrTestingUtility.getServer() != null) { try { solrTestingUtility.getServer().stop(); } catch (Throwable t) { log.error("Error shutting down Solr/Jetty", t); } } solrTestingUtility = null; } } public SolrTestingUtility getSolrTestingUtility() { return solrTestingUtility; } }