From c89a4e8d330cbc6beceda961d283763d27b4792c Mon Sep 17 00:00:00 2001 From: Andrew Shvayka Date: Mon, 26 Jun 2017 19:22:13 +0300 Subject: [PATCH 1/2] TB-67: Implementation --- .../device/DeviceActorMessageProcessor.java | 15 ++++-- .../actors/rule/ChainProcessingContext.java | 15 +++++- .../actors/rule/ChainProcessingMetaData.java | 11 ++-- .../rule/RuleActorMessageProcessor.java | 2 +- .../actors/rule/RuleProcessingContext.java | 11 ++-- .../extensions/api/device/DeviceMetaData.java | 34 ++++++++++++ .../extensions/api/rules/RuleContext.java | 3 +- .../AbstractTemplatePluginAction.java | 4 +- .../core/filter/DeviceAttributesFilter.java | 2 +- .../core/filter/DeviceTypeFilter.java | 52 +++++++++++++++++++ .../filter/DeviceTypeFilterConfiguration.java | 33 ++++++++++++ .../AlarmDeduplicationProcessor.java | 2 +- .../extensions/core/utils/VelocityUtils.java | 9 +++- .../resources/DeviceTypeFilterDescriptor.json | 28 ++++++++++ .../filter/DeviceAttributesFilterTest.java | 15 +++--- 15 files changed, 206 insertions(+), 30 deletions(-) create mode 100644 extensions-api/src/main/java/org/thingsboard/server/extensions/api/device/DeviceMetaData.java create mode 100644 extensions-core/src/main/java/org/thingsboard/server/extensions/core/filter/DeviceTypeFilter.java create mode 100644 extensions-core/src/main/java/org/thingsboard/server/extensions/core/filter/DeviceTypeFilterConfiguration.java create mode 100644 extensions-core/src/main/resources/DeviceTypeFilterDescriptor.json 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 0c73470d5c..10f5005b98 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 @@ -19,13 +19,11 @@ import akka.actor.ActorContext; import akka.actor.ActorRef; import akka.event.LoggingAdapter; import org.thingsboard.server.actors.ActorSystemContext; -import org.thingsboard.server.actors.rule.ChainProcessingContext; -import org.thingsboard.server.actors.rule.ChainProcessingMetaData; -import org.thingsboard.server.actors.rule.RuleProcessingMsg; -import org.thingsboard.server.actors.rule.RulesProcessedMsg; +import org.thingsboard.server.actors.rule.*; import org.thingsboard.server.actors.shared.AbstractContextAwareMsgProcessor; import org.thingsboard.server.actors.tenant.RuleChainDeviceMsg; 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.SessionId; import org.thingsboard.server.common.data.kv.AttributeKey; @@ -42,6 +40,7 @@ import org.thingsboard.server.common.msg.session.ToDeviceMsg; import org.thingsboard.server.extensions.api.device.DeviceAttributes; import org.thingsboard.server.extensions.api.device.DeviceAttributesEventNotificationMsg; import org.thingsboard.server.extensions.api.device.DeviceCredentialsUpdateNotificationMsg; +import org.thingsboard.server.extensions.api.device.DeviceMetaData; import org.thingsboard.server.extensions.api.plugins.msg.FromDeviceRpcResponse; import org.thingsboard.server.extensions.api.plugins.msg.RpcError; import org.thingsboard.server.extensions.api.plugins.msg.TimeoutIntMsg; @@ -71,6 +70,8 @@ public class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcesso private final Map rpcPendingMap; private int rpcSeq = 0; + private String deviceName; + private String deviceType; private DeviceAttributes deviceAttributes; public DeviceActorMessageProcessor(ActorSystemContext systemContext, LoggingAdapter logger, DeviceId deviceId) { @@ -84,6 +85,10 @@ public class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcesso } private void initAttributes() { + //TODO: add invalidation of deviceType cache. + Device device = systemContext.getDeviceService().findDeviceById(deviceId); + this.deviceName = device.getName(); + this.deviceType = device.getType(); this.deviceAttributes = new DeviceAttributes(fetchAttributes(DataConstants.CLIENT_SCOPE), fetchAttributes(DataConstants.SERVER_SCOPE), fetchAttributes(DataConstants.SHARED_SCOPE)); } @@ -230,7 +235,7 @@ public class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcesso void process(ActorContext context, RuleChainDeviceMsg srcMsg) { ChainProcessingMetaData md = new ChainProcessingMetaData(srcMsg.getRuleChain(), - srcMsg.getToDeviceActorMsg(), deviceAttributes, context.self()); + srcMsg.getToDeviceActorMsg(), new DeviceMetaData(deviceId, deviceName, deviceType, deviceAttributes), context.self()); ChainProcessingContext ctx = new ChainProcessingContext(md); if (ctx.getChainLength() > 0) { RuleProcessingMsg msg = new RuleProcessingMsg(ctx); diff --git a/application/src/main/java/org/thingsboard/server/actors/rule/ChainProcessingContext.java b/application/src/main/java/org/thingsboard/server/actors/rule/ChainProcessingContext.java index f178eec638..63043eebb6 100644 --- a/application/src/main/java/org/thingsboard/server/actors/rule/ChainProcessingContext.java +++ b/application/src/main/java/org/thingsboard/server/actors/rule/ChainProcessingContext.java @@ -21,6 +21,7 @@ import org.thingsboard.server.common.msg.core.RuleEngineErrorMsg; import org.thingsboard.server.common.msg.device.ToDeviceActorMsg; import org.thingsboard.server.common.msg.session.ToDeviceMsg; import org.thingsboard.server.extensions.api.device.DeviceAttributes; +import org.thingsboard.server.extensions.api.device.DeviceMetaData; public class ChainProcessingContext { @@ -85,8 +86,20 @@ public class ChainProcessingContext { return md.inMsg; } + public DeviceMetaData getDeviceMetaData() { + return md.deviceMetaData; + } + + public String getDeviceName() { + return md.deviceMetaData.getDeviceName(); + } + + public String getDeviceType() { + return md.deviceMetaData.getDeviceType(); + } + public DeviceAttributes getAttributes() { - return md.deviceAttributes; + return md.deviceMetaData.getDeviceAttributes(); } public ToDeviceMsg getResponse() { diff --git a/application/src/main/java/org/thingsboard/server/actors/rule/ChainProcessingMetaData.java b/application/src/main/java/org/thingsboard/server/actors/rule/ChainProcessingMetaData.java index c55e97cf2e..8fcbd4fe11 100644 --- a/application/src/main/java/org/thingsboard/server/actors/rule/ChainProcessingMetaData.java +++ b/application/src/main/java/org/thingsboard/server/actors/rule/ChainProcessingMetaData.java @@ -15,10 +15,9 @@ */ package org.thingsboard.server.actors.rule; -import org.thingsboard.server.extensions.api.device.DeviceAttributes; -import org.thingsboard.server.common.msg.device.ToDeviceActorMsg; - import akka.actor.ActorRef; +import org.thingsboard.server.common.msg.device.ToDeviceActorMsg; +import org.thingsboard.server.extensions.api.device.DeviceMetaData; /** * Immutable part of chain processing data; @@ -30,13 +29,13 @@ public final class ChainProcessingMetaData { final RuleActorChain chain; final ToDeviceActorMsg inMsg; final ActorRef originator; - final DeviceAttributes deviceAttributes; + final DeviceMetaData deviceMetaData; - public ChainProcessingMetaData(RuleActorChain chain, ToDeviceActorMsg inMsg, DeviceAttributes deviceAttributes, ActorRef originator) { + public ChainProcessingMetaData(RuleActorChain chain, ToDeviceActorMsg inMsg, DeviceMetaData deviceMetaData, ActorRef originator) { super(); this.chain = chain; this.inMsg = inMsg; this.originator = originator; - this.deviceAttributes = deviceAttributes; + this.deviceMetaData = deviceMetaData; } } diff --git a/application/src/main/java/org/thingsboard/server/actors/rule/RuleActorMessageProcessor.java b/application/src/main/java/org/thingsboard/server/actors/rule/RuleActorMessageProcessor.java index dccf971101..7a2b0e43a4 100644 --- a/application/src/main/java/org/thingsboard/server/actors/rule/RuleActorMessageProcessor.java +++ b/application/src/main/java/org/thingsboard/server/actors/rule/RuleActorMessageProcessor.java @@ -144,7 +144,7 @@ class RuleActorMessageProcessor extends ComponentMsgProcessor { ChainProcessingContext chainCtx = msg.getCtx(); ToDeviceActorMsg inMsg = chainCtx.getInMsg(); - ruleCtx.update(inMsg, chainCtx.getAttributes()); + ruleCtx.update(inMsg, chainCtx.getDeviceMetaData()); logger.debug("[{}] Going to filter in msg: {}", entityId, inMsg); for (RuleFilter filter : filters) { diff --git a/application/src/main/java/org/thingsboard/server/actors/rule/RuleProcessingContext.java b/application/src/main/java/org/thingsboard/server/actors/rule/RuleProcessingContext.java index cfd179db51..f425f8f8b3 100644 --- a/application/src/main/java/org/thingsboard/server/actors/rule/RuleProcessingContext.java +++ b/application/src/main/java/org/thingsboard/server/actors/rule/RuleProcessingContext.java @@ -22,6 +22,7 @@ import org.thingsboard.server.dao.event.EventService; import org.thingsboard.server.dao.timeseries.TimeseriesService; import org.thingsboard.server.extensions.api.device.DeviceAttributes; import org.thingsboard.server.common.msg.device.ToDeviceActorMsg; +import org.thingsboard.server.extensions.api.device.DeviceMetaData; import org.thingsboard.server.extensions.api.rules.RuleContext; import java.util.Optional; @@ -34,7 +35,7 @@ public class RuleProcessingContext implements RuleContext { private TenantId tenantId; private CustomerId customerId; private DeviceId deviceId; - private DeviceAttributes deviceAttributes; + private DeviceMetaData deviceMetaData; RuleProcessingContext(ActorSystemContext systemContext, RuleId ruleId) { this.tsService = systemContext.getTsService(); @@ -42,11 +43,11 @@ public class RuleProcessingContext implements RuleContext { this.ruleId = ruleId; } - void update(ToDeviceActorMsg toDeviceActorMsg, DeviceAttributes attributes) { + void update(ToDeviceActorMsg toDeviceActorMsg, DeviceMetaData deviceMetaData) { this.tenantId = toDeviceActorMsg.getTenantId(); this.customerId = toDeviceActorMsg.getCustomerId(); this.deviceId = toDeviceActorMsg.getDeviceId(); - this.deviceAttributes = attributes; + this.deviceMetaData = deviceMetaData; } @Override @@ -55,8 +56,8 @@ public class RuleProcessingContext implements RuleContext { } @Override - public DeviceAttributes getDeviceAttributes() { - return deviceAttributes; + public DeviceMetaData getDeviceMetaData() { + return deviceMetaData; } @Override diff --git a/extensions-api/src/main/java/org/thingsboard/server/extensions/api/device/DeviceMetaData.java b/extensions-api/src/main/java/org/thingsboard/server/extensions/api/device/DeviceMetaData.java new file mode 100644 index 0000000000..8e8ae1bf63 --- /dev/null +++ b/extensions-api/src/main/java/org/thingsboard/server/extensions/api/device/DeviceMetaData.java @@ -0,0 +1,34 @@ +/** + * Copyright © 2016-2017 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.extensions.api.device; + +import lombok.Data; +import org.thingsboard.server.common.data.id.DeviceId; + +/** + * Contains basic device metadata; + * + * @author ashvayka + */ +@Data +public final class DeviceMetaData { + + final DeviceId deviceId; + final String deviceName; + final String deviceType; + final DeviceAttributes deviceAttributes; + +} diff --git a/extensions-api/src/main/java/org/thingsboard/server/extensions/api/rules/RuleContext.java b/extensions-api/src/main/java/org/thingsboard/server/extensions/api/rules/RuleContext.java index c04ffed353..73f657635f 100644 --- a/extensions-api/src/main/java/org/thingsboard/server/extensions/api/rules/RuleContext.java +++ b/extensions-api/src/main/java/org/thingsboard/server/extensions/api/rules/RuleContext.java @@ -18,6 +18,7 @@ package org.thingsboard.server.extensions.api.rules; import org.thingsboard.server.common.data.Event; import org.thingsboard.server.common.data.id.RuleId; import org.thingsboard.server.extensions.api.device.DeviceAttributes; +import org.thingsboard.server.extensions.api.device.DeviceMetaData; import java.util.Optional; @@ -25,7 +26,7 @@ public interface RuleContext { RuleId getRuleId(); - DeviceAttributes getDeviceAttributes(); + DeviceMetaData getDeviceMetaData(); Event save(Event event); diff --git a/extensions-core/src/main/java/org/thingsboard/server/extensions/core/action/template/AbstractTemplatePluginAction.java b/extensions-core/src/main/java/org/thingsboard/server/extensions/core/action/template/AbstractTemplatePluginAction.java index 12958f5a3e..0274141278 100644 --- a/extensions-core/src/main/java/org/thingsboard/server/extensions/core/action/template/AbstractTemplatePluginAction.java +++ b/extensions-core/src/main/java/org/thingsboard/server/extensions/core/action/template/AbstractTemplatePluginAction.java @@ -71,8 +71,8 @@ public abstract class AbstractTemplatePluginAction { + + private Set deviceTypes; + + @Override + public void init(DeviceTypeFilterConfiguration configuration) { + deviceTypes = Arrays.stream(configuration.getDeviceTypes()) + .map(m -> m.getName()) + .collect(Collectors.toSet()); + } + + @Override + public boolean filter(RuleContext ctx, ToDeviceActorMsg msg) { + return deviceTypes.contains(ctx.getDeviceMetaData().getDeviceType()); + } +} diff --git a/extensions-core/src/main/java/org/thingsboard/server/extensions/core/filter/DeviceTypeFilterConfiguration.java b/extensions-core/src/main/java/org/thingsboard/server/extensions/core/filter/DeviceTypeFilterConfiguration.java new file mode 100644 index 0000000000..7906126e62 --- /dev/null +++ b/extensions-core/src/main/java/org/thingsboard/server/extensions/core/filter/DeviceTypeFilterConfiguration.java @@ -0,0 +1,33 @@ +/** + * Copyright © 2016-2017 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.extensions.core.filter; + +import lombok.Data; + +/** + * @author Andrew Shvayka + */ +@Data +public class DeviceTypeFilterConfiguration { + + private DeviceTypeName[] deviceTypes; + + @Data + public static class DeviceTypeName { + private String name; + } + +} diff --git a/extensions-core/src/main/java/org/thingsboard/server/extensions/core/processor/AlarmDeduplicationProcessor.java b/extensions-core/src/main/java/org/thingsboard/server/extensions/core/processor/AlarmDeduplicationProcessor.java index 0b4eb5da26..d7ebfec64e 100644 --- a/extensions-core/src/main/java/org/thingsboard/server/extensions/core/processor/AlarmDeduplicationProcessor.java +++ b/extensions-core/src/main/java/org/thingsboard/server/extensions/core/processor/AlarmDeduplicationProcessor.java @@ -59,7 +59,7 @@ public class AlarmDeduplicationProcessor extends SimpleRuleLifecycleComponent @Override public RuleProcessingMetaData process(RuleContext ctx, ToDeviceActorMsg msg) throws RuleException { RuleProcessingMetaData md = new RuleProcessingMetaData(); - VelocityContext context = VelocityUtils.createContext(ctx.getDeviceAttributes(), msg.getPayload()); + VelocityContext context = VelocityUtils.createContext(ctx.getDeviceMetaData(), msg.getPayload()); String alarmId = VelocityUtils.merge(alarmIdTemplate, context); String alarmBody = VelocityUtils.merge(alarmBodyTemplate, context); Optional existingEvent = ctx.findEvent(DataConstants.ALARM, alarmId); diff --git a/extensions-core/src/main/java/org/thingsboard/server/extensions/core/utils/VelocityUtils.java b/extensions-core/src/main/java/org/thingsboard/server/extensions/core/utils/VelocityUtils.java index db0b9520d0..6844234661 100644 --- a/extensions-core/src/main/java/org/thingsboard/server/extensions/core/utils/VelocityUtils.java +++ b/extensions-core/src/main/java/org/thingsboard/server/extensions/core/utils/VelocityUtils.java @@ -27,6 +27,7 @@ import org.thingsboard.server.common.data.kv.BasicTsKvEntry; import org.thingsboard.server.common.msg.core.TelemetryUploadRequest; import org.thingsboard.server.common.msg.session.FromDeviceMsg; import org.thingsboard.server.extensions.api.device.DeviceAttributes; +import org.thingsboard.server.extensions.api.device.DeviceMetaData; import org.thingsboard.server.extensions.api.rules.RuleProcessingMetaData; import org.thingsboard.server.extensions.core.filter.DeviceAttributesFilter; @@ -64,9 +65,11 @@ public class VelocityUtils { return context; } - public static VelocityContext createContext(DeviceAttributes deviceAttributes, FromDeviceMsg payload) { + public static VelocityContext createContext(DeviceMetaData deviceMetaData, FromDeviceMsg payload) { VelocityContext context = new VelocityContext(); context.put("date", new DateTool()); + DeviceAttributes deviceAttributes = deviceMetaData.getDeviceAttributes(); + pushAttributes(context, deviceAttributes.getClientSideAttributes(), DeviceAttributesFilter.CLIENT_SIDE); pushAttributes(context, deviceAttributes.getServerSideAttributes(), DeviceAttributesFilter.SERVER_SIDE); pushAttributes(context, deviceAttributes.getServerSidePublicAttributes(), DeviceAttributesFilter.SHARED); @@ -77,6 +80,10 @@ public class VelocityUtils { break; } + context.put("deviceId", deviceMetaData.getDeviceId().getId().toString()); + context.put("deviceName", deviceMetaData.getDeviceName()); + context.put("deviceType", deviceMetaData.getDeviceType()); + return context; } diff --git a/extensions-core/src/main/resources/DeviceTypeFilterDescriptor.json b/extensions-core/src/main/resources/DeviceTypeFilterDescriptor.json new file mode 100644 index 0000000000..9272d8c4d7 --- /dev/null +++ b/extensions-core/src/main/resources/DeviceTypeFilterDescriptor.json @@ -0,0 +1,28 @@ +{ + "schema": { + "title": "Device Type Filter Configuration", + "type": "object", + "properties": { + "deviceTypes": { + "title": "Device types", + "type": "array", + "minItems" : 1, + "items": { + "type": "object", + "title": "Device Type", + "properties": { + "name": { + "title": "Device Type", + "type": "string" + } + } + }, + "uniqueItems": true + } + }, + "required": ["deviceTypes"] + }, + "form": [ + "deviceTypes" + ] +} \ No newline at end of file diff --git a/extensions-core/src/test/java/org/thingsboard/server/extensions/core/filter/DeviceAttributesFilterTest.java b/extensions-core/src/test/java/org/thingsboard/server/extensions/core/filter/DeviceAttributesFilterTest.java index 5240fdef87..13199788ad 100644 --- a/extensions-core/src/test/java/org/thingsboard/server/extensions/core/filter/DeviceAttributesFilterTest.java +++ b/extensions-core/src/test/java/org/thingsboard/server/extensions/core/filter/DeviceAttributesFilterTest.java @@ -14,12 +14,14 @@ * limitations under the License. */ package org.thingsboard.server.extensions.core.filter; - +С +import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.kv.AttributeKvEntry; import org.thingsboard.server.common.data.kv.BaseAttributeKvEntry; import org.thingsboard.server.common.data.kv.BooleanDataEntry; import org.thingsboard.server.common.data.kv.DoubleDataEntry; import org.thingsboard.server.extensions.api.device.DeviceAttributes; +import org.thingsboard.server.extensions.api.device.DeviceMetaData; import org.thingsboard.server.extensions.api.rules.RuleContext; import org.junit.Assert; import org.junit.Test; @@ -30,6 +32,7 @@ import org.mockito.runners.MockitoJUnitRunner; import java.util.ArrayList; import java.util.List; +import java.util.UUID; /** * @author Andrew Shvayka @@ -52,7 +55,7 @@ public class DeviceAttributesFilterTest { clientAttributes.add(new BaseAttributeKvEntry(new BooleanDataEntry("booleanValue", false), 42)); DeviceAttributes attributes = new DeviceAttributes(clientAttributes, new ArrayList<>(), new ArrayList<>()); - Mockito.when(ruleCtx.getDeviceAttributes()).thenReturn(attributes); + Mockito.when(ruleCtx.getDeviceMetaData()).thenReturn(new DeviceMetaData(new DeviceId(UUID.randomUUID()), "A", "A", attributes)); Assert.assertTrue(filter.filter(ruleCtx, null)); filter.stop(); } @@ -66,7 +69,7 @@ public class DeviceAttributesFilterTest { clientAttributes.add(new BaseAttributeKvEntry(new BooleanDataEntry("booleanValue", false), 42)); DeviceAttributes attributes = new DeviceAttributes(clientAttributes, new ArrayList<>(), new ArrayList<>()); - Mockito.when(ruleCtx.getDeviceAttributes()).thenReturn(attributes); + Mockito.when(ruleCtx.getDeviceMetaData()).thenReturn(new DeviceMetaData(new DeviceId(UUID.randomUUID()), "A", "A", attributes)); Assert.assertTrue(filter.filter(ruleCtx, null)); filter.stop(); } @@ -81,7 +84,7 @@ public class DeviceAttributesFilterTest { clientAttributes.add(new BaseAttributeKvEntry(new BooleanDataEntry("booleanValue", false), 42)); DeviceAttributes attributes = new DeviceAttributes(clientAttributes, new ArrayList<>(), new ArrayList<>()); - Mockito.when(ruleCtx.getDeviceAttributes()).thenReturn(attributes); + Mockito.when(ruleCtx.getDeviceMetaData()).thenReturn(new DeviceMetaData(new DeviceId(UUID.randomUUID()), "A", "A", attributes)); for (int i = 0; i < 10000; i++) { Assert.assertTrue(filter.filter(ruleCtx, null)); @@ -99,7 +102,7 @@ public class DeviceAttributesFilterTest { serverAttributes.add(new BaseAttributeKvEntry(new BooleanDataEntry("booleanValue", false), 42)); DeviceAttributes attributes = new DeviceAttributes(new ArrayList<>(), serverAttributes, new ArrayList<>()); - Mockito.when(ruleCtx.getDeviceAttributes()).thenReturn(attributes); + Mockito.when(ruleCtx.getDeviceMetaData()).thenReturn(new DeviceMetaData(new DeviceId(UUID.randomUUID()), "A", "A", attributes)); Assert.assertTrue(filter.filter(ruleCtx, null)); filter.stop(); } @@ -118,7 +121,7 @@ public class DeviceAttributesFilterTest { serverAttributes.add(new BaseAttributeKvEntry(new BooleanDataEntry("booleanValue", false), 42)); DeviceAttributes attributes = new DeviceAttributes(clientAttributes, serverAttributes, new ArrayList<>()); - Mockito.when(ruleCtx.getDeviceAttributes()).thenReturn(attributes); + Mockito.when(ruleCtx.getDeviceMetaData()).thenReturn(new DeviceMetaData(new DeviceId(UUID.randomUUID()), "A", "A", attributes)); Assert.assertTrue(filter.filter(ruleCtx, null)); filter.stop(); } From b603f26fe9f81eb0eac8b6da623889ed6f8c1f61 Mon Sep 17 00:00:00 2001 From: Andrew Shvayka Date: Tue, 27 Jun 2017 14:17:06 +0300 Subject: [PATCH 2/2] TB-67: Implementation --- .../extensions/core/filter/DeviceAttributesFilterTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions-core/src/test/java/org/thingsboard/server/extensions/core/filter/DeviceAttributesFilterTest.java b/extensions-core/src/test/java/org/thingsboard/server/extensions/core/filter/DeviceAttributesFilterTest.java index 13199788ad..ab06ff0048 100644 --- a/extensions-core/src/test/java/org/thingsboard/server/extensions/core/filter/DeviceAttributesFilterTest.java +++ b/extensions-core/src/test/java/org/thingsboard/server/extensions/core/filter/DeviceAttributesFilterTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ package org.thingsboard.server.extensions.core.filter; -С + import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.kv.AttributeKvEntry; import org.thingsboard.server.common.data.kv.BaseAttributeKvEntry;