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

io.baltoro.remote.WSSessions Maven / Gradle / Ivy

There is a newer version: 4.0.12
Show newest version
package io.baltoro.remote;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.ConcurrentLinkedQueue;

import io.baltoro.exception.NoRunningInstanceException;
import io.baltoro.exception.ServiceException;
import io.baltoro.service.InstanceService;
import io.baltoro.service.ServiceFactory;
import io.baltoro.to.WSTO;
import io.baltoro.util.ObjectUtil;
import io.baltoro.util.StringUtil;


public class WSSessions
{

	private static WSSessions sessions;
	//private Map> sessionAppNameMap;
	//private ConcurrentLinkedQueue workQueue;
	
	private Map> sessionAppMap;
	private Map> appWSTOQueue;
	private Map pollerMap;
	
	//private ConcurrentLinkedQueue sessionInstrancQueue;
	
	//private ConcurrentLinkedQueue workQueue;
	
	
	//private Map>> sessionMap = new HashMap<>(1000);
	
	private WSSessions()
	{
		//sessionInstranceMap = new HashMap(2000);
		sessionAppMap = new HashMap<>(300);
		appWSTOQueue = new HashMap<>(300);
		pollerMap = new HashMap<>(300);
		//sessionQueue = new ConcurrentLinkedQueue<>();
	}
	
	public static WSSessions get()
	{
		if(sessions == null)
		{
			sessions = new WSSessions();
		}
		return sessions;
	}
	
	ConcurrentLinkedQueue getQueue(String appName)
	{
		return appWSTOQueue.get(appName);
	}
	
	public void addSession(SessionInstance instance)
	{
		
		//sessionInstranceMap.put(instance.getAppName()+"-"+instance.getInstanceUuid(), instance);
		String appUuid = instance.getAppUuid();
		
		Set set = sessionAppMap.get(appUuid);
		
		if(set == null)
		{
			set = new HashSet<>();
			sessionAppMap.put(appUuid, set);
		}
		set.add(instance);
		
		
		InstancePoller poller = pollerMap.get(appUuid);
		if(poller == null)
		{
			String sync = appUuid+"-queue";
			synchronized (sync.intern())
			{
				poller = pollerMap.get(sessionAppMap);
				if(poller == null)
				{
					poller = new InstancePoller(appUuid);
					pollerMap.put(appUuid, poller);
					poller.start();
				}
			}
		}
		
		/*
		Map> appSessions = sessionMap.get(instance.getAppName());
		if(appSessions == null)
		{
			appSessions = new HashMap>(20);
			sessionMap.put(instance.getAppName(), appSessions);
		}
		ConcurrentLinkedQueue instanceQueue = appSessions.get(instance.getInstanceUuid());
		if(instanceQueue == null)
		{
			instanceQueue = new ConcurrentLinkedQueue<>();
			appSessions.put(instance.getInstanceUuid(), instanceQueue);
			
		}
		
		instanceQueue.add(instance);
		*/
		
	}
	
	void send(WSTO to)
	{
		String appUuid = to.appUuid;
		String sync = appUuid+"-queue";
		
		ConcurrentLinkedQueue queue = appWSTOQueue.get(appUuid);
		if(queue == null)
		{
			synchronized (sync.intern())
			{
				queue = appWSTOQueue.get(appUuid);
				if(queue == null)
				{
					queue = new ConcurrentLinkedQueue<>();
					appWSTOQueue.put(appUuid, queue);
				}
			}
		}
		
		InstancePoller poller = pollerMap.get(appUuid);
		if(poller == null)
		{
			synchronized (sync.intern())
			{
				poller = pollerMap.get(appUuid);
				if(poller == null)
				{
					poller = new InstancePoller(appUuid);
					pollerMap.put(appUuid, poller);
					poller.start();
				}
			}
		}
		
		
		
		queue.add(to);
		
		synchronized (sync.intern())
		{
			sync.intern().notify();
		}
		
	}
	
	
	boolean isRunning(String appUuid)
	{
		Set set = sessionAppMap.get(appUuid);
		if(set == null || set.isEmpty())
		{
			return false;
		}
		return true;
	}
	

