Browse Source

replace_ObjectMapper_usages_with_JacksonUtil

pull/8373/head
AndriiD 4 years ago
parent
commit
dd9c055ecf
  1. 8
      application/src/main/java/org/thingsboard/server/actors/ActorSystemContext.java
  2. 2
      application/src/main/java/org/thingsboard/server/actors/device/DeviceActorMessageProcessor.java
  3. 7
      application/src/main/java/org/thingsboard/server/actors/ruleChain/DefaultTbContext.java
  4. 3
      application/src/main/java/org/thingsboard/server/actors/shared/AbstractContextAwareMsgProcessor.java
  5. 8
      application/src/main/java/org/thingsboard/server/actors/stats/StatsActor.java
  6. 9
      application/src/main/java/org/thingsboard/server/config/ThingsboardSecurityConfiguration.java
  7. 3
      application/src/main/java/org/thingsboard/server/controller/BaseController.java
  8. 5
      application/src/main/java/org/thingsboard/server/controller/CustomerController.java
  9. 7
      application/src/main/java/org/thingsboard/server/controller/Lwm2mController.java
  10. 25
      application/src/main/java/org/thingsboard/server/controller/RuleChainController.java
  11. 7
      application/src/main/java/org/thingsboard/server/controller/SystemInfoController.java
  12. 33
      application/src/main/java/org/thingsboard/server/exception/ThingsboardErrorResponseHandler.java
  13. 15
      application/src/main/java/org/thingsboard/server/service/action/EntityActionService.java
  14. 10
      application/src/main/java/org/thingsboard/server/service/component/AnnotationComponentDiscoveryService.java
  15. 2
      application/src/main/java/org/thingsboard/server/service/device/ClaimDevicesServiceImpl.java
  16. 9
      application/src/main/java/org/thingsboard/server/service/install/DatabaseHelper.java
  17. 9
      application/src/main/java/org/thingsboard/server/service/install/DefaultSystemDataLoaderService.java
  18. 22
      application/src/main/java/org/thingsboard/server/service/install/InstallScripts.java
  19. 10
      application/src/main/java/org/thingsboard/server/service/rpc/DefaultTbCoreDeviceRpcService.java
  20. 8
      application/src/main/java/org/thingsboard/server/service/security/auth/jwt/RefreshTokenProcessingFilter.java
  21. 6
      application/src/main/java/org/thingsboard/server/service/security/auth/oauth2/AbstractOAuth2ClientMapper.java
  22. 16
      application/src/main/java/org/thingsboard/server/service/security/auth/oauth2/CustomOAuth2ClientMapper.java
  23. 5
      application/src/main/java/org/thingsboard/server/service/security/auth/rest/RestAwareAuthenticationSuccessHandler.java
  24. 8
      application/src/main/java/org/thingsboard/server/service/security/auth/rest/RestLoginProcessingFilter.java
  25. 8
      application/src/main/java/org/thingsboard/server/service/security/auth/rest/RestPublicLoginProcessingFilter.java
  26. 9
      application/src/main/java/org/thingsboard/server/service/transport/DefaultTransportApiService.java
  27. 5
      application/src/main/java/org/thingsboard/server/service/update/DefaultUpdateService.java
  28. 5
      application/src/test/java/org/thingsboard/server/controller/AbstractRuleEngineControllerTest.java
  29. 8
      application/src/test/java/org/thingsboard/server/controller/AbstractWebTest.java
  30. 3
      application/src/test/java/org/thingsboard/server/controller/BaseRuleChainControllerTest.java
  31. 62
      application/src/test/java/org/thingsboard/server/controller/BaseUserControllerTest.java
  32. 16
      application/src/test/java/org/thingsboard/server/controller/BaseWebsocketApiTest.java
  33. 26
      application/src/test/java/org/thingsboard/server/controller/BaseWidgetTypeControllerTest.java
  34. 4
      application/src/test/java/org/thingsboard/server/edge/AbstractEdgeTest.java
  35. 6
      application/src/test/java/org/thingsboard/server/edge/BaseDeviceEdgeTest.java
  36. 7
      application/src/test/java/org/thingsboard/server/edge/BaseRuleChainEdgeTest.java
  37. 12
      application/src/test/java/org/thingsboard/server/edge/BaseTelemetryEdgeTest.java
  38. 2
      application/src/test/java/org/thingsboard/server/edge/BaseWidgetEdgeTest.java
  39. 11
      application/src/test/java/org/thingsboard/server/rules/flow/AbstractRuleEngineFlowIntegrationTest.java
  40. 3
      application/src/test/java/org/thingsboard/server/rules/lifecycle/AbstractRuleEngineLifecycleIntegrationTest.java
  41. 18
      application/src/test/java/org/thingsboard/server/service/install/update/DefaultDataUpdateServiceTest.java
  42. 2
      application/src/test/java/org/thingsboard/server/service/notification/NotificationRuleApiTest.java
  43. 8
      application/src/test/java/org/thingsboard/server/service/sync/ie/BaseExportImportServiceTest.java
  44. 4
      application/src/test/java/org/thingsboard/server/transport/lwm2m/AbstractLwM2MIntegrationTest.java
  45. 3
      application/src/test/java/org/thingsboard/server/transport/mqtt/AbstractMqttIntegrationTest.java
  46. 2
      common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/util/JsonUtils.java
  47. 8
      common/util/pom.xml
  48. 48
      common/util/src/main/java/org/thingsboard/common/util/JacksonUtil.java
  49. 6
      dao/src/main/java/org/thingsboard/server/dao/audit/sink/ElasticsearchAuditLogSink.java
  50. 6
      dao/src/main/java/org/thingsboard/server/dao/customer/CustomerServiceImpl.java
  51. 12
      dao/src/main/java/org/thingsboard/server/dao/model/sql/AbstractEntityViewEntity.java
  52. 13
      dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardEntity.java
  53. 13
      dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardInfoEntity.java
  54. 12
      dao/src/main/java/org/thingsboard/server/dao/model/sql/QueueEntity.java
  55. 8
      dao/src/main/java/org/thingsboard/server/dao/sql/query/AlarmDataAdapter.java
  56. 5
      dao/src/main/java/org/thingsboard/server/dao/user/UserSettingsServiceImpl.java
  57. 8
      dao/src/test/java/org/thingsboard/server/dao/service/AbstractServiceTest.java
  58. 3
      dao/src/test/java/org/thingsboard/server/dao/service/BaseOAuth2ConfigTemplateServiceTest.java
  59. 3
      dao/src/test/java/org/thingsboard/server/dao/service/BaseOAuth2ServiceTest.java
  60. 29
      dao/src/test/java/org/thingsboard/server/dao/service/BaseRuleChainServiceTest.java
  61. 28
      dao/src/test/java/org/thingsboard/server/dao/service/BaseWidgetTypeServiceTest.java
  62. 5
      dao/src/test/java/org/thingsboard/server/dao/sql/user/JpaUserDaoTest.java
  63. 10
      rest-client/src/main/java/org/thingsboard/rest/client/RestClient.java
  64. 9
      rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/util/TbNodeUtils.java
  65. 5
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbAbstractAlarmNode.java
  66. 5
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbCreateAlarmNode.java
  67. 7
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckAlarmStatusNode.java
  68. 7
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/mail/TbMsgToEmailNode.java
  69. 6
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/mail/TbSendEmailNode.java
  70. 33
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbAlarmNodeTest.java
  71. 5
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbCreateRelationNodeTest.java
  72. 11
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbJsFilterNodeTest.java
  73. 17
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbJsSwitchNodeTest.java
  74. 7
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/mail/TbMsgToEmailNodeTest.java
  75. 7
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/AbstractAttributeNodeTest.java
  76. 5
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbAbstractGetAttributesNodeTest.java
  77. 5
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbFetchDeviceCredentialsNodeTest.java
  78. 4
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryNodeTest.java
  79. 90
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/profile/TbDeviceProfileNodeTest.java
  80. 5
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/rest/TbRestApiCallNodeTest.java
  81. 12
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/telemetry/TbMsgDeleteAttributesNodeTest.java
  82. 5
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbChangeOriginatorNodeTest.java
  83. 9
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbCopyKeysNodeTest.java
  84. 9
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbDeleteKeysNodeTest.java
  85. 11
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbJsonPathNodeTest.java
  86. 5
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbSplitArrayMsgNodeTest.java
  87. 12
      rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbTransformMsgNodeTest.java

8
application/src/main/java/org/thingsboard/server/actors/ActorSystemContext.java

