gcube-cms-suite/sdi-plugins/src/main/java/org/gcube/application/cms/sdi/engine/bboxes/BBOXByCoordinatePaths.java

88 lines
3.6 KiB
Java

package org.gcube.application.cms.sdi.engine.bboxes;
import lombok.Data;
import lombok.Getter;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import org.bson.Document;
import org.gcube.application.cms.serialization.Serialization;
import org.gcube.application.geoportal.common.model.JSONPathWrapper;
import org.gcube.application.geoportal.common.model.document.filesets.sdi.GCubeSDILayer;
import org.gcube.application.geoportal.common.model.useCaseDescriptor.UseCaseDescriptor;
import java.util.List;
@Slf4j
public class BBOXByCoordinatePaths extends BBOXEvaluator{
@Data
@ToString
public static class CoordinatesPathBean{
private String x;
private String y;
private String z;
}
public BBOXByCoordinatePaths() {
super("COORDINATES_PATH");
}
@Override
public boolean isConfigured(Document profileConfiguration) {
return profileConfiguration.containsKey("coordinatesPath");
}
@Override
public GCubeSDILayer.BBOX evaluate(Document profileConfiguration, UseCaseDescriptor useCaseDescriptor, JSONPathWrapper documentNavigator) {
List coordsConfig=profileConfiguration.get("coordinatesPath",List.class);
GCubeSDILayer.BBOX toSet = null;
for(Object coordsObj:coordsConfig){
log.debug("UseCaseDescriptor {} : Evaluating coords {} ", useCaseDescriptor.getId(),coordsObj);
CoordinatesPathBean bean = Serialization.convert(coordsObj,CoordinatesPathBean.class);
// x
if(bean.getX()!=null)
// for found
//TODO MANAGE integers vs double
for(Object o : documentNavigator.getByPath(bean.getX(),Object.class)) {
try{
Double x=Double.parseDouble(o.toString());
if(toSet == null) toSet = new GCubeSDILayer.BBOX();
if (toSet.getMinX()==null || x< toSet.getMinX()) toSet.setMinX(x);
if (toSet.getMaxX()==null || x> toSet.getMaxX()) toSet.setMaxX(x);
}catch(Throwable t){
log.warn("Unable to parse X (Matched value {} from path {}",o,bean.getX(),t);
}
}
// y
if(bean.getY()!=null)
// for found
for(Object o : documentNavigator.getByPath(bean.getY(),Object.class)) {
try{
Double y=Double.parseDouble(o.toString());
if(toSet == null) toSet = new GCubeSDILayer.BBOX();
if (toSet.getMinY()==null || y< toSet.getMinY()) toSet.setMinY(y);
if (toSet.getMaxY()==null || y> toSet.getMaxY()) toSet.setMaxY(y);
}catch(Throwable t){
log.warn("Unable to parse Y (Matched value {} from path {}",o,bean.getY(),t);
}
}
// z
if(bean.getZ()!=null)
// for found
for(Object o : documentNavigator.getByPath(bean.getZ(),Object.class)) {
try{
Double z=Double.parseDouble(o.toString());
if(toSet == null) toSet = new GCubeSDILayer.BBOX();
if (toSet.getMinZ()==null || z< toSet.getMinZ()) toSet.setMinZ(z);
if (toSet.getMaxZ()==null || z> toSet.getMaxZ()) toSet.setMaxZ(z);
}catch(Throwable t){
log.warn("Unable to parse Z (Matched value {} from path {}",o,bean.getZ(),t);
}
}
}
return toSet;
}
}