TorProxyServer.java

package eu.javaexperience.rpc.tor;

import eu.javaexperience.datareprez.jsonImpl.DataObjectJsonImpl;
import eu.javaexperience.io.IOStream;
import eu.javaexperience.io.IOTools;
import eu.javaexperience.io.fd.IOStreamFactory;
import eu.javaexperience.parse.ParsePrimitive;
import eu.javaexperience.proxy.TorProxySpawner;
import eu.javaexperience.proxy.TorSpawnerStorage;
import eu.javaexperience.rpc.JavaClassRpcCollector;
import eu.javaexperience.rpc.JavaClassRpcFunctions;
import eu.javaexperience.rpc.RpcDefaultProtocol;
import eu.javaexperience.rpc.RpcTools;
import eu.javaexperience.rpc.SimpleRpcRequest;
import eu.javaexperience.rpc.SimpleRpcSession;
import eu.javaexperience.rpc.SocketRpcServer;
import eu.javaexperience.rpc.codegen.JavaRpcInterfaceGenerator;
import eu.javaexperience.time.TimeCalc;

import java.io.File;
import java.io.IOException;
import java.net.ServerSocket;

public class TorProxyServer
{
	protected static TorSpawnerStorage TOR_SPAWN =
			new TorSpawnerStorage(TorProxySpawner.runtimeThrowCreate("./tor"), 1024, 10*TimeCalc.minutes_ms);
	
	static
	{
		IOTools.closeOnExit(TOR_SPAWN);
	}
	
	public static void main(String[] args) throws IOException
	{
		new File("./tor").mkdirs();
		RpcDefaultProtocol proto = new RpcDefaultProtocol(new DataObjectJsonImpl());
		
		JavaClassRpcCollector api = new JavaClassRpcFunctions(TorProxyServer.class);
		
		SocketRpcServer<IOStream, SimpleRpcSession> srv = RpcTools.newServer
		(
			IOStreamFactory.fromServerSocket(new ServerSocket(9049)), 
			5, 
			proto, 
			RpcTools.getSimpleSessionCreator(), 
			(a, b)->api.dispatch(new SimpleRpcRequest(a, b))
		);
		srv.start();
		
		System.out.println
		(
			RpcTools.generateRpcClassWithBuilder
			(
				JavaRpcInterfaceGenerator.BASIC_JAVA_SOURCE_BUILDER, 
				"TorProxyServer", 
				api.getFunctionList()
			)
		);
		
		String sp = System.getProperties().getProperty("start_proxies");
		Integer pre = ParsePrimitive.tryParseInt(sp);
		System.out.println("-Dstart_proxies: " + sp + " " + pre);
		if (pre != null)
		{
			for(int i=0;i<pre.intValue();i++)
			{
				try
				{
					get_proxy_offset(null, i);
				}
				catch (InterruptedException e)
				{
					e.printStackTrace();
				}
			}
		}
	}
	
	public static int get_proxy_offset(SimpleRpcRequest req, int index) throws InterruptedException, IOException
	{
		synchronized (TOR_SPAWN)
		{
			return TOR_SPAWN.getAtOffset(index).getPort();
		}
	}
}