/**
* License Agreement for OpenSearchServer
* <p>
* Copyright (C) 2008-2016 Emmanuel Keller / Jaeksoft
* <p>
* http://www.open-search-server.com
* <p>
* This file is part of OpenSearchServer.
* <p>
* OpenSearchServer is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* <p>
* OpenSearchServer is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* <p>
* You should have received a copy of the GNU General Public License
* along with OpenSearchServer.
* If not, see <http://www.gnu.org/licenses/>.
**/
package com.jaeksoft.searchlib.web;
import com.jaeksoft.searchlib.ClientCatalog;
import com.jaeksoft.searchlib.ClientFactory;
import com.jaeksoft.searchlib.Logging;
import com.jaeksoft.searchlib.SearchLibException;
import com.jaeksoft.searchlib.logreport.ErrorParserLogger;
import com.jaeksoft.searchlib.scheduler.TaskManager;
import com.jaeksoft.searchlib.util.ThreadUtils.WaitInterface;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.atomic.AtomicBoolean;
public class StartStopListener implements ServletContextListener {
public static File OPENSEARCHSERVER_DATA_FILE = null;
private static final AtomicBoolean active = new AtomicBoolean(false);
private static final AtomicBoolean started = new AtomicBoolean(false);
public static String REALPATH_WEBINF_CLASSES = null;
public static String REALPATH_WEBINF_LIB = null;
private static void initDataDir(ServletContext servletContext) {
String single_data = System.getenv("OPENSEARCHSERVER_DATA");
if (single_data == null)
single_data = System.getProperty("OPENSEARCHSERVER_DATA");
String multi_data = System.getenv("OPENSEARCHSERVER_MULTIDATA");
if (multi_data == null)
multi_data = System.getenv("OPENSHIFT_DATA_DIR");
if (multi_data != null) {
String p = servletContext.getContextPath();
if ("".equals(p) || "/".equals(p))
p = "ROOT";
OPENSEARCHSERVER_DATA_FILE = new File(new File(multi_data), p);
} else if (single_data != null)
OPENSEARCHSERVER_DATA_FILE = new File(single_data);
else
OPENSEARCHSERVER_DATA_FILE = new File(System.getProperty("user.home"), "opensearchserver_data");
if (!OPENSEARCHSERVER_DATA_FILE.exists())
OPENSEARCHSERVER_DATA_FILE.mkdir();
System.out.println("OPENSEARCHSERVER_DATA_FILE IS: " + OPENSEARCHSERVER_DATA_FILE);
}
private static void initDataDir(File data_directory) {
if (OPENSEARCHSERVER_DATA_FILE != null)
throw new RuntimeException("Data directory already set: " + OPENSEARCHSERVER_DATA_FILE.getAbsolutePath());
if (data_directory.exists()) {
if (!data_directory.isDirectory())
throw new RuntimeException(data_directory.getAbsolutePath() + " is not a directory");
}
OPENSEARCHSERVER_DATA_FILE = data_directory;
if (!OPENSEARCHSERVER_DATA_FILE.exists())
OPENSEARCHSERVER_DATA_FILE.mkdir();
}
public static boolean isShutdown() {
return !active.get();
}
public static boolean isStarted() {
return started.get();
}
public static class StartedWaitInterface implements WaitInterface {
@Override
public boolean done() {
return started.get();
}
@Override
public boolean abort() {
return false;
}
}
public static class ShutdownWaitInterface implements WaitInterface {
@Override
public boolean done() {
return false;
}
@Override
public boolean abort() {
return isShutdown();
}
}
public final static void shutdown() {
active.set(false);
started.set(false);
Logging.info("OSS SHUTDOWN");
try {
TaskManager.getInstance().stop();
} catch (SearchLibException e) {
Logging.error(e);
}
ClientCatalog.closeAll();
ErrorParserLogger.close();
}
@Override
public void contextDestroyed(ServletContextEvent contextEvent) {
shutdown();
}
private static transient Version version = null;
public static final synchronized Version getVersion() {
return version;
}
public static class ThreadedLoad implements Runnable {
public ThreadedLoad() {
new Thread(ClientCatalog.getThreadGroup(), this).start();
}
@Override
public void run() {
Logging.info("OSS starts loading index(es)");
ClientCatalog.openAll();
Logging.info("OSS ends loading index(es)");
started.set(true);
}
}
private static final void start() {
active.set(true);
Logging.initLogger();
Logging.info("OSS IS STARTING ");
ErrorParserLogger.init();
try {
ClientFactory.setInstance(new ClientFactory());
TaskManager.getInstance().start();
} catch (SearchLibException e) {
Logging.error(e);
}
}
public static void start(File data_directory) {
initDataDir(data_directory);
start();
}
@Override
public void contextInitialized(ServletContextEvent contextEvent) {
ServletContext servletContext = contextEvent.getServletContext();
REALPATH_WEBINF_CLASSES = servletContext.getRealPath("/WEB-INF/classes");
REALPATH_WEBINF_LIB = servletContext.getRealPath("/WEB-INF/lib");
initDataDir(servletContext);
try {
version = new Version(servletContext);
} catch (IOException e) {
Logging.error(e);
}
start();
new ThreadedLoad();
}
}