	int getSessionCount(String appUuid, String instanceUuid)
	{
		Set set = sessionAppMap.get(appUuid);
		if(set == null)
		{
			return 0;
		}
		else
		{
			int count = 0;
			for (SessionInstance sessionInstance : set)
			{
				if(sessionInstance.getInstanceUuid().equals(instanceUuid))
				{
					count++;
				}
			}
			return count;
		}
	}
	
	SessionInstance getSession(String appUuid, String instanceUuid)
	{
		Set set = sessionAppMap.get(appUuid);
		
		
		if(StringUtil.isNullOrEmpty(set))
		{
			return null;
		}
		
		
		if(StringUtil.isNotNullAndNotEmpty(instanceUuid))
		{
			for (SessionInstance sessionInstance : set)
			{
				if(sessionInstance.getInstanceUuid().equals(instanceUuid))
				{
					return sessionInstance;
				}
			}
		}
		
		
		Optional instance = ObjectUtil.getRandom(set);
		
		return instance.orElse(set.iterator().next());
		
	}
	
	
	SessionInstance getSessionForWorker(String appUuid, String instanceUuid)
	throws NoRunningInstanceException
	{
		Set set = sessionAppMap.get(appUuid);
		
		
		if(StringUtil.isNullOrEmpty(set))
		{
			throw new NoRunningInstanceException(appUuid);
		}
		
		
		String sync = appUuid+"-queue";
		synchronized (sync.intern())
		{
			for (SessionInstance sessionInstance : set)
			{
				if(sessionInstance.getInstanceUuid().equals(instanceUuid))
				{
					if(sessionInstance.working == false)
					{
						sessionInstance.working = true;
						return sessionInstance;
					}
					
				}
			}
		}
		
		
		
		return null;
		
	}
	
	/*
	private SessionInstance getSession(String appName, String instanceUuid)
	{
		if(StringUtil.isNotNullAndNotEmpty(instanceUuid))
		{
			SessionInstance instance = sessionInstranceMap.get(appName+"-"+instanceUuid);
			if(instance != null)
			{
				return instance;
			}
		}
		
		
		Set set = sessionAppNameMap.get(appName);
		if(StringUtil.isNullOrEmpty(set))
		{
			return null;
		}
		
		Optional instance = ObjectUtil.getRandom(set);
		
		return instance.orElse(set.iterator().next());
		
	}
	*/
	
	public void removeSession(String appUuid, String instanceUuid, String wsSessionId)
	{
		//sessionInstranceMap.remove(appName+"-"+instanceUuid);
		String sync = appUuid+"-queue";
		
		Set set = sessionAppMap.get(appUuid);
		SessionInstance rmInstance = null;
		int instSessionCount = -1;
		synchronized (sync.intern())
		{
			for (SessionInstance sessionInstance : set)
			{
				if(sessionInstance.getInstanceUuid().equals(instanceUuid))
				{
					instSessionCount++;
					if(sessionInstance.getSession().getId().equals(wsSessionId))
					{
						rmInstance = sessionInstance;
						System.out.println("removed session instance "+sessionInstance);
					}
				}
			}
			
			
			if(rmInstance != null && set != null)
			{
				set.remove(rmInstance);
			}
		}
		
		
		
		if(instSessionCount == 0)
		{
			InstanceService service = ServiceFactory.get(InstanceService.class);
			
			try
			{
				service.update(instanceUuid, "DOWN1", 0, 0);
			} 
			catch (ServiceException e)
			{
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			InstancePoller poller = pollerMap.get(appUuid);
			if(pollerMap != null)
			{
				poller.run = false;
				pollerMap.remove(appUuid);
				
				synchronized (sync.intern())
				{
					sync.intern().notifyAll();
				}
			}
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy