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.allocation.RedistributionController;
import org.ourgrid.peer.business.controller.messages.WorkerMessages;
import org.ourgrid.peer.business.dao.PeerDAOFactory;
import org.ourgrid.peer.dao.AllocationDAO;
import org.ourgrid.peer.request.StatusChangedRequestTO;
import org.ourgrid.peer.to.AllocableWorker;
import org.ourgrid.peer.to.LocalWorker;
import org.ourgrid.peer.to.Request;
public class StatusChangedRequester implements RequesterIF<StatusChangedRequestTO> {
public List<IResponseTO> execute(StatusChangedRequestTO request) {
List<IResponseTO> responses = new ArrayList<IResponseTO>();
String workerPublicKey = request.getWorkerPublicKey();
String workerUserAtServer = request.getWorkerUserAtServer();
WorkerStatus status = request.getStatus();
LocalWorker localWorker = WorkerControl.getInstance().getLocalWorker(responses, workerUserAtServer);
if(localWorker == null){
responses.add(new LoggerResponseTO(WorkerMessages.getUnknownWorkerChangingStatusMessage(workerPublicKey, status), LoggerResponseTO.WARN));
return responses;
}
if(!checkKey(localWorker.getPublicKey(), workerPublicKey)){
responses.add(new LoggerResponseTO(WorkerMessages.getWrongPublicKeyForWorkerMessage(StringUtil.addressToContainerID(localWorker.getWorkerManagementAddress())), LoggerResponseTO.ERROR));
return responses;
}
switch ( status ) {
case IDLE:
changeStatusIdle(responses, localWorker, workerUserAtServer, request.getLocalWorkerProviderAddress(), request.getMyCertPathDN());
break;
case OWNER:
changeStatusToOwner(responses, localWorker, workerUserAtServer);
break;
case ERROR:
changeStatusToError(responses, localWorker, workerUserAtServer);
break;
default:
break;
}
return responses;
}
private void changeStatusIdle(List<IResponseTO> responses, LocalWorker localWorker, String workerUserAtServer, String localWorkerProviderAddress, String myCertPathDN) {
switch (localWorker.getStatus()) {
case IDLE:
case OWNER:
case DONATED:
case IN_USE:
RedistributionController.getInstance().createAllocableWorker(localWorker, localWorkerProviderAddress, myCertPathDN);
WorkerControl.getInstance().statusChanged(responses, workerUserAtServer, LocalWorkerState.IDLE);
responses.add(new LoggerResponseTO(WorkerMessages.getStatusChangedMessage(StringUtil.addressToContainerID(localWorker.getWorkerManagementAddress()), LocalWorkerState.IDLE),
LoggerResponseTO.DEBUG));
RedistributionController.getInstance().redistributeIdleWorker(responses, localWorker);
break;
default:
responses.add(new LoggerResponseTO(WorkerMessages.getIgnoredStatusChangeMessage(StringUtil.addressToContainerID(localWorker.getWorkerManagementAddress()), localWorker.getStatus(),
WorkerStatus.IDLE), LoggerResponseTO.ERROR));
}
}
private void changeStatusToError(List<IResponseTO> responses, LocalWorker localWorker, String workerUserAtServer) {
if(!localWorker.getStatus().isError()){
changeStatus(responses, localWorker, workerUserAtServer, LocalWorkerState.ERROR);
}
}
private void changeStatusToOwner(List<IResponseTO> responses, LocalWorker localWorker, String workerUserAtServer) {
if(!localWorker.getStatus().isOwner()){
changeStatus(responses, localWorker, workerUserAtServer, LocalWorkerState.OWNER);
}
}
private void changeStatus(List<IResponseTO> responses, LocalWorker localWorker, String workerUserAtServer, LocalWorkerState state) {
responses.add(new LoggerResponseTO(WorkerMessages.getStatusChangedMessage(
StringUtil.addressToContainerID(localWorker.getWorkerManagementAddress()), state),
LoggerResponseTO.INFO));
AllocationDAO allocationDAO = PeerDAOFactory.getInstance().getAllocationDAO();
//String publicKey = workerID.getPublicKey();
String publicKey = localWorker.getPublicKey();
AllocableWorker localAllocableWorker = allocationDAO.getAllocableWorker(publicKey);
if (localAllocableWorker != null) {
Request request = localAllocableWorker.getRequest();
if (request != null) {
request.removeAllocableWorker(localAllocableWorker);
}
allocationDAO.removeLocalAllocableWorker(publicKey);
}
localWorker.setStatus(state);
WorkerControl.getInstance().statusChanged(responses, workerUserAtServer, state);
}
}