package org.ourgrid.discoveryservice.business.controller; import java.util.Collection; import java.util.Collections; import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; import org.ourgrid.common.internal.IResponseTO; import org.ourgrid.common.internal.response.LoggerResponseTO; import org.ourgrid.common.internal.response.ReleaseResponseTO; import org.ourgrid.discoveryservice.PeerStatusChangeUtil; import org.ourgrid.discoveryservice.business.dao.DiscoveryServiceDAO; import org.ourgrid.discoveryservice.business.dao.DiscoveryServiceDAOFactory; import org.ourgrid.discoveryservice.business.dao.DiscoveryServiceInfo; import org.ourgrid.discoveryservice.business.messages.DiscoveryServiceControlMessages; import org.ourgrid.discoveryservice.response.DSHereIsRemoteWorkerProvidersListResponseTO; import org.ourgrid.discoveryservice.response.DSIsOverloadedResponseTO; public class DiscoveryServiceController { private static DiscoveryServiceController instance; public static DiscoveryServiceController getInstance() { if (instance == null) { instance = new DiscoveryServiceController(); } return instance; } private DiscoveryServiceController() {} public <T> Set<T> limitAndShuffleResponse(Collection<T> response, int maxResponseSize) { if (response.size() <= maxResponseSize) { return new LinkedHashSet<T>(response); } else { List<T> tempResponse = new LinkedList<T>(response); Collections.shuffle(tempResponse); Set<T> selectedResponse = new LinkedHashSet<T>(); for (int i = 0; i < maxResponseSize; i++) { selectedResponse.add(tempResponse.get(i)); } return selectedResponse; } } public void joinCommunity(List<IResponseTO> responses, String clientUserAtServer, String clientAddress, String dsAddress, int overloadThreshold) { DiscoveryServiceDAO dsDao = DiscoveryServiceDAOFactory.getInstance() .getDiscoveryServiceDAO(); if (dsDao.isPeerUp(clientUserAtServer)) { responses.add((new LoggerResponseTO( DiscoveryServiceControlMessages.getClientAlreadyJoinedToTheCommunityMessage(clientUserAtServer), LoggerResponseTO.DEBUG))); return; } if (dsDao.isOverloaded(overloadThreshold)) { responses.add((new LoggerResponseTO( DiscoveryServiceControlMessages.getDiscoveryServiceIsOverloadedMessage(clientUserAtServer), LoggerResponseTO.DEBUG))); DSIsOverloadedResponseTO dsIsOverloaded = new DSIsOverloadedResponseTO(); dsIsOverloaded.setDSAddress(clientAddress); dsIsOverloaded.setClientAddress(dsAddress); responses.add(dsIsOverloaded); ReleaseResponseTO releaseTo = new ReleaseResponseTO(); releaseTo.setStubAddress(clientAddress); responses.add(releaseTo); return; } responses.add((new LoggerResponseTO(DiscoveryServiceControlMessages.getClientNotLoggedMessage( clientUserAtServer), LoggerResponseTO.DEBUG))); List<String> onlinePeers = dsDao.getMyOnlinePeers(); Set<DiscoveryServiceInfo> DSs = dsDao.getAllDiscoveryServicesInfos(); for (DiscoveryServiceInfo ds : DSs) { if (ds.isUp()) { DSHereIsRemoteWorkerProvidersListResponseTO to = new DSHereIsRemoteWorkerProvidersListResponseTO(); to.setStubAddress(ds.getDsAddress()); to.setWorkerProviders(onlinePeers); responses.add(to); } } dsDao.peerIsUp(clientUserAtServer); PeerStatusChangeUtil.peerIsUp(clientUserAtServer, responses); } }