@ -15,7 +15,6 @@
*/ */
package org.thingsboard.server.actors; package org.thingsboard.server.actors;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
@ -29,6 +28,7 @@ import org.springframework.context.annotation.Lazy;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.rule.engine.api.MailService; import org.thingsboard.rule.engine.api.MailService;
import org.thingsboard.rule.engine.api.NotificationCenter; import org.thingsboard.rule.engine.api.NotificationCenter;
import org.thingsboard.rule.engine.api.SmsService; import org.thingsboard.rule.engine.api.SmsService;
@ -149,8 +149,6 @@ public class ActorSystemContext {
} }
}; };
protected final ObjectMapper mapper = new ObjectMapper();
private final ConcurrentMap<TenantId, DebugTbRateLimits> debugPerTenantLimits = new ConcurrentHashMap<>(); private final ConcurrentMap<TenantId, DebugTbRateLimits> debugPerTenantLimits = new ConcurrentHashMap<>();
public ConcurrentMap<TenantId, DebugTbRateLimits> getDebugPerTenantLimits() { public ConcurrentMap<TenantId, DebugTbRateLimits> getDebugPerTenantLimits() {
@ -641,7 +639,7 @@ public class ActorSystemContext {
.dataType(tbMsg.getDataType().name()) .dataType(tbMsg.getDataType().name())
.relationType(relationType) .relationType(relationType)
.data(tbMsg.getData()) .data(tbMsg.getData())
.metadata(mapper.writeValueAsString(tbMsg.getMetaData().getData())); .metadata(JacksonUtil.toString(tbMsg.getMetaData().getData()));
if (error != null) { if (error != null) {
event.error(toString(error)); event.error(toString(error));
@ -651,7 +649,7 @@ public class ActorSystemContext {
ListenableFuture<Void> future = eventService.saveAsync(event.build()); ListenableFuture<Void> future = eventService.saveAsync(event.build());
Futures.addCallback(future, RULE_NODE_DEBUG_EVENT_ERROR_CALLBACK, MoreExecutors.directExecutor()); Futures.addCallback(future, RULE_NODE_DEBUG_EVENT_ERROR_CALLBACK, MoreExecutors.directExecutor());
} catch (IOException ex) { } catch (IllegalArgumentException ex) {
log.warn("Failed to persist rule node debug message", ex); log.warn("Failed to persist rule node debug message", ex);
} }
} }

2
application/src/main/java/org/thingsboard/server/actors/device/DeviceActorMessageProcessor.java

@ -816,7 +816,7 @@ public class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcesso
} }
private ListenableFuture<Void> saveRpcRequestToEdgeQueue(ToDeviceRpcRequest msg, Integer requestId) { private ListenableFuture<Void> saveRpcRequestToEdgeQueue(ToDeviceRpcRequest msg, Integer requestId) {
ObjectNode body = mapper.createObjectNode(); ObjectNode body = JacksonUtil.newObjectNode();
body.put("requestId", requestId); body.put("requestId", requestId);
body.put("requestUUID", msg.getId().toString()); body.put("requestUUID", msg.getId().toString());
body.put("oneway", msg.isOneway()); body.put("oneway", msg.isOneway());

7
application/src/main/java/org/thingsboard/server/actors/ruleChain/DefaultTbContext.java

@ -16,7 +16,6 @@
package org.thingsboard.server.actors.ruleChain; package org.thingsboard.server.actors.ruleChain;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.ObjectNode;
import io.netty.channel.EventLoopGroup; import io.netty.channel.EventLoopGroup;
@ -121,8 +120,6 @@ import java.util.function.Consumer;
@Slf4j @Slf4j
class DefaultTbContext implements TbContext { class DefaultTbContext implements TbContext {
public final static ObjectMapper mapper = new ObjectMapper();
private final ActorSystemContext mainCtx; private final ActorSystemContext mainCtx;
private final String ruleChainName; private final String ruleChainName;
private final RuleNodeCtx nodeCtx; private final RuleNodeCtx nodeCtx;
@ -422,8 +419,8 @@ class DefaultTbContext implements TbContext {
public <E, I extends EntityId, K extends HasRuleEngineProfile> TbMsg entityActionMsg(E entity, I id, RuleNodeId ruleNodeId, String action, K profile) { public <E, I extends EntityId, K extends HasRuleEngineProfile> TbMsg entityActionMsg(E entity, I id, RuleNodeId ruleNodeId, String action, K profile) {
try { try {
return entityActionMsg(id, getActionMetaData(ruleNodeId), mapper.writeValueAsString(mapper.valueToTree(entity)), action, profile); return entityActionMsg(id, getActionMetaData(ruleNodeId), JacksonUtil.toString(JacksonUtil.valueToTree(entity)), action, profile);
} catch (JsonProcessingException | IllegalArgumentException e) { } catch (IllegalArgumentException e) {
throw new RuntimeException("Failed to process " + id.getEntityType().name().toLowerCase() + " " + action + " msg: " + e); throw new RuntimeException("Failed to process " + id.getEntityType().name().toLowerCase() + " " + action + " msg: " + e);
} }
} }

3
application/src/main/java/org/thingsboard/server/actors/shared/AbstractContextAwareMsgProcessor.java

@ -15,7 +15,6 @@
*/ */
package org.thingsboard.server.actors.shared; package org.thingsboard.server.actors.shared;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.thingsboard.server.actors.ActorSystemContext; import org.thingsboard.server.actors.ActorSystemContext;
import org.thingsboard.server.actors.TbActorCtx; import org.thingsboard.server.actors.TbActorCtx;
@ -26,8 +25,6 @@ import java.util.concurrent.ScheduledExecutorService;
@Slf4j @Slf4j
public abstract class AbstractContextAwareMsgProcessor { public abstract class AbstractContextAwareMsgProcessor {
protected final static ObjectMapper mapper = new ObjectMapper();
protected final ActorSystemContext systemContext; protected final ActorSystemContext systemContext;
protected AbstractContextAwareMsgProcessor(ActorSystemContext systemContext) { protected AbstractContextAwareMsgProcessor(ActorSystemContext systemContext) {

8
application/src/main/java/org/thingsboard/server/actors/stats/StatsActor.java

@ -16,16 +16,14 @@
package org.thingsboard.server.actors.stats; package org.thingsboard.server.actors.stats;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.actors.ActorSystemContext; import org.thingsboard.server.actors.ActorSystemContext;
import org.thingsboard.server.actors.TbActor; import org.thingsboard.server.actors.TbActor;
import org.thingsboard.server.actors.TbActorId; import org.thingsboard.server.actors.TbActorId;
import org.thingsboard.server.actors.TbStringActorId; import org.thingsboard.server.actors.TbStringActorId;
import org.thingsboard.server.actors.service.ContextAwareActor; import org.thingsboard.server.actors.service.ContextAwareActor;
import org.thingsboard.server.actors.service.ContextBasedCreator; import org.thingsboard.server.actors.service.ContextBasedCreator;
import org.thingsboard.server.common.data.DataConstants;
import org.thingsboard.server.common.data.EventInfo;
import org.thingsboard.server.common.data.event.StatisticsEvent; import org.thingsboard.server.common.data.event.StatisticsEvent;
import org.thingsboard.server.common.msg.MsgType; import org.thingsboard.server.common.msg.MsgType;
import org.thingsboard.server.common.msg.TbActorMsg; import org.thingsboard.server.common.msg.TbActorMsg;
@ -33,8 +31,6 @@ import org.thingsboard.server.common.msg.TbActorMsg;
@Slf4j @Slf4j
public class StatsActor extends ContextAwareActor { public class StatsActor extends ContextAwareActor {
private final ObjectMapper mapper = new ObjectMapper();
public StatsActor(ActorSystemContext context) { public StatsActor(ActorSystemContext context) {
super(context); super(context);
} }
@ -65,7 +61,7 @@ public class StatsActor extends ContextAwareActor {
} }
private JsonNode toBodyJson(String serviceId, long messagesProcessed, long errorsOccurred) { private JsonNode toBodyJson(String serviceId, long messagesProcessed, long errorsOccurred) {
return mapper.createObjectNode().put("server", serviceId).put("messagesProcessed", messagesProcessed).put("errorsOccurred", errorsOccurred); return JacksonUtil.newObjectNode().put("server", serviceId).put("messagesProcessed", messagesProcessed).put("errorsOccurred", errorsOccurred);
} }
public static class ActorCreator extends ContextBasedCreator { public static class ActorCreator extends ContextBasedCreator {

9
application/src/main/java/org/thingsboard/server/config/ThingsboardSecurityConfiguration.java

@ -15,7 +15,6 @@
*/ */
package org.thingsboard.server.config; package org.thingsboard.server.config;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@ -116,20 +115,18 @@ public class ThingsboardSecurityConfiguration {
@Autowired private AuthenticationManager authenticationManager; @Autowired private AuthenticationManager authenticationManager;
@Autowired private ObjectMapper objectMapper;
@Autowired private RateLimitProcessingFilter rateLimitProcessingFilter; @Autowired private RateLimitProcessingFilter rateLimitProcessingFilter;
@Bean @Bean
protected RestLoginProcessingFilter buildRestLoginProcessingFilter() throws Exception { protected RestLoginProcessingFilter buildRestLoginProcessingFilter() throws Exception {
RestLoginProcessingFilter filter = new RestLoginProcessingFilter(FORM_BASED_LOGIN_ENTRY_POINT, successHandler, failureHandler, objectMapper); RestLoginProcessingFilter filter = new RestLoginProcessingFilter(FORM_BASED_LOGIN_ENTRY_POINT, successHandler, failureHandler);
filter.setAuthenticationManager(this.authenticationManager); filter.setAuthenticationManager(this.authenticationManager);
return filter; return filter;
} }
@Bean @Bean
protected RestPublicLoginProcessingFilter buildRestPublicLoginProcessingFilter() throws Exception { protected RestPublicLoginProcessingFilter buildRestPublicLoginProcessingFilter() throws Exception {
RestPublicLoginProcessingFilter filter = new RestPublicLoginProcessingFilter(PUBLIC_LOGIN_ENTRY_POINT, successHandler, failureHandler, objectMapper); RestPublicLoginProcessingFilter filter = new RestPublicLoginProcessingFilter(PUBLIC_LOGIN_ENTRY_POINT, successHandler, failureHandler);
filter.setAuthenticationManager(this.authenticationManager); filter.setAuthenticationManager(this.authenticationManager);
return filter; return filter;
} }
@ -147,7 +144,7 @@ public class ThingsboardSecurityConfiguration {
@Bean @Bean
protected RefreshTokenProcessingFilter buildRefreshTokenProcessingFilter() throws Exception { protected RefreshTokenProcessingFilter buildRefreshTokenProcessingFilter() throws Exception {
RefreshTokenProcessingFilter filter = new RefreshTokenProcessingFilter(TOKEN_REFRESH_ENTRY_POINT, successHandler, failureHandler, objectMapper); RefreshTokenProcessingFilter filter = new RefreshTokenProcessingFilter(TOKEN_REFRESH_ENTRY_POINT, successHandler, failureHandler);
filter.setAuthenticationManager(this.authenticationManager); filter.setAuthenticationManager(this.authenticationManager);
return filter; return filter;
} }

3
application/src/main/java/org/thingsboard/server/controller/BaseController.java

@ -15,7 +15,6 @@
*/ */
package org.thingsboard.server.controller; package org.thingsboard.server.controller;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.ObjectNode;
import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.Futures;
@ -184,8 +183,6 @@ public abstract class BaseController {
/*Swagger UI description*/ /*Swagger UI description*/
private static final ObjectMapper json = new ObjectMapper();
@Autowired @Autowired
private ThingsboardErrorResponseHandler errorResponseHandler; private ThingsboardErrorResponseHandler errorResponseHandler;

5
application/src/main/java/org/thingsboard/server/controller/CustomerController.java

@ -16,7 +16,6 @@
package org.thingsboard.server.controller; package org.thingsboard.server.controller;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.ObjectNode;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiParam;
@ -31,6 +30,7 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.Customer; import org.thingsboard.server.common.data.Customer;
import org.thingsboard.server.common.data.exception.ThingsboardException; import org.thingsboard.server.common.data.exception.ThingsboardException;
import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.CustomerId;
@ -100,8 +100,7 @@ public class CustomerController extends BaseController {
checkParameter(CUSTOMER_ID, strCustomerId); checkParameter(CUSTOMER_ID, strCustomerId);
CustomerId customerId = new CustomerId(toUUID(strCustomerId)); CustomerId customerId = new CustomerId(toUUID(strCustomerId));
Customer customer = checkCustomerId(customerId, Operation.READ); Customer customer = checkCustomerId(customerId, Operation.READ);
ObjectMapper objectMapper = new ObjectMapper(); ObjectNode infoObject = JacksonUtil.newObjectNode();
ObjectNode infoObject = objectMapper.createObjectNode();
infoObject.put("title", customer.getTitle()); infoObject.put("title", customer.getTitle());
infoObject.put(IS_PUBLIC, customer.isPublic()); infoObject.put(IS_PUBLIC, customer.isPublic());
return infoObject; return infoObject;

7
application/src/main/java/org/thingsboard/server/controller/Lwm2mController.java

@ -15,7 +15,6 @@
*/ */
package org.thingsboard.server.controller; package org.thingsboard.server.controller;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -28,6 +27,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.SaveDeviceWithCredentialsRequest; import org.thingsboard.server.common.data.SaveDeviceWithCredentialsRequest;
import org.thingsboard.server.common.data.device.profile.lwm2m.bootstrap.LwM2MServerSecurityConfigDefault; import org.thingsboard.server.common.data.device.profile.lwm2m.bootstrap.LwM2MServerSecurityConfigDefault;
@ -72,9 +72,8 @@ public class Lwm2mController extends BaseController {
@RequestMapping(value = "/lwm2m/device-credentials", method = RequestMethod.POST) @RequestMapping(value = "/lwm2m/device-credentials", method = RequestMethod.POST)
@ResponseBody @ResponseBody
public Device saveDeviceWithCredentials(@RequestBody Map<Class<?>, Object> deviceWithDeviceCredentials) throws ThingsboardException { public Device saveDeviceWithCredentials(@RequestBody Map<Class<?>, Object> deviceWithDeviceCredentials) throws ThingsboardException {
ObjectMapper mapper = new ObjectMapper(); Device device = checkNotNull(JacksonUtil.convertValue(deviceWithDeviceCredentials.get(Device.class), Device.class));
Device device = checkNotNull(mapper.convertValue(deviceWithDeviceCredentials.get(Device.class), Device.class)); DeviceCredentials credentials = checkNotNull(JacksonUtil.convertValue(deviceWithDeviceCredentials.get(DeviceCredentials.class), DeviceCredentials.class));
DeviceCredentials credentials = checkNotNull(mapper.convertValue(deviceWithDeviceCredentials.get(DeviceCredentials.class), DeviceCredentials.class));
return deviceController.saveDeviceWithCredentials(new SaveDeviceWithCredentialsRequest(device, credentials)); return deviceController.saveDeviceWithCredentials(new SaveDeviceWithCredentialsRequest(device, credentials));
} }
} }

25
application/src/main/java/org/thingsboard/server/controller/RuleChainController.java

@ -18,7 +18,6 @@ package org.thingsboard.server.controller;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.ObjectNode;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
@ -37,6 +36,7 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.rule.engine.api.ScriptEngine; import org.thingsboard.rule.engine.api.ScriptEngine;
import org.thingsboard.script.api.js.JsInvokeService; import org.thingsboard.script.api.js.JsInvokeService;
import org.thingsboard.script.api.tbel.TbelInvokeService; import org.thingsboard.script.api.tbel.TbelInvokeService;
@ -115,7 +115,6 @@ public class RuleChainController extends BaseController {
private static final int DEFAULT_PAGE_SIZE = 1000; private static final int DEFAULT_PAGE_SIZE = 1000;
private static final ObjectMapper objectMapper = new ObjectMapper();
public static final int TIMEOUT = 20; public static final int TIMEOUT = 20;
private static final String RULE_CHAIN_DESCRIPTION = "The rule chain object is lightweight and contains general information about the rule chain. " + private static final String RULE_CHAIN_DESCRIPTION = "The rule chain object is lightweight and contains general information about the rule chain. " +
@ -377,11 +376,11 @@ public class RuleChainController extends BaseController {
String script = inputParams.get("script").asText(); String script = inputParams.get("script").asText();
String scriptType = inputParams.get("scriptType").asText(); String scriptType = inputParams.get("scriptType").asText();
JsonNode argNamesJson = inputParams.get("argNames"); JsonNode argNamesJson = inputParams.get("argNames");
String[] argNames = objectMapper.treeToValue(argNamesJson, String[].class); String[] argNames = JacksonUtil.treeToValue(argNamesJson, String[].class);
String data = inputParams.get("msg").asText(); String data = inputParams.get("msg").asText();
JsonNode metadataJson = inputParams.get("metadata"); JsonNode metadataJson = inputParams.get("metadata");
Map<String, String> metadata = objectMapper.convertValue(metadataJson, new TypeReference<Map<String, String>>() { Map<String, String> metadata = JacksonUtil.convertValue(metadataJson, new TypeReference<Map<String, String>>() {
}); });
String msgType = inputParams.get("msgType").asText(); String msgType = inputParams.get("msgType").asText();
String output = ""; String output = "";
@ -413,11 +412,11 @@ public class RuleChainController extends BaseController {
break; break;
case "switch": case "switch":
Set<String> states = engine.executeSwitchAsync(inMsg).get(TIMEOUT, TimeUnit.SECONDS); Set<String> states = engine.executeSwitchAsync(inMsg).get(TIMEOUT, TimeUnit.SECONDS);
output = objectMapper.writeValueAsString(states); output = JacksonUtil.toString(states);
break; break;
case "json": case "json":
JsonNode json = engine.executeJsonAsync(inMsg).get(TIMEOUT, TimeUnit.SECONDS); JsonNode json = engine.executeJsonAsync(inMsg).get(TIMEOUT, TimeUnit.SECONDS);
output = objectMapper.writeValueAsString(json); output = JacksonUtil.toString(json);
break; break;
case "string": case "string":
output = engine.executeToStringAsync(inMsg).get(TIMEOUT, TimeUnit.SECONDS); output = engine.executeToStringAsync(inMsg).get(TIMEOUT, TimeUnit.SECONDS);
@ -433,7 +432,7 @@ public class RuleChainController extends BaseController {
engine.destroy(); engine.destroy();
} }
} }
ObjectNode result = objectMapper.createObjectNode(); ObjectNode result = JacksonUtil.newObjectNode();
result.put("output", output); result.put("output", output);
result.put("error", errorText); result.put("error", errorText);
return result; return result;
@ -473,13 +472,13 @@ public class RuleChainController extends BaseController {
private String msgToOutput(TbMsg msg) throws Exception { private String msgToOutput(TbMsg msg) throws Exception {
JsonNode resultNode = convertMsgToOut(msg); JsonNode resultNode = convertMsgToOut(msg);
return objectMapper.writeValueAsString(resultNode); return JacksonUtil.toString(resultNode);
} }
private String msgToOutput(List<TbMsg> msgs) throws Exception { private String msgToOutput(List<TbMsg> msgs) throws Exception {
JsonNode resultNode; JsonNode resultNode;
if (msgs.size() > 1) { if (msgs.size() > 1) {
resultNode = objectMapper.createArrayNode(); resultNode = JacksonUtil.OBJECT_MAPPER.createArrayNode();
for (TbMsg msg : msgs) { for (TbMsg msg : msgs) {
JsonNode convertedData = convertMsgToOut(msg); JsonNode convertedData = convertMsgToOut(msg);
((ArrayNode) resultNode).add(convertedData); ((ArrayNode) resultNode).add(convertedData);
@ -487,16 +486,16 @@ public class RuleChainController extends BaseController {
} else { } else {
resultNode = convertMsgToOut(msgs.get(0)); resultNode = convertMsgToOut(msgs.get(0));
} }
return objectMapper.writeValueAsString(resultNode); return JacksonUtil.toString(resultNode);
} }
private JsonNode convertMsgToOut(TbMsg msg) throws Exception { private JsonNode convertMsgToOut(TbMsg msg) throws Exception {
ObjectNode msgData = objectMapper.createObjectNode(); ObjectNode msgData = JacksonUtil.newObjectNode();
if (!StringUtils.isEmpty(msg.getData())) { if (!StringUtils.isEmpty(msg.getData())) {
msgData.set("msg", objectMapper.readTree(msg.getData())); msgData.set("msg", JacksonUtil.valueToTree(msg.getData()));
} }
Map<String, String> metadata = msg.getMetaData().getData(); Map<String, String> metadata = msg.getMetaData().getData();
msgData.set("metadata", objectMapper.valueToTree(metadata)); msgData.set("metadata", JacksonUtil.valueToTree(metadata));
msgData.put("msgType", msg.getType()); msgData.put("msgType", msg.getType());
return msgData; return msgData;
} }

7
application/src/main/java/org/thingsboard/server/controller/SystemInfoController.java

@ -16,10 +16,7 @@
package org.thingsboard.server.controller; package org.thingsboard.server.controller;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.ObjectNode;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.info.BuildProperties; import org.springframework.boot.info.BuildProperties;
@ -28,6 +25,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.queue.util.TbCoreComponent; import org.thingsboard.server.queue.util.TbCoreComponent;
import springfox.documentation.annotations.ApiIgnore; import springfox.documentation.annotations.ApiIgnore;
@ -57,8 +55,7 @@ public class SystemInfoController {
} }
private JsonNode buildInfoObject() { private JsonNode buildInfoObject() {
ObjectMapper objectMapper = new ObjectMapper(); ObjectNode infoObject = JacksonUtil.newObjectNode();
ObjectNode infoObject = objectMapper.createObjectNode();
if (buildProperties != null) { if (buildProperties != null) {
infoObject.put("version", buildProperties.getVersion()); infoObject.put("version", buildProperties.getVersion());
infoObject.put("artifact", buildProperties.getArtifact()); infoObject.put("artifact", buildProperties.getArtifact());

33
application/src/main/java/org/thingsboard/server/exception/ThingsboardErrorResponseHandler.java

@ -15,7 +15,6 @@
*/ */
package org.thingsboard.server.exception; package org.thingsboard.server.exception;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders; import org.springframework.http.HttpHeaders;
@ -36,6 +35,7 @@ import org.springframework.web.client.HttpClientErrorException;
import org.springframework.web.context.request.WebRequest; import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
import org.springframework.web.util.WebUtils; import org.springframework.web.util.WebUtils;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.exception.ThingsboardErrorCode; import org.thingsboard.server.common.data.exception.ThingsboardErrorCode;
import org.thingsboard.server.common.data.exception.ThingsboardException; import org.thingsboard.server.common.data.exception.ThingsboardException;
import org.thingsboard.server.common.msg.tools.TbRateLimitsException; import org.thingsboard.server.common.msg.tools.TbRateLimitsException;
@ -90,9 +90,6 @@ public class ThingsboardErrorResponseHandler extends ResponseEntityExceptionHand
return errorCodeToStatusMap.getOrDefault(errorCode, HttpStatus.INTERNAL_SERVER_ERROR); return errorCodeToStatusMap.getOrDefault(errorCode, HttpStatus.INTERNAL_SERVER_ERROR);
} }
@Autowired
private ObjectMapper mapper;
@Override @Override
@ExceptionHandler(AccessDeniedException.class) @ExceptionHandler(AccessDeniedException.class)
public void handle(HttpServletRequest request, HttpServletResponse response, public void handle(HttpServletRequest request, HttpServletResponse response,
@ -101,7 +98,7 @@ public class ThingsboardErrorResponseHandler extends ResponseEntityExceptionHand
if (!response.isCommitted()) { if (!response.isCommitted()) {
response.setContentType(MediaType.APPLICATION_JSON_VALUE); response.setContentType(MediaType.APPLICATION_JSON_VALUE);
response.setStatus(HttpStatus.FORBIDDEN.value()); response.setStatus(HttpStatus.FORBIDDEN.value());
mapper.writeValue(response.getWriter(), JacksonUtil.writeValue(response.getWriter(),
ThingsboardErrorResponse.of("You don't have permission to perform this operation!", ThingsboardErrorResponse.of("You don't have permission to perform this operation!",
ThingsboardErrorCode.PERMISSION_DENIED, HttpStatus.FORBIDDEN)); ThingsboardErrorCode.PERMISSION_DENIED, HttpStatus.FORBIDDEN));
} }
@ -129,7 +126,7 @@ public class ThingsboardErrorResponseHandler extends ResponseEntityExceptionHand
handleAuthenticationException((AuthenticationException) exception, response); handleAuthenticationException((AuthenticationException) exception, response);
} else { } else {
response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value()); response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
mapper.writeValue(response.getWriter(), ThingsboardErrorResponse.of(exception.getMessage(), JacksonUtil.writeValue(response.getWriter(), ThingsboardErrorResponse.of(exception.getMessage(),
ThingsboardErrorCode.GENERAL, HttpStatus.INTERNAL_SERVER_ERROR)); ThingsboardErrorCode.GENERAL, HttpStatus.INTERNAL_SERVER_ERROR));
} }
} catch (IOException e) { } catch (IOException e) {
@ -154,26 +151,26 @@ public class ThingsboardErrorResponseHandler extends ResponseEntityExceptionHand
ThingsboardErrorCode errorCode = thingsboardException.getErrorCode(); ThingsboardErrorCode errorCode = thingsboardException.getErrorCode();
HttpStatus status = errorCodeToStatus(errorCode); HttpStatus status = errorCodeToStatus(errorCode);
response.setStatus(status.value()); response.setStatus(status.value());
mapper.writeValue(response.getWriter(), ThingsboardErrorResponse.of(thingsboardException.getMessage(), errorCode, status)); JacksonUtil.writeValue(response.getWriter(), ThingsboardErrorResponse.of(thingsboardException.getMessage(), errorCode, status));
} }
private void handleRateLimitException(HttpServletResponse response, TbRateLimitsException exception) throws IOException { private void handleRateLimitException(HttpServletResponse response, TbRateLimitsException exception) throws IOException {
response.setStatus(HttpStatus.TOO_MANY_REQUESTS.value()); response.setStatus(HttpStatus.TOO_MANY_REQUESTS.value());
String message = "Too many requests for current " + exception.getEntityType().name().toLowerCase() + "!"; String message = "Too many requests for current " + exception.getEntityType().name().toLowerCase() + "!";
mapper.writeValue(response.getWriter(), JacksonUtil.writeValue(response.getWriter(),
ThingsboardErrorResponse.of(message, ThingsboardErrorResponse.of(message,
ThingsboardErrorCode.TOO_MANY_REQUESTS, HttpStatus.TOO_MANY_REQUESTS)); ThingsboardErrorCode.TOO_MANY_REQUESTS, HttpStatus.TOO_MANY_REQUESTS));
} }
private void handleSubscriptionException(ThingsboardException subscriptionException, HttpServletResponse response) throws IOException { private void handleSubscriptionException(ThingsboardException subscriptionException, HttpServletResponse response) throws IOException {
response.setStatus(HttpStatus.FORBIDDEN.value()); response.setStatus(HttpStatus.FORBIDDEN.value());
mapper.writeValue(response.getWriter(), JacksonUtil.writeValue(response.getWriter(),
(new ObjectMapper()).readValue(((HttpClientErrorException) subscriptionException.getCause()).getResponseBodyAsByteArray(), Object.class)); JacksonUtil.fromBytes(((HttpClientErrorException) subscriptionException.getCause()).getResponseBodyAsByteArray(), Object.class));
} }
private void handleAccessDeniedException(HttpServletResponse response) throws IOException { private void handleAccessDeniedException(HttpServletResponse response) throws IOException {
response.setStatus(HttpStatus.FORBIDDEN.value()); response.setStatus(HttpStatus.FORBIDDEN.value());
mapper.writeValue(response.getWriter(), JacksonUtil.writeValue(response.getWriter(),
ThingsboardErrorResponse.of("You don't have permission to perform this operation!", ThingsboardErrorResponse.of("You don't have permission to perform this operation!",
ThingsboardErrorCode.PERMISSION_DENIED, HttpStatus.FORBIDDEN)); ThingsboardErrorCode.PERMISSION_DENIED, HttpStatus.FORBIDDEN));
@ -182,21 +179,21 @@ public class ThingsboardErrorResponseHandler extends ResponseEntityExceptionHand
private void handleAuthenticationException(AuthenticationException authenticationException, HttpServletResponse response) throws IOException { private void handleAuthenticationException(AuthenticationException authenticationException, HttpServletResponse response) throws IOException {
response.setStatus(HttpStatus.UNAUTHORIZED.value()); response.setStatus(HttpStatus.UNAUTHORIZED.value());
if (authenticationException instanceof BadCredentialsException || authenticationException instanceof UsernameNotFoundException) { if (authenticationException instanceof BadCredentialsException || authenticationException instanceof UsernameNotFoundException) {
mapper.writeValue(response.getWriter(), ThingsboardErrorResponse.of("Invalid username or password", ThingsboardErrorCode.AUTHENTICATION, HttpStatus.UNAUTHORIZED)); JacksonUtil.writeValue(response.getWriter(), ThingsboardErrorResponse.of("Invalid username or password", ThingsboardErrorCode.AUTHENTICATION, HttpStatus.UNAUTHORIZED));
} else if (authenticationException instanceof DisabledException) { } else if (authenticationException instanceof DisabledException) {
mapper.writeValue(response.getWriter(), ThingsboardErrorResponse.of("User account is not active", ThingsboardErrorCode.AUTHENTICATION, HttpStatus.UNAUTHORIZED)); JacksonUtil.writeValue(response.getWriter(), ThingsboardErrorResponse.of("User account is not active", ThingsboardErrorCode.AUTHENTICATION, HttpStatus.UNAUTHORIZED));
} else if (authenticationException instanceof LockedException) { } else if (authenticationException instanceof LockedException) {
mapper.writeValue(response.getWriter(), ThingsboardErrorResponse.of("User account is locked due to security policy", ThingsboardErrorCode.AUTHENTICATION, HttpStatus.UNAUTHORIZED)); JacksonUtil.writeValue(response.getWriter(), ThingsboardErrorResponse.of("User account is locked due to security policy", ThingsboardErrorCode.AUTHENTICATION, HttpStatus.UNAUTHORIZED));
} else if (authenticationException instanceof JwtExpiredTokenException) { } else if (authenticationException instanceof JwtExpiredTokenException) {
mapper.writeValue(response.getWriter(), ThingsboardErrorResponse.of("Token has expired", ThingsboardErrorCode.JWT_TOKEN_EXPIRED, HttpStatus.UNAUTHORIZED)); JacksonUtil.writeValue(response.getWriter(), ThingsboardErrorResponse.of("Token has expired", ThingsboardErrorCode.JWT_TOKEN_EXPIRED, HttpStatus.UNAUTHORIZED));
} else if (authenticationException instanceof AuthMethodNotSupportedException) { } else if (authenticationException instanceof AuthMethodNotSupportedException) {
mapper.writeValue(response.getWriter(), ThingsboardErrorResponse.of(authenticationException.getMessage(), ThingsboardErrorCode.AUTHENTICATION, HttpStatus.UNAUTHORIZED)); JacksonUtil.writeValue(response.getWriter(), ThingsboardErrorResponse.of(authenticationException.getMessage(), ThingsboardErrorCode.AUTHENTICATION, HttpStatus.UNAUTHORIZED));
} else if (authenticationException instanceof UserPasswordExpiredException) { } else if (authenticationException instanceof UserPasswordExpiredException) {
UserPasswordExpiredException expiredException = (UserPasswordExpiredException) authenticationException; UserPasswordExpiredException expiredException = (UserPasswordExpiredException) authenticationException;
String resetToken = expiredException.getResetToken(); String resetToken = expiredException.getResetToken();
mapper.writeValue(response.getWriter(), ThingsboardCredentialsExpiredResponse.of(expiredException.getMessage(), resetToken)); JacksonUtil.writeValue(response.getWriter(), ThingsboardCredentialsExpiredResponse.of(expiredException.getMessage(), resetToken));
} else { } else {
mapper.writeValue(response.getWriter(), ThingsboardErrorResponse.of("Authentication failed", ThingsboardErrorCode.AUTHENTICATION, HttpStatus.UNAUTHORIZED)); JacksonUtil.writeValue(response.getWriter(), ThingsboardErrorResponse.of("Authentication failed", ThingsboardErrorCode.AUTHENTICATION, HttpStatus.UNAUTHORIZED));
} }
} }

15
application/src/main/java/org/thingsboard/server/service/action/EntityActionService.java

@ -15,7 +15,6 @@
*/ */
package org.thingsboard.server.service.action; package org.thingsboard.server.service.action;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.ObjectNode;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@ -54,8 +53,6 @@ public class EntityActionService {
private final TbClusterService tbClusterService; private final TbClusterService tbClusterService;
private final AuditLogService auditLogService; private final AuditLogService auditLogService;
private static final ObjectMapper json = new ObjectMapper();
public void pushEntityActionToRuleEngine(EntityId entityId, HasName entity, TenantId tenantId, CustomerId customerId, public void pushEntityActionToRuleEngine(EntityId entityId, HasName entity, TenantId tenantId, CustomerId customerId,
ActionType actionType, User user, Object... additionalInfo) { ActionType actionType, User user, Object... additionalInfo) {
String msgType = null; String msgType = null;
@ -185,18 +182,18 @@ public class EntityActionService {
metaData.putValue("unassignedEdgeName", strEdgeName); metaData.putValue("unassignedEdgeName", strEdgeName);
} else if (actionType == ActionType.ADDED_COMMENT || actionType == ActionType.UPDATED_COMMENT) { } else if (actionType == ActionType.ADDED_COMMENT || actionType == ActionType.UPDATED_COMMENT) {
AlarmComment comment = extractParameter(AlarmComment.class, 0, additionalInfo); AlarmComment comment = extractParameter(AlarmComment.class, 0, additionalInfo);
metaData.putValue("comment", json.writeValueAsString(comment)); metaData.putValue("comment", JacksonUtil.toString(comment));
} }
ObjectNode entityNode; ObjectNode entityNode;
if (entity != null) { if (entity != null) {
entityNode = json.valueToTree(entity); entityNode = JacksonUtil.OBJECT_MAPPER.valueToTree(entity);
if (entityId.getEntityType() == EntityType.DASHBOARD) { if (entityId.getEntityType() == EntityType.DASHBOARD) {
entityNode.put("configuration", ""); entityNode.put("configuration", "");
} }
metaData.putValue("entityName", entity.getName()); metaData.putValue("entityName", entity.getName());
metaData.putValue("entityType", entityId.getEntityType().toString()); metaData.putValue("entityType", entityId.getEntityType().toString());
} else { } else {
entityNode = json.createObjectNode(); entityNode = JacksonUtil.newObjectNode();
if (actionType == ActionType.ATTRIBUTES_UPDATED) { if (actionType == ActionType.ATTRIBUTES_UPDATED) {
String scope = extractParameter(String.class, 0, additionalInfo); String scope = extractParameter(String.class, 0, additionalInfo);
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@ -230,10 +227,10 @@ public class EntityActionService {
entityNode.put("startTs", extractParameter(Long.class, 1, additionalInfo)); entityNode.put("startTs", extractParameter(Long.class, 1, additionalInfo));
entityNode.put("endTs", extractParameter(Long.class, 2, additionalInfo)); entityNode.put("endTs", extractParameter(Long.class, 2, additionalInfo));
} else if (ActionType.RELATION_ADD_OR_UPDATE.equals(actionType) || ActionType.RELATION_DELETED.equals(actionType)) { } else if (ActionType.RELATION_ADD_OR_UPDATE.equals(actionType) || ActionType.RELATION_DELETED.equals(actionType)) {
entityNode = json.valueToTree(extractParameter(EntityRelation.class, 0, additionalInfo)); entityNode = JacksonUtil.OBJECT_MAPPER.valueToTree(extractParameter(EntityRelation.class, 0, additionalInfo));
} }
} }
TbMsg tbMsg = TbMsg.newMsg(msgType, entityId, customerId, metaData, TbMsgDataType.JSON, json.writeValueAsString(entityNode)); TbMsg tbMsg = TbMsg.newMsg(msgType, entityId, customerId, metaData, TbMsgDataType.JSON, JacksonUtil.toString(entityNode));
if (tenantId == null || tenantId.isNullUid()) { if (tenantId == null || tenantId.isNullUid()) {
if (entity instanceof HasTenantId) { if (entity instanceof HasTenantId) {
tenantId = ((HasTenantId) entity).getTenantId(); tenantId = ((HasTenantId) entity).getTenantId();
@ -278,7 +275,7 @@ public class EntityActionService {
Map<Long, List<TsKvEntry>> groupedTelemetry = timeseries.stream() Map<Long, List<TsKvEntry>> groupedTelemetry = timeseries.stream()
.collect(Collectors.groupingBy(TsKvEntry::getTs)); .collect(Collectors.groupingBy(TsKvEntry::getTs));
for (Map.Entry<Long, List<TsKvEntry>> entry : groupedTelemetry.entrySet()) { for (Map.Entry<Long, List<TsKvEntry>> entry : groupedTelemetry.entrySet()) {
ObjectNode element = json.createObjectNode(); ObjectNode element = JacksonUtil.newObjectNode();
element.put("ts", entry.getKey()); element.put("ts", entry.getKey());
ObjectNode values = element.putObject("values"); ObjectNode values = element.putObject("values");
for (TsKvEntry tsKvEntry : entry.getValue()) { for (TsKvEntry tsKvEntry : entry.getValue()) {

10
application/src/main/java/org/thingsboard/server/service/component/AnnotationComponentDiscoveryService.java

@ -16,7 +16,6 @@
package org.thingsboard.server.service.component; package org.thingsboard.server.service.component;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.ObjectNode;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -27,6 +26,7 @@ import org.springframework.core.env.Environment;
import org.springframework.core.env.Profiles; import org.springframework.core.env.Profiles;
import org.springframework.core.type.filter.AnnotationTypeFilter; import org.springframework.core.type.filter.AnnotationTypeFilter;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.rule.engine.api.NodeConfiguration; import org.thingsboard.rule.engine.api.NodeConfiguration;
import org.thingsboard.rule.engine.api.NodeDefinition; import org.thingsboard.rule.engine.api.NodeDefinition;
import org.thingsboard.rule.engine.api.RuleNode; import org.thingsboard.rule.engine.api.RuleNode;
@ -69,8 +69,6 @@ public class AnnotationComponentDiscoveryService implements ComponentDiscoverySe
private Map<ComponentType, List<ComponentDescriptor>> edgeComponentsMap = new HashMap<>(); private Map<ComponentType, List<ComponentDescriptor>> edgeComponentsMap = new HashMap<>();
private ObjectMapper mapper = new ObjectMapper();
private boolean isInstall() { private boolean isInstall() {
return environment.acceptsProfiles(Profiles.of("install")); return environment.acceptsProfiles(Profiles.of("install"));
} }
@ -156,8 +154,8 @@ public class AnnotationComponentDiscoveryService implements ComponentDiscoverySe
scannedComponent.setName(ruleNodeAnnotation.name()); scannedComponent.setName(ruleNodeAnnotation.name());
scannedComponent.setScope(ruleNodeAnnotation.scope()); scannedComponent.setScope(ruleNodeAnnotation.scope());
NodeDefinition nodeDefinition = prepareNodeDefinition(ruleNodeAnnotation); NodeDefinition nodeDefinition = prepareNodeDefinition(ruleNodeAnnotation);
ObjectNode configurationDescriptor = mapper.createObjectNode(); ObjectNode configurationDescriptor = JacksonUtil.newObjectNode();
JsonNode node = mapper.valueToTree(nodeDefinition); JsonNode node = JacksonUtil.valueToTree(nodeDefinition);
configurationDescriptor.set("nodeDefinition", node); configurationDescriptor.set("nodeDefinition", node);
scannedComponent.setConfigurationDescriptor(configurationDescriptor); scannedComponent.setConfigurationDescriptor(configurationDescriptor);
scannedComponent.setClazz(clazzName); scannedComponent.setClazz(clazzName);
@ -194,7 +192,7 @@ public class AnnotationComponentDiscoveryService implements ComponentDiscoverySe
Class<? extends NodeConfiguration> configClazz = nodeAnnotation.configClazz(); Class<? extends NodeConfiguration> configClazz = nodeAnnotation.configClazz();
NodeConfiguration config = configClazz.getDeclaredConstructor().newInstance(); NodeConfiguration config = configClazz.getDeclaredConstructor().newInstance();
NodeConfiguration defaultConfiguration = config.defaultConfiguration(); NodeConfiguration defaultConfiguration = config.defaultConfiguration();
nodeDefinition.setDefaultConfiguration(mapper.valueToTree(defaultConfiguration)); nodeDefinition.setDefaultConfiguration(JacksonUtil.valueToTree(defaultConfiguration));
nodeDefinition.setUiResources(nodeAnnotation.uiResources()); nodeDefinition.setUiResources(nodeAnnotation.uiResources());
nodeDefinition.setConfigDirective(nodeAnnotation.configDirective()); nodeDefinition.setConfigDirective(nodeAnnotation.configDirective());
nodeDefinition.setIcon(nodeAnnotation.icon()); nodeDefinition.setIcon(nodeAnnotation.icon());

2
application/src/main/java/org/thingsboard/server/service/device/ClaimDevicesServiceImpl.java

@ -15,7 +15,6 @@
*/ */
package org.thingsboard.server.service.device; package org.thingsboard.server.service.device;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
@ -67,7 +66,6 @@ public class ClaimDevicesServiceImpl implements ClaimDevicesService {
private static final String CLAIM_ATTRIBUTE_NAME = "claimingAllowed"; private static final String CLAIM_ATTRIBUTE_NAME = "claimingAllowed";
private static final String CLAIM_DATA_ATTRIBUTE_NAME = "claimingData"; private static final String CLAIM_DATA_ATTRIBUTE_NAME = "claimingData";
private static final ObjectMapper mapper = new ObjectMapper();
@Autowired @Autowired
private TbClusterService clusterService; private TbClusterService clusterService;

9
application/src/main/java/org/thingsboard/server/service/install/DatabaseHelper.java

@ -16,10 +16,10 @@
package org.thingsboard.server.service.install; package org.thingsboard.server.service.install;
import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser; import org.apache.commons.csv.CSVParser;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.ShortCustomerInfo; import org.thingsboard.server.common.data.ShortCustomerInfo;
import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.common.data.UUIDConverter; import org.thingsboard.server.common.data.UUIDConverter;
@ -67,11 +67,10 @@ public class DatabaseHelper {
public static final String ASSIGNED_CUSTOMERS = "assigned_customers"; public static final String ASSIGNED_CUSTOMERS = "assigned_customers";
public static final String CONFIGURATION = "configuration"; public static final String CONFIGURATION = "configuration";
public static final ObjectMapper objectMapper = new ObjectMapper();
public static void upgradeTo40_assignDashboards(Path dashboardsDump, DashboardService dashboardService, boolean sql) throws Exception { public static void upgradeTo40_assignDashboards(Path dashboardsDump, DashboardService dashboardService, boolean sql) throws Exception {
JavaType assignedCustomersType = JavaType assignedCustomersType =
objectMapper.getTypeFactory().constructCollectionType(HashSet.class, ShortCustomerInfo.class); JacksonUtil.constructCollectionType(HashSet.class, ShortCustomerInfo.class);
try (CSVParser csvParser = new CSVParser(Files.newBufferedReader(dashboardsDump), CSV_DUMP_FORMAT.withFirstRecordAsHeader())) { try (CSVParser csvParser = new CSVParser(Files.newBufferedReader(dashboardsDump), CSV_DUMP_FORMAT.withFirstRecordAsHeader())) {
csvParser.forEach(record -> { csvParser.forEach(record -> {
String customerIdString = record.get(CUSTOMER_ID); String customerIdString = record.get(CUSTOMER_ID);
@ -80,14 +79,14 @@ public class DatabaseHelper {
List<CustomerId> customerIds = new ArrayList<>(); List<CustomerId> customerIds = new ArrayList<>();
if (!StringUtils.isEmpty(assignedCustomersString)) { if (!StringUtils.isEmpty(assignedCustomersString)) {
try { try {
Set<ShortCustomerInfo> assignedCustomers = objectMapper.readValue(assignedCustomersString, assignedCustomersType); Set<ShortCustomerInfo> assignedCustomers = JacksonUtil.fromString(assignedCustomersString, assignedCustomersType);
assignedCustomers.forEach((customerInfo) -> { assignedCustomers.forEach((customerInfo) -> {
CustomerId customerId = customerInfo.getCustomerId(); CustomerId customerId = customerInfo.getCustomerId();
if (!customerId.isNullUid()) { if (!customerId.isNullUid()) {
customerIds.add(customerId); customerIds.add(customerId);
} }
}); });
} catch (IOException e) { } catch (IllegalArgumentException e) {
log.error("Unable to parse assigned customers field", e); log.error("Unable to parse assigned customers field", e);
} }
} }

9
application/src/main/java/org/thingsboard/server/service/install/DefaultSystemDataLoaderService.java

@ -15,7 +15,6 @@
*/ */
package org.thingsboard.server.service.install; package org.thingsboard.server.service.install;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.ObjectNode;
import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.Futures;
@ -29,6 +28,7 @@ import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Profile; import org.springframework.context.annotation.Profile;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.common.util.ThingsBoardThreadFactory; import org.thingsboard.common.util.ThingsBoardThreadFactory;
import org.thingsboard.server.common.data.AdminSettings; import org.thingsboard.server.common.data.AdminSettings;
import org.thingsboard.server.common.data.Customer; import org.thingsboard.server.common.data.Customer;
@ -116,7 +116,6 @@ import java.util.concurrent.Executors;
@Slf4j @Slf4j
public class DefaultSystemDataLoaderService implements SystemDataLoaderService { public class DefaultSystemDataLoaderService implements SystemDataLoaderService {
private static final ObjectMapper objectMapper = new ObjectMapper();
public static final String CUSTOMER_CRED = "customer"; public static final String CUSTOMER_CRED = "customer";
public static final String DEFAULT_DEVICE_TYPE = "default"; public static final String DEFAULT_DEVICE_TYPE = "default";
public static final String ACTIVITY_STATE = "active"; public static final String ACTIVITY_STATE = "active";
@ -251,7 +250,7 @@ public class DefaultSystemDataLoaderService implements SystemDataLoaderService {
AdminSettings generalSettings = new AdminSettings(); AdminSettings generalSettings = new AdminSettings();
generalSettings.setTenantId(TenantId.SYS_TENANT_ID); generalSettings.setTenantId(TenantId.SYS_TENANT_ID);
generalSettings.setKey("general"); generalSettings.setKey("general");
ObjectNode node = objectMapper.createObjectNode(); ObjectNode node = JacksonUtil.newObjectNode();
node.put("baseUrl", "http://localhost:8080"); node.put("baseUrl", "http://localhost:8080");
node.put("prohibitDifferentUrl", false); node.put("prohibitDifferentUrl", false);
generalSettings.setJsonValue(node); generalSettings.setJsonValue(node);
@ -260,7 +259,7 @@ public class DefaultSystemDataLoaderService implements SystemDataLoaderService {
AdminSettings mailSettings = new AdminSettings(); AdminSettings mailSettings = new AdminSettings();
mailSettings.setTenantId(TenantId.SYS_TENANT_ID); mailSettings.setTenantId(TenantId.SYS_TENANT_ID);
mailSettings.setKey("mail"); mailSettings.setKey("mail");
node = objectMapper.createObjectNode(); node = JacksonUtil.newObjectNode();
node.put("mailFrom", "ThingsBoard <sysadmin@localhost.localdomain>"); node.put("mailFrom", "ThingsBoard <sysadmin@localhost.localdomain>");
node.put("smtpProtocol", "smtp"); node.put("smtpProtocol", "smtp");
node.put("smtpHost", "localhost"); node.put("smtpHost", "localhost");
@ -542,7 +541,7 @@ public class DefaultSystemDataLoaderService implements SystemDataLoaderService {
device.setDeviceProfileId(deviceProfileId); device.setDeviceProfileId(deviceProfileId);
device.setName(name); device.setName(name);
if (description != null) { if (description != null) {
ObjectNode additionalInfo = objectMapper.createObjectNode(); ObjectNode additionalInfo = JacksonUtil.newObjectNode();
additionalInfo.put("description", description); additionalInfo.put("description", description);
device.setAdditionalInfo(additionalInfo); device.setAdditionalInfo(additionalInfo);
} }

22
application/src/main/java/org/thingsboard/server/service/install/InstallScripts.java

@ -20,6 +20,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.Dashboard; import org.thingsboard.server.common.data.Dashboard;
import org.thingsboard.server.common.data.ResourceType; import org.thingsboard.server.common.data.ResourceType;
import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.StringUtils;
@ -48,7 +49,6 @@ import java.nio.file.Paths;
import java.util.Base64; import java.util.Base64;
import java.util.Optional; import java.util.Optional;
import static org.thingsboard.server.service.install.DatabaseHelper.objectMapper;
import static org.thingsboard.server.utils.LwM2mObjectModelUtils.toLwm2mResource; import static org.thingsboard.server.utils.LwM2mObjectModelUtils.toLwm2mResource;
/** /**
@ -162,9 +162,9 @@ public class InstallScripts {
} }
public RuleChain createRuleChainFromFile(TenantId tenantId, Path templateFilePath, String newRuleChainName) throws IOException { public RuleChain createRuleChainFromFile(TenantId tenantId, Path templateFilePath, String newRuleChainName) throws IOException {
JsonNode ruleChainJson = objectMapper.readTree(templateFilePath.toFile()); JsonNode ruleChainJson = JacksonUtil.toJsonNode(templateFilePath.toFile());
RuleChain ruleChain = objectMapper.treeToValue(ruleChainJson.get("ruleChain"), RuleChain.class); RuleChain ruleChain = JacksonUtil.treeToValue(ruleChainJson.get("ruleChain"), RuleChain.class);
RuleChainMetaData ruleChainMetaData = objectMapper.treeToValue(ruleChainJson.get("metadata"), RuleChainMetaData.class); RuleChainMetaData ruleChainMetaData = JacksonUtil.treeToValue(ruleChainJson.get("metadata"), RuleChainMetaData.class);
ruleChain.setTenantId(tenantId); ruleChain.setTenantId(tenantId);
if (!StringUtils.isEmpty(newRuleChainName)) { if (!StringUtils.isEmpty(newRuleChainName)) {
@ -184,15 +184,15 @@ public class InstallScripts {
dirStream.forEach( dirStream.forEach(
path -> { path -> {
try { try {
JsonNode widgetsBundleDescriptorJson = objectMapper.readTree(path.toFile()); JsonNode widgetsBundleDescriptorJson = JacksonUtil.toJsonNode(path.toFile());
JsonNode widgetsBundleJson = widgetsBundleDescriptorJson.get("widgetsBundle"); JsonNode widgetsBundleJson = widgetsBundleDescriptorJson.get("widgetsBundle");
WidgetsBundle widgetsBundle = objectMapper.treeToValue(widgetsBundleJson, WidgetsBundle.class); WidgetsBundle widgetsBundle = JacksonUtil.treeToValue(widgetsBundleJson, WidgetsBundle.class);
WidgetsBundle savedWidgetsBundle = widgetsBundleService.saveWidgetsBundle(widgetsBundle); WidgetsBundle savedWidgetsBundle = widgetsBundleService.saveWidgetsBundle(widgetsBundle);
JsonNode widgetTypesArrayJson = widgetsBundleDescriptorJson.get("widgetTypes"); JsonNode widgetTypesArrayJson = widgetsBundleDescriptorJson.get("widgetTypes");
widgetTypesArrayJson.forEach( widgetTypesArrayJson.forEach(
widgetTypeJson -> { widgetTypeJson -> {
try { try {
WidgetTypeDetails widgetTypeDetails = objectMapper.treeToValue(widgetTypeJson, WidgetTypeDetails.class); WidgetTypeDetails widgetTypeDetails = JacksonUtil.treeToValue(widgetTypeJson, WidgetTypeDetails.class);
widgetTypeDetails.setBundleAlias(savedWidgetsBundle.getAlias()); widgetTypeDetails.setBundleAlias(savedWidgetsBundle.getAlias());
widgetTypeService.saveWidgetType(widgetTypeDetails); widgetTypeService.saveWidgetType(widgetTypeDetails);
} catch (Exception e) { } catch (Exception e) {
@ -216,8 +216,8 @@ public class InstallScripts {
dirStream.forEach( dirStream.forEach(
path -> { path -> {
try { try {
JsonNode dashboardJson = objectMapper.readTree(path.toFile()); JsonNode dashboardJson = JacksonUtil.toJsonNode(path.toFile());
Dashboard dashboard = objectMapper.treeToValue(dashboardJson, Dashboard.class); Dashboard dashboard = JacksonUtil.treeToValue(dashboardJson, Dashboard.class);
dashboard.setTenantId(tenantId); dashboard.setTenantId(tenantId);
Dashboard savedDashboard = dashboardService.saveDashboard(dashboard); Dashboard savedDashboard = dashboardService.saveDashboard(dashboard);
if (customerId != null && !customerId.isNullUid()) { if (customerId != null && !customerId.isNullUid()) {
@ -249,8 +249,8 @@ public class InstallScripts {
dirStream.forEach( dirStream.forEach(
path -> { path -> {
try { try {
JsonNode oauth2ConfigTemplateJson = objectMapper.readTree(path.toFile()); JsonNode oauth2ConfigTemplateJson = JacksonUtil.toJsonNode(path.toFile());
OAuth2ClientRegistrationTemplate clientRegistrationTemplate = objectMapper.treeToValue(oauth2ConfigTemplateJson, OAuth2ClientRegistrationTemplate.class); OAuth2ClientRegistrationTemplate clientRegistrationTemplate = JacksonUtil.treeToValue(oauth2ConfigTemplateJson, OAuth2ClientRegistrationTemplate.class);
Optional<OAuth2ClientRegistrationTemplate> existingClientRegistrationTemplate = Optional<OAuth2ClientRegistrationTemplate> existingClientRegistrationTemplate =
oAuth2TemplateService.findClientRegistrationTemplateByProviderId(clientRegistrationTemplate.getProviderId()); oAuth2TemplateService.findClientRegistrationTemplateByProviderId(clientRegistrationTemplate.getProviderId());
if (existingClientRegistrationTemplate.isPresent()) { if (existingClientRegistrationTemplate.isPresent()) {

10
application/src/main/java/org/thingsboard/server/service/rpc/DefaultTbCoreDeviceRpcService.java

@ -16,11 +16,11 @@
package org.thingsboard.server.service.rpc; package org.thingsboard.server.service.rpc;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.ObjectNode;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.common.util.ThingsBoardThreadFactory; import org.thingsboard.common.util.ThingsBoardThreadFactory;
import org.thingsboard.server.actors.ActorSystemContext; import org.thingsboard.server.actors.ActorSystemContext;
import org.thingsboard.server.cluster.TbClusterService; import org.thingsboard.server.cluster.TbClusterService;
@ -57,8 +57,6 @@ import java.util.function.Consumer;
@TbCoreComponent @TbCoreComponent
public class DefaultTbCoreDeviceRpcService implements TbCoreDeviceRpcService { public class DefaultTbCoreDeviceRpcService implements TbCoreDeviceRpcService {
private static final ObjectMapper json = new ObjectMapper();
private final DeviceService deviceService; private final DeviceService deviceService;
private final TbClusterService clusterService; private final TbClusterService clusterService;
private final TbServiceInfoProvider serviceInfoProvider; private final TbServiceInfoProvider serviceInfoProvider;
@ -159,7 +157,7 @@ public class DefaultTbCoreDeviceRpcService implements TbCoreDeviceRpcService {
} }
private void sendRpcRequestToRuleEngine(ToDeviceRpcRequest msg, SecurityUser currentUser) { private void sendRpcRequestToRuleEngine(ToDeviceRpcRequest msg, SecurityUser currentUser) {
ObjectNode entityNode = json.createObjectNode(); ObjectNode entityNode = JacksonUtil.newObjectNode();
TbMsgMetaData metaData = new TbMsgMetaData(); TbMsgMetaData metaData = new TbMsgMetaData();
metaData.putValue("requestUUID", msg.getId().toString()); metaData.putValue("requestUUID", msg.getId().toString());
metaData.putValue("originServiceId", serviceId); metaData.putValue("originServiceId", serviceId);
@ -184,9 +182,9 @@ public class DefaultTbCoreDeviceRpcService implements TbCoreDeviceRpcService {
entityNode.put(DataConstants.ADDITIONAL_INFO, msg.getAdditionalInfo()); entityNode.put(DataConstants.ADDITIONAL_INFO, msg.getAdditionalInfo());
try { try {
TbMsg tbMsg = TbMsg.newMsg(DataConstants.RPC_CALL_FROM_SERVER_TO_DEVICE, msg.getDeviceId(), Optional.ofNullable(currentUser).map(User::getCustomerId).orElse(null), metaData, TbMsgDataType.JSON, json.writeValueAsString(entityNode)); TbMsg tbMsg = TbMsg.newMsg(DataConstants.RPC_CALL_FROM_SERVER_TO_DEVICE, msg.getDeviceId(), Optional.ofNullable(currentUser).map(User::getCustomerId).orElse(null), metaData, TbMsgDataType.JSON, JacksonUtil.toString(entityNode));
clusterService.pushMsgToRuleEngine(msg.getTenantId(), msg.getDeviceId(), tbMsg, null); clusterService.pushMsgToRuleEngine(msg.getTenantId(), msg.getDeviceId(), tbMsg, null);
} catch (JsonProcessingException e) { } catch (IllegalArgumentException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
} }

8
application/src/main/java/org/thingsboard/server/service/security/auth/jwt/RefreshTokenProcessingFilter.java

@ -15,7 +15,6 @@
*/ */
package org.thingsboard.server.service.security.auth.jwt; package org.thingsboard.server.service.security.auth.jwt;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpMethod; import org.springframework.http.HttpMethod;
import org.springframework.security.authentication.AuthenticationServiceException; import org.springframework.security.authentication.AuthenticationServiceException;
@ -25,6 +24,7 @@ import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter; import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter;
import org.springframework.security.web.authentication.AuthenticationFailureHandler; import org.springframework.security.web.authentication.AuthenticationFailureHandler;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler; import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.service.security.auth.RefreshAuthenticationToken; import org.thingsboard.server.service.security.auth.RefreshAuthenticationToken;
import org.thingsboard.server.service.security.exception.AuthMethodNotSupportedException; import org.thingsboard.server.service.security.exception.AuthMethodNotSupportedException;
@ -42,14 +42,12 @@ public class RefreshTokenProcessingFilter extends AbstractAuthenticationProcessi
private final AuthenticationSuccessHandler successHandler; private final AuthenticationSuccessHandler successHandler;
private final AuthenticationFailureHandler failureHandler; private final AuthenticationFailureHandler failureHandler;
private final ObjectMapper objectMapper;
public RefreshTokenProcessingFilter(String defaultProcessUrl, AuthenticationSuccessHandler successHandler, public RefreshTokenProcessingFilter(String defaultProcessUrl, AuthenticationSuccessHandler successHandler,
AuthenticationFailureHandler failureHandler, ObjectMapper mapper) { AuthenticationFailureHandler failureHandler) {
super(defaultProcessUrl); super(defaultProcessUrl);
this.successHandler = successHandler; this.successHandler = successHandler;
this.failureHandler = failureHandler; this.failureHandler = failureHandler;
this.objectMapper = mapper;
} }
@Override @Override
@ -64,7 +62,7 @@ public class RefreshTokenProcessingFilter extends AbstractAuthenticationProcessi
RefreshTokenRequest refreshTokenRequest; RefreshTokenRequest refreshTokenRequest;
try { try {
refreshTokenRequest = objectMapper.readValue(request.getReader(), RefreshTokenRequest.class); refreshTokenRequest = JacksonUtil.fromReader(request.getReader(), RefreshTokenRequest.class);
} catch (Exception e) { } catch (Exception e) {
throw new AuthenticationServiceException("Invalid refresh token request payload"); throw new AuthenticationServiceException("Invalid refresh token request payload");
} }

6
application/src/main/java/org/thingsboard/server/service/security/auth/oauth2/AbstractOAuth2ClientMapper.java

@ -15,7 +15,6 @@
*/ */
package org.thingsboard.server.service.security.auth.oauth2; package org.thingsboard.server.service.security.auth.oauth2;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.ObjectNode;
import lombok.Getter; import lombok.Getter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -24,6 +23,7 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.cluster.TbClusterService; import org.thingsboard.server.cluster.TbClusterService;
import org.thingsboard.server.common.data.Customer; import org.thingsboard.server.common.data.Customer;
import org.thingsboard.server.common.data.DashboardInfo; import org.thingsboard.server.common.data.DashboardInfo;
@ -62,8 +62,6 @@ import java.util.concurrent.locks.ReentrantLock;
public abstract class AbstractOAuth2ClientMapper { public abstract class AbstractOAuth2ClientMapper {
private static final int DASHBOARDS_REQUEST_LIMIT = 10; private static final int DASHBOARDS_REQUEST_LIMIT = 10;
private static final ObjectMapper objectMapper = new ObjectMapper();
@Autowired @Autowired
private UserService userService; private UserService userService;
@ -130,7 +128,7 @@ public abstract class AbstractOAuth2ClientMapper {
user.setFirstName(oauth2User.getFirstName()); user.setFirstName(oauth2User.getFirstName());
user.setLastName(oauth2User.getLastName()); user.setLastName(oauth2User.getLastName());
ObjectNode additionalInfo = objectMapper.createObjectNode(); ObjectNode additionalInfo = JacksonUtil.newObjectNode();
if (!StringUtils.isEmpty(oauth2User.getDefaultDashboardName())) { if (!StringUtils.isEmpty(oauth2User.getDefaultDashboardName())) {
Optional<DashboardId> dashboardIdOpt = Optional<DashboardId> dashboardIdOpt =

16
application/src/main/java/org/thingsboard/server/service/security/auth/oauth2/CustomOAuth2ClientMapper.java

@ -16,13 +16,12 @@
package org.thingsboard.server.service.security.auth.oauth2; package org.thingsboard.server.service.security.auth.oauth2;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken; import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate; import org.springframework.web.client.RestTemplate;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.common.data.oauth2.OAuth2CustomMapperConfig; import org.thingsboard.server.common.data.oauth2.OAuth2CustomMapperConfig;
import org.thingsboard.server.common.data.oauth2.OAuth2MapperConfig; import org.thingsboard.server.common.data.oauth2.OAuth2MapperConfig;
@ -31,7 +30,6 @@ import org.thingsboard.server.dao.oauth2.OAuth2User;
import org.thingsboard.server.queue.util.TbCoreComponent; import org.thingsboard.server.queue.util.TbCoreComponent;
import org.thingsboard.server.service.security.model.SecurityUser; import org.thingsboard.server.service.security.model.SecurityUser;
import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@Service(value = "customOAuth2ClientMapper") @Service(value = "customOAuth2ClientMapper")
@ -40,19 +38,9 @@ import javax.servlet.http.HttpServletRequest;
public class CustomOAuth2ClientMapper extends AbstractOAuth2ClientMapper implements OAuth2ClientMapper { public class CustomOAuth2ClientMapper extends AbstractOAuth2ClientMapper implements OAuth2ClientMapper {
private static final String PROVIDER_ACCESS_TOKEN = "provider-access-token"; private static final String PROVIDER_ACCESS_TOKEN = "provider-access-token";
private static final ObjectMapper json = new ObjectMapper();
private RestTemplateBuilder restTemplateBuilder = new RestTemplateBuilder(); private RestTemplateBuilder restTemplateBuilder = new RestTemplateBuilder();
@PostConstruct
public void init() {
// Register time module to parse Instant objects.
// com.fasterxml.jackson.databind.exc.InvalidDefinitionException:
// Java 8 date/time type `java.time.Instant` not supported by default:
// add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling
json.registerModule(new JavaTimeModule());
}
@Override @Override
public SecurityUser getOrCreateUserByClientPrincipal(HttpServletRequest request, OAuth2AuthenticationToken token, String providerAccessToken, OAuth2Registration registration) { public SecurityUser getOrCreateUserByClientPrincipal(HttpServletRequest request, OAuth2AuthenticationToken token, String providerAccessToken, OAuth2Registration registration) {
OAuth2MapperConfig config = registration.getMapperConfig(); OAuth2MapperConfig config = registration.getMapperConfig();
@ -71,7 +59,7 @@ public class CustomOAuth2ClientMapper extends AbstractOAuth2ClientMapper impleme
RestTemplate restTemplate = restTemplateBuilder.build(); RestTemplate restTemplate = restTemplateBuilder.build();
String request; String request;
try { try {
request = json.writeValueAsString(token.getPrincipal()); request = JacksonUtil.getObjectMapperWithJavaTimeModule().writeValueAsString(token.getPrincipal());
} catch (JsonProcessingException e) { } catch (JsonProcessingException e) {
log.error("Can't convert principal to JSON string", e); log.error("Can't convert principal to JSON string", e);
throw new RuntimeException("Can't convert principal to JSON string", e); throw new RuntimeException("Can't convert principal to JSON string", e);

5
application/src/main/java/org/thingsboard/server/service/security/auth/rest/RestAwareAuthenticationSuccessHandler.java

@ -15,7 +15,6 @@
*/ */
package org.thingsboard.server.service.security.auth.rest; package org.thingsboard.server.service.security.auth.rest;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
@ -23,6 +22,7 @@ import org.springframework.security.core.Authentication;
import org.springframework.security.web.WebAttributes; import org.springframework.security.web.WebAttributes;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler; import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.security.Authority; import org.thingsboard.server.common.data.security.Authority;
import org.thingsboard.server.service.security.auth.MfaAuthenticationToken; import org.thingsboard.server.service.security.auth.MfaAuthenticationToken;
import org.thingsboard.server.service.security.auth.mfa.config.TwoFaConfigManager; import org.thingsboard.server.service.security.auth.mfa.config.TwoFaConfigManager;
@ -41,7 +41,6 @@ import java.util.concurrent.TimeUnit;
@Component(value = "defaultAuthenticationSuccessHandler") @Component(value = "defaultAuthenticationSuccessHandler")
@RequiredArgsConstructor @RequiredArgsConstructor
public class RestAwareAuthenticationSuccessHandler implements AuthenticationSuccessHandler { public class RestAwareAuthenticationSuccessHandler implements AuthenticationSuccessHandler {
private final ObjectMapper mapper;
private final JwtTokenFactory tokenFactory; private final JwtTokenFactory tokenFactory;
private final TwoFaConfigManager twoFaConfigManager; private final TwoFaConfigManager twoFaConfigManager;
@ -65,7 +64,7 @@ public class RestAwareAuthenticationSuccessHandler implements AuthenticationSucc
response.setStatus(HttpStatus.OK.value()); response.setStatus(HttpStatus.OK.value());
response.setContentType(MediaType.APPLICATION_JSON_VALUE); response.setContentType(MediaType.APPLICATION_JSON_VALUE);
mapper.writeValue(response.getWriter(), tokenPair); JacksonUtil.writeValue(response.getWriter(), tokenPair);
clearAuthenticationAttributes(request); clearAuthenticationAttributes(request);
} }

8
application/src/main/java/org/thingsboard/server/service/security/auth/rest/RestLoginProcessingFilter.java

@ -15,7 +15,6 @@
*/ */
package org.thingsboard.server.service.security.auth.rest; package org.thingsboard.server.service.security.auth.rest;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpMethod; import org.springframework.http.HttpMethod;
import org.springframework.security.authentication.AuthenticationDetailsSource; import org.springframework.security.authentication.AuthenticationDetailsSource;
@ -27,6 +26,7 @@ import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter; import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter;
import org.springframework.security.web.authentication.AuthenticationFailureHandler; import org.springframework.security.web.authentication.AuthenticationFailureHandler;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler; import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.service.security.exception.AuthMethodNotSupportedException; import org.thingsboard.server.service.security.exception.AuthMethodNotSupportedException;
import org.thingsboard.server.service.security.model.UserPrincipal; import org.thingsboard.server.service.security.model.UserPrincipal;
@ -45,14 +45,12 @@ public class RestLoginProcessingFilter extends AbstractAuthenticationProcessingF
private final AuthenticationSuccessHandler successHandler; private final AuthenticationSuccessHandler successHandler;
private final AuthenticationFailureHandler failureHandler; private final AuthenticationFailureHandler failureHandler;
private final ObjectMapper objectMapper;
public RestLoginProcessingFilter(String defaultProcessUrl, AuthenticationSuccessHandler successHandler, public RestLoginProcessingFilter(String defaultProcessUrl, AuthenticationSuccessHandler successHandler,
AuthenticationFailureHandler failureHandler, ObjectMapper mapper) { AuthenticationFailureHandler failureHandler) {
super(defaultProcessUrl); super(defaultProcessUrl);
this.successHandler = successHandler; this.successHandler = successHandler;
this.failureHandler = failureHandler; this.failureHandler = failureHandler;
this.objectMapper = mapper;
} }
@Override @Override
@ -67,7 +65,7 @@ public class RestLoginProcessingFilter extends AbstractAuthenticationProcessingF
LoginRequest loginRequest; LoginRequest loginRequest;
try { try {
loginRequest = objectMapper.readValue(request.getReader(), LoginRequest.class); loginRequest = JacksonUtil.fromReader(request.getReader(), LoginRequest.class);
} catch (Exception e) { } catch (Exception e) {
throw new AuthenticationServiceException("Invalid login request payload"); throw new AuthenticationServiceException("Invalid login request payload");
} }

8
application/src/main/java/org/thingsboard/server/service/security/auth/rest/RestPublicLoginProcessingFilter.java

@ -15,7 +15,6 @@
*/ */
package org.thingsboard.server.service.security.auth.rest; package org.thingsboard.server.service.security.auth.rest;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpMethod; import org.springframework.http.HttpMethod;
import org.springframework.security.authentication.AuthenticationServiceException; import org.springframework.security.authentication.AuthenticationServiceException;
@ -26,6 +25,7 @@ import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter; import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter;
import org.springframework.security.web.authentication.AuthenticationFailureHandler; import org.springframework.security.web.authentication.AuthenticationFailureHandler;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler; import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.service.security.exception.AuthMethodNotSupportedException; import org.thingsboard.server.service.security.exception.AuthMethodNotSupportedException;
import org.thingsboard.server.service.security.model.UserPrincipal; import org.thingsboard.server.service.security.model.UserPrincipal;
@ -42,14 +42,12 @@ public class RestPublicLoginProcessingFilter extends AbstractAuthenticationProce
private final AuthenticationSuccessHandler successHandler; private final AuthenticationSuccessHandler successHandler;
private final AuthenticationFailureHandler failureHandler; private final AuthenticationFailureHandler failureHandler;
private final ObjectMapper objectMapper;
public RestPublicLoginProcessingFilter(String defaultProcessUrl, AuthenticationSuccessHandler successHandler, public RestPublicLoginProcessingFilter(String defaultProcessUrl, AuthenticationSuccessHandler successHandler,
AuthenticationFailureHandler failureHandler, ObjectMapper mapper) { AuthenticationFailureHandler failureHandler) {
super(defaultProcessUrl); super(defaultProcessUrl);
this.successHandler = successHandler; this.successHandler = successHandler;
this.failureHandler = failureHandler; this.failureHandler = failureHandler;
this.objectMapper = mapper;
} }
@Override @Override
@ -64,7 +62,7 @@ public class RestPublicLoginProcessingFilter extends AbstractAuthenticationProce
PublicLoginRequest loginRequest; PublicLoginRequest loginRequest;
try { try {
loginRequest = objectMapper.readValue(request.getReader(), PublicLoginRequest.class); loginRequest = JacksonUtil.fromReader(request.getReader(), PublicLoginRequest.class);
} catch (Exception e) { } catch (Exception e) {
throw new AuthenticationServiceException("Invalid public login request payload"); throw new AuthenticationServiceException("Invalid public login request payload");
} }

9
application/src/main/java/org/thingsboard/server/service/transport/DefaultTransportApiService.java

@ -17,7 +17,6 @@ package org.thingsboard.server.service.transport;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.ObjectNode;
import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
@ -122,8 +121,6 @@ import static org.thingsboard.server.service.transport.BasicCredentialsValidatio
@RequiredArgsConstructor @RequiredArgsConstructor
public class DefaultTransportApiService implements TransportApiService { public class DefaultTransportApiService implements TransportApiService {
private static final ObjectMapper mapper = new ObjectMapper();
private final TbDeviceProfileCache deviceProfileCache; private final TbDeviceProfileCache deviceProfileCache;
private final TbTenantProfileCache tenantProfileCache; private final TbTenantProfileCache tenantProfileCache;
private final TbApiUsageStateService apiUsageStateService; private final TbApiUsageStateService apiUsageStateService;
@ -309,8 +306,8 @@ public class DefaultTransportApiService implements TransportApiService {
metaData.putValue("gatewayId", gatewayId.toString()); metaData.putValue("gatewayId", gatewayId.toString());
DeviceId deviceId = device.getId(); DeviceId deviceId = device.getId();
ObjectNode entityNode = mapper.valueToTree(device); JsonNode entityNode = JacksonUtil.valueToTree(device);
TbMsg tbMsg = TbMsg.newMsg(DataConstants.ENTITY_CREATED, deviceId, customerId, metaData, TbMsgDataType.JSON, mapper.writeValueAsString(entityNode)); TbMsg tbMsg = TbMsg.newMsg(DataConstants.ENTITY_CREATED, deviceId, customerId, metaData, TbMsgDataType.JSON, JacksonUtil.toString(entityNode));
tbClusterService.pushMsgToRuleEngine(tenantId, deviceId, tbMsg, null); tbClusterService.pushMsgToRuleEngine(tenantId, deviceId, tbMsg, null);
} else { } else {
JsonNode deviceAdditionalInfo = device.getAdditionalInfo(); JsonNode deviceAdditionalInfo = device.getAdditionalInfo();
@ -520,7 +517,7 @@ public class DefaultTransportApiService implements TransportApiService {
.setDeviceType(device.getType()) .setDeviceType(device.getType())
.setDeviceProfileIdMSB(device.getDeviceProfileId().getId().getMostSignificantBits()) .setDeviceProfileIdMSB(device.getDeviceProfileId().getId().getMostSignificantBits())
.setDeviceProfileIdLSB(device.getDeviceProfileId().getId().getLeastSignificantBits()) .setDeviceProfileIdLSB(device.getDeviceProfileId().getId().getLeastSignificantBits())
.setAdditionalInfo(mapper.writeValueAsString(device.getAdditionalInfo())); .setAdditionalInfo(JacksonUtil.toString(device.getAdditionalInfo()));
PowerSavingConfiguration psmConfiguration = null; PowerSavingConfiguration psmConfiguration = null;
switch (device.getDeviceData().getTransportConfiguration().getType()) { switch (device.getDeviceData().getTransportConfiguration().getType()) {

5
application/src/main/java/org/thingsboard/server/service/update/DefaultUpdateService.java

@ -15,7 +15,6 @@
*/ */
package org.thingsboard.server.service.update; package org.thingsboard.server.service.update;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.ObjectNode;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -26,6 +25,7 @@ import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate; import org.springframework.web.client.RestTemplate;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.common.util.ThingsBoardThreadFactory; import org.thingsboard.common.util.ThingsBoardThreadFactory;
import org.thingsboard.server.common.data.UpdateMessage; import org.thingsboard.server.common.data.UpdateMessage;
import org.thingsboard.server.common.msg.notification.trigger.NewPlatformVersionTrigger; import org.thingsboard.server.common.msg.notification.trigger.NewPlatformVersionTrigger;
@ -33,7 +33,6 @@ import org.thingsboard.server.common.msg.notification.NotificationRuleProcessor;
import org.thingsboard.server.queue.util.AfterStartUp; import org.thingsboard.server.queue.util.AfterStartUp;
import org.thingsboard.server.queue.util.TbCoreComponent; import org.thingsboard.server.queue.util.TbCoreComponent;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy; import javax.annotation.PreDestroy;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
@ -129,7 +128,7 @@ public class DefaultUpdateService implements UpdateService {
log.trace("Executing check update method for instanceId [{}], platform [{}] and version [{}]", instanceId, platform, version); log.trace("Executing check update method for instanceId [{}], platform [{}] and version [{}]", instanceId, platform, version);
var headers = new HttpHeaders(); var headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON); headers.setContentType(MediaType.APPLICATION_JSON);
ObjectNode request = new ObjectMapper().createObjectNode(); ObjectNode request = JacksonUtil.newObjectNode();
request.put(PLATFORM_PARAM, platform); request.put(PLATFORM_PARAM, platform);
request.put(VERSION_PARAM, version); request.put(VERSION_PARAM, version);
request.put(INSTANCE_ID_PARAM, instanceId.toString()); request.put(INSTANCE_ID_PARAM, instanceId.toString());

5
application/src/test/java/org/thingsboard/server/controller/AbstractRuleEngineControllerTest.java

@ -19,6 +19,7 @@ import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.TestPropertySource;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.EventInfo; import org.thingsboard.server.common.data.EventInfo;
import org.thingsboard.server.common.data.event.EventType; import org.thingsboard.server.common.data.event.EventType;
import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.EntityId;
@ -75,8 +76,8 @@ public abstract class AbstractRuleEngineControllerTest extends AbstractControlle
protected JsonNode getMetadata(EventInfo outEvent) { protected JsonNode getMetadata(EventInfo outEvent) {
String metaDataStr = outEvent.getBody().get("metadata").asText(); String metaDataStr = outEvent.getBody().get("metadata").asText();
try { try {
return mapper.readTree(metaDataStr); return JacksonUtil.toJsonNode(metaDataStr);
} catch (IOException e) { } catch (IllegalArgumentException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
} }

8
application/src/test/java/org/thingsboard/server/controller/AbstractWebTest.java

@ -17,7 +17,6 @@ package org.thingsboard.server.controller;
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.ListeningExecutorService; import com.google.common.util.concurrent.ListeningExecutorService;
@ -57,6 +56,7 @@ import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilde
import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap; import org.springframework.util.MultiValueMap;
import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.WebApplicationContext;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.rule.engine.api.MailService; import org.thingsboard.rule.engine.api.MailService;
import org.thingsboard.server.actors.DefaultTbActorSystem; import org.thingsboard.server.actors.DefaultTbActorSystem;
import org.thingsboard.server.actors.TbActorId; import org.thingsboard.server.actors.TbActorId;
@ -144,8 +144,6 @@ public abstract class AbstractWebTest extends AbstractInMemoryStorageTest {
public static final int TIMEOUT = 30; public static final int TIMEOUT = 30;
protected ObjectMapper mapper = new ObjectMapper();
protected static final String TEST_TENANT_NAME = "TEST TENANT"; protected static final String TEST_TENANT_NAME = "TEST TENANT";
protected static final String TEST_DIFFERENT_TENANT_NAME = "TEST DIFFERENT TENANT"; protected static final String TEST_DIFFERENT_TENANT_NAME = "TEST DIFFERENT TENANT";
@ -442,7 +440,7 @@ public abstract class AbstractWebTest extends AbstractInMemoryStorageTest {
doGet("/api/noauth/activate?activateToken={activateToken}", this.currentActivateToken) doGet("/api/noauth/activate?activateToken={activateToken}", this.currentActivateToken)
.andExpect(status().isSeeOther()) .andExpect(status().isSeeOther())
.andExpect(header().string(HttpHeaders.LOCATION, "/login/createPassword?activateToken=" + this.currentActivateToken)); .andExpect(header().string(HttpHeaders.LOCATION, "/login/createPassword?activateToken=" + this.currentActivateToken));
return new ObjectMapper().createObjectNode() return JacksonUtil.newObjectNode()
.put("activateToken", this.currentActivateToken) .put("activateToken", this.currentActivateToken)
.put("password", password); .put("password", password);
} }
@ -806,7 +804,7 @@ public abstract class AbstractWebTest extends AbstractInMemoryStorageTest {
protected <T> T readResponse(MvcResult result, TypeReference<T> type) throws Exception { protected <T> T readResponse(MvcResult result, TypeReference<T> type) throws Exception {
byte[] content = result.getResponse().getContentAsByteArray(); byte[] content = result.getResponse().getContentAsByteArray();
return mapper.readerFor(type).readValue(content); return JacksonUtil.OBJECT_MAPPER.readerFor(type).readValue(content);
} }
protected String getErrorMessage(ResultActions result) throws Exception { protected String getErrorMessage(ResultActions result) throws Exception {

3
application/src/test/java/org/thingsboard/server/controller/BaseRuleChainControllerTest.java

@ -27,6 +27,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary; import org.springframework.context.annotation.Primary;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.rule.engine.action.TbCreateAlarmNode; import org.thingsboard.rule.engine.action.TbCreateAlarmNode;
import org.thingsboard.rule.engine.action.TbCreateAlarmNodeConfiguration; import org.thingsboard.rule.engine.action.TbCreateAlarmNodeConfiguration;
import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.StringUtils;
@ -273,7 +274,7 @@ public abstract class BaseRuleChainControllerTest extends AbstractControllerTest
TbCreateAlarmNodeConfiguration invalidCreateAlarmNodeConfiguration = new TbCreateAlarmNodeConfiguration(); TbCreateAlarmNodeConfiguration invalidCreateAlarmNodeConfiguration = new TbCreateAlarmNodeConfiguration();
invalidCreateAlarmNodeConfiguration.setSeverity("<script/>"); invalidCreateAlarmNodeConfiguration.setSeverity("<script/>");
invalidCreateAlarmNodeConfiguration.setAlarmType("<script/>"); invalidCreateAlarmNodeConfiguration.setAlarmType("<script/>");
createAlarmNode.setConfiguration(mapper.valueToTree(invalidCreateAlarmNodeConfiguration)); createAlarmNode.setConfiguration(JacksonUtil.valueToTree(invalidCreateAlarmNodeConfiguration));
List<RuleNode> ruleNodes = new ArrayList<>(); List<RuleNode> ruleNodes = new ArrayList<>();
ruleNodes.add(createAlarmNode); ruleNodes.add(createAlarmNode);

62
application/src/test/java/org/thingsboard/server/controller/BaseUserControllerTest.java

@ -17,7 +17,6 @@ package org.thingsboard.server.controller;
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.RandomStringUtils;
import org.junit.After; import org.junit.After;
import org.junit.Assert; import org.junit.Assert;
@ -31,6 +30,7 @@ import org.springframework.context.annotation.Primary;
import org.springframework.http.HttpHeaders; import org.springframework.http.HttpHeaders;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.ResultActions;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.Customer; import org.thingsboard.server.common.data.Customer;
import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.Dashboard; import org.thingsboard.server.common.data.Dashboard;
@ -119,7 +119,7 @@ public abstract class BaseUserControllerTest extends AbstractControllerTest {
.andExpect(status().isSeeOther()) .andExpect(status().isSeeOther())
.andExpect(header().string(HttpHeaders.LOCATION, "/login/createPassword?activateToken=" + this.currentActivateToken)); .andExpect(header().string(HttpHeaders.LOCATION, "/login/createPassword?activateToken=" + this.currentActivateToken));
JsonNode activateRequest = new ObjectMapper().createObjectNode() JsonNode activateRequest = JacksonUtil.newObjectNode()
.put("activateToken", this.currentActivateToken) .put("activateToken", this.currentActivateToken)
.put("password", "testPassword"); .put("password", "testPassword");
@ -211,7 +211,7 @@ public abstract class BaseUserControllerTest extends AbstractControllerTest {
User savedUser = createUserAndLogin(user, "testPassword1"); User savedUser = createUserAndLogin(user, "testPassword1");
resetTokens(); resetTokens();
JsonNode resetPasswordByEmailRequest = new ObjectMapper().createObjectNode() JsonNode resetPasswordByEmailRequest = JacksonUtil.newObjectNode()
.put("email", email); .put("email", email);
doPost("/api/noauth/resetPasswordByEmail", resetPasswordByEmailRequest) doPost("/api/noauth/resetPasswordByEmail", resetPasswordByEmailRequest)
@ -221,7 +221,7 @@ public abstract class BaseUserControllerTest extends AbstractControllerTest {
.andExpect(status().isSeeOther()) .andExpect(status().isSeeOther())
.andExpect(header().string(HttpHeaders.LOCATION, "/login/resetPassword?resetToken=" + this.currentResetPasswordToken)); .andExpect(header().string(HttpHeaders.LOCATION, "/login/resetPassword?resetToken=" + this.currentResetPasswordToken));
JsonNode resetPasswordRequest = new ObjectMapper().createObjectNode() JsonNode resetPasswordRequest = JacksonUtil.newObjectNode()
.put("resetToken", this.currentResetPasswordToken) .put("resetToken", this.currentResetPasswordToken)
.put("password", "testPassword2"); .put("password", "testPassword2");
@ -770,7 +770,7 @@ public abstract class BaseUserControllerTest extends AbstractControllerTest {
public void testSaveUserSettings() throws Exception { public void testSaveUserSettings() throws Exception {
loginCustomerUser(); loginCustomerUser();
JsonNode userSettings = mapper.readTree("{\"A\":5, \"B\":10, \"E\":18}"); JsonNode userSettings = JacksonUtil.toJsonNode("{\"A\":5, \"B\":10, \"E\":18}");
JsonNode savedSettings = doPost("/api/user/settings", userSettings, JsonNode.class); JsonNode savedSettings = doPost("/api/user/settings", userSettings, JsonNode.class);
Assert.assertEquals(userSettings, savedSettings); Assert.assertEquals(userSettings, savedSettings);
@ -782,10 +782,10 @@ public abstract class BaseUserControllerTest extends AbstractControllerTest {
public void testShouldNotSaveJsonWithRestrictedSymbols() throws Exception { public void testShouldNotSaveJsonWithRestrictedSymbols() throws Exception {
loginCustomerUser(); loginCustomerUser();
JsonNode userSettings = mapper.readTree("{\"A.B\":5, \"E\":18}"); JsonNode userSettings = JacksonUtil.toJsonNode("{\"A.B\":5, \"E\":18}");
doPost("/api/user/settings", userSettings).andExpect(status().isBadRequest()); doPost("/api/user/settings", userSettings).andExpect(status().isBadRequest());
userSettings = mapper.readTree("{\"A,B\":5, \"E\":18}"); userSettings = JacksonUtil.toJsonNode("{\"A,B\":5, \"E\":18}");
doPost("/api/user/settings", userSettings).andExpect(status().isBadRequest()); doPost("/api/user/settings", userSettings).andExpect(status().isBadRequest());
} }
@ -793,38 +793,38 @@ public abstract class BaseUserControllerTest extends AbstractControllerTest {
public void testUpdateUserSettings() throws Exception { public void testUpdateUserSettings() throws Exception {
loginCustomerUser(); loginCustomerUser();
JsonNode userSettings = mapper.readTree("{\"A\":5, \"B\":{\"C\":true, \"D\":\"stringValue\"}}"); JsonNode userSettings = JacksonUtil.toJsonNode("{\"A\":5, \"B\":{\"C\":true, \"D\":\"stringValue\"}}");
JsonNode savedSettings = doPost("/api/user/settings", userSettings, JsonNode.class); JsonNode savedSettings = doPost("/api/user/settings", userSettings, JsonNode.class);
Assert.assertEquals(userSettings, savedSettings); Assert.assertEquals(userSettings, savedSettings);
JsonNode newSettings = mapper.readTree("{\"A\":10}"); JsonNode newSettings = JacksonUtil.toJsonNode("{\"A\":10}");
doPut("/api/user/settings", newSettings); doPut("/api/user/settings", newSettings);
JsonNode updatedSettings = doGet("/api/user/settings", JsonNode.class); JsonNode updatedSettings = doGet("/api/user/settings", JsonNode.class);
JsonNode expectedSettings = mapper.readTree("{\"A\":10, \"B\":{\"C\":true, \"D\":\"stringValue\"}}"); JsonNode expectedSettings = JacksonUtil.toJsonNode("{\"A\":10, \"B\":{\"C\":true, \"D\":\"stringValue\"}}");
Assert.assertEquals(expectedSettings, updatedSettings); Assert.assertEquals(expectedSettings, updatedSettings);
JsonNode patchedSettings = mapper.readTree("{\"A\":11, \"B\":{\"C\":false, \"D\":\"stringValue2\"}}"); JsonNode patchedSettings = JacksonUtil.toJsonNode("{\"A\":11, \"B\":{\"C\":false, \"D\":\"stringValue2\"}}");
doPut("/api/user/settings", patchedSettings); doPut("/api/user/settings", patchedSettings);
updatedSettings = doGet("/api/user/settings", JsonNode.class); updatedSettings = doGet("/api/user/settings", JsonNode.class);
expectedSettings = mapper.readTree("{\"A\":11, \"B\":{\"C\":false, \"D\":\"stringValue2\"}}"); expectedSettings = JacksonUtil.toJsonNode("{\"A\":11, \"B\":{\"C\":false, \"D\":\"stringValue2\"}}");
Assert.assertEquals(expectedSettings, updatedSettings); Assert.assertEquals(expectedSettings, updatedSettings);
patchedSettings = mapper.readTree("{\"B.D\": \"stringValue3\"}"); patchedSettings = JacksonUtil.toJsonNode("{\"B.D\": \"stringValue3\"}");
doPut("/api/user/settings", patchedSettings); doPut("/api/user/settings", patchedSettings);
updatedSettings = doGet("/api/user/settings", JsonNode.class); updatedSettings = doGet("/api/user/settings", JsonNode.class);
expectedSettings = mapper.readTree("{\"A\":11, \"B\":{\"C\":false, \"D\": \"stringValue3\"}}"); expectedSettings = JacksonUtil.toJsonNode("{\"A\":11, \"B\":{\"C\":false, \"D\": \"stringValue3\"}}");
Assert.assertEquals(expectedSettings, updatedSettings); Assert.assertEquals(expectedSettings, updatedSettings);
patchedSettings = mapper.readTree("{\"B.D\": {\"E\": 76, \"F\": 92}}"); patchedSettings = JacksonUtil.toJsonNode("{\"B.D\": {\"E\": 76, \"F\": 92}}");
doPut("/api/user/settings", patchedSettings); doPut("/api/user/settings", patchedSettings);
updatedSettings = doGet("/api/user/settings", JsonNode.class); updatedSettings = doGet("/api/user/settings", JsonNode.class);
expectedSettings = mapper.readTree("{\"A\":11, \"B\":{\"C\":false, \"D\": {\"E\":76, \"F\": 92}}}"); expectedSettings = JacksonUtil.toJsonNode("{\"A\":11, \"B\":{\"C\":false, \"D\": {\"E\":76, \"F\": 92}}}");
Assert.assertEquals(expectedSettings, updatedSettings); Assert.assertEquals(expectedSettings, updatedSettings);
patchedSettings = mapper.readTree("{\"B.D.E\": 100}"); patchedSettings = JacksonUtil.toJsonNode("{\"B.D.E\": 100}");
doPut("/api/user/settings", patchedSettings); doPut("/api/user/settings", patchedSettings);
updatedSettings = doGet("/api/user/settings", JsonNode.class); updatedSettings = doGet("/api/user/settings", JsonNode.class);
expectedSettings = mapper.readTree("{\"A\":11, \"B\":{\"C\":false, \"D\": {\"E\":100, \"F\": 92}}}"); expectedSettings = JacksonUtil.toJsonNode("{\"A\":11, \"B\":{\"C\":false, \"D\": {\"E\":100, \"F\": 92}}}");
Assert.assertEquals(expectedSettings, updatedSettings); Assert.assertEquals(expectedSettings, updatedSettings);
} }
@ -832,38 +832,38 @@ public abstract class BaseUserControllerTest extends AbstractControllerTest {
public void testShouldCreatePathIfNotExists() throws Exception { public void testShouldCreatePathIfNotExists() throws Exception {
loginCustomerUser(); loginCustomerUser();
JsonNode userSettings = mapper.readTree("{\"A\":5}"); JsonNode userSettings = JacksonUtil.toJsonNode("{\"A\":5}");
JsonNode savedSettings = doPost("/api/user/settings", userSettings, JsonNode.class); JsonNode savedSettings = doPost("/api/user/settings", userSettings, JsonNode.class);
Assert.assertEquals(userSettings, savedSettings); Assert.assertEquals(userSettings, savedSettings);
JsonNode newSettings = mapper.readTree("{\"B\":{\"C\": 10}}"); JsonNode newSettings = JacksonUtil.toJsonNode("{\"B\":{\"C\": 10}}");
doPut("/api/user/settings", newSettings); doPut("/api/user/settings", newSettings);
JsonNode updatedSettings = doGet("/api/user/settings", JsonNode.class); JsonNode updatedSettings = doGet("/api/user/settings", JsonNode.class);
JsonNode expectedSettings = mapper.readTree("{\"A\":5, \"B\":{\"C\": 10}}"); JsonNode expectedSettings = JacksonUtil.toJsonNode("{\"A\":5, \"B\":{\"C\": 10}}");
Assert.assertEquals(expectedSettings, updatedSettings); Assert.assertEquals(expectedSettings, updatedSettings);
newSettings = mapper.readTree("{\"B.K\":true}"); newSettings = JacksonUtil.toJsonNode("{\"B.K\":true}");
doPut("/api/user/settings", newSettings); doPut("/api/user/settings", newSettings);
updatedSettings = doGet("/api/user/settings", JsonNode.class); updatedSettings = doGet("/api/user/settings", JsonNode.class);
expectedSettings = mapper.readTree("{\"A\":5, \"B\":{\"C\": 10, \"K\": true}}"); expectedSettings = JacksonUtil.toJsonNode("{\"A\":5, \"B\":{\"C\": 10, \"K\": true}}");
Assert.assertEquals(expectedSettings, updatedSettings); Assert.assertEquals(expectedSettings, updatedSettings);
newSettings = mapper.readTree("{\"B\":{}}"); newSettings = JacksonUtil.toJsonNode("{\"B\":{}}");
doPut("/api/user/settings", newSettings); doPut("/api/user/settings", newSettings);
updatedSettings = doGet("/api/user/settings", JsonNode.class); updatedSettings = doGet("/api/user/settings", JsonNode.class);
expectedSettings = mapper.readTree("{\"A\":5, \"B\":{}}"); expectedSettings = JacksonUtil.toJsonNode("{\"A\":5, \"B\":{}}");
Assert.assertEquals(expectedSettings, updatedSettings); Assert.assertEquals(expectedSettings, updatedSettings);
newSettings = mapper.readTree("{\"F.G\":\"string\"}"); newSettings = JacksonUtil.toJsonNode("{\"F.G\":\"string\"}");
doPut("/api/user/settings", newSettings); doPut("/api/user/settings", newSettings);
updatedSettings = doGet("/api/user/settings", JsonNode.class); updatedSettings = doGet("/api/user/settings", JsonNode.class);
expectedSettings = mapper.readTree("{\"A\":5, \"B\":{}, \"F\":{\"G\": \"string\"}}"); expectedSettings = JacksonUtil.toJsonNode("{\"A\":5, \"B\":{}, \"F\":{\"G\": \"string\"}}");
Assert.assertEquals(expectedSettings, updatedSettings); Assert.assertEquals(expectedSettings, updatedSettings);
newSettings = mapper.readTree("{\"F\":{\"G\":\"string2\"}}"); newSettings = JacksonUtil.toJsonNode("{\"F\":{\"G\":\"string2\"}}");
doPut("/api/user/settings", newSettings); doPut("/api/user/settings", newSettings);
updatedSettings = doGet("/api/user/settings", JsonNode.class); updatedSettings = doGet("/api/user/settings", JsonNode.class);
expectedSettings = mapper.readTree("{\"A\":5, \"B\":{}, \"F\":{\"G\": \"string2\"}}"); expectedSettings = JacksonUtil.toJsonNode("{\"A\":5, \"B\":{}, \"F\":{\"G\": \"string2\"}}");
Assert.assertEquals(expectedSettings, updatedSettings); Assert.assertEquals(expectedSettings, updatedSettings);
} }
@ -871,14 +871,14 @@ public abstract class BaseUserControllerTest extends AbstractControllerTest {
public void testDeleteUserSettings() throws Exception { public void testDeleteUserSettings() throws Exception {
loginCustomerUser(); loginCustomerUser();
JsonNode userSettings = mapper.readTree("{\"A\":10, \"B\":10, \"C\":{\"D\": 16}}"); JsonNode userSettings = JacksonUtil.toJsonNode("{\"A\":10, \"B\":10, \"C\":{\"D\": 16}}");
JsonNode savedSettings = doPost("/api/user/settings", userSettings, JsonNode.class); JsonNode savedSettings = doPost("/api/user/settings", userSettings, JsonNode.class);
Assert.assertEquals(userSettings, savedSettings); Assert.assertEquals(userSettings, savedSettings);
doDelete("/api/user/settings/C.D,B"); doDelete("/api/user/settings/C.D,B");
JsonNode retrievedSettings = doGet("/api/user/settings", JsonNode.class); JsonNode retrievedSettings = doGet("/api/user/settings", JsonNode.class);
JsonNode expectedSettings = mapper.readTree("{\"A\":10, \"C\":{}}"); JsonNode expectedSettings = JacksonUtil.toJsonNode("{\"A\":10, \"C\":{}}");
Assert.assertEquals(expectedSettings, retrievedSettings); Assert.assertEquals(expectedSettings, retrievedSettings);
} }

16
application/src/test/java/org/thingsboard/server/controller/BaseWebsocketApiTest.java

@ -171,7 +171,7 @@ public abstract class BaseWebsocketApiTest extends AbstractControllerTest {
sendTelemetry(device, Arrays.asList(dataPoint4)); sendTelemetry(device, Arrays.asList(dataPoint4));
String msg = getWsClient().waitForUpdate(); String msg = getWsClient().waitForUpdate();
update = mapper.readValue(msg, EntityDataUpdate.class); update = JacksonUtil.fromString(msg, EntityDataUpdate.class);
Assert.assertEquals(1, update.getCmdId()); Assert.assertEquals(1, update.getCmdId());
List<EntityData> eData = update.getUpdate(); List<EntityData> eData = update.getUpdate();
Assert.assertNotNull(eData); Assert.assertNotNull(eData);
@ -458,7 +458,7 @@ public abstract class BaseWebsocketApiTest extends AbstractControllerTest {
String msg = getWsClient().waitForUpdate(); String msg = getWsClient().waitForUpdate();
Assert.assertNotNull(msg); Assert.assertNotNull(msg);
update = mapper.readValue(msg, EntityDataUpdate.class); update = JacksonUtil.fromString(msg, EntityDataUpdate.class);
Assert.assertEquals(1, update.getCmdId()); Assert.assertEquals(1, update.getCmdId());
List<EntityData> listData = update.getUpdate(); List<EntityData> listData = update.getUpdate();
@ -477,7 +477,7 @@ public abstract class BaseWebsocketApiTest extends AbstractControllerTest {
msg = getWsClient().waitForUpdate(); msg = getWsClient().waitForUpdate();
Assert.assertNotNull(msg); Assert.assertNotNull(msg);
update = mapper.readValue(msg, EntityDataUpdate.class); update = JacksonUtil.fromString(msg, EntityDataUpdate.class);
Assert.assertEquals(1, update.getCmdId()); Assert.assertEquals(1, update.getCmdId());
List<EntityData> eData = update.getUpdate(); List<EntityData> eData = update.getUpdate();
Assert.assertNotNull(eData); Assert.assertNotNull(eData);
@ -537,7 +537,7 @@ public abstract class BaseWebsocketApiTest extends AbstractControllerTest {
String msg = getWsClient().waitForUpdate(); String msg = getWsClient().waitForUpdate();
Assert.assertNotNull(msg); Assert.assertNotNull(msg);
update = mapper.readValue(msg, EntityDataUpdate.class); update = JacksonUtil.fromString(msg, EntityDataUpdate.class);
Assert.assertEquals(1, update.getCmdId()); Assert.assertEquals(1, update.getCmdId());
List<EntityData> eData = update.getUpdate(); List<EntityData> eData = update.getUpdate();
Assert.assertNotNull(eData); Assert.assertNotNull(eData);
@ -564,7 +564,7 @@ public abstract class BaseWebsocketApiTest extends AbstractControllerTest {
AttributeKvEntry dataPoint2 = new BaseAttributeKvEntry(now, new LongDataEntry("sharedAttributeKey", 42L)); AttributeKvEntry dataPoint2 = new BaseAttributeKvEntry(now, new LongDataEntry("sharedAttributeKey", 42L));
sendAttributes(device, TbAttributeSubscriptionScope.SHARED_SCOPE, Arrays.asList(dataPoint2)); sendAttributes(device, TbAttributeSubscriptionScope.SHARED_SCOPE, Arrays.asList(dataPoint2));
msg = getWsClient().waitForUpdate(TimeUnit.SECONDS.toMillis(1)); msg = getWsClient().waitForUpdate(TimeUnit.SECONDS.toMillis(1));
update = mapper.readValue(msg, EntityDataUpdate.class); update = JacksonUtil.fromString(msg, EntityDataUpdate.class);
Assert.assertEquals(1, update.getCmdId()); Assert.assertEquals(1, update.getCmdId());
eData = update.getUpdate(); eData = update.getUpdate();
Assert.assertNotNull(eData); Assert.assertNotNull(eData);
@ -578,7 +578,7 @@ public abstract class BaseWebsocketApiTest extends AbstractControllerTest {
AttributeKvEntry dataPoint3 = new BaseAttributeKvEntry(now, new LongDataEntry("clientAttributeKey", 42L)); AttributeKvEntry dataPoint3 = new BaseAttributeKvEntry(now, new LongDataEntry("clientAttributeKey", 42L));
sendAttributes(device, TbAttributeSubscriptionScope.CLIENT_SCOPE, Arrays.asList(dataPoint3)); sendAttributes(device, TbAttributeSubscriptionScope.CLIENT_SCOPE, Arrays.asList(dataPoint3));
msg = getWsClient().waitForUpdate(TimeUnit.SECONDS.toMillis(1)); msg = getWsClient().waitForUpdate(TimeUnit.SECONDS.toMillis(1));
update = mapper.readValue(msg, EntityDataUpdate.class); update = JacksonUtil.fromString(msg, EntityDataUpdate.class);
Assert.assertEquals(1, update.getCmdId()); Assert.assertEquals(1, update.getCmdId());
eData = update.getUpdate(); eData = update.getUpdate();
Assert.assertNotNull(eData); Assert.assertNotNull(eData);
@ -592,7 +592,7 @@ public abstract class BaseWebsocketApiTest extends AbstractControllerTest {
AttributeKvEntry dataPoint4 = new BaseAttributeKvEntry(now, new LongDataEntry("anyAttributeKey", 42L)); AttributeKvEntry dataPoint4 = new BaseAttributeKvEntry(now, new LongDataEntry("anyAttributeKey", 42L));
sendAttributes(device, TbAttributeSubscriptionScope.CLIENT_SCOPE, Arrays.asList(dataPoint4)); sendAttributes(device, TbAttributeSubscriptionScope.CLIENT_SCOPE, Arrays.asList(dataPoint4));
msg = getWsClient().waitForUpdate(TimeUnit.SECONDS.toMillis(1)); msg = getWsClient().waitForUpdate(TimeUnit.SECONDS.toMillis(1));
update = mapper.readValue(msg, EntityDataUpdate.class); update = JacksonUtil.fromString(msg, EntityDataUpdate.class);
Assert.assertEquals(1, update.getCmdId()); Assert.assertEquals(1, update.getCmdId());
eData = update.getUpdate(); eData = update.getUpdate();
Assert.assertNotNull(eData); Assert.assertNotNull(eData);
@ -606,7 +606,7 @@ public abstract class BaseWebsocketApiTest extends AbstractControllerTest {
AttributeKvEntry dataPoint5 = new BaseAttributeKvEntry(now, new LongDataEntry("anyAttributeKey", 43L)); AttributeKvEntry dataPoint5 = new BaseAttributeKvEntry(now, new LongDataEntry("anyAttributeKey", 43L));
sendAttributes(device, TbAttributeSubscriptionScope.SERVER_SCOPE, Arrays.asList(dataPoint5)); sendAttributes(device, TbAttributeSubscriptionScope.SERVER_SCOPE, Arrays.asList(dataPoint5));
msg = getWsClient().waitForUpdate(TimeUnit.SECONDS.toMillis(1)); msg = getWsClient().waitForUpdate(TimeUnit.SECONDS.toMillis(1));
update = mapper.readValue(msg, EntityDataUpdate.class); update = JacksonUtil.fromString(msg, EntityDataUpdate.class);
Assert.assertEquals(1, update.getCmdId()); Assert.assertEquals(1, update.getCmdId());
eData = update.getUpdate(); eData = update.getUpdate();
Assert.assertNotNull(eData); Assert.assertNotNull(eData);

26
application/src/test/java/org/thingsboard/server/controller/BaseWidgetTypeControllerTest.java

@ -17,11 +17,11 @@ package org.thingsboard.server.controller;
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.After; import org.junit.After;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.Tenant; import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.User; import org.thingsboard.server.common.data.User;
import org.thingsboard.server.common.data.security.Authority; import org.thingsboard.server.common.data.security.Authority;
@ -80,7 +80,7 @@ public abstract class BaseWidgetTypeControllerTest extends AbstractControllerTes
WidgetTypeDetails widgetType = new WidgetTypeDetails(); WidgetTypeDetails widgetType = new WidgetTypeDetails();
widgetType.setBundleAlias(savedWidgetsBundle.getAlias()); widgetType.setBundleAlias(savedWidgetsBundle.getAlias());
widgetType.setName("Widget Type"); widgetType.setName("Widget Type");
widgetType.setDescriptor(new ObjectMapper().readValue("{ \"someKey\": \"someValue\" }", JsonNode.class)); widgetType.setDescriptor(JacksonUtil.fromString("{ \"someKey\": \"someValue\" }", JsonNode.class));
WidgetTypeDetails savedWidgetType = doPost("/api/widgetType", widgetType, WidgetTypeDetails.class); WidgetTypeDetails savedWidgetType = doPost("/api/widgetType", widgetType, WidgetTypeDetails.class);
Assert.assertNotNull(savedWidgetType); Assert.assertNotNull(savedWidgetType);
@ -105,7 +105,7 @@ public abstract class BaseWidgetTypeControllerTest extends AbstractControllerTes
WidgetTypeDetails widgetType = new WidgetTypeDetails(); WidgetTypeDetails widgetType = new WidgetTypeDetails();
widgetType.setBundleAlias(savedWidgetsBundle.getAlias()); widgetType.setBundleAlias(savedWidgetsBundle.getAlias());
widgetType.setName("Widget Type"); widgetType.setName("Widget Type");
widgetType.setDescriptor(new ObjectMapper().readValue("{ \"someKey\": \"someValue\" }", JsonNode.class)); widgetType.setDescriptor(JacksonUtil.fromString("{ \"someKey\": \"someValue\" }", JsonNode.class));
WidgetTypeDetails savedWidgetType = doPost("/api/widgetType", widgetType, WidgetTypeDetails.class); WidgetTypeDetails savedWidgetType = doPost("/api/widgetType", widgetType, WidgetTypeDetails.class);
loginDifferentTenant(); loginDifferentTenant();
@ -118,7 +118,7 @@ public abstract class BaseWidgetTypeControllerTest extends AbstractControllerTes
WidgetTypeDetails widgetType = new WidgetTypeDetails(); WidgetTypeDetails widgetType = new WidgetTypeDetails();
widgetType.setBundleAlias(savedWidgetsBundle.getAlias()); widgetType.setBundleAlias(savedWidgetsBundle.getAlias());
widgetType.setName("Widget Type"); widgetType.setName("Widget Type");
widgetType.setDescriptor(new ObjectMapper().readValue("{ \"someKey\": \"someValue\" }", JsonNode.class)); widgetType.setDescriptor(JacksonUtil.fromString("{ \"someKey\": \"someValue\" }", JsonNode.class));
WidgetTypeDetails savedWidgetType = doPost("/api/widgetType", widgetType, WidgetTypeDetails.class); WidgetTypeDetails savedWidgetType = doPost("/api/widgetType", widgetType, WidgetTypeDetails.class);
WidgetTypeDetails foundWidgetType = doGet("/api/widgetType/" + savedWidgetType.getId().getId().toString(), WidgetTypeDetails.class); WidgetTypeDetails foundWidgetType = doGet("/api/widgetType/" + savedWidgetType.getId().getId().toString(), WidgetTypeDetails.class);
Assert.assertNotNull(foundWidgetType); Assert.assertNotNull(foundWidgetType);
@ -130,7 +130,7 @@ public abstract class BaseWidgetTypeControllerTest extends AbstractControllerTes
WidgetTypeDetails widgetType = new WidgetTypeDetails(); WidgetTypeDetails widgetType = new WidgetTypeDetails();
widgetType.setBundleAlias(savedWidgetsBundle.getAlias()); widgetType.setBundleAlias(savedWidgetsBundle.getAlias());
widgetType.setName("Widget Type"); widgetType.setName("Widget Type");
widgetType.setDescriptor(new ObjectMapper().readValue("{ \"someKey\": \"someValue\" }", JsonNode.class)); widgetType.setDescriptor(JacksonUtil.fromString("{ \"someKey\": \"someValue\" }", JsonNode.class));
WidgetTypeDetails savedWidgetType = doPost("/api/widgetType", widgetType, WidgetTypeDetails.class); WidgetTypeDetails savedWidgetType = doPost("/api/widgetType", widgetType, WidgetTypeDetails.class);
doDelete("/api/widgetType/"+savedWidgetType.getId().getId().toString()) doDelete("/api/widgetType/"+savedWidgetType.getId().getId().toString())
@ -144,7 +144,7 @@ public abstract class BaseWidgetTypeControllerTest extends AbstractControllerTes
public void testSaveWidgetTypeWithEmptyName() throws Exception { public void testSaveWidgetTypeWithEmptyName() throws Exception {
WidgetTypeDetails widgetType = new WidgetTypeDetails(); WidgetTypeDetails widgetType = new WidgetTypeDetails();
widgetType.setBundleAlias(savedWidgetsBundle.getAlias()); widgetType.setBundleAlias(savedWidgetsBundle.getAlias());
widgetType.setDescriptor(new ObjectMapper().readValue("{ \"someKey\": \"someValue\" }", JsonNode.class)); widgetType.setDescriptor(JacksonUtil.fromString("{ \"someKey\": \"someValue\" }", JsonNode.class));
doPost("/api/widgetType", widgetType) doPost("/api/widgetType", widgetType)
.andExpect(status().isBadRequest()) .andExpect(status().isBadRequest())
.andExpect(statusReason(containsString("Widgets type name should be specified"))); .andExpect(statusReason(containsString("Widgets type name should be specified")));
@ -154,7 +154,7 @@ public abstract class BaseWidgetTypeControllerTest extends AbstractControllerTes
public void testSaveWidgetTypeWithEmptyBundleAlias() throws Exception { public void testSaveWidgetTypeWithEmptyBundleAlias() throws Exception {
WidgetTypeDetails widgetType = new WidgetTypeDetails(); WidgetTypeDetails widgetType = new WidgetTypeDetails();
widgetType.setName("Widget Type"); widgetType.setName("Widget Type");
widgetType.setDescriptor(new ObjectMapper().readValue("{ \"someKey\": \"someValue\" }", JsonNode.class)); widgetType.setDescriptor(JacksonUtil.fromString("{ \"someKey\": \"someValue\" }", JsonNode.class));
doPost("/api/widgetType", widgetType) doPost("/api/widgetType", widgetType)
.andExpect(status().isBadRequest()) .andExpect(status().isBadRequest())
.andExpect(statusReason(containsString("Widgets type bundle alias should be specified"))); .andExpect(statusReason(containsString("Widgets type bundle alias should be specified")));
@ -165,7 +165,7 @@ public abstract class BaseWidgetTypeControllerTest extends AbstractControllerTes
WidgetTypeDetails widgetType = new WidgetTypeDetails(); WidgetTypeDetails widgetType = new WidgetTypeDetails();
widgetType.setBundleAlias(savedWidgetsBundle.getAlias()); widgetType.setBundleAlias(savedWidgetsBundle.getAlias());
widgetType.setName("Widget Type"); widgetType.setName("Widget Type");
widgetType.setDescriptor(new ObjectMapper().readValue("{}", JsonNode.class)); widgetType.setDescriptor(JacksonUtil.fromString("{}", JsonNode.class));
doPost("/api/widgetType", widgetType) doPost("/api/widgetType", widgetType)
.andExpect(status().isBadRequest()) .andExpect(status().isBadRequest())
.andExpect(statusReason(containsString("Widgets type descriptor can't be empty"))); .andExpect(statusReason(containsString("Widgets type descriptor can't be empty")));
@ -176,7 +176,7 @@ public abstract class BaseWidgetTypeControllerTest extends AbstractControllerTes
WidgetTypeDetails widgetType = new WidgetTypeDetails(); WidgetTypeDetails widgetType = new WidgetTypeDetails();
widgetType.setBundleAlias("some_alias"); widgetType.setBundleAlias("some_alias");
widgetType.setName("Widget Type"); widgetType.setName("Widget Type");
widgetType.setDescriptor(new ObjectMapper().readValue("{ \"someKey\": \"someValue\" }", JsonNode.class)); widgetType.setDescriptor(JacksonUtil.fromString("{ \"someKey\": \"someValue\" }", JsonNode.class));
doPost("/api/widgetType", widgetType) doPost("/api/widgetType", widgetType)
.andExpect(status().isBadRequest()) .andExpect(status().isBadRequest())
.andExpect(statusReason(containsString("Widget type is referencing to non-existent widgets bundle"))); .andExpect(statusReason(containsString("Widget type is referencing to non-existent widgets bundle")));
@ -187,7 +187,7 @@ public abstract class BaseWidgetTypeControllerTest extends AbstractControllerTes
WidgetTypeDetails widgetType = new WidgetTypeDetails(); WidgetTypeDetails widgetType = new WidgetTypeDetails();
widgetType.setBundleAlias(savedWidgetsBundle.getAlias()); widgetType.setBundleAlias(savedWidgetsBundle.getAlias());
widgetType.setName("Widget Type"); widgetType.setName("Widget Type");
widgetType.setDescriptor(new ObjectMapper().readValue("{ \"someKey\": \"someValue\" }", JsonNode.class)); widgetType.setDescriptor(JacksonUtil.fromString("{ \"someKey\": \"someValue\" }", JsonNode.class));
WidgetTypeDetails savedWidgetType = doPost("/api/widgetType", widgetType, WidgetTypeDetails.class); WidgetTypeDetails savedWidgetType = doPost("/api/widgetType", widgetType, WidgetTypeDetails.class);
savedWidgetType.setBundleAlias("some_alias"); savedWidgetType.setBundleAlias("some_alias");
doPost("/api/widgetType", savedWidgetType) doPost("/api/widgetType", savedWidgetType)
@ -201,7 +201,7 @@ public abstract class BaseWidgetTypeControllerTest extends AbstractControllerTes
WidgetTypeDetails widgetType = new WidgetTypeDetails(); WidgetTypeDetails widgetType = new WidgetTypeDetails();
widgetType.setBundleAlias(savedWidgetsBundle.getAlias()); widgetType.setBundleAlias(savedWidgetsBundle.getAlias());
widgetType.setName("Widget Type"); widgetType.setName("Widget Type");
widgetType.setDescriptor(new ObjectMapper().readValue("{ \"someKey\": \"someValue\" }", JsonNode.class)); widgetType.setDescriptor(JacksonUtil.fromString("{ \"someKey\": \"someValue\" }", JsonNode.class));
WidgetTypeDetails savedWidgetType = doPost("/api/widgetType", widgetType, WidgetTypeDetails.class); WidgetTypeDetails savedWidgetType = doPost("/api/widgetType", widgetType, WidgetTypeDetails.class);
savedWidgetType.setAlias("some_alias"); savedWidgetType.setAlias("some_alias");
doPost("/api/widgetType", savedWidgetType) doPost("/api/widgetType", savedWidgetType)
@ -217,7 +217,7 @@ public abstract class BaseWidgetTypeControllerTest extends AbstractControllerTes
WidgetTypeDetails widgetType = new WidgetTypeDetails(); WidgetTypeDetails widgetType = new WidgetTypeDetails();
widgetType.setBundleAlias(savedWidgetsBundle.getAlias()); widgetType.setBundleAlias(savedWidgetsBundle.getAlias());
widgetType.setName("Widget Type " + i); widgetType.setName("Widget Type " + i);
widgetType.setDescriptor(new ObjectMapper().readValue("{ \"someKey\": \"someValue\" }", JsonNode.class)); widgetType.setDescriptor(JacksonUtil.fromString("{ \"someKey\": \"someValue\" }", JsonNode.class));
widgetTypes.add(new WidgetType(doPost("/api/widgetType", widgetType, WidgetTypeDetails.class))); widgetTypes.add(new WidgetType(doPost("/api/widgetType", widgetType, WidgetTypeDetails.class)));
} }
@ -235,7 +235,7 @@ public abstract class BaseWidgetTypeControllerTest extends AbstractControllerTes
WidgetTypeDetails widgetType = new WidgetTypeDetails(); WidgetTypeDetails widgetType = new WidgetTypeDetails();
widgetType.setBundleAlias(savedWidgetsBundle.getAlias()); widgetType.setBundleAlias(savedWidgetsBundle.getAlias());
widgetType.setName("Widget Type"); widgetType.setName("Widget Type");
widgetType.setDescriptor(new ObjectMapper().readValue("{ \"someKey\": \"someValue\" }", JsonNode.class)); widgetType.setDescriptor(JacksonUtil.fromString("{ \"someKey\": \"someValue\" }", JsonNode.class));
WidgetTypeDetails savedWidgetType = doPost("/api/widgetType", widgetType, WidgetTypeDetails.class); WidgetTypeDetails savedWidgetType = doPost("/api/widgetType", widgetType, WidgetTypeDetails.class);
WidgetType foundWidgetType = doGet("/api/widgetType?isSystem={isSystem}&bundleAlias={bundleAlias}&alias={alias}", WidgetType foundWidgetType = doGet("/api/widgetType?isSystem={isSystem}&bundleAlias={bundleAlias}&alias={alias}",
WidgetType.class, false, savedWidgetsBundle.getAlias(), savedWidgetType.getAlias()); WidgetType.class, false, savedWidgetsBundle.getAlias(), savedWidgetType.getAlias());

4
application/src/test/java/org/thingsboard/server/edge/AbstractEdgeTest.java

@ -394,7 +394,7 @@ abstract public class AbstractEdgeTest extends AbstractControllerTest {
} }
private void validateMailAdminSettings(AdminSettingsUpdateMsg adminSettingsUpdateMsg) throws JsonProcessingException { private void validateMailAdminSettings(AdminSettingsUpdateMsg adminSettingsUpdateMsg) throws JsonProcessingException {
JsonNode jsonNode = mapper.readTree(adminSettingsUpdateMsg.getJsonValue()); JsonNode jsonNode = JacksonUtil.toJsonNode(adminSettingsUpdateMsg.getJsonValue());
Assert.assertNotNull(jsonNode.get("mailFrom")); Assert.assertNotNull(jsonNode.get("mailFrom"));
Assert.assertNotNull(jsonNode.get("smtpProtocol")); Assert.assertNotNull(jsonNode.get("smtpProtocol"));
Assert.assertNotNull(jsonNode.get("smtpHost")); Assert.assertNotNull(jsonNode.get("smtpHost"));
@ -403,7 +403,7 @@ abstract public class AbstractEdgeTest extends AbstractControllerTest {
} }
private void validateMailTemplatesAdminSettings(AdminSettingsUpdateMsg adminSettingsUpdateMsg) throws JsonProcessingException { private void validateMailTemplatesAdminSettings(AdminSettingsUpdateMsg adminSettingsUpdateMsg) throws JsonProcessingException {
JsonNode jsonNode = mapper.readTree(adminSettingsUpdateMsg.getJsonValue()); JsonNode jsonNode = JacksonUtil.toJsonNode(adminSettingsUpdateMsg.getJsonValue());
Assert.assertNotNull(jsonNode.get("accountActivated")); Assert.assertNotNull(jsonNode.get("accountActivated"));
Assert.assertNotNull(jsonNode.get("accountLockout")); Assert.assertNotNull(jsonNode.get("accountLockout"));
Assert.assertNotNull(jsonNode.get("activation")); Assert.assertNotNull(jsonNode.get("activation"));

6
application/src/test/java/org/thingsboard/server/edge/BaseDeviceEdgeTest.java

@ -562,7 +562,7 @@ abstract public class BaseDeviceEdgeTest extends AbstractEdgeTest {
public void testRpcCall() throws Exception { public void testRpcCall() throws Exception {
Device device = findDeviceByName("Edge Device 1"); Device device = findDeviceByName("Edge Device 1");
ObjectNode body = mapper.createObjectNode(); ObjectNode body = JacksonUtil.newObjectNode();
body.put("requestId", new Random().nextInt()); body.put("requestId", new Random().nextInt());
body.put("requestUUID", Uuids.timeBased().toString()); body.put("requestUUID", Uuids.timeBased().toString());
body.put("oneway", false); body.put("oneway", false);
@ -589,7 +589,7 @@ abstract public class BaseDeviceEdgeTest extends AbstractEdgeTest {
private void sendAttributesRequestAndVerify(Device device, String scope, String attributesDataStr, String expectedKey, private void sendAttributesRequestAndVerify(Device device, String scope, String attributesDataStr, String expectedKey,
String expectedValue) throws Exception { String expectedValue) throws Exception {
JsonNode attributesData = mapper.readTree(attributesDataStr); JsonNode attributesData = JacksonUtil.toJsonNode(attributesDataStr);
doPost("/api/plugins/telemetry/DEVICE/" + device.getUuidId() + "/attributes/" + scope, doPost("/api/plugins/telemetry/DEVICE/" + device.getUuidId() + "/attributes/" + scope,
attributesData); attributesData);
@ -703,7 +703,7 @@ abstract public class BaseDeviceEdgeTest extends AbstractEdgeTest {
public void testVerifyDeliveryOfLatestTimeseriesOnAttributesRequest() throws Exception { public void testVerifyDeliveryOfLatestTimeseriesOnAttributesRequest() throws Exception {
Device device = findDeviceByName("Edge Device 1"); Device device = findDeviceByName("Edge Device 1");
JsonNode timeseriesData = mapper.readTree("{\"temperature\":25, \"isEnabled\": true}"); JsonNode timeseriesData = JacksonUtil.toJsonNode("{\"temperature\":25, \"isEnabled\": true}");
doPost("/api/plugins/telemetry/DEVICE/" + device.getUuidId() + "/timeseries/" + DataConstants.SERVER_SCOPE, doPost("/api/plugins/telemetry/DEVICE/" + device.getUuidId() + "/timeseries/" + DataConstants.SERVER_SCOPE,
timeseriesData); timeseriesData);

7
application/src/test/java/org/thingsboard/server/edge/BaseRuleChainEdgeTest.java

@ -18,6 +18,7 @@ package org.thingsboard.server.edge;
import com.google.protobuf.AbstractMessage; import com.google.protobuf.AbstractMessage;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.edge.Edge; import org.thingsboard.server.common.data.edge.Edge;
import org.thingsboard.server.common.data.id.RuleChainId; import org.thingsboard.server.common.data.id.RuleChainId;
import org.thingsboard.server.common.data.rule.RuleChain; import org.thingsboard.server.common.data.rule.RuleChain;
@ -140,17 +141,17 @@ abstract public class BaseRuleChainEdgeTest extends AbstractEdgeTest {
RuleNode ruleNode1 = new RuleNode(); RuleNode ruleNode1 = new RuleNode();
ruleNode1.setName("name1"); ruleNode1.setName("name1");
ruleNode1.setType("type1"); ruleNode1.setType("type1");
ruleNode1.setConfiguration(mapper.readTree("\"key1\": \"val1\"")); ruleNode1.setConfiguration(JacksonUtil.toJsonNode("\"key1\": \"val1\""));
RuleNode ruleNode2 = new RuleNode(); RuleNode ruleNode2 = new RuleNode();
ruleNode2.setName("name2"); ruleNode2.setName("name2");
ruleNode2.setType("type2"); ruleNode2.setType("type2");
ruleNode2.setConfiguration(mapper.readTree("\"key2\": \"val2\"")); ruleNode2.setConfiguration(JacksonUtil.toJsonNode("\"key2\": \"val2\""));
RuleNode ruleNode3 = new RuleNode(); RuleNode ruleNode3 = new RuleNode();
ruleNode3.setName("name3"); ruleNode3.setName("name3");
ruleNode3.setType("type3"); ruleNode3.setType("type3");
ruleNode3.setConfiguration(mapper.readTree("\"key3\": \"val3\"")); ruleNode3.setConfiguration(JacksonUtil.toJsonNode("\"key3\": \"val3\""));
List<RuleNode> ruleNodes = new ArrayList<>(); List<RuleNode> ruleNodes = new ArrayList<>();
ruleNodes.add(ruleNode1); ruleNodes.add(ruleNode1);

12
application/src/test/java/org/thingsboard/server/edge/BaseTelemetryEdgeTest.java

@ -53,7 +53,7 @@ abstract public class BaseTelemetryEdgeTest extends AbstractEdgeTest {
edgeImitator.expectMessageAmount(numberOfTimeseriesToSend); edgeImitator.expectMessageAmount(numberOfTimeseriesToSend);
for (int idx = 1; idx <= numberOfTimeseriesToSend; idx++) { for (int idx = 1; idx <= numberOfTimeseriesToSend; idx++) {
String timeseriesData = "{\"data\":{\"idx\":" + idx + "},\"ts\":" + System.currentTimeMillis() + "}"; String timeseriesData = "{\"data\":{\"idx\":" + idx + "},\"ts\":" + System.currentTimeMillis() + "}";
JsonNode timeseriesEntityData = mapper.readTree(timeseriesData); JsonNode timeseriesEntityData = JacksonUtil.toJsonNode(timeseriesData);
EdgeEvent edgeEvent = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.TIMESERIES_UPDATED, EdgeEvent edgeEvent = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.TIMESERIES_UPDATED,
device.getId().getId(), EdgeEventType.DEVICE, timeseriesEntityData); device.getId().getId(), EdgeEventType.DEVICE, timeseriesEntityData);
edgeEventService.saveAsync(edgeEvent).get(); edgeEventService.saveAsync(edgeEvent).get();
@ -83,7 +83,7 @@ abstract public class BaseTelemetryEdgeTest extends AbstractEdgeTest {
private void testPostAttributesMsg(Device device) throws Exception { private void testPostAttributesMsg(Device device) throws Exception {
String postAttributesData = "{\"scope\":\"SERVER_SCOPE\",\"kv\":{\"key2\":\"value2\"}}"; String postAttributesData = "{\"scope\":\"SERVER_SCOPE\",\"kv\":{\"key2\":\"value2\"}}";
JsonNode postAttributesEntityData = mapper.readTree(postAttributesData); JsonNode postAttributesEntityData = JacksonUtil.toJsonNode(postAttributesData);
EdgeEvent edgeEvent = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.POST_ATTRIBUTES, device.getId().getId(), EdgeEventType.DEVICE, postAttributesEntityData); EdgeEvent edgeEvent = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.POST_ATTRIBUTES, device.getId().getId(), EdgeEventType.DEVICE, postAttributesEntityData);
edgeImitator.expectMessageAmount(1); edgeImitator.expectMessageAmount(1);
edgeEventService.saveAsync(edgeEvent).get(); edgeEventService.saveAsync(edgeEvent).get();
@ -108,7 +108,7 @@ abstract public class BaseTelemetryEdgeTest extends AbstractEdgeTest {
private void testAttributesDeleteMsg(Device device) throws Exception { private void testAttributesDeleteMsg(Device device) throws Exception {
String deleteAttributesData = "{\"scope\":\"SERVER_SCOPE\",\"keys\":[\"key1\",\"key2\"]}"; String deleteAttributesData = "{\"scope\":\"SERVER_SCOPE\",\"keys\":[\"key1\",\"key2\"]}";
JsonNode deleteAttributesEntityData = mapper.readTree(deleteAttributesData); JsonNode deleteAttributesEntityData = JacksonUtil.toJsonNode(deleteAttributesData);
EdgeEvent edgeEvent = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.ATTRIBUTES_DELETED, device.getId().getId(), EdgeEventType.DEVICE, deleteAttributesEntityData); EdgeEvent edgeEvent = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.ATTRIBUTES_DELETED, device.getId().getId(), EdgeEventType.DEVICE, deleteAttributesEntityData);
edgeImitator.expectMessageAmount(1); edgeImitator.expectMessageAmount(1);
edgeEventService.saveAsync(edgeEvent).get(); edgeEventService.saveAsync(edgeEvent).get();
@ -136,7 +136,7 @@ abstract public class BaseTelemetryEdgeTest extends AbstractEdgeTest {
public void testTimeseries() throws Exception { public void testTimeseries() throws Exception {
Device device = findDeviceByName("Edge Device 1"); Device device = findDeviceByName("Edge Device 1");
String timeseriesData = "{\"data\":{\"temperature\":25},\"ts\":" + System.currentTimeMillis() + "}"; String timeseriesData = "{\"data\":{\"temperature\":25},\"ts\":" + System.currentTimeMillis() + "}";
JsonNode timeseriesEntityData = mapper.readTree(timeseriesData); JsonNode timeseriesEntityData = JacksonUtil.toJsonNode(timeseriesData);
edgeImitator.expectMessageAmount(1); edgeImitator.expectMessageAmount(1);
EdgeEvent edgeEvent = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.TIMESERIES_UPDATED, device.getId().getId(), EdgeEventType.DEVICE, timeseriesEntityData); EdgeEvent edgeEvent = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.TIMESERIES_UPDATED, device.getId().getId(), EdgeEventType.DEVICE, timeseriesEntityData);
edgeEventService.saveAsync(edgeEvent).get(); edgeEventService.saveAsync(edgeEvent).get();
@ -188,7 +188,7 @@ abstract public class BaseTelemetryEdgeTest extends AbstractEdgeTest {
edgeImitator.expectMessageAmount(numberOfMsgsToSend); edgeImitator.expectMessageAmount(numberOfMsgsToSend);
for (int idx = 1; idx <= numberOfMsgsToSend; idx++) { for (int idx = 1; idx <= numberOfMsgsToSend; idx++) {
String timeseriesData = "{\"data\":{\"idx\":" + idx + "},\"ts\":" + System.currentTimeMillis() + "}"; String timeseriesData = "{\"data\":{\"idx\":" + idx + "},\"ts\":" + System.currentTimeMillis() + "}";
JsonNode timeseriesEntityData = mapper.readTree(timeseriesData); JsonNode timeseriesEntityData = JacksonUtil.toJsonNode(timeseriesData);
EdgeEvent failedEdgeEvent = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.TIMESERIES_UPDATED, EdgeEvent failedEdgeEvent = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.TIMESERIES_UPDATED,
device.getId().getId(), EdgeEventType.DEVICE, timeseriesEntityData); device.getId().getId(), EdgeEventType.DEVICE, timeseriesEntityData);
edgeEventService.saveAsync(failedEdgeEvent).get(); edgeEventService.saveAsync(failedEdgeEvent).get();
@ -218,7 +218,7 @@ abstract public class BaseTelemetryEdgeTest extends AbstractEdgeTest {
private void testAttributesUpdatedMsg(EntityId entityId) throws Exception { private void testAttributesUpdatedMsg(EntityId entityId) throws Exception {
String attributesData = "{\"scope\":\"SERVER_SCOPE\",\"kv\":{\"key1\":\"value1\"}}"; String attributesData = "{\"scope\":\"SERVER_SCOPE\",\"kv\":{\"key1\":\"value1\"}}";
JsonNode attributesEntityData = mapper.readTree(attributesData); JsonNode attributesEntityData = JacksonUtil.toJsonNode(attributesData);
EdgeEvent edgeEvent1 = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.ATTRIBUTES_UPDATED, entityId.getId(), EdgeEventType.valueOf(entityId.getEntityType().name()), attributesEntityData); EdgeEvent edgeEvent1 = constructEdgeEvent(tenantId, edge.getId(), EdgeEventActionType.ATTRIBUTES_UPDATED, entityId.getId(), EdgeEventType.valueOf(entityId.getEntityType().name()), attributesEntityData);
edgeImitator.expectMessageAmount(1); edgeImitator.expectMessageAmount(1);
edgeEventService.saveAsync(edgeEvent1).get(); edgeEventService.saveAsync(edgeEvent1).get();

2
application/src/test/java/org/thingsboard/server/edge/BaseWidgetEdgeTest.java

@ -53,7 +53,7 @@ abstract public class BaseWidgetEdgeTest extends AbstractEdgeTest {
WidgetType widgetType = new WidgetType(); WidgetType widgetType = new WidgetType();
widgetType.setName("Test Widget Type"); widgetType.setName("Test Widget Type");
widgetType.setBundleAlias(savedWidgetsBundle.getAlias()); widgetType.setBundleAlias(savedWidgetsBundle.getAlias());
ObjectNode descriptor = mapper.createObjectNode(); ObjectNode descriptor = JacksonUtil.newObjectNode();
descriptor.put("key", "value"); descriptor.put("key", "value");
widgetType.setDescriptor(descriptor); widgetType.setDescriptor(descriptor);
WidgetType savedWidgetType = doPost("/api/widgetType", widgetType, WidgetType.class); WidgetType savedWidgetType = doPost("/api/widgetType", widgetType, WidgetType.class);

11
application/src/test/java/org/thingsboard/server/rules/flow/AbstractRuleEngineFlowIntegrationTest.java

@ -25,6 +25,7 @@ import org.mockito.Mockito;
import org.mockito.stubbing.Answer; import org.mockito.stubbing.Answer;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.util.ReflectionTestUtils; import org.springframework.test.util.ReflectionTestUtils;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.rule.engine.flow.TbRuleChainInputNodeConfiguration; import org.thingsboard.rule.engine.flow.TbRuleChainInputNodeConfiguration;
import org.thingsboard.rule.engine.metadata.TbGetAttributesNodeConfiguration; import org.thingsboard.rule.engine.metadata.TbGetAttributesNodeConfiguration;
import org.thingsboard.server.actors.ActorSystemContext; import org.thingsboard.server.actors.ActorSystemContext;
@ -139,7 +140,7 @@ public abstract class AbstractRuleEngineFlowIntegrationTest extends AbstractRule
ruleNode1.setDebugMode(true); ruleNode1.setDebugMode(true);
TbGetAttributesNodeConfiguration configuration1 = new TbGetAttributesNodeConfiguration(); TbGetAttributesNodeConfiguration configuration1 = new TbGetAttributesNodeConfiguration();
configuration1.setServerAttributeNames(Collections.singletonList("serverAttributeKey1")); configuration1.setServerAttributeNames(Collections.singletonList("serverAttributeKey1"));
ruleNode1.setConfiguration(mapper.valueToTree(configuration1)); ruleNode1.setConfiguration(JacksonUtil.valueToTree(configuration1));
RuleNode ruleNode2 = new RuleNode(); RuleNode ruleNode2 = new RuleNode();
ruleNode2.setName("Simple Rule Node 2"); ruleNode2.setName("Simple Rule Node 2");
@ -147,7 +148,7 @@ public abstract class AbstractRuleEngineFlowIntegrationTest extends AbstractRule
ruleNode2.setDebugMode(true); ruleNode2.setDebugMode(true);
TbGetAttributesNodeConfiguration configuration2 = new TbGetAttributesNodeConfiguration(); TbGetAttributesNodeConfiguration configuration2 = new TbGetAttributesNodeConfiguration();
configuration2.setServerAttributeNames(Collections.singletonList("serverAttributeKey2")); configuration2.setServerAttributeNames(Collections.singletonList("serverAttributeKey2"));
ruleNode2.setConfiguration(mapper.valueToTree(configuration2)); ruleNode2.setConfiguration(JacksonUtil.valueToTree(configuration2));
metaData.setNodes(Arrays.asList(ruleNode1, ruleNode2)); metaData.setNodes(Arrays.asList(ruleNode1, ruleNode2));
@ -241,7 +242,7 @@ public abstract class AbstractRuleEngineFlowIntegrationTest extends AbstractRule
ruleNode1.setDebugMode(true); ruleNode1.setDebugMode(true);
TbGetAttributesNodeConfiguration configuration1 = new TbGetAttributesNodeConfiguration(); TbGetAttributesNodeConfiguration configuration1 = new TbGetAttributesNodeConfiguration();
configuration1.setServerAttributeNames(Collections.singletonList("serverAttributeKey1")); configuration1.setServerAttributeNames(Collections.singletonList("serverAttributeKey1"));
ruleNode1.setConfiguration(mapper.valueToTree(configuration1)); ruleNode1.setConfiguration(JacksonUtil.valueToTree(configuration1));
RuleNode ruleNode12 = new RuleNode(); RuleNode ruleNode12 = new RuleNode();
ruleNode12.setName("Simple Rule Node 1"); ruleNode12.setName("Simple Rule Node 1");
@ -249,7 +250,7 @@ public abstract class AbstractRuleEngineFlowIntegrationTest extends AbstractRule
ruleNode12.setDebugMode(true); ruleNode12.setDebugMode(true);
TbRuleChainInputNodeConfiguration configuration12 = new TbRuleChainInputNodeConfiguration(); TbRuleChainInputNodeConfiguration configuration12 = new TbRuleChainInputNodeConfiguration();
configuration12.setRuleChainId(secondaryRuleChain.getId().getId().toString()); configuration12.setRuleChainId(secondaryRuleChain.getId().getId().toString());
ruleNode12.setConfiguration(mapper.valueToTree(configuration12)); ruleNode12.setConfiguration(JacksonUtil.valueToTree(configuration12));
rootMetaData.setNodes(Arrays.asList(ruleNode1, ruleNode12)); rootMetaData.setNodes(Arrays.asList(ruleNode1, ruleNode12));
rootMetaData.setFirstNodeIndex(0); rootMetaData.setFirstNodeIndex(0);
@ -273,7 +274,7 @@ public abstract class AbstractRuleEngineFlowIntegrationTest extends AbstractRule
ruleNode2.setDebugMode(true); ruleNode2.setDebugMode(true);
TbGetAttributesNodeConfiguration configuration2 = new TbGetAttributesNodeConfiguration(); TbGetAttributesNodeConfiguration configuration2 = new TbGetAttributesNodeConfiguration();
configuration2.setServerAttributeNames(Collections.singletonList("serverAttributeKey2")); configuration2.setServerAttributeNames(Collections.singletonList("serverAttributeKey2"));
ruleNode2.setConfiguration(mapper.valueToTree(configuration2)); ruleNode2.setConfiguration(JacksonUtil.valueToTree(configuration2));
secondaryMetaData.setNodes(Collections.singletonList(ruleNode2)); secondaryMetaData.setNodes(Collections.singletonList(ruleNode2));
secondaryMetaData.setFirstNodeIndex(0); secondaryMetaData.setFirstNodeIndex(0);

3
application/src/test/java/org/thingsboard/server/rules/lifecycle/AbstractRuleEngineLifecycleIntegrationTest.java

@ -23,6 +23,7 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.mockito.Mockito; import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.rule.engine.metadata.TbGetAttributesNodeConfiguration; import org.thingsboard.rule.engine.metadata.TbGetAttributesNodeConfiguration;
import org.thingsboard.server.actors.ActorSystemContext; import org.thingsboard.server.actors.ActorSystemContext;
import org.thingsboard.server.common.data.DataConstants; import org.thingsboard.server.common.data.DataConstants;
@ -94,7 +95,7 @@ public abstract class AbstractRuleEngineLifecycleIntegrationTest extends Abstrac
ruleNode.setDebugMode(true); ruleNode.setDebugMode(true);
TbGetAttributesNodeConfiguration configuration = new TbGetAttributesNodeConfiguration(); TbGetAttributesNodeConfiguration configuration = new TbGetAttributesNodeConfiguration();
configuration.setServerAttributeNames(Collections.singletonList("serverAttributeKey")); configuration.setServerAttributeNames(Collections.singletonList("serverAttributeKey"));
ruleNode.setConfiguration(mapper.valueToTree(configuration)); ruleNode.setConfiguration(JacksonUtil.valueToTree(configuration));
metaData.setNodes(Collections.singletonList(ruleNode)); metaData.setNodes(Collections.singletonList(ruleNode));
metaData.setFirstNodeIndex(0); metaData.setFirstNodeIndex(0);

18
application/src/test/java/org/thingsboard/server/service/install/update/DefaultDataUpdateServiceTest.java

@ -17,12 +17,12 @@ package org.thingsboard.server.service.install.update;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.ActiveProfiles;
import org.thingsboard.common.util.JacksonUtil;
import java.io.IOException; import java.io.IOException;
@ -34,8 +34,6 @@ import static org.mockito.BDDMockito.willCallRealMethod;
@SpringBootTest(classes = DefaultDataUpdateService.class) @SpringBootTest(classes = DefaultDataUpdateService.class)
class DefaultDataUpdateServiceTest { class DefaultDataUpdateServiceTest {
ObjectMapper mapper = new ObjectMapper();
@MockBean @MockBean
DefaultDataUpdateService service; DefaultDataUpdateService service;
@ -46,7 +44,7 @@ class DefaultDataUpdateServiceTest {
} }
JsonNode readFromResource(String resourceName) throws IOException { JsonNode readFromResource(String resourceName) throws IOException {
return mapper.readTree(this.getClass().getClassLoader().getResourceAsStream(resourceName)); return JacksonUtil.OBJECT_MAPPER.readTree(this.getClass().getClassLoader().getResourceAsStream(resourceName));
} }
@Test @Test
@ -69,8 +67,8 @@ class DefaultDataUpdateServiceTest {
@Test @Test
void convertDeviceProfileAlarmRulesForVersion330EmptyJson() throws JsonProcessingException { void convertDeviceProfileAlarmRulesForVersion330EmptyJson() throws JsonProcessingException {
JsonNode spec = mapper.readTree("{ }"); JsonNode spec = JacksonUtil.toJsonNode("{ }");
JsonNode expected = mapper.readTree("{ }"); JsonNode expected = JacksonUtil.toJsonNode("{ }");
assertThat(service.convertDeviceProfileForVersion330(spec)).isFalse(); assertThat(service.convertDeviceProfileForVersion330(spec)).isFalse();
assertThat(spec.toPrettyString()).isEqualTo(expected.toPrettyString()); assertThat(spec.toPrettyString()).isEqualTo(expected.toPrettyString());
@ -78,8 +76,8 @@ class DefaultDataUpdateServiceTest {
@Test @Test
void convertDeviceProfileAlarmRulesForVersion330AlarmNodeNull() throws JsonProcessingException { void convertDeviceProfileAlarmRulesForVersion330AlarmNodeNull() throws JsonProcessingException {
JsonNode spec = mapper.readTree("{ \"alarms\" : null }"); JsonNode spec = JacksonUtil.toJsonNode("{ \"alarms\" : null }");
JsonNode expected = mapper.readTree("{ \"alarms\" : null }"); JsonNode expected = JacksonUtil.toJsonNode("{ \"alarms\" : null }");
assertThat(service.convertDeviceProfileForVersion330(spec)).isFalse(); assertThat(service.convertDeviceProfileForVersion330(spec)).isFalse();
assertThat(spec.toPrettyString()).isEqualTo(expected.toPrettyString()); assertThat(spec.toPrettyString()).isEqualTo(expected.toPrettyString());
@ -87,8 +85,8 @@ class DefaultDataUpdateServiceTest {
@Test @Test
void convertDeviceProfileAlarmRulesForVersion330NoAlarmNode() throws JsonProcessingException { void convertDeviceProfileAlarmRulesForVersion330NoAlarmNode() throws JsonProcessingException {
JsonNode spec = mapper.readTree("{ \"configuration\": { \"type\": \"DEFAULT\" } }"); JsonNode spec = JacksonUtil.toJsonNode("{ \"configuration\": { \"type\": \"DEFAULT\" } }");
JsonNode expected = mapper.readTree("{ \"configuration\": { \"type\": \"DEFAULT\" } }"); JsonNode expected = JacksonUtil.toJsonNode("{ \"configuration\": { \"type\": \"DEFAULT\" } }");
assertThat(service.convertDeviceProfileForVersion330(spec)).isFalse(); assertThat(service.convertDeviceProfileForVersion330(spec)).isFalse();
assertThat(spec.toPrettyString()).isEqualTo(expected.toPrettyString()); assertThat(spec.toPrettyString()).isEqualTo(expected.toPrettyString());

2
application/src/test/java/org/thingsboard/server/service/notification/NotificationRuleApiTest.java

@ -414,7 +414,7 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest {
generatorNodeConfiguration.setPeriodInSeconds(1000); generatorNodeConfiguration.setPeriodInSeconds(1000);
generatorNodeConfiguration.setMsgCount(1); generatorNodeConfiguration.setMsgCount(1);
generatorNodeConfiguration.setJsScript("[return"); generatorNodeConfiguration.setJsScript("[return");
generatorNodeWithError.setConfiguration(mapper.valueToTree(generatorNodeConfiguration)); generatorNodeWithError.setConfiguration(JacksonUtil.valueToTree(generatorNodeConfiguration));
metaData.setNodes(List.of(generatorNodeWithError)); metaData.setNodes(List.of(generatorNodeWithError));
metaData.setFirstNodeIndex(0); metaData.setFirstNodeIndex(0);

8
application/src/test/java/org/thingsboard/server/service/sync/ie/BaseExportImportServiceTest.java

@ -328,7 +328,7 @@ public abstract class BaseExportImportServiceTest extends AbstractControllerTest
TbMsgGeneratorNodeConfiguration configuration1 = new TbMsgGeneratorNodeConfiguration(); TbMsgGeneratorNodeConfiguration configuration1 = new TbMsgGeneratorNodeConfiguration();
configuration1.setOriginatorType(originatorId.getEntityType()); configuration1.setOriginatorType(originatorId.getEntityType());
configuration1.setOriginatorId(originatorId.getId().toString()); configuration1.setOriginatorId(originatorId.getId().toString());
ruleNode1.setConfiguration(mapper.valueToTree(configuration1)); ruleNode1.setConfiguration(JacksonUtil.valueToTree(configuration1));
RuleNode ruleNode2 = new RuleNode(); RuleNode ruleNode2 = new RuleNode();
ruleNode2.setName("Simple Rule Node 2"); ruleNode2.setName("Simple Rule Node 2");
@ -336,7 +336,7 @@ public abstract class BaseExportImportServiceTest extends AbstractControllerTest
ruleNode2.setDebugMode(true); ruleNode2.setDebugMode(true);
TbGetAttributesNodeConfiguration configuration2 = new TbGetAttributesNodeConfiguration(); TbGetAttributesNodeConfiguration configuration2 = new TbGetAttributesNodeConfiguration();
configuration2.setServerAttributeNames(Collections.singletonList("serverAttributeKey2")); configuration2.setServerAttributeNames(Collections.singletonList("serverAttributeKey2"));
ruleNode2.setConfiguration(mapper.valueToTree(configuration2)); ruleNode2.setConfiguration(JacksonUtil.valueToTree(configuration2));
metaData.setNodes(Arrays.asList(ruleNode1, ruleNode2)); metaData.setNodes(Arrays.asList(ruleNode1, ruleNode2));
metaData.setFirstNodeIndex(0); metaData.setFirstNodeIndex(0);
@ -364,7 +364,7 @@ public abstract class BaseExportImportServiceTest extends AbstractControllerTest
ruleNode1.setDebugMode(true); ruleNode1.setDebugMode(true);
TbGetAttributesNodeConfiguration configuration1 = new TbGetAttributesNodeConfiguration(); TbGetAttributesNodeConfiguration configuration1 = new TbGetAttributesNodeConfiguration();
configuration1.setServerAttributeNames(Collections.singletonList("serverAttributeKey1")); configuration1.setServerAttributeNames(Collections.singletonList("serverAttributeKey1"));
ruleNode1.setConfiguration(mapper.valueToTree(configuration1)); ruleNode1.setConfiguration(JacksonUtil.valueToTree(configuration1));
RuleNode ruleNode2 = new RuleNode(); RuleNode ruleNode2 = new RuleNode();
ruleNode2.setName("Simple Rule Node 2"); ruleNode2.setName("Simple Rule Node 2");
@ -372,7 +372,7 @@ public abstract class BaseExportImportServiceTest extends AbstractControllerTest
ruleNode2.setDebugMode(true); ruleNode2.setDebugMode(true);
TbGetAttributesNodeConfiguration configuration2 = new TbGetAttributesNodeConfiguration(); TbGetAttributesNodeConfiguration configuration2 = new TbGetAttributesNodeConfiguration();
configuration2.setServerAttributeNames(Collections.singletonList("serverAttributeKey2")); configuration2.setServerAttributeNames(Collections.singletonList("serverAttributeKey2"));
ruleNode2.setConfiguration(mapper.valueToTree(configuration2)); ruleNode2.setConfiguration(JacksonUtil.valueToTree(configuration2));
metaData.setNodes(Arrays.asList(ruleNode1, ruleNode2)); metaData.setNodes(Arrays.asList(ruleNode1, ruleNode2));
metaData.setFirstNodeIndex(0); metaData.setFirstNodeIndex(0);

4
application/src/test/java/org/thingsboard/server/transport/lwm2m/AbstractLwM2MIntegrationTest.java

@ -232,7 +232,7 @@ public abstract class AbstractLwM2MIntegrationTest extends AbstractTransportInte
TelemetryPluginCmdsWrapper wrapper = new TelemetryPluginCmdsWrapper(); TelemetryPluginCmdsWrapper wrapper = new TelemetryPluginCmdsWrapper();
wrapper.setEntityDataCmds(Collections.singletonList(cmd)); wrapper.setEntityDataCmds(Collections.singletonList(cmd));
getWsClient().send(mapper.writeValueAsString(wrapper)); getWsClient().send(JacksonUtil.toString(wrapper));
getWsClient().waitForReply(); getWsClient().waitForReply();
getWsClient().registerWaitForUpdate(); getWsClient().registerWaitForUpdate();
@ -240,7 +240,7 @@ public abstract class AbstractLwM2MIntegrationTest extends AbstractTransportInte
awaitObserveReadAll(0, false, device.getId().getId().toString()); awaitObserveReadAll(0, false, device.getId().getId().toString());
String msg = getWsClient().waitForUpdate(); String msg = getWsClient().waitForUpdate();
EntityDataUpdate update = mapper.readValue(msg, EntityDataUpdate.class); EntityDataUpdate update = JacksonUtil.fromString(msg, EntityDataUpdate.class);
Assert.assertEquals(1, update.getCmdId()); Assert.assertEquals(1, update.getCmdId());
List<EntityData> eData = update.getUpdate(); List<EntityData> eData = update.getUpdate();
Assert.assertNotNull(eData); Assert.assertNotNull(eData);

3
application/src/test/java/org/thingsboard/server/transport/mqtt/AbstractMqttIntegrationTest.java

@ -20,6 +20,7 @@ import io.netty.handler.codec.mqtt.MqttQoS;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.MqttException; import org.eclipse.paho.client.mqttv3.MqttException;
import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.TestPropertySource;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.DeviceProfile; import org.thingsboard.server.common.data.DeviceProfile;
import org.thingsboard.server.common.data.DeviceProfileInfo; import org.thingsboard.server.common.data.DeviceProfileInfo;
@ -170,7 +171,7 @@ public abstract class AbstractMqttIntegrationTest extends AbstractTransportInteg
device.setName(name); device.setName(name);
device.setType(type); device.setType(type);
if (gateway) { if (gateway) {
ObjectNode additionalInfo = mapper.createObjectNode(); ObjectNode additionalInfo = JacksonUtil.newObjectNode();
additionalInfo.put("gateway", true); additionalInfo.put("gateway", true);
device.setAdditionalInfo(additionalInfo); device.setAdditionalInfo(additionalInfo);
} }

2
common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/util/JsonUtils.java

@ -15,7 +15,6 @@
*/ */
package org.thingsboard.server.common.transport.util; package org.thingsboard.server.common.transport.util;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import com.google.gson.JsonParser; import com.google.gson.JsonParser;
@ -26,7 +25,6 @@ import java.util.List;
public class JsonUtils { public class JsonUtils {
private static final JsonParser jsonParser = new JsonParser(); private static final JsonParser jsonParser = new JsonParser();
private static final ObjectMapper json = new ObjectMapper();
public static JsonObject getJsonObject(List<KeyValueProto> tsKv) { public static JsonObject getJsonObject(List<KeyValueProto> tsKv) {
JsonObject json = new JsonObject(); JsonObject json = new JsonObject();

8
common/util/pom.xml

@ -92,6 +92,14 @@
<groupId>com.github.dblock</groupId> <groupId>com.github.dblock</groupId>
<artifactId>oshi-core</artifactId> <artifactId>oshi-core</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
</dependencies> </dependencies>
<build> <build>

48
common/util/src/main/java/org/thingsboard/common/util/JacksonUtil.java

@ -19,6 +19,7 @@ import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.json.JsonWriteFeature; import com.fasterxml.jackson.core.json.JsonWriteFeature;
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.MapperFeature; import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
@ -26,10 +27,14 @@ import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.json.JsonMapper; import com.fasterxml.jackson.databind.json.JsonMapper;
import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.thingsboard.server.common.data.kv.DataType; import org.thingsboard.server.common.data.kv.DataType;
import org.thingsboard.server.common.data.kv.KvEntry; import org.thingsboard.server.common.data.kv.KvEntry;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
@ -56,6 +61,10 @@ public class JacksonUtil {
.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true) .configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true)
.build(); .build();
public static ObjectMapper getObjectMapperWithJavaTimeModule() {
return new ObjectMapper().registerModule(new JavaTimeModule());
}
public static <T> T convertValue(Object fromValue, Class<T> toValueType) { public static <T> T convertValue(Object fromValue, Class<T> toValueType) {
try { try {
return fromValue != null ? OBJECT_MAPPER.convertValue(fromValue, toValueType) : null; return fromValue != null ? OBJECT_MAPPER.convertValue(fromValue, toValueType) : null;
@ -92,6 +101,15 @@ public class JacksonUtil {
} }
} }
public static <T> T fromString(String string, JavaType javaType) {
try {
return string != null ? OBJECT_MAPPER.readValue(string, javaType) : null;
} catch (IOException e) {
throw new IllegalArgumentException("The given String value: "
+ string + " cannot be transformed to Json object", e);
}
}
public static <T> T fromBytes(byte[] bytes, Class<T> clazz) { public static <T> T fromBytes(byte[] bytes, Class<T> clazz) {
try { try {
return bytes != null ? OBJECT_MAPPER.readValue(bytes, clazz) : null; return bytes != null ? OBJECT_MAPPER.readValue(bytes, clazz) : null;
@ -150,6 +168,15 @@ public class JacksonUtil {
} }
} }
public static JsonNode toJsonNode(File value) {
try {
return value != null ? OBJECT_MAPPER.readTree(value) : null;
} catch (IOException e) {
throw new IllegalArgumentException("The given File object value: "
+ value + " cannot be transformed to a JsonNode", e);
}
}
public static ObjectNode newObjectNode() { public static ObjectNode newObjectNode() {
return newObjectNode(OBJECT_MAPPER); return newObjectNode(OBJECT_MAPPER);
} }
@ -246,6 +273,27 @@ public class JacksonUtil {
return map; return map;
} }
public static <T> T fromReader(Reader reader, Class<T> clazz) {
try {
return reader != null ? OBJECT_MAPPER.readValue(reader, clazz) : null;
} catch (IOException e) {
throw new IllegalArgumentException("Invalid request payload", e);
}
}
public static <T> void writeValue(Writer writer, T value) {
try {
OBJECT_MAPPER.writeValue(writer, value);
} catch (IOException e) {
throw new IllegalArgumentException("The given writer value: "
+ writer + "cannot be wrote", e);
}
}
public static JavaType constructCollectionType(Class collectionClass, Class<?> elementClass) {
return OBJECT_MAPPER.getTypeFactory().constructCollectionType(collectionClass, elementClass);
}
private static void toFlatMap(JsonNode node, String currentPath, Map<String, String> map) { private static void toFlatMap(JsonNode node, String currentPath, Map<String, String> map) {
if (node.isObject()) { if (node.isObject()) {
Iterator<Map.Entry<String, JsonNode>> fields = node.fields(); Iterator<Map.Entry<String, JsonNode>> fields = node.fields();

6
dao/src/main/java/org/thingsboard/server/dao/audit/sink/ElasticsearchAuditLogSink.java

@ -15,7 +15,6 @@
*/ */
package org.thingsboard.server.dao.audit.sink; package org.thingsboard.server.dao.audit.sink;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.ObjectNode;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpEntity; import org.apache.http.HttpEntity;
@ -34,6 +33,7 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.http.HttpMethod; import org.springframework.http.HttpMethod;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.common.data.audit.AuditLog; import org.thingsboard.server.common.data.audit.AuditLog;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
@ -52,8 +52,6 @@ public class ElasticsearchAuditLogSink implements AuditLogSink {
private static final String DATE_PLACEHOLDER = "@{DATE}"; private static final String DATE_PLACEHOLDER = "@{DATE}";
private static final String INDEX_TYPE = "audit_log"; private static final String INDEX_TYPE = "audit_log";
private final ObjectMapper mapper = new ObjectMapper();
@Value("${audit-log.sink.index_pattern}") @Value("${audit-log.sink.index_pattern}")
private String indexPattern; private String indexPattern;
@Value("${audit-log.sink.scheme_name}") @Value("${audit-log.sink.scheme_name}")
@ -112,7 +110,7 @@ public class ElasticsearchAuditLogSink implements AuditLogSink {
} }
private String createElasticJsonRecord(AuditLog auditLog) { private String createElasticJsonRecord(AuditLog auditLog) {
ObjectNode auditLogNode = mapper.createObjectNode(); ObjectNode auditLogNode = JacksonUtil.newObjectNode();
auditLogNode.put("postDate", LocalDateTime.now().toString()); auditLogNode.put("postDate", LocalDateTime.now().toString());
auditLogNode.put("id", auditLog.getId().getId().toString()); auditLogNode.put("id", auditLog.getId().getId().toString());
auditLogNode.put("entityName", auditLog.getEntityName()); auditLogNode.put("entityName", auditLog.getEntityName());

6
dao/src/main/java/org/thingsboard/server/dao/customer/CustomerServiceImpl.java

@ -16,13 +16,13 @@
package org.thingsboard.server.dao.customer; package org.thingsboard.server.dao.customer;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.Customer; import org.thingsboard.server.common.data.Customer;
import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.CustomerId;
@ -153,8 +153,8 @@ public class CustomerServiceImpl extends AbstractEntityService implements Custom
publicCustomer.setTenantId(tenantId); publicCustomer.setTenantId(tenantId);
publicCustomer.setTitle(PUBLIC_CUSTOMER_TITLE); publicCustomer.setTitle(PUBLIC_CUSTOMER_TITLE);
try { try {
publicCustomer.setAdditionalInfo(new ObjectMapper().readValue("{ \"isPublic\": true }", JsonNode.class)); publicCustomer.setAdditionalInfo(JacksonUtil.toJsonNode("{ \"isPublic\": true }"));
} catch (IOException e) { } catch (IllegalArgumentException e) {
throw new IncorrectParameterException("Unable to create public customer.", e); throw new IncorrectParameterException("Unable to create public customer.", e);
} }
Customer savedCustomer = customerDao.save(tenantId, publicCustomer); Customer savedCustomer = customerDao.save(tenantId, publicCustomer);

12
dao/src/main/java/org/thingsboard/server/dao/model/sql/AbstractEntityViewEntity.java

@ -16,12 +16,12 @@
package org.thingsboard.server.dao.model.sql; package org.thingsboard.server.dao.model.sql;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.hibernate.annotations.Type; import org.hibernate.annotations.Type;
import org.hibernate.annotations.TypeDef; import org.hibernate.annotations.TypeDef;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.EntityView; import org.thingsboard.server.common.data.EntityView;
import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.CustomerId;
@ -92,8 +92,6 @@ public abstract class AbstractEntityViewEntity<T extends EntityView> extends Bas
@Column(name = ModelConstants.EXTERNAL_ID_PROPERTY) @Column(name = ModelConstants.EXTERNAL_ID_PROPERTY)
private UUID externalId; private UUID externalId;
private static final ObjectMapper mapper = new ObjectMapper();
public AbstractEntityViewEntity() { public AbstractEntityViewEntity() {
super(); super();
} }
@ -116,8 +114,8 @@ public abstract class AbstractEntityViewEntity<T extends EntityView> extends Bas
this.type = entityView.getType(); this.type = entityView.getType();
this.name = entityView.getName(); this.name = entityView.getName();
try { try {
this.keys = mapper.writeValueAsString(entityView.getKeys()); this.keys = JacksonUtil.toString(entityView.getKeys());
} catch (IOException e) { } catch (IllegalArgumentException e) {
log.error("Unable to serialize entity view keys!", e); log.error("Unable to serialize entity view keys!", e);
} }
this.startTs = entityView.getStartTimeMs(); this.startTs = entityView.getStartTimeMs();
@ -172,8 +170,8 @@ public abstract class AbstractEntityViewEntity<T extends EntityView> extends Bas
entityView.setType(type); entityView.setType(type);
entityView.setName(name); entityView.setName(name);
try { try {
entityView.setKeys(mapper.readValue(keys, TelemetryEntityView.class)); entityView.setKeys(JacksonUtil.fromString(keys, TelemetryEntityView.class));
} catch (IOException e) { } catch (IllegalArgumentException e) {
log.error("Unable to read entity view keys!", e); log.error("Unable to read entity view keys!", e);
} }
entityView.setStartTimeMs(startTs); entityView.setStartTimeMs(startTs);

13
dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardEntity.java

@ -18,12 +18,12 @@ package org.thingsboard.server.dao.model.sql;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.hibernate.annotations.Type; import org.hibernate.annotations.Type;
import org.hibernate.annotations.TypeDef; import org.hibernate.annotations.TypeDef;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.Dashboard; import org.thingsboard.server.common.data.Dashboard;
import org.thingsboard.server.common.data.ShortCustomerInfo; import org.thingsboard.server.common.data.ShortCustomerInfo;
import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.StringUtils;
@ -49,9 +49,8 @@ import java.util.UUID;
@Table(name = ModelConstants.DASHBOARD_COLUMN_FAMILY_NAME) @Table(name = ModelConstants.DASHBOARD_COLUMN_FAMILY_NAME)
public final class DashboardEntity extends BaseSqlEntity<Dashboard> implements SearchTextEntity<Dashboard> { public final class DashboardEntity extends BaseSqlEntity<Dashboard> implements SearchTextEntity<Dashboard> {
private static final ObjectMapper objectMapper = new ObjectMapper();
private static final JavaType assignedCustomersType = private static final JavaType assignedCustomersType =
objectMapper.getTypeFactory().constructCollectionType(HashSet.class, ShortCustomerInfo.class); JacksonUtil.constructCollectionType(HashSet.class, ShortCustomerInfo.class);
@Column(name = ModelConstants.DASHBOARD_TENANT_ID_PROPERTY) @Column(name = ModelConstants.DASHBOARD_TENANT_ID_PROPERTY)
private UUID tenantId; private UUID tenantId;
@ -97,8 +96,8 @@ public final class DashboardEntity extends BaseSqlEntity<Dashboard> implements S
this.image = dashboard.getImage(); this.image = dashboard.getImage();
if (dashboard.getAssignedCustomers() != null) { if (dashboard.getAssignedCustomers() != null) {
try { try {
this.assignedCustomers = objectMapper.writeValueAsString(dashboard.getAssignedCustomers()); this.assignedCustomers = JacksonUtil.toString(dashboard.getAssignedCustomers());
} catch (JsonProcessingException e) { } catch (IllegalArgumentException e) {
log.error("Unable to serialize assigned customers to string!", e); log.error("Unable to serialize assigned customers to string!", e);
} }
} }
@ -131,8 +130,8 @@ public final class DashboardEntity extends BaseSqlEntity<Dashboard> implements S
dashboard.setImage(image); dashboard.setImage(image);
if (!StringUtils.isEmpty(assignedCustomers)) { if (!StringUtils.isEmpty(assignedCustomers)) {
try { try {
dashboard.setAssignedCustomers(objectMapper.readValue(assignedCustomers, assignedCustomersType)); dashboard.setAssignedCustomers(JacksonUtil.fromString(assignedCustomers, assignedCustomersType));
} catch (IOException e) { } catch (IllegalArgumentException e) {
log.warn("Unable to parse assigned customers!", e); log.warn("Unable to parse assigned customers!", e);
} }
} }

13
dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardInfoEntity.java

@ -17,10 +17,10 @@ package org.thingsboard.server.dao.model.sql;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.DashboardInfo; import org.thingsboard.server.common.data.DashboardInfo;
import org.thingsboard.server.common.data.ShortCustomerInfo; import org.thingsboard.server.common.data.ShortCustomerInfo;
import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.StringUtils;
@ -44,9 +44,8 @@ import java.util.UUID;
@Table(name = ModelConstants.DASHBOARD_COLUMN_FAMILY_NAME) @Table(name = ModelConstants.DASHBOARD_COLUMN_FAMILY_NAME)
public class DashboardInfoEntity extends BaseSqlEntity<DashboardInfo> implements SearchTextEntity<DashboardInfo> { public class DashboardInfoEntity extends BaseSqlEntity<DashboardInfo> implements SearchTextEntity<DashboardInfo> {
private static final ObjectMapper objectMapper = new ObjectMapper();
private static final JavaType assignedCustomersType = private static final JavaType assignedCustomersType =
objectMapper.getTypeFactory().constructCollectionType(HashSet.class, ShortCustomerInfo.class); JacksonUtil.constructCollectionType(HashSet.class, ShortCustomerInfo.class);
@Column(name = ModelConstants.DASHBOARD_TENANT_ID_PROPERTY) @Column(name = ModelConstants.DASHBOARD_TENANT_ID_PROPERTY)
private UUID tenantId; private UUID tenantId;
@ -85,8 +84,8 @@ public class DashboardInfoEntity extends BaseSqlEntity<DashboardInfo> implements
this.image = dashboardInfo.getImage(); this.image = dashboardInfo.getImage();
if (dashboardInfo.getAssignedCustomers() != null) { if (dashboardInfo.getAssignedCustomers() != null) {
try { try {
this.assignedCustomers = objectMapper.writeValueAsString(dashboardInfo.getAssignedCustomers()); this.assignedCustomers = JacksonUtil.toString(dashboardInfo.getAssignedCustomers());
} catch (JsonProcessingException e) { } catch (IllegalArgumentException e) {
log.error("Unable to serialize assigned customers to string!", e); log.error("Unable to serialize assigned customers to string!", e);
} }
} }
@ -119,8 +118,8 @@ public class DashboardInfoEntity extends BaseSqlEntity<DashboardInfo> implements
dashboardInfo.setImage(image); dashboardInfo.setImage(image);
if (!StringUtils.isEmpty(assignedCustomers)) { if (!StringUtils.isEmpty(assignedCustomers)) {
try { try {
dashboardInfo.setAssignedCustomers(objectMapper.readValue(assignedCustomers, assignedCustomersType)); dashboardInfo.setAssignedCustomers(JacksonUtil.fromString(assignedCustomers, assignedCustomersType));
} catch (IOException e) { } catch (IllegalArgumentException e) {
log.warn("Unable to parse assigned customers!", e); log.warn("Unable to parse assigned customers!", e);
} }
} }

12
dao/src/main/java/org/thingsboard/server/dao/model/sql/QueueEntity.java

@ -16,11 +16,11 @@
package org.thingsboard.server.dao.model.sql; package org.thingsboard.server.dao.model.sql;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import org.hibernate.annotations.Type; import org.hibernate.annotations.Type;
import org.hibernate.annotations.TypeDef; import org.hibernate.annotations.TypeDef;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.id.QueueId; import org.thingsboard.server.common.data.id.QueueId;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.queue.ProcessingStrategy; import org.thingsboard.server.common.data.queue.ProcessingStrategy;
@ -43,8 +43,6 @@ import java.util.UUID;
@Table(name = ModelConstants.QUEUE_COLUMN_FAMILY_NAME) @Table(name = ModelConstants.QUEUE_COLUMN_FAMILY_NAME)
public class QueueEntity extends BaseSqlEntity<Queue> { public class QueueEntity extends BaseSqlEntity<Queue> {
private static final ObjectMapper mapper = new ObjectMapper();
@Column(name = ModelConstants.QUEUE_TENANT_ID_PROPERTY) @Column(name = ModelConstants.QUEUE_TENANT_ID_PROPERTY)
private UUID tenantId; private UUID tenantId;
@ -92,8 +90,8 @@ public class QueueEntity extends BaseSqlEntity<Queue> {
this.partitions = queue.getPartitions(); this.partitions = queue.getPartitions();
this.consumerPerPartition = queue.isConsumerPerPartition(); this.consumerPerPartition = queue.isConsumerPerPartition();
this.packProcessingTimeout = queue.getPackProcessingTimeout(); this.packProcessingTimeout = queue.getPackProcessingTimeout();
this.submitStrategy = mapper.valueToTree(queue.getSubmitStrategy()); this.submitStrategy = JacksonUtil.valueToTree(queue.getSubmitStrategy());
this.processingStrategy = mapper.valueToTree(queue.getProcessingStrategy()); this.processingStrategy = JacksonUtil.valueToTree(queue.getProcessingStrategy());
this.additionalInfo = queue.getAdditionalInfo(); this.additionalInfo = queue.getAdditionalInfo();
} }
@ -108,8 +106,8 @@ public class QueueEntity extends BaseSqlEntity<Queue> {
queue.setPartitions(partitions); queue.setPartitions(partitions);
queue.setConsumerPerPartition(consumerPerPartition); queue.setConsumerPerPartition(consumerPerPartition);
queue.setPackProcessingTimeout(packProcessingTimeout); queue.setPackProcessingTimeout(packProcessingTimeout);
queue.setSubmitStrategy(mapper.convertValue(submitStrategy, SubmitStrategy.class)); queue.setSubmitStrategy(JacksonUtil.convertValue(submitStrategy, SubmitStrategy.class));
queue.setProcessingStrategy(mapper.convertValue(processingStrategy, ProcessingStrategy.class)); queue.setProcessingStrategy(JacksonUtil.convertValue(processingStrategy, ProcessingStrategy.class));
queue.setAdditionalInfo(additionalInfo); queue.setAdditionalInfo(additionalInfo);
return queue; return queue;
} }

8
dao/src/main/java/org/thingsboard/server/dao/sql/query/AlarmDataAdapter.java

@ -16,8 +16,8 @@
package org.thingsboard.server.dao.sql.query; package org.thingsboard.server.dao.sql.query;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.common.data.alarm.Alarm; import org.thingsboard.server.common.data.alarm.Alarm;
@ -47,8 +47,6 @@ import java.util.stream.Collectors;
@Slf4j @Slf4j
public class AlarmDataAdapter { public class AlarmDataAdapter {
private final static ObjectMapper mapper = new ObjectMapper();
public static PageData<AlarmData> createAlarmData(EntityDataPageLink pageLink, public static PageData<AlarmData> createAlarmData(EntityDataPageLink pageLink,
List<Map<String, Object>> rows, List<Map<String, Object>> rows,
int totalElements, Collection<EntityId> orderedEntityIds) { int totalElements, Collection<EntityId> orderedEntityIds) {
@ -76,8 +74,8 @@ public class AlarmDataAdapter {
Object additionalInfo = row.get(ModelConstants.ADDITIONAL_INFO_PROPERTY); Object additionalInfo = row.get(ModelConstants.ADDITIONAL_INFO_PROPERTY);
if (additionalInfo != null) { if (additionalInfo != null) {
try { try {
alarm.setDetails(mapper.readTree(additionalInfo.toString())); alarm.setDetails(JacksonUtil.toJsonNode(additionalInfo.toString()));
} catch (JsonProcessingException e) { } catch (IllegalArgumentException e) {
log.warn("Failed to parse json: {}", row.get(ModelConstants.ADDITIONAL_INFO_PROPERTY), e); log.warn("Failed to parse json: {}", row.get(ModelConstants.ADDITIONAL_INFO_PROPERTY), e);
} }
} }

5
dao/src/main/java/org/thingsboard/server/dao/user/UserSettingsServiceImpl.java

@ -16,7 +16,6 @@
package org.thingsboard.server.dao.user; package org.thingsboard.server.dao.user;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.ObjectNode;
import com.jayway.jsonpath.DocumentContext; import com.jayway.jsonpath.DocumentContext;
import com.jayway.jsonpath.JsonPath; import com.jayway.jsonpath.JsonPath;
@ -25,7 +24,6 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.event.TransactionalEventListener; import org.springframework.transaction.event.TransactionalEventListener;
import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.User;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.id.UserId; import org.thingsboard.server.common.data.id.UserId;
import org.thingsboard.server.common.data.settings.UserSettings; import org.thingsboard.server.common.data.settings.UserSettings;
@ -35,7 +33,6 @@ import org.thingsboard.server.dao.entity.AbstractCachedService;
import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.exception.DataValidationException;
import org.thingsboard.server.dao.service.ConstraintValidator; import org.thingsboard.server.dao.service.ConstraintValidator;
import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
@ -95,7 +92,7 @@ public class UserSettingsServiceImpl extends AbstractCachedService<UserSettingsC
for (String s : jsonPaths) { for (String s : jsonPaths) {
dcSettings = dcSettings.delete("$." + s); dcSettings = dcSettings.delete("$." + s);
} }
userSettings.setSettings(new ObjectMapper().readValue(dcSettings.jsonString(), ObjectNode.class)); userSettings.setSettings(JacksonUtil.fromString(dcSettings.jsonString(), ObjectNode.class));
} catch (Exception t) { } catch (Exception t) {
handleEvictEvent(new UserSettingsEvictEvent(key)); handleEvictEvent(new UserSettingsEvictEvent(key));
throw new RuntimeException(t); throw new RuntimeException(t);

8
dao/src/test/java/org/thingsboard/server/dao/service/AbstractServiceTest.java

@ -17,7 +17,6 @@ package org.thingsboard.server.dao.service;
import com.datastax.oss.driver.api.core.uuid.Uuids; import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@ -55,6 +54,7 @@ import org.thingsboard.server.dao.audit.AuditLogLevelProperties;
import org.thingsboard.server.dao.tenant.TenantService; import org.thingsboard.server.dao.tenant.TenantService;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.Comparator; import java.util.Comparator;
import java.util.HashMap; import java.util.HashMap;
@ -71,8 +71,6 @@ import static org.junit.Assert.assertNotNull;
@ComponentScan("org.thingsboard.server") @ComponentScan("org.thingsboard.server")
public abstract class AbstractServiceTest { public abstract class AbstractServiceTest {
protected ObjectMapper mapper = new ObjectMapper();
public static final TenantId SYSTEM_TENANT_ID = TenantId.SYS_TENANT_ID; public static final TenantId SYSTEM_TENANT_ID = TenantId.SYS_TENANT_ID;
@Autowired @Autowired
@ -130,7 +128,9 @@ public abstract class AbstractServiceTest {
// } // }
public JsonNode readFromResource(String resourceName) throws IOException { public JsonNode readFromResource(String resourceName) throws IOException {
return mapper.readTree(this.getClass().getClassLoader().getResourceAsStream(resourceName)); try (InputStream is = this.getClass().getClassLoader().getResourceAsStream(resourceName)){
return JacksonUtil.fromBytes(is.readAllBytes());
}
} }
@Bean @Bean

3
dao/src/test/java/org/thingsboard/server/dao/service/BaseOAuth2ConfigTemplateServiceTest.java

@ -21,6 +21,7 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.oauth2.MapperType; import org.thingsboard.server.common.data.oauth2.MapperType;
import org.thingsboard.server.common.data.oauth2.OAuth2BasicMapperConfig; import org.thingsboard.server.common.data.oauth2.OAuth2BasicMapperConfig;
@ -109,7 +110,7 @@ public abstract class BaseOAuth2ConfigTemplateServiceTest extends AbstractServic
private OAuth2ClientRegistrationTemplate validClientRegistrationTemplate(String providerId) { private OAuth2ClientRegistrationTemplate validClientRegistrationTemplate(String providerId) {
OAuth2ClientRegistrationTemplate clientRegistrationTemplate = new OAuth2ClientRegistrationTemplate(); OAuth2ClientRegistrationTemplate clientRegistrationTemplate = new OAuth2ClientRegistrationTemplate();
clientRegistrationTemplate.setProviderId(providerId); clientRegistrationTemplate.setProviderId(providerId);
clientRegistrationTemplate.setAdditionalInfo(mapper.createObjectNode().put(UUID.randomUUID().toString(), UUID.randomUUID().toString())); clientRegistrationTemplate.setAdditionalInfo(JacksonUtil.newObjectNode().put(UUID.randomUUID().toString(), UUID.randomUUID().toString()));
clientRegistrationTemplate.setMapperConfig(OAuth2MapperConfig.builder() clientRegistrationTemplate.setMapperConfig(OAuth2MapperConfig.builder()
.type(MapperType.BASIC) .type(MapperType.BASIC)
.basic(OAuth2BasicMapperConfig.builder() .basic(OAuth2BasicMapperConfig.builder()

3
dao/src/test/java/org/thingsboard/server/dao/service/BaseOAuth2ServiceTest.java

@ -22,6 +22,7 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.common.data.oauth2.MapperType; import org.thingsboard.server.common.data.oauth2.MapperType;
import org.thingsboard.server.common.data.oauth2.OAuth2ClientInfo; import org.thingsboard.server.common.data.oauth2.OAuth2ClientInfo;
@ -641,7 +642,7 @@ public abstract class BaseOAuth2ServiceTest extends AbstractServiceTest {
.clientAuthenticationMethod(UUID.randomUUID().toString()) .clientAuthenticationMethod(UUID.randomUUID().toString())
.loginButtonLabel(label != null ? label : UUID.randomUUID().toString()) .loginButtonLabel(label != null ? label : UUID.randomUUID().toString())
.loginButtonIcon(UUID.randomUUID().toString()) .loginButtonIcon(UUID.randomUUID().toString())
.additionalInfo(mapper.createObjectNode().put(UUID.randomUUID().toString(), UUID.randomUUID().toString())) .additionalInfo(JacksonUtil.newObjectNode().put(UUID.randomUUID().toString(), UUID.randomUUID().toString()))
.mapperConfig( .mapperConfig(
OAuth2MapperConfig.builder() OAuth2MapperConfig.builder()
.allowUserCreation(true) .allowUserCreation(true)

29
dao/src/test/java/org/thingsboard/server/dao/service/BaseRuleChainServiceTest.java

@ -16,13 +16,12 @@
package org.thingsboard.server.dao.service; package org.thingsboard.server.dao.service;
import com.datastax.oss.driver.api.core.uuid.Uuids; import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.edge.Edge; import org.thingsboard.server.common.data.edge.Edge;
import org.thingsboard.server.common.data.id.RuleChainId; import org.thingsboard.server.common.data.id.RuleChainId;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
@ -276,7 +275,7 @@ public abstract class BaseRuleChainServiceTest extends AbstractServiceTest {
RuleNode ruleNode4 = new RuleNode(); RuleNode ruleNode4 = new RuleNode();
ruleNode4.setName("name4"); ruleNode4.setName("name4");
ruleNode4.setType("type4"); ruleNode4.setType("type4");
ruleNode4.setConfiguration(mapper.readTree("\"key4\": \"val4\"")); ruleNode4.setConfiguration(JacksonUtil.toJsonNode("\"key4\": \"val4\""));
ruleNodes.set(name3Index, ruleNode4); ruleNodes.set(name3Index, ruleNode4);
@ -369,22 +368,20 @@ public abstract class BaseRuleChainServiceTest extends AbstractServiceTest {
RuleChainMetaData ruleChainMetaData = new RuleChainMetaData(); RuleChainMetaData ruleChainMetaData = new RuleChainMetaData();
ruleChainMetaData.setRuleChainId(savedRuleChain.getId()); ruleChainMetaData.setRuleChainId(savedRuleChain.getId());
ObjectMapper mapper = new ObjectMapper();
RuleNode ruleNode1 = new RuleNode(); RuleNode ruleNode1 = new RuleNode();
ruleNode1.setName("name1"); ruleNode1.setName("name1");
ruleNode1.setType("type1"); ruleNode1.setType("type1");
ruleNode1.setConfiguration(mapper.readTree("\"key1\": \"val1\"")); ruleNode1.setConfiguration(JacksonUtil.toJsonNode("\"key1\": \"val1\""));
RuleNode ruleNode2 = new RuleNode(); RuleNode ruleNode2 = new RuleNode();
ruleNode2.setName("name2"); ruleNode2.setName("name2");
ruleNode2.setType("type2"); ruleNode2.setType("type2");
ruleNode2.setConfiguration(mapper.readTree("\"key2\": \"val2\"")); ruleNode2.setConfiguration(JacksonUtil.toJsonNode("\"key2\": \"val2\""));
RuleNode ruleNode3 = new RuleNode(); RuleNode ruleNode3 = new RuleNode();
ruleNode3.setName("name3"); ruleNode3.setName("name3");
ruleNode3.setType("type3"); ruleNode3.setType("type3");
ruleNode3.setConfiguration(mapper.readTree("\"key3\": \"val3\"")); ruleNode3.setConfiguration(JacksonUtil.toJsonNode("\"key3\": \"val3\""));
List<RuleNode> ruleNodes = new ArrayList<>(); List<RuleNode> ruleNodes = new ArrayList<>();
ruleNodes.add(ruleNode1); ruleNodes.add(ruleNode1);
@ -410,22 +407,20 @@ public abstract class BaseRuleChainServiceTest extends AbstractServiceTest {
RuleChainMetaData ruleChainMetaData = new RuleChainMetaData(); RuleChainMetaData ruleChainMetaData = new RuleChainMetaData();
ruleChainMetaData.setRuleChainId(savedRuleChain.getId()); ruleChainMetaData.setRuleChainId(savedRuleChain.getId());
ObjectMapper mapper = new ObjectMapper();
RuleNode ruleNode1 = new RuleNode(); RuleNode ruleNode1 = new RuleNode();
ruleNode1.setName("name1"); ruleNode1.setName("name1");
ruleNode1.setType("type1"); ruleNode1.setType("type1");
ruleNode1.setConfiguration(mapper.readTree("\"key1\": \"val1\"")); ruleNode1.setConfiguration(JacksonUtil.toJsonNode("\"key1\": \"val1\""));
RuleNode ruleNode2 = new RuleNode(); RuleNode ruleNode2 = new RuleNode();
ruleNode2.setName("name2"); ruleNode2.setName("name2");
ruleNode2.setType("type2"); ruleNode2.setType("type2");
ruleNode2.setConfiguration(mapper.readTree("\"key2\": \"val2\"")); ruleNode2.setConfiguration(JacksonUtil.toJsonNode("\"key2\": \"val2\""));
RuleNode ruleNode3 = new RuleNode(); RuleNode ruleNode3 = new RuleNode();
ruleNode3.setName("name3"); ruleNode3.setName("name3");
ruleNode3.setType("type3"); ruleNode3.setType("type3");
ruleNode3.setConfiguration(mapper.readTree("\"key3\": \"val3\"")); ruleNode3.setConfiguration(JacksonUtil.toJsonNode("\"key3\": \"val3\""));
List<RuleNode> ruleNodes = new ArrayList<>(); List<RuleNode> ruleNodes = new ArrayList<>();
ruleNodes.add(ruleNode1); ruleNodes.add(ruleNode1);
@ -451,22 +446,20 @@ public abstract class BaseRuleChainServiceTest extends AbstractServiceTest {
RuleChainMetaData ruleChainMetaData = new RuleChainMetaData(); RuleChainMetaData ruleChainMetaData = new RuleChainMetaData();
ruleChainMetaData.setRuleChainId(savedRuleChain.getId()); ruleChainMetaData.setRuleChainId(savedRuleChain.getId());
ObjectMapper mapper = new ObjectMapper();
RuleNode ruleNode1 = new RuleNode(); RuleNode ruleNode1 = new RuleNode();
ruleNode1.setName("name1"); ruleNode1.setName("name1");
ruleNode1.setType("type1"); ruleNode1.setType("type1");
ruleNode1.setConfiguration(mapper.readTree("\"key1\": \"val1\"")); ruleNode1.setConfiguration(JacksonUtil.toJsonNode("\"key1\": \"val1\""));
RuleNode ruleNode2 = new RuleNode(); RuleNode ruleNode2 = new RuleNode();
ruleNode2.setName("name2"); ruleNode2.setName("name2");
ruleNode2.setType("type2"); ruleNode2.setType("type2");
ruleNode2.setConfiguration(mapper.readTree("\"key2\": \"val2\"")); ruleNode2.setConfiguration(JacksonUtil.toJsonNode("\"key2\": \"val2\""));
RuleNode ruleNode3 = new RuleNode(); RuleNode ruleNode3 = new RuleNode();
ruleNode3.setName("name3"); ruleNode3.setName("name3");
ruleNode3.setType("type3"); ruleNode3.setType("type3");
ruleNode3.setConfiguration(mapper.readTree("\"key3\": \"val3\"")); ruleNode3.setConfiguration(JacksonUtil.toJsonNode("\"key3\": \"val3\""));
List<RuleNode> ruleNodes = new ArrayList<>(); List<RuleNode> ruleNodes = new ArrayList<>();
ruleNodes.add(ruleNode1); ruleNodes.add(ruleNode1);

28
dao/src/test/java/org/thingsboard/server/dao/service/BaseWidgetTypeServiceTest.java

@ -17,11 +17,11 @@ package org.thingsboard.server.dao.service;
import com.datastax.oss.driver.api.core.uuid.Uuids; import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.widget.WidgetType; import org.thingsboard.server.common.data.widget.WidgetType;
import org.thingsboard.server.common.data.widget.WidgetTypeDetails; import org.thingsboard.server.common.data.widget.WidgetTypeDetails;
@ -57,7 +57,7 @@ public abstract class BaseWidgetTypeServiceTest extends AbstractServiceTest {
widgetType.setTenantId(tenantId); widgetType.setTenantId(tenantId);
widgetType.setBundleAlias(savedWidgetsBundle.getAlias()); widgetType.setBundleAlias(savedWidgetsBundle.getAlias());
widgetType.setName("Widget Type"); widgetType.setName("Widget Type");
widgetType.setDescriptor(new ObjectMapper().readValue("{ \"someKey\": \"someValue\" }", JsonNode.class)); widgetType.setDescriptor(JacksonUtil.fromString("{ \"someKey\": \"someValue\" }", JsonNode.class));
WidgetTypeDetails savedWidgetType = widgetTypeService.saveWidgetType(widgetType); WidgetTypeDetails savedWidgetType = widgetTypeService.saveWidgetType(widgetType);
Assert.assertNotNull(savedWidgetType); Assert.assertNotNull(savedWidgetType);
@ -88,7 +88,7 @@ public abstract class BaseWidgetTypeServiceTest extends AbstractServiceTest {
WidgetTypeDetails widgetType = new WidgetTypeDetails(); WidgetTypeDetails widgetType = new WidgetTypeDetails();
widgetType.setTenantId(tenantId); widgetType.setTenantId(tenantId);
widgetType.setBundleAlias(savedWidgetsBundle.getAlias()); widgetType.setBundleAlias(savedWidgetsBundle.getAlias());
widgetType.setDescriptor(new ObjectMapper().readValue("{ \"someKey\": \"someValue\" }", JsonNode.class)); widgetType.setDescriptor(JacksonUtil.fromString("{ \"someKey\": \"someValue\" }", JsonNode.class));
try { try {
Assertions.assertThrows(DataValidationException.class, () -> { Assertions.assertThrows(DataValidationException.class, () -> {
widgetTypeService.saveWidgetType(widgetType); widgetTypeService.saveWidgetType(widgetType);
@ -103,7 +103,7 @@ public abstract class BaseWidgetTypeServiceTest extends AbstractServiceTest {
WidgetTypeDetails widgetType = new WidgetTypeDetails(); WidgetTypeDetails widgetType = new WidgetTypeDetails();
widgetType.setTenantId(tenantId); widgetType.setTenantId(tenantId);
widgetType.setName("Widget Type"); widgetType.setName("Widget Type");
widgetType.setDescriptor(new ObjectMapper().readValue("{ \"someKey\": \"someValue\" }", JsonNode.class)); widgetType.setDescriptor(JacksonUtil.fromString("{ \"someKey\": \"someValue\" }", JsonNode.class));
Assertions.assertThrows(DataValidationException.class, () -> { Assertions.assertThrows(DataValidationException.class, () -> {
widgetTypeService.saveWidgetType(widgetType); widgetTypeService.saveWidgetType(widgetType);
}); });
@ -120,7 +120,7 @@ public abstract class BaseWidgetTypeServiceTest extends AbstractServiceTest {
widgetType.setTenantId(tenantId); widgetType.setTenantId(tenantId);
widgetType.setName("Widget Type"); widgetType.setName("Widget Type");
widgetType.setBundleAlias(savedWidgetsBundle.getAlias()); widgetType.setBundleAlias(savedWidgetsBundle.getAlias());
widgetType.setDescriptor(new ObjectMapper().readValue("{}", JsonNode.class)); widgetType.setDescriptor(JacksonUtil.fromString("{}", JsonNode.class));
try { try {
Assertions.assertThrows(DataValidationException.class, () -> { Assertions.assertThrows(DataValidationException.class, () -> {
widgetTypeService.saveWidgetType(widgetType); widgetTypeService.saveWidgetType(widgetType);
@ -141,7 +141,7 @@ public abstract class BaseWidgetTypeServiceTest extends AbstractServiceTest {
widgetType.setTenantId(TenantId.fromUUID(Uuids.timeBased())); widgetType.setTenantId(TenantId.fromUUID(Uuids.timeBased()));
widgetType.setBundleAlias(savedWidgetsBundle.getAlias()); widgetType.setBundleAlias(savedWidgetsBundle.getAlias());
widgetType.setName("Widget Type"); widgetType.setName("Widget Type");
widgetType.setDescriptor(new ObjectMapper().readValue("{ \"someKey\": \"someValue\" }", JsonNode.class)); widgetType.setDescriptor(JacksonUtil.fromString("{ \"someKey\": \"someValue\" }", JsonNode.class));
try { try {
Assertions.assertThrows(DataValidationException.class, () -> { Assertions.assertThrows(DataValidationException.class, () -> {
widgetTypeService.saveWidgetType(widgetType); widgetTypeService.saveWidgetType(widgetType);
@ -157,7 +157,7 @@ public abstract class BaseWidgetTypeServiceTest extends AbstractServiceTest {
widgetType.setTenantId(tenantId); widgetType.setTenantId(tenantId);
widgetType.setBundleAlias("some_alias"); widgetType.setBundleAlias("some_alias");
widgetType.setName("Widget Type"); widgetType.setName("Widget Type");
widgetType.setDescriptor(new ObjectMapper().readValue("{ \"someKey\": \"someValue\" }", JsonNode.class)); widgetType.setDescriptor(JacksonUtil.fromString("{ \"someKey\": \"someValue\" }", JsonNode.class));
Assertions.assertThrows(DataValidationException.class, () -> { Assertions.assertThrows(DataValidationException.class, () -> {
widgetTypeService.saveWidgetType(widgetType); widgetTypeService.saveWidgetType(widgetType);
}); });
@ -174,7 +174,7 @@ public abstract class BaseWidgetTypeServiceTest extends AbstractServiceTest {
widgetType.setTenantId(tenantId); widgetType.setTenantId(tenantId);
widgetType.setBundleAlias(savedWidgetsBundle.getAlias()); widgetType.setBundleAlias(savedWidgetsBundle.getAlias());
widgetType.setName("Widget Type"); widgetType.setName("Widget Type");
widgetType.setDescriptor(new ObjectMapper().readValue("{ \"someKey\": \"someValue\" }", JsonNode.class)); widgetType.setDescriptor(JacksonUtil.fromString("{ \"someKey\": \"someValue\" }", JsonNode.class));
WidgetTypeDetails savedWidgetType = widgetTypeService.saveWidgetType(widgetType); WidgetTypeDetails savedWidgetType = widgetTypeService.saveWidgetType(widgetType);
savedWidgetType.setTenantId(TenantId.fromUUID(ModelConstants.NULL_UUID)); savedWidgetType.setTenantId(TenantId.fromUUID(ModelConstants.NULL_UUID));
try { try {
@ -197,7 +197,7 @@ public abstract class BaseWidgetTypeServiceTest extends AbstractServiceTest {
widgetType.setTenantId(tenantId); widgetType.setTenantId(tenantId);
widgetType.setBundleAlias(savedWidgetsBundle.getAlias()); widgetType.setBundleAlias(savedWidgetsBundle.getAlias());
widgetType.setName("Widget Type"); widgetType.setName("Widget Type");
widgetType.setDescriptor(new ObjectMapper().readValue("{ \"someKey\": \"someValue\" }", JsonNode.class)); widgetType.setDescriptor(JacksonUtil.fromString("{ \"someKey\": \"someValue\" }", JsonNode.class));
WidgetTypeDetails savedWidgetType = widgetTypeService.saveWidgetType(widgetType); WidgetTypeDetails savedWidgetType = widgetTypeService.saveWidgetType(widgetType);
savedWidgetType.setBundleAlias("some_alias"); savedWidgetType.setBundleAlias("some_alias");
try { try {
@ -220,7 +220,7 @@ public abstract class BaseWidgetTypeServiceTest extends AbstractServiceTest {
widgetType.setTenantId(tenantId); widgetType.setTenantId(tenantId);
widgetType.setBundleAlias(savedWidgetsBundle.getAlias()); widgetType.setBundleAlias(savedWidgetsBundle.getAlias());
widgetType.setName("Widget Type"); widgetType.setName("Widget Type");
widgetType.setDescriptor(new ObjectMapper().readValue("{ \"someKey\": \"someValue\" }", JsonNode.class)); widgetType.setDescriptor(JacksonUtil.fromString("{ \"someKey\": \"someValue\" }", JsonNode.class));
WidgetTypeDetails savedWidgetType = widgetTypeService.saveWidgetType(widgetType); WidgetTypeDetails savedWidgetType = widgetTypeService.saveWidgetType(widgetType);
savedWidgetType.setAlias("some_alias"); savedWidgetType.setAlias("some_alias");
try { try {
@ -243,7 +243,7 @@ public abstract class BaseWidgetTypeServiceTest extends AbstractServiceTest {
widgetType.setTenantId(tenantId); widgetType.setTenantId(tenantId);
widgetType.setBundleAlias(savedWidgetsBundle.getAlias()); widgetType.setBundleAlias(savedWidgetsBundle.getAlias());
widgetType.setName("Widget Type"); widgetType.setName("Widget Type");
widgetType.setDescriptor(new ObjectMapper().readValue("{ \"someKey\": \"someValue\" }", JsonNode.class)); widgetType.setDescriptor(JacksonUtil.fromString("{ \"someKey\": \"someValue\" }", JsonNode.class));
WidgetTypeDetails savedWidgetType = widgetTypeService.saveWidgetType(widgetType); WidgetTypeDetails savedWidgetType = widgetTypeService.saveWidgetType(widgetType);
WidgetTypeDetails foundWidgetType = widgetTypeService.findWidgetTypeDetailsById(tenantId, savedWidgetType.getId()); WidgetTypeDetails foundWidgetType = widgetTypeService.findWidgetTypeDetailsById(tenantId, savedWidgetType.getId());
Assert.assertNotNull(foundWidgetType); Assert.assertNotNull(foundWidgetType);
@ -263,7 +263,7 @@ public abstract class BaseWidgetTypeServiceTest extends AbstractServiceTest {
widgetType.setTenantId(tenantId); widgetType.setTenantId(tenantId);
widgetType.setBundleAlias(savedWidgetsBundle.getAlias()); widgetType.setBundleAlias(savedWidgetsBundle.getAlias());
widgetType.setName("Widget Type"); widgetType.setName("Widget Type");
widgetType.setDescriptor(new ObjectMapper().readValue("{ \"someKey\": \"someValue\" }", JsonNode.class)); widgetType.setDescriptor(JacksonUtil.fromString("{ \"someKey\": \"someValue\" }", JsonNode.class));
WidgetType savedWidgetType = new WidgetType(widgetTypeService.saveWidgetType(widgetType)); WidgetType savedWidgetType = new WidgetType(widgetTypeService.saveWidgetType(widgetType));
WidgetType foundWidgetType = widgetTypeService.findWidgetTypeByTenantIdBundleAliasAndAlias(tenantId, savedWidgetsBundle.getAlias(), savedWidgetType.getAlias()); WidgetType foundWidgetType = widgetTypeService.findWidgetTypeByTenantIdBundleAliasAndAlias(tenantId, savedWidgetsBundle.getAlias(), savedWidgetType.getAlias());
Assert.assertNotNull(foundWidgetType); Assert.assertNotNull(foundWidgetType);
@ -283,7 +283,7 @@ public abstract class BaseWidgetTypeServiceTest extends AbstractServiceTest {
widgetType.setTenantId(tenantId); widgetType.setTenantId(tenantId);
widgetType.setBundleAlias(savedWidgetsBundle.getAlias()); widgetType.setBundleAlias(savedWidgetsBundle.getAlias());
widgetType.setName("Widget Type"); widgetType.setName("Widget Type");
widgetType.setDescriptor(new ObjectMapper().readValue("{ \"someKey\": \"someValue\" }", JsonNode.class)); widgetType.setDescriptor(JacksonUtil.fromString("{ \"someKey\": \"someValue\" }", JsonNode.class));
WidgetType savedWidgetType = widgetTypeService.saveWidgetType(widgetType); WidgetType savedWidgetType = widgetTypeService.saveWidgetType(widgetType);
WidgetType foundWidgetType = widgetTypeService.findWidgetTypeById(tenantId, savedWidgetType.getId()); WidgetType foundWidgetType = widgetTypeService.findWidgetTypeById(tenantId, savedWidgetType.getId());
Assert.assertNotNull(foundWidgetType); Assert.assertNotNull(foundWidgetType);
@ -307,7 +307,7 @@ public abstract class BaseWidgetTypeServiceTest extends AbstractServiceTest {
widgetType.setTenantId(tenantId); widgetType.setTenantId(tenantId);
widgetType.setBundleAlias(savedWidgetsBundle.getAlias()); widgetType.setBundleAlias(savedWidgetsBundle.getAlias());
widgetType.setName("Widget Type " + i); widgetType.setName("Widget Type " + i);
widgetType.setDescriptor(new ObjectMapper().readValue("{ \"someKey\": \"someValue\" }", JsonNode.class)); widgetType.setDescriptor(JacksonUtil.fromString("{ \"someKey\": \"someValue\" }", JsonNode.class));
widgetTypes.add(new WidgetType(widgetTypeService.saveWidgetType(widgetType))); widgetTypes.add(new WidgetType(widgetTypeService.saveWidgetType(widgetType)));
} }

5
dao/src/test/java/org/thingsboard/server/dao/sql/user/JpaUserDaoTest.java

@ -18,11 +18,11 @@ package org.thingsboard.server.dao.sql.user;
import com.datastax.oss.driver.api.core.uuid.Uuids; import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.User; import org.thingsboard.server.common.data.User;
import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
@ -81,9 +81,8 @@ public class JpaUserDaoTest extends AbstractJpaDaoTest {
user.setEmail("user@thingsboard.org"); user.setEmail("user@thingsboard.org");
user.setFirstName("Jackson"); user.setFirstName("Jackson");
user.setLastName("Roberts"); user.setLastName("Roberts");
ObjectMapper mapper = new ObjectMapper();
String additionalInfo = "{\"key\":\"value-100\"}"; String additionalInfo = "{\"key\":\"value-100\"}";
JsonNode jsonNode = mapper.readTree(additionalInfo); JsonNode jsonNode = JacksonUtil.toJsonNode(additionalInfo);
user.setAdditionalInfo(jsonNode); user.setAdditionalInfo(jsonNode);
userDao.save(AbstractServiceTest.SYSTEM_TENANT_ID, user); userDao.save(AbstractServiceTest.SYSTEM_TENANT_ID, user);
assertEquals(1 + COUNT_SYSADMIN_USER + COUNT_CREATED_USER, userDao.find(AbstractServiceTest.SYSTEM_TENANT_ID).size()); assertEquals(1 + COUNT_SYSADMIN_USER + COUNT_CREATED_USER, userDao.find(AbstractServiceTest.SYSTEM_TENANT_ID).size());

10
rest-client/src/main/java/org/thingsboard/rest/client/RestClient.java

@ -17,7 +17,6 @@ package org.thingsboard.rest.client;
import com.auth0.jwt.JWT; import com.auth0.jwt.JWT;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.ObjectNode;
import org.springframework.core.ParameterizedTypeReference; import org.springframework.core.ParameterizedTypeReference;
import org.springframework.core.io.ByteArrayResource; import org.springframework.core.io.ByteArrayResource;
@ -34,6 +33,7 @@ import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap; import org.springframework.util.MultiValueMap;
import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.HttpClientErrorException;
import org.springframework.web.client.RestTemplate; import org.springframework.web.client.RestTemplate;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.common.util.ThingsBoardExecutors; import org.thingsboard.common.util.ThingsBoardExecutors;
import org.thingsboard.rest.client.utils.RestJsonConverter; import org.thingsboard.rest.client.utils.RestJsonConverter;
import org.thingsboard.server.common.data.AdminSettings; import org.thingsboard.server.common.data.AdminSettings;
@ -187,8 +187,6 @@ public class RestClient implements Closeable {
private static final String JWT_TOKEN_HEADER_PARAM = "X-Authorization"; private static final String JWT_TOKEN_HEADER_PARAM = "X-Authorization";
private static final long AVG_REQUEST_TIMEOUT = TimeUnit.SECONDS.toMillis(30); private static final long AVG_REQUEST_TIMEOUT = TimeUnit.SECONDS.toMillis(30);
protected static final String ACTIVATE_TOKEN_REGEX = "/api/noauth/activate?activateToken="; protected static final String ACTIVATE_TOKEN_REGEX = "/api/noauth/activate?activateToken=";
private final ObjectMapper objectMapper = new ObjectMapper();
private final ExecutorService service = ThingsBoardExecutors.newWorkStealingPool(10, getClass()); private final ExecutorService service = ThingsBoardExecutors.newWorkStealingPool(10, getClass());
protected final RestTemplate restTemplate; protected final RestTemplate restTemplate;
protected final RestTemplate loginRestTemplate; protected final RestTemplate loginRestTemplate;
@ -828,7 +826,7 @@ public class RestClient implements Closeable {
} }
public void changePassword(String currentPassword, String newPassword) { public void changePassword(String currentPassword, String newPassword) {
ObjectNode changePasswordRequest = objectMapper.createObjectNode(); ObjectNode changePasswordRequest = JacksonUtil.newObjectNode();
changePasswordRequest.put("currentPassword", currentPassword); changePasswordRequest.put("currentPassword", currentPassword);
changePasswordRequest.put("newPassword", newPassword); changePasswordRequest.put("newPassword", newPassword);
restTemplate.postForLocation(baseURL + "/api/auth/changePassword", changePasswordRequest); restTemplate.postForLocation(baseURL + "/api/auth/changePassword", changePasswordRequest);
@ -853,7 +851,7 @@ public class RestClient implements Closeable {
} }
public void requestResetPasswordByEmail(String email) { public void requestResetPasswordByEmail(String email) {
ObjectNode resetPasswordByEmailRequest = objectMapper.createObjectNode(); ObjectNode resetPasswordByEmailRequest = JacksonUtil.newObjectNode();
resetPasswordByEmailRequest.put("email", email); resetPasswordByEmailRequest.put("email", email);
restTemplate.postForLocation(baseURL + "/api/noauth/resetPasswordByEmail", resetPasswordByEmailRequest); restTemplate.postForLocation(baseURL + "/api/noauth/resetPasswordByEmail", resetPasswordByEmailRequest);
} }
@ -863,7 +861,7 @@ public class RestClient implements Closeable {
} }
public Optional<JsonNode> activateUser(UserId userId, String password, boolean sendActivationMail) { public Optional<JsonNode> activateUser(UserId userId, String password, boolean sendActivationMail) {
ObjectNode activateRequest = objectMapper.createObjectNode(); ObjectNode activateRequest = JacksonUtil.newObjectNode();
activateRequest.put("activateToken", getActivateToken(userId)); activateRequest.put("activateToken", getActivateToken(userId));
activateRequest.put("password", password); activateRequest.put("password", password);
try { try {

9
rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/util/TbNodeUtils.java

@ -17,8 +17,8 @@ package org.thingsboard.rule.engine.api.util;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.rule.engine.api.TbNodeConfiguration; import org.thingsboard.rule.engine.api.TbNodeConfiguration;
import org.thingsboard.rule.engine.api.TbNodeException; import org.thingsboard.rule.engine.api.TbNodeException;
import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.StringUtils;
@ -37,14 +37,13 @@ import java.util.stream.Collectors;
*/ */
public class TbNodeUtils { public class TbNodeUtils {
private static final ObjectMapper mapper = new ObjectMapper();
private static final Pattern DATA_PATTERN = Pattern.compile("(\\$\\[)(.*?)(])"); private static final Pattern DATA_PATTERN = Pattern.compile("(\\$\\[)(.*?)(])");
public static <T> T convert(TbNodeConfiguration configuration, Class<T> clazz) throws TbNodeException { public static <T> T convert(TbNodeConfiguration configuration, Class<T> clazz) throws TbNodeException {
try { try {
return mapper.treeToValue(configuration.getData(), clazz); return JacksonUtil.treeToValue(configuration.getData(), clazz);
} catch (JsonProcessingException e) { } catch (IllegalArgumentException e) {
throw new TbNodeException(e); throw new TbNodeException(e);
} }
} }
@ -59,7 +58,7 @@ public class TbNodeUtils {
public static String processPattern(String pattern, TbMsg tbMsg) { public static String processPattern(String pattern, TbMsg tbMsg) {
try { try {
String result = processPattern(pattern, tbMsg.getMetaData()); String result = processPattern(pattern, tbMsg.getMetaData());
JsonNode json = mapper.readTree(tbMsg.getData()); JsonNode json = JacksonUtil.toJsonNode(tbMsg.getData());
if (json.isObject()) { if (json.isObject()) {
Matcher matcher = DATA_PATTERN.matcher(result); Matcher matcher = DATA_PATTERN.matcher(result);
while (matcher.find()) { while (matcher.find()) {

5
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbAbstractAlarmNode.java

@ -16,7 +16,6 @@
package org.thingsboard.rule.engine.action; package org.thingsboard.rule.engine.action;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -39,8 +38,6 @@ public abstract class TbAbstractAlarmNode<C extends TbAbstractAlarmNodeConfigura
static final String PREV_ALARM_DETAILS = "prevAlarmDetails"; static final String PREV_ALARM_DETAILS = "prevAlarmDetails";
private final ObjectMapper mapper = new ObjectMapper();
protected C config; protected C config;
private ScriptEngine scriptEngine; private ScriptEngine scriptEngine;
@ -79,7 +76,7 @@ public abstract class TbAbstractAlarmNode<C extends TbAbstractAlarmNodeConfigura
TbMsg dummyMsg = msg; TbMsg dummyMsg = msg;
if (previousDetails != null) { if (previousDetails != null) {
TbMsgMetaData metaData = msg.getMetaData().copy(); TbMsgMetaData metaData = msg.getMetaData().copy();
metaData.putValue(PREV_ALARM_DETAILS, mapper.writeValueAsString(previousDetails)); metaData.putValue(PREV_ALARM_DETAILS, JacksonUtil.toString(previousDetails));
dummyMsg = ctx.transformMsg(msg, msg.getType(), msg.getOriginator(), metaData, msg.getData()); dummyMsg = ctx.transformMsg(msg, msg.getType(), msg.getOriginator(), metaData, msg.getData());
} }
return scriptEngine.executeJsonAsync(dummyMsg); return scriptEngine.executeJsonAsync(dummyMsg);

5
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/action/TbCreateAlarmNode.java

@ -16,12 +16,12 @@
package org.thingsboard.rule.engine.action; package org.thingsboard.rule.engine.action;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.MoreExecutors; import com.google.common.util.concurrent.MoreExecutors;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.EnumUtils; import org.apache.commons.lang3.EnumUtils;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.rule.engine.api.RuleNode; import org.thingsboard.rule.engine.api.RuleNode;
import org.thingsboard.rule.engine.api.TbContext; import org.thingsboard.rule.engine.api.TbContext;
import org.thingsboard.rule.engine.api.TbNodeConfiguration; import org.thingsboard.rule.engine.api.TbNodeConfiguration;
@ -57,7 +57,6 @@ import java.util.List;
) )
public class TbCreateAlarmNode extends TbAbstractAlarmNode<TbCreateAlarmNodeConfiguration> { public class TbCreateAlarmNode extends TbAbstractAlarmNode<TbCreateAlarmNodeConfiguration> {
private static final ObjectMapper mapper = new ObjectMapper();
private List<String> relationTypes; private List<String> relationTypes;
private AlarmSeverity notDynamicAlarmSeverity; private AlarmSeverity notDynamicAlarmSeverity;
@ -108,7 +107,7 @@ public class TbCreateAlarmNode extends TbAbstractAlarmNode<TbCreateAlarmNodeConf
private Alarm getAlarmFromMessage(TbContext ctx, TbMsg msg) throws IOException { private Alarm getAlarmFromMessage(TbContext ctx, TbMsg msg) throws IOException {
Alarm msgAlarm; Alarm msgAlarm;
msgAlarm = mapper.readValue(msg.getData(), Alarm.class); msgAlarm = JacksonUtil.fromString(msg.getData(), Alarm.class);
msgAlarm.setTenantId(ctx.getTenantId()); msgAlarm.setTenantId(ctx.getTenantId());
if (msgAlarm.getOriginator() == null) { if (msgAlarm.getOriginator() == null) {
msgAlarm.setOriginator(msg.getOriginator()); msgAlarm.setOriginator(msg.getOriginator());

7
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/filter/TbCheckAlarmStatusNode.java

@ -15,12 +15,12 @@
*/ */
package org.thingsboard.rule.engine.filter; package org.thingsboard.rule.engine.filter;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.MoreExecutors; import com.google.common.util.concurrent.MoreExecutors;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.rule.engine.api.RuleNode; import org.thingsboard.rule.engine.api.RuleNode;
import org.thingsboard.rule.engine.api.TbContext; import org.thingsboard.rule.engine.api.TbContext;
import org.thingsboard.rule.engine.api.TbNode; import org.thingsboard.rule.engine.api.TbNode;
@ -47,7 +47,6 @@ import java.io.IOException;
configDirective = "tbFilterNodeCheckAlarmStatusConfig") configDirective = "tbFilterNodeCheckAlarmStatusConfig")
public class TbCheckAlarmStatusNode implements TbNode { public class TbCheckAlarmStatusNode implements TbNode {
private TbCheckAlarmStatusNodeConfig config; private TbCheckAlarmStatusNodeConfig config;
private final ObjectMapper mapper = new ObjectMapper();
@Override @Override
public void init(TbContext tbContext, TbNodeConfiguration configuration) throws TbNodeException { public void init(TbContext tbContext, TbNodeConfiguration configuration) throws TbNodeException {
@ -57,7 +56,7 @@ public class TbCheckAlarmStatusNode implements TbNode {
@Override @Override
public void onMsg(TbContext ctx, TbMsg msg) throws TbNodeException { public void onMsg(TbContext ctx, TbMsg msg) throws TbNodeException {
try { try {
Alarm alarm = mapper.readValue(msg.getData(), Alarm.class); Alarm alarm = JacksonUtil.fromString(msg.getData(), Alarm.class);
ListenableFuture<Alarm> latest = ctx.getAlarmService().findAlarmByIdAsync(ctx.getTenantId(), alarm.getId()); ListenableFuture<Alarm> latest = ctx.getAlarmService().findAlarmByIdAsync(ctx.getTenantId(), alarm.getId());
@ -87,7 +86,7 @@ public class TbCheckAlarmStatusNode implements TbNode {
ctx.tellFailure(msg, t); ctx.tellFailure(msg, t);
} }
}, MoreExecutors.directExecutor()); }, MoreExecutors.directExecutor());
} catch (IOException e) { } catch (IllegalArgumentException e) {
log.error("Failed to parse alarm: [{}]", msg.getData()); log.error("Failed to parse alarm: [{}]", msg.getData());
throw new TbNodeException(e); throw new TbNodeException(e);
} }

7
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/mail/TbMsgToEmailNode.java

@ -17,8 +17,8 @@ package org.thingsboard.rule.engine.mail;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.rule.engine.api.RuleNode; import org.thingsboard.rule.engine.api.RuleNode;
import org.thingsboard.rule.engine.api.TbContext; import org.thingsboard.rule.engine.api.TbContext;
@ -51,7 +51,6 @@ import static org.thingsboard.rule.engine.mail.TbSendEmailNode.SEND_EMAIL_TYPE;
) )
public class TbMsgToEmailNode implements TbNode { public class TbMsgToEmailNode implements TbNode {
private static final ObjectMapper MAPPER = new ObjectMapper();
private static final String IMAGES = "images"; private static final String IMAGES = "images";
private static final String DYNAMIC = "dynamic"; private static final String DYNAMIC = "dynamic";
@ -77,7 +76,7 @@ public class TbMsgToEmailNode implements TbNode {
} }
private TbMsg buildEmailMsg(TbContext ctx, TbMsg msg, TbEmail email) throws JsonProcessingException { private TbMsg buildEmailMsg(TbContext ctx, TbMsg msg, TbEmail email) throws JsonProcessingException {
String emailJson = MAPPER.writeValueAsString(email); String emailJson = JacksonUtil.toString(email);
return ctx.transformMsg(msg, SEND_EMAIL_TYPE, msg.getOriginator(), msg.getMetaData().copy(), emailJson); return ctx.transformMsg(msg, SEND_EMAIL_TYPE, msg.getOriginator(), msg.getMetaData().copy(), emailJson);
} }
@ -96,7 +95,7 @@ public class TbMsgToEmailNode implements TbNode {
builder.body(fromTemplate(this.config.getBodyTemplate(), msg)); builder.body(fromTemplate(this.config.getBodyTemplate(), msg));
String imagesStr = msg.getMetaData().getValue(IMAGES); String imagesStr = msg.getMetaData().getValue(IMAGES);
if (!StringUtils.isEmpty(imagesStr)) { if (!StringUtils.isEmpty(imagesStr)) {
Map<String, String> imgMap = MAPPER.readValue(imagesStr, new TypeReference<HashMap<String, String>>() {}); Map<String, String> imgMap = JacksonUtil.fromString(imagesStr, new TypeReference<HashMap<String, String>>() {});
builder.images(imgMap); builder.images(imgMap);
} }
return builder.build(); return builder.build();

6
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/mail/TbSendEmailNode.java

@ -15,8 +15,8 @@
*/ */
package org.thingsboard.rule.engine.mail; package org.thingsboard.rule.engine.mail;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.StringUtils;
import org.springframework.mail.javamail.JavaMailSenderImpl; import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.thingsboard.rule.engine.api.RuleNode; import org.thingsboard.rule.engine.api.RuleNode;
@ -51,8 +51,6 @@ public class TbSendEmailNode implements TbNode {
private static final String MAIL_PROP = "mail."; private static final String MAIL_PROP = "mail.";
static final String SEND_EMAIL_TYPE = "SEND_EMAIL"; static final String SEND_EMAIL_TYPE = "SEND_EMAIL";
private static final ObjectMapper MAPPER = new ObjectMapper();
private TbSendEmailNodeConfiguration config; private TbSendEmailNodeConfiguration config;
private JavaMailSenderImpl mailSender; private JavaMailSenderImpl mailSender;
@ -93,7 +91,7 @@ public class TbSendEmailNode implements TbNode {
} }
private TbEmail getEmail(TbMsg msg) throws IOException { private TbEmail getEmail(TbMsg msg) throws IOException {
TbEmail email = MAPPER.readValue(msg.getData(), TbEmail.class); TbEmail email = JacksonUtil.fromString(msg.getData(), TbEmail.class);
if (StringUtils.isBlank(email.getTo())) { if (StringUtils.isBlank(email.getTo())) {
throw new IllegalStateException("Email destination can not be blank [" + email.getTo() + "]"); throw new IllegalStateException("Email destination can not be blank [" + email.getTo() + "]");
} }

33
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbAlarmNodeTest.java

@ -17,7 +17,6 @@ package org.thingsboard.rule.engine.action;
import com.datastax.oss.driver.api.core.uuid.Uuids; import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
import org.apache.commons.lang3.NotImplementedException; import org.apache.commons.lang3.NotImplementedException;
@ -28,6 +27,7 @@ import org.mockito.ArgumentCaptor;
import org.mockito.Captor; import org.mockito.Captor;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner; import org.mockito.junit.MockitoJUnitRunner;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.common.util.ListeningExecutor; import org.thingsboard.common.util.ListeningExecutor;
import org.thingsboard.rule.engine.api.RuleEngineAlarmService; import org.thingsboard.rule.engine.api.RuleEngineAlarmService;
import org.thingsboard.rule.engine.api.ScriptEngine; import org.thingsboard.rule.engine.api.ScriptEngine;
@ -166,7 +166,7 @@ public class TbAlarmNodeTest {
assertEquals(Boolean.TRUE.toString(), metadataCaptor.getValue().getValue(IS_NEW_ALARM)); assertEquals(Boolean.TRUE.toString(), metadataCaptor.getValue().getValue(IS_NEW_ALARM));
assertNotSame(metaData, metadataCaptor.getValue()); assertNotSame(metaData, metadataCaptor.getValue());
Alarm actualAlarm = new ObjectMapper().readValue(dataCaptor.getValue().getBytes(), Alarm.class); Alarm actualAlarm = JacksonUtil.fromBytes(dataCaptor.getValue().getBytes(), Alarm.class);
assertEquals(expectedAlarm, actualAlarm); assertEquals(expectedAlarm, actualAlarm);
} }
@ -241,7 +241,7 @@ public class TbAlarmNodeTest {
assertNotSame(metaData, metadataCaptor.getValue()); assertNotSame(metaData, metadataCaptor.getValue());
Alarm actualAlarm = new ObjectMapper().readValue(dataCaptor.getValue().getBytes(), Alarm.class); Alarm actualAlarm = JacksonUtil.fromBytes(dataCaptor.getValue().getBytes(), Alarm.class);
assertEquals(expectedAlarm, actualAlarm); assertEquals(expectedAlarm, actualAlarm);
} }
@ -291,7 +291,7 @@ public class TbAlarmNodeTest {
assertEquals(Boolean.TRUE.toString(), metadataCaptor.getValue().getValue(IS_EXISTING_ALARM)); assertEquals(Boolean.TRUE.toString(), metadataCaptor.getValue().getValue(IS_EXISTING_ALARM));
assertNotSame(metaData, metadataCaptor.getValue()); assertNotSame(metaData, metadataCaptor.getValue());
Alarm actualAlarm = new ObjectMapper().readValue(dataCaptor.getValue().getBytes(), Alarm.class); Alarm actualAlarm = JacksonUtil.fromBytes(dataCaptor.getValue().getBytes(), Alarm.class);
assertTrue(activeAlarm.getEndTs() >= oldEndDate); assertTrue(activeAlarm.getEndTs() >= oldEndDate);
assertEquals(expectedAlarm, actualAlarm); assertEquals(expectedAlarm, actualAlarm);
} }
@ -344,7 +344,7 @@ public class TbAlarmNodeTest {
assertEquals(Boolean.TRUE.toString(), metadataCaptor.getValue().getValue(IS_CLEARED_ALARM)); assertEquals(Boolean.TRUE.toString(), metadataCaptor.getValue().getValue(IS_CLEARED_ALARM));
assertNotSame(metaData, metadataCaptor.getValue()); assertNotSame(metaData, metadataCaptor.getValue());
Alarm actualAlarm = new ObjectMapper().readValue(dataCaptor.getValue().getBytes(), Alarm.class); Alarm actualAlarm = JacksonUtil.fromBytes(dataCaptor.getValue().getBytes(), Alarm.class);
assertEquals(expectedAlarm, actualAlarm); assertEquals(expectedAlarm, actualAlarm);
} }
@ -399,7 +399,7 @@ public class TbAlarmNodeTest {
assertEquals(Boolean.TRUE.toString(), metadataCaptor.getValue().getValue(IS_CLEARED_ALARM)); assertEquals(Boolean.TRUE.toString(), metadataCaptor.getValue().getValue(IS_CLEARED_ALARM));
assertNotSame(metaData, metadataCaptor.getValue()); assertNotSame(metaData, metadataCaptor.getValue());
Alarm actualAlarm = new ObjectMapper().readValue(dataCaptor.getValue().getBytes(), Alarm.class); Alarm actualAlarm = JacksonUtil.fromBytes(dataCaptor.getValue().getBytes(), Alarm.class);
assertEquals(expectedAlarm, actualAlarm); assertEquals(expectedAlarm, actualAlarm);
} }
@ -412,8 +412,7 @@ public class TbAlarmNodeTest {
config.setScriptLang(ScriptLanguage.JS); config.setScriptLang(ScriptLanguage.JS);
config.setAlarmDetailsBuildJs("DETAILS"); config.setAlarmDetailsBuildJs("DETAILS");
config.setDynamicSeverity(true); config.setDynamicSeverity(true);
ObjectMapper mapper = new ObjectMapper(); TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(JacksonUtil.valueToTree(config));
TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config));
when(ctx.createScriptEngine(ScriptLanguage.JS, "DETAILS")).thenReturn(detailsJs); when(ctx.createScriptEngine(ScriptLanguage.JS, "DETAILS")).thenReturn(detailsJs);
@ -467,7 +466,7 @@ public class TbAlarmNodeTest {
assertEquals(Boolean.TRUE.toString(), metadataCaptor.getValue().getValue(IS_NEW_ALARM)); assertEquals(Boolean.TRUE.toString(), metadataCaptor.getValue().getValue(IS_NEW_ALARM));
assertNotSame(metaData, metadataCaptor.getValue()); assertNotSame(metaData, metadataCaptor.getValue());
Alarm actualAlarm = new ObjectMapper().readValue(dataCaptor.getValue().getBytes(), Alarm.class); Alarm actualAlarm = JacksonUtil.fromBytes(dataCaptor.getValue().getBytes(), Alarm.class);
assertEquals(expectedAlarm, actualAlarm); assertEquals(expectedAlarm, actualAlarm);
} }
@ -480,8 +479,7 @@ public class TbAlarmNodeTest {
config.setAlarmType("SomeType"); config.setAlarmType("SomeType");
config.setAlarmDetailsBuildJs("DETAILS"); config.setAlarmDetailsBuildJs("DETAILS");
config.setDynamicSeverity(true); config.setDynamicSeverity(true);
ObjectMapper mapper = new ObjectMapper(); TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(JacksonUtil.valueToTree(config));
TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config));
when(ctx.createScriptEngine(ScriptLanguage.JS, "DETAILS")).thenReturn(detailsJs); when(ctx.createScriptEngine(ScriptLanguage.JS, "DETAILS")).thenReturn(detailsJs);
@ -533,7 +531,7 @@ public class TbAlarmNodeTest {
assertEquals(Boolean.TRUE.toString(), metadataCaptor.getValue().getValue(IS_NEW_ALARM)); assertEquals(Boolean.TRUE.toString(), metadataCaptor.getValue().getValue(IS_NEW_ALARM));
assertNotSame(metaData, metadataCaptor.getValue()); assertNotSame(metaData, metadataCaptor.getValue());
Alarm actualAlarm = new ObjectMapper().readValue(dataCaptor.getValue().getBytes(), Alarm.class); Alarm actualAlarm = JacksonUtil.fromBytes(dataCaptor.getValue().getBytes(), Alarm.class);
assertEquals(expectedAlarm, actualAlarm); assertEquals(expectedAlarm, actualAlarm);
} }
@ -547,8 +545,7 @@ public class TbAlarmNodeTest {
config.setScriptLang(ScriptLanguage.JS); config.setScriptLang(ScriptLanguage.JS);
config.setAlarmDetailsBuildJs("DETAILS"); config.setAlarmDetailsBuildJs("DETAILS");
config.setDynamicSeverity(true); config.setDynamicSeverity(true);
ObjectMapper mapper = new ObjectMapper(); TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(JacksonUtil.valueToTree(config));
TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config));
when(ctx.createScriptEngine(ScriptLanguage.JS, "DETAILS")).thenReturn(detailsJs); when(ctx.createScriptEngine(ScriptLanguage.JS, "DETAILS")).thenReturn(detailsJs);
@ -600,7 +597,7 @@ public class TbAlarmNodeTest {
assertEquals(Boolean.TRUE.toString(), metadataCaptor.getValue().getValue(IS_NEW_ALARM)); assertEquals(Boolean.TRUE.toString(), metadataCaptor.getValue().getValue(IS_NEW_ALARM));
assertNotSame(metaData, metadataCaptor.getValue()); assertNotSame(metaData, metadataCaptor.getValue());
Alarm actualAlarm = new ObjectMapper().readValue(dataCaptor.getValue().getBytes(), Alarm.class); Alarm actualAlarm = JacksonUtil.fromBytes(dataCaptor.getValue().getBytes(), Alarm.class);
assertEquals(expectedAlarm, actualAlarm); assertEquals(expectedAlarm, actualAlarm);
} }
} }
@ -613,8 +610,7 @@ public class TbAlarmNodeTest {
config.setAlarmType("SomeType"); config.setAlarmType("SomeType");
config.setScriptLang(ScriptLanguage.JS); config.setScriptLang(ScriptLanguage.JS);
config.setAlarmDetailsBuildJs("DETAILS"); config.setAlarmDetailsBuildJs("DETAILS");
ObjectMapper mapper = new ObjectMapper(); TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(JacksonUtil.valueToTree(config));
TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config));
when(ctx.createScriptEngine(ScriptLanguage.JS, "DETAILS")).thenReturn(detailsJs); when(ctx.createScriptEngine(ScriptLanguage.JS, "DETAILS")).thenReturn(detailsJs);
@ -635,8 +631,7 @@ public class TbAlarmNodeTest {
config.setAlarmType("SomeType"); config.setAlarmType("SomeType");
config.setScriptLang(ScriptLanguage.JS); config.setScriptLang(ScriptLanguage.JS);
config.setAlarmDetailsBuildJs("DETAILS"); config.setAlarmDetailsBuildJs("DETAILS");
ObjectMapper mapper = new ObjectMapper(); TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(JacksonUtil.valueToTree(config));
TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config));
when(ctx.createScriptEngine(ScriptLanguage.JS, "DETAILS")).thenReturn(detailsJs); when(ctx.createScriptEngine(ScriptLanguage.JS, "DETAILS")).thenReturn(detailsJs);

5
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/action/TbCreateRelationNodeTest.java

@ -16,7 +16,6 @@
package org.thingsboard.rule.engine.action; package org.thingsboard.rule.engine.action;
import com.datastax.oss.driver.api.core.uuid.Uuids; import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
import org.junit.Before; import org.junit.Before;
@ -25,6 +24,7 @@ import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner; import org.mockito.junit.MockitoJUnitRunner;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.common.util.ListeningExecutor; import org.thingsboard.common.util.ListeningExecutor;
import org.thingsboard.rule.engine.api.TbContext; import org.thingsboard.rule.engine.api.TbContext;
import org.thingsboard.rule.engine.api.TbNodeConfiguration; import org.thingsboard.rule.engine.api.TbNodeConfiguration;
@ -188,8 +188,7 @@ public class TbCreateRelationNodeTest {
} }
public void init(TbCreateRelationNodeConfiguration configuration) throws TbNodeException { public void init(TbCreateRelationNodeConfiguration configuration) throws TbNodeException {
ObjectMapper mapper = new ObjectMapper(); TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(JacksonUtil.valueToTree(configuration));
TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(configuration));
when(ctx.getDbCallbackExecutor()).thenReturn(dbExecutor); when(ctx.getDbCallbackExecutor()).thenReturn(dbExecutor);
when(ctx.getRelationService()).thenReturn(relationService); when(ctx.getRelationService()).thenReturn(relationService);

11
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbJsFilterNodeTest.java

@ -16,17 +16,13 @@
package org.thingsboard.rule.engine.filter; package org.thingsboard.rule.engine.filter;
import com.datastax.oss.driver.api.core.uuid.Uuids; import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
import org.mockito.ArgumentMatchers;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner; import org.mockito.junit.MockitoJUnitRunner;
import org.mockito.stubbing.Answer; import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.common.util.ListeningExecutor;
import org.thingsboard.rule.engine.api.ScriptEngine; import org.thingsboard.rule.engine.api.ScriptEngine;
import org.thingsboard.rule.engine.api.TbContext; import org.thingsboard.rule.engine.api.TbContext;
import org.thingsboard.rule.engine.api.TbNodeConfiguration; import org.thingsboard.rule.engine.api.TbNodeConfiguration;
@ -39,10 +35,8 @@ import org.thingsboard.server.common.msg.TbMsgDataType;
import org.thingsboard.server.common.msg.TbMsgMetaData; import org.thingsboard.server.common.msg.TbMsgMetaData;
import javax.script.ScriptException; import javax.script.ScriptException;
import java.util.concurrent.Callable;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.same; import static org.mockito.Mockito.same;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@ -99,8 +93,7 @@ public class TbJsFilterNodeTest {
TbJsFilterNodeConfiguration config = new TbJsFilterNodeConfiguration(); TbJsFilterNodeConfiguration config = new TbJsFilterNodeConfiguration();
config.setScriptLang(ScriptLanguage.JS); config.setScriptLang(ScriptLanguage.JS);
config.setJsScript("scr"); config.setJsScript("scr");
ObjectMapper mapper = new ObjectMapper(); TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(JacksonUtil.valueToTree(config));
TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config));
when(ctx.createScriptEngine(ScriptLanguage.JS, "scr")).thenReturn(scriptEngine); when(ctx.createScriptEngine(ScriptLanguage.JS, "scr")).thenReturn(scriptEngine);

17
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/filter/TbJsSwitchNodeTest.java

@ -16,18 +16,13 @@
package org.thingsboard.rule.engine.filter; package org.thingsboard.rule.engine.filter;
import com.datastax.oss.driver.api.core.uuid.Uuids; import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.ArgumentMatchers;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner; import org.mockito.junit.MockitoJUnitRunner;
import org.mockito.stubbing.Answer; import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.common.util.ListeningExecutor;
import org.thingsboard.rule.engine.api.ScriptEngine; import org.thingsboard.rule.engine.api.ScriptEngine;
import org.thingsboard.rule.engine.api.TbContext; import org.thingsboard.rule.engine.api.TbContext;
import org.thingsboard.rule.engine.api.TbNodeConfiguration; import org.thingsboard.rule.engine.api.TbNodeConfiguration;
@ -39,13 +34,6 @@ import org.thingsboard.server.common.msg.TbMsg;
import org.thingsboard.server.common.msg.TbMsgDataType; import org.thingsboard.server.common.msg.TbMsgDataType;
import org.thingsboard.server.common.msg.TbMsgMetaData; import org.thingsboard.server.common.msg.TbMsgMetaData;
import javax.script.ScriptException;
import java.util.Set;
import java.util.concurrent.Callable;
import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.same;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@ -81,8 +69,7 @@ public class TbJsSwitchNodeTest {
TbJsSwitchNodeConfiguration config = new TbJsSwitchNodeConfiguration(); TbJsSwitchNodeConfiguration config = new TbJsSwitchNodeConfiguration();
config.setScriptLang(ScriptLanguage.JS); config.setScriptLang(ScriptLanguage.JS);
config.setJsScript("scr"); config.setJsScript("scr");
ObjectMapper mapper = new ObjectMapper(); TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(JacksonUtil.valueToTree(config));
TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config));
when(ctx.createScriptEngine(ScriptLanguage.JS, "scr")).thenReturn(scriptEngine); when(ctx.createScriptEngine(ScriptLanguage.JS, "scr")).thenReturn(scriptEngine);

7
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/mail/TbMsgToEmailNodeTest.java

@ -16,12 +16,12 @@
package org.thingsboard.rule.engine.mail; package org.thingsboard.rule.engine.mail;
import com.datastax.oss.driver.api.core.uuid.Uuids; import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner; import org.mockito.junit.MockitoJUnitRunner;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.rule.engine.api.TbContext; import org.thingsboard.rule.engine.api.TbContext;
import org.thingsboard.rule.engine.api.TbEmail; import org.thingsboard.rule.engine.api.TbEmail;
import org.thingsboard.rule.engine.api.TbNodeConfiguration; import org.thingsboard.rule.engine.api.TbNodeConfiguration;
@ -80,7 +80,7 @@ public class TbMsgToEmailNodeTest {
assertEquals("oreo", metadataCaptor.getValue().getValue("username")); assertEquals("oreo", metadataCaptor.getValue().getValue("username"));
assertNotSame(metaData, metadataCaptor.getValue()); assertNotSame(metaData, metadataCaptor.getValue());
TbEmail actual = new ObjectMapper().readValue(dataCaptor.getValue().getBytes(), TbEmail.class); TbEmail actual = JacksonUtil.fromBytes(dataCaptor.getValue().getBytes(), TbEmail.class);
TbEmail expected = TbEmail.builder() TbEmail expected = TbEmail.builder()
.from("test@mail.org") .from("test@mail.org")
@ -99,8 +99,7 @@ public class TbMsgToEmailNodeTest {
config.setSubjectTemplate("Hi ${username} there"); config.setSubjectTemplate("Hi ${username} there");
config.setBodyTemplate("${name} is to high. Current ${passed} and ${count}"); config.setBodyTemplate("${name} is to high. Current ${passed} and ${count}");
config.setMailBodyType("false"); config.setMailBodyType("false");
ObjectMapper mapper = new ObjectMapper(); TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(JacksonUtil.valueToTree(config));
TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config));
emailNode = new TbMsgToEmailNode(); emailNode = new TbMsgToEmailNode();
emailNode.init(ctx, nodeConfiguration); emailNode.init(ctx, nodeConfiguration);

7
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/AbstractAttributeNodeTest.java

@ -16,7 +16,6 @@
package org.thingsboard.rule.engine.metadata; package org.thingsboard.rule.engine.metadata;
import com.datastax.oss.driver.api.core.uuid.Uuids; import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.Futures;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@ -89,8 +88,7 @@ public abstract class AbstractAttributeNodeTest {
TbEntityGetAttrNode node; TbEntityGetAttrNode node;
void init(TbEntityGetAttrNode node) throws TbNodeException { void init(TbEntityGetAttrNode node) throws TbNodeException {
ObjectMapper mapper = JacksonUtil.OBJECT_MAPPER; TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(JacksonUtil.valueToTree(getTbNodeConfig()));
TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(getTbNodeConfig()));
metaData = new HashMap<>(); metaData = new HashMap<>();
metaData.putIfAbsent("word", "temperature"); metaData.putIfAbsent("word", "temperature");
@ -165,8 +163,7 @@ public abstract class AbstractAttributeNodeTest {
} }
void deviceCustomerTelemetryFetched(Device device) throws TbNodeException { void deviceCustomerTelemetryFetched(Device device) throws TbNodeException {
ObjectMapper mapper = JacksonUtil.OBJECT_MAPPER; TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(JacksonUtil.valueToTree(getTbNodeConfigForTelemetry()));
TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(getTbNodeConfigForTelemetry()));
TbEntityGetAttrNode node = getEmptyNode(); TbEntityGetAttrNode node = getEmptyNode();
node.init(null, nodeConfiguration); node.init(null, nodeConfiguration);

5
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbAbstractGetAttributesNodeTest.java

@ -17,7 +17,6 @@ package org.thingsboard.rule.engine.metadata;
import com.datastax.oss.driver.api.core.uuid.Uuids; import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.ObjectNode;
import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.Futures;
import org.junit.After; import org.junit.After;
@ -60,8 +59,6 @@ import static org.mockito.Mockito.never;
@RunWith(MockitoJUnitRunner.class) @RunWith(MockitoJUnitRunner.class)
public class TbAbstractGetAttributesNodeTest { public class TbAbstractGetAttributesNodeTest {
final ObjectMapper mapper = new ObjectMapper();
private EntityId originator = new DeviceId(Uuids.timeBased()); private EntityId originator = new DeviceId(Uuids.timeBased());
private TenantId tenantId = TenantId.fromUUID(Uuids.timeBased()); private TenantId tenantId = TenantId.fromUUID(Uuids.timeBased());
@ -322,7 +319,7 @@ public class TbAbstractGetAttributesNodeTest {
config.setFetchToData(fetchToData); config.setFetchToData(fetchToData);
config.setGetLatestValueWithTs(getLatestValueWithTs); config.setGetLatestValueWithTs(getLatestValueWithTs);
config.setTellFailureIfAbsent(isTellFailureIfAbsent); config.setTellFailureIfAbsent(isTellFailureIfAbsent);
TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config)); TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(JacksonUtil.valueToTree(config));
TbGetAttributesNode node = new TbGetAttributesNode(); TbGetAttributesNode node = new TbGetAttributesNode();
node.init(ctx, nodeConfiguration); node.init(ctx, nodeConfiguration);
return node; return node;

5
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbFetchDeviceCredentialsNodeTest.java

@ -15,7 +15,6 @@
*/ */
package org.thingsboard.rule.engine.metadata; package org.thingsboard.rule.engine.metadata;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -48,8 +47,6 @@ import static org.mockito.Mockito.verify;
import static org.thingsboard.server.common.data.security.DeviceCredentialsType.ACCESS_TOKEN; import static org.thingsboard.server.common.data.security.DeviceCredentialsType.ACCESS_TOKEN;
public class TbFetchDeviceCredentialsNodeTest { public class TbFetchDeviceCredentialsNodeTest {
final ObjectMapper mapper = new ObjectMapper();
DeviceId deviceId; DeviceId deviceId;
TbFetchDeviceCredentialsNode node; TbFetchDeviceCredentialsNode node;
TbFetchDeviceCredentialsNodeConfiguration config; TbFetchDeviceCredentialsNodeConfiguration config;
@ -65,7 +62,7 @@ public class TbFetchDeviceCredentialsNodeTest {
ctx = mock(TbContext.class); ctx = mock(TbContext.class);
config = new TbFetchDeviceCredentialsNodeConfiguration().defaultConfiguration(); config = new TbFetchDeviceCredentialsNodeConfiguration().defaultConfiguration();
config.setFetchToMetadata(true); config.setFetchToMetadata(true);
nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config)); nodeConfiguration = new TbNodeConfiguration(JacksonUtil.valueToTree(config));
node = spy(new TbFetchDeviceCredentialsNode()); node = spy(new TbFetchDeviceCredentialsNode());
node.init(ctx, nodeConfiguration); node.init(ctx, nodeConfiguration);
deviceCredentialsService = mock(DeviceCredentialsService.class); deviceCredentialsService = mock(DeviceCredentialsService.class);

4
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/metadata/TbGetTelemetryNodeTest.java

@ -15,7 +15,6 @@
*/ */
package org.thingsboard.rule.engine.metadata; package org.thingsboard.rule.engine.metadata;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
@ -44,8 +43,7 @@ public class TbGetTelemetryNodeTest {
node = spy(new TbGetTelemetryNode()); node = spy(new TbGetTelemetryNode());
config = new TbGetTelemetryNodeConfiguration(); config = new TbGetTelemetryNodeConfiguration();
config.setFetchMode("ALL"); config.setFetchMode("ALL");
ObjectMapper mapper = JacksonUtil.OBJECT_MAPPER; nodeConfiguration = new TbNodeConfiguration(JacksonUtil.valueToTree(config));
nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config));
node.init(ctx, nodeConfiguration); node.init(ctx, nodeConfiguration);
willCallRealMethod().given(node).parseAggregationConfig(any()); willCallRealMethod().given(node).parseAggregationConfig(any());

90
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/profile/TbDeviceProfileNodeTest.java

@ -15,7 +15,6 @@
*/ */
package org.thingsboard.rule.engine.profile; package org.thingsboard.rule.engine.profile;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.ObjectNode;
import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
@ -24,6 +23,7 @@ import org.junit.runner.RunWith;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.Mockito; import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner; import org.mockito.junit.MockitoJUnitRunner;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.rule.engine.api.RuleEngineAlarmService; import org.thingsboard.rule.engine.api.RuleEngineAlarmService;
import org.thingsboard.rule.engine.api.RuleEngineDeviceProfileCache; import org.thingsboard.rule.engine.api.RuleEngineDeviceProfileCache;
import org.thingsboard.rule.engine.api.TbContext; import org.thingsboard.rule.engine.api.TbContext;
@ -90,8 +90,6 @@ import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class) @RunWith(MockitoJUnitRunner.class)
public class TbDeviceProfileNodeTest { public class TbDeviceProfileNodeTest {
private static final ObjectMapper mapper = new ObjectMapper();
private TbDeviceProfileNode node; private TbDeviceProfileNode node;
@Mock @Mock
@ -122,10 +120,10 @@ public class TbDeviceProfileNodeTest {
deviceProfile.setProfileData(deviceProfileData); deviceProfile.setProfileData(deviceProfileData);
Mockito.when(cache.get(tenantId, deviceId)).thenReturn(deviceProfile); Mockito.when(cache.get(tenantId, deviceId)).thenReturn(deviceProfile);
ObjectNode data = mapper.createObjectNode(); ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 42); data.put("temperature", 42);
TbMsg msg = TbMsg.newMsg("123456789", deviceId, new TbMsgMetaData(), TbMsg msg = TbMsg.newMsg("123456789", deviceId, new TbMsgMetaData(),
TbMsgDataType.JSON, mapper.writeValueAsString(data), null, null); TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
verify(ctx).tellSuccess(msg); verify(ctx).tellSuccess(msg);
verify(ctx, Mockito.never()).tellFailure(Mockito.any(), Mockito.any()); verify(ctx, Mockito.never()).tellFailure(Mockito.any(), Mockito.any());
@ -141,10 +139,10 @@ public class TbDeviceProfileNodeTest {
deviceProfile.setProfileData(deviceProfileData); deviceProfile.setProfileData(deviceProfileData);
Mockito.when(cache.get(tenantId, deviceId)).thenReturn(deviceProfile); Mockito.when(cache.get(tenantId, deviceId)).thenReturn(deviceProfile);
ObjectNode data = mapper.createObjectNode(); ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 42); data.put("temperature", 42);
TbMsg msg = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(), TbMsg msg = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(),
TbMsgDataType.JSON, mapper.writeValueAsString(data), null, null); TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
verify(ctx).tellSuccess(msg); verify(ctx).tellSuccess(msg);
verify(ctx, Mockito.never()).tellFailure(Mockito.any(), Mockito.any()); verify(ctx, Mockito.never()).tellFailure(Mockito.any(), Mockito.any());
@ -198,10 +196,10 @@ public class TbDeviceProfileNodeTest {
TbMsg theMsg = TbMsg.newMsg("ALARM", deviceId, new TbMsgMetaData(), ""); TbMsg theMsg = TbMsg.newMsg("ALARM", deviceId, new TbMsgMetaData(), "");
Mockito.when(ctx.newMsg(Mockito.any(), Mockito.anyString(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyString())).thenReturn(theMsg); Mockito.when(ctx.newMsg(Mockito.any(), Mockito.anyString(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyString())).thenReturn(theMsg);
ObjectNode data = mapper.createObjectNode(); ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 42); data.put("temperature", 42);
TbMsg msg = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(), TbMsg msg = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(),
TbMsgDataType.JSON, mapper.writeValueAsString(data), null, null); TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
verify(ctx).tellSuccess(msg); verify(ctx).tellSuccess(msg);
verify(ctx).enqueueForTellNext(theMsg, "Alarm Created"); verify(ctx).enqueueForTellNext(theMsg, "Alarm Created");
@ -214,7 +212,7 @@ public class TbDeviceProfileNodeTest {
TbMsg msg2 = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(), TbMsg msg2 = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(),
TbMsgDataType.JSON, mapper.writeValueAsString(data), null, null); TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
node.onMsg(ctx, msg2); node.onMsg(ctx, msg2);
verify(ctx).tellSuccess(msg2); verify(ctx).tellSuccess(msg2);
verify(ctx).enqueueForTellNext(theMsg2, "Alarm Updated"); verify(ctx).enqueueForTellNext(theMsg2, "Alarm Updated");
@ -292,10 +290,10 @@ public class TbDeviceProfileNodeTest {
Mockito.when(ctx.newMsg(Mockito.any(), Mockito.anyString(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyString())) Mockito.when(ctx.newMsg(Mockito.any(), Mockito.anyString(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyString()))
.thenReturn(theMsg); .thenReturn(theMsg);
ObjectNode data = mapper.createObjectNode(); ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 21); data.put("temperature", 21);
TbMsg msg = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(), TbMsg msg = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(),
TbMsgDataType.JSON, mapper.writeValueAsString(data), null, null); TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
verify(ctx).tellSuccess(msg); verify(ctx).tellSuccess(msg);
@ -379,10 +377,10 @@ public class TbDeviceProfileNodeTest {
Mockito.when(ctx.newMsg(Mockito.any(), Mockito.anyString(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyString())) Mockito.when(ctx.newMsg(Mockito.any(), Mockito.anyString(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyString()))
.thenReturn(theMsg); .thenReturn(theMsg);
ObjectNode data = mapper.createObjectNode(); ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 21); data.put("temperature", 21);
TbMsg msg = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(), TbMsg msg = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(),
TbMsgDataType.JSON, mapper.writeValueAsString(data), null, null); TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
verify(ctx).tellSuccess(msg); verify(ctx).tellSuccess(msg);
@ -448,10 +446,10 @@ public class TbDeviceProfileNodeTest {
Mockito.when(ctx.newMsg(Mockito.any(), Mockito.anyString(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyString())) Mockito.when(ctx.newMsg(Mockito.any(), Mockito.anyString(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyString()))
.thenReturn(theMsg); .thenReturn(theMsg);
ObjectNode data = mapper.createObjectNode(); ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 35); data.put("temperature", 35);
TbMsg msg = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(), TbMsg msg = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(),
TbMsgDataType.JSON, mapper.writeValueAsString(data), null, null); TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
verify(ctx).tellSuccess(msg); verify(ctx).tellSuccess(msg);
@ -542,10 +540,10 @@ public class TbDeviceProfileNodeTest {
Mockito.when(ctx.newMsg(Mockito.any(), Mockito.anyString(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyString())) Mockito.when(ctx.newMsg(Mockito.any(), Mockito.anyString(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyString()))
.thenReturn(theMsg); .thenReturn(theMsg);
ObjectNode data = mapper.createObjectNode(); ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 35); data.put("temperature", 35);
TbMsg msg = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(), TbMsg msg = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(),
TbMsgDataType.JSON, mapper.writeValueAsString(data), null, null); TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
verify(ctx).tellSuccess(msg); verify(ctx).tellSuccess(msg);
@ -560,7 +558,7 @@ public class TbDeviceProfileNodeTest {
Thread.sleep(halfOfAlarmDelay); Thread.sleep(halfOfAlarmDelay);
TbMsg msg2 = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(), TbMsg msg2 = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(),
TbMsgDataType.JSON, mapper.writeValueAsString(data), null, null); TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
node.onMsg(ctx, msg2); node.onMsg(ctx, msg2);
verify(ctx).tellSuccess(msg2); verify(ctx).tellSuccess(msg2);
@ -666,10 +664,10 @@ public class TbDeviceProfileNodeTest {
Mockito.when(ctx.newMsg(Mockito.any(), Mockito.anyString(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyString())) Mockito.when(ctx.newMsg(Mockito.any(), Mockito.anyString(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyString()))
.thenReturn(theMsg); .thenReturn(theMsg);
ObjectNode data = mapper.createObjectNode(); ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 150); data.put("temperature", 150);
TbMsg msg = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(), TbMsg msg = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(),
TbMsgDataType.JSON, mapper.writeValueAsString(data), null, null); TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
verify(ctx).tellSuccess(msg); verify(ctx).tellSuccess(msg);
@ -684,7 +682,7 @@ public class TbDeviceProfileNodeTest {
Thread.sleep(halfOfAlarmDelay); Thread.sleep(halfOfAlarmDelay);
TbMsg msg2 = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(), TbMsg msg2 = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(),
TbMsgDataType.JSON, mapper.writeValueAsString(data), null, null); TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
node.onMsg(ctx, msg2); node.onMsg(ctx, msg2);
verify(ctx).tellSuccess(msg2); verify(ctx).tellSuccess(msg2);
@ -775,10 +773,10 @@ public class TbDeviceProfileNodeTest {
Mockito.when(ctx.newMsg(Mockito.any(), Mockito.anyString(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyString())) Mockito.when(ctx.newMsg(Mockito.any(), Mockito.anyString(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyString()))
.thenReturn(theMsg); .thenReturn(theMsg);
ObjectNode data = mapper.createObjectNode(); ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 150); data.put("temperature", 150);
TbMsg msg = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(), TbMsg msg = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(),
TbMsgDataType.JSON, mapper.writeValueAsString(data), null, null); TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
verify(ctx).tellSuccess(msg); verify(ctx).tellSuccess(msg);
@ -787,7 +785,7 @@ public class TbDeviceProfileNodeTest {
data.put("temperature", 151); data.put("temperature", 151);
TbMsg msg2 = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(), TbMsg msg2 = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(),
TbMsgDataType.JSON, mapper.writeValueAsString(data), null, null); TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
node.onMsg(ctx, msg2); node.onMsg(ctx, msg2);
verify(ctx).tellSuccess(msg2); verify(ctx).tellSuccess(msg2);
@ -891,10 +889,10 @@ public class TbDeviceProfileNodeTest {
Mockito.when(ctx.newMsg(Mockito.any(), Mockito.anyString(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyString())) Mockito.when(ctx.newMsg(Mockito.any(), Mockito.anyString(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyString()))
.thenReturn(theMsg); .thenReturn(theMsg);
ObjectNode data = mapper.createObjectNode(); ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 150); data.put("temperature", 150);
TbMsg msg = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(), TbMsg msg = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(),
TbMsgDataType.JSON, mapper.writeValueAsString(data), null, null); TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
verify(ctx).tellSuccess(msg); verify(ctx).tellSuccess(msg);
@ -903,7 +901,7 @@ public class TbDeviceProfileNodeTest {
data.put("temperature", 151); data.put("temperature", 151);
TbMsg msg2 = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(), TbMsg msg2 = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(),
TbMsgDataType.JSON, mapper.writeValueAsString(data), null, null); TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
node.onMsg(ctx, msg2); node.onMsg(ctx, msg2);
verify(ctx).tellSuccess(msg2); verify(ctx).tellSuccess(msg2);
@ -987,10 +985,10 @@ public class TbDeviceProfileNodeTest {
Mockito.when(ctx.newMsg(Mockito.any(), Mockito.anyString(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyString())) Mockito.when(ctx.newMsg(Mockito.any(), Mockito.anyString(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyString()))
.thenReturn(theMsg); .thenReturn(theMsg);
ObjectNode data = mapper.createObjectNode(); ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 35); data.put("temperature", 35);
TbMsg msg = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(), TbMsg msg = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(),
TbMsgDataType.JSON, mapper.writeValueAsString(data), null, null); TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
verify(ctx).tellSuccess(msg); verify(ctx).tellSuccess(msg);
@ -1005,7 +1003,7 @@ public class TbDeviceProfileNodeTest {
Thread.sleep(halfOfAlarmDelay); Thread.sleep(halfOfAlarmDelay);
TbMsg msg2 = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(), TbMsg msg2 = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(),
TbMsgDataType.JSON, mapper.writeValueAsString(data), null, null); TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
node.onMsg(ctx, msg2); node.onMsg(ctx, msg2);
verify(ctx).tellSuccess(msg2); verify(ctx).tellSuccess(msg2);
@ -1085,10 +1083,10 @@ public class TbDeviceProfileNodeTest {
Mockito.when(ctx.newMsg(Mockito.any(), Mockito.anyString(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyString())) Mockito.when(ctx.newMsg(Mockito.any(), Mockito.anyString(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyString()))
.thenReturn(theMsg); .thenReturn(theMsg);
ObjectNode data = mapper.createObjectNode(); ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 35); data.put("temperature", 35);
TbMsg msg = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(), TbMsg msg = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(),
TbMsgDataType.JSON, mapper.writeValueAsString(data), null, null); TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
verify(ctx).tellSuccess(msg); verify(ctx).tellSuccess(msg);
@ -1167,10 +1165,10 @@ public class TbDeviceProfileNodeTest {
Mockito.when(ctx.newMsg(Mockito.any(), Mockito.anyString(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyString())) Mockito.when(ctx.newMsg(Mockito.any(), Mockito.anyString(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyString()))
.thenReturn(theMsg); .thenReturn(theMsg);
ObjectNode data = mapper.createObjectNode(); ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 35); data.put("temperature", 35);
TbMsg msg = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(), TbMsg msg = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(),
TbMsgDataType.JSON, mapper.writeValueAsString(data), null, null); TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
// Mockito.reset(ctx); // Mockito.reset(ctx);
@ -1261,10 +1259,10 @@ public class TbDeviceProfileNodeTest {
TbMsg theMsg = TbMsg.newMsg("ALARM", deviceId, new TbMsgMetaData(), ""); TbMsg theMsg = TbMsg.newMsg("ALARM", deviceId, new TbMsgMetaData(), "");
ObjectNode data = mapper.createObjectNode(); ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 35); data.put("temperature", 35);
TbMsg msg = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(), TbMsg msg = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(),
TbMsgDataType.JSON, mapper.writeValueAsString(data), null, null); TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
verify(ctx).tellSuccess(msg); verify(ctx).tellSuccess(msg);
@ -1341,10 +1339,10 @@ public class TbDeviceProfileNodeTest {
Mockito.when(ctx.newMsg(Mockito.any(), Mockito.anyString(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyString())) Mockito.when(ctx.newMsg(Mockito.any(), Mockito.anyString(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyString()))
.thenReturn(theMsg); .thenReturn(theMsg);
ObjectNode data = mapper.createObjectNode(); ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 25); data.put("temperature", 25);
TbMsg msg = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(), TbMsg msg = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(),
TbMsgDataType.JSON, mapper.writeValueAsString(data), null, null); TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
verify(ctx).tellSuccess(msg); verify(ctx).tellSuccess(msg);
@ -1414,10 +1412,10 @@ public class TbDeviceProfileNodeTest {
Mockito.when(ctx.newMsg(Mockito.any(), Mockito.anyString(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyString())) Mockito.when(ctx.newMsg(Mockito.any(), Mockito.anyString(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyString()))
.thenReturn(theMsg); .thenReturn(theMsg);
ObjectNode data = mapper.createObjectNode(); ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 40); data.put("temperature", 40);
TbMsg msg = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(), TbMsg msg = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(),
TbMsgDataType.JSON, mapper.writeValueAsString(data), null, null); TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
verify(ctx).tellSuccess(msg); verify(ctx).tellSuccess(msg);
@ -1497,10 +1495,10 @@ public class TbDeviceProfileNodeTest {
Mockito.when(ctx.newMsg(Mockito.any(), Mockito.anyString(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyString())) Mockito.when(ctx.newMsg(Mockito.any(), Mockito.anyString(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyString()))
.thenReturn(theMsg); .thenReturn(theMsg);
ObjectNode data = mapper.createObjectNode(); ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 150L); data.put("temperature", 150L);
TbMsg msg = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(), TbMsg msg = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(),
TbMsgDataType.JSON, mapper.writeValueAsString(data), null, null); TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
verify(ctx).tellSuccess(msg); verify(ctx).tellSuccess(msg);
@ -1582,10 +1580,10 @@ public class TbDeviceProfileNodeTest {
Mockito.when(ctx.newMsg(Mockito.any(), Mockito.anyString(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyString())) Mockito.when(ctx.newMsg(Mockito.any(), Mockito.anyString(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyString()))
.thenReturn(theMsg); .thenReturn(theMsg);
ObjectNode data = mapper.createObjectNode(); ObjectNode data = JacksonUtil.newObjectNode();
data.put("temperature", 150L); data.put("temperature", 150L);
TbMsg msg = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(), TbMsg msg = TbMsg.newMsg(SessionMsgType.POST_TELEMETRY_REQUEST.name(), deviceId, new TbMsgMetaData(),
TbMsgDataType.JSON, mapper.writeValueAsString(data), null, null); TbMsgDataType.JSON, JacksonUtil.toString(data), null, null);
node.onMsg(ctx, msg); node.onMsg(ctx, msg);
verify(ctx).tellSuccess(msg); verify(ctx).tellSuccess(msg);
@ -1600,7 +1598,7 @@ public class TbDeviceProfileNodeTest {
Mockito.when(ctx.getAlarmService()).thenReturn(alarmService); Mockito.when(ctx.getAlarmService()).thenReturn(alarmService);
Mockito.when(ctx.getDeviceService()).thenReturn(deviceService); Mockito.when(ctx.getDeviceService()).thenReturn(deviceService);
Mockito.when(ctx.getAttributesService()).thenReturn(attributesService); Mockito.when(ctx.getAttributesService()).thenReturn(attributesService);
TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(mapper.createObjectNode()); TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(JacksonUtil.newObjectNode());
node = new TbDeviceProfileNode(); node = new TbDeviceProfileNode();
node.init(ctx, nodeConfiguration); node.init(ctx, nodeConfiguration);
} }

5
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/rest/TbRestApiCallNodeTest.java

@ -38,6 +38,7 @@ import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner; import org.mockito.junit.MockitoJUnitRunner;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.rule.engine.api.TbContext; import org.thingsboard.rule.engine.api.TbContext;
import org.thingsboard.rule.engine.api.TbEmail; import org.thingsboard.rule.engine.api.TbEmail;
import org.thingsboard.rule.engine.api.TbNodeConfiguration; import org.thingsboard.rule.engine.api.TbNodeConfiguration;
@ -51,7 +52,6 @@ import org.thingsboard.server.common.msg.TbMsgDataType;
import org.thingsboard.server.common.msg.TbMsgMetaData; import org.thingsboard.server.common.msg.TbMsgMetaData;
import com.datastax.oss.driver.api.core.uuid.Uuids; import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.fasterxml.jackson.databind.ObjectMapper;
@RunWith(MockitoJUnitRunner.class) @RunWith(MockitoJUnitRunner.class)
public class TbRestApiCallNodeTest { public class TbRestApiCallNodeTest {
@ -80,8 +80,7 @@ public class TbRestApiCallNodeTest {
private void initWithConfig(TbRestApiCallNodeConfiguration config) { private void initWithConfig(TbRestApiCallNodeConfiguration config) {
try { try {
ObjectMapper mapper = new ObjectMapper(); TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(JacksonUtil.valueToTree(config));
TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config));
restNode = new TbRestApiCallNode(); restNode = new TbRestApiCallNode();
restNode.init(ctx, nodeConfiguration); restNode.init(ctx, nodeConfiguration);
} catch (TbNodeException ex) { } catch (TbNodeException ex) {

12
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/telemetry/TbMsgDeleteAttributesNodeTest.java

@ -15,12 +15,12 @@
*/ */
package org.thingsboard.rule.engine.telemetry; package org.thingsboard.rule.engine.telemetry;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.rule.engine.api.RuleEngineTelemetryService; import org.thingsboard.rule.engine.api.RuleEngineTelemetryService;
import org.thingsboard.rule.engine.api.TbContext; import org.thingsboard.rule.engine.api.TbContext;
import org.thingsboard.rule.engine.api.TbNodeConfiguration; import org.thingsboard.rule.engine.api.TbNodeConfiguration;
@ -56,8 +56,6 @@ import static org.thingsboard.server.common.data.DataConstants.SHARED_SCOPE;
@Slf4j @Slf4j
public class TbMsgDeleteAttributesNodeTest { public class TbMsgDeleteAttributesNodeTest {
final ObjectMapper mapper = new ObjectMapper();
DeviceId deviceId; DeviceId deviceId;
TbMsgDeleteAttributesNode node; TbMsgDeleteAttributesNode node;
TbMsgDeleteAttributesNodeConfiguration config; TbMsgDeleteAttributesNodeConfiguration config;
@ -74,7 +72,7 @@ public class TbMsgDeleteAttributesNodeTest {
ctx = mock(TbContext.class); ctx = mock(TbContext.class);
config = new TbMsgDeleteAttributesNodeConfiguration().defaultConfiguration(); config = new TbMsgDeleteAttributesNodeConfiguration().defaultConfiguration();
config.setKeys(List.of("${TestAttribute_1}", "$[TestAttribute_2]", "$[TestAttribute_3]", "TestAttribute_4")); config.setKeys(List.of("${TestAttribute_1}", "$[TestAttribute_2]", "$[TestAttribute_3]", "TestAttribute_4"));
nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config)); nodeConfiguration = new TbNodeConfiguration(JacksonUtil.valueToTree(config));
node = spy(new TbMsgDeleteAttributesNode()); node = spy(new TbMsgDeleteAttributesNode());
node.init(ctx, nodeConfiguration); node.init(ctx, nodeConfiguration);
telemetryService = mock(RuleEngineTelemetryService.class); telemetryService = mock(RuleEngineTelemetryService.class);
@ -108,7 +106,7 @@ public class TbMsgDeleteAttributesNodeTest {
@Test @Test
void givenMsg_whenOnMsg_thenVerifyOutput_SendAttributesDeletedNotification_NoNotifyDevice() throws Exception { void givenMsg_whenOnMsg_thenVerifyOutput_SendAttributesDeletedNotification_NoNotifyDevice() throws Exception {
config.setSendAttributesDeletedNotification(true); config.setSendAttributesDeletedNotification(true);
nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config)); nodeConfiguration = new TbNodeConfiguration(JacksonUtil.valueToTree(config));
node.init(ctx, nodeConfiguration); node.init(ctx, nodeConfiguration);
onMsg_thenVerifyOutput(true, false, false); onMsg_thenVerifyOutput(true, false, false);
} }
@ -118,14 +116,14 @@ public class TbMsgDeleteAttributesNodeTest {
config.setSendAttributesDeletedNotification(true); config.setSendAttributesDeletedNotification(true);
config.setNotifyDevice(true); config.setNotifyDevice(true);
config.setScope(SHARED_SCOPE); config.setScope(SHARED_SCOPE);
nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config)); nodeConfiguration = new TbNodeConfiguration(JacksonUtil.valueToTree(config));
node.init(ctx, nodeConfiguration); node.init(ctx, nodeConfiguration);
onMsg_thenVerifyOutput(true, true, false); onMsg_thenVerifyOutput(true, true, false);
} }
@Test @Test
void givenMsg_whenOnMsg_thenVerifyOutput_NoSendAttributesDeletedNotification_NotifyDeviceMetadata() throws Exception { void givenMsg_whenOnMsg_thenVerifyOutput_NoSendAttributesDeletedNotification_NotifyDeviceMetadata() throws Exception {
nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config)); nodeConfiguration = new TbNodeConfiguration(JacksonUtil.valueToTree(config));
node.init(ctx, nodeConfiguration); node.init(ctx, nodeConfiguration);
onMsg_thenVerifyOutput(false, false, true); onMsg_thenVerifyOutput(false, false, true);
} }

5
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbChangeOriginatorNodeTest.java

@ -16,7 +16,6 @@
package org.thingsboard.rule.engine.transform; package org.thingsboard.rule.engine.transform;
import com.datastax.oss.driver.api.core.uuid.Uuids; import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
import org.junit.Before; import org.junit.Before;
@ -25,6 +24,7 @@ import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner; import org.mockito.junit.MockitoJUnitRunner;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.common.util.ListeningExecutor; import org.thingsboard.common.util.ListeningExecutor;
import org.thingsboard.rule.engine.api.TbContext; import org.thingsboard.rule.engine.api.TbContext;
import org.thingsboard.rule.engine.api.TbNodeConfiguration; import org.thingsboard.rule.engine.api.TbNodeConfiguration;
@ -159,8 +159,7 @@ public class TbChangeOriginatorNodeTest {
public void init() throws TbNodeException { public void init() throws TbNodeException {
TbChangeOriginatorNodeConfiguration config = new TbChangeOriginatorNodeConfiguration(); TbChangeOriginatorNodeConfiguration config = new TbChangeOriginatorNodeConfiguration();
config.setOriginatorSource(TbChangeOriginatorNode.CUSTOMER_SOURCE); config.setOriginatorSource(TbChangeOriginatorNode.CUSTOMER_SOURCE);
ObjectMapper mapper = new ObjectMapper(); TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(JacksonUtil.valueToTree(config));
TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config));
when(ctx.getDbCallbackExecutor()).thenReturn(dbExecutor); when(ctx.getDbCallbackExecutor()).thenReturn(dbExecutor);

9
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbCopyKeysNodeTest.java

@ -16,7 +16,6 @@
package org.thingsboard.rule.engine.transform; package org.thingsboard.rule.engine.transform;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -45,8 +44,6 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
public class TbCopyKeysNodeTest { public class TbCopyKeysNodeTest {
final ObjectMapper mapper = new ObjectMapper();
DeviceId deviceId; DeviceId deviceId;
TbCopyKeysNode node; TbCopyKeysNode node;
TbCopyKeysNodeConfiguration config; TbCopyKeysNodeConfiguration config;
@ -62,7 +59,7 @@ public class TbCopyKeysNodeTest {
config = new TbCopyKeysNodeConfiguration().defaultConfiguration(); config = new TbCopyKeysNodeConfiguration().defaultConfiguration();
config.setKeys(Set.of("TestKey_1", "TestKey_2", "TestKey_3", "(\\w*)Data(\\w*)")); config.setKeys(Set.of("TestKey_1", "TestKey_2", "TestKey_3", "(\\w*)Data(\\w*)"));
config.setFromMetadata(true); config.setFromMetadata(true);
nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config)); nodeConfiguration = new TbNodeConfiguration(JacksonUtil.valueToTree(config));
node = spy(new TbCopyKeysNode()); node = spy(new TbCopyKeysNode());
node.init(ctx, nodeConfiguration); node.init(ctx, nodeConfiguration);
} }
@ -99,7 +96,7 @@ public class TbCopyKeysNodeTest {
@Test @Test
void givenMsgFromMsg_whenOnMsg_thenVerifyOutput() throws Exception { void givenMsgFromMsg_whenOnMsg_thenVerifyOutput() throws Exception {
config.setFromMetadata(false); config.setFromMetadata(false);
nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config)); nodeConfiguration = new TbNodeConfiguration(JacksonUtil.valueToTree(config));
node.init(ctx, nodeConfiguration); node.init(ctx, nodeConfiguration);
String data = "{\"DigitData\":22.5,\"TempDataValue\":10.5}"; String data = "{\"DigitData\":22.5,\"TempDataValue\":10.5}";
@ -120,7 +117,7 @@ public class TbCopyKeysNodeTest {
@Test @Test
void givenEmptyKeys_whenOnMsg_thenVerifyOutput() throws Exception { void givenEmptyKeys_whenOnMsg_thenVerifyOutput() throws Exception {
TbCopyKeysNodeConfiguration defaultConfig = new TbCopyKeysNodeConfiguration().defaultConfiguration(); TbCopyKeysNodeConfiguration defaultConfig = new TbCopyKeysNodeConfiguration().defaultConfiguration();
nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(defaultConfig)); nodeConfiguration = new TbNodeConfiguration(JacksonUtil.valueToTree(defaultConfig));
node.init(ctx, nodeConfiguration); node.init(ctx, nodeConfiguration);
String data = "{\"DigitData\":22.5,\"TempDataValue\":10.5}"; String data = "{\"DigitData\":22.5,\"TempDataValue\":10.5}";

9
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbDeleteKeysNodeTest.java

@ -16,7 +16,6 @@
package org.thingsboard.rule.engine.transform; package org.thingsboard.rule.engine.transform;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -45,8 +44,6 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
public class TbDeleteKeysNodeTest { public class TbDeleteKeysNodeTest {
final ObjectMapper mapper = new ObjectMapper();
DeviceId deviceId; DeviceId deviceId;
TbDeleteKeysNode node; TbDeleteKeysNode node;
TbDeleteKeysNodeConfiguration config; TbDeleteKeysNodeConfiguration config;
@ -62,7 +59,7 @@ public class TbDeleteKeysNodeTest {
config = new TbDeleteKeysNodeConfiguration().defaultConfiguration(); config = new TbDeleteKeysNodeConfiguration().defaultConfiguration();
config.setKeys(Set.of("TestKey_1", "TestKey_2", "TestKey_3", "(\\w*)Data(\\w*)")); config.setKeys(Set.of("TestKey_1", "TestKey_2", "TestKey_3", "(\\w*)Data(\\w*)"));
config.setFromMetadata(true); config.setFromMetadata(true);
nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config)); nodeConfiguration = new TbNodeConfiguration(JacksonUtil.valueToTree(config));
node = spy(new TbDeleteKeysNode()); node = spy(new TbDeleteKeysNode());
node.init(ctx, nodeConfiguration); node.init(ctx, nodeConfiguration);
} }
@ -99,7 +96,7 @@ public class TbDeleteKeysNodeTest {
@Test @Test
void givenMsgFromMsg_whenOnMsg_thenVerifyOutput() throws Exception { void givenMsgFromMsg_whenOnMsg_thenVerifyOutput() throws Exception {
config.setFromMetadata(false); config.setFromMetadata(false);
nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config)); nodeConfiguration = new TbNodeConfiguration(JacksonUtil.valueToTree(config));
node.init(ctx, nodeConfiguration); node.init(ctx, nodeConfiguration);
String data = "{\"Voltage\":22.5,\"TempDataValue\":10.5}"; String data = "{\"Voltage\":22.5,\"TempDataValue\":10.5}";
@ -120,7 +117,7 @@ public class TbDeleteKeysNodeTest {
@Test @Test
void givenEmptyKeys_whenOnMsg_thenVerifyOutput() throws Exception { void givenEmptyKeys_whenOnMsg_thenVerifyOutput() throws Exception {
TbDeleteKeysNodeConfiguration defaultConfig = new TbDeleteKeysNodeConfiguration().defaultConfiguration(); TbDeleteKeysNodeConfiguration defaultConfig = new TbDeleteKeysNodeConfiguration().defaultConfiguration();
nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(defaultConfig)); nodeConfiguration = new TbNodeConfiguration(JacksonUtil.valueToTree(defaultConfig));
node.init(ctx, nodeConfiguration); node.init(ctx, nodeConfiguration);
String data = "{\"Voltage\":220,\"Humidity\":56}"; String data = "{\"Voltage\":220,\"Humidity\":56}";

11
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbJsonPathNodeTest.java

@ -16,7 +16,6 @@
package org.thingsboard.rule.engine.transform; package org.thingsboard.rule.engine.transform;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.jayway.jsonpath.PathNotFoundException; import com.jayway.jsonpath.PathNotFoundException;
import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
@ -45,8 +44,6 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
public class TbJsonPathNodeTest { public class TbJsonPathNodeTest {
final ObjectMapper mapper = new ObjectMapper();
DeviceId deviceId; DeviceId deviceId;
TbJsonPathNode node; TbJsonPathNode node;
TbJsonPathNodeConfiguration config; TbJsonPathNodeConfiguration config;
@ -61,7 +58,7 @@ public class TbJsonPathNodeTest {
ctx = mock(TbContext.class); ctx = mock(TbContext.class);
config = new TbJsonPathNodeConfiguration(); config = new TbJsonPathNodeConfiguration();
config.setJsonPath("$.Attribute_2"); config.setJsonPath("$.Attribute_2");
nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config)); nodeConfiguration = new TbNodeConfiguration(JacksonUtil.valueToTree(config));
node = spy(new TbJsonPathNode()); node = spy(new TbJsonPathNode());
node.init(ctx, nodeConfiguration); node.init(ctx, nodeConfiguration);
} }
@ -74,7 +71,7 @@ public class TbJsonPathNodeTest {
@Test @Test
void givenDefaultConfig_whenInit_thenFail() { void givenDefaultConfig_whenInit_thenFail() {
config.setJsonPath(""); config.setJsonPath("");
nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config)); nodeConfiguration = new TbNodeConfiguration(JacksonUtil.valueToTree(config));
assertThatThrownBy(() -> node.init(ctx, nodeConfiguration)).isInstanceOf(IllegalArgumentException.class); assertThatThrownBy(() -> node.init(ctx, nodeConfiguration)).isInstanceOf(IllegalArgumentException.class);
} }
@ -96,7 +93,7 @@ public class TbJsonPathNodeTest {
@Test @Test
void givenJsonMsg_whenOnMsg_thenVerifyJavaPrimitiveOutput() throws Exception { void givenJsonMsg_whenOnMsg_thenVerifyJavaPrimitiveOutput() throws Exception {
config.setJsonPath("$.attributes.length()"); config.setJsonPath("$.attributes.length()");
nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config)); nodeConfiguration = new TbNodeConfiguration(JacksonUtil.valueToTree(config));
node.init(ctx, nodeConfiguration); node.init(ctx, nodeConfiguration);
String data = "{\"attributes\":[{\"attribute_1\":10},{\"attribute_2\":20},{\"attribute_3\":30},{\"attribute_4\":40}]}"; String data = "{\"attributes\":[{\"attribute_1\":10},{\"attribute_2\":20},{\"attribute_3\":30},{\"attribute_4\":40}]}";
@ -119,7 +116,7 @@ public class TbJsonPathNodeTest {
@Test @Test
void givenJsonArrayWithFilter_whenOnMsg_thenVerifyOutput() throws Exception { void givenJsonArrayWithFilter_whenOnMsg_thenVerifyOutput() throws Exception {
config.setJsonPath("$.Attribute_2[?(@.voltage > 200)]"); config.setJsonPath("$.Attribute_2[?(@.voltage > 200)]");
nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config)); nodeConfiguration = new TbNodeConfiguration(JacksonUtil.valueToTree(config));
node.init(ctx, nodeConfiguration); node.init(ctx, nodeConfiguration);
String data = "{\"Attribute_1\":22.5,\"Attribute_2\":[{\"voltage\":220}, {\"voltage\":250}, {\"voltage\":110}]}"; String data = "{\"Attribute_1\":22.5,\"Attribute_2\":[{\"voltage\":220}, {\"voltage\":250}, {\"voltage\":110}]}";

5
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbSplitArrayMsgNodeTest.java

@ -16,7 +16,6 @@
package org.thingsboard.rule.engine.transform; package org.thingsboard.rule.engine.transform;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -46,8 +45,6 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
public class TbSplitArrayMsgNodeTest { public class TbSplitArrayMsgNodeTest {
final ObjectMapper mapper = new ObjectMapper();
DeviceId deviceId; DeviceId deviceId;
TbSplitArrayMsgNode node; TbSplitArrayMsgNode node;
EmptyNodeConfiguration config; EmptyNodeConfiguration config;
@ -61,7 +58,7 @@ public class TbSplitArrayMsgNodeTest {
callback = mock(TbMsgCallback.class); callback = mock(TbMsgCallback.class);
ctx = mock(TbContext.class); ctx = mock(TbContext.class);
config = new EmptyNodeConfiguration(); config = new EmptyNodeConfiguration();
nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config)); nodeConfiguration = new TbNodeConfiguration(JacksonUtil.valueToTree(config));
node = spy(new TbSplitArrayMsgNode()); node = spy(new TbSplitArrayMsgNode());
node.init(ctx, nodeConfiguration); node.init(ctx, nodeConfiguration);
} }

12
rule-engine/rule-engine-components/src/test/java/org/thingsboard/rule/engine/transform/TbTransformMsgNodeTest.java

@ -16,17 +16,13 @@
package org.thingsboard.rule.engine.transform; package org.thingsboard.rule.engine.transform;
import com.datastax.oss.driver.api.core.uuid.Uuids; import com.datastax.oss.driver.api.core.uuid.Uuids;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
import org.mockito.ArgumentMatchers;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner; import org.mockito.junit.MockitoJUnitRunner;
import org.mockito.stubbing.Answer; import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.common.util.ListeningExecutor;
import org.thingsboard.rule.engine.api.ScriptEngine; import org.thingsboard.rule.engine.api.ScriptEngine;
import org.thingsboard.rule.engine.api.TbContext; import org.thingsboard.rule.engine.api.TbContext;
import org.thingsboard.rule.engine.api.TbNodeConfiguration; import org.thingsboard.rule.engine.api.TbNodeConfiguration;
@ -38,13 +34,10 @@ import org.thingsboard.server.common.msg.TbMsg;
import org.thingsboard.server.common.msg.TbMsgDataType; import org.thingsboard.server.common.msg.TbMsgDataType;
import org.thingsboard.server.common.msg.TbMsgMetaData; import org.thingsboard.server.common.msg.TbMsgMetaData;
import javax.script.ScriptException;
import java.util.Collections; import java.util.Collections;
import java.util.concurrent.Callable;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.same; import static org.mockito.ArgumentMatchers.same;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@ -98,8 +91,7 @@ public class TbTransformMsgNodeTest {
TbTransformMsgNodeConfiguration config = new TbTransformMsgNodeConfiguration(); TbTransformMsgNodeConfiguration config = new TbTransformMsgNodeConfiguration();
config.setScriptLang(ScriptLanguage.JS); config.setScriptLang(ScriptLanguage.JS);
config.setJsScript("scr"); config.setJsScript("scr");
ObjectMapper mapper = new ObjectMapper(); TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(JacksonUtil.valueToTree(config));
TbNodeConfiguration nodeConfiguration = new TbNodeConfiguration(mapper.valueToTree(config));
when(ctx.createScriptEngine(ScriptLanguage.JS, "scr")).thenReturn(scriptEngine); when(ctx.createScriptEngine(ScriptLanguage.JS, "scr")).thenReturn(scriptEngine);

Loading…
Cancel
Save