Showing
88 changed files
with
948 additions
and
1619 deletions
Too many changes to show.
To preserve performance only 88 of 188 files are displayed.
... | ... | @@ -32,6 +32,8 @@ import org.thingsboard.server.actors.shared.rule.SystemRuleManager; |
32 | 32 | import org.thingsboard.server.actors.tenant.RuleChainDeviceMsg; |
33 | 33 | import org.thingsboard.server.actors.tenant.TenantActor; |
34 | 34 | import org.thingsboard.server.common.data.Tenant; |
35 | +import org.thingsboard.server.common.data.id.PluginId; | |
36 | +import org.thingsboard.server.common.data.id.RuleId; | |
35 | 37 | import org.thingsboard.server.common.data.id.TenantId; |
36 | 38 | import org.thingsboard.server.common.data.page.PageDataIterable; |
37 | 39 | import org.thingsboard.server.common.msg.cluster.ClusterEventMsg; |
... | ... | @@ -149,14 +151,16 @@ public class AppActor extends ContextAwareActor { |
149 | 151 | private void onComponentLifecycleMsg(ComponentLifecycleMsg msg) { |
150 | 152 | ActorRef target = null; |
151 | 153 | if (SYSTEM_TENANT.equals(msg.getTenantId())) { |
152 | - if (msg.getPluginId().isPresent()) { | |
153 | - target = pluginManager.getOrCreatePluginActor(this.context(), msg.getPluginId().get()); | |
154 | - } else if (msg.getRuleId().isPresent()) { | |
155 | - Optional<ActorRef> ref = ruleManager.update(this.context(), msg.getRuleId().get(), msg.getEvent()); | |
154 | + Optional<PluginId> pluginId = msg.getPluginId(); | |
155 | + Optional<RuleId> ruleId = msg.getRuleId(); | |
156 | + if (pluginId.isPresent()) { | |
157 | + target = pluginManager.getOrCreatePluginActor(this.context(), pluginId.get()); | |
158 | + } else if (ruleId.isPresent()) { | |
159 | + Optional<ActorRef> ref = ruleManager.update(this.context(), ruleId.get(), msg.getEvent()); | |
156 | 160 | if (ref.isPresent()) { |
157 | 161 | target = ref.get(); |
158 | 162 | } else { |
159 | - logger.debug("Failed to find actor for rule: [{}]", msg.getRuleId()); | |
163 | + logger.debug("Failed to find actor for rule: [{}]", ruleId); | |
160 | 164 | return; |
161 | 165 | } |
162 | 166 | } | ... | ... |
... | ... | @@ -272,130 +272,150 @@ public final class PluginProcessingContext implements PluginContext { |
272 | 272 | private void validate(EntityId entityId, ValidationCallback callback) { |
273 | 273 | if (securityCtx.isPresent()) { |
274 | 274 | final PluginApiCallSecurityContext ctx = securityCtx.get(); |
275 | - if (ctx.isTenantAdmin() || ctx.isCustomerUser() || ctx.isSystemAdmin()) { | |
276 | - switch (entityId.getEntityType()) { | |
277 | - case DEVICE: | |
278 | - if (ctx.isSystemAdmin()) { | |
279 | - callback.onSuccess(this, Boolean.FALSE); | |
280 | - } else { | |
281 | - ListenableFuture<Device> deviceFuture = pluginCtx.deviceService.findDeviceByIdAsync(new DeviceId(entityId.getId())); | |
282 | - Futures.addCallback(deviceFuture, getCallback(callback, device -> { | |
283 | - if (device == null) { | |
284 | - return Boolean.FALSE; | |
285 | - } else { | |
286 | - if (!device.getTenantId().equals(ctx.getTenantId())) { | |
287 | - return Boolean.FALSE; | |
288 | - } else if (ctx.isCustomerUser() && !device.getCustomerId().equals(ctx.getCustomerId())) { | |
289 | - return Boolean.FALSE; | |
290 | - } else { | |
291 | - return Boolean.TRUE; | |
292 | - } | |
293 | - } | |
294 | - })); | |
295 | - } | |
296 | - return; | |
297 | - case ASSET: | |
298 | - if (ctx.isSystemAdmin()) { | |
299 | - callback.onSuccess(this, Boolean.FALSE); | |
300 | - } else { | |
301 | - ListenableFuture<Asset> assetFuture = pluginCtx.assetService.findAssetByIdAsync(new AssetId(entityId.getId())); | |
302 | - Futures.addCallback(assetFuture, getCallback(callback, asset -> { | |
303 | - if (asset == null) { | |
304 | - return Boolean.FALSE; | |
305 | - } else { | |
306 | - if (!asset.getTenantId().equals(ctx.getTenantId())) { | |
307 | - return Boolean.FALSE; | |
308 | - } else if (ctx.isCustomerUser() && !asset.getCustomerId().equals(ctx.getCustomerId())) { | |
309 | - return Boolean.FALSE; | |
310 | - } else { | |
311 | - return Boolean.TRUE; | |
312 | - } | |
313 | - } | |
314 | - })); | |
315 | - } | |
316 | - return; | |
317 | - case RULE: | |
318 | - if (ctx.isCustomerUser()) { | |
319 | - callback.onSuccess(this, Boolean.FALSE); | |
320 | - } else { | |
321 | - ListenableFuture<RuleMetaData> ruleFuture = pluginCtx.ruleService.findRuleByIdAsync(new RuleId(entityId.getId())); | |
322 | - Futures.addCallback(ruleFuture, getCallback(callback, rule -> { | |
323 | - if (rule == null) { | |
324 | - return Boolean.FALSE; | |
325 | - } else { | |
326 | - if (ctx.isTenantAdmin() && !rule.getTenantId().equals(ctx.getTenantId())) { | |
327 | - return Boolean.FALSE; | |
328 | - } else if (ctx.isSystemAdmin() && !rule.getTenantId().isNullUid()) { | |
329 | - return Boolean.FALSE; | |
330 | - } else { | |
331 | - return Boolean.TRUE; | |
332 | - } | |
333 | - } | |
334 | - })); | |
335 | - } | |
336 | - return; | |
337 | - case PLUGIN: | |
338 | - if (ctx.isCustomerUser()) { | |
339 | - callback.onSuccess(this, Boolean.FALSE); | |
340 | - } else { | |
341 | - ListenableFuture<PluginMetaData> pluginFuture = pluginCtx.pluginService.findPluginByIdAsync(new PluginId(entityId.getId())); | |
342 | - Futures.addCallback(pluginFuture, getCallback(callback, plugin -> { | |
343 | - if (plugin == null) { | |
344 | - return Boolean.FALSE; | |
345 | - } else { | |
346 | - if (ctx.isTenantAdmin() && !plugin.getTenantId().equals(ctx.getTenantId())) { | |
347 | - return Boolean.FALSE; | |
348 | - } else if (ctx.isSystemAdmin() && !plugin.getTenantId().isNullUid()) { | |
349 | - return Boolean.FALSE; | |
350 | - } else { | |
351 | - return Boolean.TRUE; | |
352 | - } | |
353 | - } | |
354 | - })); | |
355 | - } | |
356 | - return; | |
357 | - case CUSTOMER: | |
358 | - if (ctx.isSystemAdmin()) { | |
359 | - callback.onSuccess(this, Boolean.FALSE); | |
360 | - } else { | |
361 | - ListenableFuture<Customer> customerFuture = pluginCtx.customerService.findCustomerByIdAsync(new CustomerId(entityId.getId())); | |
362 | - Futures.addCallback(customerFuture, getCallback(callback, customer -> { | |
363 | - if (customer == null) { | |
364 | - return Boolean.FALSE; | |
365 | - } else { | |
366 | - if (!customer.getTenantId().equals(ctx.getTenantId())) { | |
367 | - return Boolean.FALSE; | |
368 | - } else if (ctx.isCustomerUser() && !customer.getId().equals(ctx.getCustomerId())) { | |
369 | - return Boolean.FALSE; | |
370 | - } else { | |
371 | - return Boolean.TRUE; | |
372 | - } | |
373 | - } | |
374 | - })); | |
375 | - } | |
376 | - return; | |
377 | - case TENANT: | |
378 | - if (ctx.isCustomerUser()) { | |
379 | - callback.onSuccess(this, Boolean.FALSE); | |
380 | - } else if (ctx.isSystemAdmin()) { | |
381 | - callback.onSuccess(this, Boolean.TRUE); | |
382 | - } else { | |
383 | - ListenableFuture<Tenant> tenantFuture = pluginCtx.tenantService.findTenantByIdAsync(new TenantId(entityId.getId())); | |
384 | - Futures.addCallback(tenantFuture, getCallback(callback, tenant -> tenant != null && tenant.getId().equals(ctx.getTenantId()))); | |
385 | - } | |
386 | - return; | |
387 | - default: | |
388 | - //TODO: add support of other entities | |
389 | - throw new IllegalStateException("Not Implemented!"); | |
390 | - } | |
391 | - } else { | |
392 | - callback.onSuccess(this, Boolean.FALSE); | |
275 | + switch (entityId.getEntityType()) { | |
276 | + case DEVICE: | |
277 | + validateDevice(ctx, entityId, callback); | |
278 | + return; | |
279 | + case ASSET: | |
280 | + validateAsset(ctx, entityId, callback); | |
281 | + return; | |
282 | + case RULE: | |
283 | + validateRule(ctx, entityId, callback); | |
284 | + return; | |
285 | + case PLUGIN: | |
286 | + validatePlugin(ctx, entityId, callback); | |
287 | + return; | |
288 | + case CUSTOMER: | |
289 | + validateCustomer(ctx, entityId, callback); | |
290 | + return; | |
291 | + case TENANT: | |
292 | + validateTenant(ctx, entityId, callback); | |
293 | + return; | |
294 | + default: | |
295 | + //TODO: add support of other entities | |
296 | + throw new IllegalStateException("Not Implemented!"); | |
393 | 297 | } |
394 | 298 | } else { |
395 | 299 | callback.onSuccess(this, Boolean.TRUE); |
396 | 300 | } |
397 | 301 | } |
398 | 302 | |
303 | + private void validateDevice(final PluginApiCallSecurityContext ctx, EntityId entityId, ValidationCallback callback) { | |
304 | + if (ctx.isSystemAdmin()) { | |
305 | + callback.onSuccess(this, Boolean.FALSE); | |
306 | + } else { | |
307 | + ListenableFuture<Device> deviceFuture = pluginCtx.deviceService.findDeviceByIdAsync(new DeviceId(entityId.getId())); | |
308 | + Futures.addCallback(deviceFuture, getCallback(callback, device -> { | |
309 | + if (device == null) { | |
310 | + return Boolean.FALSE; | |
311 | + } else { | |
312 | + if (!device.getTenantId().equals(ctx.getTenantId())) { | |
313 | + return Boolean.FALSE; | |
314 | + } else if (ctx.isCustomerUser() && !device.getCustomerId().equals(ctx.getCustomerId())) { | |
315 | + return Boolean.FALSE; | |
316 | + } else { | |
317 | + return Boolean.TRUE; | |
318 | + } | |
319 | + } | |
320 | + })); | |
321 | + } | |
322 | + } | |
323 | + | |
324 | + private void validateAsset(final PluginApiCallSecurityContext ctx, EntityId entityId, ValidationCallback callback) { | |
325 | + if (ctx.isSystemAdmin()) { | |
326 | + callback.onSuccess(this, Boolean.FALSE); | |
327 | + } else { | |
328 | + ListenableFuture<Asset> assetFuture = pluginCtx.assetService.findAssetByIdAsync(new AssetId(entityId.getId())); | |
329 | + Futures.addCallback(assetFuture, getCallback(callback, asset -> { | |
330 | + if (asset == null) { | |
331 | + return Boolean.FALSE; | |
332 | + } else { | |
333 | + if (!asset.getTenantId().equals(ctx.getTenantId())) { | |
334 | + return Boolean.FALSE; | |
335 | + } else if (ctx.isCustomerUser() && !asset.getCustomerId().equals(ctx.getCustomerId())) { | |
336 | + return Boolean.FALSE; | |
337 | + } else { | |
338 | + return Boolean.TRUE; | |
339 | + } | |
340 | + } | |
341 | + })); | |
342 | + } | |
343 | + } | |
344 | + | |
345 | + private void validateRule(final PluginApiCallSecurityContext ctx, EntityId entityId, ValidationCallback callback) { | |
346 | + if (ctx.isCustomerUser()) { | |
347 | + callback.onSuccess(this, Boolean.FALSE); | |
348 | + } else { | |
349 | + ListenableFuture<RuleMetaData> ruleFuture = pluginCtx.ruleService.findRuleByIdAsync(new RuleId(entityId.getId())); | |
350 | + Futures.addCallback(ruleFuture, getCallback(callback, rule -> { | |
351 | + if (rule == null) { | |
352 | + return Boolean.FALSE; | |
353 | + } else { | |
354 | + if (ctx.isTenantAdmin() && !rule.getTenantId().equals(ctx.getTenantId())) { | |
355 | + return Boolean.FALSE; | |
356 | + } else if (ctx.isSystemAdmin() && !rule.getTenantId().isNullUid()) { | |
357 | + return Boolean.FALSE; | |
358 | + } else { | |
359 | + return Boolean.TRUE; | |
360 | + } | |
361 | + } | |
362 | + })); | |
363 | + } | |
364 | + } | |
365 | + | |
366 | + private void validatePlugin(final PluginApiCallSecurityContext ctx, EntityId entityId, ValidationCallback callback) { | |
367 | + if (ctx.isCustomerUser()) { | |
368 | + callback.onSuccess(this, Boolean.FALSE); | |
369 | + } else { | |
370 | + ListenableFuture<PluginMetaData> pluginFuture = pluginCtx.pluginService.findPluginByIdAsync(new PluginId(entityId.getId())); | |
371 | + Futures.addCallback(pluginFuture, getCallback(callback, plugin -> { | |
372 | + if (plugin == null) { | |
373 | + return Boolean.FALSE; | |
374 | + } else { | |
375 | + if (ctx.isTenantAdmin() && !plugin.getTenantId().equals(ctx.getTenantId())) { | |
376 | + return Boolean.FALSE; | |
377 | + } else if (ctx.isSystemAdmin() && !plugin.getTenantId().isNullUid()) { | |
378 | + return Boolean.FALSE; | |
379 | + } else { | |
380 | + return Boolean.TRUE; | |
381 | + } | |
382 | + } | |
383 | + })); | |
384 | + } | |
385 | + } | |
386 | + | |
387 | + private void validateCustomer(final PluginApiCallSecurityContext ctx, EntityId entityId, ValidationCallback callback) { | |
388 | + if (ctx.isSystemAdmin()) { | |
389 | + callback.onSuccess(this, Boolean.FALSE); | |
390 | + } else { | |
391 | + ListenableFuture<Customer> customerFuture = pluginCtx.customerService.findCustomerByIdAsync(new CustomerId(entityId.getId())); | |
392 | + Futures.addCallback(customerFuture, getCallback(callback, customer -> { | |
393 | + if (customer == null) { | |
394 | + return Boolean.FALSE; | |
395 | + } else { | |
396 | + if (!customer.getTenantId().equals(ctx.getTenantId())) { | |
397 | + return Boolean.FALSE; | |
398 | + } else if (ctx.isCustomerUser() && !customer.getId().equals(ctx.getCustomerId())) { | |
399 | + return Boolean.FALSE; | |
400 | + } else { | |
401 | + return Boolean.TRUE; | |
402 | + } | |
403 | + } | |
404 | + })); | |
405 | + } | |
406 | + } | |
407 | + | |
408 | + private void validateTenant(final PluginApiCallSecurityContext ctx, EntityId entityId, ValidationCallback callback) { | |
409 | + if (ctx.isCustomerUser()) { | |
410 | + callback.onSuccess(this, Boolean.FALSE); | |
411 | + } else if (ctx.isSystemAdmin()) { | |
412 | + callback.onSuccess(this, Boolean.TRUE); | |
413 | + } else { | |
414 | + ListenableFuture<Tenant> tenantFuture = pluginCtx.tenantService.findTenantByIdAsync(new TenantId(entityId.getId())); | |
415 | + Futures.addCallback(tenantFuture, getCallback(callback, tenant -> tenant != null && tenant.getId().equals(ctx.getTenantId()))); | |
416 | + } | |
417 | + } | |
418 | + | |
399 | 419 | @Override |
400 | 420 | public ListenableFuture<List<EntityRelation>> findByFromAndType(EntityId from, String relationType) { |
401 | 421 | return this.pluginCtx.relationService.findByFromAndType(from, relationType, RelationTypeGroup.COMMON); | ... | ... |
... | ... | @@ -45,6 +45,7 @@ import java.util.UUID; |
45 | 45 | @Slf4j |
46 | 46 | public class BasicRpcSessionListener implements GrpcSessionListener { |
47 | 47 | |
48 | + public static final String SESSION_RECEIVED_SESSION_ACTOR_MSG = "{} session [{}] received session actor msg {}"; | |
48 | 49 | private final ActorSystemContext context; |
49 | 50 | private final ActorService service; |
50 | 51 | private final ActorRef manager; |
... | ... | @@ -93,25 +94,25 @@ public class BasicRpcSessionListener implements GrpcSessionListener { |
93 | 94 | |
94 | 95 | @Override |
95 | 96 | public void onToDeviceSessionActorRpcMsg(GrpcSession session, ClusterAPIProtos.ToDeviceSessionActorRpcMessage msg) { |
96 | - log.trace("{} session [{}] received session actor msg {}", getType(session), session.getRemoteServer(), msg); | |
97 | + log.trace(SESSION_RECEIVED_SESSION_ACTOR_MSG, getType(session), session.getRemoteServer(), msg); | |
97 | 98 | service.onMsg((ToDeviceSessionActorMsg) deserialize(msg.getData().toByteArray())); |
98 | 99 | } |
99 | 100 | |
100 | 101 | @Override |
101 | 102 | public void onToDeviceRpcRequestRpcMsg(GrpcSession session, ClusterAPIProtos.ToDeviceRpcRequestRpcMessage msg) { |
102 | - log.trace("{} session [{}] received session actor msg {}", getType(session), session.getRemoteServer(), msg); | |
103 | + log.trace(SESSION_RECEIVED_SESSION_ACTOR_MSG, getType(session), session.getRemoteServer(), msg); | |
103 | 104 | service.onMsg(deserialize(session.getRemoteServer(), msg)); |
104 | 105 | } |
105 | 106 | |
106 | 107 | @Override |
107 | 108 | public void onFromDeviceRpcResponseRpcMsg(GrpcSession session, ClusterAPIProtos.ToPluginRpcResponseRpcMessage msg) { |
108 | - log.trace("{} session [{}] received session actor msg {}", getType(session), session.getRemoteServer(), msg); | |
109 | + log.trace(SESSION_RECEIVED_SESSION_ACTOR_MSG, getType(session), session.getRemoteServer(), msg); | |
109 | 110 | service.onMsg(deserialize(session.getRemoteServer(), msg)); |
110 | 111 | } |
111 | 112 | |
112 | 113 | @Override |
113 | 114 | public void onToAllNodesRpcMessage(GrpcSession session, ClusterAPIProtos.ToAllNodesRpcMessage msg) { |
114 | - log.trace("{} session [{}] received session actor msg {}", getType(session), session.getRemoteServer(), msg); | |
115 | + log.trace(SESSION_RECEIVED_SESSION_ACTOR_MSG, getType(session), session.getRemoteServer(), msg); | |
115 | 116 | service.onMsg((ToAllNodesMsg) deserialize(msg.getData().toByteArray())); |
116 | 117 | } |
117 | 118 | ... | ... |
... | ... | @@ -104,6 +104,9 @@ public abstract class ComponentActor<T extends EntityId, P extends ComponentMsgP |
104 | 104 | break; |
105 | 105 | case DELETED: |
106 | 106 | processor.onStop(context()); |
107 | + break; | |
108 | + default: | |
109 | + break; | |
107 | 110 | } |
108 | 111 | logLifecycleEvent(msg.getEvent()); |
109 | 112 | } catch (Exception e) { | ... | ... |
... | ... | @@ -23,7 +23,7 @@ public abstract class ContextBasedCreator<T> implements Creator<T> { |
23 | 23 | |
24 | 24 | private static final long serialVersionUID = 1L; |
25 | 25 | |
26 | - protected final ActorSystemContext context; | |
26 | + protected final transient ActorSystemContext context; | |
27 | 27 | |
28 | 28 | public ContextBasedCreator(ActorSystemContext context) { |
29 | 29 | super(); | ... | ... |
... | ... | @@ -77,6 +77,8 @@ class ASyncMsgProcessor extends AbstractSessionActorMsgProcessor { |
77 | 77 | case UNSUBSCRIBE_RPC_COMMANDS_REQUEST: |
78 | 78 | subscribedToRpcCommands = false; |
79 | 79 | break; |
80 | + default: | |
81 | + break; | |
80 | 82 | } |
81 | 83 | currentTargetServer = forwardToAppActor(ctx, pendingMsg); |
82 | 84 | } |
... | ... | @@ -94,6 +96,8 @@ class ASyncMsgProcessor extends AbstractSessionActorMsgProcessor { |
94 | 96 | pendingMap.remove(responseMsg.getRequestId()); |
95 | 97 | } |
96 | 98 | break; |
99 | + default: | |
100 | + break; | |
97 | 101 | } |
98 | 102 | sessionCtx.onMsg(new BasicSessionActorToAdaptorMsg(this.sessionCtx, msg)); |
99 | 103 | } else { |
... | ... | @@ -109,6 +113,7 @@ class ASyncMsgProcessor extends AbstractSessionActorMsgProcessor { |
109 | 113 | // TODO Auto-generated method stub |
110 | 114 | } |
111 | 115 | |
116 | + @Override | |
112 | 117 | protected void cleanupSession(ActorContext ctx) { |
113 | 118 | toDeviceMsg(new SessionCloseMsg()).ifPresent(m -> forwardToAppActor(ctx, m)); |
114 | 119 | } | ... | ... |
... | ... | @@ -32,6 +32,8 @@ import org.thingsboard.server.actors.shared.plugin.TenantPluginManager; |
32 | 32 | import org.thingsboard.server.actors.shared.rule.RuleManager; |
33 | 33 | import org.thingsboard.server.actors.shared.rule.TenantRuleManager; |
34 | 34 | import org.thingsboard.server.common.data.id.DeviceId; |
35 | +import org.thingsboard.server.common.data.id.PluginId; | |
36 | +import org.thingsboard.server.common.data.id.RuleId; | |
35 | 37 | import org.thingsboard.server.common.data.id.TenantId; |
36 | 38 | import org.thingsboard.server.common.msg.cluster.ClusterEventMsg; |
37 | 39 | import org.thingsboard.server.common.msg.device.ToDeviceActorMsg; |
... | ... | @@ -126,16 +128,18 @@ public class TenantActor extends ContextAwareActor { |
126 | 128 | } |
127 | 129 | |
128 | 130 | private void onComponentLifecycleMsg(ComponentLifecycleMsg msg) { |
129 | - if (msg.getPluginId().isPresent()) { | |
130 | - ActorRef pluginActor = pluginManager.getOrCreatePluginActor(this.context(), msg.getPluginId().get()); | |
131 | + Optional<PluginId> pluginId = msg.getPluginId(); | |
132 | + Optional<RuleId> ruleId = msg.getRuleId(); | |
133 | + if (pluginId.isPresent()) { | |
134 | + ActorRef pluginActor = pluginManager.getOrCreatePluginActor(this.context(), pluginId.get()); | |
131 | 135 | pluginActor.tell(msg, ActorRef.noSender()); |
132 | - } else if (msg.getRuleId().isPresent()) { | |
136 | + } else if (ruleId.isPresent()) { | |
133 | 137 | ActorRef target; |
134 | - Optional<ActorRef> ref = ruleManager.update(this.context(), msg.getRuleId().get(), msg.getEvent()); | |
138 | + Optional<ActorRef> ref = ruleManager.update(this.context(), ruleId.get(), msg.getEvent()); | |
135 | 139 | if (ref.isPresent()) { |
136 | 140 | target = ref.get(); |
137 | 141 | } else { |
138 | - logger.debug("Failed to find actor for rule: [{}]", msg.getRuleId()); | |
142 | + logger.debug("Failed to find actor for rule: [{}]", ruleId); | |
139 | 143 | return; |
140 | 144 | } |
141 | 145 | target.tell(msg, ActorRef.noSender()); | ... | ... |
... | ... | @@ -64,7 +64,7 @@ public class ThingsboardSecurityConfiguration extends WebSecurityConfigurerAdapt |
64 | 64 | public static final String FORM_BASED_LOGIN_ENTRY_POINT = "/api/auth/login"; |
65 | 65 | public static final String PUBLIC_LOGIN_ENTRY_POINT = "/api/auth/login/public"; |
66 | 66 | public static final String TOKEN_REFRESH_ENTRY_POINT = "/api/auth/token"; |
67 | - public static final String[] NON_TOKEN_BASED_AUTH_ENTRY_POINTS = new String[] {"/index.html", "/static/**", "/api/noauth/**", "/webjars/**"}; | |
67 | + protected static final String[] NON_TOKEN_BASED_AUTH_ENTRY_POINTS = new String[] {"/index.html", "/static/**", "/api/noauth/**", "/webjars/**"}; | |
68 | 68 | public static final String TOKEN_BASED_AUTH_ENTRY_POINT = "/api/**"; |
69 | 69 | public static final String WS_TOKEN_BASED_AUTH_ENTRY_POINT = "/api/ws/**"; |
70 | 70 | ... | ... |
... | ... | @@ -76,6 +76,7 @@ public class WebSocketConfiguration implements WebSocketConfigurer { |
76 | 76 | @Override |
77 | 77 | public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, |
78 | 78 | Exception exception) { |
79 | + //Do nothing | |
79 | 80 | } |
80 | 81 | }); |
81 | 82 | } | ... | ... |
... | ... | @@ -30,13 +30,16 @@ import org.thingsboard.server.exception.ThingsboardException; |
30 | 30 | @RequestMapping("/api") |
31 | 31 | public class AlarmController extends BaseController { |
32 | 32 | |
33 | + public static final String ALARM_ID = "alarmId"; | |
34 | + | |
33 | 35 | @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')") |
34 | 36 | @RequestMapping(value = "/alarm/{alarmId}", method = RequestMethod.GET) |
35 | 37 | @ResponseBody |
36 | - public Alarm getAlarmById(@PathVariable("alarmId") String strAlarmId) throws ThingsboardException { | |
37 | - checkParameter("alarmId", strAlarmId); | |
38 | + public Alarm getAlarmById(@PathVariable(ALARM_ID) String strAlarmId) throws ThingsboardException { | |
39 | + checkParameter(ALARM_ID, strAlarmId); | |
38 | 40 | try { |
39 | 41 | AlarmId alarmId = new AlarmId(toUUID(strAlarmId)); |
42 | + | |
40 | 43 | return checkAlarmId(alarmId); |
41 | 44 | } catch (Exception e) { |
42 | 45 | throw handleException(e); |
... | ... | @@ -46,8 +49,8 @@ public class AlarmController extends BaseController { |
46 | 49 | @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')") |
47 | 50 | @RequestMapping(value = "/alarm/info/{alarmId}", method = RequestMethod.GET) |
48 | 51 | @ResponseBody |
49 | - public AlarmInfo getAlarmInfoById(@PathVariable("alarmId") String strAlarmId) throws ThingsboardException { | |
50 | - checkParameter("alarmId", strAlarmId); | |
52 | + public AlarmInfo getAlarmInfoById(@PathVariable(ALARM_ID) String strAlarmId) throws ThingsboardException { | |
53 | + checkParameter(ALARM_ID, strAlarmId); | |
51 | 54 | try { |
52 | 55 | AlarmId alarmId = new AlarmId(toUUID(strAlarmId)); |
53 | 56 | return checkAlarmInfoId(alarmId); |
... | ... | @@ -71,8 +74,8 @@ public class AlarmController extends BaseController { |
71 | 74 | @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')") |
72 | 75 | @RequestMapping(value = "/alarm/{alarmId}/ack", method = RequestMethod.POST) |
73 | 76 | @ResponseStatus(value = HttpStatus.OK) |
74 | - public void ackAlarm(@PathVariable("alarmId") String strAlarmId) throws ThingsboardException { | |
75 | - checkParameter("alarmId", strAlarmId); | |
77 | + public void ackAlarm(@PathVariable(ALARM_ID) String strAlarmId) throws ThingsboardException { | |
78 | + checkParameter(ALARM_ID, strAlarmId); | |
76 | 79 | try { |
77 | 80 | AlarmId alarmId = new AlarmId(toUUID(strAlarmId)); |
78 | 81 | checkAlarmId(alarmId); |
... | ... | @@ -85,8 +88,8 @@ public class AlarmController extends BaseController { |
85 | 88 | @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')") |
86 | 89 | @RequestMapping(value = "/alarm/{alarmId}/clear", method = RequestMethod.POST) |
87 | 90 | @ResponseStatus(value = HttpStatus.OK) |
88 | - public void clearAlarm(@PathVariable("alarmId") String strAlarmId) throws ThingsboardException { | |
89 | - checkParameter("alarmId", strAlarmId); | |
91 | + public void clearAlarm(@PathVariable(ALARM_ID) String strAlarmId) throws ThingsboardException { | |
92 | + checkParameter(ALARM_ID, strAlarmId); | |
90 | 93 | try { |
91 | 94 | AlarmId alarmId = new AlarmId(toUUID(strAlarmId)); |
92 | 95 | checkAlarmId(alarmId); | ... | ... |
... | ... | @@ -43,11 +43,13 @@ import java.util.stream.Collectors; |
43 | 43 | @RequestMapping("/api") |
44 | 44 | public class AssetController extends BaseController { |
45 | 45 | |
46 | + public static final String ASSET_ID = "assetId"; | |
47 | + | |
46 | 48 | @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')") |
47 | 49 | @RequestMapping(value = "/asset/{assetId}", method = RequestMethod.GET) |
48 | 50 | @ResponseBody |
49 | - public Asset getAssetById(@PathVariable("assetId") String strAssetId) throws ThingsboardException { | |
50 | - checkParameter("assetId", strAssetId); | |
51 | + public Asset getAssetById(@PathVariable(ASSET_ID) String strAssetId) throws ThingsboardException { | |
52 | + checkParameter(ASSET_ID, strAssetId); | |
51 | 53 | try { |
52 | 54 | AssetId assetId = new AssetId(toUUID(strAssetId)); |
53 | 55 | return checkAssetId(assetId); |
... | ... | @@ -80,8 +82,8 @@ public class AssetController extends BaseController { |
80 | 82 | @PreAuthorize("hasAuthority('TENANT_ADMIN')") |
81 | 83 | @RequestMapping(value = "/asset/{assetId}", method = RequestMethod.DELETE) |
82 | 84 | @ResponseStatus(value = HttpStatus.OK) |
83 | - public void deleteAsset(@PathVariable("assetId") String strAssetId) throws ThingsboardException { | |
84 | - checkParameter("assetId", strAssetId); | |
85 | + public void deleteAsset(@PathVariable(ASSET_ID) String strAssetId) throws ThingsboardException { | |
86 | + checkParameter(ASSET_ID, strAssetId); | |
85 | 87 | try { |
86 | 88 | AssetId assetId = new AssetId(toUUID(strAssetId)); |
87 | 89 | checkAssetId(assetId); |
... | ... | @@ -95,9 +97,9 @@ public class AssetController extends BaseController { |
95 | 97 | @RequestMapping(value = "/customer/{customerId}/asset/{assetId}", method = RequestMethod.POST) |
96 | 98 | @ResponseBody |
97 | 99 | public Asset assignAssetToCustomer(@PathVariable("customerId") String strCustomerId, |
98 | - @PathVariable("assetId") String strAssetId) throws ThingsboardException { | |
100 | + @PathVariable(ASSET_ID) String strAssetId) throws ThingsboardException { | |
99 | 101 | checkParameter("customerId", strCustomerId); |
100 | - checkParameter("assetId", strAssetId); | |
102 | + checkParameter(ASSET_ID, strAssetId); | |
101 | 103 | try { |
102 | 104 | CustomerId customerId = new CustomerId(toUUID(strCustomerId)); |
103 | 105 | checkCustomerId(customerId); |
... | ... | @@ -114,8 +116,8 @@ public class AssetController extends BaseController { |
114 | 116 | @PreAuthorize("hasAuthority('TENANT_ADMIN')") |
115 | 117 | @RequestMapping(value = "/customer/asset/{assetId}", method = RequestMethod.DELETE) |
116 | 118 | @ResponseBody |
117 | - public Asset unassignAssetFromCustomer(@PathVariable("assetId") String strAssetId) throws ThingsboardException { | |
118 | - checkParameter("assetId", strAssetId); | |
119 | + public Asset unassignAssetFromCustomer(@PathVariable(ASSET_ID) String strAssetId) throws ThingsboardException { | |
120 | + checkParameter(ASSET_ID, strAssetId); | |
119 | 121 | try { |
120 | 122 | AssetId assetId = new AssetId(toUUID(strAssetId)); |
121 | 123 | Asset asset = checkAssetId(assetId); |
... | ... | @@ -131,8 +133,8 @@ public class AssetController extends BaseController { |
131 | 133 | @PreAuthorize("hasAuthority('TENANT_ADMIN')") |
132 | 134 | @RequestMapping(value = "/customer/public/asset/{assetId}", method = RequestMethod.POST) |
133 | 135 | @ResponseBody |
134 | - public Asset assignAssetToPublicCustomer(@PathVariable("assetId") String strAssetId) throws ThingsboardException { | |
135 | - checkParameter("assetId", strAssetId); | |
136 | + public Asset assignAssetToPublicCustomer(@PathVariable(ASSET_ID) String strAssetId) throws ThingsboardException { | |
137 | + checkParameter(ASSET_ID, strAssetId); | |
136 | 138 | try { |
137 | 139 | AssetId assetId = new AssetId(toUUID(strAssetId)); |
138 | 140 | Asset asset = checkAssetId(assetId); | ... | ... |
... | ... | @@ -61,9 +61,6 @@ public class AuthController extends BaseController { |
61 | 61 | private RefreshTokenRepository refreshTokenRepository; |
62 | 62 | |
63 | 63 | @Autowired |
64 | - private UserService userService; | |
65 | - | |
66 | - @Autowired | |
67 | 64 | private MailService mailService; |
68 | 65 | |
69 | 66 | @PreAuthorize("isAuthenticated()") |
... | ... | @@ -103,13 +100,13 @@ public class AuthController extends BaseController { |
103 | 100 | HttpStatus responseStatus; |
104 | 101 | UserCredentials userCredentials = userService.findUserCredentialsByActivateToken(activateToken); |
105 | 102 | if (userCredentials != null) { |
106 | - String createPasswordURI = "/login/createPassword"; | |
103 | + String createURI = "/login/createPassword"; | |
107 | 104 | try { |
108 | - URI location = new URI(createPasswordURI + "?activateToken=" + activateToken); | |
105 | + URI location = new URI(createURI + "?activateToken=" + activateToken); | |
109 | 106 | headers.setLocation(location); |
110 | 107 | responseStatus = HttpStatus.SEE_OTHER; |
111 | 108 | } catch (URISyntaxException e) { |
112 | - log.error("Unable to create URI with address [{}]", createPasswordURI); | |
109 | + log.error("Unable to create URI with address [{}]", createURI); | |
113 | 110 | responseStatus = HttpStatus.BAD_REQUEST; |
114 | 111 | } |
115 | 112 | } else { |
... | ... | @@ -126,10 +123,10 @@ public class AuthController extends BaseController { |
126 | 123 | try { |
127 | 124 | UserCredentials userCredentials = userService.requestPasswordReset(email); |
128 | 125 | String baseUrl = constructBaseUrl(request); |
129 | - String resetPasswordUrl = String.format("%s/api/noauth/resetPassword?resetToken=%s", baseUrl, | |
126 | + String resetUrl = String.format("%s/api/noauth/resetPassword?resetToken=%s", baseUrl, | |
130 | 127 | userCredentials.getResetToken()); |
131 | 128 | |
132 | - mailService.sendResetPasswordEmail(resetPasswordUrl, email); | |
129 | + mailService.sendResetPasswordEmail(resetUrl, email); | |
133 | 130 | } catch (Exception e) { |
134 | 131 | throw handleException(e); |
135 | 132 | } |
... | ... | @@ -140,15 +137,15 @@ public class AuthController extends BaseController { |
140 | 137 | @RequestParam(value = "resetToken") String resetToken) { |
141 | 138 | HttpHeaders headers = new HttpHeaders(); |
142 | 139 | HttpStatus responseStatus; |
143 | - String resetPasswordURI = "/login/resetPassword"; | |
140 | + String resetURI = "/login/resetPassword"; | |
144 | 141 | UserCredentials userCredentials = userService.findUserCredentialsByResetToken(resetToken); |
145 | 142 | if (userCredentials != null) { |
146 | 143 | try { |
147 | - URI location = new URI(resetPasswordURI + "?resetToken=" + resetToken); | |
144 | + URI location = new URI(resetURI + "?resetToken=" + resetToken); | |
148 | 145 | headers.setLocation(location); |
149 | 146 | responseStatus = HttpStatus.SEE_OTHER; |
150 | 147 | } catch (URISyntaxException e) { |
151 | - log.error("Unable to create URI with address [{}]", resetPasswordURI); | |
148 | + log.error("Unable to create URI with address [{}]", resetURI); | |
152 | 149 | responseStatus = HttpStatus.BAD_REQUEST; |
153 | 150 | } |
154 | 151 | } else { | ... | ... |
... | ... | @@ -70,6 +70,8 @@ import static org.thingsboard.server.dao.service.Validator.validateId; |
70 | 70 | @Slf4j |
71 | 71 | public abstract class BaseController { |
72 | 72 | |
73 | + public static final String INCORRECT_TENANT_ID = "Incorrect tenantId "; | |
74 | + public static final String YOU_DON_T_HAVE_PERMISSION_TO_PERFORM_THIS_OPERATION = "You don't have permission to perform this operation!"; | |
73 | 75 | @Autowired |
74 | 76 | private ThingsboardErrorResponseHandler errorResponseHandler; |
75 | 77 | |
... | ... | @@ -209,11 +211,11 @@ public abstract class BaseController { |
209 | 211 | } |
210 | 212 | |
211 | 213 | void checkTenantId(TenantId tenantId) throws ThingsboardException { |
212 | - validateId(tenantId, "Incorrect tenantId " + tenantId); | |
214 | + validateId(tenantId, INCORRECT_TENANT_ID + tenantId); | |
213 | 215 | SecurityUser authUser = getCurrentUser(); |
214 | 216 | if (authUser.getAuthority() != Authority.SYS_ADMIN && |
215 | 217 | (authUser.getTenantId() == null || !authUser.getTenantId().equals(tenantId))) { |
216 | - throw new ThingsboardException("You don't have permission to perform this operation!", | |
218 | + throw new ThingsboardException(YOU_DON_T_HAVE_PERMISSION_TO_PERFORM_THIS_OPERATION, | |
217 | 219 | ThingsboardErrorCode.PERMISSION_DENIED); |
218 | 220 | } |
219 | 221 | } |
... | ... | @@ -229,7 +231,7 @@ public abstract class BaseController { |
229 | 231 | if (authUser.getAuthority() == Authority.SYS_ADMIN || |
230 | 232 | (authUser.getAuthority() != Authority.TENANT_ADMIN && |
231 | 233 | (authUser.getCustomerId() == null || !authUser.getCustomerId().equals(customerId)))) { |
232 | - throw new ThingsboardException("You don't have permission to perform this operation!", | |
234 | + throw new ThingsboardException(YOU_DON_T_HAVE_PERMISSION_TO_PERFORM_THIS_OPERATION, | |
233 | 235 | ThingsboardErrorCode.PERMISSION_DENIED); |
234 | 236 | } |
235 | 237 | Customer customer = customerService.findCustomerById(customerId); |
... | ... | @@ -382,7 +384,7 @@ public abstract class BaseController { |
382 | 384 | if (widgetsBundle.getTenantId() != null && !widgetsBundle.getTenantId().getId().equals(ModelConstants.NULL_UUID)) { |
383 | 385 | checkTenantId(widgetsBundle.getTenantId()); |
384 | 386 | } else if (modify && getCurrentUser().getAuthority() != Authority.SYS_ADMIN) { |
385 | - throw new ThingsboardException("You don't have permission to perform this operation!", | |
387 | + throw new ThingsboardException(YOU_DON_T_HAVE_PERMISSION_TO_PERFORM_THIS_OPERATION, | |
386 | 388 | ThingsboardErrorCode.PERMISSION_DENIED); |
387 | 389 | } |
388 | 390 | } |
... | ... | @@ -403,7 +405,7 @@ public abstract class BaseController { |
403 | 405 | if (widgetType.getTenantId() != null && !widgetType.getTenantId().getId().equals(ModelConstants.NULL_UUID)) { |
404 | 406 | checkTenantId(widgetType.getTenantId()); |
405 | 407 | } else if (modify && getCurrentUser().getAuthority() != Authority.SYS_ADMIN) { |
406 | - throw new ThingsboardException("You don't have permission to perform this operation!", | |
408 | + throw new ThingsboardException(YOU_DON_T_HAVE_PERMISSION_TO_PERFORM_THIS_OPERATION, | |
407 | 409 | ThingsboardErrorCode.PERMISSION_DENIED); |
408 | 410 | } |
409 | 411 | } |
... | ... | @@ -437,7 +439,7 @@ public abstract class BaseController { |
437 | 439 | SecurityUser authUser = getCurrentUser(); |
438 | 440 | if (authUser.getAuthority() == Authority.CUSTOMER_USER) { |
439 | 441 | if (dashboard.getCustomerId() == null || dashboard.getCustomerId().getId().equals(ModelConstants.NULL_UUID)) { |
440 | - throw new ThingsboardException("You don't have permission to perform this operation!", | |
442 | + throw new ThingsboardException(YOU_DON_T_HAVE_PERMISSION_TO_PERFORM_THIS_OPERATION, | |
441 | 443 | ThingsboardErrorCode.PERMISSION_DENIED); |
442 | 444 | } |
443 | 445 | } |
... | ... | @@ -480,11 +482,11 @@ public abstract class BaseController { |
480 | 482 | checkNotNull(plugin); |
481 | 483 | SecurityUser authUser = getCurrentUser(); |
482 | 484 | TenantId tenantId = plugin.getTenantId(); |
483 | - validateId(tenantId, "Incorrect tenantId " + tenantId); | |
485 | + validateId(tenantId, INCORRECT_TENANT_ID + tenantId); | |
484 | 486 | if (authUser.getAuthority() != Authority.SYS_ADMIN) { |
485 | 487 | if (authUser.getTenantId() == null || |
486 | 488 | !tenantId.getId().equals(ModelConstants.NULL_UUID) && !authUser.getTenantId().equals(tenantId)) { |
487 | - throw new ThingsboardException("You don't have permission to perform this operation!", | |
489 | + throw new ThingsboardException(YOU_DON_T_HAVE_PERMISSION_TO_PERFORM_THIS_OPERATION, | |
488 | 490 | ThingsboardErrorCode.PERMISSION_DENIED); |
489 | 491 | |
490 | 492 | } else if (tenantId.getId().equals(ModelConstants.NULL_UUID)) { |
... | ... | @@ -508,11 +510,11 @@ public abstract class BaseController { |
508 | 510 | checkNotNull(rule); |
509 | 511 | SecurityUser authUser = getCurrentUser(); |
510 | 512 | TenantId tenantId = rule.getTenantId(); |
511 | - validateId(tenantId, "Incorrect tenantId " + tenantId); | |
513 | + validateId(tenantId, INCORRECT_TENANT_ID + tenantId); | |
512 | 514 | if (authUser.getAuthority() != Authority.SYS_ADMIN) { |
513 | 515 | if (authUser.getTenantId() == null || |
514 | 516 | !tenantId.getId().equals(ModelConstants.NULL_UUID) && !authUser.getTenantId().equals(tenantId)) { |
515 | - throw new ThingsboardException("You don't have permission to perform this operation!", | |
517 | + throw new ThingsboardException(YOU_DON_T_HAVE_PERMISSION_TO_PERFORM_THIS_OPERATION, | |
516 | 518 | ThingsboardErrorCode.PERMISSION_DENIED); |
517 | 519 | |
518 | 520 | } | ... | ... |
... | ... | @@ -32,11 +32,14 @@ import org.thingsboard.server.exception.ThingsboardException; |
32 | 32 | @RequestMapping("/api") |
33 | 33 | public class CustomerController extends BaseController { |
34 | 34 | |
35 | + public static final String CUSTOMER_ID = "customerId"; | |
36 | + public static final String IS_PUBLIC = "isPublic"; | |
37 | + | |
35 | 38 | @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')") |
36 | 39 | @RequestMapping(value = "/customer/{customerId}", method = RequestMethod.GET) |
37 | 40 | @ResponseBody |
38 | - public Customer getCustomerById(@PathVariable("customerId") String strCustomerId) throws ThingsboardException { | |
39 | - checkParameter("customerId", strCustomerId); | |
41 | + public Customer getCustomerById(@PathVariable(CUSTOMER_ID) String strCustomerId) throws ThingsboardException { | |
42 | + checkParameter(CUSTOMER_ID, strCustomerId); | |
40 | 43 | try { |
41 | 44 | CustomerId customerId = new CustomerId(toUUID(strCustomerId)); |
42 | 45 | return checkCustomerId(customerId); |
... | ... | @@ -48,15 +51,15 @@ public class CustomerController extends BaseController { |
48 | 51 | @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')") |
49 | 52 | @RequestMapping(value = "/customer/{customerId}/shortInfo", method = RequestMethod.GET) |
50 | 53 | @ResponseBody |
51 | - public JsonNode getShortCustomerInfoById(@PathVariable("customerId") String strCustomerId) throws ThingsboardException { | |
52 | - checkParameter("customerId", strCustomerId); | |
54 | + public JsonNode getShortCustomerInfoById(@PathVariable(CUSTOMER_ID) String strCustomerId) throws ThingsboardException { | |
55 | + checkParameter(CUSTOMER_ID, strCustomerId); | |
53 | 56 | try { |
54 | 57 | CustomerId customerId = new CustomerId(toUUID(strCustomerId)); |
55 | 58 | Customer customer = checkCustomerId(customerId); |
56 | 59 | ObjectMapper objectMapper = new ObjectMapper(); |
57 | 60 | ObjectNode infoObject = objectMapper.createObjectNode(); |
58 | 61 | infoObject.put("title", customer.getTitle()); |
59 | - infoObject.put("isPublic", customer.isPublic()); | |
62 | + infoObject.put(IS_PUBLIC, customer.isPublic()); | |
60 | 63 | return infoObject; |
61 | 64 | } catch (Exception e) { |
62 | 65 | throw handleException(e); |
... | ... | @@ -66,8 +69,8 @@ public class CustomerController extends BaseController { |
66 | 69 | @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')") |
67 | 70 | @RequestMapping(value = "/customer/{customerId}/title", method = RequestMethod.GET, produces = "application/text") |
68 | 71 | @ResponseBody |
69 | - public String getCustomerTitleById(@PathVariable("customerId") String strCustomerId) throws ThingsboardException { | |
70 | - checkParameter("customerId", strCustomerId); | |
72 | + public String getCustomerTitleById(@PathVariable(CUSTOMER_ID) String strCustomerId) throws ThingsboardException { | |
73 | + checkParameter(CUSTOMER_ID, strCustomerId); | |
71 | 74 | try { |
72 | 75 | CustomerId customerId = new CustomerId(toUUID(strCustomerId)); |
73 | 76 | Customer customer = checkCustomerId(customerId); |
... | ... | @@ -92,8 +95,8 @@ public class CustomerController extends BaseController { |
92 | 95 | @PreAuthorize("hasAuthority('TENANT_ADMIN')") |
93 | 96 | @RequestMapping(value = "/customer/{customerId}", method = RequestMethod.DELETE) |
94 | 97 | @ResponseStatus(value = HttpStatus.OK) |
95 | - public void deleteCustomer(@PathVariable("customerId") String strCustomerId) throws ThingsboardException { | |
96 | - checkParameter("customerId", strCustomerId); | |
98 | + public void deleteCustomer(@PathVariable(CUSTOMER_ID) String strCustomerId) throws ThingsboardException { | |
99 | + checkParameter(CUSTOMER_ID, strCustomerId); | |
97 | 100 | try { |
98 | 101 | CustomerId customerId = new CustomerId(toUUID(strCustomerId)); |
99 | 102 | checkCustomerId(customerId); | ... | ... |
... | ... | @@ -34,6 +34,8 @@ import org.thingsboard.server.exception.ThingsboardException; |
34 | 34 | @RequestMapping("/api") |
35 | 35 | public class DashboardController extends BaseController { |
36 | 36 | |
37 | + public static final String DASHBOARD_ID = "dashboardId"; | |
38 | + | |
37 | 39 | @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')") |
38 | 40 | @RequestMapping(value = "/dashboard/serverTime", method = RequestMethod.GET) |
39 | 41 | @ResponseBody |
... | ... | @@ -44,8 +46,8 @@ public class DashboardController extends BaseController { |
44 | 46 | @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')") |
45 | 47 | @RequestMapping(value = "/dashboard/info/{dashboardId}", method = RequestMethod.GET) |
46 | 48 | @ResponseBody |
47 | - public DashboardInfo getDashboardInfoById(@PathVariable("dashboardId") String strDashboardId) throws ThingsboardException { | |
48 | - checkParameter("dashboardId", strDashboardId); | |
49 | + public DashboardInfo getDashboardInfoById(@PathVariable(DASHBOARD_ID) String strDashboardId) throws ThingsboardException { | |
50 | + checkParameter(DASHBOARD_ID, strDashboardId); | |
49 | 51 | try { |
50 | 52 | DashboardId dashboardId = new DashboardId(toUUID(strDashboardId)); |
51 | 53 | return checkDashboardInfoId(dashboardId); |
... | ... | @@ -57,8 +59,8 @@ public class DashboardController extends BaseController { |
57 | 59 | @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')") |
58 | 60 | @RequestMapping(value = "/dashboard/{dashboardId}", method = RequestMethod.GET) |
59 | 61 | @ResponseBody |
60 | - public Dashboard getDashboardById(@PathVariable("dashboardId") String strDashboardId) throws ThingsboardException { | |
61 | - checkParameter("dashboardId", strDashboardId); | |
62 | + public Dashboard getDashboardById(@PathVariable(DASHBOARD_ID) String strDashboardId) throws ThingsboardException { | |
63 | + checkParameter(DASHBOARD_ID, strDashboardId); | |
62 | 64 | try { |
63 | 65 | DashboardId dashboardId = new DashboardId(toUUID(strDashboardId)); |
64 | 66 | return checkDashboardId(dashboardId); |
... | ... | @@ -82,8 +84,8 @@ public class DashboardController extends BaseController { |
82 | 84 | @PreAuthorize("hasAuthority('TENANT_ADMIN')") |
83 | 85 | @RequestMapping(value = "/dashboard/{dashboardId}", method = RequestMethod.DELETE) |
84 | 86 | @ResponseStatus(value = HttpStatus.OK) |
85 | - public void deleteDashboard(@PathVariable("dashboardId") String strDashboardId) throws ThingsboardException { | |
86 | - checkParameter("dashboardId", strDashboardId); | |
87 | + public void deleteDashboard(@PathVariable(DASHBOARD_ID) String strDashboardId) throws ThingsboardException { | |
88 | + checkParameter(DASHBOARD_ID, strDashboardId); | |
87 | 89 | try { |
88 | 90 | DashboardId dashboardId = new DashboardId(toUUID(strDashboardId)); |
89 | 91 | checkDashboardId(dashboardId); |
... | ... | @@ -97,9 +99,9 @@ public class DashboardController extends BaseController { |
97 | 99 | @RequestMapping(value = "/customer/{customerId}/dashboard/{dashboardId}", method = RequestMethod.POST) |
98 | 100 | @ResponseBody |
99 | 101 | public Dashboard assignDashboardToCustomer(@PathVariable("customerId") String strCustomerId, |
100 | - @PathVariable("dashboardId") String strDashboardId) throws ThingsboardException { | |
102 | + @PathVariable(DASHBOARD_ID) String strDashboardId) throws ThingsboardException { | |
101 | 103 | checkParameter("customerId", strCustomerId); |
102 | - checkParameter("dashboardId", strDashboardId); | |
104 | + checkParameter(DASHBOARD_ID, strDashboardId); | |
103 | 105 | try { |
104 | 106 | CustomerId customerId = new CustomerId(toUUID(strCustomerId)); |
105 | 107 | checkCustomerId(customerId); |
... | ... | @@ -116,8 +118,8 @@ public class DashboardController extends BaseController { |
116 | 118 | @PreAuthorize("hasAuthority('TENANT_ADMIN')") |
117 | 119 | @RequestMapping(value = "/customer/dashboard/{dashboardId}", method = RequestMethod.DELETE) |
118 | 120 | @ResponseBody |
119 | - public Dashboard unassignDashboardFromCustomer(@PathVariable("dashboardId") String strDashboardId) throws ThingsboardException { | |
120 | - checkParameter("dashboardId", strDashboardId); | |
121 | + public Dashboard unassignDashboardFromCustomer(@PathVariable(DASHBOARD_ID) String strDashboardId) throws ThingsboardException { | |
122 | + checkParameter(DASHBOARD_ID, strDashboardId); | |
121 | 123 | try { |
122 | 124 | DashboardId dashboardId = new DashboardId(toUUID(strDashboardId)); |
123 | 125 | Dashboard dashboard = checkDashboardId(dashboardId); |
... | ... | @@ -133,8 +135,8 @@ public class DashboardController extends BaseController { |
133 | 135 | @PreAuthorize("hasAuthority('TENANT_ADMIN')") |
134 | 136 | @RequestMapping(value = "/customer/public/dashboard/{dashboardId}", method = RequestMethod.POST) |
135 | 137 | @ResponseBody |
136 | - public Dashboard assignDashboardToPublicCustomer(@PathVariable("dashboardId") String strDashboardId) throws ThingsboardException { | |
137 | - checkParameter("dashboardId", strDashboardId); | |
138 | + public Dashboard assignDashboardToPublicCustomer(@PathVariable(DASHBOARD_ID) String strDashboardId) throws ThingsboardException { | |
139 | + checkParameter(DASHBOARD_ID, strDashboardId); | |
138 | 140 | try { |
139 | 141 | DashboardId dashboardId = new DashboardId(toUUID(strDashboardId)); |
140 | 142 | Dashboard dashboard = checkDashboardId(dashboardId); | ... | ... |
... | ... | @@ -44,11 +44,13 @@ import java.util.stream.Collectors; |
44 | 44 | @RequestMapping("/api") |
45 | 45 | public class DeviceController extends BaseController { |
46 | 46 | |
47 | + public static final String DEVICE_ID = "deviceId"; | |
48 | + | |
47 | 49 | @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')") |
48 | 50 | @RequestMapping(value = "/device/{deviceId}", method = RequestMethod.GET) |
49 | 51 | @ResponseBody |
50 | - public Device getDeviceById(@PathVariable("deviceId") String strDeviceId) throws ThingsboardException { | |
51 | - checkParameter("deviceId", strDeviceId); | |
52 | + public Device getDeviceById(@PathVariable(DEVICE_ID) String strDeviceId) throws ThingsboardException { | |
53 | + checkParameter(DEVICE_ID, strDeviceId); | |
52 | 54 | try { |
53 | 55 | DeviceId deviceId = new DeviceId(toUUID(strDeviceId)); |
54 | 56 | return checkDeviceId(deviceId); |
... | ... | @@ -88,8 +90,8 @@ public class DeviceController extends BaseController { |
88 | 90 | @PreAuthorize("hasAuthority('TENANT_ADMIN')") |
89 | 91 | @RequestMapping(value = "/device/{deviceId}", method = RequestMethod.DELETE) |
90 | 92 | @ResponseStatus(value = HttpStatus.OK) |
91 | - public void deleteDevice(@PathVariable("deviceId") String strDeviceId) throws ThingsboardException { | |
92 | - checkParameter("deviceId", strDeviceId); | |
93 | + public void deleteDevice(@PathVariable(DEVICE_ID) String strDeviceId) throws ThingsboardException { | |
94 | + checkParameter(DEVICE_ID, strDeviceId); | |
93 | 95 | try { |
94 | 96 | DeviceId deviceId = new DeviceId(toUUID(strDeviceId)); |
95 | 97 | checkDeviceId(deviceId); |
... | ... | @@ -103,9 +105,9 @@ public class DeviceController extends BaseController { |
103 | 105 | @RequestMapping(value = "/customer/{customerId}/device/{deviceId}", method = RequestMethod.POST) |
104 | 106 | @ResponseBody |
105 | 107 | public Device assignDeviceToCustomer(@PathVariable("customerId") String strCustomerId, |
106 | - @PathVariable("deviceId") String strDeviceId) throws ThingsboardException { | |
108 | + @PathVariable(DEVICE_ID) String strDeviceId) throws ThingsboardException { | |
107 | 109 | checkParameter("customerId", strCustomerId); |
108 | - checkParameter("deviceId", strDeviceId); | |
110 | + checkParameter(DEVICE_ID, strDeviceId); | |
109 | 111 | try { |
110 | 112 | CustomerId customerId = new CustomerId(toUUID(strCustomerId)); |
111 | 113 | checkCustomerId(customerId); |
... | ... | @@ -122,8 +124,8 @@ public class DeviceController extends BaseController { |
122 | 124 | @PreAuthorize("hasAuthority('TENANT_ADMIN')") |
123 | 125 | @RequestMapping(value = "/customer/device/{deviceId}", method = RequestMethod.DELETE) |
124 | 126 | @ResponseBody |
125 | - public Device unassignDeviceFromCustomer(@PathVariable("deviceId") String strDeviceId) throws ThingsboardException { | |
126 | - checkParameter("deviceId", strDeviceId); | |
127 | + public Device unassignDeviceFromCustomer(@PathVariable(DEVICE_ID) String strDeviceId) throws ThingsboardException { | |
128 | + checkParameter(DEVICE_ID, strDeviceId); | |
127 | 129 | try { |
128 | 130 | DeviceId deviceId = new DeviceId(toUUID(strDeviceId)); |
129 | 131 | Device device = checkDeviceId(deviceId); |
... | ... | @@ -139,8 +141,8 @@ public class DeviceController extends BaseController { |
139 | 141 | @PreAuthorize("hasAuthority('TENANT_ADMIN')") |
140 | 142 | @RequestMapping(value = "/customer/public/device/{deviceId}", method = RequestMethod.POST) |
141 | 143 | @ResponseBody |
142 | - public Device assignDeviceToPublicCustomer(@PathVariable("deviceId") String strDeviceId) throws ThingsboardException { | |
143 | - checkParameter("deviceId", strDeviceId); | |
144 | + public Device assignDeviceToPublicCustomer(@PathVariable(DEVICE_ID) String strDeviceId) throws ThingsboardException { | |
145 | + checkParameter(DEVICE_ID, strDeviceId); | |
144 | 146 | try { |
145 | 147 | DeviceId deviceId = new DeviceId(toUUID(strDeviceId)); |
146 | 148 | Device device = checkDeviceId(deviceId); |
... | ... | @@ -154,8 +156,8 @@ public class DeviceController extends BaseController { |
154 | 156 | @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')") |
155 | 157 | @RequestMapping(value = "/device/{deviceId}/credentials", method = RequestMethod.GET) |
156 | 158 | @ResponseBody |
157 | - public DeviceCredentials getDeviceCredentialsByDeviceId(@PathVariable("deviceId") String strDeviceId) throws ThingsboardException { | |
158 | - checkParameter("deviceId", strDeviceId); | |
159 | + public DeviceCredentials getDeviceCredentialsByDeviceId(@PathVariable(DEVICE_ID) String strDeviceId) throws ThingsboardException { | |
160 | + checkParameter(DEVICE_ID, strDeviceId); | |
159 | 161 | try { |
160 | 162 | DeviceId deviceId = new DeviceId(toUUID(strDeviceId)); |
161 | 163 | checkDeviceId(deviceId); | ... | ... |
... | ... | @@ -34,6 +34,12 @@ import java.util.List; |
34 | 34 | @RequestMapping("/api") |
35 | 35 | public class EntityRelationController extends BaseController { |
36 | 36 | |
37 | + public static final String TO_TYPE = "toType"; | |
38 | + public static final String FROM_ID = "fromId"; | |
39 | + public static final String FROM_TYPE = "fromType"; | |
40 | + public static final String RELATION_TYPE = "relationType"; | |
41 | + public static final String TO_ID = "toId"; | |
42 | + | |
37 | 43 | @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')") |
38 | 44 | @RequestMapping(value = "/relation", method = RequestMethod.POST) |
39 | 45 | @ResponseStatus(value = HttpStatus.OK) |
... | ... | @@ -45,32 +51,32 @@ public class EntityRelationController extends BaseController { |
45 | 51 | if (relation.getTypeGroup() == null) { |
46 | 52 | relation.setTypeGroup(RelationTypeGroup.COMMON); |
47 | 53 | } |
48 | - relationService.saveRelation(relation).get(); | |
54 | + relationService.saveRelation(relation); | |
49 | 55 | } catch (Exception e) { |
50 | 56 | throw handleException(e); |
51 | 57 | } |
52 | 58 | } |
53 | 59 | |
54 | 60 | @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')") |
55 | - @RequestMapping(value = "/relation", method = RequestMethod.DELETE, params = {"fromId", "fromType", "relationType", "toId", "toType"}) | |
61 | + @RequestMapping(value = "/relation", method = RequestMethod.DELETE, params = {FROM_ID, FROM_TYPE, RELATION_TYPE, TO_ID, TO_TYPE}) | |
56 | 62 | @ResponseStatus(value = HttpStatus.OK) |
57 | - public void deleteRelation(@RequestParam("fromId") String strFromId, | |
58 | - @RequestParam("fromType") String strFromType, | |
59 | - @RequestParam("relationType") String strRelationType, | |
63 | + public void deleteRelation(@RequestParam(FROM_ID) String strFromId, | |
64 | + @RequestParam(FROM_TYPE) String strFromType, | |
65 | + @RequestParam(RELATION_TYPE) String strRelationType, | |
60 | 66 | @RequestParam(value = "relationTypeGroup", required = false) String strRelationTypeGroup, |
61 | - @RequestParam("toId") String strToId, @RequestParam("toType") String strToType) throws ThingsboardException { | |
62 | - checkParameter("fromId", strFromId); | |
63 | - checkParameter("fromType", strFromType); | |
64 | - checkParameter("relationType", strRelationType); | |
65 | - checkParameter("toId", strToId); | |
66 | - checkParameter("toType", strToType); | |
67 | + @RequestParam(TO_ID) String strToId, @RequestParam(TO_TYPE) String strToType) throws ThingsboardException { | |
68 | + checkParameter(FROM_ID, strFromId); | |
69 | + checkParameter(FROM_TYPE, strFromType); | |
70 | + checkParameter(RELATION_TYPE, strRelationType); | |
71 | + checkParameter(TO_ID, strToId); | |
72 | + checkParameter(TO_TYPE, strToType); | |
67 | 73 | EntityId fromId = EntityIdFactory.getByTypeAndId(strFromType, strFromId); |
68 | 74 | EntityId toId = EntityIdFactory.getByTypeAndId(strToType, strToId); |
69 | 75 | checkEntityId(fromId); |
70 | 76 | checkEntityId(toId); |
71 | 77 | RelationTypeGroup relationTypeGroup = parseRelationTypeGroup(strRelationTypeGroup, RelationTypeGroup.COMMON); |
72 | 78 | try { |
73 | - Boolean found = relationService.deleteRelation(fromId, toId, strRelationType, relationTypeGroup).get(); | |
79 | + Boolean found = relationService.deleteRelation(fromId, toId, strRelationType, relationTypeGroup); | |
74 | 80 | if (!found) { |
75 | 81 | throw new ThingsboardException("Requested item wasn't found!", ThingsboardErrorCode.ITEM_NOT_FOUND); |
76 | 82 | } |
... | ... | @@ -89,26 +95,26 @@ public class EntityRelationController extends BaseController { |
89 | 95 | EntityId entityId = EntityIdFactory.getByTypeAndId(strType, strId); |
90 | 96 | checkEntityId(entityId); |
91 | 97 | try { |
92 | - relationService.deleteEntityRelations(entityId).get(); | |
98 | + relationService.deleteEntityRelations(entityId); | |
93 | 99 | } catch (Exception e) { |
94 | 100 | throw handleException(e); |
95 | 101 | } |
96 | 102 | } |
97 | 103 | |
98 | 104 | @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')") |
99 | - @RequestMapping(value = "/relation", method = RequestMethod.GET, params = {"fromId", "fromType", "relationType", "toId", "toType"}) | |
105 | + @RequestMapping(value = "/relation", method = RequestMethod.GET, params = {FROM_ID, FROM_TYPE, RELATION_TYPE, TO_ID, TO_TYPE}) | |
100 | 106 | @ResponseBody |
101 | - public EntityRelation getRelation(@RequestParam("fromId") String strFromId, | |
102 | - @RequestParam("fromType") String strFromType, | |
103 | - @RequestParam("relationType") String strRelationType, | |
104 | - @RequestParam(value = "relationTypeGroup", required = false) String strRelationTypeGroup, | |
105 | - @RequestParam("toId") String strToId, @RequestParam("toType") String strToType) throws ThingsboardException { | |
107 | + public EntityRelation getRelation(@RequestParam(FROM_ID) String strFromId, | |
108 | + @RequestParam(FROM_TYPE) String strFromType, | |
109 | + @RequestParam(RELATION_TYPE) String strRelationType, | |
110 | + @RequestParam(value = "relationTypeGroup", required = false) String strRelationTypeGroup, | |
111 | + @RequestParam(TO_ID) String strToId, @RequestParam(TO_TYPE) String strToType) throws ThingsboardException { | |
106 | 112 | try { |
107 | - checkParameter("fromId", strFromId); | |
108 | - checkParameter("fromType", strFromType); | |
109 | - checkParameter("relationType", strRelationType); | |
110 | - checkParameter("toId", strToId); | |
111 | - checkParameter("toType", strToType); | |
113 | + checkParameter(FROM_ID, strFromId); | |
114 | + checkParameter(FROM_TYPE, strFromType); | |
115 | + checkParameter(RELATION_TYPE, strRelationType); | |
116 | + checkParameter(TO_ID, strToId); | |
117 | + checkParameter(TO_TYPE, strToType); | |
112 | 118 | EntityId fromId = EntityIdFactory.getByTypeAndId(strFromType, strFromId); |
113 | 119 | EntityId toId = EntityIdFactory.getByTypeAndId(strToType, strToId); |
114 | 120 | checkEntityId(fromId); |
... | ... | @@ -121,13 +127,13 @@ public class EntityRelationController extends BaseController { |
121 | 127 | } |
122 | 128 | |
123 | 129 | @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')") |
124 | - @RequestMapping(value = "/relations", method = RequestMethod.GET, params = {"fromId", "fromType"}) | |
130 | + @RequestMapping(value = "/relations", method = RequestMethod.GET, params = {FROM_ID, FROM_TYPE}) | |
125 | 131 | @ResponseBody |
126 | - public List<EntityRelation> findByFrom(@RequestParam("fromId") String strFromId, | |
127 | - @RequestParam("fromType") String strFromType, | |
132 | + public List<EntityRelation> findByFrom(@RequestParam(FROM_ID) String strFromId, | |
133 | + @RequestParam(FROM_TYPE) String strFromType, | |
128 | 134 | @RequestParam(value = "relationTypeGroup", required = false) String strRelationTypeGroup) throws ThingsboardException { |
129 | - checkParameter("fromId", strFromId); | |
130 | - checkParameter("fromType", strFromType); | |
135 | + checkParameter(FROM_ID, strFromId); | |
136 | + checkParameter(FROM_TYPE, strFromType); | |
131 | 137 | EntityId entityId = EntityIdFactory.getByTypeAndId(strFromType, strFromId); |
132 | 138 | checkEntityId(entityId); |
133 | 139 | RelationTypeGroup typeGroup = parseRelationTypeGroup(strRelationTypeGroup, RelationTypeGroup.COMMON); |
... | ... | @@ -139,13 +145,13 @@ public class EntityRelationController extends BaseController { |
139 | 145 | } |
140 | 146 | |
141 | 147 | @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')") |
142 | - @RequestMapping(value = "/relations/info", method = RequestMethod.GET, params = {"fromId", "fromType"}) | |
148 | + @RequestMapping(value = "/relations/info", method = RequestMethod.GET, params = {FROM_ID, FROM_TYPE}) | |
143 | 149 | @ResponseBody |
144 | - public List<EntityRelationInfo> findInfoByFrom(@RequestParam("fromId") String strFromId, | |
145 | - @RequestParam("fromType") String strFromType, | |
150 | + public List<EntityRelationInfo> findInfoByFrom(@RequestParam(FROM_ID) String strFromId, | |
151 | + @RequestParam(FROM_TYPE) String strFromType, | |
146 | 152 | @RequestParam(value = "relationTypeGroup", required = false) String strRelationTypeGroup) throws ThingsboardException { |
147 | - checkParameter("fromId", strFromId); | |
148 | - checkParameter("fromType", strFromType); | |
153 | + checkParameter(FROM_ID, strFromId); | |
154 | + checkParameter(FROM_TYPE, strFromType); | |
149 | 155 | EntityId entityId = EntityIdFactory.getByTypeAndId(strFromType, strFromId); |
150 | 156 | checkEntityId(entityId); |
151 | 157 | RelationTypeGroup typeGroup = parseRelationTypeGroup(strRelationTypeGroup, RelationTypeGroup.COMMON); |
... | ... | @@ -157,15 +163,15 @@ public class EntityRelationController extends BaseController { |
157 | 163 | } |
158 | 164 | |
159 | 165 | @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')") |
160 | - @RequestMapping(value = "/relations", method = RequestMethod.GET, params = {"fromId", "fromType", "relationType"}) | |
166 | + @RequestMapping(value = "/relations", method = RequestMethod.GET, params = {FROM_ID, FROM_TYPE, RELATION_TYPE}) | |
161 | 167 | @ResponseBody |
162 | - public List<EntityRelation> findByFrom(@RequestParam("fromId") String strFromId, | |
163 | - @RequestParam("fromType") String strFromType, | |
164 | - @RequestParam("relationType") String strRelationType, | |
168 | + public List<EntityRelation> findByFrom(@RequestParam(FROM_ID) String strFromId, | |
169 | + @RequestParam(FROM_TYPE) String strFromType, | |
170 | + @RequestParam(RELATION_TYPE) String strRelationType, | |
165 | 171 | @RequestParam(value = "relationTypeGroup", required = false) String strRelationTypeGroup) throws ThingsboardException { |
166 | - checkParameter("fromId", strFromId); | |
167 | - checkParameter("fromType", strFromType); | |
168 | - checkParameter("relationType", strRelationType); | |
172 | + checkParameter(FROM_ID, strFromId); | |
173 | + checkParameter(FROM_TYPE, strFromType); | |
174 | + checkParameter(RELATION_TYPE, strRelationType); | |
169 | 175 | EntityId entityId = EntityIdFactory.getByTypeAndId(strFromType, strFromId); |
170 | 176 | checkEntityId(entityId); |
171 | 177 | RelationTypeGroup typeGroup = parseRelationTypeGroup(strRelationTypeGroup, RelationTypeGroup.COMMON); |
... | ... | @@ -177,13 +183,13 @@ public class EntityRelationController extends BaseController { |
177 | 183 | } |
178 | 184 | |
179 | 185 | @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')") |
180 | - @RequestMapping(value = "/relations", method = RequestMethod.GET, params = {"toId", "toType"}) | |
186 | + @RequestMapping(value = "/relations", method = RequestMethod.GET, params = {TO_ID, TO_TYPE}) | |
181 | 187 | @ResponseBody |
182 | - public List<EntityRelation> findByTo(@RequestParam("toId") String strToId, | |
183 | - @RequestParam("toType") String strToType, | |
188 | + public List<EntityRelation> findByTo(@RequestParam(TO_ID) String strToId, | |
189 | + @RequestParam(TO_TYPE) String strToType, | |
184 | 190 | @RequestParam(value = "relationTypeGroup", required = false) String strRelationTypeGroup) throws ThingsboardException { |
185 | - checkParameter("toId", strToId); | |
186 | - checkParameter("toType", strToType); | |
191 | + checkParameter(TO_ID, strToId); | |
192 | + checkParameter(TO_TYPE, strToType); | |
187 | 193 | EntityId entityId = EntityIdFactory.getByTypeAndId(strToType, strToId); |
188 | 194 | checkEntityId(entityId); |
189 | 195 | RelationTypeGroup typeGroup = parseRelationTypeGroup(strRelationTypeGroup, RelationTypeGroup.COMMON); |
... | ... | @@ -195,13 +201,13 @@ public class EntityRelationController extends BaseController { |
195 | 201 | } |
196 | 202 | |
197 | 203 | @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')") |
198 | - @RequestMapping(value = "/relations/info", method = RequestMethod.GET, params = {"toId", "toType"}) | |
204 | + @RequestMapping(value = "/relations/info", method = RequestMethod.GET, params = {TO_ID, TO_TYPE}) | |
199 | 205 | @ResponseBody |
200 | - public List<EntityRelationInfo> findInfoByTo(@RequestParam("toId") String strToId, | |
201 | - @RequestParam("toType") String strToType, | |
206 | + public List<EntityRelationInfo> findInfoByTo(@RequestParam(TO_ID) String strToId, | |
207 | + @RequestParam(TO_TYPE) String strToType, | |
202 | 208 | @RequestParam(value = "relationTypeGroup", required = false) String strRelationTypeGroup) throws ThingsboardException { |
203 | - checkParameter("toId", strToId); | |
204 | - checkParameter("toType", strToType); | |
209 | + checkParameter(TO_ID, strToId); | |
210 | + checkParameter(TO_TYPE, strToType); | |
205 | 211 | EntityId entityId = EntityIdFactory.getByTypeAndId(strToType, strToId); |
206 | 212 | checkEntityId(entityId); |
207 | 213 | RelationTypeGroup typeGroup = parseRelationTypeGroup(strRelationTypeGroup, RelationTypeGroup.COMMON); |
... | ... | @@ -213,15 +219,15 @@ public class EntityRelationController extends BaseController { |
213 | 219 | } |
214 | 220 | |
215 | 221 | @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')") |
216 | - @RequestMapping(value = "/relations", method = RequestMethod.GET, params = {"toId", "toType", "relationType"}) | |
222 | + @RequestMapping(value = "/relations", method = RequestMethod.GET, params = {TO_ID, TO_TYPE, RELATION_TYPE}) | |
217 | 223 | @ResponseBody |
218 | - public List<EntityRelation> findByTo(@RequestParam("toId") String strToId, | |
219 | - @RequestParam("toType") String strToType, | |
220 | - @RequestParam("relationType") String strRelationType, | |
224 | + public List<EntityRelation> findByTo(@RequestParam(TO_ID) String strToId, | |
225 | + @RequestParam(TO_TYPE) String strToType, | |
226 | + @RequestParam(RELATION_TYPE) String strRelationType, | |
221 | 227 | @RequestParam(value = "relationTypeGroup", required = false) String strRelationTypeGroup) throws ThingsboardException { |
222 | - checkParameter("toId", strToId); | |
223 | - checkParameter("toType", strToType); | |
224 | - checkParameter("relationType", strRelationType); | |
228 | + checkParameter(TO_ID, strToId); | |
229 | + checkParameter(TO_TYPE, strToType); | |
230 | + checkParameter(RELATION_TYPE, strRelationType); | |
225 | 231 | EntityId entityId = EntityIdFactory.getByTypeAndId(strToType, strToId); |
226 | 232 | checkEntityId(entityId); |
227 | 233 | RelationTypeGroup typeGroup = parseRelationTypeGroup(strRelationTypeGroup, RelationTypeGroup.COMMON); |
... | ... | @@ -267,9 +273,7 @@ public class EntityRelationController extends BaseController { |
267 | 273 | if (strRelationTypeGroup != null && strRelationTypeGroup.trim().length()>0) { |
268 | 274 | try { |
269 | 275 | result = RelationTypeGroup.valueOf(strRelationTypeGroup); |
270 | - } catch (IllegalArgumentException e) { | |
271 | - result = defaultValue; | |
272 | - } | |
276 | + } catch (IllegalArgumentException e) { } | |
273 | 277 | } |
274 | 278 | return result; |
275 | 279 | } | ... | ... |
... | ... | @@ -34,11 +34,13 @@ import java.util.List; |
34 | 34 | @RequestMapping("/api") |
35 | 35 | public class PluginController extends BaseController { |
36 | 36 | |
37 | + public static final String PLUGIN_ID = "pluginId"; | |
38 | + | |
37 | 39 | @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')") |
38 | 40 | @RequestMapping(value = "/plugin/{pluginId}", method = RequestMethod.GET) |
39 | 41 | @ResponseBody |
40 | - public PluginMetaData getPluginById(@PathVariable("pluginId") String strPluginId) throws ThingsboardException { | |
41 | - checkParameter("pluginId", strPluginId); | |
42 | + public PluginMetaData getPluginById(@PathVariable(PLUGIN_ID) String strPluginId) throws ThingsboardException { | |
43 | + checkParameter(PLUGIN_ID, strPluginId); | |
42 | 44 | try { |
43 | 45 | PluginId pluginId = new PluginId(toUUID(strPluginId)); |
44 | 46 | return checkPlugin(pluginService.findPluginById(pluginId)); |
... | ... | @@ -78,8 +80,8 @@ public class PluginController extends BaseController { |
78 | 80 | @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')") |
79 | 81 | @RequestMapping(value = "/plugin/{pluginId}/activate", method = RequestMethod.POST) |
80 | 82 | @ResponseStatus(value = HttpStatus.OK) |
81 | - public void activatePluginById(@PathVariable("pluginId") String strPluginId) throws ThingsboardException { | |
82 | - checkParameter("pluginId", strPluginId); | |
83 | + public void activatePluginById(@PathVariable(PLUGIN_ID) String strPluginId) throws ThingsboardException { | |
84 | + checkParameter(PLUGIN_ID, strPluginId); | |
83 | 85 | try { |
84 | 86 | PluginId pluginId = new PluginId(toUUID(strPluginId)); |
85 | 87 | PluginMetaData plugin = checkPlugin(pluginService.findPluginById(pluginId)); |
... | ... | @@ -93,8 +95,8 @@ public class PluginController extends BaseController { |
93 | 95 | @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')") |
94 | 96 | @RequestMapping(value = "/plugin/{pluginId}/suspend", method = RequestMethod.POST) |
95 | 97 | @ResponseStatus(value = HttpStatus.OK) |
96 | - public void suspendPluginById(@PathVariable("pluginId") String strPluginId) throws ThingsboardException { | |
97 | - checkParameter("pluginId", strPluginId); | |
98 | + public void suspendPluginById(@PathVariable(PLUGIN_ID) String strPluginId) throws ThingsboardException { | |
99 | + checkParameter(PLUGIN_ID, strPluginId); | |
98 | 100 | try { |
99 | 101 | PluginId pluginId = new PluginId(toUUID(strPluginId)); |
100 | 102 | PluginMetaData plugin = checkPlugin(pluginService.findPluginById(pluginId)); |
... | ... | @@ -180,8 +182,8 @@ public class PluginController extends BaseController { |
180 | 182 | @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')") |
181 | 183 | @RequestMapping(value = "/plugin/{pluginId}", method = RequestMethod.DELETE) |
182 | 184 | @ResponseStatus(value = HttpStatus.OK) |
183 | - public void deletePlugin(@PathVariable("pluginId") String strPluginId) throws ThingsboardException { | |
184 | - checkParameter("pluginId", strPluginId); | |
185 | + public void deletePlugin(@PathVariable(PLUGIN_ID) String strPluginId) throws ThingsboardException { | |
186 | + checkParameter(PLUGIN_ID, strPluginId); | |
185 | 187 | try { |
186 | 188 | PluginId pluginId = new PluginId(toUUID(strPluginId)); |
187 | 189 | PluginMetaData plugin = checkPlugin(pluginService.findPluginById(pluginId)); | ... | ... |
... | ... | @@ -34,11 +34,13 @@ import java.util.List; |
34 | 34 | @RequestMapping("/api") |
35 | 35 | public class RuleController extends BaseController { |
36 | 36 | |
37 | + public static final String RULE_ID = "ruleId"; | |
38 | + | |
37 | 39 | @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')") |
38 | 40 | @RequestMapping(value = "/rule/{ruleId}", method = RequestMethod.GET) |
39 | 41 | @ResponseBody |
40 | - public RuleMetaData getRuleById(@PathVariable("ruleId") String strRuleId) throws ThingsboardException { | |
41 | - checkParameter("ruleId", strRuleId); | |
42 | + public RuleMetaData getRuleById(@PathVariable(RULE_ID) String strRuleId) throws ThingsboardException { | |
43 | + checkParameter(RULE_ID, strRuleId); | |
42 | 44 | try { |
43 | 45 | RuleId ruleId = new RuleId(toUUID(strRuleId)); |
44 | 46 | return checkRule(ruleService.findRuleById(ruleId)); |
... | ... | @@ -80,8 +82,8 @@ public class RuleController extends BaseController { |
80 | 82 | @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')") |
81 | 83 | @RequestMapping(value = "/rule/{ruleId}/activate", method = RequestMethod.POST) |
82 | 84 | @ResponseStatus(value = HttpStatus.OK) |
83 | - public void activateRuleById(@PathVariable("ruleId") String strRuleId) throws ThingsboardException { | |
84 | - checkParameter("ruleId", strRuleId); | |
85 | + public void activateRuleById(@PathVariable(RULE_ID) String strRuleId) throws ThingsboardException { | |
86 | + checkParameter(RULE_ID, strRuleId); | |
85 | 87 | try { |
86 | 88 | RuleId ruleId = new RuleId(toUUID(strRuleId)); |
87 | 89 | RuleMetaData rule = checkRule(ruleService.findRuleById(ruleId)); |
... | ... | @@ -95,8 +97,8 @@ public class RuleController extends BaseController { |
95 | 97 | @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')") |
96 | 98 | @RequestMapping(value = "/rule/{ruleId}/suspend", method = RequestMethod.POST) |
97 | 99 | @ResponseStatus(value = HttpStatus.OK) |
98 | - public void suspendRuleById(@PathVariable("ruleId") String strRuleId) throws ThingsboardException { | |
99 | - checkParameter("ruleId", strRuleId); | |
100 | + public void suspendRuleById(@PathVariable(RULE_ID) String strRuleId) throws ThingsboardException { | |
101 | + checkParameter(RULE_ID, strRuleId); | |
100 | 102 | try { |
101 | 103 | RuleId ruleId = new RuleId(toUUID(strRuleId)); |
102 | 104 | RuleMetaData rule = checkRule(ruleService.findRuleById(ruleId)); |
... | ... | @@ -178,8 +180,8 @@ public class RuleController extends BaseController { |
178 | 180 | @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')") |
179 | 181 | @RequestMapping(value = "/rule/{ruleId}", method = RequestMethod.DELETE) |
180 | 182 | @ResponseStatus(value = HttpStatus.OK) |
181 | - public void deleteRule(@PathVariable("ruleId") String strRuleId) throws ThingsboardException { | |
182 | - checkParameter("ruleId", strRuleId); | |
183 | + public void deleteRule(@PathVariable(RULE_ID) String strRuleId) throws ThingsboardException { | |
184 | + checkParameter(RULE_ID, strRuleId); | |
183 | 185 | try { |
184 | 186 | RuleId ruleId = new RuleId(toUUID(strRuleId)); |
185 | 187 | RuleMetaData rule = checkRule(ruleService.findRuleById(ruleId)); | ... | ... |
... | ... | @@ -38,19 +38,22 @@ import javax.servlet.http.HttpServletRequest; |
38 | 38 | @RequestMapping("/api") |
39 | 39 | public class UserController extends BaseController { |
40 | 40 | |
41 | + public static final String USER_ID = "userId"; | |
42 | + public static final String YOU_DON_T_HAVE_PERMISSION_TO_PERFORM_THIS_OPERATION = "You don't have permission to perform this operation!"; | |
43 | + public static final String ACTIVATE_URL_PATTERN = "%s/api/noauth/activate?activateToken=%s"; | |
41 | 44 | @Autowired |
42 | 45 | private MailService mailService; |
43 | 46 | |
44 | 47 | @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')") |
45 | 48 | @RequestMapping(value = "/user/{userId}", method = RequestMethod.GET) |
46 | 49 | @ResponseBody |
47 | - public User getUserById(@PathVariable("userId") String strUserId) throws ThingsboardException { | |
48 | - checkParameter("userId", strUserId); | |
50 | + public User getUserById(@PathVariable(USER_ID) String strUserId) throws ThingsboardException { | |
51 | + checkParameter(USER_ID, strUserId); | |
49 | 52 | try { |
50 | 53 | UserId userId = new UserId(toUUID(strUserId)); |
51 | 54 | SecurityUser authUser = getCurrentUser(); |
52 | 55 | if (authUser.getAuthority() == Authority.CUSTOMER_USER && !authUser.getId().equals(userId)) { |
53 | - throw new ThingsboardException("You don't have permission to perform this operation!", | |
56 | + throw new ThingsboardException(YOU_DON_T_HAVE_PERMISSION_TO_PERFORM_THIS_OPERATION, | |
54 | 57 | ThingsboardErrorCode.PERMISSION_DENIED); |
55 | 58 | } |
56 | 59 | return checkUserId(userId); |
... | ... | @@ -68,7 +71,7 @@ public class UserController extends BaseController { |
68 | 71 | try { |
69 | 72 | SecurityUser authUser = getCurrentUser(); |
70 | 73 | if (authUser.getAuthority() == Authority.CUSTOMER_USER && !authUser.getId().equals(user.getId())) { |
71 | - throw new ThingsboardException("You don't have permission to perform this operation!", | |
74 | + throw new ThingsboardException(YOU_DON_T_HAVE_PERMISSION_TO_PERFORM_THIS_OPERATION, | |
72 | 75 | ThingsboardErrorCode.PERMISSION_DENIED); |
73 | 76 | } |
74 | 77 | boolean sendEmail = user.getId() == null && sendActivationMail; |
... | ... | @@ -79,7 +82,7 @@ public class UserController extends BaseController { |
79 | 82 | if (sendEmail) { |
80 | 83 | UserCredentials userCredentials = userService.findUserCredentialsByUserId(savedUser.getId()); |
81 | 84 | String baseUrl = constructBaseUrl(request); |
82 | - String activateUrl = String.format("%s/api/noauth/activate?activateToken=%s", baseUrl, | |
85 | + String activateUrl = String.format(ACTIVATE_URL_PATTERN, baseUrl, | |
83 | 86 | userCredentials.getActivateToken()); |
84 | 87 | String email = savedUser.getEmail(); |
85 | 88 | try { |
... | ... | @@ -106,7 +109,7 @@ public class UserController extends BaseController { |
106 | 109 | UserCredentials userCredentials = userService.findUserCredentialsByUserId(user.getId()); |
107 | 110 | if (!userCredentials.isEnabled()) { |
108 | 111 | String baseUrl = constructBaseUrl(request); |
109 | - String activateUrl = String.format("%s/api/noauth/activate?activateToken=%s", baseUrl, | |
112 | + String activateUrl = String.format(ACTIVATE_URL_PATTERN, baseUrl, | |
110 | 113 | userCredentials.getActivateToken()); |
111 | 114 | mailService.sendActivationEmail(activateUrl, email); |
112 | 115 | } else { |
... | ... | @@ -121,21 +124,21 @@ public class UserController extends BaseController { |
121 | 124 | @RequestMapping(value = "/user/{userId}/activationLink", method = RequestMethod.GET, produces = "text/plain") |
122 | 125 | @ResponseBody |
123 | 126 | public String getActivationLink( |
124 | - @PathVariable("userId") String strUserId, | |
127 | + @PathVariable(USER_ID) String strUserId, | |
125 | 128 | HttpServletRequest request) throws ThingsboardException { |
126 | - checkParameter("userId", strUserId); | |
129 | + checkParameter(USER_ID, strUserId); | |
127 | 130 | try { |
128 | 131 | UserId userId = new UserId(toUUID(strUserId)); |
129 | 132 | SecurityUser authUser = getCurrentUser(); |
130 | 133 | if (authUser.getAuthority() == Authority.CUSTOMER_USER && !authUser.getId().equals(userId)) { |
131 | - throw new ThingsboardException("You don't have permission to perform this operation!", | |
134 | + throw new ThingsboardException(YOU_DON_T_HAVE_PERMISSION_TO_PERFORM_THIS_OPERATION, | |
132 | 135 | ThingsboardErrorCode.PERMISSION_DENIED); |
133 | 136 | } |
134 | 137 | User user = checkUserId(userId); |
135 | 138 | UserCredentials userCredentials = userService.findUserCredentialsByUserId(user.getId()); |
136 | 139 | if (!userCredentials.isEnabled()) { |
137 | 140 | String baseUrl = constructBaseUrl(request); |
138 | - String activateUrl = String.format("%s/api/noauth/activate?activateToken=%s", baseUrl, | |
141 | + String activateUrl = String.format(ACTIVATE_URL_PATTERN, baseUrl, | |
139 | 142 | userCredentials.getActivateToken()); |
140 | 143 | return activateUrl; |
141 | 144 | } else { |
... | ... | @@ -149,8 +152,8 @@ public class UserController extends BaseController { |
149 | 152 | @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')") |
150 | 153 | @RequestMapping(value = "/user/{userId}", method = RequestMethod.DELETE) |
151 | 154 | @ResponseStatus(value = HttpStatus.OK) |
152 | - public void deleteUser(@PathVariable("userId") String strUserId) throws ThingsboardException { | |
153 | - checkParameter("userId", strUserId); | |
155 | + public void deleteUser(@PathVariable(USER_ID) String strUserId) throws ThingsboardException { | |
156 | + checkParameter(USER_ID, strUserId); | |
154 | 157 | try { |
155 | 158 | UserId userId = new UserId(toUUID(strUserId)); |
156 | 159 | checkUserId(userId); | ... | ... |
... | ... | @@ -47,12 +47,6 @@ import javax.servlet.http.HttpServletRequest; |
47 | 47 | @Slf4j |
48 | 48 | public class PluginApiController extends BaseController { |
49 | 49 | |
50 | - @Autowired | |
51 | - private ActorService actorService; | |
52 | - | |
53 | - @Autowired | |
54 | - private PluginService pluginService; | |
55 | - | |
56 | 50 | @SuppressWarnings("rawtypes") |
57 | 51 | @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')") |
58 | 52 | @RequestMapping(value = "/{pluginToken}/**") |
... | ... | @@ -71,7 +65,7 @@ public class PluginApiController extends BaseController { |
71 | 65 | TenantId tenantId = getCurrentUser().getTenantId(); |
72 | 66 | CustomerId customerId = getCurrentUser().getCustomerId(); |
73 | 67 | if (validatePluginAccess(pluginMd, tenantId, customerId)) { |
74 | - if(ModelConstants.NULL_UUID.equals(tenantId.getId())){ | |
68 | + if(tenantId != null && ModelConstants.NULL_UUID.equals(tenantId.getId())){ | |
75 | 69 | tenantId = null; |
76 | 70 | } |
77 | 71 | PluginApiCallSecurityContext securityCtx = new PluginApiCallSecurityContext(pluginMd.getTenantId(), pluginMd.getId(), tenantId, customerId); |
... | ... | @@ -97,7 +91,7 @@ public class PluginApiController extends BaseController { |
97 | 91 | validUser = true; |
98 | 92 | } |
99 | 93 | } else { |
100 | - if ((pluginMd.isPublicAccess() || tenantAdministrator) && tenantId.equals(pluginMd.getTenantId())) { | |
94 | + if ((pluginMd.isPublicAccess() || tenantAdministrator) && tenantId != null && tenantId.equals(pluginMd.getTenantId())) { | |
101 | 95 | // All tenant users can access public tenant plugins. Only tenant |
102 | 96 | // administrator can access private tenant plugins |
103 | 97 | validUser = true; | ... | ... |
... | ... | @@ -28,7 +28,6 @@ import org.thingsboard.server.service.install.DatabaseSchemaService; |
28 | 28 | import org.thingsboard.server.service.install.DatabaseUpgradeService; |
29 | 29 | import org.thingsboard.server.service.install.SystemDataLoaderService; |
30 | 30 | |
31 | -import java.nio.file.Files; | |
32 | 31 | import java.nio.file.Paths; |
33 | 32 | |
34 | 33 | @Service |
... | ... | @@ -69,7 +68,7 @@ public class ThingsboardInstallService { |
69 | 68 | log.info("Starting ThingsBoard Upgrade from version {} ...", upgradeFromVersion); |
70 | 69 | |
71 | 70 | switch (upgradeFromVersion) { |
72 | - case "1.2.3": | |
71 | + case "1.2.3": //NOSONAR, Need to execute gradual upgrade starting from upgradeFromVersion | |
73 | 72 | log.info("Upgrading ThingsBoard from version 1.2.3 to 1.3.0 ..."); |
74 | 73 | |
75 | 74 | databaseUpgradeService.upgradeDatabase(upgradeFromVersion); |
... | ... | @@ -115,7 +114,7 @@ public class ThingsboardInstallService { |
115 | 114 | if (this.dataDir == null) { |
116 | 115 | throw new RuntimeException("'install.data_dir' property should specified!"); |
117 | 116 | } |
118 | - if (!Files.isDirectory(Paths.get(this.dataDir))) { | |
117 | + if (!Paths.get(this.dataDir).toFile().isDirectory()) { | |
119 | 118 | throw new RuntimeException("'install.data_dir' property value is not a valid directory!"); |
120 | 119 | } |
121 | 120 | ... | ... |
... | ... | @@ -45,12 +45,12 @@ public class DummyDiscoveryService implements DiscoveryService { |
45 | 45 | |
46 | 46 | @Override |
47 | 47 | public void publishCurrentServer() { |
48 | - | |
48 | + //Do nothing | |
49 | 49 | } |
50 | 50 | |
51 | 51 | @Override |
52 | 52 | public void unpublishCurrentServer() { |
53 | - | |
53 | + //Do nothing | |
54 | 54 | } |
55 | 55 | |
56 | 56 | @Override | ... | ... |
... | ... | @@ -95,6 +95,7 @@ public class ClusterGrpcService extends ClusterRpcServiceGrpc.ClusterRpcServiceI |
95 | 95 | future.onMsg(msg); |
96 | 96 | } catch (InterruptedException e) { |
97 | 97 | log.warn("Failed to report created session!"); |
98 | + Thread.currentThread().interrupt(); | |
98 | 99 | } |
99 | 100 | } else { |
100 | 101 | log.warn("Failed to lookup pending session!"); |
... | ... | @@ -117,6 +118,7 @@ public class ClusterGrpcService extends ClusterRpcServiceGrpc.ClusterRpcServiceI |
117 | 118 | log.info("RPC server stopped!"); |
118 | 119 | } catch (InterruptedException e) { |
119 | 120 | log.warn("Failed to onStop RPC server!"); |
121 | + Thread.currentThread().interrupt(); | |
120 | 122 | } |
121 | 123 | } |
122 | 124 | } | ... | ... |
... | ... | @@ -29,7 +29,7 @@ import java.util.UUID; |
29 | 29 | */ |
30 | 30 | @Data |
31 | 31 | @Slf4j |
32 | -final public class GrpcSession implements Closeable { | |
32 | +public final class GrpcSession implements Closeable { | |
33 | 33 | private final UUID sessionId; |
34 | 34 | private final boolean client; |
35 | 35 | private final GrpcSessionListener listener; |
... | ... | @@ -59,36 +59,14 @@ final public class GrpcSession implements Closeable { |
59 | 59 | this.inputStream = new StreamObserver<ClusterAPIProtos.ToRpcServerMessage>() { |
60 | 60 | @Override |
61 | 61 | public void onNext(ClusterAPIProtos.ToRpcServerMessage msg) { |
62 | - if (!connected) { | |
63 | - if (msg.hasConnectMsg()) { | |
64 | - connected = true; | |
65 | - ClusterAPIProtos.ServerAddress rpcAddress = msg.getConnectMsg().getServerAddress(); | |
66 | - remoteServer = new ServerAddress(rpcAddress.getHost(), rpcAddress.getPort()); | |
67 | - listener.onConnected(GrpcSession.this); | |
68 | - } | |
62 | + if (!connected && msg.hasConnectMsg()) { | |
63 | + connected = true; | |
64 | + ClusterAPIProtos.ServerAddress rpcAddress = msg.getConnectMsg().getServerAddress(); | |
65 | + remoteServer = new ServerAddress(rpcAddress.getHost(), rpcAddress.getPort()); | |
66 | + listener.onConnected(GrpcSession.this); | |
69 | 67 | } |
70 | 68 | if (connected) { |
71 | - if (msg.hasToPluginRpcMsg()) { | |
72 | - listener.onToPluginRpcMsg(GrpcSession.this, msg.getToPluginRpcMsg()); | |
73 | - } | |
74 | - if (msg.hasToDeviceActorRpcMsg()) { | |
75 | - listener.onToDeviceActorRpcMsg(GrpcSession.this, msg.getToDeviceActorRpcMsg()); | |
76 | - } | |
77 | - if (msg.hasToDeviceSessionActorRpcMsg()) { | |
78 | - listener.onToDeviceSessionActorRpcMsg(GrpcSession.this, msg.getToDeviceSessionActorRpcMsg()); | |
79 | - } | |
80 | - if (msg.hasToDeviceActorNotificationRpcMsg()) { | |
81 | - listener.onToDeviceActorNotificationRpcMsg(GrpcSession.this, msg.getToDeviceActorNotificationRpcMsg()); | |
82 | - } | |
83 | - if (msg.hasToDeviceRpcRequestRpcMsg()) { | |
84 | - listener.onToDeviceRpcRequestRpcMsg(GrpcSession.this, msg.getToDeviceRpcRequestRpcMsg()); | |
85 | - } | |
86 | - if (msg.hasToPluginRpcResponseRpcMsg()) { | |
87 | - listener.onFromDeviceRpcResponseRpcMsg(GrpcSession.this, msg.getToPluginRpcResponseRpcMsg()); | |
88 | - } | |
89 | - if (msg.hasToAllNodesRpcMsg()) { | |
90 | - listener.onToAllNodesRpcMessage(GrpcSession.this, msg.getToAllNodesRpcMsg()); | |
91 | - } | |
69 | + handleToRpcServerMessage(msg); | |
92 | 70 | } |
93 | 71 | } |
94 | 72 | |
... | ... | @@ -105,6 +83,30 @@ final public class GrpcSession implements Closeable { |
105 | 83 | }; |
106 | 84 | } |
107 | 85 | |
86 | + private void handleToRpcServerMessage(ClusterAPIProtos.ToRpcServerMessage msg) { | |
87 | + if (msg.hasToPluginRpcMsg()) { | |
88 | + listener.onToPluginRpcMsg(GrpcSession.this, msg.getToPluginRpcMsg()); | |
89 | + } | |
90 | + if (msg.hasToDeviceActorRpcMsg()) { | |
91 | + listener.onToDeviceActorRpcMsg(GrpcSession.this, msg.getToDeviceActorRpcMsg()); | |
92 | + } | |
93 | + if (msg.hasToDeviceSessionActorRpcMsg()) { | |
94 | + listener.onToDeviceSessionActorRpcMsg(GrpcSession.this, msg.getToDeviceSessionActorRpcMsg()); | |
95 | + } | |
96 | + if (msg.hasToDeviceActorNotificationRpcMsg()) { | |
97 | + listener.onToDeviceActorNotificationRpcMsg(GrpcSession.this, msg.getToDeviceActorNotificationRpcMsg()); | |
98 | + } | |
99 | + if (msg.hasToDeviceRpcRequestRpcMsg()) { | |
100 | + listener.onToDeviceRpcRequestRpcMsg(GrpcSession.this, msg.getToDeviceRpcRequestRpcMsg()); | |
101 | + } | |
102 | + if (msg.hasToPluginRpcResponseRpcMsg()) { | |
103 | + listener.onFromDeviceRpcResponseRpcMsg(GrpcSession.this, msg.getToPluginRpcResponseRpcMsg()); | |
104 | + } | |
105 | + if (msg.hasToAllNodesRpcMsg()) { | |
106 | + listener.onToAllNodesRpcMessage(GrpcSession.this, msg.getToAllNodesRpcMsg()); | |
107 | + } | |
108 | + } | |
109 | + | |
108 | 110 | public void initOutputStream() { |
109 | 111 | if (client) { |
110 | 112 | listener.onConnected(GrpcSession.this); | ... | ... |
... | ... | @@ -79,78 +79,83 @@ public class AnnotationComponentDiscoveryService implements ComponentDiscoverySe |
79 | 79 | private List<ComponentDescriptor> persist(Set<BeanDefinition> filterDefs, ComponentType type) { |
80 | 80 | List<ComponentDescriptor> result = new ArrayList<>(); |
81 | 81 | for (BeanDefinition def : filterDefs) { |
82 | - ComponentDescriptor scannedComponent = new ComponentDescriptor(); | |
83 | - String clazzName = def.getBeanClassName(); | |
84 | - try { | |
85 | - scannedComponent.setType(type); | |
86 | - Class<?> clazz = Class.forName(clazzName); | |
87 | - String descriptorResourceName; | |
88 | - switch (type) { | |
89 | - case FILTER: | |
90 | - Filter filterAnnotation = clazz.getAnnotation(Filter.class); | |
91 | - scannedComponent.setName(filterAnnotation.name()); | |
92 | - scannedComponent.setScope(filterAnnotation.scope()); | |
93 | - descriptorResourceName = filterAnnotation.descriptor(); | |
94 | - break; | |
95 | - case PROCESSOR: | |
96 | - Processor processorAnnotation = clazz.getAnnotation(Processor.class); | |
97 | - scannedComponent.setName(processorAnnotation.name()); | |
98 | - scannedComponent.setScope(processorAnnotation.scope()); | |
99 | - descriptorResourceName = processorAnnotation.descriptor(); | |
100 | - break; | |
101 | - case ACTION: | |
102 | - Action actionAnnotation = clazz.getAnnotation(Action.class); | |
103 | - scannedComponent.setName(actionAnnotation.name()); | |
104 | - scannedComponent.setScope(actionAnnotation.scope()); | |
105 | - descriptorResourceName = actionAnnotation.descriptor(); | |
106 | - break; | |
107 | - case PLUGIN: | |
108 | - Plugin pluginAnnotation = clazz.getAnnotation(Plugin.class); | |
109 | - scannedComponent.setName(pluginAnnotation.name()); | |
110 | - scannedComponent.setScope(pluginAnnotation.scope()); | |
111 | - descriptorResourceName = pluginAnnotation.descriptor(); | |
112 | - for (Class<?> actionClazz : pluginAnnotation.actions()) { | |
113 | - ComponentDescriptor actionComponent = getComponent(actionClazz.getName()) | |
114 | - .orElseThrow(() -> { | |
115 | - log.error("Can't initialize plugin {}, due to missing action {}!", def.getBeanClassName(), actionClazz.getName()); | |
116 | - return new ClassNotFoundException("Action: " + actionClazz.getName() + "is missing!"); | |
117 | - }); | |
118 | - if (actionComponent.getType() != ComponentType.ACTION) { | |
119 | - log.error("Plugin {} action {} has wrong component type!", def.getBeanClassName(), actionClazz.getName(), actionComponent.getType()); | |
120 | - throw new RuntimeException("Plugin " + def.getBeanClassName() + "action " + actionClazz.getName() + " has wrong component type!"); | |
121 | - } | |
122 | - } | |
123 | - scannedComponent.setActions(Arrays.stream(pluginAnnotation.actions()).map(action -> action.getName()).collect(Collectors.joining(","))); | |
124 | - break; | |
125 | - default: | |
126 | - throw new RuntimeException(type + " is not supported yet!"); | |
127 | - } | |
128 | - scannedComponent.setConfigurationDescriptor(mapper.readTree( | |
129 | - Resources.toString(Resources.getResource(descriptorResourceName), Charsets.UTF_8))); | |
130 | - scannedComponent.setClazz(clazzName); | |
131 | - log.info("Processing scanned component: {}", scannedComponent); | |
132 | - } catch (Exception e) { | |
133 | - log.error("Can't initialize component {}, due to {}", def.getBeanClassName(), e.getMessage(), e); | |
134 | - throw new RuntimeException(e); | |
135 | - } | |
136 | - ComponentDescriptor persistedComponent = componentDescriptorService.findByClazz(clazzName); | |
137 | - if (persistedComponent == null) { | |
138 | - log.info("Persisting new component: {}", scannedComponent); | |
139 | - scannedComponent = componentDescriptorService.saveComponent(scannedComponent); | |
140 | - } else if (scannedComponent.equals(persistedComponent)) { | |
141 | - log.info("Component is already persisted: {}", persistedComponent); | |
142 | - scannedComponent = persistedComponent; | |
143 | - } else { | |
144 | - log.info("Component {} will be updated to {}", persistedComponent, scannedComponent); | |
145 | - componentDescriptorService.deleteByClazz(persistedComponent.getClazz()); | |
146 | - scannedComponent.setId(persistedComponent.getId()); | |
147 | - scannedComponent = componentDescriptorService.saveComponent(scannedComponent); | |
148 | - } | |
82 | + ComponentDescriptor scannedComponent = scanAndPersistComponent(def, type); | |
149 | 83 | result.add(scannedComponent); |
150 | 84 | } |
151 | 85 | return result; |
152 | 86 | } |
153 | 87 | |
88 | + private ComponentDescriptor scanAndPersistComponent(BeanDefinition def, ComponentType type) { | |
89 | + ComponentDescriptor scannedComponent = new ComponentDescriptor(); | |
90 | + String clazzName = def.getBeanClassName(); | |
91 | + try { | |
92 | + scannedComponent.setType(type); | |
93 | + Class<?> clazz = Class.forName(clazzName); | |
94 | + String descriptorResourceName; | |
95 | + switch (type) { | |
96 | + case FILTER: | |
97 | + Filter filterAnnotation = clazz.getAnnotation(Filter.class); | |
98 | + scannedComponent.setName(filterAnnotation.name()); | |
99 | + scannedComponent.setScope(filterAnnotation.scope()); | |
100 | + descriptorResourceName = filterAnnotation.descriptor(); | |
101 | + break; | |
102 | + case PROCESSOR: | |
103 | + Processor processorAnnotation = clazz.getAnnotation(Processor.class); | |
104 | + scannedComponent.setName(processorAnnotation.name()); | |
105 | + scannedComponent.setScope(processorAnnotation.scope()); | |
106 | + descriptorResourceName = processorAnnotation.descriptor(); | |
107 | + break; | |
108 | + case ACTION: | |
109 | + Action actionAnnotation = clazz.getAnnotation(Action.class); | |
110 | + scannedComponent.setName(actionAnnotation.name()); | |
111 | + scannedComponent.setScope(actionAnnotation.scope()); | |
112 | + descriptorResourceName = actionAnnotation.descriptor(); | |
113 | + break; | |
114 | + case PLUGIN: | |
115 | + Plugin pluginAnnotation = clazz.getAnnotation(Plugin.class); | |
116 | + scannedComponent.setName(pluginAnnotation.name()); | |
117 | + scannedComponent.setScope(pluginAnnotation.scope()); | |
118 | + descriptorResourceName = pluginAnnotation.descriptor(); | |
119 | + for (Class<?> actionClazz : pluginAnnotation.actions()) { | |
120 | + ComponentDescriptor actionComponent = getComponent(actionClazz.getName()) | |
121 | + .orElseThrow(() -> { | |
122 | + log.error("Can't initialize plugin {}, due to missing action {}!", def.getBeanClassName(), actionClazz.getName()); | |
123 | + return new ClassNotFoundException("Action: " + actionClazz.getName() + "is missing!"); | |
124 | + }); | |
125 | + if (actionComponent.getType() != ComponentType.ACTION) { | |
126 | + log.error("Plugin {} action {} has wrong component type!", def.getBeanClassName(), actionClazz.getName(), actionComponent.getType()); | |
127 | + throw new RuntimeException("Plugin " + def.getBeanClassName() + "action " + actionClazz.getName() + " has wrong component type!"); | |
128 | + } | |
129 | + } | |
130 | + scannedComponent.setActions(Arrays.stream(pluginAnnotation.actions()).map(action -> action.getName()).collect(Collectors.joining(","))); | |
131 | + break; | |
132 | + default: | |
133 | + throw new RuntimeException(type + " is not supported yet!"); | |
134 | + } | |
135 | + scannedComponent.setConfigurationDescriptor(mapper.readTree( | |
136 | + Resources.toString(Resources.getResource(descriptorResourceName), Charsets.UTF_8))); | |
137 | + scannedComponent.setClazz(clazzName); | |
138 | + log.info("Processing scanned component: {}", scannedComponent); | |
139 | + } catch (Exception e) { | |
140 | + log.error("Can't initialize component {}, due to {}", def.getBeanClassName(), e.getMessage(), e); | |
141 | + throw new RuntimeException(e); | |
142 | + } | |
143 | + ComponentDescriptor persistedComponent = componentDescriptorService.findByClazz(clazzName); | |
144 | + if (persistedComponent == null) { | |
145 | + log.info("Persisting new component: {}", scannedComponent); | |
146 | + scannedComponent = componentDescriptorService.saveComponent(scannedComponent); | |
147 | + } else if (scannedComponent.equals(persistedComponent)) { | |
148 | + log.info("Component is already persisted: {}", persistedComponent); | |
149 | + scannedComponent = persistedComponent; | |
150 | + } else { | |
151 | + log.info("Component {} will be updated to {}", persistedComponent, scannedComponent); | |
152 | + componentDescriptorService.deleteByClazz(persistedComponent.getClazz()); | |
153 | + scannedComponent.setId(persistedComponent.getId()); | |
154 | + scannedComponent = componentDescriptorService.saveComponent(scannedComponent); | |
155 | + } | |
156 | + return scannedComponent; | |
157 | + } | |
158 | + | |
154 | 159 | private Set<BeanDefinition> getBeanDefinitions(Class<? extends Annotation> componentType) { |
155 | 160 | ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false); |
156 | 161 | scanner.addIncludeFilter(new AnnotationTypeFilter(componentType)); | ... | ... |
... | ... | @@ -40,6 +40,12 @@ import java.util.List; |
40 | 40 | public class CassandraDatabaseUpgradeService implements DatabaseUpgradeService { |
41 | 41 | |
42 | 42 | private static final String SCHEMA_UPDATE_CQL = "schema_update.cql"; |
43 | + public static final String DEVICE = "device"; | |
44 | + public static final String TENANT_ID = "tenant_id"; | |
45 | + public static final String CUSTOMER_ID = "customer_id"; | |
46 | + public static final String SEARCH_TEXT = "search_text"; | |
47 | + public static final String ADDITIONAL_INFO = "additional_info"; | |
48 | + public static final String ASSET = "asset"; | |
43 | 49 | |
44 | 50 | @Value("${install.data_dir}") |
45 | 51 | private String dataDir; |
... | ... | @@ -63,22 +69,22 @@ public class CassandraDatabaseUpgradeService implements DatabaseUpgradeService { |
63 | 69 | KeyspaceMetadata ks = cluster.getCluster().getMetadata().getKeyspace(cluster.getKeyspaceName()); |
64 | 70 | |
65 | 71 | log.info("Dumping devices ..."); |
66 | - Path devicesDump = CassandraDbHelper.dumpCfIfExists(ks, cluster.getSession(), "device", | |
67 | - new String[]{"id", "tenant_id", "customer_id", "name", "search_text", "additional_info", "type"}, | |
72 | + Path devicesDump = CassandraDbHelper.dumpCfIfExists(ks, cluster.getSession(), DEVICE, | |
73 | + new String[]{"id", TENANT_ID, CUSTOMER_ID, "name", SEARCH_TEXT, ADDITIONAL_INFO, "type"}, | |
68 | 74 | new String[]{"", "", "", "", "", "", "default"}, |
69 | 75 | "tb-devices"); |
70 | 76 | log.info("Devices dumped."); |
71 | 77 | |
72 | 78 | log.info("Dumping assets ..."); |
73 | - Path assetsDump = CassandraDbHelper.dumpCfIfExists(ks, cluster.getSession(), "asset", | |
74 | - new String[]{"id", "tenant_id", "customer_id", "name", "search_text", "additional_info", "type"}, | |
79 | + Path assetsDump = CassandraDbHelper.dumpCfIfExists(ks, cluster.getSession(), ASSET, | |
80 | + new String[]{"id", TENANT_ID, CUSTOMER_ID, "name", SEARCH_TEXT, ADDITIONAL_INFO, "type"}, | |
75 | 81 | new String[]{"", "", "", "", "", "", "default"}, |
76 | 82 | "tb-assets"); |
77 | 83 | log.info("Assets dumped."); |
78 | 84 | |
79 | 85 | log.info("Dumping relations ..."); |
80 | 86 | Path relationsDump = CassandraDbHelper.dumpCfIfExists(ks, cluster.getSession(), "relation", |
81 | - new String[]{"from_id", "from_type", "to_id", "to_type", "relation_type", "additional_info", "relation_type_group"}, | |
87 | + new String[]{"from_id", "from_type", "to_id", "to_type", "relation_type", ADDITIONAL_INFO, "relation_type_group"}, | |
82 | 88 | new String[]{"", "", "", "", "", "", "COMMON"}, |
83 | 89 | "tb-relations"); |
84 | 90 | log.info("Relations dumped."); |
... | ... | @@ -92,15 +98,15 @@ public class CassandraDatabaseUpgradeService implements DatabaseUpgradeService { |
92 | 98 | |
93 | 99 | log.info("Restoring devices ..."); |
94 | 100 | if (devicesDump != null) { |
95 | - CassandraDbHelper.loadCf(ks, cluster.getSession(), "device", | |
96 | - new String[]{"id", "tenant_id", "customer_id", "name", "search_text", "additional_info", "type"}, devicesDump); | |
101 | + CassandraDbHelper.loadCf(ks, cluster.getSession(), DEVICE, | |
102 | + new String[]{"id", TENANT_ID, CUSTOMER_ID, "name", SEARCH_TEXT, ADDITIONAL_INFO, "type"}, devicesDump); | |
97 | 103 | Files.deleteIfExists(devicesDump); |
98 | 104 | } |
99 | 105 | log.info("Devices restored."); |
100 | 106 | |
101 | 107 | log.info("Dumping device types ..."); |
102 | - Path deviceTypesDump = CassandraDbHelper.dumpCfIfExists(ks, cluster.getSession(), "device", | |
103 | - new String[]{"tenant_id", "type"}, | |
108 | + Path deviceTypesDump = CassandraDbHelper.dumpCfIfExists(ks, cluster.getSession(), DEVICE, | |
109 | + new String[]{TENANT_ID, "type"}, | |
104 | 110 | new String[]{"", ""}, |
105 | 111 | "tb-device-types"); |
106 | 112 | if (deviceTypesDump != null) { |
... | ... | @@ -110,22 +116,22 @@ public class CassandraDatabaseUpgradeService implements DatabaseUpgradeService { |
110 | 116 | log.info("Loading device types ..."); |
111 | 117 | if (deviceTypesDump != null) { |
112 | 118 | CassandraDbHelper.loadCf(ks, cluster.getSession(), "entity_subtype", |
113 | - new String[]{"tenant_id", "type", "entity_type"}, deviceTypesDump); | |
119 | + new String[]{TENANT_ID, "type", "entity_type"}, deviceTypesDump); | |
114 | 120 | Files.deleteIfExists(deviceTypesDump); |
115 | 121 | } |
116 | 122 | log.info("Device types loaded."); |
117 | 123 | |
118 | 124 | log.info("Restoring assets ..."); |
119 | 125 | if (assetsDump != null) { |
120 | - CassandraDbHelper.loadCf(ks, cluster.getSession(), "asset", | |
121 | - new String[]{"id", "tenant_id", "customer_id", "name", "search_text", "additional_info", "type"}, assetsDump); | |
126 | + CassandraDbHelper.loadCf(ks, cluster.getSession(), ASSET, | |
127 | + new String[]{"id", TENANT_ID, CUSTOMER_ID, "name", SEARCH_TEXT, ADDITIONAL_INFO, "type"}, assetsDump); | |
122 | 128 | Files.deleteIfExists(assetsDump); |
123 | 129 | } |
124 | 130 | log.info("Assets restored."); |
125 | 131 | |
126 | 132 | log.info("Dumping asset types ..."); |
127 | - Path assetTypesDump = CassandraDbHelper.dumpCfIfExists(ks, cluster.getSession(), "asset", | |
128 | - new String[]{"tenant_id", "type"}, | |
133 | + Path assetTypesDump = CassandraDbHelper.dumpCfIfExists(ks, cluster.getSession(), ASSET, | |
134 | + new String[]{TENANT_ID, "type"}, | |
129 | 135 | new String[]{"", ""}, |
130 | 136 | "tb-asset-types"); |
131 | 137 | if (assetTypesDump != null) { |
... | ... | @@ -135,7 +141,7 @@ public class CassandraDatabaseUpgradeService implements DatabaseUpgradeService { |
135 | 141 | log.info("Loading asset types ..."); |
136 | 142 | if (assetTypesDump != null) { |
137 | 143 | CassandraDbHelper.loadCf(ks, cluster.getSession(), "entity_subtype", |
138 | - new String[]{"tenant_id", "type", "entity_type"}, assetTypesDump); | |
144 | + new String[]{TENANT_ID, "type", "entity_type"}, assetTypesDump); | |
139 | 145 | Files.deleteIfExists(assetTypesDump); |
140 | 146 | } |
141 | 147 | log.info("Asset types loaded."); |
... | ... | @@ -143,7 +149,7 @@ public class CassandraDatabaseUpgradeService implements DatabaseUpgradeService { |
143 | 149 | log.info("Restoring relations ..."); |
144 | 150 | if (relationsDump != null) { |
145 | 151 | CassandraDbHelper.loadCf(ks, cluster.getSession(), "relation", |
146 | - new String[]{"from_id", "from_type", "to_id", "to_type", "relation_type", "additional_info", "relation_type_group"}, relationsDump); | |
152 | + new String[]{"from_id", "from_type", "to_id", "to_type", "relation_type", ADDITIONAL_INFO, "relation_type_group"}, relationsDump); | |
147 | 153 | Files.deleteIfExists(relationsDump); |
148 | 154 | } |
149 | 155 | log.info("Relations restored."); | ... | ... |
application/src/main/java/org/thingsboard/server/service/install/DefaultSystemDataLoaderService.java
... | ... | @@ -51,6 +51,7 @@ import org.thingsboard.server.dao.widget.WidgetTypeService; |
51 | 51 | import org.thingsboard.server.dao.widget.WidgetsBundleService; |
52 | 52 | |
53 | 53 | import java.io.IOException; |
54 | +import java.nio.file.DirectoryStream; | |
54 | 55 | import java.nio.file.Files; |
55 | 56 | import java.nio.file.Path; |
56 | 57 | import java.nio.file.Paths; |
... | ... | @@ -69,6 +70,9 @@ public class DefaultSystemDataLoaderService implements SystemDataLoaderService { |
69 | 70 | private static final String DASHBOARDS_DIR = "dashboards"; |
70 | 71 | |
71 | 72 | private static final ObjectMapper objectMapper = new ObjectMapper(); |
73 | + public static final String JSON_EXT = ".json"; | |
74 | + public static final String CUSTOMER_CRED = "customer"; | |
75 | + public static final String DEFAULT_DEVICE_TYPE = "default"; | |
72 | 76 | |
73 | 77 | @Value("${install.data_dir}") |
74 | 78 | private String dataDir; |
... | ... | @@ -138,7 +142,7 @@ public class DefaultSystemDataLoaderService implements SystemDataLoaderService { |
138 | 142 | node.put("timeout", "10000"); |
139 | 143 | node.put("enableTls", "false"); |
140 | 144 | node.put("username", ""); |
141 | - node.put("password", ""); | |
145 | + node.put("password", ""); //NOSONAR, key used to identify password field (not password value itself) | |
142 | 146 | mailSettings.setJsonValue(node); |
143 | 147 | adminSettingsService.saveAdminSettings(mailSettings); |
144 | 148 | } |
... | ... | @@ -146,33 +150,34 @@ public class DefaultSystemDataLoaderService implements SystemDataLoaderService { |
146 | 150 | @Override |
147 | 151 | public void loadSystemWidgets() throws Exception { |
148 | 152 | Path widgetBundlesDir = Paths.get(dataDir, JSON_DIR, SYSTEM_DIR, WIDGET_BUNDLES_DIR); |
149 | - Files.newDirectoryStream(widgetBundlesDir, path -> path.toString().endsWith(".json")) | |
150 | - .forEach( | |
151 | - path -> { | |
152 | - try { | |
153 | - JsonNode widgetsBundleDescriptorJson = objectMapper.readTree(path.toFile()); | |
154 | - JsonNode widgetsBundleJson = widgetsBundleDescriptorJson.get("widgetsBundle"); | |
155 | - WidgetsBundle widgetsBundle = objectMapper.treeToValue(widgetsBundleJson, WidgetsBundle.class); | |
156 | - WidgetsBundle savedWidgetsBundle = widgetsBundleService.saveWidgetsBundle(widgetsBundle); | |
157 | - JsonNode widgetTypesArrayJson = widgetsBundleDescriptorJson.get("widgetTypes"); | |
158 | - widgetTypesArrayJson.forEach( | |
159 | - widgetTypeJson -> { | |
160 | - try { | |
161 | - WidgetType widgetType = objectMapper.treeToValue(widgetTypeJson, WidgetType.class); | |
162 | - widgetType.setBundleAlias(savedWidgetsBundle.getAlias()); | |
163 | - widgetTypeService.saveWidgetType(widgetType); | |
164 | - } catch (Exception e) { | |
165 | - log.error("Unable to load widget type from json: [{}]", path.toString()); | |
166 | - throw new RuntimeException("Unable to load widget type from json", e); | |
167 | - } | |
153 | + try (DirectoryStream<Path> dirStream = Files.newDirectoryStream(widgetBundlesDir, path -> path.toString().endsWith(JSON_EXT))) { | |
154 | + dirStream.forEach( | |
155 | + path -> { | |
156 | + try { | |
157 | + JsonNode widgetsBundleDescriptorJson = objectMapper.readTree(path.toFile()); | |
158 | + JsonNode widgetsBundleJson = widgetsBundleDescriptorJson.get("widgetsBundle"); | |
159 | + WidgetsBundle widgetsBundle = objectMapper.treeToValue(widgetsBundleJson, WidgetsBundle.class); | |
160 | + WidgetsBundle savedWidgetsBundle = widgetsBundleService.saveWidgetsBundle(widgetsBundle); | |
161 | + JsonNode widgetTypesArrayJson = widgetsBundleDescriptorJson.get("widgetTypes"); | |
162 | + widgetTypesArrayJson.forEach( | |
163 | + widgetTypeJson -> { | |
164 | + try { | |
165 | + WidgetType widgetType = objectMapper.treeToValue(widgetTypeJson, WidgetType.class); | |
166 | + widgetType.setBundleAlias(savedWidgetsBundle.getAlias()); | |
167 | + widgetTypeService.saveWidgetType(widgetType); | |
168 | + } catch (Exception e) { | |
169 | + log.error("Unable to load widget type from json: [{}]", path.toString()); | |
170 | + throw new RuntimeException("Unable to load widget type from json", e); | |
168 | 171 | } |
169 | - ); | |
170 | - } catch (Exception e) { | |
171 | - log.error("Unable to load widgets bundle from json: [{}]", path.toString()); | |
172 | - throw new RuntimeException("Unable to load widgets bundle from json", e); | |
173 | - } | |
172 | + } | |
173 | + ); | |
174 | + } catch (Exception e) { | |
175 | + log.error("Unable to load widgets bundle from json: [{}]", path.toString()); | |
176 | + throw new RuntimeException("Unable to load widgets bundle from json", e); | |
174 | 177 | } |
175 | - ); | |
178 | + } | |
179 | + ); | |
180 | + } | |
176 | 181 | } |
177 | 182 | |
178 | 183 | @Override |
... | ... | @@ -206,21 +211,21 @@ public class DefaultSystemDataLoaderService implements SystemDataLoaderService { |
206 | 211 | customerC.setTenantId(demoTenant.getId()); |
207 | 212 | customerC.setTitle("Customer C"); |
208 | 213 | customerC = customerService.saveCustomer(customerC); |
209 | - createUser(Authority.CUSTOMER_USER, demoTenant.getId(), customerA.getId(), "customer@thingsboard.org", "customer"); | |
210 | - createUser(Authority.CUSTOMER_USER, demoTenant.getId(), customerA.getId(), "customerA@thingsboard.org", "customer"); | |
211 | - createUser(Authority.CUSTOMER_USER, demoTenant.getId(), customerB.getId(), "customerB@thingsboard.org", "customer"); | |
212 | - createUser(Authority.CUSTOMER_USER, demoTenant.getId(), customerC.getId(), "customerC@thingsboard.org", "customer"); | |
213 | - | |
214 | - createDevice(demoTenant.getId(), customerA.getId(), "default", "Test Device A1", "A1_TEST_TOKEN", null); | |
215 | - createDevice(demoTenant.getId(), customerA.getId(), "default", "Test Device A2", "A2_TEST_TOKEN", null); | |
216 | - createDevice(demoTenant.getId(), customerA.getId(), "default", "Test Device A3", "A3_TEST_TOKEN", null); | |
217 | - createDevice(demoTenant.getId(), customerB.getId(), "default", "Test Device B1", "B1_TEST_TOKEN", null); | |
218 | - createDevice(demoTenant.getId(), customerC.getId(), "default", "Test Device C1", "C1_TEST_TOKEN", null); | |
219 | - | |
220 | - createDevice(demoTenant.getId(), null, "default", "DHT11 Demo Device", "DHT11_DEMO_TOKEN", "Demo device that is used in sample " + | |
214 | + createUser(Authority.CUSTOMER_USER, demoTenant.getId(), customerA.getId(), "customer@thingsboard.org", CUSTOMER_CRED); | |
215 | + createUser(Authority.CUSTOMER_USER, demoTenant.getId(), customerA.getId(), "customerA@thingsboard.org", CUSTOMER_CRED); | |
216 | + createUser(Authority.CUSTOMER_USER, demoTenant.getId(), customerB.getId(), "customerB@thingsboard.org", CUSTOMER_CRED); | |
217 | + createUser(Authority.CUSTOMER_USER, demoTenant.getId(), customerC.getId(), "customerC@thingsboard.org", CUSTOMER_CRED); | |
218 | + | |
219 | + createDevice(demoTenant.getId(), customerA.getId(), DEFAULT_DEVICE_TYPE, "Test Device A1", "A1_TEST_TOKEN", null); | |
220 | + createDevice(demoTenant.getId(), customerA.getId(), DEFAULT_DEVICE_TYPE, "Test Device A2", "A2_TEST_TOKEN", null); | |
221 | + createDevice(demoTenant.getId(), customerA.getId(), DEFAULT_DEVICE_TYPE, "Test Device A3", "A3_TEST_TOKEN", null); | |
222 | + createDevice(demoTenant.getId(), customerB.getId(), DEFAULT_DEVICE_TYPE, "Test Device B1", "B1_TEST_TOKEN", null); | |
223 | + createDevice(demoTenant.getId(), customerC.getId(), DEFAULT_DEVICE_TYPE, "Test Device C1", "C1_TEST_TOKEN", null); | |
224 | + | |
225 | + createDevice(demoTenant.getId(), null, DEFAULT_DEVICE_TYPE, "DHT11 Demo Device", "DHT11_DEMO_TOKEN", "Demo device that is used in sample " + | |
221 | 226 | "applications that upload data from DHT11 temperature and humidity sensor"); |
222 | 227 | |
223 | - createDevice(demoTenant.getId(), null, "default", "Raspberry Pi Demo Device", "RASPBERRY_PI_DEMO_TOKEN", "Demo device that is used in " + | |
228 | + createDevice(demoTenant.getId(), null, DEFAULT_DEVICE_TYPE, "Raspberry Pi Demo Device", "RASPBERRY_PI_DEMO_TOKEN", "Demo device that is used in " + | |
224 | 229 | "Raspberry Pi GPIO control sample application"); |
225 | 230 | |
226 | 231 | loadPlugins(Paths.get(dataDir, JSON_DIR, DEMO_DIR, PLUGINS_DIR), demoTenant.getId()); |
... | ... | @@ -279,67 +284,69 @@ public class DefaultSystemDataLoaderService implements SystemDataLoaderService { |
279 | 284 | } |
280 | 285 | |
281 | 286 | private void loadPlugins(Path pluginsDir, TenantId tenantId) throws Exception{ |
282 | - Files.newDirectoryStream(pluginsDir, path -> path.toString().endsWith(".json")) | |
283 | - .forEach( | |
284 | - path -> { | |
285 | - try { | |
286 | - JsonNode pluginJson = objectMapper.readTree(path.toFile()); | |
287 | - PluginMetaData plugin = objectMapper.treeToValue(pluginJson, PluginMetaData.class); | |
288 | - plugin.setTenantId(tenantId); | |
289 | - if (plugin.getState() == ComponentLifecycleState.ACTIVE) { | |
290 | - plugin.setState(ComponentLifecycleState.SUSPENDED); | |
291 | - PluginMetaData savedPlugin = pluginService.savePlugin(plugin); | |
292 | - pluginService.activatePluginById(savedPlugin.getId()); | |
293 | - } else { | |
294 | - pluginService.savePlugin(plugin); | |
295 | - } | |
296 | - } catch (Exception e) { | |
297 | - log.error("Unable to load plugin from json: [{}]", path.toString()); | |
298 | - throw new RuntimeException("Unable to load plugin from json", e); | |
287 | + try (DirectoryStream<Path> dirStream = Files.newDirectoryStream(pluginsDir, path -> path.toString().endsWith(JSON_EXT))) { | |
288 | + dirStream.forEach( | |
289 | + path -> { | |
290 | + try { | |
291 | + JsonNode pluginJson = objectMapper.readTree(path.toFile()); | |
292 | + PluginMetaData plugin = objectMapper.treeToValue(pluginJson, PluginMetaData.class); | |
293 | + plugin.setTenantId(tenantId); | |
294 | + if (plugin.getState() == ComponentLifecycleState.ACTIVE) { | |
295 | + plugin.setState(ComponentLifecycleState.SUSPENDED); | |
296 | + PluginMetaData savedPlugin = pluginService.savePlugin(plugin); | |
297 | + pluginService.activatePluginById(savedPlugin.getId()); | |
298 | + } else { | |
299 | + pluginService.savePlugin(plugin); | |
299 | 300 | } |
301 | + } catch (Exception e) { | |
302 | + log.error("Unable to load plugin from json: [{}]", path.toString()); | |
303 | + throw new RuntimeException("Unable to load plugin from json", e); | |
300 | 304 | } |
301 | - ); | |
302 | - | |
305 | + } | |
306 | + ); | |
307 | + } | |
303 | 308 | } |
304 | 309 | |
305 | 310 | private void loadRules(Path rulesDir, TenantId tenantId) throws Exception { |
306 | - Files.newDirectoryStream(rulesDir, path -> path.toString().endsWith(".json")) | |
307 | - .forEach( | |
308 | - path -> { | |
309 | - try { | |
310 | - JsonNode ruleJson = objectMapper.readTree(path.toFile()); | |
311 | - RuleMetaData rule = objectMapper.treeToValue(ruleJson, RuleMetaData.class); | |
312 | - rule.setTenantId(tenantId); | |
313 | - if (rule.getState() == ComponentLifecycleState.ACTIVE) { | |
314 | - rule.setState(ComponentLifecycleState.SUSPENDED); | |
315 | - RuleMetaData savedRule = ruleService.saveRule(rule); | |
316 | - ruleService.activateRuleById(savedRule.getId()); | |
317 | - } else { | |
318 | - ruleService.saveRule(rule); | |
319 | - } | |
320 | - } catch (Exception e) { | |
321 | - log.error("Unable to load rule from json: [{}]", path.toString()); | |
322 | - throw new RuntimeException("Unable to load rule from json", e); | |
311 | + try (DirectoryStream<Path> dirStream = Files.newDirectoryStream(rulesDir, path -> path.toString().endsWith(JSON_EXT))) { | |
312 | + dirStream.forEach( | |
313 | + path -> { | |
314 | + try { | |
315 | + JsonNode ruleJson = objectMapper.readTree(path.toFile()); | |
316 | + RuleMetaData rule = objectMapper.treeToValue(ruleJson, RuleMetaData.class); | |
317 | + rule.setTenantId(tenantId); | |
318 | + if (rule.getState() == ComponentLifecycleState.ACTIVE) { | |
319 | + rule.setState(ComponentLifecycleState.SUSPENDED); | |
320 | + RuleMetaData savedRule = ruleService.saveRule(rule); | |
321 | + ruleService.activateRuleById(savedRule.getId()); | |
322 | + } else { | |
323 | + ruleService.saveRule(rule); | |
323 | 324 | } |
325 | + } catch (Exception e) { | |
326 | + log.error("Unable to load rule from json: [{}]", path.toString()); | |
327 | + throw new RuntimeException("Unable to load rule from json", e); | |
324 | 328 | } |
325 | - ); | |
329 | + } | |
330 | + ); | |
331 | + } | |
326 | 332 | } |
327 | 333 | |
328 | 334 | private void loadDashboards(Path dashboardsDir, TenantId tenantId, CustomerId customerId) throws Exception { |
329 | - Files.newDirectoryStream(dashboardsDir, path -> path.toString().endsWith(".json")) | |
330 | - .forEach( | |
331 | - path -> { | |
332 | - try { | |
333 | - JsonNode dashboardJson = objectMapper.readTree(path.toFile()); | |
334 | - Dashboard dashboard = objectMapper.treeToValue(dashboardJson, Dashboard.class); | |
335 | - dashboard.setTenantId(tenantId); | |
336 | - dashboard.setCustomerId(customerId); | |
337 | - dashboardService.saveDashboard(dashboard); | |
338 | - } catch (Exception e) { | |
339 | - log.error("Unable to load dashboard from json: [{}]", path.toString()); | |
340 | - throw new RuntimeException("Unable to load dashboard from json", e); | |
341 | - } | |
335 | + try (DirectoryStream<Path> dirStream = Files.newDirectoryStream(dashboardsDir, path -> path.toString().endsWith(JSON_EXT))) { | |
336 | + dirStream.forEach( | |
337 | + path -> { | |
338 | + try { | |
339 | + JsonNode dashboardJson = objectMapper.readTree(path.toFile()); | |
340 | + Dashboard dashboard = objectMapper.treeToValue(dashboardJson, Dashboard.class); | |
341 | + dashboard.setTenantId(tenantId); | |
342 | + dashboard.setCustomerId(customerId); | |
343 | + dashboardService.saveDashboard(dashboard); | |
344 | + } catch (Exception e) { | |
345 | + log.error("Unable to load dashboard from json: [{}]", path.toString()); | |
346 | + throw new RuntimeException("Unable to load dashboard from json", e); | |
342 | 347 | } |
343 | - ); | |
348 | + } | |
349 | + ); | |
350 | + } | |
344 | 351 | } |
345 | 352 | } | ... | ... |
... | ... | @@ -28,6 +28,7 @@ import java.nio.file.Path; |
28 | 28 | import java.nio.file.Paths; |
29 | 29 | import java.sql.Connection; |
30 | 30 | import java.sql.DriverManager; |
31 | +import java.sql.PreparedStatement; | |
31 | 32 | |
32 | 33 | @Service |
33 | 34 | @Profile("install") |
... | ... | @@ -58,7 +59,7 @@ public class SqlDatabaseSchemaService implements DatabaseSchemaService { |
58 | 59 | Path schemaFile = Paths.get(this.dataDir, SQL_DIR, SCHEMA_SQL); |
59 | 60 | try (Connection conn = DriverManager.getConnection(dbUrl, dbUserName, dbPassword)) { |
60 | 61 | String sql = new String(Files.readAllBytes(schemaFile), Charset.forName("UTF-8")); |
61 | - conn.createStatement().execute(sql); | |
62 | + conn.prepareStatement(sql).execute(); //NOSONAR, ignoring because method used to load initial thingsboard database schema | |
62 | 63 | } |
63 | 64 | |
64 | 65 | } | ... | ... |
... | ... | @@ -44,7 +44,7 @@ public class CQLStatementsParser { |
44 | 44 | public CQLStatementsParser(Path cql) throws IOException { |
45 | 45 | try { |
46 | 46 | List<String> lines = Files.readAllLines(cql); |
47 | - StringBuffer t = new StringBuffer(); | |
47 | + StringBuilder t = new StringBuilder(); | |
48 | 48 | for (String l : lines) { |
49 | 49 | t.append(l.trim()); |
50 | 50 | t.append('\n'); |
... | ... | @@ -68,36 +68,14 @@ public class CQLStatementsParser { |
68 | 68 | |
69 | 69 | private void parseStatements() { |
70 | 70 | this.statements = new ArrayList<>(); |
71 | - StringBuffer statementUnderConstruction = new StringBuffer(); | |
71 | + StringBuilder statementUnderConstruction = new StringBuilder(); | |
72 | 72 | |
73 | 73 | char c; |
74 | 74 | while ((c = getChar()) != 0) { |
75 | 75 | switch (state) { |
76 | 76 | case DEFAULT: |
77 | - if (c == '/' && peekAhead() == '/') { | |
78 | - state = State.INSINGLELINECOMMENT; | |
79 | - advance(); | |
80 | - } else if (c == '-' && peekAhead() == '-') { | |
81 | - state = State.INSINGLELINECOMMENT; | |
82 | - advance(); | |
83 | - } else if (c == '/' && peekAhead() == '*') { | |
84 | - state = State.INMULTILINECOMMENT; | |
85 | - advance(); | |
86 | - } else if (c == '\n') { | |
87 | - statementUnderConstruction.append(' '); | |
88 | - } else { | |
89 | - statementUnderConstruction.append(c); | |
90 | - if (c == '\"') { | |
91 | - state = State.INQUOTESTRING; | |
92 | - } else if (c == '\'') { | |
93 | - state = State.INSQUOTESTRING; | |
94 | - } else if (c == ';') { | |
95 | - statements.add(statementUnderConstruction.toString().trim()); | |
96 | - statementUnderConstruction.setLength(0); | |
97 | - } | |
98 | - } | |
77 | + processDefaultState(c, statementUnderConstruction); | |
99 | 78 | break; |
100 | - | |
101 | 79 | case INSINGLELINECOMMENT: |
102 | 80 | if (c == '\n') { |
103 | 81 | state = State.DEFAULT; |
... | ... | @@ -112,25 +90,10 @@ public class CQLStatementsParser { |
112 | 90 | break; |
113 | 91 | |
114 | 92 | case INQUOTESTRING: |
115 | - statementUnderConstruction.append(c); | |
116 | - if (c == '"') { | |
117 | - if (peekAhead() == '"') { | |
118 | - statementUnderConstruction.append(getChar()); | |
119 | - } else { | |
120 | - state = State.DEFAULT; | |
121 | - } | |
122 | - } | |
93 | + processInQuoteStringState(c, statementUnderConstruction); | |
123 | 94 | break; |
124 | - | |
125 | 95 | case INSQUOTESTRING: |
126 | - statementUnderConstruction.append(c); | |
127 | - if (c == '\'') { | |
128 | - if (peekAhead() == '\'') { | |
129 | - statementUnderConstruction.append(getChar()); | |
130 | - } else { | |
131 | - state = State.DEFAULT; | |
132 | - } | |
133 | - } | |
96 | + processInSQuoteStringState(c, statementUnderConstruction); | |
134 | 97 | break; |
135 | 98 | } |
136 | 99 | |
... | ... | @@ -141,6 +104,50 @@ public class CQLStatementsParser { |
141 | 104 | } |
142 | 105 | } |
143 | 106 | |
107 | + private void processDefaultState(char c, StringBuilder statementUnderConstruction) { | |
108 | + if ((c == '/' && peekAhead() == '/') || (c == '-' && peekAhead() == '-')) { | |
109 | + state = State.INSINGLELINECOMMENT; | |
110 | + advance(); | |
111 | + } else if (c == '/' && peekAhead() == '*') { | |
112 | + state = State.INMULTILINECOMMENT; | |
113 | + advance(); | |
114 | + } else if (c == '\n') { | |
115 | + statementUnderConstruction.append(' '); | |
116 | + } else { | |
117 | + statementUnderConstruction.append(c); | |
118 | + if (c == '\"') { | |
119 | + state = State.INQUOTESTRING; | |
120 | + } else if (c == '\'') { | |
121 | + state = State.INSQUOTESTRING; | |
122 | + } else if (c == ';') { | |
123 | + statements.add(statementUnderConstruction.toString().trim()); | |
124 | + statementUnderConstruction.setLength(0); | |
125 | + } | |
126 | + } | |
127 | + } | |
128 | + | |
129 | + private void processInQuoteStringState(char c, StringBuilder statementUnderConstruction) { | |
130 | + statementUnderConstruction.append(c); | |
131 | + if (c == '"') { | |
132 | + if (peekAhead() == '"') { | |
133 | + statementUnderConstruction.append(getChar()); | |
134 | + } else { | |
135 | + state = State.DEFAULT; | |
136 | + } | |
137 | + } | |
138 | + } | |
139 | + | |
140 | + private void processInSQuoteStringState(char c, StringBuilder statementUnderConstruction) { | |
141 | + statementUnderConstruction.append(c); | |
142 | + if (c == '\'') { | |
143 | + if (peekAhead() == '\'') { | |
144 | + statementUnderConstruction.append(getChar()); | |
145 | + } else { | |
146 | + state = State.DEFAULT; | |
147 | + } | |
148 | + } | |
149 | + } | |
150 | + | |
144 | 151 | private char getChar() { |
145 | 152 | if (pos < text.length()) |
146 | 153 | return text.charAt(pos++); | ... | ... |
... | ... | @@ -44,6 +44,9 @@ import java.util.Properties; |
44 | 44 | @Slf4j |
45 | 45 | public class DefaultMailService implements MailService { |
46 | 46 | |
47 | + public static final String MAIL_PROP = "mail."; | |
48 | + public static final String TARGET_EMAIL = "targetEmail"; | |
49 | + public static final String UTF_8 = "UTF-8"; | |
47 | 50 | @Autowired |
48 | 51 | private MessageSource messages; |
49 | 52 | |
... | ... | @@ -89,11 +92,11 @@ public class DefaultMailService implements MailService { |
89 | 92 | Properties javaMailProperties = new Properties(); |
90 | 93 | String protocol = jsonConfig.get("smtpProtocol").asText(); |
91 | 94 | javaMailProperties.put("mail.transport.protocol", protocol); |
92 | - javaMailProperties.put("mail." + protocol + ".host", jsonConfig.get("smtpHost").asText()); | |
93 | - javaMailProperties.put("mail." + protocol + ".port", jsonConfig.get("smtpPort").asText()); | |
94 | - javaMailProperties.put("mail." + protocol + ".timeout", jsonConfig.get("timeout").asText()); | |
95 | - javaMailProperties.put("mail." + protocol + ".auth", String.valueOf(StringUtils.isNotEmpty(jsonConfig.get("username").asText()))); | |
96 | - javaMailProperties.put("mail." + protocol + ".starttls.enable", jsonConfig.get("enableTls")); | |
95 | + javaMailProperties.put(MAIL_PROP + protocol + ".host", jsonConfig.get("smtpHost").asText()); | |
96 | + javaMailProperties.put(MAIL_PROP + protocol + ".port", jsonConfig.get("smtpPort").asText()); | |
97 | + javaMailProperties.put(MAIL_PROP + protocol + ".timeout", jsonConfig.get("timeout").asText()); | |
98 | + javaMailProperties.put(MAIL_PROP + protocol + ".auth", String.valueOf(StringUtils.isNotEmpty(jsonConfig.get("username").asText()))); | |
99 | + javaMailProperties.put(MAIL_PROP + protocol + ".starttls.enable", jsonConfig.get("enableTls")); | |
97 | 100 | return javaMailProperties; |
98 | 101 | } |
99 | 102 | |
... | ... | @@ -117,10 +120,10 @@ public class DefaultMailService implements MailService { |
117 | 120 | String subject = messages.getMessage("test.message.subject", null, Locale.US); |
118 | 121 | |
119 | 122 | Map<String, Object> model = new HashMap<String, Object>(); |
120 | - model.put("targetEmail", email); | |
123 | + model.put(TARGET_EMAIL, email); | |
121 | 124 | |
122 | 125 | String message = VelocityEngineUtils.mergeTemplateIntoString(this.engine, |
123 | - "test.vm", "UTF-8", model); | |
126 | + "test.vm", UTF_8, model); | |
124 | 127 | |
125 | 128 | sendMail(testMailSender, mailFrom, email, subject, message); |
126 | 129 | } |
... | ... | @@ -132,10 +135,10 @@ public class DefaultMailService implements MailService { |
132 | 135 | |
133 | 136 | Map<String, Object> model = new HashMap<String, Object>(); |
134 | 137 | model.put("activationLink", activationLink); |
135 | - model.put("targetEmail", email); | |
138 | + model.put(TARGET_EMAIL, email); | |
136 | 139 | |
137 | 140 | String message = VelocityEngineUtils.mergeTemplateIntoString(this.engine, |
138 | - "activation.vm", "UTF-8", model); | |
141 | + "activation.vm", UTF_8, model); | |
139 | 142 | |
140 | 143 | sendMail(mailSender, mailFrom, email, subject, message); |
141 | 144 | } |
... | ... | @@ -147,10 +150,10 @@ public class DefaultMailService implements MailService { |
147 | 150 | |
148 | 151 | Map<String, Object> model = new HashMap<String, Object>(); |
149 | 152 | model.put("loginLink", loginLink); |
150 | - model.put("targetEmail", email); | |
153 | + model.put(TARGET_EMAIL, email); | |
151 | 154 | |
152 | 155 | String message = VelocityEngineUtils.mergeTemplateIntoString(this.engine, |
153 | - "account.activated.vm", "UTF-8", model); | |
156 | + "account.activated.vm", UTF_8, model); | |
154 | 157 | |
155 | 158 | sendMail(mailSender, mailFrom, email, subject, message); |
156 | 159 | } |
... | ... | @@ -162,10 +165,10 @@ public class DefaultMailService implements MailService { |
162 | 165 | |
163 | 166 | Map<String, Object> model = new HashMap<String, Object>(); |
164 | 167 | model.put("passwordResetLink", passwordResetLink); |
165 | - model.put("targetEmail", email); | |
168 | + model.put(TARGET_EMAIL, email); | |
166 | 169 | |
167 | 170 | String message = VelocityEngineUtils.mergeTemplateIntoString(this.engine, |
168 | - "reset.password.vm", "UTF-8", model); | |
171 | + "reset.password.vm", UTF_8, model); | |
169 | 172 | |
170 | 173 | sendMail(mailSender, mailFrom, email, subject, message); |
171 | 174 | } |
... | ... | @@ -177,10 +180,10 @@ public class DefaultMailService implements MailService { |
177 | 180 | |
178 | 181 | Map<String, Object> model = new HashMap<String, Object>(); |
179 | 182 | model.put("loginLink", loginLink); |
180 | - model.put("targetEmail", email); | |
183 | + model.put(TARGET_EMAIL, email); | |
181 | 184 | |
182 | 185 | String message = VelocityEngineUtils.mergeTemplateIntoString(this.engine, |
183 | - "password.was.reset.vm", "UTF-8", model); | |
186 | + "password.was.reset.vm", UTF_8, model); | |
184 | 187 | |
185 | 188 | sendMail(mailSender, mailFrom, email, subject, message); |
186 | 189 | } |
... | ... | @@ -191,7 +194,7 @@ public class DefaultMailService implements MailService { |
191 | 194 | String subject, String message) throws ThingsboardException { |
192 | 195 | try { |
193 | 196 | MimeMessage mimeMsg = mailSender.createMimeMessage(); |
194 | - MimeMessageHelper helper = new MimeMessageHelper(mimeMsg, "UTF-8"); | |
197 | + MimeMessageHelper helper = new MimeMessageHelper(mimeMsg, UTF_8); | |
195 | 198 | helper.setFrom(mailFrom); |
196 | 199 | helper.setTo(email); |
197 | 200 | helper.setSubject(subject); | ... | ... |
... | ... | @@ -16,6 +16,7 @@ |
16 | 16 | package org.thingsboard.server.service.security.auth.jwt; |
17 | 17 | |
18 | 18 | import com.fasterxml.jackson.databind.ObjectMapper; |
19 | +import lombok.extern.slf4j.Slf4j; | |
19 | 20 | import org.apache.commons.lang3.StringUtils; |
20 | 21 | import org.slf4j.Logger; |
21 | 22 | import org.slf4j.LoggerFactory; |
... | ... | @@ -37,8 +38,8 @@ import javax.servlet.http.HttpServletRequest; |
37 | 38 | import javax.servlet.http.HttpServletResponse; |
38 | 39 | import java.io.IOException; |
39 | 40 | |
41 | +@Slf4j | |
40 | 42 | public class RefreshTokenProcessingFilter extends AbstractAuthenticationProcessingFilter { |
41 | - private static Logger logger = LoggerFactory.getLogger(RefreshTokenProcessingFilter.class); | |
42 | 43 | |
43 | 44 | private final AuthenticationSuccessHandler successHandler; |
44 | 45 | private final AuthenticationFailureHandler failureHandler; |
... | ... | @@ -57,8 +58,8 @@ public class RefreshTokenProcessingFilter extends AbstractAuthenticationProcessi |
57 | 58 | public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) |
58 | 59 | throws AuthenticationException, IOException, ServletException { |
59 | 60 | if (!HttpMethod.POST.name().equals(request.getMethod())) { |
60 | - if(logger.isDebugEnabled()) { | |
61 | - logger.debug("Authentication method not supported. Request method: " + request.getMethod()); | |
61 | + if(log.isDebugEnabled()) { | |
62 | + log.debug("Authentication method not supported. Request method: " + request.getMethod()); | |
62 | 63 | } |
63 | 64 | throw new AuthMethodNotSupportedException("Authentication method not supported"); |
64 | 65 | } | ... | ... |
... | ... | @@ -24,7 +24,7 @@ import javax.servlet.http.HttpServletRequest; |
24 | 24 | |
25 | 25 | @Component(value="jwtHeaderTokenExtractor") |
26 | 26 | public class JwtHeaderTokenExtractor implements TokenExtractor { |
27 | - public static String HEADER_PREFIX = "Bearer "; | |
27 | + public static final String HEADER_PREFIX = "Bearer "; | |
28 | 28 | |
29 | 29 | @Override |
30 | 30 | public String extract(HttpServletRequest request) { | ... | ... |
... | ... | @@ -16,6 +16,7 @@ |
16 | 16 | package org.thingsboard.server.service.security.auth.rest; |
17 | 17 | |
18 | 18 | import com.fasterxml.jackson.databind.ObjectMapper; |
19 | +import lombok.extern.slf4j.Slf4j; | |
19 | 20 | import org.apache.commons.lang3.StringUtils; |
20 | 21 | import org.slf4j.Logger; |
21 | 22 | import org.slf4j.LoggerFactory; |
... | ... | @@ -37,8 +38,8 @@ import javax.servlet.http.HttpServletRequest; |
37 | 38 | import javax.servlet.http.HttpServletResponse; |
38 | 39 | import java.io.IOException; |
39 | 40 | |
41 | +@Slf4j | |
40 | 42 | public class RestLoginProcessingFilter extends AbstractAuthenticationProcessingFilter { |
41 | - private static Logger logger = LoggerFactory.getLogger(RestLoginProcessingFilter.class); | |
42 | 43 | |
43 | 44 | private final AuthenticationSuccessHandler successHandler; |
44 | 45 | private final AuthenticationFailureHandler failureHandler; |
... | ... | @@ -57,8 +58,8 @@ public class RestLoginProcessingFilter extends AbstractAuthenticationProcessingF |
57 | 58 | public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) |
58 | 59 | throws AuthenticationException, IOException, ServletException { |
59 | 60 | if (!HttpMethod.POST.name().equals(request.getMethod())) { |
60 | - if(logger.isDebugEnabled()) { | |
61 | - logger.debug("Authentication method not supported. Request method: " + request.getMethod()); | |
61 | + if(log.isDebugEnabled()) { | |
62 | + log.debug("Authentication method not supported. Request method: " + request.getMethod()); | |
62 | 63 | } |
63 | 64 | throw new AuthMethodNotSupportedException("Authentication method not supported"); |
64 | 65 | } | ... | ... |
... | ... | @@ -16,6 +16,7 @@ |
16 | 16 | package org.thingsboard.server.service.security.auth.rest; |
17 | 17 | |
18 | 18 | import com.fasterxml.jackson.databind.ObjectMapper; |
19 | +import lombok.extern.slf4j.Slf4j; | |
19 | 20 | import org.apache.commons.lang3.StringUtils; |
20 | 21 | import org.slf4j.Logger; |
21 | 22 | import org.slf4j.LoggerFactory; |
... | ... | @@ -37,8 +38,8 @@ import javax.servlet.http.HttpServletRequest; |
37 | 38 | import javax.servlet.http.HttpServletResponse; |
38 | 39 | import java.io.IOException; |
39 | 40 | |
41 | +@Slf4j | |
40 | 42 | public class RestPublicLoginProcessingFilter extends AbstractAuthenticationProcessingFilter { |
41 | - private static Logger logger = LoggerFactory.getLogger(RestPublicLoginProcessingFilter.class); | |
42 | 43 | |
43 | 44 | private final AuthenticationSuccessHandler successHandler; |
44 | 45 | private final AuthenticationFailureHandler failureHandler; |
... | ... | @@ -57,8 +58,8 @@ public class RestPublicLoginProcessingFilter extends AbstractAuthenticationProce |
57 | 58 | public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) |
58 | 59 | throws AuthenticationException, IOException, ServletException { |
59 | 60 | if (!HttpMethod.POST.name().equals(request.getMethod())) { |
60 | - if(logger.isDebugEnabled()) { | |
61 | - logger.debug("Authentication method not supported. Request method: " + request.getMethod()); | |
61 | + if(log.isDebugEnabled()) { | |
62 | + log.debug("Authentication method not supported. Request method: " + request.getMethod()); | |
62 | 63 | } |
63 | 64 | throw new AuthMethodNotSupportedException("Authentication method not supported"); |
64 | 65 | } | ... | ... |
... | ... | @@ -46,7 +46,7 @@ public class SecurityUser extends User { |
46 | 46 | this.userPrincipal = userPrincipal; |
47 | 47 | } |
48 | 48 | |
49 | - public Collection<? extends GrantedAuthority> getAuthorities() { | |
49 | + public Collection<GrantedAuthority> getAuthorities() { | |
50 | 50 | if (authorities == null) { |
51 | 51 | authorities = Stream.of(SecurityUser.this.getAuthority()) |
52 | 52 | .map(authority -> new SimpleGrantedAuthority(authority.name())) | ... | ... |
... | ... | @@ -16,7 +16,9 @@ |
16 | 16 | |
17 | 17 | package org.thingsboard.server.service.security.model; |
18 | 18 | |
19 | -public class UserPrincipal { | |
19 | +import java.io.Serializable; | |
20 | + | |
21 | +public class UserPrincipal implements Serializable { | |
20 | 22 | |
21 | 23 | private final Type type; |
22 | 24 | private final String value; | ... | ... |
... | ... | @@ -21,7 +21,7 @@ import io.jsonwebtoken.Claims; |
21 | 21 | public final class AccessJwtToken implements JwtToken { |
22 | 22 | private final String rawToken; |
23 | 23 | @JsonIgnore |
24 | - private Claims claims; | |
24 | + private transient Claims claims; | |
25 | 25 | |
26 | 26 | protected AccessJwtToken(final String token, Claims claims) { |
27 | 27 | this.rawToken = token; | ... | ... |
application/src/main/java/org/thingsboard/server/service/security/model/token/RawAccessJwtToken.java
... | ... | @@ -21,7 +21,12 @@ import org.slf4j.LoggerFactory; |
21 | 21 | import org.springframework.security.authentication.BadCredentialsException; |
22 | 22 | import org.thingsboard.server.service.security.exception.JwtExpiredTokenException; |
23 | 23 | |
24 | -public class RawAccessJwtToken implements JwtToken { | |
24 | +import java.io.Serializable; | |
25 | + | |
26 | +public class RawAccessJwtToken implements JwtToken, Serializable { | |
27 | + | |
28 | + private static final long serialVersionUID = -797397445703066079L; | |
29 | + | |
25 | 30 | private static Logger logger = LoggerFactory.getLogger(RawAccessJwtToken.class); |
26 | 31 | |
27 | 32 | private String token; | ... | ... |
... | ... | @@ -27,6 +27,7 @@ import org.thingsboard.server.service.update.model.UpdateMessage; |
27 | 27 | |
28 | 28 | import javax.annotation.PostConstruct; |
29 | 29 | import javax.annotation.PreDestroy; |
30 | +import java.io.IOException; | |
30 | 31 | import java.nio.file.Files; |
31 | 32 | import java.nio.file.Path; |
32 | 33 | import java.nio.file.Paths; |
... | ... | @@ -71,25 +72,34 @@ public class DefaultUpdateService implements UpdateService { |
71 | 72 | if (version == null) { |
72 | 73 | version = "unknown"; |
73 | 74 | } |
74 | - Path instanceIdPath = Paths.get(INSTANCE_ID_FILE); | |
75 | - if (Files.exists(instanceIdPath)) { | |
76 | - byte[] data = Files.readAllBytes(instanceIdPath); | |
77 | - if (data != null && data.length > 0) { | |
78 | - try { | |
79 | - instanceId = UUID.fromString(new String(data)); | |
80 | - } catch (IllegalArgumentException e) { | |
81 | - } | |
82 | - } | |
83 | - } | |
84 | - if (instanceId == null) { | |
85 | - instanceId = UUID.randomUUID(); | |
86 | - Files.write(instanceIdPath, instanceId.toString().getBytes()); | |
87 | - } | |
75 | + instanceId = parseInstanceId(); | |
88 | 76 | checkUpdatesFuture = scheduler.scheduleAtFixedRate(checkUpdatesRunnable, 0, 1, TimeUnit.HOURS); |
89 | - } catch (Exception e) {} | |
77 | + } catch (Exception e) { | |
78 | + //Do nothing | |
79 | + } | |
90 | 80 | } |
91 | 81 | } |
92 | 82 | |
83 | + private UUID parseInstanceId() throws IOException { | |
84 | + UUID result = null; | |
85 | + Path instanceIdPath = Paths.get(INSTANCE_ID_FILE); | |
86 | + if (instanceIdPath.toFile().exists()) { | |
87 | + byte[] data = Files.readAllBytes(instanceIdPath); | |
88 | + if (data != null && data.length > 0) { | |
89 | + try { | |
90 | + result = UUID.fromString(new String(data)); | |
91 | + } catch (IllegalArgumentException e) { | |
92 | + //Do nothing | |
93 | + } | |
94 | + } | |
95 | + } | |
96 | + if (result == null) { | |
97 | + result = UUID.randomUUID(); | |
98 | + Files.write(instanceIdPath, result.toString().getBytes()); | |
99 | + } | |
100 | + return result; | |
101 | + } | |
102 | + | |
93 | 103 | @PreDestroy |
94 | 104 | private void destroy() { |
95 | 105 | try { |
... | ... | @@ -97,26 +107,25 @@ public class DefaultUpdateService implements UpdateService { |
97 | 107 | checkUpdatesFuture.cancel(true); |
98 | 108 | } |
99 | 109 | scheduler.shutdownNow(); |
100 | - } catch (Exception e) {} | |
110 | + } catch (Exception e) { | |
111 | + //Do nothing | |
112 | + } | |
101 | 113 | } |
102 | 114 | |
103 | - Runnable checkUpdatesRunnable = new Runnable() { | |
104 | - @Override | |
105 | - public void run() { | |
106 | - try { | |
107 | - log.trace("Executing check update method for instanceId [{}], platform [{}] and version [{}]", instanceId, platform, version); | |
108 | - ObjectNode request = new ObjectMapper().createObjectNode(); | |
109 | - request.put(PLATFORM_PARAM, platform); | |
110 | - request.put(VERSION_PARAM, version); | |
111 | - request.put(INSTANCE_ID_PARAM, instanceId.toString()); | |
112 | - JsonNode response = restClient.postForObject(UPDATE_SERVER_BASE_URL+"/api/thingsboard/updates", request, JsonNode.class); | |
113 | - updateMessage = new UpdateMessage( | |
114 | - response.get("message").asText(), | |
115 | - response.get("updateAvailable").asBoolean() | |
116 | - ); | |
117 | - } catch (Exception e) { | |
118 | - log.trace(e.getMessage()); | |
119 | - } | |
115 | + Runnable checkUpdatesRunnable = () -> { | |
116 | + try { | |
117 | + log.trace("Executing check update method for instanceId [{}], platform [{}] and version [{}]", instanceId, platform, version); | |
118 | + ObjectNode request = new ObjectMapper().createObjectNode(); | |
119 | + request.put(PLATFORM_PARAM, platform); | |
120 | + request.put(VERSION_PARAM, version); | |
121 | + request.put(INSTANCE_ID_PARAM, instanceId.toString()); | |
122 | + JsonNode response = restClient.postForObject(UPDATE_SERVER_BASE_URL+"/api/thingsboard/updates", request, JsonNode.class); | |
123 | + updateMessage = new UpdateMessage( | |
124 | + response.get("message").asText(), | |
125 | + response.get("updateAvailable").asBoolean() | |
126 | + ); | |
127 | + } catch (Exception e) { | |
128 | + log.trace(e.getMessage()); | |
120 | 129 | } |
121 | 130 | }; |
122 | 131 | ... | ... |
... | ... | @@ -24,7 +24,7 @@ public class AdminSettings extends BaseData<AdminSettingsId> { |
24 | 24 | private static final long serialVersionUID = -7670322981725511892L; |
25 | 25 | |
26 | 26 | private String key; |
27 | - private JsonNode jsonValue; | |
27 | + private transient JsonNode jsonValue; | |
28 | 28 | |
29 | 29 | public AdminSettings() { |
30 | 30 | super(); | ... | ... |
... | ... | @@ -15,8 +15,10 @@ |
15 | 15 | */ |
16 | 16 | package org.thingsboard.server.common.data; |
17 | 17 | |
18 | +import lombok.EqualsAndHashCode; | |
18 | 19 | import org.thingsboard.server.common.data.id.UUIDBased; |
19 | 20 | |
21 | +@EqualsAndHashCode(callSuper = true) | |
20 | 22 | public abstract class ContactBased<I extends UUIDBased> extends SearchTextBased<I> { |
21 | 23 | |
22 | 24 | private static final long serialVersionUID = 5047448057830660988L; |
... | ... | @@ -114,72 +116,4 @@ public abstract class ContactBased<I extends UUIDBased> extends SearchTextBased< |
114 | 116 | this.email = email; |
115 | 117 | } |
116 | 118 | |
117 | - @Override | |
118 | - public int hashCode() { | |
119 | - final int prime = 31; | |
120 | - int result = super.hashCode(); | |
121 | - result = prime * result + ((address == null) ? 0 : address.hashCode()); | |
122 | - result = prime * result + ((address2 == null) ? 0 : address2.hashCode()); | |
123 | - result = prime * result + ((city == null) ? 0 : city.hashCode()); | |
124 | - result = prime * result + ((country == null) ? 0 : country.hashCode()); | |
125 | - result = prime * result + ((email == null) ? 0 : email.hashCode()); | |
126 | - result = prime * result + ((phone == null) ? 0 : phone.hashCode()); | |
127 | - result = prime * result + ((state == null) ? 0 : state.hashCode()); | |
128 | - result = prime * result + ((zip == null) ? 0 : zip.hashCode()); | |
129 | - return result; | |
130 | - } | |
131 | - | |
132 | - @SuppressWarnings("rawtypes") | |
133 | - @Override | |
134 | - public boolean equals(Object obj) { | |
135 | - if (this == obj) | |
136 | - return true; | |
137 | - if (!super.equals(obj)) | |
138 | - return false; | |
139 | - if (getClass() != obj.getClass()) | |
140 | - return false; | |
141 | - ContactBased other = (ContactBased) obj; | |
142 | - if (address == null) { | |
143 | - if (other.address != null) | |
144 | - return false; | |
145 | - } else if (!address.equals(other.address)) | |
146 | - return false; | |
147 | - if (address2 == null) { | |
148 | - if (other.address2 != null) | |
149 | - return false; | |
150 | - } else if (!address2.equals(other.address2)) | |
151 | - return false; | |
152 | - if (city == null) { | |
153 | - if (other.city != null) | |
154 | - return false; | |
155 | - } else if (!city.equals(other.city)) | |
156 | - return false; | |
157 | - if (country == null) { | |
158 | - if (other.country != null) | |
159 | - return false; | |
160 | - } else if (!country.equals(other.country)) | |
161 | - return false; | |
162 | - if (email == null) { | |
163 | - if (other.email != null) | |
164 | - return false; | |
165 | - } else if (!email.equals(other.email)) | |
166 | - return false; | |
167 | - if (phone == null) { | |
168 | - if (other.phone != null) | |
169 | - return false; | |
170 | - } else if (!phone.equals(other.phone)) | |
171 | - return false; | |
172 | - if (state == null) { | |
173 | - if (other.state != null) | |
174 | - return false; | |
175 | - } else if (!state.equals(other.state)) | |
176 | - return false; | |
177 | - if (zip == null) { | |
178 | - if (other.zip != null) | |
179 | - return false; | |
180 | - } else if (!zip.equals(other.zip)) | |
181 | - return false; | |
182 | - return true; | |
183 | - } | |
184 | - | |
185 | 119 | } | ... | ... |
... | ... | @@ -29,7 +29,7 @@ public class Customer extends ContactBased<CustomerId> implements HasName { |
29 | 29 | |
30 | 30 | private String title; |
31 | 31 | private TenantId tenantId; |
32 | - private JsonNode additionalInfo; | |
32 | + private transient JsonNode additionalInfo; | |
33 | 33 | |
34 | 34 | public Customer() { |
35 | 35 | super(); |
... | ... | @@ -87,7 +87,7 @@ public class Customer extends ContactBased<CustomerId> implements HasName { |
87 | 87 | |
88 | 88 | @Override |
89 | 89 | public String getSearchText() { |
90 | - return title; | |
90 | + return getTitle(); | |
91 | 91 | } |
92 | 92 | |
93 | 93 | @Override | ... | ... |
... | ... | @@ -29,7 +29,9 @@ public class DataConstants { |
29 | 29 | public static final String SERVER_SCOPE = "SERVER_SCOPE"; |
30 | 30 | public static final String SHARED_SCOPE = "SHARED_SCOPE"; |
31 | 31 | |
32 | - public static final String[] ALL_SCOPES = {CLIENT_SCOPE, SHARED_SCOPE, SERVER_SCOPE}; | |
32 | + public static final String[] allScopes() { | |
33 | + return new String[]{CLIENT_SCOPE, SHARED_SCOPE, SERVER_SCOPE}; | |
34 | + } | |
33 | 35 | |
34 | 36 | public static final String ALARM = "ALARM"; |
35 | 37 | public static final String ERROR = "ERROR"; | ... | ... |
... | ... | @@ -15,12 +15,14 @@ |
15 | 15 | */ |
16 | 16 | package org.thingsboard.server.common.data; |
17 | 17 | |
18 | +import lombok.EqualsAndHashCode; | |
18 | 19 | import org.thingsboard.server.common.data.id.CustomerId; |
19 | 20 | import org.thingsboard.server.common.data.id.DeviceId; |
20 | 21 | import org.thingsboard.server.common.data.id.TenantId; |
21 | 22 | |
22 | 23 | import com.fasterxml.jackson.databind.JsonNode; |
23 | 24 | |
25 | +@EqualsAndHashCode(callSuper = true) | |
24 | 26 | public class Device extends SearchTextBased<DeviceId> implements HasName { |
25 | 27 | |
26 | 28 | private static final long serialVersionUID = 2807343040519543363L; |
... | ... | @@ -29,7 +31,7 @@ public class Device extends SearchTextBased<DeviceId> implements HasName { |
29 | 31 | private CustomerId customerId; |
30 | 32 | private String name; |
31 | 33 | private String type; |
32 | - private JsonNode additionalInfo; | |
34 | + private transient JsonNode additionalInfo; | |
33 | 35 | |
34 | 36 | public Device() { |
35 | 37 | super(); |
... | ... | @@ -91,56 +93,7 @@ public class Device extends SearchTextBased<DeviceId> implements HasName { |
91 | 93 | |
92 | 94 | @Override |
93 | 95 | public String getSearchText() { |
94 | - return name; | |
95 | - } | |
96 | - | |
97 | - @Override | |
98 | - public int hashCode() { | |
99 | - final int prime = 31; | |
100 | - int result = super.hashCode(); | |
101 | - result = prime * result + ((additionalInfo == null) ? 0 : additionalInfo.hashCode()); | |
102 | - result = prime * result + ((customerId == null) ? 0 : customerId.hashCode()); | |
103 | - result = prime * result + ((name == null) ? 0 : name.hashCode()); | |
104 | - result = prime * result + ((type == null) ? 0 : type.hashCode()); | |
105 | - result = prime * result + ((tenantId == null) ? 0 : tenantId.hashCode()); | |
106 | - return result; | |
107 | - } | |
108 | - | |
109 | - @Override | |
110 | - public boolean equals(Object obj) { | |
111 | - if (this == obj) | |
112 | - return true; | |
113 | - if (!super.equals(obj)) | |
114 | - return false; | |
115 | - if (getClass() != obj.getClass()) | |
116 | - return false; | |
117 | - Device other = (Device) obj; | |
118 | - if (additionalInfo == null) { | |
119 | - if (other.additionalInfo != null) | |
120 | - return false; | |
121 | - } else if (!additionalInfo.equals(other.additionalInfo)) | |
122 | - return false; | |
123 | - if (customerId == null) { | |
124 | - if (other.customerId != null) | |
125 | - return false; | |
126 | - } else if (!customerId.equals(other.customerId)) | |
127 | - return false; | |
128 | - if (name == null) { | |
129 | - if (other.name != null) | |
130 | - return false; | |
131 | - } else if (!name.equals(other.name)) | |
132 | - return false; | |
133 | - if (type == null) { | |
134 | - if (other.type != null) | |
135 | - return false; | |
136 | - } else if (!type.equals(other.type)) | |
137 | - return false; | |
138 | - if (tenantId == null) { | |
139 | - if (other.tenantId != null) | |
140 | - return false; | |
141 | - } else if (!tenantId.equals(other.tenantId)) | |
142 | - return false; | |
143 | - return true; | |
96 | + return getName(); | |
144 | 97 | } |
145 | 98 | |
146 | 99 | @Override | ... | ... |
... | ... | @@ -16,17 +16,19 @@ |
16 | 16 | package org.thingsboard.server.common.data; |
17 | 17 | |
18 | 18 | import com.fasterxml.jackson.annotation.JsonProperty; |
19 | +import lombok.EqualsAndHashCode; | |
19 | 20 | import org.thingsboard.server.common.data.id.TenantId; |
20 | 21 | |
21 | 22 | import com.fasterxml.jackson.databind.JsonNode; |
22 | 23 | |
24 | +@EqualsAndHashCode(callSuper = true) | |
23 | 25 | public class Tenant extends ContactBased<TenantId> implements HasName { |
24 | 26 | |
25 | 27 | private static final long serialVersionUID = 8057243243859922101L; |
26 | 28 | |
27 | 29 | private String title; |
28 | 30 | private String region; |
29 | - private JsonNode additionalInfo; | |
31 | + private transient JsonNode additionalInfo; | |
30 | 32 | |
31 | 33 | public Tenant() { |
32 | 34 | super(); |
... | ... | @@ -75,44 +77,7 @@ public class Tenant extends ContactBased<TenantId> implements HasName { |
75 | 77 | |
76 | 78 | @Override |
77 | 79 | public String getSearchText() { |
78 | - return title; | |
79 | - } | |
80 | - | |
81 | - @Override | |
82 | - public int hashCode() { | |
83 | - final int prime = 31; | |
84 | - int result = super.hashCode(); | |
85 | - result = prime * result + ((additionalInfo == null) ? 0 : additionalInfo.hashCode()); | |
86 | - result = prime * result + ((region == null) ? 0 : region.hashCode()); | |
87 | - result = prime * result + ((title == null) ? 0 : title.hashCode()); | |
88 | - return result; | |
89 | - } | |
90 | - | |
91 | - @Override | |
92 | - public boolean equals(Object obj) { | |
93 | - if (this == obj) | |
94 | - return true; | |
95 | - if (!super.equals(obj)) | |
96 | - return false; | |
97 | - if (getClass() != obj.getClass()) | |
98 | - return false; | |
99 | - Tenant other = (Tenant) obj; | |
100 | - if (additionalInfo == null) { | |
101 | - if (other.additionalInfo != null) | |
102 | - return false; | |
103 | - } else if (!additionalInfo.equals(other.additionalInfo)) | |
104 | - return false; | |
105 | - if (region == null) { | |
106 | - if (other.region != null) | |
107 | - return false; | |
108 | - } else if (!region.equals(other.region)) | |
109 | - return false; | |
110 | - if (title == null) { | |
111 | - if (other.title != null) | |
112 | - return false; | |
113 | - } else if (!title.equals(other.title)) | |
114 | - return false; | |
115 | - return true; | |
80 | + return getTitle(); | |
116 | 81 | } |
117 | 82 | |
118 | 83 | @Override | ... | ... |
... | ... | @@ -16,6 +16,7 @@ |
16 | 16 | package org.thingsboard.server.common.data; |
17 | 17 | |
18 | 18 | import com.fasterxml.jackson.annotation.JsonProperty; |
19 | +import lombok.EqualsAndHashCode; | |
19 | 20 | import org.thingsboard.server.common.data.id.CustomerId; |
20 | 21 | import org.thingsboard.server.common.data.id.TenantId; |
21 | 22 | import org.thingsboard.server.common.data.id.UserId; |
... | ... | @@ -23,6 +24,7 @@ import org.thingsboard.server.common.data.security.Authority; |
23 | 24 | |
24 | 25 | import com.fasterxml.jackson.databind.JsonNode; |
25 | 26 | |
27 | +@EqualsAndHashCode(callSuper = true) | |
26 | 28 | public class User extends SearchTextBased<UserId> implements HasName { |
27 | 29 | |
28 | 30 | private static final long serialVersionUID = 8250339805336035966L; |
... | ... | @@ -33,7 +35,7 @@ public class User extends SearchTextBased<UserId> implements HasName { |
33 | 35 | private Authority authority; |
34 | 36 | private String firstName; |
35 | 37 | private String lastName; |
36 | - private JsonNode additionalInfo; | |
38 | + private transient JsonNode additionalInfo; | |
37 | 39 | |
38 | 40 | public User() { |
39 | 41 | super(); |
... | ... | @@ -118,65 +120,7 @@ public class User extends SearchTextBased<UserId> implements HasName { |
118 | 120 | |
119 | 121 | @Override |
120 | 122 | public String getSearchText() { |
121 | - return email; | |
122 | - } | |
123 | - | |
124 | - @Override | |
125 | - public int hashCode() { | |
126 | - final int prime = 31; | |
127 | - int result = super.hashCode(); | |
128 | - result = prime * result + ((additionalInfo == null) ? 0 : additionalInfo.hashCode()); | |
129 | - result = prime * result + ((authority == null) ? 0 : authority.hashCode()); | |
130 | - result = prime * result + ((customerId == null) ? 0 : customerId.hashCode()); | |
131 | - result = prime * result + ((email == null) ? 0 : email.hashCode()); | |
132 | - result = prime * result + ((firstName == null) ? 0 : firstName.hashCode()); | |
133 | - result = prime * result + ((lastName == null) ? 0 : lastName.hashCode()); | |
134 | - result = prime * result + ((tenantId == null) ? 0 : tenantId.hashCode()); | |
135 | - return result; | |
136 | - } | |
137 | - | |
138 | - @Override | |
139 | - public boolean equals(Object obj) { | |
140 | - if (this == obj) | |
141 | - return true; | |
142 | - if (!super.equals(obj)) | |
143 | - return false; | |
144 | - if (getClass() != obj.getClass()) | |
145 | - return false; | |
146 | - User other = (User) obj; | |
147 | - if (additionalInfo == null) { | |
148 | - if (other.additionalInfo != null) | |
149 | - return false; | |
150 | - } else if (!additionalInfo.equals(other.additionalInfo)) | |
151 | - return false; | |
152 | - if (authority != other.authority) | |
153 | - return false; | |
154 | - if (customerId == null) { | |
155 | - if (other.customerId != null) | |
156 | - return false; | |
157 | - } else if (!customerId.equals(other.customerId)) | |
158 | - return false; | |
159 | - if (email == null) { | |
160 | - if (other.email != null) | |
161 | - return false; | |
162 | - } else if (!email.equals(other.email)) | |
163 | - return false; | |
164 | - if (firstName == null) { | |
165 | - if (other.firstName != null) | |
166 | - return false; | |
167 | - } else if (!firstName.equals(other.firstName)) | |
168 | - return false; | |
169 | - if (lastName == null) { | |
170 | - if (other.lastName != null) | |
171 | - return false; | |
172 | - } else if (!lastName.equals(other.lastName)) | |
173 | - return false; | |
174 | - if (tenantId == null) { | |
175 | - if (other.tenantId != null) | |
176 | - return false; | |
177 | - } else if (!tenantId.equals(other.tenantId)) | |
178 | - return false; | |
179 | - return true; | |
123 | + return getEmail(); | |
180 | 124 | } |
181 | 125 | |
182 | 126 | @Override | ... | ... |
... | ... | @@ -42,7 +42,7 @@ public class Alarm extends BaseData<AlarmId> implements HasName { |
42 | 42 | private long endTs; |
43 | 43 | private long ackTs; |
44 | 44 | private long clearTs; |
45 | - private JsonNode details; | |
45 | + private transient JsonNode details; | |
46 | 46 | private boolean propagate; |
47 | 47 | |
48 | 48 | public Alarm() { | ... | ... |
... | ... | @@ -16,12 +16,14 @@ |
16 | 16 | package org.thingsboard.server.common.data.asset; |
17 | 17 | |
18 | 18 | import com.fasterxml.jackson.databind.JsonNode; |
19 | +import lombok.EqualsAndHashCode; | |
19 | 20 | import org.thingsboard.server.common.data.HasName; |
20 | 21 | import org.thingsboard.server.common.data.SearchTextBased; |
21 | 22 | import org.thingsboard.server.common.data.id.AssetId; |
22 | 23 | import org.thingsboard.server.common.data.id.CustomerId; |
23 | 24 | import org.thingsboard.server.common.data.id.TenantId; |
24 | 25 | |
26 | +@EqualsAndHashCode(callSuper = true) | |
25 | 27 | public class Asset extends SearchTextBased<AssetId> implements HasName { |
26 | 28 | |
27 | 29 | private static final long serialVersionUID = 2807343040519543363L; |
... | ... | @@ -30,7 +32,7 @@ public class Asset extends SearchTextBased<AssetId> implements HasName { |
30 | 32 | private CustomerId customerId; |
31 | 33 | private String name; |
32 | 34 | private String type; |
33 | - private JsonNode additionalInfo; | |
35 | + private transient JsonNode additionalInfo; | |
34 | 36 | |
35 | 37 | public Asset() { |
36 | 38 | super(); |
... | ... | @@ -92,56 +94,7 @@ public class Asset extends SearchTextBased<AssetId> implements HasName { |
92 | 94 | |
93 | 95 | @Override |
94 | 96 | public String getSearchText() { |
95 | - return name; | |
96 | - } | |
97 | - | |
98 | - @Override | |
99 | - public int hashCode() { | |
100 | - final int prime = 31; | |
101 | - int result = super.hashCode(); | |
102 | - result = prime * result + ((additionalInfo == null) ? 0 : additionalInfo.hashCode()); | |
103 | - result = prime * result + ((customerId == null) ? 0 : customerId.hashCode()); | |
104 | - result = prime * result + ((name == null) ? 0 : name.hashCode()); | |
105 | - result = prime * result + ((type == null) ? 0 : type.hashCode()); | |
106 | - result = prime * result + ((tenantId == null) ? 0 : tenantId.hashCode()); | |
107 | - return result; | |
108 | - } | |
109 | - | |
110 | - @Override | |
111 | - public boolean equals(Object obj) { | |
112 | - if (this == obj) | |
113 | - return true; | |
114 | - if (!super.equals(obj)) | |
115 | - return false; | |
116 | - if (getClass() != obj.getClass()) | |
117 | - return false; | |
118 | - Asset other = (Asset) obj; | |
119 | - if (additionalInfo == null) { | |
120 | - if (other.additionalInfo != null) | |
121 | - return false; | |
122 | - } else if (!additionalInfo.equals(other.additionalInfo)) | |
123 | - return false; | |
124 | - if (customerId == null) { | |
125 | - if (other.customerId != null) | |
126 | - return false; | |
127 | - } else if (!customerId.equals(other.customerId)) | |
128 | - return false; | |
129 | - if (name == null) { | |
130 | - if (other.name != null) | |
131 | - return false; | |
132 | - } else if (!name.equals(other.name)) | |
133 | - return false; | |
134 | - if (type == null) { | |
135 | - if (other.type != null) | |
136 | - return false; | |
137 | - } else if (!type.equals(other.type)) | |
138 | - return false; | |
139 | - if (tenantId == null) { | |
140 | - if (other.tenantId != null) | |
141 | - return false; | |
142 | - } else if (!tenantId.equals(other.tenantId)) | |
143 | - return false; | |
144 | - return true; | |
97 | + return getName(); | |
145 | 98 | } |
146 | 99 | |
147 | 100 | @Override | ... | ... |
... | ... | @@ -20,6 +20,7 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; |
20 | 20 | import com.fasterxml.jackson.databind.annotation.JsonSerialize; |
21 | 21 | import org.thingsboard.server.common.data.EntityType; |
22 | 22 | |
23 | +import java.io.Serializable; | |
23 | 24 | import java.util.UUID; |
24 | 25 | |
25 | 26 | /** |
... | ... | @@ -28,7 +29,7 @@ import java.util.UUID; |
28 | 29 | |
29 | 30 | @JsonDeserialize(using = EntityIdDeserializer.class) |
30 | 31 | @JsonSerialize(using = EntityIdSerializer.class) |
31 | -public interface EntityId { | |
32 | +public interface EntityId extends Serializable { //NOSONAR, the constant is closely related to EntityId | |
32 | 33 | |
33 | 34 | UUID NULL_UUID = UUID.fromString("13814000-1dd2-11b2-8080-808080808080"); |
34 | 35 | ... | ... |
... | ... | @@ -17,6 +17,7 @@ package org.thingsboard.server.common.data.page; |
17 | 17 | |
18 | 18 | import java.util.Iterator; |
19 | 19 | import java.util.List; |
20 | +import java.util.NoSuchElementException; | |
20 | 21 | |
21 | 22 | import org.thingsboard.server.common.data.SearchTextBased; |
22 | 23 | import org.thingsboard.server.common.data.id.UUIDBased; |
... | ... | @@ -54,7 +55,7 @@ public class PageDataIterable<T extends SearchTextBased<? extends UUIDBased>> im |
54 | 55 | fetch(nextPackLink); |
55 | 56 | } |
56 | 57 | } |
57 | - return currentIdx != currentItems.size(); | |
58 | + return currentIdx < currentItems.size(); | |
58 | 59 | } |
59 | 60 | |
60 | 61 | private void fetch(TextPageLink link) { |
... | ... | @@ -67,6 +68,9 @@ public class PageDataIterable<T extends SearchTextBased<? extends UUIDBased>> im |
67 | 68 | |
68 | 69 | @Override |
69 | 70 | public T next() { |
71 | + if(!hasNext()){ | |
72 | + throw new NoSuchElementException(); | |
73 | + } | |
70 | 74 | return currentItems.get(currentIdx++); |
71 | 75 | } |
72 | 76 | ... | ... |
... | ... | @@ -32,7 +32,7 @@ public class ComponentDescriptor extends SearchTextBased<ComponentDescriptorId> |
32 | 32 | @Getter @Setter private ComponentScope scope; |
33 | 33 | @Getter @Setter private String name; |
34 | 34 | @Getter @Setter private String clazz; |
35 | - @Getter @Setter private JsonNode configurationDescriptor; | |
35 | + @Getter @Setter private transient JsonNode configurationDescriptor; | |
36 | 36 | @Getter @Setter private String actions; |
37 | 37 | |
38 | 38 | public ComponentDescriptor() { | ... | ... |
... | ... | @@ -15,6 +15,7 @@ |
15 | 15 | */ |
16 | 16 | package org.thingsboard.server.common.data.plugin; |
17 | 17 | |
18 | +import lombok.EqualsAndHashCode; | |
18 | 19 | import org.thingsboard.server.common.data.HasName; |
19 | 20 | import org.thingsboard.server.common.data.SearchTextBased; |
20 | 21 | import org.thingsboard.server.common.data.id.PluginId; |
... | ... | @@ -22,6 +23,7 @@ import org.thingsboard.server.common.data.id.TenantId; |
22 | 23 | |
23 | 24 | import com.fasterxml.jackson.databind.JsonNode; |
24 | 25 | |
26 | +@EqualsAndHashCode(callSuper = true) | |
25 | 27 | public class PluginMetaData extends SearchTextBased<PluginId> implements HasName { |
26 | 28 | |
27 | 29 | private static final long serialVersionUID = 1L; |
... | ... | @@ -32,8 +34,8 @@ public class PluginMetaData extends SearchTextBased<PluginId> implements HasName |
32 | 34 | private String clazz; |
33 | 35 | private boolean publicAccess; |
34 | 36 | private ComponentLifecycleState state; |
35 | - private JsonNode configuration; | |
36 | - private JsonNode additionalInfo; | |
37 | + private transient JsonNode configuration; | |
38 | + private transient JsonNode additionalInfo; | |
37 | 39 | |
38 | 40 | public PluginMetaData() { |
39 | 41 | super(); |
... | ... | @@ -57,7 +59,7 @@ public class PluginMetaData extends SearchTextBased<PluginId> implements HasName |
57 | 59 | |
58 | 60 | @Override |
59 | 61 | public String getSearchText() { |
60 | - return name; | |
62 | + return getName(); | |
61 | 63 | } |
62 | 64 | |
63 | 65 | public String getApiToken() { |
... | ... | @@ -126,49 +128,6 @@ public class PluginMetaData extends SearchTextBased<PluginId> implements HasName |
126 | 128 | } |
127 | 129 | |
128 | 130 | @Override |
129 | - public int hashCode() { | |
130 | - final int prime = 31; | |
131 | - int result = super.hashCode(); | |
132 | - result = prime * result + ((apiToken == null) ? 0 : apiToken.hashCode()); | |
133 | - result = prime * result + ((clazz == null) ? 0 : clazz.hashCode()); | |
134 | - result = prime * result + ((name == null) ? 0 : name.hashCode()); | |
135 | - result = prime * result + ((tenantId == null) ? 0 : tenantId.hashCode()); | |
136 | - return result; | |
137 | - } | |
138 | - | |
139 | - @Override | |
140 | - public boolean equals(Object obj) { | |
141 | - if (this == obj) | |
142 | - return true; | |
143 | - if (!super.equals(obj)) | |
144 | - return false; | |
145 | - if (getClass() != obj.getClass()) | |
146 | - return false; | |
147 | - PluginMetaData other = (PluginMetaData) obj; | |
148 | - if (apiToken == null) { | |
149 | - if (other.apiToken != null) | |
150 | - return false; | |
151 | - } else if (!apiToken.equals(other.apiToken)) | |
152 | - return false; | |
153 | - if (clazz == null) { | |
154 | - if (other.clazz != null) | |
155 | - return false; | |
156 | - } else if (!clazz.equals(other.clazz)) | |
157 | - return false; | |
158 | - if (name == null) { | |
159 | - if (other.name != null) | |
160 | - return false; | |
161 | - } else if (!name.equals(other.name)) | |
162 | - return false; | |
163 | - if (tenantId == null) { | |
164 | - if (other.tenantId != null) | |
165 | - return false; | |
166 | - } else if (!tenantId.equals(other.tenantId)) | |
167 | - return false; | |
168 | - return true; | |
169 | - } | |
170 | - | |
171 | - @Override | |
172 | 131 | public String toString() { |
173 | 132 | return "PluginMetaData [apiToken=" + apiToken + ", tenantId=" + tenantId + ", name=" + name + ", clazz=" + clazz + ", publicAccess=" + publicAccess |
174 | 133 | + ", configuration=" + configuration + "]"; | ... | ... |
... | ... | @@ -35,10 +35,10 @@ public class RuleMetaData extends SearchTextBased<RuleId> implements HasName { |
35 | 35 | private ComponentLifecycleState state; |
36 | 36 | private int weight; |
37 | 37 | private String pluginToken; |
38 | - private JsonNode filters; | |
39 | - private JsonNode processor; | |
40 | - private JsonNode action; | |
41 | - private JsonNode additionalInfo; | |
38 | + private transient JsonNode filters; | |
39 | + private transient JsonNode processor; | |
40 | + private transient JsonNode action; | |
41 | + private transient JsonNode additionalInfo; | |
42 | 42 | |
43 | 43 | public RuleMetaData() { |
44 | 44 | super(); |
... | ... | @@ -63,7 +63,7 @@ public class RuleMetaData extends SearchTextBased<RuleId> implements HasName { |
63 | 63 | |
64 | 64 | @Override |
65 | 65 | public String getSearchText() { |
66 | - return name; | |
66 | + return getName(); | |
67 | 67 | } |
68 | 68 | |
69 | 69 | @Override | ... | ... |
... | ... | @@ -15,10 +15,12 @@ |
15 | 15 | */ |
16 | 16 | package org.thingsboard.server.common.data.security; |
17 | 17 | |
18 | +import lombok.EqualsAndHashCode; | |
18 | 19 | import org.thingsboard.server.common.data.BaseData; |
19 | 20 | import org.thingsboard.server.common.data.id.DeviceCredentialsId; |
20 | 21 | import org.thingsboard.server.common.data.id.DeviceId; |
21 | 22 | |
23 | +@EqualsAndHashCode(callSuper = true) | |
22 | 24 | public class DeviceCredentials extends BaseData<DeviceCredentialsId> implements DeviceCredentialsFilter { |
23 | 25 | |
24 | 26 | private static final long serialVersionUID = -7869261127032877765L; |
... | ... | @@ -79,46 +81,6 @@ public class DeviceCredentials extends BaseData<DeviceCredentialsId> implements |
79 | 81 | } |
80 | 82 | |
81 | 83 | @Override |
82 | - public int hashCode() { | |
83 | - final int prime = 31; | |
84 | - int result = super.hashCode(); | |
85 | - result = prime * result + ((credentialsId == null) ? 0 : credentialsId.hashCode()); | |
86 | - result = prime * result + ((credentialsType == null) ? 0 : credentialsType.hashCode()); | |
87 | - result = prime * result + ((credentialsValue == null) ? 0 : credentialsValue.hashCode()); | |
88 | - result = prime * result + ((deviceId == null) ? 0 : deviceId.hashCode()); | |
89 | - return result; | |
90 | - } | |
91 | - | |
92 | - @Override | |
93 | - public boolean equals(Object obj) { | |
94 | - if (this == obj) | |
95 | - return true; | |
96 | - if (!super.equals(obj)) | |
97 | - return false; | |
98 | - if (getClass() != obj.getClass()) | |
99 | - return false; | |
100 | - DeviceCredentials other = (DeviceCredentials) obj; | |
101 | - if (credentialsId == null) { | |
102 | - if (other.credentialsId != null) | |
103 | - return false; | |
104 | - } else if (!credentialsId.equals(other.credentialsId)) | |
105 | - return false; | |
106 | - if (credentialsType != other.credentialsType) | |
107 | - return false; | |
108 | - if (credentialsValue == null) { | |
109 | - if (other.credentialsValue != null) | |
110 | - return false; | |
111 | - } else if (!credentialsValue.equals(other.credentialsValue)) | |
112 | - return false; | |
113 | - if (deviceId == null) { | |
114 | - if (other.deviceId != null) | |
115 | - return false; | |
116 | - } else if (!deviceId.equals(other.deviceId)) | |
117 | - return false; | |
118 | - return true; | |
119 | - } | |
120 | - | |
121 | - @Override | |
122 | 84 | public String toString() { |
123 | 85 | return "DeviceCredentials [deviceId=" + deviceId + ", credentialsType=" + credentialsType + ", credentialsId=" |
124 | 86 | + credentialsId + ", credentialsValue=" + credentialsValue + ", createdTime=" + createdTime + ", id=" | ... | ... |
... | ... | @@ -15,10 +15,12 @@ |
15 | 15 | */ |
16 | 16 | package org.thingsboard.server.common.data.security; |
17 | 17 | |
18 | +import lombok.EqualsAndHashCode; | |
18 | 19 | import org.thingsboard.server.common.data.BaseData; |
19 | 20 | import org.thingsboard.server.common.data.id.UserCredentialsId; |
20 | 21 | import org.thingsboard.server.common.data.id.UserId; |
21 | 22 | |
23 | +@EqualsAndHashCode(callSuper = true) | |
22 | 24 | public class UserCredentials extends BaseData<UserCredentialsId> { |
23 | 25 | |
24 | 26 | private static final long serialVersionUID = -2108436378880529163L; |
... | ... | @@ -87,52 +89,6 @@ public class UserCredentials extends BaseData<UserCredentialsId> { |
87 | 89 | } |
88 | 90 | |
89 | 91 | @Override |
90 | - public int hashCode() { | |
91 | - final int prime = 31; | |
92 | - int result = super.hashCode(); | |
93 | - result = prime * result + ((activateToken == null) ? 0 : activateToken.hashCode()); | |
94 | - result = prime * result + (enabled ? 1231 : 1237); | |
95 | - result = prime * result + ((password == null) ? 0 : password.hashCode()); | |
96 | - result = prime * result + ((resetToken == null) ? 0 : resetToken.hashCode()); | |
97 | - result = prime * result + ((userId == null) ? 0 : userId.hashCode()); | |
98 | - return result; | |
99 | - } | |
100 | - | |
101 | - @Override | |
102 | - public boolean equals(Object obj) { | |
103 | - if (this == obj) | |
104 | - return true; | |
105 | - if (!super.equals(obj)) | |
106 | - return false; | |
107 | - if (getClass() != obj.getClass()) | |
108 | - return false; | |
109 | - UserCredentials other = (UserCredentials) obj; | |
110 | - if (activateToken == null) { | |
111 | - if (other.activateToken != null) | |
112 | - return false; | |
113 | - } else if (!activateToken.equals(other.activateToken)) | |
114 | - return false; | |
115 | - if (enabled != other.enabled) | |
116 | - return false; | |
117 | - if (password == null) { | |
118 | - if (other.password != null) | |
119 | - return false; | |
120 | - } else if (!password.equals(other.password)) | |
121 | - return false; | |
122 | - if (resetToken == null) { | |
123 | - if (other.resetToken != null) | |
124 | - return false; | |
125 | - } else if (!resetToken.equals(other.resetToken)) | |
126 | - return false; | |
127 | - if (userId == null) { | |
128 | - if (other.userId != null) | |
129 | - return false; | |
130 | - } else if (!userId.equals(other.userId)) | |
131 | - return false; | |
132 | - return true; | |
133 | - } | |
134 | - | |
135 | - @Override | |
136 | 92 | public String toString() { |
137 | 93 | StringBuilder builder = new StringBuilder(); |
138 | 94 | builder.append("UserCredentials [userId="); | ... | ... |
... | ... | @@ -16,10 +16,12 @@ |
16 | 16 | package org.thingsboard.server.common.data.widget; |
17 | 17 | |
18 | 18 | import com.fasterxml.jackson.databind.JsonNode; |
19 | +import lombok.EqualsAndHashCode; | |
19 | 20 | import org.thingsboard.server.common.data.BaseData; |
20 | 21 | import org.thingsboard.server.common.data.id.TenantId; |
21 | 22 | import org.thingsboard.server.common.data.id.WidgetTypeId; |
22 | 23 | |
24 | +@EqualsAndHashCode(callSuper = true) | |
23 | 25 | public class WidgetType extends BaseData<WidgetTypeId> { |
24 | 26 | |
25 | 27 | private static final long serialVersionUID = 8388684344603660756L; |
... | ... | @@ -28,7 +30,7 @@ public class WidgetType extends BaseData<WidgetTypeId> { |
28 | 30 | private String bundleAlias; |
29 | 31 | private String alias; |
30 | 32 | private String name; |
31 | - private JsonNode descriptor; | |
33 | + private transient JsonNode descriptor; | |
32 | 34 | |
33 | 35 | public WidgetType() { |
34 | 36 | super(); |
... | ... | @@ -88,33 +90,6 @@ public class WidgetType extends BaseData<WidgetTypeId> { |
88 | 90 | } |
89 | 91 | |
90 | 92 | @Override |
91 | - public int hashCode() { | |
92 | - int result = super.hashCode(); | |
93 | - result = 31 * result + (tenantId != null ? tenantId.hashCode() : 0); | |
94 | - result = 31 * result + (bundleAlias != null ? bundleAlias.hashCode() : 0); | |
95 | - result = 31 * result + (alias != null ? alias.hashCode() : 0); | |
96 | - result = 31 * result + (name != null ? name.hashCode() : 0); | |
97 | - result = 31 * result + (descriptor != null ? descriptor.hashCode() : 0); | |
98 | - return result; | |
99 | - } | |
100 | - | |
101 | - @Override | |
102 | - public boolean equals(Object o) { | |
103 | - if (this == o) return true; | |
104 | - if (o == null || getClass() != o.getClass()) return false; | |
105 | - if (!super.equals(o)) return false; | |
106 | - | |
107 | - WidgetType that = (WidgetType) o; | |
108 | - | |
109 | - if (tenantId != null ? !tenantId.equals(that.tenantId) : that.tenantId != null) return false; | |
110 | - if (bundleAlias != null ? !bundleAlias.equals(that.bundleAlias) : that.bundleAlias != null) return false; | |
111 | - if (alias != null ? !alias.equals(that.alias) : that.alias != null) return false; | |
112 | - if (name != null ? !name.equals(that.name) : that.name != null) return false; | |
113 | - return descriptor != null ? descriptor.equals(that.descriptor) : that.descriptor == null; | |
114 | - | |
115 | - } | |
116 | - | |
117 | - @Override | |
118 | 93 | public String toString() { |
119 | 94 | final StringBuilder sb = new StringBuilder("WidgetType{"); |
120 | 95 | sb.append("tenantId=").append(tenantId); | ... | ... |
... | ... | @@ -30,6 +30,7 @@ import org.thingsboard.server.common.msg.kv.AttributesKVMsg; |
30 | 30 | public class JsonConverter { |
31 | 31 | |
32 | 32 | private static final Gson GSON = new Gson(); |
33 | + public static final String CAN_T_PARSE_VALUE = "Can't parse value: "; | |
33 | 34 | |
34 | 35 | public static TelemetryUploadRequest convertToTelemetry(JsonElement jsonObject) throws JsonSyntaxException { |
35 | 36 | return convertToTelemetry(jsonObject, BasicRequest.DEFAULT_REQUEST_ID); |
... | ... | @@ -45,11 +46,11 @@ public class JsonConverter { |
45 | 46 | if (je.isJsonObject()) { |
46 | 47 | parseObject(request, systemTs, je.getAsJsonObject()); |
47 | 48 | } else { |
48 | - throw new JsonSyntaxException("Can't parse value: " + je); | |
49 | + throw new JsonSyntaxException(CAN_T_PARSE_VALUE + je); | |
49 | 50 | } |
50 | 51 | }); |
51 | 52 | } else { |
52 | - throw new JsonSyntaxException("Can't parse value: " + jsonObject); | |
53 | + throw new JsonSyntaxException(CAN_T_PARSE_VALUE + jsonObject); | |
53 | 54 | } |
54 | 55 | return request; |
55 | 56 | } |
... | ... | @@ -99,10 +100,10 @@ public class JsonConverter { |
99 | 100 | result.add(new LongDataEntry(valueEntry.getKey(), value.getAsLong())); |
100 | 101 | } |
101 | 102 | } else { |
102 | - throw new JsonSyntaxException("Can't parse value: " + value); | |
103 | + throw new JsonSyntaxException(CAN_T_PARSE_VALUE + value); | |
103 | 104 | } |
104 | 105 | } else { |
105 | - throw new JsonSyntaxException("Can't parse value: " + element); | |
106 | + throw new JsonSyntaxException(CAN_T_PARSE_VALUE + element); | |
106 | 107 | } |
107 | 108 | } |
108 | 109 | return result; |
... | ... | @@ -119,7 +120,7 @@ public class JsonConverter { |
119 | 120 | request.add(parseValues(element.getAsJsonObject()).stream().map(kv -> new BaseAttributeKvEntry(kv, ts)).collect(Collectors.toList())); |
120 | 121 | return request; |
121 | 122 | } else { |
122 | - throw new JsonSyntaxException("Can't parse value: " + element); | |
123 | + throw new JsonSyntaxException(CAN_T_PARSE_VALUE + element); | |
123 | 124 | } |
124 | 125 | } |
125 | 126 | ... | ... |
... | ... | @@ -37,7 +37,6 @@ import org.thingsboard.server.dao.entity.EntityService; |
37 | 37 | import org.thingsboard.server.dao.exception.DataValidationException; |
38 | 38 | import org.thingsboard.server.common.data.relation.EntityRelationsQuery; |
39 | 39 | import org.thingsboard.server.common.data.relation.EntitySearchDirection; |
40 | -import org.thingsboard.server.dao.relation.RelationService; | |
41 | 40 | import org.thingsboard.server.common.data.relation.RelationsSearchParameters; |
42 | 41 | import org.thingsboard.server.dao.service.DataValidator; |
43 | 42 | import org.thingsboard.server.dao.tenant.TenantDao; |
... | ... | @@ -68,9 +67,6 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ |
68 | 67 | private TenantDao tenantDao; |
69 | 68 | |
70 | 69 | @Autowired |
71 | - private RelationService relationService; | |
72 | - | |
73 | - @Autowired | |
74 | 70 | private EntityService entityService; |
75 | 71 | |
76 | 72 | protected ExecutorService readResultsProcessingExecutor; |
... | ... | @@ -272,7 +268,7 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ |
272 | 268 | boolean hasNext = true; |
273 | 269 | AlarmSeverity highestSeverity = null; |
274 | 270 | AlarmQuery query; |
275 | - while (hasNext) { | |
271 | + while (hasNext && AlarmSeverity.CRITICAL != highestSeverity) { | |
276 | 272 | query = new AlarmQuery(entityId, nextPageLink, alarmSearchStatus, alarmStatus, false); |
277 | 273 | List<AlarmInfo> alarms; |
278 | 274 | try { |
... | ... | @@ -286,33 +282,37 @@ public class BaseAlarmService extends AbstractEntityService implements AlarmServ |
286 | 282 | if (hasNext) { |
287 | 283 | nextPageLink = new TimePageData<>(alarms, nextPageLink).getNextPageLink(); |
288 | 284 | } |
289 | - if (alarms.isEmpty()) { | |
285 | + AlarmSeverity severity = detectHighestSeverity(alarms); | |
286 | + if (severity == null) { | |
290 | 287 | continue; |
288 | + } | |
289 | + if (severity == AlarmSeverity.CRITICAL || highestSeverity == null) { | |
290 | + highestSeverity = severity; | |
291 | 291 | } else { |
292 | - List<AlarmInfo> sorted = new ArrayList(alarms); | |
293 | - sorted.sort((p1, p2) -> p1.getSeverity().compareTo(p2.getSeverity())); | |
294 | - AlarmSeverity severity = sorted.get(0).getSeverity(); | |
295 | - if (severity == AlarmSeverity.CRITICAL) { | |
296 | - highestSeverity = severity; | |
297 | - break; | |
298 | - } else if (highestSeverity == null) { | |
299 | - highestSeverity = severity; | |
300 | - } else { | |
301 | - highestSeverity = highestSeverity.compareTo(severity) < 0 ? highestSeverity : severity; | |
302 | - } | |
292 | + highestSeverity = highestSeverity.compareTo(severity) < 0 ? highestSeverity : severity; | |
303 | 293 | } |
304 | 294 | } |
305 | 295 | return highestSeverity; |
306 | 296 | } |
307 | 297 | |
298 | + private AlarmSeverity detectHighestSeverity(List<AlarmInfo> alarms) { | |
299 | + if (!alarms.isEmpty()) { | |
300 | + List<AlarmInfo> sorted = new ArrayList(alarms); | |
301 | + sorted.sort((p1, p2) -> p1.getSeverity().compareTo(p2.getSeverity())); | |
302 | + return sorted.get(0).getSeverity(); | |
303 | + } else { | |
304 | + return null; | |
305 | + } | |
306 | + } | |
307 | + | |
308 | 308 | private void deleteRelation(EntityRelation alarmRelation) throws ExecutionException, InterruptedException { |
309 | 309 | log.debug("Deleting Alarm relation: {}", alarmRelation); |
310 | - relationService.deleteRelation(alarmRelation).get(); | |
310 | + relationService.deleteRelationAsync(alarmRelation).get(); | |
311 | 311 | } |
312 | 312 | |
313 | 313 | private void createRelation(EntityRelation alarmRelation) throws ExecutionException, InterruptedException { |
314 | 314 | log.debug("Creating Alarm relation: {}", alarmRelation); |
315 | - relationService.saveRelation(alarmRelation).get(); | |
315 | + relationService.saveRelationAsync(alarmRelation).get(); | |
316 | 316 | } |
317 | 317 | |
318 | 318 | private Alarm merge(Alarm existing, Alarm alarm) { | ... | ... |
... | ... | @@ -37,19 +37,15 @@ import org.thingsboard.server.common.data.id.TenantId; |
37 | 37 | import org.thingsboard.server.common.data.page.TextPageData; |
38 | 38 | import org.thingsboard.server.common.data.page.TextPageLink; |
39 | 39 | import org.thingsboard.server.common.data.relation.EntityRelation; |
40 | +import org.thingsboard.server.common.data.relation.EntitySearchDirection; | |
40 | 41 | import org.thingsboard.server.dao.customer.CustomerDao; |
41 | 42 | import org.thingsboard.server.dao.entity.AbstractEntityService; |
42 | 43 | import org.thingsboard.server.dao.exception.DataValidationException; |
43 | -import org.thingsboard.server.common.data.relation.EntitySearchDirection; | |
44 | 44 | import org.thingsboard.server.dao.service.DataValidator; |
45 | 45 | import org.thingsboard.server.dao.service.PaginatedRemover; |
46 | 46 | import org.thingsboard.server.dao.tenant.TenantDao; |
47 | 47 | |
48 | -import javax.annotation.Nullable; | |
49 | -import java.util.ArrayList; | |
50 | -import java.util.Comparator; | |
51 | -import java.util.List; | |
52 | -import java.util.Optional; | |
48 | +import java.util.*; | |
53 | 49 | import java.util.stream.Collectors; |
54 | 50 | |
55 | 51 | import static org.thingsboard.server.dao.DaoUtil.toUUIDs; |
... | ... | @@ -60,6 +56,10 @@ import static org.thingsboard.server.dao.service.Validator.*; |
60 | 56 | @Slf4j |
61 | 57 | public class BaseAssetService extends AbstractEntityService implements AssetService { |
62 | 58 | |
59 | + public static final String INCORRECT_TENANT_ID = "Incorrect tenantId "; | |
60 | + public static final String INCORRECT_PAGE_LINK = "Incorrect page link "; | |
61 | + public static final String INCORRECT_CUSTOMER_ID = "Incorrect customerId "; | |
62 | + public static final String INCORRECT_ASSET_ID = "Incorrect assetId "; | |
63 | 63 | @Autowired |
64 | 64 | private AssetDao assetDao; |
65 | 65 | |
... | ... | @@ -72,21 +72,21 @@ public class BaseAssetService extends AbstractEntityService implements AssetServ |
72 | 72 | @Override |
73 | 73 | public Asset findAssetById(AssetId assetId) { |
74 | 74 | log.trace("Executing findAssetById [{}]", assetId); |
75 | - validateId(assetId, "Incorrect assetId " + assetId); | |
75 | + validateId(assetId, INCORRECT_ASSET_ID + assetId); | |
76 | 76 | return assetDao.findById(assetId.getId()); |
77 | 77 | } |
78 | 78 | |
79 | 79 | @Override |
80 | 80 | public ListenableFuture<Asset> findAssetByIdAsync(AssetId assetId) { |
81 | 81 | log.trace("Executing findAssetById [{}]", assetId); |
82 | - validateId(assetId, "Incorrect assetId " + assetId); | |
82 | + validateId(assetId, INCORRECT_ASSET_ID + assetId); | |
83 | 83 | return assetDao.findByIdAsync(assetId.getId()); |
84 | 84 | } |
85 | 85 | |
86 | 86 | @Override |
87 | 87 | public Optional<Asset> findAssetByTenantIdAndName(TenantId tenantId, String name) { |
88 | 88 | log.trace("Executing findAssetByTenantIdAndName [{}][{}]", tenantId, name); |
89 | - validateId(tenantId, "Incorrect tenantId " + tenantId); | |
89 | + validateId(tenantId, INCORRECT_TENANT_ID + tenantId); | |
90 | 90 | return assetDao.findAssetsByTenantIdAndName(tenantId.getId(), name); |
91 | 91 | } |
92 | 92 | |
... | ... | @@ -114,7 +114,7 @@ public class BaseAssetService extends AbstractEntityService implements AssetServ |
114 | 114 | @Override |
115 | 115 | public void deleteAsset(AssetId assetId) { |
116 | 116 | log.trace("Executing deleteAsset [{}]", assetId); |
117 | - validateId(assetId, "Incorrect assetId " + assetId); | |
117 | + validateId(assetId, INCORRECT_ASSET_ID + assetId); | |
118 | 118 | deleteEntityRelations(assetId); |
119 | 119 | assetDao.removeById(assetId.getId()); |
120 | 120 | } |
... | ... | @@ -122,8 +122,8 @@ public class BaseAssetService extends AbstractEntityService implements AssetServ |
122 | 122 | @Override |
123 | 123 | public TextPageData<Asset> findAssetsByTenantId(TenantId tenantId, TextPageLink pageLink) { |
124 | 124 | log.trace("Executing findAssetsByTenantId, tenantId [{}], pageLink [{}]", tenantId, pageLink); |
125 | - validateId(tenantId, "Incorrect tenantId " + tenantId); | |
126 | - validatePageLink(pageLink, "Incorrect page link " + pageLink); | |
125 | + validateId(tenantId, INCORRECT_TENANT_ID + tenantId); | |
126 | + validatePageLink(pageLink, INCORRECT_PAGE_LINK + pageLink); | |
127 | 127 | List<Asset> assets = assetDao.findAssetsByTenantId(tenantId.getId(), pageLink); |
128 | 128 | return new TextPageData<>(assets, pageLink); |
129 | 129 | } |
... | ... | @@ -131,9 +131,9 @@ public class BaseAssetService extends AbstractEntityService implements AssetServ |
131 | 131 | @Override |
132 | 132 | public TextPageData<Asset> findAssetsByTenantIdAndType(TenantId tenantId, String type, TextPageLink pageLink) { |
133 | 133 | log.trace("Executing findAssetsByTenantIdAndType, tenantId [{}], type [{}], pageLink [{}]", tenantId, type, pageLink); |
134 | - validateId(tenantId, "Incorrect tenantId " + tenantId); | |
134 | + validateId(tenantId, INCORRECT_TENANT_ID + tenantId); | |
135 | 135 | validateString(type, "Incorrect type " + type); |
136 | - validatePageLink(pageLink, "Incorrect page link " + pageLink); | |
136 | + validatePageLink(pageLink, INCORRECT_PAGE_LINK + pageLink); | |
137 | 137 | List<Asset> assets = assetDao.findAssetsByTenantIdAndType(tenantId.getId(), type, pageLink); |
138 | 138 | return new TextPageData<>(assets, pageLink); |
139 | 139 | } |
... | ... | @@ -141,7 +141,7 @@ public class BaseAssetService extends AbstractEntityService implements AssetServ |
141 | 141 | @Override |
142 | 142 | public ListenableFuture<List<Asset>> findAssetsByTenantIdAndIdsAsync(TenantId tenantId, List<AssetId> assetIds) { |
143 | 143 | log.trace("Executing findAssetsByTenantIdAndIdsAsync, tenantId [{}], assetIds [{}]", tenantId, assetIds); |
144 | - validateId(tenantId, "Incorrect tenantId " + tenantId); | |
144 | + validateId(tenantId, INCORRECT_TENANT_ID + tenantId); | |
145 | 145 | validateIds(assetIds, "Incorrect assetIds " + assetIds); |
146 | 146 | return assetDao.findAssetsByTenantIdAndIdsAsync(tenantId.getId(), toUUIDs(assetIds)); |
147 | 147 | } |
... | ... | @@ -149,27 +149,27 @@ public class BaseAssetService extends AbstractEntityService implements AssetServ |
149 | 149 | @Override |
150 | 150 | public void deleteAssetsByTenantId(TenantId tenantId) { |
151 | 151 | log.trace("Executing deleteAssetsByTenantId, tenantId [{}]", tenantId); |
152 | - validateId(tenantId, "Incorrect tenantId " + tenantId); | |
152 | + validateId(tenantId, INCORRECT_TENANT_ID + tenantId); | |
153 | 153 | tenantAssetsRemover.removeEntities(tenantId); |
154 | 154 | } |
155 | 155 | |
156 | 156 | @Override |
157 | 157 | public TextPageData<Asset> findAssetsByTenantIdAndCustomerId(TenantId tenantId, CustomerId customerId, TextPageLink pageLink) { |
158 | 158 | log.trace("Executing findAssetsByTenantIdAndCustomerId, tenantId [{}], customerId [{}], pageLink [{}]", tenantId, customerId, pageLink); |
159 | - validateId(tenantId, "Incorrect tenantId " + tenantId); | |
160 | - validateId(customerId, "Incorrect customerId " + customerId); | |
161 | - validatePageLink(pageLink, "Incorrect page link " + pageLink); | |
159 | + validateId(tenantId, INCORRECT_TENANT_ID + tenantId); | |
160 | + validateId(customerId, INCORRECT_CUSTOMER_ID + customerId); | |
161 | + validatePageLink(pageLink, INCORRECT_PAGE_LINK + pageLink); | |
162 | 162 | List<Asset> assets = assetDao.findAssetsByTenantIdAndCustomerId(tenantId.getId(), customerId.getId(), pageLink); |
163 | - return new TextPageData<Asset>(assets, pageLink); | |
163 | + return new TextPageData<>(assets, pageLink); | |
164 | 164 | } |
165 | 165 | |
166 | 166 | @Override |
167 | 167 | public TextPageData<Asset> findAssetsByTenantIdAndCustomerIdAndType(TenantId tenantId, CustomerId customerId, String type, TextPageLink pageLink) { |
168 | 168 | log.trace("Executing findAssetsByTenantIdAndCustomerIdAndType, tenantId [{}], customerId [{}], type [{}], pageLink [{}]", tenantId, customerId, type, pageLink); |
169 | - validateId(tenantId, "Incorrect tenantId " + tenantId); | |
170 | - validateId(customerId, "Incorrect customerId " + customerId); | |
169 | + validateId(tenantId, INCORRECT_TENANT_ID + tenantId); | |
170 | + validateId(customerId, INCORRECT_CUSTOMER_ID + customerId); | |
171 | 171 | validateString(type, "Incorrect type " + type); |
172 | - validatePageLink(pageLink, "Incorrect page link " + pageLink); | |
172 | + validatePageLink(pageLink, INCORRECT_PAGE_LINK + pageLink); | |
173 | 173 | List<Asset> assets = assetDao.findAssetsByTenantIdAndCustomerIdAndType(tenantId.getId(), customerId.getId(), type, pageLink); |
174 | 174 | return new TextPageData<>(assets, pageLink); |
175 | 175 | } |
... | ... | @@ -177,8 +177,8 @@ public class BaseAssetService extends AbstractEntityService implements AssetServ |
177 | 177 | @Override |
178 | 178 | public ListenableFuture<List<Asset>> findAssetsByTenantIdCustomerIdAndIdsAsync(TenantId tenantId, CustomerId customerId, List<AssetId> assetIds) { |
179 | 179 | log.trace("Executing findAssetsByTenantIdAndCustomerIdAndIdsAsync, tenantId [{}], customerId [{}], assetIds [{}]", tenantId, customerId, assetIds); |
180 | - validateId(tenantId, "Incorrect tenantId " + tenantId); | |
181 | - validateId(customerId, "Incorrect customerId " + customerId); | |
180 | + validateId(tenantId, INCORRECT_TENANT_ID + tenantId); | |
181 | + validateId(customerId, INCORRECT_CUSTOMER_ID + customerId); | |
182 | 182 | validateIds(assetIds, "Incorrect assetIds " + assetIds); |
183 | 183 | return assetDao.findAssetsByTenantIdAndCustomerIdAndIdsAsync(tenantId.getId(), customerId.getId(), toUUIDs(assetIds)); |
184 | 184 | } |
... | ... | @@ -186,8 +186,8 @@ public class BaseAssetService extends AbstractEntityService implements AssetServ |
186 | 186 | @Override |
187 | 187 | public void unassignCustomerAssets(TenantId tenantId, CustomerId customerId) { |
188 | 188 | log.trace("Executing unassignCustomerAssets, tenantId [{}], customerId [{}]", tenantId, customerId); |
189 | - validateId(tenantId, "Incorrect tenantId " + tenantId); | |
190 | - validateId(customerId, "Incorrect customerId " + customerId); | |
189 | + validateId(tenantId, INCORRECT_TENANT_ID + tenantId); | |
190 | + validateId(customerId, INCORRECT_CUSTOMER_ID + customerId); | |
191 | 191 | new CustomerAssetsUnassigner(tenantId).removeEntities(customerId); |
192 | 192 | } |
193 | 193 | |
... | ... | @@ -205,22 +205,16 @@ public class BaseAssetService extends AbstractEntityService implements AssetServ |
205 | 205 | } |
206 | 206 | return Futures.successfulAsList(futures); |
207 | 207 | }); |
208 | - | |
209 | - assets = Futures.transform(assets, new Function<List<Asset>, List<Asset>>() { | |
210 | - @Nullable | |
211 | - @Override | |
212 | - public List<Asset> apply(@Nullable List<Asset> assetList) { | |
213 | - return assetList.stream().filter(asset -> query.getAssetTypes().contains(asset.getType())).collect(Collectors.toList()); | |
214 | - } | |
215 | - }); | |
216 | - | |
208 | + assets = Futures.transform(assets, (Function<List<Asset>, List<Asset>>)assetList -> | |
209 | + assetList == null ? Collections.emptyList() : assetList.stream().filter(asset -> query.getAssetTypes().contains(asset.getType())).collect(Collectors.toList()) | |
210 | + ); | |
217 | 211 | return assets; |
218 | 212 | } |
219 | 213 | |
220 | 214 | @Override |
221 | 215 | public ListenableFuture<List<EntitySubtype>> findAssetTypesByTenantId(TenantId tenantId) { |
222 | 216 | log.trace("Executing findAssetTypesByTenantId, tenantId [{}]", tenantId); |
223 | - validateId(tenantId, "Incorrect tenantId " + tenantId); | |
217 | + validateId(tenantId, INCORRECT_TENANT_ID + tenantId); | |
224 | 218 | ListenableFuture<List<EntitySubtype>> tenantAssetTypes = assetDao.findTenantAssetTypesAsync(tenantId.getId()); |
225 | 219 | return Futures.transform(tenantAssetTypes, |
226 | 220 | (Function<List<EntitySubtype>, List<EntitySubtype>>) assetTypes -> { | ... | ... |
... | ... | @@ -109,18 +109,21 @@ public class CassandraBaseAttributesDao extends CassandraAbstractAsyncDao implem |
109 | 109 | stmt.setString(3, attribute.getKey()); |
110 | 110 | stmt.setLong(4, attribute.getLastUpdateTs()); |
111 | 111 | stmt.setString(5, attribute.getStrValue().orElse(null)); |
112 | - if (attribute.getBooleanValue().isPresent()) { | |
113 | - stmt.setBool(6, attribute.getBooleanValue().get()); | |
112 | + Optional<Boolean> booleanValue = attribute.getBooleanValue(); | |
113 | + if (booleanValue.isPresent()) { | |
114 | + stmt.setBool(6, booleanValue.get()); | |
114 | 115 | } else { |
115 | 116 | stmt.setToNull(6); |
116 | 117 | } |
117 | - if (attribute.getLongValue().isPresent()) { | |
118 | - stmt.setLong(7, attribute.getLongValue().get()); | |
118 | + Optional<Long> longValue = attribute.getLongValue(); | |
119 | + if (longValue.isPresent()) { | |
120 | + stmt.setLong(7, longValue.get()); | |
119 | 121 | } else { |
120 | 122 | stmt.setToNull(7); |
121 | 123 | } |
122 | - if (attribute.getDoubleValue().isPresent()) { | |
123 | - stmt.setDouble(8, attribute.getDoubleValue().get()); | |
124 | + Optional<Double> doubleValue = attribute.getDoubleValue(); | |
125 | + if (doubleValue.isPresent()) { | |
126 | + stmt.setDouble(8, doubleValue.get()); | |
124 | 127 | } else { |
125 | 128 | stmt.setToNull(8); |
126 | 129 | } | ... | ... |
... | ... | @@ -49,6 +49,8 @@ import static com.datastax.driver.core.querybuilder.QueryBuilder.select; |
49 | 49 | @NoSqlDao |
50 | 50 | public class CassandraBaseComponentDescriptorDao extends CassandraAbstractSearchTextDao<ComponentDescriptorEntity, ComponentDescriptor> implements ComponentDescriptorDao { |
51 | 51 | |
52 | + public static final String SEARCH_RESULT = "Search result: [{}]"; | |
53 | + | |
52 | 54 | @Override |
53 | 55 | protected Class<ComponentDescriptorEntity> getColumnFamilyClass() { |
54 | 56 | return ComponentDescriptorEntity.class; |
... | ... | @@ -79,7 +81,7 @@ public class CassandraBaseComponentDescriptorDao extends CassandraAbstractSearch |
79 | 81 | if (log.isTraceEnabled()) { |
80 | 82 | log.trace("Search result: [{}] for component entity [{}]", componentDescriptor != null, componentDescriptor); |
81 | 83 | } else { |
82 | - log.debug("Search result: [{}]", componentDescriptor != null); | |
84 | + log.debug(SEARCH_RESULT, componentDescriptor != null); | |
83 | 85 | } |
84 | 86 | return componentDescriptor; |
85 | 87 | } |
... | ... | @@ -93,7 +95,7 @@ public class CassandraBaseComponentDescriptorDao extends CassandraAbstractSearch |
93 | 95 | if (log.isTraceEnabled()) { |
94 | 96 | log.trace("Search result: [{}] for component entity [{}]", entity != null, entity); |
95 | 97 | } else { |
96 | - log.debug("Search result: [{}]", entity != null); | |
98 | + log.debug(SEARCH_RESULT, entity != null); | |
97 | 99 | } |
98 | 100 | return DaoUtil.getData(entity); |
99 | 101 | } |
... | ... | @@ -104,9 +106,9 @@ public class CassandraBaseComponentDescriptorDao extends CassandraAbstractSearch |
104 | 106 | List<ComponentDescriptorEntity> entities = findPageWithTextSearch(ModelConstants.COMPONENT_DESCRIPTOR_BY_TYPE_AND_SEARCH_TEXT_COLUMN_FAMILY_NAME, |
105 | 107 | Arrays.asList(eq(ModelConstants.COMPONENT_DESCRIPTOR_TYPE_PROPERTY, type)), pageLink); |
106 | 108 | if (log.isTraceEnabled()) { |
107 | - log.trace("Search result: [{}]", Arrays.toString(entities.toArray())); | |
109 | + log.trace(SEARCH_RESULT, Arrays.toString(entities.toArray())); | |
108 | 110 | } else { |
109 | - log.debug("Search result: [{}]", entities.size()); | |
111 | + log.debug(SEARCH_RESULT, entities.size()); | |
110 | 112 | } |
111 | 113 | return DaoUtil.convertDataList(entities); |
112 | 114 | } |
... | ... | @@ -118,9 +120,9 @@ public class CassandraBaseComponentDescriptorDao extends CassandraAbstractSearch |
118 | 120 | Arrays.asList(eq(ModelConstants.COMPONENT_DESCRIPTOR_TYPE_PROPERTY, type), |
119 | 121 | eq(ModelConstants.COMPONENT_DESCRIPTOR_SCOPE_PROPERTY, scope.name())), pageLink); |
120 | 122 | if (log.isTraceEnabled()) { |
121 | - log.trace("Search result: [{}]", Arrays.toString(entities.toArray())); | |
123 | + log.trace(SEARCH_RESULT, Arrays.toString(entities.toArray())); | |
122 | 124 | } else { |
123 | - log.debug("Search result: [{}]", entities.size()); | |
125 | + log.debug(SEARCH_RESULT, entities.size()); | |
124 | 126 | } |
125 | 127 | return DaoUtil.convertDataList(entities); |
126 | 128 | } | ... | ... |
... | ... | @@ -51,6 +51,7 @@ import static org.thingsboard.server.dao.service.Validator.validateId; |
51 | 51 | public class CustomerServiceImpl extends AbstractEntityService implements CustomerService { |
52 | 52 | |
53 | 53 | private static final String PUBLIC_CUSTOMER_TITLE = "Public"; |
54 | + public static final String INCORRECT_CUSTOMER_ID = "Incorrect customerId "; | |
54 | 55 | |
55 | 56 | @Autowired |
56 | 57 | private CustomerDao customerDao; |
... | ... | @@ -73,14 +74,14 @@ public class CustomerServiceImpl extends AbstractEntityService implements Custom |
73 | 74 | @Override |
74 | 75 | public Customer findCustomerById(CustomerId customerId) { |
75 | 76 | log.trace("Executing findCustomerById [{}]", customerId); |
76 | - Validator.validateId(customerId, "Incorrect customerId " + customerId); | |
77 | + Validator.validateId(customerId, INCORRECT_CUSTOMER_ID + customerId); | |
77 | 78 | return customerDao.findById(customerId.getId()); |
78 | 79 | } |
79 | 80 | |
80 | 81 | @Override |
81 | 82 | public ListenableFuture<Customer> findCustomerByIdAsync(CustomerId customerId) { |
82 | 83 | log.trace("Executing findCustomerByIdAsync [{}]", customerId); |
83 | - validateId(customerId, "Incorrect customerId " + customerId); | |
84 | + validateId(customerId, INCORRECT_CUSTOMER_ID + customerId); | |
84 | 85 | return customerDao.findByIdAsync(customerId.getId()); |
85 | 86 | } |
86 | 87 | |
... | ... | @@ -94,7 +95,7 @@ public class CustomerServiceImpl extends AbstractEntityService implements Custom |
94 | 95 | @Override |
95 | 96 | public void deleteCustomer(CustomerId customerId) { |
96 | 97 | log.trace("Executing deleteCustomer [{}]", customerId); |
97 | - Validator.validateId(customerId, "Incorrect customerId " + customerId); | |
98 | + Validator.validateId(customerId, INCORRECT_CUSTOMER_ID + customerId); | |
98 | 99 | Customer customer = findCustomerById(customerId); |
99 | 100 | if (customer == null) { |
100 | 101 | throw new IncorrectParameterException("Unable to delete non-existent customer."); |
... | ... | @@ -110,7 +111,7 @@ public class CustomerServiceImpl extends AbstractEntityService implements Custom |
110 | 111 | @Override |
111 | 112 | public Customer findOrCreatePublicCustomer(TenantId tenantId) { |
112 | 113 | log.trace("Executing findOrCreatePublicCustomer, tenantId [{}]", tenantId); |
113 | - Validator.validateId(tenantId, "Incorrect customerId " + tenantId); | |
114 | + Validator.validateId(tenantId, INCORRECT_CUSTOMER_ID + tenantId); | |
114 | 115 | Optional<Customer> publicCustomerOpt = customerDao.findCustomersByTenantIdAndTitle(tenantId.getId(), PUBLIC_CUSTOMER_TITLE); |
115 | 116 | if (publicCustomerOpt.isPresent()) { |
116 | 117 | return publicCustomerOpt.get(); | ... | ... |
... | ... | @@ -46,6 +46,8 @@ import static org.thingsboard.server.dao.service.Validator.validateId; |
46 | 46 | @Slf4j |
47 | 47 | public class DashboardServiceImpl extends AbstractEntityService implements DashboardService { |
48 | 48 | |
49 | + public static final String INCORRECT_DASHBOARD_ID = "Incorrect dashboardId "; | |
50 | + public static final String INCORRECT_TENANT_ID = "Incorrect tenantId "; | |
49 | 51 | @Autowired |
50 | 52 | private DashboardDao dashboardDao; |
51 | 53 | |
... | ... | @@ -61,28 +63,28 @@ public class DashboardServiceImpl extends AbstractEntityService implements Dashb |
61 | 63 | @Override |
62 | 64 | public Dashboard findDashboardById(DashboardId dashboardId) { |
63 | 65 | log.trace("Executing findDashboardById [{}]", dashboardId); |
64 | - Validator.validateId(dashboardId, "Incorrect dashboardId " + dashboardId); | |
66 | + Validator.validateId(dashboardId, INCORRECT_DASHBOARD_ID + dashboardId); | |
65 | 67 | return dashboardDao.findById(dashboardId.getId()); |
66 | 68 | } |
67 | 69 | |
68 | 70 | @Override |
69 | 71 | public ListenableFuture<Dashboard> findDashboardByIdAsync(DashboardId dashboardId) { |
70 | 72 | log.trace("Executing findDashboardByIdAsync [{}]", dashboardId); |
71 | - validateId(dashboardId, "Incorrect dashboardId " + dashboardId); | |
73 | + validateId(dashboardId, INCORRECT_DASHBOARD_ID + dashboardId); | |
72 | 74 | return dashboardDao.findByIdAsync(dashboardId.getId()); |
73 | 75 | } |
74 | 76 | |
75 | 77 | @Override |
76 | 78 | public DashboardInfo findDashboardInfoById(DashboardId dashboardId) { |
77 | 79 | log.trace("Executing findDashboardInfoById [{}]", dashboardId); |
78 | - Validator.validateId(dashboardId, "Incorrect dashboardId " + dashboardId); | |
80 | + Validator.validateId(dashboardId, INCORRECT_DASHBOARD_ID + dashboardId); | |
79 | 81 | return dashboardInfoDao.findById(dashboardId.getId()); |
80 | 82 | } |
81 | 83 | |
82 | 84 | @Override |
83 | 85 | public ListenableFuture<DashboardInfo> findDashboardInfoByIdAsync(DashboardId dashboardId) { |
84 | 86 | log.trace("Executing findDashboardInfoByIdAsync [{}]", dashboardId); |
85 | - validateId(dashboardId, "Incorrect dashboardId " + dashboardId); | |
87 | + validateId(dashboardId, INCORRECT_DASHBOARD_ID + dashboardId); | |
86 | 88 | return dashboardInfoDao.findByIdAsync(dashboardId.getId()); |
87 | 89 | } |
88 | 90 | |
... | ... | @@ -110,7 +112,7 @@ public class DashboardServiceImpl extends AbstractEntityService implements Dashb |
110 | 112 | @Override |
111 | 113 | public void deleteDashboard(DashboardId dashboardId) { |
112 | 114 | log.trace("Executing deleteDashboard [{}]", dashboardId); |
113 | - Validator.validateId(dashboardId, "Incorrect dashboardId " + dashboardId); | |
115 | + Validator.validateId(dashboardId, INCORRECT_DASHBOARD_ID + dashboardId); | |
114 | 116 | deleteEntityRelations(dashboardId); |
115 | 117 | dashboardDao.removeById(dashboardId.getId()); |
116 | 118 | } |
... | ... | @@ -118,7 +120,7 @@ public class DashboardServiceImpl extends AbstractEntityService implements Dashb |
118 | 120 | @Override |
119 | 121 | public TextPageData<DashboardInfo> findDashboardsByTenantId(TenantId tenantId, TextPageLink pageLink) { |
120 | 122 | log.trace("Executing findDashboardsByTenantId, tenantId [{}], pageLink [{}]", tenantId, pageLink); |
121 | - Validator.validateId(tenantId, "Incorrect tenantId " + tenantId); | |
123 | + Validator.validateId(tenantId, INCORRECT_TENANT_ID + tenantId); | |
122 | 124 | Validator.validatePageLink(pageLink, "Incorrect page link " + pageLink); |
123 | 125 | List<DashboardInfo> dashboards = dashboardInfoDao.findDashboardsByTenantId(tenantId.getId(), pageLink); |
124 | 126 | return new TextPageData<>(dashboards, pageLink); |
... | ... | @@ -127,14 +129,14 @@ public class DashboardServiceImpl extends AbstractEntityService implements Dashb |
127 | 129 | @Override |
128 | 130 | public void deleteDashboardsByTenantId(TenantId tenantId) { |
129 | 131 | log.trace("Executing deleteDashboardsByTenantId, tenantId [{}]", tenantId); |
130 | - Validator.validateId(tenantId, "Incorrect tenantId " + tenantId); | |
132 | + Validator.validateId(tenantId, INCORRECT_TENANT_ID + tenantId); | |
131 | 133 | tenantDashboardsRemover.removeEntities(tenantId); |
132 | 134 | } |
133 | 135 | |
134 | 136 | @Override |
135 | 137 | public TextPageData<DashboardInfo> findDashboardsByTenantIdAndCustomerId(TenantId tenantId, CustomerId customerId, TextPageLink pageLink) { |
136 | 138 | log.trace("Executing findDashboardsByTenantIdAndCustomerId, tenantId [{}], customerId [{}], pageLink [{}]", tenantId, customerId, pageLink); |
137 | - Validator.validateId(tenantId, "Incorrect tenantId " + tenantId); | |
139 | + Validator.validateId(tenantId, INCORRECT_TENANT_ID + tenantId); | |
138 | 140 | Validator.validateId(customerId, "Incorrect customerId " + customerId); |
139 | 141 | Validator.validatePageLink(pageLink, "Incorrect page link " + pageLink); |
140 | 142 | List<DashboardInfo> dashboards = dashboardInfoDao.findDashboardsByTenantIdAndCustomerId(tenantId.getId(), customerId.getId(), pageLink); |
... | ... | @@ -144,7 +146,7 @@ public class DashboardServiceImpl extends AbstractEntityService implements Dashb |
144 | 146 | @Override |
145 | 147 | public void unassignCustomerDashboards(TenantId tenantId, CustomerId customerId) { |
146 | 148 | log.trace("Executing unassignCustomerDashboards, tenantId [{}], customerId [{}]", tenantId, customerId); |
147 | - Validator.validateId(tenantId, "Incorrect tenantId " + tenantId); | |
149 | + Validator.validateId(tenantId, INCORRECT_TENANT_ID + tenantId); | |
148 | 150 | Validator.validateId(customerId, "Incorrect customerId " + customerId); |
149 | 151 | new CustomerDashboardsUnassigner(tenantId).removeEntities(customerId); |
150 | 152 | } | ... | ... |
... | ... | @@ -44,10 +44,7 @@ import org.thingsboard.server.dao.service.PaginatedRemover; |
44 | 44 | import org.thingsboard.server.dao.tenant.TenantDao; |
45 | 45 | |
46 | 46 | import javax.annotation.Nullable; |
47 | -import java.util.ArrayList; | |
48 | -import java.util.Comparator; | |
49 | -import java.util.List; | |
50 | -import java.util.Optional; | |
47 | +import java.util.*; | |
51 | 48 | import java.util.stream.Collectors; |
52 | 49 | |
53 | 50 | import static org.thingsboard.server.dao.DaoUtil.toUUIDs; |
... | ... | @@ -58,6 +55,10 @@ import static org.thingsboard.server.dao.service.Validator.*; |
58 | 55 | @Slf4j |
59 | 56 | public class DeviceServiceImpl extends AbstractEntityService implements DeviceService { |
60 | 57 | |
58 | + public static final String INCORRECT_TENANT_ID = "Incorrect tenantId "; | |
59 | + public static final String INCORRECT_PAGE_LINK = "Incorrect page link "; | |
60 | + public static final String INCORRECT_CUSTOMER_ID = "Incorrect customerId "; | |
61 | + public static final String INCORRECT_DEVICE_ID = "Incorrect deviceId "; | |
61 | 62 | @Autowired |
62 | 63 | private DeviceDao deviceDao; |
63 | 64 | |
... | ... | @@ -73,21 +74,21 @@ public class DeviceServiceImpl extends AbstractEntityService implements DeviceSe |
73 | 74 | @Override |
74 | 75 | public Device findDeviceById(DeviceId deviceId) { |
75 | 76 | log.trace("Executing findDeviceById [{}]", deviceId); |
76 | - validateId(deviceId, "Incorrect deviceId " + deviceId); | |
77 | + validateId(deviceId, INCORRECT_DEVICE_ID + deviceId); | |
77 | 78 | return deviceDao.findById(deviceId.getId()); |
78 | 79 | } |
79 | 80 | |
80 | 81 | @Override |
81 | 82 | public ListenableFuture<Device> findDeviceByIdAsync(DeviceId deviceId) { |
82 | 83 | log.trace("Executing findDeviceById [{}]", deviceId); |
83 | - validateId(deviceId, "Incorrect deviceId " + deviceId); | |
84 | + validateId(deviceId, INCORRECT_DEVICE_ID + deviceId); | |
84 | 85 | return deviceDao.findByIdAsync(deviceId.getId()); |
85 | 86 | } |
86 | 87 | |
87 | 88 | @Override |
88 | 89 | public Optional<Device> findDeviceByTenantIdAndName(TenantId tenantId, String name) { |
89 | 90 | log.trace("Executing findDeviceByTenantIdAndName [{}][{}]", tenantId, name); |
90 | - validateId(tenantId, "Incorrect tenantId " + tenantId); | |
91 | + validateId(tenantId, INCORRECT_TENANT_ID + tenantId); | |
91 | 92 | Optional<Device> deviceOpt = deviceDao.findDeviceByTenantIdAndName(tenantId.getId(), name); |
92 | 93 | if (deviceOpt.isPresent()) { |
93 | 94 | return Optional.of(deviceOpt.get()); |
... | ... | @@ -128,7 +129,7 @@ public class DeviceServiceImpl extends AbstractEntityService implements DeviceSe |
128 | 129 | @Override |
129 | 130 | public void deleteDevice(DeviceId deviceId) { |
130 | 131 | log.trace("Executing deleteDevice [{}]", deviceId); |
131 | - validateId(deviceId, "Incorrect deviceId " + deviceId); | |
132 | + validateId(deviceId, INCORRECT_DEVICE_ID + deviceId); | |
132 | 133 | DeviceCredentials deviceCredentials = deviceCredentialsService.findDeviceCredentialsByDeviceId(deviceId); |
133 | 134 | if (deviceCredentials != null) { |
134 | 135 | deviceCredentialsService.deleteDeviceCredentials(deviceCredentials); |
... | ... | @@ -140,8 +141,8 @@ public class DeviceServiceImpl extends AbstractEntityService implements DeviceSe |
140 | 141 | @Override |
141 | 142 | public TextPageData<Device> findDevicesByTenantId(TenantId tenantId, TextPageLink pageLink) { |
142 | 143 | log.trace("Executing findDevicesByTenantId, tenantId [{}], pageLink [{}]", tenantId, pageLink); |
143 | - validateId(tenantId, "Incorrect tenantId " + tenantId); | |
144 | - validatePageLink(pageLink, "Incorrect page link " + pageLink); | |
144 | + validateId(tenantId, INCORRECT_TENANT_ID + tenantId); | |
145 | + validatePageLink(pageLink, INCORRECT_PAGE_LINK + pageLink); | |
145 | 146 | List<Device> devices = deviceDao.findDevicesByTenantId(tenantId.getId(), pageLink); |
146 | 147 | return new TextPageData<>(devices, pageLink); |
147 | 148 | } |
... | ... | @@ -149,9 +150,9 @@ public class DeviceServiceImpl extends AbstractEntityService implements DeviceSe |
149 | 150 | @Override |
150 | 151 | public TextPageData<Device> findDevicesByTenantIdAndType(TenantId tenantId, String type, TextPageLink pageLink) { |
151 | 152 | log.trace("Executing findDevicesByTenantIdAndType, tenantId [{}], type [{}], pageLink [{}]", tenantId, type, pageLink); |
152 | - validateId(tenantId, "Incorrect tenantId " + tenantId); | |
153 | + validateId(tenantId, INCORRECT_TENANT_ID + tenantId); | |
153 | 154 | validateString(type, "Incorrect type " + type); |
154 | - validatePageLink(pageLink, "Incorrect page link " + pageLink); | |
155 | + validatePageLink(pageLink, INCORRECT_PAGE_LINK + pageLink); | |
155 | 156 | List<Device> devices = deviceDao.findDevicesByTenantIdAndType(tenantId.getId(), type, pageLink); |
156 | 157 | return new TextPageData<>(devices, pageLink); |
157 | 158 | } |
... | ... | @@ -159,7 +160,7 @@ public class DeviceServiceImpl extends AbstractEntityService implements DeviceSe |
159 | 160 | @Override |
160 | 161 | public ListenableFuture<List<Device>> findDevicesByTenantIdAndIdsAsync(TenantId tenantId, List<DeviceId> deviceIds) { |
161 | 162 | log.trace("Executing findDevicesByTenantIdAndIdsAsync, tenantId [{}], deviceIds [{}]", tenantId, deviceIds); |
162 | - validateId(tenantId, "Incorrect tenantId " + tenantId); | |
163 | + validateId(tenantId, INCORRECT_TENANT_ID + tenantId); | |
163 | 164 | validateIds(deviceIds, "Incorrect deviceIds " + deviceIds); |
164 | 165 | return deviceDao.findDevicesByTenantIdAndIdsAsync(tenantId.getId(), toUUIDs(deviceIds)); |
165 | 166 | } |
... | ... | @@ -168,16 +169,16 @@ public class DeviceServiceImpl extends AbstractEntityService implements DeviceSe |
168 | 169 | @Override |
169 | 170 | public void deleteDevicesByTenantId(TenantId tenantId) { |
170 | 171 | log.trace("Executing deleteDevicesByTenantId, tenantId [{}]", tenantId); |
171 | - validateId(tenantId, "Incorrect tenantId " + tenantId); | |
172 | + validateId(tenantId, INCORRECT_TENANT_ID + tenantId); | |
172 | 173 | tenantDevicesRemover.removeEntities(tenantId); |
173 | 174 | } |
174 | 175 | |
175 | 176 | @Override |
176 | 177 | public TextPageData<Device> findDevicesByTenantIdAndCustomerId(TenantId tenantId, CustomerId customerId, TextPageLink pageLink) { |
177 | 178 | log.trace("Executing findDevicesByTenantIdAndCustomerId, tenantId [{}], customerId [{}], pageLink [{}]", tenantId, customerId, pageLink); |
178 | - validateId(tenantId, "Incorrect tenantId " + tenantId); | |
179 | - validateId(customerId, "Incorrect customerId " + customerId); | |
180 | - validatePageLink(pageLink, "Incorrect page link " + pageLink); | |
179 | + validateId(tenantId, INCORRECT_TENANT_ID + tenantId); | |
180 | + validateId(customerId, INCORRECT_CUSTOMER_ID + customerId); | |
181 | + validatePageLink(pageLink, INCORRECT_PAGE_LINK + pageLink); | |
181 | 182 | List<Device> devices = deviceDao.findDevicesByTenantIdAndCustomerId(tenantId.getId(), customerId.getId(), pageLink); |
182 | 183 | return new TextPageData<>(devices, pageLink); |
183 | 184 | } |
... | ... | @@ -185,10 +186,10 @@ public class DeviceServiceImpl extends AbstractEntityService implements DeviceSe |
185 | 186 | @Override |
186 | 187 | public TextPageData<Device> findDevicesByTenantIdAndCustomerIdAndType(TenantId tenantId, CustomerId customerId, String type, TextPageLink pageLink) { |
187 | 188 | log.trace("Executing findDevicesByTenantIdAndCustomerIdAndType, tenantId [{}], customerId [{}], type [{}], pageLink [{}]", tenantId, customerId, type, pageLink); |
188 | - validateId(tenantId, "Incorrect tenantId " + tenantId); | |
189 | - validateId(customerId, "Incorrect customerId " + customerId); | |
189 | + validateId(tenantId, INCORRECT_TENANT_ID + tenantId); | |
190 | + validateId(customerId, INCORRECT_CUSTOMER_ID + customerId); | |
190 | 191 | validateString(type, "Incorrect type " + type); |
191 | - validatePageLink(pageLink, "Incorrect page link " + pageLink); | |
192 | + validatePageLink(pageLink, INCORRECT_PAGE_LINK + pageLink); | |
192 | 193 | List<Device> devices = deviceDao.findDevicesByTenantIdAndCustomerIdAndType(tenantId.getId(), customerId.getId(), type, pageLink); |
193 | 194 | return new TextPageData<>(devices, pageLink); |
194 | 195 | } |
... | ... | @@ -196,8 +197,8 @@ public class DeviceServiceImpl extends AbstractEntityService implements DeviceSe |
196 | 197 | @Override |
197 | 198 | public ListenableFuture<List<Device>> findDevicesByTenantIdCustomerIdAndIdsAsync(TenantId tenantId, CustomerId customerId, List<DeviceId> deviceIds) { |
198 | 199 | log.trace("Executing findDevicesByTenantIdCustomerIdAndIdsAsync, tenantId [{}], customerId [{}], deviceIds [{}]", tenantId, customerId, deviceIds); |
199 | - validateId(tenantId, "Incorrect tenantId " + tenantId); | |
200 | - validateId(customerId, "Incorrect customerId " + customerId); | |
200 | + validateId(tenantId, INCORRECT_TENANT_ID + tenantId); | |
201 | + validateId(customerId, INCORRECT_CUSTOMER_ID + customerId); | |
201 | 202 | validateIds(deviceIds, "Incorrect deviceIds " + deviceIds); |
202 | 203 | return deviceDao.findDevicesByTenantIdCustomerIdAndIdsAsync(tenantId.getId(), |
203 | 204 | customerId.getId(), toUUIDs(deviceIds)); |
... | ... | @@ -206,8 +207,8 @@ public class DeviceServiceImpl extends AbstractEntityService implements DeviceSe |
206 | 207 | @Override |
207 | 208 | public void unassignCustomerDevices(TenantId tenantId, CustomerId customerId) { |
208 | 209 | log.trace("Executing unassignCustomerDevices, tenantId [{}], customerId [{}]", tenantId, customerId); |
209 | - validateId(tenantId, "Incorrect tenantId " + tenantId); | |
210 | - validateId(customerId, "Incorrect customerId " + customerId); | |
210 | + validateId(tenantId, INCORRECT_TENANT_ID + tenantId); | |
211 | + validateId(customerId, INCORRECT_CUSTOMER_ID + customerId); | |
211 | 212 | new CustomerDevicesUnassigner(tenantId).removeEntities(customerId); |
212 | 213 | } |
213 | 214 | |
... | ... | @@ -230,7 +231,7 @@ public class DeviceServiceImpl extends AbstractEntityService implements DeviceSe |
230 | 231 | @Nullable |
231 | 232 | @Override |
232 | 233 | public List<Device> apply(@Nullable List<Device> deviceList) { |
233 | - return deviceList.stream().filter(device -> query.getDeviceTypes().contains(device.getType())).collect(Collectors.toList()); | |
234 | + return deviceList == null ? Collections.emptyList() : deviceList.stream().filter(device -> query.getDeviceTypes().contains(device.getType())).collect(Collectors.toList()); | |
234 | 235 | } |
235 | 236 | }); |
236 | 237 | |
... | ... | @@ -240,7 +241,7 @@ public class DeviceServiceImpl extends AbstractEntityService implements DeviceSe |
240 | 241 | @Override |
241 | 242 | public ListenableFuture<List<EntitySubtype>> findDeviceTypesByTenantId(TenantId tenantId) { |
242 | 243 | log.trace("Executing findDeviceTypesByTenantId, tenantId [{}]", tenantId); |
243 | - validateId(tenantId, "Incorrect tenantId " + tenantId); | |
244 | + validateId(tenantId, INCORRECT_TENANT_ID + tenantId); | |
244 | 245 | ListenableFuture<List<EntitySubtype>> tenantDeviceTypes = deviceDao.findTenantDeviceTypesAsync(tenantId.getId()); |
245 | 246 | return Futures.transform(tenantDeviceTypes, |
246 | 247 | (Function<List<EntitySubtype>, List<EntitySubtype>>) deviceTypes -> { | ... | ... |
... | ... | @@ -31,12 +31,7 @@ public abstract class AbstractEntityService { |
31 | 31 | |
32 | 32 | protected void deleteEntityRelations(EntityId entityId) { |
33 | 33 | log.trace("Executing deleteEntityRelations [{}]", entityId); |
34 | - try { | |
35 | - relationService.deleteEntityRelations(entityId).get(); | |
36 | - } catch (InterruptedException | ExecutionException e) { | |
37 | - throw new RuntimeException(e); | |
38 | - } | |
34 | + relationService.deleteEntityRelations(entityId); | |
39 | 35 | } |
40 | 36 | |
41 | - | |
42 | 37 | } | ... | ... |
... | ... | @@ -18,7 +18,7 @@ package org.thingsboard.server.dao.model; |
18 | 18 | import java.io.Serializable; |
19 | 19 | import java.util.UUID; |
20 | 20 | |
21 | -public interface BaseEntity<D> extends ToData<D>, Serializable { | |
21 | +public interface BaseEntity<D> extends ToData<D> { | |
22 | 22 | |
23 | 23 | UUID getId(); |
24 | 24 | ... | ... |
... | ... | @@ -19,7 +19,6 @@ package org.thingsboard.server.dao.model; |
19 | 19 | import com.datastax.driver.mapping.annotations.Column; |
20 | 20 | import com.datastax.driver.mapping.annotations.PartitionKey; |
21 | 21 | import com.datastax.driver.mapping.annotations.Table; |
22 | -import com.datastax.driver.mapping.annotations.Transient; | |
23 | 22 | import org.thingsboard.server.common.data.EntitySubtype; |
24 | 23 | import org.thingsboard.server.common.data.EntityType; |
25 | 24 | import org.thingsboard.server.common.data.id.TenantId; |
... | ... | @@ -32,9 +31,6 @@ import static org.thingsboard.server.dao.model.ModelConstants.*; |
32 | 31 | @Table(name = ENTITY_SUBTYPE_COLUMN_FAMILY_NAME) |
33 | 32 | public class EntitySubtypeEntity { |
34 | 33 | |
35 | - @Transient | |
36 | - private static final long serialVersionUID = -1268181961886910152L; | |
37 | - | |
38 | 34 | @PartitionKey(value = 0) |
39 | 35 | @Column(name = ENTITY_SUBTYPE_TENANT_ID_PROPERTY) |
40 | 36 | private UUID tenantId; | ... | ... |
... | ... | @@ -27,8 +27,8 @@ public class ModelConstants { |
27 | 27 | private ModelConstants() { |
28 | 28 | } |
29 | 29 | |
30 | - public static UUID NULL_UUID = UUIDs.startOf(0); | |
31 | - public static String NULL_UUID_STR = UUIDConverter.fromTimeUUID(NULL_UUID); | |
30 | + public static final UUID NULL_UUID = UUIDs.startOf(0); | |
31 | + public static final String NULL_UUID_STR = UUIDConverter.fromTimeUUID(NULL_UUID); | |
32 | 32 | |
33 | 33 | /** |
34 | 34 | * Generic constants. |
... | ... | @@ -42,6 +42,7 @@ public class ModelConstants { |
42 | 42 | public static final String ALIAS_PROPERTY = "alias"; |
43 | 43 | public static final String SEARCH_TEXT_PROPERTY = "search_text"; |
44 | 44 | public static final String ADDITIONAL_INFO_PROPERTY = "additional_info"; |
45 | + public static final String ENTITY_TYPE_PROPERTY = "entity_type"; | |
45 | 46 | |
46 | 47 | /** |
47 | 48 | * Cassandra user constants. |
... | ... | @@ -66,7 +67,7 @@ public class ModelConstants { |
66 | 67 | public static final String USER_CREDENTIALS_COLUMN_FAMILY_NAME = "user_credentials"; |
67 | 68 | public static final String USER_CREDENTIALS_USER_ID_PROPERTY = USER_ID_PROPERTY; |
68 | 69 | public static final String USER_CREDENTIALS_ENABLED_PROPERTY = "enabled"; |
69 | - public static final String USER_CREDENTIALS_PASSWORD_PROPERTY = "password"; | |
70 | + public static final String USER_CREDENTIALS_PASSWORD_PROPERTY = "password"; //NOSONAR, the constant used to identify password column name (not password value itself) | |
70 | 71 | public static final String USER_CREDENTIALS_ACTIVATE_TOKEN_PROPERTY = "activate_token"; |
71 | 72 | public static final String USER_CREDENTIALS_RESET_TOKEN_PROPERTY = "reset_token"; |
72 | 73 | |
... | ... | @@ -155,7 +156,7 @@ public class ModelConstants { |
155 | 156 | */ |
156 | 157 | public static final String ENTITY_SUBTYPE_COLUMN_FAMILY_NAME = "entity_subtype"; |
157 | 158 | public static final String ENTITY_SUBTYPE_TENANT_ID_PROPERTY = TENANT_ID_PROPERTY; |
158 | - public static final String ENTITY_SUBTYPE_ENTITY_TYPE_PROPERTY = "entity_type"; | |
159 | + public static final String ENTITY_SUBTYPE_ENTITY_TYPE_PROPERTY = ENTITY_TYPE_PROPERTY; | |
159 | 160 | public static final String ENTITY_SUBTYPE_TYPE_PROPERTY = "type"; |
160 | 161 | |
161 | 162 | /** |
... | ... | @@ -250,7 +251,7 @@ public class ModelConstants { |
250 | 251 | public static final String PLUGIN_API_TOKEN_PROPERTY = "api_token"; |
251 | 252 | public static final String PLUGIN_CLASS_PROPERTY = "plugin_class"; |
252 | 253 | public static final String PLUGIN_ACCESS_PROPERTY = "public_access"; |
253 | - public static final String PLUGIN_STATE_PROPERTY = "state"; | |
254 | + public static final String PLUGIN_STATE_PROPERTY = STATE_PROPERTY; | |
254 | 255 | public static final String PLUGIN_CONFIGURATION_PROPERTY = "configuration"; |
255 | 256 | |
256 | 257 | public static final String PLUGIN_BY_API_TOKEN_COLUMN_FAMILY_NAME = "plugin_by_api_token"; |
... | ... | @@ -277,7 +278,7 @@ public class ModelConstants { |
277 | 278 | public static final String RULE_COLUMN_FAMILY_NAME = "rule"; |
278 | 279 | public static final String RULE_TENANT_ID_PROPERTY = TENANT_ID_PROPERTY; |
279 | 280 | public static final String RULE_NAME_PROPERTY = "name"; |
280 | - public static final String RULE_STATE_PROPERTY = "state"; | |
281 | + public static final String RULE_STATE_PROPERTY = STATE_PROPERTY; | |
281 | 282 | public static final String RULE_WEIGHT_PROPERTY = "weight"; |
282 | 283 | public static final String RULE_PLUGIN_TOKEN_PROPERTY = "plugin_token"; |
283 | 284 | public static final String RULE_FILTERS = "filters"; |
... | ... | @@ -294,7 +295,7 @@ public class ModelConstants { |
294 | 295 | public static final String EVENT_TENANT_ID_PROPERTY = TENANT_ID_PROPERTY; |
295 | 296 | public static final String EVENT_TYPE_PROPERTY = "event_type"; |
296 | 297 | public static final String EVENT_UID_PROPERTY = "event_uid"; |
297 | - public static final String EVENT_ENTITY_TYPE_PROPERTY = "entity_type"; | |
298 | + public static final String EVENT_ENTITY_TYPE_PROPERTY = ENTITY_TYPE_PROPERTY; | |
298 | 299 | public static final String EVENT_ENTITY_ID_PROPERTY = "entity_id"; |
299 | 300 | public static final String EVENT_BODY_PROPERTY = "body"; |
300 | 301 | |
... | ... | @@ -310,7 +311,7 @@ public class ModelConstants { |
310 | 311 | public static final String TS_KV_LATEST_CF = "ts_kv_latest_cf"; |
311 | 312 | |
312 | 313 | |
313 | - public static final String ENTITY_TYPE_COLUMN = "entity_type"; | |
314 | + public static final String ENTITY_TYPE_COLUMN = ENTITY_TYPE_PROPERTY; | |
314 | 315 | public static final String ENTITY_ID_COLUMN = "entity_id"; |
315 | 316 | public static final String ATTRIBUTE_TYPE_COLUMN = "attribute_type"; |
316 | 317 | public static final String ATTRIBUTE_KEY_COLUMN = "attribute_key"; |
... | ... | @@ -328,17 +329,17 @@ public class ModelConstants { |
328 | 329 | public static final String LONG_VALUE_COLUMN = "long_v"; |
329 | 330 | public static final String DOUBLE_VALUE_COLUMN = "dbl_v"; |
330 | 331 | |
331 | - public static final String[] NONE_AGGREGATION_COLUMNS = new String[]{LONG_VALUE_COLUMN, DOUBLE_VALUE_COLUMN, BOOLEAN_VALUE_COLUMN, STRING_VALUE_COLUMN, KEY_COLUMN, TS_COLUMN}; | |
332 | + protected static final String[] NONE_AGGREGATION_COLUMNS = new String[]{LONG_VALUE_COLUMN, DOUBLE_VALUE_COLUMN, BOOLEAN_VALUE_COLUMN, STRING_VALUE_COLUMN, KEY_COLUMN, TS_COLUMN}; | |
332 | 333 | |
333 | - public static final String[] COUNT_AGGREGATION_COLUMNS = new String[]{count(LONG_VALUE_COLUMN), count(DOUBLE_VALUE_COLUMN), count(BOOLEAN_VALUE_COLUMN), count(STRING_VALUE_COLUMN)}; | |
334 | + protected static final String[] COUNT_AGGREGATION_COLUMNS = new String[]{count(LONG_VALUE_COLUMN), count(DOUBLE_VALUE_COLUMN), count(BOOLEAN_VALUE_COLUMN), count(STRING_VALUE_COLUMN)}; | |
334 | 335 | |
335 | - public static final String[] MIN_AGGREGATION_COLUMNS = ArrayUtils.addAll(COUNT_AGGREGATION_COLUMNS, | |
336 | + protected static final String[] MIN_AGGREGATION_COLUMNS = ArrayUtils.addAll(COUNT_AGGREGATION_COLUMNS, | |
336 | 337 | new String[]{min(LONG_VALUE_COLUMN), min(DOUBLE_VALUE_COLUMN), min(BOOLEAN_VALUE_COLUMN), min(STRING_VALUE_COLUMN)}); |
337 | - public static final String[] MAX_AGGREGATION_COLUMNS = ArrayUtils.addAll(COUNT_AGGREGATION_COLUMNS, | |
338 | + protected static final String[] MAX_AGGREGATION_COLUMNS = ArrayUtils.addAll(COUNT_AGGREGATION_COLUMNS, | |
338 | 339 | new String[]{max(LONG_VALUE_COLUMN), max(DOUBLE_VALUE_COLUMN), max(BOOLEAN_VALUE_COLUMN), max(STRING_VALUE_COLUMN)}); |
339 | - public static final String[] SUM_AGGREGATION_COLUMNS = ArrayUtils.addAll(COUNT_AGGREGATION_COLUMNS, | |
340 | + protected static final String[] SUM_AGGREGATION_COLUMNS = ArrayUtils.addAll(COUNT_AGGREGATION_COLUMNS, | |
340 | 341 | new String[]{sum(LONG_VALUE_COLUMN), sum(DOUBLE_VALUE_COLUMN)}); |
341 | - public static final String[] AVG_AGGREGATION_COLUMNS = SUM_AGGREGATION_COLUMNS; | |
342 | + protected static final String[] AVG_AGGREGATION_COLUMNS = SUM_AGGREGATION_COLUMNS; | |
342 | 343 | |
343 | 344 | public static String min(String s) { |
344 | 345 | return "min(" + s + ")"; | ... | ... |
... | ... | @@ -19,8 +19,9 @@ import com.datastax.driver.core.utils.UUIDs; |
19 | 19 | import com.datastax.driver.mapping.annotations.Column; |
20 | 20 | import com.datastax.driver.mapping.annotations.PartitionKey; |
21 | 21 | import com.datastax.driver.mapping.annotations.Table; |
22 | -import com.datastax.driver.mapping.annotations.Transient; | |
23 | 22 | import com.fasterxml.jackson.databind.JsonNode; |
23 | +import lombok.EqualsAndHashCode; | |
24 | +import lombok.ToString; | |
24 | 25 | import org.thingsboard.server.common.data.AdminSettings; |
25 | 26 | import org.thingsboard.server.common.data.id.AdminSettingsId; |
26 | 27 | import org.thingsboard.server.dao.model.BaseEntity; |
... | ... | @@ -31,11 +32,10 @@ import java.util.UUID; |
31 | 32 | import static org.thingsboard.server.dao.model.ModelConstants.*; |
32 | 33 | |
33 | 34 | @Table(name = ADMIN_SETTINGS_COLUMN_FAMILY_NAME) |
35 | +@EqualsAndHashCode | |
36 | +@ToString | |
34 | 37 | public final class AdminSettingsEntity implements BaseEntity<AdminSettings> { |
35 | 38 | |
36 | - @Transient | |
37 | - private static final long serialVersionUID = 899117723388310403L; | |
38 | - | |
39 | 39 | @PartitionKey(value = 0) |
40 | 40 | @Column(name = ID_PROPERTY) |
41 | 41 | private UUID id; |
... | ... | @@ -83,56 +83,6 @@ public final class AdminSettingsEntity implements BaseEntity<AdminSettings> { |
83 | 83 | } |
84 | 84 | |
85 | 85 | @Override |
86 | - public int hashCode() { | |
87 | - final int prime = 31; | |
88 | - int result = 1; | |
89 | - result = prime * result + ((id == null) ? 0 : id.hashCode()); | |
90 | - result = prime * result + ((jsonValue == null) ? 0 : jsonValue.hashCode()); | |
91 | - result = prime * result + ((key == null) ? 0 : key.hashCode()); | |
92 | - return result; | |
93 | - } | |
94 | - | |
95 | - @Override | |
96 | - public boolean equals(Object obj) { | |
97 | - if (this == obj) | |
98 | - return true; | |
99 | - if (obj == null) | |
100 | - return false; | |
101 | - if (getClass() != obj.getClass()) | |
102 | - return false; | |
103 | - AdminSettingsEntity other = (AdminSettingsEntity) obj; | |
104 | - if (id == null) { | |
105 | - if (other.id != null) | |
106 | - return false; | |
107 | - } else if (!id.equals(other.id)) | |
108 | - return false; | |
109 | - if (jsonValue == null) { | |
110 | - if (other.jsonValue != null) | |
111 | - return false; | |
112 | - } else if (!jsonValue.equals(other.jsonValue)) | |
113 | - return false; | |
114 | - if (key == null) { | |
115 | - if (other.key != null) | |
116 | - return false; | |
117 | - } else if (!key.equals(other.key)) | |
118 | - return false; | |
119 | - return true; | |
120 | - } | |
121 | - | |
122 | - @Override | |
123 | - public String toString() { | |
124 | - StringBuilder builder = new StringBuilder(); | |
125 | - builder.append("AdminSettingsEntity [id="); | |
126 | - builder.append(id); | |
127 | - builder.append(", key="); | |
128 | - builder.append(key); | |
129 | - builder.append(", jsonValue="); | |
130 | - builder.append(jsonValue); | |
131 | - builder.append("]"); | |
132 | - return builder.toString(); | |
133 | - } | |
134 | - | |
135 | - @Override | |
136 | 86 | public AdminSettings toData() { |
137 | 87 | AdminSettings adminSettings = new AdminSettings(new AdminSettingsId(id)); |
138 | 88 | adminSettings.setCreatedTime(UUIDs.unixTimestamp(id)); | ... | ... |
... | ... | @@ -18,6 +18,8 @@ package org.thingsboard.server.dao.model.nosql; |
18 | 18 | import com.datastax.driver.core.utils.UUIDs; |
19 | 19 | import com.datastax.driver.mapping.annotations.*; |
20 | 20 | import com.fasterxml.jackson.databind.JsonNode; |
21 | +import lombok.EqualsAndHashCode; | |
22 | +import lombok.ToString; | |
21 | 23 | import org.thingsboard.server.common.data.EntityType; |
22 | 24 | import org.thingsboard.server.common.data.alarm.Alarm; |
23 | 25 | import org.thingsboard.server.common.data.alarm.AlarmId; |
... | ... | @@ -36,11 +38,10 @@ import java.util.UUID; |
36 | 38 | import static org.thingsboard.server.dao.model.ModelConstants.*; |
37 | 39 | |
38 | 40 | @Table(name = ALARM_COLUMN_FAMILY_NAME) |
41 | +@EqualsAndHashCode | |
42 | +@ToString | |
39 | 43 | public final class AlarmEntity implements BaseEntity<Alarm> { |
40 | 44 | |
41 | - @Transient | |
42 | - private static final long serialVersionUID = -1265181166886910152L; | |
43 | - | |
44 | 45 | @ClusteringColumn(value = 1) |
45 | 46 | @Column(name = ID_PROPERTY) |
46 | 47 | private UUID id; | ... | ... |
... | ... | @@ -19,8 +19,9 @@ import com.datastax.driver.core.utils.UUIDs; |
19 | 19 | import com.datastax.driver.mapping.annotations.Column; |
20 | 20 | import com.datastax.driver.mapping.annotations.PartitionKey; |
21 | 21 | import com.datastax.driver.mapping.annotations.Table; |
22 | -import com.datastax.driver.mapping.annotations.Transient; | |
23 | 22 | import com.fasterxml.jackson.databind.JsonNode; |
23 | +import lombok.EqualsAndHashCode; | |
24 | +import lombok.ToString; | |
24 | 25 | import org.thingsboard.server.common.data.asset.Asset; |
25 | 26 | import org.thingsboard.server.common.data.id.AssetId; |
26 | 27 | import org.thingsboard.server.common.data.id.CustomerId; |
... | ... | @@ -33,11 +34,10 @@ import java.util.UUID; |
33 | 34 | import static org.thingsboard.server.dao.model.ModelConstants.*; |
34 | 35 | |
35 | 36 | @Table(name = ASSET_COLUMN_FAMILY_NAME) |
37 | +@EqualsAndHashCode | |
38 | +@ToString | |
36 | 39 | public final class AssetEntity implements SearchTextEntity<Asset> { |
37 | 40 | |
38 | - @Transient | |
39 | - private static final long serialVersionUID = -1265181166886910152L; | |
40 | - | |
41 | 41 | @PartitionKey(value = 0) |
42 | 42 | @Column(name = ID_PROPERTY) |
43 | 43 | private UUID id; |
... | ... | @@ -132,7 +132,7 @@ public final class AssetEntity implements SearchTextEntity<Asset> { |
132 | 132 | |
133 | 133 | @Override |
134 | 134 | public String getSearchTextSource() { |
135 | - return name; | |
135 | + return getName(); | |
136 | 136 | } |
137 | 137 | |
138 | 138 | @Override |
... | ... | @@ -145,80 +145,6 @@ public final class AssetEntity implements SearchTextEntity<Asset> { |
145 | 145 | } |
146 | 146 | |
147 | 147 | @Override |
148 | - public int hashCode() { | |
149 | - final int prime = 31; | |
150 | - int result = 1; | |
151 | - result = prime * result + ((additionalInfo == null) ? 0 : additionalInfo.hashCode()); | |
152 | - result = prime * result + ((customerId == null) ? 0 : customerId.hashCode()); | |
153 | - result = prime * result + ((id == null) ? 0 : id.hashCode()); | |
154 | - result = prime * result + ((name == null) ? 0 : name.hashCode()); | |
155 | - result = prime * result + ((type == null) ? 0 : type.hashCode()); | |
156 | - result = prime * result + ((tenantId == null) ? 0 : tenantId.hashCode()); | |
157 | - return result; | |
158 | - } | |
159 | - | |
160 | - @Override | |
161 | - public boolean equals(Object obj) { | |
162 | - if (this == obj) | |
163 | - return true; | |
164 | - if (obj == null) | |
165 | - return false; | |
166 | - if (getClass() != obj.getClass()) | |
167 | - return false; | |
168 | - AssetEntity other = (AssetEntity) obj; | |
169 | - if (additionalInfo == null) { | |
170 | - if (other.additionalInfo != null) | |
171 | - return false; | |
172 | - } else if (!additionalInfo.equals(other.additionalInfo)) | |
173 | - return false; | |
174 | - if (customerId == null) { | |
175 | - if (other.customerId != null) | |
176 | - return false; | |
177 | - } else if (!customerId.equals(other.customerId)) | |
178 | - return false; | |
179 | - if (id == null) { | |
180 | - if (other.id != null) | |
181 | - return false; | |
182 | - } else if (!id.equals(other.id)) | |
183 | - return false; | |
184 | - if (name == null) { | |
185 | - if (other.name != null) | |
186 | - return false; | |
187 | - } else if (!name.equals(other.name)) | |
188 | - return false; | |
189 | - if (type == null) { | |
190 | - if (other.type != null) | |
191 | - return false; | |
192 | - } else if (!type.equals(other.type)) | |
193 | - return false; | |
194 | - if (tenantId == null) { | |
195 | - if (other.tenantId != null) | |
196 | - return false; | |
197 | - } else if (!tenantId.equals(other.tenantId)) | |
198 | - return false; | |
199 | - return true; | |
200 | - } | |
201 | - | |
202 | - @Override | |
203 | - public String toString() { | |
204 | - StringBuilder builder = new StringBuilder(); | |
205 | - builder.append("AssetEntity [id="); | |
206 | - builder.append(id); | |
207 | - builder.append(", tenantId="); | |
208 | - builder.append(tenantId); | |
209 | - builder.append(", customerId="); | |
210 | - builder.append(customerId); | |
211 | - builder.append(", name="); | |
212 | - builder.append(name); | |
213 | - builder.append(", type="); | |
214 | - builder.append(type); | |
215 | - builder.append(", additionalInfo="); | |
216 | - builder.append(additionalInfo); | |
217 | - builder.append("]"); | |
218 | - return builder.toString(); | |
219 | - } | |
220 | - | |
221 | - @Override | |
222 | 148 | public Asset toData() { |
223 | 149 | Asset asset = new Asset(new AssetId(id)); |
224 | 150 | asset.setCreatedTime(UUIDs.unixTimestamp(id)); | ... | ... |
... | ... | @@ -36,8 +36,6 @@ import static org.thingsboard.server.dao.model.ModelConstants.*; |
36 | 36 | @Table(name = COMPONENT_DESCRIPTOR_COLUMN_FAMILY_NAME) |
37 | 37 | public class ComponentDescriptorEntity implements SearchTextEntity<ComponentDescriptor> { |
38 | 38 | |
39 | - private static final long serialVersionUID = 1L; | |
40 | - | |
41 | 39 | @PartitionKey |
42 | 40 | @Column(name = ID_PROPERTY) |
43 | 41 | private UUID id; |
... | ... | @@ -160,6 +158,6 @@ public class ComponentDescriptorEntity implements SearchTextEntity<ComponentDesc |
160 | 158 | |
161 | 159 | @Override |
162 | 160 | public String getSearchTextSource() { |
163 | - return searchText; | |
161 | + return getSearchText(); | |
164 | 162 | } |
165 | 163 | } | ... | ... |
... | ... | @@ -19,8 +19,9 @@ import com.datastax.driver.core.utils.UUIDs; |
19 | 19 | import com.datastax.driver.mapping.annotations.Column; |
20 | 20 | import com.datastax.driver.mapping.annotations.PartitionKey; |
21 | 21 | import com.datastax.driver.mapping.annotations.Table; |
22 | -import com.datastax.driver.mapping.annotations.Transient; | |
23 | 22 | import com.fasterxml.jackson.databind.JsonNode; |
23 | +import lombok.EqualsAndHashCode; | |
24 | +import lombok.ToString; | |
24 | 25 | import org.thingsboard.server.common.data.Customer; |
25 | 26 | import org.thingsboard.server.common.data.id.CustomerId; |
26 | 27 | import org.thingsboard.server.common.data.id.TenantId; |
... | ... | @@ -32,11 +33,10 @@ import java.util.UUID; |
32 | 33 | import static org.thingsboard.server.dao.model.ModelConstants.*; |
33 | 34 | |
34 | 35 | @Table(name = CUSTOMER_COLUMN_FAMILY_NAME) |
36 | +@EqualsAndHashCode | |
37 | +@ToString | |
35 | 38 | public final class CustomerEntity implements SearchTextEntity<Customer> { |
36 | 39 | |
37 | - @Transient | |
38 | - private static final long serialVersionUID = -7732527103760948490L; | |
39 | - | |
40 | 40 | @PartitionKey(value = 0) |
41 | 41 | @Column(name = ID_PROPERTY) |
42 | 42 | private UUID id; |
... | ... | @@ -197,7 +197,7 @@ public final class CustomerEntity implements SearchTextEntity<Customer> { |
197 | 197 | |
198 | 198 | @Override |
199 | 199 | public String getSearchTextSource() { |
200 | - return title; | |
200 | + return getTitle(); | |
201 | 201 | } |
202 | 202 | |
203 | 203 | @Override |
... | ... | @@ -210,128 +210,6 @@ public final class CustomerEntity implements SearchTextEntity<Customer> { |
210 | 210 | } |
211 | 211 | |
212 | 212 | @Override |
213 | - public int hashCode() { | |
214 | - final int prime = 31; | |
215 | - int result = 1; | |
216 | - result = prime * result + ((additionalInfo == null) ? 0 : additionalInfo.hashCode()); | |
217 | - result = prime * result + ((address == null) ? 0 : address.hashCode()); | |
218 | - result = prime * result + ((address2 == null) ? 0 : address2.hashCode()); | |
219 | - result = prime * result + ((city == null) ? 0 : city.hashCode()); | |
220 | - result = prime * result + ((country == null) ? 0 : country.hashCode()); | |
221 | - result = prime * result + ((email == null) ? 0 : email.hashCode()); | |
222 | - result = prime * result + ((id == null) ? 0 : id.hashCode()); | |
223 | - result = prime * result + ((phone == null) ? 0 : phone.hashCode()); | |
224 | - result = prime * result + ((state == null) ? 0 : state.hashCode()); | |
225 | - result = prime * result + ((tenantId == null) ? 0 : tenantId.hashCode()); | |
226 | - result = prime * result + ((title == null) ? 0 : title.hashCode()); | |
227 | - result = prime * result + ((zip == null) ? 0 : zip.hashCode()); | |
228 | - return result; | |
229 | - } | |
230 | - | |
231 | - @Override | |
232 | - public boolean equals(Object obj) { | |
233 | - if (this == obj) | |
234 | - return true; | |
235 | - if (obj == null) | |
236 | - return false; | |
237 | - if (getClass() != obj.getClass()) | |
238 | - return false; | |
239 | - CustomerEntity other = (CustomerEntity) obj; | |
240 | - if (additionalInfo == null) { | |
241 | - if (other.additionalInfo != null) | |
242 | - return false; | |
243 | - } else if (!additionalInfo.equals(other.additionalInfo)) | |
244 | - return false; | |
245 | - if (address == null) { | |
246 | - if (other.address != null) | |
247 | - return false; | |
248 | - } else if (!address.equals(other.address)) | |
249 | - return false; | |
250 | - if (address2 == null) { | |
251 | - if (other.address2 != null) | |
252 | - return false; | |
253 | - } else if (!address2.equals(other.address2)) | |
254 | - return false; | |
255 | - if (city == null) { | |
256 | - if (other.city != null) | |
257 | - return false; | |
258 | - } else if (!city.equals(other.city)) | |
259 | - return false; | |
260 | - if (country == null) { | |
261 | - if (other.country != null) | |
262 | - return false; | |
263 | - } else if (!country.equals(other.country)) | |
264 | - return false; | |
265 | - if (email == null) { | |
266 | - if (other.email != null) | |
267 | - return false; | |
268 | - } else if (!email.equals(other.email)) | |
269 | - return false; | |
270 | - if (id == null) { | |
271 | - if (other.id != null) | |
272 | - return false; | |
273 | - } else if (!id.equals(other.id)) | |
274 | - return false; | |
275 | - if (phone == null) { | |
276 | - if (other.phone != null) | |
277 | - return false; | |
278 | - } else if (!phone.equals(other.phone)) | |
279 | - return false; | |
280 | - if (state == null) { | |
281 | - if (other.state != null) | |
282 | - return false; | |
283 | - } else if (!state.equals(other.state)) | |
284 | - return false; | |
285 | - if (tenantId == null) { | |
286 | - if (other.tenantId != null) | |
287 | - return false; | |
288 | - } else if (!tenantId.equals(other.tenantId)) | |
289 | - return false; | |
290 | - if (title == null) { | |
291 | - if (other.title != null) | |
292 | - return false; | |
293 | - } else if (!title.equals(other.title)) | |
294 | - return false; | |
295 | - if (zip == null) { | |
296 | - if (other.zip != null) | |
297 | - return false; | |
298 | - } else if (!zip.equals(other.zip)) | |
299 | - return false; | |
300 | - return true; | |
301 | - } | |
302 | - | |
303 | - @Override | |
304 | - public String toString() { | |
305 | - StringBuilder builder = new StringBuilder(); | |
306 | - builder.append("CustomerEntity [id="); | |
307 | - builder.append(id); | |
308 | - builder.append(", tenantId="); | |
309 | - builder.append(tenantId); | |
310 | - builder.append(", title="); | |
311 | - builder.append(title); | |
312 | - builder.append(", country="); | |
313 | - builder.append(country); | |
314 | - builder.append(", state="); | |
315 | - builder.append(state); | |
316 | - builder.append(", city="); | |
317 | - builder.append(city); | |
318 | - builder.append(", address="); | |
319 | - builder.append(address); | |
320 | - builder.append(", address2="); | |
321 | - builder.append(address2); | |
322 | - builder.append(", zip="); | |
323 | - builder.append(zip); | |
324 | - builder.append(", phone="); | |
325 | - builder.append(phone); | |
326 | - builder.append(", email="); | |
327 | - builder.append(email); | |
328 | - builder.append(", additionalInfo="); | |
329 | - builder.append(additionalInfo); | |
330 | - builder.append("]"); | |
331 | - return builder.toString(); | |
332 | - } | |
333 | - | |
334 | - @Override | |
335 | 213 | public Customer toData() { |
336 | 214 | Customer customer = new Customer(new CustomerId(id)); |
337 | 215 | customer.setCreatedTime(UUIDs.unixTimestamp(id)); | ... | ... |
... | ... | @@ -19,8 +19,9 @@ import com.datastax.driver.core.utils.UUIDs; |
19 | 19 | import com.datastax.driver.mapping.annotations.Column; |
20 | 20 | import com.datastax.driver.mapping.annotations.PartitionKey; |
21 | 21 | import com.datastax.driver.mapping.annotations.Table; |
22 | -import com.datastax.driver.mapping.annotations.Transient; | |
23 | 22 | import com.fasterxml.jackson.databind.JsonNode; |
23 | +import lombok.EqualsAndHashCode; | |
24 | +import lombok.ToString; | |
24 | 25 | import org.thingsboard.server.common.data.Dashboard; |
25 | 26 | import org.thingsboard.server.common.data.id.CustomerId; |
26 | 27 | import org.thingsboard.server.common.data.id.DashboardId; |
... | ... | @@ -33,11 +34,10 @@ import java.util.UUID; |
33 | 34 | import static org.thingsboard.server.dao.model.ModelConstants.*; |
34 | 35 | |
35 | 36 | @Table(name = DASHBOARD_COLUMN_FAMILY_NAME) |
37 | +@EqualsAndHashCode | |
38 | +@ToString | |
36 | 39 | public final class DashboardEntity implements SearchTextEntity<Dashboard> { |
37 | 40 | |
38 | - @Transient | |
39 | - private static final long serialVersionUID = 2998395951247446191L; | |
40 | - | |
41 | 41 | @PartitionKey(value = 0) |
42 | 42 | @Column(name = ID_PROPERTY) |
43 | 43 | private UUID id; |
... | ... | @@ -119,7 +119,7 @@ public final class DashboardEntity implements SearchTextEntity<Dashboard> { |
119 | 119 | |
120 | 120 | @Override |
121 | 121 | public String getSearchTextSource() { |
122 | - return title; | |
122 | + return getTitle(); | |
123 | 123 | } |
124 | 124 | |
125 | 125 | @Override |
... | ... | @@ -132,80 +132,6 @@ public final class DashboardEntity implements SearchTextEntity<Dashboard> { |
132 | 132 | } |
133 | 133 | |
134 | 134 | @Override |
135 | - public int hashCode() { | |
136 | - final int prime = 31; | |
137 | - int result = 1; | |
138 | - result = prime * result + ((configuration == null) ? 0 : configuration.hashCode()); | |
139 | - result = prime * result + ((customerId == null) ? 0 : customerId.hashCode()); | |
140 | - result = prime * result + ((id == null) ? 0 : id.hashCode()); | |
141 | - result = prime * result + ((searchText == null) ? 0 : searchText.hashCode()); | |
142 | - result = prime * result + ((tenantId == null) ? 0 : tenantId.hashCode()); | |
143 | - result = prime * result + ((title == null) ? 0 : title.hashCode()); | |
144 | - return result; | |
145 | - } | |
146 | - | |
147 | - @Override | |
148 | - public boolean equals(Object obj) { | |
149 | - if (this == obj) | |
150 | - return true; | |
151 | - if (obj == null) | |
152 | - return false; | |
153 | - if (getClass() != obj.getClass()) | |
154 | - return false; | |
155 | - DashboardEntity other = (DashboardEntity) obj; | |
156 | - if (configuration == null) { | |
157 | - if (other.configuration != null) | |
158 | - return false; | |
159 | - } else if (!configuration.equals(other.configuration)) | |
160 | - return false; | |
161 | - if (customerId == null) { | |
162 | - if (other.customerId != null) | |
163 | - return false; | |
164 | - } else if (!customerId.equals(other.customerId)) | |
165 | - return false; | |
166 | - if (id == null) { | |
167 | - if (other.id != null) | |
168 | - return false; | |
169 | - } else if (!id.equals(other.id)) | |
170 | - return false; | |
171 | - if (searchText == null) { | |
172 | - if (other.searchText != null) | |
173 | - return false; | |
174 | - } else if (!searchText.equals(other.searchText)) | |
175 | - return false; | |
176 | - if (tenantId == null) { | |
177 | - if (other.tenantId != null) | |
178 | - return false; | |
179 | - } else if (!tenantId.equals(other.tenantId)) | |
180 | - return false; | |
181 | - if (title == null) { | |
182 | - if (other.title != null) | |
183 | - return false; | |
184 | - } else if (!title.equals(other.title)) | |
185 | - return false; | |
186 | - return true; | |
187 | - } | |
188 | - | |
189 | - @Override | |
190 | - public String toString() { | |
191 | - StringBuilder builder = new StringBuilder(); | |
192 | - builder.append("DashboardEntity [id="); | |
193 | - builder.append(id); | |
194 | - builder.append(", tenantId="); | |
195 | - builder.append(tenantId); | |
196 | - builder.append(", customerId="); | |
197 | - builder.append(customerId); | |
198 | - builder.append(", title="); | |
199 | - builder.append(title); | |
200 | - builder.append(", searchText="); | |
201 | - builder.append(searchText); | |
202 | - builder.append(", configuration="); | |
203 | - builder.append(configuration); | |
204 | - builder.append("]"); | |
205 | - return builder.toString(); | |
206 | - } | |
207 | - | |
208 | - @Override | |
209 | 135 | public Dashboard toData() { |
210 | 136 | Dashboard dashboard = new Dashboard(new DashboardId(id)); |
211 | 137 | dashboard.setCreatedTime(UUIDs.unixTimestamp(id)); | ... | ... |
... | ... | @@ -19,7 +19,8 @@ import com.datastax.driver.core.utils.UUIDs; |
19 | 19 | import com.datastax.driver.mapping.annotations.Column; |
20 | 20 | import com.datastax.driver.mapping.annotations.PartitionKey; |
21 | 21 | import com.datastax.driver.mapping.annotations.Table; |
22 | -import com.datastax.driver.mapping.annotations.Transient; | |
22 | +import lombok.EqualsAndHashCode; | |
23 | +import lombok.ToString; | |
23 | 24 | import org.thingsboard.server.common.data.DashboardInfo; |
24 | 25 | import org.thingsboard.server.common.data.id.CustomerId; |
25 | 26 | import org.thingsboard.server.common.data.id.DashboardId; |
... | ... | @@ -31,11 +32,10 @@ import java.util.UUID; |
31 | 32 | import static org.thingsboard.server.dao.model.ModelConstants.*; |
32 | 33 | |
33 | 34 | @Table(name = DASHBOARD_COLUMN_FAMILY_NAME) |
35 | +@EqualsAndHashCode | |
36 | +@ToString | |
34 | 37 | public class DashboardInfoEntity implements SearchTextEntity<DashboardInfo> { |
35 | 38 | |
36 | - @Transient | |
37 | - private static final long serialVersionUID = 2998395951247446191L; | |
38 | - | |
39 | 39 | @PartitionKey(value = 0) |
40 | 40 | @Column(name = ID_PROPERTY) |
41 | 41 | private UUID id; |
... | ... | @@ -105,7 +105,7 @@ public class DashboardInfoEntity implements SearchTextEntity<DashboardInfo> { |
105 | 105 | |
106 | 106 | @Override |
107 | 107 | public String getSearchTextSource() { |
108 | - return title; | |
108 | + return getTitle(); | |
109 | 109 | } |
110 | 110 | |
111 | 111 | @Override |
... | ... | @@ -118,72 +118,6 @@ public class DashboardInfoEntity implements SearchTextEntity<DashboardInfo> { |
118 | 118 | } |
119 | 119 | |
120 | 120 | @Override |
121 | - public int hashCode() { | |
122 | - final int prime = 31; | |
123 | - int result = 1; | |
124 | - result = prime * result + ((customerId == null) ? 0 : customerId.hashCode()); | |
125 | - result = prime * result + ((id == null) ? 0 : id.hashCode()); | |
126 | - result = prime * result + ((searchText == null) ? 0 : searchText.hashCode()); | |
127 | - result = prime * result + ((tenantId == null) ? 0 : tenantId.hashCode()); | |
128 | - result = prime * result + ((title == null) ? 0 : title.hashCode()); | |
129 | - return result; | |
130 | - } | |
131 | - | |
132 | - @Override | |
133 | - public boolean equals(Object obj) { | |
134 | - if (this == obj) | |
135 | - return true; | |
136 | - if (obj == null) | |
137 | - return false; | |
138 | - if (getClass() != obj.getClass()) | |
139 | - return false; | |
140 | - DashboardInfoEntity other = (DashboardInfoEntity) obj; | |
141 | - if (customerId == null) { | |
142 | - if (other.customerId != null) | |
143 | - return false; | |
144 | - } else if (!customerId.equals(other.customerId)) | |
145 | - return false; | |
146 | - if (id == null) { | |
147 | - if (other.id != null) | |
148 | - return false; | |
149 | - } else if (!id.equals(other.id)) | |
150 | - return false; | |
151 | - if (searchText == null) { | |
152 | - if (other.searchText != null) | |
153 | - return false; | |
154 | - } else if (!searchText.equals(other.searchText)) | |
155 | - return false; | |
156 | - if (tenantId == null) { | |
157 | - if (other.tenantId != null) | |
158 | - return false; | |
159 | - } else if (!tenantId.equals(other.tenantId)) | |
160 | - return false; | |
161 | - if (title == null) { | |
162 | - if (other.title != null) | |
163 | - return false; | |
164 | - } else if (!title.equals(other.title)) | |
165 | - return false; | |
166 | - return true; | |
167 | - } | |
168 | - | |
169 | - @Override | |
170 | - public String toString() { | |
171 | - StringBuilder builder = new StringBuilder(); | |
172 | - builder.append("DashboardInfoEntity [id="); | |
173 | - builder.append(id); | |
174 | - builder.append(", tenantId="); | |
175 | - builder.append(tenantId); | |
176 | - builder.append(", customerId="); | |
177 | - builder.append(customerId); | |
178 | - builder.append(", title="); | |
179 | - builder.append(title); | |
180 | - builder.append(", searchText="); | |
181 | - builder.append(searchText); | |
182 | - builder.append("]"); | |
183 | - return builder.toString(); | |
184 | - } | |
185 | - | |
186 | - @Override | |
187 | 121 | public DashboardInfo toData() { |
188 | 122 | DashboardInfo dashboardInfo = new DashboardInfo(new DashboardId(id)); |
189 | 123 | dashboardInfo.setCreatedTime(UUIDs.unixTimestamp(id)); | ... | ... |