20 changed files with 519 additions and 237 deletions
@ -1,63 +0,0 @@ |
|||||
/** |
|
||||
* Copyright © 2016-2020 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.rule.engine.profile; |
|
||||
|
|
||||
import lombok.AccessLevel; |
|
||||
import lombok.Getter; |
|
||||
import org.thingsboard.server.common.data.DeviceProfile; |
|
||||
import org.thingsboard.server.common.data.device.profile.AlarmRule; |
|
||||
import org.thingsboard.server.common.data.device.profile.DeviceProfileAlarm; |
|
||||
import org.thingsboard.server.common.data.id.DeviceProfileId; |
|
||||
import org.thingsboard.server.common.data.query.EntityKey; |
|
||||
import org.thingsboard.server.common.data.query.KeyFilter; |
|
||||
|
|
||||
import java.util.List; |
|
||||
import java.util.Set; |
|
||||
import java.util.concurrent.ConcurrentHashMap; |
|
||||
import java.util.concurrent.CopyOnWriteArrayList; |
|
||||
|
|
||||
|
|
||||
class DeviceProfileState { |
|
||||
|
|
||||
private DeviceProfile deviceProfile; |
|
||||
@Getter(AccessLevel.PACKAGE) |
|
||||
private final List<DeviceProfileAlarm> alarmSettings = new CopyOnWriteArrayList<>(); |
|
||||
@Getter(AccessLevel.PACKAGE) |
|
||||
private final Set<EntityKey> entityKeys = ConcurrentHashMap.newKeySet(); |
|
||||
|
|
||||
DeviceProfileState(DeviceProfile deviceProfile) { |
|
||||
updateDeviceProfile(deviceProfile); |
|
||||
} |
|
||||
|
|
||||
void updateDeviceProfile(DeviceProfile deviceProfile) { |
|
||||
this.deviceProfile = deviceProfile; |
|
||||
alarmSettings.clear(); |
|
||||
if (deviceProfile.getProfileData().getAlarms() != null) { |
|
||||
alarmSettings.addAll(deviceProfile.getProfileData().getAlarms()); |
|
||||
for (DeviceProfileAlarm alarm : deviceProfile.getProfileData().getAlarms()) { |
|
||||
for (AlarmRule alarmRule : alarm.getCreateRules().values()) { |
|
||||
for (KeyFilter keyFilter : alarmRule.getCondition().getCondition()) { |
|
||||
entityKeys.add(keyFilter.getKey()); |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
public DeviceProfileId getProfileId() { |
|
||||
return deviceProfile.getId(); |
|
||||
} |
|
||||
} |
|
||||
@ -0,0 +1,137 @@ |
|||||
|
/** |
||||
|
* Copyright © 2016-2020 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.rule.engine.profile; |
||||
|
|
||||
|
import lombok.AccessLevel; |
||||
|
import lombok.Getter; |
||||
|
import org.thingsboard.server.common.data.DeviceProfile; |
||||
|
import org.thingsboard.server.common.data.alarm.AlarmSeverity; |
||||
|
import org.thingsboard.server.common.data.device.profile.AlarmRule; |
||||
|
import org.thingsboard.server.common.data.device.profile.DeviceProfileAlarm; |
||||
|
import org.thingsboard.server.common.data.id.DeviceProfileId; |
||||
|
import org.thingsboard.server.common.data.query.ComplexFilterPredicate; |
||||
|
import org.thingsboard.server.common.data.query.DynamicValue; |
||||
|
import org.thingsboard.server.common.data.query.DynamicValueSourceType; |
||||
|
import org.thingsboard.server.common.data.query.EntityKey; |
||||
|
import org.thingsboard.server.common.data.query.EntityKeyType; |
||||
|
import org.thingsboard.server.common.data.query.FilterPredicateValue; |
||||
|
import org.thingsboard.server.common.data.query.KeyFilter; |
||||
|
import org.thingsboard.server.common.data.query.KeyFilterPredicate; |
||||
|
import org.thingsboard.server.common.data.query.SimpleKeyFilterPredicate; |
||||
|
import org.thingsboard.server.common.data.query.StringFilterPredicate; |
||||
|
|
||||
|
import javax.print.attribute.standard.Severity; |
||||
|
import java.util.Collections; |
||||
|
import java.util.HashMap; |
||||
|
import java.util.HashSet; |
||||
|
import java.util.List; |
||||
|
import java.util.Map; |
||||
|
import java.util.Set; |
||||
|
import java.util.concurrent.ConcurrentHashMap; |
||||
|
import java.util.concurrent.CopyOnWriteArrayList; |
||||
|
|
||||
|
|
||||
|
class ProfileState { |
||||
|
|
||||
|
private DeviceProfile deviceProfile; |
||||
|
@Getter(AccessLevel.PACKAGE) |
||||
|
private final List<DeviceProfileAlarm> alarmSettings = new CopyOnWriteArrayList<>(); |
||||
|
@Getter(AccessLevel.PACKAGE) |
||||
|
private final Set<EntityKey> entityKeys = ConcurrentHashMap.newKeySet(); |
||||
|
|
||||
|
private final Map<String, Map<AlarmSeverity, Set<EntityKey>>> alarmCreateKeys = new HashMap<>(); |
||||
|
private final Map<String, Set<EntityKey>> alarmClearKeys = new HashMap<>(); |
||||
|
|
||||
|
ProfileState(DeviceProfile deviceProfile) { |
||||
|
updateDeviceProfile(deviceProfile); |
||||
|
} |
||||
|
|
||||
|
void updateDeviceProfile(DeviceProfile deviceProfile) { |
||||
|
this.deviceProfile = deviceProfile; |
||||
|
alarmSettings.clear(); |
||||
|
alarmCreateKeys.clear(); |
||||
|
alarmClearKeys.clear(); |
||||
|
if (deviceProfile.getProfileData().getAlarms() != null) { |
||||
|
alarmSettings.addAll(deviceProfile.getProfileData().getAlarms()); |
||||
|
for (DeviceProfileAlarm alarm : deviceProfile.getProfileData().getAlarms()) { |
||||
|
Map<AlarmSeverity, Set<EntityKey>> createAlarmKeys = alarmCreateKeys.computeIfAbsent(alarm.getId(), id -> new HashMap<>()); |
||||
|
alarm.getCreateRules().forEach(((severity, alarmRule) -> { |
||||
|
Set<EntityKey> ruleKeys = createAlarmKeys.computeIfAbsent(severity, id -> new HashSet<>()); |
||||
|
for (KeyFilter keyFilter : alarmRule.getCondition().getCondition()) { |
||||
|
entityKeys.add(keyFilter.getKey()); |
||||
|
ruleKeys.add(keyFilter.getKey()); |
||||
|
addDynamicValuesRecursively(keyFilter.getPredicate(), entityKeys, ruleKeys); |
||||
|
} |
||||
|
})); |
||||
|
if (alarm.getClearRule() != null) { |
||||
|
Set<EntityKey> clearAlarmKeys = alarmClearKeys.computeIfAbsent(alarm.getId(), id -> new HashSet<>()); |
||||
|
for (KeyFilter keyFilter : alarm.getClearRule().getCondition().getCondition()) { |
||||
|
entityKeys.add(keyFilter.getKey()); |
||||
|
clearAlarmKeys.add(keyFilter.getKey()); |
||||
|
addDynamicValuesRecursively(keyFilter.getPredicate(), entityKeys, clearAlarmKeys); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private void addDynamicValuesRecursively(KeyFilterPredicate predicate, Set<EntityKey> entityKeys, Set<EntityKey> ruleKeys) { |
||||
|
switch (predicate.getType()) { |
||||
|
case STRING: |
||||
|
case NUMERIC: |
||||
|
case BOOLEAN: |
||||
|
DynamicValue value = ((SimpleKeyFilterPredicate) predicate).getValue().getDynamicValue(); |
||||
|
if (value != null && value.getSourceType() == DynamicValueSourceType.CURRENT_DEVICE) { |
||||
|
EntityKey entityKey = new EntityKey(EntityKeyType.ATTRIBUTE, value.getSourceAttribute()); |
||||
|
entityKeys.add(entityKey); |
||||
|
ruleKeys.add(entityKey); |
||||
|
} |
||||
|
break; |
||||
|
case COMPLEX: |
||||
|
for (KeyFilterPredicate child : ((ComplexFilterPredicate) predicate).getPredicates()) { |
||||
|
addDynamicValuesRecursively(child, entityKeys, ruleKeys); |
||||
|
} |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
DeviceProfileId getProfileId() { |
||||
|
return deviceProfile.getId(); |
||||
|
} |
||||
|
|
||||
|
Set<EntityKey> getCreateAlarmKeys(String id, AlarmSeverity severity) { |
||||
|
Map<AlarmSeverity, Set<EntityKey>> sKeys = alarmCreateKeys.get(id); |
||||
|
if (sKeys == null) { |
||||
|
return Collections.emptySet(); |
||||
|
} else { |
||||
|
Set<EntityKey> keys = sKeys.get(severity); |
||||
|
if (keys == null) { |
||||
|
return Collections.emptySet(); |
||||
|
} else { |
||||
|
return keys; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
Set<EntityKey> getClearAlarmKeys(String id) { |
||||
|
Set<EntityKey> keys = alarmClearKeys.get(id); |
||||
|
if (keys == null) { |
||||
|
return Collections.emptySet(); |
||||
|
} else { |
||||
|
return keys; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue