private void executeStateMachineForStatus()

in provisioning/provisioning-device-client/src/main/java/com/microsoft/azure/sdk/iot/provisioning/device/internal/task/ProvisioningTask.java [178:275]


    private void executeStateMachineForStatus(RegistrationOperationStatusParser registrationOperationStatusParser)
            throws TimeoutException, InterruptedException, ExecutionException, ProvisioningDeviceClientException, SecurityProviderException

    {
        boolean isContinue = false;
        ProvisioningStatus nextStatus = ProvisioningStatus.fromString(registrationOperationStatusParser.getStatus());
        log.info("Current provisioning status: {}", nextStatus);
        // continue invoking for status until a terminal state is reached
        do
        {
            if (nextStatus == null)
            {
                throw new ProvisioningDeviceClientException("Did not receive a valid status");
            }

            switch (nextStatus)
            {
                case UNASSIGNED:
                    //intended fall through
                case ASSIGNING:
                    log.trace("Polling device provisioning service for status of registration...");
                    registrationOperationStatusParser = this.invokeStatus(registrationOperationStatusParser.getOperationId());
                    nextStatus = ProvisioningStatus.fromString(registrationOperationStatusParser.getStatus());
                    isContinue = true;
                    break;
                case ASSIGNED:
                    this.dpsStatus = PROVISIONING_DEVICE_STATUS_ASSIGNED;
                    DeviceRegistrationResultParser registrationStatus = registrationOperationStatusParser.getRegistrationState();

                    if (registrationStatus == null
                            || registrationStatus.getAssignedHub() == null
                            || registrationStatus.getAssignedHub().isEmpty()
                            || registrationStatus.getDeviceId() == null
                            || registrationStatus.getDeviceId().isEmpty())
                    {
                        throw new ProvisioningDeviceClientException("Could not retrieve Assigned Hub or Device ID and status changed to Assigned");
                    }

                    RegistrationResult registrationInfo = new RegistrationResult(
                                                            registrationStatus.getAssignedHub(),
                                                            registrationStatus.getDeviceId(),
                                                            registrationStatus.getPayload(), PROVISIONING_DEVICE_STATUS_ASSIGNED);

                    registrationInfo.setRegistrationId(registrationStatus.getRegistrationId());
                    registrationInfo.setStatus(registrationStatus.getStatus());
                    registrationInfo.setSubstatus(ProvisioningDeviceClientSubstatus.fromString(registrationStatus.getSubstatus()));
                    registrationInfo.setCreatedDateTimeUtc(registrationStatus.getCreatedDateTimeUtc());
                    registrationInfo.setLastUpdatesDateTimeUtc(registrationStatus.getLastUpdatesDateTimeUtc());
                    registrationInfo.setETag(registrationStatus.getETag());

                    if (this.securityProvider instanceof SecurityProviderTpm)
                    {
                        if (registrationStatus.getTpm() == null
                                || registrationStatus.getTpm().getAuthenticationKey() == null
                                || registrationStatus.getTpm().getAuthenticationKey().isEmpty())
                        {
                            throw new ProvisioningDeviceClientException("Could not retrieve Authentication key when status was assigned");
                        }

                        String authenticationKey = registrationStatus.getTpm().getAuthenticationKey();
                        ((SecurityProviderTpm) this.securityProvider).activateIdentityKey(decodeBase64(authenticationKey.getBytes(StandardCharsets.UTF_8)));
                    }
                    log.info("Device provisioning service assigned the device successfully");
                    this.invokeRegistrationCallback(registrationInfo, null);
                    isContinue = false;
                    break;
                case FAILED:
                    this.dpsStatus = PROVISIONING_DEVICE_STATUS_FAILED;
                    String errorMessage = registrationOperationStatusParser.getRegistrationState().getErrorMessage();
                    ProvisioningDeviceHubException dpsHubException = new ProvisioningDeviceHubException(errorMessage);
                    if (registrationOperationStatusParser.getRegistrationState().getErrorCode() != null)
                    {
                        dpsHubException.setErrorCode(registrationOperationStatusParser.getRegistrationState().getErrorCode());
                    }

                    registrationInfo = new RegistrationResult(null, null, null, PROVISIONING_DEVICE_STATUS_FAILED);
                    log.error("Device provisioning service failed to provision the device, finished with status FAILED: {}", errorMessage);
                    this.invokeRegistrationCallback(registrationInfo, dpsHubException);
                    isContinue = false;
                    break;
                case DISABLED:
                    this.dpsStatus = PROVISIONING_DEVICE_STATUS_DISABLED;
                    String disabledErrorMessage = registrationOperationStatusParser.getRegistrationState().getErrorMessage();
                    dpsHubException = new ProvisioningDeviceHubException(disabledErrorMessage);
                    if (registrationOperationStatusParser.getRegistrationState().getErrorCode() != null)
                    {
                        dpsHubException.setErrorCode(registrationOperationStatusParser.getRegistrationState().getErrorCode());
                    }

                    registrationInfo = new RegistrationResult(null, null, null, PROVISIONING_DEVICE_STATUS_DISABLED);
                    log.error("Device provisioning service failed to provision the device, finished with status DISABLED: {}", disabledErrorMessage);
                    this.invokeRegistrationCallback(registrationInfo, dpsHubException);
                    isContinue = false;
                    break;
            }
        }
        while (isContinue);
    }