package primer_server;

import java.net.*;
import java.io.*;
import javax.net.ssl.*;

public class server {
	private final static int SSL_ECHO_PORT = 7000;

	private final static String KS_PATH = "server.jks";
	private final static String KS_PASS = "changeit";

	private final static String TS_PATH = "clients.jks";
	private final static String TS_PASS = "changeit";

	public static void main(String[] args) throws Exception {
		(new server()).run(args);
	}

	private void run(String[] args) throws Exception {
		int port = SSL_ECHO_PORT;
		boolean clientAuth = false;

		for (int i = 0; i < args.length; i++) {
			if ("-port".equals(args[i]))
				port = Integer.parseInt(args[++i]);
			else if ("-clientauth".equals(args[i]))
				clientAuth = true;
			else {
				System.out.println("Usage: java server [-port <port>] [-clientauth]");
				return;
			}
		}

		System.setProperty("javax.net.ssl.keyStore", KS_PATH);
		System.setProperty("javax.net.ssl.keyStorePassword", KS_PASS);

		if (clientAuth) {
			System.setProperty("javax.net.ssl.trustStore", TS_PATH);
			System.setProperty("javax.net.ssl.trustStorePassword", TS_PASS);
		}

		SSLServerSocketFactory factory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
		System.out.println("factory created");

		SSLServerSocket server = (SSLServerSocket) factory.createServerSocket(port);
		System.out.println("server socket created");

		if (clientAuth)
			server.setNeedClientAuth(true);

		while (true) {
			Socket socket = server.accept();
			Service service = new Service(socket);
			service.start();
		}
	}

	class Service extends Thread {
		private Socket socket;

		Service(Socket socket) {
			this.socket = socket;
		}

		public void run() {
			System.out.println("connected - " + socket.getRemoteSocketAddress());

			try {
				BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF8"));

				BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF8"));

				String s;
				while ((s = in.readLine()) != null) {
					if (!s.equals(""))
						out.write(s);
					out.write("\r\n");
					out.flush();

					System.out.println(s);

					if (s.equals("."))
						break;
				}

				out.close();
				in.close();

				System.out.println("closing - " + socket.getRemoteSocketAddress());
			} catch (Exception e) {
				System.err.println("Service.run(): " + e);
			} finally {
				try {
					socket.close();
				} catch (IOException e2) {
				}
			}
		}
	}
}
