diff --git a/CHANGES_NEXT_RELEASE b/CHANGES_NEXT_RELEASE index 5100d2164..06076833d 100644 --- a/CHANGES_NEXT_RELEASE +++ b/CHANGES_NEXT_RELEASE @@ -1,3 +1,4 @@ [cygnus-ngsi] [mongo-sink] Add mongo_ssl, mongo_ssl_invalid_host_allowed, mongo_ssl_keystore_path_file, mongo_ssl_keystore_password, mongo_ssl_truststore_path_file and mongo_ssl_truststore_password options for mongoDB connections [cygnus-common] [mongo-backend] Use sslEnabled, sslInvalidHostNameAllowed, sslKeystorePathFile, sslKeystorePassword, sslTruststorePathFile and sslTruststorePassword options for mongoDB connections [cygnus-common] [mongo-backend] Allow mongodb autodiscover at connect when just one server is provided +[cygnus-ngsi] [arcgis-sink] Add esri Geometry PolyLine support (#2392) diff --git a/cygnus-common/src/main/java/com/telefonica/iot/cygnus/backends/arcgis/model/Feature.java b/cygnus-common/src/main/java/com/telefonica/iot/cygnus/backends/arcgis/model/Feature.java index 559a110a5..00c036ee0 100644 --- a/cygnus-common/src/main/java/com/telefonica/iot/cygnus/backends/arcgis/model/Feature.java +++ b/cygnus-common/src/main/java/com/telefonica/iot/cygnus/backends/arcgis/model/Feature.java @@ -154,6 +154,20 @@ public static Feature createPointFeature(String latitud, String longitud) { return createPointFeature(lat, lon); } + /** + * + * @param paths + * @return + */ + public static Feature createPolyLineFeature(String paths) { + try { + return new Feature(new PolyLine(paths)); + } catch (Exception e) { + LOGGER.error(e.getClass().getSimpleName() + " " + e.getMessage()); + return null; + } + } + /** * This method merges unexistent attributes from sourceFeature. * @@ -309,13 +323,22 @@ public static Feature createInstanceFromJson(String json) throws ArcgisException */ public static Feature createInstanceFromJson(JsonObject json) throws ArcgisException { try { - Geometry geometry; + Geometry geometry = null; if (json.has(GEOMETRY_TAG)) { - JsonObject jsonGeometry = json.get(GEOMETRY_TAG).getAsJsonObject(); - geometry = Point.createInstanceFromJson(jsonGeometry); // TODO another - //geometry types? - } else { - geometry = null; + JsonElement jsonGeometryElement = json.get(GEOMETRY_TAG); + if (jsonGeometryElement.isJsonObject()) { + JsonObject jsonGeometry = jsonGeometryElement.getAsJsonObject(); + if (jsonGeometry.get("x") != null) { + geometry = Point.createInstanceFromJson(jsonGeometry); + } else if (jsonGeometry.get("paths") != null) { + geometry = PolyLine.createInstanceFromJson(jsonGeometry); + // FIXME when MultiPoint and Polygon will be implemented + // } else if (jsonGeometry.get("points") != null) { + // // geometry = MultiPoint.createInstance(jsonGeometry); + // } else if (jsonGeometry.get("rings") != null) { + // // geometry = Polygon.createInstance(jsonGeometry); + } + } } Map attributes = attToMap(json.get(ATTRIBUTES_TAG).getAsJsonObject()); return new Feature(geometry, attributes); diff --git a/cygnus-common/src/main/java/com/telefonica/iot/cygnus/backends/arcgis/model/PolyLine.java b/cygnus-common/src/main/java/com/telefonica/iot/cygnus/backends/arcgis/model/PolyLine.java new file mode 100644 index 000000000..a6a625d1c --- /dev/null +++ b/cygnus-common/src/main/java/com/telefonica/iot/cygnus/backends/arcgis/model/PolyLine.java @@ -0,0 +1,202 @@ +/** + * Copyright 2014-2017 Telefonica Investigación y Desarrollo, S.A.U + * + * This file is part of fiware-cygnus (FIWARE project). + * + * fiware-cygnus is free software: you can redistribute it and/or modify it under the terms of the GNU Affero + * General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. + * fiware-cygnus is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the + * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License + * for more details. + * + * You should have received a copy of the GNU Affero General Public License along with fiware-cygnus. If not, see + * http://www.gnu.org/licenses/. + * + * For those usages not covered by the GNU Affero General Public License please contact with iot_support at tid dot es + */ + +package com.telefonica.iot.cygnus.backends.arcgis.model; + +import java.util.List; +import java.util.Arrays; +import java.util.ArrayList; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import java.lang.reflect.Type; + +import com.telefonica.iot.cygnus.backends.arcgis.exceptions.ArcgisException; +import com.telefonica.iot.cygnus.log.CygnusLogger; + +/** + * + * @author avega + * + */ +public class PolyLine implements Geometry { + private static final CygnusLogger LOGGER = new CygnusLogger(PolyLine.class); + + private static final String SPATIAL_REFERENCE_TAG = "spatialReference"; + private static final String WKID_TAG = "wkid"; + private static final String PATHS_TAG = "paths"; + + public List> paths; + + private SpatialReference spatialReference; + private int type = Geometry.TYPE_SHAPE; // TBD + + /** + * Constructor. + * + * @param paths + * @param spatialReference + */ + public PolyLine(List> paths, SpatialReference spatialReference) { + this.paths = paths; + this.spatialReference = spatialReference; + } + + /** + * Constructor. + * + * @param lat + * @param lng + */ + public PolyLine(List> paths) { + this(paths, SpatialReference.WGS84); + } + + /** + * SetValue. + */ + public void setValue(Geometry g) throws ArcgisException { + if (g.getGeometryType() == Geometry.TYPE_SHAPE) { + PolyLine polyline = (PolyLine) g; + this.paths = polyline.paths; + } else { + throw new ArcgisException("Invalid Geometry Type, Point expected."); + } + } + + /** + * Constructor. + * + * @param strPoint + * @throws ArcgisException + */ + public PolyLine(String strPolyline) throws ArcgisException { + try { + JsonObject jsonObject = JsonParser.parseString(strPolyline).getAsJsonObject(); + String thePathsStr = jsonObject.get("paths").toString(); + Gson gson = new Gson(); + Type listType = new TypeToken>>() {}.getType(); + this.paths = gson.fromJson(thePathsStr, listType); + this.spatialReference = SpatialReference.WGS84; + } catch (NumberFormatException e) { + LOGGER.error(e.getClass().getSimpleName() + " " + e.getMessage()); + throw new ArcgisException("Unexpected string format for type PolyLine."); + } + } + + /** + * Sets Geometry From JSON. + */ + public void setGeometryFromJSON(String json) { + // TODO Auto-generated method stub + + } + + /** + * @return JsonObject + */ + public JsonObject toJSON() { + JsonObject result = new JsonObject(); + LOGGER.debug("toJSON "); + result.addProperty(PATHS_TAG, this.toString()); + + JsonObject spatialRef = new JsonObject(); + spatialRef.addProperty(WKID_TAG, spatialReference.getWkid()); + + result.add(SPATIAL_REFERENCE_TAG, spatialRef); + return result; + } + + /** + * Factroy method. + * + * @param json + * @return + * @throws ArcgisException + */ + public static Geometry createInstanceFromJson(JsonObject json) throws ArcgisException { + try { + return new PolyLine(json.get(PATHS_TAG).getAsString()); + } catch (Exception e) { + LOGGER.error(e.getClass().getSimpleName() + " " + e.getMessage()); + throw new ArcgisException("Unable to parse PolyLine from json " + e.getMessage()); + } + + } + + /** + * @return String + */ + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("{ \"paths\": ["); + for (int i = 0; i < this.paths.size(); i++) { + List innerList = this.paths.get(i); + for (int j = 0; j < innerList.size(); j++) { + sb.append(" ["); + sb.append("["); + double[] array = innerList.get(j); + for (double value : array) { + sb.append(" ").append(value).append(","); + } + sb.append(" ]"); + sb.setLength(sb.length() - 2); + sb.append(" ],"); + } + } + sb.setLength(sb.length() - 2); + sb.append(" ]}"); + return sb.toString(); + } + + /** + * @return geometry type + */ + public int getGeometryType() { + return type; + } + + /** + * + */ + public void setSpatialReference(SpatialReference spatialReference) { + this.spatialReference = spatialReference; + } + + /** + * + */ + public SpatialReference getSpatialReference() { + return this.spatialReference; + } + + /** + * + * @return + */ + public List> getPaths() { + return this.paths; + } + + @Override + public Object getValue() { + return null; + } + +} diff --git a/cygnus-common/src/test/java/com/telefonica/iot/cygnus/backends/arcgis/FeatureTest.java b/cygnus-common/src/test/java/com/telefonica/iot/cygnus/backends/arcgis/FeatureTest.java index 222547700..32a3aa579 100644 --- a/cygnus-common/src/test/java/com/telefonica/iot/cygnus/backends/arcgis/FeatureTest.java +++ b/cygnus-common/src/test/java/com/telefonica/iot/cygnus/backends/arcgis/FeatureTest.java @@ -25,6 +25,10 @@ import org.apache.logging.log4j.core.config.DefaultConfiguration; import org.junit.Before; import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import static org.mockito.Mockito.when; +import org.mockito.junit.MockitoJUnitRunner; import com.google.gson.JsonArray; import com.google.gson.JsonElement; @@ -32,12 +36,23 @@ import com.google.gson.JsonParser; import com.telefonica.iot.cygnus.backends.arcgis.exceptions.ArcgisException; import com.telefonica.iot.cygnus.backends.arcgis.model.Feature; +import com.telefonica.iot.cygnus.backends.arcgis.model.PolyLine; + +import java.util.List; +import java.util.Arrays; +import java.util.ArrayList; +import com.google.gson.JsonObject; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import java.lang.reflect.Type; + /** * * @author dmartinez * */ +@RunWith(MockitoJUnitRunner.class) public class FeatureTest { /** @@ -114,7 +129,7 @@ public void getSetObjectId() { feature.setObjectId(255); assertTrue("getObjectId() doesn't match", feature.getObjectId() == 255); assertTrue("OBJECTID not properly saved", - ((Long) feature.getAttributes().get("OBJECTID")) == 255); + ((Long)feature.getAttributes().get("OBJECTID")) == 255); } catch (ArcgisException e) { fail(e.getMessage()); } @@ -149,4 +164,25 @@ public void createInstanceFromJson2() { } } + + /** + * + */ + @Test + public void getPolyFeatureTest() { + System.out.println("---------------- getNewPolyLineFeature"); + try { + String paths = "{ \"paths\": [ [ [-97.06138, 32.837], [-97.06133, 33.836], [-98.2, 34.834], [-97, 40] ] ] }"; + PolyLine poly = new PolyLine(paths); + System.out.println("POLY: " + poly.toString()); + + } catch (Exception e) { + System.out.println("Exception"); + System.out.println(e.getClass().getSimpleName() + " " + e.getMessage()); + } + Feature poly = FeatureTestFactory.getNewPolyLineFeature("Mi PolyLine", 33); + System.out.println("feature poly - " + poly.toJson()); + assertTrue("ok.", true); + } + } diff --git a/cygnus-common/src/test/java/com/telefonica/iot/cygnus/backends/arcgis/FeatureTestFactory.java b/cygnus-common/src/test/java/com/telefonica/iot/cygnus/backends/arcgis/FeatureTestFactory.java index f63f5f0c3..d44d6a5c1 100644 --- a/cygnus-common/src/test/java/com/telefonica/iot/cygnus/backends/arcgis/FeatureTestFactory.java +++ b/cygnus-common/src/test/java/com/telefonica/iot/cygnus/backends/arcgis/FeatureTestFactory.java @@ -109,6 +109,40 @@ public static Feature getUpdatedOcupacionFeature(int objectId, String name) { return feature; } + /** + * + * @param description + * @param externalId + * @return + */ + public static Feature getNewPolyLineFeature(String description, Integer externalId) { + Map attributes = new LinkedHashMap(); + attributes.put("IDEXTERNO", externalId); + attributes.put("DESCRIPCION", description); + attributes.put("RAZONSOCIAL", "Razon social"); + attributes.put("NUMEROPOSTAL", null); + attributes.put("TIPOOCUPACION", 0); + attributes.put("FINI", new Date()); + attributes.put("UNIDADMEDIDA", null); + attributes.put("EXCSABDOM", 0); + attributes.put("EXCFESTIVOS", 0); + attributes.put("PRESENCIAPOLICIAL", 0); + attributes.put("REVISADO", 0); + attributes.put("IDACTIVIDAD", 0); + attributes.put("ACTIVIDAD", "actividad"); + attributes.put("IDCLASE", 0); + attributes.put("CLASE", "clase"); + attributes.put("IDESTADO", 0); + attributes.put("ESTADO", "estado"); + attributes.put("CALLE", "calle"); + attributes.put("FFIN", new GregorianCalendar()); + attributes.put("CANTIDADOCUPADA", null); + String jsonString = "{ \"paths\": [ [ [-97.06138, 32.837], [-97.06133, 33.836], [-98.2, 34.834], [-97, 40] ] ] }"; + Feature feature = Feature.createPolyLineFeature(jsonString); + feature.setAttributes(attributes); + return feature; + } + /** * * @return