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 com.google.gson.JsonParser;
import org.locationtech.spatial4j.context.jts.JtsSpatialContext; import org.locationtech.spatial4j.context.jts.JtsSpatialContext;
import org.locationtech.spatial4j.context.jts.JtsSpatialContextFactory; 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.TbContext;
import org.thingsboard.rule.engine.api.TbNode; import org.thingsboard.rule.engine.api.TbNode;
import org.thingsboard.rule.engine.api.TbNodeConfiguration; 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 { protected List<Perimeter> getPerimeters(TbMsg msg, JsonObject msgDataObj) throws TbNodeException {
if (config.isFetchPerimeterInfoFromMessageMetadata()) { if (config.isFetchPerimeterInfoFromMessageMetadata()) {
//TODO: add fetching perimeters from the message itself, if configuration is empty. if (StringUtils.isEmpty(config.getPerimeterKeyName())) {
if (!StringUtils.isEmpty(msg.getMetaData().getValue("perimeter"))) { // Old configuration before "perimeterKeyName" was introduced
Perimeter perimeter = new Perimeter(); String perimeterValue = msg.getMetaData().getValue("perimeter");
perimeter.setPerimeterType(PerimeterType.POLYGON); if (!StringUtils.isEmpty(perimeterValue)) {
perimeter.setPolygonsDefinition(msg.getMetaData().getValue("perimeter")); Perimeter perimeter = new Perimeter();
return Collections.singletonList(perimeter); perimeter.setPerimeterType(PerimeterType.POLYGON);
} else if (!StringUtils.isEmpty(msg.getMetaData().getValue("centerLatitude"))) { perimeter.setPolygonsDefinition(perimeterValue);
Perimeter perimeter = new Perimeter(); return Collections.singletonList(perimeter);
perimeter.setPerimeterType(PerimeterType.CIRCLE); } else if (!StringUtils.isEmpty(msg.getMetaData().getValue("centerLatitude"))) {
perimeter.setCenterLatitude(Double.parseDouble(msg.getMetaData().getValue("centerLatitude"))); Perimeter perimeter = new Perimeter();
perimeter.setCenterLongitude(Double.parseDouble(msg.getMetaData().getValue("centerLongitude"))); perimeter.setPerimeterType(PerimeterType.CIRCLE);
perimeter.setRange(Double.parseDouble(msg.getMetaData().getValue("range"))); perimeter.setCenterLatitude(Double.parseDouble(msg.getMetaData().getValue("centerLatitude")));
perimeter.setRangeUnit(RangeUnit.valueOf(msg.getMetaData().getValue("rangeUnit"))); perimeter.setCenterLongitude(Double.parseDouble(msg.getMetaData().getValue("centerLongitude")));
return Collections.singletonList(perimeter); 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 { } 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 { } else {
Perimeter perimeter = new Perimeter(); Perimeter perimeter = new Perimeter();

View File

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