package org.ourgrid.peer.business.requester;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import org.ourgrid.common.interfaces.to.RequestSpecification;
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.JobControl;
import org.ourgrid.common.statistics.control.UserControl;
import org.ourgrid.peer.business.controller.accounting.AccountingCommitController;
import org.ourgrid.peer.business.controller.allocation.RedistributionController;
import org.ourgrid.peer.business.controller.messages.RequestMessages;
import org.ourgrid.peer.business.dao.PeerDAOFactory;
import org.ourgrid.peer.business.dao.RequestDAO;
import org.ourgrid.peer.business.util.RequestUtils;
import org.ourgrid.peer.request.FinishRequestRequestTO;
import org.ourgrid.peer.to.AllocableWorker;
import org.ourgrid.peer.to.PeerUser;
import org.ourgrid.peer.to.PeerUserReference;
import org.ourgrid.peer.to.Request;
public class FinishRequestRequester implements RequesterIF<FinishRequestRequestTO> {
public List<IResponseTO> execute(FinishRequestRequestTO requestTO) {
List<IResponseTO> responses = new ArrayList<IResponseTO>();
String brokerPublicKey = requestTO.getBrokerPublicKey();
RequestSpecification requestSpec = requestTO.getRequestSpec();
PeerUser user = UserControl.getInstance().getUserByPublicKey(responses, brokerPublicKey);
if (user == null) {
LoggerResponseTO loggerResponse = new LoggerResponseTO(
RequestMessages.getUnknownUserFinishingRequestMessage(brokerPublicKey),
LoggerResponseTO.WARN);
responses.add(loggerResponse);
return responses;
}
RequestDAO requestDAO = PeerDAOFactory.getInstance().getRequestDAO();
Request request = requestDAO.getRequest(requestSpec.getRequestId());
PeerUserReference loggedUser = PeerDAOFactory.getInstance().getUsersDAO().getLoggedUser(brokerPublicKey);
if (loggedUser == null) {
LoggerResponseTO loggerResponse = new LoggerResponseTO(
RequestMessages.getUnknownUserFinishingRequestMessage(brokerPublicKey),
LoggerResponseTO.WARN);
responses.add(loggerResponse);
return responses;
}
String lwpcAddress = loggedUser.getWorkerProviderClientAddress();
if (RequestUtils.isRequestUnknown( brokerPublicKey, request )) {
LoggerResponseTO loggerResponse = new LoggerResponseTO(
RequestMessages.getUnknownRequestFinishedMessage(requestSpec, lwpcAddress),
LoggerResponseTO.WARN);
responses.add(loggerResponse);
return responses;
}
LoggerResponseTO loggerResponse = new LoggerResponseTO(
RequestMessages.getFinishRequestMessage(requestSpec, lwpcAddress),
LoggerResponseTO.DEBUG);
responses.add(loggerResponse);
requestDAO.removeRequest(requestSpec.getRequestId());
List<Request> runningRequests = requestDAO.getRunningRequests();
boolean hasAnotherRequest = false;
for (Request runningRequest: runningRequests) {
if (runningRequest.getConsumer().getPublicKey().equals(brokerPublicKey)) {
hasAnotherRequest = true;
break;
}
}
if (!hasAnotherRequest) {
PeerDAOFactory.getInstance().getConsumerDAO().removeLocalConsumer(brokerPublicKey);
}
RequestUtils.cancelScheduledRequest(responses, requestSpec.getRequestId());
List<AllocableWorker> allocableWorkers = new LinkedList<AllocableWorker>(request.getAllocableWorkers());
for (AllocableWorker worker : allocableWorkers) {
RedistributionController.getInstance().redistributeWorker(responses, worker);
}
AccountingCommitController.getInstance().commitAccounting(responses, requestSpec, requestTO.getMyCertPathDN());
JobControl.getInstance().finishRequest(responses, request, false);
return responses;
}
}