Add support of configurable perimeter key name while fetching perimeter from metadata.
This commit is contained in:
parent
c7aafe4ddd
commit
8a50270feb
@ -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();
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user