Repository: olingo-odata4-js Updated Branches: refs/heads/OLINGO-324 [created] 54486148e
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/54486148/datajs/demo/tester.html ---------------------------------------------------------------------- diff --git a/datajs/demo/tester.html b/datajs/demo/tester.html new file mode 100644 index 0000000..011bf90 --- /dev/null +++ b/datajs/demo/tester.html @@ -0,0 +1,98 @@ +<html> + <head> + <meta http-equiv="X-UA-Compatible" content="IE=Edge" /> + <title>datajs startup perf test</title> + <script type="text/javascript" src="./jscripts/jquery-1.11.1.min.js"></script> + <script type="text/javascript" src="./jscripts/underscore-min.js" ></script> + <script type="text/javascript" src="./jscripts/backbone-min.js" ></script> + <script type="text/javascript" src="./jscripts/datajs-2.0.0.js"></script> + <!--https://github.com/warfares/pretty-json/blob/master/index.html--> + <script type="text/javascript" src="./jscripts/pretty-json-min.js" ></script> + + </head> + <body> + <button id="startXML">XML</button><br/> + <button id="startJSON">JSON</button><br/> + <button id="btnMetaData">MetaData</button><br/> + <button id="btnJSONwithMetaData">JSON with MetaData</button><br/> + <div id='resultsArea'> + + </div> + <script type='text/html' id='template'> + {{#items}} + <p><a href="{{id}}">{{name}}</a></p> + {{/items}} + </script> + <script> + function success(data) { + $('#resultsArea').empty(); + //$('#resultsArea').html(Mustache.render($('#template').html(), {items:data})); + //var out = JSON.stringify(data, null, 4) + //$('#resultsArea').html(out); + var node = new PrettyJSON.view.Node({ + el:$('#resultsArea'), + data: data, + }); + node.expandAll(); + } + + function errorFunc(err) { + $('#resultsArea').empty(); + $("#resultsArea").text(JSON.stringify(err)); + } + + $('#startXML').on("click", function(){ + //var requestUri = 'http://localhost:4002/tests/endpoints/FoodStoreDataServiceV4.svc/Foods'; + var requestUri ='http://localhost:4003/sap/bc/ds/odata/v4/ESMixPrimCollComp?$format=xml'; + OData.read(requestUri, success, errorFunc); + }); + $('#startJSON').on("click", function(){ + var requestUri = 'http://localhost:4002/tests/endpoints/FoodStoreDataServiceV4.svc/Foods'; + //var requestUri ='http://localhost:4003/sap/bc/ds/odata/v4/ESMixPrimCollComp?$format=json'; + OData.read(requestUri, success, errorFunc); + }); + + $('#btnMetaData').on("click", function(){ + var oHeaders = { + 'Accept': 'text/html,application/xhtml+xml,application/xml,application/json;odata.metadata=full', + "Odata-Version": "4.0", + "OData-MaxVersion": "4.0", + "Prefer": "odata.allow-entityreferences" + }; + var metadataRequest = + { + headers: oHeaders, + //requestUri: "http://services.odata.org/OData/OData.svc/$metadata", + requestUri: "http://localhost:4002/tests/endpoints/FoodStoreDataServiceV4.svc/$metadata", //"http://localhost:6630/PrimitiveKeys.svc/$metadata", + data: null, + }; + + OData.read(metadataRequest, success, errorFunc,OData.metadataHandler); + }); + $('#btnJSONwithMetaData').on("click", function(){ + var oHeaders = { + 'Accept': 'text/html,application/xhtml+xml,application/xml,application/json;odata.metadata=full', + "Odata-Version": "4.0", + "OData-MaxVersion": "4.0", + "Prefer": "odata.allow-entityreferences" + }; + var metadataRequest = + { + headers: oHeaders, + //requestUri: "http://services.odata.org/OData/OData.svc/$metadata", + requestUri: "http://localhost:4002/tests/endpoints/FoodStoreDataServiceV4.svc/$metadata", //"http://localhost:6630/PrimitiveKeys.svc/$metadata", + data: null, + }; + + var metaDatasuccess = function(metadata){ + var requestUri = 'http://localhost:4002/tests/endpoints/FoodStoreDataServiceV4.svc/Foods'; + OData.read(requestUri, success, errorFunc, null, null, metadata); + } + + + OData.read(metadataRequest, metaDatasuccess, errorFunc,OData.metadataHandler); + }); + + </script> + </body> +</html> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/54486148/datajs/demo/testerV2.html ---------------------------------------------------------------------- diff --git a/datajs/demo/testerV2.html b/datajs/demo/testerV2.html new file mode 100644 index 0000000..e21e364 --- /dev/null +++ b/datajs/demo/testerV2.html @@ -0,0 +1,55 @@ +<html> + <head> + <meta http-equiv="X-UA-Compatible" content="IE=Edge" /> + <title>datajs startup perf test</title> + <script type="text/javascript" src="./jscripts/jquery-1.11.1.min.js"></script> + <script type="text/javascript" src="./jscripts/underscore-min.js" ></script> + <script type="text/javascript" src="./jscripts/backbone-min.js" ></script> + <script type="text/javascript" src="./jscripts/datajs-1.1.2.js"></script> + <!--https://github.com/warfares/pretty-json/blob/master/index.html--> + <script type="text/javascript" src="./jscripts/pretty-json-min.js" ></script> + + </head> + <body> + <button id="startXML">startXML</button><br/> + <button id="startJSON">startJSON</button><br/> + <div id='resultsArea'> + + </div> + <script type='text/html' id='template'> + {{#items}} + <p><a href="{{id}}">{{name}}</a></p> + {{/items}} + </script> + <script> + function success(data) { + $('#resultsArea').empty(); + //$('#resultsArea').html(Mustache.render($('#template').html(), {items:data})); + //var out = JSON.stringify(data, null, 4) + //$('#resultsArea').html(out); + var node = new PrettyJSON.view.Node({ + el:$('#resultsArea'), + data: data, + }); + node.expandAll(); + } + + function errorFunc(err) { + $('#resultsArea').empty(); + $("#resultsArea").text(JSON.stringify(err)); + } + + $('#startXML').on("click", function(){ + //var requestUri = 'http://localhost:4002/tests/endpoints/FoodStoreDataServiceV4.svc/Foods'; + var requestUri ='http://localhost:4003/sap/bc/odata/Employees'; + OData.read(requestUri, success, errorFunc); + }); + $('#startJSON').on("click", function(){ + //var requestUri = 'http://localhost:4002/tests/endpoints/FoodStoreDataServiceV4.svc/Foods'; + var requestUri ='http://localhost:4003/sap/bc/odata/Employees?$format=json'; + OData.read(requestUri, success, errorFunc); + }); + + </script> + </body> +</html> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/54486148/datajs/package.json ---------------------------------------------------------------------- diff --git a/datajs/package.json b/datajs/package.json index a45f2e8..e047bb8 100644 --- a/datajs/package.json +++ b/datajs/package.json @@ -21,14 +21,14 @@ "email": "[email protected]" } ], - "scripts": { - }, + "scripts": {}, "devDependencies": { "browserify": "^4.1.5", "grunt": "^0.4.5", "grunt-browserify": "^2.1.0", "grunt-connect-proxy": "^0.1.10", "grunt-contrib-connect": "^0.7.1", + "grunt-contrib-copy": "^0.5.0", "grunt-contrib-uglify": "^0.4.0", "grunt-node-qunit": "^2.0.2" } http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/54486148/datajs/src/lib/odata.js ---------------------------------------------------------------------- diff --git a/datajs/src/lib/odata.js b/datajs/src/lib/odata.js index 7c44a19..47cc503 100644 --- a/datajs/src/lib/odata.js +++ b/datajs/src/lib/odata.js @@ -100,7 +100,7 @@ exports.defaultHandler = { accept: "application/json;q=0.9, application/atomsvc+xml;q=0.8, */*;q=0.1" }; -exports.defaultMetadata = []; +exports.defaultMetadata = []; //TODO check why is the defaultMetadata an Array? and not an Object. exports.read = function (urlOrRequest, success, error, handler, httpClient, metadata) { /// <summary>Reads data from the specified URL.</summary> @@ -155,7 +155,13 @@ exports.request = function (request, success, error, handler, httpClient, metada odataUtils.prepareRequest(request, handler, context); return odataUtils.invokeRequest(request, success, error, handler, httpClient, context); } catch (err) { - error(err); + // errors in success handler for sync requests are catched here and result in error handler calls. + // So here we fix this and throw that error further. + if (err.bIsSuccessHandlerError) { + throw err; + } else { + error(err); + } } }; http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/54486148/datajs/src/lib/odata/json-light.js ---------------------------------------------------------------------- diff --git a/datajs/src/lib/odata/json-light.js b/datajs/src/lib/odata/json-light.js index e00f146..3e97c56 100644 --- a/datajs/src/lib/odata/json-light.js +++ b/datajs/src/lib/odata/json-light.js @@ -536,7 +536,7 @@ var jsonLightReadObject = function (data, objectInfo, baseURI, model, recognizeD var obj = { __metadata: metadata }; var propertiesMetadata = {}; var baseTypeModel; - if (isEntry && dataModel && objectInfo.entitySet && objectInfo.contentTypeOdata == "minimalmetadata") { + if (isEntry && dataModel && objectInfo.entitySet && objectInfo.contentTypeOdata === "minimalmetadata") { var serviceURI = baseURI.substring(0, baseURI.lastIndexOf("$metadata")); baseTypeModel = null; // check if the key model is in a parent type. if (!dataModel.key) { http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/54486148/datajs/src/lib/odata/json.js ---------------------------------------------------------------------- diff --git a/datajs/src/lib/odata/json.js b/datajs/src/lib/odata/json.js index 5265c0e..d90225a 100644 --- a/datajs/src/lib/odata/json.js +++ b/datajs/src/lib/odata/json.js @@ -36,7 +36,7 @@ var normalizeURI = utils.normalizeURI; var parseInt10 = utils.parseInt10; var contentType = oDataUtils.contentType; -var jsonLightReadPayload = oDataUtils.jsonLightReadPayload; +var jsonLightReadPayload = oJsonLight.jsonLightReadPayload; var formatDateTimeOffset = oDataUtils.formatDateTimeOffset; var formatDuration = oDataUtils.formatDuration; var formatJsonLight = oDataUtils.formatJsonLight; @@ -119,7 +119,9 @@ var jsonApplyMetadata = function (value, metadata, dateParser, recognizeDates) { value[propertyName] = propertyValue; } } else if (property.type === "Edm.Time") { - value[propertyName] = parseDuration(propertyValue); + if (propertyValue) { + value[propertyName] = parseDuration(propertyValue); + } } } } @@ -242,14 +244,21 @@ var jsonParser = function (handler, text, context) { /// <param name="context" type="Object">Object with parsing context.</param> /// <returns>An object representation of the OData payload.</returns> + var recognizeDates = defined(context.recognizeDates, handler.recognizeDates); + var inferJsonLightFeedAsObject = defined(context.inferJsonLightFeedAsObject, handler.inferJsonLightFeedAsObject); + var model = context.metadata; var dataServiceVersion = context.dataServiceVersion; var json = (typeof text === "string") ? JSON.parse(text) : text; - if ((maxVersion("4.0", dataServiceVersion) === dataServiceVersion)) { + + if (utils.isArray(context.metadata)) { return json; + } else { + return jsonLightReadPayload(json, model, recognizeDates, inferJsonLightFeedAsObject, context.contentType.properties['odata.metadata']); } - return undefined; + + }; var jsonToString = function (data) { @@ -263,9 +272,10 @@ var jsonToString = function (data) { try { // Set our own date.toJSON function Date.prototype.toJSON = function () { - return formatDateTimeOffset(this); + return formatDateTimeOffsetJSON(this); }; result = JSON.stringify(data, jsonReplacer); + result = result.replace(/\/Date\(([0-9.+-]+)\)\//g, "\\/Date($1)\\/"); } finally { // Restore the original toJSON function Date.prototype.toJSON = dateToJSON; @@ -324,6 +334,8 @@ var jsonNormalizeData = function (data, baseURI) { var jsonHandler = oDataHandler.handler(jsonParser, jsonSerializer, jsonMediaType, MAX_DATA_SERVICE_VERSION); jsonHandler.recognizeDates = false; +jsonHandler.useJsonLight = true; +jsonHandler.inferJsonLightFeedAsObject = false; exports.jsonHandler = jsonHandler; http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/54486148/datajs/src/lib/odata/utils.js ---------------------------------------------------------------------- diff --git a/datajs/src/lib/odata/utils.js b/datajs/src/lib/odata/utils.js index f5c17f6..40e014a 100644 --- a/datajs/src/lib/odata/utils.js +++ b/datajs/src/lib/odata/utils.js @@ -185,6 +185,10 @@ var formatMilliseconds = function (ms, ns) { return ms; }; +var formatDateTimeOffsetJSON = function (value) { + return "\/Date(" + value.getTime() + ")\/"; +}; + var formatDateTimeOffset = function (value) { /// <summary>Formats a DateTime or DateTimeOffset value a string.</summary> /// <param name="value" type="Date" mayBeNull="false">Value to format.</param> @@ -329,8 +333,13 @@ var invokeRequest = function (request, success, error, handler, httpClient, cont error(err); return; } - - success(response.data, response); + // errors in success handler for sync requests result in error handler calls. So here we fix this. + try { + success(response.data, response); + } catch (err) { + err.bIsSuccessHandlerError = true; + throw err; + } }, error); }; @@ -555,7 +564,10 @@ var lookupDefaultEntityContainer = function (metadata) { /// <returns>An entity container description if the name is found; null otherwise.</returns> return forEachSchema(metadata, function (schema) { - return find(schema.entityContainer, function (container) { + if (isObject(schema.entityContainer)) { + return schema.entityContainer; + } + return find(schema.entityContainer, function (container) { //TODO check if in V4 there is only 1 entitycontainer return parseBool(container.isDefaultEntityContainer); }); }); @@ -653,14 +665,12 @@ var getEntitySetInfo = function (entitySetName, metadata) { /// <returns type="Object">The info about the entitySet.</returns> var info = forEachSchema(metadata, function (schema) { - var containers = schema.entityContainer; - for (var i = 0; i < containers.length; i++) { - var entitySets = containers[i].entitySet; - if (entitySets) { - for (var j = 0; j < entitySets.length; j++) { - if (entitySets[j].name == entitySetName) { - return { entitySet: entitySets[j], containerName: containers[i].name, functionImport: containers[i].functionImport }; - } + var container = schema.entityContainer; + var entitySets = container.entitySet; + if (entitySets) { + for (var j = 0; j < entitySets.length; j++) { + if (entitySets[j].name == entitySetName) { + return { entitySet: entitySets[j], containerName: container.name, functionImport: container.functionImport }; } } } @@ -1008,6 +1018,11 @@ var prepareRequest = function (request, handler, context) { if (!assigned(request.headers["OData-MaxVersion"])) { request.headers["OData-MaxVersion"] = handler.maxDataServiceVersion || "4.0"; } + + if (request.async === undefined) { + request.async = true; + } + }; var traverseInternal = function (item, owner, callback) { @@ -1091,6 +1106,7 @@ exports.GEOJSON_MULTIPOLYGON = GEOJSON_MULTIPOLYGON; exports.GEOJSON_GEOMETRYCOLLECTION = GEOJSON_GEOMETRYCOLLECTION; exports.forEachSchema = forEachSchema; exports.formatDateTimeOffset = formatDateTimeOffset; +exports.formatDateTimeOffsetJSON = formatDateTimeOffsetJSON; exports.formatDuration = formatDuration; exports.formatNumberWidth = formatNumberWidth; exports.getCanonicalTimezone = getCanonicalTimezone;
