Refactoring
This commit is contained in:
parent
005ad70657
commit
1a718593ec
@ -65,6 +65,7 @@ import org.thingsboard.server.service.state.DeviceStateService;
|
|||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
import java.util.concurrent.ExecutionException;
|
||||||
import java.util.concurrent.locks.ReentrantLock;
|
import java.util.concurrent.locks.ReentrantLock;
|
||||||
|
|
||||||
|
|
||||||
@ -109,7 +110,7 @@ public class DeviceProvisionServiceImpl implements DeviceProvisionService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ListenableFuture<ProvisionResponse> provisionDevice(ProvisionRequest provisionRequest) {
|
public ProvisionResponse provisionDevice(ProvisionRequest provisionRequest) {
|
||||||
String provisionRequestKey = provisionRequest.getCredentials().getProvisionDeviceKey();
|
String provisionRequestKey = provisionRequest.getCredentials().getProvisionDeviceKey();
|
||||||
String provisionRequestSecret = provisionRequest.getCredentials().getProvisionDeviceSecret();
|
String provisionRequestSecret = provisionRequest.getCredentials().getProvisionDeviceSecret();
|
||||||
|
|
||||||
@ -152,35 +153,24 @@ public class DeviceProvisionServiceImpl implements DeviceProvisionService {
|
|||||||
throw new ProvisionFailedException(ProvisionResponseStatus.NOT_FOUND.name());
|
throw new ProvisionFailedException(ProvisionResponseStatus.NOT_FOUND.name());
|
||||||
}
|
}
|
||||||
|
|
||||||
private ListenableFuture<ProvisionResponse> processProvision(Device device, ProvisionRequest provisionRequest) {
|
private ProvisionResponse processProvision(Device device, ProvisionRequest provisionRequest) {
|
||||||
ListenableFuture<Optional<AttributeKvEntry>> provisionStateFuture = attributesService.find(device.getTenantId(), device.getId(),
|
try {
|
||||||
DataConstants.SERVER_SCOPE, DEVICE_PROVISION_STATE);
|
Optional<AttributeKvEntry> provisionState = attributesService.find(device.getTenantId(), device.getId(),
|
||||||
ListenableFuture<Boolean> provisionedFuture = Futures.transformAsync(provisionStateFuture, optionalAtr -> {
|
DataConstants.SERVER_SCOPE, DEVICE_PROVISION_STATE).get();
|
||||||
if (optionalAtr != null && optionalAtr.isPresent()) {
|
if (provisionState != null && provisionState.isPresent() && !provisionState.get().getValueAsString().equals(PROVISIONED_STATE)) {
|
||||||
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) {
|
|
||||||
notify(device, provisionRequest, DataConstants.PROVISION_FAILURE, false);
|
notify(device, provisionRequest, DataConstants.PROVISION_FAILURE, false);
|
||||||
throw new ProvisionFailedException(ProvisionResponseStatus.FAILURE.name());
|
throw new ProvisionFailedException(ProvisionResponseStatus.FAILURE.name());
|
||||||
|
} else {
|
||||||
|
saveProvisionStateAttribute(device).get();
|
||||||
|
notify(device, provisionRequest, DataConstants.PROVISION_SUCCESS, true);
|
||||||
}
|
}
|
||||||
notify(device, provisionRequest, DataConstants.PROVISION_SUCCESS, true);
|
} catch (InterruptedException | ExecutionException e) {
|
||||||
return new ProvisionResponse(deviceCredentialsService.findDeviceCredentialsByDeviceId(device.getTenantId(), device.getId()), ProvisionResponseStatus.SUCCESS);
|
throw new ProvisionFailedException(ProvisionResponseStatus.FAILURE.name());
|
||||||
}, MoreExecutors.directExecutor());
|
}
|
||||||
|
return new ProvisionResponse(deviceCredentialsService.findDeviceCredentialsByDeviceId(device.getTenantId(), device.getId()), ProvisionResponseStatus.SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
private ListenableFuture<ProvisionResponse> createDevice(ProvisionRequest provisionRequest, DeviceProfile profile) {
|
private ProvisionResponse createDevice(ProvisionRequest provisionRequest, DeviceProfile profile) {
|
||||||
deviceCreationLock.lock();
|
deviceCreationLock.lock();
|
||||||
try {
|
try {
|
||||||
return processCreateDevice(provisionRequest, profile);
|
return processCreateDevice(provisionRequest, profile);
|
||||||
@ -194,22 +184,24 @@ public class DeviceProvisionServiceImpl implements DeviceProvisionService {
|
|||||||
logAction(device.getTenantId(), device.getCustomerId(), device, success, provisionRequest);
|
logAction(device.getTenantId(), device.getCustomerId(), device, success, provisionRequest);
|
||||||
}
|
}
|
||||||
|
|
||||||
private ListenableFuture<ProvisionResponse> processCreateDevice(ProvisionRequest provisionRequest, DeviceProfile profile) {
|
private ProvisionResponse processCreateDevice(ProvisionRequest provisionRequest, DeviceProfile profile) {
|
||||||
Device device = deviceService.findDeviceByTenantIdAndName(profile.getTenantId(), provisionRequest.getDeviceName());
|
Device device = deviceService.findDeviceByTenantIdAndName(profile.getTenantId(), provisionRequest.getDeviceName());
|
||||||
if (device == null) {
|
try {
|
||||||
Device savedDevice = deviceService.saveDevice(provisionRequest, profile);
|
if (device == null) {
|
||||||
|
Device savedDevice = deviceService.saveDevice(provisionRequest, profile);
|
||||||
|
|
||||||
deviceStateService.onDeviceAdded(savedDevice);
|
deviceStateService.onDeviceAdded(savedDevice);
|
||||||
pushDeviceCreatedEventToRuleEngine(savedDevice);
|
saveProvisionStateAttribute(savedDevice).get();
|
||||||
notify(savedDevice, provisionRequest, DataConstants.PROVISION_SUCCESS, true);
|
pushDeviceCreatedEventToRuleEngine(savedDevice);
|
||||||
|
notify(savedDevice, provisionRequest, DataConstants.PROVISION_SUCCESS, true);
|
||||||
|
|
||||||
return Futures.transform(saveProvisionStateAttribute(savedDevice), input ->
|
return new ProvisionResponse(getDeviceCredentials(savedDevice), ProvisionResponseStatus.SUCCESS);
|
||||||
new ProvisionResponse(
|
} else {
|
||||||
getDeviceCredentials(savedDevice),
|
log.warn("[{}] The device is already provisioned!", device.getName());
|
||||||
ProvisionResponseStatus.SUCCESS), MoreExecutors.directExecutor());
|
notify(device, provisionRequest, DataConstants.PROVISION_FAILURE, false);
|
||||||
} else {
|
throw new ProvisionFailedException(ProvisionResponseStatus.FAILURE.name());
|
||||||
log.warn("[{}] The device is already provisioned!", device.getName());
|
}
|
||||||
notify(device, provisionRequest, DataConstants.PROVISION_FAILURE, false);
|
} catch (InterruptedException | ExecutionException e) {
|
||||||
throw new ProvisionFailedException(ProvisionResponseStatus.FAILURE.name());
|
throw new ProvisionFailedException(ProvisionResponseStatus.FAILURE.name());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -278,7 +278,7 @@ public class DefaultTransportApiService implements TransportApiService {
|
|||||||
private ListenableFuture<TransportApiResponseMsg> handle(ProvisionDeviceRequestMsg requestMsg) {
|
private ListenableFuture<TransportApiResponseMsg> handle(ProvisionDeviceRequestMsg requestMsg) {
|
||||||
ListenableFuture<ProvisionResponse> provisionResponseFuture = null;
|
ListenableFuture<ProvisionResponse> provisionResponseFuture = null;
|
||||||
try {
|
try {
|
||||||
provisionResponseFuture = deviceProvisionService.provisionDevice(
|
provisionResponseFuture = Futures.immediateFuture(deviceProvisionService.provisionDevice(
|
||||||
new ProvisionRequest(
|
new ProvisionRequest(
|
||||||
requestMsg.getDeviceName(),
|
requestMsg.getDeviceName(),
|
||||||
requestMsg.getCredentialsType() != null ? DeviceCredentialsType.valueOf(requestMsg.getCredentialsType().name()) : null,
|
requestMsg.getCredentialsType() != null ? DeviceCredentialsType.valueOf(requestMsg.getCredentialsType().name()) : null,
|
||||||
@ -289,7 +289,7 @@ public class DefaultTransportApiService implements TransportApiService {
|
|||||||
requestMsg.getCredentialsDataProto().getValidateDeviceX509CertRequestMsg().getHash()),
|
requestMsg.getCredentialsDataProto().getValidateDeviceX509CertRequestMsg().getHash()),
|
||||||
new ProvisionDeviceProfileCredentials(
|
new ProvisionDeviceProfileCredentials(
|
||||||
requestMsg.getProvisionDeviceCredentialsMsg().getProvisionDeviceKey(),
|
requestMsg.getProvisionDeviceCredentialsMsg().getProvisionDeviceKey(),
|
||||||
requestMsg.getProvisionDeviceCredentialsMsg().getProvisionDeviceSecret())));
|
requestMsg.getProvisionDeviceCredentialsMsg().getProvisionDeviceSecret()))));
|
||||||
} catch (ProvisionFailedException e) {
|
} catch (ProvisionFailedException e) {
|
||||||
return Futures.immediateFuture(getTransportApiResponseMsg(
|
return Futures.immediateFuture(getTransportApiResponseMsg(
|
||||||
TransportProtos.DeviceCredentialsProto.getDefaultInstance(),
|
TransportProtos.DeviceCredentialsProto.getDefaultInstance(),
|
||||||
|
|||||||
@ -24,5 +24,5 @@ import org.thingsboard.server.dao.device.provision.ProvisionResponse;
|
|||||||
|
|
||||||
public interface DeviceProvisionService {
|
public interface DeviceProvisionService {
|
||||||
|
|
||||||
ListenableFuture<ProvisionResponse> provisionDevice(ProvisionRequest provisionRequest) throws ProvisionFailedException;
|
ProvisionResponse provisionDevice(ProvisionRequest provisionRequest) throws ProvisionFailedException;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user