All Downloads are FREE. Search and download functionalities are using the official Maven repository.

prerna.tcp.SocketServer Maven / Gradle / Ivy

The newest version!
package prerna.tcp;

import java.io.Closeable;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.file.Paths;
import java.util.Properties;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.config.ConfigurationSource;

import prerna.util.Constants;
import prerna.util.DIHelper;
import prerna.util.Utility;

public class SocketServer implements Runnable {
	
	// basically a process which works by looking for commands in TCP space
	private static final String CLASS_NAME = SocketServer.class.getName();
	private static boolean multi = false; // allow multiple threads at the same time
	public static boolean testMode = false;
	
	private static Logger classLogger = null;

	private Properties prop = null; // this is basically reference to the RDF Map
	private String socketDir = null;

	private boolean done = false;
	
	private Socket clientSocket = null;
	private ServerSocket serverSocket = null;
	
	private InputStream is = null;
	
	private SocketServerHandler ssh = new SocketServerHandler();
	private String baseFolder = null;
	
	public Object crash = new Object();

	public static void main(String [] args) throws Exception {
		// arg1 - the directory where commands would be thrown
		// arg2 - access to the rdf map to load
		// arg3 - port to start
		
		// create the watch service
		// start this thread
		
		// when event comes write it to the command
		// comment this for main execution
		//-Dlog4j.defaultInitOverride=TRUE
		
		if(args == null || args.length == 0) {
			args = new String[5];
			args[0] = "C:/workspace/Semoss/InsightCache/z1";
			args[1] = "C:/workspace/Semoss/RDF_Map.prop";;
			args[2] = "9999";
			args[3] = "r";
			args[4] = "mixed";
			multi = true;
			testMode = true;
		}
		
		if(args.length < 3) {
			throw new IllegalArgumentException("Must pass in at least 3 inputs - the log4j file, the rdf file map, and the port to run the socket on");
		}
		
		// this socket dir should have the log4j file contianer inside it
		String socketDir = args[0];
		String rdfMapInput = args[1];
		String portInput = args[2];
		
		String log4JPropFile = Paths.get(Utility.normalizePath(socketDir), "log4j2.properties").toAbsolutePath().toString();

		
		// set to say this is not core
		DIHelper.getInstance().setLocalProperty("core", "false");
		
		FileInputStream fis = null;
		try {
			fis = new FileInputStream(Utility.normalizePath(log4JPropFile));
			new ConfigurationSource(fis);
		} catch (IOException e) {
			classLogger.error(Constants.STACKTRACE, e);
		} finally {
			if(fis != null) {
				try {
					fis.close();
				} catch (IOException e) {
					classLogger.error(Constants.STACKTRACE, e);
					classLogger.error(Constants.STACKTRACE, e);
				}
			}
		}
		classLogger = LogManager.getLogger(CLASS_NAME);

		int port = -1;
		try {
			port = Integer.parseInt(portInput);
		} catch(NumberFormatException e) {
			classLogger.error(Constants.STACKTRACE, e);
			classLogger.error(Constants.STACKTRACE, e);
			throw new IllegalArgumentException("Input integer input for port='" + portInput+"'");
		}
		
		String rdfMapLocation = Utility.normalizePath(rdfMapInput);
		Properties rdfMap = Utility.loadProperties(rdfMapLocation);
        System.out.println("loaded rdf map");
        classLogger.info("loaded rdf map");

		SocketServer worker = new SocketServer();
		worker.baseFolder = rdfMap.getProperty(Constants.BASE_FOLDER).replace('\\', '/');
		
		DIHelper.getInstance().loadCoreProp(rdfMapLocation);
		DIHelper.getInstance().getProperty(Constants.BASE_FOLDER);
		
		worker.prop = rdfMap;

		worker.socketDir = socketDir;
		String engine = "r";
		if(args.length >= 4) {
			engine = args[3];
		}
		if(args.length >= 5) {
			SocketServer.multi = args[4].equalsIgnoreCase("multi");
		}
		
		worker.bootServer(port, engine);
	}
	
	public void bootServer(final int PORT, String engine) {
        try {
            serverSocket = new ServerSocket(PORT);
        } catch (IOException e) {
			classLogger.error(Constants.STACKTRACE, e);
			classLogger.error(Constants.STACKTRACE, e);
            System.err.println("Could not listen on port: " + PORT);
            System.exit(1);
        }
        System.out.println("server started");
        classLogger.info("server started");

        Thread listenerThread = new Thread(this);
        listenerThread.start();
	}
	
	// start listening for connections
	public void run() {
		// do the listening here and then spawn the thread
			while(!done) {
			if(this.clientSocket == null || multi) {
		        try {
		            clientSocket = serverSocket.accept();
		        } catch (IOException e) {
					classLogger.error(Constants.STACKTRACE, e);
					classLogger.error(Constants.STACKTRACE, e);
		            System.err.println("Accept failed.");
		            System.exit(1);
		        }	
		        try {
			        ssh = new SocketServerHandler();
			        DIHelper.getInstance().setLocalProperty("SSH", ssh);
		        	ssh.setLogger(classLogger);
					ssh.setOutputStream(clientSocket.getOutputStream());
					is = clientSocket.getInputStream();
				} catch (IOException e) {
					classLogger.error(Constants.STACKTRACE, e);
					classLogger.error(Constants.STACKTRACE, e);
				}   
		        
		        // start processing
		        // start a new thread
		        //PyExecutorThread pt = startPyExecutor();

		        //ssh.setPyExecutorThread(pt);
		        ssh.is = is;
		        ssh.socket = serverSocket;
		        ssh.server = this;
		        ssh.mainFolder = socketDir;
		        
		        Thread readerThread = new Thread(ssh);
		        readerThread.start();
			} else {
				// just sleep
				// see if something crashed
				synchronized(crash) {
					try {
						crash.wait();
						clientSocket = null;
						closeStream(clientSocket);
						closeStream(serverSocket);
						closeStream(is);
						if(!testMode)	
							ssh.cleanUp();
					} catch (InterruptedException e) {
						classLogger.error(Constants.STACKTRACE, e);
						classLogger.error(Constants.STACKTRACE, e);
					}
				}
			}
		}
	}
	
    private void closeStream(Closeable closeThis) {
    	try {
			closeThis.close();
		} catch (IOException e) {
			classLogger.error(Constants.STACKTRACE, e);
			classLogger.error(Constants.STACKTRACE, e);
		}
    }
	
	public static boolean isMulti() {
		return multi;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy