package org.ourgrid.peer.business.requester;
import static org.ourgrid.common.util.CommonUtils.checkKey;
import java.util.ArrayList;
import java.util.List;
import org.ourgrid.common.interfaces.to.LocalWorkerState;
import org.ourgrid.common.interfaces.to.WorkerStatus;
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.common.util.StringUtil;
import org.ourgrid.peer.business.controller.messages.WorkerMessages;
import org.ourgrid.peer.business.dao.PeerDAOFactory;
import org.ourgrid.peer.request.StatusChangedAllocatedForPeerRequestTO;
import org.ourgrid.peer.response.RemoteHereIsWorkerResponseTO;
import org.ourgrid.peer.to.AllocableWorker;
import org.ourgrid.peer.to.LocalWorker;
public class StatusChangedAllocatedForPeerRequester implements RequesterIF<StatusChangedAllocatedForPeerRequestTO> {
public List<IResponseTO> execute(StatusChangedAllocatedForPeerRequestTO request) {
List<IResponseTO> responses = new ArrayList<IResponseTO>();
String workerPublicKey = request.getWorkerPublicKey();
String workerUserAtServer = request.getWorkerUserAtServer();
LocalWorker localWorker = WorkerControl.getInstance().getLocalWorker(responses, workerUserAtServer);
if(localWorker == null){
responses.add(new LoggerResponseTO(WorkerMessages.getUnknownWorkerChangingStatusMessage(workerPublicKey, WorkerStatus.ALLOCATED_FOR_PEER), LoggerResponseTO.WARN));
return responses;
}
if(!checkKey(localWorker.getPublicKey(),workerPublicKey)){
responses.add(new LoggerResponseTO(WorkerMessages.getWrongPublicKeyForWorkerMessage(StringUtil.addressToContainerID(
localWorker.getWorkerManagementAddress())), LoggerResponseTO.ERROR));
return responses;
}
switch (localWorker.getStatus()) {
case DONATED:
changeStatusToAllocatedForPeer(responses, localWorker, request.getRemoteWorkerManagementAddress(),
request.getPeerPublicKey());
break;
default:
responses.add(new LoggerResponseTO(WorkerMessages.getIgnoredStatusChangeMessage(StringUtil.addressToContainerID(
localWorker.getWorkerManagementAddress()), localWorker.getStatus(),
WorkerStatus.ALLOCATED_FOR_PEER), LoggerResponseTO.WARN));
return responses;
}
return responses;
}
private void changeStatusToAllocatedForPeer(List<IResponseTO> responses, LocalWorker localWorker,
String remoteWorkerManagementAddress, String peerPublicKey) {
if (remoteWorkerManagementAddress == null ){
responses.add(new LoggerResponseTO(WorkerMessages.getNullWorkerStatusChangedMessage(StringUtil.addressToContainerID(
localWorker.getWorkerManagementAddress()), WorkerStatus.ALLOCATED_FOR_PEER), LoggerResponseTO.WARN));
return;
}
AllocableWorker allocable = PeerDAOFactory.getInstance().getAllocationDAO().getAllocableWorker(localWorker.getPublicKey());
if (allocable.getConsumer() == null ){
responses.add(new LoggerResponseTO(WorkerMessages.getNullConsumerChangeStatusToAllocatedForPeer(),
LoggerResponseTO.WARN));
return;
}
String consumerPublicKey = allocable.getConsumer().getPublicKey();
if (!consumerPublicKey.equals(peerPublicKey)) {
responses.add(new LoggerResponseTO(WorkerMessages.getDifferentConsumerChangeStatusToAllocatedForPeer(),
LoggerResponseTO.WARN));
return;
}
allocable.setAsDelivered();
localWorker.setStatus(LocalWorkerState.DONATED);
responses.add(new LoggerResponseTO(WorkerMessages.getStatusChangedMessage(StringUtil.addressToContainerID(localWorker.getWorkerManagementAddress()),
LocalWorkerState.DONATED), LoggerResponseTO.INFO));
responses.add(new LoggerResponseTO(WorkerMessages.getDonatingWorkerMessage(StringUtil.addressToContainerID(localWorker.getWorkerManagementAddress()),
StringUtil.addressToContainerID(allocable.getConsumer().getConsumerAddress())), LoggerResponseTO.INFO));
RemoteHereIsWorkerResponseTO to = new RemoteHereIsWorkerResponseTO();
to.setRwmAddress(remoteWorkerManagementAddress);
to.setRwpcAddress(allocable.getConsumer().getConsumerAddress());
to.setWorkerSpec(allocable.getWorkerSpecification());
responses.add(to);
WorkerControl.getInstance().statusChanged(responses, StringUtil.addressToUserAtServer(localWorker.getWorkerManagementAddress()), LocalWorkerState.DONATED,
StringUtil.addressToUserAtServer(allocable.getConsumer().getConsumerAddress()));
}
}