|
|
|
@ -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(); |
|
|
|
|