From b84b505d9bb98f01f67c3a833ea47651ba03ed17 Mon Sep 17 00:00:00 2001 From: Viacheslav Klimov Date: Wed, 1 Sep 2021 17:44:11 +0300 Subject: [PATCH] Refactor --- .../device/DeviceBulkImportService.java | 74 +++++++++---------- .../importing/BulkImportColumnType.java | 13 +++- .../device/DeviceCredentialsServiceImpl.java | 9 ++- 3 files changed, 50 insertions(+), 46 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/device/DeviceBulkImportService.java b/application/src/main/java/org/thingsboard/server/service/device/DeviceBulkImportService.java index 5f5e363b45..897679d1aa 100644 --- a/application/src/main/java/org/thingsboard/server/service/device/DeviceBulkImportService.java +++ b/application/src/main/java/org/thingsboard/server/service/device/DeviceBulkImportService.java @@ -20,6 +20,7 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.TextNode; import lombok.SneakyThrows; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.server.cluster.TbClusterService; @@ -54,6 +55,7 @@ import org.thingsboard.server.service.security.model.SecurityUser; import org.thingsboard.server.service.security.permission.AccessControlService; import org.thingsboard.server.service.telemetry.TelemetrySubscriptionService; +import java.util.Collection; import java.util.EnumSet; import java.util.Map; import java.util.Optional; @@ -150,57 +152,25 @@ public class DeviceBulkImportService extends AbstractBulkImportService { DeviceCredentials credentials = new DeviceCredentials(); - if (columns.contains(BulkImportColumnType.ACCESS_TOKEN)) { - credentials.setCredentialsType(DeviceCredentialsType.ACCESS_TOKEN); - credentials.setCredentialsId(fields.get(BulkImportColumnType.ACCESS_TOKEN)); - } else if (CollectionUtils.containsAny(columns, EnumSet.of(BulkImportColumnType.MQTT_CLIENT_ID, BulkImportColumnType.MQTT_USER_NAME, BulkImportColumnType.MQTT_PASSWORD))) { - credentials.setCredentialsType(DeviceCredentialsType.MQTT_BASIC); - - BasicMqttCredentials basicMqttCredentials = new BasicMqttCredentials(); - basicMqttCredentials.setClientId(fields.get(BulkImportColumnType.MQTT_CLIENT_ID)); - basicMqttCredentials.setUserName(fields.get(BulkImportColumnType.MQTT_USER_NAME)); - basicMqttCredentials.setPassword(fields.get(BulkImportColumnType.MQTT_PASSWORD)); - credentials.setCredentialsValue(JacksonUtil.toString(basicMqttCredentials)); - } else if (columns.contains(BulkImportColumnType.X509)) { - credentials.setCredentialsType(DeviceCredentialsType.X509_CERTIFICATE); - credentials.setCredentialsValue(fields.get(BulkImportColumnType.X509)); - } else if (columns.contains(BulkImportColumnType.LWM2M_CLIENT_ENDPOINT)) { + if (columns.contains(BulkImportColumnType.LWM2M_CLIENT_ENDPOINT)) { credentials.setCredentialsType(DeviceCredentialsType.LWM2M_CREDENTIALS); ObjectNode lwm2mCredentials = JacksonUtil.newObjectNode(); ObjectNode client = JacksonUtil.newObjectNode(); - Stream.of(BulkImportColumnType.LWM2M_CLIENT_ENDPOINT, BulkImportColumnType.LWM2M_CLIENT_SECURITY_CONFIG_MODE, - BulkImportColumnType.LWM2M_CLIENT_IDENTITY, BulkImportColumnType.LWM2M_CLIENT_KEY, BulkImportColumnType.LWM2M_CLIENT_CERT) - .forEach(lwm2mClientProperty -> { - String value = fields.get(lwm2mClientProperty); - if (value != null) { - client.set(lwm2mClientProperty.getKey(), new TextNode(value)); - } - }); - + setValues(client, fields, Set.of(BulkImportColumnType.LWM2M_CLIENT_SECURITY_CONFIG_MODE, + BulkImportColumnType.LWM2M_CLIENT_ENDPOINT, BulkImportColumnType.LWM2M_CLIENT_IDENTITY, + BulkImportColumnType.LWM2M_CLIENT_KEY, BulkImportColumnType.LWM2M_CLIENT_CERT)); LwM2MClientCredentials lwM2MClientCredentials = JacksonUtil.treeToValue(client, LwM2MClientCredentials.class); // so that only fields needed for specific type of lwM2MClientCredentials were saved in json lwm2mCredentials.set("client", JacksonUtil.valueToTree(lwM2MClientCredentials)); ObjectNode bootstrapServer = JacksonUtil.newObjectNode(); - Stream.of(BulkImportColumnType.LWM2M_BOOTSTRAP_SERVER_SECURITY_MODE, BulkImportColumnType.LWM2M_BOOTSTRAP_SERVER_PUBLIC_KEY_OR_ID, - BulkImportColumnType.LWM2M_BOOTSTRAP_SERVER_SECRET_KEY) - .forEach(lwm2mBootstrapServerProperty -> { - String value = fields.get(lwm2mBootstrapServerProperty); - if (value != null) { - bootstrapServer.set(lwm2mBootstrapServerProperty.getKey(), new TextNode(value)); - } - }); + setValues(bootstrapServer, fields, Set.of(BulkImportColumnType.LWM2M_BOOTSTRAP_SERVER_SECURITY_MODE, + BulkImportColumnType.LWM2M_BOOTSTRAP_SERVER_PUBLIC_KEY_OR_ID, BulkImportColumnType.LWM2M_BOOTSTRAP_SERVER_SECRET_KEY)); ObjectNode lwm2mServer = JacksonUtil.newObjectNode(); - Stream.of(BulkImportColumnType.LWM2M_SERVER_SECURITY_MODE, BulkImportColumnType.LWM2M_SERVER_CLIENT_PUBLIC_KEY_OR_ID, - BulkImportColumnType.LWM2M_SERVER_CLIENT_SECRET_KEY) - .forEach(lwm2mServerProperty -> { - String value = fields.get(lwm2mServerProperty); - if (value != null) { - lwm2mServer.set(lwm2mServerProperty.getKey(), new TextNode(value)); - } - }); + setValues(lwm2mServer, fields, Set.of(BulkImportColumnType.LWM2M_SERVER_SECURITY_MODE, + BulkImportColumnType.LWM2M_SERVER_CLIENT_PUBLIC_KEY_OR_ID, BulkImportColumnType.LWM2M_SERVER_CLIENT_SECRET_KEY)); ObjectNode bootstrap = JacksonUtil.newObjectNode(); bootstrap.set("bootstrapServer", bootstrapServer); @@ -208,8 +178,21 @@ public class DeviceBulkImportService extends AbstractBulkImportService { lwm2mCredentials.set("bootstrap", bootstrap); credentials.setCredentialsValue(lwm2mCredentials.toString()); - } + } else if (columns.contains(BulkImportColumnType.X509)) { + credentials.setCredentialsType(DeviceCredentialsType.X509_CERTIFICATE); + credentials.setCredentialsValue(fields.get(BulkImportColumnType.X509)); + } else if (CollectionUtils.containsAny(columns, EnumSet.of(BulkImportColumnType.MQTT_CLIENT_ID, BulkImportColumnType.MQTT_USER_NAME, BulkImportColumnType.MQTT_PASSWORD))) { + credentials.setCredentialsType(DeviceCredentialsType.MQTT_BASIC); + BasicMqttCredentials basicMqttCredentials = new BasicMqttCredentials(); + basicMqttCredentials.setClientId(fields.get(BulkImportColumnType.MQTT_CLIENT_ID)); + basicMqttCredentials.setUserName(fields.get(BulkImportColumnType.MQTT_USER_NAME)); + basicMqttCredentials.setPassword(fields.get(BulkImportColumnType.MQTT_PASSWORD)); + credentials.setCredentialsValue(JacksonUtil.toString(basicMqttCredentials)); + } else if (columns.contains(BulkImportColumnType.ACCESS_TOKEN)) { + credentials.setCredentialsType(DeviceCredentialsType.ACCESS_TOKEN); + credentials.setCredentialsId(fields.get(BulkImportColumnType.ACCESS_TOKEN)); + } return credentials; } @@ -245,4 +228,13 @@ public class DeviceBulkImportService extends AbstractBulkImportService { } } + private void setValues(ObjectNode objectNode, Map data, Collection columns) { + for (BulkImportColumnType column : columns) { + String value = StringUtils.defaultString(data.get(column), column.getDefaultValue()); + if (value != null && column.getKey() != null) { + objectNode.set(column.getKey(), new TextNode(value)); + } + } + } + } diff --git a/application/src/main/java/org/thingsboard/server/service/importing/BulkImportColumnType.java b/application/src/main/java/org/thingsboard/server/service/importing/BulkImportColumnType.java index f0f870b93c..bf06753636 100644 --- a/application/src/main/java/org/thingsboard/server/service/importing/BulkImportColumnType.java +++ b/application/src/main/java/org/thingsboard/server/service/importing/BulkImportColumnType.java @@ -17,6 +17,7 @@ package org.thingsboard.server.service.importing; import lombok.Getter; import org.thingsboard.server.common.data.DataConstants; +import org.thingsboard.server.common.data.device.credentials.lwm2m.LwM2MSecurityMode; @Getter public enum BulkImportColumnType { @@ -32,14 +33,14 @@ public enum BulkImportColumnType { MQTT_USER_NAME, MQTT_PASSWORD, LWM2M_CLIENT_ENDPOINT("endpoint"), - LWM2M_CLIENT_SECURITY_CONFIG_MODE("securityConfigClientMode"), + LWM2M_CLIENT_SECURITY_CONFIG_MODE("securityConfigClientMode", LwM2MSecurityMode.NO_SEC.name()), LWM2M_CLIENT_IDENTITY("identity"), LWM2M_CLIENT_KEY("key"), LWM2M_CLIENT_CERT("cert"), - LWM2M_BOOTSTRAP_SERVER_SECURITY_MODE("securityMode"), + LWM2M_BOOTSTRAP_SERVER_SECURITY_MODE("securityMode", LwM2MSecurityMode.NO_SEC.name()), LWM2M_BOOTSTRAP_SERVER_PUBLIC_KEY_OR_ID("clientPublicKeyOrId"), LWM2M_BOOTSTRAP_SERVER_SECRET_KEY("clientSecretKey"), - LWM2M_SERVER_SECURITY_MODE("securityMode"), + LWM2M_SERVER_SECURITY_MODE("securityMode", LwM2MSecurityMode.NO_SEC.name()), LWM2M_SERVER_CLIENT_PUBLIC_KEY_OR_ID("clientPublicKeyOrId"), LWM2M_SERVER_CLIENT_SECRET_KEY("clientSecretKey"), IS_GATEWAY, @@ -50,6 +51,7 @@ public enum BulkImportColumnType { SECRET; private String key; + private String defaultValue; private boolean isKv = false; BulkImportColumnType() { @@ -59,6 +61,11 @@ public enum BulkImportColumnType { this.key = key; } + BulkImportColumnType(String key, String defaultValue) { + this.key = key; + this.defaultValue = defaultValue; + } + BulkImportColumnType(boolean isKv) { this.isKv = isKv; } diff --git a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceCredentialsServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceCredentialsServiceImpl.java index 37ebf3528f..f979756631 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceCredentialsServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceCredentialsServiceImpl.java @@ -18,12 +18,12 @@ package org.thingsboard.server.dao.device; import com.fasterxml.jackson.databind.node.ObjectNode; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.hibernate.exception.ConstraintViolationException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; -import org.springframework.util.StringUtils; import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.device.credentials.BasicMqttCredentials; @@ -120,9 +120,14 @@ public class DeviceCredentialsServiceImpl extends AbstractEntityService implemen } catch (IllegalArgumentException e) { throw new DeviceCredentialsValidationException("Invalid credentials body for simple mqtt credentials!"); } + if (StringUtils.isEmpty(mqttCredentials.getClientId()) && StringUtils.isEmpty(mqttCredentials.getUserName())) { throw new DeviceCredentialsValidationException("Both mqtt client id and user name are empty!"); } + if (StringUtils.isNotEmpty(mqttCredentials.getClientId()) && StringUtils.isNotEmpty(mqttCredentials.getPassword())) { + throw new DeviceCredentialsValidationException("Password cannot be specified along with client id"); + } + if (StringUtils.isEmpty(mqttCredentials.getClientId())) { deviceCredentials.setCredentialsId(mqttCredentials.getUserName()); } else if (StringUtils.isEmpty(mqttCredentials.getUserName())) { @@ -130,7 +135,7 @@ public class DeviceCredentialsServiceImpl extends AbstractEntityService implemen } else { deviceCredentials.setCredentialsId(EncryptionUtil.getSha3Hash("|", mqttCredentials.getClientId(), mqttCredentials.getUserName())); } - if (!StringUtils.isEmpty(mqttCredentials.getPassword())) { + if (StringUtils.isNotEmpty(mqttCredentials.getPassword())) { mqttCredentials.setPassword(mqttCredentials.getPassword()); } deviceCredentials.setCredentialsValue(JacksonUtil.toString(mqttCredentials));