From ab58776f04f9b115cc5b148c77746c59e2348cf1 Mon Sep 17 00:00:00 2001 From: ShvaykaD Date: Wed, 12 Dec 2018 20:02:39 +0200 Subject: [PATCH 1/5] getAttributes black-box-test --- .../device/DeviceActorMessageProcessor.java | 4 +- .../server/msa/AbstractContainerTest.java | 9 ++- .../msa/connectivity/HttpClientTest.java | 59 ++++++++++++++++++- tools/pom.xml | 1 - .../thingsboard/client/tools/RestClient.java | 41 +++++++++++++ 5 files changed, 107 insertions(+), 7 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/actors/device/DeviceActorMessageProcessor.java b/application/src/main/java/org/thingsboard/server/actors/device/DeviceActorMessageProcessor.java index e46a95972f..50a4f7d01b 100644 --- a/application/src/main/java/org/thingsboard/server/actors/device/DeviceActorMessageProcessor.java +++ b/application/src/main/java/org/thingsboard/server/actors/device/DeviceActorMessageProcessor.java @@ -16,7 +16,6 @@ package org.thingsboard.server.actors.device; import akka.actor.ActorContext; -import akka.event.LoggingAdapter; import com.datastax.driver.core.utils.UUIDs; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; @@ -42,7 +41,6 @@ import org.thingsboard.server.common.data.rpc.ToDeviceRpcRequestBody; import org.thingsboard.server.common.msg.TbMsg; import org.thingsboard.server.common.msg.TbMsgDataType; import org.thingsboard.server.common.msg.TbMsgMetaData; -import org.thingsboard.server.common.msg.cluster.ClusterEventMsg; import org.thingsboard.server.common.msg.rpc.ToDeviceRpcRequest; import org.thingsboard.server.common.msg.session.SessionMsgType; import org.thingsboard.server.common.msg.timeout.DeviceActorClientSideRpcTimeoutMsg; @@ -295,7 +293,7 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor { return systemContext.getAttributesService().findAll(tenantId, deviceId, scope); } } else { - return Futures.immediateFuture(Collections.emptyList()); + return systemContext.getAttributesService().findAll(tenantId, deviceId, scope); } } diff --git a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/AbstractContainerTest.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/AbstractContainerTest.java index 4c3ac8362c..bbabc2eb88 100644 --- a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/AbstractContainerTest.java +++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/AbstractContainerTest.java @@ -32,7 +32,8 @@ import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.apache.http.ssl.SSLContextBuilder; import org.apache.http.ssl.SSLContexts; -import org.junit.*; +import org.junit.BeforeClass; +import org.junit.Rule; import org.junit.rules.TestRule; import org.junit.rules.TestWatcher; import org.junit.runner.Description; @@ -43,7 +44,10 @@ import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.msa.mapper.WsTelemetryResponse; -import javax.net.ssl.*; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.net.ssl.SSLSocket; import java.net.URI; import java.security.cert.X509Certificate; import java.util.List; @@ -54,6 +58,7 @@ import java.util.Random; public abstract class AbstractContainerTest { protected static final String HTTPS_URL = "https://localhost"; protected static final String WSS_URL = "wss://localhost"; + protected static String TB_TOKEN; protected static RestClient restClient; protected ObjectMapper mapper = new ObjectMapper(); diff --git a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/connectivity/HttpClientTest.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/connectivity/HttpClientTest.java index a6e89de185..a5796cc69a 100644 --- a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/connectivity/HttpClientTest.java +++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/connectivity/HttpClientTest.java @@ -15,6 +15,7 @@ */ package org.thingsboard.server.msa.connectivity; +import com.fasterxml.jackson.databind.JsonNode; import com.google.common.collect.Sets; import org.junit.Assert; import org.junit.Test; @@ -25,6 +26,15 @@ import org.thingsboard.server.msa.AbstractContainerTest; import org.thingsboard.server.msa.WsClient; import org.thingsboard.server.msa.mapper.WsTelemetryResponse; + +import java.util.Optional; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.thingsboard.server.common.data.DataConstants.DEVICE; +import static org.thingsboard.server.common.data.DataConstants.SHARED_SCOPE; + public class HttpClientTest extends AbstractContainerTest { @Test @@ -52,6 +62,53 @@ public class HttpClientTest extends AbstractContainerTest { Assert.assertTrue(verify(actualLatestTelemetry, "doubleKey", Double.toString(42.0))); Assert.assertTrue(verify(actualLatestTelemetry, "longKey", Long.toString(73))); - restClient.getRestTemplate().delete(HTTPS_URL + "/api/device/" + device.getId()); + restClient.deleteDevice(device.getId()); + } + + @Test + public void getAttributes() throws Exception { + restClient.login("tenant@thingsboard.org", "tenant"); + TB_TOKEN = restClient.getToken(); + + Device device = createDevice("test"); + String accessToken = restClient.getCredentials(device.getId()).getCredentialsId(); + assertNotNull(accessToken); + + ResponseEntity deviceSharedAttributes = restClient.getRestTemplate() + .postForEntity(HTTPS_URL + "/api/plugins/telemetry/" + DEVICE + "/" + device.getId().toString() + "/attributes/" + SHARED_SCOPE, mapper.readTree(createPayload().toString()), + ResponseEntity.class, + accessToken); + + ResponseEntity deviceClientsAttributes = restClient.getRestTemplate() + .postForEntity(HTTPS_URL + "/api/v1/" + accessToken + "/attributes/", mapper.readTree(createPayload().toString()), + ResponseEntity.class, + accessToken); + + Assert.assertTrue(deviceSharedAttributes.getStatusCode().is2xxSuccessful()); + Assert.assertTrue(deviceClientsAttributes.getStatusCode().is2xxSuccessful()); + + Optional allOptional = restClient.getAttributes(accessToken, null, null); + assertTrue(allOptional.isPresent()); + + JsonNode all = allOptional.get(); + assertEquals(all.get("shared"), mapper.readTree(createPayload().toString())); + assertEquals(all.get("client"), mapper.readTree(createPayload().toString())); + + Optional sharedOptional = restClient.getAttributes(accessToken, null, "stringKey"); + assertTrue(sharedOptional.isPresent()); + + JsonNode shared = sharedOptional.get(); + assertEquals(shared.get("shared").get("stringKey"), mapper.readTree(createPayload().get("stringKey").toString())); + assertEquals(shared.get("client"), mapper.readTree(createPayload().toString())); + + Optional clientOptional = restClient.getAttributes(accessToken, "longKey,stringKey", null); + assertTrue(clientOptional.isPresent()); + + JsonNode client = clientOptional.get(); + assertEquals(client.get("shared"), mapper.readTree(createPayload().toString())); + assertEquals(client.get("client").get("longKey"), mapper.readTree(createPayload().get("longKey").toString())); + assertEquals(client.get("client").get("stringKey"), mapper.readTree(createPayload().get("stringKey").toString())); + + restClient.deleteDevice(device.getId()); } } diff --git a/tools/pom.xml b/tools/pom.xml index c1c1ded1d7..616d894a79 100644 --- a/tools/pom.xml +++ b/tools/pom.xml @@ -23,7 +23,6 @@ 2.2.1-SNAPSHOT thingsboard - org.thingsboard tools jar diff --git a/tools/src/main/java/org/thingsboard/client/tools/RestClient.java b/tools/src/main/java/org/thingsboard/client/tools/RestClient.java index 4c8c0a4f37..90bfc01dec 100644 --- a/tools/src/main/java/org/thingsboard/client/tools/RestClient.java +++ b/tools/src/main/java/org/thingsboard/client/tools/RestClient.java @@ -107,6 +107,27 @@ public class RestClient implements ClientHttpRequestInterceptor { } } + public Optional getAttributes(String accessToken, String clientKeys, String sharedKeys) { + Map params = new HashMap<>(); + params.put("accessToken", accessToken); + params.put("clientKeys", clientKeys); + params.put("sharedKeys", sharedKeys); + try { + ResponseEntity telemetryEntity = restTemplate.getForEntity(baseURL + "/api/v1/{accessToken}/attributes?clientKeys={clientKeys}&sharedKeys={sharedKeys}", JsonNode.class, params); + return Optional.of(telemetryEntity.getBody()); + } catch (HttpClientErrorException exception) { + if (exception.getStatusCode() == HttpStatus.NOT_FOUND) { + return Optional.empty(); + } else { + throw exception; + } + } + } + + public Customer createCustomer(Customer customer) { + return restTemplate.postForEntity(baseURL + "/api/customer", customer, Customer.class).getBody(); + } + public Customer createCustomer(String title) { Customer customer = new Customer(); customer.setTitle(title); @@ -120,6 +141,14 @@ public class RestClient implements ClientHttpRequestInterceptor { return restTemplate.postForEntity(baseURL + "/api/device", device, Device.class).getBody(); } + public Device createDevice(Device device) { + return restTemplate.postForEntity(baseURL + "/api/device", device, Device.class).getBody(); + } + + public Asset createAsset(Asset asset) { + return restTemplate.postForEntity(baseURL + "/api/asset", asset, Asset.class).getBody(); + } + public Asset createAsset(String name, String type) { Asset asset = new Asset(); asset.setName(name); @@ -131,6 +160,18 @@ public class RestClient implements ClientHttpRequestInterceptor { return restTemplate.postForEntity(baseURL + "/api/alarm", alarm, Alarm.class).getBody(); } + public void deleteCustomer(CustomerId customerId) { + restTemplate.delete(baseURL + "/api/customer/{customerId}", customerId); + } + + public void deleteDevice(DeviceId deviceId) { + restTemplate.delete(baseURL + "/api/device/{deviceId}", deviceId); + } + + public void deleteAsset(AssetId assetId) { + restTemplate.delete(baseURL + "/api/asset/{assetId}", assetId); + } + public Device assignDevice(CustomerId customerId, DeviceId deviceId) { return restTemplate.postForEntity(baseURL + "/api/customer/{customerId}/device/{deviceId}", null, Device.class, customerId.toString(), deviceId.toString()).getBody(); From 50f964e17a28f77eac1b735963b111f58e06b751 Mon Sep 17 00:00:00 2001 From: ShvaykaD Date: Fri, 14 Dec 2018 18:02:20 +0200 Subject: [PATCH 2/5] refactoring getAttributesKvEntries method --- .../device/DeviceActorMessageProcessor.java | 84 ++++++++++++++++--- 1 file changed, 72 insertions(+), 12 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/actors/device/DeviceActorMessageProcessor.java b/application/src/main/java/org/thingsboard/server/actors/device/DeviceActorMessageProcessor.java index 50a4f7d01b..6f66a77eb2 100644 --- a/application/src/main/java/org/thingsboard/server/actors/device/DeviceActorMessageProcessor.java +++ b/application/src/main/java/org/thingsboard/server/actors/device/DeviceActorMessageProcessor.java @@ -30,7 +30,6 @@ import org.thingsboard.rule.engine.api.msg.DeviceAttributesEventNotificationMsg; import org.thingsboard.rule.engine.api.msg.DeviceNameOrTypeUpdateMsg; import org.thingsboard.server.actors.ActorSystemContext; import org.thingsboard.server.actors.shared.AbstractContextAwareMsgProcessor; -import org.thingsboard.server.common.data.DataConstants; import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.TenantId; @@ -85,6 +84,9 @@ import java.util.UUID; import java.util.function.Consumer; import java.util.stream.Collectors; +import static org.thingsboard.server.common.data.DataConstants.CLIENT_SCOPE; +import static org.thingsboard.server.common.data.DataConstants.SHARED_SCOPE; + /** * @author Andrew Shvayka */ @@ -261,10 +263,8 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor { } private void handleGetAttributesRequest(ActorContext context, SessionInfoProto sessionInfo, GetAttributeRequestMsg request) { - ListenableFuture> clientAttributesFuture = getAttributeKvEntries(deviceId, DataConstants.CLIENT_SCOPE, toOptionalSet(request.getClientAttributeNamesList())); - ListenableFuture> sharedAttributesFuture = getAttributeKvEntries(deviceId, DataConstants.SHARED_SCOPE, toOptionalSet(request.getSharedAttributeNamesList())); int requestId = request.getRequestId(); - Futures.addCallback(Futures.allAsList(Arrays.asList(clientAttributesFuture, sharedAttributesFuture)), new FutureCallback>>() { + Futures.addCallback(getAttributesKvEntries(request), new FutureCallback>>() { @Override public void onSuccess(@Nullable List> result) { GetAttributeResponseMsg responseMsg = GetAttributeResponseMsg.newBuilder() @@ -285,16 +285,76 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor { }); } - private ListenableFuture> getAttributeKvEntries(DeviceId deviceId, String scope, Optional> names) { - if (names.isPresent()) { - if (!names.get().isEmpty()) { - return systemContext.getAttributesService().find(tenantId, deviceId, scope, names.get()); + private ListenableFuture>> getAttributesKvEntries(GetAttributeRequestMsg request) { + ListenableFuture> clientAttributesFuture; + ListenableFuture> sharedAttributesFuture; + if (!clientIsPresent(request) && !sharedIsPresent(request)) { + clientAttributesFuture = findAllClientAttributes(); + sharedAttributesFuture = findAllSharedAttributes(); + } else if (clientIsPresent(request) && sharedIsPresent(request)) { + if (clientIsNotEmpty(request) && sharedIsNotEmpty(request)) { + clientAttributesFuture = findClientAttributes(request); + sharedAttributesFuture = findSharedAttributes(request); } else { - return systemContext.getAttributesService().findAll(tenantId, deviceId, scope); + clientAttributesFuture = findAllClientAttributes(); + sharedAttributesFuture = findAllSharedAttributes(); } + } else if (clientIsPresent(request) && !sharedIsPresent(request)) { + if (clientIsNotEmpty(request)) { + clientAttributesFuture = findClientAttributes(request); + } else { + clientAttributesFuture = findAllClientAttributes(); + } + sharedAttributesFuture = Futures.immediateFuture(Collections.emptyList()); } else { - return systemContext.getAttributesService().findAll(tenantId, deviceId, scope); + if (sharedIsNotEmpty(request)) { + sharedAttributesFuture = findSharedAttributes(request); + } else { + sharedAttributesFuture = findAllSharedAttributes(); + } + clientAttributesFuture = Futures.immediateFuture(Collections.emptyList()); } + return Futures.allAsList(Arrays.asList(clientAttributesFuture, sharedAttributesFuture)); + } + + private ListenableFuture> findAllSharedAttributes() { + return systemContext.getAttributesService().findAll(tenantId, deviceId, SHARED_SCOPE); + } + + private ListenableFuture> findAllClientAttributes() { + return systemContext.getAttributesService().findAll(tenantId, deviceId, CLIENT_SCOPE); + } + + private ListenableFuture> findSharedAttributes(GetAttributeRequestMsg request) { + return systemContext.getAttributesService().find(tenantId, deviceId, SHARED_SCOPE, getSharedAttributesSet(request)); + } + + private ListenableFuture> findClientAttributes(GetAttributeRequestMsg request) { + return systemContext.getAttributesService().find(tenantId, deviceId, CLIENT_SCOPE, getClientAttributesSet(request)); + } + + private boolean clientIsNotEmpty(GetAttributeRequestMsg request) { + return !getClientAttributesSet(request).isEmpty(); + } + + private boolean sharedIsNotEmpty(GetAttributeRequestMsg request) { + return !getSharedAttributesSet(request).isEmpty(); + } + + private Set getSharedAttributesSet(GetAttributeRequestMsg request) { + return toOptionalSet(request.getSharedAttributeNamesList()).get(); + } + + private Set getClientAttributesSet(GetAttributeRequestMsg request) { + return toOptionalSet(request.getClientAttributeNamesList()).get(); + } + + private boolean sharedIsPresent(GetAttributeRequestMsg request) { + return toOptionalSet(request.getSharedAttributeNamesList()).isPresent(); + } + + private boolean clientIsPresent(GetAttributeRequestMsg request) { + return toOptionalSet(request.getClientAttributeNamesList()).isPresent(); } private void handlePostAttributesRequest(ActorContext context, SessionInfoProto sessionInfo, PostAttributeMsg postAttributes) { @@ -366,7 +426,7 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor { AttributeUpdateNotificationMsg.Builder notification = AttributeUpdateNotificationMsg.newBuilder(); if (msg.isDeleted()) { List sharedKeys = msg.getDeletedKeys().stream() - .filter(key -> DataConstants.SHARED_SCOPE.equals(key.getScope())) + .filter(key -> SHARED_SCOPE.equals(key.getScope())) .map(AttributeKey::getAttributeKey) .collect(Collectors.toList()); if (!sharedKeys.isEmpty()) { @@ -374,7 +434,7 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor { hasNotificationData = true; } } else { - if (DataConstants.SHARED_SCOPE.equals(msg.getScope())) { + if (SHARED_SCOPE.equals(msg.getScope())) { List attributes = new ArrayList<>(msg.getValues()); if (attributes.size() > 0) { List sharedUpdated = msg.getValues().stream().map(this::toTsKvProto) From 5291afda8a9f39fcc8f03e2f3e5a729369b0d15b Mon Sep 17 00:00:00 2001 From: ShvaykaD Date: Tue, 18 Dec 2018 14:49:49 +0200 Subject: [PATCH 3/5] refactoring getAttributes() test --- .../msa/connectivity/HttpClientTest.java | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/connectivity/HttpClientTest.java b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/connectivity/HttpClientTest.java index a5796cc69a..bb3380f554 100644 --- a/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/connectivity/HttpClientTest.java +++ b/msa/black-box-tests/src/test/java/org/thingsboard/server/msa/connectivity/HttpClientTest.java @@ -28,8 +28,10 @@ import org.thingsboard.server.msa.mapper.WsTelemetryResponse; import java.util.Optional; +import java.util.concurrent.TimeUnit; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.thingsboard.server.common.data.DataConstants.DEVICE; @@ -79,34 +81,39 @@ public class HttpClientTest extends AbstractContainerTest { ResponseEntity.class, accessToken); + Assert.assertTrue(deviceSharedAttributes.getStatusCode().is2xxSuccessful()); + ResponseEntity deviceClientsAttributes = restClient.getRestTemplate() .postForEntity(HTTPS_URL + "/api/v1/" + accessToken + "/attributes/", mapper.readTree(createPayload().toString()), ResponseEntity.class, accessToken); - Assert.assertTrue(deviceSharedAttributes.getStatusCode().is2xxSuccessful()); Assert.assertTrue(deviceClientsAttributes.getStatusCode().is2xxSuccessful()); + TimeUnit.SECONDS.sleep(3); + Optional allOptional = restClient.getAttributes(accessToken, null, null); assertTrue(allOptional.isPresent()); + JsonNode all = allOptional.get(); - assertEquals(all.get("shared"), mapper.readTree(createPayload().toString())); - assertEquals(all.get("client"), mapper.readTree(createPayload().toString())); + assertEquals(2, all.size()); + assertEquals(mapper.readTree(createPayload().toString()), all.get("shared")); + assertEquals(mapper.readTree(createPayload().toString()), all.get("client")); Optional sharedOptional = restClient.getAttributes(accessToken, null, "stringKey"); assertTrue(sharedOptional.isPresent()); JsonNode shared = sharedOptional.get(); assertEquals(shared.get("shared").get("stringKey"), mapper.readTree(createPayload().get("stringKey").toString())); - assertEquals(shared.get("client"), mapper.readTree(createPayload().toString())); + assertFalse(shared.has("client")); Optional clientOptional = restClient.getAttributes(accessToken, "longKey,stringKey", null); assertTrue(clientOptional.isPresent()); JsonNode client = clientOptional.get(); - assertEquals(client.get("shared"), mapper.readTree(createPayload().toString())); - assertEquals(client.get("client").get("longKey"), mapper.readTree(createPayload().get("longKey").toString())); + assertFalse(client.has("shared")); + assertEquals(mapper.readTree(createPayload().get("longKey").toString()), client.get("client").get("longKey")); assertEquals(client.get("client").get("stringKey"), mapper.readTree(createPayload().get("stringKey").toString())); restClient.deleteDevice(device.getId()); From c2d754f9d804cd27209796c2cf579fa390def0e8 Mon Sep 17 00:00:00 2001 From: ShvaykaD Date: Thu, 20 Dec 2018 16:48:47 +0200 Subject: [PATCH 4/5] refactoring getAttributesKvEntries method --- .../device/DeviceActorMessageProcessor.java | 84 +++++-------------- 1 file changed, 19 insertions(+), 65 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/actors/device/DeviceActorMessageProcessor.java b/application/src/main/java/org/thingsboard/server/actors/device/DeviceActorMessageProcessor.java index 6f66a77eb2..b250988369 100644 --- a/application/src/main/java/org/thingsboard/server/actors/device/DeviceActorMessageProcessor.java +++ b/application/src/main/java/org/thingsboard/server/actors/device/DeviceActorMessageProcessor.java @@ -78,7 +78,6 @@ import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.Optional; import java.util.Set; import java.util.UUID; import java.util.function.Consumer; @@ -288,73 +287,36 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor { private ListenableFuture>> getAttributesKvEntries(GetAttributeRequestMsg request) { ListenableFuture> clientAttributesFuture; ListenableFuture> sharedAttributesFuture; - if (!clientIsPresent(request) && !sharedIsPresent(request)) { - clientAttributesFuture = findAllClientAttributes(); - sharedAttributesFuture = findAllSharedAttributes(); - } else if (clientIsPresent(request) && sharedIsPresent(request)) { - if (clientIsNotEmpty(request) && sharedIsNotEmpty(request)) { - clientAttributesFuture = findClientAttributes(request); - sharedAttributesFuture = findSharedAttributes(request); - } else { - clientAttributesFuture = findAllClientAttributes(); - sharedAttributesFuture = findAllSharedAttributes(); - } - } else if (clientIsPresent(request) && !sharedIsPresent(request)) { - if (clientIsNotEmpty(request)) { - clientAttributesFuture = findClientAttributes(request); - } else { - clientAttributesFuture = findAllClientAttributes(); - } - sharedAttributesFuture = Futures.immediateFuture(Collections.emptyList()); - } else { - if (sharedIsNotEmpty(request)) { - sharedAttributesFuture = findSharedAttributes(request); - } else { - sharedAttributesFuture = findAllSharedAttributes(); - } + if (listIsEmpty(request.getClientAttributeNamesList()) && listIsEmpty(request.getSharedAttributeNamesList())) { + clientAttributesFuture = findAllAttributesByScope(CLIENT_SCOPE); + sharedAttributesFuture = findAllAttributesByScope(SHARED_SCOPE); + } else if (!listIsEmpty(request.getClientAttributeNamesList()) && !listIsEmpty(request.getSharedAttributeNamesList())) { + clientAttributesFuture = findAttributesByScope(toSet(request.getClientAttributeNamesList()), CLIENT_SCOPE); + sharedAttributesFuture = findAttributesByScope(toSet(request.getSharedAttributeNamesList()), SHARED_SCOPE); + } else if (listIsEmpty(request.getClientAttributeNamesList()) && !listIsEmpty(request.getSharedAttributeNamesList())) { clientAttributesFuture = Futures.immediateFuture(Collections.emptyList()); + sharedAttributesFuture = findAttributesByScope(toSet(request.getSharedAttributeNamesList()), SHARED_SCOPE); + } else { + sharedAttributesFuture = Futures.immediateFuture(Collections.emptyList()); + clientAttributesFuture = findAttributesByScope(toSet(request.getClientAttributeNamesList()), CLIENT_SCOPE); } return Futures.allAsList(Arrays.asList(clientAttributesFuture, sharedAttributesFuture)); } - private ListenableFuture> findAllSharedAttributes() { - return systemContext.getAttributesService().findAll(tenantId, deviceId, SHARED_SCOPE); + private ListenableFuture> findAllAttributesByScope(String scope) { + return systemContext.getAttributesService().findAll(tenantId, deviceId, scope); } - private ListenableFuture> findAllClientAttributes() { - return systemContext.getAttributesService().findAll(tenantId, deviceId, CLIENT_SCOPE); + private ListenableFuture> findAttributesByScope(Set attributesSet, String scope) { + return systemContext.getAttributesService().find(tenantId, deviceId, scope, attributesSet); } - private ListenableFuture> findSharedAttributes(GetAttributeRequestMsg request) { - return systemContext.getAttributesService().find(tenantId, deviceId, SHARED_SCOPE, getSharedAttributesSet(request)); + private Set toSet(List strings) { + return new HashSet<>(strings); } - private ListenableFuture> findClientAttributes(GetAttributeRequestMsg request) { - return systemContext.getAttributesService().find(tenantId, deviceId, CLIENT_SCOPE, getClientAttributesSet(request)); - } - - private boolean clientIsNotEmpty(GetAttributeRequestMsg request) { - return !getClientAttributesSet(request).isEmpty(); - } - - private boolean sharedIsNotEmpty(GetAttributeRequestMsg request) { - return !getSharedAttributesSet(request).isEmpty(); - } - - private Set getSharedAttributesSet(GetAttributeRequestMsg request) { - return toOptionalSet(request.getSharedAttributeNamesList()).get(); - } - - private Set getClientAttributesSet(GetAttributeRequestMsg request) { - return toOptionalSet(request.getClientAttributeNamesList()).get(); - } - - private boolean sharedIsPresent(GetAttributeRequestMsg request) { - return toOptionalSet(request.getSharedAttributeNamesList()).isPresent(); - } - - private boolean clientIsPresent(GetAttributeRequestMsg request) { - return toOptionalSet(request.getClientAttributeNamesList()).isPresent(); + private boolean listIsEmpty(List strings) { + return strings == null || strings.isEmpty(); } private void handlePostAttributesRequest(ActorContext context, SessionInfoProto sessionInfo, PostAttributeMsg postAttributes) { @@ -603,14 +565,6 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor { return json; } - private Optional> toOptionalSet(List strings) { - if (strings == null || strings.isEmpty()) { - return Optional.empty(); - } else { - return Optional.of(new HashSet<>(strings)); - } - } - private void sendToTransport(GetAttributeResponseMsg responseMsg, SessionInfoProto sessionInfo) { DeviceActorToTransportMsg msg = DeviceActorToTransportMsg.newBuilder() .setSessionIdMSB(sessionInfo.getSessionIdMSB()) From 379682a4adde5a0ed5aae8fa87daffd8e1ec8204 Mon Sep 17 00:00:00 2001 From: ShvaykaD Date: Thu, 20 Dec 2018 17:20:37 +0200 Subject: [PATCH 5/5] refactoring DeviceActorMessageProcessor.java --- .../actors/device/DeviceActorMessageProcessor.java | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/actors/device/DeviceActorMessageProcessor.java b/application/src/main/java/org/thingsboard/server/actors/device/DeviceActorMessageProcessor.java index b250988369..c0030cbf6d 100644 --- a/application/src/main/java/org/thingsboard/server/actors/device/DeviceActorMessageProcessor.java +++ b/application/src/main/java/org/thingsboard/server/actors/device/DeviceActorMessageProcessor.java @@ -25,6 +25,7 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.protobuf.InvalidProtocolBufferException; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; import org.thingsboard.rule.engine.api.RpcError; import org.thingsboard.rule.engine.api.msg.DeviceAttributesEventNotificationMsg; import org.thingsboard.rule.engine.api.msg.DeviceNameOrTypeUpdateMsg; @@ -287,13 +288,13 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor { private ListenableFuture>> getAttributesKvEntries(GetAttributeRequestMsg request) { ListenableFuture> clientAttributesFuture; ListenableFuture> sharedAttributesFuture; - if (listIsEmpty(request.getClientAttributeNamesList()) && listIsEmpty(request.getSharedAttributeNamesList())) { + if (CollectionUtils.isEmpty(request.getClientAttributeNamesList()) && CollectionUtils.isEmpty(request.getSharedAttributeNamesList())) { clientAttributesFuture = findAllAttributesByScope(CLIENT_SCOPE); sharedAttributesFuture = findAllAttributesByScope(SHARED_SCOPE); - } else if (!listIsEmpty(request.getClientAttributeNamesList()) && !listIsEmpty(request.getSharedAttributeNamesList())) { + } else if (!CollectionUtils.isEmpty(request.getClientAttributeNamesList()) && !CollectionUtils.isEmpty(request.getSharedAttributeNamesList())) { clientAttributesFuture = findAttributesByScope(toSet(request.getClientAttributeNamesList()), CLIENT_SCOPE); sharedAttributesFuture = findAttributesByScope(toSet(request.getSharedAttributeNamesList()), SHARED_SCOPE); - } else if (listIsEmpty(request.getClientAttributeNamesList()) && !listIsEmpty(request.getSharedAttributeNamesList())) { + } else if (CollectionUtils.isEmpty(request.getClientAttributeNamesList()) && !CollectionUtils.isEmpty(request.getSharedAttributeNamesList())) { clientAttributesFuture = Futures.immediateFuture(Collections.emptyList()); sharedAttributesFuture = findAttributesByScope(toSet(request.getSharedAttributeNamesList()), SHARED_SCOPE); } else { @@ -315,10 +316,6 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor { return new HashSet<>(strings); } - private boolean listIsEmpty(List strings) { - return strings == null || strings.isEmpty(); - } - private void handlePostAttributesRequest(ActorContext context, SessionInfoProto sessionInfo, PostAttributeMsg postAttributes) { JsonObject json = getJsonObject(postAttributes.getKvList()); TbMsg tbMsg = new TbMsg(UUIDs.timeBased(), SessionMsgType.POST_ATTRIBUTES_REQUEST.name(), deviceId, defaultMetaData.copy(),