blob: 2c79e2f5150949357a8fa64e14518e636e3feb06 [file] [log] [blame]
// Copyright 2017 JanusGraph Authors
//
// 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.apache.atlas.runner;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.ArrayUtils;
import org.apache.solr.cloud.MiniSolrCloudCluster;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.UUID;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
public class LocalSolrRunner {
private static final String TARGET_DIRECTORY = System.getProperty("embedded.solr.directory");
private static final String COLLECTIONS_FILE = "collections.txt";
private static final String SOLR_XML = "solr.xml";
private static final String TEMPLATE_DIRECTORY = "core-template";
protected static final String[] COLLECTIONS = readCollections();
private static final Logger LOG = LoggerFactory.getLogger(LocalSolrRunner.class);
private static MiniSolrCloudCluster miniSolrCloudCluster;
public static void start() throws Exception {
if (isLocalSolrRunning()) {
return;
}
LOG.info("==> LocalSolrRunner.start()");
File templateDirectory = new File(TARGET_DIRECTORY + File.separator + "solr" + File.separator + TEMPLATE_DIRECTORY);
File temp = new File(TARGET_DIRECTORY + File.separator + "data" + File.separator + "index" + File.separator + getRandomString());
temp.mkdirs();
temp.deleteOnExit();
miniSolrCloudCluster = new MiniSolrCloudCluster(1, null, temp.toPath(), readSolrXml(), null, null);
LOG.info("Started local solr server at: " + getZookeeperUrls());
for (String coreName : COLLECTIONS) {
File coreDirectory = new File(temp.getAbsolutePath() + File.separator + coreName);
coreDirectory.mkdirs();
FileUtils.copyDirectory(templateDirectory, coreDirectory);
Path coreConfigPath = Paths.get(coreDirectory.getAbsolutePath());
miniSolrCloudCluster.uploadConfigSet(coreConfigPath, coreName);
LOG.info("Uploading solr configurations for core: '{}', configPath: '{}'", coreName, coreConfigPath);
}
LOG.info("<== LocalSolrRunner.start()");
}
public static void stop() throws Exception {
if (!isLocalSolrRunning()) {
return;
}
System.clearProperty("solr.solrxml.location");
System.clearProperty("zkHost");
miniSolrCloudCluster.shutdown();
}
public static String getZookeeperUrls() {
return miniSolrCloudCluster.getZkServer().getZkAddress();
}
public static boolean isLocalSolrRunning() {
boolean ret = false;
if (miniSolrCloudCluster != null) {
ret = CollectionUtils.isNotEmpty(miniSolrCloudCluster.getJettySolrRunners());
}
return ret;
}
private static String[] readCollections() {
// For the classloader you need the following path: "/solr/collections.txt";
// Use explicit '/' separators (not File.separator) because even on Windows you want '/'
String resName = "/solr/" + COLLECTIONS_FILE;
try {
InputStream inputStream = LocalSolrRunner.class.getResourceAsStream(resName);
InputStreamReader isr = new InputStreamReader(inputStream);
BufferedReader buffer = new BufferedReader(isr);
return Pattern.compile("\\s+").split(buffer.lines().collect(Collectors.joining("\n")));
} catch (Exception e) {
throw new RuntimeException("Unable to read collections file", e);
}
}
private static String readSolrXml() throws IOException {
// For the classloader you need the following path: "/solr/solr.xml";
// Use explicit '/' separators (not File.separator) because even on Windows you want '/'
String resName = "/solr/" + SOLR_XML;
// Use the local classloader rather than the system classloader - i.e. avoid using
// Thread.currentThread().getContextClassLoader().getResourceAsStream(resName);
InputStream inputStream = LocalSolrRunner.class.getResourceAsStream(resName);
if (inputStream == null) {
throw new RuntimeException("Unable to read solr xml");
}
return IOUtils.toString(inputStream, Charset.forName("UTF-8"));
}
private static String getRandomString() {
return UUID.randomUUID().toString();
}
public static void main(String[] args) {
if (ArrayUtils.isEmpty(args)) {
System.out.println("No argument!");
} else if (args[0].equals("start")) {
try {
start();
System.out.println("Started Local Solr Server: "+ getZookeeperUrls());
} catch (Exception e) {
System.out.println("Error starting Local Solr Server: " + e);
}
} else if (args[0].equals("stop")) {
try {
System.out.println("Stopping Local Solr Server.");
stop();
} catch (Exception e) {
System.out.println("Error stopping Local Solr Server: " + e);
}
} else {
System.out.println("Bad first argument: " + Arrays.toString(args));
}
}
}