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