SaacSession.java

package eu.javaexperience.saac;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Vector;

import eu.javaexperience.interfaces.simple.publish.SimplePublish1;
import eu.javaexperience.io.AppendableLocklessWriter;
import eu.javaexperience.log.ThreadLocalHookableLogFacility;
import eu.javaexperience.resource.ReferenceCounted;
import eu.javaexperience.rpc.RpcRequest;
import eu.javaexperience.rpc.RpcTools;
import eu.javaexperience.rpc.SimpleRpcSession;
import eu.javaexperience.rpc.bidirectional.BidirectionalRpcProtocolHandler;
import eu.javaexperience.web.features.WebSocket;

public class SaacSession
{
	protected SimpleRpcSession rpcSession;
	
	public SaacSession(SimpleRpcSession sess)
	{
		this.rpcSession = sess;
	}
	
	protected Vector<SaacExecution> processes = new Vector<>();
	
	
	public void addProcess(SaacExecution env)
	{
		processes.add(env);
	}
	
	public void removeProcess(SaacExecution env)
	{
		processes.remove(env);
	}
	
	public void sendServerEvent(String _this, String method, Object... arguments) throws IOException
	{
		BidirectionalRpcProtocolHandler PROTO = (BidirectionalRpcProtocolHandler) rpcSession.get("PROTOCOL");
		WebSocket SEND = (WebSocket) rpcSession.get("SEND");
		
		RpcRequest req = RpcTools.createClientInvocation(rpcSession, 0, _this, method, arguments);
		
		SEND.send(req.getRequestData().getImpl().toString().getBytes());
	}

	public ReferenceCounted<PrintWriter> setContextLogger()
	{
		ReferenceCounted<PrintWriter> wsLog = new ReferenceCounted<PrintWriter>(AppendableLocklessWriter.asNewLineDispatcher(new SimplePublish1<String>()
		{
			@Override
			public void publish(String a)
			{
				try
				{
					sendServerEvent(null ,"newLogLine", a);
				}
				catch (IOException e)
				{
					e.printStackTrace();
				}
			}
		}), 1)
		{
			@Override
			protected void onFree()
			{
				ThreadLocalHookableLogFacility.setLocalOutput(null);
			}
		};
		
		ThreadLocalHookableLogFacility.setLocalOutput(wsLog);
		return wsLog;
	}
}