From 1a718593ecd6919f164b40830d3783b4415aab27 Mon Sep 17 00:00:00 2001 From: zbeacon Date: Mon, 12 Oct 2020 16:19:36 +0300 Subject: [PATCH] Refactoring --- .../device/DeviceProvisionServiceImpl.java | 68 ++++++++----------- .../transport/DefaultTransportApiService.java | 4 +- .../dao/device/DeviceProvisionService.java | 2 +- 3 files changed, 33 insertions(+), 41 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/device/DeviceProvisionServiceImpl.java b/application/src/main/java/org/thingsboard/server/service/device/DeviceProvisionServiceImpl.java index ab333442c4..d372b878f7 100644 --- a/application/src/main/java/org/thingsboard/server/service/device/DeviceProvisionServiceImpl.java +++ b/application/src/main/java/org/thingsboard/server/service/device/DeviceProvisionServiceImpl.java @@ -65,6 +65,7 @@ import org.thingsboard.server.service.state.DeviceStateService; import java.util.Collections; import java.util.List; import java.util.Optional; +import java.util.concurrent.ExecutionException; import java.util.concurrent.locks.ReentrantLock; @@ -109,7 +110,7 @@ public class DeviceProvisionServiceImpl implements DeviceProvisionService { } @Override - public ListenableFuture provisionDevice(ProvisionRequest provisionRequest) { + public ProvisionResponse provisionDevice(ProvisionRequest provisionRequest) { String provisionRequestKey = provisionRequest.getCredentials().getProvisionDeviceKey(); String provisionRequestSecret = provisionRequest.getCredentials().getProvisionDeviceSecret(); @@ -152,35 +153,24 @@ public class DeviceProvisionServiceImpl implements DeviceProvisionService { throw new ProvisionFailedException(ProvisionResponseStatus.NOT_FOUND.name()); } - private ListenableFuture processProvision(Device device, ProvisionRequest provisionRequest) { - ListenableFuture> provisionStateFuture = attributesService.find(device.getTenantId(), device.getId(), - DataConstants.SERVER_SCOPE, DEVICE_PROVISION_STATE); - ListenableFuture provisionedFuture = Futures.transformAsync(provisionStateFuture, optionalAtr -> { - if (optionalAtr != null && optionalAtr.isPresent()) { - String state = optionalAtr.get().getValueAsString(); - if (state.equals(PROVISIONED_STATE)) { - return Futures.immediateFuture(true); - } else { - log.error("[{}][{}] Unknown provision state: {}!", device.getName(), DEVICE_PROVISION_STATE, state); - throw new ProvisionFailedException(ProvisionResponseStatus.FAILURE.name()); - } - } - return Futures.transform(saveProvisionStateAttribute(device), input -> false, MoreExecutors.directExecutor()); - }, MoreExecutors.directExecutor()); - if (provisionedFuture.isCancelled()) { - throw new RuntimeException("Unknown provision state!"); - } - return Futures.transform(provisionedFuture, provisioned -> { - if (provisioned) { + private ProvisionResponse processProvision(Device device, ProvisionRequest provisionRequest) { + try { + Optional provisionState = attributesService.find(device.getTenantId(), device.getId(), + DataConstants.SERVER_SCOPE, DEVICE_PROVISION_STATE).get(); + if (provisionState != null && provisionState.isPresent() && !provisionState.get().getValueAsString().equals(PROVISIONED_STATE)) { notify(device, provisionRequest, DataConstants.PROVISION_FAILURE, false); throw new ProvisionFailedException(ProvisionResponseStatus.FAILURE.name()); + } else { + saveProvisionStateAttribute(device).get(); + notify(device, provisionRequest, DataConstants.PROVISION_SUCCESS, true); } - notify(device, provisionRequest, DataConstants.PROVISION_SUCCESS, true); - return new ProvisionResponse(deviceCredentialsService.findDeviceCredentialsByDeviceId(device.getTenantId(), device.getId()), ProvisionResponseStatus.SUCCESS); - }, MoreExecutors.directExecutor()); + } catch (InterruptedException | ExecutionException e) { + throw new ProvisionFailedException(ProvisionResponseStatus.FAILURE.name()); + } + return new ProvisionResponse(deviceCredentialsService.findDeviceCredentialsByDeviceId(device.getTenantId(), device.getId()), ProvisionResponseStatus.SUCCESS); } - private ListenableFuture createDevice(ProvisionRequest provisionRequest, DeviceProfile profile) { + private ProvisionResponse createDevice(ProvisionRequest provisionRequest, DeviceProfile profile) { deviceCreationLock.lock(); try { return processCreateDevice(provisionRequest, profile); @@ -194,22 +184,24 @@ public class DeviceProvisionServiceImpl implements DeviceProvisionService { logAction(device.getTenantId(), device.getCustomerId(), device, success, provisionRequest); } - private ListenableFuture processCreateDevice(ProvisionRequest provisionRequest, DeviceProfile profile) { + private ProvisionResponse processCreateDevice(ProvisionRequest provisionRequest, DeviceProfile profile) { Device device = deviceService.findDeviceByTenantIdAndName(profile.getTenantId(), provisionRequest.getDeviceName()); - if (device == null) { - Device savedDevice = deviceService.saveDevice(provisionRequest, profile); + try { + if (device == null) { + Device savedDevice = deviceService.saveDevice(provisionRequest, profile); - deviceStateService.onDeviceAdded(savedDevice); - pushDeviceCreatedEventToRuleEngine(savedDevice); - notify(savedDevice, provisionRequest, DataConstants.PROVISION_SUCCESS, true); + deviceStateService.onDeviceAdded(savedDevice); + saveProvisionStateAttribute(savedDevice).get(); + pushDeviceCreatedEventToRuleEngine(savedDevice); + notify(savedDevice, provisionRequest, DataConstants.PROVISION_SUCCESS, true); - return Futures.transform(saveProvisionStateAttribute(savedDevice), input -> - new ProvisionResponse( - getDeviceCredentials(savedDevice), - ProvisionResponseStatus.SUCCESS), MoreExecutors.directExecutor()); - } else { - log.warn("[{}] The device is already provisioned!", device.getName()); - notify(device, provisionRequest, DataConstants.PROVISION_FAILURE, false); + return new ProvisionResponse(getDeviceCredentials(savedDevice), ProvisionResponseStatus.SUCCESS); + } else { + log.warn("[{}] The device is already provisioned!", device.getName()); + notify(device, provisionRequest, DataConstants.PROVISION_FAILURE, false); + throw new ProvisionFailedException(ProvisionResponseStatus.FAILURE.name()); + } + } catch (InterruptedException | ExecutionException e) { throw new ProvisionFailedException(ProvisionResponseStatus.FAILURE.name()); } } diff --git a/application/src/main/java/org/thingsboard/server/service/transport/DefaultTransportApiService.java b/application/src/main/java/org/thingsboard/server/service/transport/DefaultTransportApiService.java index 7791ec67a7..7fa4630359 100644 --- a/application/src/main/java/org/thingsboard/server/service/transport/DefaultTransportApiService.java +++ b/application/src/main/java/org/thingsboard/server/service/transport/DefaultTransportApiService.java @@ -278,7 +278,7 @@ public class DefaultTransportApiService implements TransportApiService { private ListenableFuture handle(ProvisionDeviceRequestMsg requestMsg) { ListenableFuture provisionResponseFuture = null; try { - provisionResponseFuture = deviceProvisionService.provisionDevice( + provisionResponseFuture = Futures.immediateFuture(deviceProvisionService.provisionDevice( new ProvisionRequest( requestMsg.getDeviceName(), requestMsg.getCredentialsType() != null ? DeviceCredentialsType.valueOf(requestMsg.getCredentialsType().name()) : null, @@ -289,7 +289,7 @@ public class DefaultTransportApiService implements TransportApiService { requestMsg.getCredentialsDataProto().getValidateDeviceX509CertRequestMsg().getHash()), new ProvisionDeviceProfileCredentials( requestMsg.getProvisionDeviceCredentialsMsg().getProvisionDeviceKey(), - requestMsg.getProvisionDeviceCredentialsMsg().getProvisionDeviceSecret()))); + requestMsg.getProvisionDeviceCredentialsMsg().getProvisionDeviceSecret())))); } catch (ProvisionFailedException e) { return Futures.immediateFuture(getTransportApiResponseMsg( TransportProtos.DeviceCredentialsProto.getDefaultInstance(), diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/device/DeviceProvisionService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/device/DeviceProvisionService.java index 2a0d651801..5d038b2d31 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/device/DeviceProvisionService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/device/DeviceProvisionService.java @@ -24,5 +24,5 @@ import org.thingsboard.server.dao.device.provision.ProvisionResponse; public interface DeviceProvisionService { - ListenableFuture provisionDevice(ProvisionRequest provisionRequest) throws ProvisionFailedException; + ProvisionResponse provisionDevice(ProvisionRequest provisionRequest) throws ProvisionFailedException; }