fixed NPE
This commit is contained in:
		
							parent
							
								
									652071fdb7
								
							
						
					
					
						commit
						634bf0ff0f
					
				@ -229,7 +229,7 @@ class AlarmRuleState {
 | 
			
		||||
        long repeatingTimes = 0;
 | 
			
		||||
        AlarmConditionSpec alarmConditionSpec = getSpec();
 | 
			
		||||
        AlarmConditionSpecType specType = alarmConditionSpec.getType();
 | 
			
		||||
        if(specType.equals(AlarmConditionSpecType.REPEATING)) {
 | 
			
		||||
        if (specType.equals(AlarmConditionSpecType.REPEATING)) {
 | 
			
		||||
            RepeatingAlarmConditionSpec repeating = (RepeatingAlarmConditionSpec) spec;
 | 
			
		||||
 | 
			
		||||
            repeatingTimes = repeating.getPredicate().getDefaultValue();
 | 
			
		||||
@ -238,7 +238,13 @@ class AlarmRuleState {
 | 
			
		||||
                    repeating.getPredicate().getDynamicValue().getSourceAttribute() != null) {
 | 
			
		||||
                EntityKeyValue repeatingKeyValue = getDynamicPredicateValue(data, repeating.getPredicate().getDynamicValue());
 | 
			
		||||
                if (repeatingKeyValue != null) {
 | 
			
		||||
                    repeatingTimes = repeatingKeyValue.getLngValue();
 | 
			
		||||
                    var longValue = getLongValue(repeatingKeyValue);
 | 
			
		||||
                    if (longValue != null) {
 | 
			
		||||
                        repeatingTimes = longValue;
 | 
			
		||||
                    } else {
 | 
			
		||||
                        String sourceAttribute = repeating.getPredicate().getDynamicValue().getSourceAttribute();
 | 
			
		||||
                        throw new NumericParseException(String.format("could not parse attribute [%s: %s] from source!", sourceAttribute, getStrValue(repeatingKeyValue)));
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@ -249,7 +255,7 @@ class AlarmRuleState {
 | 
			
		||||
        long durationTimeInMs = 0;
 | 
			
		||||
        AlarmConditionSpec alarmConditionSpec = getSpec();
 | 
			
		||||
        AlarmConditionSpecType specType = alarmConditionSpec.getType();
 | 
			
		||||
        if(specType.equals(AlarmConditionSpecType.DURATION)) {
 | 
			
		||||
        if (specType.equals(AlarmConditionSpecType.DURATION)) {
 | 
			
		||||
            DurationAlarmConditionSpec duration = (DurationAlarmConditionSpec) spec;
 | 
			
		||||
            TimeUnit timeUnit = duration.getUnit();
 | 
			
		||||
 | 
			
		||||
@ -259,7 +265,13 @@ class AlarmRuleState {
 | 
			
		||||
                    duration.getPredicate().getDynamicValue().getSourceAttribute() != null) {
 | 
			
		||||
                EntityKeyValue durationKeyValue = getDynamicPredicateValue(data, duration.getPredicate().getDynamicValue());
 | 
			
		||||
                if (durationKeyValue != null) {
 | 
			
		||||
                    durationTimeInMs = timeUnit.toMillis(durationKeyValue.getLngValue());
 | 
			
		||||
                    var longValue = getLongValue(durationKeyValue);
 | 
			
		||||
                    if (longValue != null) {
 | 
			
		||||
                        durationTimeInMs = timeUnit.toMillis(longValue);
 | 
			
		||||
                    } else {
 | 
			
		||||
                        String sourceAttribute = duration.getPredicate().getDynamicValue().getSourceAttribute();
 | 
			
		||||
                        throw new NumericParseException(String.format("could not parse attribute [%s: %s] from source!", sourceAttribute, getStrValue(durationKeyValue)));
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@ -545,4 +557,28 @@ class AlarmRuleState {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static Long getLongValue(EntityKeyValue ekv) {
 | 
			
		||||
        switch (ekv.getDataType()) {
 | 
			
		||||
            case LONG:
 | 
			
		||||
                return ekv.getLngValue();
 | 
			
		||||
            case DOUBLE:
 | 
			
		||||
                return ekv.getDblValue() != null ? ekv.getDblValue().longValue() : null;
 | 
			
		||||
            case BOOLEAN:
 | 
			
		||||
                return ekv.getBoolValue() != null ? (ekv.getBoolValue() ? 1 : 0L) : null;
 | 
			
		||||
            case STRING:
 | 
			
		||||
                try {
 | 
			
		||||
                    return Long.parseLong(ekv.getStrValue());
 | 
			
		||||
                } catch (RuntimeException e) {
 | 
			
		||||
                    return null;
 | 
			
		||||
                }
 | 
			
		||||
            case JSON:
 | 
			
		||||
                try {
 | 
			
		||||
                    return Long.parseLong(ekv.getJsonValue());
 | 
			
		||||
                } catch (RuntimeException e) {
 | 
			
		||||
                    return null;
 | 
			
		||||
                }
 | 
			
		||||
            default:
 | 
			
		||||
                return null;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -51,6 +51,7 @@ import java.util.function.BiFunction;
 | 
			
		||||
@Slf4j
 | 
			
		||||
class AlarmState {
 | 
			
		||||
 | 
			
		||||
    public static final String ERROR_MSG = "Failed to process alarm state for Device [%s]: %s";
 | 
			
		||||
    private final ProfileState deviceProfile;
 | 
			
		||||
    private final EntityId originator;
 | 
			
		||||
    private DeviceProfileAlarm alarmDefinition;
 | 
			
		||||
@ -75,12 +76,20 @@ class AlarmState {
 | 
			
		||||
        lastMsgMetaData = msg.getMetaData();
 | 
			
		||||
        lastMsgQueueName = msg.getQueueName();
 | 
			
		||||
        this.dataSnapshot = data;
 | 
			
		||||
        try {
 | 
			
		||||
            return createOrClearAlarms(ctx, msg, data, update, AlarmRuleState::eval);
 | 
			
		||||
        } catch (NumericParseException e) {
 | 
			
		||||
            throw new RuntimeException(String.format(ERROR_MSG, originator.getId().toString(), e.getMessage()));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean process(TbContext ctx, long ts) throws ExecutionException, InterruptedException {
 | 
			
		||||
        initCurrentAlarm(ctx);
 | 
			
		||||
        try {
 | 
			
		||||
            return createOrClearAlarms(ctx, null, ts, null, (alarmState, tsParam) -> alarmState.eval(tsParam, dataSnapshot));
 | 
			
		||||
        } catch (NumericParseException e) {
 | 
			
		||||
            throw new RuntimeException(String.format(ERROR_MSG, originator.getId().toString(), e.getMessage()));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public <T> boolean createOrClearAlarms(TbContext ctx, TbMsg msg, T data, SnapshotUpdate update, BiFunction<AlarmRuleState, T, AlarmEvalResult> evalFunction) {
 | 
			
		||||
 | 
			
		||||
@ -0,0 +1,22 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Copyright © 2016-2022 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;
 | 
			
		||||
 | 
			
		||||
public class NumericParseException extends RuntimeException {
 | 
			
		||||
    public NumericParseException(String message) {
 | 
			
		||||
        super(message);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user