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.ReleaseResponseTO;
import org.ourgrid.common.statistics.control.WorkerControl;
import org.ourgrid.common.util.StringUtil;
import org.ourgrid.peer.business.controller.messages.WorkerMessages;
import org.ourgrid.peer.business.dao.PeerDAOFactory;
import org.ourgrid.peer.request.PreemptedWorkerRequestTO;
import org.ourgrid.peer.response.LocalPreemptedWorkerResponseTO;
import org.ourgrid.peer.to.RemoteAllocableWorker;
import org.ourgrid.peer.to.Request;
public class PreemptedWorkerRequester implements RequesterIF<PreemptedWorkerRequestTO> {
public List<IResponseTO> execute(PreemptedWorkerRequestTO request) {
List<IResponseTO> responses = new ArrayList<IResponseTO>();
String remoteWorkerPublicKey = request.getRemoteWorkerPublicKey();
RemoteAllocableWorker remoteAllocableWorker = PeerDAOFactory.getInstance().getAllocationDAO().getRemoteAllocableWorker(
remoteWorkerPublicKey);
if (remoteAllocableWorker == null) {
responses.add(new LoggerResponseTO(WorkerMessages.getUnknownOrDisposedPreemptedRemoteWorkerMessage(remoteWorkerPublicKey),
LoggerResponseTO.DEBUG));
return responses;
}
if (remoteAllocableWorker.isDelivered()) {
LocalPreemptedWorkerResponseTO preemptedTO = new LocalPreemptedWorkerResponseTO();
preemptedTO.setLwpcAddress(remoteAllocableWorker.getConsumer().getConsumerAddress());
preemptedTO.setWorkerAddress(remoteAllocableWorker.getWorkerAddress());
responses.add(preemptedTO);
return responses;
}
String workerAddress = remoteAllocableWorker.getWorkerAddress();
String workerPubKey = remoteAllocableWorker.getWorkerPubKey();
//Remove and release worker
WorkerControl.getInstance().removeRemoteWorker(responses, StringUtil.addressToUserAtServer(workerAddress));
PeerDAOFactory.getInstance().getAllocationDAO().removeRemoteAllocableWorker(workerPubKey);
ReleaseResponseTO releaseTO = new ReleaseResponseTO();
releaseTO.setStubAddress(workerAddress);
responses.add(releaseTO);
Request req = remoteAllocableWorker.getRequest();
if (req != null) {
req.removeAllocableWorker(remoteAllocableWorker);
}
return responses;
}
}