Add support of configurable perimeter key name while fetching perimeter from metadata.

This commit is contained in:
Andrii Shvaika 2022-02-07 12:13:53 +02:00
parent c7aafe4ddd
commit 8a50270feb
2 changed files with 47 additions and 24 deletions

View File

@ -20,7 +20,8 @@ import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import org.locationtech.spatial4j.context.jts.JtsSpatialContext;
import org.locationtech.spatial4j.context.jts.JtsSpatialContextFactory;
import org.springframework.util.StringUtils;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.rule.engine.api.TbContext;
import org.thingsboard.rule.engine.api.TbNode;
import org.thingsboard.rule.engine.api.TbNodeConfiguration;
@ -79,22 +80,46 @@ public abstract class AbstractGeofencingNode<T extends TbGpsGeofencingFilterNode
protected List<Perimeter> getPerimeters(TbMsg msg, JsonObject msgDataObj) throws TbNodeException {
if (config.isFetchPerimeterInfoFromMessageMetadata()) {
//TODO: add fetching perimeters from the message itself, if configuration is empty.
if (!StringUtils.isEmpty(msg.getMetaData().getValue("perimeter"))) {
Perimeter perimeter = new Perimeter();
perimeter.setPerimeterType(PerimeterType.POLYGON);
perimeter.setPolygonsDefinition(msg.getMetaData().getValue("perimeter"));
return Collections.singletonList(perimeter);
} else if (!StringUtils.isEmpty(msg.getMetaData().getValue("centerLatitude"))) {
Perimeter perimeter = new Perimeter();
perimeter.setPerimeterType(PerimeterType.CIRCLE);
perimeter.setCenterLatitude(Double.parseDouble(msg.getMetaData().getValue("centerLatitude")));
perimeter.setCenterLongitude(Double.parseDouble(msg.getMetaData().getValue("centerLongitude")));
perimeter.setRange(Double.parseDouble(msg.getMetaData().getValue("range")));
perimeter.setRangeUnit(RangeUnit.valueOf(msg.getMetaData().getValue("rangeUnit")));
return Collections.singletonList(perimeter);
if (StringUtils.isEmpty(config.getPerimeterKeyName())) {
// Old configuration before "perimeterKeyName" was introduced
String perimeterValue = msg.getMetaData().getValue("perimeter");
if (!StringUtils.isEmpty(perimeterValue)) {
Perimeter perimeter = new Perimeter();
perimeter.setPerimeterType(PerimeterType.POLYGON);
perimeter.setPolygonsDefinition(perimeterValue);
return Collections.singletonList(perimeter);
} else if (!StringUtils.isEmpty(msg.getMetaData().getValue("centerLatitude"))) {
Perimeter perimeter = new Perimeter();
perimeter.setPerimeterType(PerimeterType.CIRCLE);
perimeter.setCenterLatitude(Double.parseDouble(msg.getMetaData().getValue("centerLatitude")));
perimeter.setCenterLongitude(Double.parseDouble(msg.getMetaData().getValue("centerLongitude")));
perimeter.setRange(Double.parseDouble(msg.getMetaData().getValue("range")));
perimeter.setRangeUnit(RangeUnit.valueOf(msg.getMetaData().getValue("rangeUnit")));
return Collections.singletonList(perimeter);
} else {
throw new TbNodeException("Missing perimeter definition!");
}
} else {
throw new TbNodeException("Missing perimeter definition!");
String perimeterValue = msg.getMetaData().getValue(config.getPerimeterKeyName());
if (!StringUtils.isEmpty(perimeterValue)) {
if (config.getPerimeterType().equals(PerimeterType.POLYGON)) {
Perimeter perimeter = new Perimeter();
perimeter.setPerimeterType(PerimeterType.POLYGON);
perimeter.setPolygonsDefinition(perimeterValue);
return Collections.singletonList(perimeter);
} else {
var circleDef = JacksonUtil.toJsonNode(perimeterValue);
Perimeter perimeter = new Perimeter();
perimeter.setPerimeterType(PerimeterType.CIRCLE);
perimeter.setCenterLatitude(circleDef.get("latitude").asDouble());
perimeter.setCenterLongitude(circleDef.get("longitude").asDouble());
perimeter.setRange(circleDef.get("radius").asDouble());
perimeter.setRangeUnit(circleDef.has("radiusUnit") ? RangeUnit.valueOf(circleDef.get("radiusUnit").asText()) : RangeUnit.METER);
return Collections.singletonList(perimeter);
}
} else {
throw new TbNodeException("Missing perimeter definition!");
}
}
} else {
Perimeter perimeter = new Perimeter();

View File

@ -17,12 +17,6 @@ package org.thingsboard.rule.engine.geo;
import lombok.Data;
import org.thingsboard.rule.engine.api.NodeConfiguration;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.msg.session.SessionMsgType;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* Created by ashvayka on 19.01.18.
@ -32,10 +26,12 @@ public class TbGpsGeofencingFilterNodeConfiguration implements NodeConfiguration
private String latitudeKeyName;
private String longitudeKeyName;
private boolean fetchPerimeterInfoFromMessageMetadata;
private PerimeterType perimeterType;
private boolean fetchPerimeterInfoFromMessageMetadata;
// If Perimeter is fetched from metadata
private String perimeterKeyName;
//For Polygons
private String polygonsDefinition;
@ -50,7 +46,9 @@ public class TbGpsGeofencingFilterNodeConfiguration implements NodeConfiguration
TbGpsGeofencingFilterNodeConfiguration configuration = new TbGpsGeofencingFilterNodeConfiguration();
configuration.setLatitudeKeyName("latitude");
configuration.setLongitudeKeyName("longitude");
configuration.setPerimeterType(PerimeterType.POLYGON);
configuration.setFetchPerimeterInfoFromMessageMetadata(true);
configuration.setPerimeterKeyName("ss_perimeter");
return configuration;
}
}