[OLINGO-324] add support for geometry and geography types
diff --git a/datajs/src/lib/odata/json.js b/datajs/src/lib/odata/json.js
index aff4d76..26d7a7f 100644
--- a/datajs/src/lib/odata/json.js
+++ b/datajs/src/lib/odata/json.js
@@ -236,7 +236,14 @@
}
} else if (utils.isObject(data[key])) {
if (data[key] !== null) {
- readPayloadFull(data[key], model, recognizeDates);
+ //don't step into geo.. objects
+ var isGeo = false;
+ var type = data[key+'@odata.type'];
+ if (type && (isGeographyEdmType(type) || isGeometryEdmType(type))) {
+ // is gemometry type
+ } else {
+ readPayloadFull(data[key], model, recognizeDates);
+ }
}
} else {
var type = data[key + '@odata.type'];
@@ -439,6 +446,14 @@
}
}
+
+ if (jsonIsPrimitiveType(fragment)) {
+ ret.typeName = fragment;
+ ret.type = null;
+ ret.detectedPayloadKind = PAYLOADTYPE_VALUE;
+ continue;
+ }
+
var container = lookupDefaultEntityContainer(model);
//check for entity
@@ -463,12 +478,7 @@
continue;
}
- if (jsonIsPrimitiveType(fragment)) {
- ret.typeName = fragment;
- ret.type = null;
- ret.detectedPayloadKind = PAYLOADTYPE_VALUE;
- continue;
- }
+
//TODO throw ERROR
} else {
@@ -586,6 +596,8 @@
var payloadInfo = createPayloadInfo(data, model);
switch (payloadInfo.detectedPayloadKind) {
+ case PAYLOADTYPE_VALUE:
+ return readPayloadMinimalProperty(data, model, payloadInfo, baseURI, recognizeDates);
case PAYLOADTYPE_FEED:
return readPayloadMinimalFeed(data, model, payloadInfo, baseURI, recognizeDates);
case PAYLOADTYPE_ENTRY:
diff --git a/datajs/src/lib/odata/utils.js b/datajs/src/lib/odata/utils.js
index df88e2e..f92e9f7 100644
--- a/datajs/src/lib/odata/utils.js
+++ b/datajs/src/lib/odata/utils.js
@@ -59,7 +59,8 @@
var EDM_STRING = EDM + "String";
var EDM_TIME = EDM + "Time";
-var EDM_GEOGRAPHY = EDM + "Geography";
+var GEOGRAPHY = "Geography";
+var EDM_GEOGRAPHY = EDM + GEOGRAPHY;
var EDM_GEOGRAPHY_POINT = EDM_GEOGRAPHY + "Point";
var EDM_GEOGRAPHY_LINESTRING = EDM_GEOGRAPHY + "LineString";
var EDM_GEOGRAPHY_POLYGON = EDM_GEOGRAPHY + "Polygon";
@@ -68,7 +69,16 @@
var EDM_GEOGRAPHY_MULTILINESTRING = EDM_GEOGRAPHY + "MultiLineString";
var EDM_GEOGRAPHY_MULTIPOINT = EDM_GEOGRAPHY + "MultiPoint";
-var EDM_GEOMETRY = EDM + "Geometry";
+var GEOGRAPHY_POINT = GEOGRAPHY + "Point";
+var GEOGRAPHY_LINESTRING = GEOGRAPHY + "LineString";
+var GEOGRAPHY_POLYGON = GEOGRAPHY + "Polygon";
+var GEOGRAPHY_COLLECTION = GEOGRAPHY + "Collection";
+var GEOGRAPHY_MULTIPOLYGON = GEOGRAPHY + "MultiPolygon";
+var GEOGRAPHY_MULTILINESTRING = GEOGRAPHY + "MultiLineString";
+var GEOGRAPHY_MULTIPOINT = GEOGRAPHY + "MultiPoint";
+
+var GEOMETRY = "Geometry";
+var EDM_GEOMETRY = EDM + GEOMETRY;
var EDM_GEOMETRY_POINT = EDM_GEOMETRY + "Point";
var EDM_GEOMETRY_LINESTRING = EDM_GEOMETRY + "LineString";
var EDM_GEOMETRY_POLYGON = EDM_GEOMETRY + "Polygon";
@@ -77,6 +87,14 @@
var EDM_GEOMETRY_MULTILINESTRING = EDM_GEOMETRY + "MultiLineString";
var EDM_GEOMETRY_MULTIPOINT = EDM_GEOMETRY + "MultiPoint";
+var GEOMETRY_POINT = GEOMETRY + "Point";
+var GEOMETRY_LINESTRING = GEOMETRY + "LineString";
+var GEOMETRY_POLYGON = GEOMETRY + "Polygon";
+var GEOMETRY_COLLECTION = GEOMETRY + "Collection";
+var GEOMETRY_MULTIPOLYGON = GEOMETRY + "MultiPolygon";
+var GEOMETRY_MULTILINESTRING = GEOMETRY + "MultiLineString";
+var GEOMETRY_MULTIPOINT = GEOMETRY + "MultiPoint";
+
var GEOJSON_POINT = "Point";
var GEOJSON_LINESTRING = "LineString";
var GEOJSON_POLYGON = "Polygon";
@@ -114,6 +132,17 @@
EDM_GEOMETRY_MULTIPOINT
];
+var geometryTypes = [
+ GEOMETRY,
+ GEOMETRY_POINT,
+ GEOMETRY_LINESTRING,
+ GEOMETRY_POLYGON,
+ GEOMETRY_COLLECTION,
+ GEOMETRY_MULTIPOLYGON,
+ GEOMETRY_MULTILINESTRING,
+ GEOMETRY_MULTIPOINT
+];
+
var geographyEdmTypes = [
EDM_GEOGRAPHY,
EDM_GEOGRAPHY_POINT,
@@ -125,6 +154,17 @@
EDM_GEOGRAPHY_MULTIPOINT
];
+var geographyTypes = [
+ GEOGRAPHY,
+ GEOGRAPHY_POINT,
+ GEOGRAPHY_LINESTRING,
+ GEOGRAPHY_POLYGON,
+ GEOGRAPHY_COLLECTION,
+ GEOGRAPHY_MULTIPOLYGON,
+ GEOGRAPHY_MULTILINESTRING,
+ GEOGRAPHY_MULTIPOINT
+];
+
var forEachSchema = function (metadata, callback) {
/// <summary>Invokes a function once per schema in metadata.</summary>
/// <param name="metadata">Metadata store; one of edmx, schema, or an array of any of them.</param>
@@ -423,7 +463,11 @@
/// <param name="typeName" type="String">Name of type to check.</param>
/// <returns type="Boolean">True if the type is a geography EDM type; false otherwise.</returns>
- return contains(geographyEdmTypes, typeName);
+ //check with edm
+ var ret = contains(geographyEdmTypes, typeName) ||
+ (typeName.indexOf('.') === -1 && contains(geographyTypes, typeName));
+ return ret;
+
};
var isGeometryEdmType = function (typeName) {
@@ -431,7 +475,9 @@
/// <param name="typeName" type="String">Name of type to check.</param>
/// <returns type="Boolean">True if the type is a geometry EDM type; false otherwise.</returns>
- return contains(geometryEdmTypes, typeName);
+ var ret = contains(geometryEdmTypes, typeName) ||
+ (typeName.indexOf('.') === -1 && contains(geometryTypes, typeName));
+ return ret;
};
var isNamedStream = function (value) {
diff --git a/datajs/tests/odata-json-tests.js b/datajs/tests/odata-json-tests.js
index 58d8110..630ff55 100644
--- a/datajs/tests/odata-json-tests.js
+++ b/datajs/tests/odata-json-tests.js
@@ -836,4 +836,150 @@
});
+ var verifyReadJsonLightDataMetadataFull = function (input, expected, message, model) {
+ var response = {
+ headers: {
+ "Content-Type": "application/json;odata.metadata=full",
+ DataServiceVersion: "4.0"
+ },
+ body: JSON.stringify(input)
+ };
+
+ OData.json.jsonHandler.read(response, { metadata: model });
+ djstest.assertAreEqualDeep(response.data, expected, message);
+ };
+
+
+ var verifyReadJsonLightDataMetadataMinimal= function (input, expected, message, model) {
+ var response = {
+ headers: {
+ "Content-Type": "application/json;odata.metadata=minimal",
+ DataServiceVersion: "4.0"
+ },
+ body: JSON.stringify(input)
+ };
+
+ OData.json.jsonHandler.read(response, { metadata: model });
+ djstest.assertAreEqualDeep(response.data, expected, message);
+ };
+
+ var getPointValue = { edmType : 'GeographyPoint', value : {
+ type: "Point",
+ coordinates: [1.0, 2.0],
+ crs: {
+ type: name,
+ properties: {
+ name: "EPSG:4326"
+ }
+ }
+ }};
+
+ var getLineStringValue = { edmType : 'GeographyLineString', value : {
+ "type": "LineString",
+ "coordinates": [ [100.0, 0.0], [101.0, 1.0] ],
+ crs: {
+ type: name,
+ properties: {
+ name: "EPSG:4326"
+ }
+ }
+ }};
+
+ var getPolygonValue = { edmType : 'GeographyPolygon', value : {
+ "type": "Polygon",
+ "coordinates": [
+ [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ],
+ [ [100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2] ]
+ ],
+ crs: {
+ type: name,
+ properties: {
+ name: "EPSG:4326"
+ }
+ }
+ }};
+
+ var getMultiPointValue = { edmType : 'GeographyMultiPoint', value : {
+ "type": "MultiPoint",
+ "coordinates": [ [100.0, 0.0], [101.0, 1.0] ],
+ crs: {
+ type: name,
+ properties: {
+ name: "EPSG:4326"
+ }
+ }
+ }};
+
+ var getMultiLineStringValue = { edmType : 'GeographyMultiLineString', value : {
+ "type": "MultiLineString",
+ "coordinates": [
+ [ [100.0, 0.0], [101.0, 1.0] ],
+ [ [102.0, 2.0], [103.0, 3.0] ]
+ ],
+ crs: {
+ type: name,
+ properties: {
+ name: "EPSG:4326"
+ }
+ }
+ }};
+ var getMultiPolygonStringValue = { edmType : 'GeographyMultiPolygon', value : {
+ "type": "MultiPolygon",
+ "coordinates": [
+ [[[102.0, 2.0], [103.0, 2.0], [103.0, 3.0], [102.0, 3.0], [102.0, 2.0]]],
+ [[[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]],
+ [[100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2]]]
+ ],
+ crs: {
+ type: name,
+ properties: {
+ name: "EPSG:4326"
+ }
+ }
+ }};
+
+ var getWorkload = [getPointValue, getLineStringValue, getPolygonValue, getMultiPointValue, getMultiLineStringValue, getMultiPolygonStringValue ];
+
+
+ djstest.addTest(function jsonReadGeometryPointFull() {
+
+ for ( var i = 0; i < getWorkload.length; i++) {
+ var item = getWorkload[i];
+ var input = {
+ "@odata.context": "http://someUri#Edm."+item.edmType,
+ "value@odata.type" : item.edmType,
+ value: item.value
+ };
+
+ var expected = {
+ "@odata.context": "http://someUri#Edm."+item.edmType,
+ "value@odata.type" : item.edmType,
+ value: item.value
+ };
+ verifyReadJsonLightDataMetadataFull(input, expected, "Json light top level primitive property was read properly.");
+ }
+
+ djstest.done();
+ });
+
+
+ djstest.addTest(function jsonReadGeometryPointMinimal() {
+ for ( var i = 0; i < getWorkload.length; i++) {
+ var item = getWorkload[i];
+ var input = {
+ "@odata.context": "http://someUri#Edm."+item.edmType,
+ value: item.value
+ };
+
+ var expected = {
+ "@odata.context": "http://someUri#Edm."+item.edmType,
+ value: item.value,
+ "value@odata.type" : item.edmType,
+ };
+
+ verifyReadJsonLightDataMetadataMinimal(input, expected, "Json light top level primitive property was read properly.", {});
+ }
+ djstest.done();
+ });
+
})(this);
diff --git a/datajs/tests/odata-qunit-tests.htm b/datajs/tests/odata-qunit-tests.htm
index 696b7bb..427d360 100644
--- a/datajs/tests/odata-qunit-tests.htm
+++ b/datajs/tests/odata-qunit-tests.htm
@@ -42,7 +42,8 @@
<script type="text/javascript">
window.TestSynchronizer.init(QUnit);
</script>
- <script type="text/javascript" src="../build/datajs-2.0.0.min.js"></script>
+ <!--<script type="text/javascript" src="../build/datajs-2.0.0.min.js"></script>-->
+ <script type="text/javascript" src="../build/datajs-2.0.0.js"></script>
<script type="text/javascript" src="common/common.js"></script>
<script type="text/javascript" src="./common/mockHttpClient.js"></script>