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 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();
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user