package com.jaeksoft.searchlib;

import com.github.jankroken.commandline.CommandLineParser;
import com.github.jankroken.commandline.OptionStyle;
import com.github.jankroken.commandline.annotations.*;
import com.jaeksoft.searchlib.util.FileUtils;
import com.jaeksoft.searchlib.util.ThreadUtils;
import com.jaeksoft.searchlib.web.StartStopListener;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.startup.Tomcat;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang.StringUtils;

import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.net.URISyntaxException;

public class Server {

	private final Tomcat tomcat;

	private Server(Arguments arguments) {
		File baseDir = new File(arguments.extractDirectory == null ? "server" : arguments.extractDirectory);
		if (baseDir.exists())
			if (arguments.resetExtract && baseDir.isDirectory())
				FileUtils.deleteDirectoryQuietly(baseDir);
		if (!baseDir.exists())
			baseDir.mkdir();
		tomcat = new Tomcat();
		tomcat.noDefaultWebXmlPath();
		tomcat.setPort(arguments.httpPort == null ? 9090 : arguments.httpPort);
		tomcat.setBaseDir(baseDir.getAbsolutePath());
		tomcat.getHost().setAppBase(baseDir.getAbsolutePath());
		tomcat.getHost().setAutoDeploy(true);
		tomcat.getHost().setDeployOnStartup(true);
		tomcat.getConnector().setURIEncoding(arguments.uriEncoding == null ? "UTF-8" : arguments.uriEncoding);
	}

	public static class Arguments {

		private String extractDirectory = null;
		private Integer httpPort = null;
		private String uriEncoding = null;
		private boolean resetExtract = false;

		@Option
		@LongSwitch("extractDirectory")
		@ShortSwitch("e")
		@SingleArgument
		public void setExtractDirectory(String extractDirectory) {
			this.extractDirectory = extractDirectory;
		}

		@Option
		@LongSwitch("httpPort")
		@ShortSwitch("p")
		@SingleArgument
		public void setHttpPort(String port) {
			this.httpPort = StringUtils.isEmpty(port) ? null : Integer.parseInt(port);
		}

		@Option
		@LongSwitch("uriEncoding")
		@ShortSwitch("u")
		@SingleArgument
		public void setUriEncoding(String uriEncoding) {
			this.uriEncoding = uriEncoding;
		}

		@Option
		@LongSwitch("resetExtract")
		@ShortSwitch("r")
		@Toggle(true)
		public void setResetExtract(boolean resetExtract) {
			this.resetExtract = resetExtract;
		}
	}

	private void start(boolean await) throws IOException, URISyntaxException {
		final File srcFile =
				new File(Server.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
		if (!srcFile.exists())
			throw new IOException("The jar file or classes directory has not been found: " + srcFile);
		final File webFile;
		if (srcFile.isFile()) {
			webFile = new File(srcFile.getParent(), FilenameUtils.removeExtension(srcFile.getName()) + ".war");
			if (!webFile.exists() || !webFile.isFile())
				throw new IOException("The war file has not been found: " + webFile);
		} else {
			webFile = new File("src/main/webapp");
			if (!webFile.exists() && !webFile.isDirectory())
				throw new IOException("The web content directory has not been found: " + webFile);
		}

		try {
			tomcat.start();
			System.out.println("Tomcat started on " + tomcat.getHost());
		} catch (LifecycleException e) {
			System.err.println("Tomcat could not be started.");
		}
		System.out.println("Loading WebApplication: " + webFile);
		tomcat.addWebapp(tomcat.getHost(), StringUtils.EMPTY, webFile.getAbsolutePath());

		ThreadUtils.waitUntil(120, new StartStopListener.StartedWaitInterface());
		if (await)
			tomcat.getServer().await();
	}

	public static void start(String[] args, boolean await)
			throws IllegalAccessException, InstantiationException, InvocationTargetException, IOException,
			URISyntaxException {
		if (args == null)
			args = new String[] {};
		Arguments arguments = CommandLineParser.parse(Arguments.class, args, OptionStyle.SIMPLE);
		Server server = new Server(arguments);
		server.start(await);
	}

	public static void main(String[] args)
			throws IllegalAccessException, InstantiationException, InvocationTargetException, IOException,
			URISyntaxException {
		start(args, true);
	}
}

@@ -504,16 +504,17 @@
 ons.lang
+3
 .StringU

Replace lang by lang3