private void process(NsaMessage provisionMessage) { String correlationId = provisionMessage.getCorrelationId(); String replyTo = provisionMessage.getReplyTo(); String requesterNSA = provisionMessage.getRequesterNSA(); String providerNSA = provisionMessage.getProviderNSA(); String connectionId = provisionMessage.getConnectionId(); String globalReservationId = provisionMessage.getGlobalReservationId(); // Get handles to the data managers. DataManager dataManager = DataManager.getInstance(); StateMachineManager stateMachineManager = dataManager.getStateMachineManager(); CastingDirector castingDirector = dataManager.getCastingDirector(); PendingOperationManager pendingOperations = dataManager.getPendingOperationManager(); // Update the time we sent out the operation. PendingOperation pendingOperation = pendingOperations.get(correlationId); if (pendingOperation == null) { logger.error( "ProvisionRequesterLocalActor.process: could not find pendingOperation for " + correlationId); return; } pendingOperation.setTimeSentNow(); PathSegment pathSegment = pendingOperation.getSegment(); String parentConnectionId = pathSegment.getParentConnectionId(); String scheduleId = pathSegment.getData(); // Get the state machine using the parent connectionId. StateMachine stateMachine = stateMachineManager.getStateMachine(parentConnectionId); if (stateMachine == null) { logger.error( "ProvisionRequesterLocalActor.process: could not find stateMachine for " + parentConnectionId); return; } /* * These are the valid states to receive a provision message. We would * have already rejected the message in the ProvisionProviderActor for * invalid states on the parent state machine, however, we need to * handle our segment individually since some segments may already be * provisioned (ESnet requested the protocol leave already provisioned * segements in the PROVISIONED state if other segments fail). * * If we are in the PROVISIONED state then we can send a * provisionConfirmed back immediately. */ ConnectionStateType segmentState = pathSegment.getCurrentState(); if (segmentState == ConnectionStateType.PROVISIONED) { // Send back a provisionConfirmed. logger.info( "ProvisionRequesterLocalActor.process: already provisioned - sending provisionConfirm back for scheduleId=" + scheduleId); NsaMessage childMessage = new NsaMessage(); childMessage.setCorrelationId(correlationId); childMessage.setConnectionId(connectionId); childMessage.setConnectionState(pathSegment.getCurrentState()); childMessage.setGlobalReservationId(globalReservationId); childMessage.setMessageType(NsaMessage.MessageType.provisionConfirmedRequester); childMessage.setProviderNSA(providerNSA); childMessage.setRequesterNSA(requesterNSA); // Route this message to the appropriate ReservationFailedRequesterActor for processing. castingDirector.send(childMessage); logger.info( "ProvisionRequesterLocalActor.process: provisionConfirmed message issued to actor so returning"); return; } else if (segmentState != ConnectionStateType.RESERVED && segmentState != ConnectionStateType.SCHEDULED) { /* * We need to feed this back to the reserveFailedRequesterActor * to process with other responses. */ ServiceException exception = ExceptionCodes.buildProviderException( ExceptionCodes.INVALID_STATE, "nrmSegmentState", segmentState.value()); NsaMessage failedMessage = new NsaMessage(); failedMessage.setMessageType(NsaMessage.MessageType.provisionFailedRequester); failedMessage.setCorrelationId(correlationId); failedMessage.setRequesterNSA(requesterNSA); failedMessage.setProviderNSA(providerNSA); failedMessage.setConnectionId(connectionId); failedMessage.setGlobalReservationId(globalReservationId); failedMessage.setPayload(exception.getFaultInfo()); // Route this message to the appropriate ReservationFailedRequesterActor for processing. castingDirector.send(failedMessage); logger.error( "ProvisionRequesterLocalActor.process: segment state invalid for connectionId=" + parentConnectionId + ", state=" + segmentState.name()); return; } /* * We transition into the AUTO_PROVISION state to kick off this schedule * at startTime. If after startTime we should go into PROVISIONING but * we simplify this for the local NRM and just set to AUTO_PROVISION. */ logger.info( "ProvisionRequesterLocalActor.process: connectionId=" + parentConnectionId + " transitioning to state=" + ConnectionStateType.AUTO_PROVISION.name()); pathSegment.setCurrentState(ConnectionStateType.AUTO_PROVISION); /* * Now we need to kick the startTime scheduler to look at this new * state machine state. When it is time for provisioning to start on * the local NRM this will manage the transition. */ logger.info("ProvisionRequesterLocalActor.process: kicking StartTimeScheduler."); StartTimeScheduler.getInstance().timerAudit(stateMachine.getStartTime()); logger.info("ProvisionRequesterLocalActor.process: completed"); }