import java.io.BufferedInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Hashtable;

import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import javax.net.ssl.SSLServerSocketFactory;

public class JI9047103 {
	static boolean ssl = false; 

	public static void main(String[] args) throws Exception { 

		boolean passed = false; 

		if (args.length > 0 && args[0].equalsIgnoreCase("SSL")) { 
			System.out.println("SSL on"); 
			ssl = true; 
		} else { 
			System.out.println("SSL off"); 
			ssl = false; 
		} 

		// Set up the environment for creating the initial context 
		Hashtable<String, String> env = new Hashtable<String, String>(11); 
		env.put(Context.INITIAL_CONTEXT_FACTORY, 
				"com.sun.jndi.ldap.LdapCtxFactory"); 
		env.put("com.sun.jndi.ldap.connect.timeout", "2000"); 
		if (ssl) { 
			env.put(Context.PROVIDER_URL, "ldaps://localhost:2001"); 
		} else { 
			env.put(Context.PROVIDER_URL, "ldap://localhost:2001"); 
		} 

		Server s = new Server(); 

		try { 

			// start the server 
			s.start(); 

			// Create initial context 
			DirContext ctx = new InitialDirContext(env); 
			System.out.println("LDAP Client: Connected to the Server"); 

			// Close the context when we're done 
			ctx.close(); 
		} catch (NamingException e) { 
			e.printStackTrace(); 
		} 
		s.interrupt(); 
	} 

	static class Server extends Thread { 

		static int serverPort = 2001; 

		Server() { 
		} 

		public void run() { 
			try { 
				ServerSocket serverSock; 

				if (ssl) { 
					SSLServerSocketFactory ssocketFactory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault(); 
					serverSock = ssocketFactory.createServerSocket(serverPort); 
				} else { 
					serverSock = new ServerSocket(serverPort); 
				} 
				Socket socket = serverSock.accept(); 
				System.out.println("Server: Connection accepted"); 

				BufferedInputStream bin = new BufferedInputStream(socket. 
						getInputStream()); 
				while (true) { 
					// bin.read(); // If uncommented, bug does not appear. 
				} 
			} catch (IOException e) { 
				e.printStackTrace(); 
				// ignore 
			} 
		} 
	} 

}
