TorSpawnerStorage.java

package eu.javaexperience.proxy;

import java.io.Closeable;
import java.io.IOException;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

import eu.javaexperience.proxy.TorProxySpawner.ProxySource;
import eu.javaexperience.proxy.TorProxySpawner.TorProxy;
import eu.javaexperience.reflect.Mirror;

public class TorSpawnerStorage implements ProxyStorage, Closeable
{
	protected TorProxySpawner spawner;
	protected int maxProxies;
	protected ConcurrentMap<Integer, TorProxy> proxies = new ConcurrentHashMap<Integer, TorProxySpawner.TorProxy>();
	protected long maxIdle = -1;
	
	
	public TorSpawnerStorage(TorProxySpawner spawn, int max, long maxIdleMs)
	{
		this.spawner = spawn;
		this.maxProxies = max;
		this.maxIdle = maxIdleMs;
	}
	
	public TorSpawnerStorage(TorProxySpawner spawn, int max)
	{
		this(spawn, max, -1);
	}
	
	@Override
	public synchronized ProxySource getAtOffset(int i) throws IOException
	{
		TorProxy tp = proxies.get(i);
		if(null == tp)
		{
			try
			{
				tp = spawner.spawnWithOffset(i);
			}
			catch (InterruptedException e)
			{
				Mirror.throwSoftOrHardButAnyway(e);
			}
			proxies.put(i, tp);
		}
		else
		{
			if(maxIdle > 0)
			{
				try
				{
					tp.withinTimeOrRestart(maxIdle);
					tp.updateAccessTimeNow();
				}
				catch (InterruptedException e)
				{
					Mirror.propagateAnyway(e);
				}
			}
		}
		
		return tp;
	}

	@Override
	public int size()
	{
		return maxProxies;
	}

	@Override
	public void close() throws IOException
	{
		for(Entry<Integer, TorProxy> kv:proxies.entrySet())
		{
			try
			{
				kv.getValue().stop();
			}
			catch (InterruptedException e)
			{
				e.printStackTrace();
			}
		}
	}
	
/*	public static void main(String[] args) throws Throwable
	{
		TODO make restart test
		new File("/tmp/tors").mkdirs();
		TorSpawnerStorage storage = new TorSpawnerStorage(TorProxySpawner.runtimeThrowCreate("/tmp/tors"), 10, 20000);
		TorProxy ps = (TorProxy) storage.getAtOffset(0);
		ps.waitPortOpen(9050, 10);
		
		ps.stop();
		while(true)
		{
			try
			{
				Socket s = new Socket("127.0.0.1", 9050);
				s.close();
				System.out.println("poll");
			}
			catch(Exception e)
			{
				System.out.println("miss");
			}
			Thread.sleep(200);
		}
		
	}*/
	
}