package org.ourgrid.peer.business.requester; import java.util.ArrayList; import java.util.List; import org.ourgrid.common.internal.IResponseTO; import org.ourgrid.common.internal.RequesterIF; import org.ourgrid.common.internal.response.LoggerResponseTO; import org.ourgrid.common.internal.response.OperationSucceedResponseTO; import org.ourgrid.common.internal.response.ReleaseResponseTO; import org.ourgrid.common.statistics.control.WorkerControl; import org.ourgrid.peer.business.controller.messages.PeerControlMessages; import org.ourgrid.peer.business.dao.PeerDAOFactory; import org.ourgrid.peer.request.RemoveWorkerRequestTO; import org.ourgrid.peer.response.StopWorkingResponseTO; import org.ourgrid.peer.to.LocalAllocableWorker; import org.ourgrid.peer.to.LocalWorker; public class RemoveWorkerRequester implements RequesterIF<RemoveWorkerRequestTO> { public List<IResponseTO> execute(RemoveWorkerRequestTO request) { List<IResponseTO> responses = new ArrayList<IResponseTO>(); String senderPubKey = request.getSenderPubKey(); if(request.canComponentBeUsed()) { if(!request.isThisMyPublicKey()) { responses.add(new LoggerResponseTO(PeerControlMessages.getUnknownSenderSettingWorkersMessage(senderPubKey), LoggerResponseTO.WARN)); return responses; } OperationSucceedResponseTO to = new OperationSucceedResponseTO(); to.setClientAddress(request.getClientAddress()); try { removeWorker(responses, request.getWorkerUserAtServer()); } catch (IllegalArgumentException e) { to.setErrorCause(e); } responses.add(to); } return responses; } public static void removeWorker(List<IResponseTO> responses, String workerUserAtServer) { LocalWorker oldLocalWorker = WorkerControl.getInstance().removeLocalWorker(responses, workerUserAtServer); if (oldLocalWorker == null) { throw new IllegalArgumentException("Worker with address [" + workerUserAtServer + "] does not" + " is not registered in the peer."); } discardWorker(responses, oldLocalWorker); String workerManagementAddress = oldLocalWorker.getWorkerManagementAddress(); ReleaseResponseTO releaseTO = new ReleaseResponseTO(); releaseTO.setStubAddress(workerManagementAddress); responses.add(releaseTO); } private static void discardWorker(List<IResponseTO> responses, LocalWorker oldLocalWorker) { LocalAllocableWorker allocableWorkerToDeallocate = PeerDAOFactory.getInstance().getAllocationDAO().removeLocalAllocableWorker( oldLocalWorker.getPublicKey()); if (allocableWorkerToDeallocate != null) { if ( (allocableWorkerToDeallocate.getStatus().isAllocated())) { StopWorkingResponseTO to = new StopWorkingResponseTO(); to.setWmAddress(oldLocalWorker.getWorkerManagementAddress()); responses.add(to); } } } }