package org.ourgrid.worker.business.requester;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.ourgrid.common.internal.IResponseTO;
import org.ourgrid.common.internal.RequesterIF;
import org.ourgrid.common.internal.response.LoggerResponseTO;
import org.ourgrid.worker.business.controller.ExecutionController;
import org.ourgrid.worker.business.dao.ExecutionDAO;
import org.ourgrid.worker.business.dao.WorkerDAOFactory;
import org.ourgrid.worker.business.dao.WorkerStatusDAO;
import org.ourgrid.worker.business.messages.WorkerControllerMessages;
import org.ourgrid.worker.communication.processors.handle.RemoteExecuteMessageHandle;
import org.ourgrid.worker.request.RemoteExecuteProcessorRequestTO;
public class RemoteExecuteProcessorRequester implements RequesterIF<RemoteExecuteProcessorRequestTO> {
public List<IResponseTO> execute(RemoteExecuteProcessorRequestTO request) {
List<IResponseTO> responses = new ArrayList<IResponseTO>();
RemoteExecuteMessageHandle handle = request.getHandle();
long requestID = handle.getRequestID();
String command = handle.getCommand();
Map<String, String> environmentVars = handle.getEnvironmentVars();
String senderPublicKey = request.getSenderPublicKey();
WorkerStatusDAO workerStatusDAO = WorkerDAOFactory.getInstance().getWorkerStatusDAO();
ExecutionDAO executionDAO = WorkerDAOFactory.getInstance().getExecutionDAO();
if (executionDAO.getCurrentHandle() != null) {
responses.add(new LoggerResponseTO(WorkerControllerMessages.getRemoteExecuteInAnAlreadyExecutingWorkerMessage(command, senderPublicKey),
LoggerResponseTO.WARN));
return responses;
}
if(!workerStatusDAO.hasConsumer()) {
responses.add(new LoggerResponseTO(WorkerControllerMessages.getRemoteExecuteInANonWorkingWorkerMessage(command, senderPublicKey),
LoggerResponseTO.WARN));
return responses;
}
if(!senderPublicKey.equals(workerStatusDAO.getConsumerPublicKey())) {
responses.add(new LoggerResponseTO(WorkerControllerMessages.getUnknownClientTriesToRemoteExecuteMessage(command, senderPublicKey),
LoggerResponseTO.WARN));
return responses;
}
if(workerStatusDAO.isFileTransferErrorState()) {
responses.add(new LoggerResponseTO(WorkerControllerMessages.getRemoteExecuteOnWorkerWithErrorMessage(command, senderPublicKey),
LoggerResponseTO.WARN));
return responses;
}
if (executionDAO.isExecutionFinished()) {
responses.add(new LoggerResponseTO(WorkerControllerMessages.
getRemoteExecuteInANExecutionFinishedWorkerMessage(command, senderPublicKey),
LoggerResponseTO.WARN));
return responses;
}
ExecutionController.getInstance().scheduleCommand(requestID, environmentVars, command,
senderPublicKey, responses, request.isExecutionClientDeployed());
return responses;
}
}