package org.ourgrid.worker.business.requester; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; import org.ourgrid.common.WorkerLoginResult; 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.internal.response.ScheduleActionWithFixedDelayResponseTO; import org.ourgrid.worker.WorkerConstants; import org.ourgrid.worker.business.controller.ExecutionController; import org.ourgrid.worker.business.controller.WorkerController; import org.ourgrid.worker.business.dao.WorkerDAOFactory; import org.ourgrid.worker.business.dao.WorkerStatusDAO; import org.ourgrid.worker.business.messages.WorkerLoginMessages; import org.ourgrid.worker.business.messages.WorkerManagementControllerMessages; import org.ourgrid.worker.request.WorkerLoginSucceededRequestTO; import org.ourgrid.worker.response.StatusChangedResponseTO; public class WorkerLoginSucceededRequester implements RequesterIF<WorkerLoginSucceededRequestTO> { @Override public List<IResponseTO> execute(WorkerLoginSucceededRequestTO request) { List<IResponseTO> responses = new ArrayList<IResponseTO>(); WorkerStatusDAO workerStatusDAO = WorkerDAOFactory.getInstance().getWorkerStatusDAO(); if (workerStatusDAO.isLogged()) { responses.add(new LoggerResponseTO(WorkerLoginMessages.getWorkerAlreadyLoggedMessage(), LoggerResponseTO.WARN)); return responses; } WorkerLoginResult result = request.getResult(); WorkerStatus workerStatus = workerStatusDAO.getStatus(); if (!result.getResultMessage().equals(WorkerLoginResult.OK)) { responses.add(new LoggerResponseTO(WorkerLoginMessages. getWorkerCanNotLoggedMessage(result.toString()), LoggerResponseTO.WARN)); workerStatusDAO.setLoginError(result.getResultMessage()); return responses; } responses.add(new LoggerResponseTO(WorkerLoginMessages. getWorkerLoginSucceededMessage(),LoggerResponseTO.INFO)); workerStatusDAO.setMasterPeerPublicKey(request.getSenderPublicKey()); workerStatusDAO.setLoginError(null); if (workerStatusDAO.isErrorState()) { StatusChangedResponseTO statusChangedResponseTO = new StatusChangedResponseTO(); statusChangedResponseTO.setClientAddress(workerStatusDAO.getMasterPeerAddress()); statusChangedResponseTO.setStatus(workerStatus); responses.add(statusChangedResponseTO); responses.add(new LoggerResponseTO(WorkerManagementControllerMessages.getMasterPeerTryingToCommandWorkerOnErrorStateMessage(), LoggerResponseTO.WARN)); return responses; } boolean isWorkingState = workerStatusDAO.isWorkingState(); WorkerController.getInstance().interruptWorking(responses, true); WorkerStatus newStatus = request.isIdlenessDetectorOn() ? WorkerStatus.OWNER : WorkerStatus.IDLE; workerStatusDAO.setStatus(newStatus); // preemption if (isWorkingState) { ExecutionController.getInstance().beginAllocation(responses); } if (!workerStatusDAO.isPreparingAllocationState()) { StatusChangedResponseTO statusChangedResponseTO = new StatusChangedResponseTO(); statusChangedResponseTO.setClientAddress(workerStatusDAO.getMasterPeerAddress()); statusChangedResponseTO.setStatus(newStatus); responses.add(statusChangedResponseTO); } createReportWorkAccountingAction(responses); if (request.isWorkerSpecReportPropOn()) { ScheduleActionWithFixedDelayResponseTO scheduleAction2 = new ScheduleActionWithFixedDelayResponseTO(); scheduleAction2.setActionName(WorkerConstants.REPORT_WORKER_SPEC_ACTION_NAME); scheduleAction2.setDelay(request.getWorkerSpecReportTime()); scheduleAction2.setTimeUnit(TimeUnit.MILLISECONDS); responses.add(scheduleAction2); } return responses; } private void createReportWorkAccountingAction(List<IResponseTO> responses) { ScheduleActionWithFixedDelayResponseTO scheduleAction1 = new ScheduleActionWithFixedDelayResponseTO(); scheduleAction1.setActionName(WorkerConstants.REPORT_WORK_ACCOUNTING_ACTION_NAME); scheduleAction1.setDelay(WorkerConstants.REPORT_WORK_ACCOUNTING_TIME); scheduleAction1.setInitialDelay(WorkerConstants.REPORT_WORK_ACCOUNTING_TIME); scheduleAction1.setTimeUnit(TimeUnit.SECONDS); scheduleAction1.setStoreFuture(true); responses.add(scheduleAction1); } }