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.business.dao.UsersDAO; import org.ourgrid.peer.dao.AllocationDAO; import org.ourgrid.peer.request.StatusChangedAllocatedForBrokerRequestTO; import org.ourgrid.peer.response.LocalHereIsWorkerResponseTO; import org.ourgrid.peer.to.AllocableWorker; import org.ourgrid.peer.to.LocalWorker; import org.ourgrid.peer.to.PeerUserReference; public class StatusChangedAllocatedForBrokerRequester implements RequesterIF<StatusChangedAllocatedForBrokerRequestTO> { public List<IResponseTO> execute(StatusChangedAllocatedForBrokerRequestTO request) { List<IResponseTO> responses = new ArrayList<IResponseTO>(); String senderPublicKey = request.getSenderPublicKey(); String senderUserAtServer = request.getSenderUserAtServer(); LocalWorker localWorker = WorkerControl.getInstance().getLocalWorker(responses, senderUserAtServer); if(localWorker == null){ responses.add(new LoggerResponseTO(WorkerMessages.getUnknownWorkerChangingStatusMessage(senderPublicKey, WorkerStatus.ALLOCATED_FOR_BROKER), LoggerResponseTO.ERROR)); return responses; } if(!checkKey(localWorker.getPublicKey(), senderPublicKey)){ responses.add(new LoggerResponseTO(WorkerMessages.getWrongPublicKeyForWorkerMessage( StringUtil.addressToContainerID(request.getWorkerAddress())), LoggerResponseTO.ERROR)); return responses; } switch (localWorker.getStatus()) { case IN_USE: changeStatusToAllocatedForBroker(responses, localWorker, request.getWorkerAddress(), request.getBrokerPublicKey()); break; default: responses.add(new LoggerResponseTO(WorkerMessages.getInvalidStatusChangeMessage(StringUtil.addressToContainerID(localWorker.getWorkerManagementAddress()), localWorker.getStatus()), LoggerResponseTO.WARN)); return responses; } return responses; } private void changeStatusToAllocatedForBroker(List<IResponseTO> responses, LocalWorker localWorker, String workerAddress, String brokerPublicKey) { if (workerAddress == null){ responses.add(new LoggerResponseTO(WorkerMessages.getNullWorkerStatusChangedMessage(StringUtil.addressToContainerID(localWorker.getWorkerManagementAddress()), WorkerStatus.ALLOCATED_FOR_BROKER), LoggerResponseTO.WARN)); return; } AllocationDAO dao = PeerDAOFactory.getInstance().getAllocationDAO(); AllocableWorker allocable = dao.getAllocableWorker(localWorker.getPublicKey()); if (allocable.getConsumer() == null) { responses.add(new LoggerResponseTO(WorkerMessages.getNullConsumerChangeStatusToAllocatedForBroker(), LoggerResponseTO.WARN)); return; } String consumerPublicKey = allocable.getConsumer().getPublicKey(); if (brokerPublicKey == null || !consumerPublicKey.equals(brokerPublicKey)) { responses.add(new LoggerResponseTO(WorkerMessages.getDifferentConsumerChangeStatusToAllocatedForBroker(), LoggerResponseTO.WARN)); return; } allocable.setAsDelivered(); responses.add(new LoggerResponseTO(WorkerMessages.getStatusChangedMessage(StringUtil.addressToContainerID(localWorker.getWorkerManagementAddress()), LocalWorkerState.IN_USE), LoggerResponseTO.INFO)); responses.add(new LoggerResponseTO(WorkerMessages.getGivingWorkerMessage(StringUtil.addressToContainerID(localWorker.getWorkerManagementAddress()), StringUtil.addressToContainerID(allocable.getConsumer().getConsumerAddress())), LoggerResponseTO.INFO)); UsersDAO usersDAO = PeerDAOFactory.getInstance().getUsersDAO(); PeerUserReference loggedUser = usersDAO.getLoggedUser(allocable.getConsumer().getPublicKey()); if (loggedUser == null) { responses.add(new LoggerResponseTO(WorkerMessages.getUnknownConsumerAllocatedForBroker(allocable.getConsumer().getPublicKey()), LoggerResponseTO.WARN)); return; } String lwpcAddress = loggedUser.getWorkerProviderClientAddress(); if (lwpcAddress != null) { LocalHereIsWorkerResponseTO to = new LocalHereIsWorkerResponseTO(); to.setLwpcAddress(lwpcAddress); to.setRequestSpec(allocable.getRequest().getSpecification()); to.setWorkerAddress(workerAddress); to.setWorkerSpec(allocable.getWorkerSpecification()); to.setWorkerPublicKey(localWorker.getPublicKey()); responses.add(to); WorkerControl.getInstance().statusChanged(responses, StringUtil.addressToUserAtServer(workerAddress), LocalWorkerState.IN_USE); } } }