Fix logging
[gpl/argeo-suite.git] / org.argeo.app.geo / src / org / argeo / app / geo / acr / GeoEntityUtils.java
index 43f0a022e772fcaa754e369bf469a6e97baa1c2d..162081a58ad40c3545277409a7ad2c90e59572b0 100644 (file)
@@ -17,6 +17,7 @@ import org.argeo.api.acr.Content;
 import org.argeo.api.acr.ContentName;
 import org.argeo.api.acr.DName;
 import org.argeo.api.acr.QNamed;
+import org.argeo.api.cms.CmsLog;
 import org.argeo.app.api.EntityName;
 import org.argeo.app.api.EntityType;
 import org.argeo.app.api.WGS84PosName;
@@ -32,9 +33,12 @@ import jakarta.json.Json;
 import jakarta.json.JsonObject;
 import jakarta.json.JsonReader;
 import jakarta.json.stream.JsonGenerator;
+import jakarta.json.stream.JsonParsingException;
 
 /** Utilities around entity types related to geography. */
 public class GeoEntityUtils {
+       private final static CmsLog log = CmsLog.getLog(GeoEntityUtils.class);
+
        public static final String _GEOM_JSON = ".geom.json";
 
        public static void putGeometry(Content c, QNamed name, Geometry geometry) {
@@ -42,7 +46,7 @@ public class GeoEntityUtils {
        }
 
        public static void putGeometry(Content c, QName name, Geometry geometry) {
-               QName jsonFileName = new ContentName(name.getNamespaceURI(), name.getLocalPart() + _GEOM_JSON);
+               QName jsonFileName = getJsonFileName(name);
                Content geom = c.soleChild(jsonFileName).orElseGet(
                                () -> c.add(jsonFileName, Collections.singletonMap(DName.getcontenttype.qName(), "application/json")));
                try (OutputStream out = geom.open(OutputStream.class)) {
@@ -54,18 +58,41 @@ public class GeoEntityUtils {
                } catch (IOException e) {
                        throw new UncheckedIOException("Cannot add geometry " + name + " to " + c, e);
                }
+
+//             try (BufferedReader in = new BufferedReader(
+//                             new InputStreamReader(geom.open(InputStream.class), StandardCharsets.UTF_8))) {
+//                     System.out.println(in.readLine());
+//             } catch (IOException e) {
+//                     throw new UncheckedIOException("Cannot parse " + c, e);
+//             }
                updateBoundingBox(c);
        }
 
+       public static boolean hasGeometry(Content c, QNamed name) {
+               return hasGeometry(c, name.qName());
+       }
+
+       public static boolean hasGeometry(Content c, QName name) {
+               QName jsonFileName = getJsonFileName(name);
+               return c.hasChild(jsonFileName);
+       }
+
        public static <T extends Geometry> T getGeometry(Content c, QNamed name, Class<T> clss) {
                return getGeometry(c, name.qName(), clss);
        }
 
        public static <T extends Geometry> T getGeometry(Content c, QName name, Class<T> clss) {
-               QName jsonFileName = new ContentName(name.getNamespaceURI(), name.getLocalPart() + _GEOM_JSON);
+               QName jsonFileName = getJsonFileName(name);
                Content geom = c.soleChild(jsonFileName).orElse(null);
                if (geom == null)
                        return null;
+//             try (Reader in = new InputStreamReader(geom.open(InputStream.class), StandardCharsets.UTF_8)) {
+//                     String json = StreamUtils.toString(new BufferedReader(in));
+//                     System.out.println("JSON:\n" + json);
+//             } catch (IOException e1) {
+//                     // TODO Auto-generated catch block
+//                     e1.printStackTrace();
+//             }
                try (Reader in = new InputStreamReader(geom.open(InputStream.class), StandardCharsets.UTF_8)) {
                        JsonReader jsonReader = Json.createReader(in);
                        JsonObject jsonObject = jsonReader.readObject();
@@ -73,11 +100,21 @@ public class GeoEntityUtils {
                        return readGeom;
                } catch (IOException e) {
                        throw new UncheckedIOException("Cannot parse " + c, e);
+               } catch (JsonParsingException e) {
+                       if (log.isTraceEnabled())
+                               log.warn("Invalid GeoJson for " + geom);
+                       // json is invalid, returning null
+                       return null;
                }
        }
 
+       private static QName getJsonFileName(QName name) {
+               QName jsonFileName = new ContentName(name.getNamespaceURI(), name.getLocalPart() + _GEOM_JSON);
+               return jsonFileName;
+       }
+
        public static Point toPoint(Content c) {
-               if (c.hasContentClass(EntityType.geopoint)) {
+               if (c.containsKey(WGS84PosName.lon) && c.containsKey(WGS84PosName.lat)) {
                        Double lat = c.get(WGS84PosName.lat, Double.class).orElseThrow();
                        Double lon = c.get(WGS84PosName.lon, Double.class).orElseThrow();
                        return JTS.GEOMETRY_FACTORY_WGS84.createPoint(new Coordinate(lat, lon));