package org.ourgrid.peer.business.requester;
import java.util.ArrayList;
import java.util.List;
import org.ourgrid.common.interfaces.to.LocalWorkerState;
import org.ourgrid.common.internal.IResponseTO;
import org.ourgrid.common.internal.RequesterIF;
import org.ourgrid.common.internal.response.LoggerResponseTO;
import org.ourgrid.common.statistics.control.WorkerControl;
import org.ourgrid.peer.business.controller.WorkerNotificationController;
import org.ourgrid.peer.business.controller.messages.ConsumerMessages;
import org.ourgrid.peer.business.dao.PeerDAOFactory;
import org.ourgrid.peer.dao.AllocationDAO;
import org.ourgrid.peer.request.RemoteDisposeWorkerRequestTO;
import org.ourgrid.peer.response.StopWorkingResponseTO;
import org.ourgrid.peer.to.AllocableWorker;
import org.ourgrid.peer.to.LocalWorker;
import org.ourgrid.peer.to.RemoteConsumer;
public class RemoteDisposeWorkerRequester implements RequesterIF<RemoteDisposeWorkerRequestTO> {
public List<IResponseTO> execute(RemoteDisposeWorkerRequestTO request) {
List<IResponseTO> responses = new ArrayList<IResponseTO>();
String consumerPublicKey = request.getConsumerPublicKey();
RemoteConsumer remoteConsumer = PeerDAOFactory.getInstance().getConsumerDAO().getRemoteConsumer(consumerPublicKey);
if (remoteConsumer == null) {
LoggerResponseTO loggerResponse = new LoggerResponseTO(
ConsumerMessages.getUnknownConsumerDisposingWorkerMessage(consumerPublicKey),
LoggerResponseTO.WARN);
responses.add(loggerResponse);
return responses;
}
String remoteConsumerAddress = remoteConsumer.getConsumerAddress();
String workerAddress = request.getWorkerAddress();
if (workerAddress == null) {
LoggerResponseTO loggerResponse = new LoggerResponseTO(
ConsumerMessages.getRemoteConsumerDisposingNullWorkerMessage(remoteConsumerAddress),
LoggerResponseTO.WARN);
responses.add(loggerResponse);
return responses;
}
String workerPublicKey = request.getWorkerPublicKey();
LocalWorker localWorker = WorkerControl.getInstance().getLocalWorker(
responses, request.getWorkerUserAtServer());
if (localWorker != null &&
( localWorker.getStatus().equals(LocalWorkerState.OWNER) ||
localWorker.getStatus().equals(LocalWorkerState.IDLE))) {
LoggerResponseTO loggerResponse = new LoggerResponseTO(
ConsumerMessages.getRemoteConsumerDisposingNotAllocatedWorkerMessage(
remoteConsumerAddress, workerAddress),
LoggerResponseTO.WARN);
responses.add(loggerResponse);
return responses;
}
AllocationDAO allocationDAO = PeerDAOFactory.getInstance().getAllocationDAO();
AllocableWorker allocable = allocationDAO.getAllocableWorker(workerPublicKey);
if (allocable == null) {
LoggerResponseTO loggerResponse = new LoggerResponseTO(
ConsumerMessages.getRemoteConsumerDisposingUnknownWorkerMessage(remoteConsumerAddress),
LoggerResponseTO.WARN);
responses.add(loggerResponse);
return responses;
}
if (!consumerPublicKey.equals(allocable.getConsumerPublicKey())) {
LoggerResponseTO loggerResponse = new LoggerResponseTO(
ConsumerMessages.getRemoteConsumerDisposingNotAllocatedWorkerMessage(
remoteConsumerAddress, workerAddress),
LoggerResponseTO.WARN);
responses.add(loggerResponse);
return responses;
}
LoggerResponseTO loggerResponse = new LoggerResponseTO(
ConsumerMessages.getRemoteClientDisposingWorkerMessage(
remoteConsumerAddress, workerAddress),
LoggerResponseTO.DEBUG);
responses.add(loggerResponse);
StopWorkingResponseTO stopWorkingResponse = new StopWorkingResponseTO();
stopWorkingResponse.setWmAddress(allocable.getWorkerAddress());
responses.add(stopWorkingResponse);
// Consumer consumer = allocable.getConsumer();
allocable.deallocate();
WorkerControl.getInstance().statusChanged(responses,
allocable.getWorkerSpecification().getUserAndServer(),
LocalWorkerState.IDLE);
if (remoteConsumer.getAllocableWorkers().isEmpty()) {
PeerDAOFactory.getInstance().getConsumerDAO().removeRemoteConsumer(consumerPublicKey);
// ReleaseResponseTO releaseTO = new ReleaseResponseTO();
// releaseTO.setStubAddress(consumer.getConsumerAddress());
//
// responses.add(releaseTO);
}
return responses;
}
}