package org.ourgrid.broker.business.requester;
import java.util.ArrayList;
import java.util.List;
import org.ourgrid.broker.business.dao.BrokerDAOFactory;
import org.ourgrid.broker.business.dao.JobDAO;
import org.ourgrid.broker.business.dao.PeerEntry;
import org.ourgrid.broker.business.dao.WorkerDAO;
import org.ourgrid.broker.business.messages.LocalWorkerProviderClientMessages;
import org.ourgrid.broker.business.scheduler.SchedulerIF;
import org.ourgrid.broker.request.HereIsWorkerRequestTO;
import org.ourgrid.broker.response.DisposeWorkerResponseTO;
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.internal.response.ReleaseResponseTO;
import org.ourgrid.common.specification.worker.WorkerSpecification;
import org.ourgrid.common.util.StringUtil;
public class HereIsWorkerRequester implements RequesterIF<HereIsWorkerRequestTO> {
public List<IResponseTO> execute(HereIsWorkerRequestTO request) {
List<IResponseTO> responses = new ArrayList<IResponseTO>();
String senderPublicKey = request.getSenderPublicKey();
String peerAddress = request.getPeerAddress();
PeerEntry peerEntry = BrokerDAOFactory.getInstance().getPeerDAO().getPeerEntry(peerAddress);
String workerAddress = request.getWorkerAddress();
String workerPublicKey = request.getWorkerPublicKey();
WorkerSpecification workerSpec = request.getWorkerSpec();
RequestSpecification requestSpec = request.getRequestSpec();
if (peerEntry == null) {
responses.add(new LoggerResponseTO(LocalWorkerProviderClientMessages.getUnknownPeerDeliveredAWorkerMessage(
workerPublicKey, senderPublicKey), LoggerResponseTO.WARN));
return responses;
}
if (peerEntry.isDown()) {
responses.add(new LoggerResponseTO(LocalWorkerProviderClientMessages.getDownPeerDeliveredAWorkerMessage(
workerPublicKey, senderPublicKey), LoggerResponseTO.WARN));
return responses;
}
if (peerEntry.isUp()) {
responses.add(new LoggerResponseTO(LocalWorkerProviderClientMessages.getNotLoggedPeerDeliveredAWorkerMessage(
workerPublicKey, senderPublicKey), LoggerResponseTO.WARN));
return responses;
}
WorkerDAO workerDAO = BrokerDAOFactory.getInstance().getWorkerDAO();
workerDAO.addWorker(workerAddress, workerSpec);
if (requestSpec == null) {
responses.add(new LoggerResponseTO(LocalWorkerProviderClientMessages.nullRequestMessage(
workerPublicKey, senderPublicKey), LoggerResponseTO.WARN));
DisposeWorkerResponseTO disposeWorkerResponseTO = new DisposeWorkerResponseTO();
disposeWorkerResponseTO.setPeerAddress(peerAddress);
disposeWorkerResponseTO.setWorkerAddress(workerAddress);
disposeWorkerResponseTO.setWorkerPublicKey(workerPublicKey);
responses.add(disposeWorkerResponseTO);
ReleaseResponseTO releaseTO = new ReleaseResponseTO();
releaseTO.setStubAddress(workerAddress);
responses.add(releaseTO);
return responses;
}
JobDAO jobDAO = BrokerDAOFactory.getInstance().getJobDAO();
int jobID = jobDAO.getJobForThisRequest(requestSpec.getRequestId());
if (jobID == -1) {
responses.add(new LoggerResponseTO(LocalWorkerProviderClientMessages.getBrokerWithoutRunningJobsReceivingWorkerMessage(
workerPublicKey, senderPublicKey), LoggerResponseTO.WARN));
DisposeWorkerResponseTO disposeWorkerResponseTO = new DisposeWorkerResponseTO();
disposeWorkerResponseTO.setPeerAddress(peerAddress);
disposeWorkerResponseTO.setWorkerAddress(workerAddress);
responses.add(disposeWorkerResponseTO);
ReleaseResponseTO releaseTO = new ReleaseResponseTO();
releaseTO.setStubAddress(workerAddress);
responses.add(releaseTO);
return responses;
}
jobDAO.addWorker2Job(StringUtil.addressToContainerID(workerAddress), jobID);
if (jobID > -1) {
SchedulerIF scheduler = jobDAO.getJobScheduler(jobID);
scheduler.hereIsWorker(request.getWorkerID(),
workerPublicKey, senderPublicKey, request.getPeerAddress(),
requestSpec, workerSpec, responses);
}
return responses;
}
}