You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ko...@apache.org on 2015/03/23 10:58:31 UTC
[01/22] olingo-odata4-js git commit: [OLINGO-442] Cleanup bevor
release
Repository: olingo-odata4-js
Updated Branches:
refs/heads/master 601cca192 -> 4621d41c8
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/tests/odatajs-cache-large-collection-functional-tests.html
----------------------------------------------------------------------
diff --git a/tests/odatajs-cache-large-collection-functional-tests.html b/tests/odatajs-cache-large-collection-functional-tests.html
index 49c687b..fab2bc4 100644
--- a/tests/odatajs-cache-large-collection-functional-tests.html
+++ b/tests/odatajs-cache-large-collection-functional-tests.html
@@ -20,7 +20,7 @@
-->
<html>
<head>
- <title>datajs.cache and datajs.store full local store tests</title>
+ <title>odatajs.cache and odatajs.store full local store tests</title>
<meta http-equiv="cache-control" content="no-cache"/>
<meta http-equiv="pragma" content="no-cache"/>
<meta http-equiv="expires" content="-1"/>
@@ -45,7 +45,7 @@
<script type="text/javascript" src="odatajs-cache-large-collection-functional-tests.js"></script>
</head>
<body>
- <h1 id="qunit-header">datajs.cache and datajs.store full local store tests</h1>
+ <h1 id="qunit-header">odatajs.cache and odatajs.store full local store tests</h1>
<h2 id="qunit-banner"></h2>
<h2 id="qunit-userAgent"></h2>
<ol id="qunit-tests"></ol>
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/tests/run-tests.wsf
----------------------------------------------------------------------
diff --git a/tests/run-tests.wsf b/tests/run-tests.wsf
index 263bae0..d28c699 100644
--- a/tests/run-tests.wsf
+++ b/tests/run-tests.wsf
@@ -20,7 +20,7 @@
-->
<job>
<runtime>
- <description>Test driver for running datajs tests - run from the same directory as the script</description>
+ <description>Test driver for running odatajs tests - run from the same directory as the script</description>
<comment>
Result codes:
0 - success
[18/22] olingo-odata4-js git commit: [OLINGO-442] Cleanup bevor
release
Posted by ko...@apache.org.
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/src/odata-json.js
----------------------------------------------------------------------
diff --git a/JSLib/src/odata-json.js b/JSLib/src/odata-json.js
deleted file mode 100644
index 0046e09..0000000
--- a/JSLib/src/odata-json.js
+++ /dev/null
@@ -1,338 +0,0 @@
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
-// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// odata-json.js
-
-(function (window, undefined) {
-
- var datajs = window.odatajs || {};
- var odata = window.odatajs.oData || {};
-
- // Imports
-
- var defined = odatajs.defined;
- var extend = odatajs.extend;
- var isArray = odatajs.isArray;
- var isDate = odatajs.isDate;
- var normalizeURI = odatajs.normalizeURI;
- var parseInt10 = odatajs.parseInt10;
-
- var contentType = odata.contentType;
- var jsonLightReadPayload = odata.jsonLightReadPayload;
- var formatDateTimeOffset = odata.formatDateTimeOffset;
- var formatDuration = odata.formatDuration;
- var formatJsonLight = odata.formatJsonLight;
- var formatNumberWidth = odata.formatNumberWidth;
- var getCanonicalTimezone = odata.getCanonicalTimezone;
- var handler = odata.handler;
- var isComplex = odata.isComplex;
- var lookupComplexType = odata.lookupComplexType;
- var lookupEntityType = odata.lookupEntityType;
- var MAX_DATA_SERVICE_VERSION = odata.MAX_DATA_SERVICE_VERSION;
- var maxVersion = odata.maxVersion;
- var parseDateTime = odata.parseDateTime;
- var parseDuration = odata.parseDuration;
- var parseTimezone = odata.parseTimezone;
- var payloadTypeOf = odata.payloadTypeOf;
- var traverse = odata.traverse;
- var formatJsonLightRequestPayload = odata.formatJsonLightRequestPayload;
-
- // CONTENT START
-
- var jsonMediaType = "application/json";
- var jsonContentType = contentType(jsonMediaType);
-
- var jsonReadAdvertisedActionsOrFunctions = function (value) {
- /// <summary>Reads and object containing action or function metadata and maps them into a single array of objects.</summary>
- /// <param name="value" type="Object">Object containing action or function metadata.</param>
- /// <returns type="Array">Array of objects containing metadata for the actions or functions specified in value.</returns>
-
- var result = [];
- for (var name in value) {
- var i, len;
- for (i = 0, len = value[name].length; i < len; i++) {
- result.push(extend({ metadata: name }, value[name][i]));
- }
- }
- return result;
- };
-
- var jsonApplyMetadata = function (value, metadata, dateParser, recognizeDates) {
- /// <summary>Applies metadata coming from both the payload and the metadata object to the value.</summary>
- /// <param name="value" type="Object">Data on which the metada is going to be applied.</param>
- /// <param name="metadata">Metadata store; one of edmx, schema, or an array of any of them.</param>
- /// <param name="dateParser" type="function">Function used for parsing datetime values.</param>
- /// <param name="recognizeDates" type="Boolean">
- /// True if strings formatted as datetime values should be treated as datetime values. False otherwise.
- /// </param>
- /// <returns type="Object">Transformed data.</returns>
-
- if (value && typeof value === "object") {
- var dataTypeName;
- var valueMetadata = value.__metadata;
-
- if (valueMetadata) {
- if (valueMetadata.actions) {
- valueMetadata.actions = jsonReadAdvertisedActionsOrFunctions(valueMetadata.actions);
- }
- if (valueMetadata.functions) {
- valueMetadata.functions = jsonReadAdvertisedActionsOrFunctions(valueMetadata.functions);
- }
- dataTypeName = valueMetadata && valueMetadata.type;
- }
-
- var dataType = lookupEntityType(dataTypeName, metadata) || lookupComplexType(dataTypeName, metadata);
- var propertyValue;
- if (dataType) {
- var properties = dataType.property;
- if (properties) {
- var i, len;
- for (i = 0, len = properties.length; i < len; i++) {
- var property = properties[i];
- var propertyName = property.name;
- propertyValue = value[propertyName];
-
- if (property.type === "Edm.DateTime" || property.type === "Edm.DateTimeOffset") {
- if (propertyValue) {
- propertyValue = dateParser(propertyValue);
- if (!propertyValue) {
- throw { message: "Invalid date/time value" };
- }
- value[propertyName] = propertyValue;
- }
- } else if (property.type === "Edm.Time") {
- value[propertyName] = parseDuration(propertyValue);
- }
- }
- }
- } else if (recognizeDates) {
- for (var name in value) {
- propertyValue = value[name];
- if (typeof propertyValue === "string") {
- value[name] = dateParser(propertyValue) || propertyValue;
- }
- }
- }
- }
- return value;
- };
-
- var isJsonLight = function (contentType) {
- /// <summary>Tests where the content type indicates a json light payload.</summary>
- /// <param name="contentType">Object with media type and properties dictionary.</param>
- /// <returns type="Boolean">True is the content type indicates a json light payload. False otherwise.</returns>
-
- if (contentType) {
- var odata = contentType.properties["odata.metadata"];
- return odata === "none" || odata === "minimal" || odata === "full";
- }
-
- return false;
- };
-
- var normalizeServiceDocument = function (data, baseURI) {
- /// <summary>Normalizes a JSON service document to look like an ATOM service document.</summary>
- /// <param name="data" type="Object">Object representation of service documents as deserialized.</param>
- /// <param name="baseURI" type="String">Base URI to resolve relative URIs.</param>
- /// <returns type="Object">An object representation of the service document.</returns>
- var workspace = { collections: [] };
-
- var i, len;
- for (i = 0, len = data.EntitySets.length; i < len; i++) {
- var title = data.EntitySets[i];
- var collection = {
- title: title,
- href: normalizeURI(title, baseURI)
- };
-
- workspace.collections.push(collection);
- }
-
- return { workspaces: [workspace] };
- };
-
- // The regular expression corresponds to something like this:
- // /Date(123+60)/
- //
- // This first number is date ticks, the + may be a - and is optional,
- // with the second number indicating a timezone offset in minutes.
- //
- // On the wire, the leading and trailing forward slashes are
- // escaped without being required to so the chance of collisions is reduced;
- // however, by the time we see the objects, the characters already
- // look like regular forward slashes.
- var jsonDateRE = /^\/Date\((-?\d+)(\+|-)?(\d+)?\)\/$/;
-
- var minutesToOffset = function (minutes) {
- /// <summary>Formats the given minutes into (+/-)hh:mm format.</summary>
- /// <param name="minutes" type="Number">Number of minutes to format.</param>
- /// <returns type="String">The minutes in (+/-)hh:mm format.</returns>
-
- var sign;
- if (minutes < 0) {
- sign = "-";
- minutes = -minutes;
- } else {
- sign = "+";
- }
-
- var hours = Math.floor(minutes / 60);
- minutes = minutes - (60 * hours);
-
- return sign + formatNumberWidth(hours, 2) + ":" + formatNumberWidth(minutes, 2);
- };
-
- var parseJsonDateString = function (value) {
- /// <summary>Parses the JSON Date representation into a Date object.</summary>
- /// <param name="value" type="String">String value.</param>
- /// <returns type="Date">A Date object if the value matches one; falsy otherwise.</returns>
-
- var arr = value && jsonDateRE.exec(value);
- if (arr) {
- // 0 - complete results; 1 - ticks; 2 - sign; 3 - minutes
- var result = new Date(parseInt10(arr[1]));
- if (arr[2]) {
- var mins = parseInt10(arr[3]);
- if (arr[2] === "-") {
- mins = -mins;
- }
-
- // The offset is reversed to get back the UTC date, which is
- // what the API will eventually have.
- var current = result.getUTCMinutes();
- result.setUTCMinutes(current - mins);
- result.__edmType = "Edm.DateTimeOffset";
- result.__offset = minutesToOffset(mins);
- }
- if (!isNaN(result.valueOf())) {
- return result;
- }
- }
-
- // Allow undefined to be returned.
- };
-
- // Some JSON implementations cannot produce the character sequence \/
- // which is needed to format DateTime and DateTimeOffset into the
- // JSON string representation defined by the OData protocol.
- // See the history of this file for a candidate implementation of
- // a 'formatJsonDateString' function.
-
- var jsonParser = function (handler, text, context) {
- /// <summary>Parses a JSON OData payload.</summary>
- /// <param name="handler">This handler.</param>
- /// <param name="text">Payload text (this parser also handles pre-parsed objects).</param>
- /// <param name="context" type="Object">Object with parsing context.</param>
- /// <returns>An object representation of the OData payload.</returns>
-
- var dataServiceVersion = context.dataServiceVersion;
- var json = (typeof text === "string") ? window.JSON.parse(text) : text;
-
- if ((maxVersion("4.0", dataServiceVersion) === dataServiceVersion)) {
- return json;
- }
-
- return undefined;
- };
-
- var jsonToString = function (data) {
- /// <summary>Converts the data into a JSON string.</summary>
- /// <param name="data">Data to serialize.</param>
- /// <returns type="String">The JSON string representation of data.</returns>
-
- var result; // = undefined;
- // Save the current date.toJSON function
- var dateToJSON = Date.prototype.toJSON;
- try {
- // Set our own date.toJSON function
- Date.prototype.toJSON = function () {
- return formatDateTimeOffset(this);
- };
- result = window.JSON.stringify(data, jsonReplacer);
- } finally {
- // Restore the original toJSON function
- Date.prototype.toJSON = dateToJSON;
- }
- return result;
- };
-
- var jsonSerializer = function (handler, data, context) {
- /// <summary>Serializes the data by returning its string representation.</summary>
- /// <param name="handler">This handler.</param>
- /// <param name="data">Data to serialize.</param>
- /// <param name="context" type="Object">Object with serialization context.</param>
- /// <returns type="String">The string representation of data.</returns>
-
- var dataServiceVersion = context.dataServiceVersion || "4.0";
- var cType = context.contentType = context.contentType || jsonContentType;
-
- if (cType && cType.mediaType === jsonContentType.mediaType) {
- context.dataServiceVersion = maxVersion(dataServiceVersion, "4.0");
- var newdata = formatJsonLightRequestPayload(data);
- if (newdata) {
- return window.JSON.stringify(newdata);
- }
- }
-
- return undefined;
- };
-
- var jsonReplacer = function (_, value) {
- /// <summary>JSON replacer function for converting a value to its JSON representation.</summary>
- /// <param value type="Object">Value to convert.</param>
- /// <returns type="String">JSON representation of the input value.</returns>
- /// <remarks>
- /// This method is used during JSON serialization and invoked only by the JSON.stringify function.
- /// It should never be called directly.
- /// </remarks>
-
- if (value && value.__edmType === "Edm.Time") {
- return formatDuration(value);
- } else {
- return value;
- }
- };
-
- var jsonNormalizeData = function (data, baseURI) {
- /// <summary>
- /// Normalizes the specified data into an intermediate representation.
- /// like the latest supported version.
- /// </summary>
- /// <param name="data" optional="false">Data to update.</param>
- /// <param name="baseURI" optional="false">URI to use as the base for normalizing references.</param>
-
- var isSvcDoc = isComplex(data) && !data.__metadata && isArray(data.EntitySets);
- return isSvcDoc ? normalizeServiceDocument(data, baseURI) : data;
- };
-
- var jsonHandler = handler(jsonParser, jsonSerializer, jsonMediaType, MAX_DATA_SERVICE_VERSION);
- jsonHandler.recognizeDates = false;
-
- odata.jsonHandler = jsonHandler;
-
-
-
- // DATAJS INTERNAL START
- odata.jsonParser = jsonParser;
- odata.jsonSerializer = jsonSerializer;
- odata.jsonNormalizeData = jsonNormalizeData;
- odata.normalizeServiceDocument = normalizeServiceDocument;
- odata.parseJsonDateString = parseJsonDateString;
- // DATAJS INTERNAL END
-
- // CONTENT END
-})(this);
-
-
-
-
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/src/odata-metadata.js
----------------------------------------------------------------------
diff --git a/JSLib/src/odata-metadata.js b/JSLib/src/odata-metadata.js
deleted file mode 100644
index 4908fc0..0000000
--- a/JSLib/src/odata-metadata.js
+++ /dev/null
@@ -1,516 +0,0 @@
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
-// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// odata-metadata.js
-
-(function (window, undefined) {
-
- var datajs = window.odatajs || {};
- var odata = window.OData || {};
-
- // imports
-
- var contains = odatajs.contains;
- var normalizeURI = odatajs.normalizeURI;
- var xmlAttributes = odatajs.xmlAttributes;
- var xmlChildElements = odatajs.xmlChildElements;
- var xmlFirstChildElement = odatajs.xmlFirstChildElement;
- var xmlInnerText = odatajs.xmlInnerText;
- var xmlLocalName = odatajs.xmlLocalName;
- var xmlNamespaceURI = odatajs.xmlNamespaceURI;
- var xmlNS = odatajs.xmlNS;
- var xmlnsNS = odatajs.xmlnsNS;
- var xmlParse = odatajs.xmlParse;
-
- var edmxNs = odata.edmxNs;
- var edmNs1 = odata.edmNs1;
- var handler = odata.handler;
- var MAX_DATA_SERVICE_VERSION = odata.MAX_DATA_SERVICE_VERSION;
- var odataMetaXmlNs = odata.odataMetaXmlNs;
-
-
- var xmlMediaType = "application/xml";
-
- // CONTENT START
-
- var schemaElement = function (attributes, elements, text, ns) {
- /// <summary>Creates an object that describes an element in an schema.</summary>
- /// <param name="attributes" type="Array">List containing the names of the attributes allowed for this element.</param>
- /// <param name="elements" type="Array">List containing the names of the child elements allowed for this element.</param>
- /// <param name="text" type="Boolean">Flag indicating if the element's text value is of interest or not.</param>
- /// <param name="ns" type="String">Namespace to which the element belongs to.</param>
- /// <remarks>
- /// If a child element name ends with * then it is understood by the schema that that child element can appear 0 or more times.
- /// </remarks>
- /// <returns type="Object">Object with attributes, elements, text, and ns fields.</returns>
-
- return {
- attributes: attributes,
- elements: elements,
- text: text || false,
- ns: ns
- };
- };
-
- // It's assumed that all elements may have Documentation children and Annotation elements.
- // See http://docs.oasis-open.org/odata/odata/v4.0/cs01/part3-csdl/odata-v4.0-cs01-part3-csdl.html for a CSDL reference.
- var schema = {
- elements: {
- Action: schemaElement(
- /*attributes*/["Name", "IsBound", "EntitySetPath"],
- /*elements*/["ReturnType", "Parameter*", "Annotation*"]
- ),
- ActionImport: schemaElement(
- /*attributes*/["Name", "Action", "EntitySet", "Annotation*"]
- ),
- Annotation: schemaElement(
- /*attributes*/["Term", "Qualifier", "Binary", "Bool", "Date", "DateTimeOffset", "Decimal", "Duration", "EnumMember", "Float", "Guid", "Int", "String", "TimeOfDay", "AnnotationPath", "NavigationPropertyPath", "Path", "PropertyPath", "UrlRef"],
- /*elements*/["Binary*", "Bool*", "Date*", "DateTimeOffset*", "Decimal*", "Duration*", "EnumMember*", "Float*", "Guid*", "Int*", "String*", "TimeOfDay*", "And*", "Or*", "Not*", "Eq*", "Ne*", "Gt*", "Ge*", "Lt*", "Le*", "AnnotationPath*", "Apply*", "Cast*", "Collection*", "If*", "IsOf*", "LabeledElement*", "LabeledElementReference*", "Null*", "NavigationPropertyPath*", "Path*", "PropertyPath*", "Record*", "UrlRef*", "Annotation*"]
- ),
- AnnotationPath: schemaElement(
- /*attributes*/null,
- /*elements*/null,
- /*text*/true
- ),
- Annotations: schemaElement(
- /*attributes*/["Target", "Qualifier"],
- /*elements*/["Annotation*"]
- ),
- Apply: schemaElement(
- /*attributes*/["Function"],
- /*elements*/["String*", "Path*", "LabeledElement*", "Annotation*"]
- ),
- And: schemaElement(
- /*attributes*/null,
- /*elements*/null,
- /*text*/true
- ),
- Or: schemaElement(
- /*attributes*/null,
- /*elements*/null,
- /*text*/true
- ),
- Not: schemaElement(
- /*attributes*/null,
- /*elements*/null,
- /*text*/true
- ),
- Eq: schemaElement(
- /*attributes*/null,
- /*elements*/null,
- /*text*/true
- ),
- Ne: schemaElement(
- /*attributes*/null,
- /*elements*/null,
- /*text*/true
- ),
- Gt: schemaElement(
- /*attributes*/null,
- /*elements*/null,
- /*text*/true
- ),
- Ge: schemaElement(
- /*attributes*/null,
- /*elements*/null,
- /*text*/true
- ),
- Lt: schemaElement(
- /*attributes*/null,
- /*elements*/null,
- /*text*/true
- ),
- Le: schemaElement(
- /*attributes*/null,
- /*elements*/null,
- /*text*/true
- ),
- Binary: schemaElement(
- /*attributes*/null,
- /*elements*/null,
- /*text*/true
- ),
- Bool: schemaElement(
- /*attributes*/null,
- /*elements*/null,
- /*text*/true
- ),
- Cast: schemaElement(
- /*attributes*/["Type"],
- /*elements*/["Path*", "Annotation*"]
- ),
- Collection: schemaElement(
- /*attributes*/null,
- /*elements*/["Binary*", "Bool*", "Date*", "DateTimeOffset*", "Decimal*", "Duration*", "EnumMember*", "Float*", "Guid*", "Int*", "String*", "TimeOfDay*", "And*", "Or*", "Not*", "Eq*", "Ne*", "Gt*", "Ge*", "Lt*", "Le*", "AnnotationPath*", "Apply*", "Cast*", "Collection*", "If*", "IsOf*", "LabeledElement*", "LabeledElementReference*", "Null*", "NavigationPropertyPath*", "Path*", "PropertyPath*", "Record*", "UrlRef*"]
- ),
- ComplexType: schemaElement(
- /*attributes*/["Name", "BaseType", "Abstract", "OpenType"],
- /*elements*/["Property*", "NavigationProperty*", "Annotation*"]
- ),
- Date: schemaElement(
- /*attributes*/null,
- /*elements*/null,
- /*text*/true
- ),
- DateTimeOffset: schemaElement(
- /*attributes*/null,
- /*elements*/null,
- /*text*/true
- ),
- Decimal: schemaElement(
- /*attributes*/null,
- /*elements*/null,
- /*text*/true
- ),
- Duration: schemaElement(
- /*attributes*/null,
- /*elements*/null,
- /*text*/true
- ),
- EntityContainer: schemaElement(
- /*attributes*/["Name", "Extends"],
- /*elements*/["EntitySet*", "Singleton*", "ActionImport*", "FunctionImport*", "Annotation*"]
- ),
- EntitySet: schemaElement(
- /*attributes*/["Name", "EntityType", "IncludeInServiceDocument"],
- /*elements*/["NavigationPropertyBinding*", "Annotation*"]
- ),
- EntityType: schemaElement(
- /*attributes*/["Name", "BaseType", "Abstract", "OpenType", "HasStream"],
- /*elements*/["Key*", "Property*", "NavigationProperty*", "Annotation*"]
- ),
- EnumMember: schemaElement(
- /*attributes*/null,
- /*elements*/null,
- /*text*/true
- ),
- EnumType: schemaElement(
- /*attributes*/["Name", "UnderlyingType", "IsFlags"],
- /*elements*/["Member*"]
- ),
- Float: schemaElement(
- /*attributes*/null,
- /*elements*/null,
- /*text*/true
- ),
- Function: schemaElement(
- /*attributes*/["Name", "IsBound", "IsComposable", "EntitySetPath"],
- /*elements*/["ReturnType", "Parameter*", "Annotation*"]
- ),
- FunctionImport: schemaElement(
- /*attributes*/["Name", "Function", "EntitySet", "IncludeInServiceDocument", "Annotation*"]
- ),
- Guid: schemaElement(
- /*attributes*/null,
- /*elements*/null,
- /*text*/true
- ),
- If: schemaElement(
- /*attributes*/null,
- /*elements*/["Path*", "String*", "Annotation*"]
- ),
- Int: schemaElement(
- /*attributes*/null,
- /*elements*/null,
- /*text*/true
- ),
- IsOf: schemaElement(
- /*attributes*/["Type", "MaxLength", "Precision", "Scale", "Unicode", "SRID", "DefaultValue", "Annotation*"],
- /*elements*/["Path*"]
- ),
- Key: schemaElement(
- /*attributes*/null,
- /*elements*/["PropertyRef*"]
- ),
- LabeledElement: schemaElement(
- /*attributes*/["Name"],
- /*elements*/["Binary*", "Bool*", "Date*", "DateTimeOffset*", "Decimal*", "Duration*", "EnumMember*", "Float*", "Guid*", "Int*", "String*", "TimeOfDay*", "And*", "Or*", "Not*", "Eq*", "Ne*", "Gt*", "Ge*", "Lt*", "Le*", "AnnotationPath*", "Apply*", "Cast*", "Collection*", "If*", "IsOf*", "LabeledElement*", "LabeledElementReference*", "Null*", "NavigationPropertyPath*", "Path*", "PropertyPath*", "Record*", "UrlRef*", "Annotation*"]
- ),
- LabeledElementReference: schemaElement(
- /*attributes*/["Term"],
- /*elements*/["Binary*", "Bool*", "Date*", "DateTimeOffset*", "Decimal*", "Duration*", "EnumMember*", "Float*", "Guid*", "Int*", "String*", "TimeOfDay*", "And*", "Or*", "Not*", "Eq*", "Ne*", "Gt*", "Ge*", "Lt*", "Le*", "AnnotationPath*", "Apply*", "Cast*", "Collection*", "If*", "IsOf*", "LabeledElement*", "LabeledElementReference*", "Null*", "NavigationPropertyPath*", "Path*", "PropertyPath*", "Record*", "UrlRef*"]
- ),
- Member: schemaElement(
- /*attributes*/["Name", "Value"],
- /*element*/["Annotation*"]
- ),
- NavigationProperty: schemaElement(
- /*attributes*/["Name", "Type", "Nullable", "Partner", "ContainsTarget"],
- /*elements*/["ReferentialConstraint*", "OnDelete*", "Annotation*"]
- ),
- NavigationPropertyBinding: schemaElement(
- /*attributes*/["Path", "Target"]
- ),
- NavigationPropertyPath: schemaElement(
- /*attributes*/null,
- /*elements*/null,
- /*text*/true
- ),
- Null: schemaElement(
- /*attributes*/null,
- /*elements*/["Annotation*"]
- ),
- OnDelete: schemaElement(
- /*attributes*/["Action"],
- /*elements*/["Annotation*"]
- ),
- Path: schemaElement(
- /*attributes*/null,
- /*elements*/null,
- /*text*/true
- ),
- Parameter: schemaElement(
- /*attributes*/["Name", "Type", "Nullable", "MaxLength", "Precision", "Scale", "SRID"],
- /*elements*/["Annotation*"]
- ),
- Property: schemaElement(
- /*attributes*/["Name", "Type", "Nullable", "MaxLength", "Precision", "Scale", "Unicode", "SRID", "DefaultValue"],
- /*elements*/["Annotation*"]
- ),
- PropertyPath: schemaElement(
- /*attributes*/null,
- /*elements*/null,
- /*text*/true
- ),
- PropertyRef: schemaElement(
- /*attributes*/["Name", "Alias"]
- ),
- PropertyValue: schemaElement(
- /*attributes*/["Property", "Path"],
- /*elements*/["Binary*", "Bool*", "Date*", "DateTimeOffset*", "Decimal*", "Duration*", "EnumMember*", "Float*", "Guid*", "Int*", "String*", "TimeOfDay*", "And*", "Or*", "Not*", "Eq*", "Ne*", "Gt*", "Ge*", "Lt*", "Le*", "AnnotationPath*", "Apply*", "Cast*", "Collection*", "If*", "IsOf*", "LabeledElement*", "LabeledElementReference*", "Null*", "NavigationPropertyPath*", "Path*", "PropertyPath*", "Record*", "UrlRef*", "Annotation*"]
- ),
- Record: schemaElement(
- /*attributes*/null,
- /*Elements*/["PropertyValue*", "Property*", "Annotation*"]
- ),
- ReferentialConstraint: schemaElement(
- /*attributes*/["Property", "ReferencedProperty", "Annotation*"]
- ),
- ReturnType: schemaElement(
- /*attributes*/["Type", "Nullable", "MaxLength", "Precision", "Scale", "SRID"]
- ),
- String: schemaElement(
- /*attributes*/null,
- /*elements*/null,
- /*text*/true
- ),
- Schema: schemaElement(
- /*attributes*/["Namespace", "Alias"],
- /*elements*/["Action*", "Annotations*", "Annotation*", "ComplexType*", "EntityContainer", "EntityType*", "EnumType*", "Function*", "Term*", "TypeDefinition*", "Annotation*"]
- ),
- Singleton: schemaElement(
- /*attributes*/["Name", "Type"],
- /*elements*/["NavigationPropertyBinding*", "Annotation*"]
- ),
- Term: schemaElement(
- /*attributes*/["Name", "Type", "BaseTerm", "DefaultValue ", "AppliesTo", "Nullable", "MaxLength", "Precision", "Scale", "SRID"],
- /*elements*/["Annotation*"]
- ),
- TimeOfDay: schemaElement(
- /*attributes*/null,
- /*elements*/null,
- /*text*/true
- ),
- TypeDefinition: schemaElement(
- /*attributes*/["Name", "UnderlyingType", "MaxLength", "Unicode", "Precision", "Scale", "SRID"],
- /*elements*/["Annotation*"]
- ),
- UrlRef: schemaElement(
- /*attributes*/null,
- /*elements*/["Binary*", "Bool*", "Date*", "DateTimeOffset*", "Decimal*", "Duration*", "EnumMember*", "Float*", "Guid*", "Int*", "String*", "TimeOfDay*", "And*", "Or*", "Not*", "Eq*", "Ne*", "Gt*", "Ge*", "Lt*", "Le*", "AnnotationPath*", "Apply*", "Cast*", "Collection*", "If*", "IsOf*", "LabeledElement*", "LabeledElementReference*", "Null*", "NavigationPropertyPath*", "Path*", "PropertyPath*", "Record*", "UrlRef*", "Annotation*"]
- ),
-
- // See http://msdn.microsoft.com/en-us/library/dd541238(v=prot.10) for an EDMX reference.
- Edmx: schemaElement(
- /*attributes*/["Version"],
- /*elements*/["DataServices", "Reference*"],
- /*text*/false,
- /*ns*/edmxNs
- ),
- DataServices: schemaElement(
- /*attributes*/["m:MaxDataServiceVersion", "m:DataServiceVersion"],
- /*elements*/["Schema*"],
- /*text*/false,
- /*ns*/edmxNs
- ),
- Reference: schemaElement(
- /*attributes*/["Uri"],
- /*elements*/["Include*", "IncludeAnnotations*", "Annotation*"]
- ),
- Include: schemaElement(
- /*attributes*/["Namespace", "Alias"]
- ),
- IncludeAnnotations: schemaElement(
- /*attributes*/["TermNamespace", "Qualifier", "TargetNamespace"]
- )
- }
- };
-
- var scriptCase = function (text) {
- /// <summary>Converts a Pascal-case identifier into a camel-case identifier.</summary>
- /// <param name="text" type="String">Text to convert.</param>
- /// <returns type="String">Converted text.</returns>
- /// <remarks>If the text starts with multiple uppercase characters, it is left as-is.</remarks>
-
- if (!text) {
- return text;
- }
-
- if (text.length > 1) {
- var firstTwo = text.substr(0, 2);
- if (firstTwo === firstTwo.toUpperCase()) {
- return text;
- }
-
- return text.charAt(0).toLowerCase() + text.substr(1);
- }
-
- return text.charAt(0).toLowerCase();
- };
-
- var getChildSchema = function (parentSchema, candidateName) {
- /// <summary>Gets the schema node for the specified element.</summary>
- /// <param name="parentSchema" type="Object">Schema of the parent XML node of 'element'.</param>
- /// <param name="candidateName">XML element name to consider.</param>
- /// <returns type="Object">The schema that describes the specified element; null if not found.</returns>
-
- var elements = parentSchema.elements;
- if (!elements) {
- return null;
- }
-
- var i, len;
- for (i = 0, len = elements.length; i < len; i++) {
- var elementName = elements[i];
- var multipleElements = false;
- if (elementName.charAt(elementName.length - 1) === "*") {
- multipleElements = true;
- elementName = elementName.substr(0, elementName.length - 1);
- }
-
- if (candidateName === elementName) {
- var propertyName = scriptCase(elementName);
- return { isArray: multipleElements, propertyName: propertyName };
- }
- }
-
- return null;
- };
-
- var isEdmNamespace = function (nsUri) {
- /// <summary>Checks whether the specifies namespace URI is one of the known CSDL namespace URIs.</summary>
- /// <param name="nsUri" type="String">Namespace URI to check.</param>
- /// <returns type="Boolean">true if nsURI is a known CSDL namespace; false otherwise.</returns>
-
- return nsUri === edmNs1;
- };
-
- var parseConceptualModelElement = function (element) {
- /// <summary>Parses a CSDL document.</summary>
- /// <param name="element">DOM element to parse.</param>
- /// <returns type="Object">An object describing the parsed element.</returns>
-
- var localName = xmlLocalName(element);
- var nsURI = xmlNamespaceURI(element);
- var elementSchema = schema.elements[localName];
- if (!elementSchema) {
- return null;
- }
-
- if (elementSchema.ns) {
- if (nsURI !== elementSchema.ns) {
- return null;
- }
- } else if (!isEdmNamespace(nsURI)) {
- return null;
- }
-
- var item = {};
- var attributes = elementSchema.attributes || [];
- xmlAttributes(element, function (attribute) {
-
- var localName = xmlLocalName(attribute);
- var nsURI = xmlNamespaceURI(attribute);
- var value = attribute.value;
-
- // Don't do anything with xmlns attributes.
- if (nsURI === xmlnsNS) {
- return;
- }
-
- // Currently, only m: for metadata is supported as a prefix in the internal schema table,
- // un-prefixed element names imply one a CSDL element.
- var schemaName = null;
- var handled = false;
- if (isEdmNamespace(nsURI) || nsURI === null) {
- schemaName = "";
- } else if (nsURI === odataMetaXmlNs) {
- schemaName = "m:";
- }
-
- if (schemaName !== null) {
- schemaName += localName;
-
- if (contains(attributes, schemaName)) {
- item[scriptCase(localName)] = value;
- }
- }
- });
-
- xmlChildElements(element, function (child) {
- var localName = xmlLocalName(child);
- var childSchema = getChildSchema(elementSchema, localName);
- if (childSchema) {
- if (childSchema.isArray) {
- var arr = item[childSchema.propertyName];
- if (!arr) {
- arr = [];
- item[childSchema.propertyName] = arr;
- }
- arr.push(parseConceptualModelElement(child));
- } else {
- item[childSchema.propertyName] = parseConceptualModelElement(child);
- }
- }
- });
-
- if (elementSchema.text) {
- item.text = xmlInnerText(element);
- }
-
- return item;
- };
-
- var metadataParser = function (handler, text) {
- /// <summary>Parses a metadata document.</summary>
- /// <param name="handler">This handler.</param>
- /// <param name="text" type="String">Metadata text.</param>
- /// <returns>An object representation of the conceptual model.</returns>
-
- var doc = xmlParse(text);
- var root = xmlFirstChildElement(doc);
- return parseConceptualModelElement(root) || undefined;
- };
-
- odata.metadataHandler = handler(metadataParser, null, xmlMediaType, MAX_DATA_SERVICE_VERSION);
-
- // DATAJS INTERNAL START
- odata.schema = schema;
- odata.scriptCase = scriptCase;
- odata.getChildSchema = getChildSchema;
- odata.parseConceptualModelElement = parseConceptualModelElement;
- odata.metadataParser = metadataParser;
- // DATAJS INTERNAL END
-
- // CONTENT END
-})(this);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/src/odata-net.js
----------------------------------------------------------------------
diff --git a/JSLib/src/odata-net.js b/JSLib/src/odata-net.js
deleted file mode 100644
index a87417b..0000000
--- a/JSLib/src/odata-net.js
+++ /dev/null
@@ -1,331 +0,0 @@
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
-// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// odata-net.js
-
-(function (window, undefined) {
-
- var datajs = window.odatajs || {};
- var odata = window.OData || {};
-
- // Imports.
-
- var defined = odatajs.defined;
- var delay = odatajs.delay;
-
- // CONTENT START
- var ticks = 0;
-
- var canUseJSONP = function (request) {
- /// <summary>
- /// Checks whether the specified request can be satisfied with a JSONP request.
- /// </summary>
- /// <param name="request">Request object to check.</param>
- /// <returns type="Boolean">true if the request can be satisfied; false otherwise.</returns>
-
- // Requests that 'degrade' without changing their meaning by going through JSONP
- // are considered usable.
- //
- // We allow data to come in a different format, as the servers SHOULD honor the Accept
- // request but may in practice return content with a different MIME type.
- if (request.method && request.method !== "GET") {
- return false;
- }
-
- return true;
- };
-
- var createIFrame = function (url) {
- /// <summary>Creates an IFRAME tag for loading the JSONP script</summary>
- /// <param name="url" type="String">The source URL of the script</param>
- /// <returns type="HTMLElement">The IFRAME tag</returns>
- var iframe = window.document.createElement("IFRAME");
- iframe.style.display = "none";
-
- var attributeEncodedUrl = url.replace(/&/g, "&").replace(/"/g, """).replace(/\</g, "<");
- var html = "<html><head><script type=\"text/javascript\" src=\"" + attributeEncodedUrl + "\"><\/script><\/head><body><\/body><\/html>";
-
- var body = window.document.getElementsByTagName("BODY")[0];
- body.appendChild(iframe);
-
- writeHtmlToIFrame(iframe, html);
- return iframe;
- };
-
- var createXmlHttpRequest = function () {
- /// <summary>Creates a XmlHttpRequest object.</summary>
- /// <returns type="XmlHttpRequest">XmlHttpRequest object.</returns>
- if (window.XMLHttpRequest) {
- return new window.XMLHttpRequest();
- }
- var exception;
- if (window.ActiveXObject) {
- try {
- return new window.ActiveXObject("Msxml2.XMLHTTP.6.0");
- } catch (_) {
- try {
- return new window.ActiveXObject("Msxml2.XMLHTTP.3.0");
- } catch (e) {
- exception = e;
- }
- }
- } else {
- exception = { message: "XMLHttpRequest not supported" };
- }
- throw exception;
- };
-
- var isAbsoluteUrl = function (url) {
- /// <summary>Checks whether the specified URL is an absolute URL.</summary>
- /// <param name="url" type="String">URL to check.</param>
- /// <returns type="Boolean">true if the url is an absolute URL; false otherwise.</returns>
-
- return url.indexOf("http://") === 0 ||
- url.indexOf("https://") === 0 ||
- url.indexOf("file://") === 0;
- };
-
- var isLocalUrl = function (url) {
- /// <summary>Checks whether the specified URL is local to the current context.</summary>
- /// <param name="url" type="String">URL to check.</param>
- /// <returns type="Boolean">true if the url is a local URL; false otherwise.</returns>
-
- if (!isAbsoluteUrl(url)) {
- return true;
- }
-
- // URL-embedded username and password will not be recognized as same-origin URLs.
- var location = window.location;
- var locationDomain = location.protocol + "//" + location.host + "/";
- return (url.indexOf(locationDomain) === 0);
- };
-
- var removeCallback = function (name, tick) {
- /// <summary>Removes a callback used for a JSONP request.</summary>
- /// <param name="name" type="String">Function name to remove.</param>
- /// <param name="tick" type="Number">Tick count used on the callback.</param>
- try {
- delete window[name];
- } catch (err) {
- window[name] = undefined;
- if (tick === ticks - 1) {
- ticks -= 1;
- }
- }
- };
-
- var removeIFrame = function (iframe) {
- /// <summary>Removes an iframe.</summary>
- /// <param name="iframe" type="Object">The iframe to remove.</param>
- /// <returns type="Object">Null value to be assigned to iframe reference.</returns>
- if (iframe) {
- writeHtmlToIFrame(iframe, "");
- iframe.parentNode.removeChild(iframe);
- }
-
- return null;
- };
-
- var readResponseHeaders = function (xhr, headers) {
- /// <summary>Reads response headers into array.</summary>
- /// <param name="xhr" type="XMLHttpRequest">HTTP request with response available.</param>
- /// <param name="headers" type="Array">Target array to fill with name/value pairs.</param>
-
- var responseHeaders = xhr.getAllResponseHeaders().split(/\r?\n/);
- var i, len;
- for (i = 0, len = responseHeaders.length; i < len; i++) {
- if (responseHeaders[i]) {
- var header = responseHeaders[i].split(": ");
- headers[header[0]] = header[1];
- }
- }
- };
-
- var writeHtmlToIFrame = function (iframe, html) {
- /// <summary>Writes HTML to an IFRAME document.</summary>
- /// <param name="iframe" type="HTMLElement">The IFRAME element to write to.</param>
- /// <param name="html" type="String">The HTML to write.</param>
- var frameDocument = (iframe.contentWindow) ? iframe.contentWindow.document : iframe.contentDocument.document;
- frameDocument.open();
- frameDocument.write(html);
- frameDocument.close();
- };
-
- odata.defaultHttpClient = {
- callbackParameterName: "$callback",
-
- formatQueryString: "$format=json",
-
- enableJsonpCallback: false,
-
- request: function (request, success, error) {
- /// <summary>Performs a network request.</summary>
- /// <param name="request" type="Object">Request description.</request>
- /// <param name="success" type="Function">Success callback with the response object.</param>
- /// <param name="error" type="Function">Error callback with an error object.</param>
- /// <returns type="Object">Object with an 'abort' method for the operation.</returns>
-
- var result = {};
- var xhr = null;
- var done = false;
- var iframe;
-
- result.abort = function () {
- iframe = removeIFrame(iframe);
- if (done) {
- return;
- }
-
- done = true;
- if (xhr) {
- xhr.abort();
- xhr = null;
- }
-
- error({ message: "Request aborted" });
- };
-
- var handleTimeout = function () {
- iframe = removeIFrame(iframe);
- if (!done) {
- done = true;
- xhr = null;
- error({ message: "Request timed out" });
- }
- };
-
- var name;
- var url = request.requestUri;
- var enableJsonpCallback = defined(request.enableJsonpCallback, this.enableJsonpCallback);
- var callbackParameterName = defined(request.callbackParameterName, this.callbackParameterName);
- var formatQueryString = defined(request.formatQueryString, this.formatQueryString);
- if (!enableJsonpCallback || isLocalUrl(url)) {
-
- xhr = createXmlHttpRequest();
- xhr.onreadystatechange = function () {
- if (done || xhr === null || xhr.readyState !== 4) {
- return;
- }
-
- // Workaround for XHR behavior on IE.
- var statusText = xhr.statusText;
- var statusCode = xhr.status;
- if (statusCode === 1223) {
- statusCode = 204;
- statusText = "No Content";
- }
-
- var headers = [];
- readResponseHeaders(xhr, headers);
-
- var response = { requestUri: url, statusCode: statusCode, statusText: statusText, headers: headers, body: xhr.responseText };
-
- done = true;
- xhr = null;
- if (statusCode >= 200 && statusCode <= 299) {
- success(response);
- } else {
- error({ message: "HTTP request failed", request: request, response: response });
- }
- };
-
- xhr.open(request.method || "GET", url, true, request.user, request.password);
-
- // Set the name/value pairs.
- if (request.headers) {
- for (name in request.headers) {
- xhr.setRequestHeader(name, request.headers[name]);
- }
- }
-
- // Set the timeout if available.
- if (request.timeoutMS) {
- xhr.timeout = request.timeoutMS;
- xhr.ontimeout = handleTimeout;
- }
-
- xhr.send(request.body);
- } else {
- if (!canUseJSONP(request)) {
- throw { message: "Request is not local and cannot be done through JSONP." };
- }
-
- var tick = ticks;
- ticks += 1;
- var tickText = tick.toString();
- var succeeded = false;
- var timeoutId;
- name = "handleJSONP_" + tickText;
- window[name] = function (data) {
- iframe = removeIFrame(iframe);
- if (!done) {
- succeeded = true;
- window.clearTimeout(timeoutId);
- removeCallback(name, tick);
-
- // Workaround for IE8 and IE10 below where trying to access data.constructor after the IFRAME has been removed
- // throws an "unknown exception"
- if (window.ActiveXObject) {
- data = window.JSON.parse(window.JSON.stringify(data));
- }
-
- var headers;
- if (!formatQueryString || formatQueryString == "$format=json") {
- headers = { "Content-Type": "application/json;odata.metadata=minimal", "OData-Version": "4.0" };
- } else {
- // the formatQueryString should be in the format of "$format=xxx", xxx should be one of the application/json;odata.metadata=minimal(none or full)
- // set the content-type with the string xxx which stars from index 8.
- headers = { "Content-Type": formatQueryString.substring(8), "OData-Version": "4.0" };
- }
-
- // Call the success callback in the context of the parent window, instead of the IFRAME
- delay(function () {
- removeIFrame(iframe);
- success({ body: data, statusCode: 200, headers: headers });
- });
- }
- };
-
- // Default to two minutes before timing out, 1000 ms * 60 * 2 = 120000.
- var timeoutMS = (request.timeoutMS) ? request.timeoutMS : 120000;
- timeoutId = window.setTimeout(handleTimeout, timeoutMS);
-
- var queryStringParams = callbackParameterName + "=parent." + name;
- if (formatQueryString) {
- queryStringParams += "&" + formatQueryString;
- }
-
- var qIndex = url.indexOf("?");
- if (qIndex === -1) {
- url = url + "?" + queryStringParams;
- } else if (qIndex === url.length - 1) {
- url = url + queryStringParams;
- } else {
- url = url + "&" + queryStringParams;
- }
-
- iframe = createIFrame(url);
- }
-
- return result;
- }
- };
-
- // DATAJS INTERNAL START
- odata.canUseJSONP = canUseJSONP;
- odata.isAbsoluteUrl = isAbsoluteUrl;
- odata.isLocalUrl = isLocalUrl;
- // DATAJS INTERNAL END
-
- // CONTENT END
-})(this);
\ No newline at end of file
[13/22] olingo-odata4-js git commit: [OLINGO-442] Cleanup bevor
release
Posted by ko...@apache.org.
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/code/ReflectionDataContext.cs
----------------------------------------------------------------------
diff --git a/JSLib/tests/code/ReflectionDataContext.cs b/JSLib/tests/code/ReflectionDataContext.cs
deleted file mode 100644
index eb70949..0000000
--- a/JSLib/tests/code/ReflectionDataContext.cs
+++ /dev/null
@@ -1,742 +0,0 @@
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
-// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-namespace DataJS.Tests
-{
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.Collections.ObjectModel;
- using Microsoft.OData.Service;
- using Microsoft.OData.Service.Common;
- using System.Globalization;
- using System.Linq;
- using System.Reflection;
-
- /// <summary>
- /// Provides a reflection-based, updatable data context.
- /// </summary>
- public abstract class ReflectionDataContext
- {
- // Fields
- private List<object> deletedObjects = new List<object>();
- private List<Action> pendingChanges;
- private static Dictionary<Type, Dictionary<string, IList>> resourceSetsByContextTypeStorage = new Dictionary<Type, Dictionary<string, IList>>();
-
- // Methods
- protected ReflectionDataContext()
- {
- this.MetadataHelper = new ReflectionMetadataHelper(this);
- this.pendingChanges = new List<Action>();
- if (!resourceSetsByContextTypeStorage.ContainsKey(base.GetType()))
- {
- resourceSetsByContextTypeStorage.Add(base.GetType(), new Dictionary<string, IList>());
- foreach (string resourceSetName in this.MetadataHelper.GetResourceSetNames())
- {
- Type resourceType = this.MetadataHelper.GetResourceTypeOfSet(resourceSetName);
- IList listOfTInstance = Activator.CreateInstance(typeof(List<>).MakeGenericType(new Type[] { resourceType })) as IList;
- this.ResourceSetsStorage.Add(resourceSetName, listOfTInstance);
- }
- }
- this.EnsureDataIsInitialized();
- }
-
- public virtual void AddReferenceToCollection(object targetResource, string propertyName, object resourceToBeAdded)
- {
- ExceptionUtilities.CheckArgumentNotNull(targetResource, "targetResource");
- ExceptionUtilities.CheckArgumentNotNull(propertyName, "propertyName");
- ExceptionUtilities.CheckArgumentNotNull(resourceToBeAdded, "resourceToBeAdded");
- UpdatableToken targetToken = UpdatableToken.AssertIsToken(targetResource, "targetResource");
- targetResource = targetToken.Resource;
- resourceToBeAdded = UpdatableToken.AssertIsTokenAndResolve(resourceToBeAdded, "resourceToBeAdded");
- IList list = this.GetValue(targetToken, propertyName) as IList;
- ExceptionUtilities.CheckObjectNotNull(list, "Property '{0}' on type '{1}' was not a list", new object[] { propertyName, targetResource.GetType().Name });
- this.pendingChanges.Add(delegate {
- list.Add(resourceToBeAdded);
- });
- }
-
- public virtual void ClearChanges()
- {
- this.pendingChanges.Clear();
- }
-
- public void ClearData()
- {
- this.ResourceSetsStorage.Clear();
- }
-
- private static bool CompareETagValues(Dictionary<string, object> resourceCookieValues, IEnumerable<KeyValuePair<string, object>> concurrencyValues)
- {
- if (concurrencyValues.Count<KeyValuePair<string, object>>() != resourceCookieValues.Count)
- {
- return false;
- }
- foreach (KeyValuePair<string, object> keyValuePair in concurrencyValues)
- {
- if (!resourceCookieValues.ContainsKey(keyValuePair.Key))
- {
- return false;
- }
- if (keyValuePair.Value == null)
- {
- return (resourceCookieValues[keyValuePair.Key] == null);
- }
- if (!keyValuePair.Value.Equals(resourceCookieValues[keyValuePair.Key]))
- {
- return false;
- }
- }
- return true;
- }
-
- public virtual object CreateResource(string containerName, string fullTypeName)
- {
- ExceptionUtilities.CheckArgumentNotNull(fullTypeName, "fullTypeName");
- UpdatableToken token = this.InstantiateResourceType(fullTypeName);
- if (containerName != null)
- {
- this.pendingChanges.Add(delegate {
- this.GetResourceSetEntities(containerName).Add(token.Resource);
- });
- }
- return token;
- }
-
- private void DeleteAllReferences(object targetResource)
- {
- foreach (string currentSetName in this.MetadataHelper.GetResourceSetNames())
- {
- Type currentEntityType = this.MetadataHelper.GetResourceTypeOfSet(currentSetName);
- IList entitySetList = this.GetResourceSetEntities(currentSetName);
- foreach (NavigationPropertyInfo navigationProperty in this.MetadataHelper.GetNavigationProperties(GetResourceTypeFullName(currentEntityType)))
- {
- if (navigationProperty.CollectionElementType != null)
- {
- foreach (object currentEntityInstance in entitySetList)
- {
- this.RemoveResourceFromCollectionOnTargetResourceMatch(targetResource, navigationProperty, currentEntityInstance);
- }
- }
- else
- {
- ExceptionUtilities.CheckObjectNotNull(navigationProperty.PropertyInfo, "Invalid navigation property info", new object[0]);
- foreach (object currentEntityInstance in entitySetList)
- {
- this.SetEntityReferenceToNullOnTargetResourceMatch(targetResource, navigationProperty, currentEntityInstance);
- }
- }
- }
- }
- }
-
- public virtual void DeleteResource(object targetResource)
- {
- ExceptionUtilities.CheckArgumentNotNull(targetResource, "targetResource");
- targetResource = UpdatableToken.AssertIsTokenAndResolve(targetResource, "targetResource");
- string resourceSetName = this.GetResourceSetOfTargetResource(targetResource);
- ExceptionUtilities.CheckObjectNotNull(resourceSetName, "Unable to find set of the resource to delete", new object[0]);
- this.deletedObjects.Add(targetResource);
- IList resourceSetList = this.GetResourceSetEntities(resourceSetName);
- this.DeleteAllReferences(targetResource);
- this.pendingChanges.Add(delegate {
- resourceSetList.Remove(targetResource);
- });
- }
-
- protected abstract void EnsureDataIsInitialized();
-
- protected virtual Type GetCollectionPropertyType(string fullTypeName, string propertyName)
- {
- Type type = this.MetadataHelper.FindClrTypeByFullName(fullTypeName);
- Type collectionType = null;
- if (type != null)
- {
- PropertyInfo property = type.GetProperty(propertyName);
- if (property != null)
- {
- collectionType = property.PropertyType;
- }
- }
- return collectionType;
- }
-
- private Dictionary<string, object> GetConcurrencyValues(object targetResource)
- {
- Dictionary<string, object> etagValues = new Dictionary<string, object>();
- foreach (string etagProperty in this.MetadataHelper.GetETagPropertiesOfType(GetResourceTypeFullName(targetResource.GetType())))
- {
- etagValues.Add(etagProperty, targetResource.GetType().GetProperty(etagProperty).GetValue(targetResource, null));
- }
- return etagValues;
- }
-
- public virtual object GetResource(IQueryable query, string fullTypeName)
- {
- ExceptionUtilities.CheckArgumentNotNull(query, "query");
- object resource = null;
- foreach (object r in query)
- {
- ExceptionUtilities.Assert(resource == null, "Invalid Uri specified. The query '{0}' must refer to a single resource", new object[] { query.ToString() });
- resource = r;
- }
- if (resource == null)
- {
- return null;
- }
- if (fullTypeName != null)
- {
- this.ValidateResourceType(resource, fullTypeName);
- }
- return new UpdatableToken(resource);
- }
-
- public IList<T> GetResourceSetEntities<T>(string resourceSetName)
- {
- return (IList<T>) this.GetResourceSetEntities(resourceSetName);
- }
-
- internal IList GetResourceSetEntities(string resourceSetName)
- {
- IList entities;
- if (!this.ResourceSetsStorage.TryGetValue(resourceSetName, out entities))
- {
- Type elementType = this.MetadataHelper.GetResourceTypeOfSet(resourceSetName);
- entities = (IList) Activator.CreateInstance(typeof(List<>).MakeGenericType(new Type[] { elementType }));
- this.ResourceSetsStorage[resourceSetName] = entities;
- }
- return entities;
- }
-
- private string GetResourceSetOfTargetResource(object targetResource)
- {
- foreach (string currentResourceSetName in this.MetadataHelper.GetResourceSetNames())
- {
- if (this.GetResourceSetEntities(currentResourceSetName).Contains(targetResource))
- {
- return currentResourceSetName;
- }
- }
- return null;
- }
-
- public static string GetResourceTypeFullName(Type type)
- {
- return type.FullName.Replace('+', '_');
- }
-
- public virtual object GetValue(object targetResource, string propertyName)
- {
- ExceptionUtilities.CheckArgumentNotNull(targetResource, "targetResource");
- ExceptionUtilities.CheckArgumentNotNull(propertyName, "propertyName");
- UpdatableToken token = UpdatableToken.AssertIsToken(targetResource, "targetResource");
- if (token.PendingPropertyUpdates.ContainsKey(propertyName))
- {
- return token.PendingPropertyUpdates[propertyName];
- }
- targetResource = token.Resource;
- PropertyInfo pi = targetResource.GetType().GetProperty(propertyName);
- ExceptionUtilities.CheckObjectNotNull(pi, "Cannot find the property '{0}' on type '{1}'", new object[] { propertyName, targetResource.GetType().Name });
- object value = pi.GetValue(targetResource, null);
- if ((value != null) && (pi.PropertyType.Assembly == base.GetType().Assembly))
- {
- ExceptionUtilities.Assert(!this.MetadataHelper.IsTypeAnEntityType(pi.PropertyType), "GetValue should never be called for reference properties. Type was '{0}', property was '{1}'", new object[] { pi.PropertyType.FullName, propertyName });
- value = new UpdatableToken(value);
- }
- return value;
- }
-
- private UpdatableToken InstantiateResourceType(string fullTypeName)
- {
- Type t = this.MetadataHelper.FindClrTypeByFullName(fullTypeName);
- object instance = Activator.CreateInstance(t);
- UpdatableToken token = new UpdatableToken(instance);
- foreach (PropertyInfo p in t.GetProperties())
- {
- object generatedValue;
- PropertyInfo property = p;
- if (this.IsCollectionProperty(property))
- {
- Type collectionType = this.GetCollectionPropertyType(GetResourceTypeFullName(t), property.Name);
- if (collectionType != null)
- {
- object newCollection = Activator.CreateInstance(collectionType);
- token.PendingPropertyUpdates[property.Name] = newCollection;
- this.pendingChanges.Add(delegate {
- property.SetValue(instance, newCollection, null);
- });
- }
- }
- if (this.TryGetStoreGeneratedValue(fullTypeName, property.Name, out generatedValue))
- {
- token.PendingPropertyUpdates[property.Name] = generatedValue;
- this.pendingChanges.Add(delegate {
- property.SetValue(instance, generatedValue, null);
- });
- }
- }
- return token;
- }
-
- protected virtual bool IsCollectionProperty(PropertyInfo propertyInfo)
- {
- return ((typeof(IEnumerable).IsAssignableFrom(propertyInfo.PropertyType) && (propertyInfo.PropertyType != typeof(string))) && (propertyInfo.PropertyType != typeof(byte[])));
- }
-
- public virtual void RemoveReferenceFromCollection(object targetResource, string propertyName, object resourceToBeRemoved)
- {
- ExceptionUtilities.CheckArgumentNotNull(targetResource, "targetResource");
- ExceptionUtilities.CheckArgumentNotNull(propertyName, "propertyName");
- ExceptionUtilities.CheckArgumentNotNull(resourceToBeRemoved, "resourceToBeRemoved");
- UpdatableToken.AssertIsToken(targetResource, "targetResource");
- resourceToBeRemoved = UpdatableToken.AssertIsTokenAndResolve(resourceToBeRemoved, "resourceToBeRemoved");
- IList list = this.GetValue(targetResource, propertyName) as IList;
- ExceptionUtilities.CheckObjectNotNull(list, "Property '{0}' on type '{1}' was not a list", new object[] { propertyName, targetResource.GetType().Name });
- this.pendingChanges.Add(delegate {
- list.Remove(resourceToBeRemoved);
- });
- }
-
- private void RemoveResourceFromCollectionOnTargetResourceMatch(object targetResource, NavigationPropertyInfo navigationPropertyInfo, object currentEntityInstance)
- {
- IEnumerable childCollectionObject = navigationPropertyInfo.PropertyInfo.GetValue(currentEntityInstance, null) as IEnumerable;
- if (childCollectionObject.Cast<object>().Any<object>(delegate (object o) {
- return o == targetResource;
- }))
- {
- MethodInfo removeMethod = navigationPropertyInfo.PropertyInfo.PropertyType.GetMethod("Remove");
- this.pendingChanges.Add(delegate {
- removeMethod.Invoke(childCollectionObject, new object[] { targetResource });
- });
- }
- }
-
- public virtual object ResetResource(object resource)
- {
- ExceptionUtilities.CheckArgumentNotNull(resource, "resource");
- UpdatableToken token = UpdatableToken.AssertIsToken(resource, "resource");
- resource = token.Resource;
- token = new UpdatableToken(resource);
- object newInstance = Activator.CreateInstance(resource.GetType());
- ExceptionUtilities.CheckObjectNotNull(newInstance, "Cannot reset resource because unable to creating new instance of type '{0}' returns null", new object[] { resource.GetType().Name });
- foreach (string propertyToReset in this.MetadataHelper.GetPropertiesToReset(GetResourceTypeFullName(resource.GetType())))
- {
- PropertyInfo pi = newInstance.GetType().GetProperty(propertyToReset);
- ExceptionUtilities.CheckObjectNotNull(pi, "Cannot reset resource because unable to find property '{0}'", new object[] { propertyToReset });
- object newValue = pi.GetValue(newInstance, null);
- this.pendingChanges.Add(delegate {
- pi.SetValue(resource, newValue, null);
- });
- token.PendingPropertyUpdates[propertyToReset] = newValue;
- }
- return token;
- }
-
- public virtual object ResolveResource(object resource)
- {
- ExceptionUtilities.CheckArgumentNotNull(resource, "resource");
- return UpdatableToken.AssertIsTokenAndResolve(resource, "resource");
- }
-
- public virtual void SaveChanges()
- {
- foreach (Action pendingChange in this.pendingChanges)
- {
- pendingChange();
- }
- this.pendingChanges.Clear();
- foreach (object deleted in this.deletedObjects)
- {
- foreach (object entity in this.ResourceSetsStorage.SelectMany<KeyValuePair<string, IList>, object>(delegate (KeyValuePair<string, IList> p) {
- return p.Value.Cast<object>();
- }))
- {
- ExceptionUtilities.Assert(!object.ReferenceEquals(deleted, entity), "Found deleted entity!", new object[0]);
- foreach (PropertyInfo propertyInfo in entity.GetType().GetProperties())
- {
- object value = propertyInfo.GetValue(entity, null);
- ExceptionUtilities.Assert(!object.ReferenceEquals(deleted, value), "Found deleted entity!", new object[0]);
- IEnumerable enumerable = value as IEnumerable;
- if (enumerable != null)
- {
- foreach (object valueElement in enumerable.Cast<object>())
- {
- ExceptionUtilities.Assert(!object.ReferenceEquals(deleted, valueElement), "Found deleted entity!", new object[0]);
- }
- }
- }
- }
- }
- this.deletedObjects.Clear();
- }
-
- protected virtual void SetCollectionPropertyValue(object targetResource, PropertyInfo propertyInfo, IEnumerable propertyValue)
- {
- object collection;
- ExceptionUtilities.CheckArgumentNotNull(targetResource, "targetResource");
- ExceptionUtilities.CheckArgumentNotNull(propertyInfo, "propertyInfo");
- ExceptionUtilities.CheckArgumentNotNull(propertyValue, "propertyValue");
- Type collectionType = this.GetCollectionPropertyType(GetResourceTypeFullName(propertyInfo.ReflectedType), propertyInfo.Name);
- ExceptionUtilities.CheckObjectNotNull(collectionType, "Could not infer collection type for property", new object[0]);
- propertyValue = propertyValue.Cast<object>().Select<object, object>(delegate (object o) {
- return UpdatableToken.ResolveIfToken(o);
- });
- ConstructorInfo enumerableConstructor = collectionType.GetConstructor(new Type[] { typeof(IEnumerable) });
- if (enumerableConstructor != null)
- {
- collection = enumerableConstructor.Invoke(new object[] { propertyValue });
- }
- else if (collectionType.IsGenericType && (collectionType.GetGenericArguments().Count<Type>() == 1))
- {
- Type typeArgument = collectionType.GetGenericArguments().Single<Type>();
- ConstructorInfo typedEnumerableConstructor = collectionType.GetConstructor(new Type[] { typeof(IEnumerable<>).MakeGenericType(new Type[] { typeArgument }) });
- if (typedEnumerableConstructor != null)
- {
- object typedEnumerable = typeof(Enumerable).GetMethod("Cast").MakeGenericMethod(new Type[] { typeArgument }).Invoke(null, new object[] { propertyValue });
- collection = typedEnumerableConstructor.Invoke(new object[] { typedEnumerable });
- }
- else
- {
- MethodInfo typedAddMethod = collectionType.GetMethod("Add", new Type[] { typeArgument });
- ExceptionUtilities.CheckObjectNotNull(typedAddMethod, "Could not find constructor or add method for type: " + collectionType.FullName, new object[0]);
- collection = Activator.CreateInstance(collectionType);
- foreach (object element in propertyValue)
- {
- typedAddMethod.Invoke(collection, new object[] { element });
- }
- }
- }
- else
- {
- MethodInfo addMethod = collectionType.GetMethod("Add");
- ExceptionUtilities.CheckObjectNotNull(addMethod, "Could not find constructor or add method for type: " + collectionType.FullName, new object[0]);
- collection = Activator.CreateInstance(collectionType);
- foreach (object element in propertyValue)
- {
- addMethod.Invoke(collection, new object[] { element });
- }
- }
- propertyInfo.SetValue(targetResource, collection, null);
- }
-
- public virtual void SetConcurrencyValues(object resourceCookie, bool? checkForEquality, IEnumerable<KeyValuePair<string, object>> concurrencyValues)
- {
- ExceptionUtilities.CheckArgumentNotNull(resourceCookie, "resourceCookie");
- ExceptionUtilities.ThrowDataServiceExceptionIfFalse(checkForEquality.HasValue, 0x1a1, "Missing concurrency token for update operation", new object[0]);
- ExceptionUtilities.Assert(checkForEquality.Value, "Should not be called with check for equality parameter equal to false", new object[0]);
- ExceptionUtilities.CheckArgumentNotNull(concurrencyValues, "concurrencyValues");
- if (concurrencyValues.Any<KeyValuePair<string, object>>())
- {
- resourceCookie = UpdatableToken.AssertIsTokenAndResolve(resourceCookie, "resourceCookie");
- ExceptionUtilities.ThrowDataServiceExceptionIfFalse(CompareETagValues(this.GetConcurrencyValues(resourceCookie), concurrencyValues), 0x19c, "Concurrency tokens do not match", new object[0]);
- }
- }
-
- private void SetEntityReferenceToNullOnTargetResourceMatch(object targetResource, NavigationPropertyInfo navigationPropertyInfo, object currentEntityInstance)
- {
- if (navigationPropertyInfo.PropertyInfo.GetValue(currentEntityInstance, null) == targetResource)
- {
- this.pendingChanges.Add(delegate {
- navigationPropertyInfo.PropertyInfo.SetValue(currentEntityInstance, null, null);
- });
- }
- }
-
- public virtual void SetReference(object targetResource, string propertyName, object propertyValue)
- {
- ExceptionUtilities.CheckArgumentNotNull(targetResource, "targetResource");
- ExceptionUtilities.CheckArgumentNotNull(propertyName, "propertyName");
- if (propertyValue != null)
- {
- UpdatableToken.AssertIsToken(propertyValue, "propertyValue");
- }
- this.SetValue(targetResource, propertyName, propertyValue);
- }
-
- public virtual void SetValue(object targetResource, string propertyName, object propertyValue)
- {
- ExceptionUtilities.CheckArgumentNotNull(targetResource, "targetResource");
- ExceptionUtilities.CheckArgumentNotNull(propertyName, "propertyName");
- UpdatableToken token = UpdatableToken.AssertIsToken(targetResource, "targetResource");
- targetResource = token.Resource;
- token.PendingPropertyUpdates[propertyName] = propertyValue;
- this.pendingChanges.Add(delegate {
- object generatedValue;
- Type t = targetResource.GetType();
- PropertyInfo pi = t.GetProperty(propertyName);
- ExceptionUtilities.CheckObjectNotNull(pi, "Unable to find property '{0}' on type '{1}'", new object[] { propertyName, targetResource.GetType().Name });
- if (this.TryGetStoreGeneratedValue(GetResourceTypeFullName(t), propertyName, out generatedValue))
- {
- propertyValue = generatedValue;
- }
- if (this.IsCollectionProperty(pi))
- {
- ExceptionUtilities.CheckObjectNotNull(propertyValue, "Collection property value was null", new object[0]);
- IEnumerable enumerable = propertyValue as IEnumerable;
- ExceptionUtilities.CheckObjectNotNull(enumerable, "Collection property value was not an enumerable", new object[0]);
- this.SetCollectionPropertyValue(targetResource, pi, enumerable);
- }
- else
- {
- propertyValue = UpdatableToken.ResolveIfToken(propertyValue);
- pi.SetValue(targetResource, propertyValue, null);
- }
- });
- }
-
- protected virtual bool TryGetStoreGeneratedValue(string fullTypeName, string propertyName, out object propertyValue)
- {
- propertyValue = null;
- return false;
- }
-
- private void ValidateResourceType(object targetResource, string fullTypeName)
- {
- ExceptionUtilities.Assert(this.MetadataHelper.FindClrTypeByFullName(fullTypeName).IsAssignableFrom(targetResource.GetType()), "Invalid uri specified. expected type: '{0}', actual type: '{1}'", new object[] { fullTypeName, targetResource.GetType().FullName });
- }
-
- // Properties
- internal ReflectionMetadataHelper MetadataHelper { get; set; }
-
- internal Dictionary<string, IList> ResourceSetsStorage
- {
- get
- {
- Dictionary<string, IList> resourceSetsLookup = null;
- Type currentContextType = base.GetType();
- ExceptionUtilities.Assert(resourceSetsByContextTypeStorage.TryGetValue(currentContextType, out resourceSetsLookup), "Cannot find resource sets by the context type '{0}'", new object[] { currentContextType });
- return resourceSetsLookup;
- }
- }
-
- #region Inner types.
-
- internal class ReflectionMetadataHelper
- {
- // Fields
- private ReflectionDataContext reflectionDataContext;
-
- // Methods
- public ReflectionMetadataHelper(ReflectionDataContext reflectionDataContext)
- {
- this.reflectionDataContext = reflectionDataContext;
- }
-
- public Type FindClrTypeByFullName(string resourceTypeFullName)
- {
- Type type = this.reflectionDataContext.GetType().Assembly.GetTypes().Where<Type>(delegate (Type t) {
- return (ReflectionDataContext.GetResourceTypeFullName(t) == resourceTypeFullName);
- }).FirstOrDefault<Type>();
- ExceptionUtilities.CheckObjectNotNull(type, "Unable to find type '{0}'", new object[] { resourceTypeFullName });
- return type;
- }
-
- public string[] GetETagPropertiesOfType(string fullTypeName)
- {
- Type type = this.FindClrTypeByFullName(fullTypeName);
- List<string> etags = new List<string>();
- foreach (ETagAttribute customAttribute in type.GetCustomAttributes(typeof(ETagAttribute), true))
- {
- etags.AddRange(customAttribute.PropertyNames);
- }
-
- return etags.ToArray();
- }
-
- public string[] GetKeyProperties(string fullTypeName)
- {
- Type type = this.FindClrTypeByFullName(fullTypeName);
- List<string> keyPropertyList = new List<string>();
- foreach (PropertyInfo keyProperty in type.GetProperties().Where(pi => pi.Name.Contains("ID")))
- {
- keyPropertyList.Add(keyProperty.Name);
- }
-
- foreach (DataServiceKeyAttribute customAttribute in type.GetCustomAttributes(typeof(DataServiceKeyAttribute), true))
- {
- keyPropertyList.AddRange(customAttribute.KeyNames);
- }
-
- return keyPropertyList.ToArray();
- }
-
- public NavigationPropertyInfo[] GetNavigationProperties(string fullTypeName)
- {
- Type type = this.FindClrTypeByFullName(fullTypeName);
- var navigationProperties = new List<NavigationPropertyInfo>();
- var keyProperties = new List<string>(this.GetKeyProperties(fullTypeName));
- foreach (PropertyInfo pi in type.GetProperties())
- {
- if (!keyProperties.Contains(pi.Name))
- {
- if (this.IsTypeAnEntityType(pi.PropertyType))
- {
- navigationProperties.Add(new NavigationPropertyInfo(pi, null));
- }
-
- if (pi.PropertyType.IsGenericType && ((pi.PropertyType.GetGenericTypeDefinition() == typeof(List<>)) || (pi.PropertyType.GetGenericTypeDefinition() == typeof(Collection<>))))
- {
- Type elementType = pi.PropertyType.GetGenericArguments()[0];
- if (this.IsTypeAnEntityType(elementType))
- {
- navigationProperties.Add(new NavigationPropertyInfo(pi, elementType));
- }
- }
- }
- }
-
- return navigationProperties.ToArray();
- }
-
- public string[] GetPropertiesToReset(string fullTypeName)
- {
- Type type = this.FindClrTypeByFullName(fullTypeName);
- var keyProperties = new List<string>(this.GetKeyProperties(fullTypeName));
- var navigationProperties = new List<string>(this.GetNavigationProperties(fullTypeName).Select(ni =>ni.PropertyInfo.Name));
- return type.GetProperties().Where(
- pi => !keyProperties.Contains(pi.Name) && !navigationProperties.Contains(pi.Name)
- ).Select(pi => pi.Name).ToArray();
- }
-
- public string[] GetResourceSetNames()
- {
- return this.reflectionDataContext.GetType().GetProperties().Where(
- pi => pi.PropertyType.IsGenericType && (pi.PropertyType.GetGenericTypeDefinition() == typeof(IQueryable<>))
- ).Select(pi => pi.Name).ToArray();
- }
-
- public Type GetResourceTypeOfSet(string resourceSetName)
- {
- PropertyInfo resourceSetPropertyInfo = this.reflectionDataContext.GetType().GetProperties().Where(pi => pi.Name == resourceSetName).FirstOrDefault();
- ExceptionUtilities.CheckObjectNotNull(resourceSetPropertyInfo, "Error finding type of set '{0}'", new object[] { resourceSetName });
- return resourceSetPropertyInfo.PropertyType.GetGenericArguments()[0];
- }
-
- public bool IsTypeAnEntityType(Type t)
- {
- foreach (string setName in this.GetResourceSetNames())
- {
- if (this.GetResourceTypeOfSet(setName).IsAssignableFrom(t))
- {
- return true;
- }
- }
-
- return false;
- }
- }
-
- internal static class ExceptionUtilities
- {
- // Methods
- public static void Assert(bool condition, string errorMessage, params object[] messageArguments)
- {
- if (!condition)
- {
- throw new InvalidOperationException("Assertion failed: " + string.Format(CultureInfo.InvariantCulture, errorMessage, messageArguments));
- }
- }
-
- public static void CheckArgumentNotNull(object argument, string argumentName)
- {
- if (argument == null)
- {
- throw new ArgumentNullException(argumentName);
- }
- }
-
- public static void CheckCollectionNotEmpty<TElement>(IEnumerable<TElement> argument, string argumentName)
- {
- CheckArgumentNotNull(argument, argumentName);
- if (!argument.Any<TElement>())
- {
- throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, "Collection argument '{0}' must have at least one element.", new object[] { argumentName }));
- }
- }
-
- public static void CheckObjectNotNull(object value, string exceptionMessageFormatText, params object[] messageArguments)
- {
- Assert(exceptionMessageFormatText != null, "message cannnot be null", new object[0]);
- Assert(messageArguments != null, "messageArguments cannnot be null", new object[0]);
- if (value == null)
- {
- throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, exceptionMessageFormatText, messageArguments));
- }
- }
-
- public static void ThrowDataServiceExceptionIfFalse(bool condition, int statusCode, string errorMessage, params object[] messageArguments)
- {
- if (!condition)
- {
- throw new DataServiceException(statusCode, string.Format(CultureInfo.InvariantCulture, errorMessage, messageArguments));
- }
- }
- }
-
- public class UpdatableToken
- {
- // Methods
- public UpdatableToken(object resource)
- {
- ExceptionUtilities.CheckArgumentNotNull(resource, "resource");
- this.Resource = resource;
- this.PendingPropertyUpdates = new Dictionary<string, object>();
- }
-
- public static UpdatableToken AssertIsToken(object resource, string name)
- {
- ExceptionUtilities.CheckArgumentNotNull(resource, "resource");
- UpdatableToken token = resource as UpdatableToken;
- ExceptionUtilities.CheckObjectNotNull(token, "{0} was not a token. Type was: '{1}'", new object[] { name, resource.GetType() });
- return token;
- }
-
- public static object AssertIsTokenAndResolve(object resource, string name)
- {
- return AssertIsToken(resource, name).Resource;
- }
-
- public static object ResolveIfToken(object resource)
- {
- UpdatableToken token = resource as UpdatableToken;
- if (token != null)
- {
- resource = token.Resource;
- }
- return resource;
- }
-
- // Properties
- public IDictionary<string, object> PendingPropertyUpdates { get; set; }
-
- public object Resource { get; set; }
- }
-
- internal class NavigationPropertyInfo
- {
- // Methods
- internal NavigationPropertyInfo(PropertyInfo pi, Type collectionElementType)
- {
- this.PropertyInfo = pi;
- this.CollectionElementType = collectionElementType;
- }
-
- // Properties
- public Type CollectionElementType { get; set; }
-
- public PropertyInfo PropertyInfo { get; set; }
- }
-
- #endregion Inner types.
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/code/atomreader.cs
----------------------------------------------------------------------
diff --git a/JSLib/tests/code/atomreader.cs b/JSLib/tests/code/atomreader.cs
deleted file mode 100644
index 1b4e762..0000000
--- a/JSLib/tests/code/atomreader.cs
+++ /dev/null
@@ -1,796 +0,0 @@
-/// <summary>
-/// Class used to parse the Content section of the feed to return the properties data and metadata
-/// </summary>
-
-namespace DataJS.Tests
-{
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.ServiceModel.Syndication;
- using Microsoft.Spatial;
- using System.Xml;
- using System.Xml.Linq;
-
- public static class AtomReader
- {
- const string atomXmlNs = "http://www.w3.org/2005/Atom";
- const string gmlXmlNs = "http://www.opengis.net/gml";
- const string odataRelatedPrefix = "http://schemas.microsoft.com/ado/2007/08/dataservices/related";
- const string odataRelatedLinksPrefix = "http://schemas.microsoft.com/ado/2007/08/dataservices/relatedlinks";
- const string odataXmlNs = "http://schemas.microsoft.com/ado/2007/08/dataservices";
- const string odataMetaXmlNs = "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata";
- const string odataEditMediaPrefix = "http://schemas.microsoft.com/ado/2007/08/dataservices/edit-media";
- const string odataMediaResourcePrefix = "http://schemas.microsoft.com/ado/2007/08/dataservices/mediaresource";
-
- const string hrefAttribute = "href";
- const string titleElement = "title";
- const string workspaceElement = "workspace";
- const string workspacesProperty = "workspaces";
- const string collectionElement = "collection";
- const string collectionsProperty = "collections";
- const string extensionsProperty = "extensions";
- static string baseUri = string.Empty;
-
- /// <summary>
- /// Creates a service document object
- /// </summary>
- /// <param name="container">The XML container</param>
- /// <param name="uri">Uri to append to the href value</param>
- /// <returns>The service document JsonObject</returns>
- public static JsonObject ReadServiceDocument(TextReader payload, string baseUri)
- {
- JsonObject jsonObject = new JsonObject();
- XElement container = XElement.Load(payload);
-
- if (container != null && container.HasElements)
- {
- jsonObject["workspaces"] =
- container
- .Elements()
- .Where(element => element.Name.LocalName.Equals(workspaceElement))
- .Select(element => ReadWorkspaceObject(element, baseUri))
- .ToArray();
-
- jsonObject["extensions"] =
- container
- .Elements()
- .Where(element => !element.Name.LocalName.Equals(workspaceElement))
- .Select(element => ReadExtensionElement(element))
- .ToArray();
- }
-
- return jsonObject;
- }
-
- public static JsonObject ReadEntry(TextReader payload)
- {
- SyndicationItem item = SyndicationItem.Load(XmlReader.Create(payload));
- return ReadEntry(item);
- }
-
- public static JsonObject ReadFeed(TextReader payload)
- {
- SyndicationFeed feed = SyndicationFeed.Load(XmlReader.Create(payload));
- JsonObject feedData = new JsonObject();
- JsonObject feedMetadata = new JsonObject();
-
- feedData["results"] = feed.Items.Select(item => ReadEntry(item)).ToArray();
- feedData["__metadata"] = feedMetadata;
-
- feedMetadata["feed_extensions"] = feed.AttributeExtensions.Select(pair => ReadExtension(pair)).ToArray();
-
- if (feed.Id != null)
- {
- feedMetadata["uri"] = feed.Id;
- feedMetadata["uri_extensions"] = new JsonObject[] { };
- }
-
- if (feed.Title != null)
- {
- feedMetadata["title"] = feed.Title.Text;
- feedMetadata["title_extensions"] = GetTitleExtensions(feed.Title);
- }
-
- SyndicationLink feedSelfLink = GetLink("self", feed.Links);
- if (feedSelfLink != null)
- {
- feedMetadata["self"] = feedSelfLink.GetAbsoluteUri().AbsoluteUri;
- feedMetadata["self_extensions"] = GetLinkExtensions(feedSelfLink);
- }
-
- long? count = GetInlineCount(feed);
- if (count.HasValue)
- {
- feedData["__count"] = count.Value;
- }
-
- SyndicationLink feedNextLink = GetLink("next", feed.Links);
- if (feedNextLink != null)
- {
- feedData["__next"] = feedNextLink.GetAbsoluteUri().AbsoluteUri;
- feedMetadata["next_extensions"] = GetLinkExtensions(feedNextLink);
- }
-
- return feedData;
- }
-
- private static JsonObject ReadEntry(SyndicationItem item)
- {
- SyndicationLink entryEditLink = GetLink("edit", item.Links);
- SyndicationCategory entryCategory = item.Categories.FirstOrDefault();
-
- XElement propertiesElement = GetPropertiesElement(item);
- JsonObject entryData = ReadObject(propertiesElement);
- entryData = JsonObject.Merge(entryData, ReadNavigationProperties(item));
- entryData = JsonObject.Merge(entryData, ReadNamedStreams(item));
-
- JsonObject propertiesMetadata = ReadPropertiesMetadata(propertiesElement);
- propertiesMetadata = JsonObject.Merge(propertiesMetadata, ReadNavigationPropertiesMetadata(item));
- propertiesMetadata = JsonObject.Merge(propertiesMetadata, ReadNamedStreamMetadata(item));
-
- JsonObject entryMetadata = new JsonObject();
- entryData["__metadata"] = entryMetadata;
- entryMetadata["properties"] = propertiesMetadata;
-
- if (item.Id != null)
- {
- entryMetadata["uri"] = item.Id;
- entryMetadata["uri_extensions"] = new JsonObject[] { };
- }
-
- if (entryCategory != null)
- {
- entryMetadata["type"] = entryCategory.Name;
- entryMetadata["type_extensions"] = new JsonObject[] { };
- }
-
- if (entryEditLink != null)
- {
- entryMetadata["edit"] = entryEditLink.GetAbsoluteUri().AbsoluteUri;
- entryMetadata["edit_link_extensions"] = GetLinkExtensions(entryEditLink);
- }
-
- return entryData;
- }
-
- private static JsonObject ReadExtension(KeyValuePair<XmlQualifiedName, string> pair)
- {
- return ReaderUtils.CreateExtension(pair.Key.Name, pair.Key.Namespace, pair.Value);
- }
-
- private static string GetCollectionType(string type)
- {
- if (type != null && type.StartsWith("Collection("))
- {
- int start = 11;
- int end = type.IndexOf(")") - 11;
- return type.Substring(start, end);
- }
- return null;
- }
-
- /// <summary>
- /// Find the m:properties element within a feed entry
- /// </summary>
- /// <param name="item">The feed entry</param>
- /// <returns>The m:properties element</returns>
- private static XElement GetPropertiesElement(SyndicationItem item)
- {
- // Check if the m:properties element is within the content element
- XmlSyndicationContent xmlContent = item.Content as XmlSyndicationContent;
- if (xmlContent != null)
- {
- XElement contentElement = XElement.Load(xmlContent.GetReaderAtContent());
- return contentElement.Elements().FirstOrDefault(e => e.Name == XName.Get("properties", odataMetaXmlNs));
- }
- // If we're here, then we are dealing with a feed that has an MLE
- // i.e. the m:properties element is a peer of the content element, and shows up
- // in the elementExtensions instead
- SyndicationElementExtension propertiesElementExtension = item.ElementExtensions.FirstOrDefault(e => e.OuterName.Equals("properties"));
- if (propertiesElementExtension != null)
- {
- XNode propertiesElement = XNode.ReadFrom(propertiesElementExtension.GetReader());
- return (XElement)propertiesElement;
- }
-
- throw new NotSupportedException("Unsupported feed entry format");
- }
-
- /// <summary>
- /// Gets the inline count within a feed
- /// </summary>
- /// <param name="feed">The feed</param>
- /// <returns>The inline count, or null if none exists</returns>
- private static long? GetInlineCount(SyndicationFeed feed)
- {
- SyndicationElementExtension countElementExtension = feed.ElementExtensions.SingleOrDefault(extension =>
- extension.OuterName.Equals("count", StringComparison.OrdinalIgnoreCase) &&
- extension.OuterNamespace.Equals(odataMetaXmlNs));
-
- if (countElementExtension != null)
- {
- XElement countElement = (XElement)XNode.ReadFrom(countElementExtension.GetReader());
- return XmlConvert.ToInt64(countElement.Value);
- }
- else
- {
- return null;
- }
- }
-
- /// <summary>
- /// Gets the link with the specified relationship type
- /// </summary>
- /// <param name="rel">Relationship type</param>
- /// <param name="links">The set of links to search from</param>
- /// <returns>The link with the specified relationship type, or null if none exists</returns>
- private static SyndicationLink GetLink(string rel, IEnumerable<SyndicationLink> links)
- {
- return links.SingleOrDefault(link => link.RelationshipType.Equals(rel, StringComparison.InvariantCultureIgnoreCase));
- }
-
- private static IEnumerable<SyndicationLink> GetLinks(string rel, IEnumerable<SyndicationLink> links)
- {
- return links.Where(link => link.RelationshipType.StartsWith(rel, StringComparison.Ordinal));
- }
-
- //TODO refactor the extraction of extensions into extension elements and extension attribute methods.
- private static JsonObject[] GetLinkExtensions(SyndicationLink link)
- {
- List<JsonObject> extensions = new List<JsonObject>();
- //TODO: fix the inclusion of title as extension. Title attribute is not required in the link element and its
- //inclusion as an extension should be tested for the precesence of the attribute in the xml element. Unfortunately,
- //SyndicationLink doesn't allow for accessing the underlying XML document.. perhaps using an AtomFormatter10??
- extensions.Add(ReaderUtils.CreateExtension("title", null, link.Title));
- extensions.AddRange(link.AttributeExtensions.Select(pair => ReadExtension(pair)));
-
- return extensions.ToArray();
- }
-
- private static JsonObject[] GetTitleExtensions(TextSyndicationContent title)
- {
- List<JsonObject> extensions = new List<JsonObject>();
- extensions.Add(ReaderUtils.CreateExtension("type", null, title.Type));
- extensions.AddRange(title.AttributeExtensions.Select(pair => ReadExtension(pair)));
-
- return extensions.ToArray();
- }
-
- /// <summary>
- /// Gets the "type" value from a property element
- /// </summary>
- /// <param name="propertyElement">The property element</param>
- /// <returns>The "type" value, or default (Edm.String) if none specified</returns>
- private static string GetTypeAttribute(XElement propertyElement)
- {
- XAttribute typeAttribute = propertyElement.Attribute(XName.Get("type", odataMetaXmlNs));
- if (typeAttribute == null)
- {
- if (propertyElement.HasElements)
- {
- return null;
- }
- return "Edm.String";
- }
- return typeAttribute.Value;
- }
-
- private static bool HasTypeAttribute(XElement propertyElement)
- {
- return propertyElement.Attribute(XName.Get("type", odataMetaXmlNs)) != null;
- }
-
- private static bool IsCollectionProperty(XElement propertyElement)
- {
- string type = GetTypeAttribute(propertyElement);
- if (type != null && type.StartsWith("Collection("))
- {
- return true;
-
- }
- return propertyElement.Elements().Count(pe => pe.Name == XName.Get("element", odataXmlNs)) > 1;
- }
-
- private static JsonObject ReadWorkspaceObject(XElement container, string baseUri)
- {
- JsonObject jsonObject = new JsonObject();
-
- jsonObject["collections"] =
- container
- .Elements()
- .Where(element => element.Name.LocalName.Equals("collection"))
- .Select(element => ReadWorkspaceCollections(element, baseUri))
- .ToArray();
-
- jsonObject["extensions"] =
- container
- .Elements()
- .Where(element =>
- !(element.Name.LocalName.Equals("collection") ||
- element.Name.LocalName.Equals("title")))
- .Select(element => ReadExtensionElement(element))
- .ToArray();
-
- jsonObject["title"] =
- container
- .Elements()
- .Where(element => element.Name.LocalName.Equals("title"))
- .First()
- .Value;
-
- return jsonObject;
- }
-
- private static JsonObject ReadWorkspaceCollections(XElement container, string baseUri)
- {
- JsonObject jsonObject = new JsonObject();
- string title = string.Empty;
-
- jsonObject["extensions"] =
- container
- .Elements()
- .Where(element =>
- !(element.Name.LocalName.Equals(collectionElement) ||
- element.Name.LocalName.Equals(titleElement)))
- .Select(element => ReadExtensionElement(element))
- .ToArray();
-
- jsonObject["title"] =
- container
- .Elements()
- .Where(element => element.Name.LocalName.Equals("title"))
- .First()
- .Value;
-
- IEnumerable<XAttribute> hrefAttributes =
- container
- .Attributes()
- .Where(element => element.Name.LocalName.Equals("href"));
-
- jsonObject["href"] = baseUri + hrefAttributes.First().Value;
-
- return jsonObject;
- }
-
- private static JsonObject ReadExtensionElement(XElement element)
- {
- JsonObject jsonObject = ReaderUtils.CreateExtension(element.Name.LocalName, element.BaseUri, null);
- jsonObject.Remove("value");
- jsonObject["attributes"] = ReadExtensionAttributes(element);
- jsonObject["children"] = element.Elements().Select(child => ReadExtensionElement(element)).ToArray();
-
- return jsonObject;
- }
-
- private static JsonObject ReadExtensionAttribute(XAttribute attribute)
- {
- return ReaderUtils.CreateExtension(attribute.Name.LocalName, attribute.BaseUri, attribute.Value);
- }
-
- private static JsonObject[] ReadExtensionAttributes(XElement container)
- {
- List<JsonObject> attributes = new List<JsonObject>();
- foreach (XAttribute attribute in container.Attributes())
- {
- attributes.Add(ReadExtensionAttribute(attribute));
- }
- return attributes.ToArray();
- }
-
- private static JsonObject ReadNamedStreamMetadata(SyndicationItem item)
- {
- JsonObject propertiesMetadata = new JsonObject();
- JsonObject streamMetadata;
- string propertyName;
-
- foreach (SyndicationLink link in GetLinks(odataEditMediaPrefix, item.Links))
- {
- streamMetadata = new JsonObject();
- streamMetadata["edit_media_extensions"] = GetLinkExtensions(link);
- streamMetadata["media_src_extensions"] = new JsonObject[0];
-
- propertyName = link.RelationshipType.Substring(odataEditMediaPrefix.Length + 1);
- propertiesMetadata[propertyName] = streamMetadata;
- }
-
- foreach (SyndicationLink link in GetLinks(odataMediaResourcePrefix, item.Links))
- {
- streamMetadata = new JsonObject();
- streamMetadata["media_src_extensions"] = GetLinkExtensions(link);
-
- propertyName = link.RelationshipType.Substring(odataMediaResourcePrefix.Length + 1);
- if (propertiesMetadata.ContainsKey(propertyName))
- {
- streamMetadata = JsonObject.Merge((JsonObject)propertiesMetadata[propertyName], streamMetadata);
- }
- propertiesMetadata[propertyName] = streamMetadata;
- }
- return propertiesMetadata;
- }
-
- private static JsonObject ReadNamedStreams(SyndicationItem item)
- {
- // Not very elegant, but quick and easy, do it in two passes.
- JsonObject streams = new JsonObject();
- JsonObject streamValue;
- JsonObject mediaResource;
- string propertyName;
-
- foreach (SyndicationLink link in GetLinks(odataEditMediaPrefix, item.Links))
- {
- propertyName = link.RelationshipType.Substring(odataEditMediaPrefix.Length + 1);
- streamValue = new JsonObject();
- mediaResource = new JsonObject();
-
- streams[propertyName] = streamValue;
-
- streamValue["__mediaresource"] = mediaResource;
-
- mediaResource["edit_media"] = link.GetAbsoluteUri().AbsoluteUri;
- mediaResource["content_type"] = link.MediaType;
- mediaResource["media_src"] = link.GetAbsoluteUri().AbsoluteUri;
-
- var etagAttributeName = new XmlQualifiedName("etag", odataMetaXmlNs);
- if (link.AttributeExtensions.ContainsKey(etagAttributeName))
- {
- mediaResource["media_etag"] = link.AttributeExtensions[etagAttributeName];
- link.AttributeExtensions.Remove(etagAttributeName);
- }
- }
-
- foreach (SyndicationLink link in GetLinks(odataMediaResourcePrefix, item.Links))
- {
- propertyName = link.RelationshipType.Substring(odataMediaResourcePrefix.Length + 1);
- mediaResource = new JsonObject();
- mediaResource["content_type"] = link.MediaType;
- mediaResource["media_src"] = link.GetAbsoluteUri().AbsoluteUri;
-
- if (streams.ContainsKey(propertyName))
- {
- streamValue = streams[propertyName] as JsonObject;
- mediaResource = JsonObject.Merge(streamValue["__mediaresource"] as JsonObject, mediaResource);
- }
- else
- {
- streamValue = new JsonObject();
- }
- streamValue["__mediaresource"] = mediaResource;
- streams[propertyName] = streamValue;
- }
- return streams;
- }
-
- private static JsonObject ReadNavigationProperties(SyndicationItem item)
- {
- JsonObject navProperties = new JsonObject();
- SyndicationElementExtension inline;
-
- string propertyName;
- JsonObject propertyValue = null;
-
- foreach (SyndicationLink link in GetLinks(odataRelatedPrefix, item.Links))
- {
- propertyName = link.RelationshipType.Substring(odataRelatedPrefix.Length + 1);
- inline = link.ElementExtensions.SingleOrDefault(e =>
- odataMetaXmlNs.Equals(e.OuterNamespace, StringComparison.Ordinal) &&
- e.OuterName.Equals("inline", StringComparison.Ordinal));
-
- if (inline != null)
- {
- XElement inlineElement = (XElement)XNode.ReadFrom(inline.GetReader());
- XElement innerElement = inlineElement.Elements().FirstOrDefault();
-
- if (innerElement != null)
- {
- // By default the inner feed/entry does not have the xml:base attribute, so we need to
- // add it so that the parsed SyndicationFeed or SyndicationItem retains the baseUri
- if (link.BaseUri != null)
- {
- innerElement.SetAttributeValue(XNamespace.Xml + "base", link.BaseUri.OriginalString);
- }
-
- // We are converting to a string before creating the reader to strip out extra indenting,
- // otherwise the reader creates extra XmlText nodes that SyndicationFeed/SyndicationItem cannot handle
- try
- {
- propertyValue = ReadFeed(new StringReader(innerElement.ToString()));
- }
- catch (XmlException)
- {
- // Try with entry instead ..
-
- propertyValue = ReadEntry(new StringReader(innerElement.ToString()));
- }
- }
- }
- else
- {
- JsonObject deferred = new JsonObject();
- deferred["uri"] = link.GetAbsoluteUri().AbsoluteUri;
-
- propertyValue = new JsonObject();
- propertyValue["__deferred"] = deferred;
- }
- navProperties[propertyName] = propertyValue;
- }
- return navProperties;
- }
-
- private static JsonObject ReadNavigationPropertiesMetadata(SyndicationItem item)
- {
- JsonObject propertiesMetadata = new JsonObject();
- JsonObject navMetadata;
- string propertyName;
-
- foreach (SyndicationLink link in GetLinks(odataRelatedPrefix, item.Links))
- {
- navMetadata = new JsonObject();
- navMetadata["extensions"] = GetLinkExtensions(link).Where(e =>
- !(string.Equals(e["name"] as string, "inline", StringComparison.Ordinal) &&
- string.Equals(e["namespaceURI"] as string, odataMetaXmlNs, StringComparison.Ordinal))
- ).ToArray();
-
- propertyName = link.RelationshipType.Substring(odataRelatedPrefix.Length + 1);
- propertiesMetadata[propertyName] = navMetadata;
- }
-
- foreach (SyndicationLink link in GetLinks(odataRelatedLinksPrefix, item.Links))
- {
- navMetadata = new JsonObject();
- navMetadata["associationuri"] = link.GetAbsoluteUri().AbsoluteUri;
- navMetadata["associationuri_extensions"] = link.GetAbsoluteUri().AbsoluteUri;
-
- propertyName = link.RelationshipType.Substring(odataRelatedLinksPrefix.Length + 1);
- if (propertiesMetadata.ContainsKey(propertyName))
- {
- navMetadata = JsonObject.Merge(propertiesMetadata[propertyName] as JsonObject, navMetadata);
- }
- propertiesMetadata[propertyName] = navMetadata;
- }
-
- return propertiesMetadata;
- }
-
- private static JsonObject ReadPropertiesMetadata(XElement container)
- {
- JsonObject json = null;
- if (container != null && container.Elements().Any(e => e.Name.NamespaceName == odataXmlNs))
- {
- json = new JsonObject();
- foreach (XElement propertyElement in container.Elements())
- {
- json[propertyElement.Name.LocalName] = ReadPropertyMetadata(propertyElement);
- }
- }
- return json;
- }
-
- private static JsonObject ReadPropertyMetadata(XElement property)
- {
- var metadata = ReaderUtils.CreateEntryPropertyMetadata(GetTypeAttribute(property));
-
- if (IsCollectionProperty(property))
- {
- string collectionType = GetCollectionType(GetTypeAttribute(property));
- if (collectionType == null)
- {
- metadata["type"] = "Collection()";
- }
-
- List<JsonObject> elements = new List<JsonObject>();
- foreach (XElement item in property.Elements(XName.Get("element", odataXmlNs)))
- {
- string itemType =
- HasTypeAttribute(item) ? GetTypeAttribute(item) :
- IsCollectionProperty(item) ? "Collection()" : collectionType;
-
- var itemMetadata = ReaderUtils.CreateEntryPropertyMetadata(itemType);
- if (item.Elements().Any(e => e.Name.NamespaceName == odataXmlNs))
- {
- itemMetadata["properties"] = ReadPropertiesMetadata(item);
- }
- elements.Add(itemMetadata);
- }
- metadata["elements"] = elements.ToArray();
- }
- else if (property != null && property.Elements().Any(e => e.Name.NamespaceName == odataXmlNs))
- {
- metadata["properties"] = ReadPropertiesMetadata(property);
- }
-
- return metadata;
- }
-
- /// <summary>
- /// Creates a JsonObject from an XML container element (e.g. the m:properties element) of an OData ATOM feed entry.
- /// </summary>
- /// <param name="container">The XML container</param>
- /// <param name="buildValue">Function that builds a value from a property element</param>
- /// <returns>The JsonObject containing the name-value pairs</returns>
- private static JsonObject ReadObject(XElement container)
- {
- if (container == null)
- {
- return null;
- }
-
- var json = new JsonObject();
- foreach (XElement propertyElement in container.Elements())
- {
- json[propertyElement.Name.LocalName] = ReadDataItem(propertyElement);
- }
- return json;
- }
-
- private static JsonObject ReadCollectionProperty(XElement property, string typeName)
- {
- var collectionType = GetCollectionType(typeName);
-
- var json = new JsonObject();
- var results = new List<object>();
-
- foreach (XElement item in property.Elements())
- {
- object resultItem = ReadDataItem(item);
- results.Add(resultItem);
-
- JsonObject complexValue = resultItem as JsonObject;
- if (complexValue != null)
- {
- var metadata = complexValue["__metadata"] as JsonObject;
- if (!string.IsNullOrEmpty(collectionType) && metadata["type"] == null)
- {
- metadata["type"] = collectionType;
- }
- }
- }
-
- json["results"] = results;
- json["__metadata"] = ReaderUtils.CreateEntryPropertyMetadata(typeName, false);
-
- return json;
- }
-
- private static JsonObject ReadComplexProperty(XElement container, string typeName)
- {
- JsonObject json = ReadObject(container);
- json["__metadata"] = ReaderUtils.CreateEntryPropertyMetadata(GetTypeAttribute(container), false);
- return json;
- }
-
- private static JsonObject ReadJsonSpatialProperty(XElement container, XElement gmlValue, bool isGeography)
- {
- GmlFormatter gmlFormatter = GmlFormatter.Create();
- GeoJsonObjectFormatter jsonformatter = GeoJsonObjectFormatter.Create();
-
- bool ignoreCrc = !gmlValue.Attributes().Any(a => a.Name.LocalName == "srsName");
-
- ISpatial spatialValue;
- if (isGeography)
- {
- spatialValue = gmlFormatter.Read<Geography>(gmlValue.CreateReader());
- }
- else
- {
- spatialValue = gmlFormatter.Read<Geometry>(gmlValue.CreateReader());
- }
-
- IDictionary<string, object> geoJsonData = jsonformatter.Write(spatialValue);
- JsonObject json = new JsonObject();
-
- Queue<object> geoJsonScopes = new Queue<object>();
- Queue<object> jsonScopes = new Queue<object>();
-
- geoJsonScopes.Enqueue(geoJsonData);
- jsonScopes.Enqueue(json);
-
- Func<object, object> convertScope = (scope) =>
- {
- object newScope =
- scope is List<object> || scope is object[] ? (object)new List<Object>() :
- scope is IDictionary<string, object> ? (object)new JsonObject() :
- null;
-
- if (newScope != null)
- {
- geoJsonScopes.Enqueue(scope);
- jsonScopes.Enqueue(newScope);
- }
-
- return newScope ?? scope;
- };
-
- while (jsonScopes.Count > 0)
- {
- if (jsonScopes.Peek() is JsonObject)
- {
- var currentGeoJson = (IDictionary<string, object>)geoJsonScopes.Dequeue();
- var currentJson = (JsonObject)jsonScopes.Dequeue();
-
- foreach (var item in currentGeoJson)
- {
- if (!ignoreCrc || item.Key != "crs")
- {
- currentJson[item.Key] = convertScope(item.Value);
- }
- }
- }
- else
- {
- var currentGeoJson = (IEnumerable<object>)geoJsonScopes.Dequeue();
- var currentJson = (List<object>)jsonScopes.Dequeue();
-
- foreach (var item in currentGeoJson)
- {
- currentJson.Add(convertScope(item));
- }
- }
- }
- json["__metadata"] = ReaderUtils.CreateEntryPropertyMetadata(GetTypeAttribute(container), false);
- return json;
- }
-
- public static object ReadDataItem(XElement item)
- {
- string typeName = GetTypeAttribute(item);
- XElement gmlRoot = item.Elements().SingleOrDefault(e => e.Name.NamespaceName == gmlXmlNs);
-
- if (gmlRoot != null)
- {
- bool isGeography = typeName.StartsWith("Edm.Geography");
- return ReadJsonSpatialProperty(item, gmlRoot, isGeography);
- }
-
- bool isCollection = IsCollectionProperty(item);
- if (item.HasElements || isCollection)
- {
- // Complex type, Collection Type: parse recursively
- return isCollection ? ReadCollectionProperty(item, typeName) : ReadComplexProperty(item, typeName);
- }
-
- // Primitive type: null value
- XNamespace mNamespace = item.GetNamespaceOfPrefix("m");
- XAttribute nullAttribute = mNamespace == null ? null : item.Attribute(mNamespace.GetName("null"));
- if (nullAttribute != null && nullAttribute.Value.Equals("true", StringComparison.InvariantCultureIgnoreCase))
- {
- return null;
- }
-
- // Primitive type: check type and parse value accordingly
- string value = item.Value;
- switch (typeName)
- {
- case "Edm.Byte":
- return XmlConvert.ToByte(value);
- case "Edm.Int16":
- return XmlConvert.ToInt16(value);
- case "Edm.Int32":
- return XmlConvert.ToInt32(value);
- case "Edm.SByte":
- return XmlConvert.ToSByte(value);
- case "Edm.Boolean":
- return XmlConvert.ToBoolean(value);
- case "Edm.Double":
- return XmlConvert.ToDouble(value);
- case "Edm.Single":
- return XmlConvert.ToSingle(value);
- case "Edm.Guid":
- return XmlConvert.ToGuid(value);
- case "Edm.DateTime":
- return new JsDate(XmlConvert.ToDateTime(value, XmlDateTimeSerializationMode.Utc));
- case "Edm.DateTimeOffset":
- return new JsDate(XmlConvert.ToDateTimeOffset(value));
- case "Edm.Time":
- throw new NotSupportedException(typeName + " is not supported");
- // Decimal and Int64 values are sent as strings over the wire. This is the same behavior as WCF Data Services JSON serializer.
- case "Edm.Decimal":
- case "Edm.Int64":
- case "":
- default:
- return value;
- }
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/code/csdlreader.cs
----------------------------------------------------------------------
diff --git a/JSLib/tests/code/csdlreader.cs b/JSLib/tests/code/csdlreader.cs
deleted file mode 100644
index 253cf10..0000000
--- a/JSLib/tests/code/csdlreader.cs
+++ /dev/null
@@ -1,186 +0,0 @@
-/// <summary>
-/// Class used to parse csdl to create the metatdata object
-/// </summary>
-///
-
-namespace DataJS.Tests
-{
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Xml.Linq;
-
-
- public static class CsdlReader
- {
- static readonly string knownNamespace = "http://docs.oasis-open.org";
- static readonly string[] repeatingElements =
- {
- "Action",
- "ActionImport",
- "Annotation",
- "Annotations",
- "Apply",
- "Binary",
- "Bool",
- "Cast",
- "Collection",
- "ComplexType",
- "Date",
- "DateTimeOffset",
- "Decimal",
- "Duration",
- "EntitySet",
- "EntityType",
- "EnumMember",
- "EnumType",
- "Float",
- "Function",
- "FunctionImport",
- "Guid",
- "If",
- "Int",
- "IsOf",
- "Key",
- "LabeledElement",
- "LabeledElementReference",
- "Member",
- "NavigationProperty",
- "NavigationPropertyBinding",
- "NavigationPropertyPath",
- "Null",
- "OnDelete",
- "Path",
- "Parameter",
- "Property",
- "PropertyPath",
- "PropertyRef",
- "PropertyValue",
- "Record",
- "ReferentialConstraint",
- "String",
- "Schema",
- "Singleton",
- "Term",
- "TimeOfDay",
- "TypeDefinition",
- "UrlRef",
- "Reference",
- "Include",
- "IncludeAnnotations"
- };
-
- public static Dictionary<string, object> ReadCsdl(TextReader payload)
- {
- return BuildElementJsonObject(XElement.Load(payload));
- }
-
- /// <summary>
- /// Build the attribute object
- /// </summary>
- /// <param name="xmlAttributes">IEnumberable of XAttributes to build the attribute object</param>
- /// <returns>The JsonObject containing the name-value pairs for an element's attributes</returns>
- static Dictionary<string, object> BuildAttributeJsonObject(IEnumerable<XAttribute> xmlAttributes)
- {
- Dictionary<string, object> jsonObject = new Dictionary<string, object>();
-
- foreach (XAttribute attribute in xmlAttributes)
- {
- if (!attribute.IsNamespaceDeclaration)
- {
- string attributeNamespace = attribute.Name.Namespace.ToString();
- if (string.IsNullOrEmpty(attributeNamespace) ||
- attributeNamespace.StartsWith(knownNamespace, StringComparison.InvariantCultureIgnoreCase))
- {
- jsonObject[MakeFirstLetterLowercase(attribute.Name.LocalName)] = attribute.Value;
- }
- }
- }
-
- return jsonObject;
- }
-
- /// <summary>
- /// Creates a JsonObject from an XML container element with each attribute or subelement as a property
- /// </summary>
- /// <param name="container">The XML container</param>
- /// <param name="buildValue">Function that builds a value from a property element</param>
- /// <returns>The JsonObject containing the name-value pairs</returns>
- public static Dictionary<string, object> BuildElementJsonObject(XElement container)
- {
- if (container == null)
- {
- return null;
- }
-
- Dictionary<string, object> jsonObject = new Dictionary<string, object>();
- string keyName = MakeFirstLetterLowercase(container.Name.LocalName);
-
- if (container.HasAttributes || container.HasElements)
- {
- Dictionary<string, List<Dictionary<string, object>>> repeatingObjectArrays = new Dictionary<string, List<Dictionary<string, object>>>();
-
- jsonObject = BuildAttributeJsonObject(container.Attributes());
-
- foreach (XElement propertyElement in container.Elements())
- {
- string propertyName = MakeFirstLetterLowercase(propertyElement.Name.LocalName);
- string properyNamespace = propertyElement.Name.Namespace.ToString();
-
- if (string.IsNullOrEmpty(properyNamespace) || properyNamespace.StartsWith(knownNamespace, StringComparison.InvariantCultureIgnoreCase))
- {
- // Check to see if the element is repeating and needs to be an array
- if (repeatingElements.Contains(propertyElement.Name.LocalName))
- {
- // See if property was already created as an array, if not then create it
- if (!repeatingObjectArrays.ContainsKey(propertyName))
- {
- repeatingObjectArrays.Add(propertyName, new List<Dictionary<string, object>>());
- }
-
- repeatingObjectArrays[propertyName].Add(BuildElementJsonObject(propertyElement));
- }
- else
- {
- jsonObject[propertyName] = BuildElementJsonObject(propertyElement);
- }
- }
- }
-
- foreach (string key in repeatingObjectArrays.Keys)
- {
- jsonObject[key] = repeatingObjectArrays[key].ToArray();
- }
- }
- else
- {
- jsonObject[MakeFirstLetterLowercase(container.Name.LocalName)] = container.Value;
- }
-
- return jsonObject;
- }
-
- /// <summary>
- /// Makes the first letter of a string lowercase
- /// </summary>
- /// <param name="name">The string to be modified</param>
- /// <returns>Modified string</returns>
- private static string MakeFirstLetterLowercase(string str)
- {
- if (!string.IsNullOrWhiteSpace(str))
- {
- if (str.Length > 1 && !(str[1].ToString() == str[1].ToString().ToUpper()))
- {
- return str[0].ToString().ToLower() + str.Substring(1);
- }
- else
- {
- return str;
- }
- }
-
- return str;
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/code/jsdate.cs
----------------------------------------------------------------------
diff --git a/JSLib/tests/code/jsdate.cs b/JSLib/tests/code/jsdate.cs
deleted file mode 100644
index a02c69f..0000000
--- a/JSLib/tests/code/jsdate.cs
+++ /dev/null
@@ -1,40 +0,0 @@
-/// <summary>
-/// The oracle's representation of a Javascript date object as deserialized by the library
-/// </summary>
-
-namespace DataJS.Tests
-{
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Net;
- using System.Runtime.Serialization;
- using System.ServiceModel;
- using System.ServiceModel.Activation;
- using System.ServiceModel.Syndication;
- using System.ServiceModel.Web;
- using System.Xml;
- using System.Xml.Linq;
- using Microsoft.Spatial;
- using Microsoft.OData.Core;
-
- [Serializable]
- public class JsDate : JsonObject
- {
- private static readonly DateTime JsEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
-
- public JsDate(DateTime dateTime)
- : base()
- {
- this["milliseconds"] = dateTime.Subtract(JsEpoch).TotalMilliseconds;
- }
-
- public JsDate(DateTimeOffset dateTimeOffset)
- : this(dateTimeOffset.UtcDateTime)
- {
- this["__edmType"] = "Edm.DateTimeOffset";
- this["__offset"] = (dateTimeOffset.Offset < TimeSpan.Zero ? "-" : "+") + dateTimeOffset.Offset.ToString("hh':'mm");
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/code/jsonobject.cs
----------------------------------------------------------------------
diff --git a/JSLib/tests/code/jsonobject.cs b/JSLib/tests/code/jsonobject.cs
deleted file mode 100644
index 79b914e..0000000
--- a/JSLib/tests/code/jsonobject.cs
+++ /dev/null
@@ -1,80 +0,0 @@
-/// <summary>
-/// A weakly typed representation of a JSON object using a dictionary implementation
-/// </summary>
-/// <typeparam name="T">The CLR type of the values of the properties</typeparam>
-
-namespace DataJS.Tests
-{
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.Linq;
- using System.Runtime.Serialization;
-
- [Serializable]
- [KnownType(typeof(JsonObject))]
- [KnownType(typeof(JsonObject[]))]
- [KnownType(typeof(JsDate))]
- [KnownType(typeof(List<object>))]
- public class JsonObject : ISerializable, IEnumerable<KeyValuePair<string, object>>
- {
- Dictionary<string, object> dictionary = new Dictionary<string, object>();
-
- public void Remove(string key)
- {
- dictionary.Remove(key);
- }
-
- public object this[string key]
- {
- get
- {
- return this.dictionary[key];
- }
- set
- {
- this.dictionary[key] = value;
- }
- }
-
- public bool ContainsKey(string key)
- {
- return this.dictionary.ContainsKey(key);
- }
-
- public static JsonObject Merge(JsonObject first, JsonObject second)
- {
- if (first == null)
- {
- return second;
- }
-
- if (second != null)
- {
- JsonObject merged = new JsonObject();
- merged.dictionary = new Dictionary<string, object>(first.dictionary);
- foreach (var pair in second.dictionary)
- {
- merged.dictionary[pair.Key] = pair.Value;
- }
- return merged;
- }
- return first;
- }
-
- public void GetObjectData(SerializationInfo info, StreamingContext context)
- {
- this.dictionary.ToList().ForEach(pair => info.AddValue(pair.Key, pair.Value));
- }
-
- public IEnumerator<KeyValuePair<string, object>> GetEnumerator()
- {
- return this.dictionary.GetEnumerator();
- }
-
- IEnumerator IEnumerable.GetEnumerator()
- {
- return this.dictionary.GetEnumerator();
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/code/readerutils.cs
----------------------------------------------------------------------
diff --git a/JSLib/tests/code/readerutils.cs b/JSLib/tests/code/readerutils.cs
deleted file mode 100644
index 284ce04..0000000
--- a/JSLib/tests/code/readerutils.cs
+++ /dev/null
@@ -1,68 +0,0 @@
-using System.Collections.Generic;
-using System.IO;
-using System.Net;
-using System.Web.Script.Serialization;
-
-namespace DataJS.Tests
-{
- public static class ReaderUtils
- {
- public static JsonObject CreateEntryPropertyMetadata(string type)
- {
- return CreateEntryPropertyMetadata(type, true);
- }
-
- public static JsonObject CreateEntryPropertyMetadata(string type, bool withExtensions)
- {
- JsonObject json = new JsonObject();
- json["type"] = type;
-
-
- // TODO: add proper support for property extensions
- if (withExtensions)
- {
- json["extensions"] = new JsonObject[] { };
- }
-
- return json;
- }
-
- public static JsonObject CreateExtension(string name, string nameSpace, string value)
- {
- JsonObject json = new JsonObject();
- json["name"] = name;
- json["namespaceURI"] = nameSpace;
- json["value"] = value;
- return json;
- }
-
- public static WebRequest CreateRequest(string url, string user = null, string password = null)
- {
- WebRequest request = WebRequest.Create(url);
- if (user != null || password != null)
- {
- request.Credentials = new NetworkCredential(user, password);
- request.PreAuthenticate = true;
- }
-
- return request;
- }
-
- public static Stream ConvertDictionarytoJsonlightStream(Dictionary<string, object> dict)
- {
- MemoryStream stream = new MemoryStream();
- if (dict == null)
- {
- return stream;
- }
-
- string jsonString = new JavaScriptSerializer().Serialize(dict);
- StreamWriter writer = new StreamWriter(stream);
- writer.Write(jsonString);
- writer.Flush();
- stream.Position = 0;
- return stream;
- }
-
- }
-}
\ No newline at end of file
[07/22] olingo-odata4-js git commit: [OLINGO-442] Cleanup bevor
release
Posted by ko...@apache.org.
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/odata-cache-functional-tests.js
----------------------------------------------------------------------
diff --git a/JSLib/tests/odata-cache-functional-tests.js b/JSLib/tests/odata-cache-functional-tests.js
deleted file mode 100644
index e8c32ec..0000000
--- a/JSLib/tests/odata-cache-functional-tests.js
+++ /dev/null
@@ -1,611 +0,0 @@
-/// <reference path="../src/datajs.js" />
-/// <reference path="../src/odata-utils.js" />
-/// <reference path="../src/cache.js" />
-/// <reference path="common/djstest.js" />
-
-(function (window, undefined) {
- OData.defaultHandler.accept = "application/json;q=0.9, application/atomsvc+xml;q=0.8, */*;q=0.1";
- var CustomDataSource = function (baseUri) {
- this.baseUri = baseUri;
- };
-
- CustomDataSource.prototype.read = function (index, count, success, error) {
- var that = this;
- var url = this.baseUri + "?$skip=" + index + "&$top=" + count;
- $(this).triggerHandler("request", { requestUri: url });
- $.ajax({
- url: url,
- dataType: "json",
- success: function (results) {
- $(that).triggerHandler("success", { data: results });
- success(results);
- },
- error: error
- });
- };
-
- CustomDataSource.prototype.count = function (success, error) {
- $.ajax({
- url: "./endpoints/CustomDataService.svc/Count",
- dataType: "json",
- success: success,
- error: error
- });
- },
- CustomDataSource.prototype.toString = function () {
- return this.baseUri;
- };
-
- var sources = [
- { source: "./endpoints/FoodStoreDataServiceV4.svc/Foods", countSupported: true },
- { source: new CustomDataSource("./endpoints/CustomDataService.svc/ReadRange"), countSupported: true }
- ];
-
- var itemsInCollection = 16;
-
- // Cache config variations for single readRange with fixed skip/take that spans the entire collection
- var pageSizes = [
- 1,
- 4, // factor of total, <= server page size
- 5, // non-factor of total, <= server page size
- 6, // non-factor of total, > server page size
- 8, // factor of total, > server page size
- itemsInCollection,
- itemsInCollection + 1
- ];
-
- var cacheSizes = [
- -5, // All you can store
- 0, // Store nothing
- 1024, // 1 KB
- 2.5 * 1024, // 2.5 KB
- 100 * 1024, // 10 KB
- 512 * 1024, // 512 KB
- 100 * 1024 * 1024, // 100 MB
- undefined // Default to 1 MB
- ];
-
- // Skip/take variations for single readRange with fixed cache config
- var fixedPageSize = 6;
-
- var skipValues = [
- 0,
- fixedPageSize - 1,
- fixedPageSize,
- fixedPageSize + 1,
- fixedPageSize * 2,
- itemsInCollection + 1,
- itemsInCollection + fixedPageSize + 1
- ];
-
- var takeValues = [
- 0,
- fixedPageSize - 1,
- fixedPageSize,
- fixedPageSize + 1,
- fixedPageSize * 2,
- itemsInCollection + 1
- ];
-
- // Skip/take variations for multiple readRanges with fixed cache config
- var multipleReads = [
- { skip: 1, take: 2 }, // page 1
- {skip: 2, take: 7 }, // page 1, 2
- {skip: 3, take: 10 }, // page 1, 2, 3
- {skip: 6, take: 2} // page 2
- ];
-
- var invalidSkipValues = [-5, NaN, undefined, Infinity, "not a valid value"];
- var invalidTakeValues = [-5, NaN, undefined, Infinity, "not a valid value"];
- var invalidPageSizes = [-5, NaN, Infinity, 0, "not a valid value"];
-
- // Prefetchsize variations for a single readRange
- var prefetchSizes = [
- -5,
- 1,
- 5,
- itemsInCollection,
- itemsInCollection + 1
- ];
-
- var expectException = function (cache) {
- djstest.assert(false, "We should not get here because the an exception is expected.");
- djstest.destroyCacheAndDone(cache);
- };
-
- var makeUnexpectedErrorHandler = function (cache) {
- return function (err) {
- djstest.assert(false, "Unexpected call to error handler with error: " + djstest.toString(err));
- if (cache) {
- djstest.destroyCacheAndDone(cache);
- } else {
- djstest.done();
- }
- };
- };
-
- var validateExpectedRange = function (cache, data, source, skipValue, takeValue, finished) {
- /// <summary>Validates the data returned by readRange</summary>
- /// <param name="cache" type="Object">The cache object</param>
- /// <param name="data" type="Object">The data returned by the cache</param>
- /// <param name="source" type="Object">The base URI of the feed, or the custom data source</param>
- /// <param name="skipValue type="Integer">The skip value</param>
- /// <param name="takeValue" type="Integer">The take value</param>
- /// <param name="finished" type="Function">Callback function called after data is verified</param>
- var assertData = function (expectedData) {
- djstest.assertAreEqualDeep(data, expectedData, "Verify response data");
- finished();
- };
-
- if (typeof source === "string") {
- var expectedRangeUrl = source + "?$skip=" + skipValue + "&$top=" + takeValue;
- window.ODataReadOracle.readJsonAcrossServerPages(expectedRangeUrl, assertData);
- } else {
- source.read(skipValue, takeValue, assertData);
- }
- };
-
- var onidleValidation = function () {
- djstest.assert(true, "expected call to onidle");
- djstest.done();
- };
-
- var createSingleReadTestName = function (params) {
- return "Testing readRange of " + params.source + " [skip " + params.skip + " take " + params.take + "] with pageSize " +
- params.pageSize + ", prefetch " + params.prefetchSize + " and cacheSize " + params.cacheSize;
- };
-
- var createMultipleReadTestName = function (params) {
- return "Testing readRange of " + params.source + " [skip " + params.firstSkip + " take " + params.firstTake + ", " +
- (params.destroyCacheBetweenReads ? "cache.destroy(), " : "") +
- "skip " + params.secondSkip + " take " + params.secondTake + "] with pageSize " +
- params.pageSize + ", prefetch " + params.prefetchSize + " and cacheSize " + params.cacheSize;
- };
-
- var dataCacheSingleReadRangeTest = function (params) {
- djstest.assertsExpected(2);
- var options = { name: "cache" + new Date().valueOf(), source: params.source, pageSize: params.pageSize, prefetchSize: params.prefetchSize, cacheSize: params.cacheSize };
-
- if (params.mechanism) {
- options.mechanism = params.mechanism;
- }
-
- var cache = this.createAndAddCache(options);
- var session = typeof params.source === "string" ? this.observableHttpClient.newSession() : new Session(params.source);
- var cacheOracle = new CacheOracle(params.source, params.pageSize, itemsInCollection, params.cacheSize);
- cache.readRange(params.skip, params.take).then(function (data) {
- cacheOracle.verifyRequests(session.requests, session.responses, params.skip, params.take, "readRange requests");
- validateExpectedRange(cache, data, params.source, params.skip, params.take, function () {
- djstest.destroyCacheAndDone(cache);
- });
- }, makeUnexpectedErrorHandler(cache));
- };
-
- var dataCacheParallelReadRangeTest = function (params) {
- djstest.assertsExpected(2);
- var options = { name: "cache" + new Date().valueOf(), source: params.source, pageSize: params.pageSize, prefetchSize: params.prefetchSize, cacheSize: params.cacheSize };
-
- var cache = this.createAndAddCache(options);
-
- var firstReadRange = function (finished) {
- cache.readRange(params.firstSkip, params.firstTake).then(function (data) {
- validateExpectedRange(cache, data, params.source, params.firstSkip, params.firstTake, finished);
- }, makeUnexpectedErrorHandler(cache));
- };
-
- var secondReadRange = function (finished) {
- cache.readRange(params.secondSkip, params.secondTake).then(function (data) {
- validateExpectedRange(cache, data, params.source, params.secondSkip, params.secondTake, finished);
- }, makeUnexpectedErrorHandler(cache));
- };
-
- djstest.asyncDo([firstReadRange, secondReadRange], function () {
- djstest.destroyCacheAndDone(cache);
- });
- };
-
- var dataCacheSerialReadRangeTest = function (params) {
- djstest.assertsExpected(4);
- var options = { name: "cache" + new Date().valueOf(), source: params.source, pageSize: params.pageSize, prefetchSize: params.prefetchSize, cacheSize: params.cacheSize };
-
- var cacheOracle = new CacheOracle(params.source, params.pageSize, itemsInCollection, params.cacheSize);
- var secondRead = function () {
- session.clear();
- cache.readRange(params.secondSkip, params.secondTake).then(function (data) {
- cacheOracle.verifyRequests(session.requests, session.responses, params.secondSkip, params.secondTake, "Second readRange requests");
- validateExpectedRange(cache, data, params.source, params.secondSkip, params.secondTake, djstest.done);
- }, makeUnexpectedErrorHandler(cache));
- };
-
- var cache = this.createAndAddCache(options);
- var session = typeof params.source === "string" ? this.observableHttpClient.newSession() : new Session(params.source);
- cache.readRange(params.firstSkip, params.firstTake).then(function (data) {
- cacheOracle.verifyRequests(session.requests, session.responses, params.firstSkip, params.firstTake, "First readRange requests");
- validateExpectedRange(cache, data, params.source, params.firstSkip, params.firstTake, function () {
- if (params.destroyCacheBetweenReads === true) {
- cache.clear().then(function () {
- cacheOracle.clear();
- secondRead();
- }, function (err) {
- djstest.fail("Error destroying the cache: " + djstest.toString(err));
- });
- } else {
- secondRead();
- }
- });
- }, makeUnexpectedErrorHandler(cache));
- };
-
- var dataCachePrefetchTest = function (params) {
- djstest.assertsExpected(2);
- var options = {
- name: "cache" + new Date().valueOf(),
- source: params.source,
- pageSize: params.pageSize,
- prefetchSize: params.prefetchSize,
- cacheSize: params.cacheSize,
- user: params.user,
- password: params.password
- };
-
- var cache = this.createAndAddCache(options);
- var session = typeof params.source === "string" ? this.observableHttpClient.newSession() : new Session(params.source);
- var cacheOracle = new CacheOracle(params.source, params.pageSize, itemsInCollection, params.cacheSize);
-
- cache.readRange(params.skip, params.take).then(function (data) {
- cacheOracle.verifyRequests(session.requests, session.responses, params.skip, params.take, "readRange requests");
- session.clear();
- }, makeUnexpectedErrorHandler(cache));
-
- cache.onidle = function () {
- var prefetchSize = params.prefetchSize < 0 ? itemsInCollection : params.prefetchSize;
- cacheOracle.verifyRequests(session.requests, session.responses, params.skip + params.take, prefetchSize, "prefetch requests", false, true);
- cache.onidle = false;
- djstest.destroyCacheAndDone(cache);
- };
- };
-
- var cleanDomStorage = function (done) {
- /// <summary>Cleans all the data saved in the browser's DOM Storage. Needs to be called asynchronously in the
- /// setup and teardown methods to be consistent with indexedDb's cleanup method.</summary>
- /// <param name="done" type="Function">Function to be called after DOM storage is cleared.</param>
- if (window.localStorage) {
- window.localStorage.clear();
- }
- done();
- };
-
- var cleanIndexedDb = function (done) {
- /// <summary>Cleans all the data saved in the browser's IndexedDb Storage.</summary>
- /// <param name="done" type="Function">Function to be called after indexedDb is cleared.</param>
- var caches = this.caches;
-
- djstest.cleanStoreOnIndexedDb(caches, done);
- };
-
- var cleanupAllStorage = function (done) {
- /// <summary>Cleans up all available storage mechanisms in the browser.</summary>
- /// <param name="done" type="Function">Function to be called by each cleanup function after storage is cleared.</param>
- var that = this;
- var storeCleanup = [];
-
- $.each(CacheOracle.mechanisms, function (_, mechanism) {
- if (CacheOracle.isMechanismAvailable(mechanism)) {
- storeCleanup.push(function (done) {
- if (storageMechanisms[mechanism]) {
- storageMechanisms[mechanism].cleanup.call(that, done);
- } else {
- done();
- }
- });
- }
- });
-
- djstest.asyncDo(storeCleanup, done);
- };
-
- var storageMechanisms = {
- indexeddb: { cleanup: cleanIndexedDb },
- dom: { cleanup: cleanDomStorage },
- memory: { cleanup: function (done) { done(); } },
- best: { cleanup: function (done) { done(); } }
- };
-
- module("Functional", {
- setup: function () {
- this.createAndAddCache = function (options) {
- /// <summary>Returns a cache created from the options object and </summary>
- /// <param name="options" type="Object">Object to create a cache from.</param>
- var cache = odatajs.createDataCache(options);
- this.caches.push({ name: options.name, cache: cache });
- return cache;
- };
-
- this.observableHttpClient = new ObservableHttpClient();
- OData.defaultHttpClient = this.observableHttpClient;
- this.caches = [];
- var that = this;
-
- djstest.wait(function (done) {
- cleanupAllStorage.call(that, done);
- });
- },
-
- teardown: function () {
- OData.defaultHttpClient = this.observableHttpClient.provider;
- var clearActions = [];
- var that = this;
-
- $.each(this.caches, function (_, cacheObject) {
- cacheObject.cache.onidle = undefined;
-
- clearActions.push(function (done) {
- cacheObject.cache.clear().then(function () {
- done();
- },
- function (err) {
- djstest.assert(false, "Unexpected call to error handler while attempting to clear with error: " + djstest.toString(err));
- })
- });
- });
-
- djstest.wait(function (done) {
- djstest.asyncDo(clearActions, function () {
- cleanupAllStorage.call(that, function () {
- that.caches = [];
- done();
- });
- });
- });
- }
- });
-
- $.each(CacheOracle.mechanisms, function (_, mechanism) {
- var parameters = { mechanism: mechanism, source: sources[1].source, take: 5, skip: 0, pageSize: 5, prefetchSize: 5 };
- if (CacheOracle.isMechanismAvailable(mechanism)) {
- djstest.addTest(dataCacheSingleReadRangeTest, "Specified mechanism: " + parameters.mechanism + createSingleReadTestName(parameters), parameters);
- }
- else {
- djstest.addTest(function (params) {
- djstest.assertsExpected(1);
- var options = { name: "cache" + new Date().valueOf(), mechanism: params.mechanism, source: params.source };
- try {
- var cache = this.createAndAddCache(options);
- expectException(cache);
- }
- catch (e) {
- if (mechanism === "indexeddb") {
- djstest.assertAreEqual(e.message, "IndexedDB is not supported on this browser", "Validating expected error");
- } else if (mechanism === "dom") {
- djstest.assertAreEqual(e.message, "Web Storage not supported by the browser", "Validating expected error");
- } else {
- djstest.fail("Creating cache with mechanism " + mechanism + " should not fail: " + djstest.toString(e));
- }
-
- djstest.done();
- }
- }, "Invalid mechanism for browser: " + parameters.mechanism + createSingleReadTestName(parameters), parameters);
- }
- });
-
- $.each(sources, function (_, sourceObject) {
- $.each(pageSizes, function (_, pageSizeValue) {
- $.each(cacheSizes, function (_, cacheSizeValue) {
- var parameters = { source: sourceObject.source, skip: 0, take: itemsInCollection, pageSize: pageSizeValue, prefetchSize: 0, cacheSize: cacheSizeValue };
- djstest.addTest(dataCacheSingleReadRangeTest, createSingleReadTestName(parameters), parameters);
- });
- });
-
- $.each(skipValues, function (_, skipValue) {
- $.each(takeValues, function (_, takeValue) {
- var parameters = { source: sourceObject.source, take: takeValue, skip: skipValue, pageSize: 4, prefetchSize: 0, cacheSize: 0 };
- djstest.addTest(dataCacheSingleReadRangeTest, createSingleReadTestName(parameters), parameters);
- });
- });
-
- $.each(multipleReads, function (_, firstRange) {
- $.each(multipleReads, function (_, secondRange) {
- var parallelReadParams = { source: sourceObject.source, firstTake: firstRange.take, firstSkip: firstRange.skip, secondTake: secondRange.take, secondSkip: secondRange.skip, pageSize: 5, prefetchSize: 0, cacheSize: 0 };
- djstest.addTest(dataCacheParallelReadRangeTest, "Parallel: " + createMultipleReadTestName(parallelReadParams), parallelReadParams);
-
- $.each([false, true], function (_, destroyCacheBetweenReads) {
- var serialReadParams = $.extend({}, parallelReadParams, { destroyCacheBetweenReads: destroyCacheBetweenReads });
- djstest.addTest(dataCacheSerialReadRangeTest, "Serial: " + createMultipleReadTestName(serialReadParams), serialReadParams);
- });
- });
- });
-
- var getInvalidValueErrorMessage = function (invalidValue, parameterName) {
- /// <summary>Returns the expected error message for the specified invalid value.</summary>
- /// <param name="invalidValue type="Object">invalid value (anything other than zero or positive integer) to determine the error message from.</param>
- /// <param name="parameterName" type="String">The name of the parameter being verified.</param>
- /// <returns type="String">Error message expected.</returns>
- return (invalidValue === undefined || typeof invalidValue !== "number") ?
- "'" + parameterName + "' must be a number." :
- "'" + parameterName + "' must be greater than or equal to zero.";
- };
-
- $.each(invalidSkipValues, function (_, invalidSkipValue) {
- var parameters = { source: sourceObject.source, skip: invalidSkipValue, take: 1 };
- djstest.addTest(function (params) {
- djstest.assertsExpected(1);
- var options = { name: "cache" + new Date().valueOf(), source: params.source };
- var cache = this.createAndAddCache(options);
- try {
- cache.readRange(params.skip, params.take);
- expectException(cache);
- } catch (e) {
- djstest.assertAreEqual(e.message, getInvalidValueErrorMessage(invalidSkipValue, "index"), "Error message validation");
- djstest.destroyCacheAndDone(cache);
- }
- }, "Invalid skip: " + createSingleReadTestName(parameters), parameters);
- });
-
- $.each(invalidTakeValues, function (_, invalidTakeValue) {
- var parameters = { source: sourceObject.source, skip: 0, take: invalidTakeValue };
- djstest.addTest(function (params) {
- djstest.assertsExpected(1);
- var options = { name: "cache" + new Date().valueOf(), source: params.source };
- var cache = this.createAndAddCache(options);
- try {
- cache.readRange(params.skip, params.take);
- expectException(cache);
- } catch (e) {
- djstest.assertAreEqual(e.message, getInvalidValueErrorMessage(invalidTakeValue, "count"), "Error message validation");
- djstest.destroyCacheAndDone(cache);
- }
- }, "Invalid take: " + createSingleReadTestName(parameters), parameters);
- });
-
- $.each(invalidPageSizes, function (_, invalidPageSize) {
- var parameters = { source: sourceObject.source, skip: 0, take: 5, pageSize: invalidPageSize };
- djstest.addTest(function (params) {
- var options = { name: "cache", source: params.source, pageSize: params.pageSize };
- try {
- var cache = this.createAndAddCache(options);
- expectException(cache);
- } catch (e) {
- var expectedError = typeof invalidPageSize === "number" ? "'pageSize' must be greater than zero." : getInvalidValueErrorMessage(invalidPageSize, "pageSize");
- djstest.assertAreEqual(e.message, expectedError, "Error message validation");
- }
- djstest.done();
- }, "Invalid pageSize: " + createSingleReadTestName(parameters), parameters);
- });
-
- $.each(pageSizes, function (_, pageSize) {
- $.each(cacheSizes, function (_, cacheSize) {
- var parameters = { source: sourceObject.source, skip: 0, take: pageSize, pageSize: pageSize, prefetchSize: -1, cacheSize: cacheSize };
- djstest.addTest(dataCachePrefetchTest, "Prefetch: " + createSingleReadTestName(parameters), parameters);
- });
- });
-
- $.each(skipValues, function (_, skipValue) {
- var parameters = { source: sourceObject.source, skip: skipValue, take: fixedPageSize, pageSize: fixedPageSize, prefetchSize: -1, cacheSize: -1 };
- djstest.addTest(dataCachePrefetchTest, "Prefetch: " + createSingleReadTestName(parameters), parameters);
- });
-
- $.each(takeValues, function (_, takeValue) {
- var parameters = { source: sourceObject.source, skip: 0, take: takeValue, pageSize: fixedPageSize, prefetchSize: -1, cacheSize: -1 };
- djstest.addTest(dataCachePrefetchTest, "Prefetch: " + createSingleReadTestName(parameters), parameters);
- });
-
- $.each(prefetchSizes, function (_, prefetchSize) {
- var parameters = { source: sourceObject.source, skip: 0, take: fixedPageSize, pageSize: fixedPageSize, prefetchSize: prefetchSize, cacheSize: -1 };
- djstest.addTest(dataCachePrefetchTest, "Prefetch: " + createSingleReadTestName(parameters), parameters);
- });
-
- var fixedPrefetchSize = 5;
-
- djstest.addTest(function (params) {
- djstest.assertsExpected(1);
- var cache = this.createAndAddCache({
- name: "cache" + new Date().valueOf(),
- source: params.source,
- prefetchSize: fixedPrefetchSize,
- idle: onidleValidation,
- pageSize: 2,
- mechanism: "memory"
- });
- cache.readRange(0, 5);
-
- }, "onidle in constructor, prefetch size = " + fixedPrefetchSize + " on " + sourceObject.source, { source: sourceObject.source });
-
- djstest.addTest(function (params) {
- djstest.assertsExpected(1);
- var cache = this.createAndAddCache({
- name: "cache" + new Date().valueOf(),
- source: params.source,
- prefetchSize: fixedPrefetchSize,
- pageSize: 2,
- mechanism: "memory"
- });
- cache.onidle = onidleValidation;
- cache.readRange(0, 5);
- }, "onidle, prefetch size = " + fixedPrefetchSize + " on " + sourceObject.source, { source: sourceObject.source });
-
- djstest.addTest(function (params) {
- djstest.assertsExpected(1);
- var cache = this.createAndAddCache({
- name: "cache" + new Date().valueOf(),
- source: params.source,
- prefetchSize: fixedPrefetchSize,
- idle: function () { djstest.assert(false, "unexpected onidle call") },
- pageSize: 2,
- mechanism: "memory"
- });
- cache.onidle = onidleValidation;
- cache.readRange(0, 5);
- }, "onidle override, prefetch size = " + fixedPrefetchSize + " on " + sourceObject.source, { source: sourceObject.source });
-
- djstest.addTest(function (params) {
- var cache = this.createAndAddCache({ name: "cache" + new Date().valueOf(), source: params.source, pageSize: 1, prefetchSize: -1 });
- var observableSource = typeof params.source === "string" ? this.observableHttpClient : params.source;
- cache.readRange(0, 1).then(function (data) {
- // Let one prefetch request go out, to make sure the prefetcher is started, and then destroy the cache
- $(observableSource).one("success", function () {
- var session = new Session(observableSource);
- cache.clear().then(function () {
- setTimeout(function () {
- djstest.assertAreEqualDeep(session.requests, [], "Verify no prefetch requests are sent out after cache.clear() callback");
- djstest.done();
- }, 1000);
- }, function (err) {
- djstest.fail("Error destroying the cache: " + djstest.toString(err));
- });
- });
- });
- }, "Testing cache.clear() halts the prefetcher" + sourceObject.source, { source: sourceObject.source });
-
- djstest.addTest(function (params) {
- var cache = this.createAndAddCache({ name: "cache" + new Date().valueOf(), source: params.source });
- if (params.countSupported) {
- cache.count().then(function (count) {
- djstest.assertAreEqual(count, itemsInCollection, "All items accounted for");
- djstest.destroyCacheAndDone(cache);
- }, makeUnexpectedErrorHandler(cache));
- }
- else {
- cache.count().then(function (count) {
- djstest.assert(false, "Success should not be called, count not supported");
- djstest.destroyCacheAndDone(cache);
- }, function (err) {
- djstest.assertAreEqual(err.message, "HTTP request failed", "Validating expected error");
- djstest.destroyCacheAndDone(cache);
- });
- }
- }, "Testing cache.count() on " + sourceObject.source, { source: sourceObject.source, countSupported: sourceObject.countSupported });
-
- djstest.addTest(function (params) {
- var cache = this.createAndAddCache({ name: "cache" + new Date().valueOf(), source: params.source, pageSize: 1, prefetchSize: 0 });
- var session = typeof params.source === "string" ? this.observableHttpClient.newSession() : new Session(params.source);
- cache.readRange(0, 1).cancel();
- setTimeout(function () {
- djstest.assertAreEqualDeep(session.requests, [], "Verify no requests are sent out after readRange is cancelled");
- djstest.done();
- }, 1000);
- }, "Testing cancel()" + sourceObject.source, { source: sourceObject.source });
-
- djstest.addTest(function (params) {
- djstest.assertsExpected(1);
- var cache = this.createAndAddCache({ name: "cache" + new Date().valueOf(), source: params.source, pageSize: 1, prefetchSize: 0 });
- cache.clear().then(function () {
- cache.clear().then(function () {
- djstest.pass("Second clear succeeded");
- djstest.done();
- }, makeUnexpectedErrorHandler(cache));
- }, makeUnexpectedErrorHandler(cache));
- }, "Testing .clear().then(cache.clear())" + sourceObject.source, { source: sourceObject.source });
- });
-
- var params = {
- source: "./endpoints/BasicAuthDataService.svc/Customers",
- skip: 0,
- take: 5,
- pageSize: 5,
- prefetchSize: -1,
- cacheSize: -1,
- user: "djsUser",
- password: "djsPassword"
- };
- djstest.addTest(dataCachePrefetchTest, createSingleReadTestName(params), params);
-})(this);
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/odata-cache-rx-functional-tests.html
----------------------------------------------------------------------
diff --git a/JSLib/tests/odata-cache-rx-functional-tests.html b/JSLib/tests/odata-cache-rx-functional-tests.html
deleted file mode 100644
index 8635ec3..0000000
--- a/JSLib/tests/odata-cache-rx-functional-tests.html
+++ /dev/null
@@ -1,54 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
- <title>>datajs.cache toObservable() tests</title>
- <meta http-equiv="cache-control" content="no-cache"/>
- <meta http-equiv="pragma" content="no-cache"/>
- <meta http-equiv="expires" content="-1"/>
-
- <link rel="stylesheet" href="http://code.jquery.com/qunit/qunit-1.10.0.css" type="text/css" />
- <script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/json2/20110223/json2.js"></script>
- <script type="text/javascript" src="http://code.jquery.com/jquery-1.4.4.min.js"></script>
- <script type="text/javascript" src="http://code.jquery.com/qunit/qunit-1.10.0.js"></script>
- <script type="text/javascript" src="common/TestSynchronizerClient.js"></script>
- <script type="text/javascript">
- window.TestSynchronizer.init(QUnit);
- </script>
-
- <script type="text/javascript" src="../src/datajs.js"></script>
- <script type="text/javascript" src="../src/utils.js"></script>
- <script type="text/javascript" src="../src/xml.js"></script>
-
- <script type="text/javascript" src="../src/odata-utils.js"></script>
- <script type="text/javascript" src="../src/odata-handler.js"></script>
- <script type="text/javascript" src="../src/odata-gml.js"></script>
- <script type="text/javascript" src="../src/odata-xml.js"></script>
- <script type="text/javascript" src="../src/odata-net.js"></script>
- <script type="text/javascript" src="../src/odata-json-light.js"></script>
- <script type="text/javascript" src="../src/odata-json.js"></script>
- <script type="text/javascript" src="../src/odata-atom.js"></script>
- <script type="text/javascript" src="../src/odata-metadata.js"></script>
- <script type="text/javascript" src="../src/odata-batch.js"></script>
- <script type="text/javascript" src="../src/odata.js"></script>
-
- <script type="text/javascript" src="../src/store-dom.js"></script>
- <script type="text/javascript" src="../src/store-indexeddb.js"></script>
- <script type="text/javascript" src="../src/store-memory.js"></script>
- <script type="text/javascript" src="../src/store.js"></script>
-
- <script type="text/javascript" src="../src/deferred.js"></script>
- <script type="text/javascript" src="../src/cache-source.js"></script>
- <script type="text/javascript" src="../src/cache.js"></script>
-
- <script type="text/javascript" src="common/djstest.js"></script>
- <script type="text/javascript" src="common/ODataReadOracle.js"></script>
- <script type="text/javascript" src="common/rx.js"></script>
- <script type="text/javascript" src="odata-cache-rx-functional-tests.js"></script>
-</head>
-<body>
- <h1 id="qunit-header">datajs.cache toObservable() tests</h1>
- <h2 id="qunit-banner"></h2>
- <h2 id="qunit-userAgent"></h2>
- <ol id="qunit-tests"></ol>
-</body>
-</html>
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/odata-cache-rx-functional-tests.js
----------------------------------------------------------------------
diff --git a/JSLib/tests/odata-cache-rx-functional-tests.js b/JSLib/tests/odata-cache-rx-functional-tests.js
deleted file mode 100644
index f1d4f1f..0000000
--- a/JSLib/tests/odata-cache-rx-functional-tests.js
+++ /dev/null
@@ -1,74 +0,0 @@
-/// <reference path="../src/datajs.js" />
-/// <reference path="../src/odata-utils.js" />
-/// <reference path="../src/cache.js" />
-/// <reference path="common/djstest.js" />
-/// <reference path="common/ODataReadOracle.js" />
-/// <reference path="common/rx.js" />
-
-(function (window, undefined) {
- OData.defaultHandler.accept = "application/json;q=0.9, application/atomsvc+xml;q=0.8, */*;q=0.1";
- var feeds = [
- { uri: "./endpoints/FoodStoreDataServiceV4.svc/Foods" }
- ];
-
- var itemsInCollection = 16;
- var pageSizes = [
- 1,
- 4, // factor of total, <= server page size
- 5, // non-factor of total, <= server page size
- 6, // non-factor of total, > server page size
- 8, // factor of total, > server page size
- itemsInCollection,
- itemsInCollection + 1
- ];
-
- var operatorTests = [
- function (observable) { return observable.Take(0); },
- function (observable) { return observable.Take(1); },
- function (observable) { return observable.Skip(1); },
- function (observable) { return observable.Skip(2).Take(4); },
- function (observable) { return observable.Select(function (item) { return item.Name; }); },
- function (observable) { return observable.Where(function (item) { return item.FoodID % 2 === 1; }); }
- ];
-
- var assertObservables = function (actual, expected, done) {
- /// <summary>Asserts two finite observables generate the same sequence</summary>
- /// <param name="actual" type="IObservable">The actual observable</param>
- /// <param name="expected" type="IObservable">The expected observable</param>
- /// <param name="done" type="Function">The callback function when asserts are done</param>
- var toArray = function (observable, callback) {
- var arr = [];
- observable.Subscribe(
- function (item) { arr.push(item); },
- function (err) { arr.push({ "__error__": err }); },
- function () { callback(arr); });
- };
-
- toArray(actual, function (actualSequence) {
- toArray(expected, function (expectedSequence) {
- djstest.assertAreEqualDeep(actualSequence, expectedSequence, "Verify observable sequence");
- done();
- });
- });
- };
-
- module("Functional");
- $.each(feeds, function (_, feed) {
- $.each(pageSizes, function (_, pageSize) {
- $.each(operatorTests, function (_, operator) {
- var params = { feedUri: feed.uri, pageSize: pageSize, operator: operator };
- djstest.addTest(function (params) {
- djstest.assertsExpected(1);
- var options = { name: "cache" + new Date().valueOf(), source: params.feedUri, pageSize: params.pageSize, prefetchSize: 0 };
- var cache = odatajs.createDataCache(options);
-
- ODataReadOracle.readJsonAcrossServerPages(params.feedUri, function (collection) {
- assertObservables(params.operator(cache.toObservable()), params.operator(window.Rx.Observable.FromArray(collection.value)), function () {
- djstest.destroyCacheAndDone(cache);
- });
- });
- }, "feed: " + params.feedUri + ", pageSize: " + params.pageSize + ", operator: " + params.operator.toString(), params);
- });
- });
- });
-})(this);
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/odata-fuzz.html
----------------------------------------------------------------------
diff --git a/JSLib/tests/odata-fuzz.html b/JSLib/tests/odata-fuzz.html
deleted file mode 100644
index 5d9c35d..0000000
--- a/JSLib/tests/odata-fuzz.html
+++ /dev/null
@@ -1,561 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
- <title>OData Fuzzing Tests</title>
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
- <meta http-equiv="expires" content="-1" />
- <script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/json2/20110223/json2.js"></script>
- <script type="text/javascript" src="http://code.jquery.com/jquery-1.4.4.js"></script>
-
- <script type="text/javascript" src="../src/datajs.js"></script>
- <script type="text/javascript" src="../src/utils.js"></script>
- <script type="text/javascript" src="../src/xml.js"></script>
-
- <script type="text/javascript" src="../src/odata-utils.js"></script>
- <script type="text/javascript" src="../src/odata-handler.js"></script>
- <script type="text/javascript" src="../src/odata-gml.js"></script>
- <script type="text/javascript" src="../src/odata-xml.js"></script>
- <script type="text/javascript" src="../src/odata-net.js"></script>
- <script type="text/javascript" src="../src/odata-json-light.js"></script>
- <script type="text/javascript" src="../src/odata-json.js"></script>
- <script type="text/javascript" src="../src/odata-atom.js"></script>
- <script type="text/javascript" src="../src/odata-metadata.js"></script>
- <script type="text/javascript" src="../src/odata-batch.js"></script>
- <script type="text/javascript" src="../src/odata.js"></script>
-
- <script type="text/javascript" src="../src/store-dom.js"></script>
- <script type="text/javascript" src="../src/store-indexeddb.js"></script>
- <script type="text/javascript" src="../src/store-memory.js"></script>
- <script type="text/javascript" src="../src/store.js"></script>
-
- <script type="text/javascript" src="../src/deferred.js"></script>
- <script type="text/javascript" src="../src/cache-source.js"></script>
- <script type="text/javascript" src="../src/cache.js"></script>
-
- <script type="text/javascript">
-
- var testCsdl = '' +
- '<?xml version="1.0" encoding="utf-8" standalone="yes"?>\r\n' +
- '<edmx:Edmx Version="1.0" xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx">\r\n' +
- ' <edmx:DataServices xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" m:DataServiceVersion="2.0">\r\n' +
- ' <Schema Namespace="TestCatalog.Model" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://schemas.microsoft.com/ado/2008/09/edm">\r\n' +
- ' <EntityType Name="Genre">\r\n' +
- ' <Key><PropertyRef Name="Name" /></Key>\r\n' +
- ' <Property Name="Name" Type="Edm.String" Nullable="false" MaxLength="50" Unicode="false" FixedLength="false" m:FC_TargetPath="SyndicationTitle" />\r\n' +
- ' <NavigationProperty Name="Titles" Relationship="TestCatalog.Model.TitleGenres" FromRole="Genres" ToRole="Titles" />\r\n' +
- ' </EntityType>\r\n' +
- ' <EntityType Name="Language">\r\n' +
- ' <Key><PropertyRef Name="Name" /></Key>\r\n' +
- ' <Property Name="Name" Type="Edm.String" Nullable="false" MaxLength="80" Unicode="false" FixedLength="false" m:FC_TargetPath="SyndicationTitle" />\r\n' +
- ' <NavigationProperty Name="Titles" Relationship="TestCatalog.Model.TitleLanguages" FromRole="Language" ToRole="Titles" />\r\n' +
- ' </EntityType>\r\n' +
- ' <EntityType Name="Person">\r\n' +
- ' <Key><PropertyRef Name="Id" /></Key>\r\n' +
- ' <Property Name="Id" Type="Edm.Int32" Nullable="false" />\r\n' +
- ' <Property Name="Name" Type="Edm.String" Nullable="false" MaxLength="80" Unicode="true" FixedLength="false" m:FC_TargetPath="SyndicationTitle" />\r\n' +
- ' <NavigationProperty Name="Awards" Relationship="TestCatalog.Model.FK_TitleAward_Person" FromRole="People" ToRole="TitleAwards" />\r\n' +
- ' <NavigationProperty Name="TitlesActedIn" Relationship="TestCatalog.Model.TitleActors" FromRole="People" ToRole="Titles" />\r\n' +
- ' <NavigationProperty Name="TitlesDirected" Relationship="TestCatalog.Model.TitleDirectors" FromRole="People" ToRole="Titles" />\r\n' +
- ' </EntityType>\r\n' +
- ' <EntityType Name="TitleAudioFormat">\r\n' +
- ' <Key><PropertyRef Name="TitleId" /><PropertyRef Name="DeliveryFormat" /><PropertyRef Name="Language" /><PropertyRef Name="Format" /></Key>\r\n' +
- ' <Property Name="TitleId" Type="Edm.String" Nullable="false" MaxLength="30" FixedLength="false" />\r\n' +
- ' <Property Name="DeliveryFormat" Type="Edm.String" Nullable="false" MaxLength="10" Unicode="false" FixedLength="false" />\r\n' +
- ' <Property Name="Language" Type="Edm.String" Nullable="false" MaxLength="30" Unicode="false" FixedLength="false" />\r\n' +
- ' <Property Name="Format" Type="Edm.String" Nullable="false" MaxLength="30" Unicode="false" FixedLength="false" />\r\n' +
- ' <NavigationProperty Name="Title" Relationship="TestCatalog.Model.FK_TitleAudioFormat_Title" FromRole="TitleAudioFormats" ToRole="Titles" />\r\n' +
- ' </EntityType>\r\n' +
- ' <EntityType Name="TitleAward">\r\n' +
- ' <Key><PropertyRef Name="Id" /></Key>\r\n' +
- ' <Property Name="Id" Type="Edm.Guid" Nullable="false" />\r\n' +
- ' <Property Name="Type" Type="Edm.String" Nullable="false" MaxLength="30" Unicode="false" FixedLength="false" />\r\n' +
- ' <Property Name="Category" Type="Edm.String" Nullable="false" MaxLength="60" Unicode="false" FixedLength="false" />\r\n' +
- ' <Property Name="Year" Type="Edm.Int32" Nullable="true" />\r\n' +
- ' <Property Name="Won" Type="Edm.Boolean" Nullable="false" />\r\n' +
- ' <NavigationProperty Name="Title" Relationship="TestCatalog.Model.FK_TitleAward_Title" FromRole="TitleAwards" ToRole="Titles" />\r\n' +
- ' <NavigationProperty Name="Person" Relationship="TestCatalog.Model.FK_TitleAward_Person" FromRole="TitleAwards" ToRole="People" />\r\n' +
- ' </EntityType>\r\n' +
- ' <EntityType Name="Title" m:HasStream="true">\r\n' +
- ' <Key><PropertyRef Name="Id" /></Key>\r\n' +
- ' <Property Name="Id" Type="Edm.String" Nullable="false" MaxLength="30" FixedLength="false" />\r\n' +
- ' <Property Name="Synopsis" Type="Edm.String" Nullable="true" MaxLength="Max" Unicode="false" FixedLength="false" m:FC_TargetPath="SyndicationSummary" m:FC_ContentKind="html" />\r\n' +
- ' <Property Name="ShortSynopsis" Type="Edm.String" Nullable="true" MaxLength="Max" Unicode="false" FixedLength="false" />\r\n' +
- ' <Property Name="AverageRating" Type="Edm.Double" Nullable="true" />\r\n' +
- ' <Property Name="ReleaseYear" Type="Edm.Int32" Nullable="true" />\r\n' +
- ' <Property Name="Url" Type="Edm.String" Nullable="true" MaxLength="200" Unicode="false" FixedLength="false" />\r\n' +
- ' <Property Name="Runtime" Type="Edm.Int32" Nullable="true" />\r\n' +
- ' <Property Name="Rating" Type="Edm.String" Nullable="true" MaxLength="10" Unicode="false" FixedLength="false" />\r\n' +
- ' <Property Name="DateModified" Type="Edm.DateTime" Nullable="false" ConcurrencyMode="Fixed" m:FC_TargetPath="SyndicationUpdated" m:FC_KeepInContent="false" />\r\n' +
- ' <Property Name="Type" Type="Edm.String" Nullable="false" MaxLength="8" Unicode="false" FixedLength="false" />\r\n' +
- ' <Property Name="BoxArt" Type="TestCatalog.Model.BoxArt" Nullable="false" />\r\n' +
- ' <Property Name="ShortName" Type="Edm.String" Nullable="false" MaxLength="200" Unicode="false" FixedLength="false" />\r\n' +
- ' <Property Name="Name" Type="Edm.String" Nullable="false" MaxLength="200" Unicode="false" FixedLength="false" m:FC_TargetPath="SyndicationTitle" />\r\n' +
- ' <Property Name="Instant" Type="TestCatalog.Model.InstantAvailability" Nullable="false" />\r\n' +
- ' <Property Name="Dvd" Type="TestCatalog.Model.DeliveryFormatAvailability" Nullable="false" />\r\n' +
- ' <Property Name="BluRay" Type="TestCatalog.Model.DeliveryFormatAvailability" Nullable="false" />\r\n' +
- ' <Property Name="TinyUrl" Type="Edm.String" Nullable="false" MaxLength="30" />\r\n' +
- ' <Property Name="WebsiteUrl" Type="Edm.String" Nullable="true" MaxLength="200" />\r\n' +
- ' <Property Name="TestApiId" Type="Edm.String" Nullable="false" MaxLength="200" />\r\n' +
- ' <NavigationProperty Name="AudioFormats" Relationship="TestCatalog.Model.FK_TitleAudioFormat_Title" FromRole="Titles" ToRole="TitleAudioFormats" />\r\n' +
- ' <NavigationProperty Name="Awards" Relationship="TestCatalog.Model.FK_TitleAward_Title" FromRole="Titles" ToRole="TitleAwards" />\r\n' +
- ' <NavigationProperty Name="Disc" Relationship="TestCatalog.Model.FK_Title_Disc" FromRole="Titles1" ToRole="Titles" />\r\n' +
- ' <NavigationProperty Name="Movie" Relationship="TestCatalog.Model.FK_Title_Movie" FromRole="Titles1" ToRole="Titles" />\r\n' +
- ' <NavigationProperty Name="Season" Relationship="TestCatalog.Model.FK_Title_Season" FromRole="Titles1" ToRole="Titles" />\r\n' +
- ' <NavigationProperty Name="Series" Relationship="TestCatalog.Model.FK_Title_Series" FromRole="Titles1" ToRole="Titles" />\r\n' +
- ' <NavigationProperty Name="ScreenFormats" Relationship="TestCatalog.Model.FK_TitleScreenFormat_Title" FromRole="Titles" ToRole="TitleScreenFormats" />\r\n' +
- ' <NavigationProperty Name="Cast" Relationship="TestCatalog.Model.TitleActors" FromRole="Titles" ToRole="People" />\r\n' +
- ' <NavigationProperty Name="Languages" Relationship="TestCatalog.Model.TitleLanguages" FromRole="Titles" ToRole="Language" />\r\n' +
- ' <NavigationProperty Name="Directors" Relationship="TestCatalog.Model.TitleDirectors" FromRole="Titles" ToRole="People" />\r\n' +
- ' <NavigationProperty Name="Genres" Relationship="TestCatalog.Model.TitleGenres" FromRole="Titles" ToRole="Genres" />\r\n' +
- ' </EntityType>\r\n' +
- ' <ComplexType Name="BoxArt">\r\n' +
- ' <Property Name="SmallUrl" Type="Edm.String" Nullable="true" MaxLength="80" Unicode="false" FixedLength="false" />\r\n' +
- ' <Property Name="MediumUrl" Type="Edm.String" Nullable="true" MaxLength="80" Unicode="false" FixedLength="false" />\r\n' +
- ' <Property Name="LargeUrl" Type="Edm.String" Nullable="true" MaxLength="80" Unicode="false" FixedLength="false" />\r\n' +
- ' <Property Name="HighDefinitionUrl" Type="Edm.String" Nullable="true" MaxLength="80" Unicode="false" FixedLength="false" />\r\n' +
- ' </ComplexType>\r\n' +
- ' <ComplexType Name="InstantAvailability">\r\n' +
- ' <Property Name="Available" Type="Edm.Boolean" Nullable="false" />\r\n' +
- ' <Property Name="AvailableFrom" Type="Edm.DateTime" Nullable="true" />\r\n' +
- ' <Property Name="AvailableTo" Type="Edm.DateTime" Nullable="true" />\r\n' +
- ' <Property Name="HighDefinitionAvailable" Type="Edm.Boolean" Nullable="false" />\r\n' +
- ' <Property Name="Runtime" Type="Edm.Int32" Nullable="true" />\r\n' +
- ' <Property Name="Rating" Type="Edm.String" Nullable="true" MaxLength="10" Unicode="false" FixedLength="false" />\r\n' +
- ' </ComplexType>\r\n' +
- ' <ComplexType Name="DeliveryFormatAvailability">\r\n' +
- ' <Property Name="Available" Type="Edm.Boolean" Nullable="false" />\r\n' +
- ' <Property Name="AvailableFrom" Type="Edm.DateTime" Nullable="true" />\r\n' +
- ' <Property Name="AvailableTo" Type="Edm.DateTime" Nullable="true" />\r\n' +
- ' <Property Name="Runtime" Type="Edm.Int32" Nullable="true" />\r\n' +
- ' <Property Name="Rating" Type="Edm.String" Nullable="true" MaxLength="10" Unicode="false" FixedLength="false" />\r\n' +
- ' </ComplexType>\r\n' +
- ' <EntityType Name="TitleScreenFormat">\r\n' +
- ' <Key><PropertyRef Name="TitleId" /><PropertyRef Name="DeliveryFormat" /><PropertyRef Name="Format" /></Key>\r\n' +
- ' <Property Name="TitleId" Type="Edm.String" Nullable="false" MaxLength="30" FixedLength="false" />\r\n' +
- ' <Property Name="DeliveryFormat" Type="Edm.String" Nullable="false" MaxLength="10" Unicode="false" FixedLength="false" />\r\n' +
- ' <Property Name="Format" Type="Edm.String" Nullable="false" MaxLength="30" Unicode="false" FixedLength="false" />\r\n' +
- ' <NavigationProperty Name="Title" Relationship="TestCatalog.Model.FK_TitleScreenFormat_Title" FromRole="TitleScreenFormats" ToRole="Titles" />\r\n' +
- ' </EntityType>\r\n' +
- ' <Association Name="FK_TitleAudioFormat_Title">\r\n' +
- ' <End Role="Titles" Type="TestCatalog.Model.Title" Multiplicity="1" />\r\n' +
- ' <End Role="TitleAudioFormats" Type="TestCatalog.Model.TitleAudioFormat" Multiplicity="*" />\r\n' +
- ' <ReferentialConstraint>\r\n' +
- ' <Principal Role="Titles"><PropertyRef Name="Id" /></Principal>\r\n' +
- ' <Dependent Role="TitleAudioFormats"><PropertyRef Name="TitleId" /></Dependent>\r\n' +
- ' </ReferentialConstraint>\r\n' +
- ' </Association>\r\n' +
- ' <Association Name="FK_TitleAward_Title">\r\n' +
- ' <End Role="Titles" Type="TestCatalog.Model.Title" Multiplicity="1" />\r\n' +
- ' <End Role="TitleAwards" Type="TestCatalog.Model.TitleAward" Multiplicity="*" />\r\n' +
- ' </Association>\r\n' +
- ' <Association Name="FK_TitleAward_Person">\r\n' +
- ' <End Role="People" Type="TestCatalog.Model.Person" Multiplicity="0..1" />\r\n' +
- ' <End Role="TitleAwards" Type="TestCatalog.Model.TitleAward" Multiplicity="*" />\r\n' +
- ' </Association>\r\n' +
- ' <Association Name="FK_Title_Disc">\r\n' +
- ' <End Role="Titles" Type="TestCatalog.Model.Title" Multiplicity="0..1" />\r\n' +
- ' <End Role="Titles1" Type="TestCatalog.Model.Title" Multiplicity="*" />\r\n' +
- ' </Association>\r\n' +
- ' <Association Name="FK_Title_Movie">\r\n' +
- ' <End Role="Titles" Type="TestCatalog.Model.Title" Multiplicity="0..1" />\r\n' +
- ' <End Role="Titles1" Type="TestCatalog.Model.Title" Multiplicity="*" />\r\n' +
- ' </Association>\r\n' +
- ' <Association Name="FK_Title_Season">\r\n' +
- ' <End Role="Titles" Type="TestCatalog.Model.Title" Multiplicity="0..1" />\r\n' +
- ' <End Role="Titles1" Type="TestCatalog.Model.Title" Multiplicity="*" />\r\n' +
- ' </Association>\r\n' +
- ' <Association Name="FK_Title_Series">\r\n' +
- ' <End Role="Titles" Type="TestCatalog.Model.Title" Multiplicity="0..1" />\r\n' +
- ' <End Role="Titles1" Type="TestCatalog.Model.Title" Multiplicity="*" />\r\n' +
- ' </Association>\r\n' +
- ' <Association Name="FK_TitleScreenFormat_Title">\r\n' +
- ' <End Role="Titles" Type="TestCatalog.Model.Title" Multiplicity="1" />\r\n' +
- ' <End Role="TitleScreenFormats" Type="TestCatalog.Model.TitleScreenFormat" Multiplicity="*" />\r\n' +
- ' <ReferentialConstraint>\r\n' +
- ' <Principal Role="Titles"><PropertyRef Name="Id" /></Principal>\r\n' +
- ' <Dependent Role="TitleScreenFormats"><PropertyRef Name="TitleId" /></Dependent>\r\n' +
- ' </ReferentialConstraint>\r\n' +
- ' </Association>\r\n' +
- ' <Association Name="TitleActors">\r\n' +
- ' <End Role="Titles" Type="TestCatalog.Model.Title" Multiplicity="*" />\r\n' +
- ' <End Role="People" Type="TestCatalog.Model.Person" Multiplicity="*" />\r\n' +
- ' </Association>\r\n' +
- ' <Association Name="TitleLanguages">\r\n' +
- ' <End Role="Titles" Type="TestCatalog.Model.Title" Multiplicity="*" />\r\n' +
- ' <End Role="Language" Type="TestCatalog.Model.Language" Multiplicity="*" />\r\n' +
- ' </Association>\r\n' +
- ' <Association Name="TitleDirectors">\r\n' +
- ' <End Role="Titles" Type="TestCatalog.Model.Title" Multiplicity="*" />\r\n' +
- ' <End Role="People" Type="TestCatalog.Model.Person" Multiplicity="*" />\r\n' +
- ' </Association>\r\n' +
- ' <Association Name="TitleGenres">\r\n' +
- ' <End Role="Titles" Type="TestCatalog.Model.Title" Multiplicity="*" />\r\n' +
- ' <End Role="Genres" Type="TestCatalog.Model.Genre" Multiplicity="*" />\r\n' +
- ' </Association>\r\n' +
- ' </Schema>\r\n' +
- ' <Schema Namespace="Test.Catalog" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://schemas.microsoft.com/ado/2008/09/edm">\r\n' +
- ' <EntityContainer Name="TestCatalog" m:IsDefaultEntityContainer="true">\r\n' +
- ' <FunctionImport Name="Movies" EntitySet="Titles" ReturnType="Collection(TestCatalog.Model.Title)" m:HttpMethod="GET" />\r\n' +
- ' <FunctionImport Name="Series" EntitySet="Titles" ReturnType="Collection(TestCatalog.Model.Title)" m:HttpMethod="GET" />\r\n' +
- ' <FunctionImport Name="Seasons" EntitySet="Titles" ReturnType="Collection(TestCatalog.Model.Title)" m:HttpMethod="GET" />\r\n' +
- ' <FunctionImport Name="Discs" EntitySet="Titles" ReturnType="Collection(TestCatalog.Model.Title)" m:HttpMethod="GET" />\r\n' +
- ' <FunctionImport Name="Episodes" EntitySet="Titles" ReturnType="Collection(TestCatalog.Model.Title)" m:HttpMethod="GET" />\r\n' +
- ' <EntitySet Name="Genres" EntityType="TestCatalog.Model.Genre" />\r\n' +
- ' <EntitySet Name="Languages" EntityType="TestCatalog.Model.Language" />\r\n' +
- ' <EntitySet Name="People" EntityType="TestCatalog.Model.Person" />\r\n' +
- ' <EntitySet Name="TitleAudioFormats" EntityType="TestCatalog.Model.TitleAudioFormat" />\r\n' +
- ' <EntitySet Name="TitleAwards" EntityType="TestCatalog.Model.TitleAward" />\r\n' +
- ' <EntitySet Name="Titles" EntityType="TestCatalog.Model.Title" />\r\n' +
- ' <EntitySet Name="TitleScreenFormats" EntityType="TestCatalog.Model.TitleScreenFormat" />\r\n' +
- ' <AssociationSet Name="FK_TitleAudioFormat_Title" Association="TestCatalog.Model.FK_TitleAudioFormat_Title">\r\n' +
- ' <End Role="Titles" EntitySet="Titles" />\r\n' +
- ' <End Role="TitleAudioFormats" EntitySet="TitleAudioFormats" />\r\n' +
- ' </AssociationSet>\r\n' +
- ' <AssociationSet Name="FK_TitleAward_Title" Association="TestCatalog.Model.FK_TitleAward_Title">\r\n' +
- ' <End Role="Titles" EntitySet="Titles" />\r\n' +
- ' <End Role="TitleAwards" EntitySet="TitleAwards" />\r\n' +
- ' </AssociationSet>\r\n' +
- ' <AssociationSet Name="FK_TitleAward_Person" Association="TestCatalog.Model.FK_TitleAward_Person">\r\n' +
- ' <End Role="People" EntitySet="People" />\r\n' +
- ' <End Role="TitleAwards" EntitySet="TitleAwards" />\r\n' +
- ' </AssociationSet>\r\n' +
- ' <AssociationSet Name="FK_Title_Disc" Association="TestCatalog.Model.FK_Title_Disc">\r\n' +
- ' <End Role="Titles" EntitySet="Titles" />\r\n' +
- ' <End Role="Titles1" EntitySet="Titles" />\r\n' +
- ' </AssociationSet>\r\n' +
- ' <AssociationSet Name="FK_Title_Movie" Association="TestCatalog.Model.FK_Title_Movie">\r\n' +
- ' <End Role="Titles" EntitySet="Titles" />\r\n' +
- ' <End Role="Titles1" EntitySet="Titles" />\r\n' +
- ' </AssociationSet>\r\n' +
- ' <AssociationSet Name="FK_Title_Season" Association="TestCatalog.Model.FK_Title_Season">\r\n' +
- ' <End Role="Titles" EntitySet="Titles" />\r\n' +
- ' <End Role="Titles1" EntitySet="Titles" />\r\n' +
- ' </AssociationSet>\r\n' +
- ' <AssociationSet Name="FK_Title_Series" Association="TestCatalog.Model.FK_Title_Series">\r\n' +
- ' <End Role="Titles" EntitySet="Titles" />\r\n' +
- ' <End Role="Titles1" EntitySet="Titles" />\r\n' +
- ' </AssociationSet>\r\n' +
- ' <AssociationSet Name="FK_TitleScreenFormat_Title" Association="TestCatalog.Model.FK_TitleScreenFormat_Title">\r\n' +
- ' <End Role="Titles" EntitySet="Titles" />\r\n' +
- ' <End Role="TitleScreenFormats" EntitySet="TitleScreenFormats" />\r\n' +
- ' </AssociationSet>\r\n' +
- ' <AssociationSet Name="TitleActors" Association="TestCatalog.Model.TitleActors">\r\n' +
- ' <End Role="Titles" EntitySet="Titles" />\r\n' +
- ' <End Role="People" EntitySet="People" />\r\n' +
- ' </AssociationSet>\r\n' +
- ' <AssociationSet Name="TitleLanguages" Association="TestCatalog.Model.TitleLanguages">\r\n' +
- ' <End Role="Titles" EntitySet="Titles" />\r\n' +
- ' <End Role="Language" EntitySet="Languages" />\r\n' +
- ' </AssociationSet>\r\n' +
- ' <AssociationSet Name="TitleDirectors" Association="TestCatalog.Model.TitleDirectors">\r\n' +
- ' <End Role="Titles" EntitySet="Titles" />\r\n' +
- ' <End Role="People" EntitySet="People" />\r\n' +
- ' </AssociationSet>\r\n' +
- ' <AssociationSet Name="TitleGenres" Association="TestCatalog.Model.TitleGenres">\r\n' +
- ' <End Role="Titles" EntitySet="Titles" />\r\n' +
- ' <End Role="Genres" EntitySet="Genres" />\r\n' +
- ' </AssociationSet>\r\n' +
- ' </EntityContainer>\r\n' +
- ' </Schema>\r\n' +
- ' </edmx:DataServices>\r\n' +
- '</edmx:Edmx>\r\n' +
- '';
-
-
- var iterationsRemaining = 0;
- var iterationsPerRun = 100000;
- var failureCount = 0;
- var canary = false;
-
- function canaryFn() {
- canary = true;
- }
-
- var buildSumAndNormalize = function (table) {
- // Sum all weights.
- var total = 0;
- for (var i = 0; i < table.length; i++) {
- total += table[i].w;
- }
-
- // Record a normalized weight (nw) and the step-ladder threshold.
- var last = 0;
- for (var i = 0; i < table.length; i++) {
- table[i].nw = (table[i].w / total);
-
- last += table[i].nw;
- table[i].sl = last;
- }
-
- table.total = total;
- };
-
- var randomFromWeighted = function (table) {
- if (table.total === undefined) {
- buildSumAndNormalize(table);
- }
-
- var number = Math.random();
- for (var i = 0; i < table.length; i++) {
- if (number < table[i].sl) {
- return table[i].v;
- }
- }
-
- return table[table.length - 1].v;
- };
-
- // Create a table with relative weight w and value v for text generation.
- var fuzzingTextTable = [
- { w: 3, v: "canary=true" },
- { w: 2, v: "canary=true;" },
- { w: 3, v: "canary=1" },
- { w: 1, v: "window.canary=1" },
- { w: 2, v: "canary=[]" },
- { w: 2, v: "canary={}" },
- { w: 1, v: "canaryFn" },
- { w: 2, v: "canaryFn()" }
- ];
-
- var fuzzingTextOpTable = [
- { w: 1, v: "replace" },
- { w: 3, v: "insert" }
- ];
-
- var fuzzText = function (text) {
- /// <summary>Fuzzes the specified string.</summary>
- /// <param name="text" type="String">Text to fuzz.</param>
- /// <returns type="String">The fuzzes text.</returns>
-
- var location = Math.round(Math.random() * text.length - 1);
- var content = randomFromWeighted(fuzzingTextTable);
- var op = randomFromWeighted(fuzzingTextOpTable);
- if (op === "replace") {
- text = text.substr(0, location) + content + text.substr(location + content.length);
- } else if (op === "insert") {
- text = text.substr(0, location) + content + text.substr(location);
- }
-
- return text;
- };
-
- var rarely = function (rare, common) {
- if (Math.random() < 0.1) {
- return rare;
- } else {
- return common;
- }
- };
-
- var gibberish = function () {
- var len = Math.random() * 100;
- var result = "";
- for (var i = 0; i < len; i++) {
- result += String.fromCharCode(Math.round(Math.random() * 65000));
- }
-
- return result;
- }
-
- var generateResponse = function (suggestedContentType, body) {
- var url = rarely(null, "http://foo/bar");
- var statusCode = rarely((Math.random() * 1000).toString().substr(0, 3), 200);
- var statusText = rarely(gibberish(), "OK");
- var headers = [];
- headers["Content-Length"] = rarely(Math.random() * 200, undefined);
- headers["Content-Type"] = rarely("foo bar baz", suggestedContentType);
-
- var response = { requestUri: url, statusCode: statusCode, statusText: statusText, headers: headers, body: body };
- return response;
- };
-
- var generateRandom = function () {
- var body = gibberish();
- return generateResponse("application/octet-stream", body);
- };
-
- var generateServiceDoc = function() {
- var body = '<?xml version="1.0" encoding="utf-8" standalone="yes" ?>\r\n' +
- '<service xml:base="http://services.odata.org/OData/OData.svc/" xmlns:atom="http://www.w3.org/2005/Atom" ' +
- ' xmlns:app="http://www.w3.org/2007/app" xmlns="http://www.w3.org/2007/app">' +
- '<workspace><atom:title>Default</atom:title> <collection href="Products"><atom:title>Products</atom:title></collection>' +
- '<collection href="Categories"><atom:title>Categories</atom:title> </collection><collection href="Suppliers"><atom:title>Suppliers</atom:title> </collection></workspace></service>';
- body = fuzzText(body);
- return generateResponse("application/atomsvc+xml", body);
- };
-
- var generateMetadata = function () {
- var body = testCsdl;
- body = fuzzText(body);
- return generateResponse("application/xml", body);
- };
-
- var generateError = function () {
- var body = testCsdl;
- body = fuzzText(body);
- return generateResponse("application/xml", body);
- };
-
- var generatePlainText = function () {
- var body = gibberish();
- return generateResponse("plain/text", body);
- };
-
- var generateBatch = function () {
- var body = gibberish();
- return generateResponse("multipart/mixed; boundary=batch(123)", body);
- };
-
- var generateXml = function () {
- // TODO: consider doing something about an XHTML section here
- var body = '' +
- '<?xml version="1.0" encoding="utf-8" standalone="yes"?>\r\n' +
- '<feed xml:base=http://services.odata.org/OData/OData.svc/' +
- ' xmlns:d=http://schemas.microsoft.com/ado/2007/08/dataservices' +
- ' xmlns:m=http://schemas.microsoft.com/ado/2007/08/dataservices/metadata' +
- ' xmlns="http://www.w3.org/2005/Atom">' +
- ' <title type="text">Categories</title>' +
- ' <id>http://services.odata.org/OData/OData.svc/Categories</id>' +
- ' <updated>2010-03-10T08:38:14Z</updated>' +
- ' <link rel="self" title="Categories" href="Categories" />' +
- ' <entry>' +
- ' <id>http://services.odata.org/OData/OData.svc/Categories(0)</id>' +
- ' <title type="text">Food</title>' +
- ' <updated>2010-03-10T08:38:14Z</updated>' +
- ' <author><name /></author>' +
- ' <link rel="edit" title="Category" href="Categories(0)" />' +
- ' <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Products"' +
- ' type="application/atom+xml;type=feed"' +
- ' title="Products" href="Categories(0)/Products" />' +
- ' <category term="ODataDemo.Category"' +
- ' scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />' +
- ' <content type="application/xml">' +
- ' <m:properties>' +
- ' <d:ID m:type="Edm.Int32">0</d:ID>' +
- ' <d:Name>Food</d:Name>' +
- ' <d:AverageRating m:type="Edm.Double">3.6</d:AverageRating>' +
- ' <d:AvailableFrom m:type="Edm.DateTime">1999-03-23T00:00:00</d:AvailableFrom>' +
- ' <d:Name>Food</d:Name>' +
- ' </m:properties>' +
- ' </content>' +
- ' </entry>' +
- ' <!-- <entry> elements representing additional Categories go here -->' +
- '</feed>';
- return generateResponse("application/atom+xml", body);
- };
-
- var generateJson = function () {
- var body = '{ "d" : { ' +
- '"results": [ ' +
- '{ ' +
- '"__metadata": { ' +
- '"uri": "http://services.odata.org/OData/OData.svc/Categories(0)", ' +
- '"type": "DataServiceProviderDemo.Category" ' +
- '}, ' +
- '"ID": 0, ' +
- '"Name": "Food", ' +
- '"SomeDate": "Date(123)", ' +
- '"Products": { ' +
- '"__deferred": { ' +
- '"uri": "http://services.odata.org/OData/OData.svc/Categories(0)/Products" ' +
- '} } } ], ' +
- '"__count": "3", ' +
- '"__next": "http://services.odata.org/OData/OData.svc$skiptoken=12" ' +
- '} } ' +
- '';
- return generateResponse("application/json", body);
- };
-
- // Create a table with relative weight w and value v for response generation.
- var formatTable = [
- { w: 1, v: generateRandom },
- { w: 2, v: generateError },
- { w: 5, v: generatePlainText },
- { w: 5, v: generateServiceDoc },
- { w: 10, v: generateBatch },
- { w: 10, v: generateMetadata },
- { w: 40, v: generateXml },
- { w: 80, v: generateJson }
- ];
-
- var fakeHttpClient = {
- request: function (request, success, error) {
- /// <summary>Performs a network request.</summary>
- /// <param name="success" type="Function">Success callback with the response object.</param>
- /// <param name="error" type="Function">Error callback with an error object.</param>
- /// <returns type="Object">Object with an 'abort' method for the operation.</returns>
-
- var shouldError = rarely(true, false);
- var format = randomFromWeighted(formatTable);
- var response = format();
-
- window.setTimeout(function () {
- if (shouldError) {
- error(response);
- } else {
- success(response);
- }
- }, 1);
-
- return {};
- }
- };
-
- var startTimeMs = 0;
-
- function startTest() {
- failureCount = 0;
- startTimeMs = new Date().getTime();
- iterationsRemaining = iterationsPerRun;
- nextIteration();
- }
-
- function readCallback() {
- // Success or failure don't actually matter.
- if (canary === true) {
- canary = false;
- failureCount++;
- }
-
- iterationsRemaining--;
- nextIteration();
- }
-
- function nextIteration() {
- if (iterationsRemaining === 0) {
- $("#fuzz-status").text("Tests complete. Failures: #" + failureCount);
- return;
- }
-
- if (iterationsRemaining % 50 === 0) {
- var text = "Running tests (pending=" + iterationsRemaining + " of " + iterationsPerRun;
- if (iterationsRemaining !== iterationsPerRun) {
- var currentTimeMs = new Date().getTime();
- var averageTestTimeMs = (iterationsPerRun - iterationsRemaining) / (currentTimeMs - startTimeMs);
- var remainingTimeMs = iterationsRemaining * averageTestTimeMs;
- text += ", ETA: " + remainingTimeMs + "ms, avg " + averageTestTimeMs + "ms";
- }
-
- text += "). Failures: #" + failureCount;
- $("#fuzz-status").text(text);
- }
-
- OData.read("url", readCallback, readCallback, undefined, fakeHttpClient);
- }
-
- $(document).ready(function () {
- $("#start-button").click(startTest);
- });
- </script>
-
-</head>
-<body>
-<h1>OData Fuzzing Tests</h1>
-<p>
-This page fuzzes the OData parsers in the datajs library.
-</p>
-<button id='start-button'>Start</button>
-<p id='fuzz-status'> </p>
-</body>
-</html>
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/odata-handler-tests.js
----------------------------------------------------------------------
diff --git a/JSLib/tests/odata-handler-tests.js b/JSLib/tests/odata-handler-tests.js
deleted file mode 100644
index 8e763fa..0000000
--- a/JSLib/tests/odata-handler-tests.js
+++ /dev/null
@@ -1,319 +0,0 @@
-/// <reference path="../src/odata-handler.js"/>
-/// <reference path="../src/odata.js"/>
-/// <reference path="imports/jquery.js"/>
-/// <reference path="common/djstest.js" />
-
-// odata-handler-tests.js
-
-(function (window, undefined) {
-
- djstest.addTest(function createUpdateDeleteTest() {
- // This is a simple create-update-delete cycle as a high-level test.
-
- var serviceUri = "./endpoints/FoodStoreDataServiceV4.svc/";
- var baseUri = serviceUri + "Categories";
- var testItem;
- var handledData = { CategoryID: 1001, Name: "Name #1001" };
- var uri;
-
- var itemCreatedCallback = function (data, response) {
- djstest.assert(response.headers["Location"], "location URL in the headers");
- djstest.assert(data.Name, "Name #1001");
-
- uri = response.headers["Location"];
- testItem = handledData;
- testItem.Name = "Updated name";
-
- odatajs.oData.request({
- method: "PUT",
- data: testItem,
- requestUri: uri,
- }, itemUpdatedCallback);
- };
-
- var itemUpdatedCallback = function (data, response) {
- djstest.assertAreEqual(response.statusCode, 204, "Expecting no content on update");
- odatajs.oData.request({
- method: "DELETE",
- requestUri: uri
- }, itemDeletedCallback);
- };
-
- var itemDeletedCallback = function (data, response) {
- djstest.done();
- };
-
- $.post(serviceUri + "ResetData", function () {
- odatajs.oData.request({
- requestUri: baseUri,
- method: "POST",
- data: { CategoryID: 1001, Name: "Name #1001" }
- }, itemCreatedCallback);
- });
- });
-
- djstest.addTest(function errorHandlerTest() {
- djstest.assertsExpected(1);
- odatajs.oData.read("./endpoints/FoodStoreDataServiceV4.svc/Categories?$reserved-misused=true",
- function (data) {
- djstest.fail("expected an error callback");
- djstest.done();
- },
- function (err) {
- djstest.assert(err.response.body, "err.response.body is assigned");
- djstest.done();
- });
- });
-
- djstest.addTest(function textHandlerParseTest() {
- djstest.assertsExpected(1);
- MockHttpClient.clear().addResponse("textHandlerParseTest", {
- statusCode: 200,
- body: " text ",
- headers: { "Content-Type": "text/plain" }
- });
- odatajs.oData.read("textHandlerParseTest", function (data) {
- djstest.assertAreEqual(data, " text ", "data matches");
- djstest.done();
- }, function (err) {
- djstest.fail("expected success");
- djstest.done();
- }, undefined, MockHttpClient);
- });
-
- djstest.addTest(function textHandlerParseEmptyTest() {
- djstest.assertsExpected(1);
- MockHttpClient.clear().addResponse("textHandlerParseTest", {
- statusCode: 200,
- body: "",
- headers: { "Content-Type": "text/plain" }
- });
- odatajs.oData.read("textHandlerParseTest", function (data) {
- djstest.assertAreEqual(data, "", "data matches");
- djstest.done();
- }, function (err) {
- djstest.fail("expected success");
- djstest.done();
- }, undefined, MockHttpClient);
- });
-
- djstest.addTest(function textHandlerSerializeTest() {
- djstest.assertsExpected(1);
- MockHttpClient.clear().addRequestVerifier("uri", function (request) {
- djstest.assertAreEqual(request.body, "text", "text in request");
- }).addResponse("uri", { statusCode: 200, body: "", headers: { "Content-Type": "text/plain"} });
- odatajs.oData.request({ requestUri: "uri", method: "POST", data: "text", headers: { "Content-Type": "text/plain"} }, function (data) {
- djstest.done();
- }, function (err) {
- djstest.fail("expected success");
- djstest.done();
- }, undefined, MockHttpClient);
- });
-
- djstest.addTest(function textHandlerSerializeBlankTest() {
- djstest.assertsExpected(1);
- MockHttpClient.clear().addRequestVerifier("uri", function (request) {
- djstest.assertAreEqual(request.body, "", "text in request");
- }).addResponse("uri", { statusCode: 200, body: "", headers: { "Content-Type": "text/plain"} });
- odatajs.oData.request({ requestUri: "uri", method: "POST", data: "", headers: { "Content-Type": "text/plain"} }, function (data) {
- djstest.done();
- }, function (err) {
- djstest.fail("expected success");
- djstest.done();
- }, undefined, MockHttpClient);
- });
-
- // DATAJS INTERNAL START
- djstest.addTest(function handlerReadTest() {
- var tests = [
- {
- response: { headers: { "Content-Type": "application/json", "OData-Version": "4.0" }, body: "response 0" },
- shouldHit: true,
- context: { contentType: OData.contentType("application/json"), dataServiceVersion: "4.0" }
- },
- {
- response: { headers: { "Content-Type": "application/json" }, body: "response 1" },
- shouldHit: true,
- context: { contentType: OData.contentType("application/json"), dataServiceVersion: "" }
- },
- {
- response: { headers: { "Content-Type": "otherMediaType" }, body: "response 2" },
- shouldHit: false,
- context: { contentType: OData.contentType("otherMediaType"), dataServiceVersion: "" }
- },
- {
- response: { headers: { "Content-Type": "application/json", "OData-Version": "4.0" }, body: "response 3" },
- shouldHit: true,
- context: { contentType: OData.contentType("application/json"), dataServiceVersion: "4.0" }
- },
- {
- response: { body: "response 4" },
- shouldHit: false,
- context: { contentType: OData.contentType("application/json"), dataServiceVersion: "" }
- },
- {
- response: null,
- shouldHit: false,
- context: {}
- },
- {
- response: undefined,
- shouldHit: false,
- context: {}
- }
- ];
-
- var i;
- var test;
- var testRead = function (handler, body, context) {
- djstest.assert(test.shouldHit, "method should be hit on item #" + i);
- djstest.assertAreEqual(handler, testHandler, "handler matches target on item #" + i);
- djstest.assertAreEqualDeep(context, test.context, "context matches target on item #" + i);
- djstest.assertAreEqual(body, test.response.body, "body matches target on item #" + i);
- return body;
- };
-
- var testHandler = OData.handler(testRead, null, "application/json", "4.0");
-
- var len, expectedAssertCount = 0;
- for (i = 0, len = tests.length; i < len; i++) {
- test = tests[i];
- test.context.handler = testHandler;
- test.context.response = test.response;
- if (test.shouldHit) {
- expectedAssertCount += 4;
- }
-
- testHandler.read(test.response, {});
- }
-
- djstest.assertsExpected(expectedAssertCount);
- djstest.done();
- });
-
- djstest.addTest(function handlerWriteTest() {
- var tests = [
- {
- request: { headers: { "Content-Type": "application/json", "OData-Version": "4.0" }, data: "request 0" },
- shouldHit: true,
- context: { contentType: OData.contentType("application/json"), dataServiceVersion: "4.0" }
- },
- {
- request: { headers: { "Content-Type": "application/json" }, data: "request 1" },
- shouldHit: true,
- context: { contentType: OData.contentType("application/json"), dataServiceVersion: undefined }
- },
- {
- request: { headers: { "Content-Type": "otherMediaType" }, data: "request 2" },
- shouldHit: false,
- context: { contentType: OData.contentType("otherMediaType"), dataServiceVersion: undefined }
- },
- {
- request: { headers: {}, data: "request 3" },
- shouldHit: true,
- context: { contentType: null, dataServiceVersion: undefined }
- },
- {
- request: { headers: { "Content-Type": "application/json", "OData-Version": "4.0" }, data: "request 4" },
- shouldHit: true,
- context: { contentType: OData.contentType("application/json"), dataServiceVersion: "4.0" }
- },
- {
- request: null,
- shouldHit: false,
- context: {}
- },
- {
- request: undefined,
- shouldHit: false,
- context: {}
- }
- ];
-
- var test;
- var testWrite = function (handler, data, context) {
- djstest.assert(test.shouldHit, "method should be hit");
- djstest.assertAreEqual(handler, testHandler, "handler matches target");
- djstest.assertAreEqualDeep(context, test.context, "context matches target");
- djstest.assertAreEqual(data, test.request.data, "body matches target");
- return data;
- };
-
- var testHandler = OData.handler(null, testWrite, "application/json", "4.0");
-
- var i, len, expectedAssertCount = 0;
- for (i = 0, len = tests.length; i < len; i++) {
- test = tests[i];
- test.context.handler = testHandler;
- test.context.request = test.request;
- if (test.shouldHit) {
- expectedAssertCount += 4;
- }
- testHandler.write(test.request);
- }
-
- djstest.assertsExpected(expectedAssertCount);
- djstest.done();
- });
-
- djstest.addTest(function handlerWriteUpdatesRequestContentTypeTest() {
- var testWrite = function (handler, data, context) {
- context.contentType = OData.contentType("my new content type");
- return data;
- };
-
- var testHandler = OData.handler(null, testWrite, "application/json", "4.0");
-
- var tests = [
- { request: { headers: { "Content-Type": "application/json" }, data: "request 0" }, expected: "application/json" },
- { request: { headers: {}, data: "request 1" }, expected: "my new content type" }
- ];
-
- var i, len;
- for (i = 0, len = tests.length; i < len; i++) {
- testHandler.write(tests[i].request);
- djstest.assertAreEqual(tests[i].request.headers["Content-Type"], tests[i].expected, "request content type is the expected");
- }
- djstest.done();
- });
-
- djstest.addTest(function contentTypeTest() {
- var tests = [
- { contentType: "application/atom+xml;param1=value1;param2=value2", expected: { mediaType: "application/atom+xml", properties: { param1: "value1", param2: "value2"}} },
- { contentType: "application/atom+xml; param1=value1; param2=value2", expected: { mediaType: "application/atom+xml", properties: { param1: "value1", param2: "value2"}} },
- { contentType: "application/atom+xml;param1=value1; param2=value2", expected: { mediaType: "application/atom+xml", properties: { param1: "value1", param2: "value2"}} },
- { contentType: "application/atom+xml; param1=value1;param2=value2", expected: { mediaType: "application/atom+xml", properties: { param1: "value1", param2: "value2"}} },
- { contentType: "application/atom+xml", expected: { mediaType: "application/atom+xml", properties: {}} },
- { contentType: ";param1=value1;param2=value2", expected: { mediaType: "", properties: { param1: "value1", param2: "value2"}} }
- ];
-
- var i, len, cTypeString;
- for (i = 0, len = tests.length; i < len; i++) {
- var actual = OData.contentType(tests[i].contentType);
- djstest.assertAreEqual(actual.mediaType, tests[i].expected.mediaType, "Content type media type is parsed correctly");
- djstest.assertAreEqualDeep(actual.properties, tests[i].expected.properties, "Content type properties are parsed correctly");
- }
-
- djstest.assert(!window.odatajs.oData.contentType(undefined), "contentType returns undefined for undefined input");
- djstest.assert(!window.odatajs.oData.contentType(null), "contentType returns undefined for null input");
-
- djstest.done();
- });
-
- djstest.addTest(function contentTypeToStringTest() {
- var tests = [
- { contentType: { mediaType: "application/atom+xml", properties: { param1: "value1", param2: "value2"} }, expected: "application/atom+xml;param1=value1;param2=value2" },
- { contentType: { mediaType: "application/atom+xml", properties: {} }, expected: "application/atom+xml" },
- { contentType: { mediaType: "", properties: { param1: "value1", param2: "value2"} }, expected: ";param1=value1;param2=value2" }
- ];
-
- var i, len, cTypeString;
- for (i = 0, len = tests.length; i < len; i++) {
- cTypeString = OData.contentTypeToString(tests[i].contentType);
- djstest.assertAreEqual(cTypeString, tests[i].expected, "contentTypeToString returns the correct contentType string");
- }
-
- djstest.done();
- });
- // DATAJS INTERNAL END
-})(this);
\ No newline at end of file
[04/22] olingo-odata4-js git commit: [OLINGO-442] Cleanup bevor
release
Posted by ko...@apache.org.
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/odata-metadata-tests.js
----------------------------------------------------------------------
diff --git a/JSLib/tests/odata-metadata-tests.js b/JSLib/tests/odata-metadata-tests.js
deleted file mode 100644
index 2af066f..0000000
--- a/JSLib/tests/odata-metadata-tests.js
+++ /dev/null
@@ -1,486 +0,0 @@
-/// <reference path="../src/odata-atom.js" />
-/// <reference path="../src/odata-xml.js" />
-/// <reference path="../src/odata-metadata.js" />
-/// <reference path="../src/odata.js" />
-/// <reference path="common/djstest.js" />
-
-// odata-metadata-tests.js
-
-(function (window, undefined) {
- djstest.addTest(function testMetadataHandler() {
- // Test cases as result / model tuples.
- var cases = [
- { i: {}, e: undefined },
- { i: { headers: { "Content-Type": "application/xml" }, body: '<edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx" />' },
- e: { version: "4.0" }
- }
- ];
-
- var i, len;
- for (i = 0, len = cases.length; i < len; i++) {
- var response = cases[i].i;
- var testClient = { request: function (r, success, error) { success(response); } };
- window.odatajs.oData.read("foo", function (data) {
- djstest.assertAreEqualDeep(data, cases[i].e, "handler result matches target");
- }, function (err) {
- djstest.fail(err.message);
- }, window.odatajs.oData.metadataHandler, testClient);
- }
-
- djstest.done();
- });
-
- // DATAJS INTERNAL START
- djstest.addTest(function testScriptCase() {
- // Test cases as input/result pairs.
- var cases = [
- { i: null, e: null },
- { i: "", e: "" },
- { i: "a", e: "a" },
- { i: "A", e: "a" },
- { i: "TestCase", e: "testCase" },
- { i: "123abc", e: "123abc" },
- { i: "ITEM", e: "ITEM" }
- ];
-
- var i, len;
- for (i = 0, len = cases.length; i < len; i++) {
- djstest.assertAreEqual(window.odatajs.oData.scriptCase(cases[i].i), cases[i].e, "processed input matches expected value");
- }
-
- djstest.done();
- });
-
- djstest.addTest(function testGetChildSchema() {
- // Test cases as input parent / input element / result tuples.
- var schema = window.odatajs.oData.schema;
- var cases = [
- { ip: schema.elements.EntityType, ie: "Property", e: { isArray: true, propertyName: "property"} },
- { ip: schema.elements.EntityType, ie: "Key", e: { isArray: true, propertyName: "key"} },
- { ip: schema.elements.EntitySet, ie: "SomethingElse", e: null },
- { ip: schema.elements.Property, ie: "Name", e: null} // this is an attribute, not an element, thus it's no found
- ];
-
- var i, len;
- for (i = 0, len = cases.length; i < len; i++) {
- var result = window.odatajs.oData.getChildSchema(cases[i].ip, cases[i].ie);
- djstest.assertAreEqualDeep(result, cases[i].e, "getChildSchema matches target");
- }
-
- djstest.done();
- });
-
- var testFullCsdl = '' +
- '<?xml version="1.0" encoding="utf-8"?>\r\n' +
- '<edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">\r\n' +
- ' <edmx:DataServices xmlns:m="http://docs.oasis-open.org/odata/ns/metadata" m:MaxDataServiceVersion="4.0" m:DataServiceVersion="4.0">\r\n' +
- ' <Schema xmlns="http://docs.oasis-open.org/odata/ns/edm" Namespace="TestCatalog.Model">\r\n' +
- ' <EntityType Name="Genre">\r\n' +
- ' <Key><PropertyRef Name="Name" /></Key>\r\n' +
- ' <Property Name="Name" Type="Edm.String" Nullable="false" MaxLength="50" Unicode="false" />\r\n' +
- ' <NavigationProperty Name="Titles" Type="Collection(TestCatalog.Model.Title)" Partner="Series" />\r\n' +
- ' </EntityType>\r\n' +
- ' <EntityType Name="Language">\r\n' +
- ' <Key><PropertyRef Name="Name" /></Key>\r\n' +
- ' <Property Name="Name" Type="Edm.String" Nullable="false" MaxLength="80" Unicode="false" />\r\n' +
- ' <NavigationProperty Name="Titles" Type="Collection(TestCatalog.Model.Title)" Partner="Languages" />\r\n' +
- ' </EntityType>\r\n' +
- ' <EntityType Name="Person">\r\n' +
- ' <Key><PropertyRef Name="Id" /></Key>\r\n' +
- ' <Property Name="Id" Type="Edm.Int32" Nullable="false" />\r\n' +
- ' <Property Name="Name" Type="Edm.String" Nullable="false" MaxLength="80" Unicode="true" />\r\n' +
- ' <NavigationProperty Name="Awards" Type="Collection(TestCatalog.Model.TitleAward)" Partner="Person"/>\r\n' +
- ' <NavigationProperty Name="TitlesActedIn" Type="Collection(TestCatalog.Model.Title)" Partner="Cast"/>\r\n' +
- ' <NavigationProperty Name="TitlesDirected" Type="Collection(TestCatalog.Model.Title)" Partner="Directors"/>\r\n' +
- ' </EntityType>\r\n' +
- ' <EntityType Name="TitleAudioFormat">\r\n' +
- ' <Key><PropertyRef Name="TitleId" /><PropertyRef Name="DeliveryFormat" /><PropertyRef Name="Language" /><PropertyRef Name="Format" /></Key>\r\n' +
- ' <Property Name="TitleId" Type="Edm.String" Nullable="false" MaxLength="30" FixedLength="false" />\r\n' +
- ' <Property Name="DeliveryFormat" Type="Edm.String" Nullable="false" MaxLength="10" Unicode="false" />\r\n' +
- ' <Property Name="Language" Type="Edm.String" Nullable="false" MaxLength="30" Unicode="false" FixedLength="false" />\r\n' +
- ' <Property Name="Format" Type="Edm.String" Nullable="false" MaxLength="30" Unicode="false" FixedLength="false" />\r\n' +
- ' <NavigationProperty Name="Title" Type="TestCatalog.Model.Title" Partner="AudioFormats" >\r\n' +
- ' <ReferentialConstraint Property="TitleId" ReferencedProperty="Id" />' +
- ' </NavigationProperty>' +
- ' </EntityType>\r\n' +
- ' <EntityType Name="TitleAward">\r\n' +
- ' <Key><PropertyRef Name="Id" /></Key>\r\n' +
- ' <Property Name="Id" Type="Edm.Guid" Nullable="false" />\r\n' +
- ' <Property Name="Type" Type="Edm.String" Nullable="false" MaxLength="30" Unicode="false" />\r\n' +
- ' <Property Name="Category" Type="Edm.String" Nullable="false" MaxLength="60" Unicode="false" />\r\n' +
- ' <Property Name="Year" Type="Edm.Int32" Nullable="true" />\r\n' +
- ' <Property Name="Won" Type="Edm.Boolean" Nullable="false" />\r\n' +
- ' <NavigationProperty Name="Title" Type="TestCatalog.Model.Title" Partner="Awards"/>\r\n' +
- ' <NavigationProperty Name="Person" Type="TestCatalog.Model.Person" Partner="Awards"/>\r\n' +
- ' </EntityType>\r\n' +
- ' <EntityType Name="Title" HasStream="true">\r\n' +
- ' <Key><PropertyRef Name="Id" /></Key>\r\n' +
- ' <Property Name="Id" Type="Edm.String" Nullable="false" MaxLength="30" />\r\n' +
- ' <Property Name="Synopsis" Type="Edm.String" Nullable="true" MaxLength="Max" Unicode="false" />\r\n' +
- ' <Property Name="ShortSynopsis" Type="Edm.String" Nullable="true" MaxLength="Max" Unicode="false" />\r\n' +
- ' <Property Name="AverageRating" Type="Edm.Double" Nullable="true" />\r\n' +
- ' <Property Name="ReleaseYear" Type="Edm.Int32" Nullable="true" />\r\n' +
- ' <Property Name="Url" Type="Edm.String" Nullable="true" MaxLength="200" Unicode="false" />\r\n' +
- ' <Property Name="Runtime" Type="Edm.Int32" Nullable="true" />\r\n' +
- ' <Property Name="Rating" Type="Edm.String" Nullable="true" MaxLength="10" Unicode="false" />\r\n' +
- ' <Property Name="DateModified" Type="Edm.DateTime" Nullable="false" />\r\n' +
- ' <Property Name="Type" Type="Edm.String" Nullable="false" MaxLength="8" Unicode="false" />\r\n' +
- ' <Property Name="BoxArt" Type="TestCatalog.Model.BoxArt" Nullable="false" />\r\n' +
- ' <Property Name="ShortName" Type="Edm.String" Nullable="false" MaxLength="200" Unicode="false" />\r\n' +
- ' <Property Name="Name" Type="Edm.String" Nullable="false" MaxLength="200" Unicode="false" />\r\n' +
- ' <Property Name="Instant" Type="TestCatalog.Model.InstantAvailability" Nullable="false" />\r\n' +
- ' <Property Name="Dvd" Type="TestCatalog.Model.DeliveryFormatAvailability" Nullable="false" />\r\n' +
- ' <Property Name="BluRay" Type="TestCatalog.Model.DeliveryFormatAvailability" Nullable="false" />\r\n' +
- ' <Property Name="TinyUrl" Type="Edm.String" Nullable="false" />\r\n' +
- ' <Property Name="WebsiteUrl" Type="Edm.String" Nullable="true" />\r\n' +
- ' <Property Name="TestApiId" Type="Edm.String" Nullable="false" />\r\n' +
- ' <NavigationProperty Name="AudioFormats" Type="Collection(TestCatalog.Model.TitleAudioFormat)" Partner="Title" Nullable="false" />\r\n' +
- ' <NavigationProperty Name="Awards" Type="Collection(TestCatalog.Model.TitleAward)" Partner="Title" Nullable="false" />\r\n' +
- ' <NavigationProperty Name="Disc" Type="Collection(TestCatalog.Model.Title)" />\r\n' +
- ' <NavigationProperty Name="Movie" Type="Collection(TestCatalog.Model.Title)" />\r\n' +
- ' <NavigationProperty Name="Season" Type="Collection(TestCatalog.Model.Title)" />\r\n' +
- ' <NavigationProperty Name="Series" Type="Collection(TestCatalog.Model.Title)" />\r\n' +
- ' <NavigationProperty Name="ScreenFormats" Type="Collection(TestCatalog.Model.TitleScreenFormat)" Partner="Title" Nullable="false" />\r\n' +
- ' <NavigationProperty Name="Cast" Type="Collection(TestCatalog.Model.Person)" Partner="TitlesActedIn" Nullable="false" />\r\n' +
- ' <NavigationProperty Name="Languages" Type="Collection(TestCatalog.Model.Language)" Partner="Titles" Nullable="false" />\r\n' +
- ' <NavigationProperty Name="Directors" Type="Collection(TestCatalog.Model.Person)" Partner="TitlesDirected" Nullable="false" />\r\n' +
- ' <NavigationProperty Name="Genres" Type="Collection(TestCatalog.Model.Genre)" Partner="Titles" Nullable="false" />\r\n' +
- ' </EntityType>\r\n' +
- ' <ComplexType Name="BoxArt">\r\n' +
- ' <Property Name="SmallUrl" Type="Edm.String" Nullable="true" MaxLength="80" Unicode="false" />\r\n' +
- ' <Property Name="MediumUrl" Type="Edm.String" Nullable="true" MaxLength="80" Unicode="false" />\r\n' +
- ' <Property Name="LargeUrl" Type="Edm.String" Nullable="true" MaxLength="80" Unicode="false" />\r\n' +
- ' <Property Name="HighDefinitionUrl" Type="Edm.String" Nullable="true" MaxLength="80" Unicode="false" />\r\n' +
- ' </ComplexType>\r\n' +
- ' <ComplexType Name="InstantAvailability">\r\n' +
- ' <Property Name="Available" Type="Edm.Boolean" Nullable="false" />\r\n' +
- ' <Property Name="AvailableFrom" Type="Edm.DateTime" Nullable="true" />\r\n' +
- ' <Property Name="AvailableTo" Type="Edm.DateTime" Nullable="true" />\r\n' +
- ' <Property Name="HighDefinitionAvailable" Type="Edm.Boolean" Nullable="false" />\r\n' +
- ' <Property Name="Runtime" Type="Edm.Int32" Nullable="true" />\r\n' +
- ' <Property Name="Rating" Type="Edm.String" Nullable="true" MaxLength="10" Unicode="false" />\r\n' +
- ' </ComplexType>\r\n' +
- ' <ComplexType Name="DeliveryFormatAvailability">\r\n' +
- ' <Property Name="Available" Type="Edm.Boolean" Nullable="false" />\r\n' +
- ' <Property Name="AvailableFrom" Type="Edm.DateTime" Nullable="true" />\r\n' +
- ' <Property Name="AvailableTo" Type="Edm.DateTime" Nullable="true" />\r\n' +
- ' <Property Name="Runtime" Type="Edm.Int32" Nullable="true" />\r\n' +
- ' <Property Name="Rating" Type="Edm.String" Nullable="true" MaxLength="10" Unicode="false" />\r\n' +
- ' </ComplexType>\r\n' +
- ' <EntityType Name="TitleScreenFormat">\r\n' +
- ' <Key><PropertyRef Name="TitleId" /><PropertyRef Name="DeliveryFormat" /><PropertyRef Name="Format" /></Key>\r\n' +
- ' <Property Name="TitleId" Type="Edm.String" Nullable="false" MaxLength="30" />\r\n' +
- ' <Property Name="DeliveryFormat" Type="Edm.String" Nullable="false" MaxLength="10" Unicode="false" />\r\n' +
- ' <Property Name="Format" Type="Edm.String" Nullable="false" MaxLength="30" Unicode="false" />\r\n' +
- ' <NavigationProperty Name="Title" Type="TestCatalog.Model.Title" Partner="ScreenFormats" >\r\n' +
- ' <ReferentialConstraint Property="TitleId" ReferencedProperty="Id" />' +
- ' </NavigationProperty>' +
- ' </EntityType>\r\n' +
- ' <Function Name="ProductsByRating">' +
- ' <ReturnType Type="Collection(TestCatalog.Model.Title)" />\r\n' +
- ' </Function>\r\n' +
- ' </Schema>\r\n' +
- ' <Schema xmlns="http://docs.oasis-open.org/odata/ns/edm" Namespace="Test.Catalog">\r\n' +
- ' <EntityContainer Name="TestCatalog" >\r\n' +
- ' <FunctionImport Name="Movies" EntitySet="Titles" Function="estCatalog.Model.GetTitles" />\r\n' +
- ' <FunctionImport Name="Series" EntitySet="Titles" Function="estCatalog.Model.GetTitles" />\r\n' +
- ' <FunctionImport Name="Seasons" EntitySet="Titles" Function="estCatalog.Model.GetTitles" />\r\n' +
- ' <FunctionImport Name="Discs" EntitySet="Titles" Function="estCatalog.Model.GetTitles" />\r\n' +
- ' <FunctionImport Name="Episodes" EntitySet="Titles" Function="estCatalog.Model.GetTitles" />\r\n' +
- ' <EntitySet Name="Genres" EntityType="TestCatalog.Model.Genre" >\r\n' +
- ' <NavigationPropertyBinding Target="Titles" Path="Titles" />\r\n' +
- ' </EntitySet>\r\n' +
- ' <EntitySet Name="Languages" EntityType="TestCatalog.Model.Language" >\r\n' +
- ' <NavigationPropertyBinding Target="Titles" Path="Languages" />\r\n' +
- ' </EntitySet>\r\n' +
- ' <EntitySet Name="People" EntityType="TestCatalog.Model.Person" >\r\n' +
- ' <NavigationPropertyBinding Target="Titles" Path="Cast" />\r\n' +
- ' <NavigationPropertyBinding Target="Titles" Path="Directors" />\r\n' +
- ' </EntitySet>' +
- ' <EntitySet Name="TitleAudioFormats" EntityType="TestCatalog.Model.TitleAudioFormat" >\r\n' +
- ' <NavigationPropertyBinding Target="Titles" Path="AudioFormats" />\r\n' +
- ' </EntitySet>\r\n' +
- ' <EntitySet Name="TitleAwards" EntityType="TestCatalog.Model.TitleAward" >\r\n' +
- ' <NavigationPropertyBinding Target="Titles" Path="Awards" />\r\n' +
- ' </EntitySet>\r\n' +
- ' <EntitySet Name="Titles" EntityType="TestCatalog.Model.Title" >\r\n' +
- ' <NavigationPropertyBinding Target="TitleAudioFormats" Path="Title" />\r\n' +
- ' <NavigationPropertyBinding Target="TitleAwards" Path="Title" />\r\n' +
- ' <NavigationPropertyBinding Target="Titles" Path="Disc" />\r\n' +
- ' <NavigationPropertyBinding Target="Titles" Path="Movie" />\r\n' +
- ' <NavigationPropertyBinding Target="Titles" Path="Season" />\r\n' +
- ' <NavigationPropertyBinding Target="Titles" Path="Series" />\r\n' +
- ' <NavigationPropertyBinding Target="TitleScreenFormats" Path="ScreenFormats" />\r\n' +
- ' <NavigationPropertyBinding Target="People" Path="TitlesActedIn" />\r\n' +
- ' <NavigationPropertyBinding Target="Languages" Path="Titles" />\r\n' +
- ' <NavigationPropertyBinding Target="People" Path="TitlesDirected" />\r\n' +
- ' <NavigationPropertyBinding Target="Genres" Path="Genres" />\r\n' +
- ' </EntitySet>\r\n' +
- ' <EntitySet Name="TitleScreenFormats" EntityType="TestCatalog.Model.TitleScreenFormat" >\r\n' +
- ' <NavigationPropertyBinding Target="TitleScreenFormats" Path="Title" />\r\n' +
- ' </EntitySet>\r\n' +
- ' </EntityContainer>\r\n' +
- ' </Schema>\r\n' +
- ' </edmx:DataServices>\r\n' +
- '</edmx:Edmx>\r\n' +
- '';
-
- var testFullMetadataResult = {
- "version": "4.0",
- "dataServices": {
- "dataServiceVersion": "4.0",
- "maxDataServiceVersion": "4.0",
- "schema": [{
- "namespace": "TestCatalog.Model",
- "entityType": [{
- "name": "Genre",
- "key": [{ "propertyRef": [{ "name": "Name"}] }],
- "property": [{ "name": "Name", "type": "Edm.String", "nullable": "false", "maxLength": "50", "unicode": "false"}],
- "navigationProperty": [{ "name": "Titles", "partner": "Series", "type": "Collection(TestCatalog.Model.Title)"}]
- }, {
- "name": "Language",
- "key": [{ "propertyRef": [{ "name": "Name"}] }],
- "property": [{ "name": "Name", "type": "Edm.String", "nullable": "false", "maxLength": "80", "unicode": "false"}],
- "navigationProperty": [{ "name": "Titles", "partner": "Languages", "type": "Collection(TestCatalog.Model.Title)"}]
- }, {
- "name": "Person",
- "key": [{ "propertyRef": [{ "name": "Id"}] }],
- "property": [
- { "name": "Id", "type": "Edm.Int32", "nullable": "false" },
- { "name": "Name", "type": "Edm.String", "nullable": "false", "maxLength": "80", "unicode": "true" }
- ],
- "navigationProperty": [
- { "name": "Awards", "partner": "Person", "type": "Collection(TestCatalog.Model.TitleAward)" },
- { "name": "TitlesActedIn", "partner": "Cast", "type": "Collection(TestCatalog.Model.Title)" },
- { "name": "TitlesDirected", "partner": "Directors", "type": "Collection(TestCatalog.Model.Title)" }
- ]
- }, {
- "name": "TitleAudioFormat",
- "key": [{ "propertyRef": [{ "name": "TitleId" }, { "name": "DeliveryFormat" }, { "name": "Language" }, { "name": "Format"}] }],
- "property": [
- { "name": "TitleId", "type": "Edm.String", "nullable": "false", "maxLength": "30" },
- { "name": "DeliveryFormat", "type": "Edm.String", "nullable": "false", "maxLength": "10", "unicode": "false" },
- { "name": "Language", "type": "Edm.String", "nullable": "false", "maxLength": "30", "unicode": "false" },
- { "name": "Format", "type": "Edm.String", "nullable": "false", "maxLength": "30", "unicode": "false" }
- ],
- "navigationProperty": [{ "name": "Title", "partner": "AudioFormats", "referentialConstraint": [{"property": "TitleId", "referencedProperty": "Id"}], "type": "TestCatalog.Model.Title" }]
- }, {
- "name": "TitleAward",
- "key": [{ "propertyRef": [{ "name": "Id"}] }],
- "property": [
- { "name": "Id", "type": "Edm.Guid", "nullable": "false" },
- { "name": "Type", "type": "Edm.String", "nullable": "false", "maxLength": "30", "unicode": "false" },
- { "name": "Category", "type": "Edm.String", "nullable": "false", "maxLength": "60", "unicode": "false" },
- { "name": "Year", "type": "Edm.Int32", "nullable": "true" }, { "name": "Won", "type": "Edm.Boolean", "nullable": "false" }
- ],
- "navigationProperty": [
- { "name": "Title", "partner": "Awards", "type": "TestCatalog.Model.Title" },
- { "name": "Person", "partner": "Awards", "type": "TestCatalog.Model.Person" }
- ]
- }, {
- "name": "Title",
- "hasStream": "true",
- "key": [{ "propertyRef": [{ "name": "Id"}] }],
- "property": [
- { "name": "Id", "type": "Edm.String", "nullable": "false", "maxLength": "30" },
- { "name": "Synopsis", "type": "Edm.String", "nullable": "true", "maxLength": "Max", "unicode": "false" },
- { "name": "ShortSynopsis", "type": "Edm.String", "nullable": "true", "maxLength": "Max", "unicode": "false" },
- { "name": "AverageRating", "type": "Edm.Double", "nullable": "true" }, { "name": "ReleaseYear", "type": "Edm.Int32", "nullable": "true" },
- { "name": "Url", "type": "Edm.String", "nullable": "true", "maxLength": "200", "unicode": "false" },
- { "name": "Runtime", "type": "Edm.Int32", "nullable": "true" },
- { "name": "Rating", "type": "Edm.String", "nullable": "true", "maxLength": "10", "unicode": "false" },
- { "name": "DateModified", "type": "Edm.DateTime", "nullable": "false"},
- { "name": "Type", "type": "Edm.String", "nullable": "false", "maxLength": "8", "unicode": "false" },
- { "name": "BoxArt", "type": "TestCatalog.Model.BoxArt", "nullable": "false" },
- { "name": "ShortName", "type": "Edm.String", "nullable": "false", "maxLength": "200", "unicode": "false" },
- { "name": "Name", "type": "Edm.String", "nullable": "false", "maxLength": "200", "unicode": "false" },
- { "name": "Instant", "type": "TestCatalog.Model.InstantAvailability", "nullable": "false" },
- { "name": "Dvd", "type": "TestCatalog.Model.DeliveryFormatAvailability", "nullable": "false" },
- { "name": "BluRay", "type": "TestCatalog.Model.DeliveryFormatAvailability", "nullable": "false" },
- { "name": "TinyUrl", "type": "Edm.String", "nullable": "false" },
- { "name": "WebsiteUrl", "type": "Edm.String", "nullable": "true" },
- { "name": "TestApiId", "type": "Edm.String", "nullable": "false" }
- ],
- "navigationProperty": [
- { "name": "AudioFormats", "nullable": "false", "partner": "Title", "type": "Collection(TestCatalog.Model.TitleAudioFormat)" },
- { "name": "Awards", "nullable": "false", "partner": "Title", "type": "Collection(TestCatalog.Model.TitleAward)" },
- { "name": "Disc", "type": "Collection(TestCatalog.Model.Title)" },
- { "name": "Movie", "type": "Collection(TestCatalog.Model.Title)" },
- { "name": "Season", "type": "Collection(TestCatalog.Model.Title)" },
- { "name": "Series", "type": "Collection(TestCatalog.Model.Title)" },
- { "name": "ScreenFormats", "nullable": "false", "partner": "Title", "type": "Collection(TestCatalog.Model.TitleScreenFormat)" },
- { "name": "Cast", "nullable": "false", "partner": "TitlesActedIn", "type": "Collection(TestCatalog.Model.Person)" },
- { "name": "Languages", "nullable": "false", "partner": "Titles", "type": "Collection(TestCatalog.Model.Language)" },
- { "name": "Directors", "nullable": "false", "partner": "TitlesDirected", "type": "Collection(TestCatalog.Model.Person)" },
- { "name": "Genres", "nullable": "false", "partner": "Titles", "type": "Collection(TestCatalog.Model.Genre)" }
- ]
- }, {
- "name": "TitleScreenFormat",
- "key": [{ "propertyRef": [{ "name": "TitleId" }, { "name": "DeliveryFormat" }, { "name": "Format"}]}],
- "property": [
- { "name": "TitleId", "type": "Edm.String", "nullable": "false", "maxLength": "30" },
- { "name": "DeliveryFormat", "type": "Edm.String", "nullable": "false", "maxLength": "10", "unicode": "false" },
- { "name": "Format", "type": "Edm.String", "nullable": "false", "maxLength": "30", "unicode": "false" }
- ],
- "navigationProperty": [{ "name": "Title", "partner": "ScreenFormats", "referentialConstraint": [{"property": "TitleId", "referencedProperty": "Id"}], "type": "TestCatalog.Model.Title" }]
- }],
- "complexType": [{
- "name": "BoxArt",
- "property": [
- { "name": "SmallUrl", "type": "Edm.String", "nullable": "true", "maxLength": "80", "unicode": "false" },
- { "name": "MediumUrl", "type": "Edm.String", "nullable": "true", "maxLength": "80", "unicode": "false" },
- { "name": "LargeUrl", "type": "Edm.String", "nullable": "true", "maxLength": "80", "unicode": "false" },
- { "name": "HighDefinitionUrl", "type": "Edm.String", "nullable": "true", "maxLength": "80", "unicode": "false" }
- ]
- }, {
- "name": "InstantAvailability",
- "property": [
- { "name": "Available", "type": "Edm.Boolean", "nullable": "false" },
- { "name": "AvailableFrom", "type": "Edm.DateTime", "nullable": "true" },
- { "name": "AvailableTo", "type": "Edm.DateTime", "nullable": "true" },
- { "name": "HighDefinitionAvailable", "type": "Edm.Boolean", "nullable": "false" },
- { "name": "Runtime", "type": "Edm.Int32", "nullable": "true" },
- { "name": "Rating", "type": "Edm.String", "nullable": "true", "maxLength": "10", "unicode": "false" }
- ]
- }, {
- "name": "DeliveryFormatAvailability",
- "property": [
- { "name": "Available", "type": "Edm.Boolean", "nullable": "false" },
- { "name": "AvailableFrom", "type": "Edm.DateTime", "nullable": "true" },
- { "name": "AvailableTo", "type": "Edm.DateTime", "nullable": "true" },
- { "name": "Runtime", "type": "Edm.Int32", "nullable": "true" },
- { "name": "Rating", "type": "Edm.String", "nullable": "true", "maxLength": "10", "unicode": "false" }
- ]
- }],
- "function": [
- {
- "name": "ProductsByRating",
- "returnType": {"type": "Collection(TestCatalog.Model.Title)" }
- }]
- }, {
- "namespace": "Test.Catalog",
- "entityContainer": {
- "name": "TestCatalog",
- "functionImport": [
- { "entitySet": "Titles", "function": "estCatalog.Model.GetTitles", "name": "Movies"},
- { "entitySet": "Titles", "function": "estCatalog.Model.GetTitles", "name": "Series"},
- { "entitySet": "Titles", "function": "estCatalog.Model.GetTitles", "name": "Seasons" },
- { "entitySet": "Titles", "function": "estCatalog.Model.GetTitles", "name": "Discs" },
- { "entitySet": "Titles", "function": "estCatalog.Model.GetTitles", "name": "Episodes" }
- ], "entitySet": [
- { "name": "Genres", "entityType": "TestCatalog.Model.Genre", "navigationPropertyBinding": [{"path": "Titles", "target": "Titles"}] },
- { "name": "Languages", "entityType": "TestCatalog.Model.Language", "navigationPropertyBinding": [{ "path": "Languages", "target": "Titles"}] },
- { "name": "People", "entityType": "TestCatalog.Model.Person", "navigationPropertyBinding": [{ "path": "Cast", "target": "Titles" }, { "path": "Directors", "target": "Titles"}] },
- { "name": "TitleAudioFormats", "entityType": "TestCatalog.Model.TitleAudioFormat", "navigationPropertyBinding": [{ "path": "AudioFormats", "target": "Titles"}] },
- { "name": "TitleAwards", "entityType": "TestCatalog.Model.TitleAward", "navigationPropertyBinding": [{ "path": "Awards", "target": "Titles"}] },
- { "name": "Titles", "entityType": "TestCatalog.Model.Title", "navigationPropertyBinding": [{ "path": "Title", "target": "TitleAudioFormats" }, { "path": "Title", "target": "TitleAwards" }, { "path": "Disc", "target": "Titles" }, { "path": "Movie", "target": "Titles" }, { "path": "Season", "target": "Titles" }, { "path": "Series", "target": "Titles" }, { "path": "ScreenFormats", "target": "TitleScreenFormats" }, { "path": "TitlesActedIn", "target": "People" }, { "path": "Titles", "target": "Languages" }, { "path": "TitlesDirected", "target": "People" }, { "path": "Genres", "target": "Genres"}] },
- { "name": "TitleScreenFormats", "entityType": "TestCatalog.Model.TitleScreenFormat", "navigationPropertyBinding": [{ "path": "Title", "target": "TitleScreenFormats"}] }
- ]
- }
- }]
- }
- };
-
- var testCsdlV4 = '' +
- '<edmx:Edmx xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx" Version="4.0">\r\n' +
- ' <edmx:DataServices xmlns:m="http://docs.oasis-open.org/odata/ns/metadata" m:MaxDataServiceVersion="4.0" m:DataServiceVersion="4.0">\r\n' +
- ' <Schema xmlns="http://docs.oasis-open.org/odata/ns/edm" Namespace="TestCatalog.Model"/>\r\n' +
- ' </edmx:DataServices>\r\n' +
- '</edmx:Edmx>';
-
- var testMetadataV4 = {
- "version": "4.0",
- "dataServices": {
- "maxDataServiceVersion": "4.0",
- "dataServiceVersion": "4.0",
- "schema": [{
- "namespace": "TestCatalog.Model"
- }]
- }
- };
-
- djstest.addTest(function testParseConceptualModelElement() {
- // Test cases as input XML text / result tuples.
- var cases = [
- { i: "<foo />", e: null },
- { i: '<edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx" />', e: { version: "4.0"} },
- { i: '<edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx-invalid" />', e: null },
- { i: testCsdlV4, e: testMetadataV4 },
- { i: testFullCsdl, e: testFullMetadataResult }
- ];
-
- var i, len;
- for (i = 0, len = cases.length; i < len; i++) {
- var doc = window.odatajs.xmlParse(cases[i].i);
- var schema = window.odatajs.oData.parseConceptualModelElement(doc.documentElement);
- djstest.assertAreEqualDeep(schema, cases[i].e, "parseConceptualModelElement result matches target");
- }
-
- djstest.done();
- });
-
- djstest.addTest(function metadataVocabularyTest() {
- var testCsdl = '' +
- '<?xml version="1.0" encoding="utf-8" standalone="yes"?>\r\n' +
- '<edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx" >\r\n' +
- ' <edmx:DataServices xmlns:m="http://docs.oasis-open.org/odata/ns/metadata" m:MaxDataServiceVersion="4.0" m:DataServiceVersion="4.0">\r\n' +
- ' <Schema Namespace="TestCatalog.Model" xmlns="http://docs.oasis-open.org/odata/ns/edm">\r\n' +
- ' <Term Name="Rating" Type="Edm.Int32" />\r\n' +
- ' <Term Name="CanEdit" Type="Edm.String" />\r\n' +
- ' <EntityType Name="Genre">\r\n' +
- ' <Key><PropertyRef Name="Name" /></Key>\r\n' +
- ' <Property Name="Name" Type="Edm.String" Nullable="false" MaxLength="50" Unicode="false" />\r\n' +
- ' </EntityType></Schema></edmx:DataServices></edmx:Edmx>';
-
-
- var doc = window.odatajs.xmlParse(testCsdl);
- var schema = window.odatajs.oData.parseConceptualModelElement(doc.documentElement);
-
- djstest.assertAreEqual(schema.dataServices.schema[0].term.length, 2, "schema.DataServices.Schema.Term.length === 2");
- djstest.assertAreEqual(schema.dataServices.schema[0].term[0].name, "Rating", "schema.DataServices.Schema.Term[0].name === 'Rating'");
- djstest.assertAreEqual(schema.dataServices.schema[0].term[1].name, "CanEdit", "schema.DataServices.Schema.Term[1].name === 'CanEdit'");
- djstest.done();
- });
-
- djstest.addTest(function metadataAnnotationTest() {
- var testCsdl = '' +
- '<?xml version="1.0" encoding="utf-8" standalone="yes"?>\r\n' +
- '<edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx" >\r\n' +
- ' <edmx:DataServices xmlns:m="http://docs.oasis-open.org/odata/ns/metadata" m:MaxDataServiceVersion="4.0" m:DataServiceVersion="4.0">\r\n' +
- ' <Schema Namespace="TestCatalog.Model" xmlns="http://docs.oasis-open.org/odata/ns/edm">\r\n' +
- ' <EntityType Name="Genre">\r\n' +
- ' <Key><PropertyRef Name="Name" /></Key>\r\n' +
- ' <Property Name="Name" Type="Edm.String" Nullable="false" MaxLength="50" Unicode="false" />\r\n' +
- ' </EntityType>\r\n' +
- ' <EntityType Name="Language">\r\n' +
- ' <Key><PropertyRef Name="Name" /></Key>\r\n' +
- ' <Property Name="Name" Type="Edm.String" Nullable="false" MaxLength="80" Unicode="false" />\r\n' +
- ' <Property Name="Id" Type="Edm.Int32" />\r\n' +
- ' </EntityType>\r\n' +
- ' <Annotations Target="TestCatalog.Model.Genre/Name">\r\n' +
- ' <Annotation String="Genre Name" Term="Org.OData.Display.V1.DisplayName"/>\r\n' +
- ' </Annotations>\r\n' +
- ' <Annotations Target="TestCatalog.Model.Language/Name">\r\n' +
- ' <Annotation String="Language Name" Term="Org.OData.Display.V1.DisplayName"/>\r\n' +
- ' <Annotation String="Language Name 2" Term="Org.OData.Display.V1.DisplayName 2"/>\r\n' +
- ' </Annotations>\r\n' +
- ' </Schema></edmx:DataServices></edmx:Edmx>';
-
-
- var doc = window.odatajs.xmlParse(testCsdl);
- var schema = window.odatajs.oData.parseConceptualModelElement(doc.documentElement);
-
- djstest.assertAreEqual(schema.dataServices.schema[0].annotations.length, 2, "Annotations number");
- djstest.assertAreEqual(schema.dataServices.schema[0].annotations[0].annotation.length, 1, "Annotation number");
- djstest.assertAreEqual(schema.dataServices.schema[0].annotations[0].annotation[0].string, "Genre Name", "Annotation name");
- djstest.assertAreEqual(schema.dataServices.schema[0].annotations[0].annotation[0].term, "Org.OData.Display.V1.DisplayName", "Annotation term");
- djstest.assertAreEqual(schema.dataServices.schema[0].annotations[1].annotation.length, 2, "Annotation number");
- djstest.assertAreEqual(schema.dataServices.schema[0].annotations[1].annotation[0].string, "Language Name", "Annotation name");
- djstest.assertAreEqual(schema.dataServices.schema[0].annotations[1].annotation[0].term, "Org.OData.Display.V1.DisplayName", "Annotation term");
- djstest.assertAreEqual(schema.dataServices.schema[0].annotations[1].annotation[1].string, "Language Name 2", "Annotation name");
- djstest.assertAreEqual(schema.dataServices.schema[0].annotations[1].annotation[1].term, "Org.OData.Display.V1.DisplayName 2", "Annotation term");
- djstest.done();
- });
-
- // DATAJS INTERNAL END
-})(this);
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/odata-net-tests.js
----------------------------------------------------------------------
diff --git a/JSLib/tests/odata-net-tests.js b/JSLib/tests/odata-net-tests.js
deleted file mode 100644
index 3e48934..0000000
--- a/JSLib/tests/odata-net-tests.js
+++ /dev/null
@@ -1,286 +0,0 @@
-/// <reference path="../src/odata-net.js" />
-/// <reference path="../src/odata.js" />
-/// <reference path="common/djstest.js" />
-/// <reference path="common/mockXMLHttpRequest.js" />
-
-// odata-net-tests.js
-(function (window, undefined) {
- module("Unit");
- djstest.addTest(function httpClientSendRequestTest() {
- var tests = [
- { url: "http://localhost/test1", response: { headers: {}, status: 200, body: "test"} },
- { url: "http://localhost/test2", response: { headers: {}, status: 204, body: "test"} },
- { url: "http://localhost/test3", response: { headers: {}, status: 299, body: "test"} },
- { url: "http://localhost/test4", response: { headers: {}, status: 500, body: "error"} }
- ];
-
- djstest.assertsExpected(12);
-
- var sentCount = 0;
- MockXMLHttpRequest.onAfterSend = function () {
- sentCount++;
- };
-
- var oldXmlHttpRequest = window.XMLHttpRequest;
- var oldEnableJsonpCallback = OData.defaultHttpClient.enableJsonpCallback;
- try {
- window.XMLHttpRequest = MockXMLHttpRequest.XMLHttpRequest;
- var i, len;
- for (i = 0, len = tests.length; i < len; i++) {
- MockXMLHttpRequest.addResponse(tests[i].url, tests[i].response);
-
- OData.defaultHttpClient.enableJsonpCallback = false;
- //Need a closure to capture the current test being executed.
- (function (test) {
- OData.defaultHttpClient.request(
- { requestUri: test.url, headers: {} },
- function (response) {
- djstest.assert(response.statusCode >= 200 & response.statusCode <= 299, "response status is in the success range");
- djstest.assertAreEqual(response.body, test.response.body, "response body is the expected one");
- djstest.assertAreEqualDeep(response.headers, [], "response headers are the expected ones");
- },
- function (error) {
- djstest.assert(error.response.statusCode > 299, "response status is in the error range");
- djstest.assertAreEqual(error.response.body, test.response.body, "response body is the expected one");
- djstest.assertAreEqualDeep(error.response.headers, [], "response headers are the expected ones");
- });
- })(tests[i]);
- }
- }
- finally {
- //Cleanup and finish the test after all requests have been sent and processed. Poll every 50 ms
- var timer = setInterval(function () {
- if (sentCount === tests.length) {
- clearInterval(timer)
- OData.defaultHttpClient.enableJsonpCallback = oldEnableJsonpCallback;
- window.XMLHttpRequest = oldXmlHttpRequest;
- MockXMLHttpRequest.reset();
- djstest.done();
- }
- }, 50);
- }
- });
-
- djstest.addTest(function httpClientRequestTimeoutTest() {
- var oldXmlHttpRequest = window.XMLHttpRequest;
- var testDone = false;
-
- djstest.assertsExpected(1);
-
- var oldEnableJsonpCallback = OData.defaultHttpClient.enableJsonpCallback;
- try {
- window.XMLHttpRequest = MockXMLHttpRequest.XMLHttpRequest;
- OData.defaultHttpClient.enableJsonpCallback = false;
-
- OData.defaultHttpClient.request(
- { requestUri: "http://test1", timeoutMS: 10, headers: { MockTimeOut: true} },
- function (response) {
- djstest.fail("success method was hit when not expected");
- testDone = true;
- },
- function (error) {
- djstest.assertAreEqual(error.message, "Request timed out", "error method executes and error is the expected one");
- testDone = true;
- });
- }
- finally {
- //Cleanup and finish the test after all requests have been sent and processed. Poll every 50 ms
- var timer = setInterval(function () {
- if (testDone) {
- clearInterval(timer)
- OData.defaultHttpClient.enableJsonpCallback = oldEnableJsonpCallback;
- window.XMLHttpRequest = oldXmlHttpRequest;
- MockXMLHttpRequest.reset();
- djstest.done();
- }
- }, 50);
- }
- });
-
- djstest.addTest(function httpClientRequestAbortTest() {
-
- var oldXmlHttpRequest = window.XMLHttpRequest;
-
- djstest.assertsExpected(1);
-
- var oldEnableJsonpCallback = OData.defaultHttpClient.enableJsonpCallback;
- try {
- window.XMLHttpRequest = MockXMLHttpRequest.XMLHttpRequest;
- OData.defaultHttpClient.enableJsonpCallback = false;
-
- var result = OData.defaultHttpClient.request(
- { requestUri: "http://test1", headers: { MockNoOp: true} },
- function (response) {
- djstest.fail("success method was hit when not expected");
- },
- function (error) {
- djstest.assertAreEqual(error.message, "Request aborted", "error method executes and error is the expected one");
- });
-
- result.abort();
- }
- finally {
- OData.defaultHttpClient.enableJsonpCallback = oldEnableJsonpCallback;
- window.XMLHttpRequest = oldXmlHttpRequest;
- MockXMLHttpRequest.reset();
- djstest.done();
- }
- });
-
- djstest.addTest(function httpClientRequestAbortOnCompletedRequestTest() {
-
- var oldXmlHttpRequest = window.XMLHttpRequest;
- var testDone = false;
-
- djstest.assertsExpected(1);
-
- var oldEnableJsonpCallback = OData.defaultHttpClient.enableJsonpCallback;
- try {
- window.XMLHttpRequest = MockXMLHttpRequest.XMLHttpRequest;
- OData.defaultHttpClient.enableJsonpCallback = false;
-
- MockXMLHttpRequest.addResponse("http://test1", { headers: {}, status: 200, body: "test body" });
-
- MockXMLHttpRequest.onAfterSend = function () {
- result.abort();
- testDone = true;
- };
-
- result = OData.defaultHttpClient.request(
- { requestUri: "http://test1", headers: {} },
- function (response) {
- djstest.pass("success method was hit");
- },
- function (error) {
- djstest.fail("success method was hit when not expected - [" + error.message + "]");
- });
- }
- finally {
- // Cleanup after test is done, poll eavery 50ms
- var timer = setInterval(function () {
- if (testDone) {
- clearInterval(timer);
- OData.defaultHttpClient.enableJsonpCallback = oldEnableJsonpCallback;
- window.XMLHttpRequest = oldXmlHttpRequest;
- MockXMLHttpRequest.reset();
- djstest.done();
- }
- }, 50);
- }
- });
-
- djstest.addTest(function httpClientRequestSendsRequestCorrectlyTest() {
- var tests = [
- {
- request: { requestUri: "http://test1", headers: {}, body: "test" },
- expected: { headers: {}, url: "http://test1", method: "GET", body: "test", async: true, user: undefined, password: undefined }
- },
- {
- request: { requestUri: "http://test2", headers: {}, method: "POST", body: "test" },
- expected: { headers: {}, url: "http://test2", method: "POST", body: "test", async: true, user: undefined, password: undefined }
- },
- {
- request: { requestUri: "http://test3", headers: { header1: "value1", header2: "value2" }, body: "test" },
- expected: { headers: { header1: "value1", header2: "value2" }, url: "http://test3", method: "GET", body: "test", async: true, user: undefined, password: undefined }
- }
- ];
-
- var oldXmlHttpRequest = window.XMLHttpRequest;
- var oldEnableJsonpCallback = OData.defaultHttpClient.enableJsonpCallback;
- try {
- window.XMLHttpRequest = MockXMLHttpRequest.XMLHttpRequest;
- OData.defaultHttpClient.enableJsonpCallback = false;
- var i, len;
- for (i = 0, len = tests.length; i < len; i++) {
-
- MockXMLHttpRequest.addRequestVerifier(tests[i].request.requestUri, function (request) {
- djstest.assertAreEqualDeep(request, tests[i].expected, "request matches target");
- });
-
- OData.defaultHttpClient.request(
- tests[i].request,
- function (response) { });
- }
- }
- finally {
- // Restore original values.
- OData.defaultHttpClient.enableJsonpCallback = oldEnableJsonpCallback;
- window.XMLHttpRequest = oldXmlHttpRequest;
- }
- djstest.done();
- });
-
- // DATAJS INTERNAL START
- djstest.addTest(function canUseJSONPTest() {
- var tests = [
- { pass: true, input: {} },
- { pass: true, input: { method: "GET"} },
- { pass: false, input: { method: "PUT"} },
- { pass: false, input: { method: "get"} },
- { pass: true, input: { accept: "*/*"} },
- { pass: true, input: { accept: "application/json"} },
- { pass: true, input: { accept: "text/javascript"} },
- { pass: true, input: { accept: "application/javascript"} },
- { pass: true, input: { accept: "application/xml"} },
- { pass: true, input: { headers: { Accept: "application/xml"}} }
- ];
- for (var i = 0; i < tests.length; i++) {
- var actual = OData.canUseJSONP(tests[i].input);
- djstest.assert(actual === tests[i].pass, "test " + i + " didn't actually match pass (" + tests[i].pass + ")");
- }
- djstest.done();
- });
-
- djstest.addTest(function isAbsoluteUrlTest() {
- djstest.assert(OData.isAbsoluteUrl("http://something/"));
- djstest.assert(OData.isAbsoluteUrl("http://malformed url/"));
- djstest.assert(OData.isAbsoluteUrl("https://localhost/"));
- djstest.assert(OData.isAbsoluteUrl("file://another-protocol/"));
- djstest.assert(!window.odatajs.oData.isAbsoluteUrl("/path"));
- djstest.assert(!window.odatajs.oData.isAbsoluteUrl("?query-string"));
- djstest.assert(!window.odatajs.oData.isAbsoluteUrl(""));
- djstest.assert(!window.odatajs.oData.isAbsoluteUrl("mailto:someone"));
- djstest.done();
- });
-
- djstest.addTest(function isLocalUrlTest() {
- var thisUrl = window.location.href;
- var localUrls = [
- "", ".", "/howdy.htm", " ", "?queryparam",
- thisUrl, thisUrl + "/foo", thisUrl + "?something-else"
- ];
- var remoteUrls = [
- "http://www.microsoft.com/",
- "https://www.microsoft.com/",
- "https://" + window.location.host,
- "https://" + window.location.hostname,
- // 21 is FTP, so the test shouldn't collide
- "http://" + window.location.hostname + ":21"
- ];
- var i, len;
- for (i = 0, len = localUrls.length; i < len; i++) {
- djstest.assert(OData.isLocalUrl(localUrls[i]), "is local: [" + localUrls[i] + "]");
- }
- for (i = 0, len = remoteUrls.length; i < len; i++) {
- djstest.assert(!window.odatajs.oData.isLocalUrl(remoteUrls[i]), "is not local: [" + remoteUrls[i] + "]");
- }
- djstest.done();
- });
-
- // DATAJS INTERNAL END
-
- djstest.addTest(function userPasswordTest() {
- odatajs.oData.request({
- requestUri: "./endpoints/FoodStoreDataServiceV4.svc/UserNameAndPassword",
- user: "the-user",
- password: "the-password"
- }, function (data) {
- djstest.assertAreEqualDeep(data.value, "Basic dGhlLXVzZXI6dGhlLXBhc3N3b3Jk", "response matches");
- djstest.done();
- }, function (err) {
- djstest.fail("error: " + err.message);
- djstest.done();
- });
- });
-
-})(this);
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/odata-perf-tests.html
----------------------------------------------------------------------
diff --git a/JSLib/tests/odata-perf-tests.html b/JSLib/tests/odata-perf-tests.html
deleted file mode 100644
index bdcbfb5..0000000
--- a/JSLib/tests/odata-perf-tests.html
+++ /dev/null
@@ -1,45 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
- <title>OData perf tests</title>
- <meta http-equiv="cache-control" content="no-cache"/>
- <meta http-equiv="pragma" content="no-cache"/>
- <meta http-equiv="expires" content="-1"/>
-
- <link rel="stylesheet" href="http://code.jquery.com/qunit/qunit-1.10.0.css" type="text/css" />
- <script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/json2/20110223/json2.js"></script>
- <script type="text/javascript" src="http://code.jquery.com/jquery-1.4.4.min.js"></script>
- <script type="text/javascript" src="http://code.jquery.com/qunit/qunit-1.10.0.js"></script>
- <script type="text/javascript" src="common/TestSynchronizerClient.js"></script>
- <script type="text/javascript">
- window.TestSynchronizer.init(QUnit);
- </script>
-
- <script type="text/javascript" src="../src/datajs.js"></script>
- <script type="text/javascript" src="../src/utils.js"></script>
- <script type="text/javascript" src="../src/xml.js"></script>
-
- <script type="text/javascript" src="../src/odata-utils.js"></script>
- <script type="text/javascript" src="../src/odata-handler.js"></script>
- <script type="text/javascript" src="../src/odata-gml.js"></script>
- <script type="text/javascript" src="../src/odata-xml.js"></script>
- <script type="text/javascript" src="../src/odata-net.js"></script>
- <script type="text/javascript" src="../src/odata-json-light.js"></script>
- <script type="text/javascript" src="../src/odata-json.js"></script>
- <script type="text/javascript" src="../src/odata-atom.js"></script>
- <script type="text/javascript" src="../src/odata-metadata.js"></script>
- <script type="text/javascript" src="../src/odata-batch.js"></script>
- <script type="text/javascript" src="../src/odata.js"></script>
-
- <script type="text/javascript" src="common/djstest.js"></script>
- <script type="text/javascript" src="common/Instrument.js"></script>
-
- <script type="text/javascript" src="odata-perf-tests.js"></script>
-</head>
-<body>
- <h1 id="qunit-header">OData perf tests</h1>
- <h2 id="qunit-banner"></h2>
- <h2 id="qunit-userAgent"></h2>
- <ol id="qunit-tests"></ol>
-</body>
-</html>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/odata-perf-tests.js
----------------------------------------------------------------------
diff --git a/JSLib/tests/odata-perf-tests.js b/JSLib/tests/odata-perf-tests.js
deleted file mode 100644
index 9c484e7..0000000
--- a/JSLib/tests/odata-perf-tests.js
+++ /dev/null
@@ -1,229 +0,0 @@
-/// <reference path="common/djstest.js" />
-/// <reference path="../src/odata.js" />
-/// <reference path="common/Instrument.js" />
-/// <reference path="common/ODataReadOracle.js" />
-
-(function (window, undefined) {
- var unexpectedErrorHandler = function (err) {
- djstest.assert(false, "Unexpected call to error handler with error: " + djstest.toString(err));
- djstest.done();
- };
-
- var timedHttpClient = {
- duration: 0,
- provider: OData.defaultHttpClient,
- request: function (request, success, error) {
- var startTime = new Date();
- return timedHttpClient.provider.request(request, function () {
- timedHttpClient.duration = new Date() - startTime;
- success.apply(this, arguments);
- }, error);
- }
- };
-
- var largeCollectionService = "./endpoints/LargeCollectionService.svc/";
-
- // null "service" indicates the feed is read-only
- var feeds = [
- // will add atom format test after enabling atom scenario
- { service: largeCollectionService, uri: largeCollectionService + "Customers", mimeType: "application/json;odata.metadata=minimal" },
- { service: largeCollectionService, uri: largeCollectionService + "Customers", mimeType: "application/json;odata.metadata=full" },
- { service: largeCollectionService, uri: largeCollectionService + "Customers", mimeType: "application/json;odata.metadata=none" },
- { service: largeCollectionService, uri: largeCollectionService + "Suppliers", mimeType: "application/json" },
- { service: null, uri: "http://odata.netflix.com/Catalog/Titles", mimeType: "application/json" }
- ];
-
- module("Performance", {
- setup: function () {
- djstest.wait(function (done) {
- $.post(largeCollectionService + "ResetData", done);
- });
- },
- teardown: function () {
- OData.defaultHttpClient = timedHttpClient.provider;
- }
- });
-
- OData.defaultHttpClient.enableJsonpCallback = true;
- $.each(feeds, function (_, feed) {
- $.each([5, 500], function (_, items) {
- var params = $.extend({}, feed, { items: items, readUri: feed.uri + "?$top=" + items });
- djstest.addTest(function readPerfTest(params) {
- var measureRead = function (metadata) {
- var startTime = new Date();
- odatajs.oData.read({ requestUri: params.readUri, headers: { Accept: params.mimeType }, enableJsonpCallback: true }, function () {
- var duration = new Date() - startTime - timedHttpClient.duration;
- djstest.pass("Duration: " + duration + " ms (Network: " + timedHttpClient.duration + " ms)");
- djstest.done();
- }, unexpectedErrorHandler, undefined, undefined, metadata);
- };
-
- OData.defaultHttpClient = timedHttpClient;
- djstest.assertsExpected(1);
- if (params.metadata) {
- odatajs.oData.read(params.service + "$metadata", measureRead, unexpectedErrorHandler, OData.metadataHandler);
- } else {
- measureRead();
- }
- }, "Time to read (once) " + params.readUri + " with " + params.mimeType, params);
-
- djstest.addTest(function readParallelMemoryTest(params) {
- var total = 10;
- var count = 0;
- var measureRead = function (metadata) {
- Instrument.getBrowserMemorySize(function (memoryBefore) {
- for (var i = 0; i < total; i++) {
- odatajs.oData.read({ requestUri: params.readUri, headers: { Accept: params.mimeType }, enableJsonpCallback: true }, function (_, response) {
- count++;
- if (count >= total) {
- Instrument.getBrowserMemorySize(function (memoryAfter) {
- var memory = memoryAfter - memoryBefore;
- djstest.pass("Memory: " + memory + " bytes (Network: " + response.headers["Content-Length"] + " bytes)");
- djstest.done();
- });
- }
- }, unexpectedErrorHandler, undefined, undefined, metadata);
- }
- });
- };
-
- djstest.assertsExpected(1);
- if (params.metadata) {
- odatajs.oData.read(params.service + "$metadata", measureRead, unexpectedErrorHandler, OData.metadataHandler);
- } else {
- measureRead();
- }
- }, "Memory to read (x10 parallel) " + params.readUri + " with " + params.mimeType, params, 300000);
-
- djstest.addTest(function readSerialMemoryTest(params) {
- var total = 10;
- var count = 0;
- var measureRead = function (metadata) {
- Instrument.getBrowserMemorySize(function (memoryBefore) {
- var makeRequest = function () {
- odatajs.oData.read({ requestUri: params.readUri, headers: { Accept: params.mimeType }, enableJsonpCallback: true }, function (_, response) {
- count++;
- if (count < total) {
- setTimeout(makeRequest, 0);
- } else {
- Instrument.getBrowserMemorySize(function (memoryAfter) {
- var memory = memoryAfter - memoryBefore;
- djstest.pass("Memory: " + memory + " bytes (Network: " + response.headers["Content-Length"] + " bytes)");
- djstest.done();
- });
- }
- }, unexpectedErrorHandler, undefined, undefined, metadata);
- };
-
- makeRequest();
- });
- };
-
- djstest.assertsExpected(1);
- if (params.metadata) {
- odatajs.oData.read(params.service + "$metadata", measureRead, unexpectedErrorHandler, OData.metadataHandler);
- } else {
- measureRead();
- }
- }, "Memory to read (x10 serial) " + params.readUri + " with " + params.mimeType, params, 300000);
- });
-
- if (feed.service) {
- var params = $.extend({}, feed, {
- request: {
- requestUri: feed.uri,
- method: "POST",
- headers: { "Content-Type": feed.mimeType, Accept: feed.mimeType },
- data: {
- ID: -1,
- Name: "New Entity"
- }
- }
- });
-
- djstest.addTest(function postPerfTest(params) {
- var measurePost = function (metadata) {
- var startTime = new Date();
- odatajs.oData.request(params.request, function () {
- var duration = new Date() - startTime - timedHttpClient.duration;
- djstest.pass("Duration: " + duration + " ms (Network: " + timedHttpClient.duration + " ms)");
- djstest.done();
- }, unexpectedErrorHandler, undefined, undefined, metadata);
- };
-
- OData.defaultHttpClient = timedHttpClient;
- djstest.assertsExpected(1);
-
- if (params.metadata) {
- odatajs.oData.read(params.service + "$metadata", measurePost, unexpectedErrorHandler, OData.metadataHandler);
- } else {
- measurePost();
- }
- }, "Time to POST " + params.uri + " with " + params.mimeType, params);
-
- djstest.addTest(function postParallelMemoryTest(params) {
- var total = 10;
- var count = 0;
- var measurePost = function (metadata) {
- Instrument.getBrowserMemorySize(function (memoryBefore) {
- for (var i = 0; i < total; i++) {
- odatajs.oData.request(params.request, function (_, response) {
- count++;
- if (count >= total) {
- Instrument.getBrowserMemorySize(function (memoryAfter) {
- var memory = memoryAfter - memoryBefore;
- djstest.pass("Memory: " + memory + " bytes (Network: " + response.headers["Content-Length"] + " bytes)");
- djstest.done();
- });
- }
- }, unexpectedErrorHandler, undefined, undefined, metadata);
- }
- });
- };
-
- OData.defaultHttpClient = timedHttpClient;
- djstest.assertsExpected(1);
-
- if (params.metadata) {
- odatajs.oData.read(params.service + "$metadata", measurePost, unexpectedErrorHandler, OData.metadataHandler);
- } else {
- measurePost();
- }
- }, "Memory to POST (x10 parallel) " + params.uri + " with " + params.mimeType, params);
-
- djstest.addTest(function postSerialMemoryTest(params) {
- var total = 10;
- var count = 0;
- var measurePost = function (metadata) {
- Instrument.getBrowserMemorySize(function (memoryBefore) {
- var makeRequest = function () {
- odatajs.oData.request(params.request, function (_, response) {
- count++;
- if (count < total) {
- setTimeout(makeRequest, 0);
- } else {
- Instrument.getBrowserMemorySize(function (memoryAfter) {
- var memory = memoryAfter - memoryBefore;
- djstest.pass("Memory: " + memory + " bytes (Network: " + response.headers["Content-Length"] + " bytes)");
- djstest.done();
- });
- }
- }, unexpectedErrorHandler, undefined, undefined, metadata);
- };
-
- makeRequest();
- });
- };
-
- OData.defaultHttpClient = timedHttpClient;
- djstest.assertsExpected(1);
-
- if (params.metadata) {
- odatajs.oData.read(params.service + "$metadata", measurePost, unexpectedErrorHandler, OData.metadataHandler);
- } else {
- measurePost();
- }
- }, "Memory to POST (x10 serial) " + params.uri + " with " + params.mimeType, params);
- }
- });
-})(this);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/odata-qunit-tests.htm
----------------------------------------------------------------------
diff --git a/JSLib/tests/odata-qunit-tests.htm b/JSLib/tests/odata-qunit-tests.htm
deleted file mode 100644
index f8b6a19..0000000
--- a/JSLib/tests/odata-qunit-tests.htm
+++ /dev/null
@@ -1,96 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!--
-Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
-modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
--->
- <head>
- <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
- <meta http-equiv="expires" content="-1" />
-
- <title>OData unit tests</title>
- <link rel="stylesheet" href="http://code.jquery.com/qunit/qunit-1.10.0.css" type="text/css" />
-
- <script type="text/javascript" src="http://code.jquery.com/jquery-1.4.4.min.js" ></script>
-
-<!-- <script type="text/javascript" src="http://code.jquery.com/jquery-1.4.4.js">
- <script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.5.2.js"></script>-->
-
-
- <script type="text/javascript" src="http://code.jquery.com/qunit/qunit-1.10.0.js"></script>
- <script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/json2/20110223/json2.js"></script>
-
- <script type="text/javascript" src="common/ODataReadOracle.js"></script>
- <script type="text/javascript" src="common/TestSynchronizerClient.js"></script>
-
- <script type="text/javascript" src="common/rx.js"></script>
-
- <script type="text/javascript">
- window.TestSynchronizer.init(QUnit);
- </script>
-
- <script type="text/javascript" src="../src/datajs.js"></script>
- <script type="text/javascript" src="../src/utils.js"></script>
- <script type="text/javascript" src="../src/xml.js"></script>
-
- <script type="text/javascript" src="../src/odata-utils.js"></script>
- <script type="text/javascript" src="../src/odata-handler.js"></script>
- <script type="text/javascript" src="../src/odata-gml.js"></script>
- <script type="text/javascript" src="../src/odata-xml.js"></script>
- <script type="text/javascript" src="../src/odata-net.js"></script>
- <script type="text/javascript" src="../src/odata-json-light.js"></script>
- <script type="text/javascript" src="../src/odata-json.js"></script>
- <script type="text/javascript" src="../src/odata-atom.js"></script>
- <script type="text/javascript" src="../src/odata-metadata.js"></script>
- <script type="text/javascript" src="../src/odata-batch.js"></script>
- <script type="text/javascript" src="../src/odata.js"></script>
-
- <script type="text/javascript" src="../src/store-dom.js"></script>
- <script type="text/javascript" src="../src/store-indexeddb.js"></script>
- <script type="text/javascript" src="../src/store-memory.js"></script>
- <script type="text/javascript" src="../src/store.js"></script>
-
- <script type="text/javascript" src="../src/deferred.js"></script>
- <script type="text/javascript" src="../src/cache-source.js"></script>
- <script type="text/javascript" src="../src/cache.js"></script>
-
- <script type="text/javascript" src="common/mockHttpClient.js"></script>
- <script type="text/javascript" src="common/mockXMLHttpRequest.js"></script>
- <script type="text/javascript" src="common/djstest.js"></script>
- <script type="text/javascript" src="common/CacheOracle.js"></script>
-
-<!--bingl: disable the failure test case. Will fix them in the next change set-->
-<!-- <script type="text/javascript" src="odata-tests.js"></script>-->
-<!-- <script type="text/javascript" src="odata-atom-tests.js"></script>-->
- <script type="text/javascript" src="odata-json-tests.js"></script>
-<!-- <script type="text/javascript" src="odata-json-light-tests.js"></script>-->
- <script type="text/javascript" src="odata-metadata-tests.js"></script>
- <script type="text/javascript" src="odata-xml-tests.js"></script>
- <script type="text/javascript" src="odata-handler-tests.js"></script>
- <script type="text/javascript" src="odata-net-tests.js"></script>
- <script type="text/javascript" src="odata-batch-tests.js"></script>
-
- <script type="text/javascript" src="cache-tests.js"></script>
- <script type="text/javascript" src="store-tests.js"></script>
- <script type="text/javascript" src="store-indexeddb-tests.js"></script>
- </head>
- <body>
- <h1 id="qunit-header">OData Unit Tests</h1>
- <h2 id="qunit-banner"></h2>
- <h2 id="qunit-userAgent"></h2>
- <ol id="qunit-tests">
- </ol>
- </body>
-</html>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/odata-read-crossdomain-functional-tests.html
----------------------------------------------------------------------
diff --git a/JSLib/tests/odata-read-crossdomain-functional-tests.html b/JSLib/tests/odata-read-crossdomain-functional-tests.html
deleted file mode 100644
index f3e18a6..0000000
--- a/JSLib/tests/odata-read-crossdomain-functional-tests.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
- <title>OData tests against local service</title>
- <meta http-equiv="cache-control" content="no-cache"/>
- <meta http-equiv="pragma" content="no-cache"/>
- <meta http-equiv="expires" content="-1"/>
-
- <link rel="stylesheet" href="http://code.jquery.com/qunit/qunit-1.10.0.css" type="text/css" />
- <script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/json2/20110223/json2.js"></script>
- <script type="text/javascript" src="http://code.jquery.com/jquery-1.4.4.min.js"></script>
- <script type="text/javascript" src="http://code.jquery.com/qunit/qunit-1.10.0.js"></script>
- <script type="text/javascript" src="common/ODataReadOracle.js"></script>
- <script type="text/javascript" src="common/TestSynchronizerClient.js"></script>
- <script type="text/javascript">
- window.TestSynchronizer.init(QUnit);
- </script>
-
- <script type="text/javascript" src="../src/datajs.js"></script>
- <script type="text/javascript" src="../src/utils.js"></script>
- <script type="text/javascript" src="../src/xml.js"></script>
-
- <script type="text/javascript" src="../src/odata-utils.js"></script>
- <script type="text/javascript" src="../src/odata-handler.js"></script>
- <script type="text/javascript" src="../src/odata-gml.js"></script>
- <script type="text/javascript" src="../src/odata-xml.js"></script>
- <script type="text/javascript" src="../src/odata-net.js"></script>
- <script type="text/javascript" src="../src/odata-json-light.js"></script>
- <script type="text/javascript" src="../src/odata-json.js"></script>
- <script type="text/javascript" src="../src/odata-atom.js"></script>
- <script type="text/javascript" src="../src/odata-metadata.js"></script>
- <script type="text/javascript" src="../src/odata-batch.js"></script>
- <script type="text/javascript" src="../src/odata.js"></script>
-
- <script type="text/javascript" src="../src/store-dom.js"></script>
- <script type="text/javascript" src="../src/store-indexeddb.js"></script>
- <script type="text/javascript" src="../src/store-memory.js"></script>
- <script type="text/javascript" src="../src/store.js"></script>
-
- <script type="text/javascript" src="../src/deferred.js"></script>
- <script type="text/javascript" src="../src/cache-source.js"></script>
- <script type="text/javascript" src="../src/cache.js"></script>
-
- <script type="text/javascript" src="common/djstest.js"></script>
- <script type="text/javascript" src="odata-read-crossdomain-functional-tests.js"></script>
-</head>
-<body>
- <h1 id="qunit-header">OData.Read tests against cross domain endpoints</h1>
- <h2 id="qunit-banner"></h2>
- <h2 id="qunit-userAgent"></h2>
- <ol id="qunit-tests"></ol>
-</body>
-</html>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/odata-read-crossdomain-functional-tests.js
----------------------------------------------------------------------
diff --git a/JSLib/tests/odata-read-crossdomain-functional-tests.js b/JSLib/tests/odata-read-crossdomain-functional-tests.js
deleted file mode 100644
index cb3eddd..0000000
--- a/JSLib/tests/odata-read-crossdomain-functional-tests.js
+++ /dev/null
@@ -1,137 +0,0 @@
-/// <reference path="common/djstest.js" />
-/// <reference path="../src/odata.js" />
-/// <reference path="../src/odata-net.js" />
-/// <reference path="common/ODataReadOracle.js" />
-
-(function (window, undefined) {
-
- var unexpectedErrorHandler = function (err) {
- djstest.assert(false, "Unexpected call to error handler with error: " + djstest.toString(err));
- djstest.done();
- };
-
- var fixConstructors = function (obj) {
- /// <summary>Fix the constructors of the supplied object graph.</summary>
- /// <remarks>
- /// When using IE9 or a non-IE browser, the JSONP support in the library creates objects in a separate IFRAME,
- /// causing the constructor property to be different to that of objects created by the oracle. This function
- /// stringifies and then re-parses the object, which fixes the constructors.
- /// </remarks>
- if (!window.ActiveXObject || window.DOMParser) {
- return window.JSON.parse(window.JSON.stringify(obj));
- } else {
- return obj;
- }
- };
-
- var handlerAcceptStrings = [
- "*/*",
- /*"application/atom+xml",*/
- "application/json",
- undefined
- ];
-
- var formatJsonStrings = [
- "application/json",
- "application/json;odata.metadata=none",
- "application/json;odata.metadata=minimal",
- "application/json;odata.metadata=full",
- undefined
- ];
- var azureOdataService = "http://odatasampleservices.azurewebsites.net/V4/OData/OData.svc/";
- var azureOdataFeed = azureOdataService + "Categories";
- var crossDomainTimeout = 45000;
-
- module("CrossDomain", {
- setup: function () {
- this.oldEnableJsonpCallback = OData.defaultHttpClient.enableJsonpCallback;
- OData.defaultHttpClient.enableJsonpCallback = true;
- },
- teardown: function () {
- OData.defaultHttpClient.enableJsonpCallback = this.oldEnableJsonpCallback;
- }
- });
-
- for (var i = 0; i < handlerAcceptStrings.length; i++) {
- for (var j = 0; j < formatJsonStrings.length; j++) {
- djstest.addTest(function readCrossDomainFullFeedTest(params) {
- djstest.assertsExpected(1);
- var request = { requestUri: azureOdataFeed, headers: { Accept: params.handlerAccept}, enableJsonpCallback: true };
- if (params.formatJsonString != undefined) {
- request.formatQueryString = "$format=" + params.formatJsonString;
- }
-
- djstest.log("Reading data over the wire.");
- odatajs.oData.read(request, function (data, response) {
- djstest.log("Verifying data over the wire from Oracle.");
- window.ODataReadOracle.readFeed(azureOdataFeed, function (expectedData) {
- data = fixConstructors(data);
- djstest.assertWithoutMetadata(data, expectedData, "Response data not same as expected");
- djstest.done();
- }, params.formatJsonString);
- }, unexpectedErrorHandler);
- }, "Testing valid read of cross domain feed collection with " + handlerAcceptStrings[i] + "," + formatJsonStrings[j], { handlerAccept: handlerAcceptStrings[i], formatJsonString: formatJsonStrings[j] }, crossDomainTimeout);
- }
-
- djstest.addTest(function readCrossDomainEntryTest(handlerAccept) {
- var endPoint = azureOdataFeed + "(1)";
- djstest.assertsExpected(1);
- djstest.log("Reading data over the wire.");
- odatajs.oData.read({ requestUri: endPoint, headers: { Accept: handlerAccept} }, function (data, response) {
- djstest.log("Verifying data over the wire from Oracle.");
- window.ODataReadOracle.readEntry(endPoint, function (expectedData) {
- data = fixConstructors(data);
- djstest.assertWithoutMetadata(data, expectedData, "Response data not same as expected");
- djstest.done();
- }, "application/json");
- }, unexpectedErrorHandler);
- }, "Testing valid read of cross domain entry with " + handlerAcceptStrings[i], handlerAcceptStrings[i], crossDomainTimeout);
- }
-
- var prefetchSizes = [-1, 0, 15];
- var cacheSizes = [-1, 0, 15];
- var skipValues = [
- 0,
- 14, // < pageSize
- 15, // = pageSize
- 16 // > pageSize but < pageSize + prefetchSize
- ];
-
- var createTestName = function (params) {
- return "Testing ReadRange of " + params.feed + " skip " + params.skip + " take " + params.take + " with pageSize " +
- params.pageSize + ", prefetch " + params.prefetchSize + " and cacheSize " + params.cacheSize;
- };
-
- var dataCacheReadRangeSingleTest = function (params) {
- var options = { name: "cache", source: params.feed, pageSize: params.pageSize, prefetchSize: params.prefetchSize, cacheSize: params.cacheSize };
- OData.defaultHttpClient.enableJsonpCallback = true;
- var cache = odatajs.createDataCache(options);
- cache.readRange(params.skip, params.take).then(function (data) {
- validateExpectedRange(cache, data, params.feed, params.skip, params.take);
- }, unexpectedErrorHandler);
- };
-
- var validateExpectedRange = function (cache, data, feed, skipValue, takeValue) {
- var expectedRangeUrl = feed + "?$skip=" + skipValue + "&$top=" + takeValue;
- window.ODataReadOracle.readFeed(expectedRangeUrl, function (expectedData) {
- if (expectedData.results) {
- expectedData = expectedData.results;
- }
- data = fixConstructors(data);
- djstest.assertAreEqualDeep(data, expectedData, "Response data not same as expected");
- djstest.destroyCacheAndDone(cache);
- });
- };
-
- $.each(prefetchSizes, function (_, prefetchSizeValue) {
- $.each(cacheSizes, function (_, cacheSizeValue) {
- var parameters = { feed: "http://odatasampleservices.azurewebsites.net/V4/OData/OData.svc/Categories", skip: 0, take: 5, pageSize: 15, prefetchSize: prefetchSizeValue, cacheSize: cacheSizeValue };
- djstest.addTest(dataCacheReadRangeSingleTest, createTestName(parameters), parameters);
- });
- });
-
- $.each(skipValues, function (_, skipValue) {
- var parameters = { feed: "http://odatasampleservices.azurewebsites.net/V4/OData/OData.svc/Categories", skip: skipValue, take: 14, pageSize: 5, prefetchSize: 5, cacheSize: 5 };
- djstest.addTest(dataCacheReadRangeSingleTest, createTestName(parameters), parameters, crossDomainTimeout);
- });
-})(this);
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/odata-read-functional-tests.html
----------------------------------------------------------------------
diff --git a/JSLib/tests/odata-read-functional-tests.html b/JSLib/tests/odata-read-functional-tests.html
deleted file mode 100644
index 0a60a3a..0000000
--- a/JSLib/tests/odata-read-functional-tests.html
+++ /dev/null
@@ -1,45 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
- <title>OData tests against local service</title>
- <meta http-equiv="cache-control" content="no-cache"/>
- <meta http-equiv="pragma" content="no-cache"/>
- <meta http-equiv="expires" content="-1"/>
-
- <link rel="stylesheet" href="http://code.jquery.com/qunit/qunit-1.10.0.css" type="text/css" />
- <script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/json2/20110223/json2.js"></script>
- <script type="text/javascript" src="http://code.jquery.com/jquery-1.4.4.min.js"></script>
- <script type="text/javascript" src="http://code.jquery.com/qunit/qunit-1.10.0.js"></script>
- <script type="text/javascript" src="common/ODataReadOracle.js"></script>
- <script type="text/javascript" src="common/TestSynchronizerClient.js"></script>
- <script type="text/javascript">
- window.TestSynchronizer.init(QUnit);
- </script>
-
- <script type="text/javascript" src="../src/datajs.js"></script>
- <script type="text/javascript" src="../src/utils.js"></script>
- <script type="text/javascript" src="../src/xml.js"></script>
-
- <script type="text/javascript" src="../src/odata-utils.js"></script>
- <script type="text/javascript" src="../src/odata-handler.js"></script>
- <script type="text/javascript" src="../src/odata-gml.js"></script>
- <script type="text/javascript" src="../src/odata-xml.js"></script>
- <script type="text/javascript" src="../src/odata-net.js"></script>
- <script type="text/javascript" src="../src/odata-json-light.js"></script>
- <script type="text/javascript" src="../src/odata-json.js"></script>
- <script type="text/javascript" src="../src/odata-atom.js"></script>
- <script type="text/javascript" src="../src/odata-metadata.js"></script>
- <script type="text/javascript" src="../src/odata-batch.js"></script>
- <script type="text/javascript" src="../src/odata.js"></script>
-
- <script type="text/javascript" src="common/djstest.js"></script>
-
- <script type="text/javascript" src="odata-read-functional-tests.js"></script>
-</head>
-<body>
- <h1 id="qunit-header">OData.Read tests against local in-memory service</h1>
- <h2 id="qunit-banner"></h2>
- <h2 id="qunit-userAgent"></h2>
- <ol id="qunit-tests"></ol>
-</body>
-</html>
[21/22] olingo-odata4-js git commit: [OLINGO-442] Cleanup bevor
release
Posted by ko...@apache.org.
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/src/deferred.js
----------------------------------------------------------------------
diff --git a/JSLib/src/deferred.js b/JSLib/src/deferred.js
deleted file mode 100644
index 1fe1657..0000000
--- a/JSLib/src/deferred.js
+++ /dev/null
@@ -1,179 +0,0 @@
-/// <reference path="odata-utils.js" />
-
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
-// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// deferred.js
-
-(function (window, undefined) {
-
- // CONTENT START
-
- var forwardCall = function (thisValue, name, returnValue) {
- /// <summary>Creates a new function to forward a call.</summary>
- /// <param name="thisValue" type="Object">Value to use as the 'this' object.</param>
- /// <param name="name" type="String">Name of function to forward to.</param>
- /// <param name="returnValue" type="Object">Return value for the forward call (helps keep identity when chaining calls).</param>
- /// <returns type="Function">A new function that will forward a call.</returns>
-
- return function () {
- thisValue[name].apply(thisValue, arguments);
- return returnValue;
- };
- };
-
- var DjsDeferred = function () {
- /// <summary>Initializes a new DjsDeferred object.</summary>
- /// <remarks>
- /// Compability Note A - Ordering of callbacks through chained 'then' invocations
- ///
- /// The Wiki entry at http://wiki.commonjs.org/wiki/Promises/A
- /// implies that .then() returns a distinct object.
- ////
- /// For compatibility with http://api.jquery.com/category/deferred-object/
- /// we return this same object. This affects ordering, as
- /// the jQuery version will fire callbacks in registration
- /// order regardless of whether they occur on the result
- /// or the original object.
- ///
- /// Compability Note B - Fulfillment value
- ///
- /// The Wiki entry at http://wiki.commonjs.org/wiki/Promises/A
- /// implies that the result of a success callback is the
- /// fulfillment value of the object and is received by
- /// other success callbacks that are chained.
- ///
- /// For compatibility with http://api.jquery.com/category/deferred-object/
- /// we disregard this value instead.
- /// </remarks>
-
- this._arguments = undefined;
- this._done = undefined;
- this._fail = undefined;
- this._resolved = false;
- this._rejected = false;
- };
-
- DjsDeferred.prototype = {
- then: function (fulfilledHandler, errorHandler /*, progressHandler */) {
- /// <summary>Adds success and error callbacks for this deferred object.</summary>
- /// <param name="fulfilledHandler" type="Function" mayBeNull="true" optional="true">Success callback.</param>
- /// <param name="errorHandler" type="Function" mayBeNull="true" optional="true">Error callback.</param>
- /// <remarks>See Compatibility Note A.</remarks>
-
- if (fulfilledHandler) {
- if (!this._done) {
- this._done = [fulfilledHandler];
- } else {
- this._done.push(fulfilledHandler);
- }
- }
-
- if (errorHandler) {
- if (!this._fail) {
- this._fail = [errorHandler];
- } else {
- this._fail.push(errorHandler);
- }
- }
-
- //// See Compatibility Note A in the DjsDeferred constructor.
- //// if (!this._next) {
- //// this._next = createDeferred();
- //// }
- //// return this._next.promise();
-
- if (this._resolved) {
- this.resolve.apply(this, this._arguments);
- } else if (this._rejected) {
- this.reject.apply(this, this._arguments);
- }
-
- return this;
- },
-
- resolve: function (/* args */) {
- /// <summary>Invokes success callbacks for this deferred object.</summary>
- /// <remarks>All arguments are forwarded to success callbacks.</remarks>
-
-
- if (this._done) {
- var i, len;
- for (i = 0, len = this._done.length; i < len; i++) {
- //// See Compability Note B - Fulfillment value.
- //// var nextValue =
- this._done[i].apply(null, arguments);
- }
-
- //// See Compatibility Note A in the DjsDeferred constructor.
- //// this._next.resolve(nextValue);
- //// delete this._next;
-
- this._done = undefined;
- this._resolved = false;
- this._arguments = undefined;
- } else {
- this._resolved = true;
- this._arguments = arguments;
- }
- },
-
- reject: function (/* args */) {
- /// <summary>Invokes error callbacks for this deferred object.</summary>
- /// <remarks>All arguments are forwarded to error callbacks.</remarks>
- if (this._fail) {
- var i, len;
- for (i = 0, len = this._fail.length; i < len; i++) {
- this._fail[i].apply(null, arguments);
- }
-
- this._fail = undefined;
- this._rejected = false;
- this._arguments = undefined;
- } else {
- this._rejected = true;
- this._arguments = arguments;
- }
- },
-
- promise: function () {
- /// <summary>Returns a version of this object that has only the read-only methods available.</summary>
- /// <returns>An object with only the promise object.</returns>
-
- var result = {};
- result.then = forwardCall(this, "then", result);
- return result;
- }
- };
-
- var createDeferred = function () {
- /// <summary>Creates a deferred object.</summary>
- /// <returns type="DjsDeferred">
- /// A new deferred object. If jQuery is installed, then a jQuery
- /// Deferred object is returned, which provides a superset of features.
- /// </returns>
-
- if (window.jQuery && window.jQuery.Deferred) {
- return new window.jQuery.Deferred();
- } else {
- return new DjsDeferred();
- }
- };
-
- // DATAJS INTERNAL START
- window.odatajs.createDeferred = createDeferred;
- window.odatajs.DjsDeferred = DjsDeferred;
- // DATAJS INTERNAL END
-
- // CONTENT END
-})(this);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/src/odata-atom.js
----------------------------------------------------------------------
diff --git a/JSLib/src/odata-atom.js b/JSLib/src/odata-atom.js
deleted file mode 100644
index 09e994f..0000000
--- a/JSLib/src/odata-atom.js
+++ /dev/null
@@ -1,1411 +0,0 @@
-/// <reference path="odata-utils.js" />
-/// <reference path="odata-handler.js" />
-/// <reference path="odata-xml.js" />
-
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
-// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// odata-atom.js
-
-(function (window, undefined) {
-
- var datajs = window.odatajs || {};
- var odata = window.OData || {};
-
- // imports
- var contains = odatajs.contains;
- var djsassert = odatajs.djsassert;
- var isArray = odatajs.isArray;
- var isObject = odatajs.isObject;
- var isXmlNSDeclaration = odatajs.isXmlNSDeclaration;
- var normalizeURI = odatajs.normalizeURI;
- var parseInt10 = odatajs.parseInt10;
- var xmlAppendChild = odatajs.xmlAppendChild;
- var xmlAppendChildren = odatajs.xmlAppendChildren
- var xmlAttributes = odatajs.xmlAttributes;
- var xmlAttributeNode = odatajs.xmlAttributeNode;
- var xmlAttributeValue = odatajs.xmlAttributeValue;
- var xmlBaseURI = odatajs.xmlBaseURI;
- var xmlChildElements = odatajs.xmlChildElements;
- var xmlDom = odatajs.xmlDom;
- var xmlFirstChildElement = odatajs.xmlFirstChildElement;
- var xmlFindElementByPath = odatajs.xmlFindElementByPath;
- var xmlFindNodeByPath = odatajs.xmlFindNodeByPath;
- var xmlInnerText = odatajs.xmlInnerText;
- var xmlLocalName = odatajs.xmlLocalName;
- var xmlNamespaceURI = odatajs.xmlNamespaceURI;
- var xmlNewAttribute = odatajs.xmlNewAttribute;
- var xmlNewElement = odatajs.xmlNewElement;
- var xmlNewFragment = odatajs.xmlNewFragment;
- var xmlNewNodeByPath = odatajs.xmlNewNodeByPath;
- var xmlNewNSDeclaration = odatajs.xmlNewNSDeclaration;
- var xmlNewText = odatajs.xmlNewText;
- var xmlNodeValue = odatajs.xmlNodeValue;
- var xmlNS = odatajs.xmlNS;
- var xmlnsNS = odatajs.xmlnsNS;
- var xmlQualifiedName = odatajs.xmlQualifiedName;
- var xmlParse = odatajs.xmlParse;
- var xmlSerialize = odatajs.xmlSerialize;
- var xmlSerializeDescendants = odatajs.xmlSerializeDescendants;
- var xmlSibling = odatajs.xmlSibling;
- var w3org = odatajs.w3org;
-
- var adoDs = odata.adoDs;
- var contentType = odata.contentType;
- var createAttributeExtension = odata.createAttributeExtension;
- var createElementExtension = odata.createElementExtension;
- var handler = odata.handler;
- var isPrimitiveEdmType = odata.isPrimitiveEdmType;
- var isFeed = odata.isFeed;
- var isNamedStream = odata.isNamedStream;
- var lookupEntityType = odata.lookupEntityType;
- var lookupComplexType = odata.lookupComplexType;
- var lookupProperty = odata.lookupProperty;
- var navigationPropertyKind = odata.navigationPropertyKind;
- var MAX_DATA_SERVICE_VERSION = odata.MAX_DATA_SERVICE_VERSION;
- var maxVersion = odata.maxVersion;
- var odataXmlNs = odata.odataXmlNs;
- var odataMetaXmlNs = odata.odataMetaXmlNs;
- var odataMetaPrefix = odata.odataMetaPrefix;
- var odataPrefix = odata.odataPrefix;
- var odataRelatedPrefix = odata.odataRelatedPrefix;
- var odataScheme = odata.odataScheme;
- var parseBool = odata.parseBool;
- var parseDateTime = odata.parseDateTime;
- var parseDateTimeOffset = odata.parseDateTimeOffset;
- var parseDuration = odata.parseDuration;
- var parseTimezone = odata.parseTimezone;
- var xmlNewODataElement = odata.xmlNewODataElement;
- var xmlNewODataElementInfo = odata.xmlNewODataElementInfo;
- var xmlNewODataMetaAttribute = odata.xmlNewODataMetaAttribute;
- var xmlNewODataMetaElement = odata.xmlNewODataMetaElement;
- var xmlNewODataDataElement = odata.xmlNewODataDataElement;
- var xmlReadODataEdmPropertyValue = odata.xmlReadODataEdmPropertyValue;
- var xmlReadODataProperty = odata.xmlReadODataProperty;
-
- // CONTENT START
-
- var atomPrefix = "a";
-
- var atomXmlNs = w3org + "2005/Atom"; // http://www.w3.org/2005/Atom
- var appXmlNs = w3org + "2007/app"; // http://www.w3.org/2007/app
-
- var odataEditMediaPrefix = adoDs + "/edit-media/"; // http://docs.oasis-open.org/odata/ns/edit-media
- var odataMediaResourcePrefix = adoDs + "/mediaresource/"; // http://docs.oasis-open.org/odata/ns/mediaresource
- var odataRelatedLinksPrefix = adoDs + "/relatedlinks/"; // http://docs.oasis-open.org/odata/ns/relatedlinks
-
- var atomAcceptTypes = ["application/atom+xml", "application/atomsvc+xml", "application/xml"];
- var atomMediaType = atomAcceptTypes[0];
-
- // These are the namespaces that are not considered ATOM extension namespaces.
- var nonExtensionNamepaces = [atomXmlNs, appXmlNs, xmlNS, xmlnsNS];
-
- // These are entity property mapping paths that have well-known paths.
- var knownCustomizationPaths = {
- SyndicationAuthorEmail: "author/email",
- SyndicationAuthorName: "author/name",
- SyndicationAuthorUri: "author/uri",
- SyndicationContributorEmail: "contributor/email",
- SyndicationContributorName: "contributor/name",
- SyndicationContributorUri: "contributor/uri",
- SyndicationPublished: "published",
- SyndicationRights: "rights",
- SyndicationSummary: "summary",
- SyndicationTitle: "title",
- SyndicationUpdated: "updated"
- };
-
- var expandedFeedCustomizationPath = function (path) {
- /// <summary>Returns an expanded customization path if it's well-known.</summary>
- /// <param name="path" type="String">Path to expand.</param>
- /// <returns type="String">Expanded path or just 'path' otherwise.</returns>
-
- return knownCustomizationPaths[path] || path;
- };
-
- var isExtensionNs = function (nsURI) {
- /// <summary>Checks whether the specified namespace is an extension namespace to ATOM.</summary>
- /// <param type="String" name="nsURI">Namespace to check.</param>
- /// <returns type="Boolean">true if nsURI is an extension namespace to ATOM; false otherwise.</returns>
-
- return !(contains(nonExtensionNamepaces, nsURI));
- };
-
- var atomFeedCustomization = function (customizationModel, entityType, model, propertyName, suffix) {
- /// <summary>Creates an object describing a feed customization that was delcared in an OData conceptual schema.</summary>
- /// <param name="customizationModel" type="Object">Object describing the customization delcared in the conceptual schema.</param>
- /// <param name="entityType" type="Object">Object describing the entity type that owns the customization in an OData conceputal schema.</param>
- /// <param name="model" type="Object">Object describing an OData conceptual schema.</param>
- /// <param name="propertyName" type="String" optional="true">Name of the property to which this customization applies.</param>
- /// <param name="suffix" type="String" optional="true">Suffix to feed customization properties in the conceptual schema.</param>
- /// <returns type="Object">Object that describes an applicable feed customization.</returns>
-
- suffix = suffix || "";
- var targetPath = customizationModel["FC_TargetPath" + suffix];
- if (!targetPath) {
- return null;
- }
-
- var sourcePath = customizationModel["FC_SourcePath" + suffix];
- var targetXmlPath = expandedFeedCustomizationPath(targetPath);
-
- var propertyPath = propertyName ? propertyName + (sourcePath ? "/" + sourcePath : "") : sourcePath;
- var propertyType = propertyPath && lookupPropertyType(model, entityType, propertyPath);
- var nsURI = customizationModel["FC_NsUri" + suffix] || null;
- var nsPrefix = customizationModel["FC_NsPrefix" + suffix] || null;
- var keepinContent = customizationModel["FC_KeepInContent" + suffix] || "";
-
- if (targetPath !== targetXmlPath) {
- nsURI = atomXmlNs;
- nsPrefix = atomPrefix;
- }
-
- return {
- contentKind: customizationModel["FC_ContentKind" + suffix],
- keepInContent: keepinContent.toLowerCase() === "true",
- nsPrefix: nsPrefix,
- nsURI: nsURI,
- propertyPath: propertyPath,
- propertyType: propertyType,
- entryPath: targetXmlPath
- };
- };
-
- var atomApplyAllFeedCustomizations = function (entityType, model, callback) {
- /// <summary>Gets all the feed customizations that have to be applied to an entry as per the enity type declared in an OData conceptual schema.</summary>
- /// <param name="entityType" type="Object">Object describing an entity type in a conceptual schema.</param>
- /// <param name="model" type="Object">Object describing an OData conceptual schema.</param>
- /// <param name="callback" type="Function">Callback function to be invoked for each feed customization that needs to be applied.</param>
-
- var customizations = [];
- while (entityType) {
- var sourcePath = entityType.FC_SourcePath;
- var customization = atomFeedCustomization(entityType, entityType, model);
- if (customization) {
- callback(customization);
- }
-
- var properties = entityType.property || [];
- var i, len;
- for (i = 0, len = properties.length; i < len; i++) {
- var property = properties[i];
- var suffixCounter = 0;
- var suffix = "";
-
- while (customization = atomFeedCustomization(property, entityType, model, property.name, suffix)) {
- callback(customization);
- suffixCounter++;
- suffix = "_" + suffixCounter;
- }
- }
- entityType = lookupEntityType(entityType.baseType, model);
- }
- return customizations;
- };
-
- var atomReadExtensionAttributes = function (domElement) {
- /// <summary>Reads ATOM extension attributes (any attribute not in the Atom namespace) from a DOM element.</summary>
- /// <param name="domElement">DOM element with zero or more extension attributes.</param>
- /// <returns type="Array">An array of extension attribute representations.</returns>
-
- var extensions = [];
- xmlAttributes(domElement, function (attribute) {
- var nsURI = xmlNamespaceURI(attribute);
- if (isExtensionNs(nsURI)) {
- extensions.push(createAttributeExtension(attribute, true));
- }
- });
- return extensions;
- };
-
- var atomReadExtensionElement = function (domElement) {
- /// <summary>Reads an ATOM extension element (an element not in the ATOM namespaces).</summary>
- /// <param name="domElement">DOM element not part of the atom namespace.</param>
- /// <returns type="Object">Object representing the extension element.</returns>
-
- return createElementExtension(domElement, /*addNamespaceURI*/true);
- };
-
- var atomReadDocument = function (domElement, baseURI, model) {
- /// <summary>Reads an ATOM entry, feed or service document, producing an object model in return.</summary>
- /// <param name="domElement">Top-level ATOM DOM element to read.</param>
- /// <param name="baseURI" type="String">Base URI for normalizing relative URIs found in the ATOM document.</param>
- /// <param name="model" type="Object">Object that describes the conceptual schema.</param>
- /// <returns type="Object">The object model representing the specified element, undefined if the top-level element is not part of the ATOM specification.</returns>
-
- var nsURI = xmlNamespaceURI(domElement);
- var localName = xmlLocalName(domElement);
-
- // Handle service documents.
- if (nsURI === appXmlNs && localName === "service") {
- return atomReadServiceDocument(domElement, baseURI);
- }
-
- // Handle feed and entry elements.
- if (nsURI === atomXmlNs) {
- if (localName === "feed") {
- return atomReadFeed(domElement, baseURI, model);
- }
- if (localName === "entry") {
- return atomReadEntry(domElement, baseURI, model);
- }
- }
-
- // Allow undefined to be returned.
- };
-
- var atomReadAdvertisedActionOrFunction = function (domElement, baseURI) {
- /// <summary>Reads the DOM element for an action or a function in an OData Atom document.</summary>
- /// <param name="domElement">DOM element to read.</param>
- /// <param name="baseURI" type="String">Base URI for normalizing the action or function target url.</param>
- /// <returns type="Object">Object with title, target, and metadata fields.</returns>
-
- var extensions = [];
- var result = { extensions: extensions };
- xmlAttributes(domElement, function (attribute) {
- var localName = xmlLocalName(attribute);
- var nsURI = xmlNamespaceURI(attribute);
- var value = xmlNodeValue(attribute);
-
- if (nsURI === null) {
- if (localName === "title" || localName === "metadata") {
- result[localName] = value;
- return;
- }
- if (localName === "target") {
- result.target = normalizeURI(value, xmlBaseURI(domElement, baseURI));
- return;
- }
- }
-
- if (isExtensionNs(nsURI)) {
- extensions.push(createAttributeExtension(attribute, true));
- }
- });
- return result;
- };
-
- var atomReadAdvertisedAction = function (domElement, baseURI, parentMetadata) {
- /// <summary>Reads the DOM element for an action in an OData Atom document.</summary>
- /// <param name="domElement">DOM element to read.</param>
- /// <param name="baseURI" type="String">Base URI for normalizing the action or target url.</param>
- /// <param name="parentMetadata" type="Object">Object to update with the action metadata.</param>
-
- var actions = parentMetadata.actions = parentMetadata.actions || [];
- actions.push(atomReadAdvertisedActionOrFunction(domElement, baseURI));
- };
-
- var atomReadAdvertisedFunction = function (domElement, baseURI, parentMetadata) {
- /// <summary>Reads the DOM element for an action in an OData Atom document.</summary>
- /// <param name="domElement">DOM element to read.</param>
- /// <param name="baseURI" type="String">Base URI for normalizing the action or target url.</param>
- /// <param name="parentMetadata" type="Object">Object to update with the action metadata.</param>
-
- var functions = parentMetadata.functions = parentMetadata.functions || [];
- functions.push(atomReadAdvertisedActionOrFunction(domElement, baseURI));
- };
-
- var atomReadFeed = function (domElement, baseURI, model) {
- /// <summary>Reads a DOM element for an ATOM feed, producing an object model in return.</summary>
- /// <param name="domElement">ATOM feed DOM element.</param>
- /// <param name="baseURI" type="String">Base URI for normalizing relative URIs found in the ATOM feed.</param>
- /// <param name="model">Metadata that describes the conceptual schema.</param>
- /// <returns type="Object">A new object representing the feed.</returns>
-
- var extensions = atomReadExtensionAttributes(domElement);
- var feedMetadata = { feed_extensions: extensions };
- var results = [];
-
- var feed = { __metadata: feedMetadata, results: results };
-
- baseURI = xmlBaseURI(domElement, baseURI);
-
- xmlChildElements(domElement, function (child) {
- var nsURI = xmlNamespaceURI(child);
- var localName = xmlLocalName(child);
-
- if (nsURI === odataMetaXmlNs) {
- if (localName === "count") {
- feed.__count = parseInt(xmlInnerText(child), 10);
- return;
- }
- if (localName === "action") {
- atomReadAdvertisedAction(child, baseURI, feedMetadata);
- return;
- }
- if (localName === "function") {
- atomReadAdvertisedFunction(child, baseURI, feedMetadata);
- return;
- }
- }
-
- if (isExtensionNs(nsURI)) {
- extensions.push(createElementExtension(child));
- return;
- }
-
- // The element should belong to the ATOM namespace.
- djsassert(nsURI === atomXmlNs, "atomReadFeed - child feed element is not in the atom namespace!!");
-
- if (localName === "entry") {
- results.push(atomReadEntry(child, baseURI, model));
- return;
- }
- if (localName === "link") {
- atomReadFeedLink(child, feed, baseURI);
- return;
- }
- if (localName === "id") {
- feedMetadata.uri = normalizeURI(xmlInnerText(child), baseURI);
- feedMetadata.uri_extensions = atomReadExtensionAttributes(child);
- return;
- }
- if (localName === "title") {
- feedMetadata.title = xmlInnerText(child) || "";
- feedMetadata.title_extensions = atomReadExtensionAttributes(child);
- return;
- }
- });
-
- return feed;
- };
-
- var atomReadFeedLink = function (domElement, feed, baseURI) {
- /// <summary>Reads an ATOM link DOM element for a feed.</summary>
- /// <param name="domElement">ATOM link DOM element.</param>
- /// <param name="feed">Feed object to be annotated with the link data.</param>
- /// <param name="baseURI" type="String">Base URI for normalizing relative URIs found in the payload.</param>
-
- var link = atomReadLink(domElement, baseURI);
- var href = link.href;
- var rel = link.rel;
- var extensions = link.extensions;
- var metadata = feed.__metadata;
-
- if (rel === "next") {
- feed.__next = href;
- metadata.next_extensions = extensions;
- return;
- }
- if (rel === "self") {
- metadata.self = href;
- metadata.self_extensions = extensions;
- return;
- }
- };
-
- var atomReadLink = function (domElement, baseURI) {
- /// <summary>Reads an ATOM link DOM element.</summary>
- /// <param name="linkElement">DOM element to read.</param>
- /// <param name="baseURI" type="String">Base URI for normalizing the link href.</param>
- /// <returns type="Object">A link element representation.</returns>
-
- baseURI = xmlBaseURI(domElement, baseURI);
-
- var extensions = [];
- var link = { extensions: extensions, baseURI: baseURI };
-
- xmlAttributes(domElement, function (attribute) {
- var nsURI = xmlNamespaceURI(attribute);
- var localName = xmlLocalName(attribute);
- var value = attribute.value;
-
- if (localName === "href") {
- link.href = normalizeURI(value, baseURI);
- return;
- }
- if (localName === "type" || localName === "rel") {
- link[localName] = value;
- return;
- }
-
- if (isExtensionNs(nsURI)) {
- extensions.push(createAttributeExtension(attribute, true));
- }
- });
-
- if (!link.href) {
- throw { error: "href attribute missing on link element", element: domElement };
- }
-
- return link;
- };
-
- var atomGetObjectValueByPath = function (path, item) {
- /// <summary>Gets a slashed path value from the specified item.</summary>
- /// <param name="path" type="String">Property path to read ('/'-separated).</param>
- /// <param name="item" type="Object">Object to get value from.</param>
- /// <returns>The property value, possibly undefined if any path segment is missing.</returns>
-
- // Fast path.
- if (path.indexOf('/') === -1) {
- return item[path];
- } else {
- var parts = path.split('/');
- var i, len;
- for (i = 0, len = parts.length; i < len; i++) {
- // Avoid traversing a null object.
- if (item === null) {
- return undefined;
- }
-
- item = item[parts[i]];
- if (item === undefined) {
- return item;
- }
- }
-
- return item;
- }
- };
-
- var atomSetEntryValueByPath = function (path, target, value, propertyType) {
- /// <summary>Sets a slashed path value on the specified target.</summary>
- /// <param name="path" type="String">Property path to set ('/'-separated).</param>
- /// <param name="target" type="Object">Object to set value on.</param>
- /// <param name="value">Value to set.</param>
- /// <param name="propertyType" type="String" optional="true">Property type to set in metadata.</param>
-
- var propertyName;
- if (path.indexOf('/') === -1) {
- target[path] = value;
- propertyName = path;
- } else {
- var parts = path.split('/');
- var i, len;
- for (i = 0, len = (parts.length - 1); i < len; i++) {
- // We construct each step of the way if the property is missing;
- // if it's already initialized to null, we stop further processing.
- var next = target[parts[i]];
- if (next === undefined) {
- next = {};
- target[parts[i]] = next;
- } else if (next === null) {
- return;
- }
- target = next;
- }
- propertyName = parts[i];
- target[propertyName] = value;
- }
-
- if (propertyType) {
- var metadata = target.__metadata = target.__metadata || {};
- var properties = metadata.properties = metadata.properties || {};
- var property = properties[propertyName] = properties[propertyName] || {};
- property.type = propertyType;
- }
- };
-
- var atomApplyCustomizationToEntryObject = function (customization, domElement, entry) {
- /// <summary>Applies a specific feed customization item to an object.</summary>
- /// <param name="customization">Object with customization description.</param>
- /// <param name="sourcePath">Property path to set ('source' in the description).</param>
- /// <param name="entryElement">XML element for the entry that corresponds to the object being read.</param>
- /// <param name="entryObject">Object being read.</param>
- /// <param name="propertyType" type="String">Name of property type to set.</param>
- /// <param name="suffix" type="String">Suffix to feed customization properties.</param>
-
- var propertyPath = customization.propertyPath;
- // If keepInConent equals true or the property value is null we do nothing as this overrides any other customization.
- if (customization.keepInContent || atomGetObjectValueByPath(propertyPath, entry) === null) {
- return;
- }
-
- var xmlNode = xmlFindNodeByPath(domElement, customization.nsURI, customization.entryPath);
-
- // If the XML tree does not contain the necessary elements to read the value,
- // then it shouldn't be considered null, but rather ignored at all. This prevents
- // the customization from generating the object path down to the property.
- if (!xmlNode) {
- return;
- }
-
- var propertyType = customization.propertyType;
- var propertyValue;
-
- if (customization.contentKind === "xhtml") {
- // Treat per XHTML in http://tools.ietf.org/html/rfc4287#section-3.1.1, including the DIV
- // in the content.
- propertyValue = xmlSerializeDescendants(xmlNode);
- } else {
- propertyValue = xmlReadODataEdmPropertyValue(xmlNode, propertyType || "Edm.String");
- }
- // Set the value on the entry.
- atomSetEntryValueByPath(propertyPath, entry, propertyValue, propertyType);
- };
-
- var lookupPropertyType = function (metadata, owningType, path) {
- /// <summary>Looks up the type of a property given its path in an entity type.</summary>
- /// <param name="metadata">Metadata in which to search for base and complex types.</param>
- /// <param name="owningType">Type to which property belongs.</param>
- /// <param name="path" type="String" mayBeNull="false">Property path to look at.</param>
- /// <returns type="String">The name of the property type; possibly null.</returns>
-
- var parts = path.split("/");
- var i, len;
- while (owningType) {
- // Keep track of the type being traversed, necessary for complex types.
- var traversedType = owningType;
-
- for (i = 0, len = parts.length; i < len; i++) {
- // Traverse down the structure as necessary.
- var properties = traversedType.property;
- if (!properties) {
- break;
- }
-
- // Find the property by scanning the property list (might be worth pre-processing).
- var propertyFound = lookupProperty(properties, parts[i]);
- if (!propertyFound) {
- break;
- }
-
- var propertyType = propertyFound.type;
-
- // We could in theory still be missing types, but that would
- // be caused by a malformed path.
- if (!propertyType || isPrimitiveEdmType(propertyType)) {
- return propertyType || null;
- }
-
- traversedType = lookupComplexType(propertyType, metadata);
- if (!traversedType) {
- return null;
- }
- }
-
- // Traverse up the inheritance chain.
- owningType = lookupEntityType(owningType.baseType, metadata);
- }
-
- return null;
- };
-
- var atomReadEntry = function (domElement, baseURI, model) {
- /// <summary>Reads a DOM element for an ATOM entry, producing an object model in return.</summary>
- /// <param name="domElement">ATOM entry DOM element.</param>
- /// <param name="baseURI" type="String">Base URI for normalizing relative URIs found in the ATOM entry.</param>
- /// <param name="model">Metadata that describes the conceptual schema.</param>
- /// <returns type="Object">A new object representing the entry.</returns>
-
- var entryMetadata = {};
- var entry = { __metadata: entryMetadata };
-
- var etag = xmlAttributeValue(domElement, "etag", odataMetaXmlNs);
- if (etag) {
- entryMetadata.etag = etag;
- }
-
- baseURI = xmlBaseURI(domElement, baseURI);
-
- xmlChildElements(domElement, function (child) {
- var nsURI = xmlNamespaceURI(child);
- var localName = xmlLocalName(child);
-
- if (nsURI === atomXmlNs) {
- if (localName === "id") {
- atomReadEntryId(child, entryMetadata, baseURI);
- return;
- }
- if (localName === "category") {
- atomReadEntryType(child, entryMetadata);
- return;
- }
- if (localName === "content") {
- atomReadEntryContent(child, entry, entryMetadata, baseURI);
- return;
- }
- if (localName === "link") {
- atomReadEntryLink(child, entry, entryMetadata, baseURI, model);
- return;
- }
- return;
- }
-
- if (nsURI === odataMetaXmlNs) {
- if (localName === "properties") {
- atomReadEntryStructuralObject(child, entry, entryMetadata);
- return;
- }
- if (localName === "action") {
- atomReadAdvertisedAction(child, baseURI, entryMetadata);
- return;
- }
- if (localName === "function") {
- atomReadAdvertisedFunction(child, baseURI, entryMetadata);
- return;
- }
- }
- });
-
- // Apply feed customizations if applicable
- var entityType = lookupEntityType(entryMetadata.type, model);
- atomApplyAllFeedCustomizations(entityType, model, function (customization) {
- atomApplyCustomizationToEntryObject(customization, domElement, entry);
- });
-
- return entry;
- };
-
- var atomReadEntryId = function (domElement, entryMetadata, baseURI) {
- /// <summary>Reads an ATOM entry id DOM element.</summary>
- /// <param name="domElement">ATOM id DOM element.</param>
- /// <param name="entryMetadata">Entry metadata object to update with the id information.</param>
-
- entryMetadata.uri = normalizeURI(xmlInnerText(domElement), xmlBaseURI(domElement, baseURI));
- entryMetadata.uri_extensions = atomReadExtensionAttributes(domElement);
- };
-
- var atomReadEntryType = function (domElement, entryMetadata) {
- /// <summary>Reads type information from an ATOM category DOM element.</summary>
- /// <param name="domElement">ATOM category DOM element.</param>
- /// <param name="entryMetadata">Entry metadata object to update with the type information.</param>
-
- if (xmlAttributeValue(domElement, "scheme") === odataScheme) {
- if (entryMetadata.type) {
- throw { message: "Invalid AtomPub document: multiple category elements defining the entry type were encounterd withing an entry", element: domElement };
- }
-
- var typeExtensions = [];
- xmlAttributes(domElement, function (attribute) {
- var nsURI = xmlNamespaceURI(attribute);
- var localName = xmlLocalName(attribute);
-
- if (!nsURI) {
- if (localName !== "scheme" && localName !== "term") {
- typeExtensions.push(createAttributeExtension(attribute, true));
- }
- return;
- }
-
- if (isExtensionNs(nsURI)) {
- typeExtensions.push(createAttributeExtension(attribute, true));
- }
- });
-
- entryMetadata.type = xmlAttributeValue(domElement, "term");
- entryMetadata.type_extensions = typeExtensions;
- }
- };
-
- var atomReadEntryContent = function (domElement, entry, entryMetadata, baseURI) {
- /// <summary>Reads an ATOM content DOM element.</summary>
- /// <param name="domElement">ATOM content DOM element.</param>
- /// <param name="entry">Entry object to update with information.</param>
- /// <param name="entryMetadata">Entry metadata object to update with the content information.</param>
- /// <param name="baseURI" type="String">Base URI for normalizing relative URIs found in the Atom entry content.</param>
-
- var src = xmlAttributeValue(domElement, "src");
- var type = xmlAttributeValue(domElement, "type");
-
- if (src) {
- if (!type) {
- throw {
- message: "Invalid AtomPub document: content element must specify the type attribute if the src attribute is also specified",
- element: domElement
- };
- }
-
- entryMetadata.media_src = normalizeURI(src, xmlBaseURI(domElement, baseURI));
- entryMetadata.content_type = type;
- }
-
- xmlChildElements(domElement, function (child) {
- if (src) {
- throw { message: "Invalid AtomPub document: content element must not have child elements if the src attribute is specified", element: domElement };
- }
-
- if (xmlNamespaceURI(child) === odataMetaXmlNs && xmlLocalName(child) === "properties") {
- atomReadEntryStructuralObject(child, entry, entryMetadata);
- }
- });
- };
-
- var atomReadEntryLink = function (domElement, entry, entryMetadata, baseURI, model) {
- /// <summary>Reads a link element on an entry.</summary>
- /// <param name="atomEntryLink">'link' element on the entry.</param>
- /// <param name="entry" type="Object">Entry object to update with the link data.</param>
- /// <param name="entryMetadata">Entry metadata object to update with the link metadata.</param>
- /// <param name="baseURI" type="String">Base URI for normalizing the link href.</param>
- /// <param name="model" type="Object">Metadata that describes the conceptual schema.</param>
-
- var link = atomReadLink(domElement, baseURI);
-
- var rel = link.rel;
- var href = link.href;
- var extensions = link.extensions;
-
- if (rel === "self") {
- entryMetadata.self = href;
- entryMetadata.self_link_extensions = extensions;
- return;
- }
-
- if (rel === "edit") {
- entryMetadata.edit = href;
- entryMetadata.edit_link_extensions = extensions;
- return;
- }
-
- if (rel === "edit-media") {
- entryMetadata.edit_media = link.href;
- entryMetadata.edit_media_extensions = extensions;
- atomReadLinkMediaEtag(link, entryMetadata);
- return;
- }
-
- // This might be a named stream edit link
- if (rel.indexOf(odataEditMediaPrefix) === 0) {
- atomReadNamedStreamEditLink(link, entry, entryMetadata);
- return;
- }
-
- // This might be a named stram media resource (read) link
- if (rel.indexOf(odataMediaResourcePrefix) === 0) {
- atomReadNamedStreamSelfLink(link, entry, entryMetadata);
- return;
- }
-
- // This might be a navigation property
- if (rel.indexOf(odataRelatedPrefix) === 0) {
- atomReadNavPropLink(domElement, link, entry, entryMetadata, model);
- return;
- }
-
- if (rel.indexOf(odataRelatedLinksPrefix) === 0) {
- atomReadNavPropRelatedLink(link, entryMetadata);
- return;
- }
- };
-
- var atomReadNavPropRelatedLink = function (link, entryMetadata) {
- /// <summary>Reads a link represnting the links related to a navigation property in an OData Atom document.</summary>
- /// <param name="link" type="Object">Object representing the parsed link DOM element.</param>
- /// <param name="entryMetadata" type="Object">Entry metadata object to update with the related links information.</param>
-
- var propertyName = link.rel.substring(odataRelatedLinksPrefix.length);
- djsassert(propertyName, "atomReadNavPropRelatedLink - property name is null, empty or undefined!");
-
- // Set the extra property information on the entry object metadata.
- entryMetadata.properties = entryMetadata.properties || {};
- var propertyMetadata = entryMetadata.properties[propertyName] = entryMetadata.properties[propertyName] || {};
-
- propertyMetadata.associationuri = link.href;
- propertyMetadata.associationuri_extensions = link.extensions;
- };
-
- var atomReadNavPropLink = function (domElement, link, entry, entryMetadata, model) {
- /// <summary>Reads a link representing a navigation property in an OData Atom document.</summary>
- /// <param name="domElement">DOM element for a navigation property in an OData Atom document.</summary>
- /// <param name="link" type="Object">Object representing the parsed link DOM element.</param>
- /// <param name="entry" type="Object">Entry object to update with the navigation property.</param>
- /// <param name="entryMetadata">Entry metadata object to update with the navigation property metadata.</param>
- /// <param name="model" type="Object">Metadata that describes the conceptual schema.</param>
-
- // Get any inline data.
- var inlineData;
- var inlineElement = xmlFirstChildElement(domElement, odataMetaXmlNs, "inline");
- if (inlineElement) {
- var inlineDocRoot = xmlFirstChildElement(inlineElement);
- var inlineBaseURI = xmlBaseURI(inlineElement, link.baseURI);
- inlineData = inlineDocRoot ? atomReadDocument(inlineDocRoot, inlineBaseURI, model) : null;
- } else {
- // If the link has no inline content, we consider it deferred.
- inlineData = { __deferred: { uri: link.href} };
- }
-
- var propertyName = link.rel.substring(odataRelatedPrefix.length);
-
- // Set the property value on the entry object.
- entry[propertyName] = inlineData;
-
- // Set the extra property information on the entry object metadata.
- entryMetadata.properties = entryMetadata.properties || {};
- var propertyMetadata = entryMetadata.properties[propertyName] = entryMetadata.properties[propertyName] || {};
-
- propertyMetadata.extensions = link.extensions;
- };
-
- var atomReadNamedStreamEditLink = function (link, entry, entryMetadata) {
- /// <summary>Reads a link representing the edit-media url of a named stream in an OData Atom document.</summary>
- /// <param name="link" type="Object">Object representing the parsed link DOM element.</param>
- /// <param name="entry" type="Object">Entry object to update with the named stream data.</param>
- /// <param name="entryMetadata">Entry metadata object to update with the named stream metadata.</param>
-
- var propertyName = link.rel.substring(odataEditMediaPrefix.length);
- djsassert(propertyName, "atomReadNamedStreamEditLink - property name is null, empty or undefined!");
-
- var namedStreamMediaResource = atomGetEntryNamedStreamMediaResource(propertyName, entry, entryMetadata);
- var mediaResource = namedStreamMediaResource.value;
- var mediaResourceMetadata = namedStreamMediaResource.metadata;
-
- var editMedia = link.href;
-
- mediaResource.edit_media = editMedia;
- mediaResource.content_type = link.type;
- mediaResourceMetadata.edit_media_extensions = link.extensions;
-
- // If there is only the edit link, make it the media self link as well.
- mediaResource.media_src = mediaResource.media_src || editMedia;
- mediaResourceMetadata.media_src_extensions = mediaResourceMetadata.media_src_extensions || [];
-
- atomReadLinkMediaEtag(link, mediaResource);
- };
-
- var atomReadNamedStreamSelfLink = function (link, entry, entryMetadata) {
- /// <summary>Reads a link representing the self url of a named stream in an OData Atom document.</summary>
- /// <param name="link" type="Object">Object representing the parsed link DOM element.</param>
- /// <param name="entry" type="Object">Entry object to update with the named stream data.</param>
- /// <param name="entryMetadata">Entry metadata object to update with the named stream metadata.</param>
-
- var propertyName = link.rel.substring(odataMediaResourcePrefix.length);
- djsassert(propertyName, "atomReadNamedStreamEditLink - property name is null, empty or undefined!");
-
- var namedStreamMediaResource = atomGetEntryNamedStreamMediaResource(propertyName, entry, entryMetadata);
- var mediaResource = namedStreamMediaResource.value;
- var mediaResourceMetadata = namedStreamMediaResource.metadata;
-
- mediaResource.media_src = link.href;
- mediaResourceMetadata.media_src_extensions = link.extensions;
- mediaResource.content_type = link.type;
- };
-
- var atomGetEntryNamedStreamMediaResource = function (name, entry, entryMetadata) {
- /// <summary>Gets the media resource object and metadata object for a named stream in an entry object.</summary>
- /// <param name="link" type="Object">Object representing the parsed link DOM element.</param>
- /// <param name="entry" type="Object">Entry object from which the media resource object will be obtained.</param>
- /// <param name="entryMetadata" type="Object">Entry metadata object from which the media resource metadata object will be obtained.</param>
- /// <remarks>
- /// If the entry doest' have a media resource for the named stream indicated by the name argument, then this function will create a new
- /// one along with its metadata object.
- /// <remarks>
- /// <returns type="Object"> Object containing the value and metadata of the named stream's media resource. <returns>
-
- entryMetadata.properties = entryMetadata.properties || {};
-
- var mediaResourceMetadata = entryMetadata.properties[name];
- var mediaResource = entry[name] && entry[name].__mediaresource;
-
- if (!mediaResource) {
- mediaResource = {};
- entry[name] = { __mediaresource: mediaResource };
- entryMetadata.properties[name] = mediaResourceMetadata = {};
- }
- return { value: mediaResource, metadata: mediaResourceMetadata };
- };
-
- var atomReadLinkMediaEtag = function (link, mediaResource) {
- /// <summary>Gets the media etag from the link extensions and updates the media resource object with it.</summary>
- /// <param name="link" type="Object">Object representing the parsed link DOM element.</param>
- /// <param name="mediaResource" type="Object">Object containing media information for an OData Atom entry.</param>
- /// <remarks>
- /// The function will remove the extension object for the etag if it finds it in the link extensions and will set
- /// its value under the media_etag property of the mediaResource object.
- /// <remarks>
- /// <returns type="Object"> Object containing the value and metadata of the named stream's media resource. <returns>
-
- var extensions = link.extensions;
- var i, len;
- for (i = 0, len = extensions.length; i < len; i++) {
- if (extensions[i].namespaceURI === odataMetaXmlNs && extensions[i].name === "etag") {
- mediaResource.media_etag = extensions[i].value;
- extensions.splice(i, 1);
- return;
- }
- }
- };
-
- var atomReadEntryStructuralObject = function (domElement, parent, parentMetadata) {
- /// <summary>Reads an atom entry's property as a structural object and sets its value in the parent and the metadata in the parentMetadata objects.</summary>
- /// <param name="propertiesElement">XML element for the 'properties' node.</param>
- /// <param name="parent">
- /// Object that will contain the property value. It can be either an antom entry or
- /// an atom complex property object.
- /// </param>
- /// <param name="parentMetadata">Object that will contain the property metadata. It can be either an atom entry metadata or a complex property metadata object</param>
-
- xmlChildElements(domElement, function (child) {
- var property = xmlReadODataProperty(child);
- if (property) {
- var propertyName = property.name;
- var propertiesMetadata = parentMetadata.properties = parentMetadata.properties || {};
- propertiesMetadata[propertyName] = property.metadata;
- parent[propertyName] = property.value;
- }
- });
- };
-
- var atomReadServiceDocument = function (domElement, baseURI) {
- /// <summary>Reads an AtomPub service document</summary>
- /// <param name="atomServiceDoc">DOM element for the root of an AtomPub service document</param>
- /// <param name="baseURI" type="String">Base URI for normalizing relative URIs found in the AtomPub service document.</param>
- /// <returns type="Object">An object that contains the properties of the service document</returns>
-
- var workspaces = [];
- var extensions = [];
-
- baseURI = xmlBaseURI(domElement, baseURI);
- // Find all the workspace elements.
- xmlChildElements(domElement, function (child) {
- if (xmlNamespaceURI(child) === appXmlNs && xmlLocalName(child) === "workspace") {
- workspaces.push(atomReadServiceDocumentWorkspace(child, baseURI));
- return;
- }
- extensions.push(createElementExtension(child));
- });
-
- // AtomPub (RFC 5023 Section 8.3.1) says a service document MUST contain one or
- // more workspaces. Throw if we don't find any.
- if (workspaces.length === 0) {
- throw { message: "Invalid AtomPub service document: No workspace element found.", element: domElement };
- }
-
- return { workspaces: workspaces, extensions: extensions };
- };
-
- var atomReadServiceDocumentWorkspace = function (domElement, baseURI) {
- /// <summary>Reads a single workspace element from an AtomPub service document</summary>
- /// <param name="domElement">DOM element that represents a workspace of an AtomPub service document</param>
- /// <param name="baseURI" type="String">Base URI for normalizing relative URIs found in the AtomPub service document workspace.</param>
- /// <returns type="Object">An object that contains the properties of the workspace</returns>
-
- var collections = [];
- var extensions = [];
- var title; // = undefined;
-
- baseURI = xmlBaseURI(domElement, baseURI);
-
- xmlChildElements(domElement, function (child) {
- var nsURI = xmlNamespaceURI(child);
- var localName = xmlLocalName(child);
-
- if (nsURI === atomXmlNs) {
- if (localName === "title") {
- if (title !== undefined) {
- throw { message: "Invalid AtomPub service document: workspace has more than one child title element", element: child };
- }
-
- title = xmlInnerText(child);
- return;
- }
- }
-
- if (nsURI === appXmlNs) {
- if (localName === "collection") {
- collections.push(atomReadServiceDocumentCollection(child, baseURI));
- }
- return;
- }
- extensions.push(atomReadExtensionElement(child));
- });
-
- return { title: title || "", collections: collections, extensions: extensions };
- };
-
- var atomReadServiceDocumentCollection = function (domElement, baseURI) {
- /// <summary>Reads a service document collection element into an object.</summary>
- /// <param name="domElement">DOM element that represents a collection of an AtomPub service document.</param>
- /// <param name="baseURI" type="String">Base URI for normalizing relative URIs found in the AtomPub service document collection.</param>
- /// <returns type="Object">An object that contains the properties of the collection.</returns>
-
-
- var href = xmlAttributeValue(domElement, "href");
-
- if (!href) {
- throw { message: "Invalid AtomPub service document: collection has no href attribute", element: domElement };
- }
-
- baseURI = xmlBaseURI(domElement, baseURI);
- href = normalizeURI(href, xmlBaseURI(domElement, baseURI));
- var extensions = [];
- var title; // = undefined;
-
- xmlChildElements(domElement, function (child) {
- var nsURI = xmlNamespaceURI(child);
- var localName = xmlLocalName(child);
-
- if (nsURI === atomXmlNs) {
- if (localName === "title") {
- if (title !== undefined) {
- throw { message: "Invalid AtomPub service document: collection has more than one child title element", element: child };
- }
- title = xmlInnerText(child);
- }
- return;
- }
-
- if (nsURI !== appXmlNs) {
- extensions.push(atomReadExtensionElement(domElement));
- }
- });
-
- // AtomPub (RFC 5023 Section 8.3.3) says the collection element MUST contain
- // a title element. It's likely to be problematic if the service doc doesn't
- // have one so here we throw.
- if (!title) {
- throw { message: "Invalid AtomPub service document: collection has no title element", element: domElement };
- }
-
- return { title: title, href: href, extensions: extensions };
- };
-
- var atomNewElement = function (dom, name, children) {
- /// <summary>Creates a new DOM element in the Atom namespace.</summary>
- /// <param name="dom">DOM document used for creating the new DOM Element.</param>
- /// <param name="name" type="String">Local name of the Atom element to create.</param>
- /// <param name="children" type="Array">Array containing DOM nodes or string values that will be added as children of the new DOM element.</param>
- /// <returns>New DOM element in the Atom namespace.</returns>
- /// <remarks>
- /// If a value in the children collection is a string, then a new DOM text node is going to be created
- /// for it and then appended as a child of the new DOM Element.
- /// </remarks>
-
- return xmlNewElement(dom, atomXmlNs, xmlQualifiedName(atomPrefix, name), children);
- };
-
- var atomNewAttribute = function (dom, name, value) {
- /// <summary>Creates a new DOM attribute for an Atom element in the default namespace.</summary>
- /// <param name="dom">DOM document used for creating the new DOM Element.</param>
- /// <param name="name" type="String">Local name of the OData attribute to create.</param>
- /// <param name="value">Attribute value.</param>
- /// <returns>New DOM attribute in the default namespace.</returns>
-
- return xmlNewAttribute(dom, null, name, value);
- };
-
- var atomCanRemoveProperty = function (propertyElement) {
- /// <summary>Checks whether the property represented by domElement can be removed from the atom document DOM tree.</summary>
- /// <param name="propertyElement">DOM element for the property to test.</param>
- /// <remarks>
- /// The property can only be removed if it doens't have any children and only has namespace or type declaration attributes.
- /// </remarks>
- /// <returns type="Boolean">True is the property can be removed; false otherwise.</returns>
-
- if (propertyElement.childNodes.length > 0) {
- return false;
- }
-
- var isEmpty = true;
- var attributes = propertyElement.attributes;
- var i, len;
- for (i = 0, len = attributes.length; i < len && isEmpty; i++) {
- var attribute = attributes[i];
-
- isEmpty = isEmpty && isXmlNSDeclaration(attribute) ||
- (xmlNamespaceURI(attribute) == odataMetaXmlNs && xmlLocalName(attribute) === "type");
- }
- return isEmpty;
- };
-
- var atomNewODataNavigationProperty = function (dom, name, kind, value, model) {
- /// <summary>Creates a new Atom link DOM element for a navigation property in an OData Atom document.</summary>
- /// <param name="dom">DOM document used for creating the new DOM Element.</param>
- /// <param name="name" type="String">Property name.</param>
- /// <param name="kind" type="String">Navigation property kind. Expected values are "deferred", "entry", or "feed".</param>
- /// <param name="value" optional="true" mayBeNull="true">Value of the navigation property, if any.</param>
- /// <param name="model" type="Object" optional="true">Object describing an OData conceptual schema.</param>
- /// <returns type="Object">
- /// Object containing the new Atom link DOM element for the navigation property and the
- /// required data service version for this property.
- /// </returns>
-
- var linkType = null;
- var linkContent = null;
- var linkContentBodyData = null;
- var href = "";
-
- if (kind !== "deferred") {
- linkType = atomNewAttribute(dom, "type", "application/atom+xml;type=" + kind);
- linkContent = xmlNewODataMetaElement(dom, "inline");
-
- if (value) {
- href = value.__metadata && value.__metadata.uri || "";
- linkContentBodyData =
- atomNewODataFeed(dom, value, model) ||
- atomNewODataEntry(dom, value, model);
- xmlAppendChild(linkContent, linkContentBodyData.element);
- }
- } else {
- href = value.__deferred.uri;
- }
-
- var navProp = atomNewElement(dom, "link", [
- atomNewAttribute(dom, "href", href),
- atomNewAttribute(dom, "rel", normalizeURI(name, odataRelatedPrefix)),
- linkType,
- linkContent
- ]);
-
- return xmlNewODataElementInfo(navProp, linkContentBodyData ? linkContentBodyData.dsv : "1.0");
- };
-
- var atomNewODataEntryDataItem = function (dom, name, value, dataItemMetadata, dataItemModel, model) {
- /// <summary>Creates a new DOM element for a data item in an entry, complex property, or collection property.</summary>
- /// <param name="dom">DOM document used for creating the new DOM Element.</param>
- /// <param name="name" type="String">Data item name.</param>
- /// <param name="value" optional="true" mayBeNull="true">Value of the data item, if any.</param>
- /// <param name="dataItemMetadata" type="Object" optional="true">Object containing metadata about the data item.</param>
- /// <param name="dataItemModel" type="Object" optional="true">Object describing the data item in an OData conceptual schema.</param>
- /// <param name="model" type="Object" optional="true">Object describing an OData conceptual schema.</param>
- /// <returns type="Object">
- /// Object containing the new DOM element in the appropriate namespace for the data item and the
- /// required data service version for it.
- /// </returns>
-
- if (isNamedStream(value)) {
- return null;
- }
-
- var dataElement = xmlNewODataDataElement(dom, name, value, dataItemMetadata, dataItemModel, model);
- if (!dataElement) {
- // This may be a navigation property.
- var navPropKind = navigationPropertyKind(value, dataItemModel);
- djsassert(navPropKind !== null, "atomNewODataEntryDataItem - navigation property kind is null for property " + name);
-
- dataElement = atomNewODataNavigationProperty(dom, name, navPropKind, value, model);
- }
- return dataElement;
- };
-
- var atomEntryCustomization = function (dom, entry, entryProperties, customization) {
- /// <summary>Applies a feed customization by transforming an Atom entry DOM element as needed.</summary>
- /// <param name="dom">DOM document used for creating any new DOM nodes required by the customization.</param>
- /// <param name="entry">DOM element for the Atom entry to which the customization is going to be applied.</param>
- /// <param name="entryProperties">DOM element containing the properties of the Atom entry.</param>
- /// <param name="customization" type="Object">Object describing an applicable feed customization.</param>
- /// <remarks>
- /// Look into the atomfeedCustomization function for a description of the customization object.
- /// </remarks>
- /// <returns type="String">Data service version required by the applied customization</returns>
-
- var atomProperty = xmlFindElementByPath(entryProperties, odataXmlNs, customization.propertyPath);
- var atomPropertyNullAttribute = atomProperty && xmlAttributeNode(atomProperty, "null", odataMetaXmlNs);
- var atomPropertyValue;
- var dataServiceVersion = "1.0";
-
- if (atomPropertyNullAttribute && atomPropertyNullAttribute.value === "true") {
- return dataServiceVersion;
- }
-
- if (atomProperty) {
- atomPropertyValue = xmlInnerText(atomProperty) || "";
- if (!customization.keepInContent) {
- dataServiceVersion = "2.0";
- var parent = atomProperty.parentNode;
- var candidate = parent;
-
- parent.removeChild(atomProperty);
- while (candidate !== entryProperties && atomCanRemoveProperty(candidate)) {
- parent = candidate.parentNode;
- parent.removeChild(candidate);
- candidate = parent;
- }
- }
- }
-
- var targetNode = xmlNewNodeByPath(dom, entry,
- customization.nsURI, customization.nsPrefix, customization.entryPath);
-
- if (targetNode.nodeType === 2) {
- targetNode.value = atomPropertyValue;
- return dataServiceVersion;
- }
-
- var contentKind = customization.contentKind;
- xmlAppendChildren(targetNode, [
- contentKind && xmlNewAttribute(dom, null, "type", contentKind),
- contentKind === "xhtml" ? xmlNewFragment(dom, atomPropertyValue) : atomPropertyValue
- ]);
-
- return dataServiceVersion;
- };
-
- var atomNewODataEntry = function (dom, data, model) {
- /// <summary>Creates a new DOM element for an Atom entry.</summary>
- /// <param name="dom">DOM document used for creating the new DOM Element.</param>
- /// <param name="data" type="Object">Entry object in the library's internal representation.</param>
- /// <param name="model" type="Object" optional="true">Object describing an OData conceptual schema.</param>
- /// <returns type="Object">
- /// Object containing the new DOM element for the Atom entry and the required data service version for it.
- /// </returns>
-
- var payloadMetadata = data.__metadata || {};
- var propertiesMetadata = payloadMetadata.properties || {};
-
- var etag = payloadMetadata.etag;
- var uri = payloadMetadata.uri;
- var typeName = payloadMetadata.type;
- var entityType = lookupEntityType(typeName, model);
-
- var properties = xmlNewODataMetaElement(dom, "properties");
- var entry = atomNewElement(dom, "entry", [
- atomNewElement(dom, "author",
- atomNewElement(dom, "name")
- ),
- etag && xmlNewODataMetaAttribute(dom, "etag", etag),
- uri && atomNewElement(dom, "id", uri),
- typeName && atomNewElement(dom, "category", [
- atomNewAttribute(dom, "term", typeName),
- atomNewAttribute(dom, "scheme", odataScheme)
- ]),
- // TODO: MLE support goes here.
- atomNewElement(dom, "content", [
- atomNewAttribute(dom, "type", "application/xml"),
- properties
- ])
- ]);
-
- var dataServiceVersion = "1.0";
- for (var name in data) {
- if (name !== "__metadata") {
- var entryDataItemMetadata = propertiesMetadata[name] || {};
- var entryDataItemModel = entityType && (
- lookupProperty(entityType.property, name) ||
- lookupProperty(entityType.navigationProperty, name));
-
- var entryDataItem = atomNewODataEntryDataItem(dom, name, data[name], entryDataItemMetadata, entryDataItemModel, model);
- if (entryDataItem) {
- var entryElement = entryDataItem.element;
- var entryElementParent = (xmlNamespaceURI(entryElement) === atomXmlNs) ? entry : properties;
-
- xmlAppendChild(entryElementParent, entryElement);
- dataServiceVersion = maxVersion(dataServiceVersion, entryDataItem.dsv);
- }
- }
- }
-
- atomApplyAllFeedCustomizations(entityType, model, function (customization) {
- var customizationDsv = atomEntryCustomization(dom, entry, properties, customization);
- dataServiceVersion = maxVersion(dataServiceVersion, customizationDsv);
- });
-
- return xmlNewODataElementInfo(entry, dataServiceVersion);
- };
-
- var atomNewODataFeed = function (dom, data, model) {
- /// <summary>Creates a new DOM element for an Atom feed.</summary>
- /// <param name="dom">DOM document used for creating the new DOM Element.</param>
- /// <param name="data" type="Object">Feed object in the library's internal representation.</param>
- /// <param name="model" type="Object" optional="true">Object describing an OData conceptual schema.</param>
- /// <returns type="Object">
- /// Object containing the new DOM element for the Atom feed and the required data service version for it.
- /// </returns>
-
- var entries = isArray(data) ? data : data.results;
-
- if (!entries) {
- return null;
- }
-
- var dataServiceVersion = "1.0";
- var atomFeed = atomNewElement(dom, "feed");
-
- var i, len;
- for (i = 0, len = entries.length; i < len; i++) {
- var atomEntryData = atomNewODataEntry(dom, entries[i], model);
- xmlAppendChild(atomFeed, atomEntryData.element);
- dataServiceVersion = maxVersion(dataServiceVersion, atomEntryData.dsv);
- }
- return xmlNewODataElementInfo(atomFeed, dataServiceVersion);
- };
-
- var atomNewODataDocument = function (data, model) {
- /// <summary>Creates a new OData Atom document.</summary>
- /// <param name="data" type="Object">Feed or entry object in the libary's internal representaion.</param>
- /// <param name="model" type="Object" optional="true">Object describing an OData conceptual schema.</param>
- /// <returns type="Object">
- /// Object containing the new DOM document for the Atom document and the required data service version for it.
- /// </returns>
-
- if (data) {
- var atomRootWriter = isFeed(data) && atomNewODataFeed ||
- isObject(data) && atomNewODataEntry;
-
- if (atomRootWriter) {
- var dom = xmlDom();
- var atomRootData = atomRootWriter(dom, data, model);
-
- if (atomRootData) {
- var atomRootElement = atomRootData.element;
- xmlAppendChildren(atomRootElement, [
- xmlNewNSDeclaration(dom, odataMetaXmlNs, odataMetaPrefix),
- xmlNewNSDeclaration(dom, odataXmlNs, odataPrefix)
- ]);
- return xmlNewODataElementInfo(xmlAppendChild(dom, atomRootElement), atomRootData.dsv);
- }
- }
- }
- return null;
- };
-
- var atomParser = function (handler, text, context) {
- /// <summary>Parses an ATOM document (feed, entry or service document).</summary>
- /// <param name="handler">This handler.</param>
- /// <param name="text" type="String">Document text.</param>
- /// <param name="context" type="Object">Object with parsing context.</param>
- /// <returns>An object representation of the document; undefined if not applicable.</returns>
-
- if (text) {
- var atomDoc = xmlParse(text);
- var atomRoot = xmlFirstChildElement(atomDoc);
- if (atomRoot) {
- return atomReadDocument(atomRoot, null, context.metadata);
- }
- }
- };
-
- var atomSerializer = function (handler, data, context) {
- /// <summary>Serializes an ATOM object into a document (feed or entry).</summary>
- /// <param name="handler">This handler.</param>
- /// <param name="data" type="Object">Representation of feed or entry.</param>
- /// <param name="context" type="Object">Object with parsing context.</param>
- /// <returns>An text representation of the data object; undefined if not applicable.</returns>
-
- var cType = context.contentType = context.contentType || contentType(atomMediaType);
- if (cType && cType.mediaType === atomMediaType) {
- var atomDoc = atomNewODataDocument(data, context.metadata);
- if (atomDoc) {
- context.dataServiceVersion = maxVersion(context.dataServiceVersion || "1.0", atomDoc.dsv);
- return xmlSerialize(atomDoc.element);
- }
- }
- // Allow undefined to be returned.
- };
-
- odata.atomHandler = handler(atomParser, atomSerializer, atomAcceptTypes.join(","), MAX_DATA_SERVICE_VERSION);
-
- // DATAJS INTERNAL START
- odata.atomParser = atomParser;
- odata.atomSerializer = atomSerializer;
- odata.atomReadDocument = atomReadDocument;
- odata.atomReadFeed = atomReadFeed;
- odata.atomReadFeedLink = atomReadFeedLink;
- odata.atomReadLink = atomReadLink;
- odata.atomReadExtensionElement = atomReadExtensionElement;
- odata.atomReadExtensionAttributes = atomReadExtensionAttributes;
- odata.atomReadEntry = atomReadEntry;
- odata.atomReadEntryType = atomReadEntryType;
- odata.atomReadEntryContent = atomReadEntryContent;
- odata.atomReadEntryLink = atomReadEntryLink;
- odata.atomReadEntryStructuralObject = atomReadEntryStructuralObject;
- odata.atomReadServiceDocument = atomReadServiceDocument;
- odata.atomReadServiceDocumentWorkspace = atomReadServiceDocumentWorkspace;
- odata.atomReadServiceDocumentCollection = atomReadServiceDocumentCollection;
- odata.expandedFeedCustomizationPath = expandedFeedCustomizationPath;
- odata.lookupPropertyType = lookupPropertyType;
- odata.atomSetEntryValueByPath = atomSetEntryValueByPath;
- // DATAJS INTERNAL END
-
- // CONTENT END
-})(this);
\ No newline at end of file
[19/22] olingo-odata4-js git commit: [OLINGO-442] Cleanup bevor
release
Posted by ko...@apache.org.
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/src/odata-json-light.js
----------------------------------------------------------------------
diff --git a/JSLib/src/odata-json-light.js b/JSLib/src/odata-json-light.js
deleted file mode 100644
index d963852..0000000
--- a/JSLib/src/odata-json-light.js
+++ /dev/null
@@ -1,1442 +0,0 @@
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
-// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// odata-json-light.js
-
-(function (window, undefined) {
-
- var datajs = window.odatajs || {};
- var odata = window.OData || {};
-
- // Imports
-
- var assigned = odatajs.assigned;
- var djsassert = odatajs.djsassert;
- var extend = odatajs.extend;
- var getURIInfo = odatajs.getURIInfo;
- var isArray = odatajs.isArray;
- var isDate = odatajs.isDate;
- var normalizeURI = odatajs.normalizeURI;
- var renameProperty = odatajs.renameProperty;
- var undefinedDefault = odatajs.undefinedDefault;
- var convertByteArrayToHexString = odatajs.convertByteArrayToHexString;
-
- var dataItemTypeName = odata.dataItemTypeName;
- var EDM_DATETIME = odata.EDM_DATETIME;
- var EDM_DATETIMEOFFSET = odata.EDM_DATETIMEOFFSET;
- var EDM_TIME = odata.EDM_TIME;
- var getCollectionType = odata.getCollectionType;
- var isCollection = odata.isCollection;
- var isCollectionType = odata.isCollectionType;
- var isComplex = odata.isComplex;
- var isDeferred = odata.isDeferred;
- var isFeed = odata.isFeed;
- var isEntry = odata.isEntry;
- var isGeographyEdmType = odata.isGeographyEdmType;
- var isGeometryEdmType = odata.isGeometryEdmType;
- var isPrimitiveEdmType = odata.isPrimitiveEdmType;
- var isPrimitive = odata.isPrimitive;
- var lookupComplexType = odata.lookupComplexType;
- var lookupDefaultEntityContainer = odata.lookupDefaultEntityContainer;
- var lookupEntityContainer = odata.lookupEntityContainer;
- var lookupEntitySet = odata.lookupEntitySet;
- var lookupEntityType = odata.lookupEntityType;
- var lookupFunctionImport = odata.lookupFunctionImport;
- var lookupNavigationPropertyType = odata.lookupNavigationPropertyType;
- var getEntitySetInfo = odata.getEntitySetInfo;
- var lookupNavigationPropertyEntitySet = odata.lookupNavigationPropertyEntitySet;
- var lookupProperty = odata.lookupProperty;
- var parseBool = odata.parseBool;
- var parseDateTime = odata.parseDateTime;
- var parseDateTimeOffset = odata.parseDateTimeOffset;
- var parseDuration = odata.parseDuration;
-
- // CONTENT START
-
- var PAYLOADTYPE_OBJECT = "o";
- var PAYLOADTYPE_FEED = "f";
- var PAYLOADTYPE_PRIMITIVE = "p";
- var PAYLOADTYPE_COLLECTION = "c";
- var PAYLOADTYPE_SVCDOC = "s";
- var PAYLOADTYPE_LINKS = "l";
-
- var odataNs = "odata";
- var odataAnnotationPrefix = odataNs + ".";
-
- var contextUrlAnnotation = "@" + odataAnnotationPrefix + "context";
-
- var bindAnnotation = "@" + odataAnnotationPrefix + "bind";
- var navUrlAnnotation = odataAnnotationPrefix + "navigationLinkUrl";
- var typeAnnotation = odataAnnotationPrefix + "type";
-
- var jsonLightNameMap = {
- readLink: "self",
- editLink: "edit",
- nextLink: "__next",
- mediaReadLink: "media_src",
- mediaEditLink: "edit_media",
- mediaContentType: "content_type",
- mediaETag: "media_etag",
- count: "__count",
- media_src: "mediaReadLink",
- edit_media: "mediaEditLink",
- content_type: "mediaContentType",
- media_etag: "mediaETag",
- url: "uri"
- };
-
- var jsonLightAnnotations = {
- metadata: "odata.metadata",
- count: "odata.count",
- next: "odata.nextLink",
- id: "odata.id",
- etag: "odata.etag",
- read: "odata.readLink",
- edit: "odata.editLink",
- mediaRead: "odata.mediaReadLink",
- mediaEdit: "odata.mediaEditLink",
- mediaEtag: "odata.mediaETag",
- mediaContentType: "odata.mediaContentType",
- actions: "odata.actions",
- functions: "odata.functions",
- navigationUrl: "odata.navigationLinkUrl",
- associationUrl: "odata.associationLinkUrl",
- type: "odata.type"
- };
-
- var jsonLightAnnotationInfo = function (annotation) {
- /// <summary>Gets the name and target of an annotation in a JSON light payload.</summary>
- /// <param name="annotation" type="String">JSON light payload annotation.</param>
- /// <returns type="Object">Object containing the annotation name and the target property name.</param>
-
- if (annotation.indexOf(".") > 0) {
- var targetEnd = annotation.indexOf("@");
- var target = targetEnd > -1 ? annotation.substring(0, targetEnd) : null;
- var name = annotation.substring(targetEnd + 1);
-
- return {
- target: target,
- name: name,
- isOData: name.indexOf(odataAnnotationPrefix) === 0
- };
- }
- return null;
- };
-
- var jsonLightDataItemType = function (name, value, container, dataItemModel, model) {
- /// <summary>Gets the type name of a JSON light data item that belongs to a feed, an entry, a complex type property, or a collection property.</summary>
- /// <param name="name" type="String">Name of the data item for which the type name is going to be retrieved.</param>
- /// <param name="value">Value of the data item.</param>
- /// <param name="container" type="Object">JSON light object that owns the data item.</param>
- /// <param name="dataItemModel" type="Object" optional="true">Object describing the data item in an OData conceptual schema.</param>
- /// <param name="model" type="Object" optional="true">Object describing an OData conceptual schema.</param>
- /// <remarks>
- /// This function will first try to get the type name from the data item's value itself if it is a JSON light object; otherwise
- /// it will try to get it from the odata.type annotation applied to the data item in the container. Then, it will fallback to the data item model.
- /// If all attempts fail, it will return null.
- /// </remarks>
- /// <returns type="String">Data item type name; null if the type name cannot be found.</returns>
-
- return (isComplex(value) && value[typeAnnotation]) ||
- (container && container[name + "@" + typeAnnotation]) ||
- (dataItemModel && dataItemModel.type) ||
- (lookupNavigationPropertyType(dataItemModel, model)) ||
- null;
- };
-
- var jsonLightDataItemModel = function (name, containerModel) {
- /// <summary>Gets an object describing a data item in an OData conceptual schema.</summary>
- /// <param name="name" type="String">Name of the data item for which the model is going to be retrieved.</param>
- /// <param name="containerModel" type="Object">Object describing the owner of the data item in an OData conceptual schema.</param>
- /// <returns type="Object">Object describing the data item; null if it cannot be found.</returns>
-
- if (containerModel) {
- return lookupProperty(containerModel.property, name) ||
- lookupProperty(containerModel.navigationProperty, name);
- }
- return null;
- };
-
- var jsonLightIsEntry = function (data) {
- /// <summary>Determines whether data represents a JSON light entry object.</summary>
- /// <param name="data" type="Object">JSON light object to test.</param>
- /// <returns type="Boolean">True if the data is JSON light entry object; false otherwise.</returns>
-
- return isComplex(data) && ((odataAnnotationPrefix + "id") in data);
- };
-
- var jsonLightIsNavigationProperty = function (name, data, dataItemModel) {
- /// <summary>Determines whether a data item in a JSON light object is a navigation property.</summary>
- /// <param name="name" type="String">Name of the data item to test.</param>
- /// <param name="data" type="Object">JSON light object that owns the data item.</param>
- /// <param name="dataItemModel" type="Object">Object describing the data item in an OData conceptual schema.</param>
- /// <returns type="Boolean">True if the data item is a navigation property; false otherwise.</returns>
-
- djsassert(isComplex(data), "jsonLightIsNavProp - data is not an object!!");
- if (!!data[name + "@" + navUrlAnnotation] || (dataItemModel && dataItemModel.relationship)) {
- return true;
- }
-
- // Sniff the property value.
- var value = isArray(data[name]) ? data[name][0] : data[name];
- return jsonLightIsEntry(value);
- };
-
- var jsonLightIsPrimitiveType = function (typeName) {
- /// <summary>Determines whether a type name is a primitive type in a JSON light payload.</summary>
- /// <param name="typeName" type="String">Type name to test.</param>
- /// <returns type="Boolean">True if the type name an EDM primitive type or an OData spatial type; false otherwise.</returns>
-
- return isPrimitiveEdmType(typeName) || isGeographyEdmType(typeName) || isGeometryEdmType(typeName);
- };
-
- var jsonLightReadDataAnnotations = function (data, obj, baseURI, dataModel, model) {
- /// <summary>Converts annotations found in a JSON light payload object to either properties or metadata.</summary>
- /// <param name="data" type="Object">JSON light payload object containing the annotations to convert.</param>
- /// <param name="obj" type="Object">Object that will store the converted annotations.</param>
- /// <param name="baseURI" type="String">Base URI for normalizing relative URIs found in the payload.</param>
- /// <param name="dataModel" type="Object">Object describing the JSON light payload in an OData conceptual schema.</param>
- /// <param name="model" type="Object" optional="true">Object describing an OData conceptual schema.</param>
- /// <returns>JSON light payload object with its annotations converted to either properties or metadata.</param>
-
- for (var name in data) {
- if (name.indexOf(".") > 0 && name.charAt(0) !== "#") {
- var annotationInfo = jsonLightAnnotationInfo(name);
- if (annotationInfo) {
- var annotationName = annotationInfo.name;
- var target = annotationInfo.target;
- var targetModel = null;
- var targetType = null;
-
- if (target) {
- targetModel = jsonLightDataItemModel(target, dataModel);
- targetType = jsonLightDataItemType(target, data[target], data, targetModel, model);
- }
-
- if (annotationInfo.isOData) {
- jsonLightApplyPayloadODataAnnotation(annotationName, target, targetType, data[name], data, obj, baseURI);
- } else {
- obj[name] = data[name];
- }
- }
- }
- }
- return obj;
- };
-
- var jsonLightApplyPayloadODataAnnotation = function (name, target, targetType, value, data, obj, baseURI) {
- /// <summary>
- /// Processes a JSON Light payload OData annotation producing either a property, payload metadata, or property metadata on its owner object.
- /// </summary>
- /// <param name="name" type="String">Annotation name.</param>
- /// <param name="target" type="String">Name of the property that is being targeted by the annotation.</param>
- /// <param name="targetType" type="String">Type name of the target property.</param>
- /// <param name="data" type="Object">JSON light object containing the annotation.</param>
- /// <param name="obj" type="Object">Object that will hold properties produced by the annotation.</param>
- /// <param name="baseURI" type="String">Base URI for normalizing relative URIs found in the payload.</param>
-
- var annotation = name.substring(odataAnnotationPrefix.length);
-
- switch (annotation) {
- case "navigationLinkUrl":
- jsonLightApplyNavigationUrlAnnotation(annotation, target, targetType, value, data, obj, baseURI);
- return;
- case "nextLink":
- case "count":
- jsonLightApplyFeedAnnotation(annotation, target, value, obj, baseURI);
- return;
- case "mediaReadLink":
- case "mediaEditLink":
- case "mediaContentType":
- case "mediaETag":
- jsonLightApplyMediaAnnotation(annotation, target, targetType, value, obj, baseURI);
- return;
- default:
- jsonLightApplyMetadataAnnotation(annotation, target, value, obj, baseURI);
- return;
- }
- };
-
- var jsonLightApplyMetadataAnnotation = function (name, target, value, obj, baseURI) {
- /// <summary>
- /// Converts a JSON light annotation that applies to entry metadata only (i.e. odata.editLink or odata.readLink) and its value
- /// into their library's internal representation and saves it back to data.
- /// </summary>
- /// <param name="name" type="String">Annotation name.</param>
- /// <param name="target" type="String">Name of the property on which the annotation should be applied.</param>
- /// <param name="value" type="Object">Annotation value.</param>
- /// <param name="obj" type="Object">Object that will hold properties produced by the annotation.</param>
- /// <param name="baseURI" type="String">Base URI for normalizing relative URIs found in the payload.</param>
-
- var metadata = obj.__metadata = obj.__metadata || {};
- var mappedName = jsonLightNameMap[name] || name;
-
- if (name === "editLink") {
- metadata.uri = normalizeURI(value, baseURI);
- metadata[mappedName] = metadata.uri;
- return;
- }
-
- if (name === "readLink" || name === "associationLinkUrl") {
- value = normalizeURI(value, baseURI);
- }
-
- if (target) {
- var propertiesMetadata = metadata.properties = metadata.properties || {};
- var propertyMetadata = propertiesMetadata[target] = propertiesMetadata[target] || {};
-
- if (name === "type") {
- propertyMetadata[mappedName] = propertyMetadata[mappedName] || value;
- return;
- }
- propertyMetadata[mappedName] = value;
- return;
- }
- metadata[mappedName] = value;
- };
-
- var jsonLightApplyFeedAnnotation = function (name, target, value, obj, baseURI) {
- /// <summary>
- /// Converts a JSON light annotation that applies to feeds only (i.e. odata.count or odata.nextlink) and its value
- /// into their library's internal representation and saves it back to data.
- /// </summary>
- /// <param name="name" type="String">Annotation name.</param>
- /// <param name="target" type="String">Name of the property on which the annotation should be applied.</param>
- /// <param name="value" type="Object">Annotation value.</param>
- /// <param name="obj" type="Object">Object that will hold properties produced by the annotation.</param>
- /// <param name="baseURI" type="String">Base URI for normalizing relative URIs found in the payload.</param>
-
- var mappedName = jsonLightNameMap[name];
- var feed = target ? obj[target] : obj;
- feed[mappedName] = (name === "nextLink") ? normalizeURI(value, baseURI) : value;
- };
-
- var jsonLightApplyMediaAnnotation = function (name, target, targetType, value, obj, baseURI) {
- /// <summary>
- /// Converts a JSON light media annotation in and its value into their library's internal representation
- /// and saves it back to data or metadata.
- /// </summary>
- /// <param name="name" type="String">Annotation name.</param>
- /// <param name="target" type="String">Name of the property on which the annotation should be applied.</param>
- /// <param name="targetType" type="String">Type name of the target property.</param>
- /// <param name="value" type="Object">Annotation value.</param>
- /// <param name="obj" type="Object">Object that will hold properties produced by the annotation.</param>
- /// <param name="baseURI" type="String">Base URI for normalizing relative URIs found in the payload.</param>
-
- var metadata = obj.__metadata = obj.__metadata || {};
- var mappedName = jsonLightNameMap[name];
-
- if (name === "mediaReadLink" || name === "mediaEditLink") {
- value = normalizeURI(value, baseURI);
- }
-
- if (target) {
- var propertiesMetadata = metadata.properties = metadata.properties || {};
- var propertyMetadata = propertiesMetadata[target] = propertiesMetadata[target] || {};
- propertyMetadata.type = propertyMetadata.type || targetType;
-
- obj.__metadata = metadata;
- obj[target] = obj[target] || { __mediaresource: {} };
- obj[target].__mediaresource[mappedName] = value;
- return;
- }
-
- metadata[mappedName] = value;
- };
-
- var jsonLightApplyNavigationUrlAnnotation = function (name, target, targetType, value, data, obj, baseURI) {
- /// <summary>
- /// Converts a JSON light navigation property annotation and its value into their library's internal representation
- /// and saves it back to data o metadata.
- /// </summary>
- /// <param name="name" type="String">Annotation name.</param>
- /// <param name="target" type="String">Name of the property on which the annotation should be applied.</param>
- /// <param name="targetType" type="String">Type name of the target property.</param>
- /// <param name="value" type="Object">Annotation value.</param>
- /// <param name="data" type="Object">JSON light object containing the annotation.</param>
- /// <param name="obj" type="Object">Object that will hold properties produced by the annotation.</param>
- /// <param name="baseURI" type="String">Base URI for normalizing relative URIs found in the payload.</param>
-
- var metadata = obj.__metadata = obj.__metadata || {};
- var propertiesMetadata = metadata.properties = metadata.properties || {};
- var propertyMetadata = propertiesMetadata[target] = propertiesMetadata[target] || {};
- var uri = normalizeURI(value, baseURI);
-
- if (data.hasOwnProperty(target)) {
- // The navigation property is inlined in the payload,
- // so the navigation link url should be pushed to the object's
- // property metadata instead.
- propertyMetadata.navigationLinkUrl = uri;
- return;
- }
- obj[target] = { __deferred: { uri: uri} };
- propertyMetadata.type = propertyMetadata.type || targetType;
- };
-
-
- var jsonLightReadDataItemValue = function (value, typeName, dataItemMetadata, baseURI, dataItemModel, model, recognizeDates) {
- /// <summary>Converts the value of a data item in a JSON light object to its library representation.</summary>
- /// <param name="value">Data item value to convert.</param>
- /// <param name="typeName" type="String">Type name of the data item.</param>
- /// <param name="dataItemMetadata" type="Object">Object containing metadata about the data item.</param>
- /// <param name="baseURI" type="String">Base URI for normalizing relative URIs found in the payload.</param>
- /// <param name="dataItemModel" type="Object" optional="true">Object describing the data item in an OData conceptual schema.</param>
- /// <param name="model" type="Object" optional="true">Object describing an OData conceptual schema.</param>
- /// <param name="recognizeDates" type="Boolean" optional="true">Flag indicating whether datetime literal strings should be converted to JavaScript Date objects.</param>
- /// <returns>Data item value in its library representation.</param>
-
- if (typeof value === "string") {
- return jsonLightReadStringPropertyValue(value, typeName, recognizeDates);
- }
-
- if (!jsonLightIsPrimitiveType(typeName)) {
- if (isArray(value)) {
- return jsonLightReadCollectionPropertyValue(value, typeName, dataItemMetadata, baseURI, model, recognizeDates);
- }
-
- if (isComplex(value)) {
- return jsonLightReadComplexPropertyValue(value, typeName, dataItemMetadata, baseURI, model, recognizeDates);
- }
- }
- return value;
- };
-
- var jsonLightReadStringPropertyValue = function (value, propertyType, recognizeDates) {
- /// <summary>Convertes the value of a string property in a JSON light object to its library representation.</summary>
- /// <param name="value" type="String">String value to convert.</param>
- /// <param name="propertyType" type="String">Type name of the property.</param>
- /// <param name="recognizeDates" type="Boolean" optional="true">Flag indicating whether datetime literal strings should be converted to JavaScript Date objects.</param>
- /// <returns>String property value in its library representation.</returns>
-
- switch (propertyType) {
- case EDM_TIME:
- return parseDuration(value);
- case EDM_DATETIME:
- return parseDateTime(value, /*nullOnError*/false);
- case EDM_DATETIMEOFFSET:
- return parseDateTimeOffset(value, /*nullOnError*/false);
- }
-
- if (recognizeDates) {
- return parseDateTime(value, /*nullOnError*/true) ||
- parseDateTimeOffset(value, /*nullOnError*/true) ||
- value;
- }
- return value;
- };
-
- var jsonLightReadCollectionPropertyValue = function (value, propertyType, propertyMetadata, baseURI, model, recognizeDates) {
- /// <summary>Converts the value of a collection property in a JSON light object into its library representation.</summary>
- /// <param name="value" type="Array">Collection property value to convert.</param>
- /// <param name="propertyType" type="String">Property type name.</param>
- /// <param name="propertyMetadata" type="Object">Object containing metadata about the collection property.</param>
- /// <param name="baseURI" type="String">Base URI for normalizing relative URIs found in the payload.</param>
- /// <param name="model" type="Object" optional="true">Object describing an OData conceptual schema.</param>
- /// <param name="recognizeDates" type="Boolean" optional="true">Flag indicating whether datetime literal strings should be converted to JavaScript Date objects.</param>
- /// <returns type="Object">Collection property value in its library representation.</returns>
-
- var collectionType = getCollectionType(propertyType);
- var itemsMetadata = [];
- var items = [];
-
- var i, len;
- for (i = 0, len = value.length; i < len; i++) {
- var itemType = jsonLightDataItemType(null, value[i]) || collectionType;
- var itemMetadata = { type: itemType };
- var item = jsonLightReadDataItemValue(value[i], itemType, itemMetadata, baseURI, null, model, recognizeDates);
-
- if (!jsonLightIsPrimitiveType(itemType) && !isPrimitive(value[i])) {
- itemsMetadata.push(itemMetadata);
- }
- items.push(item);
- }
-
- if (itemsMetadata.length > 0) {
- propertyMetadata.elements = itemsMetadata;
- }
-
- return { __metadata: { type: propertyType }, results: items };
- };
-
- var jsonLightReadComplexPropertyValue = function (value, propertyType, propertyMetadata, baseURI, model, recognizeDates) {
- /// <summary>Converts the value of a comples property in a JSON light object into its library representation.</summary>
- /// <param name="value" type="Object">Complex property value to convert.</param>
- /// <param name="propertyType" type="String">Property type name.</param>
- /// <param name="propertyMetadata" type="Object">Object containing metadata about the complx type property.</param>
- /// <param name="baseURI" type="String">Base URI for normalizing relative URIs found in the payload.</param>
- /// <param name="model" type="Object" optional="true">Object describing an OData conceptual schema.</param>
- /// <param name="recognizeDates" type="Boolean" optional="true">Flag indicating whether datetime literal strings should be converted to JavaScript Date objects.</param>
- /// <returns type="Object">Complex property value in its library representation.</returns>
-
- var complexValue = jsonLightReadObject(value, { type: propertyType }, baseURI, model, recognizeDates);
- var complexMetadata = complexValue.__metadata;
- var complexPropertiesMetadata = complexMetadata.properties;
-
- if (complexPropertiesMetadata) {
- propertyMetadata.properties = complexPropertiesMetadata;
- delete complexMetadata.properties;
- }
- return complexValue;
- };
-
- var jsonLightReadNavigationPropertyValue = function (value, propertyInfo, baseURI, model, recognizeDates) {
- /// <summary>Converts the value of a navigation property in a JSON light object into its library representation.</summary>
- /// <param name="value">Navigation property property value to convert.</param>
- /// <param name="propertyInfo" type="String">Information about the property whether it's an entry, feed or complex type.</param>
- /// <param name="baseURI" type="String">Base URI for normalizing relative URIs found in the payload.</param>
- /// <param name="model" type="Object" optional="true">Object describing an OData conceptual schema.</param>
- /// <param name="recognizeDates" type="Boolean" optional="true">Flag indicating whether datetime literal strings should be converted to JavaScript Date objects.</param>
- /// <returns type="Object">Collection property value in its library representation.</returns>
-
- if (isArray(value)) {
- return jsonLightReadFeed(value, propertyInfo, baseURI, model, recognizeDates);
- }
-
- if (isComplex(value)) {
- return jsonLightReadObject(value, propertyInfo, baseURI, model, recognizeDates);
- }
- return null;
- };
-
- var jsonLightReadObject = function (data, objectInfo, baseURI, model, recognizeDates) {
- /// <summary>Converts a JSON light entry or complex type object into its library representation.</summary>
- /// <param name="data" type="Object">JSON light entry or complex type object to convert.</param>
- /// <param name="objectInfo" type="Object">Information about the entry or complex.</param>
- /// <param name="baseURI" type="String">Base URI for normalizing relative URIs found in the payload.</param>
- /// <param name="model" type="Object" optional="true">Object describing an OData conceptual schema.</param>
- /// <param name="recognizeDates" type="Boolean" optional="true">Flag indicating whether datetime literal strings should be converted to JavaScript Date objects.</param>
- /// <returns type="Object">Entry or complex type object.</param>
-
- objectInfo = objectInfo || {};
- var actualType = data[typeAnnotation] || objectInfo.type || null;
- var dataModel = lookupEntityType(actualType, model);
- var isEntry = true;
- if (!dataModel) {
- isEntry = false;
- dataModel = lookupComplexType(actualType, model);
- }
-
- var metadata = { type: actualType };
- var obj = { __metadata: metadata };
- var propertiesMetadata = {};
- var baseTypeModel;
- 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) {
- baseTypeModel = dataModel;
- }
- while (!!baseTypeModel && !baseTypeModel.key && baseTypeModel.baseType) {
- baseTypeModel = lookupEntityType(baseTypeModel.baseType, model);
- }
-
- if (dataModel.key || (!!baseTypeModel && baseTypeModel.key)) {
- var entryKey;
- if (dataModel.key) {
- entryKey = jsonLightGetEntryKey(data, dataModel);
- } else {
- entryKey = jsonLightGetEntryKey(data, baseTypeModel);
- }
- if (entryKey) {
- var entryInfo = {
- key: entryKey,
- entitySet: objectInfo.entitySet,
- functionImport: objectInfo.functionImport,
- containerName: objectInfo.containerName
- };
- jsonLightComputeUrisIfMissing(data, entryInfo, actualType, serviceURI, dataModel, baseTypeModel);
- }
- }
- }
-
- for (var name in data) {
- if (name.indexOf("#") === 0) {
- // This is an advertised function or action.
- jsonLightReadAdvertisedFunctionOrAction(name.substring(1), data[name], obj, baseURI, model);
- } else {
- // Is name NOT an annotation?
- if (name.indexOf(".") === -1) {
- if (!metadata.properties) {
- metadata.properties = propertiesMetadata;
- }
-
- var propertyValue = data[name];
- var propertyModel = propertyModel = jsonLightDataItemModel(name, dataModel);
- baseTypeModel = dataModel;
- while (!!dataModel && propertyModel === null && baseTypeModel.baseType) {
- baseTypeModel = lookupEntityType(baseTypeModel.baseType, model);
- propertyModel = propertyModel = jsonLightDataItemModel(name, baseTypeModel);
- }
- var isNavigationProperty = jsonLightIsNavigationProperty(name, data, propertyModel);
- var propertyType = jsonLightDataItemType(name, propertyValue, data, propertyModel, model);
- var propertyMetadata = propertiesMetadata[name] = propertiesMetadata[name] || { type: propertyType };
- if (isNavigationProperty) {
- var propertyInfo = {};
- if (objectInfo.entitySet !== undefined) {
- var navigationPropertyEntitySetName = lookupNavigationPropertyEntitySet(propertyModel, objectInfo.entitySet.name, model);
- propertyInfo = getEntitySetInfo(navigationPropertyEntitySetName, model);
- }
- propertyInfo.contentTypeOdata = objectInfo.contentTypeOdata;
- propertyInfo.kind = objectInfo.kind;
- propertyInfo.type = propertyType;
- obj[name] = jsonLightReadNavigationPropertyValue(propertyValue, propertyInfo, baseURI, model, recognizeDates);
- } else {
- obj[name] = jsonLightReadDataItemValue(propertyValue, propertyType, propertyMetadata, baseURI, propertyModel, model, recognizeDates);
- }
- }
- }
- }
-
- return jsonLightReadDataAnnotations(data, obj, baseURI, dataModel, model);
- };
-
- var jsonLightReadAdvertisedFunctionOrAction = function (name, value, obj, baseURI, model) {
- /// <summary>Converts a JSON light advertised action or function object into its library representation.</summary>
- /// <param name="name" type="String">Advertised action or function name.</param>
- /// <param name="value">Advertised action or function value.</param>
- /// <param name="obj" type="Object">Object that will the converted value of the advertised action or function.</param>
- /// <param name="baseURI" type="String">Base URI for normalizing the action's or function's relative URIs.</param>
- /// <param name="model" type="Object" optional="true">Object describing an OData conceptual schema.</param>
- /// <remarks>
- /// Actions and functions have the same representation in json light, so to disambiguate them the function uses
- /// the model object. If available, the function will look for the functionImport object that describes the
- /// the action or the function. If for whatever reason the functionImport can't be retrieved from the model (like
- /// there is no model available or there is no functionImport within the model), then the value is going to be treated
- /// as an advertised action and stored under obj.__metadata.actions.
- /// </remarks>
-
- if (!name || !isArray(value) && !isComplex(value)) {
- return;
- }
-
- var isFunction = false;
- var nsEnd = name.lastIndexOf(".");
- var simpleName = name.substring(nsEnd + 1);
- var containerName = (nsEnd > -1) ? name.substring(0, nsEnd) : "";
-
- var container = (simpleName === name || containerName.indexOf(".") === -1) ?
- lookupDefaultEntityContainer(model) :
- lookupEntityContainer(containerName, model);
-
- if (container) {
- var functionImport = lookupFunctionImport(container.functionImport, simpleName);
- if (functionImport && !!functionImport.isSideEffecting) {
- isFunction = !parseBool(functionImport.isSideEffecting);
- }
- }
-
- var metadata = obj.__metadata;
- var targetName = isFunction ? "functions" : "actions";
- var metadataURI = normalizeURI(name, baseURI);
- var items = (isArray(value)) ? value : [value];
-
- var i, len;
- for (i = 0, len = items.length; i < len; i++) {
- var item = items[i];
- if (item) {
- var targetCollection = metadata[targetName] = metadata[targetName] || [];
- var actionOrFunction = { metadata: metadataURI, title: item.title, target: normalizeURI(item.target, baseURI) };
- targetCollection.push(actionOrFunction);
- }
- }
- };
-
- var jsonLightReadFeed = function (data, feedInfo, baseURI, model, recognizeDates) {
- /// <summary>Converts a JSON light feed or top level collection property object into its library representation.</summary>
- /// <param name="data" type="Object">JSON light feed object to convert.</param>
- /// <param name="typeName" type="String">Type name of the feed or collection items.</param>
- /// <param name="baseURI" type="String">Base URI for normalizing relative URIs found in the payload.</param>
- /// <param name="model" type="Object" optional="true">Object describing an OData conceptual schema.</param>
- /// <param name="recognizeDates" type="Boolean" optional="true">Flag indicating whether datetime literal strings should be converted to JavaScript Date objects.</param>
- /// <returns type="Object">Feed or top level collection object.</param>
-
- var items = isArray(data) ? data : data.value;
- var entries = [];
- var i, len, entry;
- for (i = 0, len = items.length; i < len; i++) {
- entry = jsonLightReadObject(items[i], feedInfo, baseURI, model, recognizeDates);
- entries.push(entry);
- }
-
- var feed = { results: entries };
-
- if (isComplex(data)) {
- for (var name in data) {
- if (name.indexOf("#") === 0) {
- // This is an advertised function or action.
- feed.__metadata = feed.__metadata || {};
- jsonLightReadAdvertisedFunctionOrAction(name.substring(1), data[name], feed, baseURI, model);
- }
- }
- feed = jsonLightReadDataAnnotations(data, feed, baseURI);
- }
- return feed;
- };
-
- var jsonLightGetEntryKey = function (data, entityModel) {
- /// <summary>Gets the key of an entry.</summary>
- /// <param name="data" type="Object">JSON light entry.</param>
- /// <param name="entityModel" type="String">Object describing the entry Model</param>
- /// <returns type="string">Entry instance key.</returns>
-
- var entityInstanceKey;
- var entityKeys = entityModel.key.propertyRef;
- var type;
- entityInstanceKey = "(";
- if (entityKeys.length == 1) {
- type = lookupProperty(entityModel.property, entityKeys[0].name).type;
- entityInstanceKey += formatLiteral(data[entityKeys[0].name], type);
- } else {
- var first = true;
- for (var i = 0; i < entityKeys.length; i++) {
- if (!first) {
- entityInstanceKey += ",";
- } else {
- first = false;
- }
- type = lookupProperty(entityModel.property, entityKeys[i].name).type;
- entityInstanceKey += entityKeys[i].name + "=" + formatLiteral(data[entityKeys[i].name], type);
- }
- }
- entityInstanceKey += ")";
- return entityInstanceKey;
- };
-
-
- var jsonLightComputeUrisIfMissing = function (data, entryInfo, actualType, serviceURI, entityModel, baseTypeModel) {
- /// <summary>Compute the URI according to OData conventions if it doesn't exist</summary>
- /// <param name="data" type="Object">JSON light entry.</param>
- /// <param name="entryInfo" type="Object">Information about the entry includes type, key, entitySet and entityContainerName.</param>
- /// <param name="actualType" type="String">Type of the entry</param>
- /// <param name="serviceURI" type="String">Base URI the service.</param>
- /// <param name="entityModel" type="Object">Object describing an OData conceptual schema of the entry.</param>
- /// <param name="baseTypeModel" type="Object" optional="true">Object escribing an OData conceptual schema of the baseType if it exists.</param>
-
- var lastIdSegment = data[jsonLightAnnotations.id] || data[jsonLightAnnotations.read] || data[jsonLightAnnotations.edit] || entryInfo.entitySet.name + entryInfo.key;
- data[jsonLightAnnotations.id] = serviceURI + lastIdSegment;
- if (!data[jsonLightAnnotations.edit]) {
- data[jsonLightAnnotations.edit] = entryInfo.entitySet.name + entryInfo.key;
- if (entryInfo.entitySet.entityType != actualType) {
- data[jsonLightAnnotations.edit] += "/" + actualType;
- }
- }
- data[jsonLightAnnotations.read] = data[jsonLightAnnotations.read] || data[jsonLightAnnotations.edit];
- if (!data[jsonLightAnnotations.etag]) {
- var etag = jsonLightComputeETag(data, entityModel, baseTypeModel);
- if (!!etag) {
- data[jsonLightAnnotations.etag] = etag;
- }
- }
-
- jsonLightComputeStreamLinks(data, entityModel, baseTypeModel);
- jsonLightComputeNavigationAndAssociationProperties(data, entityModel, baseTypeModel);
- jsonLightComputeFunctionImports(data, entryInfo);
- };
-
- var jsonLightComputeETag = function (data, entityModel, baseTypeModel) {
- /// <summary>Computes the etag of an entry</summary>
- /// <param name="data" type="Object">JSON light entry.</param>
- /// <param name="entryInfo" type="Object">Object describing the entry model.</param>
- /// <param name="baseTypeModel" type="Object" optional="true">Object describing an OData conceptual schema of the baseType if it exists.</param>
- /// <returns type="string">Etag value</returns>
- var etag = "";
- var propertyModel;
- for (var i = 0; entityModel.property && i < entityModel.property.length; i++) {
- propertyModel = entityModel.property[i];
- etag = jsonLightAppendValueToEtag(data, etag, propertyModel);
-
- }
- if (baseTypeModel) {
- for (i = 0; baseTypeModel.property && i < baseTypeModel.property.length; i++) {
- propertyModel = baseTypeModel.property[i];
- etag = jsonLightAppendValueToEtag(data, etag, propertyModel);
- }
- }
- if (etag.length > 0) {
- return etag + "\"";
- }
- return null;
- };
-
- var jsonLightAppendValueToEtag = function (data, etag, propertyModel) {
- /// <summary>Adds a propery value to the etag after formatting.</summary>
- /// <param name="data" type="Object">JSON light entry.</param>
- /// <param name="etag" type="Object">value of the etag.</param>
- /// <param name="propertyModel" type="Object">Object describing an OData conceptual schema of the property.</param>
- /// <returns type="string">Etag value</returns>
-
- if (propertyModel.concurrencyMode == "Fixed") {
- if (etag.length > 0) {
- etag += ",";
- } else {
- etag += "W/\"";
- }
- if (data[propertyModel.name] !== null) {
- etag += formatLiteral(data[propertyModel.name], propertyModel.type);
- } else {
- etag += "null";
- }
- }
- return etag;
- };
-
- var jsonLightComputeNavigationAndAssociationProperties = function (data, entityModel, baseTypeModel) {
- /// <summary>Adds navigation links to the entry metadata</summary>
- /// <param name="data" type="Object">JSON light entry.</param>
- /// <param name="entityModel" type="Object">Object describing the entry model.</param>
- /// <param name="baseTypeModel" type="Object" optional="true">Object describing an OData conceptual schema of the baseType if it exists.</param>
-
- var navigationLinkAnnotation = "@odata.navigationLinkUrl";
- var associationLinkAnnotation = "@odata.associationLinkUrl";
- var navigationPropertyName, navigationPropertyAnnotation, associationPropertyAnnotation;
- for (var i = 0; entityModel.navigationProperty && i < entityModel.navigationProperty.length; i++) {
- navigationPropertyName = entityModel.navigationProperty[i].name;
- navigationPropertyAnnotation = navigationPropertyName + navigationLinkAnnotation;
- if (data[navigationPropertyAnnotation] === undefined) {
- data[navigationPropertyAnnotation] = data[jsonLightAnnotations.edit] + "/" + encodeURIComponent(navigationPropertyName);
- }
- associationPropertyAnnotation = navigationPropertyName + associationLinkAnnotation;
- if (data[associationPropertyAnnotation] === undefined) {
- data[associationPropertyAnnotation] = data[jsonLightAnnotations.edit] + "/$links/" + encodeURIComponent(navigationPropertyName);
- }
- }
-
- if (baseTypeModel && baseTypeModel.navigationProperty) {
- for (i = 0; i < baseTypeModel.navigationProperty.length; i++) {
- navigationPropertyName = baseTypeModel.navigationProperty[i].name;
- navigationPropertyAnnotation = navigationPropertyName + navigationLinkAnnotation;
- if (data[navigationPropertyAnnotation] === undefined) {
- data[navigationPropertyAnnotation] = data[jsonLightAnnotations.edit] + "/" + encodeURIComponent(navigationPropertyName);
- }
- associationPropertyAnnotation = navigationPropertyName + associationLinkAnnotation;
- if (data[associationPropertyAnnotation] === undefined) {
- data[associationPropertyAnnotation] = data[jsonLightAnnotations.edit] + "/$links/" + encodeURIComponent(navigationPropertyName);
- }
- }
- }
- };
-
- var formatLiteral = function (value, type) {
- /// <summary>Formats a value according to Uri literal format</summary>
- /// <param name="value">Value to be formatted.</param>
- /// <param name="type">Edm type of the value</param>
- /// <returns type="string">Value after formatting</returns>
-
- value = "" + formatRowLiteral(value, type);
- value = encodeURIComponent(value.replace("'", "''"));
- switch ((type)) {
- case "Edm.Binary":
- return "X'" + value + "'";
- case "Edm.DateTime":
- return "datetime" + "'" + value + "'";
- case "Edm.DateTimeOffset":
- return "datetimeoffset" + "'" + value + "'";
- case "Edm.Decimal":
- return value + "M";
- case "Edm.Guid":
- return "guid" + "'" + value + "'";
- case "Edm.Int64":
- return value + "L";
- case "Edm.Float":
- return value + "f";
- case "Edm.Double":
- return value + "D";
- case "Edm.Geography":
- return "geography" + "'" + value + "'";
- case "Edm.Geometry":
- return "geometry" + "'" + value + "'";
- case "Edm.Time":
- return "time" + "'" + value + "'";
- case "Edm.String":
- return "'" + value + "'";
- default:
- return value;
- }
- };
-
-
- var formatRowLiteral = function (value, type) {
- switch (type) {
- case "Edm.Binary":
- return convertByteArrayToHexString(value);
- default:
- return value;
- }
- };
-
- var jsonLightComputeFunctionImports = function (data, entryInfo) {
- /// <summary>Adds functions and actions links to the entry metadata</summary>
- /// <param name="entry" type="Object">JSON light entry.</param>
- /// <param name="entityInfo" type="Object">Object describing the entry</param>
-
- var functionImport = entryInfo.functionImport || [];
- for (var i = 0; i < functionImport.length; i++) {
- if (functionImport[i].isBindable && functionImport[i].parameter[0] && functionImport[i].parameter[0].type == entryInfo.entitySet.entityType) {
- var functionImportAnnotation = "#" + entryInfo.containerName + "." + functionImport[i].name;
- if (data[functionImportAnnotation] == undefined) {
- data[functionImportAnnotation] = {
- title: functionImport[i].name,
- target: data[jsonLightAnnotations.edit] + "/" + functionImport[i].name
- };
- }
- }
- }
- };
-
- var jsonLightComputeStreamLinks = function (data, entityModel, baseTypeModel) {
- /// <summary>Adds stream links to the entry metadata</summary>
- /// <param name="data" type="Object">JSON light entry.</param>
- /// <param name="entityModel" type="Object">Object describing the entry model.</param>
- /// <param name="baseTypeModel" type="Object" optional="true">Object describing an OData conceptual schema of the baseType if it exists.</param>
-
- if (entityModel.hasStream || (baseTypeModel && baseTypeModel.hasStream)) {
- data[jsonLightAnnotations.mediaEdit] = data[jsonLightAnnotations.mediaEdit] || data[jsonLightAnnotations.mediaEdit] + "/$value";
- data[jsonLightAnnotations.mediaRead] = data[jsonLightAnnotations.mediaRead] || data[jsonLightAnnotations.mediaEdit];
- }
- };
-
- var jsonLightReadTopPrimitiveProperty = function (data, typeName, baseURI, recognizeDates) {
- /// <summary>Converts a JSON light top level primitive property object into its library representation.</summary>
- /// <param name="data" type="Object">JSON light feed object to convert.</param>
- /// <param name="typeName" type="String">Type name of the primitive property.</param>
- /// <param name="baseURI" type="String">Base URI for normalizing relative URIs found in the payload.</param>
- /// <param name="recognizeDates" type="Boolean" optional="true">Flag indicating whether datetime literal strings should be converted to JavaScript Date objects.</param>
- /// <returns type="Object">Top level primitive property object.</param>
-
- var metadata = { type: typeName };
- var value = jsonLightReadDataItemValue(data.value, typeName, metadata, baseURI, null, null, recognizeDates);
- return jsonLightReadDataAnnotations(data, { __metadata: metadata, value: value }, baseURI);
- };
-
- var jsonLightReadTopCollectionProperty = function (data, typeName, baseURI, model, recognizeDates) {
- /// <summary>Converts a JSON light top level collection property object into its library representation.</summary>
- /// <param name="data" type="Object">JSON light feed object to convert.</param>
- /// <param name="typeName" type="String">Type name of the collection property.</param>
- /// <param name="baseURI" type="String">Base URI for normalizing relative URIs found in the payload.</param>
- /// <param name="model" type="Object" optional="true">Object describing an OData conceptual schema.</param>
- /// <param name="recognizeDates" type="Boolean" optional="true">Flag indicating whether datetime literal strings should be converted to JavaScript Date objects.</param>
- /// <returns type="Object">Top level collection property object.</param>
-
- var propertyMetadata = {};
- var value = jsonLightReadCollectionPropertyValue(data.value, typeName, propertyMetadata, baseURI, model, recognizeDates);
- extend(value.__metadata, propertyMetadata);
- return jsonLightReadDataAnnotations(data, value, baseURI);
- };
-
- var jsonLightReadLinksDocument = function (data, baseURI) {
- /// <summary>Converts a JSON light links collection object to its library representation.</summary>
- /// <param name="data" type="Object">JSON light link object to convert.</param>
- /// <param name="baseURI" type="String">Base URI for normalizing relative URIs found in the payload.</param>
- /// <returns type="Object">Links collection object.</param>
-
- var items = data.value;
- if (!isArray(items)) {
- return jsonLightReadLink(data, baseURI);
- }
-
- var results = [];
- var i, len;
- for (i = 0, len = items.length; i < len; i++) {
- results.push(jsonLightReadLink(items[i], baseURI));
- }
-
- var links = { results: results };
- return jsonLightReadDataAnnotations(data, links, baseURI);
- };
-
- var jsonLightReadLink = function (data, baseURI) {
- /// <summary>Converts a JSON light link object to its library representation.</summary>
- /// <param name="data" type="Object">JSON light link object to convert.</param>
- /// <param name="baseURI" type="String">Base URI for normalizing relative URIs found in the payload.</param>
- /// <returns type="Object">Link object.</param>
-
- var link = { uri: normalizeURI(data.url, baseURI) };
-
- link = jsonLightReadDataAnnotations(data, link, baseURI);
- var metadata = link.__metadata || {};
- var metadataProperties = metadata.properties || {};
-
- jsonLightRemoveTypePropertyMetadata(metadataProperties.url);
- renameProperty(metadataProperties, "url", "uri");
-
- return link;
- };
-
- var jsonLightRemoveTypePropertyMetadata = function (propertyMetadata) {
- /// <summary>Removes the type property from a property metadata object.</summary>
- /// <param name="propertyMetadata" type="Object">Property metadata object.</param>
-
- if (propertyMetadata) {
- delete propertyMetadata.type;
- }
- };
-
- var jsonLightReadSvcDocument = function (data, baseURI) {
- /// <summary>Converts a JSON light service document object to its library representation.</summary>
- /// <param name="data" type="Object">JSON light service document object to convert.</param>
- /// <param name="baseURI" type="String">Base URI for normalizing relative URIs found in the payload.</param>
- /// <returns type="Object">Link object.</param>
-
- var items = data.value;
- var collections = [];
- var workspace = jsonLightReadDataAnnotations(data, { collections: collections }, baseURI);
-
- var metadata = workspace.__metadata || {};
- var metadataProperties = metadata.properties || {};
-
- jsonLightRemoveTypePropertyMetadata(metadataProperties.value);
- renameProperty(metadataProperties, "value", "collections");
-
- var i, len;
- for (i = 0, len = items.length; i < len; i++) {
- var item = items[i];
- var collection = { title: item.name, href: normalizeURI(item.url, baseURI) };
-
- collection = jsonLightReadDataAnnotations(item, collection, baseURI);
- metadata = collection.__metadata || {};
- metadataProperties = metadata.properties || {};
-
- jsonLightRemoveTypePropertyMetadata(metadataProperties.name);
- jsonLightRemoveTypePropertyMetadata(metadataProperties.url);
-
- renameProperty(metadataProperties, "name", "title");
- renameProperty(metadataProperties, "url", "href");
-
- collections.push(collection);
- }
-
- return { workspaces: [workspace] };
- };
-
- var jsonLightMakePayloadInfo = function (kind, type) {
- /// <summary>Creates an object containing information for the json light payload.</summary>
- /// <param name="kind" type="String">JSON light payload kind, one of the PAYLOADTYPE_XXX constant values.</param>
- /// <param name="typeName" type="String">Type name of the JSON light payload.</param>
- /// <returns type="Object">Object with kind and type fields.</returns>
-
- /// <field name="kind" type="String">Kind of the JSON light payload. One of the PAYLOADTYPE_XXX constant values.</field>
- /// <field name="type" type="String">Data type of the JSON light payload.</field>
-
- return { kind: kind, type: type || null };
- };
-
- var jsonLightPayloadInfo = function (data, model, inferFeedAsComplexType) {
- /// <summary>Infers the information describing the JSON light payload from its metadata annotation, structure, and data model.</summary>
- /// <param name="data" type="Object">Json light response payload object.</param>
- /// <param name="model" type="Object">Object describing an OData conceptual schema.</param>
- /// <param name="inferFeedAsComplexType" type="Boolean">True if a JSON light payload that looks like a feed should be treated as a complex type property instead.</param>
- /// <remarks>
- /// If the arguments passed to the function don't convey enough information about the payload to determine without doubt that the payload is a feed then it
- /// will try to use the payload object structure instead. If the payload looks like a feed (has value property that is an array or non-primitive values) then
- /// the function will report its kind as PAYLOADTYPE_FEED unless the inferFeedAsComplexType flag is set to true. This flag comes from the user request
- /// and allows the user to control how the library behaves with an ambigous JSON light payload.
- /// </remarks>
- /// <returns type="Object">
- /// Object with kind and type fields. Null if there is no metadata annotation or the payload info cannot be obtained..
- /// </returns>
-
- var metadataUri = data[contextUrlAnnotation];
- if (!metadataUri || typeof metadataUri !== "string") {
- return null;
- }
-
- var fragmentStart = metadataUri.lastIndexOf("#");
- if (fragmentStart === -1) {
- return jsonLightMakePayloadInfo(PAYLOADTYPE_SVCDOC);
- }
-
- var elementStart = metadataUri.indexOf("@Element", fragmentStart);
- var fragmentEnd = elementStart - 1;
-
- if (fragmentEnd < 0) {
- fragmentEnd = metadataUri.indexOf("?", fragmentStart);
- if (fragmentEnd === -1) {
- fragmentEnd = metadataUri.length;
- }
- }
-
- var fragment = metadataUri.substring(fragmentStart + 1, fragmentEnd);
- if (fragment.indexOf("/$links/") > 0) {
- return jsonLightMakePayloadInfo(PAYLOADTYPE_LINKS);
- }
-
- var fragmentParts = fragment.split("/");
- if (fragmentParts.length >= 0) {
- var qualifiedName = fragmentParts[0];
- var typeCast = fragmentParts[1];
-
- if (jsonLightIsPrimitiveType(qualifiedName)) {
- return jsonLightMakePayloadInfo(PAYLOADTYPE_PRIMITIVE, qualifiedName);
- }
-
- if (isCollectionType(qualifiedName)) {
- return jsonLightMakePayloadInfo(PAYLOADTYPE_COLLECTION, qualifiedName);
- }
-
- var entityType = typeCast;
- var entitySet, functionImport, containerName;
- if (!typeCast) {
- var nsEnd = qualifiedName.lastIndexOf(".");
- var simpleName = qualifiedName.substring(nsEnd + 1);
- var container = (simpleName === qualifiedName) ?
- lookupDefaultEntityContainer(model) :
- lookupEntityContainer(qualifiedName.substring(0, nsEnd), model);
-
- if (container) {
- entitySet = lookupEntitySet(container.entitySet, simpleName);
- functionImport = container.functionImport;
- containerName = container.name;
- entityType = !!entitySet ? entitySet.entityType : null;
- }
- }
-
- var info;
- if (elementStart > 0) {
- info = jsonLightMakePayloadInfo(PAYLOADTYPE_OBJECT, entityType);
- info.entitySet = entitySet;
- info.functionImport = functionImport;
- info.containerName = containerName;
- return info;
- }
-
- if (entityType) {
- info = jsonLightMakePayloadInfo(PAYLOADTYPE_FEED, entityType);
- info.entitySet = entitySet;
- info.functionImport = functionImport;
- info.containerName = containerName;
- return info;
- }
-
- if (isArray(data.value) && !lookupComplexType(qualifiedName, model)) {
- var item = data.value[0];
- if (!isPrimitive(item)) {
- if (jsonLightIsEntry(item) || !inferFeedAsComplexType) {
- return jsonLightMakePayloadInfo(PAYLOADTYPE_FEED, null);
- }
- }
- }
-
- return jsonLightMakePayloadInfo(PAYLOADTYPE_OBJECT, qualifiedName);
- }
-
- return null;
- };
-
- var jsonLightReadPayload = function (data, model, recognizeDates, inferFeedAsComplexType, contentTypeOdata) {
- /// <summary>Converts a JSON light response payload object into its library's internal representation.</summary>
- /// <param name="data" type="Object">Json light response payload object.</param>
- /// <param name="model" type="Object">Object describing an OData conceptual schema.</param>
- /// <param name="recognizeDates" type="Boolean" optional="true">Flag indicating whether datetime literal strings should be converted to JavaScript Date objects.</param>
- /// <param name="inferFeedAsComplexType" type="Boolean">True if a JSON light payload that looks like a feed should be reported as a complex type property instead.</param>
- /// <param name="contentTypeOdata" type="string">Includes the type of json ( minimalmetadata, fullmetadata .. etc )</param>
- /// <returns type="Object">Object in the library's representation.</returns>
-
- if (!isComplex(data)) {
- return data;
- }
-
- contentTypeOdata = contentTypeOdata || "minimal";
- var baseURI = data[contextUrlAnnotation];
- var payloadInfo = jsonLightPayloadInfo(data, model, inferFeedAsComplexType);
- if (assigned(payloadInfo)) {
- payloadInfo.contentTypeOdata = contentTypeOdata;
- }
- var typeName = null;
- if (payloadInfo) {
- delete data[contextUrlAnnotation];
-
- typeName = payloadInfo.type;
- switch (payloadInfo.kind) {
- case PAYLOADTYPE_FEED:
- return jsonLightReadFeed(data, payloadInfo, baseURI, model, recognizeDates);
- case PAYLOADTYPE_COLLECTION:
- return jsonLightReadTopCollectionProperty(data, typeName, baseURI, model, recognizeDates);
- case PAYLOADTYPE_PRIMITIVE:
- return jsonLightReadTopPrimitiveProperty(data, typeName, baseURI, recognizeDates);
- case PAYLOADTYPE_SVCDOC:
- return jsonLightReadSvcDocument(data, baseURI);
- case PAYLOADTYPE_LINKS:
- return jsonLightReadLinksDocument(data, baseURI);
- }
- }
- return jsonLightReadObject(data, payloadInfo, baseURI, model, recognizeDates);
- };
-
- var jsonLightSerializableMetadata = ["@odata.type", "@odata.etag", "@odata.mediaEditLink", "@odata.mediaReadLink", "@odata.mediaContentType", "@odata.mediaEtag"];
-
- var formatJsonLightRequestPayload = function (data) {
- if (!data) {
- return data;
- }
-
- if (isPrimitive(data)) {
- return data;
- }
-
- if (isArray(data)) {
- var newArrayData = [];
- var i, len;
- for (i = 0, len = data.length; i < len; i++) {
- newArrayData[i] = formatJsonLightRequestPayload(data[i]);
- }
-
- return newArrayData;
- }
-
- var newdata = {};
- for (var property in data) {
- if (isJsonLightSerializableProperty(property)) {
- newdata[property] = formatJsonLightRequestPayload(data[property]);
- }
- }
-
- return newdata;
- };
-
- var isJsonLightSerializableProperty = function (property) {
- if (!property) {
- return false;
- }
-
- if (property.indexOf("@odata.") == -1) {
- return true;
- }
-
- var i, len;
- for (i = 0, len = jsonLightSerializableMetadata.length; i < len; i++) {
- var name = jsonLightSerializableMetadata[i];
- if (property.indexOf(name) != -1) {
- return true;
- }
- }
-
- return false;
- };
-
- var formatJsonLight = function (obj, context) {
- /// <summary>Converts an object in the library's internal representation to its json light representation.</summary>
- /// <param name="obj" type="Object">Object the library's internal representation.</param>
- /// <param name="context" type="Object">Object with the serialization context.</param>
- /// <returns type="Object">Object in its json light representation.</returns>
-
- // Regular expression used to test that the uri is for a $links document.
- var linksUriRE = /\/\$links\//;
- var data = {};
- var metadata = obj.__metadata;
-
- var islinks = context && linksUriRE.test(context.request.requestUri);
- formatJsonLightData(obj, (metadata && metadata.properties), data, islinks);
- return data;
- };
-
- var formatJsonLightMetadata = function (metadata, data) {
- /// <summary>Formats an object's metadata into the appropriate json light annotations and saves them to data.</summary>
- /// <param name="obj" type="Object">Object whose metadata is going to be formatted as annotations.</param>
- /// <param name="data" type="Object">Object on which the annotations are going to be stored.</param>
-
- if (metadata) {
- var i, len;
- for (i = 0, len = jsonLightSerializableMetadata.length; i < len; i++) {
- // There is only a subset of metadata values that are interesting during update requests.
- var name = jsonLightSerializableMetadata[i];
- var qName = odataAnnotationPrefix + (jsonLightNameMap[name] || name);
- formatJsonLightAnnotation(qName, null, metadata[name], data);
- }
- }
- };
-
- var formatJsonLightData = function (obj, pMetadata, data, isLinks) {
- /// <summary>Formats an object's data into the appropriate json light values and saves them to data.</summary>
- /// <param name="obj" type="Object">Object whose data is going to be formatted.</param>
- /// <param name="pMetadata" type="Object">Object that contains metadata for the properties that are being formatted.</param>
- /// <param name="data" type="Object">Object on which the formatted values are going to be stored.</param>
- /// <param name="isLinks" type="Boolean">True if a links document is being formatted. False otherwise.</param>
-
- for (var key in obj) {
- var value = obj[key];
- if (key === "__metadata") {
- // key is the object metadata.
- formatJsonLightMetadata(value, data);
- } else if (key.indexOf(".") === -1) {
- // key is an regular property or array element.
- if (isLinks && key === "uri") {
- formatJsonLightEntityLink(value, data);
- } else {
- formatJsonLightProperty(key, value, pMetadata, data, isLinks);
- }
- } else {
- data[key] = value;
- }
- }
- };
-
- var formatJsonLightProperty = function (name, value, pMetadata, data) {
- /// <summary>Formats an object's value identified by name to its json light representation and saves it to data.</summary>
- /// <param name="name" type="String">Property name.</param>
- /// <param name="value">Property value.</param>
- /// <param name="pMetadata" type="Object">Object that contains metadata for the property that is being formatted.</param>
- /// <param name="data" type="Object">Object on which the formatted value is going to be stored.</param>
-
- // Get property type from property metadata
- var propertyMetadata = pMetadata && pMetadata[name] || { properties: undefined, type: undefined };
- var typeName = dataItemTypeName(value, propertyMetadata);
-
- if (isPrimitive(value) || !value) {
- // It is a primitive value then.
- formatJsonLightAnnotation(typeAnnotation, name, typeName, data);
- data[name] = value;
- return;
- }
-
- if (isFeed(value, typeName) || isEntry(value)) {
- formatJsonLightInlineProperty(name, value, data);
- return;
- }
-
- if (!typeName && isDeferred(value)) {
- // It is really a deferred property.
- formatJsonLightDeferredProperty(name, value, data);
- return;
- }
-
- if (isCollection(value, typeName)) {
- // The thing is a collection, format it as one.
- if (getCollectionType(typeName)) {
- formatJsonLightAnnotation(typeAnnotation, name, typeName, data);
- }
- formatJsonLightCollectionProperty(name, value, data);
- return;
- }
-
- djsassert(isComplex(value), "formatJsonLightProperty - Value is not a complex type value");
-
- // Format the complex property value in a new object in data[name].
- data[name] = {};
- formatJsonLightAnnotation(typeAnnotation, null, typeName, data[name]);
- formatJsonLightData(value, propertyMetadata.properties, data[name]);
- };
-
- var formatJsonLightEntityLink = function (value, data) {
- /// <summary>Formats an entity link in a $links document and saves it into data.</summary>
- /// <param name="value" type="String">Entity link value.</summary>
- /// <param name="data" type="Object">Object on which the formatted value is going to be stored.</param>
- data.url = value;
- };
-
- var formatJsonLightDeferredProperty = function (name, value, data) {
- /// <summary>Formats the object value's identified by name as an odata.navigalinkurl annotation and saves it to data.</summary>
- /// <param name="name" type="String">Name of the deferred property to be formatted.</param>
- /// <param name="value" type="Object">Deferred property value to be formatted.</param>
- /// <param name="data" type="Object">Object on which the formatted value is going to be stored.</param>
-
- formatJsonLightAnnotation(navUrlAnnotation, name, value.__deferred.uri, data);
- };
-
- var formatJsonLightCollectionProperty = function (name, value, data) {
- /// <summary>Formats a collection property in obj identified by name as a json light collection property and saves it to data.</summary>
- /// <param name="name" type="String">Name of the collection property to be formatted.</param>
- /// <param name="value" type="Object">Collection property value to be formatted.</param>
- /// <param name="data" type="Object">Object on which the formatted value is going to be stored.</param>
-
- data[name] = [];
- var items = isArray(value) ? value : value.results;
- formatJsonLightData(items, null, data[name]);
- };
-
- var formatJsonLightInlineProperty = function (name, value, data) {
- /// <summary>Formats an inline feed or entry property in obj identified by name as a json light value and saves it to data.</summary>
- /// <param name="name" type="String">Name of the inline feed or entry property to be formatted.</param>
- /// <param name="value" type="Object or Array">Value of the inline feed or entry property.</param>
- /// <param name="data" type="Object">Object on which the formatted value is going to be stored.</param>
-
- if (isFeed(value)) {
- data[name] = [];
- // Format each of the inline feed entries
- var entries = isArray(value) ? value : value.results;
- var i, len;
- for (i = 0, len = entries.length; i < len; i++) {
- formatJsonLightInlineEntry(name, entries[i], true, data);
- }
- return;
- }
- formatJsonLightInlineEntry(name, value, false, data);
- };
-
- var formatJsonLightInlineEntry = function (name, value, inFeed, data) {
- /// <summary>Formats an inline entry value in the property identified by name as a json light value and saves it to data.</summary>
- /// <param name="name" type="String">Name of the inline feed or entry property that owns the entry formatted.</param>
- /// <param name="value" type="Object">Inline entry value to be formatted.</param>
- /// <param name="inFeed" type="Boolean">True if the entry is in an inline feed; false otherwise.
- /// <param name="data" type="Object">Object on which the formatted value is going to be stored.</param>
-
- // This might be a bind instead of a deep insert.
- var uri = value.__metadata && value.__metadata.uri;
- if (uri) {
- formatJsonLightBinding(name, uri, inFeed, data);
- return;
- }
-
- var entry = formatJsonLight(value);
- if (inFeed) {
- data[name].push(entry);
- return;
- }
- data[name] = entry;
- };
-
- var formatJsonLightBinding = function (name, uri, inFeed, data) {
- /// <summary>Formats an entry binding in the inline property in obj identified by name as an odata.bind annotation and saves it to data.</summary>
- /// <param name="name" type="String">Name of the inline property that has the binding to be formated.</param>
- /// <param name="uri" type="String">Uri to the bound entry.</param>
- /// <param name="inFeed" type="Boolean">True if the binding is in an inline feed; false otherwise.
- /// <param name="data" type="Object">Object on which the formatted value is going to be stored.</param>
-
- var bindingName = name + bindAnnotation;
- if (inFeed) {
- // The binding is inside an inline feed, so merge it with whatever other bindings already exist in data.
- data[bindingName] = data[bindingName] || [];
- data[bindingName].push(uri);
- return;
- }
- // The binding is on an inline entry; it can be safely overwritten.
- data[bindingName] = uri;
- };
-
- var formatJsonLightAnnotation = function (qName, target, value, data) {
- /// <summary>Formats a value as a json light annotation and stores it in data</summary>
- /// <param name="qName" type="String">Qualified name of the annotation.</param>
- /// <param name="target" type="String">Name of the property that the metadata value targets.</param>
- /// <param name="value">Annotation value.</param>
- /// <param name="data" type="Object">Object on which the annotation is going to be stored.</param>
-
- if (value !== undefined) {
- if (target) {
- data[target + "@" + qName] = value;
- }
- else {
- data[qName] = value;
- }
- }
- };
-
- // DATAJS INTERNAL START
- odata.jsonLightReadPayload = jsonLightReadPayload;
- odata.formatJsonLight = formatJsonLight;
- odata.formatJsonLightRequestPayload = formatJsonLightRequestPayload;
- // DATAJS INTERNAL END
-
- // CONTENT END
-})(this);
-
-
-
[20/22] olingo-odata4-js git commit: [OLINGO-442] Cleanup bevor
release
Posted by ko...@apache.org.
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/src/odata-batch.js
----------------------------------------------------------------------
diff --git a/JSLib/src/odata-batch.js b/JSLib/src/odata-batch.js
deleted file mode 100644
index dccac1b..0000000
--- a/JSLib/src/odata-batch.js
+++ /dev/null
@@ -1,393 +0,0 @@
-/// <reference path="odata-utils.js" />
-
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
-// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// odata-batch.js
-
-(function (window, undefined) {
-
- var datajs = window.odatajs || {};
- var odata = window.OData || {};
-
- // Imports
-
- var extend = odatajs.extend;
- var isArray = odatajs.isArray;
- var trimString = odatajs.trimString;
-
- var contentType = odata.contentType;
- var handler = odata.handler;
- var isBatch = odata.isBatch;
- var MAX_DATA_SERVICE_VERSION = odata.MAX_DATA_SERVICE_VERSION;
- var normalizeHeaders = odata.normalizeHeaders;
- var payloadTypeOf = odata.payloadTypeOf;
- var prepareRequest = odata.prepareRequest;
-
- // CONTENT START
- var batchMediaType = "multipart/mixed";
- var responseStatusRegex = /^HTTP\/1\.\d (\d{3}) (.*)$/i;
- var responseHeaderRegex = /^([^()<>@,;:\\"\/[\]?={} \t]+)\s?:\s?(.*)/;
-
- var hex16 = function () {
- /// <summary>
- /// Calculates a random 16 bit number and returns it in hexadecimal format.
- /// </summary>
- /// <returns type="String">A 16-bit number in hex format.</returns>
-
- return Math.floor((1 + Math.random()) * 0x10000).toString(16).substr(1);
- };
-
- var createBoundary = function (prefix) {
- /// <summary>
- /// Creates a string that can be used as a multipart request boundary.
- /// </summary>
- /// <param name="prefix" type="String" optional="true">String to use as the start of the boundary string</param>
- /// <returns type="String">Boundary string of the format: <prefix><hex16>-<hex16>-<hex16></returns>
-
- return prefix + hex16() + "-" + hex16() + "-" + hex16();
- };
-
- var partHandler = function (context) {
- /// <summary>
- /// Gets the handler for data serialization of individual requests / responses in a batch.
- /// </summary>
- /// <param name="context">Context used for data serialization.</param>
- /// <returns>Handler object.</returns>
-
- return context.handler.partHandler;
- };
-
- var currentBoundary = function (context) {
- /// <summary>
- /// Gets the current boundary used for parsing the body of a multipart response.
- /// </summary>
- /// <param name="context">Context used for parsing a multipart response.</param>
- /// <returns type="String">Boundary string.</returns>
-
- var boundaries = context.boundaries;
- return boundaries[boundaries.length - 1];
- };
-
- var batchParser = function (handler, text, context) {
- /// <summary>Parses a batch response.</summary>
- /// <param name="handler">This handler.</param>
- /// <param name="text" type="String">Batch text.</param>
- /// <param name="context" type="Object">Object with parsing context.</param>
- /// <returns>An object representation of the batch.</returns>
-
- var boundary = context.contentType.properties["boundary"];
- return { __batchResponses: readBatch(text, { boundaries: [boundary], handlerContext: context }) };
- };
-
- var batchSerializer = function (handler, data, context) {
- /// <summary>Serializes a batch object representation into text.</summary>
- /// <param name="handler">This handler.</param>
- /// <param name="data" type="Object">Representation of a batch.</param>
- /// <param name="context" type="Object">Object with parsing context.</param>
- /// <returns>An text representation of the batch object; undefined if not applicable.</returns>
-
- var cType = context.contentType = context.contentType || contentType(batchMediaType);
- if (cType.mediaType === batchMediaType) {
- return writeBatch(data, context);
- }
- };
-
- var readBatch = function (text, context) {
- /// <summary>
- /// Parses a multipart/mixed response body from from the position defined by the context.
- /// </summary>
- /// <param name="text" type="String" optional="false">Body of the multipart/mixed response.</param>
- /// <param name="context">Context used for parsing.</param>
- /// <returns>Array of objects representing the individual responses.</returns>
-
- var delimiter = "--" + currentBoundary(context);
-
- // Move beyond the delimiter and read the complete batch
- readTo(text, context, delimiter);
-
- // Ignore the incoming line
- readLine(text, context);
-
- // Read the batch parts
- var responses = [];
- var partEnd;
-
- while (partEnd !== "--" && context.position < text.length) {
- var partHeaders = readHeaders(text, context);
- var partContentType = contentType(partHeaders["Content-Type"]);
-
- var changeResponses;
- if (partContentType && partContentType.mediaType === batchMediaType) {
- context.boundaries.push(partContentType.properties["boundary"]);
- try {
- changeResponses = readBatch(text, context);
- } catch (e) {
- e.response = readResponse(text, context, delimiter);
- changeResponses = [e];
- }
- responses.push({ __changeResponses: changeResponses });
- context.boundaries.pop();
- readTo(text, context, "--" + currentBoundary(context));
- } else {
- if (!partContentType || partContentType.mediaType !== "application/http") {
- throw { message: "invalid MIME part type " };
- }
- // Skip empty line
- readLine(text, context);
- // Read the response
- var response = readResponse(text, context, delimiter);
- try {
- if (response.statusCode >= 200 && response.statusCode <= 299) {
- partHandler(context.handlerContext).read(response, context.handlerContext);
- } else {
- // Keep track of failed responses and continue processing the batch.
- response = { message: "HTTP request failed", response: response };
- }
- } catch (e) {
- response = e;
- }
-
- responses.push(response);
- }
-
- partEnd = text.substr(context.position, 2);
-
- // Ignore the incoming line.
- readLine(text, context);
- }
- return responses;
- };
-
- var readHeaders = function (text, context) {
- /// <summary>
- /// Parses the http headers in the text from the position defined by the context.
- /// </summary>
- /// <param name="text" type="String" optional="false">Text containing an http response's headers</param>
- /// <param name="context">Context used for parsing.</param>
- /// <returns>Object containing the headers as key value pairs.</returns>
- /// <remarks>
- /// This function doesn't support split headers and it will stop reading when it hits two consecutive line breaks.
- /// </remarks>
-
- var headers = {};
- var parts;
- var line;
- var pos;
-
- do {
- pos = context.position;
- line = readLine(text, context);
- parts = responseHeaderRegex.exec(line);
- if (parts !== null) {
- headers[parts[1]] = parts[2];
- } else {
- // Whatever was found is not a header, so reset the context position.
- context.position = pos;
- }
- } while (line && parts);
-
- normalizeHeaders(headers);
-
- return headers;
- };
-
- var readResponse = function (text, context, delimiter) {
- /// <summary>
- /// Parses an HTTP response.
- /// </summary>
- /// <param name="text" type="String" optional="false">Text representing the http response.</param>
- /// <param name="context" optional="false">Context used for parsing.</param>
- /// <param name="delimiter" type="String" optional="false">String used as delimiter of the multipart response parts.</param>
- /// <returns>Object representing the http response.</returns>
-
- // Read the status line.
- var pos = context.position;
- var match = responseStatusRegex.exec(readLine(text, context));
-
- var statusCode;
- var statusText;
- var headers;
-
- if (match) {
- statusCode = match[1];
- statusText = match[2];
- headers = readHeaders(text, context);
- readLine(text, context);
- } else {
- context.position = pos;
- }
-
- return {
- statusCode: statusCode,
- statusText: statusText,
- headers: headers,
- body: readTo(text, context, "\r\n" + delimiter)
- };
- };
-
- var readLine = function (text, context) {
- /// <summary>
- /// Returns a substring from the position defined by the context up to the next line break (CRLF).
- /// </summary>
- /// <param name="text" type="String" optional="false">Input string.</param>
- /// <param name="context" optional="false">Context used for reading the input string.</param>
- /// <returns type="String">Substring to the first ocurrence of a line break or null if none can be found. </returns>
-
- return readTo(text, context, "\r\n");
- };
-
- var readTo = function (text, context, str) {
- /// <summary>
- /// Returns a substring from the position given by the context up to value defined by the str parameter and increments the position in the context.
- /// </summary>
- /// <param name="text" type="String" optional="false">Input string.</param>
- /// <param name="context" type="Object" optional="false">Context used for reading the input string.</param>
- /// <param name="str" type="String" optional="true">Substring to read up to.</param>
- /// <returns type="String">Substring to the first ocurrence of str or the end of the input string if str is not specified. Null if the marker is not found.</returns>
-
- var start = context.position || 0;
- var end = text.length;
- if (str) {
- end = text.indexOf(str, start);
- if (end === -1) {
- return null;
- }
- context.position = end + str.length;
- } else {
- context.position = end;
- }
-
- return text.substring(start, end);
- };
-
- var writeBatch = function (data, context) {
- /// <summary>
- /// Serializes a batch request object to a string.
- /// </summary>
- /// <param name="data" optional="false">Batch request object in payload representation format</param>
- /// <param name="context" optional="false">Context used for the serialization</param>
- /// <returns type="String">String representing the batch request</returns>
-
- if (!isBatch(data)) {
- throw { message: "Data is not a batch object." };
- }
-
- var batchBoundary = createBoundary("batch_");
- var batchParts = data.__batchRequests;
- var batch = "";
- var i, len;
- for (i = 0, len = batchParts.length; i < len; i++) {
- batch += writeBatchPartDelimiter(batchBoundary, false) +
- writeBatchPart(batchParts[i], context);
- }
- batch += writeBatchPartDelimiter(batchBoundary, true);
-
- // Register the boundary with the request content type.
- var contentTypeProperties = context.contentType.properties;
- contentTypeProperties.boundary = batchBoundary;
-
- return batch;
- };
-
- var writeBatchPartDelimiter = function (boundary, close) {
- /// <summary>
- /// Creates the delimiter that indicates that start or end of an individual request.
- /// </summary>
- /// <param name="boundary" type="String" optional="false">Boundary string used to indicate the start of the request</param>
- /// <param name="close" type="Boolean">Flag indicating that a close delimiter string should be generated</param>
- /// <returns type="String">Delimiter string</returns>
-
- var result = "\r\n--" + boundary;
- if (close) {
- result += "--";
- }
-
- return result + "\r\n";
- };
-
- var writeBatchPart = function (part, context, nested) {
- /// <summary>
- /// Serializes a part of a batch request to a string. A part can be either a GET request or
- /// a change set grouping several CUD (create, update, delete) requests.
- /// </summary>
- /// <param name="part" optional="false">Request or change set object in payload representation format</param>
- /// <param name="context" optional="false">Object containing context information used for the serialization</param>
- /// <param name="nested" type="boolean" optional="true">Flag indicating that the part is nested inside a change set</param>
- /// <returns type="String">String representing the serialized part</returns>
- /// <remarks>
- /// A change set is an array of request objects and they cannot be nested inside other change sets.
- /// </remarks>
-
- var changeSet = part.__changeRequests;
- var result;
- if (isArray(changeSet)) {
- if (nested) {
- throw { message: "Not Supported: change set nested in other change set" };
- }
-
- var changeSetBoundary = createBoundary("changeset_");
- result = "Content-Type: " + batchMediaType + "; boundary=" + changeSetBoundary + "\r\n";
- var i, len;
- for (i = 0, len = changeSet.length; i < len; i++) {
- result += writeBatchPartDelimiter(changeSetBoundary, false) +
- writeBatchPart(changeSet[i], context, true);
- }
-
- result += writeBatchPartDelimiter(changeSetBoundary, true);
- } else {
- result = "Content-Type: application/http\r\nContent-Transfer-Encoding: binary\r\n\r\n";
- var partContext = extend({}, context);
- partContext.handler = handler;
- partContext.request = part;
- partContext.contentType = null;
-
- prepareRequest(part, partHandler(context), partContext);
- result += writeRequest(part);
- }
-
- return result;
- };
-
- var writeRequest = function (request) {
- /// <summary>
- /// Serializes a request object to a string.
- /// </summary>
- /// <param name="request" optional="false">Request object to serialize</param>
- /// <returns type="String">String representing the serialized request</returns>
-
- var result = (request.method ? request.method : "GET") + " " + request.requestUri + " HTTP/1.1\r\n";
- for (var name in request.headers) {
- if (request.headers[name]) {
- result = result + name + ": " + request.headers[name] + "\r\n";
- }
- }
-
- result += "\r\n";
-
- if (request.body) {
- result += request.body;
- }
-
- return result;
- };
-
- odata.batchHandler = handler(batchParser, batchSerializer, batchMediaType, MAX_DATA_SERVICE_VERSION);
-
- // DATAJS INTERNAL START
- odata.batchSerializer = batchSerializer;
- odata.writeRequest = writeRequest;
- // DATAJS INTERNAL END
-
- // CONTENT END
-})(this);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/src/odata-gml.js
----------------------------------------------------------------------
diff --git a/JSLib/src/odata-gml.js b/JSLib/src/odata-gml.js
deleted file mode 100644
index 3ddf432..0000000
--- a/JSLib/src/odata-gml.js
+++ /dev/null
@@ -1,831 +0,0 @@
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
-// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// odata-gml.js
-
-(function (window, undefined) {
-
- var datajs = window.odatajs || {};
- var odata = window.OData || {};
-
- // Imports.
-
- var contains = odatajs.contains;
- var djsassert = odatajs.djsassert;
- var http = odatajs.http;
- var isArray = odatajs.isArray;
- var xmlAppendChild = odatajs.xmlAppendChild;
- var xmlAttributeValue = odatajs.xmlAttributeValue;
- var xmlChildElements = odatajs.xmlChildElements;
- var xmlFirstChildElement = odatajs.xmlFirstChildElement;
- var xmlInnerText = odatajs.xmlInnerText;
- var xmlLocalName = odatajs.xmlLocalName;
- var xmlNamespaceURI = odatajs.xmlNamespaceURI;
- var xmlNewElement = odatajs.xmlNewElement;
- var xmlQualifiedName = odatajs.xmlQualifiedName;
- var GEOJSON_POINT = odata.GEOJSON_POINT;
- var GEOJSON_LINESTRING = odata.GEOJSON_LINESTRING;
- var GEOJSON_POLYGON = odata.GEOJSON_POLYGON;
- var GEOJSON_MULTIPOINT = odata.GEOJSON_MULTIPOINT;
- var GEOJSON_MULTILINESTRING = odata.GEOJSON_MULTILINESTRING;
- var GEOJSON_MULTIPOLYGON = odata.GEOJSON_MULTIPOLYGON;
- var GEOJSON_GEOMETRYCOLLECTION = odata.GEOJSON_GEOMETRYCOLLECTION;
-
- // CONTENT START
- var gmlOpenGis = http + "www.opengis.net"; // http://www.opengis.net
- var gmlXmlNs = gmlOpenGis + "/gml"; // http://www.opengis.net/gml
- var gmlSrsPrefix = gmlOpenGis + "/def/crs/EPSG/0/"; // http://www.opengis.net/def/crs/EPSG/0/
-
- var gmlPrefix = "gml";
-
- var gmlCreateGeoJSONOBject = function (type, member, data) {
- /// <summary>Creates a GeoJSON object with the specified type, member and value.</summary>
- /// <param name="type" type="String">GeoJSON object type.</param>
- /// <param name="member" type="String">Name for the data member in the GeoJSON object.</param>
- /// <param name="data">Data to be contained by the GeoJSON object.</param>
- /// <returns type="Object">GeoJSON object.</returns>
-
- var result = { type: type };
- result[member] = data;
- return result;
- };
-
- var gmlSwapLatLong = function (coordinates) {
- /// <summary>Swaps the longitude and latitude in the coordinates array.</summary>
- /// <param name="coordinates" type="Array">Array of doubles descrbing a set of coordinates.</param>
- /// <returns type="Array">Array of doubles with the latitude and longitude components swapped.</returns>
-
- if (isArray(coordinates) && coordinates.length >= 2) {
- var tmp = coordinates[0];
- coordinates[0] = coordinates[1];
- coordinates[1] = tmp;
- }
- return coordinates;
- };
-
- var gmlReadODataMultiItem = function (domElement, type, member, members, valueReader, isGeography) {
- /// <summary>
- /// Reads a GML DOM element that represents a composite structure like a multi-point or a
- /// multi-geometry returnig its GeoJSON representation.
- /// </summary>
- /// <param name="domElement">GML DOM element.</param>
- /// <param name="type" type="String">GeoJSON object type.</param>
- /// <param name="member" type="String">Name for the child element representing a single item in the composite structure.</param>
- /// <param name="members" type="String">Name for the child element representing a collection of items in the composite structure.</param>
- /// <param name="valueReader" type="Function">Callback function invoked to get the coordinates of each item in the comoposite structure.</param>
- /// <param name="isGeography" type="Boolean" Optional="True">Flag indicating if the value uses a geographic reference system or not.<param>
- /// <remarks>
- /// When using a geographic reference system, the first component of all the coordinates in each <pos> element in the GML DOM tree is the Latitude and
- /// will be deserialized as the second component of each <pos> element in the GML DOM tree.
- /// </remarks>
- /// <returns type="Object">GeoJSON object.</returns>
-
- var coordinates = gmlReadODataMultiItemValue(domElement, member, members, valueReader, isGeography);
- return gmlCreateGeoJSONOBject(type, "coordinates", coordinates);
- };
-
- var gmlReadODataMultiItemValue = function (domElement, member, members, valueReader, isGeography) {
- /// <summary>
- /// Reads the value of a GML DOM element that represents a composite structure like a multi-point or a
- /// multi-geometry returnig its items.
- /// </summary>
- /// <param name="domElement">GML DOM element.</param>
- /// <param name="type" type="String">GeoJSON object type.</param>
- /// <param name="member" type="String">Name for the child element representing a single item in the composite structure.</param>
- /// <param name="members" type="String">Name for the child element representing a collection of items in the composite structure.</param>
- /// <param name="valueReader" type="Function">Callback function invoked to get the transformed value of each item in the comoposite structure.</param>
- /// <param name="isGeography" type="Boolean" Optional="True">Flag indicating if the value uses a geographic reference system or not.<param>
- /// <remarks>
- /// When using a geographic reference system, the first component of all the coordinates in each <pos> element in the GML DOM tree is the Latitude and
- /// will be deserialized as the second component of each <pos> element in the GML DOM tree.
- /// </remarks>
- /// <returns type="Array">Array containing the transformed value of each item in the multi-item.</returns>
-
- var items = [];
-
- xmlChildElements(domElement, function (child) {
- if (xmlNamespaceURI(child) !== gmlXmlNs) {
- return;
- }
-
- var localName = xmlLocalName(child);
-
- if (localName === member) {
- var valueElement = xmlFirstChildElement(child, gmlXmlNs);
- if (valueElement) {
- var value = valueReader(valueElement, isGeography);
- if (value) {
- items.push(value);
- }
- }
- return;
- }
-
- if (localName === members) {
- xmlChildElements(child, function (valueElement) {
- if (xmlNamespaceURI(valueElement) !== gmlXmlNs) {
- return;
- }
-
- var value = valueReader(valueElement, isGeography);
- if (value) {
- items.push(value);
- }
- });
- }
- });
- return items;
- };
-
- var gmlReadODataCollection = function (domElement, isGeography) {
- /// <summary>Reads a GML DOM element representing a multi-geometry returning its GeoJSON representation.</summary>
- /// <param name="domElement">DOM element.</param>
- /// <param name="isGeography" type="Boolean" Optional="True">Flag indicating if the value uses a geographic reference system or not.<param>
- /// <remarks>
- /// When using a geographic reference system, the first component of all the coordinates in each <pos> element in the GML DOM tree is the Latitude and
- /// will be deserialized as the second component of each <pos> element in the GML DOM tree.
- /// </remarks>
- /// <returns type="Object">MultiGeometry object in GeoJSON format.</returns>
-
- var geometries = gmlReadODataMultiItemValue(domElement, "geometryMember", "geometryMembers", gmlReadODataSpatialValue, isGeography);
- return gmlCreateGeoJSONOBject(GEOJSON_GEOMETRYCOLLECTION, "geometries", geometries);
- };
-
- var gmlReadODataLineString = function (domElement, isGeography) {
- /// <summary>Reads a GML DOM element representing a line string returning its GeoJSON representation.</summary>
- /// <param name="domElement">DOM element.</param>
- /// <param name="isGeography" type="Boolean" Optional="True">Flag indicating if the value uses a geographic reference system or not.<param>
- /// <remarks>
- /// When using a geographic reference system, the first component of all the coordinates in each <pos> element in the GML DOM tree is the Latitude and
- /// will be deserialized as the second component of each <pos> element in the GML DOM tree.
- /// </remarks>
- /// <returns type="Object">LineString object in GeoJSON format.</returns>
-
- return gmlCreateGeoJSONOBject(GEOJSON_LINESTRING, "coordinates", gmlReadODataLineValue(domElement, isGeography));
- };
-
- var gmlReadODataMultiLineString = function (domElement, isGeography) {
- /// <summary>Reads a GML DOM element representing a multi-line string returning its GeoJSON representation.</summary>
- /// <param name="domElement">DOM element.</param>
- /// <param name="isGeography" type="Boolean" Optional="True">Flag indicating if the value uses a geographic reference system or not.<param>
- /// <remarks>
- /// When using a geographic reference system, the first component of all the coordinates in each <pos> element in the GML DOM tree is the Latitude and
- /// will be deserialized as the second component of each <pos> element in the GML DOM tree.
- /// </remarks>
- /// <returns type="Object">MultiLineString object in GeoJSON format.</returns>
-
- return gmlReadODataMultiItem(domElement, GEOJSON_MULTILINESTRING, "curveMember", "curveMembers", gmlReadODataLineValue, isGeography);
- };
-
- var gmlReadODataMultiPoint = function (domElement, isGeography) {
- /// <summary>Reads a GML DOM element representing a multi-point returning its GeoJSON representation.</summary>
- /// <param name="domElement">DOM element.</param>
- /// <param name="isGeography" type="Boolean" Optional="True">Flag indicating if the value uses a geographic reference system or not.<param>
- /// <remarks>
- /// When using a geographic reference system, the first component of all the coordinates in each <pos> element in the GML DOM tree is the Latitude and
- /// will be deserialized as the second component of each <pos> element in the GML DOM tree.
- /// </remarks>
- /// <returns type="Object">MultiPoint object in GeoJSON format.</returns>
-
- return gmlReadODataMultiItem(domElement, GEOJSON_MULTIPOINT, "pointMember", "pointMembers", gmlReadODataPointValue, isGeography);
- };
-
- var gmlReadODataMultiPolygon = function (domElement, isGeography) {
- /// <summary>Reads a GML DOM element representing a multi-polygon returning its GeoJSON representation.</summary>
- /// <param name="domElement">DOM element.</param>
- /// <param name="isGeography" type="Boolean" Optional="True">Flag indicating if the value uses a geographic reference system or not.<param>
- /// <remarks>
- /// When using a geographic reference system, the first component of all the coordinates in each <pos> element in the GML DOM tree is the Latitude and
- /// will be deserialized as the second component of each <pos> element in the GML DOM tree.
- /// </remarks>
- /// <returns type="Object">MultiPolygon object in GeoJSON format.</returns>
-
- return gmlReadODataMultiItem(domElement, GEOJSON_MULTIPOLYGON, "surfaceMember", "surfaceMembers", gmlReadODataPolygonValue, isGeography);
- };
-
- var gmlReadODataPoint = function (domElement, isGeography) {
- /// <summary>Reads a GML DOM element representing a point returning its GeoJSON representation.</summary>
- /// <param name="domElement">DOM element.</param>
- /// <param name="isGeography" type="Boolean" Optional="True">Flag indicating if the value uses a geographic reference system or not.<param>
- /// <remarks>
- /// When using a geographic reference system, the first component of all the coordinates in each <pos> element in the GML DOM tree is the Latitude and
- /// will be deserialized as the second component of each <pos> element in the GML DOM tree.
- /// </remarks>
- /// <returns type="Object">Point object in GeoJSON format.</returns>
-
- return gmlCreateGeoJSONOBject(GEOJSON_POINT, "coordinates", gmlReadODataPointValue(domElement, isGeography));
- };
-
- var gmlReadODataPolygon = function (domElement, isGeography) {
- /// <summary>Reads a GML DOM element representing a polygon returning its GeoJSON representation.</summary>
- /// <param name="domElement">DOM element.</param>
- /// <param name="isGeography" type="Boolean" Optional="True">Flag indicating if the value uses a geographic reference system or not.<param>
- /// <remarks>
- /// When using a geographic reference system, the first component of all the coordinates in each <pos> element in the GML DOM tree is the Latitude and
- /// will be deserialized as the second component of each <pos> element in the GML DOM tree.
- /// </remarks>
- /// <returns type="Object">Polygon object in GeoJSON format.</returns>
-
- return gmlCreateGeoJSONOBject(GEOJSON_POLYGON, "coordinates", gmlReadODataPolygonValue(domElement, isGeography));
- };
-
- var gmlReadODataLineValue = function (domElement, isGeography) {
- /// <summary>Reads the value of a GML DOM element representing a line returning its set of coordinates.</summary>
- /// <param name="domElement">DOM element.</param>
- /// <param name="isGeography" type="Boolean" Optional="True">Flag indicating if the value uses a geographic reference system or not.<param>
- /// <remarks>
- /// When using a geographic reference system, the first component of all the coordinates in each <pos> element in the GML DOM tree is the Latitude and
- /// will be deserialized as the second component of each <pos> element in the GML DOM tree.
- /// </remarks>
- /// <returns type="Array">Array containing an array of doubles for each coordinate of the line.</returns>
-
- var coordinates = [];
-
- xmlChildElements(domElement, function (child) {
- var nsURI = xmlNamespaceURI(child);
-
- if (nsURI !== gmlXmlNs) {
- return;
- }
-
- var localName = xmlLocalName(child);
-
- if (localName === "posList") {
- coordinates = gmlReadODataPosListValue(child, isGeography);
- return;
- }
- if (localName === "pointProperty") {
- coordinates.push(gmlReadODataPointWrapperValue(child, isGeography));
- return;
- }
- if (localName === "pos") {
- coordinates.push(gmlReadODataPosValue(child, isGeography));
- return;
- }
- });
-
- return coordinates;
- };
-
- var gmlReadODataPointValue = function (domElement, isGeography) {
- /// <summary>Reads the value of a GML DOM element representing a point returning its coordinates.</summary>
- /// <param name="domElement">DOM element.</param>
- /// <param name="isGeography" type="Boolean" Optional="True">Flag indicating if the value uses a geographic reference system or not.<param>
- /// <remarks>
- /// When using a geographic reference system, the first component of all the coordinates in each <pos> element in the GML DOM tree is the Latitude and
- /// will be deserialized as the second component of each <pos> element in the GML DOM tree.
- /// </remarks>
- /// <returns type="Array">Array of doubles containing the point coordinates.</returns>
-
- var pos = xmlFirstChildElement(domElement, gmlXmlNs, "pos");
- return pos ? gmlReadODataPosValue(pos, isGeography) : [];
- };
-
- var gmlReadODataPointWrapperValue = function (domElement, isGeography) {
- /// <summary>Reads the value of a GML DOM element wrapping an element representing a point returning its coordinates.</summary>
- /// <param name="domElement">DOM element.</param>
- /// <param name="isGeography" type="Boolean" Optional="True">Flag indicating if the value uses a geographic reference system or not.<param>
- /// <remarks>
- /// When using a geographic reference system, the first component of all the coordinates in each <pos> element in the GML DOM tree is the Latitude and
- /// will be deserialized as the second component of each <pos> element in the GML DOM tree.
- /// </remarks>
- /// <returns type="Array">Array of doubles containing the point coordinates.</returns>
-
- var point = xmlFirstChildElement(domElement, gmlXmlNs, "Point");
- return point ? gmlReadODataPointValue(point, isGeography) : [];
- };
-
- var gmlReadODataPolygonValue = function (domElement, isGeography) {
- /// <summary>Reads the value of a GML DOM element representing a polygon returning its set of coordinates.</summary>
- /// <param name="domElement">DOM element.</param>
- /// <param name="isGeography" type="Boolean" Optional="True">Flag indicating if the value uses a geographic reference system or not.<param>
- /// <remarks>
- /// When using a geographic reference system, the first component of all the coordinates in each <pos> element in the GML DOM tree is the Latitude and
- /// will be deserialized as the second component of each <pos> element in the GML DOM tree.
- /// </remarks>
- /// <returns type="Array">Array containing an array of array of doubles for each ring of the polygon.</returns>
-
- var coordinates = [];
- var exteriorFound = false;
- xmlChildElements(domElement, function (child) {
- if (xmlNamespaceURI(child) !== gmlXmlNs) {
- return;
- }
-
- // Only the exterior and the interior rings are interesting
- var localName = xmlLocalName(child);
- if (localName === "exterior") {
- exteriorFound = true;
- coordinates.unshift(gmlReadODataPolygonRingValue(child, isGeography));
- return;
- }
- if (localName === "interior") {
- coordinates.push(gmlReadODataPolygonRingValue(child, isGeography));
- return;
- }
- });
-
- if (!exteriorFound && coordinates.length > 0) {
- // Push an empty exterior ring.
- coordinates.unshift([[]]);
- }
-
- return coordinates;
- };
-
- var gmlReadODataPolygonRingValue = function (domElement, isGeography) {
- /// <summary>Reads the value of a GML DOM element representing a linear ring in a GML Polygon element.</summary>
- /// <param name="domElement">DOM element.</param>
- /// <param name="isGeography" type="Boolean" Optional="True">Flag indicating if the value uses a geographic reference system or not.<param>
- /// <remarks>
- /// When using a geographic reference system, the first component of all the coordinates in each <pos> element in the GML DOM tree is the Latitude and
- /// will be deserialized as the second component of each <pos> element in the GML DOM tree.
- /// </remarks>
- /// <returns type="Array">Array containing an array of doubles for each coordinate of the linear ring.</returns>
-
- var value = [];
- xmlChildElements(domElement, function (child) {
- if (xmlNamespaceURI(child) !== gmlXmlNs || xmlLocalName(child) !== "LinearRing") {
- return;
- }
- value = gmlReadODataLineValue(child, isGeography);
- });
- return value;
- };
-
- var gmlReadODataPosListValue = function (domElement, isGeography) {
- /// <summary>Reads the value of a GML DOM element representing a list of positions retruning its set of coordinates.</summary>
- /// <param name="domElement">DOM element.</param>
- /// <param name="isGeography" type="Boolean" Optional="True">Flag indicating if the value uses a geographic reference system or not.<param>
- /// <remarks>
- /// When using a geographic reference system, the first component of all the coordinates in each <pos> element in the GML DOM tree is the Latitude and
- /// will be deserialized as the second component of each <pos> element in the GML DOM tree.
- ///
- /// The positions described by the list are assumed to be 2D, so
- /// an exception will be thrown if the list has an odd number elements.
- /// </remarks>
- /// <returns type="Array">Array containing an array of doubles for each coordinate in the list.</returns>
-
- var coordinates = gmlReadODataPosValue(domElement, false);
- var len = coordinates.length;
-
- if (len % 2 !== 0) {
- throw { message: "GML posList element has an uneven number of numeric values" };
- }
-
- var value = [];
- for (var i = 0; i < len; i += 2) {
- var pos = coordinates.slice(i, i + 2);
- value.push(isGeography ? gmlSwapLatLong(pos) : pos);
- }
- return value;
- };
-
- var gmlReadODataPosValue = function (domElement, isGeography) {
- /// <summary>Reads the value of a GML element describing a position or a set of coordinates in an OData spatial property value.</summary>
- /// <param name="property">DOM element for the GML element.</param>
- /// <param name="isGeography" type="Boolean" Optional="True">Flag indicating if the value uses a geographic reference system or not.<param>
- /// <remarks>
- /// When using a geographic reference system, the first component of all the coordinates in each <pos> element in the GML DOM tree is the Latitude and
- /// will be deserialized as the second component of each <pos> element in the GML DOM tree.
- /// </remarks>
- /// <returns type="Array">Array of doubles containing the coordinates.</returns>
-
- var value = [];
- var delims = " \t\r\n";
- var text = xmlInnerText(domElement);
-
- if (text) {
- var len = text.length;
- var start = 0;
- var end = 0;
-
- while (end <= len) {
- if (delims.indexOf(text.charAt(end)) !== -1) {
- var coord = text.substring(start, end);
- if (coord) {
- value.push(parseFloat(coord));
- }
- start = end + 1;
- }
- end++;
- }
- }
-
- return isGeography ? gmlSwapLatLong(value) : value;
- };
-
- var gmlReadODataSpatialValue = function (domElement, isGeography) {
- /// <summary>Reads the value of a GML DOM element a spatial value in an OData XML document.</summary>
- /// <param name="domElement">DOM element.</param>
- /// <param name="isGeography" type="Boolean" Optional="True">Flag indicating if the value uses a geographic reference system or not.<param>
- /// <remarks>
- /// When using a geographic reference system, the first component of all the coordinates in each <pos> element in the GML DOM tree is the Latitude and
- /// will be deserialized as the second component of each position coordinates in the resulting GeoJSON object.
- /// </remarks>
- /// <returns type="Array">Array containing an array of doubles for each coordinate of the polygon.</returns>
-
- var localName = xmlLocalName(domElement);
- var reader;
-
- switch (localName) {
- case "Point":
- reader = gmlReadODataPoint;
- break;
- case "Polygon":
- reader = gmlReadODataPolygon;
- break;
- case "LineString":
- reader = gmlReadODataLineString;
- break;
- case "MultiPoint":
- reader = gmlReadODataMultiPoint;
- break;
- case "MultiCurve":
- reader = gmlReadODataMultiLineString;
- break;
- case "MultiSurface":
- reader = gmlReadODataMultiPolygon;
- break;
- case "MultiGeometry":
- reader = gmlReadODataCollection;
- break;
- default:
- throw { message: "Unsupported element: " + localName, element: domElement };
- }
-
- var value = reader(domElement, isGeography);
- // Read the CRS
- // WCF Data Services qualifies the srsName attribute withing the GML namespace; however
- // other end points might no do this as per the standard.
-
- var srsName = xmlAttributeValue(domElement, "srsName", gmlXmlNs) ||
- xmlAttributeValue(domElement, "srsName");
-
- if (srsName) {
- if (srsName.indexOf(gmlSrsPrefix) !== 0) {
- throw { message: "Unsupported srs name: " + srsName, element: domElement };
- }
-
- var crsId = srsName.substring(gmlSrsPrefix.length);
- if (crsId) {
- value.crs = {
- type: "name",
- properties: {
- name: "EPSG:" + crsId
- }
- };
- }
- }
- return value;
- };
-
- var gmlNewODataSpatialValue = function (dom, value, type, isGeography) {
- /// <summary>Creates a new GML DOM element for the value of an OData spatial property or GeoJSON object.</summary>
- /// <param name="dom">DOM document used for creating the new DOM Element.</param>
- /// <param name="value" type="Object">Spatial property value in GeoJSON format.</param>
- /// <param name="type" type="String">String indicating the GeoJSON type of the value to serialize.</param>
- /// <param name="isGeography" type="Boolean" Optional="True">Flag indicating if the value uses a geographic reference system or not.<param>
- /// <remarks>
- /// When using a geographic reference system, the first component of all the coordinates in the GeoJSON value is the Longitude and
- /// will be serialized as the second component of each <pos> element in the GML DOM tree.
- /// </remarks>
- /// <returns>New DOM element in the GML namespace for the spatial value. </returns>
-
- var gmlWriter;
-
- switch (type) {
- case GEOJSON_POINT:
- gmlWriter = gmlNewODataPoint;
- break;
- case GEOJSON_LINESTRING:
- gmlWriter = gmlNewODataLineString;
- break;
- case GEOJSON_POLYGON:
- gmlWriter = gmlNewODataPolygon;
- break;
- case GEOJSON_MULTIPOINT:
- gmlWriter = gmlNewODataMultiPoint;
- break;
- case GEOJSON_MULTILINESTRING:
- gmlWriter = gmlNewODataMultiLineString;
- break;
- case GEOJSON_MULTIPOLYGON:
- gmlWriter = gmlNewODataMultiPolygon;
- break;
- case GEOJSON_GEOMETRYCOLLECTION:
- gmlWriter = gmlNewODataGeometryCollection;
- break;
- default:
- djsassert(false, "gmlNewODataSpatialValue - Unknown GeoJSON type <" + type + ">!!");
- return null;
- }
-
- var gml = gmlWriter(dom, value, isGeography);
-
- // Set the srsName attribute if applicable.
- var crs = value.crs;
- if (crs) {
- if (crs.type === "name") {
- var properties = crs.properties;
- var name = properties && properties.name;
- if (name && name.indexOf("ESPG:") === 0 && name.length > 5) {
- var crsId = name.substring(5);
- var srsName = xmlNewAttribute(dom, null, "srsName", gmlPrefix + crsId);
- xmlAppendChild(gml, srsName);
- }
- }
- }
-
- return gml;
- };
-
- var gmlNewODataElement = function (dom, name, children) {
- /// <summary>Creates a new DOM element in the GML namespace.</summary>
- /// <param name="dom">DOM document used for creating the new DOM Element.</param>
- /// <param name="name" type="String">Local name of the GML element to create.</param>
- /// <param name="children" type="Array">Array containing DOM nodes or string values that will be added as children of the new DOM element.</param>
- /// <returns>New DOM element in the GML namespace.</returns>
- /// <remarks>
- /// If a value in the children collection is a string, then a new DOM text node is going to be created
- /// for it and then appended as a child of the new DOM Element.
- /// </remarks>
-
- return xmlNewElement(dom, gmlXmlNs, xmlQualifiedName(gmlPrefix, name), children);
- };
-
- var gmlNewODataPosElement = function (dom, coordinates, isGeography) {
- /// <summary>Creates a new GML pos DOM element.</summary>
- /// <param name="dom">DOM document used for creating the new DOM Element.</param>
- /// <param name="coordinates" type="Array">Array of doubles describing the coordinates of the pos element.</param>
- /// <param name="isGeography" type="Boolean">Flag indicating if the coordinates use a geographic reference system or not.<param>
- /// <remarks>
- /// When using a geographic reference system, the first coordinate is the Longitude and
- /// will be serialized as the second component of the <pos> element in the GML DOM tree.
- /// </remarks>
- /// <returns>New pos DOM element in the GML namespace.</returns>
-
- var posValue = isArray(coordinates) ? coordinates : [];
-
- // If using a geographic reference system, then the first coordinate is the longitude and it has to
- // swapped with the latitude.
- posValue = isGeography ? gmlSwapLatLong(posValue) : posValue;
-
- return gmlNewODataElement(dom, "pos", posValue.join(" "));
- };
-
- var gmlNewODataLineElement = function (dom, name, coordinates, isGeography) {
- /// <summary>Creates a new GML DOM element representing a line.</summary>
- /// <param name="dom">DOM document used for creating the new DOM Element.</param>
- /// <param name="name" type="String">Name of the element to create.</param>
- /// <param name="coordinates" type="Array">Array of array of doubles describing the coordinates of the line element.</param>
- /// <param name="isGeography" type="Boolean">Flag indicating if the coordinates use a geographic reference system or not.<param>
- /// <remarks>
- /// When using a geographic reference system, the first component of all the coordinates is the Longitude and
- /// will be serialized as the second component of each <pos> element in the GML DOM tree.
- /// </remarks>
- /// <returns>New DOM element in the GML namespace.</returns>
-
- var element = gmlNewODataElement(dom, name);
- if (isArray(coordinates)) {
- var i, len;
- for (i = 0, len = coordinates.length; i < len; i++) {
- xmlAppendChild(element, gmlNewODataPosElement(dom, coordinates[i], isGeography));
- }
-
- if (len === 0) {
- xmlAppendChild(element, gmlNewODataElement(dom, "posList"));
- }
- }
- return element;
- };
-
- var gmlNewODataPointElement = function (dom, coordinates, isGeography) {
- /// <summary>Creates a new GML Point DOM element.</summary>
- /// <param name="dom">DOM document used for creating the new DOM Element.</param>
- /// <param name="value" type="Object">GeoJSON Point object.</param>
- /// <param name="isGeography" type="Boolean">Flag indicating if the value uses a geographic reference system or not.<param>
- /// <remarks>
- /// When using a geographic reference system, the first component of all the coordinates in the GeoJSON value is the Longitude and
- /// will be serialized as the second component of each <pos> element in the GML DOM tree.
- /// </remarks>
- /// <returns>New DOM element in the GML namespace for the GeoJSON Point.</returns>
-
- return gmlNewODataElement(dom, "Point", gmlNewODataPosElement(dom, coordinates, isGeography));
- };
-
- var gmlNewODataLineStringElement = function (dom, coordinates, isGeography) {
- /// <summary>Creates a new GML LineString DOM element.</summary>
- /// <param name="dom">DOM document used for creating the new DOM Element.</param>
- /// <param name="coordinates" type="Array">Array of array of doubles describing the coordinates of the line element.</param>
- /// <param name="isGeography" type="Boolean">Flag indicating if the value uses a geographic reference system or not.<param>
- /// <remarks>
- /// When using a geographic reference system, the first component of all the coordinates in the GeoJSON value is the Longitude and
- /// will be serialized as the second component of each <pos> element in the GML DOM tree.
- /// </remarks>
- /// <returns>New DOM element in the GML namespace for the GeoJSON LineString.</returns>
-
- return gmlNewODataLineElement(dom, "LineString", coordinates, isGeography);
- };
-
- var gmlNewODataPolygonRingElement = function (dom, name, coordinates, isGeography) {
- /// <summary>Creates a new GML DOM element representing a polygon ring.</summary>
- /// <param name="dom">DOM document used for creating the new DOM Element.</param>
- /// <param name="name" type="String">Name of the element to create.</param>
- /// <param name="coordinates" type="Array">Array of array of doubles describing the coordinates of the polygon ring.</param>
- /// <param name="isGeography" type="Boolean">Flag indicating if the coordinates use a geographic reference system or not.<param>
- /// <remarks>
- /// When using a geographic reference system, the first component of all the coordinates is the Longitude and
- /// will be serialized as the second component of each <pos> element in the GML DOM tree.
- /// </remarks>
- /// <returns>New DOM element in the GML namespace.</returns>
-
- var ringElement = gmlNewODataElement(dom, name);
- if (isArray(coordinates) && coordinates.length > 0) {
- var linearRing = gmlNewODataLineElement(dom, "LinearRing", coordinates, isGeography);
- xmlAppendChild(ringElement, linearRing);
- }
- return ringElement;
- };
-
- var gmlNewODataPolygonElement = function (dom, coordinates, isGeography) {
- /// <summary>Creates a new GML Polygon DOM element for a GeoJSON Polygon object.</summary>
- /// <param name="dom">DOM document used for creating the new DOM Element.</param>
- /// <param name="coordinates" type="Array">Array of array of array of doubles describing the coordinates of the polygon.</param>
- /// <param name="isGeography" type="Boolean">Flag indicating if the value uses a geographic reference system or not.<param>
- /// <remarks>
- /// When using a geographic reference system, the first component of all the coordinates in the GeoJSON value is the Longitude and
- /// will be serialized as the second component of each <pos> element in the GML DOM tree.
- /// </remarks>
- /// <returns>New DOM element in the GML namespace.</returns>
-
- var len = coordinates && coordinates.length;
- var element = gmlNewODataElement(dom, "Polygon");
-
- if (isArray(coordinates) && len > 0) {
- xmlAppendChild(element, gmlNewODataPolygonRingElement(dom, "exterior", coordinates[0], isGeography));
-
- var i;
- for (i = 1; i < len; i++) {
- xmlAppendChild(element, gmlNewODataPolygonRingElement(dom, "interior", coordinates[i], isGeography));
- }
- }
- return element;
- };
-
- var gmlNewODataPoint = function (dom, value, isGeography) {
- /// <summary>Creates a new GML Point DOM element for a GeoJSON Point object.</summary>
- /// <param name="dom">DOM document used for creating the new DOM Element.</param>
- /// <param name="value" type="Object">GeoJSON Point object.</param>
- /// <param name="isGeography" type="Boolean">Flag indicating if the value uses a geographic reference system or not.<param>
- /// <remarks>
- /// When using a geographic reference system, the first component of all the coordinates in the GeoJSON value is the Longitude and
- /// will be serialized as the second component of each <pos> element in the GML DOM tree.
- /// </remarks>
- /// <returns>New DOM element in the GML namespace for the GeoJSON Point.</returns>
-
- return gmlNewODataPointElement(dom, value.coordinates, isGeography);
- };
-
- var gmlNewODataLineString = function (dom, value, isGeography) {
- /// <summary>Creates a new GML LineString DOM element for a GeoJSON LineString object.</summary>
- /// <param name="dom">DOM document used for creating the new DOM Element.</param>
- /// <param name="value" type="Object">GeoJSON LineString object.</param>
- /// <param name="isGeography" type="Boolean">Flag indicating if the value uses a geographic reference system or not.<param>
- /// <remarks>
- /// When using a geographic reference system, the first component of all the coordinates in the GeoJSON value is the Longitude and
- /// will be serialized as the second component of each <pos> element in the GML DOM tree.
- /// </remarks>
- /// <returns>New DOM element in the GML namespace for the GeoJSON LineString.</returns>
-
- return gmlNewODataLineStringElement(dom, value.coordinates, isGeography);
- };
-
- var gmlNewODataPolygon = function (dom, value, isGeography) {
- /// <summary>Creates a new GML Polygon DOM element for a GeoJSON Polygon object.</summary>
- /// <param name="dom">DOM document used for creating the new DOM Element.</param>
- /// <param name="value" type="Object">GeoJSON Polygon object.</param>
- /// <param name="isGeography" type="Boolean">Flag indicating if the value uses a geographic reference system or not.<param>
- /// <remarks>
- /// When using a geographic reference system, the first component of all the coordinates in the GeoJSON value is the Longitude and
- /// will be serialized as the second component of each <pos> element in the GML DOM tree.
- /// </remarks>
- /// <returns>New DOM element in the GML namespace for the GeoJSON Polygon.</returns>
-
- return gmlNewODataPolygonElement(dom, value.coordinates, isGeography);
- };
-
- var gmlNewODataMultiItem = function (dom, name, members, items, itemWriter, isGeography) {
- /// <summary>Creates a new GML DOM element for a composite structure like a multi-point or a multi-geometry.</summary>
- /// <param name="dom">DOM document used for creating the new DOM Element.</param>
- /// <param name="name" type="String">Name of the element to create.</param>
- /// <param name="items" type="Array">Array of items in the composite structure.</param>
- /// <param name="isGeography" type="Boolean">Flag indicating if the multi-item uses a geographic reference system or not.<param>
- /// <remarks>
- /// When using a geographic reference system, the first component of all the coordinates in each of the items is the Longitude and
- /// will be serialized as the second component of each <pos> element in the GML DOM tree.
- /// </remarks>
- /// <returns>New DOM element in the GML namespace.</returns>
-
- var len = items && items.length;
- var element = gmlNewODataElement(dom, name);
-
- if (isArray(items) && len > 0) {
- var membersElement = gmlNewODataElement(dom, members);
- var i;
- for (i = 0; i < len; i++) {
- xmlAppendChild(membersElement, itemWriter(dom, items[i], isGeography));
- }
- xmlAppendChild(element, membersElement);
- }
- return element;
- };
-
- var gmlNewODataMultiPoint = function (dom, value, isGeography) {
- /// <summary>Creates a new GML MultiPoint DOM element for a GeoJSON MultiPoint object.</summary>
- /// <param name="dom">DOM document used for creating the new DOM Element.</param>
- /// <param name="value" type="Object">GeoJSON MultiPoint object.</param>
- /// <param name="isGeography" type="Boolean">Flag indicating if the value uses a geographic reference system or not.<param>
- /// <remarks>
- /// When using a geographic reference system, the first component of all the coordinates in the GeoJSON value is the Longitude and
- /// will be serialized as the second component of each <pos> element in the GML DOM tree.
- /// </remarks>
- /// <returns>New DOM element in the GML namespace for the GeoJSON MultiPoint.</returns>
-
- return gmlNewODataMultiItem(dom, "MultiPoint", "pointMembers", value.coordinates, gmlNewODataPointElement, isGeography);
- };
-
- var gmlNewODataMultiLineString = function (dom, value, isGeography) {
- /// <summary>Creates a new GML MultiCurve DOM element for a GeoJSON MultiLineString object.</summary>
- /// <param name="dom">DOM document used for creating the new DOM Element.</param>
- /// <param name="value" type="Object">GeoJSON MultiLineString object.</param>
- /// <param name="isGeography" type="Boolean">Flag indicating if the value uses a geographic reference system or not.<param>
- /// <remarks>
- /// When using a geographic reference system, the first component of all the coordinates in the GeoJSON value is the Longitude and
- /// will be serialized as the second component of each <pos> element in the GML DOM tree.
- /// </remarks>
- /// <returns>New DOM element in the GML namespace for the GeoJSON MultiLineString.</returns>
-
- return gmlNewODataMultiItem(dom, "MultiCurve", "curveMembers", value.coordinates, gmlNewODataLineStringElement, isGeography);
- };
-
- var gmlNewODataMultiPolygon = function (dom, value, isGeography) {
- /// <summary>Creates a new GML MultiSurface DOM element for a GeoJSON MultiPolygon object.</summary>
- /// <param name="dom">DOM document used for creating the new DOM Element.</param>
- /// <param name="value" type="Object">GeoJSON MultiPolygon object.</param>
- /// <param name="isGeography" type="Boolean">Flag indicating if the value uses a geographic reference system or not.<param>
- /// <remarks>
- /// When using a geographic reference system, the first component of all the coordinates in the GeoJSON value is the Longitude and
- /// will be serialized as the second component of each <pos> element in the GML DOM tree.
- /// </remarks>
- /// <returns>New DOM element in the GML namespace for the GeoJSON MultiPolygon.</returns>
-
- return gmlNewODataMultiItem(dom, "MultiSurface", "surfaceMembers", value.coordinates, gmlNewODataPolygonElement, isGeography);
- };
-
- var gmlNewODataGeometryCollectionItem = function (dom, value, isGeography) {
- /// <summary>Creates a new GML element for an item in a geometry collection object.</summary>
- /// <param name="dom">DOM document used for creating the new DOM Element.</param>
- /// <param name="item" type="Object">GeoJSON object in the geometry collection.</param>
- /// <param name="isGeography" type="Boolean">Flag indicating if the value uses a geographic reference system or not.<param>
- /// <remarks>
- /// When using a geographic reference system, the first component of all the coordinates in the GeoJSON value is the Longitude and
- /// will be serialized as the second component of each <pos> element in the GML DOM tree.
- /// </remarks>
- /// <returns>New DOM element in the GML namespace.</returns>
-
- return gmlNewODataSpatialValue(dom, value, value.type, isGeography);
- };
-
- var gmlNewODataGeometryCollection = function (dom, value, isGeography) {
- /// <summary>Creates a new GML MultiGeometry DOM element for a GeoJSON GeometryCollection object.</summary>
- /// <param name="dom">DOM document used for creating the new DOM Element.</param>
- /// <param name="value" type="Object">GeoJSON GeometryCollection object.</param>
- /// <param name="isGeography" type="Boolean">Flag indicating if the value uses a geographic reference system or not.<param>
- /// <remarks>
- /// When using a geographic reference system, the first component of all the coordinates in the GeoJSON value is the Longitude and
- /// will be serialized as the second component of each <pos> element in the GML DOM tree.
- /// </remarks>
- /// <returns>New DOM element in the GML namespace for the GeoJSON GeometryCollection.</returns>
-
- return gmlNewODataMultiItem(dom, "MultiGeometry", "geometryMembers", value.geometries, gmlNewODataGeometryCollectionItem, isGeography);
- };
-
- // DATAJS INTERNAL START
- odata.gmlNewODataSpatialValue = gmlNewODataSpatialValue;
- odata.gmlReadODataSpatialValue = gmlReadODataSpatialValue;
- odata.gmlXmlNs = gmlXmlNs;
- // DATAJS INTERNAL END
-
- // CONTENT END
-})(this);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/src/odata-handler.js
----------------------------------------------------------------------
diff --git a/JSLib/src/odata-handler.js b/JSLib/src/odata-handler.js
deleted file mode 100644
index fa79197..0000000
--- a/JSLib/src/odata-handler.js
+++ /dev/null
@@ -1,276 +0,0 @@
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
-// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// odata-handler.js
-
-(function (window, undefined) {
-
- var datajs = window.odatajs || {};
- var odata = window.OData || {};
-
- // Imports.
- var assigned = odatajs.assigned;
- var extend = odatajs.extend;
- var trimString = odatajs.trimString;
-
- var maxVersion = odata.maxVersion;
-
- // CONTENT START
-
- var MAX_DATA_SERVICE_VERSION = "4.0";
-
- var contentType = function (str) {
- /// <summary>Parses a string into an object with media type and properties.</summary>
- /// <param name="str" type="String">String with media type to parse.</param>
- /// <returns>null if the string is empty; an object with 'mediaType' and a 'properties' dictionary otherwise.</returns>
-
- if (!str) {
- return null;
- }
-
- var contentTypeParts = str.split(";");
- var properties = {};
-
- var i, len;
- for (i = 1, len = contentTypeParts.length; i < len; i++) {
- var contentTypeParams = contentTypeParts[i].split("=");
- properties[trimString(contentTypeParams[0])] = contentTypeParams[1];
- }
-
- return { mediaType: trimString(contentTypeParts[0]), properties: properties };
- };
-
- var contentTypeToString = function (contentType) {
- /// <summary>Serializes an object with media type and properties dictionary into a string.</summary>
- /// <param name="contentType">Object with media type and properties dictionary to serialize.</param>
- /// <returns>String representation of the media type object; undefined if contentType is null or undefined.</returns>
-
- if (!contentType) {
- return undefined;
- }
-
- var result = contentType.mediaType;
- var property;
- for (property in contentType.properties) {
- result += ";" + property + "=" + contentType.properties[property];
- }
- return result;
- };
-
- var createReadWriteContext = function (contentType, dataServiceVersion, context, handler) {
- /// <summary>Creates an object that is going to be used as the context for the handler's parser and serializer.</summary>
- /// <param name="contentType">Object with media type and properties dictionary.</param>
- /// <param name="dataServiceVersion" type="String">String indicating the version of the protocol to use.</param>
- /// <param name="context">Operation context.</param>
- /// <param name="handler">Handler object that is processing a resquest or response.</param>
- /// <returns>Context object.</returns>
-
- var rwContext = {};
- extend(rwContext, context);
- extend(rwContext, {
- contentType: contentType,
- dataServiceVersion: dataServiceVersion,
- handler: handler
- });
-
- return rwContext;
- };
-
- var fixRequestHeader = function (request, name, value) {
- /// <summary>Sets a request header's value. If the header has already a value other than undefined, null or empty string, then this method does nothing.</summary>
- /// <param name="request">Request object on which the header will be set.</param>
- /// <param name="name" type="String">Header name.</param>
- /// <param name="value" type="String">Header value.</param>
- if (!request) {
- return;
- }
-
- var headers = request.headers;
- if (!headers[name]) {
- headers[name] = value;
- }
- };
-
- var fixDataServiceVersionHeader = function (request, version) {
- /// <summary>Sets the DataServiceVersion header of the request if its value is not yet defined or of a lower version.</summary>
- /// <param name="request">Request object on which the header will be set.</param>
- /// <param name="version" type="String">Version value.</param>
- /// <remarks>
- /// If the request has already a version value higher than the one supplied the this function does nothing.
- /// </remarks>
-
- if (request) {
- var headers = request.headers;
- var dsv = headers["OData-Version"];
- headers["OData-Version"] = dsv ? maxVersion(dsv, version) : version;
- }
- };
-
- var getRequestOrResponseHeader = function (requestOrResponse, name) {
- /// <summary>Gets the value of a request or response header.</summary>
- /// <param name="requestOrResponse">Object representing a request or a response.</param>
- /// <param name="name" type="String">Name of the header to retrieve.</param>
- /// <returns type="String">String value of the header; undefined if the header cannot be found.</returns>
-
- var headers = requestOrResponse.headers;
- return (headers && headers[name]) || undefined;
- };
-
- var getContentType = function (requestOrResponse) {
- /// <summary>Gets the value of the Content-Type header from a request or response.</summary>
- /// <param name="requestOrResponse">Object representing a request or a response.</param>
- /// <returns type="Object">Object with 'mediaType' and a 'properties' dictionary; null in case that the header is not found or doesn't have a value.</returns>
-
- return contentType(getRequestOrResponseHeader(requestOrResponse, "Content-Type"));
- };
-
- var versionRE = /^\s?(\d+\.\d+);?.*$/;
- var getDataServiceVersion = function (requestOrResponse) {
- /// <summary>Gets the value of the DataServiceVersion header from a request or response.</summary>
- /// <param name="requestOrResponse">Object representing a request or a response.</param>
- /// <returns type="String">Data service version; undefined if the header cannot be found.</returns>
-
- var value = getRequestOrResponseHeader(requestOrResponse, "OData-Version");
- if (value) {
- var matches = versionRE.exec(value);
- if (matches && matches.length) {
- return matches[1];
- }
- }
-
- // Fall through and return undefined.
- };
-
- var handlerAccepts = function (handler, cType) {
- /// <summary>Checks that a handler can process a particular mime type.</summary>
- /// <param name="handler">Handler object that is processing a resquest or response.</param>
- /// <param name="cType">Object with 'mediaType' and a 'properties' dictionary.</param>
- /// <returns type="Boolean">True if the handler can process the mime type; false otherwise.</returns>
-
- // The following check isn't as strict because if cType.mediaType = application/; it will match an accept value of "application/xml";
- // however in practice we don't not expect to see such "suffixed" mimeTypes for the handlers.
- return handler.accept.indexOf(cType.mediaType) >= 0;
- };
-
- var handlerRead = function (handler, parseCallback, response, context) {
- /// <summary>Invokes the parser associated with a handler for reading the payload of a HTTP response.</summary>
- /// <param name="handler">Handler object that is processing the response.</param>
- /// <param name="parseCallback" type="Function">Parser function that will process the response payload.</param>
- /// <param name="response">HTTP response whose payload is going to be processed.</param>
- /// <param name="context">Object used as the context for processing the response.</param>
- /// <returns type="Boolean">True if the handler processed the response payload and the response.data property was set; false otherwise.</returns>
-
- if (!response || !response.headers) {
- return false;
- }
-
- var cType = getContentType(response);
- var version = getDataServiceVersion(response) || "";
- var body = response.body;
-
- if (!assigned(body)) {
- return false;
- }
-
- if (handlerAccepts(handler, cType)) {
- var readContext = createReadWriteContext(cType, version, context, handler);
- readContext.response = response;
- response.data = parseCallback(handler, body, readContext);
- return response.data !== undefined;
- }
-
- return false;
- };
-
- var handlerWrite = function (handler, serializeCallback, request, context) {
- /// <summary>Invokes the serializer associated with a handler for generating the payload of a HTTP request.</summary>
- /// <param name="handler">Handler object that is processing the request.</param>
- /// <param name="serializeCallback" type="Function">Serializer function that will generate the request payload.</param>
- /// <param name="response">HTTP request whose payload is going to be generated.</param>
- /// <param name="context">Object used as the context for serializing the request.</param>
- /// <returns type="Boolean">True if the handler serialized the request payload and the request.body property was set; false otherwise.</returns>
- if (!request || !request.headers) {
- return false;
- }
-
- var cType = getContentType(request);
- var version = getDataServiceVersion(request);
-
- if (!cType || handlerAccepts(handler, cType)) {
- var writeContext = createReadWriteContext(cType, version, context, handler);
- writeContext.request = request;
-
- request.body = serializeCallback(handler, request.data, writeContext);
-
- if (request.body !== undefined) {
- fixDataServiceVersionHeader(request, writeContext.dataServiceVersion || "4.0");
-
- fixRequestHeader(request, "Content-Type", contentTypeToString(writeContext.contentType));
- fixRequestHeader(request, "OData-MaxVersion", handler.maxDataServiceVersion);
- return true;
- }
- }
-
- return false;
- };
-
- var handler = function (parseCallback, serializeCallback, accept, maxDataServiceVersion) {
- /// <summary>Creates a handler object for processing HTTP requests and responses.</summary>
- /// <param name="parseCallback" type="Function">Parser function that will process the response payload.</param>
- /// <param name="serializeCallback" type="Function">Serializer function that will generate the request payload.</param>
- /// <param name="accept" type="String">String containing a comma separated list of the mime types that this handler can work with.</param>
- /// <param name="maxDataServiceVersion" type="String">String indicating the highest version of the protocol that this handler can work with.</param>
- /// <returns type="Object">Handler object.</returns>
-
- return {
- accept: accept,
- maxDataServiceVersion: maxDataServiceVersion,
-
- read: function (response, context) {
- return handlerRead(this, parseCallback, response, context);
- },
-
- write: function (request, context) {
- return handlerWrite(this, serializeCallback, request, context);
- }
- };
- };
-
- var textParse = function (handler, body /*, context */) {
- return body;
- };
-
- var textSerialize = function (handler, data /*, context */) {
- if (assigned(data)) {
- return data.toString();
- } else {
- return undefined;
- }
- };
-
- odata.textHandler = handler(textParse, textSerialize, "text/plain", MAX_DATA_SERVICE_VERSION);
-
- // DATAJS INTERNAL START
- odata.contentType = contentType;
- odata.contentTypeToString = contentTypeToString;
- odata.handler = handler;
- odata.createReadWriteContext = createReadWriteContext;
- odata.fixRequestHeader = fixRequestHeader;
- odata.getRequestOrResponseHeader = getRequestOrResponseHeader;
- odata.getContentType = getContentType;
- odata.getDataServiceVersion = getDataServiceVersion;
- odata.MAX_DATA_SERVICE_VERSION = MAX_DATA_SERVICE_VERSION;
- // DATAJS INTERNAL END
-
- // CONTENT END
-})(this);
\ No newline at end of file
[14/22] olingo-odata4-js git commit: [OLINGO-442] Cleanup bevor
release
Posted by ko...@apache.org.
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/cache-tests.js
----------------------------------------------------------------------
diff --git a/JSLib/tests/cache-tests.js b/JSLib/tests/cache-tests.js
deleted file mode 100644
index e25d2f8..0000000
--- a/JSLib/tests/cache-tests.js
+++ /dev/null
@@ -1,1191 +0,0 @@
-/// <reference path="../src/datajs.js" />
-/// <reference path="../src/odata-utils.js" />
-/// <reference path="../src/cache.js" />
-/// <reference path="common/djstest.js" />
-
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
-// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// cache-tests.js
-
-(function (window, undefined) {
-
- module("Unit");
- var foodsFeed = "./endpoints/FoodStoreDataServiceV4.svc/Foods";
- var collectionSize = 16;
-
- var thenFailTest = function (err) {
- if (err && err.message) {
- djstest.fail(err.message);
- } else {
- djstest.fail("unexepected promise failure");
- }
-
- djstest.done();
- };
-
- djstest.addTest(function dataCacheCountTest() {
- var cache = odatajs.createDataCache({ name: "cache", source: foodsFeed });
- cache.count().then(function (count) {
- djstest.assertAreEqual(count, collectionSize, "expected count for Foods");
- djstest.destroyCacheAndDone(cache);
- }, thenFailTest);
- });
-
- djstest.addTest(function dataCacheCountOnLocalTest() {
- var cache = odatajs.createDataCache({ name: "cache", source: foodsFeed, pageSize: collectionSize + 10, mechanism: "memory" });
- cache.readRange(0, collectionSize + 10).then(function (data) {
- var expectedCount = data.value ? data.value.length : 0;
- cache.count().then(function (count) {
- djstest.assertAreEqual(count, expectedCount, "expected count for expectedCount");
- djstest.destroyCacheAndDone(cache);
- }, thenFailTest);
- }, thenFailTest);
- });
-
- djstest.addTest(function dataCacheCountAbortTest() {
- // Abort before completion.
- var cache = odatajs.createDataCache({ name: "cache", source: foodsFeed });
- var item = cache.count().then(thenFailTest, function (err) {
- djstest.assertAreEqual(true, err.canceled, "err.aborted is true");
- djstest.destroyCacheAndDone(cache);
- }).cancel();
- });
-
- var createNewCache = function (options) {
-
- var thenSuccess = null;
-
- var resolved = false;
- var rejected = false;
-
- var args = null;
-
- this.then = function (success) {
- if (resolved) {
- success.apply(null, args);
- } else if (!rejected) {
- thenSuccess = success;
- }
- };
-
- var resolve = function (/*args*/) {
- resolved = true;
- args = arguments;
- if (thenSuccess) {
- thenSuccess.apply(null, arguments);
- }
- };
-
- var cache = odatajs.createDataCache(options);
- cache.clear().then(function () {
- var newCache = odatajs.createDataCache(options);
- resolve(newCache);
- }, function (err) {
- rejected = true;
- thenFailTest(err);
- });
-
- return this;
- };
-
- djstest.addTest(function dataCacheReadRangeSingleTest() {
- // Read a new range.
- var options = { name: "cache", source: foodsFeed, pageSize: 2 };
- createNewCache(options).
- then(function (cache) {
- cache.readRange(0, 1).
- then(function (data) {
- djstest.assertAreEqual(data.value.length, 1, "single item was read.");
- djstest.assertAreEqual(data.value[0].FoodID, 0, "food id is 0.");
- djstest.done();
- }, thenFailTest);
- }, thenFailTest);
- });
-
- djstest.addTest(function dataCacheReadRangeExactPageTest() {
- // Read exactly one page.
- var options = { name: "cache", source: foodsFeed, pageSize: 2 };
- createNewCache(options).
- then(function (cache) {
- cache.readRange(0, 2).
- then(function (data) {
- djstest.assertAreEqual(data.value.length, 2, "single item was read.");
- djstest.assertAreEqual(data.value[0].FoodID, 0, "first food id is 0.");
- djstest.assertAreEqual(data.value[1].FoodID, 1, "second food id is 1.");
- djstest.done();
- }, thenFailTest);
- }, thenFailTest);
- });
-
- djstest.addTest(function dataCacheReadRangeMultiplePageTest() {
- // Read multiple pages.
- var options = { name: "cache", source: foodsFeed, pageSize: 2 };
- createNewCache(options).
- then(function (cache) {
- cache.readRange(0, 3).
- then(function (data) {
- djstest.assertAreEqual(data.value.length, 3, "single item was read.");
- djstest.assertAreEqual(data.value[0].FoodID, 0, "first food id is 0.");
- djstest.assertAreEqual(data.value[1].FoodID, 1, "second food id is 1.");
- djstest.assertAreEqual(data.value[2].FoodID, 2, "third food id is 2.");
- djstest.done();
- }, thenFailTest);
- }, thenFailTest);
- });
-
- djstest.addTest(function dataCacheReadRangeSyncDelaysTest() {
- var options = { name: "cache", source: foodsFeed, pageSize: 2 };
- var counter = 0;
- createNewCache(options).
- then(function (cache) {
- cache.readRange(0, 1).
- then(function (data) {
- djstest.assertAreEqual(counter, 0, "counter is zero for first set of results");
- djstest.assertAreEqual(cache.stats.netReads, 1, "one request made to fulfill the readRange");
- counter++;
- cache.readRange(0, 1).
- then(function (data) {
- djstest.assertAreEqual(counter, 2, "counter is two because even sync results are delayed)");
- djstest.assertAreEqual(cache.stats.netReads, 1, "no additional requests since requested data is in cache");
- djstest.done();
- }, thenFailTest);
- djstest.assertAreEqual(counter, 1, "counter is one because readRange hasn't run (even if results are cached)");
- counter++;
- }, thenFailTest);
- }, thenFailTest);
- });
-
- djstest.addTest(function dataCacheReadRangesWithDestroyTest() {
- var options = { name: "cache", source: foodsFeed, pageSize: 2, prefetchSize: 0 };
- var counter = 0;
- createNewCache(options).then(function (cache) {
- cache.readRange(0, 1).then(function (data) {
- djstest.assertAreEqual(cache.stats.netReads, 1, "one request made to fulfill the readRange");
- cache.clear().then(function () {
- djstest.assertAreEqual(cache.stats.netReads, 0, "stats cleared in destroy");
- cache.readRange(0, 1).then(function (data) {
- djstest.assertAreEqual(cache.stats.netReads, 1, "request made after destroy to fulfill the readRange");
- djstest.done();
- }, thenFailTest);
- }, thenFailTest);
- }, thenFailTest);
- }, thenFailTest);
- });
-
- djstest.addTest(function dataCacheReadSimultaneousTest() {
- var options = { name: "cache", source: foodsFeed, pageSize: 2 };
- var counter = 0;
- var theCache;
- var checkDataAndCount = function (data) {
- djstest.assertAreEqual(data.value.length, 1, "Single item returned");
- djstest.assertAreEqual(data.value[0].FoodID, 0, "FoodId is set to zero for first item");
- djstest.assertAreEqual(theCache.stats.netReads, 1, "single theCache.stats.netReads");
- djstest.assert(theCache.stats.prefetches <= 1, "theCache.stats.prefetches <= 1 - no repetitions");
- counter++;
- if (counter === 3) {
- djstest.done();
- }
- };
-
- createNewCache(options).
- then(function (cache) {
- theCache = cache;
- cache.readRange(0, 1).then(checkDataAndCount, thenFailTest);
- cache.readRange(0, 1).then(checkDataAndCount, thenFailTest);
- cache.readRange(0, 1).then(checkDataAndCount, thenFailTest);
- }, thenFailTest);
- });
-
- djstest.addTest(function dataCacheMultipleClearTest() {
- var options = { name: "cache", source: foodsFeed, pageSize: 2 };
- var counter = 0;
- var checkCount = function (data) {
- djstest.assert(true, "clear then was called");
- counter++;
- if (counter === 3) {
- djstest.done();
- }
- };
-
- createNewCache(options).
- then(function (cache) {
- cache.readRange(0, 1).then(function () {
- cache.clear().then(checkCount, thenFailTest);
- cache.clear().then(checkCount, thenFailTest);
- cache.clear().then(checkCount, thenFailTest);
- }, thenFailTest);
- }, thenFailTest);
- });
-
- djstest.addTest(function dataCacheOnIdleIsFired() {
- var options = { name: "cache", source: foodsFeed, pageSize: 2, prefetchSize: 0 };
-
- createNewCache(options).
- then(function (cache) {
- var counter = 0;
- var clearSucceeded = false;
-
- var thenFailThisTest = function (err) {
- if (err && err.message) {
- djstest.fail(err.message);
- } else {
- djstest.fail("unexepected promise failure");
- }
- };
-
- cache.onidle = function () {
- counter++;
- djstest.assertAreEqual(counter, 1, "onidle was called 1 times");
- djstest.assert(clearSucceeded, "onidle was called after destroy");
- djstest.done();
- };
-
- cache.readRange(0, 1).then(null, thenFailThisTest);
- cache.readRange(0, 1).then(null, thenFailThisTest);
- cache.readRange(3, 4).then(function () {
- cache.readRange(5, 6).then(function () {
- cache.clear().then(function () {
- clearSucceeded = true;
- }, thenFailThisTest);
- }, thenFailThisTest);
- }, thenFailThisTest);
- }, thenFailTest);
- });
-
- djstest.addTest(function dataCacheOnIdleFiresOnErrorTest() {
-
- var errorResponse = false;
- var httpClient = {
- request: function (request, success, error) {
- var response = { statusCode: 200, headers: { "Content-Type": "application/json", "OData-Version": "4.0" }, body: JSON.stringify({ d: [1, 2] }) };
- if (!errorResponse) {
- errorResponse = true;
- setTimeout(function () {
- success(response);
- }, 0);
- } else {
- response.statusCode = 500;
- response.body = "bad response";
- setTimeout(function () {
- error({ message: "HTTP request failed", request: request, response: response });
- }, 0);
- }
- }
- };
-
- var options = { name: "cache", source: foodsFeed, pageSize: 2, prefetchSize: 0, httpClient: httpClient };
-
- createNewCache(options).
- then(function (cache) {
- var counter = 0;
- var errorHandlerCalled = false;
-
- var thenFailThisTest = function (err) {
- if (err && err.message) {
- if (errorResponse) {
- djstest.assertAreEqual(err.message, "HTTP request failed", "Error is the expected one");
- errorHandlerCalled = true;
- } else {
- djstest.fail(err.message);
- }
- } else {
- djstest.fail("unexepected promise failure");
- }
- };
-
- cache.onidle = function () {
- counter++;
- djstest.assertAreEqual(counter, 1, "onidle was called");
- djstest.assert(errorHandlerCalled, "error handler was called before onidle");
- cache.onidle = null;
- cache.clear().then(function () {
- djstest.done();
- }, thenFailTest);
- };
- cache.readRange(0, 2).then(function () {
- cache.readRange(2, 4).then(function () {
- djstest.fail("unexpected readRange success");
- }, thenFailThisTest);
- }, thenFailThisTest);
- }, thenFailTest);
- });
-
-
- djstest.addTest(function dataCacheOdataSourceNormalizedURITest() {
- var requestsMade = 0;
- var httpClient = {
- request: function (request, success, error) {
- var response = { statusCode: 200, headers: { "Content-Type": "application/json", "OData-Version": "4.0" }, body: JSON.stringify({ value: [1, 2] }) };
- if (requestsMade === 0) {
- djstest.pass("Cache made first request for data from the source");
- requestsMade++;
- } else {
- // In memory storage will make a second request from the new cache since two caches with the same name will coexist
- if (window.mozIndexedDB || window.localStorage || requestsMade > 1) {
- djstest.fail("Unexpected request to the source");
- } else {
- djstest.pass("In memory cache requested the data from the source");
- }
- }
- setTimeout(function () {
- success(response);
- }, 0);
- }
- };
-
- var options = { name: "cache", source: "http://exampleuri.com/my service.svc", pageSize: 2, prefetchSize: 0, httpClient: httpClient };
-
- createNewCache(options).
- then(function (cache) {
- cache.readRange(0, 2).then(function () {
- options.source = "HtTp://ExampleURI.cOm/my%20service.svc";
- var newCache = odatajs.createDataCache(options);
- newCache.readRange(0, 2).then(function (data) {
- djstest.assertAreEqualDeep(data.value, [1, 2], "Got the expected data from the new cache instance");
- newCache.clear().then(function () {
- djstest.done();
- }, thenFailTest);
- }, thenFailTest);
- }, thenFailTest);
- }, thenFailTest);
- });
-
-
- djstest.addTest(function dataCachePrefetchAllTest() {
- var options = { name: "cache", source: foodsFeed, pageSize: 2, prefetchSize: -1 };
- var counter = 0;
- var theCache;
-
- var callback = function () {
- counter++;
- if (counter === 2) {
- djstest.assertAreEqual(1, theCache.stats.netReads, "single page to satisfy read (" + theCache.stats.netReads + ")");
- djstest.assert(theCache.stats.prefetches > 1, "theCache.stats.prefetches(" + theCache.stats.prefetches + ") > 1 - multiple prefetches");
- djstest.done();
- }
- };
-
- var checkDataAndCount = function (data) {
- djstest.assertAreEqual(data.value.length, 1, "Single item returned");
- djstest.assertAreEqual(data.value[0].FoodID, 0, "FoodId is set to zero for first item");
- djstest.assertAreEqual(1, theCache.stats.netReads, "single theCache.stats.netReads");
- djstest.assert(theCache.stats.prefetches <= 1, "theCache.stats.prefetches <= 1 - no repetitions");
- callback();
- };
-
- createNewCache(options).
- then(function (cache) {
- theCache = cache;
- cache.readRange(0, 1).then(checkDataAndCount, thenFailTest);
- cache.onidle = function () {
- djstest.log("onidle fired");
- callback();
- };
- }, thenFailTest);
- });
-
- djstest.addTest(function dataCacheReadRangeTakeMoreThanCollectionCountTest() {
- // Read multiple pages.
- var options = { name: "cache", source: foodsFeed, pageSize: 2 };
- createNewCache(options).
- then(function (cache) {
- cache.count().then(function (count) {
- cache.readRange(0, count + 1).
- then(function (data) {
- djstest.assertAreEqual(data.value.length, count, "all items in the collection were read.");
- cache.readRange(2, count + 1).
- then(function (data) {
- djstest.assertAreEqual(data.value.length, count - 2, "all requested in the collection were read.");
- djstest.assertAreEqual(data.value[0].FoodID, 2, "first read food id is 2.");
- djstest.done();
- }, thenFailTest);
- }, thenFailTest);
- }, thenFailTest);
- }, thenFailTest);
- });
-
- djstest.addTest(function dataCacheReadRangeSkipMoreThanCollectionCountTest() {
- // Read multiple pages.
- var options = { name: "cache", source: foodsFeed, pageSize: 2 };
- createNewCache(options).
- then(function (cache) {
- cache.count().then(function (count) {
- cache.readRange(count + 1, 5).
- then(function (data) {
- djstest.assertAreEqual(data.value.length, 0, "no items were read.");
- djstest.done();
- }, thenFailTest);
- }, thenFailTest);
- }, thenFailTest);
- });
-
- djstest.addTest(function dataCacheReadRangeTakeMoreThanPrefetchSizeTest() {
- // Read multiple pages.
- var options = { name: "cache", source: foodsFeed, pageSize: 2, prefetchSize: 1 };
- createNewCache(options).
- then(function (cache) {
- cache.readRange(0, 4).
- then(function (data) {
- djstest.assertAreEqual(data.value.length, 4, "all requested in the collection were read.");
- djstest.assertAreEqual(data.value[0].FoodID, 0, "first food id is 0.");
- djstest.assertAreEqual(data.value[1].FoodID, 1, "second food id is 1.");
- djstest.assertAreEqual(data.value[2].FoodID, 2, "third food id is 2.");
- djstest.assertAreEqual(data.value[3].FoodID, 3, "third food id is 3.");
- djstest.done();
- }, thenFailTest);
- }, thenFailTest);
- });
-
- djstest.addTest(function dataCacheRangeInvalidIndexAndCount() {
- var options = { name: "cache", source: foodsFeed, pageSize: 2, prefetchSize: 1 };
- var counter = 0;
-
- var thenFailSuccess = function () {
- djstest.fail("Call to success was unexpected");
- counter++;
- if (counter === tests.length) {
- djstest.done();
- }
- };
-
- var thenFailError = function () {
- djstest.fail("Call to error was unexpected");
- counter++;
- if (counter === tests.length) {
- djstest.done();
- }
- };
-
- var invalidValues = [-5, -1, null, undefined, NaN, Infinity, "5", "this is not a number"];
- var tests = [];
- $.each(invalidValues, function (_, value) {
- tests.push({ i: value, c: 0 });
- tests.push({ i: 0, c: value });
- tests.push({ i: value, c: value });
- });
-
- createNewCache(options).
- then(function (cache) {
- var i, len;
- for (i = 0, len = tests.length; i < len; i++) {
- var test = tests[i];
- try {
- cache.readRange(test.i, test.c).then(thenFailSuccess, thenFailTest);
- } catch (err) {
- djstest.pass("Expected exception was thrown: " + err.message);
- counter++;
- }
- }
- if (counter === tests.length) {
- djstest.done();
- }
- });
- });
-
-
- djstest.addTest(function cacheOptionsForCountTest() {
- var httpClient = {
- request: function (r, success, error) {
- window.setTimeout(function () {
- success({ data: "10" });
- }, 1);
- return null;
- }
- };
- var cache = odatajs.createDataCache({
- name: "mem", mechanism: "memory", source: "http://www.example.org/service/",
- httpClient: httpClient
- });
- cache.count().then(function (count) {
- djstest.assertAreEqual(count, 10, "count value");
- djstest.done();
- }, djstest.failAndDoneCallback("failed to get count"));
- });
-
- djstest.addTest(function dataCacheDestoryStopsThePrefetcherTest() {
- var oldHttpClientRequest = OData.defaultHttpClient.request;
- var prefetchCount = 0;
- var theCache;
-
- OData.defaultHttpClient.request = function (request, success, error) {
- prefetchCount++;
- djstest.assert(prefetchCount <= 3, "Expected prefetch request");
- if (prefetchCount === 3) {
- theCache.clear().then(function () {
- djstest.assertAreEqual(prefetchCount, 3, "cache.clear() stopped the prefetcher");
- djstest.done();
- OData.defaultHttpClient.request = oldHttpClientRequest;
- }, thenFailTest);
- return {
- abort: function () { }
- };
- }
- return oldHttpClientRequest(request, success, error);
- };
-
- try {
- var options = { name: "cache", source: foodsFeed, pageSize: 1, prefetchSize: -1 };
- createNewCache(options).then(function (cache) {
- theCache = cache;
- cache.readRange(0, 0).then(null, thenFailTest);
- });
- } catch (e) {
- OData.defaultHttpClient.request = oldHttpClientRequest;
- djstest.fail("Exception thrown, prefetchSize: " + tests[count] + " error: " + e.message);
- djstest.done();
- }
- });
-
- djstest.addTest(function dataCacheFilterTest() {
- var options = { name: "cache", source: foodsFeed, pageSize: 3, prefetchSize: -1 };
- var counter = 0;
-
- var singleItemPredicate = function (data) {
- return data.FoodID === 2;
- };
-
- var multipleItemPredicate = function (data) {
- return data.FoodID % 2 === 1;
- };
-
- var noItemPredicate = function (data) {
- return data.Name === "something i would never eat";
- };
-
- var allItemPredicate = function (data) {
- return data.FoodID >= 0;
- };
-
- var doneAfterAllTests = function () {
- counter++;
- if (counter === tests.length) {
- djstest.done();
- }
- };
-
- var last = collectionSize - 1;
- var tests = [
- { index: 0, count: -5, predicate: singleItemPredicate }, // Single match in entire collection
- {index: 2, count: 1, predicate: singleItemPredicate }, // Single match, single count
- {index: 3, count: 1, predicate: singleItemPredicate }, // Single match skipped, i.e. no matches
- {index: 0, count: -1, predicate: multipleItemPredicate }, // Multiple matches in entire collection
- {index: 0, count: 5, predicate: multipleItemPredicate }, // Multiple matches, take partial
- {index: 3, count: 5, predicate: multipleItemPredicate }, // Multiple matches, skip/take partial
- {index: 7, count: 10, predicate: multipleItemPredicate }, // Multiple matches, skip partial, take past end of collection
- {index: 13, count: 4, predicate: allItemPredicate }, // All items match, skip/take partial
- {index: 0, count: 20, predicate: noItemPredicate }, // No matches
- {index: 0, count: 0, predicate: allItemPredicate }, // Zero count
- {index: -5, count: 1, predicate: allItemPredicate }, // Negative index
- {index: last + 1, count: 1, predicate: allItemPredicate }, // Index past end of collection
-
- {index: last, count: -5, predicate: singleItemPredicate, backwards: true }, // Single match in entire collection
- {index: 2, count: 1, predicate: singleItemPredicate, backwards: true }, // Single match, single count
- {index: 1, count: 1, predicate: singleItemPredicate, backwards: true }, // Single match skipped, i.e. no matches
- {index: last, count: -1, predicate: multipleItemPredicate, backwards: true }, // Multiple matches in entire collection
- {index: last, count: 6, predicate: multipleItemPredicate, backwards: true }, // Multiple matches, take partial
- {index: last - 3, count: 5, predicate: multipleItemPredicate, backwards: true }, // Multiple matches, skip/take partial
- {index: 13, count: 10, predicate: multipleItemPredicate, backwards: true }, // Multiple matches, skip partial, take past end of collection
- {index: 4, count: 13, predicate: allItemPredicate, backwards: true }, // All items match, skip/take partial
- {index: last, count: 20, predicate: noItemPredicate, backwards: true }, // No matches
- {index: 0, count: 0, predicate: allItemPredicate, backwards: true }, // Zero count
- {index: -5, count: 1, predicate: allItemPredicate, backwards: true }, // Negative index
- {index: last + 1, count: 1, predicate: allItemPredicate, backwards: true }, // Index past end of collection
-
- {index: "foo", count: 1, predicate: singleItemPredicate, exception: { message: "'index' must be a valid number.", index: NaN} },
- { index: 0, count: "foo", predicate: multipleItemPredicate, exception: { message: "'count' must be a valid number.", count: NaN} }
- ];
-
- var testDescription = function(test) {
- return "filter [" + test.index + ", " + test.count + " " + (test.backwards ? "back" : "forward") + "] for predicate " + test.predicate;
- };
-
- var filterErrorCallback = function (err) {
- if (err && err.message) {
- djstest.fail(err.message);
- } else {
- djstest.fail("unexpected promise failure");
- }
- doneAfterAllTests();
- };
-
- var removeSafariExceptionProperties = function (err) {
- /// <summary>Removes Safari-specific properties from an exception object</summary>
- /// <params name="err" type="Exception">The exception object to operate on</param>
- /// <returns type="Exception">The original exception object with the Safari-specific properties removed</returns>
- var safariProperties = ["line", "expressionBeginOffset", "expressionEndOffset", "sourceId", "sourceURL"];
-
- var result = {};
- $.each(err, function (property, value) {
- if ($.inArray(property, safariProperties) === -1) {
- result[property] = value;
- }
- });
-
- return result;
- };
-
- ODataReadOracle.readJsonAcrossServerPages(foodsFeed, function (expectData) {
- $.each(tests, function (_, test) {
- createNewCache(options).then(function (cache) {
- try {
- var expectedResults = {};
- if (test.backwards) {
- cache.filterBack(test.index, test.count, test.predicate).then(function (results) {
- expectedResults = CacheOracle.getExpectedFilterResults(expectData, test.index, test.count, test.predicate, test.backwards);
- djstest.assertAreEqualDeep(results, expectedResults, "results for " + testDescription(test));
- doneAfterAllTests();
- }, filterErrorCallback);
- } else {
- cache.filterForward(test.index, test.count, test.predicate).then(function (results) {
- expectedResults = CacheOracle.getExpectedFilterResults(expectData, test.index, test.count, test.predicate, test.backwards);
- djstest.assertAreEqualDeep(results, expectedResults, "results for " + testDescription(test));
- doneAfterAllTests();
- }, filterErrorCallback);
- }
-
- if (test.exception) {
- djstest.fail("expected exception for " + testDescription(test));
- doneAfterAllTests();
- }
- } catch (err) {
- if (test.exception) {
- djstest.assertAreEqualDeep(removeSafariExceptionProperties(err), test.exception, "exception for " + testDescription(test));
- } else {
- djstest.fail("unexpected exception for " + testDescription(test) + ": " + djstest.toString(err));
- }
- doneAfterAllTests();
- }
- }, thenFailTest);
- });
- });
- });
-
- djstest.addTest(function createDataCacheTest() {
- var cache;
-
- // Verify the defaults.
- cache = odatajs.createDataCache({ name: "name", source: "src" });
-
- djstest.assertAreEqual(cache.onidle, undefined, "onidle is undefined");
-
- // Verify specific values.
- cache = odatajs.createDataCache({ name: "name", source: "src", cacheSize: 1, pageSize: 2, prefetchSize: 3, idle: 123 });
-
- djstest.assertAreEqual(cache.onidle, 123, "onidle is as specified");
-
- // Verify 0 pageSize
- djstest.expectException(function () {
- odatajs.createDataCache({ name: "name", source: "src", cacheSize: 1, pageSize: 0, prefetchSize: 3, idle: 123 });
- }, "zero pageSize");
-
- // Verify negative pageSize
- djstest.expectException(function () {
- odatajs.createDataCache({ name: "name", source: "src", cacheSize: 1, pageSize: -2, prefetchSize: 3, idle: 123 });
- }, "negative pageSize");
-
- // Verify NaN pageSize
- djstest.expectException(function () {
- cache = odatajs.createDataCache({ name: "name", source: "src", cacheSize: 1, pageSize: "2", prefetchSize: 3, idle: 123 });
- }, "NaN pageSize");
-
- // Verify NaN cacheSize
- djstest.expectException(function () {
- cache = odatajs.createDataCache({ name: "name", source: "src", cacheSize: "1", pageSize: 2, prefetchSize: 3, idle: 123 });
- }, "NaN cacheSize");
-
- // Verify NaN prefetchSize
- djstest.expectException(function () {
- cache = odatajs.createDataCache({ name: "name", source: "src", cacheSize: 1, pageSize: 2, prefetchSize: "3", idle: 123 });
- }, "NaN prefetchSize");
-
- // Verify undefined name
- djstest.expectException(function () {
- odatajs.createDataCache({ source: "src", cacheSize: 1, pageSize: 1, prefetchSize: 3, idle: 123 });
- }, "undefined name");
-
- // Verify null name
- djstest.expectException(function () {
- odatajs.createDataCache({ name: null, source: "src", cacheSize: 1, pageSize: 1, prefetchSize: 3, idle: 123 });
- }, "null name");
-
- // Verify undefined source
- djstest.expectException(function () {
- odatajs.createDataCache({ name: "name", cacheSize: 1, pageSize: 1, prefetchSize: 3, idle: 123 });
- }, "undefined source");
-
- djstest.done();
- });
-
- djstest.addTest(function createDataCacheWithSourceTest() {
- var cacheSource = {
- count: function (success) {
- djstest.pass("cacheSource.count was called");
- success(0);
- },
-
- read: function (index, count, success, error) {
- djstest.assertAreEqual(index, 0, "index is the expected one");
- djstest.assertAreEqual(count, 10, "test is the expected one");
- djstest.assert(success, "success is defined");
- djstest.assert(error, "error is defined");
- djstest.pass("cacheSource.read was called");
-
- setTimeout(function () {
- success([]);
- }, 0);
- }
- };
-
- var cache = odatajs.createDataCache({ name: "name", source: cacheSource, mechanism: "memory", pageSize: 10 });
- cache.count().then(function () {
- cache.readRange(0, 5).then(function () {
- djstest.done();
- }, thenFailTest);
- }, thenFailTest);
- });
-
- djstest.addTest(function cacheInitializationFailTest() {
- // Tests various failure modes for cache initialization.
- var failures = ["read-settings", "write-settings", "v2"];
- var failureIndex = 0;
-
- var originalStore = odatajs.createStore;
- var restoreStore = function () {
- odatajs.createStore = originalStore;
- };
-
- var storeError = { message: "cacheInitializationFailTest error" };
- odatajs.createStore = function (name, mechanism) {
- return {
- addOrUpdate: function (key, value, successCallback, errorCallback) {
- if (failures[failureIndex] === "write-settings") {
- window.setTimeout(function () { errorCallback(storeError); }, 2);
- } else {
- djstest.fail("Error unaccounted for in addOrUpdate for " + failures[failureIndex]);
- window.setTimeout(function () { errorCallback(storeError); }, 2);
- }
- },
- read: function (key, successCallback, errorCallback) {
- if (failures[failureIndex] === "read-settings") {
- window.setTimeout(function () { errorCallback(storeError); }, 2);
- } else if (failures[failureIndex] === "v2") {
- window.setTimeout(function () {
- successCallback("K", { version: "2.0" });
- }, 2);
- } else if (failures[failureIndex] === "write-settings") {
- window.setTimeout(function () { successCallback(null, null); }, 2);
- } else {
- djstest.fail("Error unaccounted for read in " + failures[failureIndex]);
- window.setTimeout(function () { errorCallback(storeError); }, 2);
- }
- }
- };
- };
-
- var nextFailure = function () {
- djstest.log("Failure mode: " + failures[failureIndex]);
- var cache = odatajs.createDataCache({ name: "name", source: "foo", mechanism: "memory", pageSize: 10 });
- try {
- // The first readRange should succeed, because the data cache isn't really initialized at this time.
- cache.readRange(1, 2).then(djstest.failAndDoneCallback("No function should succeed"), function (err) {
- djstest.expectException(function () {
- cache.readRange(1, 2);
- }, "readRange after store is invalidated");
-
- djstest.expectException(function () {
- cache.count();
- }, "count after store is invalidated");
-
- djstest.expectException(function () {
- cache.clear();
- }, "clear after store is invalidated");
-
- djstest.expectException(function () {
- cache.filterForward(1, 2);
- }, "filterForward after store is invalidated");
-
- djstest.expectException(function () {
- cache.filterBack(1, 2);
- }, "filterBack after store is invalidated");
-
- djstest.expectException(function () {
- cache.toObservable();
- }, "toObservable after store is invalidated");
-
- failureIndex++;
- if (failureIndex === failures.length) {
- restoreStore();
- djstest.done();
- } else {
- nextFailure();
- }
- });
- } catch (outerError) {
- djstest.fail("Unexpected failure for first .readRange: " + window.JSON.stringify(outerError));
- restoreStore();
- djstest.done();
- }
- };
-
- nextFailure();
- });
-
- djstest.addTest(function createDataCacheWithSourceCallsErrorTest() {
- var cacheSource = {
- count: function () {
- djstest.fail("cacheSource.count was called");
- },
-
- read: function (index, count, success, error) {
- setTimeout(function () {
- error({ message: "source error" });
- }, 0);
- }
- };
-
- var cache = odatajs.createDataCache({ name: "name", source: cacheSource, mechanism: "memory", pageSize: 10 });
- cache.readRange(0, 5).then(function () {
- djstest.fail("unexpected call to then success");
- djstest.done();
- }, function (err) {
- djstest.assertAreEqual(err.message, "source error", "got the expected error");
- djstest.done();
- });
- });
-
- djstest.addTest(function toObservableMissingTest() {
- createNewCache({ name: "cache", source: "http://temp.org" }).then(function (cache) {
- var hiddenRx = window.Rx;
- try {
- window.Rx = null;
- var error = null;
- try {
- cache.ToObservable();
- } catch (err) {
- error = err;
- }
-
- djstest.assert(error !== null, "error !== null");
- } finally {
- window.Rx = hiddenRx;
- }
-
- djstest.assert(error !== null, "error !== null");
- djstest.destroyCacheAndDone(cache);
- });
- });
-
- djstest.addTest(function toObservableSinglePageTest() {
- createNewCache({ name: "cache", source: foodsFeed }).then(function (cache) {
- var lastId = -1;
- cache.ToObservable().Subscribe(function (item) {
- djstest.assert(lastId < item.FoodID, "lastId < item.FoodID");
- lastId = item.FoodID;
- }, thenFailTest, function () {
- djstest.assert(lastId !== -1, "lastId !== -1");
- djstest.done();
- });
- });
- });
-
- djstest.addTest(function toObservableCaseSinglePageTest() {
- createNewCache({ name: "cache", source: foodsFeed }).then(function (cache) {
- var lastId = -1;
- cache.toObservable().Subscribe(function (item) {
- djstest.assert(lastId < item.FoodID, "lastId < item.FoodID");
- lastId = item.FoodID;
- }, thenFailTest, function () {
- djstest.assert(lastId !== -1, "lastId !== -1");
- djstest.done();
- });
- });
- });
-
- djstest.addTest(function toObservableMultiplePageTest() {
- createNewCache({ name: "cache", source: foodsFeed, pageSize: 2 }).then(function (cache) {
- var lastId = -1;
- var callCount = 0;
- cache.toObservable().Subscribe(function (item) {
- djstest.assert(lastId < item.FoodID, "lastId < item.FoodID");
- lastId = item.FoodID;
- callCount += 1;
- }, thenFailTest, function () {
- djstest.assert(lastId !== -1, "lastId !== -1");
- djstest.assert(callCount > 1, "callCount > 1");
- djstest.done();
- });
- });
- });
-
- djstest.addTest(function toObservableEarlyDisposeTest() {
- createNewCache({ name: "cache", source: foodsFeed, pageSize: 2 }).then(function (cache) {
- var lastId = -1;
- var callCount = 0;
- var complete = false;
- var observer = cache.toObservable().Subscribe(function (item) {
- djstest.assert(complete === false, "complete === false");
- djstest.assert(lastId < item.FoodID, "lastId < item.FoodID");
- lastId = item.FoodID;
- callCount += 1;
- complete = true;
- observer.Dispose();
- djstest.done();
- }, thenFailTest);
- });
- });
-
- djstest.addTest(function toObservableFailureTest() {
- createNewCache({ name: "cache", source: foodsFeed, pageSize: 2 }).then(function (cache) {
- var lastId = -1;
- var complete = false;
- window.MockHttpClient.clear().addResponse("*", { statusCode: 500, body: "server error" });
- window.MockHttpClient.async = true;
- var savedClient = OData.defaultHttpClient;
- OData.defaultHttpClient = window.MockHttpClient;
- cache.toObservable().Subscribe(function (item) {
- OData.defaultHttpClient = savedClient;
- djstest.fail("Unexpected call to OnNext");
- }, function (err) {
- djstest.assert(complete === false, "complete === false");
- djstest.assert(err, "err defined");
- OData.defaultHttpClient = savedClient;
- complete = true;
- djstest.done();
- }, function (complete) {
- djstest.fail("Unexpected call to complete. Error handler should be called.");
- OData.defaultHttpClient = savedClient;
- complete = true;
- djstest.done();
- });
- });
- });
-
- // DATAJS INTERNAL START
-
- djstest.addTest(function createDeferredTest() {
- // Verify basic use of deferred object.
- var deferred = odatajs.createDeferred();
- deferred.then(function (val1, val2) {
- djstest.assertAreEqual(val1, 1, "val1 is as specified");
- djstest.assertAreEqual(val2, 2, "val2 is as specified");
- djstest.done();
- });
- deferred.resolve(1, 2);
- });
-
- djstest.addTest(function deferredThenTest() {
- // Verify then registration and chaining.
- var deferred = odatajs.createDeferred();
- deferred.then(function (val1, val2) {
- djstest.assertAreEqual(val1, 1, "val1 is as specified");
- djstest.assertAreEqual(val2, 2, "val2 is as specified");
- return "foo";
- }).then(function (foo) {
- // See Compatibility Note B in DjsDeferred remarks.
- djstest.assert(foo !== "foo", "argument for chained 'then' is *not* result of previous call");
- djstest.assert(foo === 1, "argument for chained 'then' is same as for previous call");
-
- var other = odatajs.createDeferred();
- other.then(null, function (err, msg) {
- djstest.assertAreEqual("error", err, "err is as specified");
- djstest.assertAreEqual("message", msg, "msg is as specified");
-
- }).then(null, function (err, msg) {
- djstest.log("chained errors are called");
-
- djstest.assertAreEqual("error", err, "err is as specified");
- djstest.assertAreEqual("message", msg, "msg is as specified");
-
- var multiple = odatajs.createDeferred();
- var count = 0;
-
- // See Compatibility Note A in DjsDeferred remarks.
- multiple.then(function () {
- djstest.assertAreEqual(count, 0, "first base registration fires as #0");
- count++;
- }).then(function () {
- djstest.assertAreEqual(count, 1, "first chained registration fires as #1");
- count++;
- });
-
- multiple.then(function () {
- djstest.assertAreEqual(count, 2, "second base registration fires as #2");
- count++;
- }).then(function () {
- djstest.assertAreEqual(count, 3, "second chained registration fires as #3");
- djstest.done();
- });
-
- multiple.resolve();
- });
- other.reject("error", "message");
- });
-
- deferred.resolve(1, 2);
- });
-
- djstest.addTest(function deferredResolveTest() {
- // Resolve with no arguments.
- var deferred = odatajs.createDeferred();
- deferred.then(function (arg) {
- djstest.assertAreEqual(arg, undefined, "resolve with no args shows up as undefined");
-
- // Resolve with no callbacks.
- var other = odatajs.createDeferred();
- other.resolve();
- djstest.done();
- });
-
- deferred.resolve();
- });
-
- djstest.addTest(function deferredRejectTest() {
- // Resolve with no arguments.
- var deferred = odatajs.createDeferred();
- deferred.then(null, function (arg) {
- djstest.assertAreEqual(arg, undefined, "reject with no args shows up as undefined");
-
- // Resolve with no callbacks.
- var other = odatajs.createDeferred();
- other.reject();
- djstest.done();
- });
-
- deferred.reject();
- });
-
- djstest.addTest(function estimateSizeTest() {
- var tests = [
- { i: null, e: 8 },
- { i: undefined, e: 8 },
- { i: 0, e: 8 },
- { i: "abc", e: 6 },
- { i: [1, 2, 3], e: 30 },
- { i: { a1: null, a2: undefined, a3: 5, a4: "ab", a5: { b1: 5, b2: 6} }, e: 72 },
- { i: {}, e: 0 }
- ];
-
- var i, len;
- for (i = 0, len = tests.length; i < len; i++) {
- var test = tests[i];
- djstest.assertAreEqual(odatajs.estimateSize(test.i), test.e);
- }
- djstest.done();
- });
-
- djstest.addTest(function cacheOptionsTunnelTest() {
- var mockClient = window.MockHttpClient;
- var doneCalled = false;
-
- mockClient.clear().setAsync(true).addRequestVerifier("*", function (theRequest) {
- if (!doneCalled) {
- doneCalled = true;
- djstest.assertAreEqual(theRequest.user, "the-user", "theRequest.user");
- djstest.assertAreEqual(theRequest.password, "the-password", "theRequest.password");
- djstest.assertAreEqual(theRequest.enableJsonpCallback, false, "theRequest.enableJsonpCallback");
- djstest.assertAreEqual(theRequest.callbackParameterName, "p", "callbackParameterName");
- djstest.done();
- }
- });
-
- var cache = odatajs.createDataCache({
- name: "cacheOptionsTunnel",
- source: "http://foo-bar/",
- user: "the-user",
- password: "the-password",
- enableJsonpCallback: false,
- callbackParameterName: "p",
- httpClient: mockClient
- });
-
- cache.readRange(0, 10).then(function (arr) {
- djstest.fail("unexpected callback into readRange in test cacheOptionsTunnelTest");
- if (!doneCalled) {
- doneCalled = true;
- djstest.done();
- }
- });
- });
-
- djstest.addTest(function dataCacheHandlesFullStoreTest() {
-
- var TestStore = function (name) {
- var that = new window.odatajs.MemoryStore(name);
- that.addOrUpdate = function (key, value, success, error) {
- if (key === "__settings") {
- window.setTimeout(function () {
- success(key, value);
- }, 0);
- } else {
- window.setTimeout(function () {
- error({ name: "QUOTA_EXCEEDED_ERR" });
- }, 0);
- }
- };
- return that;
- };
-
- TestStore.create = function (name) {
- return new TestStore(name);
- };
-
- TestStore.isSupported = function () {
- return true;
- };
-
- var cacheSource = {
- identifier: "testSource",
- count: function (success) {
- djstest.fail("cacheSource.count was called");
- success(5);
- },
- read: function (index, count, success, error) {
- djstest.assertAreEqual(index, 0, "index is the expected one");
- djstest.assertAreEqual(count, 5, "test is the expected one");
-
- setTimeout(function () {
- success({ value: [1, 2, 3, 4, 5] });
- }, 0);
- }
- };
-
- var originalCreateStore = window.odatajs.createStore;
-
- window.odatajs.createStore = function (name, mechanism) {
- return TestStore(name);
- };
-
- try {
- var cache = odatajs.createDataCache({
- name: "cache",
- pageSize: 5,
- prefetchSize: 0,
- source: cacheSource,
- mechanism: "teststore"
- });
- } finally {
- window.odatajs.createStore = originalCreateStore;
- }
-
- cache.readRange(0, 5).then(function (data) {
- djstest.assertAreEqual(data.value.length, 5, "5 items were read.");
- cache.readRange(0, 5).then(function (data) {
- djstest.assertAreEqual(data.value.length, 5, "5 items were read.");
- djstest.done();
- }, thenFailTest);
- }, thenFailTest);
- });
-
- // DATAJS INTERNAL END
-})(this);
\ No newline at end of file
[05/22] olingo-odata4-js git commit: [OLINGO-442] Cleanup bevor
release
Posted by ko...@apache.org.
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/odata-json-tests.js
----------------------------------------------------------------------
diff --git a/JSLib/tests/odata-json-tests.js b/JSLib/tests/odata-json-tests.js
deleted file mode 100644
index f86e86f..0000000
--- a/JSLib/tests/odata-json-tests.js
+++ /dev/null
@@ -1,888 +0,0 @@
-/// <reference path="../src/odata-net.js" />
-/// <reference path="../src/odata.js" />
-/// <reference path="../common/djstestfx.js" />
-
-// odata-tests.js
-
-(function (window, undefined) {
-
- // DATAJS INTERNAL START
- djstest.addTest(function isArrayTest() {
- djstest.assert(odatajs.isArray([]));
- djstest.assert(odatajs.isArray([1, 2]));
- djstest.assert(!odatajs.isArray({}));
- djstest.assert(!odatajs.isArray("1,2,3,4"));
- djstest.assert(!odatajs.isArray());
- djstest.assert(!odatajs.isArray(null));
- djstest.done();
- });
-
- djstest.addTest(function jsonParserTest() {
- var tests = [
- { context: { response: { requestUri: "http://base.org" }, dataServiceVersion: "4.0" }, expected: {} },
- { context: { response: { requestUri: "http://base.org" }, dataServiceVersion: "4.0" },
- expected: {
- "@odata.context": "http://foo/OData.svc/$metadata",
- value: [
- {
- name: "Products",
- kind: "EntitySet",
- url: "Products"
- },
- {
- name: "ProductDetails",
- kind: "EntitySet",
- url: "ProductDetails"
- }
- ]
- }
- },
- { context: { response: { requestUri: "http://base.org" }, dataServiceVersion: "4.0" },
- expected: {
- value: [
- {
- name: "Products",
- kind: "EntitySet",
- url: "http://foo/OData.svc/Products"
- },
- {
- name: "ProductDetails",
- kind: "EntitySet",
- url: "http://foo/OData.svc/ProductDetails"
- }
- ]
- }
- },
- { context: { response: { requestUri: "http://base.org" }, dataServiceVersion: "4.0" }, expected: { "@odata.context": "http://foo/OData.svc/$metadata#Products(0)/Name", value: "Bread"} },
- { context: { response: { requestUri: "http://base.org" }, dataServiceVersion: "4.0" },
- expected: {
- "@odata.context": "http://foo/OData.svc/$metadata#Products",
- value: [
- {
- "@odata.type": "#ODataDemo.Product",
- "@odata.id": "http://foo/OData.svc/Products(0)",
- "@odata.editLink": "Products(0)",
- "Categories@odata.navigationLink": "Products(0)/Categories",
- "Categories@odata.associationLink": "Products(0)/Categories/$ref",
- "Supplier@odata.navigationLink": "Products(0)/Supplier",
- "Supplier@odata.associationLink": "Products(0)/Supplier/$ref",
- "ProductDetail@odata.navigationLink": "Products(0)/ProductDetail",
- "ProductDetail@odata.associationLink": "Products(0)/ProductDetail/$ref",
- ID: 0,
- Name: "Bread",
- Description: "Whole grain bread",
- "ReleaseDate@odata.type": "#DateTimeOffset",
- ReleaseDate: "1992-01-01T00:00:00Z",
- DiscontinuedDate: null,
- "Rating@odata.type": "#Int16",
- Rating: 4,
- Price: 2.5
- }]
- }
- },
- { context: { response: { requestUri: "http://base.org" }, dataServiceVersion: "4.0" },
- expected: {
- "@odata.context": "http://foo/OData.svc/$metadata#Products",
- value: [
- {
- ID: 0,
- Name: "Bread",
- Description: "Whole grain bread",
- ReleaseDate: "1992-01-01T00:00:00Z",
- DiscontinuedDate: null,
- Rating: 4,
- Price: 2.5
- }]
- }
- },
- { context: { response: { requestUri: "http://base.org" }, dataServiceVersion: "4.0" },
- expected: {
- value: [
- {
- ID: 0,
- Name: "Bread",
- Description: "Whole grain bread",
- ReleaseDate: "1992-01-01T00:00:00Z",
- DiscontinuedDate: null,
- Rating: 4,
- Price: 2.5
- }]
- }
- },
- { context: { response: { requestUri: "http://base.org" }, dataServiceVersion: "4.0" },
- expected: {
- "@odata.context": "http://foo/OData.svc/$metadata#Products/$entry",
- "@odata.type": "#ODataDemo.Product",
- "@odata.id": "http://foo/OData.svc/Products(0)",
- "@odata.editLink": "Products(0)",
- "Categories@odata.navigationLink": "Products(0)/Categories",
- "Categories@odata.associationLink": "Products(0)/Categories/$ref",
- "Supplier@odata.navigationLink": "Products(0)/Supplier",
- "Supplier@odata.associationLink": "Products(0)/Supplier/$ref",
- "ProductDetail@odata.navigationLink": "Products(0)/ProductDetail",
- "ProductDetail@odata.associationLink": "Products(0)/ProductDetail/$ref",
- ID: 0,
- Name: "Bread",
- Description: "Whole grain bread",
- "ReleaseDate@odata.type": "#DateTimeOffset",
- ReleaseDate: "1992-01-01T00:00:00Z",
- DiscontinuedDate: null,
- "Rating@odata.type": "#Int16",
- Rating: 4,
- Price: 2.5
- }
- },
- { context: { response: { requestUri: "http://base.org" }, dataServiceVersion: "4.0" },
- expected: {
- "@odata.context": "http://foo/OData.svc/$metadata#Products/$entry",
- ID: 0,
- Name: "Bread",
- Description: "Whole grain bread",
- ReleaseDate: "1992-01-01T00:00:00Z",
- DiscontinuedDate: null,
- Rating: 4,
- Price: 2.5
- }
- },
- { context: { response: { requestUri: "http://base.org" }, dataServiceVersion: "4.0" },
- expected: {
- ID: 0,
- Name: "Bread",
- Description: "Whole grain bread",
- ReleaseDate: "1992-01-01T00:00:00Z",
- DiscontinuedDate: null,
- Rating: 4,
- Price: 2.5
- }
- },
- { context: { response: { requestUri: "http://base.org" }, dataServiceVersion: "4.0" },
- expected: {
- "@odata.context": "http://foo/$metadata#Customer(-10)/PrimaryContactInfo/AlternativeNames",
- "@odata.type": "#Collection(String)",
- value: [
- "グぁマせぺネソぁぼソひバたぴソ歹九ネボボяポソ畚クяせべ歹珱Я欲タハバミ裹ぼボをヲ歹んひ九ひ匚ぁa",
- "qckrnuruxcbhjfimnsykgfquffobcadpsaocixoeljhspxrhebkudppgndgcrlyvynqhbujrnvyxyymhnroemigogsqulvgallta",
- "btsnhqrjqryqzgxducl",
- "qbtlssjhunufmzdv",
- "ボんЯぜチべゼボボほa匚ミぼ九ぁひチ珱黑ミんぁタび暦クソソボゾんんあゼぞひタボタぜん弌ひべ匚",
- "vicqasfdkxsuyuzspjqunxpyfuhlxfhgfqnlcpdfivqnxqoothnfsbuykfguftgulgldnkkzufssbae",
- "九ソミせボぜゾボёaをぜЯまゾタぜタひ縷ダんaバたゼソ",
- "ぽマタぁぁ黑ソゼミゼ匚zソダマぁァゾぽミaタゾ弌ミゼタそzぺポせ裹バポハハヲぺチあマ匚ミ",
- "hssiißuamtctgqhglmusexyikhcsqctusonubxorssyizhyqpbtbdßjnelxqttkhdalabibuqhiubtßsptrmzelud",
- "gbjssllxzzxkmßppyyrhgmoeßizlcmsuqqnvjßudszevtfunflqzqcuubukypßqjcix"
- ]
- }
- }
- ];
-
- var i, len;
- for (i = 0, len = tests.length; i < len; i++) {
- var data = window.JSON.stringify(tests[i].expected);
- var actual = OData.jsonParser(OData.jsonHandler, data, tests[i].context);
- djstest.assertAreEqualDeep(actual, tests[i].expected, "test " + i + "didn't return the expected data");
- }
-
- djstest.done();
- });
-
- djstest.addTest(function jsonSerializerTest() {
- var tests = [
- { context: { response: { requestUri: "http://base.org" }, dataServiceVersion: "4.0" }, expected: { value: ""} },
- { context: { response: { requestUri: "http://base.org" }, dataServiceVersion: "4.0" }, expected: { value: []} },
- { context: { response: { requestUri: "http://base.org" }, dataServiceVersion: "4.0" },
- expected: {
- ID: 0,
- Name: "Bread",
- Description: "Whole grain bread",
- ReleaseDate: "1992-01-01T00:00:00Z",
- DiscontinuedDate: null,
- Rating: 4,
- Price: 2.5
- }
- },
- { context: { response: { requestUri: "http://base.org" }, dataServiceVersion: "4.0" },
- expected: {
- value: [
- "グぁマせぺネソぁぼソひバたぴソ歹九ネボボяポソ畚クяせべ歹珱Я欲タハバミ裹ぼボをヲ歹んひ九ひ匚ぁa",
- "qckrnuruxcbhjfimnsykgfquffobcadpsaocixoeljhspxrhebkudppgndgcrlyvynqhbujrnvyxyymhnroemigogsqulvgallta",
- "btsnhqrjqryqzgxducl",
- "qbtlssjhunufmzdv",
- "ボんЯぜチべゼボボほa匚ミぼ九ぁひチ珱黑ミんぁタび暦クソソボゾんんあゼぞひタボタぜん弌ひべ匚",
- "vicqasfdkxsuyuzspjqunxpyfuhlxfhgfqnlcpdfivqnxqoothnfsbuykfguftgulgldnkkzufssbae",
- "九ソミせボぜゾボёaをぜЯまゾタぜタひ縷ダんaバたゼソ",
- "ぽマタぁぁ黑ソゼミゼ匚zソダマぁァゾぽミaタゾ弌ミゼタそzぺポせ裹バポハハヲぺチあマ匚ミ",
- "hssiißuamtctgqhglmusexyikhcsqctusonubxorssyizhyqpbtbdßjnelxqttkhdalabibuqhiubtßsptrmzelud",
- "gbjssllxzzxkmßppyyrhgmoeßizlcmsuqqnvjßudszevtfunflqzqcuubukypßqjcix"
- ]
- }
- },
- { context: { response: { requestUri: "http://base.org" }, dataServiceVersion: "4.0" },
- expected: {
- "@odata.etag": "W/MjAxMy0wNS0yN1QxMTo1OFo=",
- "@odata.type": "#DataJS.Tests.V4.Food",
- "@odata.mediaEditLink": "http://base.org/$metadata#Foods/mediaEditLink",
- "@odata.mediaReadLink": "http://base.org/$metadata#Foods/mediaReadLink",
- "@odata.mediaContentType": "http://base.org/$metadata#Foods/mediaContentType",
- "@odata.mediaEtag": "http://base.org/$metadata#Foods/mediaEtag",
- ID: 0,
- Name: "Bread",
- Description: "Whole grain bread",
- ReleaseDate: "1992-01-01T00:00:00Z",
- DiscontinuedDate: null,
- Rating: 4,
- Price: 2.5
- },
- data: {
- "@odata.context": "http://base.org/$metadata#Foods/$entity",
- "@odata.id": "Foods(4)",
- "@odata.etag": "W/MjAxMy0wNS0yN1QxMTo1OFo=",
- "@odata.editLink": "Foods(0)",
- "@odata.type": "#DataJS.Tests.V4.Food",
- "@odata.mediaEditLink": "http://base.org/$metadata#Foods/mediaEditLink",
- "@odata.mediaReadLink": "http://base.org/$metadata#Foods/mediaReadLink",
- "@odata.mediaContentType": "http://base.org/$metadata#Foods/mediaContentType",
- "@odata.mediaEtag": "http://base.org/$metadata#Foods/mediaEtag",
- ID: 0,
- Name: "Bread",
- Description: "Whole grain bread",
- ReleaseDate: "1992-01-01T00:00:00Z",
- DiscontinuedDate: null,
- Rating: 4,
- Price: 2.5
- }
- },
- { context: { response: { requestUri: "http://base.org" }, dataServiceVersion: "4.0" },
- expected: {
- value : [{
- "@odata.etag": "W/MjAxMy0wNS0yN1QxMTo1OFo=",
- "@odata.type": "#DataJS.Tests.V4.Food",
- "@odata.mediaEditLink": "http://base.org/$metadata#Foods/mediaEditLink",
- "@odata.mediaReadLink": "http://base.org/$metadata#Foods/mediaReadLink",
- "@odata.mediaContentType": "http://base.org/$metadata#Foods/mediaContentType",
- "@odata.mediaEtag": "http://base.org/$metadata#Foods/mediaEtag",
- ID: 0,
- ComplexInLayerOne:
- {
- "@odata.etag": "W/MjAxMy0wNS0yN1QxMTo1OFo=",
- "@odata.type": "#DataJS.Tests.V4.Food",
- "@odata.mediaEditLink": "http://base.org/$metadata#Foods/mediaEditLink/layer1",
- "@odata.mediaReadLink": "http://base.org/$metadata#Foods/mediaReadLink/layer1",
- "@odata.mediaContentType": "http://base.org/$metadata#Foods/mediaContentType/layer1",
- "@odata.mediaEtag": "http://base.org/$metadata#Foods/mediaEtag/layer1",
- ID: 1,
- ComplexInLayerTwo:
- {
- "@odata.etag": "W/MjAxMy0wNS0yN1QxMTo1OFo=",
- "@odata.type": "#DataJS.Tests.V4.Food",
- "@odata.mediaEditLink": "http://base.org/$metadata#Foods/mediaEditLink/layer2",
- "@odata.mediaReadLink": "http://base.org/$metadata#Foods/mediaReadLink/layer2",
- "@odata.mediaContentType": "http://base.org/$metadata#Foods/mediaContentType/layer2",
- "@odata.mediaEtag": "http://base.org/$metadata#Foods/mediaEtag/layer2",
- ID: 2,
- ComplexInLayerThreeList: [
- {
- "@odata.etag": "W/MjAxMy0wNS0yN1QxMTo1OFo=",
- "@odata.type": "#DataJS.Tests.V4.Food",
- "@odata.mediaEditLink": "http://base.org/$metadata#Foods/mediaEditLink/layer3",
- "@odata.mediaReadLink": "http://base.org/$metadata#Foods/mediaReadLink/layer3",
- "@odata.mediaContentType": "http://base.org/$metadata#Foods/mediaContentType/layer3",
- "@odata.mediaEtag": "http://base.org/$metadata#Foods/mediaEtag/layer3",
- ID: 3,
- Name: "BreadInLayer3",
- Description: "Whole grain bread inLayer3",
- ReleaseDate: "1992-01-01T00:00:00Z",
- DiscontinuedDate: null,
- Rating: 7,
- Price: 5.5
- },
- {
- "@odata.etag": "W/MjAxMy0wNS0yN1QxMTo1OFo=",
- "@odata.type": "#DataJS.Tests.V4.Food",
- "@odata.mediaEditLink": "http://base.org/$metadata#Foods/mediaEditLink/layer3",
- "@odata.mediaReadLink": "http://base.org/$metadata#Foods/mediaReadLink/layer3",
- "@odata.mediaContentType": "http://base.org/$metadata#Foods/mediaContentType/layer3",
- "@odata.mediaEtag": "http://base.org/$metadata#Foods/mediaEtag/layer3",
- ID: 3,
- Name: "BreadInLayer3",
- Description: "Whole grain bread inLayer3",
- ReleaseDate: "1992-01-01T00:00:00Z",
- DiscontinuedDate: null,
- Rating: 7,
- Price: 5.5
- }],
- Name: "BreadInLayer2",
- Description: "Whole grain bread inLayer2",
- ReleaseDate: "1992-01-01T00:00:00Z",
- DiscontinuedDate: null,
- Rating: 6,
- Price: 4.5
- },
- Name: ["BreadInLayer1", "BreadInLayer12", "BreadInLayer13"],
- Description: "Whole grain bread inLayer1",
- ReleaseDate: "1992-01-01T00:00:00Z",
- DiscontinuedDate: null,
- Rating: 5,
- Price: 3.5
- },
- Name: "Bread",
- Description: "Whole grain bread",
- ReleaseDate: "1992-01-01T00:00:00Z",
- DiscontinuedDate: null,
- Rating: 4,
- Price: 2.5
- },
- {
- "@odata.etag": "W/MjAxMy0wNS0yN1QxMTo1OFo=",
- "@odata.type": "#DataJS.Tests.V4.Food",
- "@odata.mediaEditLink": "http://base.org/$metadata#Foods/mediaEditLink",
- "@odata.mediaReadLink": "http://base.org/$metadata#Foods/mediaReadLink",
- "@odata.mediaContentType": "http://base.org/$metadata#Foods/mediaContentType",
- "@odata.mediaEtag": "http://base.org/$metadata#Foods/mediaEtag",
- ID: 0,
- ComplexInLayerOne:
- {
- "@odata.etag": "W/MjAxMy0wNS0yN1QxMTo1OFo=",
- "@odata.type": "#DataJS.Tests.V4.Food",
- "@odata.mediaEditLink": "http://base.org/$metadata#Foods/mediaEditLink/layer1",
- "@odata.mediaReadLink": "http://base.org/$metadata#Foods/mediaReadLink/layer1",
- "@odata.mediaContentType": "http://base.org/$metadata#Foods/mediaContentType/layer1",
- "@odata.mediaEtag": "http://base.org/$metadata#Foods/mediaEtag/layer1",
- ID: 1,
- ComplexInLayerTwo:
- {
- "@odata.etag": "W/MjAxMy0wNS0yN1QxMTo1OFo=",
- "@odata.type": "#DataJS.Tests.V4.Food",
- "@odata.mediaEditLink": "http://base.org/$metadata#Foods/mediaEditLink/layer2",
- "@odata.mediaReadLink": "http://base.org/$metadata#Foods/mediaReadLink/layer2",
- "@odata.mediaContentType": "http://base.org/$metadata#Foods/mediaContentType/layer2",
- "@odata.mediaEtag": "http://base.org/$metadata#Foods/mediaEtag/layer2",
- ID: 2,
- ComplexInLayerThreeList: [
- {
- "@odata.etag": "W/MjAxMy0wNS0yN1QxMTo1OFo=",
- "@odata.type": "#DataJS.Tests.V4.Food",
- "@odata.mediaEditLink": "http://base.org/$metadata#Foods/mediaEditLink/layer3",
- "@odata.mediaReadLink": "http://base.org/$metadata#Foods/mediaReadLink/layer3",
- "@odata.mediaContentType": "http://base.org/$metadata#Foods/mediaContentType/layer3",
- "@odata.mediaEtag": "http://base.org/$metadata#Foods/mediaEtag/layer3",
- ID: 3,
- Name: "BreadInLayer3",
- Description: "Whole grain bread inLayer3",
- ReleaseDate: "1992-01-01T00:00:00Z",
- DiscontinuedDate: null,
- Rating: 7,
- Price: 5.5
- },
- {
- "@odata.etag": "W/MjAxMy0wNS0yN1QxMTo1OFo=",
- "@odata.type": "#DataJS.Tests.V4.Food",
- "@odata.mediaEditLink": "http://base.org/$metadata#Foods/mediaEditLink/layer3",
- "@odata.mediaReadLink": "http://base.org/$metadata#Foods/mediaReadLink/layer3",
- "@odata.mediaContentType": "http://base.org/$metadata#Foods/mediaContentType/layer3",
- "@odata.mediaEtag": "http://base.org/$metadata#Foods/mediaEtag/layer3",
- ID: 3,
- Name: "BreadInLayer3",
- Description: "Whole grain bread inLayer3",
- ReleaseDate: "1992-01-01T00:00:00Z",
- DiscontinuedDate: null,
- Rating: 7,
- Price: 5.5
- }],
- Name: "BreadInLayer2",
- Description: "Whole grain bread inLayer2",
- ReleaseDate: "1992-01-01T00:00:00Z",
- DiscontinuedDate: null,
- Rating: 6,
- Price: 4.5
- },
- Name: ["BreadInLayer1", "BreadInLayer12", "BreadInLayer13"],
- Description: "Whole grain bread inLayer1",
- ReleaseDate: "1992-01-01T00:00:00Z",
- DiscontinuedDate: null,
- Rating: 5,
- Price: 3.5
- },
- Name: "Bread",
- Description: "Whole grain bread",
- ReleaseDate: "1992-01-01T00:00:00Z",
- DiscontinuedDate: null,
- Rating: 4,
- Price: 2.5
- }]
- },
- data: {
- "@odata.context": "http://base.org/$metadata#Foods/$entity",
- "@odata.id": "Foods(4)",
- "@odata.editLink": "Foods(0)",
- value : [{
- "@odata.context": "http://base.org/$metadata#Foods/$entity",
- "@odata.id": "Foods(4)",
- "@odata.etag": "W/MjAxMy0wNS0yN1QxMTo1OFo=",
- "@odata.editLink": "Foods(0)",
- "@odata.type": "#DataJS.Tests.V4.Food",
- "@odata.mediaEditLink": "http://base.org/$metadata#Foods/mediaEditLink",
- "@odata.mediaReadLink": "http://base.org/$metadata#Foods/mediaReadLink",
- "@odata.mediaContentType": "http://base.org/$metadata#Foods/mediaContentType",
- "@odata.mediaEtag": "http://base.org/$metadata#Foods/mediaEtag",
- ID: 0,
- ComplexInLayerOne:
- {
- "@odata.context": "http://base.org/$metadata#Foods/$entity",
- "@odata.id": "Foods(4)",
- "@odata.etag": "W/MjAxMy0wNS0yN1QxMTo1OFo=",
- "@odata.editLink": "Foods(0)",
- "@odata.type": "#DataJS.Tests.V4.Food",
- "@odata.mediaEditLink": "http://base.org/$metadata#Foods/mediaEditLink/layer1",
- "@odata.mediaReadLink": "http://base.org/$metadata#Foods/mediaReadLink/layer1",
- "@odata.mediaContentType": "http://base.org/$metadata#Foods/mediaContentType/layer1",
- "@odata.mediaEtag": "http://base.org/$metadata#Foods/mediaEtag/layer1",
- ID: 1,
- ComplexInLayerTwo:
- {
- "@odata.context": "http://base.org/$metadata#Foods/$entity",
- "@odata.id": "Foods(4)",
- "@odata.etag": "W/MjAxMy0wNS0yN1QxMTo1OFo=",
- "@odata.editLink": "Foods(0)",
- "@odata.type": "#DataJS.Tests.V4.Food",
- "@odata.mediaEditLink": "http://base.org/$metadata#Foods/mediaEditLink/layer2",
- "@odata.mediaReadLink": "http://base.org/$metadata#Foods/mediaReadLink/layer2",
- "@odata.mediaContentType": "http://base.org/$metadata#Foods/mediaContentType/layer2",
- "@odata.mediaEtag": "http://base.org/$metadata#Foods/mediaEtag/layer2",
- ID: 2,
- ComplexInLayerThreeList: [
- {
- "@odata.context": "http://base.org/$metadata#Foods/$entity",
- "@odata.id": "Foods(4)",
- "@odata.etag": "W/MjAxMy0wNS0yN1QxMTo1OFo=",
- "@odata.editLink": "Foods(0)",
- "@odata.type": "#DataJS.Tests.V4.Food",
- "@odata.mediaEditLink": "http://base.org/$metadata#Foods/mediaEditLink/layer3",
- "@odata.mediaReadLink": "http://base.org/$metadata#Foods/mediaReadLink/layer3",
- "@odata.mediaContentType": "http://base.org/$metadata#Foods/mediaContentType/layer3",
- "@odata.mediaEtag": "http://base.org/$metadata#Foods/mediaEtag/layer3",
- ID: 3,
- Name: "BreadInLayer3",
- Description: "Whole grain bread inLayer3",
- ReleaseDate: "1992-01-01T00:00:00Z",
- DiscontinuedDate: null,
- Rating: 7,
- Price: 5.5
- },
- {
- "@odata.context": "http://base.org/$metadata#Foods/$entity",
- "@odata.id": "Foods(4)",
- "@odata.etag": "W/MjAxMy0wNS0yN1QxMTo1OFo=",
- "@odata.editLink": "Foods(0)",
- "@odata.type": "#DataJS.Tests.V4.Food",
- "@odata.mediaEditLink": "http://base.org/$metadata#Foods/mediaEditLink/layer3",
- "@odata.mediaReadLink": "http://base.org/$metadata#Foods/mediaReadLink/layer3",
- "@odata.mediaContentType": "http://base.org/$metadata#Foods/mediaContentType/layer3",
- "@odata.mediaEtag": "http://base.org/$metadata#Foods/mediaEtag/layer3",
- ID: 3,
- Name: "BreadInLayer3",
- Description: "Whole grain bread inLayer3",
- ReleaseDate: "1992-01-01T00:00:00Z",
- DiscontinuedDate: null,
- Rating: 7,
- Price: 5.5
- }],
- Name: "BreadInLayer2",
- Description: "Whole grain bread inLayer2",
- ReleaseDate: "1992-01-01T00:00:00Z",
- DiscontinuedDate: null,
- Rating: 6,
- Price: 4.5
- },
- Name: ["BreadInLayer1", "BreadInLayer12", "BreadInLayer13"],
- Description: "Whole grain bread inLayer1",
- ReleaseDate: "1992-01-01T00:00:00Z",
- DiscontinuedDate: null,
- Rating: 5,
- Price: 3.5
- },
- Name: "Bread",
- Description: "Whole grain bread",
- ReleaseDate: "1992-01-01T00:00:00Z",
- DiscontinuedDate: null,
- Rating: 4,
- Price: 2.5
- },
- {
- "@odata.context": "http://base.org/$metadata#Foods/$entity",
- "@odata.id": "Foods(4)",
- "@odata.etag": "W/MjAxMy0wNS0yN1QxMTo1OFo=",
- "@odata.editLink": "Foods(0)",
- "@odata.type": "#DataJS.Tests.V4.Food",
- "@odata.mediaEditLink": "http://base.org/$metadata#Foods/mediaEditLink",
- "@odata.mediaReadLink": "http://base.org/$metadata#Foods/mediaReadLink",
- "@odata.mediaContentType": "http://base.org/$metadata#Foods/mediaContentType",
- "@odata.mediaEtag": "http://base.org/$metadata#Foods/mediaEtag",
- ID: 0,
- ComplexInLayerOne:
- {
- "@odata.context": "http://base.org/$metadata#Foods/$entity",
- "@odata.id": "Foods(4)",
- "@odata.etag": "W/MjAxMy0wNS0yN1QxMTo1OFo=",
- "@odata.editLink": "Foods(0)",
- "@odata.type": "#DataJS.Tests.V4.Food",
- "@odata.mediaEditLink": "http://base.org/$metadata#Foods/mediaEditLink/layer1",
- "@odata.mediaReadLink": "http://base.org/$metadata#Foods/mediaReadLink/layer1",
- "@odata.mediaContentType": "http://base.org/$metadata#Foods/mediaContentType/layer1",
- "@odata.mediaEtag": "http://base.org/$metadata#Foods/mediaEtag/layer1",
- ID: 1,
- ComplexInLayerTwo:
- {
- "@odata.context": "http://base.org/$metadata#Foods/$entity",
- "@odata.id": "Foods(4)",
- "@odata.etag": "W/MjAxMy0wNS0yN1QxMTo1OFo=",
- "@odata.editLink": "Foods(0)",
- "@odata.type": "#DataJS.Tests.V4.Food",
- "@odata.mediaEditLink": "http://base.org/$metadata#Foods/mediaEditLink/layer2",
- "@odata.mediaReadLink": "http://base.org/$metadata#Foods/mediaReadLink/layer2",
- "@odata.mediaContentType": "http://base.org/$metadata#Foods/mediaContentType/layer2",
- "@odata.mediaEtag": "http://base.org/$metadata#Foods/mediaEtag/layer2",
- ID: 2,
- ComplexInLayerThreeList: [
- {
- "@odata.context": "http://base.org/$metadata#Foods/$entity",
- "@odata.id": "Foods(4)",
- "@odata.etag": "W/MjAxMy0wNS0yN1QxMTo1OFo=",
- "@odata.editLink": "Foods(0)",
- "@odata.type": "#DataJS.Tests.V4.Food",
- "@odata.mediaEditLink": "http://base.org/$metadata#Foods/mediaEditLink/layer3",
- "@odata.mediaReadLink": "http://base.org/$metadata#Foods/mediaReadLink/layer3",
- "@odata.mediaContentType": "http://base.org/$metadata#Foods/mediaContentType/layer3",
- "@odata.mediaEtag": "http://base.org/$metadata#Foods/mediaEtag/layer3",
- ID: 3,
- Name: "BreadInLayer3",
- Description: "Whole grain bread inLayer3",
- ReleaseDate: "1992-01-01T00:00:00Z",
- DiscontinuedDate: null,
- Rating: 7,
- Price: 5.5
- },
- {
- "@odata.context": "http://base.org/$metadata#Foods/$entity",
- "@odata.id": "Foods(4)",
- "@odata.etag": "W/MjAxMy0wNS0yN1QxMTo1OFo=",
- "@odata.editLink": "Foods(0)",
- "@odata.type": "#DataJS.Tests.V4.Food",
- "@odata.mediaEditLink": "http://base.org/$metadata#Foods/mediaEditLink/layer3",
- "@odata.mediaReadLink": "http://base.org/$metadata#Foods/mediaReadLink/layer3",
- "@odata.mediaContentType": "http://base.org/$metadata#Foods/mediaContentType/layer3",
- "@odata.mediaEtag": "http://base.org/$metadata#Foods/mediaEtag/layer3",
- ID: 3,
- Name: "BreadInLayer3",
- Description: "Whole grain bread inLayer3",
- ReleaseDate: "1992-01-01T00:00:00Z",
- DiscontinuedDate: null,
- Rating: 7,
- Price: 5.5
- }],
- Name: "BreadInLayer2",
- Description: "Whole grain bread inLayer2",
- ReleaseDate: "1992-01-01T00:00:00Z",
- DiscontinuedDate: null,
- Rating: 6,
- Price: 4.5
- },
- Name: ["BreadInLayer1", "BreadInLayer12", "BreadInLayer13"],
- Description: "Whole grain bread inLayer1",
- ReleaseDate: "1992-01-01T00:00:00Z",
- DiscontinuedDate: null,
- Rating: 5,
- Price: 3.5
- },
- Name: "Bread",
- Description: "Whole grain bread",
- ReleaseDate: "1992-01-01T00:00:00Z",
- DiscontinuedDate: null,
- Rating: 4,
- Price: 2.5
- }]
- }
- },
- { context: { response: { requestUri: "http://base.org" }, dataServiceVersion: "4.0" },
- expected: {
- "@odata.etag": "W/MjAxMy0wNS0yN1QxMTo1OFo=",
- "@odata.type": "#DataJS.Tests.V4.Food",
- "@odata.mediaEditLink": "http://base.org/$metadata#Foods/mediaEditLink",
- "@odata.mediaReadLink": "http://base.org/$metadata#Foods/mediaReadLink",
- "@odata.mediaContentType": "http://base.org/$metadata#Foods/mediaContentType",
- "@odata.mediaEtag": "http://base.org/$metadata#Foods/mediaEtag",
- ID: 0,
- ComplexInLayerOne:
- {
- "@odata.etag": "W/MjAxMy0wNS0yN1QxMTo1OFo=",
- "@odata.type": "#DataJS.Tests.V4.Food",
- "@odata.mediaEditLink": "http://base.org/$metadata#Foods/mediaEditLink/layer1",
- "@odata.mediaReadLink": "http://base.org/$metadata#Foods/mediaReadLink/layer1",
- "@odata.mediaContentType": "http://base.org/$metadata#Foods/mediaContentType/layer1",
- "@odata.mediaEtag": "http://base.org/$metadata#Foods/mediaEtag/layer1",
- ID: 1,
- ComplexInLayerTwo:
- {
- "@odata.etag": "W/MjAxMy0wNS0yN1QxMTo1OFo=",
- "@odata.type": "#DataJS.Tests.V4.Food",
- "@odata.mediaEditLink": "http://base.org/$metadata#Foods/mediaEditLink/layer2",
- "@odata.mediaReadLink": "http://base.org/$metadata#Foods/mediaReadLink/layer2",
- "@odata.mediaContentType": "http://base.org/$metadata#Foods/mediaContentType/layer2",
- "@odata.mediaEtag": "http://base.org/$metadata#Foods/mediaEtag/layer2",
- ID: 2,
- ComplexInLayerThree:
- {
- "@odata.etag": "W/MjAxMy0wNS0yN1QxMTo1OFo=",
- "@odata.type": "#DataJS.Tests.V4.Food",
- "@odata.mediaEditLink": "http://base.org/$metadata#Foods/mediaEditLink/layer3",
- "@odata.mediaReadLink": "http://base.org/$metadata#Foods/mediaReadLink/layer3",
- "@odata.mediaContentType": "http://base.org/$metadata#Foods/mediaContentType/layer3",
- "@odata.mediaEtag": "http://base.org/$metadata#Foods/mediaEtag/layer3",
- ID: 3,
- Name: "BreadInLayer3",
- Description: "Whole grain bread inLayer3",
- ReleaseDate: "1992-01-01T00:00:00Z",
- DiscontinuedDate: null,
- Rating: 7,
- Price: 5.5
- },
- Name: "BreadInLayer2",
- Description: "Whole grain bread inLayer2",
- ReleaseDate: "1992-01-01T00:00:00Z",
- DiscontinuedDate: null,
- Rating: 6,
- Price: 4.5
- },
- Name: "BreadInLayer1",
- Description: "Whole grain bread inLayer1",
- ReleaseDate: "1992-01-01T00:00:00Z",
- DiscontinuedDate: null,
- Rating: 5,
- Price: 3.5
- },
- Name: "Bread",
- Description: "Whole grain bread",
- ReleaseDate: "1992-01-01T00:00:00Z",
- DiscontinuedDate: null,
- Rating: 4,
- Price: 2.5
- },
- data: {
- "@odata.context": "http://base.org/$metadata#Foods/$entity",
- "@odata.id": "Foods(4)",
- "@odata.etag": "W/MjAxMy0wNS0yN1QxMTo1OFo=",
- "@odata.editLink": "Foods(0)",
- "@odata.type": "#DataJS.Tests.V4.Food",
- "@odata.mediaEditLink": "http://base.org/$metadata#Foods/mediaEditLink",
- "@odata.mediaReadLink": "http://base.org/$metadata#Foods/mediaReadLink",
- "@odata.mediaContentType": "http://base.org/$metadata#Foods/mediaContentType",
- "@odata.mediaEtag": "http://base.org/$metadata#Foods/mediaEtag",
- ID: 0,
- ComplexInLayerOne:
- {
- "@odata.context": "http://base.org/$metadata#Foods/$entity",
- "@odata.id": "Foods(4)",
- "@odata.etag": "W/MjAxMy0wNS0yN1QxMTo1OFo=",
- "@odata.editLink": "Foods(0)",
- "@odata.type": "#DataJS.Tests.V4.Food",
- "@odata.mediaEditLink": "http://base.org/$metadata#Foods/mediaEditLink/layer1",
- "@odata.mediaReadLink": "http://base.org/$metadata#Foods/mediaReadLink/layer1",
- "@odata.mediaContentType": "http://base.org/$metadata#Foods/mediaContentType/layer1",
- "@odata.mediaEtag": "http://base.org/$metadata#Foods/mediaEtag/layer1",
- ID: 1,
- ComplexInLayerTwo:
- {
- "@odata.context": "http://base.org/$metadata#Foods/$entity",
- "@odata.id": "Foods(4)",
- "@odata.etag": "W/MjAxMy0wNS0yN1QxMTo1OFo=",
- "@odata.editLink": "Foods(0)",
- "@odata.type": "#DataJS.Tests.V4.Food",
- "@odata.mediaEditLink": "http://base.org/$metadata#Foods/mediaEditLink/layer2",
- "@odata.mediaReadLink": "http://base.org/$metadata#Foods/mediaReadLink/layer2",
- "@odata.mediaContentType": "http://base.org/$metadata#Foods/mediaContentType/layer2",
- "@odata.mediaEtag": "http://base.org/$metadata#Foods/mediaEtag/layer2",
- ID: 2,
- ComplexInLayerThree:
- {
- "@odata.context": "http://base.org/$metadata#Foods/$entity",
- "@odata.id": "Foods(4)",
- "@odata.etag": "W/MjAxMy0wNS0yN1QxMTo1OFo=",
- "@odata.editLink": "Foods(0)",
- "@odata.type": "#DataJS.Tests.V4.Food",
- "@odata.mediaEditLink": "http://base.org/$metadata#Foods/mediaEditLink/layer3",
- "@odata.mediaReadLink": "http://base.org/$metadata#Foods/mediaReadLink/layer3",
- "@odata.mediaContentType": "http://base.org/$metadata#Foods/mediaContentType/layer3",
- "@odata.mediaEtag": "http://base.org/$metadata#Foods/mediaEtag/layer3",
- ID: 3,
- Name: "BreadInLayer3",
- Description: "Whole grain bread inLayer3",
- ReleaseDate: "1992-01-01T00:00:00Z",
- DiscontinuedDate: null,
- Rating: 7,
- Price: 5.5
- },
- Name: "BreadInLayer2",
- Description: "Whole grain bread inLayer2",
- ReleaseDate: "1992-01-01T00:00:00Z",
- DiscontinuedDate: null,
- Rating: 6,
- Price: 4.5
- },
- Name: "BreadInLayer1",
- Description: "Whole grain bread inLayer1",
- ReleaseDate: "1992-01-01T00:00:00Z",
- DiscontinuedDate: null,
- Rating: 5,
- Price: 3.5
- },
- Name: "Bread",
- Description: "Whole grain bread",
- ReleaseDate: "1992-01-01T00:00:00Z",
- DiscontinuedDate: null,
- Rating: 4,
- Price: 2.5
- }
- },
- { context: { response: { requestUri: "http://base.org" }, dataServiceVersion: "4.0" },
- expected: {
- value: [{
- "@odata.etag": "W/MjAxMy0wNS0yN1QxMTo1OFo=",
- "@odata.type": "#DataJS.Tests.V4.Food",
- "@odata.mediaEditLink": "http://base.org/$metadata#Foods/mediaEditLink",
- "@odata.mediaReadLink": "http://base.org/$metadata#Foods/mediaReadLink",
- "@odata.mediaContentType": "http://base.org/$metadata#Foods/mediaContentType",
- "@odata.mediaEtag": "http://base.org/$metadata#Foods/mediaEtag",
- ID: 0,
- Name: "Bread",
- Description: "Whole grain bread",
- ReleaseDate: "1992-01-01T00:00:00Z",
- DiscontinuedDate: null,
- Rating: 4,
- Price: 2.5
- },
- {
- "@odata.etag": "W/MjAxMy0wNS0yN1QxMTo1OFo=",
- "@odata.type": "#DataJS.Tests.V4.Food",
- "@odata.mediaEditLink": "http://base.org/$metadata#Foods/mediaEditLink2",
- "@odata.mediaReadLink": "http://base.org/$metadata#Foods/mediaReadLink2",
- "@odata.mediaContentType": "http://base.org/$metadata#Foods/mediaContentType2",
- "@odata.mediaEtag": "http://base.org/$metadata#Foods/mediaEtag2",
- ID: 1,
- Name: "Bread",
- Description: "Whole grain bread",
- ReleaseDate: "1999-01-01T00:00:00Z",
- DiscontinuedDate: null,
- Rating: 6,
- Price: 3.5
- }]
- },
- data: {
- value: [{
- "@odata.context": "http://base.org/$metadata#Foods/$entity",
- "@odata.id": "Foods(4)",
- "@odata.etag": "W/MjAxMy0wNS0yN1QxMTo1OFo=",
- "@odata.editLink": "Foods(0)",
- "@odata.type": "#DataJS.Tests.V4.Food",
- "@odata.mediaEditLink": "http://base.org/$metadata#Foods/mediaEditLink",
- "@odata.mediaReadLink": "http://base.org/$metadata#Foods/mediaReadLink",
- "@odata.mediaContentType": "http://base.org/$metadata#Foods/mediaContentType",
- "@odata.mediaEtag": "http://base.org/$metadata#Foods/mediaEtag",
- ID: 0,
- Name: "Bread",
- Description: "Whole grain bread",
- ReleaseDate: "1992-01-01T00:00:00Z",
- DiscontinuedDate: null,
- Rating: 4,
- Price: 2.5
- },
- {
- "@odata.context": "http://base.org/$metadata#Foods/$entity",
- "@odata.id": "Foods(2)",
- "@odata.etag": "W/MjAxMy0wNS0yN1QxMTo1OFo=",
- "@odata.editLink": "Foods(2)",
- "@odata.type": "#DataJS.Tests.V4.Food",
- "@odata.mediaEditLink": "http://base.org/$metadata#Foods/mediaEditLink2",
- "@odata.mediaReadLink": "http://base.org/$metadata#Foods/mediaReadLink2",
- "@odata.mediaContentType": "http://base.org/$metadata#Foods/mediaContentType2",
- "@odata.mediaEtag": "http://base.org/$metadata#Foods/mediaEtag2",
- ID: 1,
- Name: "Bread",
- Description: "Whole grain bread",
- ReleaseDate: "1999-01-01T00:00:00Z",
- DiscontinuedDate: null,
- Rating: 6,
- Price: 3.5
- }]
- }
- }
- ];
- var i, len;
- for (i = 0, len = tests.length; i < len; i++) {
- var data = tests[i].data ? tests[i].data : tests[i].expected;
- var actual = OData.jsonSerializer(OData.jsonHandler, data, tests[i].context);
- var expected = window.JSON.stringify(tests[i].expected);
- djstest.assertAreEqualDeep(actual, expected, "test " + i + "didn't return the expected data");
- }
- djstest.done();
- });
-
- djstest.addTest(function normalizeHeadersReadTest() {
- // Verifies that headers are normalized for reading.
- // See issue at http://datajs.codeplex.com/workitem/148
- window.MockHttpClient.clear().addResponse("/foo", {
- statusCode: 200,
- body: { "@odata.context": "http://foo", value: [] },
- headers: { "unknown": "u", "Content-Encoding": "compress, gzip", "Content-Length": "8042",
- "Content-Type": "application/json", "OData-Version": "4.0", "Etag": "Vetag", "Location": "foo", "OData-EntityId": "entityId",
- "Preference-Applied": "prefered", "Retry-After": "retry"
- }
- });
-
- odatajs.oData.read("/foo", function (data, response) {
- // djstest.assertAreEqual(data.results.length, 2, "data.results.length has two entries");
- djstest.assertAreEqual(response.headers.unknown, "u", "u unmodified");
- djstest.assertAreEqual(response.headers["Content-Encoding"], "compress, gzip", "Content-Encoding available");
- djstest.assertAreEqual(response.headers["Content-Length"], "8042", "Content-Length available");
- djstest.assertAreEqual(response.headers["Content-Type"], "application/json", "Content-Type available");
- djstest.assertAreEqual(response.headers["ETag"], "Vetag", "Content-Type available");
- djstest.assertAreEqual(response.headers["Location"], "foo", "Content-Type available");
- djstest.assertAreEqual(response.headers["OData-EntityId"], "entityId", "OData-EntityId available");
- djstest.assertAreEqual(response.headers["Preference-Applied"], "prefered", "Preference-Applied available");
- djstest.assertAreEqual(response.headers["Retry-After"], "retry", "Retry available");
- djstest.assertAreEqual(response.headers["OData-Version"], "4.0", "OData-Version available");
- djstest.done();
- }, undefined, undefined, MockHttpClient);
- });
-
- djstest.addTest(function normalizeHeadersWriteTest() {
- // Verifies that headers are normalized for writing.
- // See issue at http://datajs.codeplex.com/workitem/148
- window.MockHttpClient.clear().addRequestVerifier("/foo", function (request) {
- djstest.assertAreEqual(request.headers.Accept, "application/json", "Accept available");
- djstest.assertAreEqual(request.headers["Content-Type"], "application/json", "json found");
- djstest.assertAreEqual(request.headers["Content-Encoding"], "compress, gzip", "Content-Encoding available");
- djstest.assertAreEqual(request.headers["Content-Length"], "8042", "Content-Length available");
- djstest.assertAreEqual(request.headers["OData-Version"], "4.0", "OData-Version available");
- djstest.assertAreEqual(request.headers["Accept-Charset"], "Accept-Charset", "Accept-Charset available");
- djstest.assertAreEqual(request.headers["If-Match"], "true", "If-Match available");
- djstest.assertAreEqual(request.headers["If-None-Match"], "false", "If-None-Match available");
- djstest.assertAreEqual(request.headers["OData-Isolation"], "isolation", "OData-Isolation available");
- djstest.assertAreEqual(request.headers["OData-MaxVersion"], "4.0", "OData-MaxVersion available");
- djstest.assertAreEqual(request.headers["Prefer"], "prefer", "prefer available");
- djstest.done();
- });
-
- var request = {
- method: "POST",
- requestUri: "/foo",
- data: { value: 123 },
- headers: { "Accept": "application/json", "Content-Encoding": "compress, gzip", "Content-Length": "8042", "content-type": "application/json", "OData-Version": "4.0",
- "accept-charset": "Accept-Charset", "if-match": "true", "if-none-match": "false", "odata-isolation": "isolation",
- "odata-maxversion": "4.0", "prefer": "prefer"
- }
- };
- odatajs.oData.request(request, function (data) {
- }, undefined, undefined, MockHttpClient);
- });
-
- // DATAJS INTERNAL END
-})(this);
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/odata-links-functional-tests.html
----------------------------------------------------------------------
diff --git a/JSLib/tests/odata-links-functional-tests.html b/JSLib/tests/odata-links-functional-tests.html
deleted file mode 100644
index 95b0d36..0000000
--- a/JSLib/tests/odata-links-functional-tests.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
- <title>OData tests against local service</title>
- <meta http-equiv="cache-control" content="no-cache"/>
- <meta http-equiv="pragma" content="no-cache"/>
- <meta http-equiv="expires" content="-1"/>
-
- <link rel="stylesheet" href="http://code.jquery.com/qunit/qunit-1.10.0.css" type="text/css" />
- <script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/json2/20110223/json2.js"></script>
- <script type="text/javascript" src="http://code.jquery.com/jquery-1.4.4.min.js"></script>
- <script type="text/javascript" src="http://code.jquery.com/qunit/qunit-1.10.0.js"></script>
- <script type="text/javascript" src="common/ODataReadOracle.js"></script>
- <script type="text/javascript" src="common/TestSynchronizerClient.js"></script>
- <script type="text/javascript">
- window.TestSynchronizer.init(QUnit);
- </script>
-
- <script type="text/javascript" src="../src/datajs.js"></script>
- <script type="text/javascript" src="../src/utils.js"></script>
- <script type="text/javascript" src="../src/xml.js"></script>
-
- <script type="text/javascript" src="../src/odata-utils.js"></script>
- <script type="text/javascript" src="../src/odata-handler.js"></script>
- <script type="text/javascript" src="../src/odata-gml.js"></script>
- <script type="text/javascript" src="../src/odata-xml.js"></script>
- <script type="text/javascript" src="../src/odata-net.js"></script>
- <script type="text/javascript" src="../src/odata-json-light.js"></script>
- <script type="text/javascript" src="../src/odata-json.js"></script>
- <script type="text/javascript" src="../src/odata-atom.js"></script>
- <script type="text/javascript" src="../src/odata-metadata.js"></script>
- <script type="text/javascript" src="../src/odata-batch.js"></script>
- <script type="text/javascript" src="../src/odata.js"></script>
-
- <script type="text/javascript" src="common/djstest.js"></script>
- <script type="text/javascript" src="odata-links-functional-tests.js"></script>
-</head>
-<body>
- <h1 id="qunit-header">OData.Read tests against local in-memory service</h1>
- <h2 id="qunit-banner"></h2>
- <h2 id="qunit-userAgent"></h2>
- <ol id="qunit-tests"></ol>
-</body>
-</html>
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/odata-links-functional-tests.js
----------------------------------------------------------------------
diff --git a/JSLib/tests/odata-links-functional-tests.js b/JSLib/tests/odata-links-functional-tests.js
deleted file mode 100644
index 00ce591..0000000
--- a/JSLib/tests/odata-links-functional-tests.js
+++ /dev/null
@@ -1,232 +0,0 @@
-/// <reference path="common/djstest.js" />
-/// <reference path="../src/odata.js" />
-/// <reference path="common/ODataReadOracle.js" />
-
-(function (window, undefined) {
- var unexpectedErrorHandler = function (err) {
- djstest.assert(false, "Unexpected call to error handler with error: " + djstest.toString(err));
- djstest.done();
- };
-
- var uriRegEx = /^([^:/?#]+:)?(\/\/[^/?#]*)?([^?#:]+)?(\?[^#]*)?(#.*)?/;
- var uriPartNames = ["scheme", "authority", "path", "query", "fragment"];
-
- var getURIInfo = function (uri) {
- /// <summary>Gets information about the components of the specified URI.</summary>
- /// <param name="uri" type="String">URI to get information from.</param>
- /// <returns type="Object">
- /// An object with an isAbsolute flag and part names (scheme, authority, etc.) if available.
- /// </returns>
-
- var result = { isAbsolute: false };
-
- if (uri) {
- var matches = uriRegEx.exec(uri);
- if (matches) {
- var i, len;
- for (i = 0, len = uriPartNames.length; i < len; i++) {
- if (matches[i + 1]) {
- result[uriPartNames[i]] = matches[i + 1];
- }
- }
- }
- if (result.scheme) {
- result.isAbsolute = true;
- }
- }
-
- return result;
- };
-
- var normalizeURI = function (uri, base) {
- /// <summary>Normalizes a possibly relative URI with a base URI.</summary>
- /// <param name="uri" type="String">URI to normalize, absolute or relative.</param>
- /// <param name="base" type="String" mayBeNull="true">Base URI to compose with.</param>
- /// <returns type="String">The composed URI if relative; the original one if absolute.</returns>
-
- if (!base) {
- return uri;
- }
-
- var uriInfo = getURIInfo(uri);
- if (uriInfo.isAbsolute) {
- return uri;
- }
-
- var baseInfo = getURIInfo(base);
- var normInfo = {};
-
- if (uriInfo.authority) {
- normInfo.authority = uriInfo.authority;
- normInfo.path = uriInfo.path;
- normInfo.query = uriInfo.query;
- } else {
- if (!uriInfo.path) {
- normInfo.path = baseInfo.path;
- normInfo.query = uriInfo.query || baseInfo.query;
- } else {
- if (uriInfo.path.charAt(0) === '/') {
- normInfo.path = uriInfo.path;
- } else {
- normInfo.path = mergeUriPathWithBase(uriInfo, baseInfo);
- }
-
- normInfo.query = uriInfo.query;
- }
-
- normInfo.authority = baseInfo.authority;
- }
-
- normInfo.scheme = baseInfo.scheme;
- normInfo.fragment = uriInfo.fragment;
-
- return "".concat(
- normInfo.scheme || "",
- normInfo.authority || "",
- normInfo.path || "",
- normInfo.query || "",
- normInfo.fragment || "");
- };
-
- var mergeUriPathWithBase = function (uriInfo, baseInfo) {
- /// <summary>Merges the path of a relative URI and a base URI.</summary>
- /// <param name="uriInfo">URI component information for the relative URI.</param>
- /// <param name="baseInfo">URI component information for the base URI.</param>
- /// <returns type="String">A string with the merged path.</returns>
-
- var basePath = "/";
- if (baseInfo.path) {
- var end = baseInfo.path.lastIndexOf("/");
- basePath = baseInfo.path.substring(0, end);
-
- if (basePath.charAt(basePath.length - 1) !== "/") {
- basePath = basePath + "/";
- }
- }
-
- return basePath + uriInfo.path;
- };
-
- var services = [
- "./endpoints/FoodStoreDataServiceV4.svc"
- ];
-
- var mimeTypes = [undefined, "application/json;odata.metadata=minimal"/*, "application/xml"*/];
-
- var httpStatusCode = {
- created: 201,
- noContent: 204,
- notFound: 404
- };
-
- $.each(services, function (_, service) {
-
- var foodsFeed = service + "/Foods";
- var categoriesFeed = service + "/Categories";
-
- var baseLinkUri = normalizeURI(service.substr(2), window.location.href);
-
- var newFoodLinks = {
- "@odata.id": baseLinkUri + "/Foods" + "(1)"
- };
-
- var newCategoryLinks = {
- "@odata.id": baseLinkUri + "/Categories" + "(2)"
- };
-
-
- module("Functional", {
- setup: function () {
- djstest.wait(function (done) {
- $.post(service + "/ResetData", done);
- });
- }
- });
-
- var readLinksFeed = categoriesFeed + "(1)/Foods/$ref";
- var readLinksEntry = foodsFeed + "(0)/Category/$ref";
-
- $.each(mimeTypes, function (_, mimeType) {
-
- var headers = mimeType ? { "Content-Type": mimeType, Accept: mimeType} : undefined;
-
- djstest.addTest(function readValidLinksFeedTests(params) {
- djstest.assertsExpected(1);
- odatajs.oData.read({ requestUri: params.linksFeed, headers: headers },
- function (data, response) {
- window.ODataReadOracle.readLinksFeed(params.linksFeed,
- function (expectedData) {
- djstest.assertAreEqualDeep(data, expectedData, "Response data not same as expected");
- djstest.done();
- }, params.mimeType
- );
- },
- unexpectedErrorHandler
- );
- }, "Testing valid read of " + readLinksFeed + " with " + mimeType, { linksFeed: readLinksFeed, mimeType: mimeType });
-
- djstest.addTest(function readValidLinksEntryTest(params) {
- djstest.assertsExpected(1);
- odatajs.oData.read({ requestUri: params.linksEntry, headers: headers },
- function (data, response) {
- window.ODataReadOracle.readLinksEntry(params.linksEntry,
- function (expectedData) {
- djstest.assertAreEqualDeep(data, expectedData, "Response data not same as expected");
- djstest.done();
- }, params.mimeType
- );
- },
- unexpectedErrorHandler
- );
- }, "Testing valid read of " + readLinksEntry + " with " + mimeType, { linksEntry: readLinksEntry, mimeType: mimeType });
-
- djstest.addTest(function addLinksEntityTest(mimeType) {
-
- var request = {
- requestUri: foodsFeed + "(1)/Category/$ref",
- method: "PUT",
- headers: djstest.clone(headers),
- data: newCategoryLinks
- };
-
-
- odatajs.oData.request(request, function (data, response) {
- var httpOperation = request.method + " " + request.requestUri;
- djstest.assertAreEqual(response.statusCode, httpStatusCode.noContent, "Verify response code: " + httpOperation);
- ODataReadOracle.readLinksEntry(request.requestUri, function (actualData) {
- if (actualData && actualData["@odata.context"]) {
- delete actualData["@odata.context"];
- }
-
- djstest.assertAreEqualDeep(actualData, request.data, "Verify new links entry against the request: " + httpOperation);
- djstest.done();
- });
- }, unexpectedErrorHandler);
-
- }, "Add new links entity (mimeType = " + mimeType + " service = " + service + ")", mimeType);
-
- djstest.addTest(function addLinksFeedTest(mimeType) {
-
- var request = {
- requestUri: categoriesFeed + "(2)/Foods/$ref",
- method: "POST",
- headers: djstest.clone(headers),
- data: newFoodLinks
- };
-
- odatajs.oData.request(request, function (data, response) {
-
- var httpOperation = request.method + " " + request.requestUri;
- djstest.assertAreEqual(response.statusCode, httpStatusCode.noContent, "Verify response code: " + httpOperation);
-
- odatajs.oData.read(request.requestUri, function (data, response) {
- ODataReadOracle.readLinksFeed(request.requestUri, function (actualData) {
- djstest.assertAreEqualDeep(actualData, response.data, "Verify updated links entry against the request: " + httpOperation);
- djstest.done();
- });
- });
- }, unexpectedErrorHandler);
- }, "Update entity (mimeType = " + mimeType + " service = " + service + ")", mimeType);
- });
- });
-})(this);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/odata-metadata-awareness-functional-tests.html
----------------------------------------------------------------------
diff --git a/JSLib/tests/odata-metadata-awareness-functional-tests.html b/JSLib/tests/odata-metadata-awareness-functional-tests.html
deleted file mode 100644
index 75fb2f2..0000000
--- a/JSLib/tests/odata-metadata-awareness-functional-tests.html
+++ /dev/null
@@ -1,43 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
- <title>metadata awareness tests</title>
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
- <meta http-equiv="expires" content="-1" />
- <link rel="stylesheet" href="http://code.jquery.com/qunit/qunit-1.10.0.css" type="text/css" />
- <script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/json2/20110223/json2.js"></script>
- <script type="text/javascript" src="http://code.jquery.com/jquery-1.4.4.min.js"></script>
- <script type="text/javascript" src="http://code.jquery.com/qunit/qunit-1.10.0.js"></script>
- <script type="text/javascript" src="common/ODataReadOracle.js"></script>
- <script type="text/javascript" src="common/TestSynchronizerClient.js"></script>
- <script type="text/javascript">
- window.TestSynchronizer.init(QUnit);
- </script>
-
- <script type="text/javascript" src="../src/datajs.js"></script>
- <script type="text/javascript" src="../src/utils.js"></script>
- <script type="text/javascript" src="../src/xml.js"></script>
-
- <script type="text/javascript" src="../src/odata-utils.js"></script>
- <script type="text/javascript" src="../src/odata-handler.js"></script>
- <script type="text/javascript" src="../src/odata-gml.js"></script>
- <script type="text/javascript" src="../src/odata-xml.js"></script>
- <script type="text/javascript" src="../src/odata-net.js"></script>
- <script type="text/javascript" src="../src/odata-json-light.js"></script>
- <script type="text/javascript" src="../src/odata-json.js"></script>
- <script type="text/javascript" src="../src/odata-atom.js"></script>
- <script type="text/javascript" src="../src/odata-metadata.js"></script>
- <script type="text/javascript" src="../src/odata-batch.js"></script>
- <script type="text/javascript" src="../src/odata.js"></script>
-
- <script type="text/javascript" src="common/djstest.js"></script>
- <script type="text/javascript" src="odata-metadata-awareness-functional-tests.js"></script>
-</head>
-<body>
- <h1 id="qunit-header">metadata awareness tests</h1>
- <h2 id="qunit-banner"></h2>
- <h2 id="qunit-userAgent"></h2>
- <ol id="qunit-tests"></ol>
-</body>
-</html>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/odata-metadata-awareness-functional-tests.js
----------------------------------------------------------------------
diff --git a/JSLib/tests/odata-metadata-awareness-functional-tests.js b/JSLib/tests/odata-metadata-awareness-functional-tests.js
deleted file mode 100644
index b40e703..0000000
--- a/JSLib/tests/odata-metadata-awareness-functional-tests.js
+++ /dev/null
@@ -1,227 +0,0 @@
-/// <reference path="common/djstest.js" />
-/// <reference path="../src/odata.js" />
-/// <reference path="common/ODataReadOracle.js" />
-
-(function (window, undefined) {
- var unexpectedErrorHandler = function (err) {
- djstest.assert(false, "Unexpected call to error handler with error: " + djstest.toString(err));
- djstest.done();
- };
-
- var service = "./endpoints/EpmDataService.svc";
- var metadataUri = service + "/$metadata";
-
- var httpStatusCode = {
- ok: 200,
- created: 201,
- noContent: 204
- };
-
- var acceptHeaders = { Accept: "application/atom+xml" };
- var mimeHeaders = { "Content-Type": "application/atom+xml", Accept: "application/atom+xml" };
- var keepInContentVariations = [true, false];
- var feedUris = { "true": service + "/ReplicatedEntries", "false": service + "/MappedEntries" };
- var typeNames = { "true": "DataJS.Tests.ReplicatedEntry", "false": "DataJS.Tests.MappedEntry" };
- var selectProperties = ["Published", "Author", "CustomElement", "NestedElement1", "Published,Author,CustomElement,NestedElement1"];
-
- var newEntry = {
- UnmappedField: "Unmapped100",
- Author: {
- Email: "AuthorEmail100",
- Name: "AuthorName100",
- Uri: "http://www.example.com/AuthorUri100",
- Contributor: {
- Email: "ContributorEmail100",
- Name: "ContributorName100",
- Uri: "http://www.example.com/ContributorUri1000"
- }
- },
- Published: "2100-01-01T00:00:00-08:00",
- Rights: "Rights100",
- Summary: "<xmlElement xmlns=\"http://www.example.com/dummy\" attr=\"value100\">Summary100</xmlElement>",
- Title: "Title<b>100</b>",
- Updated: "2100-01-01T00:00:00-08:00",
- CustomElement: "CustomElement100",
- CustomAttribute: "CustomAttribute100",
- NestedElement1: "NestedElement1_100",
- NestedElement2: "NestedElement2_100",
- CommonAttribute1: "CommonAttribute1_100",
- CommonAttribute2: "CommonAttribute2_100",
- Location: {
- Lat: 1.23,
- Long: 4.56
- }
- };
-
- var newSpecialValuesEntry = $.extend(true, {}, newEntry, {
- Author: {
- Email: null,
- Name: "",
- Uri: " ",
- Contributor: {
- Email: null,
- Name: "",
- Uri: " "
- }
- },
- Rights: null,
- Summary: "",
- Title: " ",
- CustomElement: null,
- NestedElement1: "",
- NestedElement2: " ",
- CustomAttribute: null,
- CommonAttribute1: "",
- CommonAttribute2: " "
- });
-
- var nullComplexTypeEntry = $.extend(true, {}, newEntry, {
- Author: { Contributor: null },
- Location: null
- });
-
- var testEntries = [
- { data: newEntry, description: "entry" },
- { data: newSpecialValuesEntry, description: "entry containing null and empty string" },
- { data: nullComplexTypeEntry, description: "entry containing null complex type value" }
- ];
-
- var serviceMetadata;
- var getMetadata = function (callback) {
- /// <summary>Common function for tests to get and cache metadata, to reduce network calls made by tests</summary>
- if (!serviceMetadata) {
- odatajs.oData.read(metadataUri, function (metadata) {
- serviceMetadata = metadata;
- callback(metadata);
- }, unexpectedErrorHandler, OData.metadataHandler);
- }
- else {
- callback(serviceMetadata);
- }
- }
-
- module("Functional", {
- setup: function () {
- djstest.wait(function (done) {
- $.post(service + "/ResetData", done);
- });
- OData.defaultMetadata = [];
- OData.jsonHandler.recognizeDates = false;
- }
- });
-
- $.each(selectProperties, function (_, selectProperty) {
- djstest.addTest(function getSelectPropertiesOnEntry(propertyToSelect) {
- var entryUri = feedUris["true"] + "(0)?$select=" + propertyToSelect;
- djstest.assertsExpected(2);
- getMetadata(function (metadata) {
- OData.defaultMetadata.push(metadata);
- odatajs.oData.read({ requestUri: entryUri, headers: acceptHeaders }, function (data, response) {
- djstest.assertAreEqual(response.statusCode, httpStatusCode.ok, "Verify response code");
- ODataReadOracle.readJson(entryUri, function (expectedData) {
- djstest.assertWithoutMetadata(data, expectedData, "Verify data");
- djstest.done();
- })
- }, unexpectedErrorHandler);
- }, unexpectedErrorHandler, OData.metadataHandler);
- }, "GET with mapped properties selecting " + selectProperty + " with keepInContent = true", selectProperty);
- });
-
- $.each(keepInContentVariations, function (_, keepInContent) {
- var feedUri = feedUris[keepInContent];
-
- $.each(testEntries, function (entryIndex, testEntry) {
- params = {
- feedUri: feedUri,
- testEntry: $.extend(true, {}, testEntry, {
- data: {
- "__metadata": { type: typeNames[keepInContent] }
- }
- })
- };
-
- djstest.addTest(function getMappedEntry(params) {
- var entryUri = params.feedUri + "(" + entryIndex + ")";
- djstest.assertsExpected(2);
- getMetadata(function (metadata) {
- OData.defaultMetadata.push(metadata);
- odatajs.oData.read({ requestUri: entryUri, headers: acceptHeaders }, function (data, response) {
- djstest.assertAreEqual(response.statusCode, httpStatusCode.ok, "Verify response code");
- ODataReadOracle.readJson(entryUri, function (expectedData) {
- djstest.assertWithoutMetadata(data, expectedData, "Verify data");
- djstest.done();
- })
- }, unexpectedErrorHandler);
- }, unexpectedErrorHandler, OData.metadataHandler);
- }, "GET " + params.testEntry.description + " with mapped properties: keepInContent = " + keepInContent, params);
-
- djstest.addTest(function postMappedEntry(params) {
- var postEntry = $.extend(true, {}, params.testEntry.data, { ID: 100 });
- djstest.assertsExpected(2);
- getMetadata(function (metadata) {
- odatajs.oData.request({ requestUri: params.feedUri, method: "POST", headers: djstest.clone(mimeHeaders), data: postEntry }, function (data, response) {
- djstest.assertAreEqual(response.statusCode, httpStatusCode.created, "Verify response code");
- ODataReadOracle.readJson(feedUri + "(" + postEntry.ID + ")", function (actualData) {
- djstest.assertWithoutMetadata(actualData, postEntry, "Verify new entry data against server");
- djstest.done();
- })
- }, unexpectedErrorHandler, undefined, undefined, metadata);
- }, unexpectedErrorHandler, OData.metadataHandler);
- }, "POST " + params.testEntry.description + " with mapped properties: keepInContent = " + keepInContent, params);
-
- djstest.addTest(function putMappedEntry(params) {
- var entryUri = params.feedUri + "(0)";
- djstest.assertsExpected(2);
- getMetadata(function (metadata) {
- OData.defaultMetadata.push(metadata);
- odatajs.oData.request({ requestUri: entryUri, method: "PUT", headers: djstest.clone(mimeHeaders), data: params.testEntry.data }, function (data, response) {
- djstest.assertAreEqual(response.statusCode, httpStatusCode.noContent, "Verify response code");
- ODataReadOracle.readJson(entryUri, function (actualData) {
- djstest.assertWithoutMetadata(actualData, $.extend({ ID: 0 }, params.testEntry.data), "Verify updated entry data against server");
- djstest.done();
- })
- }, unexpectedErrorHandler);
- }, unexpectedErrorHandler, OData.metadataHandler);
- }, "PUT " + params.testEntry.description + " with mapped properties: keepInContent = " + keepInContent, params);
- });
- });
-
- var descriptions = ["base type", "derived type"];
- $.each(descriptions, function (index, _) {
- djstest.addTest(function getHierarchicalEntry(index) {
- var entryUri = service + "/HierarchicalEntries(" + index + ")";
- djstest.assertsExpected(2);
- getMetadata(function (metadata) {
- odatajs.oData.read({ requestUri: entryUri, headers: acceptHeaders }, function (data, response) {
- djstest.assertAreEqual(response.statusCode, httpStatusCode.ok, "Verify response code");
- ODataReadOracle.readJson(entryUri, function (expectedData) {
- djstest.assertWithoutMetadata(data, expectedData, "Verify data");
- djstest.done();
- })
- }, unexpectedErrorHandler, undefined, undefined, metadata);
- }, unexpectedErrorHandler, OData.metadataHandler);
- }, "GET " + descriptions[index] + " with mapped properties: keepInContent = false", index);
- });
-
- $.each([false, true], function (_, recognizeDates) {
- djstest.addTest(function readDateTimeWithMetadataTest(params) {
- var foodStoreDataService = "./endpoints/FoodStoreDataServiceV4.svc";
- var specialDaysEndpoint = foodStoreDataService + "/SpecialDays";
-
- djstest.assertsExpected(1);
- OData.jsonHandler.recognizeDates = params.recognizeDates;
- odatajs.oData.read(foodStoreDataService + "/$metadata", function (metadata) {
- odatajs.oData.read({ requestUri: specialDaysEndpoint, headers: { Accept: params.accept} }, function (data, response) {
- // Because our oracle isn't metadata aware, it is not 100% correct, so we will pass in recognizeDates = true
- // in all cases and manually fix up the property that was incorrectly converted
- window.ODataReadOracle.readFeed(specialDaysEndpoint, function (expectedData) {
- // Fix up the string property that has a "date-like" string deliberately injected
- expectedData.results[2].Name = "/Date(" + expectedData.results[2].Name.valueOf() + ")/";
- djstest.assertAreEqualDeep(data, expectedData, "Verify response data");
- djstest.done();
- }, params.accept, true);
- }, unexpectedErrorHandler, undefined, undefined, metadata);
- }, unexpectedErrorHandler, OData.metadataHandler);
- }, "GET metadata-aware JSON dates with recognizeDates=" + recognizeDates, { recognizeDates: recognizeDates, accept: "application/json;odata.metadata=minimal" });
- });
-})(this);
[06/22] olingo-odata4-js git commit: [OLINGO-442] Cleanup bevor
release
Posted by ko...@apache.org.
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/odata-json-light-tests.js
----------------------------------------------------------------------
diff --git a/JSLib/tests/odata-json-light-tests.js b/JSLib/tests/odata-json-light-tests.js
deleted file mode 100644
index 5e55d93..0000000
--- a/JSLib/tests/odata-json-light-tests.js
+++ /dev/null
@@ -1,2479 +0,0 @@
-/// <reference path="../src/odata-net.js" />
-/// <reference path="../src/odata.js" />
-/// <reference path="../src/odata-json-light.js" />
-/// <reference path="../src/odata-json.js" />
-/// <reference path="../common/djstest.js" />
-
-// odata-json-light-tests.js
-
-(function (window, undefined) {
-
- // DATAJS INTERNAL START
-
- var mockHttpClient;
-
- module("Unit", {
- setup: function () {
- mockHttpClient = window.MockHttpClient.clear();
- }
- });
-
- var getSampleModel = function () {
- var testModel = {
- "version": "1.0",
- "dataServices": {
- "dataServiceVersion": "4.0",
- "schema": [{
- "namespace": "NS",
- "entityType": [{
- "name": "EntityType",
- "key": { "propertyRef": [{ "name": "Id"}] },
- "property": [
- { "name": "Id", "type": "Edm.String" },
- { "name": "P1", "type": "Edm.Int32" }
- ]
- }],
- entityContainer: [{
- name: "TestContainer",
- isDefaultEntityContainer: "true",
- entitySet: [{ "name": "EntityTypes", "entityType": "NS.EntityType"}]
- }]
- }]
- }
- };
- return testModel;
- };
-
- var getSampleModelWithTwoKeys = function () {
- var testModel = getSampleModel();
- testModel.dataServices.schema[0].entityType[0].key = { "propertyRef": [{ "name": "Id" }, { "name": "P1"}] };
- return testModel;
- };
-
- var getSampleModelWithOneConcurrencyProperty = function () {
- var testModel = getSampleModel();
- testModel.dataServices.schema[0].entityType[0].property[0].concurrencyMode = "Fixed";
- return testModel;
- };
-
- var getSampleModelWithOneBinaryConcurrencyProperty = function () {
- var testModel = getSampleModel();
- testModel.dataServices.schema[0].entityType[0].property[1].concurrencyMode = "Fixed";
- testModel.dataServices.schema[0].entityType[0].property[1].type = "Edm.Binary";
- return testModel;
- };
-
- var getSampleModelWithMultipleConcurrencyProperties = function () {
- var testModel = getSampleModel();
- testModel.dataServices.schema[0].entityType[0].property[0].concurrencyMode = "Fixed";
- testModel.dataServices.schema[0].entityType[0].property[1].concurrencyMode = "Fixed";
- return testModel;
- };
-
- var getSampleModelWithDateTimeConcurrencyProperties = function () {
- var testModel = getSampleModel();
- testModel.dataServices.schema[0].entityType[0].property[1] = { "name": "P1", "type": "Edm.DateTime", concurrencyMode: "Fixed" };
- return testModel;
- };
-
- var getSampleModelWithDecimalProperty = function () {
- var testModel = getSampleModel();
- testModel.dataServices.schema[0].entityType[0].property[1] = { "name": "P1", "type": "Edm.Decimal"};
- return testModel;
- };
-
- var getSampleModelWithNavPropertiesAndInheritedTypes = function () {
- return {
- "version": "1.0",
- "dataServices": {
- "dataServiceVersion": "4.0",
- "maxDataServiceVersion": "4.0",
- "schema": [
- {
- "namespace": "ODataDemo",
- "entityType": [
- {
- "name": "Product",
- "key": {
- "propertyRef": [
- {
- "name": "ID"
- }
- ]
- },
- "property": [
- {
- "name": "ID",
- "nullable": "false",
- "type": "Edm.Int32"
- }
- ],
- "navigationProperty": [
- {
- "name": "Category",
- "toRole": "Category_Products",
- "fromRole": "Product_Category",
- "relationship": "ODataDemo.Product_Category_Category_Products"
- }]
- },
- {
- "name": "FeaturedProduct",
- "baseType": "ODataDemo.Product",
- "navigationProperty": [
- {
- "name": "Advertisement",
- "toRole": "Advertisement_FeaturedProduct",
- "fromRole": "FeaturedProduct_Advertisement",
- "relationship": "ODataDemo.FeaturedProduct_Advertisement_Advertisement_FeaturedProduct"
- }
- ]
- },
- {
- "name": "Advertisement",
- "key": {
- "propertyRef": [
- {
- "name": "ID"
- }
- ]
- },
- "property": [
- {
- "name": "ID",
- "nullable": "false",
- "type": "Edm.Guid"
- }
- ],
- "navigationProperty": [
- {
- "name": "FeaturedProduct",
- "toRole": "FeaturedProduct_Advertisement",
- "fromRole": "Advertisement_FeaturedProduct",
- "relationship": "ODataDemo.FeaturedProduct_Advertisement_Advertisement_FeaturedProduct"
- }
- ]
- },
- {
- "name": "Category",
- "key": {
- "propertyRef": [
- {
- "name": "ID"
- }
- ]
- },
- "property": [
- {
- "name": "ID",
- "nullable": "false",
- "type": "Edm.Int32"
- }
- ],
- "navigationProperty": [
- {
- "name": "Products",
- "toRole": "Product_Category",
- "fromRole": "Category_Products",
- "relationship": "ODataDemo.Product_Category_Category_Products"
- }
- ]
- }
- ],
- "association": [
- {
- "name": "Product_Category_Category_Products",
- "end": [
- {
- "type": "ODataDemo.Category",
- "multiplicity": "0..1",
- "role": "Category_Products"
- },
- {
- "type": "ODataDemo.Product",
- "multiplicity": "*",
- "role": "Product_Category"
- }
- ]
- },
- {
- "name": "FeaturedProduct_Advertisement_Advertisement_FeaturedProduct",
- "end": [
- {
- "type": "ODataDemo.Advertisement",
- "multiplicity": "0..1",
- "role": "Advertisement_FeaturedProduct"
- },
- {
- "type": "ODataDemo.FeaturedProduct",
- "multiplicity": "0..1",
- "role": "FeaturedProduct_Advertisement"
- }
- ]
- }
- ],
- "entityContainer": [
- {
- "name": "DemoService",
- "isDefaultEntityContainer": "true",
- "entitySet": [
- {
- "name": "Products",
- "entityType": "ODataDemo.Product"
- },
- {
- "name": "Advertisements",
- "entityType": "ODataDemo.Advertisement"
- },
- {
- "name": "Categories",
- "entityType": "ODataDemo.Category"
- }
- ],
- "associationSet": [
- {
- "name": "Products_Advertisement_Advertisements",
- "association": "ODataDemo.FeaturedProduct_Advertisement_Advertisement_FeaturedProduct",
- "end": [
- {
- "role": "FeaturedProduct_Advertisement",
- "entitySet": "Products"
- },
- {
- "role": "Advertisement_FeaturedProduct",
- "entitySet": "Advertisements"
- }
- ]
- },
- {
- "name": "Products_Category_Categories",
- "association": "ODataDemo.Product_Category_Category_Products",
- "end": [
- {
- "role": "Product_Category",
- "entitySet": "Products"
- },
- {
- "role": "Category_Products",
- "entitySet": "Categories"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- }
- };
- };
-
- var failTest = function (err) {
- if (err && err.message) {
- djstest.fail(err.message);
- } else {
- djstest.fail("unexpected failure");
- }
- djstest.done();
- };
-
- var verifySerializedJsonLightData = function (actual, expected, message, requestUri) {
- mockHttpClient.addRequestVerifier("*", function (request) {
- djstest.assertAreEqualDeep(JSON.parse(request.body), expected, message);
- djstest.done();
- });
-
- odatajs.oData.request({
- requestUri: requestUri || "http://someUri",
- headers: { "Content-Type": "application/json" },
- method: "PUT",
- data: actual
- }, null, failTest, null, mockHttpClient);
- };
-
- var verifyReadJsonLightData = function (input, expected, message, model) {
- var response = { headers: { "Content-Type": "application/json;odata.metadata=full", DataServiceVersion: "4.0" }, body: JSON.stringify(input) };
-
- OData.jsonHandler.read(response, { metadata: model });
- djstest.assertAreEqualDeep(response.data, expected, message);
- };
-
- var verifyReadJsonLightWithMinimalMetadata = function (input, expected, message, model) {
- var response = { headers: { "Content-Type": "application/json;odata.metadata=minimal", DataServiceVersion: "4.0" }, body: JSON.stringify(input) };
-
- OData.jsonHandler.read(response, { metadata: model });
- djstest.assertAreEqualDeep(response.data, expected, message);
- };
-
-
- djstest.addTest(function jsonLightReadEmptySvcDocTest() {
- var input = {
- "odata.metadata": "http://someUri/ODataService.svc/OData/$metadata",
- "value": []
- };
-
- var expected = {
- workspaces: [
- {
- collections: []
- }
- ]
- };
-
- verifyReadJsonLightData(input, expected, "Json light links document was read properly.");
- djstest.done();
- });
-
- djstest.addTest(function jsonLightReadSvcDocTest() {
- var input = {
- "odata.metadata": "http://someUri/ODataService.svc/OData/$metadata",
- "value": [
- { "name": "Customers", "url": "Customers" },
- { "name": "Employees", "url": "http://someUri/ODataService.svc/OData/Employees" }
- ]
- };
-
- var expected = {
- workspaces: [
- {
- collections: [
- {
- title: "Customers",
- href: "http://someUri/ODataService.svc/OData/Customers"
- },
- {
- title: "Employees",
- href: "http://someUri/ODataService.svc/OData/Employees"
- }
- ]
- }
- ]
- };
-
- verifyReadJsonLightData(input, expected, "Json light links document was read properly.");
- djstest.done();
- });
-
- djstest.addTest(function jsonLightReadEntryMetadataUriTest() {
- var tests = {
- "Qualified entity set": {
- input: { "odata.metadata": "http://someUri/$metadata#Ns.Container.EntitySet/@Element" },
- expected: { __metadata: { type: null} }
- },
- "Unqualified entity set": {
- input: { "odata.metadata": "http://someUri/$metadata#Ns.Container.EntitySet/@Element" },
- expected: { __metadata: { type: null} }
- },
- "Qualified entity set with type cast": {
- input: { "odata.metadata": "http://someUri/$metadata#Ns.Container.EntitySet/TypeCast/@Element" },
- expected: { __metadata: { type: "TypeCast"} }
- },
-
- "Unqualified entity set with type cast": {
- input: { "odata.metadata": "http://someUri/$metadata#EntitySet/TypeCast/@Element" },
- expected: { __metadata: { type: "TypeCast"} }
- }
- };
-
- for (name in tests) {
- var test = tests[name];
- verifyReadJsonLightData(test.input, test.expected, name + " - Json light entry metadata uri was read properly.");
- }
- djstest.done();
- });
-
- djstest.addTest(function jsonLightReadEntryMetadataUriWithMetadataDocumentTest() {
- var testModel = {
- "version": "1.0",
- "dataServices": {
- "dataServiceVersion": "4.0",
- "schema": [{
- "namespace": "Test.Catalog",
- "entityContainer": [{
- "name": "TestCatalog",
- "isDefaultEntityContainer": "true",
- "entitySet": [
- { "name": "Titles", "entityType": "TestCatalog.Model.Title" }
- ]
- }, {
- "name": "GenreCatalog",
- "isDefaultEntityContainer": "false",
- "entitySet": [
- { "name": "Genres", "entityType": "TestCatalog.Model.Genre" }
- ]
- }]
- }]
- }
- };
-
- var tests = {
- "Qualified entity set": {
- input: { "odata.metadata": "http://someUri/$metadata#Test.Catalog.GenreCatalog.Genres/@Element" },
- expected: { __metadata: { type: "TestCatalog.Model.Genre"} }
- },
- "Unqualified entity set": {
- input: { "odata.metadata": "http://someUri/$metadata#Titles/@Element" },
- expected: { __metadata: { type: "TestCatalog.Model.Title"} }
- },
- "Qualified entity set with type cast": {
- input: { "odata.metadata": "http://someUri/$metadata#Test.Catalog.Titles/TestCatalog.Model.Songs/@Element" },
- expected: { __metadata: { type: "TestCatalog.Model.Songs"} }
- },
- "Unqualified entity set with type cast": {
- input: { "odata.metadata": "http://someUri/$metadata#Titles/TestCatalog.Model.Songs/@Element" },
- expected: { __metadata: { type: "TestCatalog.Model.Songs"} }
- },
- "Unqualified entity set in non default entity container": {
- input: { "odata.metadata": "http://someUri/$metadata#Generes/@Element" },
- expected: { __metadata: { type: null} }
- },
- "Unqualified entity set in non default entity container with type cast": {
- input: { "odata.metadata": "http://someUri/$metadata#Generes/TypeCast/@Element" },
- expected: { __metadata: { type: "TypeCast"} }
- }
- };
-
- for (name in tests) {
- var test = tests[name];
- verifyReadJsonLightData(test.input, test.expected, name + " - Json light entry metadata uri was read properly.", testModel);
- }
- djstest.done();
- });
-
- djstest.addTest(function jsonLightReadTypeInPayloadWinsOverModelTest() {
- var testModel = {
- "version": "1.0",
- "dataServices": {
- "dataServiceVersion": "4.0",
- "schema": [{
- "namespace": "NS",
- "entityType": [{
- "name": "EntityType",
- "hasStream": "true",
- "key": { "propertyRef": [{ "name": "Id"}] },
- "property": [
- { "name": "Id", "type": "Edm.String" },
- { "name": "P1", "type": "Edm.String" },
- { "name": "P2", "type": "NS.ComplexType" },
- { "name": "P3", "type": "Edm.Int64" }
- ]
- }],
- "complexType": [{
- "name": "ComplexType",
- "property": [
- { "name": "C1", "type": "Edm.String" }
- ]
- }]
- }]
- }
- };
-
- var input = {
- "odata.metadata": "http://someUri/$metadata#EntitySet/NS.EntityType/@Element",
- P1: "Hello",
- P2: {
- "odata.type": "Instance",
- C1: "World"
- },
- "P2@odata.type": "Property",
- P3: "500",
- "P3@odata.type": "Property",
- P4: {
- "odata.type": "NS.ComplexType",
- C1: "!!"
- }
- };
-
- var expected = {
- __metadata: {
- type: "NS.EntityType",
- properties: {
- P1: { type: "Edm.String" },
- P2: {
- type: "Instance",
- properties: {
- C1: { type: null }
- }
- },
- P3: { type: "Property" },
- P4: {
- type: "NS.ComplexType",
- properties: {
- C1: { type: "Edm.String" }
- }
- }
- }
- },
- P1: "Hello",
- P2: {
- __metadata: {
- type: "Instance"
- },
- C1: "World"
- },
- P3: "500",
- P4: {
- __metadata: {
- type: "NS.ComplexType"
- },
- C1: "!!"
- }
- };
-
- verifyReadJsonLightData(input, expected, "Json light type annotations in payload are preferred over type information in the metadata document", testModel);
- djstest.done();
- });
-
- djstest.addTest(function jsonLightReadObjectWithCollectionPropertyTest() {
- var testModel = {
- "version": "1.0",
- "dataServices": {
- "dataServiceVersion": "4.0",
- "schema": [{
- "namespace": "NS",
- "entityType": [{
- "name": "EntityType",
- "property": [
- { "name": "p1", "type": "Collection(Edm.Int32)" }
- ]
- }]
- }]
- }
- };
-
- var input = {
- "odata.metadata": "http://someUri/$metadata#EntitySet/NS.EntityType/@Element",
- p1: [1, 2, 3],
- p2: [
- { c1: 100, c2: 200 },
- { c1: 400, c2: 500, "odata.type": "NS.OtherType" }
- ],
- "p2@odata.type": "Collection(NS.ComplexType)",
- p3: [5, 6, 7]
- };
-
- var expected = {
- __metadata: {
- type: "NS.EntityType",
- properties: {
- p1: { type: "Collection(Edm.Int32)" },
- p2: {
- type: "Collection(NS.ComplexType)",
- elements: [
- {
- type: "NS.ComplexType",
- properties: {
- c1: { type: null },
- c2: { type: null }
- }
- },
- {
- type: "NS.OtherType",
- properties: {
- c1: { type: null },
- c2: { type: null }
- }
- }
- ]
- },
- p3: { type: null }
- }
- },
- p1: {
- __metadata: { type: "Collection(Edm.Int32)" },
- results: [1, 2, 3]
- },
- p2: {
- __metadata: { type: "Collection(NS.ComplexType)" },
- results: [
- {
- __metadata: {
- type: "NS.ComplexType"
- },
- c1: 100,
- c2: 200
- },
- {
- __metadata: {
- type: "NS.OtherType"
- },
- c1: 400,
- c2: 500
- }
- ]
- },
- p3: {
- __metadata: { type: null },
- results: [5, 6, 7]
- }
- };
-
- verifyReadJsonLightData(input, expected, "Json light object with collection porperties was read properly", testModel);
- djstest.done();
- });
-
- djstest.addTest(function jsonLightReadEntryODataAnnotationsTest() {
- var input = {
- "odata.metadata": "http://someUri/$metadata#NS.Container.Set/TypeCast/@Element",
- "odata.id": "Customers(1)",
- "odata.etag": "etag-value",
- "odata.readLink": "read/Customers(1)",
- "odata.editLink": "Customers(1)",
- "odata.mediaReadLink": "Customers(1)/Image",
- "odata.mediaEditLink": "Customers(1)/$value",
- "odata.mediaETag": "stream-etag-value",
- "odata.mediaContentType": "image/jpg"
- };
-
- var expected = {
- __metadata: {
- id: "Customers(1)",
- type: "TypeCast",
- etag: "etag-value",
- self: "http://someUri/read/Customers(1)",
- edit: "http://someUri/Customers(1)",
- uri: "http://someUri/Customers(1)",
- media_src: "http://someUri/Customers(1)/Image",
- edit_media: "http://someUri/Customers(1)/$value",
- media_etag: "stream-etag-value",
- content_type: "image/jpg"
- }
- };
-
- verifyReadJsonLightData(input, expected, "Json light entry OData annotations were read properly");
- djstest.done();
- });
-
-
- djstest.addTest(function jsonLightReadObjectWithComplexPropertyTest() {
- var testModel = {
- "version": "1.0",
- "dataServices": {
- "dataServiceVersion": "4.0",
- "schema": [{
- "namespace": "Ns",
- "entityType": [{
- "name": "EntityType",
- "property": [
- { "name": "p1", "type": "Ns.ComplexType" }
- ]
- }],
- "complexType": [{
- "name": "ComplexType",
- "property": [
- { "name": "c1", "type": "Edm.Int16" },
- { "name": "c2", "type": "Edm.Int32" },
- { "name": "c3", "type": "Ns.ComplexType" }
- ]
- }]
- }]
- }
- };
-
- var input = {
- "odata.metadata": "http://someUri/$metadata#EntitySet/Ns.EntityType/@Element",
- p1: {
- c1: 100,
- c2: 200,
- c3: {
- c1: 300,
- c2: 400,
- c3: {
- c1: 500,
- c2: 600,
- c3: null
- }
- }
- },
- p2: {
- "odata.type": "Ns.ComplexType2",
- c4: 800,
- "c4@odata.type": "Edm.Single",
- c5: 900,
- c6: {
- c1: 1000,
- c2: 2000,
- c3: {
- c1: 1100,
- "c1@odata.type": "Edm.Double",
- c2: 1200,
- c3: null
- }
- },
- "c6@odata.type": "Ns.ComplexType"
- },
- p3: {},
- "p3@odata.type": "Ns.ComplexType3"
- };
-
- var expected = {
- __metadata: {
- type: "Ns.EntityType",
- properties: {
- p1: {
- type: "Ns.ComplexType",
- properties: {
- c1: { type: "Edm.Int16" },
- c2: { type: "Edm.Int32" },
- c3: {
- type: "Ns.ComplexType",
- properties: {
- c1: { type: "Edm.Int16" },
- c2: { type: "Edm.Int32" },
- c3: {
- type: "Ns.ComplexType",
- properties: {
- c1: { type: "Edm.Int16" },
- c2: { type: "Edm.Int32" },
- c3: { type: "Ns.ComplexType" }
- }
- }
- }
- }
- }
- },
- p2: {
- type: "Ns.ComplexType2",
- properties: {
- c4: { type: "Edm.Single" },
- c5: { type: null },
- c6: {
- type: "Ns.ComplexType",
- properties: {
- c1: { type: "Edm.Int16" },
- c2: { type: "Edm.Int32" },
- c3: {
- type: "Ns.ComplexType",
- properties: {
- c1: { type: "Edm.Double" },
- c2: { type: "Edm.Int32" },
- c3: { type: "Ns.ComplexType" }
- }
- }
- }
- }
- }
- },
- p3: { type: "Ns.ComplexType3" }
- }
- },
- p1: {
- __metadata: { type: "Ns.ComplexType" },
- c1: 100,
- c2: 200,
- c3: {
- __metadata: { type: "Ns.ComplexType" },
- c1: 300,
- c2: 400,
- c3: {
- __metadata: { type: "Ns.ComplexType" },
- c1: 500,
- c2: 600,
- c3: null
- }
- }
- },
- p2: {
- __metadata: { type: "Ns.ComplexType2" },
- c4: 800,
- c5: 900,
- c6: {
- __metadata: { type: "Ns.ComplexType" },
- c1: 1000,
- c2: 2000,
- c3: {
- __metadata: { type: "Ns.ComplexType" },
- c1: 1100,
- c2: 1200,
- c3: null
- }
- }
- },
- p3: { __metadata: { type: "Ns.ComplexType3"} }
- };
-
- verifyReadJsonLightData(input, expected, "Json light object with complex type properties was read properly", testModel);
- djstest.done();
- });
-
- djstest.addTest(function jsonLightReadObjectWithNamedStreamProperty() {
- var input = {
- "odata.metadata": "http://someUri/$metadata#NS.Container.Set/TypeCast/@Element",
- "p1@odata.mediaReadLink": "Customers(1)/namedStream",
- "p1@odata.mediaEditLink": "Customers(1)/namedStream/$value",
- "p1@odata.mediaETag": "voice-etag-value",
- "p1@odata.mediaContentType": "audio/basic"
- };
-
- var expected = {
- __metadata: {
- type: "TypeCast",
- properties: {
- p1: { type: null }
- }
- },
- p1: {
- __mediaresource: {
- media_src: "http://someUri/Customers(1)/namedStream",
- edit_media: "http://someUri/Customers(1)/namedStream/$value",
- media_etag: "voice-etag-value",
- content_type: "audio/basic"
- }
- }
- };
-
- verifyReadJsonLightData(input, expected, "Json light object with named stream properties was read properly");
- djstest.done();
- });
-
- djstest.addTest(function jsonLightReadEntryWithDeferredNavigationPropertyTests() {
- var input = {
- "odata.metadata": "http://someUri/$metadata#NS.Container.Set/TypeCast/@Element",
- "p1@odata.navigationLinkUrl": "entitySet(1)/deferred",
- "p1@odata.associationLinkUrl": "entitySet(1)/$links/deferred"
- };
-
- var expected = {
- __metadata: {
- type: "TypeCast",
- properties: {
- p1: {
- type: null,
- associationLinkUrl: "http://someUri/entitySet(1)/$links/deferred"
- }
- }
- },
- p1: {
- __deferred: {
- uri: "http://someUri/entitySet(1)/deferred"
- }
- }
- };
-
- verifyReadJsonLightData(input, expected, "Json light object with deferred navigation properties was read properly");
- djstest.done();
- });
-
- djstest.addTest(function jsonLightReadEntryWithInlinedNavigationPropertiesTest() {
- var testModel = {
- "version": "1.0",
- "dataServices": {
- "dataServiceVersion": "4.0",
- "schema": [{
- "namespace": "Ns",
- "entityType": [{
- "name": "EntityType",
- "navigationProperty": [
- { "name": "p1", "relationship": "Ns.Rel1", "toRole": "p1s" },
- { "name": "p2", "relationship": "Ns.Rel2", "toRole": "p2s" }
- ]
- }],
- "association": [{
- "name": "Rel1",
- "end": [
- { "type": "Ns.EntityType1", "role": "p1s" },
- { "type": "Ns.EntityType", "role": "otherRole" }
- ]
- },
- {
- "name": "Rel2",
- "end": [
- { "type": "Ns.EntityType", "role": "otherRole" },
- { "type": "Ns.EntityType2", "role": "p2s" }
- ]
- }]
- }]
- }
- };
-
- var input = {
- "odata.metadata": "http://someUri/$metadata#EntitySet/Ns.EntityType/@Element",
- p1: [
- { e1: 100, e2: 200 },
- { e1: 110, e2: 220 }
- ],
- "p1@odata.count": 50,
- "p1@odata.nextLink": "nextToken",
- p2: {
- e3: 300
- },
- p3: [
- { e4: 400, e5: 500 },
- { e4: 440, e5: 550 }
- ],
- "p3@odata.navigationLinkUrl": "http://someUri/entitySet(1)/p3",
- "p3@odata.associationLinkUrl": "http://someUri/entitySet(1)/$links/p3",
- p4: {
- e6: 600
- },
- "p4@odata.navigationLinkUrl": "http://someUri/entitySet(1)/p4",
- "p4@odata.associationLinkUrl": "http://someUri/entitySet(1)/$links/p4",
- p5: [
- {
- "odata.id": 12345,
- e7: 700,
- e8: 800
- }
- ],
- p6: {
- "odata.id": 78910,
- e9: 900,
- "e9@odata.type": "Edm.Int32"
- }
- };
-
- var expected = {
- __metadata: {
- type: "Ns.EntityType",
- properties: {
- p1: {
- type: "Ns.EntityType1"
- },
- p2: {
- type: "Ns.EntityType2"
- },
- p3: {
- type: null,
- navigationLinkUrl: "http://someUri/entitySet(1)/p3",
- associationLinkUrl: "http://someUri/entitySet(1)/$links/p3"
- },
- p4: {
- type: null,
- navigationLinkUrl: "http://someUri/entitySet(1)/p4",
- associationLinkUrl: "http://someUri/entitySet(1)/$links/p4"
- },
- p5: {
- type: null
- },
- p6: {
- type: null
- }
- }
- },
- p1: {
- __count: 50,
- __next: "http://someUri/nextToken",
- results: [
- {
- __metadata: {
- type: "Ns.EntityType1",
- properties: {
- e1: { type: null },
- e2: { type: null }
- }
- },
- e1: 100,
- e2: 200
- },
- {
- __metadata: {
- type: "Ns.EntityType1",
- properties: {
- e1: { type: null },
- e2: { type: null }
- }
- },
- e1: 110,
- e2: 220
- }
- ]
- },
- p2: {
- __metadata: {
- type: "Ns.EntityType2",
- properties: {
- e3: { type: null }
- }
- },
- e3: 300
- },
- p3: {
- results: [
- {
- __metadata: {
- type: null,
- properties: {
- e4: { type: null },
- e5: { type: null }
- }
- },
- e4: 400,
- e5: 500
- },
- {
- __metadata: {
- type: null,
- properties: {
- e4: { type: null },
- e5: { type: null }
- }
- },
- e4: 440,
- e5: 550
- }
- ]
- },
- p4: {
- __metadata: {
- type: null,
- properties: {
- e6: { type: null }
- }
- },
- e6: 600
- },
- p5: {
- results: [
- {
- __metadata: {
- id: 12345,
- type: null,
- properties: {
- e7: { type: null },
- e8: { type: null }
- }
- },
- e7: 700,
- e8: 800
- }
- ]
- },
- p6: {
- __metadata: {
- id: 78910,
- type: null,
- properties: {
- e9: { type: "Edm.Int32" }
- }
- },
- e9: 900
- }
- };
-
- verifyReadJsonLightData(input, expected, "Json light object with inlined navigation properties was read properly", testModel);
- djstest.done();
- });
-
- djstest.addTest(function jsonLightReadStringPropertiesTest() {
- var testModel = {
- "version": "1.0",
- "dataServices": {
- "dataServiceVersion": "4.0",
- "schema": [{
- "namespace": "Ns",
- "entityType": [{
- "name": "EntityType",
- "property": [
- { "name": "p1", "type": "Edm.DateTime" },
- { "name": "p2", "type": "Edm.DateTimeOffset" },
- { "name": "p3", "type": "Edm.Time" }
- ]
- }]
- }]
- }
- };
-
- var input = {
- "odata.metadata": "http://someUri/$metadata#EntitySet/Ns.EntityType/@Element",
- p1: "2000-01-02T03:04:05",
- p2: "2000-01-02T03:04:05+01:00",
- p3: "P0Y0M05DT12H30M5S",
- p4: "hello world",
- p5: "2001-01-02T03:04:05",
- "p5@odata.type": "Edm.DateTime",
- p6: "2001-01-02T03:04:05+01:00",
- "p6@odata.type": "Edm.DateTimeOffset",
- p7: "P0Y0M05DT12H30M10S",
- "p7@odata.type": "Edm.Time"
- };
-
- var p2 = new Date("01/02/2000 02:04:05 GMT");
- p2.__edmType = "Edm.DateTimeOffset";
- p2.__offset = "+01:00";
-
- var p6 = new Date("01/02/2001 02:04:05 GMT");
- p2.__edmType = "Edm.DateTimeOffset";
- p2.__offset = "+01:00";
-
- var expected = {
- __metadata: {
- type: "Ns.EntityType",
- properties: {
- p1: { type: "Edm.DateTime" },
- p2: { type: "Edm.DateTimeOffset" },
- p3: { type: "Edm.Time" },
- p4: { type: null },
- p5: { type: "Edm.DateTime" },
- p6: { type: "Edm.DateTimeOffset" },
- p7: { type: "Edm.Time" }
- }
- },
- p1: new Date("01/02/2000 03:04:05 GMT"),
- p3: { ms: 477005000, __edmType: "Edm.Time" },
- p2: p2,
- p4: "hello world",
- p5: new Date("01/02/2001 03:04:05 GMT"),
- p6: p6,
- p7: { ms: 477010000, __edmType: "Edm.Time" }
- };
-
- verifyReadJsonLightData(input, expected, "Json light object with string properties was read properly", testModel);
- djstest.done();
- });
-
- djstest.addTest(function jsonLightReadRecognizeDateLiteralsTest() {
- var input = {
- p1: "2000-01-02T03:04:05",
- p2: "2000-01-02T03:04:05+01:00"
- };
-
- var p2 = new Date("01/02/2000 02:04:05 GMT");
- p2.__edmType = "Edm.DateTimeOffset";
- p2.__offset = "+01:00";
-
- var expected = {
- __metadata: {
- properties: {
- p1: {
- type: null
- },
- p2: {
- type: null
- }
- },
- type: null
- },
- p1: new Date("01/02/2000 03:04:05 GMT"),
- p2: p2
- };
-
- OData.jsonHandler.recognizeDates = true;
- verifyReadJsonLightData(input, expected, "Json light datetime literals were recognized. ");
-
- OData.jsonHandler.recognizeDates = false;
-
- expected.p1 = input.p1;
- expected.p2 = input.p2;
-
- verifyReadJsonLightData(input, expected, "Json light datetime literals were ignored");
- djstest.done();
- });
-
- djstest.addTest(function jsonLightReadEmptyFeedTest() {
- var input = { "odata.metadata": "http://someUri#entitySet/Set", value: [] };
- var expected = { results: [] };
-
- verifyReadJsonLightData(input, expected, "Json light feed object was read properly");
- djstest.done();
- });
-
- djstest.addTest(function jsonLightReadFeedTest() {
- var input = {
- "odata.metadata": "http://someUri#entitySet/Type",
- value: [
- { "odata.id": 12345 },
- { "odata.id": 56789 }
- ],
- "odata.count": 50,
- "odata.nextLink": "skipToken"
- };
-
- var expected = {
- __count: 50,
- __next: "http://someUri/skipToken",
- results: [
- {
- __metadata: {
- id: 12345,
- type: "Type"
- }
- },
- {
- __metadata: {
- id: 56789,
- type: "Type"
- }
- }
- ]
- };
-
- verifyReadJsonLightData(input, expected, "Json light feed object was read properly");
- djstest.done();
- });
-
- djstest.addTest(function jsonLightReadFeedUsingMetadataTest() {
- var testModel = {
- "version": "1.0",
- "dataServices": {
- "dataServiceVersion": "4.0",
- "schema": [{
- "namespace": "Test.Catalog",
- "entityContainer": [{
- "name": "TestCatalog",
- "isDefaultEntityContainer": "true",
- "entitySet": [
- { "name": "Titles", "entityType": "TestCatalog.Model.Title" }
- ]
- }
- ]
- }
- ]
- }
- };
-
- var tests = {
- "Unqualified entity set": {
- input: { "odata.metadata": "http://someUri#Titles", value: [{}] },
- expected: { results: [{ __metadata: { type: "TestCatalog.Model.Title"}}] }
- },
- "Qualified entity set": {
- input: { "odata.metadata": "http://someUri#Test.Catalog.TestCatalog.Titles", value: [{}] },
- expected: { results: [{ __metadata: { type: "TestCatalog.Model.Title"}}] }
- },
- "Type casted entity set": {
- input: { "odata.metadata": "http://someUri#TestCatalog.Titles/TypeCast", value: [{}] },
- expected: { results: [{ __metadata: { type: "TypeCast"}}] }
- }
- };
-
- for (var name in tests) {
- var test = tests[name];
- verifyReadJsonLightData(test.input, test.expected, name + " - Json light feed was read properly.", testModel);
- }
- djstest.done();
- });
-
- djstest.addTest(function jsonLightReadInferFeedAsObjectTest() {
- var testModel = {
- "version": "1.0",
- "dataServices": {
- "dataServiceVersion": "4.0",
- "schema": [{
- "namespace": "Test.Catalog",
- "entityContainer": [{
- "name": "TestCatalog",
- "isDefaultEntityContainer": "true",
- "entitySet": [
- { "name": "Titles", "entityType": "TestCatalog.Model.Title" }
- ]
- }
- ]
- }
- ]
- }
- };
-
- var tests = {
- "Feed as object": {
- input: { "odata.metadata": "http://someUri#EntitySet", value: [] },
- expected: {
- __metadata: {
- type: "EntitySet",
- properties: {
- value: { type: null }
- }
- },
- value: { __metadata: { type: null }, results: [] }
- }
- },
- "Feed as feed using value": {
- input: { "odata.metadata": "http://someUri#EntiySet", value: [{ "odata.id": 12345}] },
- expected: { results: [{ __metadata: { type: null, id: 12345}}] }
- },
- "Feed as feed using metadata": {
- input: { "odata.metadata": "http://someUri#Titles", value: [] },
- expected: { results: [] }
- },
- "Collection of primitive": {
- input: { "odata.metadata": "http://someUri#Collection(Edm.Int32)", value: [] },
- expected: { __metadata: { type: "Collection(Edm.Int32)" }, results: [] }
- },
- "Collection of complex": {
- input: { "odata.metadata": "http://someUri#Collection(My.Type)", value: [] },
- expected: { __metadata: { type: "Collection(My.Type)" }, results: [] }
- }
- };
-
- for (var name in tests) {
- var test = tests[name];
- var response = {
- headers: {
- "Content-Type": "application/json;odata.metadata=full",
- DataServiceVersion: "4.0"
- },
- body: JSON.stringify(test.input)
- };
-
- OData.jsonHandler.read(response, { metadata: testModel });
- djstest.assertAreEqualDeep(response.data, test.expected, name + " - Json light object was read properly ");
- }
- djstest.done();
- });
-
- djstest.addTest(function jsonLightReadEmptyLinksDocumentTest() {
- var input = {
- "odata.metadata": "http://someUri/$metadata#EntitySet/$links/NavProp",
- value: []
- };
-
- var expected = {
- results: []
- };
-
- verifyReadJsonLightData(input, expected, "Json light links document was read properly.");
- djstest.done();
- });
-
- djstest.addTest(function jsonLightReadLinksDocumentTest() {
- var input = {
- "odata.metadata": "http://someUri/$metadata#EntitySet/$links/NavProp",
- value: [
- { url: "Products(1)" },
- { url: "http://someUri/Products(2)" }
- ]
- };
-
- var expected = {
- results: [
- { uri: "http://someUri/Products(1)" },
- { uri: "http://someUri/Products(2)" }
- ]
- };
-
- verifyReadJsonLightData(input, expected, "Json light links document was read properly.");
- djstest.done();
- });
-
- djstest.addTest(function jsonLightReadSingleLinkDocumentTest() {
- var input = {
- "odata.metadata": "http://someUri/$metadata#EntitySet/$links/NavProp/@Element",
- url: "Products(1)"
- };
-
- var expected = {
- uri: "http://someUri/Products(1)"
- };
-
- verifyReadJsonLightData(input, expected, "Json light single link document was read properly.");
- djstest.done();
- });
-
- djstest.addTest(function jsonLightReadTopLevelPrimitiveProperty() {
- var input = {
- "odata.metadata": "http://someUri#Edm.GeometryPoint",
- value: {
- type: "Point",
- coordinates: [1.0, 2.0],
- crs: {
- type: name,
- properties: {
- name: "EPSG:4326"
- }
- }
- }
- };
-
- var expected = {
- __metadata: {
- type: "Edm.GeometryPoint"
- },
- value: {
- type: "Point",
- coordinates: [1.0, 2.0],
- crs: {
- type: name,
- properties: {
- name: "EPSG:4326"
- }
- }
- }
- };
-
- verifyReadJsonLightData(input, expected, "Json light top level primitive property was read properly.");
- djstest.done();
- });
-
- djstest.addTest(function jsonLightReadTopLevelComplexTypeTest() {
- var testModel = {
- "version": "1.0",
- "dataServices": {
- "dataServiceVersion": "4.0",
- "schema": [{
- "namespace": "Ns",
- "complexType": [{
- "name": "ComplexType",
- "property": [
- { "name": "value", "type": "Collection(Ns.ComplexType2)" }
- ]
- }]
- }]
- }
- };
-
- var input = {
- "odata.metadata": "http://someUri#Ns.ComplexType",
- value: [{
- p1: 100,
- p2: 200
- }]
- };
-
- var expected = {
- __metadata: {
- type: "Ns.ComplexType",
- properties: {
- value: {
- type: "Collection(Ns.ComplexType2)",
- elements: [
- {
- type: "Ns.ComplexType2",
- properties: {
- p1: { type: null },
- p2: { type: null }
- }
- }
- ]
- }
- }
- },
- value: {
- __metadata: { type: "Collection(Ns.ComplexType2)" },
- results: [
- {
- __metadata: { type: "Ns.ComplexType2" },
- p1: 100,
- p2: 200
- }
- ]
- }
- };
-
- verifyReadJsonLightData(input, expected, "Json light top level complex type property was read properly.", testModel);
- djstest.done();
- });
-
- djstest.addTest(function jsonLightReadTopPrimitiveCollectionPropertyTest() {
- var input = {
- "odata.metadata": "http://someUri#Collection(Edm.GeometryPoint)",
- value: [{
- type: "Point",
- coordinates: [1.0, 2.0],
- crs: {
- type: "name",
- properties: {
- name: "EPSG:4326"
- }
- }
- }]
- };
-
- var expected = {
- __metadata: {
- type: "Collection(Edm.GeometryPoint)"
- },
- results: [{
- type: "Point",
- coordinates: [1.0, 2.0],
- crs: {
- type: "name",
- properties: {
- name: "EPSG:4326"
- }
- }
- }]
- };
-
- verifyReadJsonLightData(input, expected, "Json light top level primitive collection property was read properly.");
- djstest.done();
- });
-
- djstest.addTest(function jsonLightReadTopLevelComplexTypeCollectionTest() {
- var input = {
- "odata.metadata": "http://someUri#Collection(Ns.ComplexType2)",
- value: [{
- p1: 100,
- p2: 200,
- "p2@odata.type": "Edm.Int16"
- }]
- };
-
- var expected = {
- __metadata: {
- type: "Collection(Ns.ComplexType2)",
- elements: [
- {
- type: "Ns.ComplexType2",
- properties: {
- p1: { type: null },
- p2: { type: "Edm.Int16" }
- }
- }
- ]
- },
- results: [
- {
- __metadata: { type: "Ns.ComplexType2" },
- p1: 100,
- p2: 200
- }
- ]
- };
-
- verifyReadJsonLightData(input, expected, "Json light top level complex type collection property was read properly.");
- djstest.done();
- });
-
- djstest.addTest(function jsonLightReadFeedAdvertisedActionsTest() {
-
- var testModel = {
- "version": "1.0",
- "dataServices": {
- "dataServiceVersion": "4.0",
- "schema": [{
- "namespace": "Ns",
- "entityContainer": [{
- "name": "EntityContainer",
- "isDefaultEntityContainer": "true",
- "entitySet": [
- { "name": "EntitySet", "entityType": "Ns.EntityType" }
- ]
- }
- ]
- }
- ]
- }
- };
-
- input = {
- "odata.metadata": "http://someUri/$metadata#EntitySet",
- "#action1": {
- target: "action1/item(0)",
- title: "Action1"
- },
- "#action2": {
- target: "action2/item(0)",
- title: "Action2"
- },
- value: []
- };
-
- expected = {
- __metadata: {
- actions: [
- {
- metadata: "http://someUri/action1",
- target: "http://someUri/action1/item(0)",
- title: "Action1"
- },
- {
- metadata: "http://someUri/action2",
- target: "http://someUri/action2/item(0)",
- title: "Action2"
- }
- ]
- },
- results: []
- };
-
- verifyReadJsonLightData(input, expected, "Json light feed with advertised actions was read properly.", testModel);
- djstest.done();
- });
-
- djstest.addTest(function jsonLightReadAdvertisedActionsAndFunctionsTest() {
- var testModel = {
- "version": "1.0",
- "dataServices": {
- "dataServiceVersion": "4.0",
- "schema": [{
- "namespace": "Test.Catalog",
- "entityContainer": [{
- "name": "TestCatalog",
- "isDefaultEntityContainer": "true",
- "functionImport": [
- { "name": "function1", "isSideEffecting": "false" },
- { "name": "function2", "isSideEffecting": "false" },
- { "name": "action1", "isSideEffecting": "true" },
- { "name": "action2" }
- ]
- }, {
- "name": "OtherCatalog",
- "isDefaultEntityContainer": "false",
- "functionImport": [
- { "name": "function1", "isSideEffecting": "false" }
- ]
- }]
- }]
- }
- };
-
- input = {
- "odata.metadata": "http://someUri/$metadata#EntitySet/@Element",
- "#function2": [
- {
- target: "function2/item(0)",
- title: "Function2 overload1"
- },
- {
- target: "function2/item(0)",
- title: "Function2 overload2"
- }
- ],
- "#action1": {
- target: "action1/item(0)",
- title: "Action1"
- },
- "#action2": {
- target: "action2/item(0)",
- title: "Action2"
- },
- "#function1": {
- target: "function1/item(0)",
- title: "Function1"
- },
- "#Test.Catalog.OtherCatalog.function1": {
- target: "Test.Catalog.OtherCatalog.function1/item(0)",
- title: "Function1 in other catalog"
- },
- "#action3": [
- {
- target: "action3/item(0)",
- title: "Unkown action overload1"
- },
- {
- target: "http://otherUri/action3/item(0)",
- title: "Unkown action overload2"
- }
- ]
- };
-
- expected = {
- __metadata: {
- type: null,
- actions: [
- {
- metadata: "http://someUri/action1",
- target: "http://someUri/action1/item(0)",
- title: "Action1"
- },
- {
- metadata: "http://someUri/action2",
- target: "http://someUri/action2/item(0)",
- title: "Action2"
- },
- {
- metadata: "http://someUri/action3",
- target: "http://someUri/action3/item(0)",
- title: "Unkown action overload1"
- },
- {
- metadata: "http://someUri/action3",
- target: "http://otherUri/action3/item(0)",
- title: "Unkown action overload2"
- }
- ],
- functions: [
- {
- metadata: "http://someUri/function2",
- target: "http://someUri/function2/item(0)",
- title: "Function2 overload1"
- },
- {
- metadata: "http://someUri/function2",
- target: "http://someUri/function2/item(0)",
- title: "Function2 overload2"
- },
- {
- metadata: "http://someUri/function1",
- target: "http://someUri/function1/item(0)",
- title: "Function1"
- },
- {
- metadata: "http://someUri/Test.Catalog.OtherCatalog.function1",
- target: "http://someUri/Test.Catalog.OtherCatalog.function1/item(0)",
- title: "Function1 in other catalog"
- }
- ]
- }
- };
-
- verifyReadJsonLightData(input, expected, "Json light advertised actions and functions were read properly.", testModel);
- djstest.done();
- });
-
- djstest.addTest(function jsonLightSerializeEntryMetadataTest() {
- var data = {
- __metadata: {
- metadata: "http://someUri/$metadata#NS.Container/Set/@Element",
- id: "http://someUri/Customers(1)",
- etag: "etag-value",
- self: "http://someUri/read/Customers(1)",
- edit: "http://someUri/read/Customers(1)",
- media_src: "http://someUri/Customers(1)/Image",
- edit_media: "http://someUri/Customers(1)/$value",
- media_etag: "stream-etag-value",
- content_type: "image/jpg"
- }
- };
-
- var expected = {
- "odata.etag": "etag-value",
- "odata.mediaReadLink": "http://someUri/Customers(1)/Image",
- "odata.mediaEditLink": "http://someUri/Customers(1)/$value",
- "odata.mediaETag": "stream-etag-value",
- "odata.mediaContentType": "image/jpg"
- };
-
- verifySerializedJsonLightData(data, expected, " Json light entry metadata was serialized properly.");
- });
-
- djstest.addTest(function jsonLightSerializeCustomAnnotationsTest() {
- var data = {
- __metadata: {
- id: "id"
- },
- "odata.id": "id",
- "custom.annotation": "custom annotation value",
- "p1@ns1.primitive": "primitive",
- "p1@ns2.complex": { a1: 500 },
- "p1@ns3.ns4.value": 600,
- "p2@ns1.primitive": 400,
- "custom.annotation": "custom annotation value"
- };
-
- var expected = {
- "odata.id": "id",
- "custom.annotation": "custom annotation value",
- "p1@ns1.primitive": "primitive",
- "p1@ns2.complex": { a1: 500 },
- "p1@ns3.ns4.value": 600,
- "p2@ns1.primitive": 400
- };
-
- verifySerializedJsonLightData(data, expected, " Json light custom annotations were serialized properly.");
- });
-
- djstest.addTest(function jsonLightSerializeEntryCollectionPropertiesTest() {
- var data = {
- __metadata: {
- id: "id",
- properties: {
- primitiveColArray: { type: "Collection(Edm.Int16)" },
- primitiveColObject: { type: "Collection(Edm.Int32)" }
- }
- },
- primitiveColArray: [1, 2, 3, 4],
- primitiveColObject: {
- results: [5, 6, 7, 8]
- },
- complexColArray: [{ p1: 100 }, { p1: 200}],
- complexColObject: {
- results: [{ p1: 300 }, { p1: 400}]
- }
- };
-
- var expected = {
- "primitiveColArray@odata.type": "Collection(Edm.Int16)",
- primitiveColArray: [1, 2, 3, 4],
- "primitiveColObject@odata.type": "Collection(Edm.Int32)",
- primitiveColObject: [5, 6, 7, 8],
- complexColArray: [{ p1: 100 }, { p1: 200}],
- complexColObject: [{ p1: 300 }, { p1: 400}]
- };
-
- verifySerializedJsonLightData(data, expected, " Json light entry collection properties were serialized properly.");
- });
-
- djstest.addTest(function jsonLightSerializeEntryDeferredPropertyTest() {
- var data = {
- __metadata: {
- id: "id",
- properties: {
- deferred: {
- associationLinkUrl: "http://target/$links"
- }
- }
- },
- deferred: {
- __deferred: { uri: "http://target" }
- }
- };
-
- var expected = {
- "deferred@odata.navigationLinkUrl": "http://target"
- };
-
- verifySerializedJsonLightData(data, expected, " Json light entry deferred property were serialized properly.");
- });
-
- djstest.addTest(function jsonLightSerializeEntryInlinePropertiesTest() {
- var data = {
- __metadata: {
- id: "id"
- },
- inlineEntry: {
- __metadata: { uri: "", properties: { p1: { type: "Edm.Int64"}} },
- p1: "300"
- },
- inlineBoundEntry: {
- __metadata: { uri: "http://entries(1)", properties: { p1: { type: "Edm.Int64"}} },
- p1: "400"
- },
- inlineFeedArray: [
- {
- __metadata: { uri: "http://entries(2)" }
- },
- {
- __metadata: { uri: "", properties: { p1: { type: "Edm.Int32"}} },
- p1: "600"
- },
- {
- __metadata: { uri: "http://entries(3)" }
- }
- ],
- inlineFeedObject: {
- __count: 50,
- __next: "next link",
- results: [
- { __metadata: { uri: "" }, p1: "900" }
- ]
- },
- inlineEmptyFeedObject: {
- results: []
- }
- };
-
- var expected = {
- inlineEntry: {
- "p1@odata.type": "Edm.Int64",
- p1: "300"
- },
- "inlineBoundEntry@odata.bind": "http://entries(1)",
- inlineFeedArray: [{
- "p1@odata.type": "Edm.Int32",
- p1: "600"
- }],
- "inlineFeedArray@odata.bind": [
- "http://entries(2)",
- "http://entries(3)"
- ],
- inlineFeedObject: [{
- p1: "900"
- }],
- inlineEmptyFeedObject: []
- };
-
- verifySerializedJsonLightData(data, expected, " Json light entry inline properties were serialized properly.");
-
- });
-
- djstest.addTest(function jsonLightSerializeEntryComplexPropertyTest() {
- var data = {
- __metadata: {
- id: "id",
- properties: {
- complexAsDeferredOnMetadata: {
- type: "complexAsDeferredOnMetadata.type"
- },
- complexAsCol: {
- type: "complexAsCol.type"
- }
- }
- },
- complexAsDeferred: {
- __metadata: {
- type: "complexAsDeferred.type"
- },
- __deferred: { uri: "http://uri" }
- },
- complexAsCol: {
- results: [1, 2, 3, 4]
- },
- complexAsNamedStream: {
- __metadata: {
- type: "complexAsNamedStream"
- },
- __mediaresource: {
- content_type: "content type",
- media_src: "http://source"
- }
- },
- complexAsDeferredOnMetadata: {
- __deferred: { uri: "http://uri2" }
- }
- };
-
- var expected = {
- complexAsDeferred: {
- "odata.type": "complexAsDeferred.type",
- __deferred: { uri: "http://uri" }
- },
- complexAsCol: {
- "odata.type": "complexAsCol.type",
- results: [1, 2, 3, 4]
- },
- complexAsNamedStream: {
- "odata.type": "complexAsNamedStream",
- __mediaresource: {
- content_type: "content type",
- media_src: "http://source"
- }
- },
- complexAsDeferredOnMetadata: {
- "odata.type": "complexAsDeferredOnMetadata.type",
- __deferred: { uri: "http://uri2" }
- }
- };
-
- verifySerializedJsonLightData(data, expected, " Json light entry complex properties were serialized properly.");
- });
-
- djstest.addTest(function jsonLightSerializeEntryComplexPropertyMetadataTest() {
- var data = {
- __metadata: {
- id: "id",
- properties: {
- complex: {
- type: "this should be overriden",
- properties: {
- nested1: {
- type: "types.complex.nested1",
- properties: {
- nested2: {
- type: "types.complex.nested1.nested2"
- }
- }
- },
- c1: {
- type: "Edm.Int64"
- }
- }
- }
- }
- },
- complex: {
- __metadata: {
- type: "types.complex"
- },
- c1: "500",
- c2: "b",
- nested1: {
- nested2: {
- }
- }
- }
- };
-
- var expected = {
- complex: {
- "odata.type": "types.complex",
- "c1@odata.type": "Edm.Int64",
- c1: "500",
- c2: "b",
- nested1: {
- "odata.type": "types.complex.nested1",
- nested2: {
- "odata.type": "types.complex.nested1.nested2"
- }
- }
- }
- };
-
- verifySerializedJsonLightData(data, expected, " Json light entry complex property was serialized properly.");
- });
-
- djstest.addTest(function jsonLightSerializeLinksDocumentTest() {
- var tests = {
- "Empty uri string": {
- i: { uri: "" },
- e: { url: "" }
- },
- "Null uri string": {
- i: { uri: null },
- e: { url: null }
- },
- "Undefined uri string": {
- i: { uri: undefined },
- e: {}
- },
- "Uri": {
- i: { uri: "http://somUri/EntitySet(1)" },
- e: { url: "http://somUri/EntitySet(1)" }
- }
- };
-
- for (var name in tests) {
- verifySerializedJsonLightData(tests[name].i, tests[name].e, name + " - Json light links documents whas serialized properly.", "http://someUri/set(3)/$links/navprop");
- }
- });
-
- djstest.addTest(function jsonLightComputeLinksWithSingleKey() {
- var model = getSampleModel();
- var input = {
- "odata.metadata": "http://someUri/$metadata#EntityTypes/@Element",
- Id: "MyId",
- P1: 42
- };
-
- var expected = {
- "__metadata": {
- "type": "NS.EntityType",
- "properties": { "Id": { "type": "Edm.String" }, "P1": { "type": "Edm.Int32"} },
- "id": "http://someUri/EntityTypes('MyId')",
- "edit": "http://someUri/EntityTypes('MyId')",
- "uri": "http://someUri/EntityTypes('MyId')",
- "self": "http://someUri/EntityTypes('MyId')"
-
- },
- "Id": "MyId",
- "P1": 42
- };
-
- verifyReadJsonLightWithMinimalMetadata(input, expected, "Json light type annotations in payload are preferred over type information in the metadata document", model);
- djstest.done();
- });
-
- djstest.addTest(function jsonLightComputeLinksWithMultipleKeys() {
- var model = getSampleModelWithTwoKeys();
- var input = {
- "odata.metadata": "http://someUri/$metadata#EntityTypes/@Element",
- Id: "MyId",
- P1: 42
- };
-
- var expected = {
- "__metadata": {
- "type": "NS.EntityType",
- "properties": { "Id": { "type": "Edm.String" }, "P1": { "type": "Edm.Int32"} },
- "id": "http://someUri/EntityTypes(Id='MyId',P1=42)",
- "edit": "http://someUri/EntityTypes(Id='MyId',P1=42)",
- "uri": "http://someUri/EntityTypes(Id='MyId',P1=42)",
- "self": "http://someUri/EntityTypes(Id='MyId',P1=42)"
- },
- "Id": "MyId",
- "P1": 42
- };
-
- verifyReadJsonLightWithMinimalMetadata(input, expected, "Json light type annotations in payload are preferred over type information in the metadata document", model);
- djstest.done();
- });
-
- djstest.addTest(function jsonLightComputeLinksWithNonComputedEditLink() {
- var model = getSampleModel();
- var input = {
- "odata.metadata": "http://someUri/$metadata#EntityTypes/@Element",
- "odata.editLink": "EntityTypes('notcomputed')",
- Id: "MyId",
- P1: 42
- };
-
- var expected = {
- "__metadata": {
- "type": "NS.EntityType",
- "properties": { "Id": { "type": "Edm.String" }, "P1": { "type": "Edm.Int32"} },
- "id": "http://someUri/EntityTypes('notcomputed')",
- "edit": "http://someUri/EntityTypes('notcomputed')",
- "uri": "http://someUri/EntityTypes('notcomputed')",
- "self": "http://someUri/EntityTypes('notcomputed')"
- },
- "Id": "MyId",
- "P1": 42
- };
-
- verifyReadJsonLightWithMinimalMetadata(input, expected, "Json light type annotations in payload are preferred over type information in the metadata document", model);
- djstest.done();
- });
-
- djstest.addTest(function jsonLightComputeLinksWithSingleConcurrencyProperty() {
- var model = getSampleModelWithOneConcurrencyProperty();
- var input = {
- "odata.metadata": "http://someUri/$metadata#EntityTypes/@Element",
- Id: "MyId",
- P1: 42
- };
-
- var expected = {
- "__metadata": {
- "type": "NS.EntityType",
- "properties": { "Id": { "type": "Edm.String" }, "P1": { "type": "Edm.Int32"} },
- "id": "http://someUri/EntityTypes('MyId')",
- "edit": "http://someUri/EntityTypes('MyId')",
- "uri": "http://someUri/EntityTypes('MyId')",
- "self": "http://someUri/EntityTypes('MyId')",
- "etag": "W/\"'MyId'\""
- },
- "Id": "MyId",
- "P1": 42
- };
-
- verifyReadJsonLightWithMinimalMetadata(input, expected, "Json light type annotations in payload are preferred over type information in the metadata document", model);
- djstest.done();
- });
-
- djstest.addTest(function jsonLightComputeLinksWithSingleBinaryConcurrencyProperty() {
- var model = getSampleModelWithOneBinaryConcurrencyProperty();
- var input = {
- "odata.metadata": "http://someUri/$metadata#EntityTypes/@Element",
- Id: "MyId",
- P1: "AAAAAAAAB9E="
- };
-
- var expected = {
- "__metadata": {
- "type": "NS.EntityType",
- "properties": { "Id": { "type": "Edm.String" }, "P1": { "type": "Edm.Binary"} },
- "id": "http://someUri/EntityTypes('MyId')",
- "edit": "http://someUri/EntityTypes('MyId')",
- "uri": "http://someUri/EntityTypes('MyId')",
- "self": "http://someUri/EntityTypes('MyId')",
- "etag": "W/\"X'00000000000007D1'\""
- },
- "Id": "MyId",
- "P1": "AAAAAAAAB9E="
- };
-
- verifyReadJsonLightWithMinimalMetadata(input, expected, "Json light type annotations in payload are preferred over type information in the metadata document", model);
- djstest.done();
- });
-
- djstest.addTest(function jsonLightComputeLinkWithMutipleConcurrencyProperty() {
- var model = getSampleModelWithMultipleConcurrencyProperties();
- var input = {
- "odata.metadata": "http://someUri/$metadata#EntityTypes/@Element",
- Id: "MyId",
- P1: 42
- };
-
- var expected = {
- "__metadata": {
- "type": "NS.EntityType",
- "properties": { "Id": { "type": "Edm.String" }, "P1": { "type": "Edm.Int32"} },
- "id": "http://someUri/EntityTypes('MyId')",
- "edit": "http://someUri/EntityTypes('MyId')",
- "uri": "http://someUri/EntityTypes('MyId')",
- "self": "http://someUri/EntityTypes('MyId')",
- "etag": "W/\"'MyId',42\""
- },
- "Id": "MyId",
- "P1": 42
- };
-
- verifyReadJsonLightWithMinimalMetadata(input, expected, "Json light type annotations in payload are preferred over type information in the metadata document", model);
- djstest.done();
- });
-
- djstest.addTest(function jsonLightComputeLinkWithNullConcurrencyProperty() {
- var model = getSampleModelWithMultipleConcurrencyProperties();
- var input = {
- "odata.metadata": "http://someUri/$metadata#EntityTypes/@Element",
- Id: "My Id'",
- P1: null
- };
-
- var expected = {
- "__metadata": {
- "type": "NS.EntityType",
- "properties": { "Id": { "type": "Edm.String" }, "P1": { "type": "Edm.Int32"} },
- "id": "http://someUri/EntityTypes('My%20Id''')",
- "edit": "http://someUri/EntityTypes('My%20Id''')",
- "uri": "http://someUri/EntityTypes('My%20Id''')",
- "self": "http://someUri/EntityTypes('My%20Id''')",
- "etag": "W/\"'My%20Id''',null\""
- },
- "Id": "My Id'",
- "P1": null
- };
-
- verifyReadJsonLightWithMinimalMetadata(input, expected, "Json light type annotations in payload are preferred over type information in the metadata document", model);
- djstest.done();
- });
-
- djstest.addTest(function jsonLightWithDecimalValue() {
- var model = getSampleModelWithDecimalProperty();
- var input = {
- "odata.metadata": "http://someUri/$metadata#EntityTypes/@Element",
- Id: "5",
- P1: "10.5"
- };
-
- var expected = {
- "__metadata": {
- "type": "NS.EntityType",
- "properties": {
- "Id": {
- "type": "Edm.String"
- },
- "P1": {
- "type": "Edm.Decimal"
- },
- },
- "id": "http:\/\/someUri\/EntityTypes('5')",
- "uri": "http:\/\/someUri\/EntityTypes('5')",
- "edit": "http:\/\/someUri\/EntityTypes('5')",
- "self": "http:\/\/someUri\/EntityTypes('5')"
- },
- "Id": "5",
- "P1": "10.5"
- };
-
-
- verifyReadJsonLightWithMinimalMetadata(input, expected, "Json light type annotations in payload are preferred over type information in the metadata document", model);
- djstest.done();
- });
-
- djstest.addTest(function jsonLightNavigationPropertyAndAssociationUriShouldBeComputedTest() {
- var model = getSampleModelWithNavPropertiesAndInheritedTypes();
- var input = {
- "odata.metadata": "http://someUri/$metadata#Products/@Element",
- ID: 5,
- };
-
- var expected = {
- "__metadata": {
- "type": "ODataDemo.Product",
- "properties": {
- "ID": {
- "type": "Edm.Int32"
- },
- "Category": {
- "type": "ODataDemo.Category",
- "associationLinkUrl": "http:\/\/someUri\/Products(5)\/$links\/Category",
- }
- },
- "id": "http:\/\/someUri\/Products(5)",
- "uri": "http:\/\/someUri\/Products(5)",
- "edit": "http:\/\/someUri\/Products(5)",
- "self": "http:\/\/someUri\/Products(5)"
- },
- "ID": 5,
- "Category": {
- "__deferred": {
- "uri": "http:\/\/someUri\/Products(5)\/Category"
- }
- }
- };
-
-
- verifyReadJsonLightWithMinimalMetadata(input, expected, "Json light type annotations in payload are preferred over type information in the metadata document", model);
- djstest.done();
- });
-
- djstest.addTest(function jsonLightNullNavigationPropertyShouldNotBeComputedTest() {
- var model = getSampleModelWithNavPropertiesAndInheritedTypes();
- var input = {
- "odata.metadata": "http://someUri/$metadata#Products/@Element",
- ID: 5,
- Category: null
- };
-
- var expected = {
- "__metadata": {
- "type": "ODataDemo.Product",
- "properties": {
- "ID": {
- "type": "Edm.Int32"
- },
- "Category": {
- "type": "ODataDemo.Category",
- "associationLinkUrl": "http:\/\/someUri\/Products(5)\/$links\/Category",
- "navigationLinkUrl": "http:\/\/someUri\/Products(5)\/Category"
- }
- },
- "id": "http:\/\/someUri\/Products(5)",
- "uri": "http:\/\/someUri\/Products(5)",
- "edit": "http:\/\/someUri\/Products(5)",
- "self": "http:\/\/someUri\/Products(5)"
- },
- "ID": 5,
- "Category": null
- };
-
-
- verifyReadJsonLightWithMinimalMetadata(input, expected, "Json light type annotations in payload are preferred over type information in the metadata document", model);
- djstest.done();
- });
-
- djstest.addTest(function jsonLightUrisShouldBeComputedForExpandedEntities() {
- var model = getSampleModelWithNavPropertiesAndInheritedTypes();
- var input = {
- "odata.metadata": "http://someUri/$metadata#Products/@Element",
- ID: 5,
- Category: {
- ID: 1
- }
- };
-
- var expected = {
- "__metadata": {
- "type": "ODataDemo.Product",
- "properties": {
- "ID": {
- "type": "Edm.Int32"
- },
- "Category": {
- "type": "ODataDemo.Category",
- "navigationLinkUrl": "http:\/\/someUri\/Products(5)\/Category",
- "associationLinkUrl": "http:\/\/someUri\/Products(5)\/$links\/Category"
- }
- },
- "id": "http:\/\/someUri\/Products(5)",
- "uri": "http:\/\/someUri\/Products(5)",
- "edit": "http:\/\/someUri\/Products(5)",
- "self": "http:\/\/someUri\/Products(5)"
- },
- "ID": 5,
- "Category": {
- "__metadata": {
- "type": "ODataDemo.Category",
- "properties": {
- "ID": {
- "type": "Edm.Int32"
- },
- "Products": {
- "type": "ODataDemo.Product",
- "associationLinkUrl": "http:\/\/someUri\/Categories(1)\/$links\/Products"
- }
- },
- "id": "http:\/\/someUri\/Categories(1)",
- "uri": "http:\/\/someUri\/Categories(1)",
- "edit": "http:\/\/someUri\/Categories(1)",
- "self": "http:\/\/someUri\/Categories(1)"
- },
- "ID": 1,
- "Products": {
- "__deferred": {
- "uri": "http:\/\/someUri\/Categories(1)\/Products"
- }
- }
- }
- };
-
- verifyReadJsonLightWithMinimalMetadata(input, expected, "Json light type annotations in payload are preferred over type information in the metadata document", model);
- djstest.done();
- });
-
- djstest.addTest(function jsonLightUr
<TRUNCATED>
[10/22] olingo-odata4-js git commit: [OLINGO-442] Cleanup bevor
release
Posted by ko...@apache.org.
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/endpoints/BasicAuthDataService.svc
----------------------------------------------------------------------
diff --git a/JSLib/tests/endpoints/BasicAuthDataService.svc b/JSLib/tests/endpoints/BasicAuthDataService.svc
deleted file mode 100644
index 66dcb1f..0000000
--- a/JSLib/tests/endpoints/BasicAuthDataService.svc
+++ /dev/null
@@ -1,108 +0,0 @@
-<%@ ServiceHost Language="C#" Factory="Microsoft.OData.Service.DataServiceHostFactory, Microsoft.OData.Service, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
- Service="DataJS.Tests.BasicAuthDataService" %>
-
-namespace DataJS.Tests
-{
- using System;
- using System.Collections.Generic;
- using Microsoft.OData.Service;
- using Microsoft.OData.Service.Common;
- using System.Linq;
- using System.ServiceModel;
- using System.ServiceModel.Web;
- using System.Text;
- using System.Web;
-
- [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
- public class BasicAuthDataService : DataService<BasicAuthDataSource>
- {
- const string Username = "djsUser";
- const string Password = "djsPassword";
-
- // This method is called only once to initialize service-wide policies.
- public static void InitializeService(DataServiceConfiguration config)
- {
- config.SetEntitySetAccessRule("*", EntitySetRights.All);
- config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
- config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V4;
- config.UseVerboseErrors = true;
- }
-
- public BasicAuthDataService()
- : base()
- {
- this.ProcessingPipeline.ProcessingRequest += OnRequest;
- }
-
- [WebInvoke]
- public void ResetData()
- {
- this.CurrentDataSource.ResetData();
- }
-
- private static void UnauthorizedRequest(DataServiceOperationContext context)
- {
- context.ResponseHeaders["WWW-Authenticate"] = "Basic realm=\"DataJS.Tests\"";
- throw new DataServiceException(401, "401 Unauthorized");
- }
-
- private void OnRequest(object sender, DataServiceProcessingPipelineEventArgs e)
- {
- string authHeader = e.OperationContext.RequestHeaders["Authorization"];
-
- // Validate the Authorization header
- if (authHeader == null || !authHeader.StartsWith("Basic"))
- {
- UnauthorizedRequest(e.OperationContext);
- }
-
- // Decode the username and password from the header
- string base64Credentials = authHeader.Substring(6);
- string[] credentials = Encoding.ASCII.GetString(Convert.FromBase64String(base64Credentials)).Split(':');
- if (credentials.Length != 2 || !(credentials[0].Equals(Username) && credentials[1].Equals(Password)))
- {
- UnauthorizedRequest(e.OperationContext);
- }
- }
- }
-
- public class BasicAuthDataSource : ReflectionDataContext, IUpdatable
- {
- private static bool dataInitialized;
-
- public IQueryable<Customer> Customers
- {
- get { return this.GetResourceSetEntities<Customer>("Customers").AsQueryable(); }
- }
-
- public void ResetData()
- {
- this.ClearData();
-
- IList<Customer> customers = this.GetResourceSetEntities<Customer>("Customers");
- foreach (int i in Enumerable.Range(1, 16))
- {
- customers.Add(new Customer()
- {
- ID = i,
- Name = "Customer " + i
- });
- }
- }
-
- protected override void EnsureDataIsInitialized()
- {
- if (!dataInitialized)
- {
- this.ResetData();
- dataInitialized = true;
- }
- }
- }
-
- public class Customer
- {
- public int ID { get; set; }
- public string Name { get; set; }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/endpoints/CustomAnnotations.xml
----------------------------------------------------------------------
diff --git a/JSLib/tests/endpoints/CustomAnnotations.xml b/JSLib/tests/endpoints/CustomAnnotations.xml
deleted file mode 100644
index 622769f..0000000
--- a/JSLib/tests/endpoints/CustomAnnotations.xml
+++ /dev/null
@@ -1,102 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<edmx:Edmx xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx" Version="1.0">
- <edmx:DataServices m:DataServiceVersion="2.0" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
- <Schema xmlns="http://schemas.microsoft.com/ado/2007/05/edm" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:mcns="http://MyCustomNamespace.com"
- Namespace="DataJS.Tests">
- <EntityType Name="MappedEntry" mcns:MyCustomAnnotation="My custom attribute.">
- <Key mcns:MyCustomAnnotation="//">
- <PropertyRef Name="ID" mcns:MyCustomAnnotation=" "/>
- </Key>
- <Property Name="ID" Nullable="false" Type="Edm.Int32"/>
- <Property Name="UnmappedField" Nullable="true" Type="Edm.String"/>
- <Property Name="Author" Nullable="false" Type="DataJS.Tests.Author" m:FC_KeepInContent_5="false" m:FC_SourcePath_5="Contributor/Name" m:FC_ContentKind_5="text" m:FC_TargetPath_5="SyndicationContributorName" m:FC_KeepInContent_4="false" m:FC_SourcePath_4="Contributor/Email" m:FC_ContentKind_4="text" m:FC_TargetPath_4="SyndicationContributorEmail" m:FC_KeepInContent_3="false" m:FC_SourcePath_3="Uri" m:FC_ContentKind_3="text" m:FC_TargetPath_3="SyndicationAuthorUri" m:FC_KeepInContent_2="false" m:FC_SourcePath_2="Name" m:FC_ContentKind_2="text" m:FC_TargetPath_2="SyndicationAuthorName" m:FC_KeepInContent_1="false" m:FC_SourcePath_1="Email" m:FC_ContentKind_1="text" m:FC_TargetPath_1="SyndicationAuthorEmail" m:FC_KeepInContent="false" m:FC_SourcePath="Contributor/Uri" m:FC_ContentKind="text" m:FC_TargetPath="SyndicationContributorUri"/>
- <Property Name="Published" Nullable="true" Type="Edm.String" m:FC_KeepInContent="false" m:FC_ContentKind="text" m:FC_TargetPath="SyndicationPublished"/>
- <Property Name="Rights" Nullable="true" Type="Edm.String" m:FC_KeepInContent="false" m:FC_ContentKind="text" m:FC_TargetPath="SyndicationRights"/>
- <Property Name="Summary" Nullable="true" Type="Edm.String" m:FC_KeepInContent="false" m:FC_ContentKind="xhtml" m:FC_TargetPath="SyndicationSummary"/>
- <Property Name="Title" Nullable="true" Type="Edm.String" m:FC_KeepInContent="false" m:FC_ContentKind="html" m:FC_TargetPath="SyndicationTitle"/>
- <Property Name="Updated" Nullable="true" Type="Edm.String" m:FC_KeepInContent="false" m:FC_ContentKind="text" m:FC_TargetPath="SyndicationUpdated"/>
- <Property Name="CustomElement" Nullable="true" Type="Edm.String" m:FC_KeepInContent="false" m:FC_TargetPath="customElement" m:FC_NsPrefix="pr" m:FC_NsUri="http://www.example.org/dummy"/>
- <Property Name="CustomAttribute" Nullable="true" Type="Edm.String" m:FC_KeepInContent="false" m:FC_TargetPath="customElement/@customAttribute" m:FC_NsPrefix="pr" m:FC_NsUri="http://www.example.org/dummy"/>
- <Property Name="NestedElement1" Nullable="true" Type="Edm.String" m:FC_KeepInContent="false" m:FC_TargetPath="commonElement/nestedElement1" m:FC_NsPrefix="pr" m:FC_NsUri="http://www.example.com/dummy"/>
- <Property Name="NestedElement2" Nullable="true" Type="Edm.String" m:FC_KeepInContent="false" m:FC_TargetPath="commonElement/nestedElement2" m:FC_NsPrefix="pr" m:FC_NsUri="http://www.example.com/dummy"/>
- <Property Name="CommonAttribute1" Nullable="true" Type="Edm.String" m:FC_KeepInContent="false" m:FC_TargetPath="commonElement/@commonAttribute1" m:FC_NsPrefix="pr" m:FC_NsUri="http://www.example.com/dummy"/>
- <Property Name="CommonAttribute2" Nullable="true" Type="Edm.String" m:FC_KeepInContent="false" m:FC_TargetPath="commonElement/@commonAttribute2" m:FC_NsPrefix="pr" m:FC_NsUri="http://www.example.com/dummy"/>
- <Property Name="Location" Nullable="false" Type="DataJS.Tests.Location" m:FC_KeepInContent_1="false" m:FC_SourcePath_1="Long" m:FC_TargetPath_1="long" m:FC_KeepInContent="false" m:FC_SourcePath="Lat" m:FC_TargetPath="lat" m:FC_NsPrefix="geo" m:FC_NsUri="http://www.georss.org/georss" m:FC_NsPrefix_1="geo" m:FC_NsUri_1="http://www.georss.org/georss"/>
- </EntityType>
- <ComplexType Name="Author" mcns:MyCustomAnnotation="">
- <Property Name="Email" Nullable="true" Type="Edm.String" mcns:MyCustomAnnotation=""/>
- <Property Name="Name" Nullable="true" Type="Edm.String"/>
- <Property Name="Uri" Nullable="true" Type="Edm.String"/>
- <Property Name="Contributor" Nullable="false" Type="DataJS.Tests.Contributor"/>
- </ComplexType>
- <ComplexType Name="Contributor">
- <Property Name="Email" Nullable="true" Type="Edm.String" mcns:MyCustomAnnotation=" "/>
- <Property Name="Name" Nullable="true" Type="Edm.String"/>
- <Property Name="Uri" Nullable="true" Type="Edm.String" mcns:MyCustomAnnotation="true"/>
- </ComplexType>
- <ComplexType Name="Location">
- <Property Name="Lat" Nullable="false" Type="Edm.Single" mcns:MyCustomAnnotation="27"/>
- <Property Name="Long" Nullable="false" Type="Edm.Single"/>
- </ComplexType>
- <EntityType Name="ReplicatedEntry">
- <Key>
- <PropertyRef Name="ID"/>
- </Key>
- <Property Name="ID" Nullable="false" Type="Edm.Int32"/>
- <Property Name="UnmappedField" Nullable="true" Type="Edm.String"/>
- <Property Name="Author" Nullable="false" Type="DataJS.Tests.Author2" m:FC_KeepInContent_5="true" m:FC_SourcePath_5="Contributor/Uri" m:FC_ContentKind_5="text" m:FC_TargetPath_5="SyndicationContributorUri" m:FC_KeepInContent_4="true" m:FC_SourcePath_4="Contributor/Name" m:FC_ContentKind_4="text" m:FC_TargetPath_4="SyndicationContributorName" m:FC_KeepInContent_3="true" m:FC_SourcePath_3="Contributor/Email" m:FC_ContentKind_3="text" m:FC_TargetPath_3="SyndicationContributorEmail" m:FC_KeepInContent_2="true" m:FC_SourcePath_2="Uri" m:FC_ContentKind_2="text" m:FC_TargetPath_2="SyndicationAuthorUri" m:FC_KeepInContent_1="true" m:FC_SourcePath_1="Name" m:FC_ContentKind_1="text" m:FC_TargetPath_1="SyndicationAuthorName" m:FC_KeepInContent="true" m:FC_SourcePath="Email" m:FC_ContentKind="text" m:FC_TargetPath="SyndicationAuthorEmail" mcns:MyCustomAnnotation="b>100/b>"/>
- <Property Name="Published" Nullable="true" Type="Edm.String" m:FC_KeepInContent="true" m:FC_ContentKind="text" m:FC_TargetPath="SyndicationPublished" mcns:MyCustomAnnotation=" . "/>
- <Property Name="Rights" Nullable="true" Type="Edm.String" m:FC_KeepInContent="true" m:FC_ContentKind="text" m:FC_TargetPath="SyndicationRights"/>
- <Property Name="Summary" Nullable="true" Type="Edm.String" m:FC_KeepInContent="true" m:FC_ContentKind="xhtml" m:FC_TargetPath="SyndicationSummary" mcns:MyCustomAnnotation="/Property"/>
- <Property Name="Title" Nullable="true" Type="Edm.String" m:FC_KeepInContent="true" m:FC_ContentKind="html" m:FC_TargetPath="SyndicationTitle"/>
- <Property Name="Updated" Nullable="true" Type="Edm.String" m:FC_KeepInContent="true" m:FC_ContentKind="text" m:FC_TargetPath="SyndicationUpdated"/>
- <Property Name="CustomElement" Nullable="true" Type="Edm.String" m:FC_KeepInContent="true" m:FC_TargetPath="customElement" m:FC_NsPrefix="pr" m:FC_NsUri="http://www.example.org/dummy"/>
- <Property Name="CustomAttribute" Nullable="true" Type="Edm.String" m:FC_KeepInContent="true" m:FC_TargetPath="customElement/@customAttribute" m:FC_NsPrefix="pr" m:FC_NsUri="http://www.example.org/dummy"/>
- <Property Name="NestedElement1" Nullable="true" Type="Edm.String" m:FC_KeepInContent="true" m:FC_TargetPath="commonElement/nestedElement1" m:FC_NsPrefix="pr" m:FC_NsUri="http://www.example.com/dummy"/>
- <Property Name="NestedElement2" Nullable="true" Type="Edm.String" m:FC_KeepInContent="true" m:FC_TargetPath="commonElement/nestedElement2" m:FC_NsPrefix="pr" m:FC_NsUri="http://www.example.com/dummy"/>
- <Property Name="CommonAttribute1" Nullable="true" Type="Edm.String" m:FC_KeepInContent="true" m:FC_TargetPath="commonElement/@commonAttribute1" m:FC_NsPrefix="pr" m:FC_NsUri="http://www.example.com/dummy"/>
- <Property Name="CommonAttribute2" Nullable="true" Type="Edm.String" m:FC_KeepInContent="true" m:FC_TargetPath="commonElement/@commonAttribute2" m:FC_NsPrefix="pr" m:FC_NsUri="http://www.example.com/dummy"/>
- <Property Name="Location" Nullable="false" Type="DataJS.Tests.Location2" m:FC_KeepInContent_1="true" m:FC_SourcePath_1="Long" m:FC_TargetPath_1="long" m:FC_KeepInContent="true" m:FC_SourcePath="Lat" m:FC_TargetPath="lat" m:FC_NsPrefix="geo" m:FC_NsUri="http://www.georss.org/georss" m:FC_NsPrefix_1="geo" m:FC_NsUri_1="http://www.georss.org/georss"/>
- </EntityType>
- <ComplexType Name="Author2">
- <Property Name="Email" Nullable="true" Type="Edm.String"/>
- <Property Name="Name" Nullable="true" Type="Edm.String"/>
- <Property Name="Uri" Nullable="true" Type="Edm.String"/>
- <Property Name="Contributor" Nullable="false" Type="DataJS.Tests.Contributor2"/>
- </ComplexType>
- <ComplexType Name="Contributor2">
- <Property Name="Email" Nullable="true" Type="Edm.String"/>
- <Property Name="Name" Nullable="true" Type="Edm.String"/>
- <Property Name="Uri" Nullable="true" Type="Edm.String"/>
- </ComplexType>
- <ComplexType Name="Location2">
- <Property Name="Lat" Nullable="false" Type="Edm.Single"/>
- <Property Name="Long" Nullable="false" Type="Edm.Single"/>
- </ComplexType>
- <EntityType Name="DerivedEntry" m:FC_KeepInContent="false" m:FC_SourcePath="MappedInDerivedField" m:FC_TargetPath="mappedField/@mappedInDerived" m:FC_NsPrefix="pre" m:FC_NsUri="http://www.example.com/dummy" BaseType="DataJS.Tests.BaseEntry">
- <Property Name="UnmappedConcreteField" Nullable="true" Type="Edm.String"/>
- <Property Name="MappedConcreteField" Nullable="true" Type="Edm.String" m:FC_KeepInContent="false" m:FC_TargetPath="mappedField/@mappedConcrete" m:FC_NsPrefix="pre" m:FC_NsUri="http://www.example.com/dummy"/>
- </EntityType>
- <EntityType Name="BaseEntry">
- <Key>
- <PropertyRef Name="ID"/>
- </Key>
- <Property Name="ID" Nullable="false" Type="Edm.Int32"/>
- <Property Name="UnmappedField" Nullable="true" Type="Edm.String"/>
- <Property Name="MappedInDerivedField" Nullable="true" Type="Edm.String" mcns:MyCustomAnnotation="false"/>
- <Property Name="MappedField" Nullable="true" Type="Edm.String" m:FC_KeepInContent="false" m:FC_TargetPath="mappedField" m:FC_NsPrefix="pre" m:FC_NsUri="http://www.example.com/dummy"/>
- </EntityType>
- <EntityContainer Name="EpmDataSource" m:IsDefaultEntityContainer="true" mcns:MyCustomAnnotation="0">
- <EntitySet Name="MappedEntries" EntityType="DataJS.Tests.MappedEntry"/>
- <EntitySet Name="ReplicatedEntries" EntityType="DataJS.Tests.ReplicatedEntry"/>
- <EntitySet Name="HierarchicalEntries" EntityType="DataJS.Tests.BaseEntry"/>
- <FunctionImport Name="ResetData" m:HttpMethod="POST" mcns:MyCustomAnnotation="null"/>
- </EntityContainer>
- <mcns:EmptyElement></mcns:EmptyElement>
- <mcns:ParentCustomElement mcns:MyCustomAnnotation="annotation" mcns:MySecondCustomAnnotation="annotation 2">
- <mcns:CustomChildElement1>Custom metadata 1.</mcns:CustomChildElement1>
- <mcns:CustomChildElement2>Custom metadata 2.</mcns:CustomChildElement2>
- </mcns:ParentCustomElement>
- </Schema>
- </edmx:DataServices>
-</edmx:Edmx>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/endpoints/CustomDataService.svc
----------------------------------------------------------------------
diff --git a/JSLib/tests/endpoints/CustomDataService.svc b/JSLib/tests/endpoints/CustomDataService.svc
deleted file mode 100644
index f30a261..0000000
--- a/JSLib/tests/endpoints/CustomDataService.svc
+++ /dev/null
@@ -1,76 +0,0 @@
-<%@ ServiceHost Language="C#" Debug="true" Factory="System.ServiceModel.Activation.WebServiceHostFactory"
- Service="DataJS.Tests.CustomDataService" %>
-
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
-// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-using System.Collections;
-using System.IO;
-
-namespace DataJS.Tests
-{
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.ServiceModel;
- using System.ServiceModel.Activation;
- using System.ServiceModel.Web;
-
- /// <summary>
- /// Custom data service that does not use OData
- /// </summary>
- [ServiceContract]
- [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
- [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
- public class CustomDataService
- {
- static readonly Item[] data = Enumerable.Range(0, 16).Select(i => new Item
- {
- ID = i,
- Name = "Item " + i
- }).ToArray();
-
- // This uses the same URI template as OData so that the CacheOracle can be reused
- [OperationContract]
- [WebGet(UriTemplate = "ReadRange?$skip={skip}&$top={top}")]
- public Stream ReadRange(int skip, int top)
- {
- IEnumerable selectData = data.Skip(skip).Take(top);
- Dictionary<string, object> result = new Dictionary<string, object>();
- List<Dictionary<string, string>> value = new List<Dictionary<string, string>>();
- foreach (Item d in selectData)
- {
- Dictionary<string, string> item = new Dictionary<string, string>();
- item.Add("ID", d.ID.ToString());
- item.Add("Name", d.Name);
- value.Add(item);
- }
-
- result.Add("value", value);
- return ReaderUtils.ConvertDictionarytoJsonlightStream(result);
- }
-
- [OperationContract]
- [WebGet(ResponseFormat = WebMessageFormat.Json)]
- public int Count()
- {
- return data.Count();
- }
- }
-
- public class Item
- {
- public int ID { get; set; }
- public string Name { get; set; }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/endpoints/EpmDataService.svc
----------------------------------------------------------------------
diff --git a/JSLib/tests/endpoints/EpmDataService.svc b/JSLib/tests/endpoints/EpmDataService.svc
deleted file mode 100644
index ba90c23..0000000
--- a/JSLib/tests/endpoints/EpmDataService.svc
+++ /dev/null
@@ -1,315 +0,0 @@
-<%@ ServiceHost Language="C#" Factory="Microsoft.OData.Service.DataServiceHostFactory, Microsoft.OData.Service, Version=6.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
- Service="DataJS.Tests.EpmDataService" %>
-
-namespace DataJS.Tests
-{
- using System;
- using System.Collections.Generic;
- using Microsoft.OData.Service;
- using Microsoft.OData.Service.Common;
- using System.Linq;
- using System.ServiceModel.Web;
-
- /// <summary>
- /// A data service that uses EPM
- /// </summary>
- [System.ServiceModel.ServiceBehavior(IncludeExceptionDetailInFaults = true)]
- public class EpmDataService : DataService<EpmDataSource>
- {
- // This method is called only once to initialize service-wide policies.
- public static void InitializeService(DataServiceConfiguration config)
- {
- config.SetEntitySetAccessRule("*", EntitySetRights.All);
- config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
- config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V4;
- config.UseVerboseErrors = true;
-
- }
-
- [WebInvoke]
- public void ResetData()
- {
- this.CurrentDataSource.ResetData();
- }
- }
-
- public class EpmDataSource : ReflectionDataContext, IUpdatable
- {
- private static bool dataInitialized;
-
- public IQueryable<MappedEntry> MappedEntries
- {
- get { return this.GetResourceSetEntities<MappedEntry>("MappedEntries").AsQueryable(); }
- }
-
- public IQueryable<ReplicatedEntry> ReplicatedEntries
- {
- get { return this.GetResourceSetEntities<ReplicatedEntry>("ReplicatedEntries").AsQueryable(); }
- }
-
- public IQueryable<BaseEntry> HierarchicalEntries
- {
- get { return this.GetResourceSetEntities<BaseEntry>("HierarchicalEntries").AsQueryable(); }
- }
-
- public void ResetData()
- {
- this.ClearData();
-
- MappedEntry[] mappedEntries = new MappedEntry[]
- {
- new MappedEntry
- {
- ID = 0,
- UnmappedField = "Unmapped0",
- Author = new Author
- {
- Email = "AuthorEmail0",
- Name = "AuthorName0",
- Uri = "http://www.example.com/AuthorUri",
- Contributor = new Contributor
- {
- Email = "ContributorEmail0",
- Name = "ContributorName0",
- Uri = "http://www.example.com/ContributorUri",
- },
- },
- Published = "2000-01-01T00:00:00-08:00",
- Rights = "Rights0",
- Summary = "<xmlElement xmlns=\"http://www.example.org/dummy\" attr=\"value0\">Summary0</xmlElement>",
- Title = "Title<b>0</b>",
- Updated = "2000-01-01T00:00:00-08:00",
- CustomElement = "CustomElement0",
- CustomAttribute = "CustomAttribute0",
- NestedElement1 = "NestedElement1_0",
- NestedElement2 = "NestedElement2_0",
- CommonAttribute1 = "CommonAttribute1_0",
- CommonAttribute2 = "CommonAttribute2_0",
- Location = new Location
- {
- Lat = 3.14f,
- Long = 2.72f
- }
- },
-
- new MappedEntry
- {
- ID = 1,
- UnmappedField = null,
- Author = new Author
- {
- Email = null,
- Name = string.Empty,
- Uri = "http://www.example.com/AuthorUri1",
- Contributor = new Contributor
- {
- Email = null,
- Name = string.Empty,
- Uri = "http://www.example.com/ContributorUri1",
- },
- },
- Published = "2000-01-01T00:00:00-08:00",
- Rights = null,
- Summary = "",
- Title = "Title<i>1</i>",
- Updated = "2111-01-01T00:00:00-08:00",
- CustomElement = null,
- NestedElement1 = string.Empty,
- NestedElement2 = "NestedElement2_1",
- CustomAttribute = null,
- CommonAttribute1 = string.Empty,
- CommonAttribute2 = "CommonAttribute2_1",
- Location = new Location
- {
- Lat = float.MaxValue,
- Long = float.MinValue
- }
- },
-
- new MappedEntry
- {
- ID = 2,
- UnmappedField = "Unmapped2",
- Author = new Author
- {
- Email = "AuthorEmail2",
- Name = "AuthorName2",
- Uri = "http://www.example.com/AuthorUri2",
- Contributor = null
- },
- Published = "2000-01-01T00:00:00-08:00",
- Rights = "Rights2",
- Summary = "Summary2",
- Title = "Title2",
- Updated = "2000-01-01T00:00:00-08:00",
- CustomElement = "CustomElement2",
- CustomAttribute = "CustomAttribute2",
- NestedElement1 = "NestedElement1_2",
- NestedElement2 = "NestedElement2_2",
- CommonAttribute1 = "CommonAttribute1_2",
- CommonAttribute2 = "CommonAttribute2_2",
- Location = null
- },
- };
- Array.ForEach(mappedEntries, (item) => this.GetResourceSetEntities<MappedEntry>("MappedEntries").Add(item));
-
- Array.ForEach(mappedEntries, (item) => this.GetResourceSetEntities<ReplicatedEntry>("ReplicatedEntries").Add(new ReplicatedEntry
- {
- ID = item.ID,
- UnmappedField = item.UnmappedField,
- Author = item.Author == null ? null : new Author2
- {
- Email = item.Author.Email,
- Name = item.Author.Name,
- Uri = item.Author.Uri,
- Contributor = item.Author.Contributor == null ? null : new Contributor2
- {
- Name = item.Author.Contributor.Name,
- Email = item.Author.Contributor.Email,
- Uri = item.Author.Contributor.Uri
- },
- },
- Published = item.Published,
- Rights = item.Rights,
- Summary = item.Summary,
- Title = item.Title,
- Updated = item.Updated,
- CustomElement = item.CustomElement,
- CustomAttribute = item.CustomAttribute,
- NestedElement1 = item.NestedElement1,
- NestedElement2 = item.NestedElement2,
- CommonAttribute1 = item.CommonAttribute1,
- CommonAttribute2 = item.CommonAttribute2,
- Location = item.Location == null ? null : new Location2
- {
- Lat = item.Location.Lat,
- Long = item.Location.Long
- }
- }));
-
- BaseEntry[] hierarchicalEntries = new BaseEntry[]
- {
- new BaseEntry
- {
- ID = 0,
- MappedField = "MappedField0",
- MappedInDerivedField = "MappedInDerivedField0",
- UnmappedField = "UnmappedField0"
- },
- new DerivedEntry
- {
- ID = 1,
- MappedField = "MappedField1",
- MappedInDerivedField = "MappedInDerivedField1",
- UnmappedField = "UnmappedField1",
- MappedConcreteField = "MappedConcreteField1",
- UnmappedConcreteField = "UnmappedConcreteField1"
- },
- };
- Array.ForEach(hierarchicalEntries, (item) => this.GetResourceSetEntities<BaseEntry>("HierarchicalEntries").Add(item));
- }
-
- protected override void EnsureDataIsInitialized()
- {
- if (!dataInitialized)
- {
- this.ResetData();
- dataInitialized = true;
- }
- }
- }
-
- public class Author
- {
- public string Email { get; set; }
- public string Name { get; set; }
- public string Uri { get; set; }
- public Contributor Contributor { get; set; }
- }
-
- public class Contributor
- {
- public string Email { get; set; }
- public string Name { get; set; }
- public string Uri { get; set; }
- }
-
- public class Location
- {
- public float Lat { get; set; }
- public float Long { get; set; }
- }
-
- public class Author2
- {
- public string Email { get; set; }
- public string Name { get; set; }
- public string Uri { get; set; }
- public Contributor2 Contributor { get; set; }
- }
-
- public class Contributor2
- {
- public string Email { get; set; }
- public string Name { get; set; }
- public string Uri { get; set; }
- }
-
- public class Location2
- {
- public float Lat { get; set; }
- public float Long { get; set; }
- }
-
- public class MappedEntry
- {
- public int ID { get; set; }
- public string UnmappedField { get; set; }
- public Author Author { get; set; }
- public string Published { get; set; }
- public string Rights { get; set; }
- public string Summary { get; set; }
- public string Title { get; set; }
- public string Updated { get; set; }
- public string CustomElement { get; set; }
- public string CustomAttribute { get; set; }
- public string NestedElement1 { get; set; }
- public string NestedElement2 { get; set; }
- public string CommonAttribute1 { get; set; }
- public string CommonAttribute2 { get; set; }
- public Location Location { get; set; }
- }
-
- public class ReplicatedEntry
- {
- public int ID { get; set; }
- public string UnmappedField { get; set; }
- public Author2 Author { get; set; }
- public string Published { get; set; }
- public string Rights { get; set; }
- public string Summary { get; set; }
- public string Title { get; set; }
- public string Updated { get; set; }
- public string CustomElement { get; set; }
- public string CustomAttribute { get; set; }
- public string NestedElement1 { get; set; }
- public string NestedElement2 { get; set; }
- public string CommonAttribute1 { get; set; }
- public string CommonAttribute2 { get; set; }
- public Location2 Location { get; set; }
- }
-
- public class BaseEntry
- {
- public int ID { get; set; }
- public string UnmappedField { get; set; }
- public string MappedInDerivedField { get; set; }
- public string MappedField { get; set; }
- }
-
- public class DerivedEntry : BaseEntry
- {
- public string UnmappedConcreteField { get; set; }
- public string MappedConcreteField { get; set; }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/endpoints/ErrorDataService.svc
----------------------------------------------------------------------
diff --git a/JSLib/tests/endpoints/ErrorDataService.svc b/JSLib/tests/endpoints/ErrorDataService.svc
deleted file mode 100644
index d25e30e..0000000
--- a/JSLib/tests/endpoints/ErrorDataService.svc
+++ /dev/null
@@ -1,56 +0,0 @@
-<%@ ServiceHost Language="C#" Factory="Microsoft.OData.Service.DataServiceHostFactory, Microsoft.OData.Service, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
- Service="DataJS.Tests.ErrorDataService" %>
-
-namespace DataJS.Tests
-{
- using System;
- using System.Collections.Generic;
- using Microsoft.OData.Service;
- using Microsoft.OData.Service.Common;
- using System.Linq;
-
- /// <summary>
- /// A data service that contains in-stream errors
- /// </summary>
- public class ErrorDataService : DataService<ErrorDataSource>
- {
- // This method is called only once to initialize service-wide policies.
- public static void InitializeService(DataServiceConfiguration config)
- {
- config.SetEntitySetAccessRule("*", EntitySetRights.All);
- config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V4;
- }
- }
-
- public class ErrorDataSource
- {
- public IQueryable<ErrorType> Entities
- {
- get
- {
- ErrorType[] entities = new ErrorType[]
- {
- new ErrorType(() => 0),
- new ErrorType(() => { throw new ApplicationException(); })
- };
-
- return entities.AsQueryable();
- }
- }
- }
-
- public class ErrorType
- {
- Func<int> generateID;
-
- public ErrorType(Func<int> generateID)
- {
- this.generateID = generateID;
- }
-
- public int ID
- {
- get { return this.generateID(); }
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/endpoints/FoodStoreDataServiceV4.svc
----------------------------------------------------------------------
diff --git a/JSLib/tests/endpoints/FoodStoreDataServiceV4.svc b/JSLib/tests/endpoints/FoodStoreDataServiceV4.svc
deleted file mode 100644
index 21f09cf..0000000
--- a/JSLib/tests/endpoints/FoodStoreDataServiceV4.svc
+++ /dev/null
@@ -1,589 +0,0 @@
-<%@ ServiceHost Language="C#" Factory="Microsoft.OData.Service.DataServiceHostFactory, Microsoft.OData.Service, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
- Service="DataJS.Tests.V4.FoodStoreDataService" %>
-
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
-// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-namespace DataJS.Tests.V4
-{
- using System;
- using System.Collections.Generic;
- using Microsoft.OData.Service;
- using Microsoft.OData.Service.Common;
- using Microsoft.OData.Service.Providers;
- using System.Linq;
- using System.ServiceModel.Web;
- using System.Web;
- using System.IO;
- using Microsoft.Spatial;
-
- /// <summary>
- /// Provides a service similar to FoodStoreDataService, but uses V4 and WCF Data Services 6.0.0-beta1
- /// features.
- /// </summary>
- [System.ServiceModel.ServiceBehavior(IncludeExceptionDetailInFaults = true)]
- public class FoodStoreDataService : DataService<FoodContainer>
- {
- // This method is called only once to initialize service-wide policies.
- public static void InitializeService(DataServiceConfiguration config)
- {
- config.SetEntitySetAccessRule("*", EntitySetRights.All);
- config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
- config.UseVerboseErrors = true;
- // Set Foods page size to 5 for cache testing
- config.SetEntitySetPageSize("Foods", 5);
- // Make the Categories set paged to have a paged feed
- config.SetEntitySetPageSize("Categories", 1);
- }
-
- [WebInvoke]
- public string ResetData()
- {
- this.CurrentDataSource.ResetData();
- return "Data Reset";
- }
-
- [WebGet]
- public IQueryable<string> FoodsAvailable()
- {
- return this.CurrentDataSource.Foods.Select(food => food.Name);
- }
-
- [WebGet]
- public IQueryable<Package> PackagingTypes()
- {
- return this.CurrentDataSource.Foods.Select(food => food.Packaging);
- }
-
- [WebGet]
- public string UserNameAndPassword()
- {
- var request = WebOperationContext.Current.IncomingRequest;
- string authorization = request.Headers["Authorization"];
- if (String.IsNullOrEmpty(authorization))
- {
- WebOperationContext.Current.OutgoingResponse.Headers["WWW-Authenticate"] = "Basic realm=\"localhost\"";
- throw new DataServiceException(401, "Access denied in UserNameAndPassword");
- }
-
- return authorization;
- }
- }
-
- public class FoodContainer : ReflectionDataContext, IUpdatable, IDataServiceStreamProvider2
- {
- private static bool dataInitialized;
-
- public IQueryable<Category> Categories
- {
- get { return this.GetResourceSetEntities<Category>("Categories").AsQueryable(); }
- }
-
- public IQueryable<Food> Foods
- {
- get { return this.GetResourceSetEntities<Food>("Foods").AsQueryable(); }
- }
-
- public void ResetData()
- {
- this.ClearData();
-
- var builder = SpatialImplementation.CurrentImplementation.CreateBuilder();
- builder.GeometryPipeline.SetCoordinateSystem(CoordinateSystem.DefaultGeography);
- builder.GeometryPipeline.BeginGeometry(SpatialType.Collection);
- builder.GeometryPipeline.BeginFigure(new GeometryPosition(5.0, 5.0));
- builder.GeometryPipeline.EndFigure();
- builder.GeometryPipeline.EndGeometry();
-
- int i = 0;
- Category[] categories = new Category[]
- {
- new Category { CategoryID = i++, Name = "Baking Supplies" },
- new Category { CategoryID = i++, Name = "Condiments" },
- new Category { CategoryID = i++, Name = "Empty Category" }
- };
- Array.ForEach(categories, (category) => this.GetResourceSetEntities<Category>("Categories").Add(category));
-
- i = 0;
- Food[] foods = new Food[]
- {
- new Food()
- {
- FoodID = i++,
- Name = "flour",
- UnitPrice = .19999,
- ServingSize = 1,
- MeasurementUnit = "Cup",
- ProteinGrams = 3,
- FatGrams = 1,
- CarbohydrateGrams = 20,
- CaloriesPerServing = 140,
- IsAvailable = true,
- ExpirationDate = new DateTime(2010, 12, 25, 12, 0, 0),
- ItemGUID = new Guid("27272727272727272727272727272727"),
- Weight = 10f,
- AvailableUnits = 1,
-
- Packaging = new Package(){
- Type = null,
- Color = String.Empty,
- NumberPerPackage = int.MaxValue,
- RequiresRefridgeration = false,
- PackageDimensions = new Dimensions()
- {
- Length = Decimal.MaxValue,
- Height = Int16.MaxValue,
- Width = Int64.MaxValue,
- Volume = double.MaxValue,
- },
- ShipDate = new DateTime(2000, 12, 29)
- },
-
- CookedSize = new CookedDimensions()
- {
- Height = 1,
- Length = 2,
- Width = 3,
- Volume = 1 * 2 * 3
- },
-
- Category = categories[0],
-
- AlternativeNames = new List<string>() {"ground cereal", "ground grain"},
-
- Providers = new List<Provider> {
- new Provider() {
- Name= "Flour Provider",
- Aliases = new List<string>() {"fp1", "flour provider1"},
- Details = new ProviderDetails() {
- Telephone= "555-555-555",
- PreferredCode = 1001
- }
- },
- new Provider() {
- Name= "Ground Grains",
- Aliases = new List<string>()
- }
- },
-
- SpatialData = (GeometryCollection)builder.ConstructedGeometry
- },
-
- new Food()
- {
- FoodID = i++,
- Name = "sugar",
- UnitPrice = .2,
- ServingSize = 1,
- MeasurementUnit = "tsp",
- ProteinGrams = 0,
- FatGrams = 0,
- CarbohydrateGrams = 4,
- CaloriesPerServing = 16,
- IsAvailable = false,
- ExpirationDate = new DateTime(2011, 12, 28),
- ItemGUID = new Guid("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"),
- Weight = 0.1f,
- AvailableUnits = 0,
-
- Packaging = new Package(){
- Type = " ",
- Color = "BLUE",
- NumberPerPackage = int.MinValue,
- RequiresRefridgeration = true,
- PackageDimensions = new Dimensions(){
- Length = Decimal.MinValue,
- Height = Int16.MinValue,
- Width = Int64.MinValue,
- Volume = double.MinValue,
- },
- ShipDate = new DateTime(2000, 12, 29),
- },
-
- Category = categories[1],
- },
-
- new Food()
- {
- FoodID = i++,
- Name = "1 Chicken Egg",
- UnitPrice = 0.55,
- MeasurementUnit = null,
- ServingSize = 1,
- ProteinGrams = 6,
- FatGrams = 1,
- CarbohydrateGrams = 1,
- CaloriesPerServing = 70,
- IsAvailable = true,
- ExpirationDate = new DateTime(2000, 12, 29),
- ItemGUID = new Guid("00000000000000000000000000000000"),
- Weight = 0,
- AvailableUnits = -128,
-
- Packaging = new Package(){
- Type = "18 - Carton",
- Color = " brown ",
- NumberPerPackage = 0,
- RequiresRefridgeration = true,
- PackageDimensions = null,
- ShipDate = new DateTime(2000, 12, 29),
- },
-
- Category = null,
- },
-
- new Food()
- {
- FoodID = i++,
- Name = "Brown Sugar",
- UnitPrice = 1.6,
- ServingSize = 1,
- MeasurementUnit = "TSP.",
- ProteinGrams = 0,
- FatGrams = 0,
- CarbohydrateGrams = 5,
- CaloriesPerServing = 16,
- IsAvailable = true,
- ExpirationDate = new DateTime(2011, 12, 28),
- ItemGUID = new Guid("0123456789abcdef0123456789abcdef"),
- Weight = 4.5f,
- AvailableUnits = 127,
- Packaging = null,
- Category = categories[1],
- },
-
- new PreparedFood()
- {
- FoodID = i++,
- Name = "Cobb Salad",
- UnitPrice = 1.99,
- ServingSize = -1,
- MeasurementUnit = "cups",
- ProteinGrams = 6,
- FatGrams = 1,
- CarbohydrateGrams = 3,
- CaloriesPerServing = 5,
- IsAvailable = true,
- ExpirationDate = new DateTime(2000, 12, 29),
- ItemGUID = new Guid("0123456789abcdef0123456789abcdef"),
- Weight = 5.674f,
- AvailableUnits = 127,
- Packaging = null,
- Category = categories[1],
- Instructions = "1.) Open 2.) Eat",
- NumberOfIngredients = 4,
- },
-
- new PreparedFood()
- {
- FoodID = i++,
- Name = "Lasagna",
- UnitPrice = 0,
- ServingSize = 8,
- MeasurementUnit = " servings",
- ProteinGrams = 100,
- FatGrams = 4,
- CarbohydrateGrams = 27,
- CaloriesPerServing = 389,
- IsAvailable = true,
- ExpirationDate = new DateTime(1904, 2, 29),
- ItemGUID = new Guid("0123456789abcdef0123456789abcdef"),
- Weight = 0,
- AvailableUnits = 4,
- Packaging = new Package(){
- Type = "box",
- Color = " 1 ",
- NumberPerPackage = 1,
- RequiresRefridgeration = true,
- PackageDimensions = new Dimensions(){
- Length = 3,
- Height = 1,
- Width = 5,
- Volume = 1.5,
- },
- ShipDate = new DateTime(2000, 12, 29),
- },
- Category = categories[0],
- Instructions = "Bake in oven",
- NumberOfIngredients = 15,
- },
-
- new Food()
- {
- FoodID = i++,
- Name = "Chocolate"
- },
-
- new Food()
- {
- FoodID = i++,
- Name = "Pizza"
- },
-
- new Food()
- {
- FoodID = i++,
- Name = "Avocados"
- },
-
- new Food()
- {
- FoodID = i++,
- Name = "Quinoa"
- },
-
- new Food()
- {
- FoodID = i++,
- Name = "Oatmeal"
- },
-
- new Food()
- {
- FoodID = i++,
- Name = "Peanut Butter"
- },
-
- new Food()
- {
- FoodID = i++,
- Name = "Banana"
- },
-
- new Food()
- {
- FoodID = i++,
- Name = "Yam"
- },
-
- new Food()
- {
- FoodID = i++,
- Name = "Clam"
- },
-
- new Food()
- {
- FoodID = i++,
- Name = "Spam"
- }
- };
- Array.ForEach(foods, (food) => this.GetResourceSetEntities<Food>("Foods").Add(food));
-
- categories[0].Foods.Add(foods[0]);
- categories[1].Foods.Add(foods[2]);
- categories[1].Foods.Add(foods[3]);
- }
-
- protected override void EnsureDataIsInitialized()
- {
- if (!dataInitialized)
- {
- this.ResetData();
- dataInitialized = true;
- }
- }
-
- public Stream GetReadStream(object entity, ResourceProperty streamProperty, string etag, bool? checkETagForEquality, DataServiceOperationContext operationContext)
- {
- return new MemoryStream();
- }
-
- public Uri GetReadStreamUri(object entity, ResourceProperty streamProperty, DataServiceOperationContext operationContext)
- {
- if (streamProperty.Name == "Icon")
- {
- return null;
- }
- return new Uri(operationContext.AbsoluteServiceUri, streamProperty.Name);
- }
-
- public string GetStreamContentType(object entity, ResourceProperty streamProperty, DataServiceOperationContext operationContext)
- {
- if (streamProperty.Name == "Icon")
- {
- return "image/gif";
- }
- return "image/png";
- }
-
- public string GetStreamETag(object entity, ResourceProperty streamProperty, DataServiceOperationContext operationContext)
- {
- return "W/\"123456789\"";
- }
-
- public Stream GetWriteStream(object entity, ResourceProperty streamProperty, string etag, bool? checkETagForEquality, DataServiceOperationContext operationContext)
- {
- return new MemoryStream();
- }
-
- public void DeleteStream(object entity, DataServiceOperationContext operationContext)
- {
- // do nothing.
- }
-
- public Stream GetReadStream(object entity, string etag, bool? checkETagForEquality, DataServiceOperationContext operationContext)
- {
- throw new NotImplementedException();
- }
-
- public Uri GetReadStreamUri(object entity, DataServiceOperationContext operationContext)
- {
- throw new NotImplementedException();
- }
-
- public string GetStreamContentType(object entity, DataServiceOperationContext operationContext)
- {
- throw new NotImplementedException();
- }
-
- public string GetStreamETag(object entity, DataServiceOperationContext operationContext)
- {
- throw new NotImplementedException();
- }
-
- public Stream GetWriteStream(object entity, string etag, bool? checkETagForEquality, DataServiceOperationContext operationContext)
- {
- throw new NotImplementedException();
- }
-
- public string ResolveType(string entitySetName, DataServiceOperationContext operationContext)
- {
- throw new NotImplementedException();
- }
-
- public int StreamBufferSize
- {
- get { return 1024; }
- }
- }
-
- /// <summary>
- /// The Category class is a simple class with V1-compatible feed customizations.
- /// </summary>
- [DataServiceKey("CategoryID")]
- [EntitySet("Categories")]
- [NamedStream("Icon")]
- public class Category
- {
- public Category()
- {
- this.Foods = new List<Food>();
- }
-
- public int CategoryID { get; set; }
- public string Name { get; set; }
- public List<Food> Foods { get; set; }
- }
-
- /// <summary>
- /// The Food class has a mixture of V1-compatible and incompatible feed
- /// customizations (thus it's V2), and custom mappings.
- /// </summary>
- [DataServiceKey("FoodID")]
- [EntitySet("Foods")]
- [NamedStream("Picture")]
- public class Food
- {
- private List<string> alternativeNames = new List<string>();
- private List<Provider> providers = new List<Provider>();
-
- // Primitive types
- public int FoodID { get; set; }
- public string Name { get; set; }
- public double UnitPrice { get; set; }
- public Decimal ServingSize { get; set; }
- public string MeasurementUnit { get; set; }
- public Byte ProteinGrams { get; set; }
- public Int16 FatGrams { get; set; }
- public Int32 CarbohydrateGrams { get; set; }
- public Int64 CaloriesPerServing { get; set; }
- public Boolean IsAvailable { get; set; }
- public DateTime ExpirationDate { get; set; }
- public Guid ItemGUID { get; set; }
- public Single Weight { get; set; }
- public sbyte AvailableUnits { get; set; }
-
- // Complex types
- public Package Packaging { get; set; }
- public CookedDimensions CookedSize { get; set; }
-
- // Navigation properties
- public Category Category { get; set; }
-
- // Collection properties
- public List<string> AlternativeNames
- {
- get { return alternativeNames; }
- set { alternativeNames = value; }
- }
-
- public List<Provider> Providers
- {
- get { return providers; }
- set { providers = value; }
- }
-
- public GeometryCollection SpatialData
- {
- get;
- set;
- }
-
- }
-
- public class Provider
- {
- public string Name { get; set; }
- public List<string> Aliases { get; set; }
- public ProviderDetails Details { get; set; }
- }
-
- public class ProviderDetails
- {
- public string Telephone { get; set; }
- public int PreferredCode { get; set; }
- }
-
- public class Package
- {
- public string Type { get; set; }
- public string Color { get; set; }
- public int NumberPerPackage { get; set; }
- public Boolean RequiresRefridgeration { get; set; }
- public DateTime ShipDate { get; set; }
- public Dimensions PackageDimensions { get; set; }
- }
-
- public class Dimensions
- {
- public Decimal Length { get; set; }
- public Int16 Height { get; set; }
- public Int64 Width { get; set; }
- public double Volume { get; set; }
- }
-
- public class CookedDimensions
- {
- public Decimal Length { get; set; }
- public Int16 Height { get; set; }
- public Int64 Width { get; set; }
- public double Volume { get; set; }
- }
-
- public class PreparedFood : Food
- {
- public string Instructions { get; set; }
- public float NumberOfIngredients { get; set; }
- }
-}
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/endpoints/LargeCollectionService.svc
----------------------------------------------------------------------
diff --git a/JSLib/tests/endpoints/LargeCollectionService.svc b/JSLib/tests/endpoints/LargeCollectionService.svc
deleted file mode 100644
index 122d045..0000000
--- a/JSLib/tests/endpoints/LargeCollectionService.svc
+++ /dev/null
@@ -1,93 +0,0 @@
-<%@ ServiceHost Language="C#" Factory="Microsoft.OData.Service.DataServiceHostFactory, Microsoft.OData.Service, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
- Service="DataJS.Tests.LargeCollectionService" %>
-
-namespace DataJS.Tests
-{
- using System;
- using System.Collections.Generic;
- using Microsoft.OData.Service;
- using Microsoft.OData.Service.Common;
- using System.Linq;
- using System.ServiceModel;
- using System.ServiceModel.Web;
- using System.Web;
-
- [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
- public class LargeCollectionService : DataService<LargeCollection>
- {
- // This method is called only once to initialize service-wide policies.
- public static void InitializeService(DataServiceConfiguration config)
- {
- config.SetEntitySetAccessRule("*", EntitySetRights.All);
- config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
- config.UseVerboseErrors = true;
- }
-
- [WebInvoke]
- public void ResetData()
- {
- this.CurrentDataSource.ResetData();
- }
- }
-
- public class LargeCollection : ReflectionDataContext, IUpdatable
- {
- private static bool dataInitialized;
-
- public IQueryable<Customer> Customers
- {
- get { return this.GetResourceSetEntities<Customer>("Customers").AsQueryable(); }
- }
-
- public IQueryable<Supplier> Suppliers
- {
- get { return this.GetResourceSetEntities<Supplier>("Suppliers").AsQueryable(); }
- }
-
- public void ResetData()
- {
- this.ClearData();
-
- IList<Customer> customers = this.GetResourceSetEntities<Customer>("Customers");
- foreach (int i in Enumerable.Range(1, 2 * 1024 * 1024))
- {
- customers.Add(new Customer()
- {
- ID = i,
- Name = "Customer " + i
- });
- }
-
- IList<Supplier> suppliers = this.GetResourceSetEntities<Supplier>("Suppliers");
- foreach (int i in Enumerable.Range(1, 5000))
- {
- suppliers.Add(new Supplier()
- {
- ID = i,
- Name = "Supplier " + i
- });
- }
- }
-
- protected override void EnsureDataIsInitialized()
- {
- if (!dataInitialized)
- {
- this.ResetData();
- dataInitialized = true;
- }
- }
- }
-
- public class Customer
- {
- public int ID { get; set; }
- public string Name { get; set; }
- }
-
- public class Supplier
- {
- public int ID { get; set; }
- public string Name { get; set; }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/endpoints/web.config
----------------------------------------------------------------------
diff --git a/JSLib/tests/endpoints/web.config b/JSLib/tests/endpoints/web.config
deleted file mode 100644
index 5836287..0000000
--- a/JSLib/tests/endpoints/web.config
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version='1.0'?>
-<configuration>
- <system.web>
- <compilation debug='true'>
- <assemblies>
- <add assembly='System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089'/>
- <add assembly='System.Data.DataSetExtensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089'/>
- <add assembly='System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35'/>
- <add assembly='System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089'/>
- <add assembly='System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089'/>
- <add assembly='System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089'/>
- <add assembly='System.ServiceModel.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35'/>
- <add assembly="Microsoft.OData.Core, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
- <add assembly="Microsoft.OData.Service, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
- <add assembly="Microsoft.OData.Client, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
- </assemblies>
- </compilation>
- </system.web>
- <system.codedom>
- <compilers>
- <compiler language='c#;cs;csharp' extension='.cs' type='Microsoft.CSharp.CSharpCodeProvider,System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'>
- <providerOption name='CompilerVersion' value='v4.0' />
- </compiler>
- </compilers>
- </system.codedom>
-</configuration>
[16/22] olingo-odata4-js git commit: [OLINGO-442] Cleanup bevor
release
Posted by ko...@apache.org.
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/src/odata-xml.js
----------------------------------------------------------------------
diff --git a/JSLib/src/odata-xml.js b/JSLib/src/odata-xml.js
deleted file mode 100644
index da050bd..0000000
--- a/JSLib/src/odata-xml.js
+++ /dev/null
@@ -1,837 +0,0 @@
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
-// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// odata-xml.js
-
-(function (window, undefined) {
-
- var datajs = window.odatajs || {};
- var odata = window.OData || {};
-
- // Imports.
-
- var djsassert = odatajs.djsassert;
- var http = odatajs.http;
- var isArray = odatajs.isArray;
- var isDate = odatajs.isDate;
- var isObject = odatajs.isObject;
- var normalizeURI = odatajs.normalizeURI;
- var parseInt10 = odatajs.parseInt10;
- var xmlAppendChild = odatajs.xmlAppendChild;
- var xmlAppendChildren = odatajs.xmlAppendChildren;
- var xmlAttributes = odatajs.xmlAttributes;
- var xmlBaseURI = odatajs.xmlBaseURI;
- var xmlChildElements = odatajs.xmlChildElements;
- var xmlDom = odatajs.xmlDom;
- var xmlFirstChildElement = odatajs.xmlFirstChildElement;
- var xmlInnerText = odatajs.xmlInnerText;
- var xmlLocalName = odatajs.xmlLocalName;
- var xmlNamespaceURI = odatajs.xmlNamespaceURI;
- var xmlNewAttribute = odatajs.xmlNewAttribute;
- var xmlNewElement = odatajs.xmlNewElement;
- var xmlNodeValue = odatajs.xmlNodeValue;
- var xmlNS = odatajs.xmlNS;
- var xmlnsNS = odatajs.xmlnsNS;
- var xmlParse = odatajs.xmlParse;
- var xmlQualifiedName = odatajs.xmlQualifiedName;
- var xmlSerialize = odatajs.xmlSerialize;
- var xmlSiblingElement = odatajs.xmlSiblingElement;
- var w3org = odatajs.w3org;
-
- var dataItemTypeName = odata.dataItemTypeName;
- var EDM_BINARY = odata.EDM_BINARY;
- var EDM_BOOLEAN = odata.EDM_BOOLEAN;
- var EDM_BYTE = odata.EDM_BYTE;
- var EDM_DATETIME = odata.EDM_DATETIME;
- var EDM_DATETIMEOFFSET = odata.EDM_DATETIMEOFFSET;
- var EDM_DECIMAL = odata.EDM_DECIMAL;
- var EDM_DOUBLE = odata.EDM_DOUBLE;
- var EDM_GEOGRAPHY = odata.EDM_GEOGRAPHY;
- var EDM_GEOGRAPHY_POINT = odata.EDM_GEOGRAPHY_POINT;
- var EDM_GEOGRAPHY_LINESTRING = odata.EDM_GEOGRAPHY_LINESTRING;
- var EDM_GEOGRAPHY_POLYGON = odata.EDM_GEOGRAPHY_POLYGON;
- var EDM_GEOGRAPHY_COLLECTION = odata.EDM_GEOGRAPHY_COLLECTION;
- var EDM_GEOGRAPHY_MULTIPOLYGON = odata.EDM_GEOGRAPHY_MULTIPOLYGON;
- var EDM_GEOGRAPHY_MULTILINESTRING = odata.EDM_GEOGRAPHY_MULTILINESTRING;
- var EDM_GEOGRAPHY_MULTIPOINT = odata.EDM_GEOGRAPHY_MULTIPOINT;
- var EDM_GEOMETRY = odata.EDM_GEOMETRY;
- var EDM_GEOMETRY_POINT = odata.EDM_GEOMETRY_POINT;
- var EDM_GEOMETRY_LINESTRING = odata.EDM_GEOMETRY_LINESTRING;
- var EDM_GEOMETRY_POLYGON = odata.EDM_GEOMETRY_POLYGON;
- var EDM_GEOMETRY_COLLECTION = odata.EDM_GEOMETRY_COLLECTION;
- var EDM_GEOMETRY_MULTIPOLYGON = odata.EDM_GEOMETRY_MULTIPOLYGON;
- var EDM_GEOMETRY_MULTILINESTRING = odata.EDM_GEOMETRY_MULTILINESTRING;
- var EDM_GEOMETRY_MULTIPOINT = odata.EDM_GEOMETRY_MULTIPOINT;
- var EDM_GUID = odata.EDM_GUID;
- var EDM_INT16 = odata.EDM_INT16;
- var EDM_INT32 = odata.EDM_INT32;
- var EDM_INT64 = odata.EDM_INT64;
- var EDM_SBYTE = odata.EDM_SBYTE;
- var EDM_SINGLE = odata.EDM_SINGLE;
- var EDM_STRING = odata.EDM_STRING;
- var EDM_TIME = odata.EDM_TIME;
- var GEOJSON_POINT = odata.GEOJSON_POINT;
- var GEOJSON_LINESTRING = odata.GEOJSON_LINESTRING;
- var GEOJSON_POLYGON = odata.GEOJSON_POLYGON;
- var GEOJSON_MULTIPOINT = odata.GEOJSON_MULTIPOINT;
- var GEOJSON_MULTILINESTRING = odata.GEOJSON_MULTILINESTRING;
- var GEOJSON_MULTIPOLYGON = odata.GEOJSON_MULTIPOLYGON;
- var GEOJSON_GEOMETRYCOLLECTION = odata.GEOJSON_GEOMETRYCOLLECTION;
- var formatDateTimeOffset = odata.formatDateTimeOffset;
- var formatDuration = odata.formatDuration;
- var getCollectionType = odata.getCollectionType;
- var gmlNewODataSpatialValue = odata.gmlNewODataSpatialValue;
- var gmlReadODataSpatialValue = odata.gmlReadODataSpatialValue;
- var gmlXmlNs = odata.gmlXmlNs;
- var handler = odata.handler;
- var isCollection = odata.isCollection;
- var isCollectionType = odata.isCollectionType;
- var isDeferred = odata.isDeferred;
- var isNamedStream = odata.isNamedStream;
- var isGeographyEdmType = odata.isGeographyEdmType;
- var isGeometryEdmType = odata.isGeometryEdmType;
- var isPrimitive = odata.isPrimitive;
- var isPrimitiveEdmType = odata.isPrimitiveEdmType;
- var lookupComplexType = odata.lookupComplexType;
- var lookupProperty = odata.lookupProperty;
- var maxVersion = odata.maxVersion;
- var navigationPropertyKind = odata.navigationPropertyKind;
- var MAX_DATA_SERVICE_VERSION = odata.MAX_DATA_SERVICE_VERSION;
- var parseBool = odata.parseBool;
- var parseDateTime = odata.parseDateTime;
- var parseDateTimeOffset = odata.parseDateTimeOffset;
- var parseDuration = odata.parseDuration;
- var parseTimezone = odata.parseTimezone;
-
- // CONTENT START
-
- var xmlMediaType = "application/xml";
-
- var ado = http + "docs.oasis-open.org/odata/"; // http://docs.oasis-open.org/odata/
- var adoDs = ado + "ns"; // http://docs.oasis-open.org/odata/ns
-
- var edmxNs = adoDs + "/edmx"; // http://docs.oasis-open.org/odata/ns/edmx
- var edmNs1 = adoDs + "/edm"; // http://docs.oasis-open.org/odata/ns/edm
-
- var odataXmlNs = adoDs; // http://docs.oasis-open.org/odata/ns
- var odataMetaXmlNs = adoDs + "/metadata"; // http://docs.oasis-open.org/odata/ns/metadata
- var odataRelatedPrefix = adoDs + "/related/"; // http://docs.oasis-open.org/odata/ns/related
- var odataScheme = adoDs + "/scheme"; // http://docs.oasis-open.org/odata/ns/scheme
-
- var odataPrefix = "d";
- var odataMetaPrefix = "m";
-
- var createAttributeExtension = function (domNode, useNamespaceURI) {
- /// <summary>Creates an extension object for the specified attribute.</summary>
- /// <param name="domNode">DOM node for the attribute.</param>
- /// <param name="useNamespaceURI" type="Boolean">Flag indicating if the namespaceURI property should be added to the extension object instead of the namespace property.</param>
- /// <remarks>
- /// The useNamespaceURI flag is used to prevent a breaking change from older versions of datajs in which extension
- /// objects created for Atom extension attributes have the namespaceURI property instead of the namespace one.
- ///
- /// This flag and the namespaceURI property should be deprecated in future major versions of the library.
- /// </remarks>
- /// <returns type="Object">The new extension object.</returns>
-
- djsassert(domNode.nodeType === 2, "createAttributeExtension - domNode is not an attribute node!!");
- var extension = { name: xmlLocalName(domNode), value: domNode.value };
- extension[useNamespaceURI ? "namespaceURI" : "namespace"] = xmlNamespaceURI(domNode);
-
- return extension;
- };
-
- var createElementExtension = function (domNode, useNamespaceURI) {
- /// <summary>Creates an extension object for the specified element.</summary>
- /// <param name="domNode">DOM node for the element.</param>
- /// <param name="useNamespaceURI" type="Boolean">Flag indicating if the namespaceURI property should be added to the extension object instead of the namespace property.</param>
- /// <remarks>
- /// The useNamespaceURI flag is used to prevent a breaking change from older versions of datajs in which extension
- /// objects created for Atom extension attributes have the namespaceURI property instead of the namespace one.
- ///
- /// This flag and the namespaceURI property should be deprecated in future major versions of the library.
- /// </remarks>
- /// <returns type="Object">The new extension object.</returns>
-
- djsassert(domNode.nodeType === 1, "createAttributeExtension - domNode is not an element node!!");
-
- var attributeExtensions = [];
- var childrenExtensions = [];
-
- var i, len;
- var attributes = domNode.attributes;
- for (i = 0, len = attributes.length; i < len; i++) {
- var attr = attributes[i];
- if (xmlNamespaceURI(attr) !== xmlnsNS) {
- attributeExtensions.push(createAttributeExtension(attr, useNamespaceURI));
- }
- }
-
- var child = domNode.firstChild;
- while (child != null) {
- if (child.nodeType === 1) {
- childrenExtensions.push(createElementExtension(child, useNamespaceURI));
- }
- child = child.nextSibling;
- }
-
- var extension = {
- name: xmlLocalName(domNode),
- value: xmlInnerText(domNode),
- attributes: attributeExtensions,
- children: childrenExtensions
- };
-
- extension[useNamespaceURI ? "namespaceURI" : "namespace"] = xmlNamespaceURI(domNode);
- return extension;
- };
-
- var isCollectionItemElement = function (domElement) {
- /// <summary>Checks whether the domElement is a collection item.</summary>
- /// <param name="domElement">DOM element possibliy represnting a collection item.</param>
- /// <returns type="Boolean">True if the domeElement belongs to the OData metadata namespace and its local name is "element"; false otherwise.</returns>
-
- return xmlNamespaceURI(domElement) === odataXmlNs && xmlLocalName(domElement) === "element";
- };
-
- var makePropertyMetadata = function (type, extensions) {
- /// <summary>Creates an object containing property metadata.</summary>
- /// <param type="String" name="type">Property type name.</param>
- /// <param type="Array" name="extensions">Array of attribute extension objects.</param>
- /// <returns type="Object">Property metadata object cotaining type and extensions fields.</returns>
-
- return { type: type, extensions: extensions };
- };
-
- var odataInferTypeFromPropertyXmlDom = function (domElement) {
- /// <summary>Infers type of a property based on its xml DOM tree.</summary>
- /// <param name="domElement">DOM element for the property.</param>
- /// <returns type="String">Inferred type name; null if the type cannot be determined.</returns>
-
- if (xmlFirstChildElement(domElement, gmlXmlNs)) {
- return EDM_GEOMETRY;
- }
-
- var firstChild = xmlFirstChildElement(domElement, odataXmlNs);
- if (!firstChild) {
- return EDM_STRING;
- }
-
- if (isCollectionItemElement(firstChild)) {
- var sibling = xmlSiblingElement(firstChild, odataXmlNs);
- if (sibling && isCollectionItemElement(sibling)) {
- // More than one <element> tag have been found, it can be safely assumed that this is a collection property.
- return "Collection()";
- }
- }
-
- return null;
- };
-
- var xmlReadODataPropertyAttributes = function (domElement) {
- /// <summary>Reads the attributes of a property DOM element in an OData XML document.</summary>
- /// <param name="domElement">DOM element for the property.</param>
- /// <returns type="Object">Object containing the property type, if it is null, and its attribute extensions.</returns>
-
- var type = null;
- var isNull = false;
- var extensions = [];
-
- xmlAttributes(domElement, function (attribute) {
- var nsURI = xmlNamespaceURI(attribute);
- var localName = xmlLocalName(attribute);
- var value = xmlNodeValue(attribute);
-
- if (nsURI === odataMetaXmlNs) {
- if (localName === "null") {
- isNull = (value.toLowerCase() === "true");
- return;
- }
-
- if (localName === "type") {
- type = value;
- return;
- }
- }
-
- if (nsURI !== xmlNS && nsURI !== xmlnsNS) {
- extensions.push(createAttributeExtension(attribute, true));
- return;
- }
- });
-
- return { type: (!type && isNull ? EDM_STRING : type), isNull: isNull, extensions: extensions };
- };
-
- var xmlReadODataProperty = function (domElement) {
- /// <summary>Reads a property DOM element in an OData XML document.</summary>
- /// <param name="domElement">DOM element for the property.</param>
- /// <returns type="Object">Object with name, value, and metadata for the property.</returns>
-
- if (xmlNamespaceURI(domElement) !== odataXmlNs) {
- // domElement is not a proprety element because it is not in the odata xml namespace.
- return null;
- }
-
- var propertyName = xmlLocalName(domElement);
- var propertyAttributes = xmlReadODataPropertyAttributes(domElement);
-
- var propertyIsNull = propertyAttributes.isNull;
- var propertyType = propertyAttributes.type;
-
- var propertyMetadata = makePropertyMetadata(propertyType, propertyAttributes.extensions);
- var propertyValue = propertyIsNull ? null : xmlReadODataPropertyValue(domElement, propertyType, propertyMetadata);
-
- return { name: propertyName, value: propertyValue, metadata: propertyMetadata };
- };
-
- var xmlReadODataPropertyValue = function (domElement, propertyType, propertyMetadata) {
- /// <summary>Reads the value of a property in an OData XML document.</summary>
- /// <param name="domElement">DOM element for the property.</param>
- /// <param name="propertyType" type="String">Property type name.</param>
- /// <param name="propertyMetadata" type="Object">Object that will store metadata about the property.</param>
- /// <returns>Property value.</returns>
-
- if (!propertyType) {
- propertyType = odataInferTypeFromPropertyXmlDom(domElement);
- propertyMetadata.type = propertyType;
- }
-
- var isGeograhpyType = isGeographyEdmType(propertyType);
- if (isGeograhpyType || isGeometryEdmType(propertyType)) {
- return xmlReadODataSpatialPropertyValue(domElement, propertyType, isGeograhpyType);
- }
-
- if (isPrimitiveEdmType(propertyType)) {
- return xmlReadODataEdmPropertyValue(domElement, propertyType);
- }
-
- if (isCollectionType(propertyType)) {
- return xmlReadODataCollectionPropertyValue(domElement, propertyType, propertyMetadata);
- }
-
- return xmlReadODataComplexPropertyValue(domElement, propertyType, propertyMetadata);
- };
-
- var xmlReadODataSpatialPropertyValue = function (domElement, propertyType, isGeography) {
- /// <summary>Reads the value of an spatial property in an OData XML document.</summary>
- /// <param name="property">DOM element for the spatial property.</param>
- /// <param name="propertyType" type="String">Property type name.</param>
- /// <param name="isGeography" type="Boolean" Optional="True">Flag indicating if the value uses a geographic reference system or not.<param>
- /// <remarks>
- /// When using a geographic reference system, the first component of all the coordinates in each <pos> element in the GML DOM tree is the Latitude and
- /// will be deserialized as the second component of each <pos> element in the GML DOM tree.
- /// </remarks>
- /// <returns>Spatial property value in GeoJSON format.</returns>
-
- var gmlRoot = xmlFirstChildElement(domElement, gmlXmlNs);
- djsassert(gmlRoot, "xmlReadODataSpatialPropertyValue - domElement doesn't have a child element that belongs to the gml namespace!!");
-
- var value = gmlReadODataSpatialValue(gmlRoot, isGeography);
- value.__metadata = { type: propertyType };
- return value;
- };
-
- var xmlReadODataEdmPropertyValue = function (domNode, propertyType) {
- /// <summary>Reads the value of an EDM property in an OData XML document.</summary>
- /// <param name="donNode">DOM node for the EDM property.</param>
- /// <param name="propertyType" type="String">Property type name.</param>
- /// <returns>EDM property value.</returns>
-
- var propertyValue = xmlNodeValue(domNode) || "";
-
- switch (propertyType) {
- case EDM_BOOLEAN:
- return parseBool(propertyValue);
- case EDM_BINARY:
- case EDM_DECIMAL:
- case EDM_GUID:
- case EDM_INT64:
- case EDM_STRING:
- return propertyValue;
- case EDM_BYTE:
- case EDM_INT16:
- case EDM_INT32:
- case EDM_SBYTE:
- return parseInt10(propertyValue);
- case EDM_DOUBLE:
- case EDM_SINGLE:
- return parseFloat(propertyValue);
- case EDM_TIME:
- return parseDuration(propertyValue);
- case EDM_DATETIME:
- return parseDateTime(propertyValue);
- case EDM_DATETIMEOFFSET:
- return parseDateTimeOffset(propertyValue);
- }
-
- return propertyValue;
- };
-
- var xmlReadODataComplexPropertyValue = function(domElement, propertyType, propertyMetadata) {
- /// <summary>Reads the value of a complex type property in an OData XML document.</summary>
- /// <param name="property">DOM element for the complex type property.</param>
- /// <param name="propertyType" type="String">Property type name.</param>
- /// <param name="propertyMetadata" type="Object">Object that will store metadata about the property.</param>
- /// <returns type="Object">Complex type property value.</returns>
-
- var propertyValue = { __metadata: { type: propertyType } };
- xmlChildElements(domElement, function(child) {
- var childProperty = xmlReadODataProperty(child);
- var childPropertyName = childProperty.name;
-
- propertyMetadata.properties = propertyMetadata.properties || {};
- propertyMetadata.properties[childPropertyName] = childProperty.metadata;
- propertyValue[childPropertyName] = childProperty.value;
- });
-
- return propertyValue;
- };
-
- var xmlReadODataCollectionPropertyValue = function (domElement, propertyType, propertyMetadata) {
- /// <summary>Reads the value of a collection property in an OData XML document.</summary>
- /// <param name="property">DOM element for the collection property.</param>
- /// <param name="propertyType" type="String">Property type name.</param>
- /// <param name="propertyMetadata" type="Object">Object that will store metadata about the property.</param>
- /// <returns type="Object">Collection property value.</returns>
-
- var items = [];
- var itemsMetadata = propertyMetadata.elements = [];
- var collectionType = getCollectionType(propertyType);
-
- xmlChildElements(domElement, function (child) {
- if (isCollectionItemElement(child)) {
- var itemAttributes = xmlReadODataPropertyAttributes(child);
- var itemExtensions = itemAttributes.extensions;
- var itemType = itemAttributes.type || collectionType;
- var itemMetadata = makePropertyMetadata(itemType, itemExtensions);
-
- var item = xmlReadODataPropertyValue(child, itemType, itemMetadata);
-
- items.push(item);
- itemsMetadata.push(itemMetadata);
- }
- });
-
- return { __metadata: { type: propertyType === "Collection()" ? null : propertyType }, results: items };
- };
-
- var readODataXmlDocument = function (xmlRoot, baseURI) {
- /// <summary>Reads an OData link(s) producing an object model in return.</summary>
- /// <param name="xmlRoot">Top-level element to read.</param>
- /// <param name="baseURI" type="String">Base URI for normalizing relative URIs found in the XML payload.</param>
- /// <returns type="Object">The object model representing the specified element.</returns>
-
- if (xmlNamespaceURI(xmlRoot) === odataXmlNs) {
- baseURI = xmlBaseURI(xmlRoot, baseURI);
- var localName = xmlLocalName(xmlRoot);
-
- if (localName === "links") {
- return readLinks(xmlRoot, baseURI);
- }
- if (localName === "uri") {
- return readUri(xmlRoot, baseURI);
- }
- }
- return undefined;
- };
-
- var readLinks = function (linksElement, baseURI) {
- /// <summary>Deserializes an OData XML links element.</summary>
- /// <param name="linksElement">XML links element.</param>
- /// <param name="baseURI" type="String">Base URI for normalizing relative URIs found in the XML payload.</param>
- /// <returns type="Object">A new object representing the links collection.</returns>
-
- var uris = [];
-
- xmlChildElements(linksElement, function (child) {
- if (xmlLocalName(child) === "uri" && xmlNamespaceURI(child) === odataXmlNs) {
- uris.push(readUri(child, baseURI));
- }
- });
-
- return { results: uris };
- };
-
- var readUri = function (uriElement, baseURI) {
- /// <summary>Deserializes an OData XML uri element.</summary>
- /// <param name="uriElement">XML uri element.</param>
- /// <param name="baseURI" type="String">Base URI for normalizing relative URIs found in the XML payload.</param>
- /// <returns type="Object">A new object representing the uri.</returns>
-
- var uri = xmlInnerText(uriElement) || "";
- return { uri: normalizeURI(uri, baseURI) };
- };
-
- var xmlODataInferSpatialValueGeoJsonType = function (value, edmType) {
- /// <summary>Infers the GeoJSON type from the spatial property value and the edm type name.</summary>
- /// <param name="value" type="Object">Spatial property value in GeoJSON format.</param>
- /// <param name="edmType" type="String" mayBeNull="true" optional="true">Spatial property edm type.<param>
- /// <remarks>
- /// If the edmType parameter is null, undefined, "Edm.Geometry" or "Edm.Geography", then the function returns
- /// the GeoJSON type indicated by the value's type property.
- ///
- /// If the edmType parameter is specified or is not one of the base spatial types, then it is used to
- /// determine the GeoJSON type and the value's type property is ignored.
- /// </remarks>
- /// <returns>New DOM element in the GML namespace for the spatial value. </returns>
-
- if (edmType === EDM_GEOMETRY || edmType === EDM_GEOGRAPHY) {
- return value && value.type;
- }
-
- if (edmType === EDM_GEOMETRY_POINT || edmType === EDM_GEOGRAPHY_POINT) {
- return GEOJSON_POINT;
- }
-
- if (edmType === EDM_GEOMETRY_LINESTRING || edmType === EDM_GEOGRAPHY_LINESTRING) {
- return GEOJSON_LINESTRING;
- }
-
- if (edmType === EDM_GEOMETRY_POLYGON || edmType === EDM_GEOGRAPHY_POLYGON) {
- return GEOJSON_POLYGON;
- }
-
- if (edmType === EDM_GEOMETRY_COLLECTION || edmType === EDM_GEOGRAPHY_COLLECTION) {
- return GEOJSON_GEOMETRYCOLLECTION;
- }
-
- if (edmType === EDM_GEOMETRY_MULTIPOLYGON || edmType === EDM_GEOGRAPHY_MULTIPOLYGON) {
- return GEOJSON_MULTIPOLYGON;
- }
-
- if (edmType === EDM_GEOMETRY_MULTILINESTRING || edmType === EDM_GEOGRAPHY_MULTILINESTRING) {
- return GEOJSON_MULTILINESTRING;
- }
-
- if (edmType === EDM_GEOMETRY_MULTIPOINT || edmType === EDM_GEOGRAPHY_MULTIPOINT) {
- return GEOJSON_MULTIPOINT;
- }
-
- djsassert(false, "gmlInferGeoJsonType - edm type <" + edmType + "> was unexpected!!");
- return null;
- };
-
- var xmlNewODataMetaElement = function (dom, name, children) {
- /// <summary>Creates a new DOM element in the OData metadata namespace.</summary>
- /// <param name="dom">DOM document used for creating the new DOM Element.</param>
- /// <param name="name" type="String">Local name of the OData metadata element to create.</param>
- /// <param name="children" type="Array">Array containing DOM nodes or string values that will be added as children of the new DOM element.</param>
- /// <returns>New DOM element in the OData metadata namespace.</returns>
- /// <remarks>
- /// If a value in the children collection is a string, then a new DOM text node is going to be created
- /// for it and then appended as a child of the new DOM Element.
- /// </remarks>
-
- return xmlNewElement(dom, odataMetaXmlNs, xmlQualifiedName(odataMetaPrefix, name), children);
- };
-
- var xmlNewODataMetaAttribute = function (dom, name, value) {
- /// <summary>Creates a new DOM attribute in the odata namespace.</summary>
- /// <param name="dom">DOM document used for creating the new DOM Element.</param>
- /// <param name="name" type="String">Local name of the OData attribute to create.</param>
- /// <param name="value">Attribute value.</param>
- /// <returns>New DOM attribute in the odata namespace.</returns>
-
- return xmlNewAttribute(dom, odataMetaXmlNs, xmlQualifiedName(odataMetaPrefix, name), value);
- };
-
- var xmlNewODataElement = function (dom, name, children) {
- /// <summary>Creates a new DOM element in the OData namespace.</summary>
- /// <param name="dom">DOM document used for creating the new DOM Element.</param>
- /// <param name="name" type="String">Local name of the OData element to create.</param>
- /// <param name="children" type="Array">Array containing DOM nodes or string values that will be added as children of the new DOM element.</param>
- /// <returns>New DOM element in the OData namespace.</returns>
- /// <remarks>
- /// If a value in the children collection is a string, then a new DOM text node is going to be created
- /// for it and then appended as a child of the new DOM Element.
- /// </remarks>
-
- return xmlNewElement(dom, odataXmlNs, xmlQualifiedName(odataPrefix, name), children);
- };
-
- var xmlNewODataPrimitiveValue = function (value, typeName) {
- /// <summary>Returns the string representation of primitive value for an OData XML document.</summary>
- /// <param name="value">Primivite value to format.</param>
- /// <param name="typeName" type="String" optional="true">Type name of the primitive value.</param>
- /// <returns type="String">Formatted primitive value.</returns>
-
- if (typeName === EDM_DATETIME || typeName === EDM_DATETIMEOFFSET || isDate(value)) {
- return formatDateTimeOffset(value);
- }
- if (typeName === EDM_TIME) {
- return formatDuration(value);
- }
- return value.toString();
- };
-
- var xmlNewODataElementInfo = function (domElement, dataServiceVersion) {
- /// <summary>Creates an object that represents a new DOM element for an OData XML document and the data service version it requires.</summary>
- /// <param name="domElement">New DOM element for an OData XML document.</param>
- /// <param name="dataServiceVersion" type="String">Required data service version by the new DOM element.</param>
- /// <returns type="Object">Object containing new DOM element and its required data service version.</returns>
-
- return { element: domElement, dsv: dataServiceVersion };
- };
-
- var xmlNewODataProperty = function (dom, name, typeName, children) {
- /// <summary>Creates a new DOM element for an entry property in an OData XML document.</summary>
- /// <param name="dom">DOM document used for creating the new DOM Element.</param>
- /// <param name="name" type="String">Property name.</param>
- /// <param name="typeName" type="String" optional="true">Property type name.</param>
- /// <param name="children" type="Array">Array containing DOM nodes or string values that will be added as children of the new DOM element.</param>
- /// <remarks>
- /// If a value in the children collection is a string, then a new DOM text node is going to be created
- /// for it and then appended as a child of the new DOM Element.
- /// </remarks>
- /// <returns>New DOM element in the OData namespace for the entry property.</returns>
-
- var typeAttribute = typeName ? xmlNewODataMetaAttribute(dom, "type", typeName) : null;
- var property = xmlNewODataElement(dom, name, typeAttribute);
- return xmlAppendChildren(property, children);
- };
-
- var xmlNewODataEdmProperty = function (dom, name, value, typeName) {
- /// <summary>Creates a new DOM element for an EDM property in an OData XML document.</summary>
- /// <param name="dom">DOM document used for creating the new DOM Element.</param>
- /// <param name="name" type="String">Property name.</param>
- /// <param name="value">Property value.</param>
- /// <param name="typeName" type="String" optional="true">Property type name.</param>
- /// <returns type="Object">
- /// Object containing the new DOM element in the OData namespace for the EDM property and the
- /// required data service version for this property.
- /// </returns>
-
- var propertyValue = xmlNewODataPrimitiveValue(value, typeName);
- var property = xmlNewODataProperty(dom, name, typeName, propertyValue);
- return xmlNewODataElementInfo(property, /*dataServiceVersion*/"4.0");
- };
-
- var xmlNewODataNullProperty = function (dom, name, typeName, model) {
- /// <summary>Creates a new DOM element for a null property in an OData XML document.</summary>
- /// <param name="dom">DOM document used for creating the new DOM Element.</param>
- /// <param name="name" type="String">Property name.</param>
- /// <param name="typeName" type="String" optional="true">Property type name.</param>
- /// <param name="model" type="Object" optional="true">Object describing an OData conceptual schema.</param>
- /// <remarks>
- /// If no typeName is specified, then it will be assumed that this is a primitive type property.
- /// </remarks>
- /// <returns type="Object">
- /// Object containing the new DOM element in the OData namespace for the null property and the
- /// required data service version for this property.
- /// </returns>
-
- var nullAttribute = xmlNewODataMetaAttribute(dom, "null", "true");
- var property = xmlNewODataProperty(dom, name, typeName, nullAttribute);
- var dataServiceVersion = lookupComplexType(typeName, model) ? "2.0" : "1.0";
-
- return xmlNewODataElementInfo(property, dataServiceVersion);
- };
-
- var xmlNewODataCollectionProperty = function (dom, name, value, typeName, collectionMetadata, collectionModel, model) {
- /// <summary>Creates a new DOM element for a collection property in an OData XML document.</summary>
- /// <param name="dom">DOM document used for creating the new DOM Element.</param>
- /// <param name="name" type="String">Property name.</param>
- /// <param name="value">Property value either as an array or an object representing a collection in the library's internal representation.</param>
- /// <param name="typeName" type="String" optional="true">Property type name.</param>
- /// <param name="collectionMetadata" type="Object" optional="true">Object containing metadata about the collection property.</param>
- /// <param name="collectionModel" type="Object" optional="true">Object describing the collection property in an OData conceptual schema.</param>
- /// <param name="model" type="Object" optional="true">Object describing an OData conceptual schema.</param>
- /// <returns type="Object">
- /// Object containing the new DOM element in the OData namespace for the collection property and the
- /// required data service version for this property.
- /// </returns>
-
- var itemTypeName = getCollectionType(typeName);
- var items = isArray(value) ? value : value.results;
- var itemMetadata = typeName ? { type: itemTypeName} : {};
- itemMetadata.properties = collectionMetadata.properties;
-
- var xmlProperty = xmlNewODataProperty(dom, name, itemTypeName ? typeName : null);
-
- var i, len;
- for (i = 0, len = items.length; i < len; i++) {
- var itemValue = items[i];
- var item = xmlNewODataDataElement(dom, "element", itemValue, itemMetadata, collectionModel, model);
-
- xmlAppendChild(xmlProperty, item.element);
- }
- return xmlNewODataElementInfo(xmlProperty, /*dataServiceVersion*/"4.0");
- };
-
- var xmlNewODataComplexProperty = function (dom, name, value, typeName, propertyMetadata, propertyModel, model) {
- /// <summary>Creates a new DOM element for a complex type property in an OData XML document.</summary>
- /// <param name="dom">DOM document used for creating the new DOM Element.</param>
- /// <param name="name" type="String">Property name.</param>
- /// <param name="value">Property value as an object in the library's internal representation.</param>
- /// <param name="typeName" type="String" optional="true">Property type name.</param>
- /// <param name="propertyMetadata" type="Object" optional="true">Object containing metadata about the complex type property.</param>
- /// <param name="propertyModel" type="Object" optional="true">Object describing the complex type property in an OData conceptual schema.</param>
- /// <param name="model" type="Object" optional="true">Object describing an OData conceptual schema.</param>
- /// <returns type="Object">
- /// Object containing the new DOM element in the OData namespace for the complex type property and the
- /// required data service version for this property.
- /// </returns>
-
- var xmlProperty = xmlNewODataProperty(dom, name, typeName);
- var complexTypePropertiesMetadata = propertyMetadata.properties || {};
- var complexTypeModel = lookupComplexType(typeName, model) || {};
-
- var dataServiceVersion = "4.0";
-
- for (var key in value) {
- if (key !== "__metadata") {
- var memberValue = value[key];
- var memberModel = lookupProperty(complexTypeModel.property, key);
- var memberMetadata = complexTypePropertiesMetadata[key] || {};
- var member = xmlNewODataDataElement(dom, key, memberValue, memberMetadata, memberModel, model);
-
- dataServiceVersion = maxVersion(dataServiceVersion, member.dsv);
- xmlAppendChild(xmlProperty, member.element);
- }
- }
- return xmlNewODataElementInfo(xmlProperty, dataServiceVersion);
- };
-
- var xmlNewODataSpatialProperty = function (dom, name, value, typeName, isGeography) {
- /// <summary>Creates a new DOM element for an EDM spatial property in an OData XML document.</summary>
- /// <param name="dom">DOM document used for creating the new DOM Element.</param>
- /// <param name="name" type="String">Property name.</param>
- /// <param name="value" type="Object">GeoJSON object containing the property value.</param>
- /// <param name="typeName" type="String" optional="true">Property type name.</param>
- /// <returns type="Object">
- /// Object containing the new DOM element in the OData namespace for the EDM property and the
- /// required data service version for this property.
- /// </returns>
-
- var geoJsonType = xmlODataInferSpatialValueGeoJsonType(value, typeName);
-
- var gmlRoot = gmlNewODataSpatialValue(dom, value, geoJsonType, isGeography);
- var xmlProperty = xmlNewODataProperty(dom, name, typeName, gmlRoot);
-
- return xmlNewODataElementInfo(xmlProperty, "4.0");
- };
-
- var xmlNewODataDataElement = function (dom, name, value, dataItemMetadata, dataItemModel, model) {
- /// <summary>Creates a new DOM element for a data item in an entry, complex property, or collection property.</summary>
- /// <param name="dom">DOM document used for creating the new DOM Element.</param>
- /// <param name="name" type="String">Data item name.</param>
- /// <param name="value" optional="true" mayBeNull="true">Value of the data item, if any.</param>
- /// <param name="dataItemMetadata" type="Object" optional="true">Object containing metadata about the data item.</param>
- /// <param name="dataItemModel" type="Object" optional="true">Object describing the data item in an OData conceptual schema.</param>
- /// <param name="model" type="Object" optional="true">Object describing an OData conceptual schema.</param>
- /// <returns type="Object">
- /// Object containing the new DOM element in the appropriate namespace for the data item and the
- /// required data service version for it.
- /// </returns>
-
- var typeName = dataItemTypeName(value, dataItemMetadata, dataItemModel);
- if (isPrimitive(value)) {
- return xmlNewODataEdmProperty(dom, name, value, typeName || EDM_STRING);
- }
-
- var isGeography = isGeographyEdmType(typeName);
- if (isGeography || isGeometryEdmType(typeName)) {
- return xmlNewODataSpatialProperty(dom, name, value, typeName, isGeography);
- }
-
- if (isCollection(value, typeName)) {
- return xmlNewODataCollectionProperty(dom, name, value, typeName, dataItemMetadata, dataItemModel, model);
- }
-
- if (isNamedStream(value)) {
- return null;
- }
-
- // This may be a navigation property.
- var navPropKind = navigationPropertyKind(value, dataItemModel);
- if (navPropKind !== null) {
- return null;
- }
-
- if (value === null) {
- return xmlNewODataNullProperty(dom, name, typeName);
- }
-
- djsassert(isObject(value), "xmlNewODataEntryProperty - property '" + name + "' is not an object");
- return xmlNewODataComplexProperty(dom, name, value, typeName, dataItemMetadata, dataItemModel, model);
- };
-
- var odataNewLinkDocument = function (data) {
- /// <summary>Writes the specified data into an OData XML document.</summary>
- /// <param name="data">Data to write.</param>
- /// <returns>The root of the DOM tree built.</returns>
-
- if (data && isObject(data)) {
- var dom = xmlDom();
- return xmlAppendChild(dom, xmlNewODataElement(dom, "uri", data.uri));
- }
- // Allow for undefined to be returned.
- };
-
- var xmlParser = function (handler, text) {
- /// <summary>Parses an OData XML document.</summary>
- /// <param name="handler">This handler.</param>
- /// <param name="text" type="String">Document text.</param>
- /// <returns>An object representation of the document; undefined if not applicable.</returns>
-
- if (text) {
- var doc = xmlParse(text);
- var root = xmlFirstChildElement(doc);
- if (root) {
- return readODataXmlDocument(root);
- }
- }
-
- // Allow for undefined to be returned.
- };
-
- var xmlSerializer = function (handler, data, context) {
- /// <summary>Serializes an OData XML object into a document.</summary>
- /// <param name="handler">This handler.</param>
- /// <param name="data" type="Object">Representation of feed or entry.</param>
- /// <param name="context" type="Object">Object with parsing context.</param>
- /// <returns>A text representation of the data object; undefined if not applicable.</returns>
-
- var cType = context.contentType = context.contentType || contentType(xmlMediaType);
- if (cType && cType.mediaType === xmlMediaType) {
- return xmlSerialize(odataNewLinkDocument(data));
- }
- return undefined;
- };
-
- odata.xmlHandler = handler(xmlParser, xmlSerializer, xmlMediaType, MAX_DATA_SERVICE_VERSION);
-
- // DATAJS INTERNAL START
- odata.adoDs = adoDs;
- odata.createAttributeExtension = createAttributeExtension;
- odata.createElementExtension = createElementExtension;
- odata.edmxNs = edmxNs;
- odata.edmNs1 = edmNs1;
- odata.odataMetaXmlNs = odataMetaXmlNs;
- odata.odataMetaPrefix = odataMetaPrefix;
- odata.odataXmlNs = odataXmlNs;
- odata.odataPrefix = odataPrefix;
- odata.odataScheme = odataScheme;
- odata.odataRelatedPrefix = odataRelatedPrefix;
- odata.xmlNewODataElement = xmlNewODataElement;
- odata.xmlNewODataElementInfo = xmlNewODataElementInfo;
- odata.xmlNewODataMetaAttribute = xmlNewODataMetaAttribute;
- odata.xmlNewODataMetaElement = xmlNewODataMetaElement;
- odata.xmlNewODataDataElement = xmlNewODataDataElement;
- odata.xmlReadODataEdmPropertyValue = xmlReadODataEdmPropertyValue;
- odata.xmlReadODataProperty = xmlReadODataProperty;
-
- // DATAJS INTERNAL END
-
- // CONTENT END
-})(this);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/src/odata.js
----------------------------------------------------------------------
diff --git a/JSLib/src/odata.js b/JSLib/src/odata.js
deleted file mode 100644
index 10a6d2b..0000000
--- a/JSLib/src/odata.js
+++ /dev/null
@@ -1,155 +0,0 @@
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
-// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// odata.js
-
-(function (window, undefined) {
-
- var datajs = window.odatajs || {};
- var odata = window.OData || {};
-
- // Imports
-
- var assigned = odatajs.assigned;
- var defined = odatajs.defined;
- var throwErrorCallback = odatajs.throwErrorCallback;
-
- var invokeRequest = odata.invokeRequest;
- var MAX_DATA_SERVICE_VERSION = odata.MAX_DATA_SERVICE_VERSION;
- var prepareRequest = odata.prepareRequest;
- var metadataParser = odata.metadataParser;
-
- // CONTENT START
-
- // to do: disable atom scenario
- var handlers = [odata.jsonHandler/*, odata.atomHandler*/, odata.xmlHandler, odata.textHandler];
-
- var dispatchHandler = function (handlerMethod, requestOrResponse, context) {
- /// <summary>Dispatches an operation to handlers.</summary>
- /// <param name="handlerMethod" type="String">Name of handler method to invoke.</param>
- /// <param name="requestOrResponse" type="Object">request/response argument for delegated call.</param>
- /// <param name="context" type="Object">context argument for delegated call.</param>
-
- var i, len;
- for (i = 0, len = handlers.length; i < len && !handlers[i][handlerMethod](requestOrResponse, context); i++) {
- }
-
- if (i === len) {
- throw { message: "no handler for data" };
- }
- };
-
- odata.defaultSuccess = function (data) {
- /// <summary>Default success handler for OData.</summary>
- /// <param name="data">Data to process.</param>
-
- window.alert(window.JSON.stringify(data));
- };
-
- odata.defaultError = throwErrorCallback;
-
- odata.defaultHandler = {
- read: function (response, context) {
- /// <summary>Reads the body of the specified response by delegating to JSON and ATOM handlers.</summary>
- /// <param name="response">Response object.</param>
- /// <param name="context">Operation context.</param>
-
- if (response && assigned(response.body) && response.headers["Content-Type"]) {
- dispatchHandler("read", response, context);
- }
- },
-
- write: function (request, context) {
- /// <summary>Write the body of the specified request by delegating to JSON and ATOM handlers.</summary>
- /// <param name="request">Reques tobject.</param>
- /// <param name="context">Operation context.</param>
-
- dispatchHandler("write", request, context);
- },
-
- maxDataServiceVersion: MAX_DATA_SERVICE_VERSION,
- accept: "application/json;q=0.9, application/atomsvc+xml;q=0.8, */*;q=0.1"
- };
-
- odata.defaultMetadata = [];
-
- odata.read = function (urlOrRequest, success, error, handler, httpClient, metadata) {
- /// <summary>Reads data from the specified URL.</summary>
- /// <param name="urlOrRequest">URL to read data from.</param>
- /// <param name="success" type="Function" optional="true">Callback for a successful read operation.</param>
- /// <param name="error" type="Function" optional="true">Callback for handling errors.</param>
- /// <param name="handler" type="Object" optional="true">Handler for data serialization.</param>
- /// <param name="httpClient" type="Object" optional="true">HTTP client layer.</param>
- /// <param name="metadata" type="Object" optional="true">Conceptual metadata for this request.</param>
-
- var request;
- if (urlOrRequest instanceof String || typeof urlOrRequest === "string") {
- request = { requestUri: urlOrRequest };
- } else {
- request = urlOrRequest;
- }
-
- return odata.request(request, success, error, handler, httpClient, metadata);
- };
-
- odata.request = function (request, success, error, handler, httpClient, metadata) {
- /// <summary>Sends a request containing OData payload to a server.</summary>
- /// <param name="request" type="Object">Object that represents the request to be sent.</param>
- /// <param name="success" type="Function" optional="true">Callback for a successful read operation.</param>
- /// <param name="error" type="Function" optional="true">Callback for handling errors.</param>
- /// <param name="handler" type="Object" optional="true">Handler for data serialization.</param>
- /// <param name="httpClient" type="Object" optional="true">HTTP client layer.</param>
- /// <param name="metadata" type="Object" optional="true">Conceptual metadata for this request.</param>
-
- success = success || odata.defaultSuccess;
- error = error || odata.defaultError;
- handler = handler || odata.defaultHandler;
- httpClient = httpClient || odata.defaultHttpClient;
- metadata = metadata || odata.defaultMetadata;
-
- // Augment the request with additional defaults.
- request.recognizeDates = defined(request.recognizeDates, odata.jsonHandler.recognizeDates);
- request.callbackParameterName = defined(request.callbackParameterName, odata.defaultHttpClient.callbackParameterName);
- request.formatQueryString = defined(request.formatQueryString, odata.defaultHttpClient.formatQueryString);
- request.enableJsonpCallback = defined(request.enableJsonpCallback, odata.defaultHttpClient.enableJsonpCallback);
-
- // Create the base context for read/write operations, also specifying complete settings.
- var context = {
- metadata: metadata,
- recognizeDates: request.recognizeDates,
- callbackParameterName: request.callbackParameterName,
- formatQueryString: request.formatQueryString,
- enableJsonpCallback: request.enableJsonpCallback
- };
-
- try {
- prepareRequest(request, handler, context);
- return invokeRequest(request, success, error, handler, httpClient, context);
- } catch (err) {
- error(err);
- }
- };
-
- odata.parseMetadata = function (csdlMetadataDocument) {
- /// <summary>Parses the csdl metadata to DataJS metatdata format. This method can be used when the metadata is retrieved using something other than DataJS</summary>
- /// <param name="atomMetadata" type="string">A string that represents the entire csdl metadata.</param>
- /// <returns type="Object">An object that has the representation of the metadata in Datajs format.</returns>
-
- return metadataParser(null, csdlMetadataDocument);
- };
-
- // Configure the batch handler to use the default handler for the batch parts.
- odata.batchHandler.partHandler = odata.defaultHandler;
-
- // CONTENT END
-})(this);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/src/store-dom.js
----------------------------------------------------------------------
diff --git a/JSLib/src/store-dom.js b/JSLib/src/store-dom.js
deleted file mode 100644
index d3aafa0..0000000
--- a/JSLib/src/store-dom.js
+++ /dev/null
@@ -1,320 +0,0 @@
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
-// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// store-dom.js
-
-(function (window, undefined) {
-
- var datajs = window.odatajs || {};
-
- // Imports.
- var throwErrorCallback = odatajs.throwErrorCallback;
- var delay = odatajs.delay;
-
- // CONTENT START
-
- var localStorage = null;
-
- var domStoreDateToJSON = function () {
- /// <summary>Converts a Date object into an object representation friendly to JSON serialization.</summary>
- /// <returns type="Object">Object that represents the Date.</returns>
- /// <remarks>
- /// This method is used to override the Date.toJSON method and is called only by
- /// JSON.stringify. It should never be called directly.
- /// </remarks>
-
- var newValue = { v: this.valueOf(), t: "[object Date]" };
- // Date objects might have extra properties on them so we save them.
- for (var name in this) {
- newValue[name] = this[name];
- }
- return newValue;
- };
-
- var domStoreJSONToDate = function (_, value) {
- /// <summary>JSON reviver function for converting an object representing a Date in a JSON stream to a Date object</summary>
- /// <param value="Object">Object to convert.</param>
- /// <returns type="Date">Date object.</returns>
- /// <remarks>
- /// This method is used during JSON parsing and invoked only by the reviver function.
- /// It should never be called directly.
- /// </remarks>
-
- if (value && value.t === "[object Date]") {
- var newValue = new Date(value.v);
- for (var name in value) {
- if (name !== "t" && name !== "v") {
- newValue[name] = value[name];
- }
- }
- value = newValue;
- }
- return value;
- };
-
- var qualifyDomStoreKey = function (store, key) {
- /// <summary>Qualifies the key with the name of the store.</summary>
- /// <param name="store" type="Object">Store object whose name will be used for qualifying the key.</param>
- /// <param name="key" type="String">Key string.</param>
- /// <returns type="String">Fully qualified key string.</returns>
-
- return store.name + "#!#" + key;
- };
-
- var unqualifyDomStoreKey = function (store, key) {
- /// <summary>Gets the key part of a fully qualified key string.</summary>
- /// <param name="store" type="Object">Store object whose name will be used for qualifying the key.</param>
- /// <param name="key" type="String">Fully qualified key string.</param>
- /// <returns type="String">Key part string</returns>
-
- return key.replace(store.name + "#!#", "");
- };
-
- var DomStore = function (name) {
- /// <summary>Constructor for store objects that use DOM storage as the underlying mechanism.</summary>
- /// <param name="name" type="String">Store name.</param>
- this.name = name;
- };
-
- DomStore.create = function (name) {
- /// <summary>Creates a store object that uses DOM Storage as its underlying mechanism.</summary>
- /// <param name="name" type="String">Store name.</param>
- /// <returns type="Object">Store object.</returns>
-
- if (DomStore.isSupported()) {
- localStorage = localStorage || window.localStorage;
- return new DomStore(name);
- }
-
- throw { message: "Web Storage not supported by the browser" };
- };
-
- DomStore.isSupported = function () {
- /// <summary>Checks whether the underlying mechanism for this kind of store objects is supported by the browser.</summary>
- /// <returns type="Boolean">True if the mechanism is supported by the browser; otherwise false.</summary>
- return !!window.localStorage;
- };
-
- DomStore.prototype.add = function (key, value, success, error) {
- /// <summary>Adds a new value identified by a key to the store.</summary>
- /// <param name="key" type="String">Key string.</param>
- /// <param name="value">Value that is going to be added to the store.</param>
- /// <param name="success" type="Function" optional="no">Callback for a successful add operation.</param>
- /// <param name="error" type="Function" optional="yes">Callback for handling errors. If not specified then store.defaultError is invoked.</param>
- /// <remarks>
- /// This method errors out if the store already contains the specified key.
- /// </remarks>
-
- error = error || this.defaultError;
- var store = this;
- this.contains(key, function (contained) {
- if (!contained) {
- store.addOrUpdate(key, value, success, error);
- } else {
- delay(error, { message: "key already exists", key: key });
- }
- }, error);
- };
-
- DomStore.prototype.addOrUpdate = function (key, value, success, error) {
- /// <summary>Adds or updates a value identified by a key to the store.</summary>
- /// <param name="key" type="String">Key string.</param>
- /// <param name="value">Value that is going to be added or updated to the store.</param>
- /// <param name="success" type="Function" optional="no">Callback for a successful add or update operation.</param>
- /// <param name="error" type="Function" optional="yes">Callback for handling errors. If not specified then store.defaultError is invoked.</param>
- /// <remarks>
- /// This method will overwrite the key's current value if it already exists in the store; otherwise it simply adds the new key and value.
- /// </remarks>
-
- error = error || this.defaultError;
-
- if (key instanceof Array) {
- error({ message: "Array of keys not supported" });
- } else {
- var fullKey = qualifyDomStoreKey(this, key);
- var oldDateToJSON = Date.prototype.toJSON;
- try {
- var storedValue = value;
- if (storedValue !== undefined) {
- // Dehydrate using json
- Date.prototype.toJSON = domStoreDateToJSON;
- storedValue = window.JSON.stringify(value);
- }
- // Save the json string.
- localStorage.setItem(fullKey, storedValue);
- delay(success, key, value);
- }
- catch (e) {
- if (e.code === 22 || e.number === 0x8007000E) {
- delay(error, { name: "QUOTA_EXCEEDED_ERR", error: e });
- } else {
- delay(error, e);
- }
- }
- finally {
- Date.prototype.toJSON = oldDateToJSON;
- }
- }
- };
-
- DomStore.prototype.clear = function (success, error) {
- /// <summary>Removes all the data associated with this store object.</summary>
- /// <param name="success" type="Function" optional="no">Callback for a successful clear operation.</param>
- /// <param name="error" type="Function" optional="yes">Callback for handling errors. If not specified then store.defaultError is invoked.</param>
- /// <remarks>
- /// In case of an error, this method will not restore any keys that might have been deleted at that point.
- /// </remarks>
-
- error = error || this.defaultError;
- try {
- var i = 0, len = localStorage.length;
- while (len > 0 && i < len) {
- var fullKey = localStorage.key(i);
- var key = unqualifyDomStoreKey(this, fullKey);
- if (fullKey !== key) {
- localStorage.removeItem(fullKey);
- len = localStorage.length;
- } else {
- i++;
- }
- }
- delay(success);
- }
- catch (e) {
- delay(error, e);
- }
- };
-
- DomStore.prototype.close = function () {
- /// <summary>This function does nothing in DomStore as it does not have a connection model</summary>
- };
-
- DomStore.prototype.contains = function (key, success, error) {
- /// <summary>Checks whether a key exists in the store.</summary>
- /// <param name="key" type="String">Key string.</param>
- /// <param name="success" type="Function" optional="no">Callback indicating whether the store contains the key or not.</param>
- /// <param name="error" type="Function" optional="yes">Callback for handling errors. If not specified then store.defaultError is invoked.</param>
- error = error || this.defaultError;
- try {
- var fullKey = qualifyDomStoreKey(this, key);
- var value = localStorage.getItem(fullKey);
- delay(success, value !== null);
- } catch (e) {
- delay(error, e);
- }
- };
-
- DomStore.prototype.defaultError = throwErrorCallback;
-
- DomStore.prototype.getAllKeys = function (success, error) {
- /// <summary>Gets all the keys that exist in the store.</summary>
- /// <param name="success" type="Function" optional="no">Callback for a successful get operation.</param>
- /// <param name="error" type="Function" optional="yes">Callback for handling errors. If not specified then store.defaultError is invoked.</param>
-
- error = error || this.defaultError;
-
- var results = [];
- var i, len;
-
- try {
- for (i = 0, len = localStorage.length; i < len; i++) {
- var fullKey = localStorage.key(i);
- var key = unqualifyDomStoreKey(this, fullKey);
- if (fullKey !== key) {
- results.push(key);
- }
- }
- delay(success, results);
- }
- catch (e) {
- delay(error, e);
- }
- };
-
- /// <summary>Identifies the underlying mechanism used by the store.</summary>
- DomStore.prototype.mechanism = "dom";
-
- DomStore.prototype.read = function (key, success, error) {
- /// <summary>Reads the value associated to a key in the store.</summary>
- /// <param name="key" type="String">Key string.</param>
- /// <param name="success" type="Function" optional="no">Callback for a successful reads operation.</param>
- /// <param name="error" type="Function" optional="yes">Callback for handling errors. If not specified then store.defaultError is invoked.</param>
- error = error || this.defaultError;
-
- if (key instanceof Array) {
- error({ message: "Array of keys not supported" });
- } else {
- try {
- var fullKey = qualifyDomStoreKey(this, key);
- var value = localStorage.getItem(fullKey);
- if (value !== null && value !== "undefined") {
- // Hydrate using json
- value = window.JSON.parse(value, domStoreJSONToDate);
- }
- else {
- value = undefined;
- }
- delay(success, key, value);
- } catch (e) {
- delay(error, e);
- }
- }
- };
-
- DomStore.prototype.remove = function (key, success, error) {
- /// <summary>Removes a key and its value from the store.</summary>
- /// <param name="key" type="String">Key string.</param>
- /// <param name="success" type="Function" optional="no">Callback for a successful remove operation.</param>
- /// <param name="error" type="Function" optional="yes">Callback for handling errors. If not specified then store.defaultError is invoked.</param>
- error = error || this.defaultError;
-
- if (key instanceof Array) {
- error({ message: "Batches not supported" });
- } else {
- try {
- var fullKey = qualifyDomStoreKey(this, key);
- localStorage.removeItem(fullKey);
- delay(success);
- } catch (e) {
- delay(error, e);
- }
- }
- };
-
- DomStore.prototype.update = function (key, value, success, error) {
- /// <summary>Updates the value associated to a key in the store.</summary>
- /// <param name="key" type="String">Key string.</param>
- /// <param name="value">New value.</param>
- /// <param name="success" type="Function" optional="no">Callback for a successful update operation.</param>
- /// <param name="error" type="Function" optional="yes">Callback for handling errors. If not specified then store.defaultError is invoked.</param>
- /// <remarks>
- /// This method errors out if the specified key is not found in the store.
- /// </remarks>
-
- error = error || this.defaultError;
- var store = this;
- this.contains(key, function (contained) {
- if (contained) {
- store.addOrUpdate(key, value, success, error);
- } else {
- delay(error, { message: "key not found", key: key });
- }
- }, error);
- };
-
- // DATAJS INTERNAL START
- odatajs.DomStore = DomStore;
- // DATAJS INTERNAL END
-
- // CONTENT END
-})(this);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/src/store-indexeddb.js
----------------------------------------------------------------------
diff --git a/JSLib/src/store-indexeddb.js b/JSLib/src/store-indexeddb.js
deleted file mode 100644
index 1a0483c..0000000
--- a/JSLib/src/store-indexeddb.js
+++ /dev/null
@@ -1,417 +0,0 @@
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
-// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// store-indexeddb.js
-
-(function (window, undefined) {
-
- var datajs = window.odatajs || {};
-
- // Imports.
- var throwErrorCallback = odatajs.throwErrorCallback;
- var delay = odatajs.delay;
-
- // CONTENT START
-
- var indexedDB = window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB || window.indexedDB;
- var IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange;
- var IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction || {};
-
- var IDBT_READ_ONLY = IDBTransaction.READ_ONLY || "readonly";
- var IDBT_READ_WRITE = IDBTransaction.READ_WRITE || "readwrite";
-
- var getError = function (error, defaultError) {
- /// <summary>Returns either a specific error handler or the default error handler</summary>
- /// <param name="error" type="Function">The specific error handler</param>
- /// <param name="defaultError" type="Function">The default error handler</param>
- /// <returns type="Function">The error callback</returns>
-
- return function (e) {
- var errorFunc = error || defaultError;
- if (!errorFunc) {
- return;
- }
-
- // Old api quota exceeded error support.
- if (Object.prototype.toString.call(e) === "[object IDBDatabaseException]") {
- if (e.code === 11 /* IndexedDb disk quota exceeded */) {
- errorFunc({ name: "QuotaExceededError", error: e });
- return;
- }
- errorFunc(e);
- return;
- }
-
- var errName;
- try {
- var errObj = e.target.error || e;
- errName = errObj.name;
- } catch (ex) {
- errName = (e.type === "blocked") ? "IndexedDBBlocked" : "UnknownError";
- }
- errorFunc({ name: errName, error: e });
- };
- };
-
- var openStoreDb = function (store, success, error) {
- /// <summary>Opens the store object's indexed db database.</summary>
- /// <param name="store" type="IndexedDBStore">The store object</param>
- /// <param name="success" type="Function">The success callback</param>
- /// <param name="error" type="Function">The error callback</param>
-
- var storeName = store.name;
- var dbName = "_datajs_" + storeName;
-
- var request = indexedDB.open(dbName);
- request.onblocked = error;
- request.onerror = error;
-
- request.onupgradeneeded = function () {
- var db = request.result;
- if (!db.objectStoreNames.contains(storeName)) {
- db.createObjectStore(storeName);
- }
- };
-
- request.onsuccess = function (event) {
- var db = request.result;
- if (!db.objectStoreNames.contains(storeName)) {
- // Should we use the old style api to define the database schema?
- if ("setVersion" in db) {
- var versionRequest = db.setVersion("1.0");
- versionRequest.onsuccess = function () {
- var transaction = versionRequest.transaction;
- transaction.oncomplete = function () {
- success(db);
- };
- db.createObjectStore(storeName, null, false);
- };
- versionRequest.onerror = error;
- versionRequest.onblocked = error;
- return;
- }
-
- // The database doesn't have the expected store.
- // Fabricate an error object for the event for the schema mismatch
- // and error out.
- event.target.error = { name: "DBSchemaMismatch" };
- error(event);
- return;
- }
-
- db.onversionchange = function(event) {
- event.target.close();
- };
- success(db);
- };
- };
-
- var openTransaction = function (store, mode, success, error) {
- /// <summary>Opens a new transaction to the store</summary>
- /// <param name="store" type="IndexedDBStore">The store object</param>
- /// <param name="mode" type="Short">The read/write mode of the transaction (constants from IDBTransaction)</param>
- /// <param name="success" type="Function">The success callback</param>
- /// <param name="error" type="Function">The error callback</param>
-
- var storeName = store.name;
- var storeDb = store.db;
- var errorCallback = getError(error, store.defaultError);
-
- if (storeDb) {
- success(storeDb.transaction(storeName, mode));
- return;
- }
-
- openStoreDb(store, function (db) {
- store.db = db;
- success(db.transaction(storeName, mode));
- }, errorCallback);
- };
-
- var IndexedDBStore = function (name) {
- /// <summary>Creates a new IndexedDBStore.</summary>
- /// <param name="name" type="String">The name of the store.</param>
- /// <returns type="Object">The new IndexedDBStore.</returns>
- this.name = name;
- };
-
- IndexedDBStore.create = function (name) {
- /// <summary>Creates a new IndexedDBStore.</summary>
- /// <param name="name" type="String">The name of the store.</param>
- /// <returns type="Object">The new IndexedDBStore.</returns>
- if (IndexedDBStore.isSupported()) {
- return new IndexedDBStore(name);
- }
-
- throw { message: "IndexedDB is not supported on this browser" };
- };
-
- IndexedDBStore.isSupported = function () {
- /// <summary>Returns whether IndexedDB is supported.</summary>
- /// <returns type="Boolean">True if IndexedDB is supported, false otherwise.</returns>
- return !!indexedDB;
- };
-
- IndexedDBStore.prototype.add = function (key, value, success, error) {
- /// <summary>Adds a key/value pair to the store</summary>
- /// <param name="key" type="String">The key</param>
- /// <param name="value" type="Object">The value</param>
- /// <param name="success" type="Function">The success callback</param>
- /// <param name="error" type="Function">The error callback</param>
- var name = this.name;
- var defaultError = this.defaultError;
- var keys = [];
- var values = [];
-
- if (key instanceof Array) {
- keys = key;
- values = value;
- } else {
- keys = [key];
- values = [value];
- }
-
- openTransaction(this, IDBT_READ_WRITE, function (transaction) {
- transaction.onabort = getError(error, defaultError, key, "add");
- transaction.oncomplete = function () {
- if (key instanceof Array) {
- success(keys, values);
- } else {
- success(key, value);
- }
- };
-
- for (var i = 0; i < keys.length && i < values.length; i++) {
- transaction.objectStore(name).add({ v: values[i] }, keys[i]);
- }
- }, error);
- };
-
- IndexedDBStore.prototype.addOrUpdate = function (key, value, success, error) {
- /// <summary>Adds or updates a key/value pair in the store</summary>
- /// <param name="key" type="String">The key</param>
- /// <param name="value" type="Object">The value</param>
- /// <param name="success" type="Function">The success callback</param>
- /// <param name="error" type="Function">The error callback</param>
- var name = this.name;
- var defaultError = this.defaultError;
- var keys = [];
- var values = [];
-
- if (key instanceof Array) {
- keys = key;
- values = value;
- } else {
- keys = [key];
- values = [value];
- }
-
- openTransaction(this, IDBT_READ_WRITE, function (transaction) {
- transaction.onabort = getError(error, defaultError);
- transaction.oncomplete = function () {
- if (key instanceof Array) {
- success(keys, values);
- } else {
- success(key, value);
- }
- };
-
- for (var i = 0; i < keys.length && i < values.length; i++) {
- var record = { v: values[i] };
- transaction.objectStore(name).put(record, keys[i]);
- }
- }, error);
- };
-
- IndexedDBStore.prototype.clear = function (success, error) {
- /// <summary>Clears the store</summary>
- /// <param name="success" type="Function">The success callback</param>
- /// <param name="error" type="Function">The error callback</param>
- var name = this.name;
- var defaultError = this.defaultError;
- openTransaction(this, IDBT_READ_WRITE, function (transaction) {
- transaction.onerror = getError(error, defaultError);
- transaction.oncomplete = function () {
- success();
- };
-
- transaction.objectStore(name).clear();
- }, error);
- };
-
- IndexedDBStore.prototype.close = function () {
- /// <summary>Closes the connection to the database</summary>
- if (this.db) {
- this.db.close();
- this.db = null;
- }
- };
-
- IndexedDBStore.prototype.contains = function (key, success, error) {
- /// <summary>Returns whether the store contains a key</summary>
- /// <param name="key" type="String">The key</param>
- /// <param name="success" type="Function">The success callback</param>
- /// <param name="error" type="Function">The error callback</param>
- var name = this.name;
- var defaultError = this.defaultError;
- openTransaction(this, IDBT_READ_ONLY, function (transaction) {
- var objectStore = transaction.objectStore(name);
- var request = objectStore["get"](key);
-
- transaction.oncomplete = function () {
- success(!!request.result);
- };
- transaction.onerror = getError(error, defaultError);
- }, error);
- };
-
- IndexedDBStore.prototype.defaultError = throwErrorCallback;
-
- IndexedDBStore.prototype.getAllKeys = function (success, error) {
- /// <summary>Gets all the keys from the store</summary>
- /// <param name="success" type="Function">The success callback</param>
- /// <param name="error" type="Function">The error callback</param>
- var name = this.name;
- var defaultError = this.defaultError;
- openTransaction(this, IDBT_READ_WRITE, function (transaction) {
- var results = [];
-
- transaction.oncomplete = function () {
- success(results);
- };
-
- var request = transaction.objectStore(name).openCursor();
-
- request.onerror = getError(error, defaultError);
- request.onsuccess = function (event) {
- var cursor = event.target.result;
- if (cursor) {
- results.push(cursor.key);
- // Some tools have issues because continue is a javascript reserved word.
- cursor["continue"].call(cursor);
- }
- };
- }, error);
- };
-
- /// <summary>Identifies the underlying mechanism used by the store.</summary>
- IndexedDBStore.prototype.mechanism = "indexeddb";
-
- IndexedDBStore.prototype.read = function (key, success, error) {
- /// <summary>Reads the value for the specified key</summary>
- /// <param name="key" type="String">The key</param>
- /// <param name="success" type="Function">The success callback</param>
- /// <param name="error" type="Function">The error callback</param>
- /// <remarks>If the key does not exist, the success handler will be called with value = undefined</remarks>
- var name = this.name;
- var defaultError = this.defaultError;
- var keys = (key instanceof Array) ? key : [key];
-
- openTransaction(this, IDBT_READ_ONLY, function (transaction) {
- var values = [];
-
- transaction.onerror = getError(error, defaultError, key, "read");
- transaction.oncomplete = function () {
- if (key instanceof Array) {
- success(keys, values);
- } else {
- success(keys[0], values[0]);
- }
- };
-
- for (var i = 0; i < keys.length; i++) {
- // Some tools have issues because get is a javascript reserved word.
- var objectStore = transaction.objectStore(name);
- var request = objectStore["get"].call(objectStore, keys[i]);
- request.onsuccess = function (event) {
- var record = event.target.result;
- values.push(record ? record.v : undefined);
- };
- }
- }, error);
- };
-
- IndexedDBStore.prototype.remove = function (key, success, error) {
- /// <summary>Removes the specified key from the store</summary>
- /// <param name="key" type="String">The key</param>
- /// <param name="success" type="Function">The success callback</param>
- /// <param name="error" type="Function">The error callback</param>
- var name = this.name;
- var defaultError = this.defaultError;
- var keys = (key instanceof Array) ? key : [key];
-
- openTransaction(this, IDBT_READ_WRITE, function (transaction) {
- transaction.onerror = getError(error, defaultError);
- transaction.oncomplete = function () {
- success();
- };
-
- for (var i = 0; i < keys.length; i++) {
- // Some tools have issues because continue is a javascript reserved word.
- var objectStore = transaction.objectStore(name);
- objectStore["delete"].call(objectStore, keys[i]);
- }
- }, error);
- };
-
- IndexedDBStore.prototype.update = function (key, value, success, error) {
- /// <summary>Updates a key/value pair in the store</summary>
- /// <param name="key" type="String">The key</param>
- /// <param name="value" type="Object">The value</param>
- /// <param name="success" type="Function">The success callback</param>
- /// <param name="error" type="Function">The error callback</param>
- var name = this.name;
- var defaultError = this.defaultError;
- var keys = [];
- var values = [];
-
- if (key instanceof Array) {
- keys = key;
- values = value;
- } else {
- keys = [key];
- values = [value];
- }
-
- openTransaction(this, IDBT_READ_WRITE, function (transaction) {
- transaction.onabort = getError(error, defaultError);
- transaction.oncomplete = function () {
- if (key instanceof Array) {
- success(keys, values);
- } else {
- success(key, value);
- }
- };
-
- for (var i = 0; i < keys.length && i < values.length; i++) {
- var request = transaction.objectStore(name).openCursor(IDBKeyRange.only(keys[i]));
- var record = { v: values[i] };
- request.pair = { key: keys[i], value: record };
- request.onsuccess = function (event) {
- var cursor = event.target.result;
- if (cursor) {
- cursor.update(event.target.pair.value);
- } else {
- transaction.abort();
- }
- };
- }
- }, error);
- };
-
- // DATAJS INTERNAL START
- odatajs.IndexedDBStore = IndexedDBStore;
- // DATAJS INTERNAL END
-
- // CONTENT END
-})(this);
\ No newline at end of file
[15/22] olingo-odata4-js git commit: [OLINGO-442] Cleanup bevor
release
Posted by ko...@apache.org.
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/src/store-memory.js
----------------------------------------------------------------------
diff --git a/JSLib/src/store-memory.js b/JSLib/src/store-memory.js
deleted file mode 100644
index 467ebc7..0000000
--- a/JSLib/src/store-memory.js
+++ /dev/null
@@ -1,231 +0,0 @@
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
-// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// store-memory.js
-
-(function (window, undefined) {
-
- var datajs = window.odatajs || {};
-
- // Imports.
- var throwErrorCallback = odatajs.throwErrorCallback;
- var delay = odatajs.delay;
-
- // CONTENT START
-
- var MemoryStore = function (name) {
- /// <summary>Constructor for store objects that use a sorted array as the underlying mechanism.</summary>
- /// <param name="name" type="String">Store name.</param>
-
- var holes = [];
- var items = [];
- var keys = {};
-
- this.name = name;
-
- var getErrorCallback = function (error) {
- return error || this.defaultError;
- };
-
- var validateKeyInput = function (key, error) {
- /// <summary>Validates that the specified key is not undefined, not null, and not an array</summary>
- /// <param name="key">Key value.</param>
- /// <param name="error" type="Function">Error callback.</param>
- /// <returns type="Boolean">True if the key is valid. False if the key is invalid and the error callback has been queued for execution.</returns>
-
- var messageString;
-
- if (key instanceof Array) {
- messageString = "Array of keys not supported";
- }
-
- if (key === undefined || key === null) {
- messageString = "Invalid key";
- }
-
- if (messageString) {
- delay(error, { message: messageString });
- return false;
- }
- return true;
- };
-
- this.add = function (key, value, success, error) {
- /// <summary>Adds a new value identified by a key to the store.</summary>
- /// <param name="key" type="String">Key string.</param>
- /// <param name="value">Value that is going to be added to the store.</param>
- /// <param name="success" type="Function" optional="no">Callback for a successful add operation.</param>
- /// <param name="error" type="Function" optional="yes">Callback for handling errors. If not specified then store.defaultError is invoked.</param>
- /// <remarks>
- /// This method errors out if the store already contains the specified key.
- /// </remarks>
-
- error = getErrorCallback(error);
-
- if (validateKeyInput(key, error)) {
- if (!keys.hasOwnProperty(key)) {
- this.addOrUpdate(key, value, success, error);
- } else {
- error({ message: "key already exists", key: key });
- }
- }
- };
-
- this.addOrUpdate = function (key, value, success, error) {
- /// <summary>Adds or updates a value identified by a key to the store.</summary>
- /// <param name="key" type="String">Key string.</param>
- /// <param name="value">Value that is going to be added or updated to the store.</param>
- /// <param name="success" type="Function" optional="no">Callback for a successful add or update operation.</param>
- /// <param name="error" type="Function" optional="yes">Callback for handling errors. If not specified then store.defaultError is invoked.</param>
- /// <remarks>
- /// This method will overwrite the key's current value if it already exists in the store; otherwise it simply adds the new key and value.
- /// </remarks>
-
- error = getErrorCallback(error);
-
- if (validateKeyInput(key, error)) {
- var index = keys[key];
- if (index === undefined) {
- if (holes.length > 0) {
- index = holes.splice(0, 1);
- } else {
- index = items.length;
- }
- }
- items[index] = value;
- keys[key] = index;
- delay(success, key, value);
- }
- };
-
- this.clear = function (success) {
- /// <summary>Removes all the data associated with this store object.</summary>
- /// <param name="success" type="Function" optional="no">Callback for a successful clear operation.</param>
-
- items = [];
- keys = {};
- holes = [];
-
- delay(success);
- };
-
- this.contains = function (key, success) {
- /// <summary>Checks whether a key exists in the store.</summary>
- /// <param name="key" type="String">Key string.</param>
- /// <param name="success" type="Function" optional="no">Callback indicating whether the store contains the key or not.</param>
-
- var contained = keys.hasOwnProperty(key);
- delay(success, contained);
- };
-
- this.getAllKeys = function (success) {
- /// <summary>Gets all the keys that exist in the store.</summary>
- /// <param name="success" type="Function" optional="no">Callback for a successful get operation.</param>
-
- var results = [];
- for (var name in keys) {
- results.push(name);
- }
- delay(success, results);
- };
-
- this.read = function (key, success, error) {
- /// <summary>Reads the value associated to a key in the store.</summary>
- /// <param name="key" type="String">Key string.</param>
- /// <param name="success" type="Function" optional="no">Callback for a successful reads operation.</param>
- /// <param name="error" type="Function" optional="yes">Callback for handling errors. If not specified then store.defaultError is invoked.</param>
- error = getErrorCallback(error);
-
- if (validateKeyInput(key, error)) {
- var index = keys[key];
- delay(success, key, items[index]);
- }
- };
-
- this.remove = function (key, success, error) {
- /// <summary>Removes a key and its value from the store.</summary>
- /// <param name="key" type="String">Key string.</param>
- /// <param name="success" type="Function" optional="no">Callback for a successful remove operation.</param>
- /// <param name="error" type="Function" optional="yes">Callback for handling errors. If not specified then store.defaultError is invoked.</param>
- error = getErrorCallback(error);
-
- if (validateKeyInput(key, error)) {
- var index = keys[key];
- if (index !== undefined) {
- if (index === items.length - 1) {
- items.pop();
- } else {
- items[index] = undefined;
- holes.push(index);
- }
- delete keys[key];
-
- // The last item was removed, no need to keep track of any holes in the array.
- if (items.length === 0) {
- holes = [];
- }
- }
-
- delay(success);
- }
- };
-
- this.update = function (key, value, success, error) {
- /// <summary>Updates the value associated to a key in the store.</summary>
- /// <param name="key" type="String">Key string.</param>
- /// <param name="value">New value.</param>
- /// <param name="success" type="Function" optional="no">Callback for a successful update operation.</param>
- /// <param name="error" type="Function" optional="yes">Callback for handling errors. If not specified then store.defaultError is invoked.</param>
- /// <remarks>
- /// This method errors out if the specified key is not found in the store.
- /// </remarks>
-
- error = getErrorCallback(error);
- if (validateKeyInput(key, error)) {
- if (keys.hasOwnProperty(key)) {
- this.addOrUpdate(key, value, success, error);
- } else {
- error({ message: "key not found", key: key });
- }
- }
- };
- };
-
- MemoryStore.create = function (name) {
- /// <summary>Creates a store object that uses memory storage as its underlying mechanism.</summary>
- /// <param name="name" type="String">Store name.</param>
- /// <returns type="Object">Store object.</returns>
- return new MemoryStore(name);
- };
-
- MemoryStore.isSupported = function () {
- /// <summary>Checks whether the underlying mechanism for this kind of store objects is supported by the browser.</summary>
- /// <returns type="Boolean">True if the mechanism is supported by the browser; otherwise false.</returns>
- return true;
- };
-
- MemoryStore.prototype.close = function () {
- /// <summary>This function does nothing in MemoryStore as it does not have a connection model.</summary>
- };
-
- MemoryStore.prototype.defaultError = throwErrorCallback;
-
- /// <summary>Identifies the underlying mechanism used by the store.</summary>
- MemoryStore.prototype.mechanism = "memory";
-
- // DATAJS INTERNAL START
- odatajs.MemoryStore = MemoryStore;
- // DATAJS INTERNAL END
-
- // CONTENT END
-})(this);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/src/store.js
----------------------------------------------------------------------
diff --git a/JSLib/src/store.js b/JSLib/src/store.js
deleted file mode 100644
index 4db01aa..0000000
--- a/JSLib/src/store.js
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
-// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// store.js
-
-(function (window, undefined) {
-
- var datajs = window.odatajs || {};
-
- var DomStore = odatajs.DomStore;
- var IndexedDBStore = odatajs.IndexedDBStore;
- var MemoryStore = odatajs.MemoryStore;
-
- // CONTENT START
-
- var mechanisms = {
- indexeddb: IndexedDBStore,
- dom: DomStore,
- memory: MemoryStore
- };
-
- odatajs.defaultStoreMechanism = "best";
-
- odatajs.createStore = function (name, mechanism) {
- /// <summary>Creates a new store object.</summary>
- /// <param name="name" type="String">Store name.</param>
- /// <param name="mechanism" type="String" optional="true">A specific mechanism to use (defaults to best, can be "best", "dom", "indexeddb", "webdb").</param>
- /// <returns type="Object">Store object.</returns>
-
- if (!mechanism) {
- mechanism = odatajs.defaultStoreMechanism;
- }
-
- if (mechanism === "best") {
- mechanism = (DomStore.isSupported()) ? "dom" : "memory";
- }
-
- var factory = mechanisms[mechanism];
- if (factory) {
- return factory.create(name);
- }
-
- throw { message: "Failed to create store", name: name, mechanism: mechanism };
- };
-
- // DATAJS INTERNAL START
- odatajs.mechanisms = mechanisms;
- // DATAJS INTERNAL END
-
- // CONTENT END
-})(this);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/src/utils.js
----------------------------------------------------------------------
diff --git a/JSLib/src/utils.js b/JSLib/src/utils.js
deleted file mode 100644
index dab73d3..0000000
--- a/JSLib/src/utils.js
+++ /dev/null
@@ -1,547 +0,0 @@
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
-// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// utils.js
-
-(function (window, undefined) {
-
- var datajs = window.odatajs || {};
-
- // CONTENT START
-
- var activeXObject = function (progId) {
- /// <summary>Creates a new ActiveXObject from the given progId.</summary>
- /// <param name="progId" type="String" mayBeNull="false" optional="false">
- /// ProgId string of the desired ActiveXObject.
- /// </param>
- /// <remarks>
- /// This function throws whatever exception might occur during the creation
- /// of the ActiveXObject.
- /// </remarks>
- /// <returns type="Object">
- /// The ActiveXObject instance. Null if ActiveX is not supported by the
- /// browser.
- /// </returns>
- if (window.ActiveXObject) {
- return new window.ActiveXObject(progId);
- }
- return null;
- };
-
- var assigned = function (value) {
- /// <summary>Checks whether the specified value is different from null and undefined.</summary>
- /// <param name="value" mayBeNull="true" optional="true">Value to check.</param>
- /// <returns type="Boolean">true if the value is assigned; false otherwise.</returns>
- return value !== null && value !== undefined;
- };
-
- var contains = function (arr, item) {
- /// <summary>Checks whether the specified item is in the array.</summary>
- /// <param name="arr" type="Array" optional="false" mayBeNull="false">Array to check in.</param>
- /// <param name="item">Item to look for.</param>
- /// <returns type="Boolean">true if the item is contained, false otherwise.</returns>
-
- var i, len;
- for (i = 0, len = arr.length; i < len; i++) {
- if (arr[i] === item) {
- return true;
- }
- }
-
- return false;
- };
-
- var defined = function (a, b) {
- /// <summary>Given two values, picks the first one that is not undefined.</summary>
- /// <param name="a">First value.</param>
- /// <param name="b">Second value.</param>
- /// <returns>a if it's a defined value; else b.</returns>
- return (a !== undefined) ? a : b;
- };
-
- var delay = function (callback) {
- /// <summary>Delays the invocation of the specified function until execution unwinds.</summary>
- /// <param name="callback" type="Function">Callback function.</param>
- if (arguments.length === 1) {
- window.setTimeout(callback, 0);
- return;
- }
-
- var args = Array.prototype.slice.call(arguments, 1);
- window.setTimeout(function () {
- callback.apply(this, args);
- }, 0);
- };
-
- // DATAJS INTERNAL START
- var djsassert = function (condition, message, data) {
- /// <summary>Throws an exception in case that a condition evaluates to false.</summary>
- /// <param name="condition" type="Boolean">Condition to evaluate.</param>
- /// <param name="message" type="String">Message explaining the assertion.</param>
- /// <param name="data" type="Object">Additional data to be included in the exception.</param>
-
- if (!condition) {
- throw { message: "Assert fired: " + message, data: data };
- };
- };
- // DATAJS INTERNAL END
-
- var extend = function (target, values) {
- /// <summary>Extends the target with the specified values.</summary>
- /// <param name="target" type="Object">Object to add properties to.</param>
- /// <param name="values" type="Object">Object with properties to add into target.</param>
- /// <returns type="Object">The target object.</returns>
-
- for (var name in values) {
- target[name] = values[name];
- }
-
- return target;
- };
-
- var find = function (arr, callback) {
- /// <summary>Returns the first item in the array that makes the callback function true.</summary>
- /// <param name="arr" type="Array" optional="false" mayBeNull="true">Array to check in.</param>
- /// <param name="callback" type="Function">Callback function to invoke once per item in the array.</param>
- /// <returns>The first item that makes the callback return true; null otherwise or if the array is null.</returns>
-
- if (arr) {
- var i, len;
- for (i = 0, len = arr.length; i < len; i++) {
- if (callback(arr[i])) {
- return arr[i];
- }
- }
- }
- return null;
- };
-
- var isArray = function (value) {
- /// <summary>Checks whether the specified value is an array object.</summary>
- /// <param name="value">Value to check.</param>
- /// <returns type="Boolean">true if the value is an array object; false otherwise.</returns>
-
- return Object.prototype.toString.call(value) === "[object Array]";
- };
-
- var isDate = function (value) {
- /// <summary>Checks whether the specified value is a Date object.</summary>
- /// <param name="value">Value to check.</param>
- /// <returns type="Boolean">true if the value is a Date object; false otherwise.</returns>
-
- return Object.prototype.toString.call(value) === "[object Date]";
- };
-
- var isObject = function (value) {
- /// <summary>Tests whether a value is an object.</summary>
- /// <param name="value">Value to test.</param>
- /// <remarks>
- /// Per javascript rules, null and array values are objects and will cause this function to return true.
- /// </remarks>
- /// <returns type="Boolean">True is the value is an object; false otherwise.</returns>
-
- return typeof value === "object";
- };
-
- var parseInt10 = function (value) {
- /// <summary>Parses a value in base 10.</summary>
- /// <param name="value" type="String">String value to parse.</param>
- /// <returns type="Number">The parsed value, NaN if not a valid value.</returns>
-
- return parseInt(value, 10);
- };
-
- var renameProperty = function (obj, oldName, newName) {
- /// <summary>Renames a property in an object.</summary>
- /// <param name="obj" type="Object">Object in which the property will be renamed.</param>
- /// <param name="oldName" type="String">Name of the property that will be renamed.</param>
- /// <param name="newName" type="String">New name of the property.</param>
- /// <remarks>
- /// This function will not do anything if the object doesn't own a property with the specified old name.
- /// </remarks>
-
- if (obj.hasOwnProperty(oldName)) {
- obj[newName] = obj[oldName];
- delete obj[oldName];
- }
- };
-
- var throwErrorCallback = function (error) {
- /// <summary>Default error handler.</summary>
- /// <param name="error" type="Object">Error to handle.</param>
- throw error;
- };
-
- var trimString = function (str) {
- /// <summary>Removes leading and trailing whitespaces from a string.</summary>
- /// <param name="str" type="String" optional="false" mayBeNull="false">String to trim</param>
- /// <returns type="String">The string with no leading or trailing whitespace.</returns>
-
- if (str.trim) {
- return str.trim();
- }
-
- return str.replace(/^\s+|\s+$/g, '');
- };
-
- var undefinedDefault = function (value, defaultValue) {
- /// <summary>Returns a default value in place of undefined.</summary>
- /// <param name="value" mayBeNull="true" optional="true">Value to check.</param>
- /// <param name="defaultValue">Value to return if value is undefined.</param>
- /// <returns>value if it's defined; defaultValue otherwise.</returns>
- /// <remarks>
- /// This should only be used for cases where falsy values are valid;
- /// otherwise the pattern should be 'x = (value) ? value : defaultValue;'.
- /// </remarks>
- return (value !== undefined) ? value : defaultValue;
- };
-
- // Regular expression that splits a uri into its components:
- // 0 - is the matched string.
- // 1 - is the scheme.
- // 2 - is the authority.
- // 3 - is the path.
- // 4 - is the query.
- // 5 - is the fragment.
- var uriRegEx = /^([^:\/?#]+:)?(\/\/[^\/?#]*)?([^?#:]+)?(\?[^#]*)?(#.*)?/;
- var uriPartNames = ["scheme", "authority", "path", "query", "fragment"];
-
- var getURIInfo = function (uri) {
- /// <summary>Gets information about the components of the specified URI.</summary>
- /// <param name="uri" type="String">URI to get information from.</param>
- /// <returns type="Object">
- /// An object with an isAbsolute flag and part names (scheme, authority, etc.) if available.
- /// </returns>
-
- var result = { isAbsolute: false };
-
- if (uri) {
- var matches = uriRegEx.exec(uri);
- if (matches) {
- var i, len;
- for (i = 0, len = uriPartNames.length; i < len; i++) {
- if (matches[i + 1]) {
- result[uriPartNames[i]] = matches[i + 1];
- }
- }
- }
- if (result.scheme) {
- result.isAbsolute = true;
- }
- }
-
- return result;
- };
-
- var getURIFromInfo = function (uriInfo) {
- /// <summary>Builds a URI string from its components.</summary>
- /// <param name="uriInfo" type="Object"> An object with uri parts (scheme, authority, etc.).</param>
- /// <returns type="String">URI string.</returns>
-
- return "".concat(
- uriInfo.scheme || "",
- uriInfo.authority || "",
- uriInfo.path || "",
- uriInfo.query || "",
- uriInfo.fragment || "");
- };
-
- // Regular expression that splits a uri authority into its subcomponents:
- // 0 - is the matched string.
- // 1 - is the userinfo subcomponent.
- // 2 - is the host subcomponent.
- // 3 - is the port component.
- var uriAuthorityRegEx = /^\/{0,2}(?:([^@]*)@)?([^:]+)(?::{1}(\d+))?/;
-
- // Regular expression that matches percentage enconded octects (i.e %20 or %3A);
- var pctEncodingRegEx = /%[0-9A-F]{2}/ig;
-
- var normalizeURICase = function (uri) {
- /// <summary>Normalizes the casing of a URI.</summary>
- /// <param name="uri" type="String">URI to normalize, absolute or relative.</param>
- /// <returns type="String">The URI normalized to lower case.</returns>
-
- var uriInfo = getURIInfo(uri);
- var scheme = uriInfo.scheme;
- var authority = uriInfo.authority;
-
- if (scheme) {
- uriInfo.scheme = scheme.toLowerCase();
- if (authority) {
- var matches = uriAuthorityRegEx.exec(authority);
- if (matches) {
- uriInfo.authority = "//" +
- (matches[1] ? matches[1] + "@" : "") +
- (matches[2].toLowerCase()) +
- (matches[3] ? ":" + matches[3] : "");
- }
- }
- }
-
- uri = getURIFromInfo(uriInfo);
-
- return uri.replace(pctEncodingRegEx, function (str) {
- return str.toLowerCase();
- });
- };
-
- var normalizeURI = function (uri, base) {
- /// <summary>Normalizes a possibly relative URI with a base URI.</summary>
- /// <param name="uri" type="String">URI to normalize, absolute or relative.</param>
- /// <param name="base" type="String" mayBeNull="true">Base URI to compose with.</param>
- /// <returns type="String">The composed URI if relative; the original one if absolute.</returns>
-
- if (!base) {
- return uri;
- }
-
- var uriInfo = getURIInfo(uri);
- if (uriInfo.isAbsolute) {
- return uri;
- }
-
- var baseInfo = getURIInfo(base);
- var normInfo = {};
- var path;
-
- if (uriInfo.authority) {
- normInfo.authority = uriInfo.authority;
- path = uriInfo.path;
- normInfo.query = uriInfo.query;
- } else {
- if (!uriInfo.path) {
- path = baseInfo.path;
- normInfo.query = uriInfo.query || baseInfo.query;
- } else {
- if (uriInfo.path.charAt(0) === '/') {
- path = uriInfo.path;
- } else {
- path = mergeUriPathWithBase(uriInfo.path, baseInfo.path);
- }
- normInfo.query = uriInfo.query;
- }
- normInfo.authority = baseInfo.authority;
- }
-
- normInfo.path = removeDotsFromPath(path);
-
- normInfo.scheme = baseInfo.scheme;
- normInfo.fragment = uriInfo.fragment;
-
- return getURIFromInfo(normInfo);
- };
-
- var mergeUriPathWithBase = function (uriPath, basePath) {
- /// <summary>Merges the path of a relative URI and a base URI.</summary>
- /// <param name="uriPath" type="String>Relative URI path.</param>
- /// <param name="basePath" type="String">Base URI path.</param>
- /// <returns type="String">A string with the merged path.</returns>
-
- var path = "/";
- var end;
-
- if (basePath) {
- end = basePath.lastIndexOf("/");
- path = basePath.substring(0, end);
-
- if (path.charAt(path.length - 1) !== "/") {
- path = path + "/";
- }
- }
-
- return path + uriPath;
- };
-
- var removeDotsFromPath = function (path) {
- /// <summary>Removes the special folders . and .. from a URI's path.</summary>
- /// <param name="path" type="string">URI path component.</param>
- /// <returns type="String">Path without any . and .. folders.</returns>
-
- var result = "";
- var segment = "";
- var end;
-
- while (path) {
- if (path.indexOf("..") === 0 || path.indexOf(".") === 0) {
- path = path.replace(/^\.\.?\/?/g, "");
- } else if (path.indexOf("/..") === 0) {
- path = path.replace(/^\/\..\/?/g, "/");
- end = result.lastIndexOf("/");
- if (end === -1) {
- result = "";
- } else {
- result = result.substring(0, end);
- }
- } else if (path.indexOf("/.") === 0) {
- path = path.replace(/^\/\.\/?/g, "/");
- } else {
- segment = path;
- end = path.indexOf("/", 1);
- if (end !== -1) {
- segment = path.substring(0, end);
- }
- result = result + segment;
- path = path.replace(segment, "");
- }
- }
- return result;
- };
-
- var convertByteArrayToHexString = function (str) {
- var arr = [];
- if (window.atob === undefined) {
- arr = decodeBase64(str);
- } else {
- var binaryStr = window.atob(str);
- for (var i = 0; i < binaryStr.length; i++) {
- arr.push(binaryStr.charCodeAt(i));
- }
- }
- var hexValue = "";
- var hexValues = "0123456789ABCDEF";
- for (var j = 0; j < arr.length; j++) {
- var t = arr[j];
- hexValue += hexValues[t >> 4];
- hexValue += hexValues[t & 0x0F];
- }
- return hexValue;
- };
-
- var decodeBase64 = function (str) {
- var binaryString = "";
- for (var i = 0; i < str.length; i++) {
- var base65IndexValue = getBase64IndexValue(str[i]);
- var binaryValue = "";
- if (base65IndexValue !== null) {
- binaryValue = base65IndexValue.toString(2);
- binaryString += addBase64Padding(binaryValue);
- }
- }
- var byteArray = [];
- var numberOfBytes = parseInt(binaryString.length / 8, 10);
- for (i = 0; i < numberOfBytes; i++) {
- var intValue = parseInt(binaryString.substring(i * 8, (i + 1) * 8), 2);
- byteArray.push(intValue);
- }
- return byteArray;
- };
-
- var getBase64IndexValue = function (character) {
- var asciiCode = character.charCodeAt(0);
- var asciiOfA = 65;
- var differenceBetweenZanda = 6;
- if (asciiCode >= 65 && asciiCode <= 90) { // between "A" and "Z" inclusive
- return asciiCode - asciiOfA;
- } else if (asciiCode >= 97 && asciiCode <= 122) { // between 'a' and 'z' inclusive
- return asciiCode - asciiOfA - differenceBetweenZanda;
- } else if (asciiCode >= 48 && asciiCode <= 57) { // between '0' and '9' inclusive
- return asciiCode + 4;
- } else if (character == "+") {
- return 62;
- } else if (character == "/") {
- return 63;
- } else {
- return null;
- }
- };
-
- var addBase64Padding = function (binaryString) {
- while (binaryString.length < 6) {
- binaryString = "0" + binaryString;
- }
- return binaryString;
- };
-
- var getJsonValueArraryLength = function (data) {
- if (data && data.value) {
- return data.value.length;
- }
-
- return 0;
- };
-
- var sliceJsonValueArray = function (data, start, end) {
- if (data == undefined || data.value == undefined) {
- return data;
- }
-
- if (start < 0) {
- start = 0;
- }
-
- var length = getJsonValueArraryLength(data);
- if (length < end) {
- end = length;
- }
-
- var newdata = {};
- for (var property in data) {
- if (property == "value") {
- newdata[property] = data[property].slice(start, end);
- } else {
- newdata[property] = data[property];
- }
- }
-
- return newdata;
- };
-
- var concatJsonValueArray = function (data, concatData) {
- if (concatData == undefined || concatData.value == undefined) {
- return data;
- }
-
- if (data == undefined || Object.keys(data).length == 0) {
- return concatData;
- }
-
- if (data.value == undefined) {
- data.value = concatData.value;
- return data;
- }
-
- data.value = data.value.concat(concatData.value);
-
- return data;
- };
-
- // DATAJS INTERNAL START
-
- odatajs.activeXObject = activeXObject;
- odatajs.assigned = assigned;
- odatajs.contains = contains;
- odatajs.defined = defined;
- odatajs.delay = delay;
- odatajs.djsassert = djsassert;
- odatajs.extend = extend;
- odatajs.find = find;
- odatajs.getURIInfo = getURIInfo;
- odatajs.isArray = isArray;
- odatajs.isDate = isDate;
- odatajs.isObject = isObject;
- odatajs.normalizeURI = normalizeURI;
- odatajs.normalizeURICase = normalizeURICase;
- odatajs.parseInt10 = parseInt10;
- odatajs.renameProperty = renameProperty;
- odatajs.throwErrorCallback = throwErrorCallback;
- odatajs.trimString = trimString;
- odatajs.undefinedDefault = undefinedDefault;
- odatajs.decodeBase64 = decodeBase64;
- odatajs.convertByteArrayToHexString = convertByteArrayToHexString;
- odatajs.getJsonValueArraryLength = getJsonValueArraryLength;
- odatajs.sliceJsonValueArray = sliceJsonValueArray;
- odatajs.concatJsonValueArray = concatJsonValueArray;
- // DATAJS INTERNAL END
-
- // CONTENT END
-})(this);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/src/xml.js
----------------------------------------------------------------------
diff --git a/JSLib/src/xml.js b/JSLib/src/xml.js
deleted file mode 100644
index d0b315d..0000000
--- a/JSLib/src/xml.js
+++ /dev/null
@@ -1,824 +0,0 @@
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
-// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// xml.js
-
-(function (window, undefined) {
-
- var datajs = window.odatajs;
-
- var activeXObject = odatajs.activeXObject;
- var djsassert = odatajs.djsassert;
- var extend = odatajs.extend;
- var isArray = odatajs.isArray;
- var isObject = odatajs.isObject;
- var normalizeURI = odatajs.normalizeURI;
-
- // CONTENT START
-
- // URI prefixes to generate smaller code.
- var http = "http://";
- var w3org = http + "www.w3.org/"; // http://www.w3.org/
-
- var xhtmlNS = w3org + "1999/xhtml"; // http://www.w3.org/1999/xhtml
- var xmlnsNS = w3org + "2000/xmlns/"; // http://www.w3.org/2000/xmlns/
- var xmlNS = w3org + "XML/1998/namespace"; // http://www.w3.org/XML/1998/namespace
-
- var mozillaParserErroNS = http + "www.mozilla.org/newlayout/xml/parsererror.xml";
-
- var hasLeadingOrTrailingWhitespace = function (text) {
- /// <summary>Checks whether the specified string has leading or trailing spaces.</summary>
- /// <param name="text" type="String">String to check.</param>
- /// <returns type="Boolean">true if text has any leading or trailing whitespace; false otherwise.</returns>
-
- var re = /(^\s)|(\s$)/;
- return re.test(text);
- };
-
- var isWhitespace = function (text) {
- /// <summary>Determines whether the specified text is empty or whitespace.</summary>
- /// <param name="text" type="String">Value to inspect.</param>
- /// <returns type="Boolean">true if the text value is empty or all whitespace; false otherwise.</returns>
-
- var ws = /^\s*$/;
- return text === null || ws.test(text);
- };
-
- var isWhitespacePreserveContext = function (domElement) {
- /// <summary>Determines whether the specified element has xml:space='preserve' applied.</summary>
- /// <param name="domElement">Element to inspect.</param>
- /// <returns type="Boolean">Whether xml:space='preserve' is in effect.</returns>
-
- while (domElement !== null && domElement.nodeType === 1) {
- var val = xmlAttributeValue(domElement, "space", xmlNS);
- if (val === "preserve") {
- return true;
- } else if (val === "default") {
- break;
- } else {
- domElement = domElement.parentNode;
- }
- }
-
- return false;
- };
-
- var isXmlNSDeclaration = function (domAttribute) {
- /// <summary>Determines whether the attribute is a XML namespace declaration.</summary>
- /// <param name="domAttribute">Element to inspect.</param>
- /// <returns type="Boolean">
- /// True if the attribute is a namespace declaration (its name is 'xmlns' or starts with 'xmlns:'; false otherwise.
- /// </returns>
-
- var nodeName = domAttribute.nodeName;
- return nodeName == "xmlns" || nodeName.indexOf("xmlns:") === 0;
- };
-
- var safeSetProperty = function (obj, name, value) {
- /// <summary>Safely set as property in an object by invoking obj.setProperty.</summary>
- /// <param name="obj">Object that exposes a setProperty method.</param>
- /// <param name="name" type="String" mayBeNull="false">Property name.</param>
- /// <param name="value">Property value.</param>
-
- try {
- obj.setProperty(name, value);
- } catch (_) { }
- };
-
- var msXmlDom3 = function () {
- /// <summary>Creates an configures new MSXML 3.0 ActiveX object.</summary>
- /// <remakrs>
- /// This function throws any exception that occurs during the creation
- /// of the MSXML 3.0 ActiveX object.
- /// <returns type="Object">New MSXML 3.0 ActiveX object.</returns>
-
- var msxml3 = activeXObject("Msxml2.DOMDocument.3.0");
- if (msxml3) {
- safeSetProperty(msxml3, "ProhibitDTD", true);
- safeSetProperty(msxml3, "MaxElementDepth", 256);
- safeSetProperty(msxml3, "AllowDocumentFunction", false);
- safeSetProperty(msxml3, "AllowXsltScript", false);
- }
- return msxml3;
- };
-
- var msXmlDom = function () {
- /// <summary>Creates an configures new MSXML 6.0 or MSXML 3.0 ActiveX object.</summary>
- /// <remakrs>
- /// This function will try to create a new MSXML 6.0 ActiveX object. If it fails then
- /// it will fallback to create a new MSXML 3.0 ActiveX object. Any exception that
- /// happens during the creation of the MSXML 6.0 will be handled by the function while
- /// the ones that happend during the creation of the MSXML 3.0 will be thrown.
- /// <returns type="Object">New MSXML 3.0 ActiveX object.</returns>
-
- try {
- var msxml = activeXObject("Msxml2.DOMDocument.6.0");
- if (msxml) {
- msxml.async = true;
- }
- return msxml;
- } catch (_) {
- return msXmlDom3();
- }
- };
-
- var msXmlParse = function (text) {
- /// <summary>Parses an XML string using the MSXML DOM.</summary>
- /// <remakrs>
- /// This function throws any exception that occurs during the creation
- /// of the MSXML ActiveX object. It also will throw an exception
- /// in case of a parsing error.
- /// <returns type="Object">New MSXML DOMDocument node representing the parsed XML string.</returns>
-
- var dom = msXmlDom();
- if (!dom) {
- return null;
- }
-
- dom.loadXML(text);
- var parseError = dom.parseError;
- if (parseError.errorCode !== 0) {
- xmlThrowParserError(parseError.reason, parseError.srcText, text);
- }
- return dom;
- };
-
- var xmlThrowParserError = function (exceptionOrReason, srcText, errorXmlText) {
- /// <summary>Throws a new exception containing XML parsing error information.</summary>
- /// <param name="exceptionOrReason">
- /// String indicatin the reason of the parsing failure or
- /// Object detailing the parsing error.
- /// </param>
- /// <param name="srcText" type="String">
- /// String indicating the part of the XML string that caused the parsing error.
- /// </param>
- /// <param name="errorXmlText" type="String">XML string for wich the parsing failed.</param>
-
- if (typeof exceptionOrReason === "string") {
- exceptionOrReason = { message: exceptionOrReason };
- }
- throw extend(exceptionOrReason, { srcText: srcText || "", errorXmlText: errorXmlText || "" });
- };
-
- var xmlParse = function (text) {
- /// <summary>Returns an XML DOM document from the specified text.</summary>
- /// <param name="text" type="String">Document text.</param>
- /// <returns>XML DOM document.</returns>
- /// <remarks>This function will throw an exception in case of a parse error.</remarks>
-
- var domParser = window.DOMParser && new window.DOMParser();
- var dom;
-
- if (!domParser) {
- dom = msXmlParse(text);
- if (!dom) {
- xmlThrowParserError("XML DOM parser not supported");
- }
- return dom;
- }
-
- try {
- dom = domParser.parseFromString(text, "text/xml");
- } catch (e) {
- xmlThrowParserError(e, "", text);
- }
-
- var element = dom.documentElement;
- var nsURI = element.namespaceURI;
- var localName = xmlLocalName(element);
-
- // Firefox reports errors by returing the DOM for an xml document describing the problem.
- if (localName === "parsererror" && nsURI === mozillaParserErroNS) {
- var srcTextElement = xmlFirstChildElement(element, mozillaParserErroNS, "sourcetext");
- var srcText = srcTextElement ? xmlNodeValue(srcTextElement) : "";
- xmlThrowParserError(xmlInnerText(element) || "", srcText, text);
- }
-
- // Chrome (and maybe other webkit based browsers) report errors by injecting a header with an error message.
- // The error may be localized, so instead we simply check for a header as the
- // top element or descendant child of the document.
- if (localName === "h3" && nsURI === xhtmlNS || xmlFirstDescendantElement(element, xhtmlNS, "h3")) {
- var reason = "";
- var siblings = [];
- var cursor = element.firstChild;
- while (cursor) {
- if (cursor.nodeType === 1) {
- reason += xmlInnerText(cursor) || "";
- }
- siblings.push(cursor.nextSibling);
- cursor = cursor.firstChild || siblings.shift();
- }
- reason += xmlInnerText(element) || "";
- xmlThrowParserError(reason, "", text);
- }
-
- return dom;
- };
-
- var xmlQualifiedName = function (prefix, name) {
- /// <summary>Builds a XML qualified name string in the form of "prefix:name".</summary>
- /// <param name="prefix" type="String" maybeNull="true">Prefix string.</param>
- /// <param name="name" type="String">Name string to qualify with the prefix.</param>
- /// <returns type="String">Qualified name.</returns>
-
- return prefix ? prefix + ":" + name : name;
- };
-
- var xmlAppendText = function (domNode, textNode) {
- /// <summary>Appends a text node into the specified DOM element node.</summary>
- /// <param name="domNode">DOM node for the element.</param>
- /// <param name="text" type="String" mayBeNull="false">Text to append as a child of element.</param>
- if (hasLeadingOrTrailingWhitespace(textNode.data)) {
- var attr = xmlAttributeNode(domNode, xmlNS, "space");
- if (!attr) {
- attr = xmlNewAttribute(domNode.ownerDocument, xmlNS, xmlQualifiedName("xml", "space"));
- xmlAppendChild(domNode, attr);
- }
- attr.value = "preserve";
- }
- domNode.appendChild(textNode);
- return domNode;
- };
-
- var xmlAttributes = function (element, onAttributeCallback) {
- /// <summary>Iterates through the XML element's attributes and invokes the callback function for each one.</summary>
- /// <param name="element">Wrapped element to iterate over.</param>
- /// <param name="onAttributeCallback" type="Function">Callback function to invoke with wrapped attribute nodes.</param>
-
- var attributes = element.attributes;
- var i, len;
- for (i = 0, len = attributes.length; i < len; i++) {
- onAttributeCallback(attributes.item(i));
- }
- };
-
- var xmlAttributeValue = function (domNode, localName, nsURI) {
- /// <summary>Returns the value of a DOM element's attribute.</summary>
- /// <param name="domNode">DOM node for the owning element.</param>
- /// <param name="localName" type="String">Local name of the attribute.</param>
- /// <param name="nsURI" type="String">Namespace URI of the attribute.</param>
- /// <returns type="String" maybeNull="true">The attribute value, null if not found.</returns>
-
- var attribute = xmlAttributeNode(domNode, localName, nsURI);
- return attribute ? xmlNodeValue(attribute) : null;
- };
-
- var xmlAttributeNode = function (domNode, localName, nsURI) {
- /// <summary>Gets an attribute node from a DOM element.</summary>
- /// <param name="domNode">DOM node for the owning element.</param>
- /// <param name="localName" type="String">Local name of the attribute.</param>
- /// <param name="nsURI" type="String">Namespace URI of the attribute.</param>
- /// <returns>The attribute node, null if not found.</returns>
-
- var attributes = domNode.attributes;
- if (attributes.getNamedItemNS) {
- return attributes.getNamedItemNS(nsURI || null, localName);
- }
-
- return attributes.getQualifiedItem(localName, nsURI) || null;
- };
-
- var xmlBaseURI = function (domNode, baseURI) {
- /// <summary>Gets the value of the xml:base attribute on the specified element.</summary>
- /// <param name="domNode">Element to get xml:base attribute value from.</param>
- /// <param name="baseURI" mayBeNull="true" optional="true">Base URI used to normalize the value of the xml:base attribute.</param>
- /// <returns type="String">Value of the xml:base attribute if found; the baseURI or null otherwise.</returns>
-
- var base = xmlAttributeNode(domNode, "base", xmlNS);
- return (base ? normalizeURI(base.value, baseURI) : baseURI) || null;
- };
-
-
- var xmlChildElements = function (domNode, onElementCallback) {
- /// <summary>Iterates through the XML element's child DOM elements and invokes the callback function for each one.</summary>
- /// <param name="element">DOM Node containing the DOM elements to iterate over.</param>
- /// <param name="onElementCallback" type="Function">Callback function to invoke for each child DOM element.</param>
-
- xmlTraverse(domNode, /*recursive*/false, function (child) {
- if (child.nodeType === 1) {
- onElementCallback(child);
- }
- // continue traversing.
- return true;
- });
- };
-
- var xmlFindElementByPath = function (root, namespaceURI, path) {
- /// <summary>Gets the descendant element under root that corresponds to the specified path and namespace URI.</summary>
- /// <param name="root">DOM element node from which to get the descendant element.</param>
- /// <param name="namespaceURI" type="String">The namespace URI of the element to match.</param>
- /// <param name="path" type="String">Path to the desired descendant element.</param>
- /// <returns>The element specified by path and namespace URI.</returns>
- /// <remarks>
- /// All the elements in the path are matched against namespaceURI.
- /// The function will stop searching on the first element that doesn't match the namespace and the path.
- /// </remarks>
-
- var parts = path.split("/");
- var i, len;
- for (i = 0, len = parts.length; i < len; i++) {
- root = root && xmlFirstChildElement(root, namespaceURI, parts[i]);
- }
- return root || null;
- };
-
- var xmlFindNodeByPath = function (root, namespaceURI, path) {
- /// <summary>Gets the DOM element or DOM attribute node under root that corresponds to the specified path and namespace URI.</summary>
- /// <param name="root">DOM element node from which to get the descendant node.</param>
- /// <param name="namespaceURI" type="String">The namespace URI of the node to match.</param>
- /// <param name="path" type="String">Path to the desired descendant node.</param>
- /// <returns>The node specified by path and namespace URI.</returns>
- /// <remarks>
- /// This function will traverse the path and match each node associated to a path segement against the namespace URI.
- /// The traversal stops when the whole path has been exahusted or a node that doesn't belogong the specified namespace is encountered.
- ///
- /// The last segment of the path may be decorated with a starting @ character to indicate that the desired node is a DOM attribute.
- /// </remarks>
-
- var lastSegmentStart = path.lastIndexOf("/");
- var nodePath = path.substring(lastSegmentStart + 1);
- var parentPath = path.substring(0, lastSegmentStart);
-
- var node = parentPath ? xmlFindElementByPath(root, namespaceURI, parentPath) : root;
- if (node) {
- if (nodePath.charAt(0) === "@") {
- return xmlAttributeNode(node, nodePath.substring(1), namespaceURI);
- }
- return xmlFirstChildElement(node, namespaceURI, nodePath);
- }
- return null;
- };
-
- var xmlFirstChildElement = function (domNode, namespaceURI, localName) {
- /// <summary>Returns the first child DOM element under the specified DOM node that matches the specified namespace URI and local name.</summary>
- /// <param name="domNode">DOM node from which the child DOM element is going to be retrieved.</param>
- /// <param name="namespaceURI" type="String" optional="true">The namespace URI of the element to match.</param>
- /// <param name="localName" type="String" optional="true">Name of the element to match.</param>
- /// <returns>The node's first child DOM element that matches the specified namespace URI and local name; null otherwise.</returns>
-
- return xmlFirstElementMaybeRecursive(domNode, namespaceURI, localName, /*recursive*/false);
- };
-
- var xmlFirstDescendantElement = function (domNode, namespaceURI, localName) {
- /// <summary>Returns the first descendant DOM element under the specified DOM node that matches the specified namespace URI and local name.</summary>
- /// <param name="domNode">DOM node from which the descendant DOM element is going to be retrieved.</param>
- /// <param name="namespaceURI" type="String" optional="true">The namespace URI of the element to match.</param>
- /// <param name="localName" type="String" optional="true">Name of the element to match.</param>
- /// <returns>The node's first descendant DOM element that matches the specified namespace URI and local name; null otherwise.</returns>
-
- if (domNode.getElementsByTagNameNS) {
- var result = domNode.getElementsByTagNameNS(namespaceURI, localName);
- return result.length > 0 ? result[0] : null;
- }
- return xmlFirstElementMaybeRecursive(domNode, namespaceURI, localName, /*recursive*/true);
- };
-
- var xmlFirstElementMaybeRecursive = function (domNode, namespaceURI, localName, recursive) {
- /// <summary>Returns the first descendant DOM element under the specified DOM node that matches the specified namespace URI and local name.</summary>
- /// <param name="domNode">DOM node from which the descendant DOM element is going to be retrieved.</param>
- /// <param name="namespaceURI" type="String" optional="true">The namespace URI of the element to match.</param>
- /// <param name="localName" type="String" optional="true">Name of the element to match.</param>
- /// <param name="recursive" type="Boolean">
- /// True if the search should include all the descendants of the DOM node.
- /// False if the search should be scoped only to the direct children of the DOM node.
- /// </param>
- /// <returns>The node's first descendant DOM element that matches the specified namespace URI and local name; null otherwise.</returns>
-
- var firstElement = null;
- xmlTraverse(domNode, recursive, function (child) {
- if (child.nodeType === 1) {
- var isExpectedNamespace = !namespaceURI || xmlNamespaceURI(child) === namespaceURI;
- var isExpectedNodeName = !localName || xmlLocalName(child) === localName;
-
- if (isExpectedNamespace && isExpectedNodeName) {
- firstElement = child;
- }
- }
- return firstElement === null;
- });
- return firstElement;
- };
-
- var xmlInnerText = function (xmlElement) {
- /// <summary>Gets the concatenated value of all immediate child text and CDATA nodes for the specified element.</summary>
- /// <param name="domElement">Element to get values for.</param>
- /// <returns type="String">Text for all direct children.</returns>
-
- var result = null;
- var root = (xmlElement.nodeType === 9 && xmlElement.documentElement) ? xmlElement.documentElement : xmlElement;
- var whitespaceAlreadyRemoved = root.ownerDocument.preserveWhiteSpace === false;
- var whitespacePreserveContext;
-
- xmlTraverse(root, false, function (child) {
- if (child.nodeType === 3 || child.nodeType === 4) {
- // isElementContentWhitespace indicates that this is 'ignorable whitespace',
- // but it's not defined by all browsers, and does not honor xml:space='preserve'
- // in some implementations.
- //
- // If we can't tell either way, we walk up the tree to figure out whether
- // xml:space is set to preserve; otherwise we discard pure-whitespace.
- //
- // For example <a> <b>1</b></a>. The space between <a> and <b> is usually 'ignorable'.
- var text = xmlNodeValue(child);
- var shouldInclude = whitespaceAlreadyRemoved || !isWhitespace(text);
- if (!shouldInclude) {
- // Walk up the tree to figure out whether we are in xml:space='preserve' context
- // for the cursor (needs to happen only once).
- if (whitespacePreserveContext === undefined) {
- whitespacePreserveContext = isWhitespacePreserveContext(root);
- }
-
- shouldInclude = whitespacePreserveContext;
- }
-
- if (shouldInclude) {
- if (!result) {
- result = text;
- } else {
- result += text;
- }
- }
- }
- // Continue traversing?
- return true;
- });
- return result;
- };
-
- var xmlLocalName = function (domNode) {
- /// <summary>Returns the localName of a XML node.</summary>
- /// <param name="domNode">DOM node to get the value from.</param>
- /// <returns type="String">localName of domNode.</returns>
-
- return domNode.localName || domNode.baseName;
- };
-
- var xmlNamespaceURI = function (domNode) {
- /// <summary>Returns the namespace URI of a XML node.</summary>
- /// <param name="node">DOM node to get the value from.</param>
- /// <returns type="String">Namespace URI of domNode.</returns>
-
- return domNode.namespaceURI || null;
- };
-
- var xmlNodeValue = function (domNode) {
- /// <summary>Returns the value or the inner text of a XML node.</summary>
- /// <param name="node">DOM node to get the value from.</param>
- /// <returns>Value of the domNode or the inner text if domNode represents a DOM element node.</returns>
-
- if (domNode.nodeType === 1) {
- return xmlInnerText(domNode);
- }
- return domNode.nodeValue;
- };
-
- var xmlTraverse = function (domNode, recursive, onChildCallback) {
- /// <summary>Walks through the descendants of the domNode and invokes a callback for each node.</summary>
- /// <param name="domNode">DOM node whose descendants are going to be traversed.</param>
- /// <param name="recursive" type="Boolean">
- /// True if the traversal should include all the descenants of the DOM node.
- /// False if the traversal should be scoped only to the direct children of the DOM node.
- /// </param>
- /// <returns type="String">Namespace URI of node.</returns>
-
- var subtrees = [];
- var child = domNode.firstChild;
- var proceed = true;
- while (child && proceed) {
- proceed = onChildCallback(child);
- if (proceed) {
- if (recursive && child.firstChild) {
- subtrees.push(child.firstChild);
- }
- child = child.nextSibling || subtrees.shift();
- }
- }
- };
-
- var xmlSiblingElement = function (domNode, namespaceURI, localName) {
- /// <summary>Returns the next sibling DOM element of the specified DOM node.</summary>
- /// <param name="domNode">DOM node from which the next sibling is going to be retrieved.</param>
- /// <param name="namespaceURI" type="String" optional="true">The namespace URI of the element to match.</param>
- /// <param name="localName" type="String" optional="true">Name of the element to match.</param>
- /// <returns>The node's next sibling DOM element, null if there is none.</returns>
-
- var sibling = domNode.nextSibling;
- while (sibling) {
- if (sibling.nodeType === 1) {
- var isExpectedNamespace = !namespaceURI || xmlNamespaceURI(sibling) === namespaceURI;
- var isExpectedNodeName = !localName || xmlLocalName(sibling) === localName;
-
- if (isExpectedNamespace && isExpectedNodeName) {
- return sibling;
- }
- }
- sibling = sibling.nextSibling;
- }
- return null;
- };
-
- var xmlDom = function () {
- /// <summary>Creates a new empty DOM document node.</summary>
- /// <returns>New DOM document node.</returns>
- /// <remarks>
- /// This function will first try to create a native DOM document using
- /// the browsers createDocument function. If the browser doesn't
- /// support this but supports ActiveXObject, then an attempt to create
- /// an MSXML 6.0 DOM will be made. If this attempt fails too, then an attempt
- /// for creating an MXSML 3.0 DOM will be made. If this last attemp fails or
- /// the browser doesn't support ActiveXObject then an exception will be thrown.
- /// </remarks>
-
- var implementation = window.document.implementation;
- return (implementation && implementation.createDocument) ?
- implementation.createDocument(null, null, null) :
- msXmlDom();
- };
-
- var xmlAppendChildren = function (parent, children) {
- /// <summary>Appends a collection of child nodes or string values to a parent DOM node.</summary>
- /// <param name="parent">DOM node to which the children will be appended.</param>
- /// <param name="children" type="Array">Array containing DOM nodes or string values that will be appended to the parent.</param>
- /// <returns>The parent with the appended children or string values.</returns>
- /// <remarks>
- /// If a value in the children collection is a string, then a new DOM text node is going to be created
- /// for it and then appended to the parent.
- /// </remarks>
-
- if (!isArray(children)) {
- return xmlAppendChild(parent, children);
- }
-
- var i, len;
- for (i = 0, len = children.length; i < len; i++) {
- children[i] && xmlAppendChild(parent, children[i]);
- }
- return parent;
- };
-
- var xmlAppendChild = function (parent, child) {
- /// <summary>Appends a child node or a string value to a parent DOM node.</summary>
- /// <param name="parent">DOM node to which the child will be appended.</param>
- /// <param name="child">Child DOM node or string value to append to the parent.</param>
- /// <returns>The parent with the appended child or string value.</returns>
- /// <remarks>
- /// If child is a string value, then a new DOM text node is going to be created
- /// for it and then appended to the parent.
- /// </remarks>
-
- djsassert(parent !== child, "xmlAppendChild() - parent and child are one and the same!");
- if (child) {
- if (typeof child === "string") {
- return xmlAppendText(parent, xmlNewText(parent.ownerDocument, child));
- }
- if (child.nodeType === 2) {
- parent.setAttributeNodeNS ? parent.setAttributeNodeNS(child) : parent.setAttributeNode(child);
- } else {
- parent.appendChild(child);
- }
- }
- return parent;
- };
-
- var xmlNewAttribute = function (dom, namespaceURI, qualifiedName, value) {
- /// <summary>Creates a new DOM attribute node.</summary>
- /// <param name="dom">DOM document used to create the attribute.</param>
- /// <param name="prefix" type="String">Namespace prefix.</param>
- /// <param name="namespaceURI" type="String">Namespace URI.</param>
- /// <returns>DOM attribute node for the namespace declaration.</returns>
-
- var attribute =
- dom.createAttributeNS && dom.createAttributeNS(namespaceURI, qualifiedName) ||
- dom.createNode(2, qualifiedName, namespaceURI || undefined);
-
- attribute.value = value || "";
- return attribute;
- };
-
- var xmlNewElement = function (dom, nampespaceURI, qualifiedName, children) {
- /// <summary>Creates a new DOM element node.</summary>
- /// <param name="dom">DOM document used to create the DOM element.</param>
- /// <param name="namespaceURI" type="String">Namespace URI of the new DOM element.</param>
- /// <param name="qualifiedName" type="String">Qualified name in the form of "prefix:name" of the new DOM element.</param>
- /// <param name="children" type="Array" optional="true">
- /// Collection of child DOM nodes or string values that are going to be appended to the new DOM element.
- /// </param>
- /// <returns>New DOM element.</returns>
- /// <remarks>
- /// If a value in the children collection is a string, then a new DOM text node is going to be created
- /// for it and then appended to the new DOM element.
- /// </remarks>
-
- var element =
- dom.createElementNS && dom.createElementNS(nampespaceURI, qualifiedName) ||
- dom.createNode(1, qualifiedName, nampespaceURI || undefined);
-
- return xmlAppendChildren(element, children || []);
- };
-
- var xmlNewNSDeclaration = function (dom, namespaceURI, prefix) {
- /// <summary>Creates a namespace declaration attribute.</summary>
- /// <param name="dom">DOM document used to create the attribute.</param>
- /// <param name="namespaceURI" type="String">Namespace URI.</param>
- /// <param name="prefix" type="String">Namespace prefix.</param>
- /// <returns>DOM attribute node for the namespace declaration.</returns>
-
- return xmlNewAttribute(dom, xmlnsNS, xmlQualifiedName("xmlns", prefix), namespaceURI);
- };
-
- var xmlNewFragment = function (dom, text) {
- /// <summary>Creates a new DOM document fragment node for the specified xml text.</summary>
- /// <param name="dom">DOM document from which the fragment node is going to be created.</param>
- /// <param name="text" type="String" mayBeNull="false">XML text to be represented by the XmlFragment.</param>
- /// <returns>New DOM document fragment object.</returns>
-
- var value = "<c>" + text + "</c>";
- var tempDom = xmlParse(value);
- var tempRoot = tempDom.documentElement;
- var imported = ("importNode" in dom) ? dom.importNode(tempRoot, true) : tempRoot;
- var fragment = dom.createDocumentFragment();
-
- var importedChild = imported.firstChild;
- while (importedChild) {
- fragment.appendChild(importedChild);
- importedChild = importedChild.nextSibling;
- }
- return fragment;
- };
-
- var xmlNewText = function (dom, text) {
- /// <summary>Creates new DOM text node.</summary>
- /// <param name="dom">DOM document used to create the text node.</param>
- /// <param name="text" type="String">Text value for the DOM text node.</param>
- /// <returns>DOM text node.</returns>
-
- return dom.createTextNode(text);
- };
-
- var xmlNewNodeByPath = function (dom, root, namespaceURI, prefix, path) {
- /// <summary>Creates a new DOM element or DOM attribute node as specified by path and appends it to the DOM tree pointed by root.</summary>
- /// <param name="dom">DOM document used to create the new node.</param>
- /// <param name="root">DOM element node used as root of the subtree on which the new nodes are going to be created.</param>
- /// <param name="namespaceURI" type="String">Namespace URI of the new DOM element or attribute.</param>
- /// <param name="namespacePrefix" type="String">Prefix used to qualify the name of the new DOM element or attribute.</param>
- /// <param name="Path" type="String">Path string describing the location of the new DOM element or attribute from the root element.</param>
- /// <returns>DOM element or attribute node for the last segment of the path.</returns>
- /// <remarks>
- /// This function will traverse the path and will create a new DOM element with the specified namespace URI and prefix
- /// for each segment that doesn't have a matching element under root.
- ///
- /// The last segment of the path may be decorated with a starting @ character. In this case a new DOM attribute node
- /// will be created.
- /// </remarks>
-
- var name = "";
- var parts = path.split("/");
- var xmlFindNode = xmlFirstChildElement;
- var xmlNewNode = xmlNewElement;
- var xmlNode = root;
-
- var i, len;
- for (i = 0, len = parts.length; i < len; i++) {
- name = parts[i];
- if (name.charAt(0) === "@") {
- name = name.substring(1);
- xmlFindNode = xmlAttributeNode;
- xmlNewNode = xmlNewAttribute;
- }
-
- var childNode = xmlFindNode(xmlNode, namespaceURI, name);
- if (!childNode) {
- childNode = xmlNewNode(dom, namespaceURI, xmlQualifiedName(prefix, name));
- xmlAppendChild(xmlNode, childNode);
- }
- xmlNode = childNode;
- }
- return xmlNode;
- };
-
- var xmlSerialize = function (domNode) {
- /// <summary>
- /// Returns the text representation of the document to which the specified node belongs.
- /// </summary>
- /// <param name="root">Wrapped element in the document to serialize.</param>
- /// <returns type="String">Serialized document.</returns>
-
- var xmlSerializer = window.XMLSerializer;
- if (xmlSerializer) {
- var serializer = new xmlSerializer();
- return serializer.serializeToString(domNode);
- }
-
- if (domNode.xml) {
- return domNode.xml;
- }
-
- throw { message: "XML serialization unsupported" };
- };
-
- var xmlSerializeDescendants = function (domNode) {
- /// <summary>Returns the XML representation of the all the descendants of the node.</summary>
- /// <param name="domNode" optional="false" mayBeNull="false">Node to serialize.</param>
- /// <returns type="String">The XML representation of all the descendants of the node.</returns>
-
- var children = domNode.childNodes;
- var i, len = children.length;
- if (len === 0) {
- return "";
- }
-
- // Some implementations of the XMLSerializer don't deal very well with fragments that
- // don't have a DOMElement as their first child. The work around is to wrap all the
- // nodes in a dummy root node named "c", serialize it and then just extract the text between
- // the <c> and the </c> substrings.
-
- var dom = domNode.ownerDocument;
- var fragment = dom.createDocumentFragment();
- var fragmentRoot = dom.createElement("c");
-
- fragment.appendChild(fragmentRoot);
- // Move the children to the fragment tree.
- for (i = 0; i < len; i++) {
- fragmentRoot.appendChild(children[i]);
- }
-
- var xml = xmlSerialize(fragment);
- xml = xml.substr(3, xml.length - 7);
-
- // Move the children back to the original dom tree.
- for (i = 0; i < len; i++) {
- domNode.appendChild(fragmentRoot.childNodes[i]);
- }
-
- return xml;
- };
-
- var xmlSerializeNode = function (domNode) {
- /// <summary>Returns the XML representation of the node and all its descendants.</summary>
- /// <param name="domNode" optional="false" mayBeNull="false">Node to serialize.</param>
- /// <returns type="String">The XML representation of the node and all its descendants.</returns>
-
- var xml = domNode.xml;
- if (xml !== undefined) {
- return xml;
- }
-
- if (window.XMLSerializer) {
- var serializer = new window.XMLSerializer();
- return serializer.serializeToString(domNode);
- }
-
- throw { message: "XML serialization unsupported" };
- };
-
- // DATAJS INTERNAL START
-
- odatajs.http = http;
- odatajs.w3org = w3org;
- odatajs.xmlNS = xmlNS;
- odatajs.xmlnsNS = xmlnsNS;
-
- odatajs.hasLeadingOrTrailingWhitespace = hasLeadingOrTrailingWhitespace;
- odatajs.isXmlNSDeclaration = isXmlNSDeclaration;
- odatajs.xmlAppendChild = xmlAppendChild;
- odatajs.xmlAppendChildren = xmlAppendChildren;
- odatajs.xmlAttributeNode = xmlAttributeNode;
- odatajs.xmlAttributes = xmlAttributes;
- odatajs.xmlAttributeValue = xmlAttributeValue;
- odatajs.xmlBaseURI = xmlBaseURI;
- odatajs.xmlChildElements = xmlChildElements;
- odatajs.xmlFindElementByPath = xmlFindElementByPath;
- odatajs.xmlFindNodeByPath = xmlFindNodeByPath;
- odatajs.xmlFirstChildElement = xmlFirstChildElement;
- odatajs.xmlFirstDescendantElement = xmlFirstDescendantElement;
- odatajs.xmlInnerText = xmlInnerText;
- odatajs.xmlLocalName = xmlLocalName;
- odatajs.xmlNamespaceURI = xmlNamespaceURI;
- odatajs.xmlNodeValue = xmlNodeValue;
- odatajs.xmlDom = xmlDom;
- odatajs.xmlNewAttribute = xmlNewAttribute;
- odatajs.xmlNewElement = xmlNewElement;
- odatajs.xmlNewFragment = xmlNewFragment;
- odatajs.xmlNewNodeByPath = xmlNewNodeByPath;
- odatajs.xmlNewNSDeclaration = xmlNewNSDeclaration;
- odatajs.xmlNewText = xmlNewText;
- odatajs.xmlParse = xmlParse;
- odatajs.xmlQualifiedName = xmlQualifiedName;
- odatajs.xmlSerialize = xmlSerialize;
- odatajs.xmlSerializeDescendants = xmlSerializeDescendants;
- odatajs.xmlSiblingElement = xmlSiblingElement;
-
- // DATAJS INTERNAL END
-
- // CONTENT END
-})(this);
\ No newline at end of file
[11/22] olingo-odata4-js git commit: [OLINGO-442] Cleanup bevor
release
Posted by ko...@apache.org.
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/common/djstest.js
----------------------------------------------------------------------
diff --git a/JSLib/tests/common/djstest.js b/JSLib/tests/common/djstest.js
deleted file mode 100644
index b9df624..0000000
--- a/JSLib/tests/common/djstest.js
+++ /dev/null
@@ -1,409 +0,0 @@
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
-// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-(function (window, undefined) {
- var djstest = {};
-
- window.djstest = djstest;
-
- djstest.indexedDB = window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB || window.indexedDB;
-
- djstest.cleanStoreOnIndexedDb = function (storeObjects, done) {
- /// <summary>Cleans all the test data saved in the IndexedDb database.</summary>
- /// <param name="storeNames" type="Array">Array of store objects with a property that is the name of the store</param>
- /// <param name="done" type="Function">Callback function</param>
-
- var IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction || {};
-
- var deleteObjectStores = function (db) {
- $.each(db.objectStoreNames, function (_, storeName) {
- db.deleteObjectStore(storeName);
- });
- };
-
- if (djstest.indexedDB) {
- var job = new djstest.Job();
- $.each(storeObjects, function (_, storeObject) {
- job.queue((function (storeObject) {
- return function (success, fail) {
- var dbname = "_datajs_" + storeObject.name;
- var request = djstest.indexedDB.open(dbname);
- request.onsuccess = function (event) {
- var db = request.result;
-
- if ("setVersion" in db) {
- var versionRequest = db.setVersion("0.1");
- versionRequest.onsuccess = function (event) {
- var transaction = versionRequest.transaction;
- transaction.oncomplete = function () {
- db.close();
- success();
- }
- deleteObjectStores(db);
- };
- versionRequest.onerror = function (e) {
- djstest.fail("Error on cleanup - code: " + e.code + " name: " + e.name + "message: " + message);
- fail();
- };
- return;
- }
-
- // new api cleanup
- db.close();
- var deleteRequest = djstest.indexedDB.deleteDatabase(dbname);
- deleteRequest.onsuccess = function (event) {
- djstest.log("djstest indexeddb cleanup - deleted database " + dbname);
- success();
- };
- deleteRequest.onerror = function (e) {
- djstest.fail("djstest indexeddb cleanup - error deleting database " + dbname);
- fail();
- };
- djstest.log("djstest indexeddb cleanup - requested deletion of database " + dbname);
- };
-
- request.onerror = function (e) {
- djstest.fail(e.code + ": " + e.message);
- };
- };
- })(storeObject));
- });
- }
-
- if (job) {
- job.run(function (succeeded) {
- if (!succeeded) {
- djstest.fail("cleanup job failed");
- }
- done();
- });
- }
- else {
- done();
- }
- };
-
- djstest.Job = function () {
- /// <summary>Constructs a Job object that allows for enqueuing and synchronizing the execution of functions.</summary>
- /// <returns type="Object">Job object</returns>
- var currentTask = -1;
- var tasks = [];
-
- var failedTasks = 0;
-
- this.queue = function (fn) {
- /// <summary>Adds a function to the job queue regardless if the queue is already executing or not.</summary>
- /// <param name="fn" type="Function">Function to execute.</param>
- tasks.push(fn);
- };
-
- this.queueNext = function (fn) {
- /// <summary>Adds a function to the front of the job queue regardless if the queue is already executing or not.</summary>
- /// <param name="fn" type="Function">Function to execute.</param>
- if (currentTask < 0) {
- tasks.unshift(fn);
- } else {
- tasks.splice(currentTask + 1, 0, fn);
- }
- };
-
- this.run = function (done) {
- /// <summary>Starts the execution of this job.</summary>
- /// <param name="done" type="Function">Callback invoked when the job has finished executing all of its enqueued tasks.</param>
- /// <remarks>
- /// This method does nothing if called on a unit of work that is already executing.
- /// </remarks>
-
- if (currentTask >= 0) {
- return;
- }
-
- if (tasks.length === 0) {
- done(true);
- return;
- }
-
- var makeTaskDoneCallBack = function (failed) {
- return function () {
- // Track the failed task and continue the execution of the job.
- if (failed) {
- failedTasks++;
- }
- currentTask++;
- if (currentTask === tasks.length) {
- done(failedTasks === 0);
- } else {
- runNextTask();
- }
- };
- };
-
- var runNextTask = function () {
- /// <summary>Executes the next function in the queue.</summary>
- defer(function () {
- try {
- tasks[currentTask](makeTaskDoneCallBack(false), makeTaskDoneCallBack(true));
- } catch (e) {
- makeTaskDoneCallBack(true)();
- }
- });
- };
-
- currentTask = 0;
- runNextTask();
- };
- };
-
- var defer = function (fn) {
- /// <summary>Defers the execution of an arbitrary function that takes no parameters.</summary>
- /// <param name="fn" type="Function">Function to schedule for later execution.</param>
- setTimeout(fn, 0);
- }
-
- var exposeDateValues = function (data) {
- /// <summary>Exposes date values for Date objects to facilitate debugging</summary>
- /// <param name="data" type="Object">The object to operate on</param>
- if (typeof data === "object") {
- if (data instanceof Date) {
- data["__date__"] = data.toUTCString();
- }
- else {
- for (var prop in data) {
- exposeDateValues(data[prop]);
- }
- }
- }
-
- return data;
- }
-
- var extractFunctionName = function (text) {
- /// <summary>Determines the name of a function.</summary>
- /// <param name="text" type="String">Function text.</param>
- /// <returns type="String">The name of the function from text if found; the original text otherwise.</returns>
-
- var index = text.indexOf("function ");
- if (index < 0) {
- return text;
- }
-
- var nameStart = index + "function ".length;
- var parensIndex = text.indexOf("(", nameStart);
- if (parensIndex < 0) {
- return text;
- }
-
- var result = text.substr(nameStart, parensIndex - nameStart);
- if (result.indexOf("test") === 0) {
- result = result.substr("test".length);
- }
-
- return result;
- };
-
- var removeMetadata = function (data) {
- /// <summary>Removes metadata annotations from the specified object.</summary>
- /// <param name="data">Object to remove metadata from; possibly null.</param>
-
- if (typeof data === "object" && data !== null) {
- delete data["__metadata"];
- for (prop in data) {
- removeMetadata(data[prop]);
- }
- }
- };
-
- djstest.addFullTest = function (disable, fn, name, arg, timeout) {
- /// <summary>Add the unit test cases</summary>
- /// <param name="disable">Indicate whether this test case should be disabled</param>
- if (disable != true) {
- djstest.addTest(fn, name, arg, timeout);
- }
- };
-
-
- djstest.addTest = function (fn, name, arg, timeout) {
- if (!name) {
- name = extractFunctionName(fn.toString());
- }
-
- test(name, function () {
- if (!timeout) {
- timeout = 20000;
- }
-
- QUnit.config.testTimeout = timeout;
- QUnit.stop();
- fn.call(this, arg);
- });
- };
-
- djstest.assert = function (test, message) {
- /// <summary>Asserts that a condition is true.</summary>
- /// <param name="test" type="Boolean">Condition to test.</param>
- /// <param name="message" type="String">Text message for condition being tested.</param>
- QUnit.ok(test, message);
- };
-
- djstest.assertAreEqual = function (actual, expected, message) {
- /// <summary>Asserts that the values of the expected and actualobjects are equal.</summary>
- QUnit.equal(actual, expected, message);
- };
-
- djstest.assertAreEqualDeep = function (actual, expected, message) {
- /// <summary>Asserts that the actual and expected objects are the same.</summary>
- QUnit.deepEqual(exposeDateValues(actual), exposeDateValues(expected), message);
- };
-
- djstest.assertWithoutMetadata = function (actual, expected, message) {
- removeMetadata(actual)
- removeMetadata(expected);
- djstest.assertAreEqualDeep(actual, expected, message);
- };
-
- djstest.asyncDo = function (asyncActions, done) {
- /// <summary>Calls each async action in asyncActions, passing each action a function which keeps a count and
- /// calls the passed done function when all async actions complete.</summary>
- /// <param name="asyncActions" type="Array">Array of asynchronous actions to be executed,
- /// each taking a single parameter - the callback function to call when the action is done.</param>
- /// <param name="done" type="Function">Function to be executed in the last async action to complete.</param>
- var count = 0;
- var doneOne = function () {
- count++;
- if (count >= asyncActions.length) {
- done();
- }
- };
-
- if (asyncActions.length > 0) {
- $.each(asyncActions, function (_, asyncAction) {
- asyncAction(doneOne);
- });
- } else {
- done();
- }
- }
-
- djstest.clone = function (object) {
- /// <summary>Makes a deep copy of an object.</summary>
- return $.extend(true, {}, object);
- };
-
- djstest.destroyCacheAndDone = function (cache) {
- /// <summary>Destroys the cache and then completes the test</summary>
- /// <param name="cache">The cache to destroy</param>
- cache.clear().then(function () {
- djstest.done();
- }, function (err) {
- djstest.fail("Failed to destroy cache: " + djstest.toString(err));
- djstest.done();
- });
- };
-
- djstest.done = function () {
- /// <summary>Indicates that the currently running test has finished.</summary>
- QUnit.start();
- };
-
- djstest.expectException = function (testFunction, message) {
- /// <summary>Test passes if and only if an exception is thrown.</summary>
- try {
- testFunction();
- djstest.fail("Expected exception but function succeeded: " + " " + message);
- }
- catch (e) {
- // Swallow exception.
- djstest.pass("Thrown exception expected");
- }
- };
-
- djstest.assertsExpected = function (asserts) {
- /// <summary>Indicates the expected number of asserts, fails test if number is not met.</summary>
- /// <param name="asserts" type="Number">Number of asserts expected in test.</param>
- expect(asserts);
- }
-
- djstest.fail = function (message) {
- /// <summary>Marks the current test as failed.</summary>
- /// <param name="message" type="String">Failure message.</param>
- QUnit.ok(false, message);
- };
-
- djstest.failAndDoneCallback = function (message, cleanupCallback) {
- /// <summary>Returns a function that when invoked will fail this test and be done with it.</summary>
- /// <param name="message" type="String">Failure message.</param>
- /// <param name="cleanupCallback" type="Function" optional="true">Optional cleanup function in case of failure.</param>
- /// <returns type="Function">A new function.</returns>
-
- return function (err) {
- message = "" + message + (err) ? window.JSON.stringify(err) : "";
- djstest.fail(message);
- if (cleanupCallback) {
- try {
- cleanupCallback();
- } catch (e) {
- djstest.fail("error during cleanupCallback: " + window.JSON.stringify(e));
- }
- }
-
- djstest.done();
- };
- };
-
- djstest.log = function (message) {
- /// <summary>Logs a test message.</summary>
- /// <param name="message" type="String">Test message.</param>
- var context = { result: true, actual: true, expected: true, message: message };
- QUnit.log(context);
- };
-
- djstest.pass = function (message) {
- /// <summary>Marks the current test as failed.</summary>
- /// <param name="message" type="String">Failure message.</param>
- QUnit.ok(true, message);
- };
-
- djstest.toString = function (obj) {
- /// <summary>Dumps the object as a string</summary>
- /// <param name="obj" type="Object">Object to dump</param>
- return QUnit.jsDump.parse(obj);
- };
-
- djstest.wait = function (fn) {
- /// <summary>Executes the function, pausing test execution until the callback is called</summary>
- /// <param name="fn" type="Function">Function to execute; takes one parameter which is the callback</param>
- /// <remarks>This function is typically used in asynchronous setup/teardown methods</remarks>
- QUnit.stop();
- fn(function () {
- QUnit.start();
- });
- };
-
- // Disable caching to ensure that every test-related AJAX request is actually being sent,
- // and set up a default error handler
- $.ajaxSetup({
- cache: false,
- error: function (jqXHR, textStatus, errorThrown) {
- // Work around bug in IE-Mobile on Windows Phone 7
- if (jqXHR.status !== 1223) {
- var err = {
- status: jqXHR.status,
- statusText: jqXHR.statusText,
- responseText: jqXHR.responseText
- };
- djstest.fail("AJAX request failed with: " + djstest.toString(err));
- }
- djstest.done();
- }
- });
-})(window);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/common/gpo-ie8-tour-disable.reg
----------------------------------------------------------------------
diff --git a/JSLib/tests/common/gpo-ie8-tour-disable.reg b/JSLib/tests/common/gpo-ie8-tour-disable.reg
deleted file mode 100644
index 52dfd99..0000000
Binary files a/JSLib/tests/common/gpo-ie8-tour-disable.reg and /dev/null differ
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/common/mockHttpClient.js
----------------------------------------------------------------------
diff --git a/JSLib/tests/common/mockHttpClient.js b/JSLib/tests/common/mockHttpClient.js
deleted file mode 100644
index de2a69c..0000000
--- a/JSLib/tests/common/mockHttpClient.js
+++ /dev/null
@@ -1,107 +0,0 @@
-//mockHttpClient.js
-//this object allows for associating a uri with a requestVerfier and mock responses that will be sent back to the client of the httpStack.
-//It can be used to replace OData's httpClient for testing purposes.
-//
-//RequestVerifiers
-//
-// A request verifier is a function associated to a particular URI that will be executed by the mockHttpClient when it receives a request with the matching URI.
-// the callback receives as its only parameter the request object passed to the mockHttpClient.
-//
-// To register a request verifier, simply do
-//
-// MockHttpClient.addRequestVerifier("http://someUri", function(request) {
-// djstest.assertAreEqual(request.requestUri,"http://someUri");
-// }
-//
-//Responses
-// Mock responses can be associated with a particular URI. When the MockHttpClient receives a request with a URI mapped to a response, then it will,
-// depending on the response status code invoke either the success or the error callbacks.
-//
-// To register a response,
-//
-// MockHttpClient.addResponse("http://someUri", {status: 200, body:"some body"});
-//
-//Exceptions
-// MockHttpClient will throw an exception if it receives a request to a URI that is not mapped to either a request verifier or a response.
-//
-
-(function (window, undefined) {
- if (!window.MockHttpClient) {
- window.MockHttpClient = {};
- }
-
- var httpClient = window.MockHttpClient;
-
- var responses = {};
- var requestVerifiers = {};
-
- httpClient.addRequestVerifier = function (uri, verifier) {
- requestVerifiers[uri] = verifier;
- return this;
- };
-
- httpClient.addResponse = function (uri, response) {
- responses[uri] = response;
- return this;
- };
-
- httpClient.async = false;
-
- httpClient.clear = function () {
- /// <summary>Clears all registered responses and verifiers.</summary>
- /// <returns>this client.</returns>
- responses = {};
- requestVerifiers = {};
- this.async = false;
- return this;
- };
-
- httpClient.request = function (request, success, error) {
- var uri = request.requestUri;
- var verifier = requestVerifiers[uri];
- var response = responses[uri];
-
- if (verifier === undefined) {
- verifier = requestVerifiers["*"];
- }
-
- if (response === undefined) {
- response = responses["*"];
- }
-
- if (!verifier && !response) {
- throw { message: "neither verifier or response defined for uri: " + uri };
- }
-
- if (verifier) {
- verifier(request);
- }
-
- if (response) {
- response.requestUri = uri;
- if (response.statusCode >= 200 && response.statusCode <= 299) {
- if (this.async) {
- setTimeout(function () {
- success(response);
- });
- } else {
- success(response);
- }
- } else {
- if (this.async) {
- setTimeout(function () {
- error({ message: "failed test response", request: request, response: response });
- });
- }
- else {
- error({ message: "failed test response", request: request, response: response });
- }
- }
- }
- };
-
- httpClient.setAsync = function (value) {
- this.async = value;
- return this;
- };
-})(this);
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/common/mockXMLHttpRequest.js
----------------------------------------------------------------------
diff --git a/JSLib/tests/common/mockXMLHttpRequest.js b/JSLib/tests/common/mockXMLHttpRequest.js
deleted file mode 100644
index 2615e55..0000000
--- a/JSLib/tests/common/mockXMLHttpRequest.js
+++ /dev/null
@@ -1,192 +0,0 @@
-// mockXMLHttpRequest.js
-//
-// This file provides a window.MockXMLHttpRequest object that can be used
-// to replace or wrap the browser's XMLHttpRequest object for testing.
-//
-// Typically the object is installed, a test run, and then the original
-// object restored. The addResponse and addRequest verifier can be
-// used to set up callbacks; reset is used to clear those values.
-//
-// For a sample demonstrating how to use this functionality, see
-// the httpClientSendRequestTest test in odata-net-tests.js.
-
-(function (window, undefined) {
-
- if (!window.MockXMLHttpRequest) {
- window.MockXMLHttpRequest = {};
- }
-
- var mockXMLHttpRequest = window.MockXMLHttpRequest;
-
- var responses = {};
- var verifiers = {};
-
- mockXMLHttpRequest.addResponse = function (uri, response) {
- /// <summary>Adds a new response to be returned for the specified uri (* for 'anything').</summary>
- /// <param name="uri" type="String">URI to match (* to match anything not otherwise specified).</param>
- /// <param name="response" type="Object">Response object.</param>
- responses = responses || {};
- responses[uri] = response;
-
- return this;
- };
-
- mockXMLHttpRequest.addRequestVerifier = function (uri, verifier) {
- /// <summary>Adds a new request verifier to be invoked for the specified uri (* for 'anything').</summary>
- /// <param name="uri" type="String">URI to match (* to match anything not otherwise specified).</param>
- /// <param name="response" type="Function">Verifier callback that takes the request.</param>
-
- verifiers = verifiers || {};
- verifiers[uri] = verifier;
-
- return this;
- };
-
- mockXMLHttpRequest.reset = function () {
- /// <summary>Resets all configuration from the mock XHR object.</summary>
-
- responses = {};
- verifiers = {};
-
- mockXMLHttpRequest.onCreate = undefined;
- mockXMLHttpRequest.onAfterSend = undefined;
-
- return this;
- };
-
- var xmlHttpRequest = function () {
- //properties
- this.readyState = 0;
- this.responseXML = undefined;
-
- //events
- this.ontimeout = undefined;
- this.onreadystatechange = undefined;
-
- if (mockXMLHttpRequest.onCreate) {
- mockXMLHttpRequest.onCreate(this);
- }
- };
-
- xmlHttpRequest.prototype.open = function (method, url, async, user, password) {
- if (!method) {
- throw { method: "method parameter is not defined, empty, or null " };
- }
- if (!url) {
- throw { message: "url parameter is not defined, empty, or null " };
- }
-
- this._request = {
- headers: {},
- url: url,
- method: method,
- async: async,
- user: user,
- password: password
- };
- };
-
- xmlHttpRequest.prototype.getAllResponseHeaders = function () {
- if (!this._response) {
- throw { message: "_response property is undefined, did you forget to call send() or map the request url to a response?" };
- }
-
- var result = "";
- var header;
- for (header in this._response.headers) {
- result = result + header + ": " + this._response.headers[header] + "\n\r";
- }
- //remove trailing LFCR
- return result.substring(0, result.length - 2);
- };
-
- xmlHttpRequest.prototype.getResponseHeader = function (header) {
- if (!this._response) {
- throw { message: "_response property is undefined, did you forget to call send() or map the request url to a response?" };
- }
- return this._response.headers[header];
- };
-
- xmlHttpRequest.prototype.abort = function () {
- //do nothing for now.
- };
-
- xmlHttpRequest.prototype.setRequestHeader = function (header, value) {
- if (!this._request) {
- throw { message: "_request property is undefined, did you forget to call open() first?" };
- }
- this._request.headers[header] = value;
- };
-
- xmlHttpRequest.prototype.send = function (data) {
- if (!this._request) {
- throw { message: "_request property is undefined, did you forget to call open() first?" };
- }
-
- if (this._request.headers["MockNoOp"]) {
- return;
- }
-
- if (this._request.headers["MockTimeOut"]) {
- if (!this.timeout) {
- throw { message: "timeout property is not set" };
- }
-
- if (this.ontimeout) {
- (function (xhr) {
- setTimeout(function () {
- xhr.ontimeout();
- }, xhr.timeout);
- })(this);
- }
- return;
- }
-
- var url = this._request.url;
- var verifier = verifiers[url];
- var response = responses[url];
-
- if (!verifier) {
- verifier = verifiers["*"];
- }
-
- if (!response) {
- response = responses["*"];
- }
-
- if (!verifier && !response) {
- throw { message: "neither verifier or response defined for url: " + url };
- }
-
- this._request.body = data;
-
- if (verifier) {
- verifier(this._request);
- }
-
- if (response) {
- // Execute the respone after a 30ms delay.
- this._response = response;
- sendResponseDelay(this, response, 60);
- }
- };
-
- var sendResponseDelay = function (xhr, response, delay) {
- setTimeout(function () {
- xhr.status = response.status;
- xhr.responseText = response.body;
- xhr.responseBody = response.body;
-
- xhr.readyState = 4;
- if (xhr.onreadystatechange) {
- xhr.onreadystatechange();
- if (mockXMLHttpRequest.onAfterSend) {
- mockXMLHttpRequest.onAfterSend();
- }
- }
- }, delay);
- };
-
- mockXMLHttpRequest.XMLHttpRequest = xmlHttpRequest;
-
-})(this);
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/common/rx.js
----------------------------------------------------------------------
diff --git a/JSLib/tests/common/rx.js b/JSLib/tests/common/rx.js
deleted file mode 100644
index a7f4ea3..0000000
--- a/JSLib/tests/common/rx.js
+++ /dev/null
@@ -1,6 +0,0 @@
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
-// This code is licensed by Microsoft Corporation under the terms
-// of the MICROSOFT REACTIVE EXTENSIONS FOR JAVASCRIPT AND .NET LIBRARIES License.
-// See http://go.microsoft.com/fwlink/?LinkId=186234.
-
-(function(){var a;var b;var c=this;var d="Index out of range";if(typeof ProvideCustomRxRootObject =="undefined")b=c.Rx={}; else b=ProvideCustomRxRootObject();var e=function(){};var f=function(){return new Date().getTime();};var g=function(r0,s0){return r0===s0;};var h=function(r0){return r0;};var i=function(r0){return {Dispose:r0};};var j={Dispose:e};b.Disposable={Create:i,Empty:j};var k=b.BooleanDisposable=function(){var r0=false;this.GetIsDisposed=function(){return r0;};this.Dispose=function(){r0=true;};};var l=function(r0){var s0=false;r0.a++;this.Dispose=function(){var t0=false;if(!r0.b){if(!this.c){this.c=true;r0.a--;if(r0.a==0&&r0.d){r0.b=true;t0=true;}}}if(t0)r0.e.Dispose();};};var m=b.RefCountDisposable=function(r0){this.d=false;this.b=false;this.e=r0;this.a=0;this.Dispose=function(){var s0=false;if(!this.b){if(!this.d){this.d=true;if(this.a==0){this.b=true;s0=true;}}}if(s0)this.e.Dispose();};this.GetDisposable=function(){if(this.b)return j; else return new l(this);};};var n
=b.CompositeDisposable=function(){var r0=new q();for(var s0=0;s0<arguments.length;s0++) r0.Add(arguments[s0]);var t0=false;this.GetCount=function(){return r0.GetCount();};this.Add=function(u0){if(!t0)r0.Add(u0); else u0.Dispose();};this.Remove=function(u0,v0){if(!t0){var w0=r0.Remove(u0);if(!v0&w0)u0.Dispose();}};this.Dispose=function(){if(!t0){t0=true;this.Clear();}};this.Clear=function(){for(var u0=0;u0<r0.GetCount();u0++) r0.GetItem(u0).Dispose();r0.Clear();};};var o=b.MutableDisposable=function(){var r0=false;var s0;this.Get=function(){return s0;},this.Replace=function(t0){if(r0&&t0!==a)t0.Dispose(); else{if(s0!==a)s0.Dispose();s0=t0;}};this.Dispose=function(){if(!r0){r0=true;if(s0!==a)s0.Dispose();}};};var p=function(r0){var s0=[];for(var t0=0;t0<r0.length;t0++) s0.push(r0[t0]);return s0;};var q=b.List=function(r0){var s0=[];var t0=0;var u0=r0!==a?r0:g;this.Add=function(v0){s0[t0]=v0;t0++;};this.RemoveAt=function(v0){if(v0<0||v0>=t0)throw d;if(v0==0){s0.shift();t0--;}else{s0.sp
lice(v0,1);t0--;}};this.IndexOf=function(v0){for(var w0=0;w0<t0;w0++){if(u0(v0,s0[w0]))return w0;}return -1;};this.Remove=function(v0){var w0=this.IndexOf(v0);if(w0==-1)return false;this.RemoveAt(w0);return true;};this.Clear=function(){s0=[];t0=0;};this.GetCount=function(){return t0;};this.GetItem=function(v0){if(v0<0||v0>=t0)throw d;return s0[v0];};this.SetItem=function(v0,w0){if(v0<0||v0>=t0)throw d;s0[v0]=w0;};this.ToArray=function(){var v0=[];for(var w0=0;w0<this.GetCount();w0++) v0.push(this.GetItem(w0));return v0;};};var r=function(r0){if(r0===null)r0=g;this.f=r0;var s0=4;this.g=new Array(s0);this.h=0;};r.prototype.i=function(r0,s0){return this.f(this.g[r0],this.g[s0])<0;};r.prototype.j=function(r0){if(r0>=this.h||r0<0)return;var s0=r0-1>>1;if(s0<0||s0==r0)return;if(this.i(r0,s0)){var t0=this.g[r0];this.g[r0]=this.g[s0];this.g[s0]=t0;this.j(s0);}};r.prototype.k=function(r0){if(r0===a)r0=0;var s0=2*r0+1;var t0=2*r0+2;var u0=r0;if(s0<this.h&&this.i(s0,u0))u0=s0;if(t0<this.h&&thi
s.i(t0,u0))u0=t0;if(u0!=r0){var v0=this.g[r0];this.g[r0]=this.g[u0];this.g[u0]=v0;this.k(u0);}};r.prototype.GetCount=function(){return this.h;};r.prototype.Peek=function(){if(this.h==0)throw "Heap is empty.";return this.g[0];};r.prototype.Dequeue=function(){var r0=this.Peek();this.g[0]=this.g[--this.h];delete this.g[this.h];this.k();return r0;};r.prototype.Enqueue=function(r0){var s0=this.h++;this.g[s0]=r0;this.j(s0);};var s=b.Scheduler=function(r0,s0,t0){this.Schedule=r0;this.ScheduleWithTime=s0;this.Now=t0;this.ScheduleRecursive=function(u0){var v0=this;var w0=new n();var x0;x0=function(){u0(function(){var y0=false;var z0=false;var A0;A0=v0.Schedule(function(){x0();if(y0)w0.Remove(A0); else z0=true;});if(!z0){w0.Add(A0);y0=true;}});};w0.Add(v0.Schedule(x0));return w0;};this.ScheduleRecursiveWithTime=function(u0,v0){var w0=this;var x0=new n();var y0;y0=function(){u0(function(z0){var A0=false;var B0=false;var C0;C0=w0.ScheduleWithTime(function(){y0();if(A0)x0.Remove(C0); else B0=tru
e;},z0);if(!B0){x0.Add(C0);A0=true;}});};x0.Add(w0.ScheduleWithTime(y0,v0));return x0;};};var t=b.VirtualScheduler=function(r0,s0,t0,u0){var v0=new s(function(w0){return this.ScheduleWithTime(w0,0);},function(w0,x0){return this.ScheduleVirtual(w0,u0(x0));},function(){return t0(this.l);});v0.ScheduleVirtual=function(w0,x0){var y0=new k();var z0=s0(this.l,x0);var A0=function(){if(!y0.IsDisposed)w0();};var B0=new y(A0,z0);this.m.Enqueue(B0);return y0;};v0.Run=function(){while(this.m.GetCount()>0){var w0=this.m.Dequeue();this.l=w0.n;w0.o();}};v0.RunTo=function(w0){while(this.m.GetCount()>0&&this.f(this.m.Peek().n,w0)<=0){var x0=this.m.Dequeue();this.l=x0.n;x0.o();}};v0.GetTicks=function(){return this.l;};v0.l=0;v0.m=new r(function(w0,x0){return r0(w0.n,x0.n);});v0.f=r0;return v0;};var u=b.TestScheduler=function(){var r0=new t(function(s0,t0){return s0-t0;},function(s0,t0){return s0+t0;},function(s0){return new Date(s0);},function(s0){if(s0<=0)return 1;return s0;});return r0;};var v=new
s(function(r0){return this.ScheduleWithTime(r0,0);},function(r0,s0){var t0=this.Now()+s0;var u0=new y(r0,t0);if(this.m===a){var v0=new w();try{this.m.Enqueue(u0);v0.p();}finally{v0.q();}}else this.m.Enqueue(u0);return u0.r();},f);v.s=function(r0){if(this.m===a){var s0=new w();try{r0();s0.p();}finally{s0.q();}}else r0();};s.CurrentThread=v;var w=function(){v.m=new r(function(r0,s0){try{return r0.n-s0.n;}catch(t0){debugger;}});this.q=function(){v.m=a;};this.p=function(){while(v.m.GetCount()>0){var r0=v.m.Dequeue();if(!r0.t()){while(r0.n-v.Now()>0);if(!r0.t())r0.o();}}};};var x=0;var y=function(r0,s0){this.u=x++;this.o=r0;this.n=s0;this.v=new k();this.t=function(){return this.v.GetIsDisposed();};this.r=function(){return this.v;};};var z=new s(function(r0){r0();return j;},function(r0,s0){while(this.Now<s0);r0();},f);s.Immediate=z;var A=new s(function(r0){var s0=c.setTimeout(r0,0);return i(function(){c.clearTimeout(s0);});},function(r0,s0){var t0=c.setTimeout(r0,s0);return i(function(){c
.clearTimeout(t0);});},f);s.Timeout=A;var B=b.Observer=function(r0,s0,t0){this.OnNext=r0===a?e:r0;this.OnError=s0===a?function(u0){throw u0;}:s0;this.OnCompleted=t0===a?e:t0;this.AsObserver=function(){var u0=this;return new B(function(v0){u0.OnNext(v0);},function(v0){u0.OnError(v0);},function(){u0.OnCompleted();});};};var C=B.Create=function(r0,s0,t0){return new B(r0,s0,t0);};var D=b.Observable=function(r0){this.w=r0;};var E=D.CreateWithDisposable=function(r0){return new D(r0);};var F=D.Create=function(r0){return E(function(s0){return i(r0(s0));});};var G=function(){return this.Select(function(r0){return r0.Value;});};D.prototype={Subscribe:function(r0,s0,t0){var u0;if(arguments.length==0||arguments.length>1||typeof r0 =="function")u0=new B(r0,s0,t0); else u0=r0;return this.x(u0);},x:function(r0){var s0=false;var t0=new o();var u0=this;v.s(function(){var v0=new B(function(w0){if(!s0)r0.OnNext(w0);},function(w0){if(!s0){s0=true;t0.Dispose();r0.OnError(w0);}},function(){if(!s0){s0=tru
e;t0.Dispose();r0.OnCompleted();}});t0.Replace(u0.w(v0));});return new n(t0,i(function(){s0=true;}));},Select:function(r0){var s0=this;return E(function(t0){var u0=0;return s0.Subscribe(new B(function(v0){var w0;try{w0=r0(v0,u0++);}catch(x0){t0.OnError(x0);return;}t0.OnNext(w0);},function(v0){t0.OnError(v0);},function(){t0.OnCompleted();}));});},Let:function(r0,s0){if(s0===a)return r0(this);var t0=this;return E(function(u0){var v0=s0();var w0;try{w0=r0(v0);}catch(A0){return L(A0).Subscribe(u0);}var x0=new o();var y0=new o();var z0=new n(y0,x0);x0.Replace(w0.Subscribe(function(A0){u0.OnNext(A0);},function(A0){u0.OnError(A0);z0.Dispose();},function(){u0.OnCompleted();z0.Dispose();}));y0.Replace(t0.Subscribe(v0));return z0;});},MergeObservable:function(){var r0=this;return E(function(s0){var t0=false;var u0=new n();var v0=new o();u0.Add(v0);v0.Replace(r0.Subscribe(function(w0){var x0=new o();u0.Add(x0);x0.Replace(w0.Subscribe(function(y0){s0.OnNext(y0);},function(y0){s0.OnError(y0);},f
unction(){u0.Remove(x0);if(u0.GetCount()==1&&t0)s0.OnCompleted();}));},function(w0){s0.OnError(w0);},function(){t0=true;if(u0.GetCount()==1)s0.OnCompleted();}));return u0;});},y:function(r0,s0){var t0=p(s0);t0.unshift(this);return r0(t0);},Concat:function(){return this.y(I,arguments);},Merge:function(){return this.y(H,arguments);},Catch:function(){return this.y(P,arguments);},OnErrorResumeNext:function(){return this.y(V,arguments);},Zip:function(r0,s0){var t0=this;return E(function(u0){var v0=false;var w0=[];var x0=[];var y0=false;var z0=false;var A0=new n();var B0=function(C0){A0.Dispose();w0=a;x0=a;u0.OnError(C0);};A0.Add(t0.Subscribe(function(C0){if(z0){u0.OnCompleted();return;}if(x0.length>0){var D0=x0.shift();var E0;try{E0=s0(C0,D0);}catch(F0){A0.Dispose();u0.OnError(F0);return;}u0.OnNext(E0);}else w0.push(C0);},B0,function(){if(z0){u0.OnCompleted();return;}y0=true;}));A0.Add(r0.Subscribe(function(C0){if(y0){u0.OnCompleted();return;}if(w0.length>0){var D0=w0.shift();var E0;try{
E0=s0(D0,C0);}catch(F0){A0.Dispose();u0.OnError(F0);return;}u0.OnNext(E0);}else x0.push(C0);},B0,function(){if(y0){u0.OnCompleted();return;}z0=true;}));return A0;});},CombineLatest:function(r0,s0){var t0=this;return E(function(u0){var v0=false;var w0=false;var x0=false;var y0;var z0;var A0=false;var B0=false;var C0=new n();var D0=function(E0){C0.Dispose();u0.OnError(E0);};C0.Add(t0.Subscribe(function(E0){if(B0){u0.OnCompleted();return;}if(x0){var F0;try{F0=s0(E0,z0);}catch(G0){C0.Dispose();u0.OnError(G0);return;}u0.OnNext(F0);}y0=E0;w0=true;},D0,function(){if(B0){u0.OnCompleted();return;}A0=true;}));C0.Add(r0.Subscribe(function(E0){if(A0){u0.OnCompleted();return;}if(w0){var F0;try{F0=s0(y0,E0);}catch(G0){C0.Dispose();u0.OnError(G0);return;}u0.OnNext(F0);}z0=E0;x0=true;},D0,function(){if(A0){u0.OnCompleted();return;}B0=true;}));});},Switch:function(){var r0=this;return E(function(s0){var t0=false;var u0=new o();var v0=new o();v0.Replace(r0.Subscribe(function(w0){if(!t0){var x0=new o(
);x0.Replace(w0.Subscribe(function(y0){s0.OnNext(y0);},function(y0){v0.Dispose();u0.Dispose();s0.OnError(y0);},function(){u0.Replace(a);if(t0)s0.OnCompleted();}));u0.Replace(x0);}},function(w0){u0.Dispose();s0.OnError(w0);},function(){t0=true;if(u0.Get()===a)s0.OnCompleted();}));return new n(v0,u0);});},TakeUntil:function(r0){var s0=this;return E(function(t0){var u0=new n();u0.Add(r0.Subscribe(function(){t0.OnCompleted();u0.Dispose();},function(v0){t0.OnError(v0);},function(){}));u0.Add(s0.Subscribe(t0));return u0;});},SkipUntil:function(r0){var s0=this;return E(function(t0){var u0=true;var v0=new n();v0.Add(r0.Subscribe(function(){u0=false;},function(w0){t0.OnError(w0);},e));v0.Add(s0.Subscribe(new B(function(w0){if(!u0)t0.OnNext(w0);},function(w0){t0.OnError(w0);},function(){if(!u0)t0.OnCompleted();})));return v0;});},Scan1:function(r0){var s0=this;return O(function(){var t0;var u0=false;return s0.Select(function(v0){if(u0)t0=r0(t0,v0); else{t0=v0;u0=true;}return t0;});});},Scan:f
unction(r0,s0){var t0=this;return O(function(){var u0;var v0=false;return t0.Select(function(w0){if(v0)u0=s0(u0,w0); else{u0=s0(r0,w0);v0=true;}return u0;});});},Scan0:function(r0,s0){var t0=this;return E(function(u0){var v0=r0;var w0=true;return t0.Subscribe(function(x0){if(w0){w0=false;u0.OnNext(v0);}try{v0=s0(v0,x0);}catch(y0){u0.OnError(y0);return;}u0.OnNext(v0);},function(x0){if(w0)u0.OnNext(v0);u0.OnError(x0);},function(){if(w0)u0.OnNext(v0);u0.OnCompleted();});});},Finally:function(r0){var s0=this;return F(function(t0){var u0=s0.Subscribe(t0);return function(){try{u0.Dispose();r0();}catch(v0){r0();throw v0;}};});},Do:function(r0,s0,t0){var u0;if(arguments.length==0||arguments.length>1||typeof r0 =="function")u0=new B(r0,s0!==a?s0:e,t0); else u0=r0;var v0=this;return E(function(w0){return v0.Subscribe(new B(function(x0){try{u0.OnNext(x0);}catch(y0){w0.OnError(y0);return;}w0.OnNext(x0);},function(x0){if(s0!==a)try{u0.OnError(x0);}catch(y0){w0.OnError(y0);return;}w0.OnError(x0);
},function(){if(t0!==a)try{u0.OnCompleted();}catch(x0){w0.OnError(x0);return;}w0.OnCompleted();}));});},Where:function(r0){var s0=this;return E(function(t0){var u0=0;return s0.Subscribe(new B(function(v0){var w0=false;try{w0=r0(v0,u0++);}catch(x0){t0.OnError(x0);return;}if(w0)t0.OnNext(v0);},function(v0){t0.OnError(v0);},function(){t0.OnCompleted();}));});},Take:function(r0,s0){if(s0===a)s0=z;var t0=this;return E(function(u0){if(r0<=0){t0.Subscribe().Dispose();return N(s0).Subscribe(u0);}var v0=r0;return t0.Subscribe(new B(function(w0){if(v0-->0){u0.OnNext(w0);if(v0==0)u0.OnCompleted();}},function(w0){u0.OnError(w0);},function(){u0.OnCompleted();}));});},GroupBy:function(r0,s0,t0){if(r0===a)r0=h;if(s0===a)s0=h;if(t0===a)t0=function(v0){return v0.toString();};var u0=this;return E(function(v0){var w0={};var x0=new o();var y0=new m(x0);x0.Replace(u0.Subscribe(function(z0){var A0;try{A0=r0(z0);}catch(G0){for(var H0 in w0) w0[H0].OnError(G0);v0.OnError(G0);return;}var B0=false;var C0;try
{var D0=t0(A0);if(w0[D0]===a){C0=new i0();w0[D0]=C0;B0=true;}else C0=w0[D0];}catch(G0){for(var H0 in w0) w0[H0].OnError(G0);v0.OnError(G0);return;}if(B0){var E0=E(function(G0){return new n(y0.GetDisposable(),C0.Subscribe(G0));});E0.Key=A0;v0.OnNext(E0);}var F0;try{F0=s0(z0);}catch(G0){for(var H0 in w0) w0[H0].OnError(G0);v0.OnError(G0);return;}C0.OnNext(F0);},function(z0){for(var A0 in w0) w0[A0].OnError(z0);v0.OnError(z0);},function(){for(var z0 in w0) w0[z0].OnCompleted();v0.OnCompleted();}));return y0;});},TakeWhile:function(r0){var s0=this;return E(function(t0){var u0=true;return s0.Subscribe(new B(function(v0){if(u0){try{u0=r0(v0);}catch(w0){t0.OnError(w0);return;}if(u0)t0.OnNext(v0); else t0.OnCompleted();}},function(v0){t0.OnError(v0);},function(){t0.OnCompleted();}));});},SkipWhile:function(r0){var s0=this;return E(function(t0){var u0=false;return s0.Subscribe(new B(function(v0){if(!u0)try{u0=!r0(v0);}catch(w0){t0.OnError(w0);return;}if(u0)t0.OnNext(v0);},function(v0){t0.OnE
rror(v0);},function(){t0.OnCompleted();}));});},Skip:function(r0){var s0=this;return E(function(t0){var u0=r0;return s0.Subscribe(new B(function(v0){if(u0--<=0)t0.OnNext(v0);},function(v0){t0.OnError(v0);},function(){t0.OnCompleted();}));});},SelectMany:function(r0){return this.Select(r0).MergeObservable();},TimeInterval:function(r0){if(r0===a)r0=z;var s0=this;return O(function(){var t0=r0.Now();return s0.Select(function(u0){var v0=r0.Now();var w0=v0-t0;t0=v0;return {Interval:w0,Value:u0};});});},RemoveInterval:G,Timestamp:function(r0){if(r0===a)r0=z;return this.Select(function(s0){return {Timestamp:r0.Now(),Value:s0};});},RemoveTimestamp:G,Materialize:function(){var r0=this;return E(function(s0){return r0.Subscribe(new B(function(t0){s0.OnNext(new h0("N",t0));},function(t0){s0.OnNext(new h0("E",t0));s0.OnCompleted();},function(){s0.OnNext(new h0("C"));s0.OnCompleted();}));});},Dematerialize:function(){return this.SelectMany(function(r0){return r0;});},AsObservable:function(){var r0
=this;return E(function(s0){return r0.Subscribe(s0);});},Delay:function(r0,s0){if(s0===a)s0=A;var t0=this;return E(function(u0){var v0=[];var w0=false;var x0=new o();var y0=t0.Materialize().Timestamp().Subscribe(function(z0){if(z0.Value.Kind=="E"){u0.OnError(z0.Value.Value);v0=[];if(w0)x0.Dispose();return;}v0.push({Timestamp:s0.Now()+r0,Value:z0.Value});if(!w0){x0.Replace(s0.ScheduleRecursiveWithTime(function(A0){var B0;do{B0=a;if(v0.length>0&&v0[0].Timestamp<=s0.Now())B0=v0.shift().Value;if(B0!==a)B0.Accept(u0);}while(B0!==a);if(v0.length>0){A0(Math.max(0,v0[0].Timestamp-s0.Now()));w0=true;}else w0=false;},r0));w0=true;}});return new n(y0,x0);});},Throttle:function(r0,s0){if(s0===a)s0=A;var t0=this;return E(function(u0){var v0;var w0=false;var x0=new o();var y0=0;var z0=t0.Subscribe(function(A0){w0=true;v0=A0;y0++;var B0=y0;x0.Replace(s0.ScheduleWithTime(function(){if(w0&&y0==B0)u0.OnNext(v0);w0=false;},r0));},function(A0){x0.Dispose();u0.OnError(A0);w0=false;y0++;},function(){x0.D
ispose();if(w0)u0.OnNext(v0);u0.OnCompleted();w0=false;y0++;});return new n(z0,x0);});},Timeout:function(r0,s0,t0){if(t0===a)t0=A;if(s0===a)s0=L("Timeout",t0);var u0=this;return E(function(v0){var w0=new o();var x0=new o();var y0=0;var z0=y0;var A0=false;x0.Replace(t0.ScheduleWithTime(function(){A0=y0==z0;if(A0)w0.Replace(s0.Subscribe(v0));},r0));w0.Replace(u0.Subscribe(function(B0){var C0=0;if(!A0){y0++;C0=y0;v0.OnNext(B0);x0.Replace(t0.ScheduleWithTime(function(){A0=y0==C0;if(A0)w0.Replace(s0.Subscribe(v0));},r0));}},function(B0){if(!A0){y0++;v0.OnError(B0);}},function(){if(!A0){y0++;v0.OnCompleted();}}));return new n(w0,x0);});},Sample:function(r0,s0){if(s0===a)s0=A;var t0=this;return E(function(u0){var v0=false;var w0;var x0=false;var y0=new n();y0.Add(Y(r0,s0).Subscribe(function(z0){if(v0){u0.OnNext(w0);v0=false;}if(x0)u0.OnCompleted();},function(z0){u0.OnError(z0);},function(){u0.OnCompleted();}));y0.Add(t0.Subscribe(function(z0){v0=true;w0=z0;},function(z0){u0.OnError(z0);y0.
Dispose();},function(){x0=true;}));return y0;});},Repeat:function(r0,s0){var t0=this;if(s0===a)s0=z;if(r0===a)r0=-1;return E(function(u0){var v0=r0;var w0=new o();var x0=new n(w0);var y0=function(z0){w0.Replace(t0.Subscribe(function(A0){u0.OnNext(A0);},function(A0){u0.OnError(A0);},function(){if(v0>0){v0--;if(v0==0){u0.OnCompleted();return;}}z0();}));};x0.Add(s0.ScheduleRecursive(y0));return x0;});},Retry:function(r0,s0){var t0=this;if(s0===a)s0=z;if(r0===a)r0=-1;return E(function(u0){var v0=r0;var w0=new o();var x0=new n(w0);var y0=function(z0){w0.Replace(t0.Subscribe(function(A0){u0.OnNext(A0);},function(A0){if(v0>0){v0--;if(v0==0){u0.OnError(A0);return;}}z0();},function(){u0.OnCompleted();}));};x0.Add(s0.ScheduleRecursive(y0));return x0;});},BufferWithTime:function(r0,s0,t0){if(t0===a)t0=A;if(s0===a)s0=r0;var u0=this;return E(function(v0){var w0=new q();var x0=t0.Now();var y0=function(){var C0=[];for(var D0=0;D0<w0.GetCount();D0++){var E0=w0.GetItem(D0);if(E0.Timestamp-x0>=0)C0.p
ush(E0.Value);}return C0;};var z0=new n();var A0=function(C0){v0.OnError(C0);};var B0=function(){v0.OnNext(y0());v0.OnCompleted();};z0.Add(u0.Subscribe(function(C0){w0.Add({Value:C0,Timestamp:t0.Now()});},A0,B0));z0.Add(a0(r0,s0,t0).Subscribe(function(C0){var D0=y0();var E0=t0.Now()+s0-r0;while(w0.GetCount()>0&&w0.GetItem(0).Timestamp-E0<=0)w0.RemoveAt(0);v0.OnNext(D0);x0=E0;},A0,B0));return z0;});},BufferWithTimeOrCount:function(r0,s0,t0){if(t0===a)t0=A;var u0=this;return E(function(v0){var w0=0;var x0=new q();var y0=function(){v0.OnNext(x0.ToArray());x0.Clear();w0++;};var z0=new o();var A0;A0=function(C0){var D0=t0.ScheduleWithTime(function(){var E0=false;var F0=0;if(C0==w0){y0();F0=w0;E0=true;}if(E0)A0(F0);},r0);z0.Replace(D0);};A0(w0);var B0=u0.Subscribe(function(C0){var D0=false;var E0=0;x0.Add(C0);if(x0.GetCount()==s0){y0();E0=w0;D0=true;}if(D0)A0(E0);},function(C0){v0.OnError(C0);x0.Clear();},function(){v0.OnNext(x0.ToArray());w0++;v0.OnCompleted();x0.Clear();});return new n(
B0,z0);});},BufferWithCount:function(r0,s0){if(s0===a)s0=r0;var t0=this;return E(function(u0){var v0=[];var w0=0;return t0.Subscribe(function(x0){if(w0==0)v0.push(x0); else w0--;var y0=v0.length;if(y0==r0){var z0=v0;v0=[];var A0=Math.min(s0,y0);for(var B0=A0;B0<y0;B0++) v0.push(z0[B0]);w0=Math.max(0,s0-r0);u0.OnNext(z0);}},function(x0){u0.OnError(x0);},function(){if(v0.length>0)u0.OnNext(v0);u0.OnCompleted();});});},StartWith:function(r0,s0){if(!(r0 instanceof Array))r0=[r0];if(s0===a)s0=z;var t0=this;return E(function(u0){var v0=new n();var w0=0;v0.Add(s0.ScheduleRecursive(function(x0){if(w0<r0.length){u0.OnNext(r0[w0]);w0++;x0();}else v0.Add(t0.Subscribe(u0));}));return v0;});},DistinctUntilChanged:function(r0,s0){if(r0===a)r0=h;if(s0===a)s0=g;var t0=this;return E(function(u0){var v0;var w0=false;return t0.Subscribe(function(x0){var y0;try{y0=r0(x0);}catch(A0){u0.OnError(A0);return;}var z0=false;if(w0)try{z0=s0(v0,y0);}catch(A0){u0.OnError(A0);return;}if(!w0||!z0){w0=true;v0=y0;u0
.OnNext(x0);}},function(x0){u0.OnError(x0);},function(){u0.OnCompleted();});});},Publish:function(r0){if(r0===a)return new q0(this,new i0());var s0=this;return E(function(t0){var u0=new q0(s0,new i0());return new n(r0(u0).Subscribe(B),u0.Connect());});},Prune:function(r0,s0){if(s0===a)s0=z;if(r0===a)return new q0(this,new k0(s0));var t0=this;return E(function(u0){var v0=new q0(t0,new k0(s0));return new n(r0(v0).Subscribe(B),v0.Connect());});},Replay:function(r0,s0,t0,u0){if(u0===a)u0=v;if(r0===a)return new q0(this,new m0(s0,t0,u0));var v0=this;return E(function(w0){var x0=new q0(v0,new m0(s0,t0,u0));return new n(r0(x0).Subscribe(B),x0.Connect());});},SkipLast:function(r0){var s0=this;return E(function(t0){var u0=[];return s0.Subscribe(function(v0){u0.push(v0);if(u0.length>r0)t0.OnNext(u0.shift());},function(v0){t0.OnError(v0);},function(){t0.OnCompleted();});});},TakeLast:function(r0){var s0=this;return E(function(t0){var u0=[];return s0.Subscribe(function(v0){u0.push(v0);if(u0.leng
th>r0)u0.shift();},function(v0){t0.OnError(v0);},function(){while(u0.length>0)t0.OnNext(u0.shift());t0.OnCompleted();});});}};var H=D.Merge=function(r0,s0){if(s0===a)s0=z;return J(r0,s0).MergeObservable();};var I=D.Concat=function(r0,s0){if(s0===a)s0=z;return E(function(t0){var u0=new o();var v0=0;var w0=s0.ScheduleRecursive(function(x0){if(v0<r0.length){var y0=r0[v0];v0++;var z0=new o();u0.Replace(z0);z0.Replace(y0.Subscribe(function(A0){t0.OnNext(A0);},function(A0){t0.OnError(A0);},x0));}else t0.OnCompleted();});return new n(u0,w0);});};var J=D.FromArray=function(r0,s0){if(s0===a)s0=z;return E(function(t0){var u0=0;return s0.ScheduleRecursive(function(v0){if(u0<r0.length){t0.OnNext(r0[u0++]);v0();}else t0.OnCompleted();});});};var K=D.Return=function(r0,s0){if(s0===a)s0=z;return E(function(t0){return s0.Schedule(function(){t0.OnNext(r0);t0.OnCompleted();});});};var L=D.Throw=function(r0,s0){if(s0===a)s0=z;return E(function(t0){return s0.Schedule(function(){t0.OnError(r0);});});};v
ar M=D.Never=function(){return E(function(r0){return j;});};var N=D.Empty=function(r0){if(r0===a)r0=z;return E(function(s0){return r0.Schedule(function(){s0.OnCompleted();});});};var O=D.Defer=function(r0){return E(function(s0){var t0;try{t0=r0();}catch(u0){s0.OnError(u0);return j;}return t0.Subscribe(s0);});};var P=D.Catch=function(r0,s0){if(s0===a)s0=z;return E(function(t0){var u0=new o();var v0=0;var w0=s0.ScheduleRecursive(function(x0){var y0=r0[v0];v0++;var z0=new o();u0.Replace(z0);z0.Replace(y0.Subscribe(function(A0){t0.OnNext(A0);},function(A0){if(v0<r0.length)x0(); else t0.OnError(A0);},function(){t0.OnCompleted();}));});return new n(u0,w0);});};var Q=D.Using=function(r0,s0){return E(function(t0){var u0;var v0=j;try{var w0=r0();if(w0!==a)v0=w0;u0=s0(w0);}catch(x0){return new n(Throw(x0).Subscribe(t0),v0);}return new n(u0.Subscribe(t0),v0);});};var R=D.Range=function(r0,s0,t0){if(t0===a)t0=z;var u0=r0+s0-1;return T(r0,function(v0){return v0<=u0;},function(v0){return v0+1;},h
,t0);};var S=D.Repeat=function(r0,s0,t0){if(t0===a)t0=z;if(s0===a)s0=-1;var u0=s0;return E(function(v0){return t0.ScheduleRecursive(function(w0){v0.OnNext(r0);if(u0>0){u0--;if(u0==0){v0.OnCompleted();return;}}w0();});});};var T=D.Generate=function(r0,s0,t0,u0,v0){if(v0===a)v0=z;return E(function(w0){var x0=r0;var y0=true;return v0.ScheduleRecursive(function(z0){var A0=false;var B0;try{if(y0)y0=false; else x0=t0(x0);A0=s0(x0);if(A0)B0=u0(x0);}catch(C0){w0.OnError(C0);return;}if(A0){w0.OnNext(B0);z0();}else w0.OnCompleted();});});};var U=D.GenerateWithTime=function(r0,s0,t0,u0,v0,w0){if(w0===a)w0=A;return new E(function(x0){var y0=r0;var z0=true;var A0=false;var B0;var C0;return w0.ScheduleRecursiveWithTime(function(D0){if(A0)x0.OnNext(B0);try{if(z0)z0=false; else y0=t0(y0);A0=s0(y0);if(A0){B0=u0(y0);C0=v0(y0);}}catch(E0){x0.OnError(E0);return;}if(A0)D0(C0); else x0.OnCompleted();},0);});};var V=D.OnErrorResumeNext=function(r0,s0){if(s0===a)s0=z;return E(function(t0){var u0=new o();va
r v0=0;var w0=s0.ScheduleRecursive(function(x0){if(v0<r0.length){var y0=r0[v0];v0++;var z0=new o();u0.Replace(z0);z0.Replace(y0.Subscribe(function(A0){t0.OnNext(A0);},x0,x0));}else t0.OnCompleted();});return new n(u0,w0);});};var W=D.Amb=function(){var r0=arguments;return E(function(s0){var t0=new n();var u0=new o();u0.Replace(t0);var v0=false;for(var w0=0;w0<r0.length;w0++){var x0=r0[w0];var y0=new o();var z0=new B(function(A0){if(!v0){t0.Remove(this.z,true);t0.Dispose();u0.Replace(this.z);v0=true;}s0.OnNext(A0);},function(A0){s0.OnError(A0);u0.Dispose();},function(){s0.OnCompleted();u0.Dispose();});z0.z=y0;y0.Replace(x0.Subscribe(z0));t0.Add(y0);}return u0;});};var X=D.ForkJoin=function(){var r0=arguments;return E(function(s0){var t0=[];var u0=[];var v0=[];var w0=new n();for(var x0=0;x0<r0.length;x0++) (function(y0){w0.Add(r0[y0].Subscribe(function(z0){t0[y0]=true;v0[y0]=z0;},function(z0){s0.OnError(z0);},function(z0){if(!t0[y0]){s0.OnCompleted();v0=a;t0=a;return;}u0[y0]=true;var
A0=true;for(var B0=0;B0<r0.length;B0++){if(!u0[B0])A0=false;}if(A0){s0.OnNext(v0);s0.OnCompleted();v0=a;u0=a;t0=a;}}));})(x0);return w0;});};var Y=D.Interval=function(r0,s0){return a0(r0,r0,s0);};var Z=function(r0){return Math.max(0,r0);};var a0=D.Timer=function(r0,s0,t0){if(t0===a)t0=A;if(r0===a)return M();if(r0 instanceof Date)return O(function(){return D.Timer(r0-new Date(),s0,t0);});var u0=Z(r0);if(s0===a)return E(function(w0){return t0.ScheduleWithTime(function(){w0.OnNext(0);w0.OnCompleted();},u0);});var v0=Z(s0);return E(function(w0){var x0=0;return t0.ScheduleRecursiveWithTime(function(y0){w0.OnNext(x0++);y0(v0);},u0);});};var b0=D.While=function(r0,s0){return E(function(t0){var u0=new o();var v0=new n(u0);v0.Add(z.ScheduleRecursive(function(w0){var x0;try{x0=r0();}catch(y0){t0.OnError(y0);return;}if(x0)u0.Replace(s0.Subscribe(function(y0){t0.OnNext(y0);},function(y0){t0.OnError(y0);},function(){w0();})); else t0.OnCompleted();}));return v0;});};var c0=D.If=function(r0,s0,t0
){if(t0===a)t0=N();return O(function(){return r0()?s0:t0;});};var d0=D.DoWhile=function(r0,s0){return I([r0,b0(s0,r0)]);};var e0=D.Case=function(r0,s0,t0,u0){if(u0===a)u0=z;if(t0===a)t0=N(u0);return O(function(){var v0=s0[r0()];if(v0===a)v0=t0;return v0;});};var f0=D.For=function(r0,s0){return E(function(t0){var u0=new n();var v0=0;u0.Add(z.ScheduleRecursive(function(w0){if(v0<r0.length){var x0;try{x0=s0(r0[v0]);}catch(y0){t0.OnError(y0);return;}u0.Add(x0.Subscribe(function(y0){t0.OnNext(y0);},function(y0){t0.OnError(y0);},function(){v0++;w0();}));}else t0.OnCompleted();}));return u0;});};var g0=D.Let=function(r0,s0){return O(function(){return s0(r0);});};var h0=b.Notification=function(r0,s0){this.Kind=r0;this.Value=s0;this.toString=function(){return this.Kind+": "+this.Value;};this.Accept=function(t0){switch(this.Kind){case "N":t0.OnNext(this.Value);break;case "E":t0.OnError(this.Value);break;case "C":t0.OnCompleted();break;}return j;};this.w=function(t0){var u0=this.Accept(t0);if(
r0=="N")t0.OnCompleted();return u0;};};h0.prototype=new D;var i0=b.Subject=function(){var r0=new q();var s0=false;this.OnNext=function(t0){if(!s0){var u0=r0.ToArray();for(var v0=0;v0<u0.length;v0++){var w0=u0[v0];w0.OnNext(t0);}}};this.OnError=function(t0){if(!s0){var u0=r0.ToArray();for(var v0=0;v0<u0.length;v0++){var w0=u0[v0];w0.OnError(t0);}s0=true;r0.Clear();}};this.OnCompleted=function(){if(!s0){var t0=r0.ToArray();for(var u0=0;u0<t0.length;u0++){var v0=t0[u0];v0.OnCompleted();}s0=true;r0.Clear();}};this.w=function(t0){if(!s0){r0.Add(t0);return i(function(){r0.Remove(t0);});}else return j;};};i0.prototype=new D;for(var j0 in B.prototype) i0.prototype[j0]=B.prototype[j0];var k0=b.AsyncSubject=function(r0){var s0=new q();var t0;var u0=false;if(r0===a)r0=z;this.OnNext=function(v0){if(!u0)t0=new h0("N",v0);};this.OnError=function(v0){if(!u0){t0=new h0("E",v0);var w0=s0.ToArray();for(var x0=0;x0<w0.length;x0++){var y0=w0[x0];if(y0!==a)y0.OnError(v0);}u0=true;s0.Clear();}};this.OnCo
mpleted=function(){if(!u0){if(t0===a)t0=new h0("C");var v0=s0.ToArray();for(var w0=0;w0<v0.length;w0++){var x0=v0[w0];if(x0!==a)t0.w(x0);}u0=true;s0.Clear();}};this.w=function(v0){if(!u0){s0.Add(v0);return i(function(){s0.Remove(v0);});}else return r0.Schedule(function(){t0.w(v0);});};};k0.prototype=new i0;var l0=b.BehaviorSubject=function(r0,s0){var t0=new m0(1,-1,s0);t0.OnNext(r0);return t0;};var m0=b.ReplaySubject=function(r0,s0,t0){var u0=new q();var v0=new q();var w0=false;if(t0===a)t0=v;var x0=s0>0;var y0=function(z0,A0){v0.Add({Value:new h0(z0,A0),Timestamp:t0.Now()});};this.A=function(){if(r0!==a)while(v0.GetCount()>r0)v0.RemoveAt(0);if(x0)while(v0.GetCount()>0&&t0.Now()-v0.GetItem(0).Timestamp>s0)v0.RemoveAt(0);};this.OnNext=function(z0){if(!w0){var A0=u0.ToArray();for(var B0=0;B0<A0.length;B0++){var C0=A0[B0];C0.OnNext(z0);}y0("N",z0);}};this.OnError=function(z0){if(!w0){var A0=u0.ToArray();for(var B0=0;B0<A0.length;B0++){var C0=A0[B0];C0.OnError(z0);}w0=true;u0.Clear();y0
("E",z0);}};this.OnCompleted=function(){if(!w0){var z0=u0.ToArray();for(var A0=0;A0<z0.length;A0++){var B0=z0[A0];B0.OnCompleted();}w0=true;u0.Clear();y0("C");}};this.w=function(z0){var A0=new n0(this,z0);var B0=new n(A0);var C0=this;B0.Add(t0.Schedule(function(){if(!A0.B){C0.A();for(var D0=0;D0<v0.GetCount();D0++) v0.GetItem(D0).Value.Accept(z0);u0.Add(z0);A0.C=true;}}));return B0;};this.D=function(z0){u0.Remove(z0);};};m0.prototype=new i0;var n0=function(r0,s0){this.E=r0;this.F=s0;this.C=false;this.B=false;this.Dispose=function(){if(this.C)this.E.D(this.F);this.B=true;};};var o0=D.ToAsync=function(r0,s0){if(s0===a)s0=A;return function(){var t0=new k0(s0);var u0=function(){var x0;try{x0=r0.apply(this,arguments);}catch(y0){t0.OnError(y0);return;}t0.OnNext(x0);t0.OnCompleted();};var v0=this;var w0=p(arguments);s0.Schedule(function(){u0.apply(v0,w0);});return t0;};};var p0=D.Start=function(r0,s0,t0,u0){if(t0===a)t0=[];return o0(r0,u0).apply(s0,t0);};var q0=b.ConnectableObservable=func
tion(r0,s0){if(s0===a)s0=new i0();this.E=s0;this.G=r0;this.H=false;this.Connect=function(){var t0;var u0=false;if(!this.H){this.H=true;var v0=this;t0=new n(i(function(){v0.H=false;}));this.I=t0;t0.Add(r0.Subscribe(this.E));}return this.I;};this.w=function(t0){return this.E.Subscribe(t0);};this.RefCount=function(){var t0=0;var u0=this;var v0;return F(function(w0){var x0=false;t0++;x0=t0==1;var y0=u0.Subscribe(w0);if(x0)v0=u0.Connect();return function(){y0.Dispose();t0--;if(t0==0)v0.Dispose();};});};};q0.prototype=new D;})();
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/datajs-cache-large-collection-functional-tests.html
----------------------------------------------------------------------
diff --git a/JSLib/tests/datajs-cache-large-collection-functional-tests.html b/JSLib/tests/datajs-cache-large-collection-functional-tests.html
deleted file mode 100644
index bf5cad3..0000000
--- a/JSLib/tests/datajs-cache-large-collection-functional-tests.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
- <title>datajs.cache and datajs.store full local store tests</title>
- <meta http-equiv="cache-control" content="no-cache"/>
- <meta http-equiv="pragma" content="no-cache"/>
- <meta http-equiv="expires" content="-1"/>
-
- <link rel="stylesheet" href="http://code.jquery.com/qunit/qunit-1.10.0.css" type="text/css" />
- <script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/json2/20110223/json2.js"></script>
- <script type="text/javascript" src="http://code.jquery.com/jquery-1.4.4.min.js"></script>
- <script type="text/javascript" src="http://code.jquery.com/qunit/qunit-1.10.0.js"></script>
- <script type="text/javascript" src="common/TestSynchronizerClient.js"></script>
- <script type="text/javascript">
- window.TestSynchronizer.init(QUnit);
- </script>
-
- <script type="text/javascript" src="../src/datajs.js"></script>
- <script type="text/javascript" src="../src/utils.js"></script>
- <script type="text/javascript" src="../src/xml.js"></script>
-
- <script type="text/javascript" src="../src/odata-utils.js"></script>
- <script type="text/javascript" src="../src/odata-handler.js"></script>
- <script type="text/javascript" src="../src/odata-xml.js"></script>
- <script type="text/javascript" src="../src/odata-net.js"></script>
- <script type="text/javascript" src="../src/odata-json.js"></script>
- <script type="text/javascript" src="../src/odata-atom.js"></script>
- <script type="text/javascript" src="../src/odata-metadata.js"></script>
- <script type="text/javascript" src="../src/odata-batch.js"></script>
- <script type="text/javascript" src="../src/odata.js"></script>
-
- <script type="text/javascript" src="../src/store-dom.js"></script>
- <script type="text/javascript" src="../src/store-indexeddb.js"></script>
- <script type="text/javascript" src="../src/store-memory.js"></script>
- <script type="text/javascript" src="../src/store.js"></script>
-
- <script type="text/javascript" src="../src/deferred.js"></script>
- <script type="text/javascript" src="../src/cache-source.js"></script>
- <script type="text/javascript" src="../src/cache.js"></script>
-
- <script type="text/javascript" src="common/djstest.js"></script>
- <script type="text/javascript" src="common/CacheOracle.js"></script>
- <script type="text/javascript" src="common/ObservableHttpClient.js"></script>
- <script type="text/javascript" src="common/ODataReadOracle.js"></script>
- <script type="text/javascript" src="datajs-cache-large-collection-functional-tests.js"></script>
-</head>
-<body>
- <h1 id="qunit-header">datajs.cache and datajs.store full local store tests</h1>
- <h2 id="qunit-banner"></h2>
- <h2 id="qunit-userAgent"></h2>
- <ol id="qunit-tests"></ol>
-</body>
-</html>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/datajs-cache-large-collection-functional-tests.js
----------------------------------------------------------------------
diff --git a/JSLib/tests/datajs-cache-large-collection-functional-tests.js b/JSLib/tests/datajs-cache-large-collection-functional-tests.js
deleted file mode 100644
index 1dd4c00..0000000
--- a/JSLib/tests/datajs-cache-large-collection-functional-tests.js
+++ /dev/null
@@ -1,170 +0,0 @@
-/// <reference path="../src/datajs.js" />
-/// <reference path="../src/odata-utils.js" />
-/// <reference path="../src/cache.js" />
-/// <reference path="common/djstest.js" />
-
-(function (window, undefined) {
- OData.defaultHandler.accept = "application/json;q=0.9, application/atomsvc+xml;q=0.8, */*;q=0.1";
- var largeCollectionFeed = "./endpoints/LargeCollectionService.svc/Customers";
- var itemsInCollection = 2 * 1024 * 1024;
-
- var cleanDomStorage = function (done) {
- /// <summary>Cleans all the data saved in the browser's DOM Storage. Needs to be called asynchronously in the
- /// setup and teardown methods to be consistent with indexedDb's cleanup method.</summary>
- /// <param name="done" type="Function">Function to be called after DOM storage is cleared.</param>
- if (window.localStorage) {
- window.localStorage.clear();
- }
- done();
- };
-
- var cleanIndexedDb = function (done) {
- /// <summary>Cleans all the data saved in the browser's IndexedDb Storage.</summary>
- /// <param name="done" type="Function">Function to be called after DOM storage is cleared.</param>
- var caches = this.caches;
-
- djstest.cleanStoreOnIndexedDb(caches, done);
- };
-
- var makeUnexpectedErrorHandler = function () {
- return function (err) {
- djstest.assert(false, "Unexpected call to error handler with error: " + djstest.toString(err));
- };
- };
-
- var storageMechanisms = {
- indexeddb: { cleanup: cleanIndexedDb },
- dom: { cleanup: cleanDomStorage }
- };
-
- var cleanupAllStorage = function(done) {
- /// <summary>Cleans up all available storage mechanisms in the browser.</summary>
- /// <param name="done" type="Function">Function to be called by each cleanup function after storage is cleared.</param>
- var that = this;
- var storeCleanup = [];
-
- $.each(CacheOracle.mechanisms, function(_, mechanism) {
- if (CacheOracle.isMechanismAvailable(mechanism)) {
- storeCleanup.push(function(done) {
- if (storageMechanisms[mechanism]) {
- storageMechanisms[mechanism].cleanup.call(that, done);
- } else {
- done();
- }
- });
- }
- });
-
- djstest.asyncDo(storeCleanup, done);
- };
-
-
- module("Functional", {
- setup: function () {
- this.observableHttpClient = new ObservableHttpClient();
- OData.defaultHttpClient = this.observableHttpClient;
- this.caches = [];
- var that = this;
-
- djstest.wait(function (done) {
- cleanupAllStorage.call(that, done);
- });
- },
-
- teardown: function () {
- OData.defaultHttpClient = this.observableHttpClient.provider;
- var clearActions = [];
- var that = this;
-
- $.each(this.caches, function (_, cacheObject) {
- cacheObject.cache.onidle = undefined;
-
- clearActions.push(function (done) {
- cacheObject.cache.clear().then(function () {
- done();
- },
- function (err) {
- djstest.assert(false, "Unexpected call to error handler while attempting to clear with error: " + djstest.toString(err));
- });
- });
- });
-
- djstest.wait(function (done) {
- djstest.asyncDo(clearActions, function () {
- cleanupAllStorage.call(that, function () {
- that.caches = [];
- done();
- });
- });
- });
- }
- });
-
- $.each(["dom", "indexeddb"], function (_, mechanism) {
- if (CacheOracle.isMechanismAvailable(mechanism)) {
- $.each([-1, 10 * 1024 * 1024, 1024 * 10248], function (_, cacheSize) {
- var prefetchParameters = { mechanism: mechanism, feed: largeCollectionFeed, skip: 0, take: 5, pageSize: 1024, prefetchSize: -1, cacheSize: cacheSize };
- djstest.addTest(function (params) {
-
- djstest.assertsExpected(3);
- var options = { name: "cache" + new Date().valueOf(), source: params.feed, pageSize: params.pageSize, prefetchSize: params.prefetchSize,
- mechanism: params.mechanism, cacheSize: params.cacheSize
- };
-
- var cache = odatajs.createDataCache(options);
- this.caches.push({ name: options.name,
- cache: cache
- });
-
- cache.onidle = function () {
- djstest.assert(true, "onidle Called");
- djstest.done();
- };
-
- var cacheOracle = new CacheOracle(params.feed, params.pageSize, itemsInCollection);
- var session = this.observableHttpClient.newSession();
-
- cache.readRange(params.skip, params.take).then(function (data) {
- var expectedRangeUrl = params.feed + "?$skip=" + params.skip + "&$top=" + params.take;
- cacheOracle.verifyRequests(session.requests, session.responses, params.skip, params.take, "largeCollection requests with prefetch", false, true);
- window.ODataReadOracle.readJsonAcrossServerPages(expectedRangeUrl, function (expectedData) {
- djstest.assertAreEqualDeep(data, expectedData, "Verify response data");
- });
- }, function (err) {
- makeUnexpectedErrorHandler(err)();
- });
- }, "readRange and prefetch all to fill store on " + prefetchParameters.mechanism + " with cacheSize=" + prefetchParameters.cacheSize, prefetchParameters, 600000);
-
- $.each([500, 1024 * 10 /*Test reduced from 100 to 10 to work around slow running script error in IE8 and Safari (bug 2200)*/], function (_, pageSize) {
- var largeReadParameters = { mechanism: mechanism, feed: largeCollectionFeed, skip: 0, take: 1024, pageSize: pageSize, prefetchSize: 0, cacheSize: cacheSize };
- djstest.addTest(function (params) {
-
- djstest.assertsExpected(2);
- var options = { name: "cache" + new Date().valueOf(), source: params.feed, pageSize: params.pageSize, prefetchSize: params.prefetchSize,
- mechanism: params.mechanism, cacheSize: params.cacheSize
- };
-
- var cache = odatajs.createDataCache(options);
- this.caches.push({ name: options.name, cache: cache });
-
- var cacheOracle = new CacheOracle(params.feed, params.pageSize, itemsInCollection);
- var session = this.observableHttpClient.newSession();
-
- cache.readRange(params.skip, params.take).then(function (data) {
- var expectedRangeUrl = params.feed + "?$skip=" + params.skip + "&$top=" + params.take;
- cacheOracle.verifyRequests(session.requests, session.responses, params.skip, params.take, "largeCollection requests without prefetch", false, false);
- window.ODataReadOracle.readJsonAcrossServerPages(expectedRangeUrl, function (expectedData) {
- djstest.assertAreEqualDeep(data, expectedData, "Verify response data");
- djstest.done();
- });
- }, function (err) {
- makeUnexpectedErrorHandler(err)();
- djstest.done();
- });
- }, "readRange of skip=" + largeReadParameters.skip + " take=" + largeReadParameters.take + " cacheSize=" + largeReadParameters.cacheSize + " and pageSize=" + largeReadParameters.pageSize +
- " to fill store on " + largeReadParameters.mechanism, largeReadParameters, 600000);
- });
- });
- }
- });
-})(this);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/datajs-cache-long-haul-tests.html
----------------------------------------------------------------------
diff --git a/JSLib/tests/datajs-cache-long-haul-tests.html b/JSLib/tests/datajs-cache-long-haul-tests.html
deleted file mode 100644
index 39eda48..0000000
--- a/JSLib/tests/datajs-cache-long-haul-tests.html
+++ /dev/null
@@ -1,192 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
- <title>OData Long Haul Tests</title>
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
- <meta http-equiv="expires" content="-1" />
- <script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/json2/20110223/json2.js"></script>
- <script type="text/javascript" src="http://code.jquery.com/jquery-1.4.4.js"></script>
- <script type="text/javascript" src="../src/datajs.js"></script>
- <script type="text/javascript" src="../src/utils.js"></script>
- <script type="text/javascript" src="../src/xml.js"></script>
- <script type="text/javascript" src="../src/odata-utils.js"></script>
- <script type="text/javascript" src="../src/odata-handler.js"></script>
- <script type="text/javascript" src="../src/odata-gml.js"></script>
- <script type="text/javascript" src="../src/odata-xml.js"></script>
- <script type="text/javascript" src="../src/odata-net.js"></script>
- <script type="text/javascript" src="../src/odata-json.js"></script>
- <script type="text/javascript" src="../src/odata-atom.js"></script>
- <script type="text/javascript" src="../src/odata-metadata.js"></script>
- <script type="text/javascript" src="../src/odata-batch.js"></script>
- <script type="text/javascript" src="../src/odata.js"></script>
- <script type="text/javascript" src="../src/store-dom.js"></script>
- <script type="text/javascript" src="../src/store-indexeddb.js"></script>
- <script type="text/javascript" src="../src/store-memory.js"></script>
- <script type="text/javascript" src="../src/store.js"></script>
- <script type="text/javascript" src="../src/deferred.js"></script>
- <script type="text/javascript" src="../src/cache-source.js"></script>
- <script type="text/javascript" src="../src/cache.js"></script>
- <script type="text/javascript" src="common/djstest.js"></script>
- <script type="text/javascript" src="common/Instrument.js"></script>
- <script type="text/javascript">
- var cache;
- var clearBetweenReads;
- var currentRunTimeMS;
- var failureCount;
- var hourMS = 60 * 60 * 1000;
- var goalRunTimeMS = hourMS;
- var isTotalIncreaseHigh;
- var itemsInCollection = 16;
- var iterationsRun;
- var memoryDelta = 5000000;
- var getBrowserMemorySize;
- var startMemorySize;
- var startTimeMs = 0;
- var testFeed = "http://odata.netflix.com/Catalog/Titles";
-
- var makeUnexpectedErrorHandler = function () {
- return function (err) {
- failureCount++;
- if (failureCount < 50) {
- $("#errors").append("<p>Iteration: " + iterationsRun + " Error reading cache: " + err.message + "<p>");
- }
- };
- };
-
- var checkMemoryIncrease = function (memorySizeBefore) {
- getBrowserMemorySize(function (memorySizeAfter) {
- var incrementalIncreaseInMemory = memorySizeAfter - memorySizeBefore;
- var totalIncreaseInMemory = memorySizeAfter - startMemorySize;
- if (incrementalIncreaseInMemory > memoryDelta) {
- failureCount++;
- if (failureCount < 50) {
- $("#errors").append("<p>Iteration: " + iterationsRun + " Memory usage increase in read: " + incrementalIncreaseInMemory + "<p>");
- }
- }
-
- if (totalIncreaseInMemory > memoryDelta && !isTotalIncreaseHigh) {
- isTotalIncreaseHigh = true;
- failureCount++;
- if (failureCount < 50) {
- $("#errors").append("<p>Iteration: " + iterationsRun + " Total memory usage increase over duration: " + totalIncreaseInMemory + "<p>");
- }
- }
-
- iterationsRun++;
- nextIteration();
- });
- };
-
- var readRangePrefetchTest = function () {
- var readPage = 6;
-
- getBrowserMemorySize(function (memorySizeBefore) {
- callReadRangeRepeatedly(0, readPage, function () { checkMemoryIncrease(memorySizeBefore) });
- });
- };
-
- var callReadRangeRepeatedly = function (index, count, done) {
- /// <summary>Calls readRange over the whole collection and done when all items have been read.</summary>
- /// <param name="index" type="Integer">Index to start the read.</param>
- /// <param name="count" type="String">The count of each readRange.</param>
- /// <param name="done" type="Function">Function to be called when all items in collection have been read.</param>
- var cacheRead = function () {
- cache.readRange(index, count).then(function () {
- if (index < itemsInCollection) {
- index += count;
- callReadRangeRepeatedly(index, count, done);
- }
- else {
- done();
- }
- }, makeUnexpectedErrorHandler(cache));
- };
-
- if (clearBetweenReads) {
- cache.clear().then(cacheRead(), makeUnexpectedErrorHandler(cache));
- }
- else {
- cacheRead();
- }
- }
-
- function startTest() {
- var prefetchSize =
- $('input[name=PrefetchEnabled]').attr('checked') ? -1 : 0;
- clearBetweenReads = $('input[name=ClearBetweenReads]').attr('checked');
- var inputHours = parseFloat($('#time').val());
-
- if (inputHours !== undefined && typeof inputHours === "number" && !isNaN(inputHours) && isFinite(inputHours) && inputHours > 0) {
- goalRunTimeMS = hourMS * inputHours;
- }
- OData.defaultHttpClient.enableJsonpCallback = true;
- cache = datajs.createDataCache({ name: "cache" + new Date().valueOf(), source: testFeed, pageSize: 5, prefetchSize: prefetchSize });
- failureCount = 0;
- iterationsRun = 0;
- currentRunTimeMS = 0;
- isTotalIncreaseHigh = false;
- $("#errors").empty();
- getBrowserMemorySize = Instrument.getBrowserMemorySize;
- getBrowserMemorySize(function (memorySizeStart) {
- startMemorySize = memorySizeStart;
- $("#starting-memory").text("Starting memory size: " + startMemorySize);
- });
- startTimeMs = new Date().getTime();
-
- nextIteration();
- }
-
- function nextIteration() {
- currentRunTimeMS = new Date().getTime() - startTimeMs;
- if (currentRunTimeMS > goalRunTimeMS) {
- getBrowserMemorySize(function (memorySizeAfter) {
- $("#stress-status").text("Tests complete. Iterations: " + iterationsRun + " Failures: " + failureCount +
- " Start memory: " + startMemorySize + " End memory: " + memorySizeAfter);
- });
-
- cache.clear();
- return;
- }
-
- if (iterationsRun % 100 === 0) {
- getBrowserMemorySize(function (memorySizeAfter) {
- var text = "Running tests (iterationsRun=" + iterationsRun;
- text += ", Time run: " + currentRunTimeMS + "ms";
- text += ", Remaining time: " + (goalRunTimeMS - currentRunTimeMS) + "ms";
- text += "). Failures: " + failureCount;
- text += " Current memory size: " + memorySizeAfter;
- $("#stress-status").text(text);
- });
- }
-
- readRangePrefetchTest();
- }
-
- $(document).ready(function () {
- $("#start-button").click(startTest);
- });
- </script>
-</head>
-<body>
- <h1>
- OData Long Haul</h1>
- <p>
- Repeatedly runs an action and checks the memory usage.
- </p>
- <p>
- <input name="time" id="time" type="text" />Length of time to run test</p>
- <p>
- <input type="checkbox" name="PrefetchEnabled" value="false" />Prefetch Enabled</p>
- <p>
- <input type="checkbox" name="ClearBetweenReads" value="false" />Clear Between Reads</p>
- <button id='start-button'>
- Start</button>
- <p id='errors'>
- </p>
- <p id='stress-status'>
- </p>
- <p id='starting-memory'>
- </p>
-</body>
-</html>
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/datajs-startup-perf-test.html
----------------------------------------------------------------------
diff --git a/JSLib/tests/datajs-startup-perf-test.html b/JSLib/tests/datajs-startup-perf-test.html
deleted file mode 100644
index 465ee01..0000000
--- a/JSLib/tests/datajs-startup-perf-test.html
+++ /dev/null
@@ -1,89 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<!--
-Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
-modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
--->
-<head>
- <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
- <title>datajs startup perf test</title>
-
- <link rel="stylesheet" href="http://code.jquery.com/qunit/qunit-1.10.0.css" type="text/css" />
-
- <script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/json2/20110223/json2.js"></script>
- <script type="text/javascript" src="http://code.jquery.com/jquery-1.4.4.min.js"></script>
- <script type="text/javascript" src="http://code.jquery.com/qunit/qunit-1.10.0.js"></script>
-
- <script type="text/javascript" src="common/TestSynchronizerClient.js"></script>
- <script type="text/javascript">
- window.TestSynchronizer.init(QUnit);
- </script>
-
- <script type="text/javascript" src="common/djstest.js"></script>
- <script type="text/javascript" src="common/Instrument.js"></script>
-
- <script type="text/javascript">
- $(window).load(function () {
- djstest.addTest(function startupTimeAndMemory() {
- var durationLimit = 500;
- var memorySizeDeltaLimit = 5000000;
-
- var filename = "datajs-1.1.0.min.js";
- var getBrowserMemorySize = Instrument.getBrowserMemorySize;
-
- $.ajax({
- url: "../src/" + filename,
- dataType: "text",
- success: function (script) {
- getBrowserMemorySize(function (memorySizeBefore) {
- var duration = new Date();
- eval(script);
- duration = new Date() - duration;
- getBrowserMemorySize(function (memorySizeAfter) {
- var memorySizeDelta = memorySizeAfter - memorySizeBefore;
- djstest.assert(duration < durationLimit, duration + " ms (limit " + durationLimit + " ms)");
- djstest.assert(memorySizeDelta < memorySizeDeltaLimit,
- memorySizeDelta + " bytes (limit " + memorySizeDeltaLimit + " bytes, initial " + memorySizeBefore + " bytes)");
-
- djstest.done();
- });
- });
- },
- error: function () {
- // See if we are running the dev build
- $.ajax({
- url: "../src/odata.js",
- dataType: "text",
- success: function () {
- djstest.pass("Running on dev build, no measurement taken");
- djstest.done();
- },
- error: function (jqXHR, textStatus, errorThrown) {
- djstest.fail("Request failed: " + jqXHR.responseText);
- djstest.done();
- }
- });
- }
- });
- });
- });
- </script>
-</head>
-<body>
- <h1 id="qunit-header">datajs startup perf test</h1>
- <h2 id="qunit-banner"></h2>
- <h2 id="qunit-userAgent"></h2>
- <ol id="qunit-tests">
- </ol>
-</body>
-</html>
\ No newline at end of file
[02/22] olingo-odata4-js git commit: [OLINGO-442] Cleanup bevor
release
Posted by ko...@apache.org.
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/odata-xml-tests.js
----------------------------------------------------------------------
diff --git a/JSLib/tests/odata-xml-tests.js b/JSLib/tests/odata-xml-tests.js
deleted file mode 100644
index 9eb936e..0000000
--- a/JSLib/tests/odata-xml-tests.js
+++ /dev/null
@@ -1,259 +0,0 @@
-/// <reference path="../src/odata-xml.js" />
-/// <reference path="common/djstest.js" />
-
-// odata-xml-tests.js
-
-(function (window, undefined) {
-
- // DATAJS INTERNAL START
-
- djstest.addTest(function getURIInfoTest() {
- var tests = [
- { input: "https://host.com:8080/path1/path2?p1=1&p2=2#fragment", expected: { scheme: "https:", authority: "//host.com:8080", path: "/path1/path2", query: "?p1=1&p2=2", fragment: "#fragment", isAbsolute: true} },
- { input: "http://host.com:8080/path1/path2?p1=1&p2=2#fragment", expected: { scheme: "http:", authority: "//host.com:8080", path: "/path1/path2", query: "?p1=1&p2=2", fragment: "#fragment", isAbsolute: true} },
- { input: "https:", expected: { scheme: "https:", isAbsolute: true} },
- { input: "http:", expected: { scheme: "http:", isAbsolute: true} },
- { input: "//host.com", expected: { authority: "//host.com", isAbsolute: false} },
- { input: "path1", expected: { path: "path1", isAbsolute: false} },
- { input: "?query", expected: { query: "?query", isAbsolute: false} },
- { input: "#fragment", expected: { fragment: "#fragment", isAbsolute: false} },
- { input: undefined, expected: { isAbsolute: false} },
- { input: "", expected: { isAbsolute: false} },
- { input: null, expected: { isAbsolute: false} }
- ];
-
- var i, len;
- for (i = 0, len = tests.length; i < len; i++) {
- var actual = odatajs.getURIInfo(tests[i].input);
- djstest.assertAreEqualDeep(actual, tests[i].expected, "test " + i + "didn't return the expected URI parts");
- }
- djstest.done();
- });
-
- djstest.addTest(function normalizeURICaseTest() {
- var tests = [
- { uri: "hTTp://HOST.com/path1/Path2/PATH3?Query1=x&query2=Y#Fragment", expected: "http://host.com/path1/Path2/PATH3?Query1=x&query2=Y#Fragment" },
- { uri: "http://fabrikam%20user%3AHisPassWord@www.FaBriKAM.com:5895/Path%3A%201?q1=hi%20%3Ato%20you", expected: "http://fabrikam%20user%3aHisPassWord@www.fabrikam.com:5895/Path%3a%201?q1=hi%20%3ato%20you" },
- { uri: "/PATH1/PATH2?P1=AbC#fraGment", expected: "/PATH1/PATH2?P1=AbC#fraGment" },
- { uri: "HttP://" + encodeURIComponent("FTP://www.example.com&story=breaking_news:password@www.HOST.CoM:5678/"), expected: "http://" + encodeURIComponent("FTP://www.example.com&story=breaking_news:password@www.HOST.CoM:5678/").toLowerCase() }
- ];
-
- var i, len;
- for (i = 0, len = tests.length; i < len; i++) {
- var actual = odatajs.normalizeURICase(tests[i].uri, tests[i].base);
- djstest.assertAreEqual(actual, tests[i].expected, "test " + i + "didn't return the expected URI");
- }
- djstest.done();
- });
-
- djstest.addTest(function normalizeURITest() {
- var tests = [
- { uri: "http://host.com/path1#fragment", base: "http://base", expected: "http://host.com/path1#fragment" },
- { uri: "//host.com/path1?p1=0", base: "http://base?p2=1", expected: "http://host.com/path1?p1=0" },
- { uri: "?p1=0#fragment", base: "http://base/basepath", expected: "http://base/basepath?p1=0#fragment" },
- { uri: "?p1=0#fragment", base: "http://base/basepath?p2=1", expected: "http://base/basepath?p1=0#fragment" },
- { uri: "#fragment", base: "http://base/basepath?p2=1", expected: "http://base/basepath?p2=1#fragment" },
- { uri: "/path1/path2?p1=0", base: "http://base/basePath", expected: "http://base/path1/path2?p1=0" },
- { uri: "path1/path2?p1=0", base: "http://base/basepath", expected: "http://base/path1/path2?p1=0" },
- { uri: "path1/path2?p1=0", base: "http://base/basepath/basepath2", expected: "http://base/basepath/path1/path2?p1=0" },
- { uri: "", base: "http://base/basepath?p1=0#fragment", expected: "http://base/basepath?p1=0" },
- { uri: "path1/path2?p1=0", base: "", expected: "path1/path2?p1=0" },
- { uri: "/a/b/c/./../../g", base: "http://base/basepath", expected: "http://base/a/g" },
- { uri: "a/b/c/././../../g", base: "http://base/basepath/", expected: "http://base/basepath/a/g" },
- { uri: "../a/b/c/././../../g", base: "http://base/basepath/", expected: "http://base/a/g" },
- { uri: "./a/b/c/././../../g", base: "http://base/basepath/", expected: "http://base/basepath/a/g" },
- { uri: "/../a/b/c/././../../g", base: "http://base/basepath/", expected: "http://base/a/g" },
- { uri: "/./a/b/c/././../../g", base: "http://base/basepath/", expected: "http://base/a/g" }
- ];
-
- var i, len;
- for (i = 0, len = tests.length; i < len; i++) {
- var actual = odatajs.normalizeURI(tests[i].uri, tests[i].base);
- djstest.assertAreEqual(actual, tests[i].expected, "test " + i + "didn't return the expected normalized URI");
- }
- djstest.done();
- });
-
- djstest.addTest(function xmlParseTest() {
- var xml = '<root xmlns:n1="http://namespace1" xml:base="http://base.org" />';
- var root = odatajs.xmlParse(xml);
- djstest.assert(root, "xml._parse didn't return a xml dom object");
- djstest.done();
- });
-
- djstest.addTest(function xmlbaseURITest() {
- var xml = "\
- <root xmlns:n1=\"http://namespace1\" \r\n\
- xml:base=\"http://base.org\"> \r\n\
- <element base=\"this is not a xml base attribute\" /> \r\n\
- </root>\r\n";
-
- var doc = odatajs.xmlParse(xml);
- var root = odatajs.xmlFirstChildElement(doc);
- var child = odatajs.xmlFirstChildElement(root);
-
- djstest.assertAreEqual(odatajs.xmlBaseURI(root), "http://base.org", "xml._baseURI didn't return the expected value");
- djstest.assert(!odatajs.xmlBaseURI(child), "xml._baseURI returned a value when it wasn't expected");
- djstest.done();
- });
-
- djstest.addTest(function xmlAttributeValueTest() {
- var xml = "\
- <root xmlns:n1=\"http://namespace1\" \r\n\
- xml:base=\"http://base.org\"> \r\n\
- <element attribute=\"value\" n1:nsAttribute=\"nsValue\" /> \r\n\
- </root> \r\n";
-
- var doc = odatajs.xmlParse(xml);
- var root = odatajs.xmlFirstChildElement(doc);
- var child = odatajs.xmlFirstChildElement(root);
-
- djstest.assertAreEqual(odatajs.xmlAttributeValue(child, "attribute"), "value", "xml._attribute didn't return the expected value for attribute");
- djstest.assertAreEqual(odatajs.xmlAttributeValue(child, "nsAttribute", "http://namespace1"), "nsValue", "xml._attribute didn't return the expected value for nsAttribute");
- djstest.assert(!odatajs.xmlAttributeValue(child, "nsAttribute"), "xml._attribute returned a value for nsAttribute without specifying a namespace");
-
- djstest.done();
- });
-
- djstest.addTest(function xmlLocalNameTest() {
- var xml = "<root xmlns:n1=\"http://namespace1\" /> \r\n";
-
- var doc = odatajs.xmlParse(xml);
- var root = odatajs.xmlFirstChildElement(doc);
-
- djstest.assertAreEqual(odatajs.xmlLocalName(root), "root", "xml._localName didn't return the expected localName of the root element");
- djstest.done();
- });
-
- djstest.addTest(function xmlFirstChildElement() {
- var xml = "\
- <root xmlns:n1=\"http://namespace1\" \r\n\
- xml:base=\"http://base.org\"> \r\n\
- <element1 /> \r\n\
- <element2 /> \r\n\
- </root>\r\n";
-
-
- var doc = odatajs.xmlParse(xml);
- var root = odatajs.xmlFirstChildElement(doc);
- var child = odatajs.xmlFirstChildElement(root);
-
- djstest.assertAreEqual(odatajs.xmlLocalName(child), "element1", "xml.firstElement returned didn't return the expected element");
- djstest.done();
- });
-
- djstest.addTest(function xmlChildElementsTest() {
- var xml = "\
- <root xmlns:n1=\"http://namespace1\" \r\n\
- xml:base=\"http://base.org\"> \r\n\
- <element1 /> \r\n\
- <element2 xml:base=\"http://otherBase.org\" /> \r\n\
- <n1:element3 xml:base=\"path1/path2\" /> \r\n\
- </root>\r\n";
-
- var expected = [
- { localName: "element1", nsURI: null },
- { localName: "element2", nsURI: null },
- { localName: "element3", nsURI: "http://namespace1" }
- ];
-
- var actual = [];
-
- var doc = odatajs.xmlParse(xml);
- var root = odatajs.xmlFirstChildElement(doc);
-
- odatajs.xmlChildElements(root, function (child) {
- djstest.log("in child elements callback");
- actual.push({
- localName: odatajs.xmlLocalName(child),
- nsURI: odatajs.xmlNamespaceURI(child)
- });
- });
-
- djstest.assertAreEqualDeep(actual, expected, "xml.childElements didn't return the expected elements");
- djstest.done();
- });
-
- djstest.addTest(function xmlAttributesTest() {
- var xml = "\
- <root xmlns:n1=\"http://namespace1\" \r\n\
- xml:base=\"http://base.org\" \r\n\
- attribute=\"value\" \r\n\
- n1:nsAttribute=\"nsValue\" />\r\n";
-
- var expected = {
- n1: { localName: "n1", nsURI: "http://www.w3.org/2000/xmlns/", value: "http://namespace1" },
- base: { localName: "base", nsURI: "http://www.w3.org/XML/1998/namespace", value: "http://base.org" },
- attribute: { localName: "attribute", nsURI: null, value: "value" },
- nsAttribute: { localName: "nsAttribute", nsURI: "http://namespace1", value: "nsValue" }
- };
-
- var actual = {};
-
- var doc = odatajs.xmlParse(xml);
- var root = odatajs.xmlFirstChildElement(doc);
-
- odatajs.xmlAttributes(root, function (attribute) {
- djstest.log("in child elements callback");
- var localName = odatajs.xmlLocalName(attribute);
- actual[localName] = {
- localName: localName,
- nsURI: odatajs.xmlNamespaceURI(attribute),
- value: attribute.value
- };
- });
-
- djstest.assertAreEqualDeep(actual, expected, "xml.attributes returned didn't return the expected attributes");
- djstest.done();
- });
-
- djstest.addTest(function hasLeadingOrTrailingWhitespaceTest() {
- // tests are in text / expected format.
- var tests = [
- { t: "", r: false },
- { t: " ", r: true },
- { t: "text", r: false },
- { t: "text with spaces", r: false },
- { t: "not \r\n really", r: false },
- { t: " at start", r: true },
- { t: "at end ", r: true },
- { t: "end\r", r: true },
- { t: "end\n", r: true },
- { t: "end\r\n", r: true }
- ];
-
- var i, len;
- for (i = 0, len = tests.length; i < len; i++) {
- var result = odatajs.hasLeadingOrTrailingWhitespace(tests[i].t);
- djstest.assertAreEqual(result, tests[i].r, "match for " + tests[i].t);
- }
-
- djstest.done();
- });
-
- djstest.addTest(function xmlInnerTextTest() {
- // Tests are in test / expected format.
- var tests = [
- { t: "<t>text</t>", r: "text" },
- { t: "<t>text with a <![CDATA[cdata block]]></t>", r: "text with a cdata block" },
- { t: "<t> text </t>", r: " text " },
- { t: "<t> </t>", r: null },
- { t: "<t> <b>text</b> </t>", r: null },
- { t: "<t> preceding</t>", r: " preceding" },
- { t: "<t xml:space='preserve'> <b>text</b> </t>", r: " " },
- { t: "<t xml:space='default'> <b>text</b> </t>", r: null}
- ];
-
- var i, len;
- for (i = 0, len = tests.length; i < len; i++) {
- var test = tests[i];
- var doc = odatajs.xmlParse(test.t);
- var actual = odatajs.xmlInnerText(doc);
- djstest.assertAreEqual(actual, test.r, "test for [" + test.t + "]");
- }
-
- djstest.done();
- });
-
- // DATAJS INTERNAL END
-})(this);
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/run-tests.wsf
----------------------------------------------------------------------
diff --git a/JSLib/tests/run-tests.wsf b/JSLib/tests/run-tests.wsf
deleted file mode 100644
index 26d954d..0000000
--- a/JSLib/tests/run-tests.wsf
+++ /dev/null
@@ -1,427 +0,0 @@
-<!--
-Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
-modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following conditions:
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
--->
-<job>
- <runtime>
- <description>Test driver for running datajs tests - run from the same directory as the script</description>
- <comment>
- Result codes:
- 0 - success
- 1 - failed to launch tests
- 2 - tests failed
- </comment>
- </runtime>
- <script language="JScript" src="test-list.js" />
- <script language="JScript">
-
- var exitCode;
- var fso = WScript.CreateObject("Scripting.FileSystemObject");
- var shell = WScript.CreateObject("WScript.Shell");
-
- function attempt(action, interval, maxAttempts) {
- /// <summary>Attempt an action at an interval, optionally for a maximum number of attempts</summary>
- /// <param name="action">Action callback; should return boolean whether it succeeded</param>
- /// <param name="interval">Interval (milliseconds) between attempts</param>
- /// <param name="maxAttempts">(Optional) Maximum number of attempts. Infinite if undefined.</param>
- /// <returns>Whether the action succeeded</returns>
- var done = false;
- var attempts = 0;
- while (!done) {
- var success = action();
- if (maxAttempts !== undefined) {
- attempts++;
- }
- done = success === true || (maxAttempts !== undefined && attempts >= maxAttempts);
- if (!done) {
- WScript.Sleep(interval);
- }
- }
-
- return success;
- }
-
- function parseJson(text) {
- /// <summary>Parses a JSON document, removes the 'd' wrapper.</summary>
- try {
- return eval("(" + text + ")").d;
- } catch (e) {
- throw { message: "Error parsing JSON: [" + text + "]" };
- }
- }
-
- function SaveTextToFile(content, path) {
- /// <summary>Saves text content into a file.</summary>
- /// <param name="content" type="String">Content to save.</param>
- /// <param name="path" type="String">Path of file to save into.</param>
- var ForReading = 1, ForWriting = 2;
- var file = fso.OpenTextFile(path, ForWriting, true, -1 /* open as unicode */);
- file.Write(content);
- file.Close();
- }
-
- function GetUrlSync(url) {
- var xhr;
- xhr = WScript.CreateObject("Msxml2.ServerXMLHTTP.6.0");
- xhr.open("GET", url, false);
- xhr.send();
- return xhr.responseText;
- }
-
- function LaunchBrowser(browsers, serviceRoot, followingPages, url, testRunId, outputDirectory) {
- /// <summary>Launches a browsers and waits until the service tells us the run is complete.</summary>
- /// <param name="browsers">Browsers to run.</param>
- /// <param name="serviceRoot" type="String">Root URL of the logging service.</param>
- /// <param name="followingPages" type="Array">Array of pages that should follow the given url.</param>
- /// <param name="url" type="String">URL of the page to start the browser on.</param>
- /// <param name="testRunId" type="String">ID of the test run being monitored.</param>
- /// <param name="outputDirectory" type="String">Directory in which to output screenshots.</param>
-
- for (browserName in browsers) {
- var xhr;
- var markInProgressUrl = serviceRoot + "MarkInProgress?testRunId=" + testRunId;
- GetUrlSync(markInProgressUrl);
-
- // Add all the pages that follow the given URL.
- if (followingPages && followingPages.length > 0) {
- var addFilesUrl = serviceRoot + "AddTestPages?testRunId=" + testRunId + "&pages=" + followingPages.join();
- GetUrlSync(addFilesUrl);
- }
-
- var setPrefixUrl = serviceRoot + "SetTestNamePrefix?testRunId=" + testRunId + "&prefix=" + browserName + "-";
- GetUrlSync(setPrefixUrl);
-
- exitCode = 0;
- var response;
-
- // Only the first location found from the browsers array is used. If none of the listed locations of the browser exist and the browser argument was
- // explicitly used then an exception is thrown.
- var browserFound = false;
- for (var i = 0; i < browsers[browserName].length && !browserFound; i++) {
- var path = shell.ExpandEnvironmentStrings(browsers[browserName][i]);
- if (fso.FileExists(path)) {
- browserFound = true;
-
- WScript.Echo("Navigating to " + url + " with " + path);
- var browser = shell.Exec("\"" + path + "\" " + url);
-
- var checkRunUrl = serviceRoot + "IsTestRunInProgress?testRunId=" + testRunId;
- WScript.Echo("Monitoring status on " + checkRunUrl);
-
- var interval = 2000;
- var maxAttempts = WScript.Arguments.Named.Exists("timeout") ? Math.floor((WScript.Arguments.Named.Item("timeout") / interval) * 1000) : undefined;
- var success = attempt(function () {
- return parseJson(GetUrlSync(checkRunUrl)) !== true;
- }, interval, maxAttempts);
- if (!success) {
- WScript.Echo("Timed out waiting for test to complete");
- exitCode = 2;
- }
-
- RunCommand("taskkill.exe /pid " + browser.ProcessID, true);
- }
- }
-
- // If the "/browsers" argument was explicitly used and all location have been checked, then throw an exception.
- if (!browserFound) {
- var message = "Unable to find browser at: " + path;
- if (WScript.Arguments.Named.Exists("browsers")) {
- throw { message: message };
- } else {
- WScript.Echo(message);
- }
- }
- }
- }
-
- function WriteTestRunResults(serviceRoot, testRunId, outputDirectory) {
- /// <summary>Writes the results of the test run to disk and updates the overall status.</summary>
- /// <param name="serviceRoot" type="String">Root URL of the logging service.</param>
- /// <param name="testRunId" type="String">ID of the test run being monitored.</param>
- /// <param name="outputDirectory" type="String">Directory in which to write test result files.</param>
-
- var getResultsUrl = serviceRoot + "GetTestRunResults?testRunId=" + testRunId;
- WScript.Echo("Querying " + getResultsUrl);
-
- var response = GetUrlSync(getResultsUrl);
-
- var resultsPath = outputDirectory + "\\results.trx";
- WScript.Echo("Writing results.trx file to " + resultsPath);
- SaveTextToFile(response, resultsPath);
-
- var xml = new ActiveXObject("Msxml2.DOMDocument.6.0");
- xml.loadXML(response);
- xml.setProperty("SelectionNamespaces", "xmlns:trx='http://microsoft.com/schemas/VisualStudio/TeamTest/2010'");
- xml.setProperty("SelectionLanguage", "XPath");
- var resultNode = xml.selectSingleNode("/trx:TestRun/trx:ResultSummary");
- if (resultNode === null) {
- throw { message: "Unable to find results summary" };
- }
-
- var outcome = resultNode.getAttribute("outcome");
- if (outcome !== "Passed") {
- WScript.Echo("Outcome: " + outcome);
- var failedTests = xml.selectNodes("/trx:TestRun/trx:Results/trx:UnitTestResult[@outcome != 'Passed']/@testName");
- for (var i = 0; i < failedTests.length; i++) {
- WScript.Echo(" Failed test: " + failedTests[i].value);
- }
- exitCode = 2;
- } else {
- WScript.Echo("All tests passed.");
- }
- }
-
- function CheckUrl(url) {
- var xhr = WScript.CreateObject("Msxml2.ServerXMLHTTP.6.0");
- xhr.open("GET", url, false);
- var success = false;
- try {
- xhr.send();
- success = (xhr.status === 200);
- if (!success) {
- WScript.Echo("status: " + xhr.status + " - " + xhr.statusText);
- }
- } catch (err) {
- WScript.Echo("error: " + err.message);
- }
-
- return success;
- }
-
- function ExpandWildcard(path) {
- var wcRegEx = /\\\*\*?\\/;
- var wcMatch = wcRegEx.exec(path);
-
- var paths = [];
- if (wcMatch !== null) {
- var recursive = wcMatch[0] === "\\**\\";
- var basePath = path.substring(0, wcMatch.index);
- var relativePath = path.substring(wcMatch.index + wcMatch[0].length);
-
- if (fso.FolderExists(basePath)) {
- var folder = fso.GetFolder(basePath);
- var subFolders = new Enumerator(folder.SubFolders);
-
- paths = paths.concat(ExpandWildcard(basePath + "\\" + relativePath));
-
- for (; !subFolders.atEnd(); subFolders.moveNext()) {
- var expandedPath = subFolders.item().Path + "\\"
- if (recursive) {
- expandedPath += "**\\";
- }
- expandedPath += path.substring(wcMatch.index + wcMatch[0].length);
- paths = paths.concat(ExpandWildcard(expandedPath));
- }
- }
- } else {
- paths.push(path);
- }
- return paths;
- }
-
- function FindFirstPath(candidates) {
- /// <summary>Finds the first path present from a candidate list.</summary>
- /// <param name="candidates" type="Array">Array of paths (possibly with environment variables).</param>
- /// <returns type="String">The first folder on disk found; null if none are present.</returns>
-
- var paths = [];
-
- for (var i = 0; i < candidates.length; i++) {
- var path = shell.ExpandEnvironmentStrings(candidates[i]);
- paths = paths.concat(ExpandWildcard(path));
- }
-
- for (var i = 0; i < paths.length; i++) {
- if (fso.FolderExists(paths[i]) || fso.FileExists(paths[i])) {
- return paths[i];
- }
- }
- return null;
- }
-
- function RunCommand(command, waitForExit, expectedExitCode) {
- /// <summary>Runs a command or program</summary>
- /// <param name="command" type="String">Command to run</param>
- /// <param name="waitForExit" type="Boolean">Whether to wait for program to exit</param>
- /// <param name="expectedExitCode" type="Integer">If waitForExit is true, throw if the exit code is not expected</param>
- /// <returns type="Integer">The exitcode if waitForExit is true; always 0 if waitForExit is false</returns>
- WScript.Echo("[cmd] " + command);
- var exitCode = shell.Run(command, 0, waitForExit);
- if (expectedExitCode !== undefined && exitCode !== expectedExitCode) {
- throw { message: "Process exited with unexpected exit code. (Expected: " + expectedExitCode + ", Actual: " + exitCode + ")" };
- } else {
- return exitCode;
- }
- }
-
- function SetupWebDevServer() {
- /// <summary>Starts up IIS Express if it's not running.</summary>
- /// <returns type="String">The URL to the server root.</returns>
- var siteName = "DataJS Development Site";
- var appName = "datajs";
- var port = "8989";
- var result = "http://" + shell.ExpandEnvironmentStrings("%COMPUTERNAME%").toLowerCase() + ":" + port + "/" + appName + "/";
- var url = result + "tests/common/TestLogger.svc";
-
- var success = CheckUrl(url);
-
- if (!success) {
- // Assume that we need to launch this.
- var src = fso.GetAbsolutePathName("..");
-
- var folder = FindFirstPath([
- "%ProgramFiles(x86)%\\IIS Express",
- "%ProgramFiles%\\IIS Express"]);
-
- if (!folder) {
- throw { message: "Unable to find path to IIS Express" };
- }
-
- var appCmd = "\"" + folder + "\\appcmd.exe\"";
- var iisExpress = "\"" + folder + "\\iisexpress.exe\"";
-
- // Delete site if it already exists
- WScript.Echo("Checking if site '" + siteName + "' already exists...");
- if (RunCommand(appCmd + " list site \"" + siteName + "\"", true) === 0) {
- WScript.Echo("Deleting existing site '" + siteName + "'...");
- RunCommand(appCmd + " delete site \"" + siteName + "\"", true, 0);
- }
-
- // Create site and app
- WScript.Echo("Creating site '" + siteName + "'...");
- RunCommand(appCmd + " add site /name:\"" + siteName + "\" /bindings:http/*:" + port + ": /physicalPath:%IIS_BIN%\\AppServer\\empty_wwwroot", true, 0);
-
- WScript.Echo("Creating application '" + appName + "'...");
- RunCommand(appCmd + " add app /site.name:\"" + siteName + "\" /path:\"/" + appName + "\" /physicalPath:\"" + src + "\"", true, 0);
-
- // Start the server
- WScript.Echo("Starting IIS Express server...");
- RunCommand(iisExpress + " /site:\"" + siteName + "\" /trace:error");
-
- WScript.Sleep(2 * 1000);
- success = attempt(function () {
- WScript.Echo("Waiting for server to come up, looking for " + url + " ...");
- return CheckUrl(url);
- }, 5 * 1000, 3);
-
- if (!success) {
- throw { message: "Unable to verify the URL at " + url };
- }
- }
- return result;
- }
-
- function CreateTestRunId(serviceRoot) {
- /// <summary>Creates a new test run ID from the service.</summary>
- /// <param name="serviceRoot" type="String">Root of logger service.</param>
- /// <returns type="String">The test run ID created.</returns>
- var xhr = WScript.CreateObject("Msxml2.ServerXMLHTTP.6.0");
- var url = serviceRoot + "CreateTestRun";
- xhr.open("GET", url, false);
- WScript.Echo("URL: " + url);
- xhr.send();
-
- var response = xhr.responseText;
- var result = parseJson(response);
- return result;
- }
-
- function GetBrowsers() {
- /// <summary>Gets the browsers that should be used for running the tests.</summary>
- /// <returns type="Object">Dictionary object containing the browser and its executable path as key value pairs.</returns>
- var localAppData = fso.FolderExists(shell.ExpandEnvironmentStrings("%LOCALAPPDATA%")) ? "%LOCALAPPDATA%" : "%USERPROFILE%\\Local Settings\\Application Data";
- var programFiles = fso.FolderExists(shell.ExpandEnvironmentStrings("%ProgramFiles(x86)%")) ? "%ProgramFiles(x86)%" : "%ProgramFiles%";
- var browsers = {
- IE8: [programFiles + "\\Internet Explorer\\iexplore.exe"],
- Firefox4: [programFiles + "\\Mozilla Firefox\\firefox.exe"],
- Chrome: [programFiles + "\\Google\\Chrome\\Application\\chrome.exe", localAppData + "\\Google\\Chrome\\Application\\chrome.exe"],
- Safari5: [programFiles + "\\Safari\\safari.exe"],
- Opera: [programFiles + "\\Opera\\opera.exe"]
- };
-
- var browsersToRun = {};
-
- if (WScript.Arguments.Named.Exists("browsers")) {
- browserNames = WScript.Arguments.Named.Item("browsers").split(',');
- for (i in browserNames) {
- var browserName = browserNames[i];
- if (browsers[browserName]) {
- browsersToRun[browserName] = browsers[browserName];
- } else {
- throw { message: "Unknown browser: " + browserName };
- }
- }
- }
- else {
- browsersToRun = browsers;
- }
-
- return browsersToRun;
- }
-
- function GetTestFilesList() {
- /// <summary>Gets the list of test files that are going to be executed in the test run.</summary>
- /// <returns type="Array">The list of test files.</returns>
- var testFilesList = null;
- if (WScript.Arguments.Named.Exists("testFiles")) {
- testFilesList = WScript.Arguments.Named.Item("testFiles").split(',');
- }
-
- if (testFilesList === null) {
- testFilesList = getAllTestFiles();
- }
-
- WScript.Echo("Test files to be executed: " + testFilesList.toString());
- return testFilesList;
- }
-
- function GetOutputDirectory() {
- /// <summary>Gets the test run output directory.</summary>
- /// <returns type="String">Output directory.</returns>
- var result;
- if (WScript.Arguments.Named.Exists("outputDirectory")) {
- result = WScript.Arguments.Named.Item("outputDirectory");
- } else {
- result = shell.ExpandEnvironmentStrings("%DJSOUT%\\JSLib.sln\\tests");
- }
-
-
- return result;
- }
-
- try {
- var root = SetupWebDevServer();
- var serviceRoot = root + "tests/common/TestLogger.svc/";
- var testRunId = CreateTestRunId(serviceRoot);
- WScript.Echo("Test Run ID: " + testRunId);
-
- var testFilesList = GetTestFilesList();
- var browsers = GetBrowsers();
- var outputDirectory = GetOutputDirectory();
-
- if (testFilesList.length > 0) {
- var url = root + "tests/" + testFilesList[0] + "?testRunId=" + testRunId;
- LaunchBrowser(browsers, serviceRoot, testFilesList.splice(1, testFilesList.length), url, testRunId, outputDirectory);
- WriteTestRunResults(serviceRoot, testRunId, outputDirectory);
- }
- else {
- WScript.Echo("No test files specified to run.");
- }
- } catch (e) {
- WScript.Echo("Error running tests");
- for (var p in e) WScript.Echo(p + ": " + e[p]);
- exitCode = 1;
- }
-
- WScript.Quit(exitCode);
-
- </script>
-</job>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/store-indexeddb-tests.js
----------------------------------------------------------------------
diff --git a/JSLib/tests/store-indexeddb-tests.js b/JSLib/tests/store-indexeddb-tests.js
deleted file mode 100644
index 6751363..0000000
--- a/JSLib/tests/store-indexeddb-tests.js
+++ /dev/null
@@ -1,246 +0,0 @@
-/// <reference path="../src/local-indexeddb.js" />
-/// <reference path="common/djstest.js" />
-
-// store-indexeddb-tests.js
-
-(function (window, undefined) {
- // DATAJS INTERNAL START
- var unexpectedSuccess = function (key, value) {
- djstest.fail("Unexpected call to success handler: key = " + key + ", value = " + value);
- djstest.done();
- };
-
- var unexpectedError = function (e) {
- djstest.fail("Unexpected call to error handler: " + djstest.toString(e));
- djstest.done();
- };
-
- var storeCounter = 0;
- var storeName = "test";
-
- var getNextStoreName = function () {
- storeCounter++;
- return getCurrentStoreName();
- };
-
- var getCurrentStoreName = function(){
- return storeName + storeCounter;
- };
-
- var oldWindowOnError;
-
- if (djstest.indexedDB) {
- module("Unit", {
- setup: function () {
- djstest.wait(function (done) {
- djstest.cleanStoreOnIndexedDb([{ name: getNextStoreName() }], done);
- });
-
- // FireFox 7.0.1 bubbles an error event when there is an IndexedDB error, even when the error has been handled graciously.
- // This is a work around to keep QUnit from reporting false failures in IndexedDB negative tests.
- oldWindowOnError = window.onerror;
- window.onerror = null;
- },
- teardown: function () {
- var store = this.store;
- if (store) {
- store.close();
- }
-
- djstest.wait(function (done) {
- djstest.cleanStoreOnIndexedDb([store], done);
- });
-
-
- // Restore QUnit's onerror handler.
- window.onerror = oldWindowOnError;
- }
- });
-
- djstest.addTest(function testIndexedDBStoreConstructor() {
- var store = this.store = window.odatajs.IndexedDBStore.create(getCurrentStoreName());
- djstest.assertAreEqual(store.name, getCurrentStoreName());
- djstest.assertAreEqual(store.mechanism, "indexeddb");
- djstest.done();
- });
-
- djstest.addTest(function testIndexedDBStoreAddGet() {
- var store = this.store = window.odatajs.IndexedDBStore.create(getCurrentStoreName());
- store.add("key", "value", function (key, value) {
- djstest.assertAreEqual(key, "key");
- djstest.assertAreEqual(value, "value");
- store.read("key", function (key, value) {
- djstest.assertAreEqual(key, "key");
- djstest.assertAreEqual(value, "value");
- djstest.done();
- }, unexpectedError);
- }, unexpectedError);
- });
-
- djstest.addTest(function testIndexedDBStoreAddUpdateGet() {
- var store = this.store = window.odatajs.IndexedDBStore.create(getCurrentStoreName());
- store.add("key", "value", function (key, value) {
- store.update("key", "value2", function (key, value) {
- djstest.assertAreEqual(key, "key");
- djstest.assertAreEqual(value, "value2");
- store.read("key", function (key, value) {
- djstest.assertAreEqual(key, "key");
- djstest.assertAreEqual(value, "value2");
- djstest.done();
- }, unexpectedError);
- }, unexpectedError);
- }, unexpectedError);
- });
-
- djstest.addTest(function testIndexedDBStoreAddOrUpdateGet() {
- var store = this.store = window.odatajs.IndexedDBStore.create(getCurrentStoreName());
- store.addOrUpdate("key", "value", function (key, value) {
- djstest.assertAreEqual(key, "key");
- djstest.assertAreEqual(value, "value");
- store.addOrUpdate("key", "value2", function (key, value) {
- djstest.assertAreEqual(key, "key");
- djstest.assertAreEqual(value, "value2");
- store.read("key", function (key, value) {
- djstest.assertAreEqual(key, "key");
- djstest.assertAreEqual(value, "value2");
- djstest.done();
- }, unexpectedError);
- }, unexpectedError);
- }, unexpectedError);
- });
-
- djstest.addTest(function testIndexedDBStoreAddRemoveContains() {
- var store = this.store = window.odatajs.IndexedDBStore.create(getCurrentStoreName());
- store.add("key", "value", function (key, value) {
- store.contains("key", function (result) {
- djstest.assert(result);
- store.remove("key", function () {
- djstest.pass("key removed");
- store.contains("key", function (result) {
- djstest.assert(!result);
- djstest.done();
- }, unexpectedError);
- }, unexpectedError);
- }, unexpectedError);
- }, unexpectedError);
- });
-
- djstest.addTest(function testIndexedDBStoreAddConsecutiveGetAllKeys() {
- var store = this.store = window.odatajs.IndexedDBStore.create(getCurrentStoreName());
- store.add("key", "value", function (key, value) {
- store.add("key2", "value2", function (key, value) {
- store.add("key3", "value3", function (key, value) {
- store.getAllKeys(function (keys) {
- djstest.assertAreEqualDeep(keys, ["key", "key2", "key3"]);
- djstest.done();
- }, unexpectedError);
- }, unexpectedError);
- }, unexpectedError);
- }, unexpectedError);
- });
-
- djstest.addTest(function testIndexedDBStoreAddArrayClear() {
- var addedKeys = ["key", "key2", "key3"];
- var addedValues = ["value", "value2", "value3"];
- var store = this.store = window.odatajs.IndexedDBStore.create(getCurrentStoreName());
- store.add(addedKeys, addedValues, function (keys, values) {
- djstest.assertAreEqualDeep(keys, addedKeys);
- djstest.assertAreEqualDeep(values, addedValues);
- store.clear(function () {
- store.getAllKeys(function (keys) {
- djstest.assertAreEqualDeep(keys, []);
- djstest.done();
- }, unexpectedError);
- }, unexpectedError);
- }, unexpectedError);
- });
-
- djstest.addTest(function testIndexedDBStoreAddArrayUpdateArrayGetArray() {
- var addedKeys = ["key", "key2", "key3"];
- var addedValues = ["value", "value2", "value3"];
- var store = this.store = window.odatajs.IndexedDBStore.create(getCurrentStoreName());
- store.add(addedKeys, addedValues, function (keys, values) {
- djstest.assertAreEqualDeep(keys, addedKeys);
- djstest.assertAreEqualDeep(values, addedValues);
- var updatedKeys = ["key", "key3"];
- var updatedValues = ["newValue", "newValue3"];
- store.update(updatedKeys, updatedValues, function (keys, values) {
- djstest.assertAreEqualDeep(keys, updatedKeys);
- djstest.assertAreEqualDeep(values, updatedValues);
- store.read(addedKeys, function (keys, values) {
- djstest.assertAreEqualDeep(keys, ["key", "key2", "key3"]);
- djstest.assertAreEqualDeep(values, ["newValue", "value2", "newValue3"]);
- djstest.done();
- }, unexpectedError);
- }, unexpectedError);
- }, unexpectedError);
- });
-
- djstest.addTest(function testIndexedDBStoreAddOrUpdateArrayGetArray() {
- var expectedKeys = ["key", "key2", "key3"];
- var expectedValues = ["value", "value2", "value3"];
- var store = this.store = window.odatajs.IndexedDBStore.create(getCurrentStoreName());
- store.add("key2", "value", function (key, value) {
- store.addOrUpdate(expectedKeys, expectedValues, function (keys, values) {
- djstest.assertAreEqualDeep(keys, expectedKeys);
- djstest.assertAreEqualDeep(values, expectedValues);
- store.read(keys, function (keys, values) {
- djstest.assertAreEqualDeep(values, expectedValues);
- djstest.done();
- }, unexpectedError);
- }, unexpectedError);
- }, unexpectedError);
- });
-
- djstest.addTest(function testIndexedDBStoreAddDuplicate() {
- var store = this.store = window.odatajs.IndexedDBStore.create(getCurrentStoreName());
- store.add("key", "value", function (key, value) {
- store.add("key", "value2", unexpectedSuccess, function (err) {
- djstest.pass("Error callback called as expected");
- djstest.done();
- });
- }, unexpectedError);
- });
-
- djstest.addTest(function testIndexedDBStoreAddArrayDuplicate() {
- var store = this.store = window.odatajs.IndexedDBStore.create(getCurrentStoreName());
- store.add(["key", "key2", "key"], ["value", "value2", "value3"], unexpectedSuccess, function (err) {
- djstest.pass("Error callback called as expected");
- djstest.done();
- });
- });
-
- djstest.addTest(function testIndexedDBStoreGetArrayNonExistent() {
- var store = this.store = window.odatajs.IndexedDBStore.create(getCurrentStoreName());
- store.add("key", "value", function (key, value) {
- store.read(["key", "badkey"], function (keys, values) {
- djstest.assertAreEqualDeep(keys, ["key", "badkey"]);
- djstest.assertAreEqualDeep(values, ["value", undefined]);
- djstest.done();
- }, unexpectedError);
- });
- });
-
- djstest.addTest(function testIndexedDBStoreUpdateNonExistent() {
- var store = this.store = window.odatajs.IndexedDBStore.create(getCurrentStoreName());
- store.update("badkey", "badvalue", unexpectedSuccess, function (err) {
- djstest.pass("Error callback called as expected");
- djstest.done();
- });
- });
-
- djstest.addTest(function testIndexedDBStoreUpdateArrayNonExistent() {
- var store = this.store = window.odatajs.IndexedDBStore.create(getCurrentStoreName());
- store.add("key", "value", function (key, value) {
- store.update(["key", "badkey"], ["value", "badvalue"], unexpectedSuccess, function (err) {
- djstest.pass("Error callback called as expected");
- store.read("key", function (key, value) {
- djstest.assertAreEqual(value, "value", "value was not changed");
- djstest.done();
- }), unexpectedError;
- });
- }, unexpectedError);
- });
- }
- // DATAJS INTERNAL END
-})(this);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/store-tests.js
----------------------------------------------------------------------
diff --git a/JSLib/tests/store-tests.js b/JSLib/tests/store-tests.js
deleted file mode 100644
index 4bf6d3e..0000000
--- a/JSLib/tests/store-tests.js
+++ /dev/null
@@ -1,684 +0,0 @@
-/// <reference path="../src/datajs-store.js">
-/// <reference path="../src/datajs-store-dom.js">
-/// <reference path="common/djstest.js" />
-
-// odata-tests.js
-(function (window, undefined) {
-
- var cleanDomStorage = function () {
- /// <summary>Cleans all the data saved in the browser's DOM Storage.</summary>
- if (window.localStorage) {
- window.localStorage.clear();
- }
- };
-
- var cleanMemoryStorage = function () {
- /// <summary>Clean memory storage is a no op.</summary>
- };
-
- var cleanIndexedDbStorage = function () {
- var stores = this.stores;
- $.each(stores, function (_, store) {
- store.close();
- });
-
- djstest.wait(function (done) {
- djstest.cleanStoreOnIndexedDb(stores, done);
- });
- };
-
- var canCreateMemoryStore = function () {
- /// <summary>Checks whether memory storage is supported by the browser.</summary>
- /// <returns type="Boolean">True.</summary>
- return true;
- };
-
- var canCreateDomStore = function () {
- /// <summary>Checks whether Web Storage (DOM Storage) is supported by the browser.</summary>
- /// <returns type="Boolean">True if DOM Storage is supported by the browser; false otherwise.</summary>
- return !!window.localStorage;
- };
-
- var canCreateIndexedDb = function () {
- /// <summary>Checks whether Web Storage (DOM Storage) is supported by the browser.</summary>
- /// <returns type="Boolean">True if IndexedDB is supported by the browser, false otherwise.</returns>
- return !!djstest.indexedDB;
- };
-
- var canCreateStore = function (mechanism) {
- /// <summary>Determines whether a particular mechanism is supported by the browser.</summary>
- /// <param name="mechanism" type="String">Mechanism name.</param>
- /// <returns type="Boolean">True if the mechanism is supported by the browser; otherwise false.</summary>
- var implementation = mechanismImplementations[mechanism];
- return implementation && implementation.canCreate();
- }
- var makeUnexpectedErrorHandler = function (fail) {
- return function (err) {
- djstest.fail("error: " + err.name + " -- message: " + err.message);
- fail();
- };
- };
-
- var testJobDone = function (succeeded) {
- if (!succeeded) {
- djstest.fail("Job completed but some of the functions it called failed");
- }
- djstest.done();
- };
-
- var mechanismImplementations = {
- indexeddb: { factory: odatajs.IndexedDBStore, canCreate: canCreateIndexedDb, cleanup: cleanIndexedDbStorage },
- dom: { factory: odatajs.DomStore, canCreate: canCreateDomStore, cleanup: cleanDomStorage },
- memory: { factory: odatajs.MemoryStore, canCreate: canCreateMemoryStore, cleanup: cleanMemoryStorage }
- };
-
- var oldWindowOnError;
-
- for (var mechanism in mechanismImplementations) {
- module("Unit", {
- mechanism: mechanism,
- createStore: function (name) {
- var store = odatajs.createStore(name + "_" + this.mechanism, this.mechanism);
- this.stores.push(store);
- return store;
- },
- setup: function () {
- this.stores = [];
- mechanismImplementations[this.mechanism].cleanup.call(this);
-
- // FireFox 7.0.1 bubbles an error event when there is an IndexedDB error, even when the error has been handled graciously.
- // This is a work around to keep QUnit from reporting false failures in IndexedDB negative tests.
- if (this.mechanism === "indexeddb") {
- oldWindowOnError = window.onerror;
- window.onerror = null;
- }
- },
- teardown: function () {
- mechanismImplementations[this.mechanism].cleanup.call(this);
- this.stores = [];
-
- // Restore QUnit's onerror handler.
- if (this.mechanism === "indexeddb") {
- window.onerror = oldWindowOnError;
- }
- }
- });
-
- if (!canCreateStore(mechanism)) {
- djstest.addTest(function (mechanism) {
- djstest.expectException(function () {
- mechanismImplemenatations[mechanism].factory.create("my horrible not working store");
- });
- djstest.done();
- }, "Local storage mechanism " + mechanism + " not supported by this browser", mechanism);
- } else {
-
- djstest.addTest(function storeAddTest(mechanism) {
- var tuples = [
- { key: "null", value: null },
- { key: "undefined", value: undefined },
- { key: "number", value: 12345.678 },
- { key: "string", value: "String value" },
- { key: "date", value: new Date() },
- { key: "object", value: { p1: 1234, nested: { p1: "a", p2: "b"}} },
- { key: "array", value: [1, 2, 3, 4, 5] },
- { key: "key1", value: "some value" },
- { key: "key1", value: "this should fail", error: true },
- { key: ["key", "key2"], value: ["value", "value2"], error: mechanism !== "indexeddb" },
- { key: ["key6", "key7", "key6"], value: ["value", "value2", "value3"], error: true }
- ];
-
- var store = this.createStore("store1");
- var job = new djstest.Job();
-
- $.each(tuples, function (_, tuple) {
- job.queue(function task(success, fail) {
-
- var unexpectedError = makeUnexpectedErrorHandler(fail);
- djstest.log("running task");
-
- store.add(tuple.key, tuple.value,
- function (key, value) {
- djstest.assertAreEqual(key, tuple.key, "Keys match for " + mechanism + " - key = " + key.toString());
- djstest.assertAreEqualDeep(value, tuple.value, "Values match for " + mechanism + " - key = " + key.toString());
-
- job.queueNext(function (success, fail) {
- store.read(tuple.key, function (key, value) {
- djstest.assertAreEqualDeep(value, tuple.value, "Key: " + key + " is present in the store");
- success();
- }, makeUnexpectedErrorHandler(fail));
- });
- success();
- },
- function (err) {
- if (!tuple.error) {
- unexpectedError(err);
- } else {
- djstest.pass("error handler was called as expected");
- success();
- }
- });
- });
- });
-
- job.run(function (succeeded) {
- store.close();
- testJobDone(succeeded);
- });
-
- }, "Store Add Test with mechanism " + mechanism, mechanism);
-
- djstest.addTest(function storeAddOrUpdateTest(mechanism) {
- var tuples = [
- { key: "null", value: null },
- { key: "undefined", value: undefined },
- { key: "number", value: 12345.678 },
- { key: "string", value: "String value" },
- { key: "date", value: new Date() },
- { key: "object", value: { p1: 1234, nested: { p1: "a", p2: "b"}} },
- { key: "array", value: [1, 2, 3, 4, 5] },
- { key: "key1", value: "some value" },
- { key: "key1", value: "this should not fail" },
- { key: ["key", "key2", "key3"], value: ["value", "value2", "value3"], error: mechanism !== "indexeddb" },
- { key: ["key", "key2", "key3"], value: ["value4", "value5", "value6"], error: mechanism !== "indexeddb" },
- { key: "key1", value: 456 }
- ];
-
- var store = this.createStore("store2");
- var job = new djstest.Job();
-
- $.each(tuples, function (_, tuple) {
- job.queue(function (success, fail) {
-
- var unexpectedError = makeUnexpectedErrorHandler(fail);
-
- store.addOrUpdate(tuple.key, tuple.value,
- function (key, value) {
- djstest.assert(!tuple.error, "success should be called");
- djstest.assertAreEqual(key, tuple.key, "Keys match");
- djstest.assertAreEqualDeep(value, tuple.value, "Values match");
-
- store.read(tuple.key, function (key, value) {
- djstest.assertAreEqual(key, tuple.key, "Keys match");
- djstest.assertAreEqualDeep(value, tuple.value, "Values match");
- success();
- }, unexpectedError);
- },
- function (err) {
- if (!tuple.error) {
- unexpectedError(err);
- } else {
- djstest.pass("error handler was called as expected");
- success();
- }
- });
- });
- });
-
- job.run(function (succeeded) {
- store.close();
- testJobDone(succeeded);
- });
- }, "Store Add or Update Test with mechanism " + mechanism, mechanism);
-
- djstest.addTest(function storeContainsTest(mechanism) {
- var store = this.createStore("store3");
- var job = new djstest.Job();
-
- job.queue(function (success, fail) {
- store.add("Key1", "Some value", success, makeUnexpectedErrorHandler(fail));
- });
-
- job.queue(function (success, fail) {
- store.contains("Key1", function (contained) {
- djstest.assert(contained, "Key is present in the store");
- success();
- }, makeUnexpectedErrorHandler(fail));
- });
-
- job.queue(function (success, fail) {
- store.contains("Key2", function (contained) {
- djstest.assert(!contained, "Key is not present in the store");
- success();
- }, makeUnexpectedErrorHandler(fail));
- });
-
- job.run(function (succeeded) {
- store.close();
- testJobDone(succeeded);
- });
-
- }, "Store Contains Test with mechanism " + mechanism, mechanism);
-
- djstest.addTest(function storeGetAllKeysTest(mechanism) {
- var store = this.createStore("store4");
- var store2 = this.createStore("store4_1");
-
- var expectedKeys = [];
- var job = new djstest.Job();
-
- var i;
- for (i = 1; i <= 20; i++) {
- (function (i) {
- job.queue(function (success, fail) {
- store.add(i.toString(), "value" + i, success, makeUnexpectedErrorHandler(fail));
- });
-
- job.queue(function (success, fail) {
- store2.add((i + 20).toString(), "value" + (i + 20), success, makeUnexpectedErrorHandler(fail));
- });
- })(i);
-
- expectedKeys.push(i.toString());
- }
-
- job.queue(function (success, fail) {
- store.getAllKeys(function (keys) {
- expectedKeys.sort();
- keys.sort();
- djstest.assertAreEqualDeep(keys, expectedKeys, "All expected keys where returned");
- success();
- }, makeUnexpectedErrorHandler(fail));
- });
-
- job.run(function (succeeded) {
- store.close();
- store2.close();
- testJobDone(succeeded);
- });
- }, "Store Get All Keys Test with mechanism " + mechanism, mechanism);
-
- djstest.addTest(function storeReadTest(mechanism) {
- var tuples = [
- { key: "null", value: null },
- { key: "undefined", value: undefined },
- { key: "number", value: 12345.678 },
- { key: "string", value: "String value" },
- { key: "date", value: new Date() },
- { key: "dateOffset", value: (function () {
- var d = new Date();
- d.__type = "Edm.DateTimeOffset";
- d.__offset = "+03:30";
- return d;
- })()
- },
- { key: "complexDate", value: (function () {
- var d = new Date();
- d.nestedDate = new Date();
- d.nestedDate.__type = "Edm.DateTimeOffset";
- d.nestedDate.__offset = "+03:30";
- return d;
- })()
- },
- { key: "object", value: { p1: 1234, nested: { p1: "a", p2: "b", p3: new Date()}} },
- { key: "array", value: [1, 2, 3, 4, 5] }
- ];
-
- var store = this.createStore("store5");
- var job = new djstest.Job();
-
- $.each(tuples, function (_, tuple) {
- job.queue(function (success, fail) {
- store.add(tuple.key, tuple.value,
- function () {
- job.queue(function (success, fail) {
- store.read(tuple.key, function (key, value) {
- djstest.assertAreEqual(key, tuple.key, "Keys match");
- djstest.assertAreEqualDeep(value, tuple.value, "Values match");
- success();
- }, makeUnexpectedErrorHandler(fail));
- });
- success();
- },
- function (err) {
- if (!tuple.error) {
- djstest.fail(err.message);
- fail();
- } else {
- djstest.pass("error handler was called as expected");
- success();
- }
- });
- });
- });
-
- job.queue(function (success, fail) {
- store.read("Unknown key", function (key, value) {
- djstest.assertAreEqual(value, undefined, "Store get returns undefined for keys that do not exist in the store");
- success();
- }, makeUnexpectedErrorHandler(fail));
- });
-
- job.run(function (succeeded) {
- store.close();
- testJobDone(succeeded);
- });
-
- }, "Store Read Test with mechanism " + mechanism, mechanism);
-
- djstest.addTest(function storeReadArrayTest(mechanism) {
- var makeError = function (success, fail) {
- return function (err) {
- if (mechanism !== "indexeddb") {
- djstest.pass("Error callback called as expected");
- success();
- } else {
- djstest.fail(err.message);
- fail();
- }
- };
- };
-
- var store = this.createStore("store6");
- var job = new djstest.Job();
-
- job.queue(function (success, fail) {
- store.add(["key", "key2", "key3"], ["value", "value2", "value3"], success, makeError(success, fail));
- });
-
- job.queue(function (success, fail) {
- store.read(["key", "key2", "key3"], function (keys, values) {
- djstest.assertAreEqualDeep(keys, ["key", "key2", "key3"]);
- djstest.assertAreEqualDeep(values, ["value", "value2", "value3"]);
- success();
- }, makeError(success, fail));
- });
-
- job.queue(function (success, fail) {
- store.read(["key", "badkey"], function (keys, values) {
- djstest.assertAreEqualDeep(keys, ["key", "badkey"]);
- djstest.assertAreEqualDeep(values, ["value", undefined]);
- success();
- }, makeError(success, fail));
- });
-
- job.run(function (succeeded) {
- store.close();
- testJobDone(succeeded);
- });
- }, "Store Read Array Test with mechanism " + mechanism, mechanism);
-
- djstest.addTest(function storeRemoveTest(mechanism) {
- var store = this.createStore("store7");
- var job = new djstest.Job();
-
- job.queue(function (success, fail) {
- store.add("Key1", "Some value", success, makeUnexpectedErrorHandler(fail));
- });
-
- job.queue(function (success, fail) {
- store.add("Key2", "Some value", success, makeUnexpectedErrorHandler(fail));
- });
-
- job.queue(function (success, fail) {
- store.remove("Key1", function () {
- djstest.pass("Key1 was removed from the store")
- success();
- }, makeUnexpectedErrorHandler(fail));
- });
-
- job.queue(function (success, fail) {
- store.contains("Key1", function (contained) {
- djstest.assert(!contained, "Key1 is not present in the store");
- success();
- }, makeUnexpectedErrorHandler(fail));
- });
-
- job.queue(function (success, fail) {
- store.remove("Key that has never been added", function () {
- djstest.pass('"Key that has never been added" was removed from the store');
- success();
- }, makeUnexpectedErrorHandler(fail));
- });
-
- job.queue(function (success, fail) {
- store.contains("Key2", function (contained) {
- djstest.assert(contained, "Key2 is present in the store");
- success();
- }, makeUnexpectedErrorHandler(fail));
- });
-
- job.run(function (succeeded) {
- store.close();
- testJobDone(succeeded);
- });
- }, "Store Remove Test with mechanism " + mechanism, mechanism);
-
- djstest.addTest(function storeUpdateTest(mechanism) {
- var store = this.createStore("store8");
-
- var startKey = "Key1";
- var startValue = "start value";
- var updateKey = "Key2";
- var updatedValue = "updated value";
-
- var job = new djstest.Job();
-
- job.queue(function (success, fail) {
- store.add(startKey, startValue, success, makeUnexpectedErrorHandler(fail));
- });
-
- job.queue(function (success, fail) {
- store.add(updateKey, startValue, success, makeUnexpectedErrorHandler(fail));
- });
-
- job.queue(function (success, fail) {
- store.update(updateKey, updatedValue, function (key, value) {
- djstest.assertAreEqual(key, updateKey, "Updated keys match");
- djstest.assertAreEqualDeep(value, updatedValue, "Updated values match");
- success();
- }, makeUnexpectedErrorHandler(fail));
- });
-
- job.queue(function (success, fail) {
- store.read(updateKey, function (key, value) {
- djstest.assertAreEqual(key, updateKey, "Updated keys match after get");
- djstest.assertAreEqualDeep(value, updatedValue, "Updated values match after get");
- success();
- }, makeUnexpectedErrorHandler(fail));
- });
-
- job.queue(function (success, fail) {
- store.read(startKey, function (key, value) {
- djstest.assertAreEqual(key, startKey, "Non updated keys match after get");
- djstest.assertAreEqualDeep(value, startValue, "Non updated values match after get");
- success();
- }, makeUnexpectedErrorHandler(fail));
- });
-
- job.run(function (succeeded) {
- store.close();
- testJobDone(succeeded);
- });
- }, "Store Update Test with mechanism " + mechanism, mechanism);
-
- djstest.addTest(function storeClearTest(mechanism) {
- var store = this.createStore("store9");
- var store2 = this.createStore("store9_1");
-
- var job = new djstest.Job();
- job.queue(function (success, fail) {
- store.add("Key1", "value in store", success, makeUnexpectedErrorHandler(fail));
- });
-
- job.queue(function (success, fail) {
- store.add("Key2", "value in store", success, makeUnexpectedErrorHandler(fail));
- });
-
- job.queue(function (success, fail) {
- store.add("Key3", "value in store", success, makeUnexpectedErrorHandler(fail));
- });
-
- job.queue(function (success, fail) {
- store2.add("Key1", "value in store2", success, makeUnexpectedErrorHandler(fail));
- });
-
- job.queue(function (success, fail) {
- store.clear(function () {
- djstest.pass("Store was cleared");
- success();
- }, makeUnexpectedErrorHandler(fail));
- });
-
- job.queue(function (success, fail) {
- store.contains("Key1", function (contained) {
- djstest.assert(!contained, "Key1 was removed from store");
- success();
- }, makeUnexpectedErrorHandler(fail));
- });
-
- job.queue(function (success, fail) {
- store2.contains("Key1", function (contained) {
- djstest.assert(contained, "Key1 still exists in store 2");
- success();
- }, makeUnexpectedErrorHandler(fail));
- });
-
- job.run(function (succeeded) {
- store.close();
- store2.close();
- testJobDone(succeeded);
- });
- }, "Store Clear Test with mechanism " + mechanism, mechanism);
-
- djstest.addTest(function storeUpdateNonExistentTest(mechanism) {
- var store = this.createStore("store10");
- var job = new djstest.Job();
-
- job.queue(function (success, fail) {
- store.add("key", "value", success, makeUnexpectedErrorHandler(fail));
- });
-
- job.queue(function (success, fail) {
- store.update("badKey", "new value",
- function () {
- djstest.fail("Sucess handler called when not expected");
- fail();
- },
- function (err) {
- djstest.pass("Error callback called as expexted");
- success();
- });
- });
-
- job.queue(function (success, fail) {
- store.update(["key", "badkey"], ["value", "badvalue"],
- function () {
- djstest.fail("Sucess handler called when not expected");
- fail();
- },
- function (err) {
- djstest.pass("Error callback called as expected");
- success();
- });
- });
-
- job.queue(function (success, fail) {
- store.read("key", function (key, value) {
- djstest.assertAreEqual(value, "value", "value was not changed");
- success();
- }, makeUnexpectedErrorHandler(fail));
- });
-
- job.run(function (succeeded) {
- store.close();
- testJobDone(succeeded);
- });
- }, "Store Update Non-Existent Test with mechanism " + mechanism, mechanism);
-
- djstest.addTest(function storeUpdateArrayTest(mechanism) {
- var makeError = function (success, fail) {
- return function (err) {
- if (mechanism !== "indexeddb") {
- djstest.pass("Error callback called as expected");
- success();
- } else {
- djstest.fail(err.message);
- fail();
- }
- };
- };
-
- var store = this.createStore("store11");
- var job = new djstest.Job();
-
- job.queue(function (success, fail) {
- store.add(["key", "key2"], ["value1", "value2"], success, makeError(success, fail));
- });
-
- job.queue(function (success, fail) {
- store.update(["key", "key2"], ["value1", "value4"], success, makeError(success, fail));
- });
-
- job.queue(function (success, fail) {
- store.read(["key", "key2"], function (key, value) {
- djstest.assertAreEqualDeep(value, ["value1", "value4"], "value was not changed");
- success();
- }, makeError(success, fail));
- });
-
- job.run(function (succeeded) {
- store.close();
- testJobDone(succeeded);
- });
- }, "Store Update Array Test with mechanism " + mechanism, mechanism);
- }
- }
-
- module("Unit");
-
- djstest.addTest(function CreateStoreTest() {
- var defaultExpected = canCreateDomStore() ? "dom" : "memory";
- var tests = [
- { mechanism: "dom", exception: !canCreateDomStore(), expected: "dom" },
- { mechanism: "memory", exception: false, expected: "memory" },
- { mechanism: "", exception: false, expected: defaultExpected },
- { mechanism: null, exception: false, expected: defaultExpected },
- { mechanism: "unknown", exception: true }
- ];
-
- var i, len;
- for (i = 0, len = tests.length; i < len; i++) {
- try {
- var test = tests[i];
- var store = odatajs.createStore("testStore" + i, tests[i].mechanism);
-
- if (!test.exception) {
- djstest.assertAreEqual(store.mechanism, test.expected, "Created store of the expected mechanism");
- } else {
- djstest.fail("Didn't get the expected exception");
- }
- }
- catch (e) {
- djstest.assert(test.exception, "Expected exception");
- }
- }
- djstest.done();
- });
-
- djstest.addTest(function CreateBestStoreTest() {
- var bestMechanism;
-
- for (var name in mechanismImplementations) {
- if (!bestMechanism && canCreateStore(name) && name !== "indexeddb") {
- bestMechanism = name;
- }
- }
-
- if (bestMechanism) {
- var tests = [
- "best",
- undefined
- ];
-
- for (var i in tests) {
- var store = odatajs.createStore("best store ever " + i, tests[i]);
- djstest.assertAreEqual(store.mechanism, bestMechanism, "Mechanisms match");
- }
- } else {
- djstest.pass("This browser doesn't support any of the implemented local storage mechanisms");
- }
- djstest.done();
- });
-
-})(this);
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/test-list.js
----------------------------------------------------------------------
diff --git a/JSLib/tests/test-list.js b/JSLib/tests/test-list.js
deleted file mode 100644
index 3a805d1..0000000
--- a/JSLib/tests/test-list.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
-// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// Test list for datajs tests
-
-function getAllTestFiles() {
- return [
- "odata-qunit-tests.htm"
- ];
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/test-manager.html
----------------------------------------------------------------------
diff --git a/JSLib/tests/test-manager.html b/JSLib/tests/test-manager.html
deleted file mode 100644
index fa4911a..0000000
--- a/JSLib/tests/test-manager.html
+++ /dev/null
@@ -1,88 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
- <title>datajs test manager</title>
- <script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.5.1.js"></script>
- <script type="text/javascript" src="test-list.js"></script>
- <script type="text/javascript">
- var serviceRoot = "./common/TestLogger.svc/";
- $(function () {
- $(getAllTestFiles()).each(function () {
- $("#pages").append("<input type='checkbox' name='page' value='" + this + "' checked />" + this + "<br />");
- });
- refreshActiveRuns();
- });
-
- var createTestRun = function (form) {
- $.getJSON(serviceRoot + "CreateTestRun", function (data) {
- var testRunId = data.d;
-
- // Build pages list
- var pages = [];
- $(form).find("input[name='page']:checked").each(function () {
- pages.push(this.value);
- });
-
- var firstPage = pages[0];
- pages.shift();
-
- $.get(serviceRoot + "MarkInProgress?testRunId=" + testRunId, function () {
- $.get(serviceRoot + "SetTestNamePrefix?testRunId=" + testRunId + "&prefix=" + $("#browser").val() + "-", function () {
- var renderLinks = function () {
- $("#runLink").attr("href", firstPage + "?testRunId=" + testRunId);
- $("#runLink").text(testRunId);
- $("#resultsLink").attr("href", serviceRoot + "GetTestRunResults?testRunId=" + testRunId);
- $("#resultsLink").text(testRunId);
- refreshActiveRuns();
- };
-
- if (pages.length > 0) {
- $.get(serviceRoot + "AddTestPages?testRunId=" + testRunId + "&pages=" + pages.join(","), renderLinks);
- }
- else {
- renderLinks();
- }
- });
- });
- });
- };
-
- var refreshActiveRuns = function () {
- $("#activeRuns").empty();
- $.getJSON(serviceRoot + "GetActiveTestRuns", function (data) {
- if (data.d.length === 0) {
- $("#activeRuns").text("There are no active runs");
- } else {
- $.each(data.d, function (_, id) {
- $("#activeRuns").append("<a href='" + serviceRoot + "GetTestRunResults?testRunId=" + id + "'>" + id + "</a><br />");
- })
- };
- });
- };
- </script>
-</head>
-<body>
- <h1>datajs test manager</h1>
- <table style="width:100%"><tr><td style="vertical-align:top">
- <h4>1. Create Test Run</h4>
- <form onsubmit="createTestRun(this); return false;">
- <div>Pages</div>
- <div id="pages"></div>
- <br />
- <div>Browser: <input type="text" id="browser" /></div>
- <br />
- <input type="submit" value="Create Test Run" />
- </form>
-
- <h4>2. Run Tests</h4>
- Test Run ID: <a id="runLink"></a>
-
- <h4>3. View Results</h4>
- Test Run ID: <a id="resultsLink"></a>
-
- </td><td style="vertical-align:top">
- <h4>Active Runs <input type="button" value="Refresh" onclick="refreshActiveRuns()" /></h4>
- <div id="activeRuns"></div>
- </td></tr></table>
-</body>
-</html>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/grunt-config/custom-tasks/sign.js
----------------------------------------------------------------------
diff --git a/grunt-config/custom-tasks/sign.js b/grunt-config/custom-tasks/sign.js
index 86e0d04..7f6319c 100644
--- a/grunt-config/custom-tasks/sign.js
+++ b/grunt-config/custom-tasks/sign.js
@@ -31,7 +31,7 @@ module.exports = function(grunt) {
var options = this.options({ types : [] });
var workLoad = [];
var writeToLogOk = function(data) { grunt.log.ok(data.toString()); };
-
+ //console.log("this.files" +JSON.stringify(this.files));
// fill workLoad
for(var i = 0; i < this.files.length; i++) {
for(var ii = 0; ii < this.files[i].src.length; ii++) {
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/grunt-config/sign-config.js
----------------------------------------------------------------------
diff --git a/grunt-config/sign-config.js b/grunt-config/sign-config.js
index f5bc129..a0ff676 100644
--- a/grunt-config/sign-config.js
+++ b/grunt-config/sign-config.js
@@ -25,7 +25,7 @@ module.exports = function(grunt) {
'release' : {
options: { types : ['md5', 'sha']},
expand : true,
- cwd : './../dist/<%= artifactname %>/',
+ cwd : './_dist/<%= artifactname %>/',
src : [
'<%= artifactname %>-lib.zip',
'odatajs.4.0.0-beta01.nupkg',
@@ -36,7 +36,7 @@ module.exports = function(grunt) {
'asc' : {
options: { types : ['asc']},
expand : true,
- cwd : './../dist/<%= artifactname %>/',
+ cwd : './_dist/<%= artifactname %>/',
src : [
'<%= artifactname %>-lib.zip',
'odatajs.4.0.0-beta01.nupkg',
@@ -47,7 +47,7 @@ module.exports = function(grunt) {
'asc-verify' : {
options: { types : ['asc-verify']},
expand : true,
- cwd : './../dist/<%= artifactname %>/',
+ cwd : './_dist/<%= artifactname %>/',
src : [
'<%= artifactname %>-lib.zip',
'odatajs.4.0.0-beta01.nupkg',
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/src/lib/cache.js
----------------------------------------------------------------------
diff --git a/src/lib/cache.js b/src/lib/cache.js
index da7c35b..dce74b6 100644
--- a/src/lib/cache.js
+++ b/src/lib/cache.js
@@ -336,17 +336,17 @@ function DataCacheOperation(stateMachine, promise, isCancelable, index, count, d
default:
// Any other state is passed down to the state machine describing the operation's specific behavior.
- // DATAJS INTERNAL START
+
if (true) {
// Check that the state machine actually handled the sate.
var handled = stateMachine(that, opTargetState, cacheState, data);
djsassert(handled, "Bad operation state: " + opTargetState + " cacheState: " + cacheState, this);
} else {
- // DATAJS INTERNAL END
+
stateMachine(that, opTargetState, cacheState, data);
- // DATAJS INTERNAL START
+
}
- // DATAJS INTERNAL END
+
break;
}
};
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/src/lib/deferred.js
----------------------------------------------------------------------
diff --git a/src/lib/deferred.js b/src/lib/deferred.js
index ffc2431..520a857 100644
--- a/src/lib/deferred.js
+++ b/src/lib/deferred.js
@@ -18,7 +18,7 @@
*/
'use strict';
-/** @module datajs/deferred */
+/** @module odatajs/deferred */
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/src/lib/odata.js
----------------------------------------------------------------------
diff --git a/src/lib/odata.js b/src/lib/odata.js
index 6f18c01..6f660f6 100644
--- a/src/lib/odata.js
+++ b/src/lib/odata.js
@@ -165,9 +165,9 @@ exports.request = function (request, success, error, handler, httpClient, metada
};
-/** Parses the csdl metadata to DataJS metatdata format. This method can be used when the metadata is retrieved using something other than DataJS
+/** Parses the csdl metadata to ODataJS metatdata format. This method can be used when the metadata is retrieved using something other than odatajs
* @param {string} csdlMetadataDocument - A string that represents the entire csdl metadata.
- * @returns {Object} An object that has the representation of the metadata in Datajs format.
+ * @returns {Object} An object that has the representation of the metadata in odatajs format.
*/
exports.parseMetadata = function (csdlMetadataDocument) {
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/src/lib/store/indexeddb.js
----------------------------------------------------------------------
diff --git a/src/lib/store/indexeddb.js b/src/lib/store/indexeddb.js
index aea0a50..d7527c1 100644
--- a/src/lib/store/indexeddb.js
+++ b/src/lib/store/indexeddb.js
@@ -75,7 +75,7 @@ function getError(error, defaultError) {
function openStoreDb(store, success, error) {
var storeName = store.name;
- var dbName = "_datajs_" + storeName;
+ var dbName = "_odatajs_" + storeName;
var request = indexedDB.open(dbName);
request.onblocked = error;
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/src/lib/utils.js
----------------------------------------------------------------------
diff --git a/src/lib/utils.js b/src/lib/utils.js
index 77b2cde..429a56a 100644
--- a/src/lib/utils.js
+++ b/src/lib/utils.js
@@ -18,7 +18,7 @@
*/
'use strict';
-/** @module datajs/utils */
+/** @module odatajs/utils */
function inBrowser() {
@@ -92,7 +92,6 @@ function delay(callback) {
* @param {String} message - Message explaining the assertion.
* @param {Object} data - Additional data to be included in the exception.
*/
-// DATAJS INTERNAL START
function djsassert(condition, message, data) {
@@ -100,7 +99,6 @@ function djsassert(condition, message, data) {
throw { message: "Assert fired: " + message, data: data };
}
}
-// DATAJS INTERNAL END
/** Extends the target with the specified values.
* @param {Object} target - Object to add properties to.
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/src/lib/xml.js
----------------------------------------------------------------------
diff --git a/src/lib/xml.js b/src/lib/xml.js
index 0f9cb0b..194b4ba 100644
--- a/src/lib/xml.js
+++ b/src/lib/xml.js
@@ -19,7 +19,7 @@
'use strict';
-/** @module datajs/xml */
+/** @module odatajs/xml */
var utils = require('./utils.js');
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/tests/odata-fuzz.html
----------------------------------------------------------------------
diff --git a/tests/odata-fuzz.html b/tests/odata-fuzz.html
index 740b31a..908ea82 100644
--- a/tests/odata-fuzz.html
+++ b/tests/odata-fuzz.html
@@ -551,7 +551,7 @@
<body>
<h1>OData Fuzzing Tests</h1>
<p>
-This page fuzzes the OData parsers in the datajs library.
+This page fuzzes the OData parsers in the odatajs library.
</p>
<button id='start-button'>Start</button>
<p id='fuzz-status'> </p>
[22/22] olingo-odata4-js git commit: [OLINGO-442] Cleanup bevor
release
Posted by ko...@apache.org.
[OLINGO-442] Cleanup bevor release
Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/commit/4621d41c
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/tree/4621d41c
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/diff/4621d41c
Branch: refs/heads/master
Commit: 4621d41c81e4de2c116fdb35c16f3a5a5f3cc3ea
Parents: 601cca1
Author: Sven Kobler <sv...@sap.com>
Authored: Mon Mar 23 10:58:25 2015 +0100
Committer: Sven Kobler <sv...@sap.com>
Committed: Mon Mar 23 10:58:25 2015 +0100
----------------------------------------------------------------------
Gruntfile.js | 6 +-
JSLib/src/cache-source.js | 197 -
JSLib/src/cache.js | 1361 -----
JSLib/src/datajs.js | 61 -
JSLib/src/deferred.js | 179 -
JSLib/src/odata-atom.js | 1411 ------
JSLib/src/odata-batch.js | 393 --
JSLib/src/odata-gml.js | 831 ---
JSLib/src/odata-handler.js | 276 -
JSLib/src/odata-json-light.js | 1442 ------
JSLib/src/odata-json.js | 338 --
JSLib/src/odata-metadata.js | 516 --
JSLib/src/odata-net.js | 331 --
JSLib/src/odata-utils.js | 1134 -----
JSLib/src/odata-xml.js | 837 ---
JSLib/src/odata.js | 155 -
JSLib/src/store-dom.js | 320 --
JSLib/src/store-indexeddb.js | 417 --
JSLib/src/store-memory.js | 231 -
JSLib/src/store.js | 61 -
JSLib/src/utils.js | 547 --
JSLib/src/xml.js | 824 ---
JSLib/tests/cache-tests.js | 1191 -----
JSLib/tests/code/ReflectionDataContext.cs | 742 ---
JSLib/tests/code/atomreader.cs | 796 ---
JSLib/tests/code/csdlreader.cs | 186 -
JSLib/tests/code/jsdate.cs | 40 -
JSLib/tests/code/jsonobject.cs | 80 -
JSLib/tests/code/readerutils.cs | 68 -
JSLib/tests/common/CacheOracle.js | 228 -
JSLib/tests/common/Instrument.js | 48 -
JSLib/tests/common/Instrument.svc | 71 -
JSLib/tests/common/ODataReadOracle.js | 205 -
JSLib/tests/common/ODataReadOracle.svc | 189 -
JSLib/tests/common/ObservableHttpClient.js | 78 -
JSLib/tests/common/TestLogger.svc | 846 ----
JSLib/tests/common/TestSynchronizerClient.js | 218 -
JSLib/tests/common/djstest.js | 409 --
JSLib/tests/common/gpo-ie8-tour-disable.reg | Bin 384 -> 0 bytes
JSLib/tests/common/mockHttpClient.js | 107 -
JSLib/tests/common/mockXMLHttpRequest.js | 192 -
JSLib/tests/common/rx.js | 6 -
...cache-large-collection-functional-tests.html | 53 -
...s-cache-large-collection-functional-tests.js | 170 -
JSLib/tests/datajs-cache-long-haul-tests.html | 192 -
JSLib/tests/datajs-startup-perf-test.html | 89 -
JSLib/tests/endpoints/BasicAuthDataService.svc | 108 -
JSLib/tests/endpoints/CustomAnnotations.xml | 102 -
JSLib/tests/endpoints/CustomDataService.svc | 76 -
JSLib/tests/endpoints/EpmDataService.svc | 315 --
JSLib/tests/endpoints/ErrorDataService.svc | 56 -
.../tests/endpoints/FoodStoreDataServiceV4.svc | 589 ---
.../tests/endpoints/LargeCollectionService.svc | 93 -
JSLib/tests/endpoints/web.config | 26 -
JSLib/tests/odata-atom-tests.js | 4745 ------------------
JSLib/tests/odata-batch-functional-tests.html | 43 -
JSLib/tests/odata-batch-functional-tests.js | 270 -
JSLib/tests/odata-batch-tests.js | 551 --
.../odata-cache-filter-functional-tests.html | 56 -
.../odata-cache-filter-functional-tests.js | 416 --
JSLib/tests/odata-cache-fperf-tests.html | 54 -
JSLib/tests/odata-cache-fperf-tests.js | 103 -
JSLib/tests/odata-cache-functional-tests.html | 56 -
JSLib/tests/odata-cache-functional-tests.js | 611 ---
.../tests/odata-cache-rx-functional-tests.html | 54 -
JSLib/tests/odata-cache-rx-functional-tests.js | 74 -
JSLib/tests/odata-fuzz.html | 561 ---
JSLib/tests/odata-handler-tests.js | 319 --
JSLib/tests/odata-json-light-tests.js | 2479 ---------
JSLib/tests/odata-json-tests.js | 888 ----
JSLib/tests/odata-links-functional-tests.html | 44 -
JSLib/tests/odata-links-functional-tests.js | 232 -
...ata-metadata-awareness-functional-tests.html | 43 -
...odata-metadata-awareness-functional-tests.js | 227 -
JSLib/tests/odata-metadata-tests.js | 486 --
JSLib/tests/odata-net-tests.js | 286 --
JSLib/tests/odata-perf-tests.html | 45 -
JSLib/tests/odata-perf-tests.js | 229 -
JSLib/tests/odata-qunit-tests.htm | 96 -
...odata-read-crossdomain-functional-tests.html | 53 -
.../odata-read-crossdomain-functional-tests.js | 137 -
JSLib/tests/odata-read-functional-tests.html | 45 -
JSLib/tests/odata-read-functional-tests.js | 583 ---
JSLib/tests/odata-request-functional-tests.html | 44 -
JSLib/tests/odata-request-functional-tests.js | 386 --
JSLib/tests/odata-roundtrip-functional-tests.js | 374 --
JSLib/tests/odata-tests.js | 306 --
JSLib/tests/odata-xml-tests.js | 259 -
JSLib/tests/run-tests.wsf | 427 --
JSLib/tests/store-indexeddb-tests.js | 246 -
JSLib/tests/store-tests.js | 684 ---
JSLib/tests/test-list.js | 20 -
JSLib/tests/test-manager.html | 88 -
grunt-config/custom-tasks/sign.js | 2 +-
grunt-config/sign-config.js | 6 +-
src/lib/cache.js | 8 +-
src/lib/deferred.js | 2 +-
src/lib/odata.js | 4 +-
src/lib/store/indexeddb.js | 2 +-
src/lib/utils.js | 4 +-
src/lib/xml.js | 2 +-
tests/odata-fuzz.html | 2 +-
...cache-large-collection-functional-tests.html | 4 +-
tests/run-tests.wsf | 2 +-
104 files changed, 21 insertions(+), 36074 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/Gruntfile.js
----------------------------------------------------------------------
diff --git a/Gruntfile.js b/Gruntfile.js
index 79acfab..6bf2290 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -130,12 +130,12 @@ module.exports = function(grunt) {
'build',
'doc',
'copy:release-lib','copy:release-doc','copy:release-sources',
- /*'rat:dist', // check the license headers
- 'compress:release-lib','compress:release-doc','compress:release-sources',*/
+ 'rat:dist', // check the license headers
+ 'compress:release-lib','compress:release-doc','compress:release-sources'
]);
- grunt.registerTask('release:sign','Sign the files which are released (run "grunt release" before"',[
+ grunt.registerTask('release_sign','Sign the files which are released (run "grunt release" before"',[
'sign:release','sign:asc','sign:asc-verify'
]);
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/src/cache-source.js
----------------------------------------------------------------------
diff --git a/JSLib/src/cache-source.js b/JSLib/src/cache-source.js
deleted file mode 100644
index da55d1f..0000000
--- a/JSLib/src/cache-source.js
+++ /dev/null
@@ -1,197 +0,0 @@
-/// <reference path="odata-utils.js" />
-
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
-// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// cache-source.js
-
-(function (window, undefined) {
-
- var datajs = window.odatajs || {};
- var odata = window.OData || {};
- var parseInt10 = odatajs.parseInt10;
- var normalizeURICase = odatajs.normalizeURICase;
-
- // CONTENT START
-
- var appendQueryOption = function (uri, queryOption) {
- /// <summary>Appends the specified escaped query option to the specified URI.</summary>
- /// <param name="uri" type="String">URI to append option to.</param>
- /// <param name="queryOption" type="String">Escaped query option to append.</param>
- var separator = (uri.indexOf("?") >= 0) ? "&" : "?";
- return uri + separator + queryOption;
- };
-
- var appendSegment = function (uri, segment) {
- /// <summary>Appends the specified segment to the given URI.</summary>
- /// <param name="uri" type="String">URI to append a segment to.</param>
- /// <param name="segment" type="String">Segment to append.</param>
- /// <returns type="String">The original URI with a new segment appended.</returns>
-
- var index = uri.indexOf("?");
- var queryPortion = "";
- if (index >= 0) {
- queryPortion = uri.substr(index);
- uri = uri.substr(0, index);
- }
-
- if (uri[uri.length - 1] !== "/") {
- uri += "/";
- }
- return uri + segment + queryPortion;
- };
-
- var buildODataRequest = function (uri, options) {
- /// <summary>Builds a request object to GET the specified URI.</summary>
- /// <param name="uri" type="String">URI for request.</param>
- /// <param name="options" type="Object">Additional options.</param>
-
- return {
- method: "GET",
- requestUri: uri,
- user: options.user,
- password: options.password,
- enableJsonpCallback: options.enableJsonpCallback,
- callbackParameterName: options.callbackParameterName,
- formatQueryString: options.formatQueryString
- };
- };
-
- var findQueryOptionStart = function (uri, name) {
- /// <summary>Finds the index where the value of a query option starts.</summary>
- /// <param name="uri" type="String">URI to search in.</param>
- /// <param name="name" type="String">Name to look for.</param>
- /// <returns type="Number">The index where the query option starts.</returns>
-
- var result = -1;
- var queryIndex = uri.indexOf("?");
- if (queryIndex !== -1) {
- var start = uri.indexOf("?" + name + "=", queryIndex);
- if (start === -1) {
- start = uri.indexOf("&" + name + "=", queryIndex);
- }
- if (start !== -1) {
- result = start + name.length + 2;
- }
- }
- return result;
- };
-
- var queryForData = function (uri, options, success, error) {
- /// <summary>Gets data from an OData service.</summary>
- /// <param name="uri" type="String">URI to the OData service.</param>
- /// <param name="options" type="Object">Object with additional well-known request options.</param>
- /// <param name="success" type="Function">Success callback.</param>
- /// <param name="error" type="Function">Error callback.</param>
- /// <returns type="Object">Object with an abort method.</returns>
-
- var request = queryForDataInternal(uri, options, {}, success, error);
- return request;
- };
-
- var queryForDataInternal = function (uri, options, data, success, error) {
- /// <summary>Gets data from an OData service taking into consideration server side paging.</summary>
- /// <param name="uri" type="String">URI to the OData service.</param>
- /// <param name="options" type="Object">Object with additional well-known request options.</param>
- /// <param name="data" type="Array">Array that stores the data provided by the OData service.</param>
- /// <param name="success" type="Function">Success callback.</param>
- /// <param name="error" type="Function">Error callback.</param>
- /// <returns type="Object">Object with an abort method.</returns>
-
- var request = buildODataRequest(uri, options);
- var currentRequest = odata.request(request, function (newData) {
- var nextLink = newData["@odata.nextLink"];
- if (nextLink) {
- var index = uri.indexOf(".svc/", 0);
- if (index != -1) {
- nextLink = uri.substring(0, index + 5) + nextLink;
- }
- }
-
- if (data.value && newData.value) {
- data.value = data.value.concat(newData.value);
- }
- else {
- for (var property in newData) {
- if (property != "@odata.nextLink") {
- data[property] = newData[property];
- }
- }
- }
-
- if (nextLink) {
- currentRequest = queryForDataInternal(nextLink, options, data, success, error);
- }
- else {
- success(data);
- }
- }, error, undefined, options.httpClient, options.metadata);
-
- return {
- abort: function () {
- currentRequest.abort();
- }
- };
- };
-
- var ODataCacheSource = function (options) {
- /// <summary>Creates a data cache source object for requesting data from an OData service.</summary>
- /// <param name="options">Options for the cache data source.</param>
- /// <returns type="ODataCacheSource">A new data cache source instance.</returns>
-
- var that = this;
- var uri = options.source;
-
- that.identifier = normalizeURICase(encodeURI(decodeURI(uri)));
- that.options = options;
-
- that.count = function (success, error) {
- /// <summary>Gets the number of items in the collection.</summary>
- /// <param name="success" type="Function">Success callback with the item count.</param>
- /// <param name="error" type="Function">Error callback.</param>
- /// <returns type="Object">Request object with an abort method./<param>
-
- var options = that.options;
- return odata.request(
- buildODataRequest(appendSegment(uri, "$count"), options),
- function (data) {
- var count = parseInt10(data.toString());
- if (isNaN(count)) {
- error({ message: "Count is NaN", count: count });
- } else {
- success(count);
- }
- }, error, undefined, options.httpClient, options.metadata);
- };
-
- that.read = function (index, count, success, error) {
- /// <summary>Gets a number of consecutive items from the collection.</summary>
- /// <param name="index" type="Number">Zero-based index of the items to retrieve.</param>
- /// <param name="count" type="Number">Number of items to retrieve.</param>
- /// <param name="success" type="Function">Success callback with the requested items.</param>
- /// <param name="error" type="Function">Error callback.</param>
- /// <returns type="Object">Request object with an abort method./<param>
-
- var queryOptions = "$skip=" + index + "&$top=" + count;
- return queryForData(appendQueryOption(uri, queryOptions), that.options, success, error);
- };
-
- return that;
- };
-
- // DATAJS INTERNAL START
- window.odatajs.ODataCacheSource = ODataCacheSource;
- // DATAJS INTERNAL END
-
- // CONTENT END
-})(this);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/src/cache.js
----------------------------------------------------------------------
diff --git a/JSLib/src/cache.js b/JSLib/src/cache.js
deleted file mode 100644
index b3669a9..0000000
--- a/JSLib/src/cache.js
+++ /dev/null
@@ -1,1361 +0,0 @@
-/// <reference path="odata-utils.js" />
-
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
-// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// cache.js
-
-(function (window, undefined) {
-
- var datajs = window.odatajs || {};
-
- var assigned = odatajs.assigned;
- var delay = odatajs.delay;
- var extend = odatajs.extend;
- var djsassert = odatajs.djsassert;
- var isArray = odatajs.isArray;
- var normalizeURI = odatajs.normalizeURI;
- var parseInt10 = odatajs.parseInt10;
- var undefinedDefault = odatajs.undefinedDefault;
-
- var createDeferred = odatajs.createDeferred;
- var DjsDeferred = odatajs.DjsDeferred;
- var ODataCacheSource = odatajs.ODataCacheSource;
- var getJsonValueArraryLength = odatajs.getJsonValueArraryLength;
- var sliceJsonValueArray = odatajs.sliceJsonValueArray;
- var concatJsonValueArray = odatajs.concatJsonValueArray;
-
- // CONTENT START
-
- var appendPage = function (operation, page) {
- /// <summary>Appends a page's data to the operation data.</summary>
- /// <param name="operation" type="Object">Operation with (i)ndex, (c)ount and (d)ata.</param>
- /// <param name="page" type="Object">Page with (i)ndex, (c)ount and (d)ata.</param>
-
- var intersection = intersectRanges(operation, page);
- var start = 0;
- var end = 0;
- if (intersection) {
- start = intersection.i - page.i;
- end = start + (operation.c - getJsonValueArraryLength(operation.d));
- }
-
- operation.d = concatJsonValueArray(operation.d, sliceJsonValueArray(page.d, start, end));
- };
-
- var intersectRanges = function (x, y) {
- /// <summary>Returns the {(i)ndex, (c)ount} range for the intersection of x and y.</summary>
- /// <param name="x" type="Object">Range with (i)ndex and (c)ount members.</param>
- /// <param name="y" type="Object">Range with (i)ndex and (c)ount members.</param>
- /// <returns type="Object">The intersection (i)ndex and (c)ount; undefined if there is no intersection.</returns>
-
- var xLast = x.i + x.c;
- var yLast = y.i + y.c;
- var resultIndex = (x.i > y.i) ? x.i : y.i;
- var resultLast = (xLast < yLast) ? xLast : yLast;
- var result;
- if (resultLast >= resultIndex) {
- result = { i: resultIndex, c: resultLast - resultIndex };
- }
-
- return result;
- };
-
- var checkZeroGreater = function (val, name) {
- /// <summary>Checks whether val is a defined number with value zero or greater.</summary>
- /// <param name="val" type="Number">Value to check.</param>
- /// <param name="name" type="String">Parameter name to use in exception.</param>
-
- if (val === undefined || typeof val !== "number") {
- throw { message: "'" + name + "' must be a number." };
- }
-
- if (isNaN(val) || val < 0 || !isFinite(val)) {
- throw { message: "'" + name + "' must be greater than or equal to zero." };
- }
- };
-
- var checkUndefinedGreaterThanZero = function (val, name) {
- /// <summary>Checks whether val is undefined or a number with value greater than zero.</summary>
- /// <param name="val" type="Number">Value to check.</param>
- /// <param name="name" type="String">Parameter name to use in exception.</param>
-
- if (val !== undefined) {
- if (typeof val !== "number") {
- throw { message: "'" + name + "' must be a number." };
- }
-
- if (isNaN(val) || val <= 0 || !isFinite(val)) {
- throw { message: "'" + name + "' must be greater than zero." };
- }
- }
- };
-
- var checkUndefinedOrNumber = function (val, name) {
- /// <summary>Checks whether val is undefined or a number</summary>
- /// <param name="val" type="Number">Value to check.</param>
- /// <param name="name" type="String">Parameter name to use in exception.</param>
- if (val !== undefined && (typeof val !== "number" || isNaN(val) || !isFinite(val))) {
- throw { message: "'" + name + "' must be a number." };
- }
- };
-
- var removeFromArray = function (arr, item) {
- /// <summary>Performs a linear search on the specified array and removes the first instance of 'item'.</summary>
- /// <param name="arr" type="Array">Array to search.</param>
- /// <param name="item">Item being sought.</param>
- /// <returns type="Boolean">Whether the item was removed.</returns>
-
- var i, len;
- for (i = 0, len = arr.length; i < len; i++) {
- if (arr[i] === item) {
- arr.splice(i, 1);
- return true;
- }
- }
-
- return false;
- };
-
- var estimateSize = function (obj) {
- /// <summary>Estimates the size of an object in bytes.</summary>
- /// <param name="obj" type="Object">Object to determine the size of.</param>
- /// <returns type="Integer">Estimated size of the object in bytes.</returns>
- var size = 0;
- var type = typeof obj;
-
- if (type === "object" && obj) {
- for (var name in obj) {
- size += name.length * 2 + estimateSize(obj[name]);
- }
- } else if (type === "string") {
- size = obj.length * 2;
- } else {
- size = 8;
- }
- return size;
- };
-
- var snapToPageBoundaries = function (lowIndex, highIndex, pageSize) {
- /// <summary>Snaps low and high indices into page sizes and returns a range.</summary>
- /// <param name="lowIndex" type="Number">Low index to snap to a lower value.</param>
- /// <param name="highIndex" type="Number">High index to snap to a higher value.</param>
- /// <param name="pageSize" type="Number">Page size to snap to.</param>
- /// <returns type="Object">A range with (i)ndex and (c)ount of elements.</returns>
-
- lowIndex = Math.floor(lowIndex / pageSize) * pageSize;
- highIndex = Math.ceil((highIndex + 1) / pageSize) * pageSize;
- return { i: lowIndex, c: highIndex - lowIndex };
- };
-
- // The DataCache is implemented using state machines. The following constants are used to properly
- // identify and label the states that these machines transition to.
-
- // DataCache state constants
-
- var CACHE_STATE_DESTROY = "destroy";
- var CACHE_STATE_IDLE = "idle";
- var CACHE_STATE_INIT = "init";
- var CACHE_STATE_READ = "read";
- var CACHE_STATE_PREFETCH = "prefetch";
- var CACHE_STATE_WRITE = "write";
-
- // DataCacheOperation state machine states.
- // Transitions on operations also depend on the cache current of the cache.
-
- var OPERATION_STATE_CANCEL = "cancel";
- var OPERATION_STATE_END = "end";
- var OPERATION_STATE_ERROR = "error";
- var OPERATION_STATE_START = "start";
- var OPERATION_STATE_WAIT = "wait";
-
- // Destroy state machine states
-
- var DESTROY_STATE_CLEAR = "clear";
-
- // Read / Prefetch state machine states
-
- var READ_STATE_DONE = "done";
- var READ_STATE_LOCAL = "local";
- var READ_STATE_SAVE = "save";
- var READ_STATE_SOURCE = "source";
-
- var DataCacheOperation = function (stateMachine, promise, isCancelable, index, count, data, pending) {
- /// <summary>Creates a new operation object.</summary>
- /// <param name="stateMachine" type="Function">State machine that describes the specific behavior of the operation.</param>
- /// <param name="promise" type ="DjsDeferred">Promise for requested values.</param>
- /// <param name="isCancelable" type ="Boolean">Whether this operation can be canceled or not.</param>
- /// <param name="index" type="Number">Index of first item requested.</param>
- /// <param name="count" type="Number">Count of items requested.</param>
- /// <param name="data" type="Array">Array with the items requested by the operation.</param>
- /// <param name="pending" type="Number">Total number of pending prefetch records.</param>
- /// <returns type="DataCacheOperation">A new data cache operation instance.</returns>
-
- /// <field name="p" type="DjsDeferred">Promise for requested values.</field>
- /// <field name="i" type="Number">Index of first item requested.</field>
- /// <field name="c" type="Number">Count of items requested.</field>
- /// <field name="d" type="Array">Array with the items requested by the operation.</field>
- /// <field name="s" type="Array">Current state of the operation.</field>
- /// <field name="canceled" type="Boolean">Whether the operation has been canceled.</field>
- /// <field name="pending" type="Number">Total number of pending prefetch records.</field>
- /// <field name="oncomplete" type="Function">Callback executed when the operation reaches the end state.</field>
-
- var stateData;
- var cacheState;
- var that = this;
-
- that.p = promise;
- that.i = index;
- that.c = count;
- that.d = data;
- that.s = OPERATION_STATE_START;
-
- that.canceled = false;
- that.pending = pending;
- that.oncomplete = null;
-
- that.cancel = function () {
- /// <summary>Transitions this operation to the cancel state and sets the canceled flag to true.</summary>
- /// <remarks>The function is a no-op if the operation is non-cancelable.</summary>
-
- if (!isCancelable) {
- return;
- }
-
- var state = that.s;
- if (state !== OPERATION_STATE_ERROR && state !== OPERATION_STATE_END && state !== OPERATION_STATE_CANCEL) {
- that.canceled = true;
- transition(OPERATION_STATE_CANCEL, stateData);
- }
- };
-
- that.complete = function () {
- /// <summary>Transitions this operation to the end state.</summary>
-
- djsassert(that.s !== OPERATION_STATE_END, "DataCacheOperation.complete() - operation is in the end state", that);
- transition(OPERATION_STATE_END, stateData);
- };
-
- that.error = function (err) {
- /// <summary>Transitions this operation to the error state.</summary>
- if (!that.canceled) {
- djsassert(that.s !== OPERATION_STATE_END, "DataCacheOperation.error() - operation is in the end state", that);
- djsassert(that.s !== OPERATION_STATE_ERROR, "DataCacheOperation.error() - operation is in the error state", that);
- transition(OPERATION_STATE_ERROR, err);
- }
- };
-
- that.run = function (state) {
- /// <summary>Executes the operation's current state in the context of a new cache state.</summary>
- /// <param name="state" type="Object">New cache state.</param>
-
- cacheState = state;
- that.transition(that.s, stateData);
- };
-
- that.wait = function (data) {
- /// <summary>Transitions this operation to the wait state.</summary>
-
- djsassert(that.s !== OPERATION_STATE_END, "DataCacheOperation.wait() - operation is in the end state", that);
- transition(OPERATION_STATE_WAIT, data);
- };
-
- var operationStateMachine = function (opTargetState, cacheState, data) {
- /// <summary>State machine that describes all operations common behavior.</summary>
- /// <param name="opTargetState" type="Object">Operation state to transition to.</param>
- /// <param name="cacheState" type="Object">Current cache state.</param>
- /// <param name="data" type="Object" optional="true">Additional data passed to the state.</param>
-
- switch (opTargetState) {
- case OPERATION_STATE_START:
- // Initial state of the operation. The operation will remain in this state until the cache has been fully initialized.
- if (cacheState !== CACHE_STATE_INIT) {
- stateMachine(that, opTargetState, cacheState, data);
- }
- break;
-
- case OPERATION_STATE_WAIT:
- // Wait state indicating that the operation is active but waiting for an asynchronous operation to complete.
- stateMachine(that, opTargetState, cacheState, data);
- break;
-
- case OPERATION_STATE_CANCEL:
- // Cancel state.
- stateMachine(that, opTargetState, cacheState, data);
- that.fireCanceled();
- transition(OPERATION_STATE_END);
- break;
-
- case OPERATION_STATE_ERROR:
- // Error state. Data is expected to be an object detailing the error condition.
- stateMachine(that, opTargetState, cacheState, data);
- that.canceled = true;
- that.fireRejected(data);
- transition(OPERATION_STATE_END);
- break;
-
- case OPERATION_STATE_END:
- // Final state of the operation.
- if (that.oncomplete) {
- that.oncomplete(that);
- }
- if (!that.canceled) {
- that.fireResolved();
- }
- stateMachine(that, opTargetState, cacheState, data);
- break;
-
- default:
- // Any other state is passed down to the state machine describing the operation's specific behavior.
- // DATAJS INTERNAL START
- if (true) {
- // Check that the state machine actually handled the sate.
- var handled = stateMachine(that, opTargetState, cacheState, data);
- djsassert(handled, "Bad operation state: " + opTargetState + " cacheState: " + cacheState, this);
- } else {
- // DATAJS INTERNAL END
- stateMachine(that, opTargetState, cacheState, data);
- // DATAJS INTERNAL START
- }
- // DATAJS INTERNAL END
- break;
- }
- };
-
- var transition = function (state, data) {
- /// <summary>Transitions this operation to a new state.</summary>
- /// <param name="state" type="Object">State to transition the operation to.</param>
- /// <param name="data" type="Object" optional="true">Additional data passed to the state.</param>
-
- that.s = state;
- stateData = data;
- operationStateMachine(state, cacheState, data);
- };
-
- that.transition = transition;
-
- return that;
- };
-
- DataCacheOperation.prototype.fireResolved = function () {
- /// <summary>Fires a resolved notification as necessary.</summary>
-
- // Fire the resolve just once.
- var p = this.p;
- if (p) {
- this.p = null;
- p.resolve(this.d);
- }
- };
-
- DataCacheOperation.prototype.fireRejected = function (reason) {
- /// <summary>Fires a rejected notification as necessary.</summary>
-
- // Fire the rejection just once.
- var p = this.p;
- if (p) {
- this.p = null;
- p.reject(reason);
- }
- };
-
- DataCacheOperation.prototype.fireCanceled = function () {
- /// <summary>Fires a canceled notification as necessary.</summary>
-
- this.fireRejected({ canceled: true, message: "Operation canceled" });
- };
-
-
- var DataCache = function (options) {
- /// <summary>Creates a data cache for a collection that is efficiently loaded on-demand.</summary>
- /// <param name="options">
- /// Options for the data cache, including name, source, pageSize,
- /// prefetchSize, cacheSize, storage mechanism, and initial prefetch and local-data handler.
- /// </param>
- /// <returns type="DataCache">A new data cache instance.</returns>
-
- var state = CACHE_STATE_INIT;
- var stats = { counts: 0, netReads: 0, prefetches: 0, cacheReads: 0 };
-
- var clearOperations = [];
- var readOperations = [];
- var prefetchOperations = [];
-
- var actualCacheSize = 0; // Actual cache size in bytes.
- var allDataLocal = false; // Whether all data is local.
- var cacheSize = undefinedDefault(options.cacheSize, 1048576); // Requested cache size in bytes, default 1 MB.
- var collectionCount = 0; // Number of elements in the server collection.
- var highestSavedPage = 0; // Highest index of all the saved pages.
- var highestSavedPageSize = 0; // Item count of the saved page with the highest index.
- var overflowed = cacheSize === 0; // If the cache has overflowed (actualCacheSize > cacheSize or cacheSize == 0);
- var pageSize = undefinedDefault(options.pageSize, 50); // Number of elements to store per page.
- var prefetchSize = undefinedDefault(options.prefetchSize, pageSize); // Number of elements to prefetch from the source when the cache is idling.
- var version = "1.0";
- var cacheFailure;
-
- var pendingOperations = 0;
-
- var source = options.source;
- if (typeof source === "string") {
- // Create a new cache source.
- source = new ODataCacheSource(options);
- }
- source.options = options;
-
- // Create a cache local store.
- var store = odatajs.createStore(options.name, options.mechanism);
-
- var that = this;
-
- that.onidle = options.idle;
- that.stats = stats;
-
- that.count = function () {
- /// <summary>Counts the number of items in the collection.</summary>
- /// <returns type="Object">A promise with the number of items.</returns>
-
- if (cacheFailure) {
- throw cacheFailure;
- }
-
- var deferred = createDeferred();
- var canceled = false;
-
- if (allDataLocal) {
- delay(function () {
- deferred.resolve(collectionCount);
- });
-
- return deferred.promise();
- }
-
- // TODO: Consider returning the local data count instead once allDataLocal flag is set to true.
- var request = source.count(function (count) {
- request = null;
- stats.counts++;
- deferred.resolve(count);
- }, function (err) {
- request = null;
- deferred.reject(extend(err, { canceled: canceled }));
- });
-
- return extend(deferred.promise(), {
- cancel: function () {
- /// <summary>Aborts the count operation.</summary>
- if (request) {
- canceled = true;
- request.abort();
- request = null;
- }
- }
- });
- };
-
- that.clear = function () {
- /// <summary>Cancels all running operations and clears all local data associated with this cache.</summary>
- /// <remarks>
- /// New read requests made while a clear operation is in progress will not be canceled.
- /// Instead they will be queued for execution once the operation is completed.
- /// </remarks>
- /// <returns type="Object">A promise that has no value and can't be canceled.</returns>
-
- if (cacheFailure) {
- throw cacheFailure;
- }
-
- if (clearOperations.length === 0) {
- var deferred = createDeferred();
- var op = new DataCacheOperation(destroyStateMachine, deferred, false);
- queueAndStart(op, clearOperations);
- return deferred.promise();
- }
- return clearOperations[0].p;
- };
-
- that.filterForward = function (index, count, predicate) {
- /// <summary>Filters the cache data based a predicate.</summary>
- /// <param name="index" type="Number">The index of the item to start filtering forward from.</param>
- /// <param name="count" type="Number">Maximum number of items to include in the result.</param>
- /// <param name="predicate" type="Function">Callback function returning a boolean that determines whether an item should be included in the result or not.</param>
- /// <remarks>
- /// Specifying a negative count value will yield all the items in the cache that satisfy the predicate.
- /// </remarks>
- /// <returns type="DjsDeferred">A promise for an array of results.</returns>
- return filter(index, count, predicate, false);
- };
-
- that.filterBack = function (index, count, predicate) {
- /// <summary>Filters the cache data based a predicate.</summary>
- /// <param name="index" type="Number">The index of the item to start filtering backward from.</param>
- /// <param name="count" type="Number">Maximum number of items to include in the result.</param>
- /// <param name="predicate" type="Function">Callback function returning a boolean that determines whether an item should be included in the result or not.</param>
- /// <remarks>
- /// Specifying a negative count value will yield all the items in the cache that satisfy the predicate.
- /// </remarks>
- /// <returns type="DjsDeferred">A promise for an array of results.</returns>
- return filter(index, count, predicate, true);
- };
-
- that.readRange = function (index, count) {
- /// <summary>Reads a range of adjacent records.</summary>
- /// <param name="index" type="Number">Zero-based index of record range to read.</param>
- /// <param name="count" type="Number">Number of records in the range.</param>
- /// <remarks>
- /// New read requests made while a clear operation is in progress will not be canceled.
- /// Instead they will be queued for execution once the operation is completed.
- /// </remarks>
- /// <returns type="DjsDeferred">
- /// A promise for an array of records; less records may be returned if the
- /// end of the collection is found.
- /// </returns>
-
- checkZeroGreater(index, "index");
- checkZeroGreater(count, "count");
-
- if (cacheFailure) {
- throw cacheFailure;
- }
-
- var deferred = createDeferred();
-
- // Merging read operations would be a nice optimization here.
- var op = new DataCacheOperation(readStateMachine, deferred, true, index, count, {}, 0);
- queueAndStart(op, readOperations);
-
- return extend(deferred.promise(), {
- cancel: function () {
- /// <summary>Aborts the readRange operation.</summary>
- op.cancel();
- }
- });
- };
-
- that.ToObservable = that.toObservable = function () {
- /// <summary>Creates an Observable object that enumerates all the cache contents.</summary>
- /// <returns>A new Observable object that enumerates all the cache contents.</returns>
- if (!window.Rx || !window.Rx.Observable) {
- throw { message: "Rx library not available - include rx.js" };
- }
-
- if (cacheFailure) {
- throw cacheFailure;
- }
-
- return window.Rx.Observable.CreateWithDisposable(function (obs) {
- var disposed = false;
- var index = 0;
-
- var errorCallback = function (error) {
- if (!disposed) {
- obs.OnError(error);
- }
- };
-
- var successCallback = function (data) {
- if (!disposed) {
- var i, len;
- for (i = 0, len = data.value.length; i < len; i++) {
- // The wrapper automatically checks for Dispose
- // on the observer, so we don't need to check it here.
- obs.OnNext(data.value[i]);
- }
-
- if (data.value.length < pageSize) {
- obs.OnCompleted();
- } else {
- index += pageSize;
- that.readRange(index, pageSize).then(successCallback, errorCallback);
- }
- }
- };
-
- that.readRange(index, pageSize).then(successCallback, errorCallback);
-
- return { Dispose: function () { disposed = true; } };
- });
- };
-
- var cacheFailureCallback = function (message) {
- /// <summary>Creates a function that handles a callback by setting the cache into failure mode.</summary>
- /// <param name="message" type="String">Message text.</param>
- /// <returns type="Function">Function to use as error callback.</returns>
- /// <remarks>
- /// This function will specifically handle problems with critical store resources
- /// during cache initialization.
- /// </remarks>
-
- return function (error) {
- cacheFailure = { message: message, error: error };
-
- // Destroy any pending clear or read operations.
- // At this point there should be no prefetch operations.
- // Count operations will go through but are benign because they
- // won't interact with the store.
- djsassert(prefetchOperations.length === 0, "prefetchOperations.length === 0");
- var i, len;
- for (i = 0, len = readOperations.length; i < len; i++) {
- readOperations[i].fireRejected(cacheFailure);
- }
- for (i = 0, len = clearOperations.length; i < len; i++) {
- clearOperations[i].fireRejected(cacheFailure);
- }
-
- // Null out the operation arrays.
- readOperations = clearOperations = null;
- };
- };
-
- var changeState = function (newState) {
- /// <summary>Updates the cache's state and signals all pending operations of the change.</summary>
- /// <param name="newState" type="Object">New cache state.</param>
- /// <remarks>This method is a no-op if the cache's current state and the new state are the same.</remarks>
-
- if (newState !== state) {
- state = newState;
- var operations = clearOperations.concat(readOperations, prefetchOperations);
- var i, len;
- for (i = 0, len = operations.length; i < len; i++) {
- operations[i].run(state);
- }
- }
- };
-
- var clearStore = function () {
- /// <summary>Removes all the data stored in the cache.</summary>
- /// <returns type="DjsDeferred">A promise with no value.</returns>
- djsassert(state === CACHE_STATE_DESTROY || state === CACHE_STATE_INIT, "DataCache.clearStore() - cache is not on the destroy or initialize state, current sate = " + state);
-
- var deferred = new DjsDeferred();
- store.clear(function () {
-
- // Reset the cache settings.
- actualCacheSize = 0;
- allDataLocal = false;
- collectionCount = 0;
- highestSavedPage = 0;
- highestSavedPageSize = 0;
- overflowed = cacheSize === 0;
-
- // version is not reset, in case there is other state in eg V1.1 that is still around.
-
- // Reset the cache stats.
- stats = { counts: 0, netReads: 0, prefetches: 0, cacheReads: 0 };
- that.stats = stats;
-
- store.close();
- deferred.resolve();
- }, function (err) {
- deferred.reject(err);
- });
- return deferred;
- };
-
- var dequeueOperation = function (operation) {
- /// <summary>Removes an operation from the caches queues and changes the cache state to idle.</summary>
- /// <param name="operation" type="DataCacheOperation">Operation to dequeue.</param>
- /// <remarks>This method is used as a handler for the operation's oncomplete event.</remarks>
-
- var removed = removeFromArray(clearOperations, operation);
- if (!removed) {
- removed = removeFromArray(readOperations, operation);
- if (!removed) {
- removeFromArray(prefetchOperations, operation);
- }
- }
-
- pendingOperations--;
- changeState(CACHE_STATE_IDLE);
- };
-
- var fetchPage = function (start) {
- /// <summary>Requests data from the cache source.</summary>
- /// <param name="start" type="Number">Zero-based index of items to request.</param>
- /// <returns type="DjsDeferred">A promise for a page object with (i)ndex, (c)ount, (d)ata.</returns>
-
- djsassert(state !== CACHE_STATE_DESTROY, "DataCache.fetchPage() - cache is on the destroy state");
- djsassert(state !== CACHE_STATE_IDLE, "DataCache.fetchPage() - cache is on the idle state");
-
- var deferred = new DjsDeferred();
- var canceled = false;
-
- var request = source.read(start, pageSize, function (data) {
- var length = getJsonValueArraryLength(data);
- var page = { i: start, c: length, d: data };
- deferred.resolve(page);
- }, function (err) {
- deferred.reject(err);
- });
-
- return extend(deferred, {
- cancel: function () {
- if (request) {
- request.abort();
- canceled = true;
- request = null;
- }
- }
- });
- };
-
- var filter = function (index, count, predicate, backwards) {
- /// <summary>Filters the cache data based a predicate.</summary>
- /// <param name="index" type="Number">The index of the item to start filtering from.</param>
- /// <param name="count" type="Number">Maximum number of items to include in the result.</param>
- /// <param name="predicate" type="Function">Callback function returning a boolean that determines whether an item should be included in the result or not.</param>
- /// <param name="backwards" type="Boolean">True if the filtering should move backward from the specified index, falsey otherwise.</param>
- /// <remarks>
- /// Specifying a negative count value will yield all the items in the cache that satisfy the predicate.
- /// </remarks>
- /// <returns type="DjsDeferred">A promise for an array of results.</returns>
- index = parseInt10(index);
- count = parseInt10(count);
-
- if (isNaN(index)) {
- throw { message: "'index' must be a valid number.", index: index };
- }
- if (isNaN(count)) {
- throw { message: "'count' must be a valid number.", count: count };
- }
-
- if (cacheFailure) {
- throw cacheFailure;
- }
-
- index = Math.max(index, 0);
-
- var deferred = createDeferred();
- var returnData = {};
- returnData.value = [];
- var canceled = false;
- var pendingReadRange = null;
-
- var readMore = function (readIndex, readCount) {
- if (!canceled) {
- if (count > 0 && returnData.value.length >= count) {
- deferred.resolve(returnData);
- } else {
- pendingReadRange = that.readRange(readIndex, readCount).then(function (data) {
- if (data["@odata.context"] && !returnData["@odata.context"]) {
- returnData["@odata.context"] = data["@odata.context"];
- }
-
- for (var i = 0, length = data.value.length; i < length && (count < 0 || returnData.value.length < count); i++) {
- var dataIndex = backwards ? length - i - 1 : i;
- var item = data.value[dataIndex];
- if (predicate(item)) {
- var element = {
- index: readIndex + dataIndex,
- item: item
- };
-
- backwards ? returnData.value.unshift(element) : returnData.value.push(element);
- }
- }
-
- // Have we reached the end of the collection?
- if ((!backwards && data.value.length < readCount) || (backwards && readIndex <= 0)) {
- deferred.resolve(returnData);
- } else {
- var nextIndex = backwards ? Math.max(readIndex - pageSize, 0) : readIndex + readCount;
- readMore(nextIndex, pageSize);
- }
- }, function (err) {
- deferred.reject(err);
- });
- }
- }
- };
-
- // Initially, we read from the given starting index to the next/previous page boundary
- var initialPage = snapToPageBoundaries(index, index, pageSize);
- var initialIndex = backwards ? initialPage.i : index;
- var initialCount = backwards ? index - initialPage.i + 1 : initialPage.i + initialPage.c - index;
- readMore(initialIndex, initialCount);
-
- return extend(deferred.promise(), {
- cancel: function () {
- /// <summary>Aborts the filter operation</summary>
- if (pendingReadRange) {
- pendingReadRange.cancel();
- }
- canceled = true;
- }
- });
- };
-
- var fireOnIdle = function () {
- /// <summary>Fires an onidle event if any functions are assigned.</summary>
-
- if (that.onidle && pendingOperations === 0) {
- that.onidle();
- }
- };
-
- var prefetch = function (start) {
- /// <summary>Creates and starts a new prefetch operation.</summary>
- /// <param name="start" type="Number">Zero-based index of the items to prefetch.</param>
- /// <remarks>
- /// This method is a no-op if any of the following conditions is true:
- /// 1.- prefetchSize is 0
- /// 2.- All data has been read and stored locally in the cache.
- /// 3.- There is already an all data prefetch operation queued.
- /// 4.- The cache has run out of available space (overflowed).
- /// <remarks>
-
- if (allDataLocal || prefetchSize === 0 || overflowed) {
- return;
- }
-
- djsassert(state === CACHE_STATE_READ, "DataCache.prefetch() - cache is not on the read state, current state: " + state);
-
- if (prefetchOperations.length === 0 || (prefetchOperations[0] && prefetchOperations[0].c !== -1)) {
- // Merging prefetch operations would be a nice optimization here.
- var op = new DataCacheOperation(prefetchStateMachine, null, true, start, prefetchSize, null, prefetchSize);
- queueAndStart(op, prefetchOperations);
- }
- };
-
- var queueAndStart = function (op, queue) {
- /// <summary>Queues an operation and runs it.</summary>
- /// <param name="op" type="DataCacheOperation">Operation to queue.</param>
- /// <param name="queue" type="Array">Array that will store the operation.</param>
-
- op.oncomplete = dequeueOperation;
- queue.push(op);
- pendingOperations++;
- op.run(state);
- };
-
- var readPage = function (key) {
- /// <summary>Requests a page from the cache local store.</summary>
- /// <param name="key" type="Number">Zero-based index of the reuqested page.</param>
- /// <returns type="DjsDeferred">A promise for a found flag and page object with (i)ndex, (c)ount, (d)ata, and (t)icks.</returns>
-
- djsassert(state !== CACHE_STATE_DESTROY, "DataCache.readPage() - cache is on the destroy state");
-
- var canceled = false;
- var deferred = extend(new DjsDeferred(), {
- cancel: function () {
- /// <summary>Aborts the readPage operation.</summary>
- canceled = true;
- }
- });
-
- var error = storeFailureCallback(deferred, "Read page from store failure");
-
- store.contains(key, function (contained) {
- if (canceled) {
- return;
- }
- if (contained) {
- store.read(key, function (_, data) {
- if (!canceled) {
- deferred.resolve(data !== undefined, data);
- }
- }, error);
- return;
- }
- deferred.resolve(false);
- }, error);
- return deferred;
- };
-
- var savePage = function (key, page) {
- /// <summary>Saves a page to the cache local store.</summary>
- /// <param name="key" type="Number">Zero-based index of the requested page.</param>
- /// <param name="page" type="Object">Object with (i)ndex, (c)ount, (d)ata, and (t)icks.</param>
- /// <returns type="DjsDeferred">A promise with no value.</returns>
-
- djsassert(state !== CACHE_STATE_DESTROY, "DataCache.savePage() - cache is on the destroy state");
- djsassert(state !== CACHE_STATE_IDLE, "DataCache.savePage() - cache is on the idle state");
-
- var canceled = false;
-
- var deferred = extend(new DjsDeferred(), {
- cancel: function () {
- /// <summary>Aborts the readPage operation.</summary>
- canceled = true;
- }
- });
-
- var error = storeFailureCallback(deferred, "Save page to store failure");
-
- var resolve = function () {
- deferred.resolve(true);
- };
-
- if (page.c > 0) {
- var pageBytes = estimateSize(page);
- overflowed = cacheSize >= 0 && cacheSize < actualCacheSize + pageBytes;
-
- if (!overflowed) {
- store.addOrUpdate(key, page, function () {
- updateSettings(page, pageBytes);
- saveSettings(resolve, error);
- }, error);
- } else {
- resolve();
- }
- } else {
- updateSettings(page, 0);
- saveSettings(resolve, error);
- }
- return deferred;
- };
-
- var saveSettings = function (success, error) {
- /// <summary>Saves the cache's current settings to the local store.</summary>
- /// <param name="success" type="Function">Success callback.</param>
- /// <param name="error" type="Function">Errror callback.</param>
-
- var settings = {
- actualCacheSize: actualCacheSize,
- allDataLocal: allDataLocal,
- cacheSize: cacheSize,
- collectionCount: collectionCount,
- highestSavedPage: highestSavedPage,
- highestSavedPageSize: highestSavedPageSize,
- pageSize: pageSize,
- sourceId: source.identifier,
- version: version
- };
-
- store.addOrUpdate("__settings", settings, success, error);
- };
-
- var storeFailureCallback = function (deferred/*, message*/) {
- /// <summary>Creates a function that handles a store error.</summary>
- /// <param name="deferred" type="DjsDeferred">Deferred object to resolve.</param>
- /// <param name="message" type="String">Message text.</param>
- /// <returns type="Function">Function to use as error callback.</returns>
- /// <remarks>
- /// This function will specifically handle problems when interacting with the store.
- /// </remarks>
-
- return function (/*error*/) {
- // var console = window.console;
- // if (console && console.log) {
- // console.log(message);
- // console.dir(error);
- // }
- deferred.resolve(false);
- };
- };
-
- var updateSettings = function (page, pageBytes) {
- /// <summary>Updates the cache's settings based on a page object.</summary>
- /// <param name="page" type="Object">Object with (i)ndex, (c)ount, (d)ata.</param>
- /// <param name="pageBytes" type="Number">Size of the page in bytes.</param>
-
- var pageCount = page.c;
- var pageIndex = page.i;
-
- // Detect the collection size.
- if (pageCount === 0) {
- if (highestSavedPage === pageIndex - pageSize) {
- collectionCount = highestSavedPage + highestSavedPageSize;
- }
- } else {
- highestSavedPage = Math.max(highestSavedPage, pageIndex);
- if (highestSavedPage === pageIndex) {
- highestSavedPageSize = pageCount;
- }
- actualCacheSize += pageBytes;
- if (pageCount < pageSize && !collectionCount) {
- collectionCount = pageIndex + pageCount;
- }
- }
-
- // Detect the end of the collection.
- if (!allDataLocal && collectionCount === highestSavedPage + highestSavedPageSize) {
- allDataLocal = true;
- }
- };
-
- var cancelStateMachine = function (operation, opTargetState, cacheState, data) {
- /// <summary>State machine describing the behavior for cancelling a read or prefetch operation.</summary>
- /// <param name="operation" type="DataCacheOperation">Operation being run.</param>
- /// <param name="opTargetState" type="Object">Operation state to transition to.</param>
- /// <param name="cacheState" type="Object">Current cache state.</param>
- /// <param name="data" type="Object" optional="true">Additional data passed to the state.</param>
- /// <remarks>
- /// This state machine contains behavior common to read and prefetch operations.
- /// </remarks>
-
- var canceled = operation.canceled && opTargetState !== OPERATION_STATE_END;
- if (canceled) {
- if (opTargetState === OPERATION_STATE_CANCEL) {
- // Cancel state.
- // Data is expected to be any pending request made to the cache.
- if (data && data.cancel) {
- data.cancel();
- }
- }
- }
- return canceled;
- };
-
- var destroyStateMachine = function (operation, opTargetState, cacheState) {
- /// <summary>State machine describing the behavior of a clear operation.</summary>
- /// <param name="operation" type="DataCacheOperation">Operation being run.</param>
- /// <param name="opTargetState" type="Object">Operation state to transition to.</param>
- /// <param name="cacheState" type="Object">Current cache state.</param>
- /// <remarks>
- /// Clear operations have the highest priority and can't be interrupted by other operations; however,
- /// they will preempt any other operation currently executing.
- /// </remarks>
-
- var transition = operation.transition;
-
- // Signal the cache that a clear operation is running.
- if (cacheState !== CACHE_STATE_DESTROY) {
- changeState(CACHE_STATE_DESTROY);
- return true;
- }
-
- switch (opTargetState) {
- case OPERATION_STATE_START:
- // Initial state of the operation.
- transition(DESTROY_STATE_CLEAR);
- break;
-
- case OPERATION_STATE_END:
- // State that signals the operation is done.
- fireOnIdle();
- break;
-
- case DESTROY_STATE_CLEAR:
- // State that clears all the local data of the cache.
- clearStore().then(function () {
- // Terminate the operation once the local store has been cleared.
- operation.complete();
- });
- // Wait until the clear request completes.
- operation.wait();
- break;
-
- default:
- return false;
- }
- return true;
- };
-
- var prefetchStateMachine = function (operation, opTargetState, cacheState, data) {
- /// <summary>State machine describing the behavior of a prefetch operation.</summary>
- /// <param name="operation" type="DataCacheOperation">Operation being run.</param>
- /// <param name="opTargetState" type="Object">Operation state to transition to.</param>
- /// <param name="cacheState" type="Object">Current cache state.</param>
- /// <param name="data" type="Object" optional="true">Additional data passed to the state.</param>
- /// <remarks>
- /// Prefetch operations have the lowest priority and will be interrupted by operations of
- /// other kinds. A preempted prefetch operation will resume its execution only when the state
- /// of the cache returns to idle.
- ///
- /// If a clear operation starts executing then all the prefetch operations are canceled,
- /// even if they haven't started executing yet.
- /// </remarks>
-
- // Handle cancelation
- if (!cancelStateMachine(operation, opTargetState, cacheState, data)) {
-
- var transition = operation.transition;
-
- // Handle preemption
- if (cacheState !== CACHE_STATE_PREFETCH) {
- if (cacheState === CACHE_STATE_DESTROY) {
- if (opTargetState !== OPERATION_STATE_CANCEL) {
- operation.cancel();
- }
- } else if (cacheState === CACHE_STATE_IDLE) {
- // Signal the cache that a prefetch operation is running.
- changeState(CACHE_STATE_PREFETCH);
- }
- return true;
- }
-
- switch (opTargetState) {
- case OPERATION_STATE_START:
- // Initial state of the operation.
- if (prefetchOperations[0] === operation) {
- transition(READ_STATE_LOCAL, operation.i);
- }
- break;
-
- case READ_STATE_DONE:
- // State that determines if the operation can be resolved or has to
- // continue processing.
- // Data is expected to be the read page.
- var pending = operation.pending;
-
- if (pending > 0) {
- pending -= Math.min(pending, data.c);
- }
-
- // Are we done, or has all the data been stored?
- if (allDataLocal || pending === 0 || data.c < pageSize || overflowed) {
- operation.complete();
- } else {
- // Continue processing the operation.
- operation.pending = pending;
- transition(READ_STATE_LOCAL, data.i + pageSize);
- }
- break;
-
- default:
- return readSaveStateMachine(operation, opTargetState, cacheState, data, true);
- }
- }
- return true;
- };
-
- var readStateMachine = function (operation, opTargetState, cacheState, data) {
- /// <summary>State machine describing the behavior of a read operation.</summary>
- /// <param name="operation" type="DataCacheOperation">Operation being run.</param>
- /// <param name="opTargetState" type="Object">Operation state to transition to.</param>
- /// <param name="cacheState" type="Object">Current cache state.</param>
- /// <param name="data" type="Object" optional="true">Additional data passed to the state.</param>
- /// <remarks>
- /// Read operations have a higher priority than prefetch operations, but lower than
- /// clear operations. They will preempt any prefetch operation currently running
- /// but will be interrupted by a clear operation.
- ///
- /// If a clear operation starts executing then all the currently running
- /// read operations are canceled. Read operations that haven't started yet will
- /// wait in the start state until the destory operation finishes.
- /// </remarks>
-
- // Handle cancelation
- if (!cancelStateMachine(operation, opTargetState, cacheState, data)) {
-
- var transition = operation.transition;
-
- // Handle preemption
- if (cacheState !== CACHE_STATE_READ && opTargetState !== OPERATION_STATE_START) {
- if (cacheState === CACHE_STATE_DESTROY) {
- if (opTargetState !== OPERATION_STATE_START) {
- operation.cancel();
- }
- } else if (cacheState !== CACHE_STATE_WRITE) {
- // Signal the cache that a read operation is running.
- djsassert(state == CACHE_STATE_IDLE || state === CACHE_STATE_PREFETCH, "DataCache.readStateMachine() - cache is not on the read or idle state.");
- changeState(CACHE_STATE_READ);
- }
-
- return true;
- }
-
- switch (opTargetState) {
- case OPERATION_STATE_START:
- // Initial state of the operation.
- // Wait until the cache is idle or prefetching.
- if (cacheState === CACHE_STATE_IDLE || cacheState === CACHE_STATE_PREFETCH) {
- // Signal the cache that a read operation is running.
- changeState(CACHE_STATE_READ);
- if (operation.c >= 0) {
- // Snap the requested range to a page boundary.
- var range = snapToPageBoundaries(operation.i, operation.c, pageSize);
- transition(READ_STATE_LOCAL, range.i);
- } else {
- transition(READ_STATE_DONE, operation);
- }
- }
- break;
-
- case READ_STATE_DONE:
- // State that determines if the operation can be resolved or has to
- // continue processing.
- // Data is expected to be the read page.
- appendPage(operation, data);
- var len = getJsonValueArraryLength(operation.d);
- // Are we done?
- if (operation.c === len || data.c < pageSize) {
- // Update the stats, request for a prefetch operation.
- stats.cacheReads++;
- prefetch(data.i + data.c);
- // Terminate the operation.
- operation.complete();
- } else {
- // Continue processing the operation.
- transition(READ_STATE_LOCAL, data.i + pageSize);
- }
- break;
-
- default:
- return readSaveStateMachine(operation, opTargetState, cacheState, data, false);
- }
- }
-
- return true;
- };
-
- var readSaveStateMachine = function (operation, opTargetState, cacheState, data, isPrefetch) {
- /// <summary>State machine describing the behavior for reading and saving data into the cache.</summary>
- /// <param name="operation" type="DataCacheOperation">Operation being run.</param>
- /// <param name="opTargetState" type="Object">Operation state to transition to.</param>
- /// <param name="cacheState" type="Object">Current cache state.</param>
- /// <param name="data" type="Object" optional="true">Additional data passed to the state.</param>
- /// <param name="isPrefetch" type="Boolean">Flag indicating whether a read (false) or prefetch (true) operation is running.
- /// <remarks>
- /// This state machine contains behavior common to read and prefetch operations.
- /// </remarks>
-
- var error = operation.error;
- var transition = operation.transition;
- var wait = operation.wait;
- var request;
-
- switch (opTargetState) {
- case OPERATION_STATE_END:
- // State that signals the operation is done.
- fireOnIdle();
- break;
-
- case READ_STATE_LOCAL:
- // State that requests for a page from the local store.
- // Data is expected to be the index of the page to request.
- request = readPage(data).then(function (found, page) {
- // Signal the cache that a read operation is running.
- if (!operation.canceled) {
- if (found) {
- // The page is in the local store, check if the operation can be resolved.
- transition(READ_STATE_DONE, page);
- } else {
- // The page is not in the local store, request it from the source.
- transition(READ_STATE_SOURCE, data);
- }
- }
- });
- break;
-
- case READ_STATE_SOURCE:
- // State that requests for a page from the cache source.
- // Data is expected to be the index of the page to request.
- request = fetchPage(data).then(function (page) {
- // Signal the cache that a read operation is running.
- if (!operation.canceled) {
- // Update the stats and save the page to the local store.
- if (isPrefetch) {
- stats.prefetches++;
- } else {
- stats.netReads++;
- }
- transition(READ_STATE_SAVE, page);
- }
- }, error);
- break;
-
- case READ_STATE_SAVE:
- // State that saves a page to the local store.
- // Data is expected to be the page to save.
- // Write access to the store is exclusive.
- if (cacheState !== CACHE_STATE_WRITE) {
- changeState(CACHE_STATE_WRITE);
- request = savePage(data.i, data).then(function (saved) {
- if (!operation.canceled) {
- if (!saved && isPrefetch) {
- operation.pending = 0;
- }
- // Check if the operation can be resolved.
- transition(READ_STATE_DONE, data);
- }
- changeState(CACHE_STATE_IDLE);
- });
- }
- break;
-
- default:
- // Unknown state that can't be handled by this state machine.
- return false;
- }
-
- if (request) {
- // The operation might have been canceled between stack frames do to the async calls.
- if (operation.canceled) {
- request.cancel();
- } else if (operation.s === opTargetState) {
- // Wait for the request to complete.
- wait(request);
- }
- }
-
- return true;
- };
-
- // Initialize the cache.
- store.read("__settings", function (_, settings) {
- if (assigned(settings)) {
- var settingsVersion = settings.version;
- if (!settingsVersion || settingsVersion.indexOf("1.") !== 0) {
- cacheFailureCallback("Unsupported cache store version " + settingsVersion)();
- return;
- }
-
- if (pageSize !== settings.pageSize || source.identifier !== settings.sourceId) {
- // The shape or the source of the data was changed so invalidate the store.
- clearStore().then(function () {
- // Signal the cache is fully initialized.
- changeState(CACHE_STATE_IDLE);
- }, cacheFailureCallback("Unable to clear store during initialization"));
- } else {
- // Restore the saved settings.
- actualCacheSize = settings.actualCacheSize;
- allDataLocal = settings.allDataLocal;
- cacheSize = settings.cacheSize;
- collectionCount = settings.collectionCount;
- highestSavedPage = settings.highestSavedPage;
- highestSavedPageSize = settings.highestSavedPageSize;
- version = settingsVersion;
-
- // Signal the cache is fully initialized.
- changeState(CACHE_STATE_IDLE);
- }
- } else {
- // This is a brand new cache.
- saveSettings(function () {
- // Signal the cache is fully initialized.
- changeState(CACHE_STATE_IDLE);
- }, cacheFailureCallback("Unable to write settings during initialization."));
- }
- }, cacheFailureCallback("Unable to read settings from store."));
-
- return that;
- };
-
- odatajs.createDataCache = function (options) {
- /// <summary>Creates a data cache for a collection that is efficiently loaded on-demand.</summary>
- /// <param name="options">
- /// Options for the data cache, including name, source, pageSize,
- /// prefetchSize, cacheSize, storage mechanism, and initial prefetch and local-data handler.
- /// </param>
- /// <returns type="DataCache">A new data cache instance.</returns>
- checkUndefinedGreaterThanZero(options.pageSize, "pageSize");
- checkUndefinedOrNumber(options.cacheSize, "cacheSize");
- checkUndefinedOrNumber(options.prefetchSize, "prefetchSize");
-
- if (!assigned(options.name)) {
- throw { message: "Undefined or null name", options: options };
- }
-
- if (!assigned(options.source)) {
- throw { message: "Undefined source", options: options };
- }
-
- return new DataCache(options);
- };
-
- // DATAJS INTERNAL START
- window.odatajs.estimateSize = estimateSize;
- // DATAJS INTERNAL END
-
- // CONTENT END
-})(this);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/src/datajs.js
----------------------------------------------------------------------
diff --git a/JSLib/src/datajs.js b/JSLib/src/datajs.js
deleted file mode 100644
index f5251be..0000000
--- a/JSLib/src/datajs.js
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
-// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// odatajs.js
-
-(function (window, undefined) {
-
- var datajs = window.odatajs || {};
- var odata = window.OData || {};
-
- // AMD support
- if (typeof define === 'function' && define.amd) {
- define('datajs', datajs);
- define('OData', odata);
- } else {
- window.odatajs = datajs;
- window.OData = odata;
- }
-
- odatajs.version = {
- major: 1,
- minor: 1,
- build: 1
- };
-
- // INCLUDE: utils.js
- // INCLUDE: xml.js
-
- // INCLUDE: deferred.js
-
- // INCLUDE: odata-utils.js
- // INCLUDE: odata-net.js
- // INCLUDE: odata-handler.js
- // INCLUDE: odata-gml.js
- // INCLUDE: odata-xml.js
- // INCLUDE: odata-atom.js
- // INCLUDE: odata-metadata.js
- // INCLUDE: odata-json-light.js
- // INCLUDE: odata-json.js
- // INCLUDE: odata-batch.js
- // INCLUDE: odata.js
-
- // INCLUDE: store-dom.js
- // INCLUDE: store-indexeddb.js
- // INCLUDE: store-memory.js
- // INCLUDE: store.js
-
- // INCLUDE: cache-source.js
- // INCLUDE: cache.js
-
-})(this);
\ No newline at end of file
[17/22] olingo-odata4-js git commit: [OLINGO-442] Cleanup bevor
release
Posted by ko...@apache.org.
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/src/odata-utils.js
----------------------------------------------------------------------
diff --git a/JSLib/src/odata-utils.js b/JSLib/src/odata-utils.js
deleted file mode 100644
index 2f9c4a2..0000000
--- a/JSLib/src/odata-utils.js
+++ /dev/null
@@ -1,1134 +0,0 @@
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
-// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// odata-utils.js
-
-(function (window, undefined) {
-
- var datajs = window.odatajs || {};
- var odata = window.OData || {};
-
- // Imports
- var assigned = odatajs.assigned;
- var contains = odatajs.contains;
- var find = odatajs.find;
- var isArray = odatajs.isArray;
- var isDate = odatajs.isDate;
- var isObject = odatajs.isObject;
- var parseInt10 = odatajs.parseInt10;
-
- // CONTENT START
-
- var dataItemTypeName = function (value, metadata) {
- /// <summary>Gets the type name of a data item value that belongs to a feed, an entry, a complex type property, or a collection property.</summary>
- /// <param name="value">Value of the data item from which the type name is going to be retrieved.</param>
- /// <param name="metadata" type="object" optional="true">Object containing metadata about the data tiem.</param>
- /// <remarks>
- /// This function will first try to get the type name from the data item's value itself if it is an object with a __metadata property; otherwise
- /// it will try to recover it from the metadata. If both attempts fail, it will return null.
- /// </remarks>
- /// <returns type="String">Data item type name; null if the type name cannot be found within the value or the metadata</returns>
-
- var valueTypeName = ((value && value.__metadata) || {}).type;
- return valueTypeName || (metadata ? metadata.type : null);
- };
-
- var EDM = "Edm.";
- var EDM_BINARY = EDM + "Binary";
- var EDM_BOOLEAN = EDM + "Boolean";
- var EDM_BYTE = EDM + "Byte";
- var EDM_DATETIME = EDM + "DateTime";
- var EDM_DATETIMEOFFSET = EDM + "DateTimeOffset";
- var EDM_DECIMAL = EDM + "Decimal";
- var EDM_DOUBLE = EDM + "Double";
- var EDM_GUID = EDM + "Guid";
- var EDM_INT16 = EDM + "Int16";
- var EDM_INT32 = EDM + "Int32";
- var EDM_INT64 = EDM + "Int64";
- var EDM_SBYTE = EDM + "SByte";
- var EDM_SINGLE = EDM + "Single";
- var EDM_STRING = EDM + "String";
- var EDM_TIME = EDM + "Time";
-
- 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";
- var EDM_GEOGRAPHY_COLLECTION = EDM_GEOGRAPHY + "Collection";
- var EDM_GEOGRAPHY_MULTIPOLYGON = EDM_GEOGRAPHY + "MultiPolygon";
- var EDM_GEOGRAPHY_MULTILINESTRING = EDM_GEOGRAPHY + "MultiLineString";
- var EDM_GEOGRAPHY_MULTIPOINT = EDM_GEOGRAPHY + "MultiPoint";
-
- 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";
- var EDM_GEOMETRY_COLLECTION = EDM_GEOMETRY + "Collection";
- var EDM_GEOMETRY_MULTIPOLYGON = EDM_GEOMETRY + "MultiPolygon";
- var EDM_GEOMETRY_MULTILINESTRING = EDM_GEOMETRY + "MultiLineString";
- var EDM_GEOMETRY_MULTIPOINT = EDM_GEOMETRY + "MultiPoint";
-
- var GEOJSON_POINT = "Point";
- var GEOJSON_LINESTRING = "LineString";
- var GEOJSON_POLYGON = "Polygon";
- var GEOJSON_MULTIPOINT = "MultiPoint";
- var GEOJSON_MULTILINESTRING = "MultiLineString";
- var GEOJSON_MULTIPOLYGON = "MultiPolygon";
- var GEOJSON_GEOMETRYCOLLECTION = "GeometryCollection";
-
- var primitiveEdmTypes = [
- EDM_STRING,
- EDM_INT32,
- EDM_INT64,
- EDM_BOOLEAN,
- EDM_DOUBLE,
- EDM_SINGLE,
- EDM_DATETIME,
- EDM_DATETIMEOFFSET,
- EDM_TIME,
- EDM_DECIMAL,
- EDM_GUID,
- EDM_BYTE,
- EDM_INT16,
- EDM_SBYTE,
- EDM_BINARY
- ];
-
- var geometryEdmTypes = [
- EDM_GEOMETRY,
- EDM_GEOMETRY_POINT,
- EDM_GEOMETRY_LINESTRING,
- EDM_GEOMETRY_POLYGON,
- EDM_GEOMETRY_COLLECTION,
- EDM_GEOMETRY_MULTIPOLYGON,
- EDM_GEOMETRY_MULTILINESTRING,
- EDM_GEOMETRY_MULTIPOINT
- ];
-
- var geographyEdmTypes = [
- EDM_GEOGRAPHY,
- EDM_GEOGRAPHY_POINT,
- EDM_GEOGRAPHY_LINESTRING,
- EDM_GEOGRAPHY_POLYGON,
- EDM_GEOGRAPHY_COLLECTION,
- EDM_GEOGRAPHY_MULTIPOLYGON,
- EDM_GEOGRAPHY_MULTILINESTRING,
- EDM_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>
- /// <param name="callback" type="Function">Callback function to invoke once per schema.</param>
- /// <returns>
- /// The first truthy value to be returned from the callback; null or the last falsy value otherwise.
- /// </returns>
-
- if (!metadata) {
- return null;
- }
-
- if (isArray(metadata)) {
- var i, len, result;
- for (i = 0, len = metadata.length; i < len; i++) {
- result = forEachSchema(metadata[i], callback);
- if (result) {
- return result;
- }
- }
-
- return null;
- } else {
- if (metadata.dataServices) {
- return forEachSchema(metadata.dataServices.schema, callback);
- }
-
- return callback(metadata);
- }
- };
-
- var formatMilliseconds = function (ms, ns) {
- /// <summary>Formats a millisecond and a nanosecond value into a single string.</summary>
- /// <param name="ms" type="Number" mayBeNull="false">Number of milliseconds to format.</param>
- /// <param name="ns" type="Number" mayBeNull="false">Number of nanoseconds to format.</param>
- /// <returns type="String">Formatted text.</returns>
- /// <remarks>If the value is already as string it's returned as-is.</remarks>
-
- // Avoid generating milliseconds if not necessary.
- if (ms === 0) {
- ms = "";
- } else {
- ms = "." + formatNumberWidth(ms.toString(), 3);
- }
- if (ns > 0) {
- if (ms === "") {
- ms = ".000";
- }
- ms += formatNumberWidth(ns.toString(), 4);
- }
- return ms;
- };
-
- 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>
- /// <returns type="String">Formatted text.</returns>
- /// <remarks>If the value is already as string it's returned as-is.</remarks>
-
- if (typeof value === "string") {
- return value;
- }
-
- var hasOffset = isDateTimeOffset(value);
- var offset = getCanonicalTimezone(value.__offset);
- if (hasOffset && offset !== "Z") {
- // We're about to change the value, so make a copy.
- value = new Date(value.valueOf());
-
- var timezone = parseTimezone(offset);
- var hours = value.getUTCHours() + (timezone.d * timezone.h);
- var minutes = value.getUTCMinutes() + (timezone.d * timezone.m);
-
- value.setUTCHours(hours, minutes);
- } else if (!hasOffset) {
- // Don't suffix a 'Z' for Edm.DateTime values.
- offset = "";
- }
-
- var year = value.getUTCFullYear();
- var month = value.getUTCMonth() + 1;
- var sign = "";
- if (year <= 0) {
- year = -(year - 1);
- sign = "-";
- }
-
- var ms = formatMilliseconds(value.getUTCMilliseconds(), value.__ns);
-
- return sign +
- formatNumberWidth(year, 4) + "-" +
- formatNumberWidth(month, 2) + "-" +
- formatNumberWidth(value.getUTCDate(), 2) + "T" +
- formatNumberWidth(value.getUTCHours(), 2) + ":" +
- formatNumberWidth(value.getUTCMinutes(), 2) + ":" +
- formatNumberWidth(value.getUTCSeconds(), 2) +
- ms + offset;
- };
-
- var formatDuration = function (value) {
- /// <summary>Converts a duration to a string in xsd:duration format.</summary>
- /// <param name="value" type="Object">Object with ms and __edmType properties.</param>
- /// <returns type="String">String representation of the time object in xsd:duration format.</returns>
-
- var ms = value.ms;
-
- var sign = "";
- if (ms < 0) {
- sign = "-";
- ms = -ms;
- }
-
- var days = Math.floor(ms / 86400000);
- ms -= 86400000 * days;
- var hours = Math.floor(ms / 3600000);
- ms -= 3600000 * hours;
- var minutes = Math.floor(ms / 60000);
- ms -= 60000 * minutes;
- var seconds = Math.floor(ms / 1000);
- ms -= seconds * 1000;
-
- return sign + "P" +
- formatNumberWidth(days, 2) + "DT" +
- formatNumberWidth(hours, 2) + "H" +
- formatNumberWidth(minutes, 2) + "M" +
- formatNumberWidth(seconds, 2) +
- formatMilliseconds(ms, value.ns) + "S";
- };
-
- var formatNumberWidth = function (value, width, append) {
- /// <summary>Formats the specified value to the given width.</summary>
- /// <param name="value" type="Number">Number to format (non-negative).</param>
- /// <param name="width" type="Number">Minimum width for number.</param>
- /// <param name="append" type="Boolean">Flag indicating if the value is padded at the beginning (false) or at the end (true).</param>
- /// <returns type="String">Text representation.</returns>
- var result = value.toString(10);
- while (result.length < width) {
- if (append) {
- result += "0";
- } else {
- result = "0" + result;
- }
- }
-
- return result;
- };
-
- var getCanonicalTimezone = function (timezone) {
- /// <summary>Gets the canonical timezone representation.</summary>
- /// <param name="timezone" type="String">Timezone representation.</param>
- /// <returns type="String">An 'Z' string if the timezone is absent or 0; the timezone otherwise.</returns>
-
- return (!timezone || timezone === "Z" || timezone === "+00:00" || timezone === "-00:00") ? "Z" : timezone;
- };
-
- var getCollectionType = function (typeName) {
- /// <summary>Gets the type of a collection type name.</summary>
- /// <param name="typeName" type="String">Type name of the collection.</param>
- /// <returns type="String">Type of the collection; null if the type name is not a collection type.</returns>
-
- if (typeof typeName === "string") {
- var end = typeName.indexOf(")", 10);
- if (typeName.indexOf("Collection(") === 0 && end > 0) {
- return typeName.substring(11, end);
- }
- }
- return null;
- };
-
- var invokeRequest = function (request, success, error, handler, httpClient, context) {
- /// <summary>Sends a request containing OData payload to a server.</summary>
- /// <param name="request">Object that represents the request to be sent..</param>
- /// <param name="success">Callback for a successful read operation.</param>
- /// <param name="error">Callback for handling errors.</param>
- /// <param name="handler">Handler for data serialization.</param>
- /// <param name="httpClient">HTTP client layer.</param>
- /// <param name="context">Context used for processing the request</param>
-
- return httpClient.request(request, function (response) {
- try {
- if (response.headers) {
- normalizeHeaders(response.headers);
- }
-
- if (response.data === undefined && response.statusCode !== 204) {
- handler.read(response, context);
- }
- } catch (err) {
- if (err.request === undefined) {
- err.request = request;
- }
- if (err.response === undefined) {
- err.response = response;
- }
- error(err);
- return;
- }
-
- success(response.data, response);
- }, error);
- };
-
- var isBatch = function (value) {
- /// <summary>Tests whether a value is a batch object in the library's internal representation.</summary>
- /// <param name="value">Value to test.</param>
- /// <returns type="Boolean">True is the value is a batch object; false otherwise.</returns>
-
- return isComplex(value) && isArray(value.__batchRequests);
- };
-
- // Regular expression used for testing and parsing for a collection type.
- var collectionTypeRE = /Collection\((.*)\)/;
-
- var isCollection = function (value, typeName) {
- /// <summary>Tests whether a value is a collection value in the library's internal representation.</summary>
- /// <param name="value">Value to test.</param>
- /// <param name="typeName" type="Sting">Type name of the value. This is used to disambiguate from a collection property value.</param>
- /// <returns type="Boolean">True is the value is a feed value; false otherwise.</returns>
-
- var colData = value && value.results || value;
- return !!colData &&
- (isCollectionType(typeName)) ||
- (!typeName && isArray(colData) && !isComplex(colData[0]));
- };
-
- var isCollectionType = function (typeName) {
- /// <summary>Checks whether the specified type name is a collection type.</summary>
- /// <param name="typeName" type="String">Name of type to check.</param>
- /// <returns type="Boolean">True if the type is the name of a collection type; false otherwise.</returns>
- return collectionTypeRE.test(typeName);
- };
-
- var isComplex = function (value) {
- /// <summary>Tests whether a value is a complex type value in the library's internal representation.</summary>
- /// <param name="value">Value to test.</param>
- /// <returns type="Boolean">True is the value is a complex type value; false otherwise.</returns>
-
- return !!value &&
- isObject(value) &&
- !isArray(value) &&
- !isDate(value);
- };
-
- var isDateTimeOffset = function (value) {
- /// <summary>Checks whether a Date object is DateTimeOffset value</summary>
- /// <param name="value" type="Date" mayBeNull="false">Value to check.</param>
- /// <returns type="Boolean">true if the value is a DateTimeOffset, false otherwise.</returns>
- return (value.__edmType === "Edm.DateTimeOffset" || (!value.__edmType && value.__offset));
- };
-
- var isDeferred = function (value) {
- /// <summary>Tests whether a value is a deferred navigation property in the library's internal representation.</summary>
- /// <param name="value">Value to test.</param>
- /// <returns type="Boolean">True is the value is a deferred navigation property; false otherwise.</returns>
-
- if (!value && !isComplex(value)) {
- return false;
- }
- var metadata = value.__metadata || {};
- var deferred = value.__deferred || {};
- return !metadata.type && !!deferred.uri;
- };
-
- var isEntry = function (value) {
- /// <summary>Tests whether a value is an entry object in the library's internal representation.</summary>
- /// <param name="value">Value to test.</param>
- /// <returns type="Boolean">True is the value is an entry object; false otherwise.</returns>
-
- return isComplex(value) && value.__metadata && "uri" in value.__metadata;
- };
-
- var isFeed = function (value, typeName) {
- /// <summary>Tests whether a value is a feed value in the library's internal representation.</summary>
- /// <param name="value">Value to test.</param>
- /// <param name="typeName" type="Sting">Type name of the value. This is used to disambiguate from a collection property value.</param>
- /// <returns type="Boolean">True is the value is a feed value; false otherwise.</returns>
-
- var feedData = value && value.results || value;
- return isArray(feedData) && (
- (!isCollectionType(typeName)) &&
- (isComplex(feedData[0]))
- );
- };
-
- var isGeographyEdmType = function (typeName) {
- /// <summary>Checks whether the specified type name is a geography EDM type.</summary>
- /// <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);
- };
-
- var isGeometryEdmType = function (typeName) {
- /// <summary>Checks whether the specified type name is a geometry EDM type.</summary>
- /// <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 isNamedStream = function (value) {
- /// <summary>Tests whether a value is a named stream value in the library's internal representation.</summary>
- /// <param name="value">Value to test.</param>
- /// <returns type="Boolean">True is the value is a named stream; false otherwise.</returns>
-
- if (!value && !isComplex(value)) {
- return false;
- }
- var metadata = value.__metadata;
- var mediaResource = value.__mediaresource;
- return !metadata && !!mediaResource && !!mediaResource.media_src;
- };
-
- var isPrimitive = function (value) {
- /// <summary>Tests whether a value is a primitive type value in the library's internal representation.</summary>
- /// <param name="value">Value to test.</param>
- /// <remarks>
- /// Date objects are considered primitive types by the library.
- /// </remarks>
- /// <returns type="Boolean">True is the value is a primitive type value.</returns>
-
- return isDate(value) ||
- typeof value === "string" ||
- typeof value === "number" ||
- typeof value === "boolean";
- };
-
- var isPrimitiveEdmType = function (typeName) {
- /// <summary>Checks whether the specified type name is a primitive EDM type.</summary>
- /// <param name="typeName" type="String">Name of type to check.</param>
- /// <returns type="Boolean">True if the type is a primitive EDM type; false otherwise.</returns>
-
- return contains(primitiveEdmTypes, typeName);
- };
-
- var navigationPropertyKind = function (value, propertyModel) {
- /// <summary>Gets the kind of a navigation property value.</summary>
- /// <param name="value">Value of the navigation property.</param>
- /// <param name="propertyModel" type="Object" optional="true">
- /// Object that describes the navigation property in an OData conceptual schema.
- /// </param>
- /// <remarks>
- /// The returned string is as follows
- /// </remarks>
- /// <returns type="String">String value describing the kind of the navigation property; null if the kind cannot be determined.</returns>
-
- if (isDeferred(value)) {
- return "deferred";
- }
- if (isEntry(value)) {
- return "entry";
- }
- if (isFeed(value)) {
- return "feed";
- }
- if (propertyModel && propertyModel.relationship) {
- if (value === null || value === undefined || !isFeed(value)) {
- return "entry";
- }
- return "feed";
- }
- return null;
- };
-
- var lookupProperty = function (properties, name) {
- /// <summary>Looks up a property by name.</summary>
- /// <param name="properties" type="Array" mayBeNull="true">Array of property objects as per EDM metadata.</param>
- /// <param name="name" type="String">Name to look for.</param>
- /// <returns type="Object">The property object; null if not found.</returns>
-
- return find(properties, function (property) {
- return property.name === name;
- });
- };
-
- var lookupInMetadata = function (name, metadata, kind) {
- /// <summary>Looks up a type object by name.</summary>
- /// <param name="name" type="String">Name, possibly null or empty.</param>
- /// <param name="metadata">Metadata store; one of edmx, schema, or an array of any of them.</param>
- /// <param name="kind" type="String">Kind of object to look for as per EDM metadata.</param>
- /// <returns>An type description if the name is found; null otherwise.</returns>
-
- return (name) ? forEachSchema(metadata, function (schema) {
- return lookupInSchema(name, schema, kind);
- }) : null;
- };
-
- var lookupEntitySet = function (entitySets, name) {
- /// <summary>Looks up a entity set by name.</summary>
- /// <param name="properties" type="Array" mayBeNull="true">Array of entity set objects as per EDM metadata.</param>
- /// <param name="name" type="String">Name to look for.</param>
- /// <returns type="Object">The entity set object; null if not found.</returns>
-
- return find(entitySets, function (entitySet) {
- return entitySet.name === name;
- });
- };
-
- var lookupComplexType = function (name, metadata) {
- /// <summary>Looks up a complex type object by name.</summary>
- /// <param name="name" type="String">Name, possibly null or empty.</param>
- /// <param name="metadata">Metadata store; one of edmx, schema, or an array of any of them.</param>
- /// <returns>A complex type description if the name is found; null otherwise.</returns>
-
- return lookupInMetadata(name, metadata, "complexType");
- };
-
- var lookupEntityType = function (name, metadata) {
- /// <summary>Looks up an entity type object by name.</summary>
- /// <param name="name" type="String">Name, possibly null or empty.</param>
- /// <param name="metadata">Metadata store; one of edmx, schema, or an array of any of them.</param>
- /// <returns>An entity type description if the name is found; null otherwise.</returns>
-
- return lookupInMetadata(name, metadata, "entityType");
- };
-
- var lookupDefaultEntityContainer = function (metadata) {
- /// <summary>Looks up an</summary>
- /// <param name="name" type="String">Name, possibly null or empty.</param>
- /// <param name="metadata">Metadata store; one of edmx, schema, or an array of any of them.</param>
- /// <returns>An entity container description if the name is found; null otherwise.</returns>
-
- return forEachSchema(metadata, function (schema) {
- return find(schema.entityContainer, function (container) {
- return parseBool(container.isDefaultEntityContainer);
- });
- });
- };
-
- var lookupEntityContainer = function (name, metadata) {
- /// <summary>Looks up an entity container object by name.</summary>
- /// <param name="name" type="String">Name, possibly null or empty.</param>
- /// <param name="metadata">Metadata store; one of edmx, schema, or an array of any of them.</param>
- /// <returns>An entity container description if the name is found; null otherwise.</returns>
-
- return lookupInMetadata(name, metadata, "entityContainer");
- };
-
- var lookupFunctionImport = function (functionImports, name) {
- /// <summary>Looks up a function import by name.</summary>
- /// <param name="properties" type="Array" mayBeNull="true">Array of function import objects as per EDM metadata.</param>
- /// <param name="name" type="String">Name to look for.</param>
- /// <returns type="Object">The entity set object; null if not found.</returns>
-
- return find(functionImports, function (functionImport) {
- return functionImport.name === name;
- });
- };
-
- var lookupNavigationPropertyType = function (navigationProperty, metadata) {
- /// <summary>Looks up the target entity type for a navigation property.</summary>
- /// <param name="navigationProperty" type="Object"></param>
- /// <param name="metadata" type="Object"></param>
- /// <returns type="String">The entity type name for the specified property, null if not found.</returns>
-
- var result = null;
- if (navigationProperty) {
- var rel = navigationProperty.relationship;
- var association = forEachSchema(metadata, function (schema) {
- // The name should be the namespace qualified name in 'ns'.'type' format.
- var nameOnly = removeNamespace(schema["namespace"], rel);
- var associations = schema.association;
- if (nameOnly && associations) {
- var i, len;
- for (i = 0, len = associations.length; i < len; i++) {
- if (associations[i].name === nameOnly) {
- return associations[i];
- }
- }
- }
- return null;
- });
-
- if (association) {
- var end = association.end[0];
- if (end.role !== navigationProperty.toRole) {
- end = association.end[1];
- // For metadata to be valid, end.role === navigationProperty.toRole now.
- }
- result = end.type;
- }
- }
- return result;
- };
-
- var lookupNavigationPropertyEntitySet = function (navigationProperty, sourceEntitySetName, metadata) {
- /// <summary>Looks up the target entityset name for a navigation property.</summary>
- /// <param name="navigationProperty" type="Object"></param>
- /// <param name="metadata" type="Object"></param>
- /// <returns type="String">The entityset name for the specified property, null if not found.</returns>
-
- if (navigationProperty) {
- var rel = navigationProperty.relationship;
- var associationSet = forEachSchema(metadata, function (schema) {
- var containers = schema.entityContainer;
- for (var i = 0; i < containers.length; i++) {
- var associationSets = containers[i].associationSet;
- if (associationSets) {
- for (var j = 0; j < associationSets.length; j++) {
- if (associationSets[j].association == rel) {
- return associationSets[j];
- }
- }
- }
- }
- return null;
- });
- if (associationSet && associationSet.end[0] && associationSet.end[1]) {
- return (associationSet.end[0].entitySet == sourceEntitySetName) ? associationSet.end[1].entitySet : associationSet.end[0].entitySet;
- }
- }
- return null;
- };
-
- var getEntitySetInfo = function (entitySetName, metadata) {
- /// <summary>Gets the entitySet info, container name and functionImports for an entitySet</summary>
- /// <param name="navigationProperty" type="Object"></param>
- /// <param name="metadata" type="Object"></param>
- /// <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 };
- }
- }
- }
- }
- return null;
- });
-
- return info;
- };
-
- var removeNamespace = function (ns, fullName) {
- /// <summary>Given an expected namespace prefix, removes it from a full name.</summary>
- /// <param name="ns" type="String">Expected namespace.</param>
- /// <param name="fullName" type="String">Full name in 'ns'.'name' form.</param>
- /// <returns type="String">The local name, null if it isn't found in the expected namespace.</returns>
-
- if (fullName.indexOf(ns) === 0 && fullName.charAt(ns.length) === ".") {
- return fullName.substr(ns.length + 1);
- }
-
- return null;
- };
-
- var lookupInSchema = function (name, schema, kind) {
- /// <summary>Looks up a schema object by name.</summary>
- /// <param name="name" type="String">Name (assigned).</param>
- /// <param name="schema">Schema object as per EDM metadata.</param>
- /// <param name="kind" type="String">Kind of object to look for as per EDM metadata.</param>
- /// <returns>An entity type description if the name is found; null otherwise.</returns>
-
- if (name && schema) {
- // The name should be the namespace qualified name in 'ns'.'type' format.
- var nameOnly = removeNamespace(schema["namespace"], name);
- if (nameOnly) {
- return find(schema[kind], function (item) {
- return item.name === nameOnly;
- });
- }
- }
- return null;
- };
-
- var maxVersion = function (left, right) {
- /// <summary>Compares to version strings and returns the higher one.</summary>
- /// <param name="left" type="String">Version string in the form "major.minor.rev"</param>
- /// <param name="right" type="String">Version string in the form "major.minor.rev"</param>
- /// <returns type="String">The higher version string.</returns>
-
- if (left === right) {
- return left;
- }
-
- var leftParts = left.split(".");
- var rightParts = right.split(".");
-
- var len = (leftParts.length >= rightParts.length) ?
- leftParts.length :
- rightParts.length;
-
- for (var i = 0; i < len; i++) {
- var leftVersion = leftParts[i] && parseInt10(leftParts[i]);
- var rightVersion = rightParts[i] && parseInt10(rightParts[i]);
- if (leftVersion > rightVersion) {
- return left;
- }
- if (leftVersion < rightVersion) {
- return right;
- }
- }
- };
-
- var normalHeaders = {
- // Headers shared by request and response
- "content-type": "Content-Type",
- "content-encoding": "Content-Encoding",
- "content-length": "Content-Length",
- "odata-version": "OData-Version",
-
- // Headers used by request
- "accept": "Accept",
- "accept-charset": "Accept-Charset",
- "if-match": "If-Match",
- "if-none-match": "If-None-Match",
- "odata-isolation": "OData-Isolation",
- "odata-maxversion": "OData-MaxVersion",
- "prefer": "Prefer",
-
- // Headers used by response
- "etag": "ETag",
- "location": "Location",
- "odata-entityid": "OData-EntityId",
- "preference-applied": "Preference-Applied",
- "retry-after": "Retry-After"
- };
-
- var normalizeHeaders = function (headers) {
- /// <summary>Normalizes headers so they can be found with consistent casing.</summary>
- /// <param name="headers" type="Object">Dictionary of name/value pairs.</param>
-
- for (var name in headers) {
- var lowerName = name.toLowerCase();
- var normalName = normalHeaders[lowerName];
- if (normalName && name !== normalName) {
- var val = headers[name];
- delete headers[name];
- headers[normalName] = val;
- }
- }
- };
-
- var parseBool = function (propertyValue) {
- /// <summary>Parses a string into a boolean value.</summary>
- /// <param name="propertyValue">Value to parse.</param>
- /// <returns type="Boolean">true if the property value is 'true'; false otherwise.</returns>
-
- if (typeof propertyValue === "boolean") {
- return propertyValue;
- }
-
- return typeof propertyValue === "string" && propertyValue.toLowerCase() === "true";
- };
-
-
- // The captured indices for this expression are:
- // 0 - complete input
- // 1,2,3 - year with optional minus sign, month, day
- // 4,5,6 - hours, minutes, seconds
- // 7 - optional milliseconds
- // 8 - everything else (presumably offset information)
- var parseDateTimeRE = /^(-?\d{4,})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(?::(\d{2}))?(?:\.(\d+))?(.*)$/;
-
- var parseDateTimeMaybeOffset = function (value, withOffset, nullOnError) {
- /// <summary>Parses a string into a DateTime value.</summary>
- /// <param name="value" type="String">Value to parse.</param>
- /// <param name="withOffset" type="Boolean">Whether offset is expected.</param>
- /// <returns type="Date">The parsed value.</returns>
-
- // We cannot parse this in cases of failure to match or if offset information is specified.
- var parts = parseDateTimeRE.exec(value);
- var offset = (parts) ? getCanonicalTimezone(parts[8]) : null;
-
- if (!parts || (!withOffset && offset !== "Z")) {
- if (nullOnError) {
- return null;
- }
- throw { message: "Invalid date/time value" };
- }
-
- // Pre-parse years, account for year '0' being invalid in dateTime.
- var year = parseInt10(parts[1]);
- if (year <= 0) {
- year++;
- }
-
- // Pre-parse optional milliseconds, fill in default. Fail if value is too precise.
- var ms = parts[7];
- var ns = 0;
- if (!ms) {
- ms = 0;
- } else {
- if (ms.length > 7) {
- if (nullOnError) {
- return null;
- }
- throw { message: "Cannot parse date/time value to given precision." };
- }
-
- ns = formatNumberWidth(ms.substring(3), 4, true);
- ms = formatNumberWidth(ms.substring(0, 3), 3, true);
-
- ms = parseInt10(ms);
- ns = parseInt10(ns);
- }
-
- // Pre-parse other time components and offset them if necessary.
- var hours = parseInt10(parts[4]);
- var minutes = parseInt10(parts[5]);
- var seconds = parseInt10(parts[6]) || 0;
- if (offset !== "Z") {
- // The offset is reversed to get back the UTC date, which is
- // what the API will eventually have.
- var timezone = parseTimezone(offset);
- var direction = -(timezone.d);
- hours += timezone.h * direction;
- minutes += timezone.m * direction;
- }
-
- // Set the date and time separately with setFullYear, so years 0-99 aren't biased like in Date.UTC.
- var result = new Date();
- result.setUTCFullYear(
- year, // Year.
- parseInt10(parts[2]) - 1, // Month (zero-based for Date.UTC and setFullYear).
- parseInt10(parts[3]) // Date.
- );
- result.setUTCHours(hours, minutes, seconds, ms);
-
- if (isNaN(result.valueOf())) {
- if (nullOnError) {
- return null;
- }
- throw { message: "Invalid date/time value" };
- }
-
- if (withOffset) {
- result.__edmType = "Edm.DateTimeOffset";
- result.__offset = offset;
- }
-
- if (ns) {
- result.__ns = ns;
- }
-
- return result;
- };
-
- var parseDateTime = function (propertyValue, nullOnError) {
- /// <summary>Parses a string into a DateTime value.</summary>
- /// <param name="propertyValue" type="String">Value to parse.</param>
- /// <returns type="Date">The parsed value.</returns>
-
- return parseDateTimeMaybeOffset(propertyValue, false, nullOnError);
- };
-
- var parseDateTimeOffset = function (propertyValue, nullOnError) {
- /// <summary>Parses a string into a DateTimeOffset value.</summary>
- /// <param name="propertyValue" type="String">Value to parse.</param>
- /// <returns type="Date">The parsed value.</returns>
- /// <remarks>
- /// The resulting object is annotated with an __edmType property and
- /// an __offset property reflecting the original intended offset of
- /// the value. The time is adjusted for UTC time, as the current
- /// timezone-aware Date APIs will only work with the local timezone.
- /// </remarks>
-
- return parseDateTimeMaybeOffset(propertyValue, true, nullOnError);
- };
-
- // The captured indices for this expression are:
- // 0 - complete input
- // 1 - direction
- // 2,3,4 - years, months, days
- // 5,6,7,8 - hours, minutes, seconds, miliseconds
-
- var parseTimeRE = /^([+-])?P(?:(\d+)Y)?(?:(\d+)M)?(?:(\d+)D)?(?:T(?:(\d+)H)?(?:(\d+)M)?(?:(\d+)(?:\.(\d+))?S)?)?/;
-
- var isEdmDurationValue = function(value) {
- parseTimeRE.test(value);
- };
-
- var parseDuration = function (duration) {
- /// <summary>Parses a string in xsd:duration format.</summary>
- /// <param name="duration" type="String">Duration value.</param>
- /// <remarks>
- /// This method will throw an exception if the input string has a year or a month component.
- /// </remarks>
- /// <returns type="Object">Object representing the time</returns>
-
- var parts = parseTimeRE.exec(duration);
-
- if (parts === null) {
- throw { message: "Invalid duration value." };
- }
-
- var years = parts[2] || "0";
- var months = parts[3] || "0";
- var days = parseInt10(parts[4] || 0);
- var hours = parseInt10(parts[5] || 0);
- var minutes = parseInt10(parts[6] || 0);
- var seconds = parseFloat(parts[7] || 0);
-
- if (years !== "0" || months !== "0") {
- throw { message: "Unsupported duration value." };
- }
-
- var ms = parts[8];
- var ns = 0;
- if (!ms) {
- ms = 0;
- } else {
- if (ms.length > 7) {
- throw { message: "Cannot parse duration value to given precision." };
- }
-
- ns = formatNumberWidth(ms.substring(3), 4, true);
- ms = formatNumberWidth(ms.substring(0, 3), 3, true);
-
- ms = parseInt10(ms);
- ns = parseInt10(ns);
- }
-
- ms += seconds * 1000 + minutes * 60000 + hours * 3600000 + days * 86400000;
-
- if (parts[1] === "-") {
- ms = -ms;
- }
-
- var result = { ms: ms, __edmType: "Edm.Time" };
-
- if (ns) {
- result.ns = ns;
- }
- return result;
- };
-
- var parseTimezone = function (timezone) {
- /// <summary>Parses a timezone description in (+|-)nn:nn format.</summary>
- /// <param name="timezone" type="String">Timezone offset.</param>
- /// <returns type="Object">
- /// An object with a (d)irection property of 1 for + and -1 for -,
- /// offset (h)ours and offset (m)inutes.
- /// </returns>
-
- var direction = timezone.substring(0, 1);
- direction = (direction === "+") ? 1 : -1;
-
- var offsetHours = parseInt10(timezone.substring(1));
- var offsetMinutes = parseInt10(timezone.substring(timezone.indexOf(":") + 1));
- return { d: direction, h: offsetHours, m: offsetMinutes };
- };
-
- var prepareRequest = function (request, handler, context) {
- /// <summary>Prepares a request object so that it can be sent through the network.</summary>
- /// <param name="request">Object that represents the request to be sent.</param>
- /// <param name="handler">Handler for data serialization</param>
- /// <param name="context">Context used for preparing the request</param>
-
- // Default to GET if no method has been specified.
- if (!request.method) {
- request.method = "GET";
- }
-
- if (!request.headers) {
- request.headers = {};
- } else {
- normalizeHeaders(request.headers);
- }
-
- if (request.headers.Accept === undefined) {
- request.headers.Accept = handler.accept;
- }
-
- if (assigned(request.data) && request.body === undefined) {
- handler.write(request, context);
- }
-
- if (!assigned(request.headers["OData-MaxVersion"])) {
- request.headers["OData-MaxVersion"] = handler.maxDataServiceVersion || "4.0";
- }
- };
-
- var traverseInternal = function (item, owner, callback) {
- /// <summary>Traverses a tree of objects invoking callback for every value.</summary>
- /// <param name="item" type="Object">Object or array to traverse.</param>
- /// <param name="callback" type="Function">
- /// Callback function with key and value, similar to JSON.parse reviver.
- /// </param>
- /// <returns type="Object">The object with traversed properties.</returns>
- /// <remarks>Unlike the JSON reviver, this won't delete null members.</remarks>
-
- if (item && typeof item === "object") {
- for (var name in item) {
- var value = item[name];
- var result = traverseInternal(value, name, callback);
- result = callback(name, result, owner);
- if (result !== value) {
- if (value === undefined) {
- delete item[name];
- } else {
- item[name] = result;
- }
- }
- }
- }
-
- return item;
- };
-
- var traverse = function (item, callback) {
- /// <summary>Traverses a tree of objects invoking callback for every value.</summary>
- /// <param name="item" type="Object">Object or array to traverse.</param>
- /// <param name="callback" type="Function">
- /// Callback function with key and value, similar to JSON.parse reviver.
- /// </param>
- /// <returns type="Object">The traversed object.</returns>
- /// <remarks>Unlike the JSON reviver, this won't delete null members.</remarks>
-
- return callback("", traverseInternal(item, "", callback));
- };
-
- // DATAJS INTERNAL START
- odata.dataItemTypeName = dataItemTypeName;
- odata.EDM_BINARY = EDM_BINARY;
- odata.EDM_BOOLEAN = EDM_BOOLEAN;
- odata.EDM_BYTE = EDM_BYTE;
- odata.EDM_DATETIME = EDM_DATETIME;
- odata.EDM_DATETIMEOFFSET = EDM_DATETIMEOFFSET;
- odata.EDM_DECIMAL = EDM_DECIMAL;
- odata.EDM_DOUBLE = EDM_DOUBLE;
- odata.EDM_GEOGRAPHY = EDM_GEOGRAPHY;
- odata.EDM_GEOGRAPHY_POINT = EDM_GEOGRAPHY_POINT;
- odata.EDM_GEOGRAPHY_LINESTRING = EDM_GEOGRAPHY_LINESTRING;
- odata.EDM_GEOGRAPHY_POLYGON = EDM_GEOGRAPHY_POLYGON;
- odata.EDM_GEOGRAPHY_COLLECTION = EDM_GEOGRAPHY_COLLECTION;
- odata.EDM_GEOGRAPHY_MULTIPOLYGON = EDM_GEOGRAPHY_MULTIPOLYGON;
- odata.EDM_GEOGRAPHY_MULTILINESTRING = EDM_GEOGRAPHY_MULTILINESTRING;
- odata.EDM_GEOGRAPHY_MULTIPOINT = EDM_GEOGRAPHY_MULTIPOINT;
- odata.EDM_GEOMETRY = EDM_GEOMETRY;
- odata.EDM_GEOMETRY_POINT = EDM_GEOMETRY_POINT;
- odata.EDM_GEOMETRY_LINESTRING = EDM_GEOMETRY_LINESTRING;
- odata.EDM_GEOMETRY_POLYGON = EDM_GEOMETRY_POLYGON;
- odata.EDM_GEOMETRY_COLLECTION = EDM_GEOMETRY_COLLECTION;
- odata.EDM_GEOMETRY_MULTIPOLYGON = EDM_GEOMETRY_MULTIPOLYGON;
- odata.EDM_GEOMETRY_MULTILINESTRING = EDM_GEOMETRY_MULTILINESTRING;
- odata.EDM_GEOMETRY_MULTIPOINT = EDM_GEOMETRY_MULTIPOINT;
- odata.EDM_GUID = EDM_GUID;
- odata.EDM_INT16 = EDM_INT16;
- odata.EDM_INT32 = EDM_INT32;
- odata.EDM_INT64 = EDM_INT64;
- odata.EDM_SBYTE = EDM_SBYTE;
- odata.EDM_SINGLE = EDM_SINGLE;
- odata.EDM_STRING = EDM_STRING;
- odata.EDM_TIME = EDM_TIME;
- odata.GEOJSON_POINT = GEOJSON_POINT;
- odata.GEOJSON_LINESTRING = GEOJSON_LINESTRING;
- odata.GEOJSON_POLYGON = GEOJSON_POLYGON;
- odata.GEOJSON_MULTIPOINT = GEOJSON_MULTIPOINT;
- odata.GEOJSON_MULTILINESTRING = GEOJSON_MULTILINESTRING;
- odata.GEOJSON_MULTIPOLYGON = GEOJSON_MULTIPOLYGON;
- odata.GEOJSON_GEOMETRYCOLLECTION = GEOJSON_GEOMETRYCOLLECTION;
- odata.forEachSchema = forEachSchema;
- odata.formatDateTimeOffset = formatDateTimeOffset;
- odata.formatDuration = formatDuration;
- odata.formatNumberWidth = formatNumberWidth;
- odata.getCanonicalTimezone = getCanonicalTimezone;
- odata.getCollectionType = getCollectionType;
- odata.invokeRequest = invokeRequest;
- odata.isBatch = isBatch;
- odata.isCollection = isCollection;
- odata.isCollectionType = isCollectionType;
- odata.isComplex = isComplex;
- odata.isDateTimeOffset = isDateTimeOffset;
- odata.isDeferred = isDeferred;
- odata.isEntry = isEntry;
- odata.isFeed = isFeed;
- odata.isGeographyEdmType = isGeographyEdmType;
- odata.isGeometryEdmType = isGeometryEdmType;
- odata.isNamedStream = isNamedStream;
- odata.isPrimitive = isPrimitive;
- odata.isPrimitiveEdmType = isPrimitiveEdmType;
- odata.lookupComplexType = lookupComplexType;
- odata.lookupDefaultEntityContainer = lookupDefaultEntityContainer;
- odata.lookupEntityContainer = lookupEntityContainer;
- odata.lookupEntitySet = lookupEntitySet;
- odata.lookupEntityType = lookupEntityType;
- odata.lookupFunctionImport = lookupFunctionImport;
- odata.lookupNavigationPropertyType = lookupNavigationPropertyType;
- odata.lookupNavigationPropertyEntitySet = lookupNavigationPropertyEntitySet;
- odata.lookupInSchema = lookupInSchema;
- odata.lookupProperty = lookupProperty;
- odata.lookupInMetadata = lookupInMetadata;
- odata.getEntitySetInfo = getEntitySetInfo;
- odata.maxVersion = maxVersion;
- odata.navigationPropertyKind = navigationPropertyKind;
- odata.normalizeHeaders = normalizeHeaders;
- odata.parseBool = parseBool;
- odata.parseDateTime = parseDateTime;
- odata.parseDateTimeOffset = parseDateTimeOffset;
- odata.parseDuration = parseDuration;
- odata.parseTimezone = parseTimezone;
- odata.parseInt10 = parseInt10;
- odata.prepareRequest = prepareRequest;
- odata.removeNamespace = removeNamespace;
- odata.traverse = traverse;
-
- // DATAJS INTERNAL END
-
- // CONTENT END
-})(this);
\ No newline at end of file
[03/22] olingo-odata4-js git commit: [OLINGO-442] Cleanup bevor
release
Posted by ko...@apache.org.
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/odata-read-functional-tests.js
----------------------------------------------------------------------
diff --git a/JSLib/tests/odata-read-functional-tests.js b/JSLib/tests/odata-read-functional-tests.js
deleted file mode 100644
index 8a58b15..0000000
--- a/JSLib/tests/odata-read-functional-tests.js
+++ /dev/null
@@ -1,583 +0,0 @@
-/// <reference path="common/djstest.js" />
-/// <reference path="../src/odata.js" />
-/// <reference path="common/ODataReadOracle.js" />
-
-(function (window, undefined) {
- OData.defaultHandler.accept = "application/json;q=0.9, application/atomsvc+xml;q=0.8, */*;q=0.1";
- var unexpectedErrorHandler = function (err) {
- djstest.assert(false, "Unexpected call to error handler with error: " + djstest.toString(err));
- djstest.done();
- };
-
- // to do: enable the Atom/XML senario
- var validServiceDocumentAcceptHeaders = [
- "*/*",
- //"application/xml",
- "application/json",
- undefined
- ];
-
- var validMetadataAcceptHeaders = [
- "*/*",
- "application/xml",
- undefined
- ];
-
- var invalidServiceDocumentAcceptHeaders = [
- "application/atom+xml"
- ];
-
- var invalidMetadataAcceptHeaders = [
- "application/atom+xml",
- "application/json"
- ];
-
- var handlerAcceptStrings = [
- "*/*",
- // "application/atom+xml",
- "application/json",
- undefined
- ];
-
- var httpStatusCode = {
- notFound: 404,
- badRequest: 400,
- unsupportedMediaType: 415
- };
-
- var service = "./endpoints/FoodStoreDataServiceV4.svc/";
- var epmService = "./endpoints/EpmDataService.svc/";
- var feed = service + "Foods";
- var categoriesFeed = service + "Categories";
-
- var expectedErrorMessage = "HTTP request failed";
-
- module("Functional", {
- setup: function () {
- djstest.wait(function (done) {
- $.post(service + "ResetData", done);
- });
- OData.jsonHandler.recognizeDates = false;
- }
- });
-
- for (var i = 0; i < handlerAcceptStrings.length; i++) {
-
- djstest.addTest(function readFullFeedTest(handlerAccept) {
- djstest.assertsExpected(1);
- odatajs.oData.read({ requestUri: feed, headers: { Accept: handlerAccept} },
- function (data, response) {
- window.ODataReadOracle.readFeed(feed,
- function (expectedData) {
- djstest.assertAreEqualDeep(data, expectedData, "Response data not same as expected");
- djstest.done();
- }, handlerAccept
- );
- },
- unexpectedErrorHandler
- );
- }, "Testing valid read of full feed collection with " + handlerAcceptStrings[i], handlerAcceptStrings[i]);
-
- djstest.addTest(function readMaxAndNullValueEntryTest(handlerAccept) {
- var endPoint = feed + "(0)";
- djstest.assertsExpected(1);
- odatajs.oData.read({ requestUri: endPoint, headers: { Accept: handlerAccept} },
- function (data, response) {
- window.ODataReadOracle.readEntry(endPoint,
- function (expectedData) {
- djstest.assertAreEqualDeep(data, expectedData, "Response data not same as expected");
- djstest.done();
- }, handlerAccept
- );
- },
- unexpectedErrorHandler
- );
- }, "Testing valid read of entry with max numbers, complex types, and null and empty strings " + handlerAcceptStrings[i], handlerAcceptStrings[i]);
-
- djstest.addTest(function readMinAndZeroValueEntryTest(handlerAccept) {
- var endPoint = feed + "(1)";
- djstest.assertsExpected(1);
- odatajs.oData.read({ requestUri: "./endpoints/FoodStoreDataServiceV4.svc/Foods(1)", headers: { Accept: handlerAccept} },
- function (data, response) {
- window.ODataReadOracle.readEntry(endPoint,
- function (expectedData) {
- djstest.assertAreEqualDeep(data, expectedData, "Response data not same as expected");
- djstest.done();
- }, handlerAccept
- );
- },
- unexpectedErrorHandler);
- }, "Testing valid read of minimum and zero values " + handlerAcceptStrings[i], handlerAcceptStrings[i]);
-
- djstest.addTest(function readNullNestedComplexTypeEntryTest(handlerAccept) {
- var endPoint = feed + "(2)";
- djstest.assertsExpected(1);
- odatajs.oData.read({ requestUri: endPoint, headers: { Accept: handlerAccept} },
- function (data, response) {
- window.ODataReadOracle.readEntry(endPoint,
- function (expectedData) {
- djstest.assertAreEqualDeep(data, expectedData, "Response data not same as expected");
- djstest.done();
- }, handlerAccept
- );
- },
- unexpectedErrorHandler
- );
- }, "Testing valid read of null nested complex type and navigation property " + handlerAcceptStrings[i], handlerAcceptStrings[i]);
-
- djstest.addTest(function readNullComplexTypeEntryTest(handlerAccept) {
- var endPoint = feed + "(3)";
- djstest.assertsExpected(1);
- odatajs.oData.read({ requestUri: endPoint, headers: { Accept: handlerAccept} },
- function (data, response) {
- window.ODataReadOracle.readEntry(endPoint,
- function (expectedData) {
- djstest.assertAreEqualDeep(data, expectedData, "Response data not same as expected");
- djstest.done();
- }, handlerAccept
- );
- },
- unexpectedErrorHandler
- );
- }, "Testing valid read of null top level complex type" + handlerAcceptStrings[i], handlerAcceptStrings[i]);
-
- djstest.addTest(function readNullPropertiesDerivedEntryTest(handlerAccept) {
- djstest.assertsExpected(1);
- var endPoint = feed + "(4)";
- odatajs.oData.read({ requestUri: endPoint, headers: { Accept: handlerAccept} },
- function (data, response) {
- window.ODataReadOracle.readEntry(endPoint,
- function (expectedData) {
- djstest.assertAreEqualDeep(data, expectedData, "Response data not same as expected");
- djstest.done();
- }, handlerAccept
- );
- },
- unexpectedErrorHandler
- );
- }, "Testing valid read of derived type null properties with " + handlerAcceptStrings[i], handlerAcceptStrings[i]);
-
- djstest.addTest(function readNextComplexTypeDerivedEntryTest(handlerAccept) {
-
- djstest.assertsExpected(1);
- var endPoint = feed + "(5)";
- odatajs.oData.read({ requestUri: endPoint, headers: { Accept: handlerAccept} },
- function (data, response) {
- window.ODataReadOracle.readEntry(endPoint,
- function (expectedData) {
- djstest.assertAreEqualDeep(data, expectedData, "Response data not same as expected");
- djstest.done();
- }, handlerAccept
- );
- },
- unexpectedErrorHandler
- );
- }, "Testing valid read of derived type with full nested complex type properties with " + handlerAcceptStrings[i], handlerAcceptStrings[i]);
-
- djstest.addTest(function readEntryWithInlineFeedTest(handlerAccept) {
- var endpoint = categoriesFeed + "(0)?$expand=Foods";
- djstest.assertsExpected(2);
- odatajs.oData.read({ requestUri: endpoint, headers: { Accept: handlerAccept} },
- function (data, response) {
- window.ODataReadOracle.readEntry(endpoint,
- function (expectedData) {
- djstest.assertAreEqualDeep(data.value, expectedData.value, "Verify inline feed");
- djstest.assertAreEqualDeep(data, expectedData, "Verify entry");
- djstest.done();
- }, handlerAccept
- );
- },
- unexpectedErrorHandler
- );
- }, "Testing read of entry with inline feed with " + handlerAcceptStrings[i], handlerAcceptStrings[i]);
-
- djstest.addTest(function readFeedWithEmptyInlineFeedTest(handlerAccept) {
- var endpoint = categoriesFeed + "?$filter=Name eq 'Empty Category'&$expand=Foods";
- djstest.assertsExpected(2);
- odatajs.oData.read({ requestUri: endpoint, headers: { Accept: handlerAccept} },
- function (data, response) {
- window.ODataReadOracle.readFeed(endpoint,
- function (expectedData) {
- djstest.assertAreEqualDeep(data.value, expectedData.value, "Verify inline feed");
- djstest.assertAreEqualDeep(data, expectedData, "Verify feed");
- djstest.done();
- }, handlerAccept
- );
- },
- unexpectedErrorHandler
- );
- }, "Testing read of entry with empty inline feed with " + handlerAcceptStrings[i], handlerAcceptStrings[i]);
-
- djstest.addTest(function readEntryWithInlineEntryTest(handlerAccept) {
- var endpoint = feed + "(0)?$expand=Category";
- djstest.assertsExpected(2);
- odatajs.oData.read({ requestUri: endpoint, headers: { Accept: handlerAccept} },
- function (data, response) {
- window.ODataReadOracle.readEntry(endpoint,
- function (expectedData) {
- djstest.assertAreEqualDeep(data.Category, expectedData.Category, "Verify inline entry");
- djstest.assertAreEqualDeep(data, expectedData, "Verify entry");
- djstest.done();
- }, handlerAccept
- );
- },
- unexpectedErrorHandler
- );
- }, "Testing read of entry with inline entry with " + handlerAcceptStrings[i], handlerAcceptStrings[i]);
-
- djstest.addTest(function readFeedWithNullInlineEntryTest(handlerAccept) {
- var endpoint = feed + "?$expand=Category&$filter=Category eq null";
- djstest.assertsExpected(2);
- odatajs.oData.read({ requestUri: endpoint, headers: { Accept: handlerAccept} },
- function (data, response) {
- window.ODataReadOracle.readFeed(endpoint,
- function (expectedData) {
- djstest.assertAreEqualDeep(data.value, expectedData.value, "Verify inline data");
- djstest.assertAreEqualDeep(data, expectedData, "Verify feed");
- djstest.done();
- }, handlerAccept);
- },
- unexpectedErrorHandler
- );
- }, "Testing read of feed with null inline entry with " + handlerAcceptStrings[i], handlerAcceptStrings[i]);
-
- djstest.addTest(function readFeedWithInlineCountTest(handlerAccept) {
- var endpoint = feed + "?$count=true";
- djstest.assertsExpected(2);
- odatajs.oData.read({ requestUri: endpoint, headers: { Accept: handlerAccept} },
- function (data, response) {
- window.ODataReadOracle.readFeed(endpoint,
- function (expectedData) {
- djstest.assertAreEqual(data["@odata.count"], expectedData["@odata.count"], "Verify count in response data");
- djstest.assertAreEqualDeep(data, expectedData, "Verify feed");
- djstest.done();
- }, handlerAccept
- );
- },
- unexpectedErrorHandler
- );
- }, "Testing read of collection with inline count with " + handlerAcceptStrings[i], handlerAcceptStrings[i]);
-
- djstest.addTest(function selectSinglePropertyOnEntryTest(handlerAccept) {
- var endpoint = feed + "(0)?$select=Name";
- djstest.assertsExpected(1);
- odatajs.oData.read({ requestUri: endpoint, headers: { Accept: handlerAccept} },
- function (data, response) {
- window.ODataReadOracle.readEntry(endpoint,
- function (expectedData) {
- djstest.assertAreEqualDeep(data, expectedData, "Verify select result");
- djstest.done();
- }, handlerAccept
- );
- },
- unexpectedErrorHandler);
- }, "Select single property of entry " + handlerAcceptStrings[i], handlerAcceptStrings[i]);
-
- djstest.addTest(function selectComplexTypeOnFeedTest(handlerAccept) {
- var endpoint = feed + "?$select=Packaging";
- djstest.assertsExpected(1);
- odatajs.oData.read({ requestUri: endpoint, headers: { Accept: handlerAccept} },
- function (data, response) {
- window.ODataReadOracle.readFeed(endpoint,
- function (expectedData) {
- djstest.assertAreEqualDeep(data, expectedData, "Verify select result");
- djstest.done();
- }, handlerAccept
- );
- },
- unexpectedErrorHandler);
- }, "Select single complex type property of feed " + handlerAcceptStrings[i], handlerAcceptStrings[i]);
-
- djstest.addTest(function selectMultiplePropertiesOnEntryTest(handlerAccept) {
- var endpoint = feed + "(3)?$select=Packaging,ExpirationDate,IsAvailable";
- djstest.assertsExpected(1);
- odatajs.oData.read({ requestUri: endpoint, headers: { Accept: handlerAccept} },
- function (data, response) {
- window.ODataReadOracle.readEntry(endpoint,
- function (expectedData) {
- djstest.assertAreEqualDeep(data, expectedData, "Verify select result");
- djstest.done();
- }, handlerAccept
- );
- },
- unexpectedErrorHandler);
- }, "Select multiple primitive properties of feed " + handlerAcceptStrings[i], handlerAcceptStrings[i]);
-
- djstest.addTest(function readPagedCategoriesCollectionTest(handlerAccept) {
- var endpoint = categoriesFeed;
- djstest.assertsExpected(1);
- odatajs.oData.read({ requestUri: endpoint, headers: { Accept: handlerAccept} },
- function (data, response) {
- window.ODataReadOracle.readFeed(endpoint,
- function (expectedData) {
- djstest.assertAreEqualDeep(data, expectedData, "Verify response data");
- djstest.done();
- }, handlerAccept
- );
- }, unexpectedErrorHandler);
- }, "Testing read of paged collection with " + handlerAcceptStrings[i], handlerAcceptStrings[i]);
-
- djstest.addTest(function readPagedCollectionWithInlineCountTest(handlerAccept) {
- var endpoint = categoriesFeed + "?$count=true";
- djstest.assertsExpected(2);
- odatajs.oData.read({ requestUri: endpoint, headers: { Accept: handlerAccept} },
- function (data, response) {
- window.ODataReadOracle.readFeed(endpoint,
- function (expectedData) {
- djstest.assertAreEqual(data["@odata.context"], expectedData["@odata.context"], "Verify count in response data");
- djstest.assertAreEqualDeep(data, expectedData, "Verify feed");
- djstest.done();
- }, handlerAccept
- );
- }, unexpectedErrorHandler);
- }, "Testing read of paged collection with inline count with " + handlerAcceptStrings[i], handlerAcceptStrings[i]);
-
- djstest.addTest(function readEntryWithNamedStreams(handlerAccept) {
- var endpoint = feed + "(1)?$expand=Category";
- djstest.assertsExpected(1);
- odatajs.oData.read({ requestUri: endpoint, headers: { Accept: handlerAccept} },
- function (data, response) {
- window.ODataReadOracle.readEntry(endpoint,
- function (expectedData) {
- djstest.assertAreEqualDeep(data, expectedData, "Verify entry");
- djstest.done();
- }, handlerAccept
- );
- }, unexpectedErrorHandler);
- }, "Testing read of entry with named streams " + handlerAcceptStrings[i], handlerAcceptStrings[i]);
-
- djstest.addTest(function readEntryWithCollectionProperties(handlerAccept) {
- var endpoint = feed + "(0)";
- djstest.assertsExpected(1);
- odatajs.oData.read({ requestUri: endpoint, headers: { Accept: handlerAccept} },
- function (data, response) {
- window.ODataReadOracle.readEntry(endpoint,
- function (expectedData) {
- djstest.assertAreEqualDeep(data, expectedData, "Verify entry");
- djstest.done();
- }, handlerAccept
- );
- }, unexpectedErrorHandler);
- }, "Testing read of entry with collection properties " + handlerAcceptStrings[i], handlerAcceptStrings[i]);
-
- djstest.addTest(function invalidEntryReadTest(handlerAccept) {
- var endPoint = feed + "(16)";
- djstest.assertsExpected(2);
- odatajs.oData.read({ requestUri: endPoint, headers: { Accept: handlerAccept} },
- function (data, response) {
- djstest.assert(false, "We should not get here because data is not valid.");
- djstest.done()
- },
- function (err) {
- djstest.assertAreEqual(err.message, expectedErrorMessage, "Error message");
- djstest.assertAreEqual(err.response.statusCode, httpStatusCode.notFound, "Response status code");
- djstest.done();
- });
- }, "Testing invalid entry read with " + handlerAcceptStrings[i], handlerAcceptStrings[i]);
-
- djstest.addTest(function invalidFeedReadTest(handlerAccept) {
- var endPoint = feed + "Invalid";
- djstest.assertsExpected(2);
- odatajs.oData.read({ requestUri: endPoint, headers: { Accept: handlerAccept} },
- function (data, response) {
- djstest.assert(false, "We should not get here because data is not valid.");
- djstest.done();
- },
- function (err) {
- djstest.assertAreEqual(err.message, expectedErrorMessage, "Error message");
- djstest.assertAreEqual(err.response.statusCode, httpStatusCode.notFound, "Response status code");
- djstest.done();
- });
- }, "Testing invalid feed read with " + handlerAcceptStrings[i], handlerAcceptStrings[i]);
-
- djstest.addTest(function standardErrorReadTest(handlerAccept) {
- var endPoint = feed + "?$foo=bar";
- djstest.assertsExpected(2);
- odatajs.oData.read({ requestUri: endPoint, headers: { Accept: handlerAccept} },
- function (data, response) {
- djstest.assert(false, "We should not get here because data is not valid.");
- djstest.done()
- },
- function (err) {
- djstest.assertAreEqual(err.message, expectedErrorMessage, "Error message");
- djstest.assertAreEqual(err.response.statusCode, httpStatusCode.badRequest, "Response status code");
- djstest.done();
- });
- }, "Testing standard error read with " + handlerAcceptStrings[i], handlerAcceptStrings[i]);
-
- djstest.addTest(function inStreamErrorReadTest(handlerAccept) {
- var endPoint = "./endpoints/ErrorDataService.svc/Entities";
- djstest.assertsExpected(1);
- odatajs.oData.read({ requestUri: endPoint, headers: { Accept: handlerAccept} }, function (data, response) {
- djstest.assert(false, "Unexpected call to success handler with response: " + djstest.toString(response));
- djstest.done()
- }, function (err) {
- djstest.assert(err.response.body.indexOf("An error occurred while processing this request") > -1, "Error handler was called with the correct response body");
- djstest.done();
- });
- }, "Testing in-stream error read with " + handlerAcceptStrings[i], handlerAcceptStrings[i]);
-
- var user = "djsUser";
- var password = "djsPassword";
-
- djstest.addTest(function readFullFeedBasicAuthTest(handlerAccept) {
- var endpoint = "./endpoints/BasicAuthDataService.svc/Customers";
- djstest.assertsExpected(1);
- odatajs.oData.read({ requestUri: endpoint, headers: { Accept: handlerAccept }, user: user, password: password }, function (data, response) {
- window.ODataReadOracle.readFeed({ url: endpoint, user: user, password: password }, function (expectedData) {
- djstest.assertAreEqualDeep(data, expectedData, "Response data not same as expected");
- djstest.done();
- }, handlerAccept);
- }, unexpectedErrorHandler);
- }, "Testing valid read of full feed collection on basic auth with " + handlerAcceptStrings[i], handlerAcceptStrings[i]);
-
- djstest.addTest(function readEntryBasicAuthTest(handlerAccept) {
- var endpoint = "./endpoints/BasicAuthDataService.svc/Customers(1)";
- djstest.assertsExpected(1);
- odatajs.oData.read({ requestUri: endpoint, headers: { Accept: handlerAccept }, user: user, password: password }, function (data, response) {
- window.ODataReadOracle.readEntry({ url: endpoint, user: user, password: password }, function (expectedData) {
- djstest.assertAreEqualDeep(data, expectedData, "Response data not same as expected");
- djstest.done();
- }, handlerAccept);
- }, unexpectedErrorHandler);
- }, "Testing valid read of entry on basic auth with " + handlerAcceptStrings[i], handlerAcceptStrings[i]);
- }
-
- var services = [
- service,
- epmService
- ];
-
- $.each(services, function (_, serviceName) {
- $.each(validServiceDocumentAcceptHeaders, function (_, validServiceDocumentAcceptHeader) {
- var parameters = { handlerAccept: validServiceDocumentAcceptHeader, serviceName: serviceName };
-
- djstest.addTest(function validReadServiceDocumentTest(params) {
- djstest.assertsExpected(1);
- odatajs.oData.read({ requestUri: params.serviceName, headers: { Accept: params.handlerAccept} },
- function (data, response) {
- window.ODataReadOracle.readServiceDocument(serviceName,
- function (expectedData) {
- djstest.assertAreEqualDeep(data, expectedData, "Response data not same as expected");
- djstest.done();
- }, params.handlerAccept
- );
- },
- unexpectedErrorHandler
- );
- }, "Testing valid read of service document " + parameters.handlerAccept + " on service " + parameters.serviceName, parameters);
- });
-
- $.each(invalidServiceDocumentAcceptHeaders, function (_, invalidServiceDocumentAcceptHeader) {
- var parameters = { handlerAccept: invalidServiceDocumentAcceptHeader, serviceName: serviceName };
-
- djstest.addTest(function invalidReadServiceDocumentTest(params) {
- djstest.assertsExpected(2);
- odatajs.oData.read({ requestUri: params.serviceName, headers: { Accept: params.handlerAccept} },
- function success(data, response) {
- djstest.fail("Reading service document should produce error with " + params.handlerAccept);
- djstest.done();
- },
- function (err) {
- djstest.assertAreEqual(err.message, expectedErrorMessage, "Error message");
- djstest.assertAreEqual(err.response.statusCode, httpStatusCode.unsupportedMediaType, "Response status code");
- djstest.done();
- }
- );
- }, "Testing read of service document with invalid MIME type " + parameters.invalidServiceDocumentAcceptHeader + " on service " + serviceName, parameters);
- });
-
- //to do:
- $.each(validMetadataAcceptHeaders, function (_, validMetadataAcceptHeader) {
- var parameters = { handlerAccept: validMetadataAcceptHeader, serviceName: serviceName };
-
- djstest.addTest(function validReadMetadataTest(params) {
- djstest.assertsExpected(1);
- var endPoint = params.serviceName + "$metadata";
- odatajs.oData.read({ requestUri: endPoint, headers: { Accept: params.handlerAccept} },
- function (data, response) {
- window.ODataReadOracle.readMetadata(endPoint,
- function (expectedData) {
- djstest.assertAreEqualDeep(data, expectedData, "Response data not same as expected");
- djstest.done();
- }
- );
- },
- unexpectedErrorHandler,
- OData.metadataHandler
- );
- }, "Testing valid read metadata " + parameters.handlerAccept + " on service " + parameters.serviceName, parameters);
- });
-
- $.each(invalidMetadataAcceptHeaders, function (_, invalidMetadataAcceptHeader) {
- var parameters = { handlerAccept: invalidMetadataAcceptHeader, serviceName: serviceName };
- djstest.addTest(function invlaidReadMetadataTest(params) {
- djstest.assertsExpected(2);
- var endPoint = params.serviceName + "$metadata";
- odatajs.oData.read({ requestUri: endPoint, headers: { Accept: params.handlerAccept} },
- function success(data, response) {
- djstest.fail("Reading metadata should produce error with " + params.handlerAccept);
- djstest.done();
- },
- function (err) {
- djstest.assertAreEqual(err.message, expectedErrorMessage, "Error message");
- djstest.assertAreEqual(err.response.statusCode, httpStatusCode.unsupportedMediaType, "Response status code");
- djstest.done();
- },
- OData.metadataHandler
- );
- }, "Testing read metadata with invalid MIME type " + parameters.handlerAccept + " on service " + parameters.serviceName, parameters);
- });
- });
-
- // To do: update the test data for enabling the annotation test
- djstest.addFullTest(true, function metadataElementExtensionsTest() {
- var csdlFile = "./endpoints/CustomAnnotations.xml";
- var modifyTypeHttpClient = {};
- var originalHttpClient = OData.defaultHttpClient;
-
- // Modify the content-type of the response so that it is accepted by the metadataHandler.
- // By default, the content-type of CustomAnnotations.xml comes back as text/xml
- modifyTypeHttpClient.request = function (request, success, error) {
- return originalHttpClient.request(request, function (response) {
- response.headers["Content-Type"] = "application/xml";
- success(response);
- }, error);
- }
-
- OData.defaultHttpClient = modifyTypeHttpClient;
-
- odatajs.oData.read({ requestUri: csdlFile, headers: { Accept: "text/xml"} },
- function (data) {
- window.ODataReadOracle.readMetadata(csdlFile,
- function (expectedData) {
- djstest.assertAreEqualDeep(data, expectedData, "Response data not same as expected");
- djstest.done();
- }
- )
- },
- unexpectedErrorHandler, OData.metadataHandler
- );
- });
-
- djstest.addTest(function verifyNonDefaultReadMethodCalled() {
- var endPoint = feed + "(0)";
- djstest.assertsExpected(2);
- odatajs.oData.read(
- { requestUri: endPoint },
- function success(data, response) {
- djstest.assert(true, "Test executed");
- djstest.done();
- },
- null,
- {
- read: function (response) {
- djstest.assert(true, "Non-default read reached");
- djstest.done();
- },
- accept: "*/*"
- }
- );
- }, "Testing nondefault read is called.");
-
-})(this);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/odata-request-functional-tests.html
----------------------------------------------------------------------
diff --git a/JSLib/tests/odata-request-functional-tests.html b/JSLib/tests/odata-request-functional-tests.html
deleted file mode 100644
index 4298493..0000000
--- a/JSLib/tests/odata-request-functional-tests.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
- <title>odata.request tests</title>
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
- <meta http-equiv="expires" content="-1" />
- <link rel="stylesheet" href="http://code.jquery.com/qunit/qunit-1.10.0.css" type="text/css" />
- <script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/json2/20110223/json2.js"></script>
- <script type="text/javascript" src="http://code.jquery.com/jquery-1.4.4.min.js"></script>
- <script type="text/javascript" src="http://code.jquery.com/qunit/qunit-1.10.0.js"></script>
- <script type="text/javascript" src="common/ODataReadOracle.js"></script>
- <script type="text/javascript" src="common/TestSynchronizerClient.js"></script>
- <script type="text/javascript">
- window.TestSynchronizer.init(QUnit);
- </script>
-
- <script type="text/javascript" src="../src/datajs.js"></script>
- <script type="text/javascript" src="../src/utils.js"></script>
- <script type="text/javascript" src="../src/xml.js"></script>
-
- <script type="text/javascript" src="../src/odata-utils.js"></script>
- <script type="text/javascript" src="../src/odata-handler.js"></script>
- <script type="text/javascript" src="../src/odata-gml.js"></script>
- <script type="text/javascript" src="../src/odata-xml.js"></script>
- <script type="text/javascript" src="../src/odata-net.js"></script>
- <script type="text/javascript" src="../src/odata-json-light.js"></script>
- <script type="text/javascript" src="../src/odata-json.js"></script>
- <script type="text/javascript" src="../src/odata-atom.js"></script>
- <script type="text/javascript" src="../src/odata-metadata.js"></script>
- <script type="text/javascript" src="../src/odata-batch.js"></script>
- <script type="text/javascript" src="../src/odata.js"></script>
-
- <script type="text/javascript" src="common/djstest.js"></script>
-
- <script type="text/javascript" src="odata-request-functional-tests.js"></script>
-</head>
-<body>
- <h1 id="qunit-header">odata.request tests</h1>
- <h2 id="qunit-banner"></h2>
- <h2 id="qunit-userAgent"></h2>
- <ol id="qunit-tests"></ol>
-</body>
-</html>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/odata-request-functional-tests.js
----------------------------------------------------------------------
diff --git a/JSLib/tests/odata-request-functional-tests.js b/JSLib/tests/odata-request-functional-tests.js
deleted file mode 100644
index b6644af..0000000
--- a/JSLib/tests/odata-request-functional-tests.js
+++ /dev/null
@@ -1,386 +0,0 @@
-/// <reference path="common/djstest.js" />
-/// <reference path="../src/odata.js" />
-/// <reference path="common/ODataReadOracle.js" />
-
-(function (window, undefined) {
- OData.defaultHandler.accept = "application/json;q=0.9, application/atomsvc+xml;q=0.8, */*;q=0.1";
- var unexpectedErrorHandler = function (err) {
- djstest.assert(false, "Unexpected call to error handler with error: " + djstest.toString(err));
- djstest.done();
- };
-
- var verifyRequest = function (request, done) {
- if (request.method == "POST") {
- verifyPost(request, done);
- }
- else if (request.method == "PUT") {
- verifyPut(request, done);
- }
- else if (request.method == "PATCH") {
- verifyPatch(request, done);
- }
- };
-
- var tryRemoveOdataType = function (data) {
- if (data && data["@odata.type"]) {
- delete data["@odata.type"];
- }
-
- return data;
- };
-
- var verifyPost = function (request, done) {
- var httpOperation = request.method + " " + request.requestUri;
- djstest.log(httpOperation);
- odatajs.oData.request(request, function (data, response) {
- djstest.log("Status code:" + response.statusCode);
- djstest.assertAreEqual(response.statusCode, httpStatusCode.created, "Verify response code: " + httpOperation);
- djstest.log("Uri:" + request.requestUri);
- ODataReadOracle.readEntry(response.headers["Location"], function (expectedData) {
- djstest.assertAreEqualDeep(response.data, expectedData, "Verify new entry against response: " + httpOperation);
- done();
- }, request.headers.Accept);
- }, unexpectedErrorHandler);
- };
-
- var verifyPut = function(request, done) {
- var httpOperation = request.method + " " + request.requestUri;
- djstest.log(httpOperation);
- odatajs.oData.request(request, function(data, response) {
- djstest.log("Status code:" + response.statusCode);
- djstest.assertAreEqual(response.statusCode, httpStatusCode.noContent, "Verify response code: " + httpOperation);
- djstest.log("Uri:" + request.requestUri);
- ODataReadOracle.readEntry(request.requestUri, function(actualData) {
- var requestData = tryRemoveOdataType(request.data);
- djstest.assertAreEqualDeep(subset(actualData, requestData), requestData, "Verify updated entry: " + httpOperation);
- done();
- }, request.headers.Accept);
- }, unexpectedErrorHandler);
- };
-
- var verifyPatch = function (request, done) {
- var httpOperation = request.method + " " + request.requestUri;
- djstest.log(httpOperation);
- ODataReadOracle.readEntry(request.requestUri, function (originalData) {
- odatajs.oData.request(request, function (data, response) {
- djstest.log("Status code:" + response.statusCode);
- djstest.assertAreEqual(response.statusCode, httpStatusCode.noContent, "Verify response code");
- djstest.log("Uri:" + request.requestUri);
- ODataReadOracle.readEntry(request.requestUri, function (actualData) {
-
- // Merge the original data with the updated data to get the expected data
- var expectedData = $.extend(true, {}, originalData, request.data);
- djstest.assertAreEqualDeep(actualData, tryRemoveOdataType(expectedData), "Verify merged data");
- done();
- }, request.headers["Content-Type"]);
- }, unexpectedErrorHandler);
- }, request.headers["Content-Type"]);
- };
-
- // Returns a subset of object with the same set of properties (recursive) as the subsetObject
- var subset = function (object, subsetObject) {
- if (typeof (object) == "object" && typeof (subsetObject) == "object") {
- var result = {};
- for (subsetProp in subsetObject) {
- result[subsetProp] = subset(object[subsetProp], subsetObject[subsetProp]);
- }
- return result;
- }
- else {
- return object;
- }
- };
-
- var foodData = {
- "@odata.type": "#DataJS.Tests.V4.Food",
- FoodID: 42,
- Name: "olive oil",
- UnitPrice: 3.14,
- ServingSize: 1,
- MeasurementUnit: "",
- ProteinGrams: 5,
- FatGrams: 9,
- CarbohydrateGrams: 2,
- CaloriesPerServing: 6,
- IsAvailable: true,
- ExpirationDate: "2010-12-25T12:00:00Z",
- ItemGUID: "27272727-2727-2727-2727-272727272727",
- Weight: 10,
- AvailableUnits: 1,
- Packaging: {
- Type: "Can",
- Color: null,
- NumberPerPackage: 1,
- RequiresRefridgeration: false,
- PackageDimensions: {
- Length: 4,
- Height: 3,
- Width: 2,
- Volume: 1
- },
- ShipDate: "2010-12-25T12:00:00Z"
- }
- };
-
- var testServices = {
- V4: "./endpoints/FoodStoreDataServiceV4.svc"
- };
-
- var testData = {
- V4: $.extend(true, {}, foodData, {
- AlternativeNames: ["name1", "name2"],
- Providers:
- [{
- Name: "Provider",
- Aliases: ["alias1"],
- Details: {
- Telephone: "555-555-555",
- PreferredCode: 999
- }
- },
- {
- Name: "Provider2",
- Aliases: [],
- Details: null
- }
- ]
- })
- };
-
- var mimeTypes = [undefined, "application/json;odata.metadata=minimal"/*, "application/atom+xml"*/];
-
- var httpStatusCode = {
- created: 201,
- noContent: 204,
- notFound: 404
- };
-
- $.each(testServices, function (serviceName, service) {
- var newFood = testData[serviceName];
-
- var foodsFeed = service + "/Foods";
- var categoriesFeed = service + "/Categories";
-
- module("Functional", {
- setup: function () {
- djstest.log("Resetting data");
- djstest.wait(function (done) {
- $.post(service + "/ResetData", done);
- });
- }
- });
-
- $.each(mimeTypes, function (_, mimeType) {
- // Provide coverage for both undefined and specific DSVs
- // For all other cases DSV = undefined is a valid scenario
- var dataServiceVersions = ["4.0"];
-
- $.each(dataServiceVersions, function (_, dataServiceVersion) {
- var headers;
- if (mimeType || dataServiceVersion) {
- headers = {
- "Content-Type": mimeType,
- Accept: mimeType,
- "OData-Version": dataServiceVersion
- };
- }
-
- djstest.addTest(function addEntityTest(headers) {
- var request = {
- requestUri: categoriesFeed,
- method: "POST",
- headers: headers,
- data: {
- CategoryID: 42,
- Name: "New Category"
- }
- };
-
- djstest.assertsExpected(2);
- verifyRequest(request, djstest.done);
- }, "Add new entity to " + serviceName + " service using mimeType = " + mimeType + " and DSV = " + dataServiceVersion, headers);
-
- djstest.addTest(function addEntityWithUTF16CharTest(headers) {
- var request = {
- requestUri: categoriesFeed,
- method: "POST",
- headers: headers,
- data: {
- CategoryID: 42,
- Name: "\u00f6 New Category \u00f1"
- }
- };
-
- djstest.assertsExpected(2);
- verifyRequest(request, djstest.done);
- }, "Add new entity with UTF-16 character to " + serviceName + " service using mimeType = " + mimeType + " and DSV = " + dataServiceVersion, headers);
-
- djstest.addTest(function addLinkedEntityTest(headers) {
- var request = {
- requestUri: categoriesFeed + "(0)/Foods",
- method: "POST",
- headers: headers,
- data: newFood
- };
-
- djstest.assertsExpected(2);
- verifyRequest(request, djstest.done);
- }, "Add new linked entity to " + serviceName + " service using mimeType = " + mimeType + " and DSV = " + dataServiceVersion, headers);
-
- djstest.addTest(function addEntityWithInlineFeedTest(headers) {
- var request = {
- requestUri: categoriesFeed,
- method: "POST",
- headers: headers,
- data: {
- CategoryID: 42,
- Name: "Olive Products",
- Foods: [newFood]
- }
- };
-
- djstest.assertsExpected(3);
- verifyRequest(request, function () {
- ODataReadOracle.readEntry(foodsFeed + "(" + newFood.FoodID + ")", function (actualData) {
- djstest.assertAreEqual(actualData.Name, newFood.Name, "Verify inline entities were added");
- djstest.done();
- }, headers ? headers.Accept : undefined);
- });
- }, "Add new entity with inline feed to " + serviceName + " service using mimeType = " + mimeType + " and DSV = " + dataServiceVersion, headers);
-
- djstest.addTest(function addEntityWithInlineEntryTest(headers) {
- var request = {
- requestUri: foodsFeed,
- method: "POST",
- headers: headers,
- data: $.extend({}, newFood, {
- Category: {
- CategoryID: 42,
- Name: "Olive Products"
- }
- })
- };
-
- djstest.assertsExpected(3);
- verifyRequest(request, function () {
- ODataReadOracle.readEntry(categoriesFeed + "(" + request.data.Category.CategoryID + ")", function (actualData) {
- djstest.assertAreEqual(actualData.Name, request.data.Category.Name, "Verify inline entities were added");
- djstest.done();
- }, headers ? headers.Accept : undefined);
- });
- }, "Add new entity with inline entry to " + serviceName + " service using mimeType = " + mimeType + " and DSV = " + dataServiceVersion, headers);
-
- djstest.addTest(function updateEntityTest(headers) {
- var request = {
- requestUri: categoriesFeed + "(0)",
- method: "PUT",
- headers: headers,
- data: {
- CategoryID: 0,
- Name: "Updated Category"
- }
- };
-
- djstest.assertsExpected(2);
- verifyRequest(request, djstest.done);
- }, "Update entity to " + serviceName + " service using mimeType = " + mimeType + " and DSV = " + dataServiceVersion, headers);
-
- if (serviceName === "V4") {
- djstest.addTest(function updateEntityTest(headers) {
- var request = {
- requestUri: foodsFeed + "(0)",
- method: "PATCH",
- headers: headers,
- data: {
- "@odata.type": "#DataJS.Tests.V4.Food",
- AlternativeNames: ["one", "two"]
- }
- };
-
- djstest.assertsExpected(2);
- verifyRequest(request, djstest.done);
- }, "Update collection property to " + serviceName + " service using mimeType = " + mimeType + " and DSV = " + dataServiceVersion, headers);
- }
-
- if (mimeType !== "application/atom+xml") {
- djstest.addTest(function updatePrimitivePropertyTest(headers) {
- var request = {
- requestUri: categoriesFeed + "(0)/Name",
- method: "PUT",
- headers: headers,
- data: { value: "Updated Category" }
- };
-
- djstest.assertsExpected(2);
- verifyRequest(request, djstest.done);
- }, "Update primitive property to " + serviceName + " service using mimeType = " + mimeType + " and DSV = " + dataServiceVersion, headers);
- }
-
- djstest.addTest(function updateLinkedEntityTest(headers) {
- var request = {
- requestUri: categoriesFeed + "(0)/Foods(0)",
- method: "PUT",
- headers: headers,
- data: {
- "@odata.type": "#DataJS.Tests.V4.Food",
- Name: "Updated Food"
- }
- };
-
- djstest.assertsExpected(2);
- verifyRequest(request, djstest.done);
- }, "Update linked entity to " + serviceName + " service using mimeType = " + mimeType + " and DSV = " + dataServiceVersion, headers);
-
- djstest.addTest(function mergeEntityTest(headers) {
- var request = {
- requestUri: categoriesFeed + "(0)",
- method: "PATCH",
- headers: headers,
- data: { Name: "Merged Category" }
- };
-
- djstest.assertsExpected(2);
- verifyRequest(request, djstest.done);
- }, "Merge entity to " + serviceName + " service using mimeType = " + mimeType + " and DSV = " + dataServiceVersion, headers);
-
- djstest.addTest(function mergeLinkedEntityTest(headers) {
- var request = {
- requestUri: categoriesFeed + "(0)/Foods(0)",
- method: "PATCH",
- headers: headers,
- data: {
- "@odata.type": "#DataJS.Tests.V4.Food",
- Name: "Merged Food"
- }
- };
-
- djstest.assertsExpected(2);
- verifyRequest(request, djstest.done);
- }, "Merge linked entity to " + serviceName + " service using mimeType = " + mimeType + " and DSV = " + dataServiceVersion, headers);
-
- djstest.addTest(function deleteEntityTest(headers) {
- var endpoint = categoriesFeed + "(0)";
- djstest.assertsExpected(2);
- odatajs.oData.request({
- requestUri: endpoint,
- method: "DELETE",
- headers: headers
- }, function (data, response) {
- djstest.assertAreEqual(response.statusCode, httpStatusCode.noContent, "Verify response code");
- $.ajax({
- url: endpoint,
- error: function (xhr) {
- djstest.assertAreEqual(xhr.status, httpStatusCode.notFound, "Verify response code of attempted retrieval after delete");
- djstest.done();
- },
- success: function () {
- djstest.fail("Delete failed: querying the endpoint did not return expected response code");
- djstest.done();
- }
- });
- }, unexpectedErrorHandler);
- }, "Delete entity from " + serviceName + " service using mimeType = " + mimeType + " and DSV = " + dataServiceVersion, headers);
- });
- });
- });
-})(this);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/odata-roundtrip-functional-tests.js
----------------------------------------------------------------------
diff --git a/JSLib/tests/odata-roundtrip-functional-tests.js b/JSLib/tests/odata-roundtrip-functional-tests.js
deleted file mode 100644
index ba0c23d..0000000
--- a/JSLib/tests/odata-roundtrip-functional-tests.js
+++ /dev/null
@@ -1,374 +0,0 @@
-/// <reference path="common/djstest.js" />
-/// <reference path="../src/odata.js" />
-/// <reference path="common/ODataReadOracle.js" />
-
-(function (window, undefined) {
- var unexpectedErrorHandler = function (err) {
- djstest.assert(false, "Unexpected call to error handler with error: " + djstest.toString(err));
- djstest.done();
- };
-
- var verifyRequest = function (request, done) {
- if (request.method == "POST") {
- if (request.headers && request.headers["X-HTTP-Method"] == "MERGE") {
- verifyMerge(request, done);
- }
- else {
- verifyPost(request, done);
- }
- }
- else if (request.method == "PUT") {
- verifyPut(request, done);
- }
- };
-
- var verifyPost = function (request, done) {
- var httpOperation = request.method + " " + request.requestUri;
- odatajs.oData.request(request, function (data, response) {
- djstest.assertAreEqual(response.statusCode, httpStatusCode.created, "Verify response code: " + httpOperation);
- ODataReadOracle.readJson(data.__metadata.uri, function (expectedData) {
- djstest.assertAreEqualDeep(response.data, expectedData, "Verify new entry against response: " + httpOperation);
- done();
- }, request.headers.Accept);
- }, unexpectedErrorHandler);
- };
-
- var verifyPut = function (request, done) {
- var httpOperation = request.method + " " + request.requestUri;
- odatajs.oData.request(request, function (data, response) {
- djstest.assertAreEqual(response.statusCode, httpStatusCode.noContent, "Verify response code: " + httpOperation);
- ODataReadOracle.readJson(request.requestUri, function (actualData) {
- djstest.assertAreEqualDeep(actualData, request.data, "Verify updated entry: " + httpOperation);
- done();
- }, request.headers.Accept);
- }, unexpectedErrorHandler);
- }
-
- var verifyMerge = function (request, done) {
- var httpOperation = request.method + " " + request.requestUri;
- ODataReadOracle.readJson(request.requestUri, function (originalData) {
- odatajs.oData.request(request, function (data, response) {
- djstest.assertAreEqual(response.statusCode, httpStatusCode.noContent, "Verify response code");
- ODataReadOracle.readJson(request.requestUri, function (actualData) {
- // Merge the original data with the updated data to get the expected data
- var expectedData = $.extend(true, {}, originalData, request.data);
- djstest.assertAreEqualDeep(actualData, expectedData, "Verify merged data");
- done();
- }, request.headers["Content-Type"]);
- }, unexpectedErrorHandler);
- }, request.headers["Content-Type"]);
- }
-
- // Returns a subset of object with the same set of properties (recursive) as the subsetObject
- var subset = function (object, subsetObject) {
- if (typeof (object) == "object" && typeof (subsetObject) == "object") {
- var result = {};
- for (subsetProp in subsetObject) {
- result[subsetProp] = subset(object[subsetProp], subsetObject[subsetProp]);
- }
- return result;
- }
- else {
- return object;
- }
- };
-
- var service = "./endpoints/FoodStoreDataService.svc";
- var foodsFeed = service + "/Foods";
- var categoriesFeed = service + "/Categories";
- //var mimeTypes = [undefined, "application/json", "application/atom+xml"];
- var mimeTypes = ["application/json", "application/atom+xml"];
-
- var httpStatusCode = {
- created: 201,
- noContent: 204,
- notFound: 404
- };
-
- var newFood = {
- "__metadata": {
- type: "DataJS.Tests.Food"
- },
- FoodID: 42,
- Name: "olive oil",
- UnitPrice: 3.14,
- ServingSize: "1",
- MeasurementUnit: "Cup",
- ProteinGrams: 5,
- FatGrams: 9,
- CarbohydrateGrams: 2,
- CaloriesPerServing: "6",
- IsAvailable: true,
- ExpirationDate: new Date("2011/05/03 12:00:00 PM"),
- ItemGUID: "27272727-2727-2727-2727-272727272727",
- Weight: 10,
- AvailableUnits: 1,
- Packaging: {
- Type: "Can",
- Color: "White",
- NumberPerPackage: 1,
- RequiresRefridgeration: false,
- PackageDimensions: {
- Length: "4",
- Height: 3,
- Width: "2",
- Volume: 1
- },
- ShipDate: new Date("2011/01/01 12:00:00 PM")
- }
- };
-
- var newFoodLinks = {
- uri: foodsFeed + "(1)"
- }
-
- module("Functional", {
- setup: function () {
- $.ajax({ async: false, type: "POST", url: service + "/ResetData" });
- }
- });
-
- $.each(mimeTypes, function (_, mimeType) {
- var headers = mimeType ? { "Content-Type": mimeType, Accept: mimeType} : undefined;
-
- djstest.addTest(function addEntityTest(headers) {
- var request = {
- requestUri: categoriesFeed,
- method: "POST",
- headers: headers,
- data: {
- CategoryID: 42,
- Name: "New Category"
- }
- };
-
- verifyRequest(request, function () {
- odatajs.oData.read({ requestUri: categoriesFeed + "(42)", headers: { Accept: mimeType} }, function (actualData, response) {
- actualData.CategoryID = 27;
- var newRequest = {
- requestUri: categoriesFeed,
- method: "POST",
- headers: headers,
- data: actualData
- };
- verifyRequest(newRequest, function () { djstest.done(); });
- }, request.headers["Content-Type"]);
- });
-
- }, "Post, read posted data, post read data (mimeType = " + mimeType + ")", headers);
-
- djstest.addTest(function addLinkedEntityTest(headers) {
- var request = {
- requestUri: categoriesFeed + "(0)/Foods",
- method: "POST",
- headers: headers,
- data: newFood
- };
-
- verifyRequest(request, function () {
- odatajs.oData.read({ requestUri: categoriesFeed + "(0)/Foods(42)", headers: { Accept: mimeType} }, function (actualData, response) {
- actualData.FoodID = 94;
- var newRequest = {
- requestUri: categoriesFeed + "(0)/Foods",
- method: "POST",
- headers: headers,
- data: actualData
- };
- verifyRequest(newRequest, function () { djstest.done(); });
- }, request.headers["Content-Type"]);
- });
- }, "POST, read, POST an entry " + mimeType + ")", headers);
-
-
- djstest.addTest(function addLinkedEntityTest(headers) {
- var request = {
- requestUri: categoriesFeed + "(0)/Foods(0)",
- method: "PUT",
- headers: headers,
- data: newFood
- };
-
- verifyRequest(request, function () {
- odatajs.oData.read({ requestUri: categoriesFeed + "(0)/Foods(0)", headers: { Accept: mimeType} }, function (actualData, response) {
- var newRequest = {
- requestUri: categoriesFeed + "(0)/Foods(0)",
- method: "PUT",
- headers: headers,
- data: {
- "__metadata": { type: "DataJS.Tests.Food" },
- Name: "New Food"
- }
- };
- verifyRequest(newRequest, function () { djstest.done(); });
- });
- });
- }, "PUT, read, PUT a new linked entry " + mimeType + ")", headers);
-
- djstest.addTest(function addEntityWithInlineFeedTest(headers) {
- var request = {
- requestUri: categoriesFeed,
- method: "POST",
- headers: headers,
- data: {
- CategoryID: 42,
- Name: "Olive Products",
- Foods: [newFood]
- }
- };
-
- verifyRequest(request, function () {
- odatajs.oData.read({ requestUri: foodsFeed + "(" + newFood.FoodID + ")", headers: { Accept: mimeType} }, function (actualData, response) {
- var newRequest = {
- requestUri: categoriesFeed,
- method: "POST",
- headers: headers,
- data: {
- CategoryID: 27,
- Name: "Olive Products",
- Foods: [actualData]
- }
- };
- verifyRequest(newRequest, function () { djstest.done(); });
- });
- });
-
- }, "POST, read, POST an entity with inline feed " + mimeType + ")", headers);
-
- djstest.addTest(function addEntityWithInlineEntryTest(headers) {
- var request = {
- requestUri: foodsFeed,
- method: "POST",
- headers: headers,
- data: $.extend({}, newFood, {
- Category: {
- "__metadata": { uri: "" },
- CategoryID: 42,
- Name: "Olive Products"
- }
- })
- };
-
- verifyRequest(request, function () {
- odatajs.oData.read({ requestUri: foodsFeed + "(" + newFood.FoodID + ")", headers: { Accept: mimeType} }, function (actualData, response) {
- actualData.FoodID = 76;
- var newRequest = {
- requestUri: foodsFeed,
- method: "POST",
- headers: headers,
- data: $.extend({}, actualData, {
- Category: {
- "__metadata": { uri: "" },
- CategoryID: 27,
- Name: "Olive Products"
- }
- })
- };
- verifyRequest(newRequest, function () { djstest.done(); });
- });
- });
- }, "Add new entity with inline entry (mimeType = " + mimeType + ")", headers);
-
- djstest.addTest(function addEntityTest(headers) {
- var request = {
- requestUri: categoriesFeed + "(1)",
- method: "PUT",
- headers: headers,
- data: {
- CategoryID: 1,
- Name: "New Category"
- }
- };
-
- verifyRequest(request, function () {
- odatajs.oData.read({ requestUri: categoriesFeed + "(1)", headers: { Accept: mimeType} }, function (actualData, response) {
- actualData.CategoryID = 2;
- var newRequest = {
- requestUri: categoriesFeed + "(2)",
- method: "PUT",
- headers: headers,
- data: actualData
- };
- verifyRequest(newRequest, function () { djstest.done(); });
- }, request.headers["Content-Type"]);
- });
-
- }, "Put, read put data, put read data (mimeType = " + mimeType + ")", headers);
-
- djstest.addTest(function addEntityTest(headers) {
- odatajs.oData.read({ requestUri: foodsFeed + "(0)", headers: { Accept: mimeType} },
- function (actualData, response) {
- actualData.CategoryID = 216;
- var request = {
- requestUri: foodsFeed,
- method: "POST",
- headers: headers,
- data: actualData
- };
- verifyRequest(request,
- function () {
- odatajs.oData.read({ requestUri: foodsFeed + "(216)", headers: { Accept: mimeType} },
- function (data, response) {
- ODataReadOracle.readJson(foodsFeed + "(216)",
- function (expectedData) {
- djstest.assertAreEqualDeep(data, expectedData, "Response data not same as expected");
- djstest.done();
- });
- });
- });
- });
- }, "Read data with dates, post read data with dates to new ID, read new ID data with dates" + mimeType + ")", headers);
-
- djstest.addTest(function addEntityTest(headers) {
- odatajs.oData.read({ requestUri: categoriesFeed + "(0)", headers: { Accept: mimeType} },
- function (actualData, response) {
- actualData.CategoryID = 81;
- var request = {
- requestUri: categoriesFeed,
- method: "POST",
- headers: headers,
- data: actualData
- };
- verifyRequest(request,
- function () {
- odatajs.oData.read({ requestUri: categoriesFeed + "(81)", headers: { Accept: mimeType} },
- function (data, response) {
- ODataReadOracle.readJson(categoriesFeed + "(81)",
- function (expectedData) {
- djstest.assertAreEqualDeep(data, expectedData, "Response data not same as expected");
- djstest.done();
- }
- );
- }
- );
- }
- );
- }
- );
- }, "Read existing data, post existing data to new idea, read new ID data" + mimeType + ")", headers);
-
-
- djstest.addTest(function addEntityTest(headers) {
- odatajs.oData.read({ requestUri: categoriesFeed + "(0)", headers: { Accept: mimeType} },
- function (actualData, response) {
- actualData.CategoryID = 81;
- var request = {
- requestUri: categoriesFeed,
- method: "POST",
- headers: headers,
- data: actualData
- };
- verifyRequest(request,
- function () {
- odatajs.oData.read({ requestUri: categoriesFeed + "(81)", headers: { Accept: mimeType} },
- function (data, response) {
- ODataReadOracle.readJson(categoriesFeed + "(81)",
- function (expectedData) {
- djstest.assertAreEqualDeep(data, expectedData, "Response data not same as expected");
- djstest.done();
- });
- });
- });
- });
- }, "Read existing data, post existing data to new idea, read new ID data" + mimeType + ")", headers);
- });
-})(this);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/odata-tests.js
----------------------------------------------------------------------
diff --git a/JSLib/tests/odata-tests.js b/JSLib/tests/odata-tests.js
deleted file mode 100644
index 565e139..0000000
--- a/JSLib/tests/odata-tests.js
+++ /dev/null
@@ -1,306 +0,0 @@
-/// <reference path="../src/odata-net.js" />
-/// <reference path="../src/odata.js" />
-/// <reference path="common/djstest.js" />
-/// <reference path="common/mockHttpClient.js" />
-
-// odata-tests.js
-(function (window, undefined) {
- var northwindService = "http://services.odata.org/Northwind/Northwind.svc/";
- var localFeed = "./endpoints/FoodStoreDataService.svc/Foods";
- var northwindFeed = northwindService + "Suppliers";
-
- var countIFrames = function () {
- /// <summary>Count the number of IFRAMES in the page</summary>
- /// <returns type="Integer">The number of IFRAMES</returns>
- return document.getElementsByTagName("IFRAME").length;
- }
-
- module("Unit");
-
- var originalEnableJsonpCallback = OData.defaultHttpClient.enableJsonpCallback;
-
- var restoreJsonpCallback = function () {
- /// <summary>Restores OData.defaultHttpClient.enableJsonpCallback to the library default.</summary>
- OData.defaultHttpClient.enableJsonpCallback = originalEnableJsonpCallback;
- };
-
- djstest.addTest(function checkApiTest() {
- var internals = window.odatajs.oData.canUseJSONP !== undefined;
- if (internals) {
- // Don't even bother - there is a very long list for inter-module communication.
- // {targetName: "OData", names: "..." }
- djstest.pass("Do not test public api's when internals are visible");
- } else {
- var apis = [
- { targetName: "datajs", names: "createDataCache,createStore,defaultStoreMechanism" },
- { targetName: "OData", names: "atomHandler,batchHandler,defaultError,defaultHandler,defaultHttpClient,defaultMetadata,defaultSuccess,jsonHandler,metadataHandler,read,request,textHandler,xmlHandler,parseMetadata" }
- ];
-
- for (var i = 0; i < apis.length; i++) {
- var target = window[apis[i].targetName];
-
- var actuals = [];
- for (var actual in target) {
- actuals.push(actual);
- }
-
- actuals.sort();
-
- var names = apis[i].names.split(",");
- names.sort();
-
- djstest.assertAreEqual(actuals.join(), names.join(), "actual names for " + apis[i].targetName);
- }
- }
-
- djstest.done();
- });
-
- djstest.addTest(function simpleLocalReadTest() {
- odatajs.oData.read(localFeed, function (data, request) {
- djstest.assert(data !== null, "data !== null");
- djstest.assert(request !== null, "request !== null");
- djstest.done();
- });
- });
-
- djstest.addTest(function simpleLocalReadWithRequestTest() {
- odatajs.oData.read({ requestUri: localFeed, headers: { Accept: "application/json"} }, function (data, response) {
- djstest.assert(data !== null, "data !== null");
- djstest.assert(response !== null, "response !== null");
- djstest.assertAreEqual(data, response.data, "data === response.data");
-
- // Typically application/json;charset=utf-8, but browser may change the request charset (and thus response).
- var contentType = response.headers["Content-Type"];
- contentType = contentType.split(';')[0];
- djstest.assertAreEqual(contentType, "application/json", 'contentType === "application/json"');
- djstest.done();
- });
- });
-
- djstest.addTest(function simpleReadTest() {
- var oldEnableJsonpCallback = OData.defaultHttpClient.enableJsonpCallback;
- OData.defaultHttpClient.enableJsonpCallback = true;
-
- var iframesBefore = countIFrames();
- odatajs.oData.read(northwindService + "Regions", function (data, request) {
- djstest.assert(data !== null, "data !== null");
- djstest.assert(request !== null, "request !== null");
-
- // IFRAME recycling does not work in Opera because as soon as the IFRAME is added to the body, all variables
- // go out of scope
- if (!window.opera) {
- djstest.assertAreEqual(countIFrames() - iframesBefore, 0, "extra IFRAMEs (baseline: " + iframesBefore + ")");
- }
-
- OData.defaultHttpClient.enableJsonpCallback = oldEnableJsonpCallback;
- djstest.done();
- });
- });
-
- djstest.addTest(function simpleReadWithParamsTest() {
- OData.defaultHttpClient.enableJsonpCallback = true;
- odatajs.oData.read(northwindFeed + "?$top=3", function (data, request) {
- djstest.assert(data !== null, "data !== null");
- djstest.assert(request !== null, "request !== null");
- restoreJsonpCallback();
- djstest.done();
- }, djstest.failAndDoneCallback("Unable to read from " + northwindFeed, restoreJsonpCallback));
- });
-
- djstest.addTest(function simpleReadWithNoParamsTest() {
- OData.defaultHttpClient.enableJsonpCallback = true;
- odatajs.oData.read(northwindFeed + "?", function (data, request) {
- djstest.assert(data !== null, "data !== null");
- djstest.assert(request !== null, "request !== null");
- restoreJsonpCallback();
- djstest.done();
- }, djstest.failAndDoneCallback("Unable to read from " + northwindFeed, restoreJsonpCallback));
- });
-
- djstest.addTest(function jsonpTimeoutTest() {
- // Verifies that JSONP will timeout, and that the
- // enableJsonpCallback flag can be set on the request itself.
- var iframesBefore = countIFrames();
- odatajs.oData.request({
- requestUri: northwindFeed + "?$fail=true",
- timeoutMS: 100,
- enableJsonpCallback: true
- }, function (data, request) {
- djstest.fail("expected an error callback");
- djstest.done();
- }, function (err) {
- djstest.assert(err.message.indexOf("timeout") !== 1, "err.message[" + err.message + "].indexOf('timeout') !== 1");
- djstest.assertAreEqual(countIFrames() - iframesBefore, 0, "extra script tags (baseline: " + iframesBefore + ")");
- djstest.done();
- });
- });
-
- djstest.addTest(function requestDefaultsTest() {
- // Save current defaults.
- var oldError = OData.defaultError;
- var oldSuccess = OData.defaultSuccess;
- var oldDefaultHandler = OData.defaultHandler;
- var oldHttpClient = OData.defaultHttpClient;
-
- OData.defaultSuccess = function (data, response) {
- djstest.assertAreEqual(response.statusCode, 299, "success method reached when expected");
- };
-
- OData.defaultError = function (error) {
- var response = error.response;
- djstest.assertAreEqual(response.statusCode, 500, "error method reached when expected");
- };
-
- OData.defaultHandler = {
- read: function (response) {
- djstest.assertAreEqual(response.statusCode, 299, "default handler read method reached when expected");
- },
- accept: "test accept string"
- };
-
- OData.defaultHttpClient = MockHttpClient.clear();
-
- var testUris = [
- "requestDefaultsTest/request",
- "requestDefaultsTest/request1",
- "requestDefaultsTest/error"
- ];
-
- MockHttpClient.addRequestVerifier(testUris[0], function (request) {
- djstest.assertAreEqual(request.method, "GET", "request.method is GET");
- djstest.assert(request.headers, "request.headers is defined and not null");
- djstest.assertAreEqual(request.headers.Accept, "test accept string");
- });
-
- MockHttpClient.addResponse(testUris[1], { statusCode: 299, body: "test response" });
- MockHttpClient.addResponse(testUris[2], { statusCode: 500, body: "error response" });
-
- try {
- var i, len;
- for (i = 0, len = testUris.length; i < len; i++) {
- odatajs.oData.request({ requestUri: testUris[i] });
- }
- }
- finally {
- // Restore defaults.
- OData.defaultError = oldError;
- OData.defaultSuccess = oldSuccess;
- OData.defaultHandler = oldDefaultHandler;
- OData.defaultHttpClient = oldHttpClient;
- }
-
- djstest.assertsExpected(6);
- djstest.done();
- });
-
- djstest.addTest(function requestUpdateTest() {
- // Save current defaults.
- var testHandler = {
- read: function (response) {
- response.data = response.body;
- },
- write: function (request) {
- djstest.assertAreEqual(request.method, "POST", "handler write method, request has the correct method");
- }
- };
-
- var testSuccess = function (data, response) {
- djstest.assertAreEqual(data, "test response", "success callback has the correct data");
- djstest.assertAreEqual(response.status, 200, "success method reached when expected");
- };
-
- var testError = function (error) {
- var response = error.response;
- djstest.assertAreEqual(response.status, 500, "error method reached when expected");
- };
-
- MockHttpClient.addResponse("requestUpdateTest", { status: 200, body: "test response" });
- MockHttpClient.addResponse("requestUpdateTest", { status: 500, body: "error response" });
-
- odatajs.oData.request({ requestUri: "requestUpdateTest", method: "POST" }, testSuccess, testError, testHandler, MockHttpClient);
-
- djstest.done();
- });
-
- djstest.addTest(function parseMetadataTest() {
- var metadata = '<?xml version="1.0" encoding="utf-8"?>' +
- '<edmx:Edmx Version="1.0" xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx">' +
- '<edmx:DataServices m:DataServiceVersion="4.0" m:MaxDataServiceVersion="4.0" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">' +
- '<Schema Namespace="ODataDemo" xmlns="http://schemas.microsoft.com/ado/2009/11/edm">' +
- '<EntityType Name="Product">' +
- '<Key><PropertyRef Name="ID" /></Key>' +
- '<Property Name="ID" Type="Edm.Int32" Nullable="false" />' +
- '<Property Name="Name" Type="Edm.String" m:FC_TargetPath="SyndicationTitle" m:FC_ContentKind="text" m:FC_KeepInContent="false" />' +
- '<Property Name="Description" Type="Edm.String" m:FC_TargetPath="SyndicationSummary" m:FC_ContentKind="text" m:FC_KeepInContent="false" />' +
- '<Property Name="ReleaseDate" Type="Edm.DateTime" Nullable="false" />' +
- '<Property Name="DiscontinuedDate" Type="Edm.DateTime" />' +
- '<Property Name="Rating" Type="Edm.Int32" Nullable="false" />' +
- '<Property Name="Price" Type="Edm.Decimal" Nullable="false" />' +
- '<NavigationProperty Name="Category" Relationship="ODataDemo.Product_Category_Category_Products" ToRole="Category_Products" FromRole="Product_Category" />' +
- '</EntityType>' +
- '<EntityType Name="Category">' +
- '<Key>' +
- '<PropertyRef Name="ID" />' +
- '</Key>' +
- '<Property Name="ID" Type="Edm.Int32" Nullable="false" />' +
- '<Property Name="Name" Type="Edm.String" m:FC_TargetPath="SyndicationTitle" m:FC_ContentKind="text" m:FC_KeepInContent="true" />' +
- '<NavigationProperty Name="Products" Relationship="ODataDemo.Product_Category_Category_Products" ToRole="Product_Category" FromRole="Category_Products" />' +
- '</EntityType>' +
- '<Association Name="Product_Category_Category_Products"><End Type="ODataDemo.Category" Role="Category_Products" Multiplicity="0..1" />' +
- '<End Type="ODataDemo.Product" Role="Product_Category" Multiplicity="*" />' +
- '</Association>' +
- '<EntityContainer Name="DemoService" m:IsDefaultEntityContainer="true">' +
- '<EntitySet Name="Products" EntityType="ODataDemo.Product" />' +
- '<EntitySet Name="Categories" EntityType="ODataDemo.Category" />' +
- '<FunctionImport Name="Discount" IsBindable="true" m:IsAlwaysBindable="true">' +
- '<Parameter Name="product" Type="ODataDemo.Product" />' +
- '<Parameter Name="discountPercentage" Type="Edm.Int32" Nullable="false" />' +
- '</FunctionImport>' +
- '<AssociationSet Name="Products_Category_Categories" Association="ODataDemo.Product_Category_Category_Products">' +
- '<End Role="Product_Category" EntitySet="Products" />' +
- '<End Role="Category_Products" EntitySet="Categories" />' +
- '</AssociationSet>' +
- '</EntityContainer>' +
- '</Schema></edmx:DataServices></edmx:Edmx>';
-
- var parsedMetadata = OData.parseMetadata(metadata);
- var expected =
- {
- "version": "1.0",
- "dataServices":
- {
- "maxDataServiceVersion": "4.0",
- "dataServiceVersion": "4.0",
- "schema": [
- {
- "namespace": "ODataDemo",
- "entityType": [
- {
- "name": "Product",
- "key": { "propertyRef": [{ "name": "ID"}] },
- "property": [
- { "name": "ID", "nullable": "false", "type": "Edm.Int32" },
- { "name": "Name", "type": "Edm.String", "FC_KeepInContent": "false", "FC_ContentKind": "text", "FC_TargetPath": "SyndicationTitle" },
- { "name": "Description", "type": "Edm.String", "FC_KeepInContent": "false", "FC_ContentKind": "text", "FC_TargetPath": "SyndicationSummary" },
- { "name": "ReleaseDate", "nullable": "false", "type": "Edm.DateTime" }, { "name": "DiscontinuedDate", "type": "Edm.DateTime" },
- { "name": "Rating", "nullable": "false", "type": "Edm.Int32" }, { "name": "Price", "nullable": "false", "type": "Edm.Decimal"}],
- "navigationProperty": [
- { "name": "Category", "fromRole": "Product_Category", "toRole": "Category_Products", "relationship": "ODataDemo.Product_Category_Category_Products" }
- ]
- }, {
- "name": "Category",
- "key": { "propertyRef": [{ "name": "ID"}] },
- "property": [{ "name": "ID", "nullable": "false", "type": "Edm.Int32" }, { "name": "Name", "type": "Edm.String", "FC_KeepInContent": "true", "FC_ContentKind": "text", "FC_TargetPath": "SyndicationTitle"}],
- "navigationProperty": [{ "name": "Products", "fromRole": "Category_Products", "toRole": "Product_Category", "relationship": "ODataDemo.Product_Category_Category_Products"}]
- }],
- "association": [{ "name": "Product_Category_Category_Products", "end": [{ "type": "ODataDemo.Category", "multiplicity": "0..1", "role": "Category_Products" }, { "type": "ODataDemo.Product", "multiplicity": "*", "role": "Product_Category"}]}],
- "entityContainer": [{ "name": "DemoService", "isDefaultEntityContainer": "true", "entitySet": [{ "name": "Products", "entityType": "ODataDemo.Product" }, { "name": "Categories", "entityType": "ODataDemo.Category"}], "functionImport": [{ "name": "Discount", "isAlwaysBindable": "true", "isBindable": "true", "parameter": [{ "name": "product", "type": "ODataDemo.Product" }, { "name": "discountPercentage", "nullable": "false", "type": "Edm.Int32"}]}], "associationSet": [{ "name": "Products_Category_Categories", "association": "ODataDemo.Product_Category_Category_Products", "end": [{ "role": "Product_Category", "entitySet": "Products" }, { "role": "Category_Products", "entitySet": "Categories"}]}]}]
- }]
- }
- };
- djstest.assertAreEqualDeep(expected, parsedMetadata, "metadata should be parsed to datajs format");
- djstest.done();
- });
-
-})(this);
[12/22] olingo-odata4-js git commit: [OLINGO-442] Cleanup bevor
release
Posted by ko...@apache.org.
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/common/CacheOracle.js
----------------------------------------------------------------------
diff --git a/JSLib/tests/common/CacheOracle.js b/JSLib/tests/common/CacheOracle.js
deleted file mode 100644
index 2130f82..0000000
--- a/JSLib/tests/common/CacheOracle.js
+++ /dev/null
@@ -1,228 +0,0 @@
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
-// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// CacheOracle.js
-// This object verifies the operation of the cache.
-// Internally it maintains a simple model of the cache implemented using a lookup array of the expected cached pages.
-
-(function (window, undefined) {
-
- var CacheOracle = function (baseUri, pageSize, total, cacheSize) {
- /// <summary>Creates a new CacheOracle</summary>
- /// <param name="baseUri" type="String">The base URI of the collection</param>
- /// <param name="pageSize" type="Integer">The page size used in the cache</param>
- /// <param name="total" type="Integer">The total number of items in the collection</param>
- /// <param name="cacheSize" type="Integer">Cache size in bytes</param>
- this.baseUri = baseUri;
- this.pageSize = pageSize;
- this.total = total;
- this.cacheSize = (cacheSize !== undefined) ? cacheSize : 1024 * 1024;
- this.actualSize = 0;
- this.actualCount = 0;
- this.cachedPages = [];
- this.exactPageCount = (total % pageSize === 0);
- this.maxPage = Math.floor(total / pageSize);
- this.overflowed = this.cacheSize === 0;
- };
-
- CacheOracle.mechanisms = {
- memory: "memory",
- indexeddb: "indexeddb",
- dom: "dom",
- best: "best"
- };
-
- CacheOracle.isMechanismAvailable = function (mechanism) {
- /// <summary>Determines if the specified local storage mechanism is available</summary>
- /// <param name="mechanism">The name of the mechanism</param>
- /// <returns>Whether the mechanism is available</returns>
- switch (mechanism) {
- case CacheOracle.mechanisms.indexeddb:
- if (window.msIndexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.indexedDB) {
- return true;
- }
- else {
- return false;
- }
- break;
- case CacheOracle.mechanisms.dom:
- if (window.localStorage) {
- return true;
- }
- else {
- return false;
- }
- break;
- case CacheOracle.mechanisms.memory:
- case CacheOracle.mechanisms.best:
- case undefined:
- return true;
- default:
- return false;
- }
- }
-
- CacheOracle.prototype.clear = function () {
- /// <summary>Clears the cache in the oracle</summary>
- this.cachedPages = [];
- this.actualSize = 0;
- this.actualCount = 0;
- this.overflowed = this.cacheSize === 0;
- }
-
- CacheOracle.prototype.verifyRequests = function (requests, responses, index, count, description, backwards, isPrefetch) {
- /// <summary>Verifies the HTTP requests for a single data request, and updates the oracle with cached pages</summary>
- /// <param name="requests" type="Array">The sequence of request objects (from OData.defaultHttpClient)</param>
- /// <param name="responses" type="Array">The sequence of response objects (from OData.defaultHttpClient)</param>
- /// <param name="index" type="Integer">The starting index of the read</param>
- /// <param name="count" type="Integer">The count of items in the read</param>
- /// <param name="description" type="String">The description of the requests being verified</param>
- /// <param name="backwards" type="Boolean">Whether or not filterBack is being verified</param>
- /// <param name="isPrefetch" type="Boolean">Whether the requests being verified come from the prefetcher</param>
- var that = this;
-
- index = (index < 0 ? 0 : index);
- var pageIndex = function (index) {
- /// <summary>Returns the page index that the given item index belongs to</summary>
- /// <param name="index" type="Integer">The item index</param>
- /// <returns>The page index</returns>
- return Math.floor(index / that.pageSize);
- };
-
- var estimateSize = function (obj) {
- /// <summary>Estimates the size of an object in bytes.</summary>
- /// <param name="obj" type="Object">Object to determine the size of.</param>
- /// <returns type="Number">Estimated size of the object in bytes.</returns>
-
- var size = 0;
- var type = typeof obj;
-
- if (type === "object" && obj) {
- for (var name in obj) {
- size += name.length * 2 + estimateSize(obj[name]);
- }
- } else if (type === "string") {
- size = obj.length * 2;
- } else {
- size = 8;
- }
- return size;
- };
-
- var expectedUris = [];
- var responseIndex = 0;
- if (count >= 0) {
- var minPage = pageIndex(index);
- var maxPage = Math.min(pageIndex(index + count - 1), pageIndex(this.total));
-
- // In the case that the index is outside the range of the collection the minPage will be greater than the maxPage
- maxPage = Math.max(minPage, maxPage);
-
- if (!(isPrefetch && !this.exactPageCount && minPage > this.maxPage)) {
- for (var page = minPage; page <= maxPage && this.actualCount <= this.total && !(isPrefetch && this.overflowed); page++) {
- if (!this.cachedPages[page]) {
-
- expectedUris.push(that.baseUri + "?$skip=" + page * this.pageSize + "&$top=" + (this.pageSize));
-
- var actualPageSize = 0;
- var actualPageCount = 0;
- if (responses[responseIndex] && responses[responseIndex].data) {
- actualPageSize += estimateSize(responses[responseIndex].data);
- actualPageCount += responses[responseIndex].data.value.length;
- // Handle server paging skipToken requests
- while (responses[responseIndex].data["@odata.nextLink"]) {
- var nextLink = responses[responseIndex].data["@odata.nextLink"];
- if (nextLink) {
- var index = that.baseUri.indexOf(".svc/", 0);
- if (index != -1) {
- nextLink = that.baseUri.substring(0, index + 5) + nextLink;
- }
- }
-
- expectedUris.push(nextLink);
- responseIndex++;
- actualPageSize += estimateSize(responses[responseIndex].data);
- actualPageCount += responses[responseIndex].data.value.length;
- }
-
- actualPageSize += 24; // 24 byte overhead for the pages (i)ndex, and (c)ount fields
- }
-
- responseIndex++;
-
- this.overflowed = this.cacheSize >= 0 && this.actualSize + actualPageSize > this.cacheSize;
- if (!this.overflowed) {
- this.cachedPages[page] = true;
- this.actualSize += actualPageSize;
- this.actualCount += actualPageCount;
- }
- }
- }
- }
- }
-
- if (backwards) {
- expectedUris.reverse();
- }
-
- var actualUris = $.map(requests, function (r) { return r.requestUri; });
- djstest.assertAreEqualDeep(actualUris, expectedUris, description);
- };
-
- CacheOracle.getExpectedFilterResults = function (data, filterIndex, filterCount, predicate, backwards) {
- /// <summary>Verifies the cache filter returns the correct data</summary>
- /// <param name="collection" type="Array">Array of items in the collection</param>
- /// <param name="filterIndex" type="Integer">The index value</param>
- /// <param name="filterCount" type="Integer">The count value</param>
- /// <param name="predicate" type="Function">Predicate to be applied in filter, takes an item</param>
- /// <param name="backwards" type="Boolean">Whether or not filterBackwards is being verified</param>
- if (!data || !data.value) {
- return data;
- }
-
- var value = [];
- if (filterCount !== 0) {
- // Convert [item0, item1, ...] into [{ index: 0, item: item0 }, { index: 1, item: item1 }, ...]
- var indexedCollection = $.map(data.value, function (item, index) {
- return { index: index, item: item };
- });
-
- var grepPredicate = function (element, index) {
- return predicate(element.item);
- };
-
- var index = filterIndex < 0 ? 0 : filterIndex;
- var count = filterCount < 0 ? indexedCollection.length : filterCount;
-
- value = backwards ?
- // Slice up to 'index', filter, then slice 'count' number of items from the end
- $.grep(indexedCollection.slice(0, index + 1), grepPredicate).slice(-count) :
- // Slice from 'index' to the end, filter, then slice 'count' number of items from the beginning
- $.grep(indexedCollection.slice(index), grepPredicate).slice(0, count);
- }
-
- var expectedResults = {};
- for (var property in data) {
- if (property == "value") {
- expectedResults[property] = value;
- } else {
- expectedResults[property] = data[property];
- }
- }
-
- return expectedResults;
- };
-
- window.CacheOracle = CacheOracle;
-
-})(this);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/common/Instrument.js
----------------------------------------------------------------------
diff --git a/JSLib/tests/common/Instrument.js b/JSLib/tests/common/Instrument.js
deleted file mode 100644
index acbb2b0..0000000
--- a/JSLib/tests/common/Instrument.js
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
-// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// Instrument.js
-// Instrumentation utilities
-
-(function (window, undefined) {
-
- var warmedUp = false;
- var getBrowserMemorySize = function (success) {
- /// <summary>Gets the memory size (in bytes) of the browser process</summary>
- /// <param name="success" type="Function">The success callback</param>
- var makeRequest = function (success) {
- $.get("./common/Instrument.svc/GetBrowserMemorySize", function (data) {
- success(parseInt(data));
- }, "text");
- };
-
- if (window.CollectGarbage) {
- window.CollectGarbage();
- }
-
- if (!warmedUp) {
- // Make a dummy request to warm it up
- makeRequest(function () {
- warmedUp = true;
- makeRequest(success);
- });
- } else {
- makeRequest(success);
- }
- }
-
- window.Instrument = {
- getBrowserMemorySize: getBrowserMemorySize
- };
-
-})(this);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/common/Instrument.svc
----------------------------------------------------------------------
diff --git a/JSLib/tests/common/Instrument.svc b/JSLib/tests/common/Instrument.svc
deleted file mode 100644
index 3d14b16..0000000
--- a/JSLib/tests/common/Instrument.svc
+++ /dev/null
@@ -1,71 +0,0 @@
-<%@ ServiceHost Language="C#" Debug="true" Factory="System.ServiceModel.Activation.WebScriptServiceHostFactory"
- Service="DataJS.Tests.Instrument" %>
-
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
-// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-namespace DataJS.Tests
-{
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.IO;
- using System.Linq;
- using System.Runtime.Serialization;
- using System.ServiceModel;
- using System.ServiceModel.Activation;
- using System.ServiceModel.Syndication;
- using System.ServiceModel.Web;
- using System.Text;
-
- /// <summary>
- /// Instrumentation utilities
- /// </summary>
- [ServiceContract]
- [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
- [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
- public class Instrument
- {
- static readonly Dictionary<string, string> userAgents = new Dictionary<string,string>
- {
- { "MSIE", "iexplore" },
- { "Firefox", "firefox" },
- { "Chrome", "chrome" },
- { "Safari", "safari" }
- };
-
- /// <summary>
- /// Gets the memory size used by the browser
- /// </summary>
- /// <returns>The memory size used by the browser (in bytes), or zero if browser is not supported</returns>
- [OperationContract]
- [WebGet]
- public Stream GetBrowserMemorySize()
- {
- string userAgentString = WebOperationContext.Current.IncomingRequest.UserAgent;
- string userAgentKey = Instrument.userAgents.Keys.FirstOrDefault(ua => userAgentString.Contains(ua));
-
- if (userAgentKey != null)
- {
- string processName = userAgents[userAgentKey];
- long totalMemory = Process.GetProcessesByName(processName).Select(p => p.WorkingSet64).Sum();
-
- return new MemoryStream(Encoding.UTF8.GetBytes(totalMemory.ToString()));
- }
- else
- {
- return new MemoryStream(Encoding.UTF8.GetBytes("0"));
- }
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/common/ODataReadOracle.js
----------------------------------------------------------------------
diff --git a/JSLib/tests/common/ODataReadOracle.js b/JSLib/tests/common/ODataReadOracle.js
deleted file mode 100644
index 4114745..0000000
--- a/JSLib/tests/common/ODataReadOracle.js
+++ /dev/null
@@ -1,205 +0,0 @@
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
-// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// Client for the odata.read oracle service
-
-(function (window, undefined) {
- var jsonMime = "application/json";
- var universalMime = "*/*";
- var atomMime = "application/atom+xml";
-
- var readFeed = function (url, success, mimeType, recognizeDates) {
- /// <summary>Calls the ReadFeed endpoint with the specified URL</summary>
- /// <param name="url" type="String">The URL to read the feed from</param>
- /// <param name="success" type="Function">The success callback function</param>
- /// <param name="mimeType" type="String">The MIME media type in the Accept header</param>
- var readMethod = getReadMethod(mimeType, "ReadFeed");
- oracleRequest("GET", readMethod, typeof url === "string" ? { url: url} : url, mimeType, recognizeDates, function (data) {
- success(data);
- });
- };
-
- var readEntry = function (url, success, mimeType, recognizeDates) {
- /// <summary>Calls the ReadEntry endpoint with the specified URL</summary>
- /// <param name="url" type="String">The URL to read the entry from</param>
- /// <param name="success" type="Function">The success callback function</param>
- /// <param name="mimeType" type="String">The MIME media type in the Accept header</param>
- var readMethod = getReadMethod(mimeType, "ReadEntry");
- oracleRequest("GET", readMethod, typeof url === "string" ? { url: url} : url, mimeType, recognizeDates, success);
- };
-
- var readFeedLoopback = function (atomFeedXml, success, recognizeDates) {
- /// <summary>Calls the ReadFeedLoopback endpoint with the specified atom feed xml</summary>
- /// <param name="atomFeedXml" type="String">The atom feed xml</param>
- /// <param name="success" type="Function">The success callback function</param>
- oracleRequest("POST", "ReadFeedLoopback", atomFeedXml, atomMime, recognizeDates, success);
- };
-
- var readEntryLoopback = function (atomEntryXml, success, recognizeDates) {
- /// <summary>Calls the ReadEntryLoopback endpoint with the specified atom entry xml</summary>
- /// <param name="atomEntryXml" type="String">The atom entry xml</param>
- /// <param name="success" type="Function">The success callback function</param>
- oracleRequest("POST", "ReadEntryLoopback", atomEntryXml, atomMime, recognizeDates, success);
- };
-
- var readLinksEntry = function (url, success) {
- /// <summary>Calls the ReadMetadata endpoint with the specified URL</summary>
- /// <param name="url" type="String">The URL to read the metadata from</param>
- /// <param name="success" type="Function">The success callback function</param>
- readJson(
- url,
- success
- );
- };
-
- var readLinksFeed = function (url, success) {
- /// <summary>Calls the ReadMetadata endpoint with the specified URL</summary>
- /// <param name="url" type="String">The URL to read the metadata from</param>
- /// <param name="success" type="Function">The success callback function</param>
- readJson(
- url,
- function (data) {
- success(data);
- }
- );
- };
-
- var readMetadata = function (url, success) {
- /// <summary>Calls the ReadMetadata endpoint with the specified URL</summary>
- /// <param name="url" type="String">The URL to read the metadata from</param>
- /// <param name="success" type="Function">The success callback function</param>
- oracleRequest("GET", "ReadMetadata", typeof url === "string" ? { url: url} : url, null, null, success);
- };
-
- var readServiceDocument = function (url, success, mimeType) {
- /// <summary>Calls the ReadServiceDocument endpoint with the specified URL</summary>
- /// <param name="url" type="String">The URL to the service</param>
- /// <param name="success" type="Function">The success callback function</param>
- /// <param name="mimeType" type="String">The MIME type being tested</param>
- var readMethod = getReadMethod(mimeType, "ReadServiceDocument");
- oracleRequest("GET", readMethod, typeof url === "string" ? { url: url} : url, mimeType, null, success);
- };
-
- var readJson = function (url, success) {
- $.ajax({
- url: url,
- accepts: null,
- dataType: "json",
- beforeSend: function (xhr) {
- xhr.setRequestHeader("Accept", jsonMime);
- xhr.setRequestHeader("OData-MaxVersion", "4.0");
- },
- success: function (data) {
- success(data);
- }
- });
- };
-
- var readJsonAcrossServerPages = function (url, success) {
- var data = {};
- var readPage = function (url) {
- readJson(url, function (feedData) {
- var nextLink = feedData["@odata.nextLink"];
- if (nextLink) {
- var index = url.indexOf(".svc/", 0);
- if (index != -1) {
- nextLink = url.substring(0, index + 5) + nextLink;
- }
- }
-
- if (data.value && feedData.value) {
- data.value = data.value.concat(feedData.value);
- }
- else {
- for (var property in feedData) {
- if (property != "@odata.nextLink") {
- data[property] = feedData[property];
- }
- }
- }
-
- if (nextLink) {
- readPage(nextLink);
- }
- else {
- success(data);
- }
- });
- };
-
- readPage(url);
- };
-
- var getReadMethod = function (mimeType, defaultEndpoint) {
- switch (mimeType) {
- case atomMime:
- return defaultEndpoint;
- case jsonMime:
- case universalMime:
- default:
- return "ReadJson";
- }
- };
-
- var oracleRequest = function (method, endpoint, data, mimeType, recognizeDates, success) {
- /// <summary>Requests a JSON object from the oracle service, removing WCF-specific artifacts</summary>
- /// <param name="method" type="String">The HTTP method (GET or POST)</param>
- /// <param name="endpoint" type="String">The oracle endpoint</param>
- /// <param name="data" type="Object">The data to send with the request</param>
- /// <param name="reviver" type="Function">The reviver function to run on each deserialized object</param>
- /// <param name="success" type="Function">Success callback</param>
- var url = "./common/ODataReadOracle.svc/" + endpoint;
- if (mimeType) {
- data.mimeType = mimeType;
- }
-
- $.ajax({
- type: method,
- url: url,
- data: data,
- dataType: "text",
- success: function (data) {
- var json = JSON.parse(data);
- success(json);
- }
- });
- };
-
- var removeProperty = function (data, property) {
- /// <summary>Removes the specified property recursively from the given object</summary>
- /// <param name="data" type="Object">The object to operate on</param>
- /// <param name="property" type="String">The name of the property to remove</param>
- if (typeof data === "object" && data !== null) {
- if (data[property]) {
- delete data[property];
- }
-
- for (prop in data) {
- removeProperty(data[prop], property);
- }
- }
- };
-
- window.ODataReadOracle = {
- readFeed: readFeed,
- readEntry: readEntry,
- readFeedLoopback: readFeedLoopback,
- readEntryLoopback: readEntryLoopback,
- readLinksEntry: readLinksEntry,
- readLinksFeed: readLinksFeed,
- readJson: readJson,
- readJsonAcrossServerPages: readJsonAcrossServerPages,
- readMetadata: readMetadata,
- readServiceDocument: readServiceDocument
- };
-})(window);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/common/ODataReadOracle.svc
----------------------------------------------------------------------
diff --git a/JSLib/tests/common/ODataReadOracle.svc b/JSLib/tests/common/ODataReadOracle.svc
deleted file mode 100644
index 51ccd62..0000000
--- a/JSLib/tests/common/ODataReadOracle.svc
+++ /dev/null
@@ -1,189 +0,0 @@
-<%@ ServiceHost Language="C#" Debug="true" Factory="System.ServiceModel.Activation.WebScriptServiceHostFactory"
- Service="DataJS.Tests.ODataReadOracle" %>
-
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
-// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-//uncomment this line to debug JSON serialization.
-//#define DEBUG_SERIALIZATION
-
-namespace DataJS.Tests
-{
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Net;
- using System.Runtime.Serialization;
- using System.ServiceModel;
- using System.ServiceModel.Activation;
- using System.ServiceModel.Syndication;
- using System.ServiceModel.Web;
- using System.Xml;
- using System.Xml.Linq;
- using Microsoft.Spatial;
- using Microsoft.OData.Core;
- using System.Web.Script.Serialization;
-
- /// <summary>
- /// Oracle for the OData.read library function
- /// </summary>
- [ServiceContract]
- [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
- [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
- public class ODataReadOracle
- {
- const string jsonlightMediaType = "application/json";
-
- /// <summary>
- /// Reads a URI that will return an OData ATOM feed
- /// </summary>
- /// <param name="url">The URL to send the request to</param>
- /// <param name="user">The username for basic authentication</param>
- /// <param name="password">The password for basic authentication</param>
- /// <returns>JSON object expected to be returned by OData.read (plus type metadata markers that will need to be removed)</returns>
- [OperationContract]
- [WebGet(ResponseFormat = WebMessageFormat.Json)]
- public JsonObject ReadFeed(string url, string user, string password)
- {
- WebResponse response = ReaderUtils.CreateRequest(ResolveUri(url, UriKind.Absolute), user, password).GetResponse();
- return AtomReader.ReadFeed(new StreamReader(response.GetResponseStream()));
- }
-
- /// <summary>
- /// Reads a URI that will return an OData ATOM feed entry
- /// </summary>
- /// <param name="url">URL of the entry</param>
- /// <param name="user">The username for basic authentication</param>
- /// <param name="password">The password for basic authentication</param>
- /// <returns>JSON object expected to be returned by OData.read</returns>
- [OperationContract]
- [WebGet(ResponseFormat = WebMessageFormat.Json)]
- public JsonObject ReadEntry(string url, string user, string password)
- {
- WebResponse response = ReaderUtils.CreateRequest(ResolveUri(url, UriKind.Absolute), user, password).GetResponse();
- return AtomReader.ReadEntry(new StreamReader(response.GetResponseStream()));
- }
-
- /// <summary>
- /// Reads a URI that will return a metadata object
- /// </summary>
- /// <param name="url">The URL to send the request to</param>
- /// <returns>Stream of metadata in json light format</returns>
- [OperationContract]
- [WebGet]
- public Stream ReadMetadata(string url)
- {
- WebResponse response = WebRequest.Create(ResolveUri(url, UriKind.Absolute)).GetResponse();
- Dictionary<string, object> jsonObject = CsdlReader.ReadCsdl(new StreamReader(response.GetResponseStream()));
- return ReaderUtils.ConvertDictionarytoJsonlightStream(jsonObject);
- }
-
- /// <summary>
- /// Reads a URI that will return a metadata object
- /// </summary>
- /// <param name="url">The URL to send the request to</param>
- /// <param name="mimeType">Mime type being tested to determine base URI</param>
- /// <returns>JSON object expected to be returned by OData.read (plus type metadata markers that will need to be removed)</returns>
- [OperationContract]
- [WebGet(ResponseFormat = WebMessageFormat.Json)]
- public JsonObject ReadServiceDocument(string url, string mimeType)
- {
- WebResponse response = WebRequest.Create(ResolveUri(url, UriKind.Absolute)).GetResponse();
- string baseUri = string.Empty;
-
- // With JSON responses only relative path passed to the library is available
- if (mimeType.Equals(jsonlightMediaType))
- {
- baseUri = ResolveUri(url, UriKind.Relative).ToString();
- }
- else
- {
- baseUri = response.ResponseUri.AbsoluteUri;
- }
-
- return AtomReader.ReadServiceDocument(new StreamReader(response.GetResponseStream()), baseUri);
- }
-
- /// <summary>
- /// Reads a URI that will get the Json response and return the stream
- /// </summary>
- /// <param name="url">URL of the entry</param>
- /// <param name="user">The username for basic authentication</param>
- /// <param name="password">The password for basic authentication</param>
- /// <returns>Stream of the Json response expected to be returned by OData.read</returns>
- [OperationContract]
- [WebGet(ResponseFormat = WebMessageFormat.Json)]
- public Stream ReadJson(string url, string mimeType, string user, string password)
- {
- if (mimeType == null)
- {
- mimeType = jsonlightMediaType + ";odata.metadata=minimal;odata.streaming=true;IEEE754Compatible=false;charset=utf-8";
- }
-
- HttpWebRequest request = (HttpWebRequest)ReaderUtils.CreateRequest(ResolveUri(url, UriKind.Absolute), user, password);
- request.Accept = mimeType;
- WebResponse response = request.GetResponse();
-
- return response.GetResponseStream();
- }
-
-
- /// <summary>
- /// Loops back an ATOM feed passed to the webservice in JSON format.
- /// </summary>
- /// <param name="content">The ATOM feed xml stream to loopback as JSON</param>
- /// <returns>JSON object expected to be returned by OData.read (plus type metadata markers that will need to be removed)</returns>
- [OperationContract]
- [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json)]
- public JsonObject ReadFeedLoopback(Stream content)
- {
- return AtomReader.ReadFeed(new StreamReader(content));
- }
-
- /// <summary>
- /// Loops back an ATOM entry passed to the webservice in JSON format.
- /// </summary>
- /// <param name="content">The ATOM entry xml stream to loopback as JSON</param>
- /// <returns>JSON object expected to be returned by OData.read (plus type metadata markers that will need to be removed)</returns>
- [OperationContract]
- [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json)]
- public JsonObject ReadEntryLoopback(Stream content)
- {
- return AtomReader.ReadEntry(new StreamReader(content));
- }
-
- /// <summary>
- /// Resolves the given url string to a URI
- /// </summary>
- /// <param name="url">The given URL string</param>
- /// <param name="urlKind">URI kind to resolve to</param>
- /// <returns>The resolved URI</returns>
- private static string ResolveUri(string url, UriKind uriKind)
- {
- Uri resolvedUri = new Uri(url, UriKind.RelativeOrAbsolute);
- if (!resolvedUri.IsAbsoluteUri)
- {
- // If the given URI is relative, then base it on the Referer URI
- Uri baseUri = new Uri(WebOperationContext.Current.IncomingRequest.Headers["Referer"]);
- resolvedUri = new Uri(baseUri, resolvedUri);
- if (uriKind == UriKind.Relative)
- {
- resolvedUri = baseUri.MakeRelativeUri(resolvedUri);
- }
- }
-
- return resolvedUri.ToString();
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/common/ObservableHttpClient.js
----------------------------------------------------------------------
diff --git a/JSLib/tests/common/ObservableHttpClient.js b/JSLib/tests/common/ObservableHttpClient.js
deleted file mode 100644
index 2b7fe98..0000000
--- a/JSLib/tests/common/ObservableHttpClient.js
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
-// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// ObservableHttpClient.js
-// This object extends OData's default httpClient by supporting request and response recording sessions, and firing a custom
-// JQuery event for each request/response.
-//
-// The events fired by this object are:
-// request: Before a request is made
-// success: Before the primary success handler is called
-//
-// To bind to an event, JQuery event attachers can be used on the object, e.g.
-// $(observableHttpClient).bind("request", function (request) { ... });
-//
-// To begin a new recording session, use:
-// var session = observableHttpClient.newSession();
-//
-// Requests and responses are then recorded in session.requests and session.responses. Session can be ended by session.end().
-// Multiple simultaneous sessions are supported.
-
-(function (window, undefined) {
-
- var ObservableHttpClient = function (provider) {
- this.provider = provider ? provider : OData.defaultHttpClient;
- };
-
- ObservableHttpClient.prototype.newSession = function () {
- return new Session(this);
- };
-
- ObservableHttpClient.prototype.request = function (request, success, error) {
- var that = this;
-
- $(this).triggerHandler("request", request);
- return this.provider.request(request, function (response) {
- $(that).triggerHandler("success", response);
- success(response);
- }, error);
- };
-
-
- var Session = function (client) {
- var that = this;
-
- this.client = client;
- this.clear();
-
- this.requestHandler = function (event, request) { that.requests.push(request); };
- $(client).bind("request", this.requestHandler);
-
- this.successHandler = function (event, response) { that.responses.push(response); };
- $(client).bind("success", this.successHandler);
- };
-
- Session.prototype.clear = function () {
- this.requests = [];
- this.responses = [];
- }
-
- Session.prototype.end = function () {
- $(this.client).unbind("request", this.requestHandler);
- $(this.client).unbind("success", this.successHandler);
- };
-
- window.ObservableHttpClient = ObservableHttpClient;
- window.Session = Session;
-
-})(this);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/common/TestLogger.svc
----------------------------------------------------------------------
diff --git a/JSLib/tests/common/TestLogger.svc b/JSLib/tests/common/TestLogger.svc
deleted file mode 100644
index d236b24..0000000
--- a/JSLib/tests/common/TestLogger.svc
+++ /dev/null
@@ -1,846 +0,0 @@
-<%@ ServiceHost Language="C#" Debug="true" Factory="DataJS.Tests.TestSynchronizerFactory" Service="DataJS.Tests.TestSynchronizer" %>
-
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
-// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-namespace DataJS.Tests
-{
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Net;
- using System.ServiceModel;
- using System.ServiceModel.Activation;
- using System.ServiceModel.Channels;
- using System.ServiceModel.Description;
- using System.ServiceModel.Dispatcher;
- using System.ServiceModel.Web;
- using System.Text;
- using System.Threading;
- using System.Xml;
-
- /// <summary>
- /// This factory supports reconfiguring the service to allow incoming messages
- /// to be larger than the default.
- /// </summary>
- public class TestSynchronizerFactory : WebScriptServiceHostFactory
- {
- protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
- {
- var result = base.CreateServiceHost(serviceType, baseAddresses);
- result.Opening += ServiceHostOpening;
- return result;
- }
-
- private static void UpdateService(ServiceDescription description)
- {
- const long LargeMaxReceivedMessageSize = 1024 * 1024 * 16;
- foreach (var endpoint in description.Endpoints)
- {
- var basic = endpoint.Binding as BasicHttpBinding;
- if (basic != null)
- {
- basic.MaxReceivedMessageSize = LargeMaxReceivedMessageSize;
- }
-
- var http = endpoint.Binding as WebHttpBinding;
- if (http != null)
- {
- http.MaxReceivedMessageSize = LargeMaxReceivedMessageSize;
- }
- }
- }
-
- private void ServiceHostOpening(object sender, EventArgs e)
- {
- UpdateService((sender as ServiceHost).Description);
- }
- }
-
- /// <summary>Use this class to log test activity.</summary>
- /// <remarks>
- /// A test run can be created by invoking CreateTestRun. With a test
- /// run ID, the following operations can be invoked:
- ///
- /// - AddTestPages: adds test pages to be made available to future callers (typically to support tests from different files)
- /// - SetTestNamePrefix: sets a string that will be prefixed to every test name in logs (typically to include a browser name)
- /// - MarkInProgress: resets the test run to "in-progress" for another variation (typically to run a different browser)
- /// - IsTestRunInProgress: checks whether it's still in progress
- /// - GetTestRunResults: returns the test results in TRX format
- /// - LogAssert: logs a single assertion in the current test for the run
- /// - LogTestStart: logs a test that has begun execution
- /// - LogTestDone: logs a test that has ended execution
- /// - TestCompleted: logs that a test has completed execution; returns the next page with tests or an empty string
- /// </remarks>
- [ServiceContract]
- [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
- [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
- public class TestSynchronizer
- {
- private static readonly Dictionary<string, TestRunContext> testRuns = new Dictionary<string, TestRunContext>();
- private const string Inconclusive = "Inconclusive";
- private const string InProgress = "InProgress";
- private const string Failed = "Failed";
- private const string Passed = "Passed";
- private const string Completed = "Completed";
-
- /// <summary>
- /// Adds test pages to the specified runs; replaces existing files (helps with reliablity when something
- /// fails part-way).
- /// </summary>
- /// <remarks>This method is typically called by the test harness.</remarks>
- [OperationContract]
- [WebGet(ResponseFormat = WebMessageFormat.Json)]
- public int AddTestPages(string testRunId, string pages, string filter)
- {
- DisableResponseCaching();
-
- TestRunContext context = GetTestRunContext(testRunId);
- lock (context)
- {
- context.TestPages.Clear();
- context.TestPages.AddRange(pages.Split(',').Select(page => page + "?testRunId=" + testRunId + (filter == null ? string.Empty : "?filter=" + filter)));
- return context.TestPages.Count;
- }
- }
-
- /// <remarks>This method is typically called by the test harness.</remarks>
- [OperationContract]
- [WebGet(ResponseFormat = WebMessageFormat.Json)]
- public string CreateTestRun()
- {
- DisableResponseCaching();
-
- Guid value = Guid.NewGuid();
- string result = value.ToString();
- TestRunContext context = CreateTestRunContextWithId(value);
-
- lock (testRuns)
- {
- testRuns.Add(result, context);
- }
-
- return result;
- }
-
- /// <summary>Checks whether the test run is in progress.</summary>
- /// <remarks>This method is typically called by the test harness.</remarks>
- [OperationContract]
- [WebGet(ResponseFormat = WebMessageFormat.Json)]
- public bool IsTestRunInProgress(string testRunId)
- {
- DisableResponseCaching();
-
- TestRunContext context = GetTestRunContext(testRunId);
- return context.TestRun.ResultSummary.Outcome == InProgress;
- }
-
- /// <summary>Provides a list of all test runs being tracked.</summary>
- [OperationContract]
- [WebGet(ResponseFormat=WebMessageFormat.Json)]
- public IEnumerable<string> GetActiveTestRuns()
- {
- DisableResponseCaching();
-
- List<string> result;
- lock (testRuns)
- {
- result = new List<string>(testRuns.Keys);
- }
-
- return result;
- }
-
- /// <remarks>This method is typically called by the test harness.</remarks>
- [OperationContract]
- [WebGet(ResponseFormat = WebMessageFormat.Xml)]
- public Message GetTestRunResults(string testRunId)
- {
- DisableResponseCaching();
-
- TestRunContext context = GetTestRunContext(testRunId);
- lock (context)
- {
- TestRun run = context.TestRun;
- this.CompleteTestRun(run);
-
- TestRunXmlBodyWriter writer = new TestRunXmlBodyWriter(run);
- return Message.CreateMessage(
- MessageVersion.None,
- OperationContext.Current.OutgoingMessageHeaders.Action,
- writer);
- }
- }
-
- /// <remarks>This method is typically called by the test case.</remarks>
- [OperationContract]
- [WebGet(ResponseFormat = WebMessageFormat.Json)]
- public void LogAssert(string testRunId, bool pass, string message, string name, string actual, string expected)
- {
- DisableResponseCaching();
-
- TestRunContext context = GetTestRunContext(testRunId);
- lock (context)
- {
- TestRun run = context.TestRun;
- string prefixedName = context.TestNamePrefix + name;
- TestResult result = run.TestResults.LastOrDefault(r => r.TestName == prefixedName);
- if (result == null)
- {
- throw new InvalidOperationException("Unable to find test " + prefixedName + " in run " + testRunId);
- }
-
- result.DebugTrace.AppendLine(message);
- if (!pass)
- {
- result.ErrorMessages.AppendLine(message);
- result.ErrorMessages.AppendLine("Expected: " + expected);
- result.ErrorMessages.AppendLine("Actual: " + actual);
- }
- }
- }
-
- /// <remarks>This method is typically called by the test case.</remarks>
- [OperationContract]
- [WebInvoke(ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
- public void LogBatch(string[] urls)
- {
- DisableResponseCaching();
-
- foreach (var url in urls)
- {
- Uri parsed = new Uri(OperationContext.Current.Channel.LocalAddress.Uri, url);
- string methodName = parsed.Segments[parsed.Segments.Length - 1];
- System.Reflection.MethodInfo method = this.GetType().GetMethod(methodName);
- System.Reflection.ParameterInfo[] parameterInfos = method.GetParameters();
- object[] parameters = new object[parameterInfos.Length];
- System.Collections.Specialized.NameValueCollection query = System.Web.HttpUtility.ParseQueryString(parsed.Query);
- for (int i = 0; i < parameters.Length; i++)
- {
- object value = query[parameterInfos[i].Name];
- parameters[i] = Convert.ChangeType(value, parameterInfos[i].ParameterType, System.Globalization.CultureInfo.InvariantCulture);
- }
-
- method.Invoke(this, parameters);
- }
- }
-
- /// <remarks>This method is typically called by the test case.</remarks>
- [OperationContract]
- [WebGet(ResponseFormat = WebMessageFormat.Json)]
- public void LogTestStart(string testRunId, string name, DateTime startTime)
- {
- DisableResponseCaching();
-
- TestRunContext context = GetTestRunContext(testRunId);
- lock (context)
- {
- TestRun run = context.TestRun;
- string prefixedName = context.TestNamePrefix + name;
- Guid testId = Guid.NewGuid();
- Guid executionId = Guid.NewGuid();
- Guid testListId = run.TestLists.Single().Id;
- run.TestDefinitions.Add(new TestDefinition()
- {
- Id = testId,
- Name = prefixedName,
- ExecutionId = executionId,
- });
- run.TestEntries.Add(new TestEntry()
- {
- TestId = testId,
- ExecutionId = executionId,
- TestListId = testListId
- });
- run.TestResults.Add(new TestResult()
- {
- ExecutionId = executionId,
- TestId = testId,
- TestListId = testListId,
- TestName = prefixedName,
- ComputerName = Environment.MachineName,
- StartTime = startTime,
- EndTime = startTime,
- TestType = Guid.Parse("13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b"),
- Outcome = InProgress,
- // RelativeResultsDirectory?
- });
- }
- }
-
- /// <remarks>This method is typically called by the test case.</remarks>
- [OperationContract]
- [WebGet(ResponseFormat = WebMessageFormat.Json)]
- public void LogTestDone(string testRunId, string name, int failures, int total, DateTime endTime)
- {
- DisableResponseCaching();
-
- TestRunContext context = GetTestRunContext(testRunId);
- lock (context)
- {
- TestRun run = context.TestRun;
- string prefixedName = context.TestNamePrefix + name;
- TestResult result = run.TestResults.LastOrDefault(r => r.TestName == prefixedName);
- if (failures > 0)
- {
- result.Outcome = Failed;
- }
- else
- {
- result.Outcome = Passed;
- }
-
- result.EndTime = endTime;
- }
- }
-
- [OperationContract]
- [WebGet(ResponseFormat = WebMessageFormat.Json)]
- public void MarkInProgress(string testRunId)
- {
- DisableResponseCaching();
-
- TestRunContext context = GetTestRunContext(testRunId);
- lock (context)
- {
- context.TestRun.ResultSummary.Outcome = InProgress;
- }
- }
-
- /// <remarks>This method is typically called by the test harness.</remarks>
- [OperationContract]
- [WebGet(ResponseFormat = WebMessageFormat.Json)]
- public void SetTestNamePrefix(string testRunId, string prefix)
- {
- DisableResponseCaching();
-
- TestRunContext context = GetTestRunContext(testRunId);
- lock (context)
- {
- context.TestNamePrefix = prefix;
- }
- }
-
- /// <remarks>This method is typically called by the test case.</remarks>
- [OperationContract]
- [WebGet(ResponseFormat = WebMessageFormat.Json)]
- public string TestCompleted(string testRunId, int failures, int total)
- {
- DisableResponseCaching();
-
- var context = GetTestRunContext(testRunId);
- lock (context)
- {
- string result;
- if (context.TestPages.Count == 0)
- {
- context.TestRun.ResultSummary.Outcome = Completed;
- result = "";
- }
- else
- {
- result = context.TestPages[0];
- context.TestPages.RemoveAt(0);
- }
-
- return result;
- }
- }
-
- private static TestRunContext CreateTestRunContextWithId(Guid value)
- {
- TestRun run = new TestRun();
- run.Id = value;
- run.Name = "Test run";
- run.TestTimes.Creation = DateTime.Now;
- run.TestTimes.Queueing = DateTime.Now;
- run.TestLists.Add(new TestList()
- {
- Name = "All Results",
- Id = Guid.NewGuid()
- });
-
- // For the time being, set up a fake test settings.
- run.TestSettings.Id = Guid.NewGuid();
-
- run.ResultSummary.Outcome = InProgress;
-
- TestRunContext context = new TestRunContext();
- context.TestRun = run;
-
- return context;
- }
-
- private static void DisableResponseCaching()
- {
- WebOperationContext.Current.OutgoingResponse.Headers[HttpResponseHeader.CacheControl] = "no-cache";
- }
-
- private static TestRunContext GetTestRunContext(string testRunId)
- {
- if (testRunId == null)
- {
- throw new ArgumentNullException("testRunId");
- }
-
- lock (testRuns)
- {
- // For an 0-filled GUID, allow create-on-demand to simplify ad-hoc testing.
- // Something like:
- // http://localhost:8989/tests/odata-qunit-tests.htm?testRunId=00000000-0000-0000-0000-000000000000
- if (!testRuns.ContainsKey(testRunId))
- {
- Guid value = Guid.Parse(testRunId);
- if (value == Guid.Empty)
- {
- TestRunContext context = CreateTestRunContextWithId(value);
- testRuns.Add(testRunId, context);
- }
- }
-
- return testRuns[testRunId];
- }
- }
-
- private void CompleteTestRun(TestRun run)
- {
- run.TestTimes.Finish = DateTime.Now;
-
- // Fill counts in result object.
- var summary = run.ResultSummary;
- summary.Executed = 0;
- summary.Error = 0;
- summary.Failed = 0;
- summary.Timeout = 0;
- summary.Aborted = 0;
- summary.Inconclusive = 0;
- summary.PassedButRunAborted = 0;
- summary.NotRunnable = 0;
- summary.NotExecuted = 0;
- summary.Disconnected = 0;
- summary.Warning = 0;
- summary.Passed = 0;
- summary.Completed = 0;
- summary.InProgress = 0;
- summary.Pending = 0;
-
- foreach (var testResult in run.TestResults)
- {
- string outcome = testResult.Outcome;
- switch (outcome)
- {
- case InProgress:
- summary.Executed++;
- summary.InProgress++;
- break;
- case Failed:
- summary.Executed++;
- summary.Completed++;
- summary.Failed++;
- break;
- case Passed:
- summary.Executed++;
- summary.Completed++;
- summary.Passed++;
- break;
- default:
- summary.Failed++;
- break;
- }
- }
-
- summary.Total = run.TestResults.Count;
-
- if (summary.Failed != 0)
- {
- summary.Outcome = Failed;
- }
- else if (summary.Total <= 0 || summary.Passed < summary.Total)
- {
- summary.Outcome = Inconclusive;
- }
- else
- {
- summary.Outcome = Passed;
- }
- }
- }
-
- public class TestRunContext
- {
- public TestRunContext()
- {
- this.TestPages = new List<string>();
- }
-
- public TestRun TestRun { get; set; }
- public string TestNamePrefix { get; set; }
- public List<string> TestPages { get; set; }
- }
-
- public class TestResultWriter
- {
- private const string TestNamespace = "http://microsoft.com/schemas/VisualStudio/TeamTest/2010";
-
- public static void WriteTestRun(TestRun run, string path)
- {
- if (run == null)
- {
- throw new ArgumentNullException("run");
- }
- if (path == null)
- {
- throw new ArgumentNullException("path");
- }
-
- using (XmlWriter writer = XmlWriter.Create(path))
- {
- WriteTestRun(run, path);
- }
- }
-
- public static void WriteTestRun(TestRun run, XmlWriter writer)
- {
- if (run == null)
- {
- throw new ArgumentNullException("run");
- }
- if (writer == null)
- {
- throw new ArgumentNullException("writer");
- }
-
- writer.WriteStartElement("TestRun", TestNamespace);
- writer.WriteGuidIfPresent("id", run.Id);
- writer.WriteAttributeString("name", run.Name);
- writer.WriteAttributeString("runUser", run.RunUser);
-
- WriteTestSettings(run.TestSettings, writer);
- WriteResultSummary(run.ResultSummary, writer);
-
- // Write test definitions.
- writer.WriteStartElement("TestDefinitions", TestNamespace);
- foreach (var definition in run.TestDefinitions)
- {
- WriteTestDefinition(definition, writer);
- }
-
- writer.WriteEndElement();
-
- // Write test lists.
- writer.WriteStartElement("TestLists", TestNamespace);
- foreach (var list in run.TestLists)
- {
- WriteTestList(list, writer);
- }
-
- writer.WriteEndElement();
-
- // Write test entries.
- writer.WriteStartElement("TestEntries", TestNamespace);
- foreach (var entry in run.TestEntries)
- {
- WriteTestEntry(entry, writer);
- }
-
- writer.WriteEndElement();
-
- // Write test results.
- writer.WriteStartElement("Results", TestNamespace);
- foreach (var result in run.TestResults)
- {
- WriteTestResults(result, writer);
- }
-
- writer.WriteEndElement();
-
- // Close the test run element.
- writer.WriteEndElement();
- }
-
- private static void WriteTestResults(TestResult result, XmlWriter writer)
- {
- if (result == null)
- {
- throw new ArgumentNullException("result");
- }
-
- writer.WriteStartElement("UnitTestResult", TestNamespace);
- writer.WriteGuidIfPresent("testId", result.TestId);
- writer.WriteGuidIfPresent("testListId", result.TestListId);
- writer.WriteGuidIfPresent("executionId", result.ExecutionId);
- writer.WriteGuidIfPresent("RelativeResultsDirectory", result.RelativeResultsDirectory);
-
- writer.WriteAttributeString("testName", result.TestName);
- writer.WriteAttributeString("computerName", result.ComputerName);
- writer.WriteAttributeString("duration", result.Duration.ToString());
- writer.WriteAttributeString("startTime", XmlConvert.ToString(result.StartTime));
- writer.WriteAttributeString("endTime", XmlConvert.ToString(result.EndTime));
- writer.WriteAttributeString("outcome", result.Outcome);
-
- writer.WriteGuidIfPresent("testType", result.TestType);
-
- if (result.DebugTrace.Length > 0)
- {
- writer.WriteStartElement("Output");
-
- writer.WriteStartElement("DebugTrace");
- writer.WriteString(result.DebugTrace.ToString());
- writer.WriteEndElement();
-
- writer.WriteStartElement("ErrorInfo");
- writer.WriteStartElement("Message");
- writer.WriteString(result.ErrorMessages.ToString());
- writer.WriteEndElement();
- writer.WriteEndElement();
-
- writer.WriteEndElement();
- }
-
- writer.WriteEndElement();
- }
-
- private static void WriteTestEntry(TestEntry entry, XmlWriter writer)
- {
- if (entry == null)
- {
- throw new ArgumentNullException("entry");
- }
-
- writer.WriteStartElement("TestEntry", TestNamespace);
- writer.WriteGuidIfPresent("testId", entry.TestId);
- writer.WriteGuidIfPresent("testListId", entry.TestListId);
- writer.WriteGuidIfPresent("executionId", entry.ExecutionId);
- writer.WriteEndElement();
- }
-
- private static void WriteTestList(TestList list, XmlWriter writer)
- {
- if (list == null)
- {
- throw new ArgumentNullException("list");
- }
-
- writer.WriteStartElement("TestList", TestNamespace);
- writer.WriteAttributeString("name", list.Name);
- writer.WriteGuidIfPresent("id", list.Id);
- writer.WriteEndElement();
- }
-
- private static void WriteTestDefinition(TestDefinition definition, XmlWriter writer)
- {
- if (definition == null)
- {
- throw new ArgumentNullException("definition");
- }
-
- writer.WriteStartElement("UnitTest", TestNamespace);
- writer.WriteAttributeString("name", definition.Name);
- writer.WriteAttributeString("storage", definition.Storage);
- writer.WriteGuidIfPresent("id", definition.Id);
-
- // There are more thing we could write here: DeploymentItems, Execution, TestMethod
-
- // This is the minimum needed to load the test in the IDE.
- writer.WriteStartElement("Execution", TestNamespace);
- writer.WriteGuidIfPresent("id", definition.ExecutionId);
- writer.WriteEndElement();
-
- writer.WriteStartElement("TestMethod", TestNamespace);
- writer.WriteAttributeString("codeBase", "fake-test-file.js");
- writer.WriteAttributeString("adapterTypeName", "Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestAdapter, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.Adapter, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
- writer.WriteAttributeString("className", "FakeClassName, TestLogging, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
- writer.WriteAttributeString("name", definition.Name);
- writer.WriteEndElement();
-
- writer.WriteEndElement();
- }
-
- private static void WriteResultSummary(ResultSummary resultSummary, XmlWriter writer)
- {
- if (resultSummary == null)
- {
- throw new ArgumentNullException("resultSummary");
- }
-
- writer.WriteStartElement("ResultSummary", TestNamespace);
- writer.WriteAttributeString("outcome", resultSummary.Outcome);
-
- writer.WriteStartElement("Counters", TestNamespace);
-
- foreach (var p in typeof(ResultSummary).GetProperties())
- {
- if (p.PropertyType != typeof(int))
- {
- continue;
- }
-
- int value = (int)p.GetValue(resultSummary, null);
- string attributeName = p.Name;
- attributeName = attributeName.Substring(0, 1).ToLowerInvariant() + attributeName.Substring(1);
- writer.WriteAttributeString(attributeName, value.ToString());
- }
-
- writer.WriteEndElement();
- writer.WriteEndElement();
- }
-
- private static void WriteTestSettings(TestSettings testSettings, XmlWriter writer)
- {
- if (testSettings == null)
- {
- throw new ArgumentNullException("testSettings");
- }
-
- writer.WriteStartElement("TestSettings", TestNamespace);
- writer.WriteAttributeString("name", testSettings.Name);
- writer.WriteGuidIfPresent("id", testSettings.Id);
- // There are more things we could write here.
- writer.WriteEndElement();
- }
- }
-
- public static class XmlWriterExtensions
- {
- public static void WriteGuidIfPresent(this XmlWriter writer, string attributeName, Guid value)
- {
- if (value != Guid.Empty)
- {
- writer.WriteAttributeString(attributeName, value.ToString());
- }
- }
- }
-
- public class TestRun
- {
- public TestRun()
- {
- this.TestDefinitions = new List<TestDefinition>();
- this.TestLists = new List<TestList>();
- this.TestEntries = new List<TestEntry>();
- this.TestResults = new List<TestResult>();
- this.ResultSummary = new ResultSummary();
- this.TestTimes = new TestTimes();
- this.TestSettings = new TestSettings();
-
- this.Id = Guid.NewGuid();
- this.RunUser = Environment.UserDomainName + "\\" + Environment.UserName;
- }
-
- public Guid Id { get; set; }
- public string Name { get; set; }
- public string RunUser { get; set; }
- public TestSettings TestSettings { get; set; }
- public TestTimes TestTimes { get; set; }
- public ResultSummary ResultSummary { get; set; }
- public List<TestDefinition> TestDefinitions { get; set; }
- public List<TestList> TestLists { get; set; }
- public List<TestEntry> TestEntries { get; set; }
- public List<TestResult> TestResults { get; set; }
- }
-
- public class TestSettings
- {
- public Guid Id { get; set; }
- public string Name { get; set; }
- }
-
- public class TestTimes
- {
- public DateTime Creation { get; set; }
- public DateTime Queueing { get; set; }
- public DateTime Start { get; set; }
- public DateTime Finish { get; set; }
- }
-
- public class ResultSummary
- {
- public string Outcome { get; set; }
- public int Total { get; set; }
- public int Executed { get; set; }
- public int Error { get; set; }
- public int Failed { get; set; }
- public int Timeout { get; set; }
- public int Aborted { get; set; }
- public int Inconclusive { get; set; }
- public int PassedButRunAborted { get; set; }
- public int NotRunnable { get; set; }
- public int NotExecuted { get; set; }
- public int Disconnected { get; set; }
- public int Warning { get; set; }
- public int Passed { get; set; }
- public int Completed { get; set; }
- public int InProgress { get; set; }
- public int Pending { get; set; }
- }
-
- public class TestDefinition
- {
- public string Name { get; set; }
- public string Storage { get; set; }
- public Guid Id { get; set; }
- public Guid ExecutionId { get; set; }
- }
-
- public class TestList
- {
- public string Name { get; set; }
- public Guid Id { get; set; }
- }
-
- public class TestEntry
- {
- public Guid TestId { get; set; }
- public Guid ExecutionId { get; set; }
- public Guid TestListId { get; set; }
- }
-
- public class TestResult
- {
- public TestResult()
- {
- this.DebugTrace = new StringBuilder();
- this.ErrorMessages = new StringBuilder();
- }
-
- public Guid ExecutionId { get; set; }
- public Guid TestId { get; set; }
- public string TestName { get; set; }
- public string ComputerName { get; set; }
- public TimeSpan Duration { get { return this.EndTime - this.StartTime; } }
- public DateTime StartTime { get; set; }
- public DateTime EndTime { get; set; }
- public Guid TestType { get; set; }
- public string Outcome { get; set; }
- public Guid TestListId { get; set; }
- public Guid RelativeResultsDirectory { get; set; }
- public StringBuilder DebugTrace { get; set; }
- public StringBuilder ErrorMessages { get; set; }
- }
-
- class TestRunXmlBodyWriter : BodyWriter
- {
- private readonly TestRun run;
-
- public TestRunXmlBodyWriter(TestRun run)
- : base(true)
- {
- this.run = run;
- }
-
- protected override void OnWriteBodyContents(XmlDictionaryWriter writer)
- {
- TestResultWriter.WriteTestRun(this.run, writer);
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/common/TestSynchronizerClient.js
----------------------------------------------------------------------
diff --git a/JSLib/tests/common/TestSynchronizerClient.js b/JSLib/tests/common/TestSynchronizerClient.js
deleted file mode 100644
index c758413..0000000
--- a/JSLib/tests/common/TestSynchronizerClient.js
+++ /dev/null
@@ -1,218 +0,0 @@
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
-// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// TestSynchronizer Client
-// Use to log assert pass/fails and notify mstest a test has completed execution
-
-(function (window, undefined) {
- var testRunId = "";
- var serviceRoot = "./common/TestLogger.svc/";
- var recording = null;
- var recordingLength = 0;
- var maxStringLength = 8192;
- var maxPostLength = 2097152;
-
- var callTestSynchronizer = function (methodName, parameterUrl) {
- /// <summary>Invokes a function on the test synchronizer.</summary>
- /// <param name="partialUrl" type="String" optional="true">URL to work with.</param>
- /// <returns type="String">A response from the server, possibly null.</returns>
- /// <remarks>
- /// If the recording variable is assigned, then the call is logged
- /// but nothing is invoked.
- /// </remarks>
-
- var partialUrl;
- if (testRunId) {
- partialUrl = methodName + "?testRunId=" + testRunId + "&" + parameterUrl;
- }
- else {
- partialUrl = methodName + "?" + parameterUrl;
- }
-
- var url = serviceRoot + partialUrl;
-
- if (recording) {
- if (url.length > maxStringLength) {
- url = url.substr(0, maxStringLength);
- }
-
- recordingLength += url.length;
- if (recordingLength > maxPostLength) {
- submitRecording();
- recording = [];
- recordingLength = url.length;
- }
-
- recording.push(url);
- return null;
- }
-
- var xhr;
- if (window.XMLHttpRequest) {
- xhr = new window.XMLHttpRequest();
- } else {
- xhr = new ActiveXObject("Msxml2.XMLHTTP.6.0");
- }
-
- xhr.open("GET", url, false);
- xhr.send();
- return xhr.responseText;
- };
-
- var getLogPrefix = function (result) {
- /// <summary>Returns the log prefix for a given result</summary>
- /// <param name="result" type="Boolean">Whether the result is pass or fail. If null, the log line is assumed to be diagnostic</param>
- return "[" + getShortDate() + "] " + (result === true ? "[PASS] " : (result === false ? "[FAIL] " : ""));
- };
-
- var getShortDate = function () {
- /// <summary>Returns the current date and time formatted as "yyyy-mm-dd hh:mm:ss.nnn".</summary>
- var padToLength = function (number, length) {
- var result = number + "";
- var lengthDiff = length - result.length;
- for (var i = 0; i < lengthDiff; i++) {
- result = "0" + result;
- }
-
- return result;
- }
-
- var date = new Date();
- var day = padToLength(date.getDate(), 2);
- var month = padToLength(date.getMonth() + 1, 2);
- var year = date.getFullYear();
-
- var hours = padToLength(date.getHours(), 2);
- var minutes = padToLength(date.getMinutes(), 2);
- var seconds = padToLength(date.getSeconds(), 2);
- var milliseconds = padToLength(date.getMilliseconds(), 3);
-
- return year + "-" + month + "-" + day + " " + hours + ":" + minutes + ":" + seconds + "." + milliseconds;
- };
-
- var submitRecording = function () {
- var body = { urls: recording };
- postToUrl("LogBatch", body);
- };
-
- var postToUrl = function (methodName, body) {
- /// <summary>POSTs body to the designated methodName.</summary>
- var xhr;
- if (window.XMLHttpRequest) {
- xhr = new window.XMLHttpRequest();
- } else {
- xhr = new ActiveXObject("Msxml2.XMLHTTP.6.0");
- }
-
- var url = serviceRoot + methodName;
- xhr.open("POST", url, false);
- xhr.setRequestHeader("Content-Type", "application/json");
- xhr.send(window.JSON.stringify(body));
- if (xhr.status < 200 || xhr.status > 299) {
- throw { message: "Unable to POST to url.\r\n" + xhr.responseText };
- }
-
- return xhr.responseText;
- }
-
- function LogAssert(result, message, name, expected, actual) {
- var parameterUrl = "pass=" + result + "&message=" + encodeURIComponent(message) + "&name=" + encodeURIComponent(name);
-
- if (!result) {
- parameterUrl += "&actual=" + encodeURIComponent(actual) + "&expected=" + encodeURIComponent(expected);
- }
-
- callTestSynchronizer("LogAssert", parameterUrl);
- }
-
- function LogTestStart(name) {
- callTestSynchronizer("LogTestStart", "name=" + encodeURIComponent(name) + "&startTime=" + encodeURIComponent(getShortDate()));
- }
-
- function LogTestDone(name, failures, total) {
- callTestSynchronizer("LogTestDone", "name=" + encodeURIComponent(name) + "&failures=" + failures + "&total=" + total + "&endTime=" + encodeURIComponent(getShortDate()));
- }
-
- function TestCompleted(failures, total) {
- return callTestSynchronizer("TestCompleted", "failures=" + failures + "&total=" + total);
- }
-
- var extractTestRunId = function () {
- /// <summary>Extracts the testRunId value from the window query string.</summary>
- /// <returns type="String">testRunId, possibly empty.</returns>
- var i, len;
- var uri = window.location.search;
- if (uri) {
- var parameters = uri.split("&");
- for (i = 0, len = parameters.length; i < len; i++) {
- var index = parameters[i].indexOf("testRunId=");
- if (index >= 0) {
- return parameters[i].substring(index + "testRunId=".length);
- }
- }
- }
-
- return "";
- };
-
- var init = function (qunit) {
- /// <summary>Initializes the test logger synchronizer.</summary>
- /// <param name="qunit">Unit testing to hook into.</param>
- /// <remarks>If there is no testRunId present, the QUnit functions are left as they are.</remarks>
- var logToConsole = function (context) {
- if (window.console && window.console.log) {
- window.console.log(context.result + ' :: ' + context.message);
- }
- };
-
- testRunId = extractTestRunId();
- if (!testRunId) {
- qunit.log = logToConsole;
- } else {
- recording = [];
- qunit.log = function (context) {
- logToConsole(context);
-
- var name = qunit.config.current.testName;
- if (!(context.actual && context.expected)) {
- context.actual = context.result;
- context.expected = true;
- }
- LogAssert(context.result, getLogPrefix(context.result) + context.message, name, window.JSON.stringify(context.expected), window.JSON.stringify(context.actual));
- };
-
- qunit.testStart = function (context) {
- LogTestStart(context.name);
- };
-
- qunit.testDone = function (context) {
- LogTestDone(context.name, context.failed, context.total);
- }
-
- qunit.done = function (context) {
- submitRecording();
- recording = null;
-
- var nextUrl = TestCompleted(context.failed, context.total);
- nextUrl = JSON.parse(nextUrl).d;
- if (nextUrl) {
- window.location.href = nextUrl;
- }
- }
- }
- };
-
- window.TestSynchronizer = {
- init: init
- };
-})(window);
\ No newline at end of file
[09/22] olingo-odata4-js git commit: [OLINGO-442] Cleanup bevor
release
Posted by ko...@apache.org.
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/odata-atom-tests.js
----------------------------------------------------------------------
diff --git a/JSLib/tests/odata-atom-tests.js b/JSLib/tests/odata-atom-tests.js
deleted file mode 100644
index da3f38e..0000000
--- a/JSLib/tests/odata-atom-tests.js
+++ /dev/null
@@ -1,4745 +0,0 @@
-/// <reference path="../src/odata-utils.js" />
-/// <reference path="../src/odata-handler.js" />
-/// <reference path="../src/odata-atom.js" />
-/// <reference path="../src/odata-xml.js" />
-/// <reference path="common/djstest.js" />
-
-// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
-// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// odata-atom-tests.js
-
-(function (window, undefined) {
-
- module("Unit");
-
- var parseMetadataHelper = function (text) {
- var response = { statusCode: 200, body: text, headers: { "Content-Type": "application/xml"} };
- OData.metadataHandler.read(response, {});
- return response.data;
- };
-
- var resetFoodData = function () {
- $.ajax({ url: "./endpoints/FoodStoreDataServiceV4.svc/ResetData", async: false, type: "POST" });
- };
-
- var customerSampleMetadataText = '' +
- '<edmx:Edmx Version="1.0" xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx">\r\n' +
- '<edmx:DataServices xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" m:DataServiceVersion="2.0">\r\n' +
- '<Schema Namespace="Ns" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns="http://schemas.microsoft.com/ado/2006/04/edm">\r\n' +
- ' <EntityType Name="Customer">\r\n' +
- ' <Key><PropertyRef Name="ID" /></Key>\r\n' +
- ' <Property Name="ID" Type="Edm.Int32" Nullable="false" />\r\n' +
- ' <Property Name="Name" Type="Edm.String" Nullable="true" m:FC_TargetPath="SyndicationSummary" m:FC_ContentKind="xhtml" m:FC_KeepInContent="false" />\r\n' +
- ' <Property Name="LastName" Type="Edm.String" Nullable="true" m:FC_TargetPath="foo/bar/@baz" m:FC_NsUri="htp://prefix" m:FC_NsPrefix="prefix" m:FC_KeepInContent="false" />\r\n' +
- ' <Property Name="FavoriteNumber" Type="Edm.Int32" Nullable="true" m:FC_TargetPath="favorite/number" m:FC_NsUri="htp://prefix" m:FC_NsPrefix="prefix" m:FC_KeepInContent="false" />\r\n' +
- ' <Property Name="Address" Type="Ns.Address" Nullable="false" \r\n' +
- ' m:FC_TargetPath="foo/bar/@city" m:FC_NsUri="htp://prefix" m:FC_NsPrefix="prefix" m:FC_SourcePath="City" m:FC_KeepInContent="false" \r\n' +
- ' m:FC_TargetPath_1="foo/bar" m:FC_NsUri_1="htp://prefix" m:FC_NsPrefix_1="prefix" m:FC_SourcePath_1="Street" m:FC_KeepInContent_1="false" />\r\n' +
- ' </EntityType>\r\n' +
- ' <ComplexType Name="Address">\r\n' +
- ' <Property Name="Street" Type="Edm.String" Nullable="true" />\r\n' +
- ' <Property Name="City" Type="Edm.String" Nullable="true" />\r\n' +
- ' </ComplexType>\r\n' +
- ' <EntityContainer Name="SampleContext" m:IsDefaultEntityContainer="true">\r\n' +
- ' <EntitySet Name="Customers" EntityType="Ns.Customer" />\r\n' +
- ' </EntityContainer>\r\n' +
- '</Schema>\r\n' +
- '</edmx:DataServices></edmx:Edmx>';
-
- var foodServiceV4FoodsSampleText = '' +
- '<feed xml:base="http://localhost:46541/tests/endpoints/FoodStoreDataServiceV4.svc/" xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://docs.oasis-open.org/odata/ns/data" xmlns:m="http://docs.oasis-open.org/odata/ns/metadata" xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml" m:context="http://localhost:46541/tests/endpoints/FoodStoreDataServiceV4.svc/$metadata#Foods">' +
- '<id>http://localhost:46541/tests/endpoints/FoodStoreDataServiceV4.svc/Foods</id>' +
- '<title type="text">Foods</title>' +
- '<updated>2013-12-30T05:45:07Z</updated>' +
- '<link rel="self" title="Foods" href="Foods" />' +
- '<entry>' +
- ' <id>http://localhost:46541/tests/endpoints/FoodStoreDataServiceV4.svc/Foods(0)</id>' +
- ' <category term="#DataJS.Tests.V4.Food" scheme="http://docs.oasis-open.org/odata/ns/scheme" />' +
- ' <link rel="edit" title="Food" href="Foods(0)" />' +
- ' <link rel="http://docs.oasis-open.org/odata/ns/related/Category" type="application/atom+xml;type=entry" title="Category" href="Foods(0)/Category" />' +
- ' <title />' +
- ' <updated>2013-12-30T05:45:07Z</updated>' +
- ' <author>' +
- ' <name />' +
- ' </author>' +
- ' <link rel="http://docs.oasis-open.org/odata/ns/mediaresource/Picture" type="image/png" title="Picture" href="http://localhost:46541/tests/endpoints/FoodStoreDataServiceV4.svc/Picture" />' +
- ' <link rel="http://docs.oasis-open.org/odata/ns/edit-media/Picture" type="image/png" title="Picture" href="Foods(0)/Picture" m:etag="W/"123456789"" />' +
- ' <content type="application/xml">' +
- ' <m:properties>' +
- ' <d:FoodID m:type="Int32">0</d:FoodID>' +
- ' <d:Name>flour</d:Name>' +
- ' <d:UnitPrice m:type="Double">0.19999</d:UnitPrice>' +
- ' <d:ServingSize m:type="Decimal">1</d:ServingSize>' +
- ' <d:MeasurementUnit>Cup</d:MeasurementUnit>' +
- ' <d:ProteinGrams m:type="Byte">3</d:ProteinGrams>' +
- ' <d:FatGrams m:type="Int16">1</d:FatGrams>' +
- ' <d:CarbohydrateGrams m:type="Int32">20</d:CarbohydrateGrams>' +
- ' <d:CaloriesPerServing m:type="Int64">140</d:CaloriesPerServing>' +
- ' <d:IsAvailable m:type="Boolean">true</d:IsAvailable>' +
- ' <d:ExpirationDate m:type="DateTimeOffset">2010-12-25T12:00:00Z</d:ExpirationDate>' +
- ' <d:ItemGUID m:type="Guid">27272727-2727-2727-2727-272727272727</d:ItemGUID>' +
- ' <d:Weight m:type="Single">10</d:Weight>' +
- ' <d:AvailableUnits m:type="SByte">1</d:AvailableUnits>' +
- ' <d:Packaging m:type="#DataJS.Tests.V4.Package">' +
- ' <d:Type m:null="true" />' +
- ' <d:Color></d:Color>' +
- ' <d:NumberPerPackage m:type="Int32">2147483647</d:NumberPerPackage>' +
- ' <d:RequiresRefridgeration m:type="Boolean">false</d:RequiresRefridgeration>' +
- ' <d:ShipDate m:type="DateTimeOffset">2000-12-29T00:00:00Z</d:ShipDate>' +
- ' <d:PackageDimensions m:type="#DataJS.Tests.V4.Dimensions">' +
- ' <d:Length m:type="Decimal">79228162514264337593543950335</d:Length>' +
- ' <d:Height m:type="Int16">32767</d:Height>' +
- ' <d:Width m:type="Int64">9223372036854775807</d:Width>' +
- ' <d:Volume m:type="Double">1.7976931348623157E+308</d:Volume>' +
- ' </d:PackageDimensions>' +
- ' </d:Packaging>' +
- ' <d:CookedSize m:type="#DataJS.Tests.V4.CookedDimensions">' +
- ' <d:Length m:type="Decimal">2</d:Length>' +
- ' <d:Height m:type="Int16">1</d:Height>' +
- ' <d:Width m:type="Int64">3</d:Width>' +
- ' <d:Volume m:type="Double">6</d:Volume>' +
- ' </d:CookedSize>' +
- ' <d:AlternativeNames m:type="#Collection(String)">' +
- ' <m:element>ground cereal</m:element>' +
- ' <m:element>ground grain</m:element>' +
- ' </d:AlternativeNames>' +
- ' <d:Providers m:type="#Collection(DataJS.Tests.V4.Provider)">' +
- ' <m:element>' +
- ' <d:Name>Flour Provider</d:Name>' +
- ' <d:Aliases m:type="#Collection(String)">' +
- ' <m:element>fp1</m:element>' +
- ' <m:element>flour provider1</m:element>' +
- ' </d:Aliases>' +
- ' <d:Details m:type="#DataJS.Tests.V4.ProviderDetails">' +
- ' <d:Telephone>555-555-555</d:Telephone>' +
- ' <d:PreferredCode m:type="Int32">1001</d:PreferredCode>' +
- ' </d:Details>' +
- ' </m:element>' +
- ' <m:element>' +
- ' <d:Name>Ground Grains</d:Name>' +
- ' <d:Aliases m:type="#Collection(String)" />' +
- ' <d:Details m:null="true" />' +
- ' </m:element>' +
- ' </d:Providers>' +
- ' <d:SpatialData m:type="GeometryCollection">' +
- ' <gml:MultiGeometry gml:srsName="http://www.opengis.net/def/crs/EPSG/0/4326">' +
- ' <gml:geometryMembers>' +
- ' <gml:Point>' +
- ' <gml:pos>5 5</gml:pos>' +
- ' </gml:Point>' +
- ' </gml:geometryMembers>' +
- ' </gml:MultiGeometry>' +
- ' </d:SpatialData>' +
- ' </m:properties>' +
- ' </content>' +
- '</entry>' +
- '<entry>' +
- ' <id>http://localhost:46541/tests/endpoints/FoodStoreDataServiceV4.svc/Foods(1)</id>' +
- ' <category term="#DataJS.Tests.V4.Food" scheme="http://docs.oasis-open.org/odata/ns/scheme" />' +
- ' <link rel="edit" title="Food" href="Foods(1)" />' +
- ' <link rel="http://docs.oasis-open.org/odata/ns/related/Category" type="application/atom+xml;type=entry" title="Category" href="Foods(1)/Category" />' +
- ' <title />' +
- ' <updated>2013-12-30T05:45:07Z</updated>' +
- ' <author>' +
- ' <name />' +
- ' </author>' +
- ' <link rel="http://docs.oasis-open.org/odata/ns/mediaresource/Picture" type="image/png" title="Picture" href="http://localhost:46541/tests/endpoints/FoodStoreDataServiceV4.svc/Picture" />' +
- ' <link rel="http://docs.oasis-open.org/odata/ns/edit-media/Picture" type="image/png" title="Picture" href="Foods(1)/Picture" m:etag="W/"123456789"" />' +
- ' <content type="application/xml">' +
- ' <m:properties>' +
- ' <d:FoodID m:type="Int32">1</d:FoodID>' +
- ' <d:Name>sugar</d:Name>' +
- ' <d:UnitPrice m:type="Double">0.2</d:UnitPrice>' +
- ' <d:ServingSize m:type="Decimal">1</d:ServingSize>' +
- ' <d:MeasurementUnit>tsp</d:MeasurementUnit>' +
- ' <d:ProteinGrams m:type="Byte">0</d:ProteinGrams>' +
- ' <d:FatGrams m:type="Int16">0</d:FatGrams>' +
- ' <d:CarbohydrateGrams m:type="Int32">4</d:CarbohydrateGrams>' +
- ' <d:CaloriesPerServing m:type="Int64">16</d:CaloriesPerServing>' +
- ' <d:IsAvailable m:type="Boolean">false</d:IsAvailable>' +
- ' <d:ExpirationDate m:type="DateTimeOffset">2011-12-28T00:00:00Z</d:ExpirationDate>' +
- ' <d:ItemGUID m:type="Guid">ffffffff-ffff-ffff-ffff-ffffffffffff</d:ItemGUID>' +
- ' <d:Weight m:type="Single">0.1</d:Weight>' +
- ' <d:AvailableUnits m:type="SByte">0</d:AvailableUnits>' +
- ' <d:Packaging m:type="#DataJS.Tests.V4.Package">' +
- ' <d:Type xml:space="preserve"> </d:Type>' +
- ' <d:Color>BLUE</d:Color>' +
- ' <d:NumberPerPackage m:type="Int32">-2147483648</d:NumberPerPackage>' +
- ' <d:RequiresRefridgeration m:type="Boolean">true</d:RequiresRefridgeration>' +
- ' <d:ShipDate m:type="DateTimeOffset">2000-12-29T00:00:00Z</d:ShipDate>' +
- ' <d:PackageDimensions m:type="#DataJS.Tests.V4.Dimensions">' +
- ' <d:Length m:type="Decimal">-79228162514264337593543950335</d:Length>' +
- ' <d:Height m:type="Int16">-32768</d:Height>' +
- ' <d:Width m:type="Int64">-9223372036854775808</d:Width>' +
- ' <d:Volume m:type="Double">-1.7976931348623157E+308</d:Volume>' +
- ' </d:PackageDimensions>' +
- ' </d:Packaging>' +
- ' <d:CookedSize m:null="true" />' +
- ' <d:AlternativeNames m:type="#Collection(String)" />' +
- ' <d:Providers m:type="#Collection(DataJS.Tests.V4.Provider)" />' +
- ' <d:SpatialData m:null="true" />' +
- ' </m:properties>' +
- ' </content>' +
- '</entry>' +
- '</feed>';
-
- var foodServiceV4MetadataText = '' +
- '<?xml version="1.0" encoding="utf-8"?>\r\n' +
- '<edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">\r\n' +
- '<edmx:DataServices>\r\n' +
- ' <Schema Namespace="DataJS.Tests.V4" xmlns="http://docs.oasis-open.org/odata/ns/edm">\r\n' +
- ' <EntityType Name="Category">\r\n' +
- ' <Key>\r\n' +
- ' <PropertyRef Name="CategoryID" />\r\n' +
- ' </Key>\r\n' +
- ' <Property Name="Icon" Type="Edm.Stream" Nullable="false" />\r\n' +
- ' <Property Name="CategoryID" Type="Edm.Int32" Nullable="false" />\r\n' +
- ' <Property Name="Name" Type="Edm.String" />\r\n' +
- ' <NavigationProperty Name="Foods" Type="Collection(DataJS.Tests.V4.Food)" Partner="Category" />\r\n' +
- ' </EntityType>\r\n' +
- ' <EntityType Name="Food">\r\n' +
- ' <Key>\r\n' +
- ' <PropertyRef Name="FoodID" />\r\n' +
- ' </Key>\r\n' +
- ' <Property Name="Picture" Type="Edm.Stream" Nullable="false" />\r\n' +
- ' <Property Name="FoodID" Type="Edm.Int32" Nullable="false" />\r\n' +
- ' <Property Name="Name" Type="Edm.String" />\r\n' +
- ' <Property Name="UnitPrice" Type="Edm.Double" Nullable="false" />\r\n' +
- ' <Property Name="ServingSize" Type="Edm.Decimal" Nullable="false" />\r\n' +
- ' <Property Name="MeasurementUnit" Type="Edm.String" />\r\n' +
- ' <Property Name="ProteinGrams" Type="Edm.Byte" Nullable="false" />\r\n' +
- ' <Property Name="FatGrams" Type="Edm.Int16" Nullable="false" />\r\n' +
- ' <Property Name="CarbohydrateGrams" Type="Edm.Int32" Nullable="false" />\r\n' +
- ' <Property Name="CaloriesPerServing" Type="Edm.Int64" Nullable="false" />\r\n' +
- ' <Property Name="IsAvailable" Type="Edm.Boolean" Nullable="false" />\r\n' +
- ' <Property Name="ExpirationDate" Type="Edm.DateTimeOffset" Nullable="false" />\r\n' +
- ' <Property Name="ItemGUID" Type="Edm.Guid" Nullable="false" />\r\n' +
- ' <Property Name="Weight" Type="Edm.Single" Nullable="false" />\r\n' +
- ' <Property Name="AvailableUnits" Type="Edm.SByte" Nullable="false" />\r\n' +
- ' <Property Name="Packaging" Type="DataJS.Tests.V4.Package" />\r\n' +
- ' <Property Name="CookedSize" Type="DataJS.Tests.V4.CookedDimensions" />\r\n' +
- ' <Property Name="AlternativeNames" Type="Collection(Edm.String)" Nullable="false" />\r\n' +
- ' <Property Name="Providers" Type="Collection(DataJS.Tests.V4.Provider)" Nullable="false" />\r\n' +
- ' <Property Name="SpatialData" Type="Edm.GeometryCollection" SRID="Variable" />\r\n' +
- ' <NavigationProperty Name="Category" Type="DataJS.Tests.V4.Category" Partner="Foods" />\r\n' +
- ' </EntityType>\r\n' +
- ' <EntityType Name="PreparedFood" BaseType="DataJS.Tests.V4.Food">\r\n' +
- ' <Property Name="Instructions" Type="Edm.String" />\r\n' +
- ' <Property Name="NumberOfIngredients" Type="Edm.Single" Nullable="false" />\r\n' +
- ' </EntityType>\r\n' +
- ' <ComplexType Name="Package">\r\n' +
- ' <Property Name="Type" Type="Edm.String" />\r\n' +
- ' <Property Name="Color" Type="Edm.String" />\r\n' +
- ' <Property Name="NumberPerPackage" Type="Edm.Int32" Nullable="false" />\r\n' +
- ' <Property Name="RequiresRefridgeration" Type="Edm.Boolean" Nullable="false" />\r\n' +
- ' <Property Name="ShipDate" Type="Edm.DateTimeOffset" Nullable="false" />\r\n' +
- ' <Property Name="PackageDimensions" Type="DataJS.Tests.V4.Dimensions" />\r\n' +
- ' </ComplexType>\r\n' +
- ' <ComplexType Name="Dimensions">\r\n' +
- ' <Property Name="Length" Type="Edm.Decimal" Nullable="false" />\r\n' +
- ' <Property Name="Height" Type="Edm.Int16" Nullable="false" />\r\n' +
- ' <Property Name="Width" Type="Edm.Int64" Nullable="false" />\r\n' +
- ' <Property Name="Volume" Type="Edm.Double" Nullable="false" />\r\n' +
- ' </ComplexType>\r\n' +
- ' <ComplexType Name="CookedDimensions">\r\n' +
- ' <Property Name="Length" Type="Edm.Decimal" Nullable="false" />\r\n' +
- ' <Property Name="Height" Type="Edm.Int16" Nullable="false" />\r\n' +
- ' <Property Name="Width" Type="Edm.Int64" Nullable="false" />\r\n' +
- ' <Property Name="Volume" Type="Edm.Double" Nullable="false" />\r\n' +
- ' </ComplexType>\r\n' +
- ' <ComplexType Name="Provider">\r\n' +
- ' <Property Name="Name" Type="Edm.String" />\r\n' +
- ' <Property Name="Aliases" Type="Collection(Edm.String)" Nullable="false" />\r\n' +
- ' <Property Name="Details" Type="DataJS.Tests.V4.ProviderDetails" />\r\n' +
- ' </ComplexType>\r\n' +
- ' <ComplexType Name="ProviderDetails">\r\n' +
- ' <Property Name="Telephone" Type="Edm.String" />\r\n' +
- ' <Property Name="PreferredCode" Type="Edm.Int32" Nullable="false" />\r\n' +
- ' </ComplexType>\r\n' +
- ' <Action Name="ResetData">\r\n' +
- ' <ReturnType Type="Edm.String" />\r\n' +
- ' </Action>\r\n' +
- ' <Function Name="FoodsAvailable" IsComposable="true">\r\n' +
- ' <ReturnType Type="Collection(Edm.String)" />\r\n' +
- ' </Function>\r\n' +
- ' <Function Name="PackagingTypes" IsComposable="true">\r\n' +
- ' <ReturnType Type="Collection(DataJS.Tests.V4.Package)" />\r\n' +
- ' </Function>\r\n' +
- ' <Function Name="UserNameAndPassword">\r\n' +
- ' <ReturnType Type="Edm.String" />\r\n' +
- ' </Function>\r\n' +
- ' <EntityContainer Name="FoodContainer">\r\n' +
- ' <EntitySet Name="Categories" EntityType="DataJS.Tests.V4.Category">\r\n' +
- ' <NavigationPropertyBinding Path="Foods" Target="Foods" />\r\n' +
- ' </EntitySet>\r\n' +
- ' <EntitySet Name="Foods" EntityType="DataJS.Tests.V4.Food">\r\n' +
- ' <NavigationPropertyBinding Path="Category" Target="Categories" />\r\n' +
- ' </EntitySet>\r\n' +
- ' <ActionImport Name="ResetData" Action="DataJS.Tests.V4.ResetData" />\r\n' +
- ' <FunctionImport Name="FoodsAvailable" Function="DataJS.Tests.V4.FoodsAvailable" IncludeInServiceDocument="true" />\r\n' +
- ' <FunctionImport Name="PackagingTypes" Function="DataJS.Tests.V4.PackagingTypes" IncludeInServiceDocument="true" />\r\n' +
- ' <FunctionImport Name="UserNameAndPassword" Function="DataJS.Tests.V4.UserNameAndPassword" IncludeInServiceDocument="true" />\r\n' +
- ' </EntityContainer>\r\n' +
- ' </Schema>\r\n' +
- '</edmx:DataServices>\r\n' +
- '</edmx:Edmx>';
-
- djstest.addFullTest(true, function applyEntryCustomizationToEntryTest() {
- var metadata = parseMetadataHelper(customerSampleMetadataText);
- var data = { __metadata: { type: "Ns.Customer" }, Name: "Name", LastName: "Last Name", Address: { Street: "Street Value", City: "City Value" }, FavoriteNumber: 123 };
- var request = { data: data, headers: { "Content-Type": "application/atom+xml"} };
- OData.atomHandler.write(request, { metadata: metadata });
-
- djstest.assert(request.body !== null, "request.body !== null");
- djstest.assert(request.body.indexOf("<a:summary type=\"xhtml\">Name</a:summary>") !== -1, 'request.body.indexOf("<a:summary>Name</a:summary>") !== -1');
- djstest.assert(request.body.indexOf('baz="Last Name"') !== -1, 'request.body.indexOf(baz="Last Name") !== -1');
- djstest.assert(request.body.indexOf('city="City Value"') !== -1, 'request.body.indexOf(city="City Value") !== -1');
- djstest.assert(request.body.indexOf('<prefix:foo ') !== -1, "request.body.indexOf('<prefix:foo ') !== -1");
- djstest.assert(request.body.indexOf('term="Ns.Customer"') !== -1, "request.body.indexOf(term='Ns.Customer') !== -1");
- djstest.assert(request.body.indexOf('>123</') !== -1, "request.body.indexOf(>123</) !== -1");
-
- // Try with other mapping types.
- metadata.dataServices.schema[0].entityType[0].property[1].FC_ContentKind = "html";
- request.body = undefined;
- OData.atomHandler.write(request, { metadata: metadata });
- djstest.assert(request.body.indexOf("<a:summary type=\"html\">Name</a:summary>") !== -1, 'request.body.indexOf("<a:summary type="html">Name</a:summary>") !== -1');
-
- // Try with a null value now.
- request.data.FavoriteNumber = null;
- request.body = null;
- OData.atomHandler.write(request, { metadata: metadata });
- djstest.assert(request.body.indexOf('>123</') === -1, "request.body.indexOf(>123</) === -1");
- djstest.assert(request.body.indexOf('m:null="true"') !== -1, "request.body.indexOf(m:null=true) !== -1");
-
- // Try with a null complex type now.
- request.data.FavoriteNumber = 123;
- request.data.Address = null;
- request.body = null;
- OData.atomHandler.write(request, { metadata: metadata });
- djstest.assert(request.body.indexOf('Street') === -1, "request.body.indexOf(Street) === -1");
- djstest.assert(request.body.indexOf('m:null="true"') !== -1, "request.body.indexOf(m:null=true) !== -1");
-
- djstest.done();
- });
-
- djstest.addFullTest(true, function testParsePrimitivePropertiesBasic() {
- var feed = "\
- <entry xml:base=\'http://services.odata.org/OData/OData.svc/\' \r\n\
- xmlns:d=\'http://schemas.microsoft.com/ado/2007/08/dataservices\' \r\n\
- xmlns:m=\'http://schemas.microsoft.com/ado/2007/08/dataservices/metadata\' \r\n\
- xmlns:atom=\'http://www.w3.org/2005/Atom\' \r\n\
- xmlns:app=\'http://www.w3.org/2007/app\' \r\n\
- xmlns=\'http://www.w3.org/2005/Atom\'>\r\n\
- <id>http://services.odata.org/OData/OData.svc/the id</id> \r\n \
- <content type='application/xml'>\r\n \
- <m:properties xmlns=\'http://schemas.microsoft.com/ado/2007/08/dataservices\'>\r\n \
- <Boolean m:type='Edm.Boolean'>true</Boolean>\r\n \
- <Binary m:type='Edm.Binary'>01007A8A680D9E14A64EAC1242DD33C9DB05</Binary>\r\n \
- <Byte m:type='Edm.Byte'>8</Byte>\r\n \
- <DateTime m:type='Edm.DateTime'>2010-11-01T15:13:25</DateTime>\r\n \
- <Decimal m:type='Edm.Decimal'>100.10</Decimal>\r\n \
- <Guid m:type='Edm.Guid'>12345678-aaaa-bbbb-cccc-ddddeeeeffff</Guid>\r\n \
- <!-- <Time m:type='Edm.Time'>P05DT12H30M05.125S</Time> --> \r\n \
- <DateTimeOffset m:type='Edm.DateTimeOffset'>2010-11-01T15:13:25+10:00</DateTimeOffset>\r\n \
- <Double m:type='Edm.Double'>1E+10</Double>\r\n \
- <Single m:type='Edm.Single'>100.01</Single>\r\n \
- <Int16 m:type='Edm.Int16'>16</Int16>\r\n \
- <Int32 m:type='Edm.Int32'>32</Int32>\r\n \
- <Int64 m:type='Edm.Int64'>64</Int64>\r\n \
- <SByte m:type='Edm.SByte'>-8</SByte>\r\n \
- </m:properties>\r\n \
- </content>\r\n \
- </entry>\r\n";
-
- var response = { body: feed, headers: { "Content-Type": "application/atom+xml"} };
- OData.atomHandler.read(response, {});
-
- djstest.assertsExpected(1);
- ODataReadOracle.readEntryLoopback(feed, function (expectedData) {
- djstest.assertAreEqualDeep(response.data, expectedData, "Verify deserialized data");
- djstest.done();
- });
- });
-
- djstest.addFullTest(true, function deserializeCustomizationsNullAndXhtmlTest() {
- var payload = "<entry " +
- ' xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" \r\n' +
- " xmlns:m='http://schemas.microsoft.com/ado/2007/08/dataservices/metadata' \r\n" +
- " xmlns=\"http://www.w3.org/2005/Atom\">\r\n" +
- " <id>http://localhost/tests/endpoints/FoodDataService.svc/Foods(1)</id> " +
- " <author><name>Customer #1</name></author>" +
- " <summary><b>Name</b></summary>" +
- " <category term='Ns.Customer' scheme='http://schemas.microsoft.com/ado/2007/08/dataservices/scheme' /> " +
- " <content type='application/xml'><m:properties><d:ID m:type='Edm.Int32'>1</d:ID>" +
- " <d:LastName m:null='true' /></m:properties></content>" +
- "</entry>";
- var metadata = parseMetadataHelper(customerSampleMetadataText);
- var response = { body: payload, headers: { "Content-Type": "application/atom+xml"} };
- OData.atomHandler.read(response, { metadata: metadata });
-
- djstest.assertAreEqual(response.data.LastName, null, "last name is null");
- djstest.assertAreEqual(response.data.Name, "<b xmlns=\"http://www.w3.org/2005/Atom\">Name</b>", "name includes tags");
-
- djstest.done();
- });
-
- djstest.addFullTest(true, function parseCustomizationSampleTest() {
- var payload = foodServiceV4FoodsSampleText;
- var metadata = parseMetadataHelper(foodServiceV4MetadataText);
- var response = { body: payload, headers: { "Content-Type": "application/atom+xml"} };
- OData.atomHandler.read(response, { metadata: metadata });
-
- djstest.assert(response.data !== null, "response.data !== null");
- djstest.assert(response.data.results !== null, "response.data.results !== null");
-
- var r = response.data.results;
- djstest.assertAreEqual(r[0].__metadata.type, "DataJS.Tests.V4.Food", "r[0].__metadata.type");
- djstest.assertAreEqual(r[0].Name, "flour", "r[0].Name");
- djstest.assertAreEqual(r[0].UnitPrice, 0.19999, "r[0].UnitPrice");
- djstest.assertAreEqual(r[0].ServingSize, 1, "r[0].ServingSize");
-
- // CONSIDER: we intended to have complex type have their type annotation out-of-band, but JSON has it in-line; do we want to normalize this out everywhere?
- // djstest.assertAreEqual(r[0].Packaging.__metadata.type, "DataJS.Tests.PackageV4", "r[0].Packaging.__metadata.type");
- djstest.assertAreEqual(r[0].Packaging.Type, null, "package type for flour is null");
- djstest.assertAreEqual(r[0].Packaging.PackageDimensions.Height, 32767, "r[0].Packaging.PackageDimensions.Height");
-
- djstest.assertAreEqual(r[0].CookedSize.Length, 2, "r[0].CookedSize.Length");
- djstest.assertAreEqual(r[0].CookedSize.Volume, 6, "r[0].CookedSize.Volume");
-
- djstest.done();
- });
-
- djstest.addFullTest(true, function parseIntoPropertiesTest() {
- var payload = '' +
- '<entry xml:base="http://localhost:46541/tests/endpoints/FoodStoreDataServiceV4.svc/" xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://docs.oasis-open.org/odata/ns/data" xmlns:m="http://docs.oasis-open.org/odata/ns/metadata" xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml" m:context="http://localhost:46541/tests/endpoints/FoodStoreDataServiceV4.svc/$metadata#Foods/$entity">' +
- '<id>http://localhost:46541/tests/endpoints/FoodStoreDataServiceV4.svc/Foods(0)</id>' +
- '<category term="#DataJS.Tests.V4.Food" scheme="http://docs.oasis-open.org/odata/ns/scheme" />' +
- '<link rel="edit" title="Food" href="Foods(0)" />' +
- '<link rel="http://docs.oasis-open.org/odata/ns/related/Category" type="application/atom+xml;type=entry" title="Category" href="Foods(0)/Category" />' +
- '<title />' +
- '<updated>2013-12-30T06:01:30Z</updated>' +
- '<author>' +
- ' <name />' +
- '</author>' +
- '<link rel="http://docs.oasis-open.org/odata/ns/mediaresource/Picture" type="image/png" title="Picture" href="http://localhost:46541/tests/endpoints/FoodStoreDataServiceV4.svc/Picture" />' +
- '<link rel="http://docs.oasis-open.org/odata/ns/edit-media/Picture" type="image/png" title="Picture" href="Foods(0)/Picture" m:etag="W/"123456789"" />' +
- '<content type="application/xml">' +
- ' <m:properties>' +
- ' <d:FoodID m:type="Int32">0</d:FoodID>' +
- ' <d:Name>flour</d:Name>' +
- ' <d:UnitPrice m:type="Double">0.19999</d:UnitPrice>' +
- ' <d:ServingSize m:type="Decimal">1</d:ServingSize>' +
- ' <d:MeasurementUnit>Cup</d:MeasurementUnit>' +
- ' <d:ProteinGrams m:type="Byte">3</d:ProteinGrams>' +
- ' <d:FatGrams m:type="Int16">1</d:FatGrams>' +
- ' <d:CarbohydrateGrams m:type="Int32">20</d:CarbohydrateGrams>' +
- ' <d:CaloriesPerServing m:type="Int64">140</d:CaloriesPerServing>' +
- ' <d:IsAvailable m:type="Boolean">true</d:IsAvailable>' +
- ' <d:ExpirationDate m:type="DateTimeOffset">2010-12-25T12:00:00Z</d:ExpirationDate>' +
- ' <d:ItemGUID m:type="Guid">27272727-2727-2727-2727-272727272727</d:ItemGUID>' +
- ' <d:Weight m:type="Single">10</d:Weight>' +
- ' <d:AvailableUnits m:type="SByte">1</d:AvailableUnits>' +
- ' <d:Packaging m:type="#DataJS.Tests.V4.Package">' +
- ' <d:Type m:null="true" />' +
- ' <d:Color></d:Color>' +
- ' <d:NumberPerPackage m:type="Int32">2147483647</d:NumberPerPackage>' +
- ' <d:RequiresRefridgeration m:type="Boolean">false</d:RequiresRefridgeration>' +
- ' <d:ShipDate m:type="DateTimeOffset">2000-12-29T00:00:00Z</d:ShipDate>' +
- ' <d:PackageDimensions m:type="#DataJS.Tests.V4.Dimensions">' +
- ' <d:Length m:type="Decimal">79228162514264337593543950335</d:Length>' +
- ' <d:Height m:type="Int16">32767</d:Height>' +
- ' <d:Width m:type="Int64">9223372036854775807</d:Width>' +
- ' <d:Volume m:type="Double">1.7976931348623157E+308</d:Volume>' +
- ' </d:PackageDimensions' +
- ' </d:Packaging>' +
- ' <d:CookedSize m:type="#DataJS.Tests.V4.CookedDimensions">' +
- ' <d:Length m:type="Decimal">2</d:Length>' +
- ' <d:Height m:type="Int16">1</d:Height>' +
- ' <d:Width m:type="Int64">3</d:Width>' +
- ' <d:Volume m:type="Double">6</d:Volume>' +
- ' </d:CookedSize>' +
- ' <d:AlternativeNames m:type="#Collection(String)">' +
- ' <m:element>ground cereal</m:element>' +
- ' <m:element>ground grain</m:element>' +
- ' </d:AlternativeNames>' +
- ' <d:Providers m:type="#Collection(DataJS.Tests.V4.Provider)">' +
- ' <m:element>' +
- ' <d:Name>Flour Provider</d:Name>' +
- ' <d:Aliases m:type="#Collection(String)">' +
- ' <m:element>fp1</m:element>' +
- ' <m:element>flour provider1</m:element>' +
- ' </d:Aliases' +
- ' <d:Details m:type="#DataJS.Tests.V4.ProviderDetails">' +
- ' <d:Telephone>555-555-555</d:Telephone>' +
- ' <d:PreferredCode m:type="Int32">1001</d:PreferredCode>' +
- ' </d:Details>' +
- ' </m:element>' +
- ' <m:element>' +
- ' <d:Name>Ground Grains</d:Name>' +
- ' <d:Aliases m:type="#Collection(String)" />' +
- ' <d:Details m:null="true" />' +
- ' </m:element>' +
- ' </d:Providers>' +
- ' <d:SpatialData m:type="GeometryCollection">' +
- ' <gml:MultiGeometry gml:srsName="http://www.opengis.net/def/crs/EPSG/0/4326">' +
- ' <gml:geometryMembers>' +
- ' <gml:Point>' +
- ' <gml:pos>5 5</gml:pos>' +
- ' </gml:Point>' +
- ' </gml:geometryMembers>' +
- ' </gml:MultiGeometry>' +
- ' </d:SpatialData>' +
- ' </m:properties>' +
- '</content>' +
- '</entry>';
-
- var metadata = parseMetadataHelper(foodServiceV4MetadataText);
- var response = { body: payload, headers: { "Content-Type": "application/atom+xml"} };
- OData.atomHandler.read(response, { metadata: metadata });
-
- djstest.assert(response.data !== null, "response.data !== null");
- djstest.assertAreEqual(response.data.__metadata.type, "DataJS.Tests.V4.Food", "types match");
- djstest.assertAreEqual(response.data.UnitPrice, 0.19999, "Price is as expected");
- djstest.assertAreEqual(response.data.__metadata.properties.UnitPrice.type, "Edm.Double", "Price was marked as a double");
-
- djstest.assertAreEqual(response.data.CookedSize.__metadata.properties.Length.type, "Edm.Decimal", "CookedSize.Length was marked as a decimal");
-
- // When properties are marked on complex type metadata, this assertion will be true as well.
- // djstest.assertAreEqual(response.data.Packaging.__metadata.Type.type, "Edm.String", "Packaging type was marked as a string");
-
- djstest.done();
- });
-
- djstest.addFullTest(true, function parseNullInlineTest() {
- // Shorter version of:
- // odatajs.oData.read("/tests/endpoints/FoodStoreDataService.svc/Foods?$expand=Category&$filter=Category eq null", function(data, response) {
-
- var body = '' +
- '<feed xml:base="http://localhost:46541/tests/endpoints/FoodStoreDataServiceV4.svc/" xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://docs.oasis-open.org/odata/ns/data" xmlns:m="http://docs.oasis-open.org/odata/ns/metadata" xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml" m:context="http://localhost:46541/tests/endpoints/FoodStoreDataServiceV4.svc/$metadata#Foods">' +
- '<id>http://localhost:46541/tests/endpoints/FoodStoreDataServiceV4.svc/Foods</id>' +
- '<title type="text">Foods</title>' +
- '<updated>2013-12-30T06:09:18Z</updated>' +
- '<link rel="self" title="Foods" href="Foods" />' +
- '<entry>' +
- ' <id>http://localhost:46541/tests/endpoints/FoodStoreDataServiceV4.svc/Foods(2)</id>' +
- ' <category term="#DataJS.Tests.V4.Food" scheme="http://docs.oasis-open.org/odata/ns/scheme" />' +
- ' <link rel="edit" title="Food" href="Foods(2)" />' +
- ' <link rel="http://docs.oasis-open.org/odata/ns/related/Category" type="application/atom+xml;type=entry" title="Category" href="Foods(2)/Category">' +
- ' <m:inline />' +
- ' </link>' +
- ' <title />' +
- ' <updated>2013-12-30T06:09:18Z</updated>' +
- ' <author>' +
- ' <name />' +
- ' </author>' +
- ' <link rel="http://docs.oasis-open.org/odata/ns/mediaresource/Picture" type="image/png" title="Picture" href="http://localhost:46541/tests/endpoints/FoodStoreDataServiceV4.svc/Picture" />' +
- ' <link rel="http://docs.oasis-open.org/odata/ns/edit-media/Picture" type="image/png" title="Picture" href="Foods(2)/Picture" m:etag="W/"123456789"" />' +
- ' <content type="application/xml">' +
- ' <m:properties>' +
- ' <d:FoodID m:type="Int32">2</d:FoodID>' +
- ' <d:Name>1 Chicken Egg</d:Name>' +
- ' <d:UnitPrice m:type="Double">0.55</d:UnitPrice>' +
- ' <d:ServingSize m:type="Decimal">1</d:ServingSize>' +
- ' <d:MeasurementUnit m:null="true" />' +
- ' <d:ProteinGrams m:type="Byte">6</d:ProteinGrams>' +
- ' </m:properties>' +
- ' </content>' +
- '</entry>' +
- '</feed>';
- var response = { body: body, headers: { "Content-Type": "application/atom+xml"} };
- OData.atomHandler.read(response, {});
- var data = response.data;
- var r = data.results[0];
- djstest.assertAreEqual(r.Category, null, "r.Category is null as an empty inline entry");
- djstest.assertAreEqual(r.FoodID, 2, "r.FoodID read correctly");
- djstest.assertAreEqual(r.__metadata.properties.Category.extensions[0].name, "title", "Category title extension parsed");
- djstest.assertAreEqual(r.__metadata.properties.Category.extensions[0].value, "Category", "Category title value parsed");
- djstest.done();
- });
-
- djstest.addFullTest(true, function serializeEpmTest() {
- var metadata = parseMetadataHelper(foodServiceV4MetadataText);
- var data = { __metadata: { type: "DataJS.Tests.V4.Food" }, FoodID: 123, Name: "name", CookedSize: { Length: 1, Height: 2, Width: 3, Volume: 4} };
- var request = { data: data, headers: { "Content-Type": "application/atom+xml"} };
- OData.atomHandler.write(request, { metadata: metadata });
- djstest.assert(request.body.indexOf("CookedSize") === -1, "CookedSize element is missing from payload");
- djstest.assert(request.body.indexOf("length=") !== -1, "length is available as a mapped attribute");
- djstest.assert(request.body.indexOf("height=") !== -1, "height is available as a mapped attribute");
- djstest.assert(request.body.indexOf("width=") !== -1, "width is available as a mapped attribute");
- djstest.assert(request.body.indexOf("volume>") !== -1, "volume is available as a mapped element");
- djstest.done();
- });
-
- djstest.addFullTest(true, function writeNullComplexTypeTest() {
-
- // Verify that the server can be updated to set a complex value to null.
- var foodSetUrl = "./endpoints/FoodStoreDataServiceV4.svc/Foods";
- resetFoodData();
-
- // Without metadata, this will fail because the server version won't be set to 2.0.
- var metadata = parseMetadataHelper(foodServiceV4MetadataText);
- odatajs.oData.read(foodSetUrl + "?$top=1", function (data) {
- var item = data.results[0];
- djstest.assert(item.Packaging, "item.Packaging is not null");
- item.Packaging = null;
-
- // The server will reject links for PUT operations.
- delete item.Category;
-
- odatajs.oData.request({ method: "PUT", requestUri: item.__metadata.uri, data: item, headers: { "Content-Type": "application/atom+xml"} }, function (data) {
- // Re-read the item.
- odatajs.oData.read(item.__metadata.uri, function (data) {
- djstest.assert(data, "data was read successfully again");
- djstest.assert(!data.Packaging, "!data.Packaging");
- resetFoodData();
- djstest.done();
- }, djstest.failAndDoneCallback("Failed to read back food.", resetFoodData));
- }, djstest.failAndDoneCallback("Failed to write food"), null, null, metadata);
- }, djstest.failAndDoneCallback("Failed to read food"), null, null, metadata);
- });
-
- djstest.addFullTest(true, function writeNonNullLinkTest() {
- // Verify that the server can be updated to set a link to null.
- resetFoodData();
- var foodSetUrl = "./endpoints/FoodStoreDataServiceV4.svc/Foods";
- var metadata = parseMetadataHelper(foodServiceV4MetadataText);
- odatajs.oData.read(foodSetUrl + "?$top=1", function (data) {
- var item = data.results[0];
-
- // Turn this into something different.
- delete item.__metadata.uri;
- item.FoodID = 1001;
-
- odatajs.oData.request({ method: "POST", requestUri: foodSetUrl, data: item, headers: { "Content-Type": "application/atom+xml"} }, function (data) {
- // Re-read the item.
- odatajs.oData.read(data.__metadata.uri + "?$expand=Category", function (data) {
- djstest.assert(data, "data was read successfully again");
- djstest.assert(data.Category, "data.Category");
- djstest.assert(data.Category.Name, "data.Category.Name");
- resetFoodData();
- djstest.done();
- }, djstest.failAndDoneCallback("Failed to read back food.", resetFoodData));
- }, djstest.failAndDoneCallback("Failed to add modified food"), null, null, metadata);
- }, djstest.failAndDoneCallback("Failed to read food"), null, null, metadata);
- });
-
- djstest.addFullTest(true, function writeNullLinkTest() {
- // Verify that the server can be updated to set a link to null.
- resetFoodData();
- var foodSetUrl = "./endpoints/FoodStoreDataServiceV4.svc/Foods";
- var metadata = parseMetadataHelper(foodServiceV4MetadataText);
- odatajs.oData.read(foodSetUrl + "?$top=1", function (data) {
- var item = data.results[0];
-
- // Turn this into something different.
- delete item.__metadata.uri;
- item.FoodID = 1001;
- item.Category = null;
-
- odatajs.oData.request({ method: "POST", requestUri: foodSetUrl, data: item, headers: { "Content-Type": "application/atom+xml"} }, function (data) {
- // Re-read the item.
- odatajs.oData.read(data.__metadata.uri + "?$expand=Category", function (data) {
- djstest.assert(data, "data was read successfully again");
- djstest.assert(!data.Category, "data.Category");
- resetFoodData();
- djstest.done();
- }, djstest.failAndDoneCallback("Failed to read back food.", resetFoodData));
- }, djstest.failAndDoneCallback("Failed to add modified food"), null, null, metadata);
- }, djstest.failAndDoneCallback("Failed to read food"), null, null, metadata);
- });
-
- // DATAJS INTERNAL START
- djstest.addFullTest(true, function lookupEntityTypeInSchemaTest() {
- var schemaEmpty = {};
- var schemaZero = {
- namespace: "Zero",
- entityType: [
- { name: "Genre" },
- { name: "Language" }
- ]
- };
- var schemaOne = {
- namespace: "One",
- entityType: [
- { name: "Genre1" },
- { name: "Language1" }
- ]
- };
- var edmx = { dataServices: { schema: [schemaEmpty, schemaZero, schemaOne]} };
-
- var lookupEntityTypeInSchema = function (name, schema) {
- return OData.lookupInMetadata(name, schema, "entityType");
- };
-
- djstest.assertAreEqual(
- lookupEntityTypeInSchema("Zero.Genre"),
- null, "Expected null for missing metadata");
- djstest.assertAreEqual(
- lookupEntityTypeInSchema("", schemaEmpty),
- null, "Expected null for empty type name");
- djstest.assertAreEqual(
- lookupEntityTypeInSchema("FooWar", schemaEmpty),
- null, "Expected null for mismatched name/namespace");
- djstest.assertAreEqual(
- lookupEntityTypeInSchema("Zero", schemaZero),
- null, "Expected null for unqualified type name");
- djstest.assertAreEqual(
- lookupEntityTypeInSchema("Zero.Something", schemaZero),
- null, "Expected null for mismatched type name");
- djstest.assertAreEqualDeep(
- lookupEntityTypeInSchema("Zero.Genre", schemaZero),
- { name: "Genre" }, "Found type by full name");
-
- djstest.assertAreEqual(
- lookupEntityTypeInSchema("Zero.Something", edmx),
- null, "Expected null for mismatched type name in edmx");
- djstest.assertAreEqualDeep(
- lookupEntityTypeInSchema("Zero.Genre", edmx),
- { name: "Genre" }, "Found type by full name in edmx");
- djstest.assertAreEqualDeep(
- lookupEntityTypeInSchema("One.Genre1", edmx),
- { name: "Genre1" }, "Found type by full name in edmx");
-
- djstest.assertAreEqual(
- OData.lookupInMetadata("One.Genre1", edmx, "complexType"),
- null, "Expected null for a complex type lookup of an entity type.");
-
- djstest.done();
- });
-
- djstest.addFullTest(true, function testLookupEntityType() {
- var schemaZero = {
- namespace: "Zero",
- entityType: [
- { name: "Genre" },
- { name: "Language" }
- ]
- };
- var schemaOne = {
- namespace: "One",
- entityType: [
- { name: "Genre1" },
- { name: "Language1" }
- ]
- };
- var schemaTwo = {
- namespace: "Two",
- entityType: [
- { name: "Genre2" },
- { name: "Language2" }
- ]
- };
- var edmx = { dataServices: { schema: [schemaZero, schemaOne]} };
- var metadata = [edmx, schemaTwo];
-
- djstest.assertAreEqual(
- OData.lookupEntityType("Zero.Something", metadata),
- null, "Expected null for mismatched type name in metadata");
- djstest.assertAreEqualDeep(
- OData.lookupEntityType("Zero.Genre", null),
- null, "Expected null for missing metadata");
- djstest.assertAreEqualDeep(
- OData.lookupEntityType(null, metadata),
- null, "Expected null for missing name");
- djstest.assertAreEqualDeep(
- OData.lookupEntityType("Zero.Genre", metadata),
- { name: "Genre" }, "Found type by full name in metadata");
- djstest.assertAreEqualDeep(
- OData.lookupEntityType("One.Genre1", metadata),
- { name: "Genre1" }, "Found type by full name in metadata");
- djstest.assertAreEqualDeep(
- OData.lookupEntityType("One.Genre1", edmx),
- { name: "Genre1" }, "Found type by full name in edmx");
- djstest.assertAreEqualDeep(
- OData.lookupEntityType("Two.Genre2", metadata),
- { name: "Genre2" }, "Found type by full name in metadata");
-
- djstest.done();
- });
-
- djstest.addFullTest(true, function testParseSimpleServiceDocument() {
- var serviceDocString = "\
- <service xml:base=\"http://services.odata.org/OData/OData.svc/\" \r\n\
- xmlns:atom=\"http://www.w3.org/2005/Atom\" \r\n\
- xmlns:app=\"http://www.w3.org/2007/app\" \r\n\
- xmlns=\"http://www.w3.org/2007/app\">\r\n\
- <workspace>\r\n\
- <atom:title>Default</atom:title> \r\n\
- <collection href=\"Products\">\r\n\
- <atom:title>Products</atom:title> \r\n\
- </collection>\r\n\
- <collection href=\"Categories\">\r\n\
- <atom:title>Categories</atom:title> \r\n\
- </collection>\r\n\
- <collection href=\"Suppliers\">\r\n\
- <atom:title>Suppliers</atom:title> \r\n\
- </collection>\r\n\
- </workspace>\r\n\
- </service>\r\n";
-
- var serviceDoc = OData.atomParser(OData.atomHandler, serviceDocString, {});
-
- djstest.assertAreEqual(serviceDoc.workspaces.length, 1, "Incorrect number of workspaces");
-
- var workspace = serviceDoc.workspaces[0];
- djstest.assertAreEqual(workspace.title, "Default", "Incorrect service doc title");
-
- var expectedCollections = [
- { expectedHref: "http://services.odata.org/OData/OData.svc/Products", expectedTitle: "Products" },
- { expectedHref: "http://services.odata.org/OData/OData.svc/Categories", expectedTitle: "Categories" },
- { expectedHref: "http://services.odata.org/OData/OData.svc/Suppliers", expectedTitle: "Suppliers" }
- ];
-
- djstest.assertAreEqual(workspace.collections.length, expectedCollections.length, "Incorrect number of collections in workspace");
-
- var i, len;
- for (i = 0, len = expectedCollections.length; i < len; i++) {
- djstest.assertAreEqual(workspace.collections[i].href, expectedCollections[i].expectedHref, "Incorrect href on collection");
- djstest.assertAreEqual(workspace.collections[i].title, expectedCollections[i].expectedTitle, "Incorrect title on collection");
- }
-
- djstest.done();
- });
-
- djstest.addFullTest(true, function testServiceDocMustHaveAtLeastOneWorkspaceElement() {
- // Construct a service doc with no workspaces and verify that the parser throws.
- var serviceDocString = "\
- <service xml:base=\"http://services.odata.org/OData/OData.svc/\" \r\n\
- xmlns:atom=\"http://www.w3.org/2005/Atom\" \r\n\
- xmlns:app=\"http://www.w3.org/2007/app\" \r\n\
- xmlns=\"http://www.w3.org/2007/app\">\r\n\
- </service>\r\n";
-
- djstest.expectException(function () {
- var serviceDoc = OData.atomParser(OData.atomHandler, serviceDocString, {});
- }, "Parsing service doc with no workspaces");
-
- djstest.done();
- });
-
- djstest.addFullTest(true, function testServiceDocMayHaveMoreThanOneWorkspaceElement() {
- var serviceDocString = "\
- <service xml:base=\"http://services.odata.org/OData/OData.svc/\" \r\n\
- xmlns:atom=\"http://www.w3.org/2005/Atom\" \r\n\
- xmlns:app=\"http://www.w3.org/2007/app\" \r\n\
- xmlns=\"http://www.w3.org/2007/app\">\r\n\
- <workspace>\r\n\
- <atom:title>Default</atom:title> \r\n\
- <collection href=\"Products\">\r\n\
- <atom:title>Products</atom:title> \r\n\
- </collection>\r\n\
- <collection href=\"Categories\">\r\n\
- <atom:title>Categories</atom:title> \r\n\
- </collection>\r\n\
- <collection href=\"Suppliers\">\r\n\
- <atom:title>Suppliers</atom:title> \r\n\
- </collection>\r\n\
- </workspace>\r\n\
- <workspace>\r\n\
- <atom:title>Second Workspace</atom:title> \r\n\
- <collection href=\"Collection1\">\r\n\
- <atom:title>Collection Number 1</atom:title> \r\n\
- </collection>\r\n\
- <collection href=\"Collection2\">\r\n\
- <atom:title>Collection Number 2</atom:title> \r\n\
- </collection>\r\n\
- </workspace>\r\n\
- </service>\r\n";
-
- var serviceDoc = OData.atomParser(OData.atomHandler, serviceDocString, {});
-
- djstest.assertAreEqual(serviceDoc.workspaces.length, 2, "Incorrect number of workspaces");
-
- var workspace = serviceDoc.workspaces[0];
- djstest.assertAreEqual(workspace.title, "Default", "Incorrect service doc title");
-
- var expectedCollections;
- expectedCollections = [
- { expectedHref: "http://services.odata.org/OData/OData.svc/Products", expectedTitle: "Products" },
- { expectedHref: "http://services.odata.org/OData/OData.svc/Categories", expectedTitle: "Categories" },
- { expectedHref: "http://services.odata.org/OData/OData.svc/Suppliers", expectedTitle: "Suppliers" }
- ];
-
- djstest.assertAreEqual(workspace.collections.length, expectedCollections.length, "Incorrect number of collections in workspace");
-
- var i, len;
- for (i = 0, len = expectedCollections.length; i < len; i++) {
- djstest.assertAreEqual(workspace.collections[i].href, expectedCollections[i].expectedHref, "Incorrect href on collection");
- djstest.assertAreEqual(workspace.collections[i].title, expectedCollections[i].expectedTitle, "Incorrect title on collection");
- }
-
- workspace = serviceDoc.workspaces[1];
- djstest.assertAreEqual(workspace.title, "Second Workspace", "Incorrect service doc title");
-
- expectedCollections = [
- { expectedHref: "http://services.odata.org/OData/OData.svc/Collection1", expectedTitle: "Collection Number 1" },
- { expectedHref: "http://services.odata.org/OData/OData.svc/Collection2", expectedTitle: "Collection Number 2" }
- ];
-
- djstest.assertAreEqual(workspace.collections.length, expectedCollections.length, "Incorrect number of collections in workspace");
-
- for (i = 0, len = expectedCollections.length; i < len; i++) {
- djstest.assertAreEqual(workspace.collections[i].href, expectedCollections[i].expectedHref, "Incorrect href on collection");
- djstest.assertAreEqual(workspace.collections[i].title, expectedCollections[i].expectedTitle, "Incorrect title on collection");
- }
-
- djstest.done();
- });
-
- djstest.addFullTest(true, function testCollectionTitlesAndHrefsMayBeDifferent() {
- var serviceDocString = "\
- <service xml:base=\"http://services.odata.org/OData/OData.svc/\" \r\n\
- xmlns:atom=\"http://www.w3.org/2005/Atom\" \r\n\
- xmlns:app=\"http://www.w3.org/2007/app\" \r\n\
- xmlns=\"http://www.w3.org/2007/app\">\r\n\
- <workspace>\r\n\
- <atom:title>Default</atom:title> \r\n\
- <collection href=\"abc\">\r\n\
- <atom:title>xyz</atom:title> \r\n\
- </collection>\r\n\
- <collection href=\"blah\">\r\n\
- <atom:title>foo</atom:title> \r\n\
- </collection>\r\n\
- </workspace>\r\n\
- </service>\r\n";
-
- var serviceDoc = OData.atomParser(OData.atomHandler, serviceDocString, {});
-
- djstest.assertAreEqual(serviceDoc.workspaces.length, 1, "Incorrect number of workspaces");
-
- var workspace = serviceDoc.workspaces[0];
- djstest.assertAreEqual(workspace.title, "Default", "Incorrect service doc title");
-
- var expectedCollections = [
- { expectedHref: "http://services.odata.org/OData/OData.svc/abc", expectedTitle: "xyz" },
- { expectedHref: "http://services.odata.org/OData/OData.svc/blah", expectedTitle: "foo" }
- ];
-
- djstest.assertAreEqual(workspace.collections.length, expectedCollections.length, "Incorrect number of collections in workspace");
-
- var i, len;
- for (i = 0, len = expectedCollections.length; i < len; i++) {
- djstest.assertAreEqual(workspace.collections[i].href, expectedCollections[i].expectedHref, "Incorrect href on collection");
- djstest.assertAreEqual(workspace.collections[i].title, expectedCollections[i].expectedTitle, "Incorrect title on collection");
- }
-
- djstest.done();
- });
-
- djstest.addFullTest(true, function testParserShouldTreatMissingWorkspaceTitleAsBlank() {
- // Per RFC 5023 Section 8.3.2.1, the workspace element MUST have a title but
- // in the interests of being permissive, we should treat this as blank.
- var serviceDocString = "\
- <service xml:base=\"http://services.odata.org/OData/OData.svc/\" \r\n\
- xmlns:atom=\"http://www.w3.org/2005/Atom\" \r\n\
- xmlns:app=\"http://www.w3.org/2007/app\" \r\n\
- xmlns=\"http://www.w3.org/2007/app\">\r\n\
- <workspace>\r\n\
- <!-- No workspace title element -->\r\n\
- <collection href=\"Products\">\r\n\
- <atom:title>Products</atom:title> \r\n\
- </collection>\r\n\
- <collection href=\"Categories\">\r\n\
- <atom:title>Categories</atom:title> \r\n\
- </collection>\r\n\
- <collection href=\"Suppliers\">\r\n\
- <atom:title>Suppliers</atom:title> \r\n\
- </collection>\r\n\
- </workspace>\r\n\
- </service>\r\n";
-
- var serviceDoc = OData.atomParser(OData.atomHandler, serviceDocString, {});
-
- djstest.assertAreEqual(serviceDoc.workspaces.length, 1, "Incorrect number of workspaces");
-
- var workspace = serviceDoc.workspaces[0];
- djstest.assertAreEqual(workspace.title, "", "Incorrect service doc title");
-
- djstest.done();
- });
-
- djstest.addFullTest(true, function testWorkspaceMayHaveNoCollections() {
- var serviceDocString = "\
- <service xml:base=\"http://services.odata.org/OData/OData.svc/\" \r\n\
- xmlns:atom=\"http://www.w3.org/2005/Atom\" \r\n\
- xmlns:app=\"http://www.w3.org/2007/app\" \r\n\
- xmlns=\"http://www.w3.org/2007/app\">\r\n\
- <workspace>\r\n\
- <atom:title>Default</atom:title> \r\n\
- </workspace>\r\n\
- </service>\r\n";
-
- var serviceDoc = OData.atomParser(OData.atomHandler, serviceDocString, {});
-
- djstest.assertAreEqual(serviceDoc.workspaces.length, 1, "Incorrect number of workspaces");
-
- var workspace = serviceDoc.workspaces[0];
- var expectedCollections = [];
-
- djstest.assertAreEqual(workspace.collections.length, expectedCollections.length, "Incorrect number of collections in workspace");
-
- djstest.done();
- });
-
- djstest.addFullTest(true, function testCollectionMustHaveTitleElement() {
- var serviceDocString = "\
- <service xml:base=\"http://services.odata.org/OData/OData.svc/\" \r\n\
- xmlns:atom=\"http://www.w3.org/2005/Atom\" \r\n\
- xmlns:app=\"http://www.w3.org/2007/app\" \r\n\
- xmlns=\"http://www.w3.org/2007/app\">\r\n\
- <workspace>\r\n\
- <atom:title>Default</atom:title> \r\n\
- <collection href=\"Products\">\r\n\
- <!-- No title element -->\r\n\
- </collection>\r\n\
- </workspace>\r\n\
- </service>\r\n";
-
- djstest.expectException(function () {
- var serviceDoc = OData.atomParser(OData.atomHandler, serviceDocString, {});
- }, "Parsing service doc with a collection with no title element");
-
- djstest.done();
- });
-
- djstest.addFullTest(true, function testCollectionMustHaveHrefAttribute() {
- var serviceDocString = "\
- <service xml:base=\"http://services.odata.org/OData/OData.svc/\" \r\n\
- xmlns:atom=\"http://www.w3.org/2005/Atom\" \r\n\
- xmlns:app=\"http://www.w3.org/2007/app\" \r\n\
- xmlns=\"http://www.w3.org/2007/app\">\r\n\
- <workspace>\r\n\
- <atom:title>Default</atom:title> \r\n\
- <!-- href attribute missing below --> \r\n\
- <collection>\r\n\
- <atom:title>Products</atom:title> \r\n\
- </collection>\r\n\
- </workspace>\r\n\
- </service>\r\n";
-
- djstest.expectException(function () {
- var serviceDoc = OData.atomParser(OData.atomHandler, serviceDocString, {});
- }, "Parsing service doc with a collection with no href attribute");
-
- djstest.done();
- });
-
- djstest.addFullTest(true, function atomReadDocumentTest() {
- var emptyServiceString = "\
- <service xml:base=\"http://services.odata.org/OData/OData.svc/\" \r\n\
- xmlns:atom=\"http://www.w3.org/2005/Atom\" \r\n\
- xmlns:app=\"http://www.w3.org/2007/app\" \r\n\
- xmlns=\"http://www.w3.org/2007/app\">\r\n\
- <workspace>\r\n\
- <atom:title>empty service</atom:title> \r\n\
- </workspace>\r\n\
- </service>\r\n";
-
- var emptyFeedString = "\
- <feed xml:base=\'http://services.odata.org/OData/OData.svc/\' \r\n\
- xmlns:app=\'http://www.w3.org/2007/app\' \r\n\
- xmlns=\'http://www.w3.org/2005/Atom\'> \r\n\
- <id>feed id</id> \r\n\
- <title>empty feed</title> \r\n\
- </feed> \r\n";
-
- var emptyEntryString = "\
- <entry xml:base=\'http://services.odata.org/OData/OData.svc/\' \r\n\
- xmlns:app=\'http://www.w3.org/2007/app\' \r\n\
- xmlns=\'http://www.w3.org/2005/Atom\'> \r\n\
- <id>entry id</id> \r\n\
- <title>empty entry</title> \r\n\
- </entry> \r\n";
-
- var nonAtomString = "\
- <notAtom xml:base=\'http://services.odata.org/OData/OData.svc/\' \r\n\
- xmlns:app=\'http://www.w3.org/2007/app\' \r\n\
- xmlns=\'http://www.w3.org/2005/Atom\'> \r\n\
- <id>entry id</id> \r\n\
- <title>empty entry</title> \r\n\
- </notAtom> \r\n";
-
- var service = OData.atomReadDocument(odatajs.xmlParse(emptyServiceString).documentElement);
- var feed = OData.atomReadDocument(odatajs.xmlParse(emptyFeedString).documentElement);
- var entry = OData.atomReadDocument(odatajs.xmlParse(emptyEntryString).documentElement);
- var nonAtom = OData.atomReadDocument(odatajs.xmlParse(nonAtomString).documentElement);
-
- djstest.assert(service && service.workspaces.length === 1, "atomReadDocument deserialized a service document");
- djstest.assert(feed && feed.results.length === 0, "atomReadDocument deserialized a feed document");
- djstest.assert(entry && !entry.results && entry.__metadata.uri === "http://services.odata.org/OData/OData.svc/entry id", "atomReadDocument deserialized a entry document");
- djstest.assertAreEqual(nonAtom, undefined, "atomReadDocument returns undefined with non Atom input");
-
- djstest.done();
- });
-
- djstest.addFullTest(true, function atomReadFeedWithActionsAndFunctionsTest() {
- var feed = "\r\n\
- <feed xml:base='http://services.odata.org/OData/OData.svc/' \r\n\
- xmlns:app='http://www.w3.org/2007/app' \r\n\
- xmlns:m='http://schemas.microsoft.com/ado/2007/08/dataservices/metadata' \r\n\
- xmlns:me='http://myExtensions' \r\n\
- xmlns='http://www.w3.org/2005/Atom'> \r\n\
- <id>feed id</id> \r\n\
- <title>test feed</title> \r\n\
- <m:action metadata='#EntityContainer.Action1' title='Action1' target='http://service/entities(0)/action' /> \r\n\
- <m:action metadata='#EntityContainer.Action2' title='Action2' target='entities(0)/action2'/> \r\n\
- <m:action metadata='http://someService/$metadata#Container.Action1' title='Action1' target='http://someService/action' /> \r\n\
- <m:function metadata='#EntityContainer.Function1' title='Function1' target='http://service/entities(0)/function' /> \r\n\
- <m:function metadata='#EntityContainer.Function2' title='Function2' target='entities(0)/function2' /> \r\n\
- <m:function metadata='http://someService/$metadata#Container.Function1' title='Function1' target='http://someService/function' /> \r\n\
- </feed> \r\n";
-
- var expected = {
- __metadata: {
- uri: "http://services.odata.org/OData/OData.svc/feed id",
- uri_extensions: [],
- title: "test feed",
- title_extensions: [],
- feed_extensions: [],
- actions: [
- {
- metadata: "#EntityContainer.Action1",
- title: "Action1",
- target: "http://service/entities(0)/action",
- extensions: []
- },
- {
- metadata: "#EntityContainer.Action2",
- title: "Action2",
- target: "http://services.odata.org/OData/OData.svc/entities(0)/action2",
- extensions: []
- },
- {
- metadata: "http://someService/$metadata#Container.Action1",
- title: "Action1",
- target: "http://someService/action",
- extensions: []
- }
- ],
- functions: [
- {
- metadata: "#EntityContainer.Function1",
- title: "Function1",
- target: "http://service/entities(0)/function",
- extensions: []
- },
- {
- metadata: "#EntityContainer.Function2",
- title: "Function2",
- target: "http://services.odata.org/OData/OData.svc/entities(0)/function2",
- extensions: []
- },
- {
- metadata: "http://someService/$metadata#Container.Function1",
- title: "Function1",
- target: "http://someService/function",
- extensions: []
- }
- ]
- },
- results: []
- };
-
- var response = { headers: { "Content-Type": "application/atom+xml", "OData-Version": "4.0" }, body: feed };
-
- OData.atomHandler.read(response);
- djstest.assertAreEqualDeep(response.data, expected, "atomReadEntry didn't return the expected entry object");
- djstest.done();
- });
-
- djstest.addFullTest(true, function atomReadFeedExtensionsTest() {
- var feedWithExtensionsString = "\
- <feed xml:base=\'http://services.odata.org/OData/OData.svc/\' \r\n\
- xmlns:app=\'http://www.w3.org/2007/app\' \r\n\
- xmlns:me=\'http://myExtensions' \r\n\
- xmlns=\'http://www.w3.org/2005/Atom\' attr1=\'a1\' me:attr2=\'a2\'> \r\n\
- <me:element1>e1</me:element1> \r\n\
- <me:element2> \r\n\
- <me:element21 attr3=\'a3\' me:attr4=\'a4\' >e1</me:element21> \r\n\
- </me:element2> \r\n\
- <id>feed id</id> \r\n\
- <title>test feed</title> \r\n\
- </feed> \r\n"
-
- var feed = OData.atomReadFeed(odatajs.xmlParse(feedWithExtensionsString).documentElement);
- djstest.assert(feed, "atomReadFeed didn't return a feed object for a payload with feed extensions");
- djstest.assertAreEqual(feed.__metadata.feed_extensions.length, 4, "atomReadFeed didn't return the expected number of extensions");
-
- djstest.done();
- });
-
- djstest.addFullTest(true, function atomReadFeedLinksTest() {
- var feedLinksString = "\
- <feed xml:base=\'http://services.odata.org/OData/OData.svc/\' \r\n\
- xmlns:app=\'http://www.w3.org/2007/app\' \r\n\
- xmlns:me=\'http://myExtensions\' \r\n\
- xmlns=\'http://www.w3.org/2005/Atom\'> \r\n\
- <link rel=\'next\' href=\'http://nexturi\' me:attr1=\'a1\' attr2=\'a2\'/> \r\n\
- <link rel=\'self\' href=\'http://selfuri\' me:attr3=\'a1\' attr4=\'a2\'/> \r\n\
- <link rel=\'alternate\' href=\'http://otheruri\'/> \r\n\
- </feed> \r\n";
-
- var root = odatajs.xmlParse(feedLinksString).documentElement;
- var feed = { __metadata: {} };
- odatajs.xmlChildElements(root, function (child) {
- OData.atomReadFeedLink(child, feed);
- });
-
- djstest.assertAreEqual(feed.__next, "http://nexturi", "atomReadFeedLink didn't read the next link element");
- djstest.assertAreEqual(feed.__metadata.next_extensions.length, 2, "atomReadFeedLink didn't return the expected number of next link extensions");
- djstest.assertAreEqual(feed.__metadata.self, "http://selfuri", "atomReadFeedLink didn't read the self link element");
- djstest.assertAreEqual(feed.__metadata.self_extensions.length, 2, "atomReadFeedLink didn't return the expected number of self link extensions");
-
- djstest.done();
- });
-
- djstest.addFullTest(true, function atomReadLinkTest() {
- var linkString = "\
- <link xmlns:me=\'http://myExtensions\' \r\n\
- xmlns=\'http://www.w3.org/2005/Atom\' \r\n\
- rel=\'next\' \r\n\
- href=\'http://nexturi\' \r\n\
- type=\'application/atom+xml;type=feed\' \r\n\
- me:attr1=\'a1\' \r\n\
- attr2=\'a2\'/> \r\n";
-
- var link = OData.atomReadLink(odatajs.xmlParse(linkString).documentElement);
-
- djstest.assert(link, "atomReadLink didn't return a link object");
- djstest.assertAreEqual(link.href, "http://nexturi", "atomReadLink, link object href field has an unexpected value");
- djstest.assertAreEqual(link.rel, "next", "atomReadLink, link object rel field has an unexpected value");
- djstest.assertAreEqual(link.type, "application/atom+xml;type=feed", "atomReadLink, link object type field has an unexpected value");
- djstest.assertAreEqual(link.extensions.length, 2, "atomReadLink, link object extensions doesn't have the expected number of extensions");
-
- djstest.done();
-
- });
-
- djstest.addFullTest(true, function atomReadLinkThrowHrefMissingTest() {
- var linkString = "\
- <link xmlns:me=\'http://myExtensions\' \r\n\
- xmlns=\'http://www.w3.org/2005/Atom\' \r\n\
- rel=\'next\' \r\n\
- type=\'application/atom+xml;type=feed\' \r\n\
- me:attr1=\'a1\' \r\n\
- attr2=\'a2\'/> \r\n";
-
-
- var linkRoot = odatajs.xmlParse(linkString).documentElement;
- djstest.expectException(function () {
- OData.atomReadLink(linkRoot);
- }, "atomReadLink didn't throw an exception when the link doesn't have the href attribute");
- djstest.done();
-
- });
-
- djstest.addFullTest(true, function atomReadExtensionElementTest() {
- var extensionString = "\
- <me:ext xmlns:me=\'http://myExtensions\' me:attr1=\'a1\' attr2=\'a2\'> \r\n\
- <ext>e1</ext> \r\n\
- </me:ext> \r\n";
-
- var validateExtension = function (ext, name, namespaceURI, attributeCount, childrenCount, value) {
- djstest.assertAreEqual(ext.name, name, "atomReadExtensionElement, extension object name field has an unexpected value");
- djstest.assertAreEqual(ext.namespaceURI, namespaceURI, "atomReadExtensionElement, extension object namespaceURI field has an unexpected value");
- djstest.assertAreEqual(ext.attributes.length, attributeCount, "atomReadExtensionElement, extension object attributes doesn't have the expected number of attributes");
- djstest.assertAreEqual(ext.children.length, childrenCount, "atomReadExtensionElement, extension object attributes doesn't have the expected number of children");
- djstest.assertAreEqual(ext.value, value, "atomReadExtensionElement, extension object value field has an unexpected value");
- };
-
- var extension = OData.atomReadExtensionElement(odatajs.xmlParse(extensionString).documentElement);
- validateExtension(extension, "ext", "http://myExtensions", 2, 1);
-
- extension = extension.children[0];
- validateExtension(extension, "ext", null, 0, 0, "e1");
-
- djstest.done();
- });
-
- djstest.addFullTest(true, function atomReadExtensionAttributesTest() {
- var extensionString = "\
- <me:ext xmlns:me=\'http://myExtensions\' me:attr1=\'a1\' attr2=\'a2\' /> \r\n";
-
- var extensionAttributes = OData.atomReadExtensionAttributes(odatajs.xmlParse(extensionString).documentElement);
- djstest.assertAreEqual(extensionAttributes.length, 2, "atomReadExtensionAttribute, returned collection doesn't have the expected number of attributes");
- djstest.done();
- });
-
- djstest.addFullTest(true, function atomReadExtensionAttributeTest() {
-
- var tests = {
- "extension with namespace": {
- i: '<me:ext xmlns:me="http://myExtensions" me:attr1="a1" />',
- e: { name: "attr1", namespaceURI: "http://myExtensions", value: "a1" }
- },
- "extension without namespace": {
- i: '<me:ext xmlns:me="http://myExtensions" attr2="a2" />',
- e: { name: "attr2", namespaceURI: null, value: "a2" }
- }
- };
-
- for (var name in tests) {
- var test = tests[name];
- var xmlElement = odatajs.xmlParse(test.i).documentElement;
- var extensions = OData.atomReadExtensionAttributes(xmlElement);
-
- djstest.assertAreEqualDeep(extensions[0], test.e, name + " - extension object is the expected one");
- }
- djstest.done();
- });
-
- djstest.addFullTest(true, function atomReadEntryTest() {
- var entryString = "\
- <entry xml:base=\'http://services.odata.org/OData/OData.svc/\' \r\n\
- xmlns:d2=\'http://schemas.microsoft.com/ado/2007/08/dataservices\' \r\n\
- xmlns:m2=\'http://schemas.microsoft.com/ado/2007/08/dataservices/metadata\' \r\n\
- xmlns:atom=\'http://www.w3.org/2005/Atom\' \r\n\
- xmlns:app=\'http://www.w3.org/2007/app\' \r\n\
- xmlns=\'http://www.w3.org/2005/Atom\'> \r\n\
- <id>the id</id> \r\n\
- <category term=\'the type\' \r\n\
- scheme=\'http://schemas.microsoft.com/ado/2007/08/dataservices/scheme\' /> \r\n\
- <content type=\'application/xml\'> \r\n\
- <m2:properties xmlns=\'http://schemas.microsoft.com/ado/2007/08/dataservices\'>\r\n\
- <Untyped>untyped value</Untyped> \r\n\
- <Typed m2:type='Edm.Int32'>100</Typed> \r\n\
- </m2:properties> \r\n\
- </content> \r\n\
- <link rel=\'self\' href=\'http://selfuri\' /> \r\n\
- </entry>\r\n";
-
- var expectedEntry = {
- __metadata: {
- uri: "http://services.odata.org/OData/OData.svc/the id",
- uri_extensions: [],
- type: "the type",
- type_extensions: [],
- self: "http://selfuri",
- self_link_extensions: [],
- properties: {
- Untyped: {
- type: "Edm.String",
- extensions: []
- },
- Typed: {
- type: "Edm.Int32",
- extensions: []
- }
- }
- },
- Untyped: "untyped value",
- Typed: 100
- };
-
- var entry = OData.atomReadEntry(odatajs.xmlParse(entryString).documentElement);
-
- djstest.assert(entry, "atomReadEntry didn't return an entry object");
- djstest.assertAreEqualDeep(entry, expectedEntry);
- djstest.done();
- });
-
- djstest.addFullTest(true, function atomReadEntryGmlCRSValueTest() {
- var entryXml =
- "<entry \r\n\
- xmlns:m='http://schemas.microsoft.com/ado/2007/08/dataservices/metadata' \r\n\
- xmlns='http://www.w3.org/2005/Atom'> \r\n\
- <content type='application/xml'> \r\n\
- <m:properties xmlns='http://schemas.microsoft.com/ado/2007/08/dataservices' \r\n\
- xmlns:gml='http://www.opengis.net/gml'> \r\n\
- <PointQualified> \r\n\
- <gml:Point gml:srsName='http://www.opengis.net/def/crs/EPSG/0/1234'> \r\n\
- <gml:pos>1 2 3 4</gml:pos> \r\n\
- </gml:Point> \r\n\
- </PointQualified> \r\n\
- <PointUnQualified> \r\n\
- <gml:Point srsName='http://www.opengis.net/def/crs/EPSG/0/5678'> \r\n\
- <gml:pos>5 6 7 8</gml:pos> \r\n\
- </gml:Point> \r\n\
- </PointUnQualified> \r\n\
- </m:properties> \r\n\
- </content> \r\n\
- </entry>";
-
- var entry = {
- __metadata: {
- properties: {
- PointQualified: { type: "Edm.Geometry", extensions: [] },
- PointUnQualified: { type: "Edm.Geometry", extensions: [] }
- }
- },
- PointQualified: {
- __metadata: { type: "Edm.Geometry" },
- crs: {
- type: "name",
- properties: {
- name: "EPSG:1234"
- }
- },
- type: "Point",
- coordinates: [1, 2, 3, 4]
- },
- PointUnQualified: {
- __metadata: { type: "Edm.Geometry" },
- crs: {
- type: "name",
- properties: {
- name: "EPSG:5678"
- }
- },
- type: "Point",
- coordinates: [5, 6, 7, 8]
- }
- };
-
- var response = { headers: { "Content-Type": "application/atom+xml" }, body: entryXml };
-
- OData.atomHandler.read(response);
- djstest.assertAreEqualDeep(response.data, entry, "Entry was read successfully");
- djstest.done();
- });
-
- djstest.addFullTest(true, function atomReadEntryGmlUnknownCRSValueThrowsTest() {
- var entryXml =
- "<entry \r\n\
- xmlns:m='http://schemas.microsoft.com/ado/2007/08/dataservices/metadata' \r\n\
- xmlns='http://www.w3.org/2005/Atom'> \r\n\
- <content type='application/xml'> \r\n\
- <m:properties xmlns='http://schemas.microsoft.com/ado/2007/08/dataservices' \r\n\
- xmlns:gml='http://www.opengis.net/gml'> \r\n\
- <Point> \r\n\
- <gml:Point srsName='http://www.opengis.net/def/crs/EPSG/1/1234'> \r\n\
- <gml:pos>1 2 3 4</gml:pos> \r\n\
- </gml:Point> \r\n\
- </Point> \r\n\
- </m:properties> \r\n\
- </content> \r\n\
- </entry>";
-
- var response = { headers: { "Content-Type": "application/atom+xml" }, body: entryXml };
-
- try {
- OData.atomHandler.read(response);
- djstest.fail("An exception was expected");
- } catch (e) {
- djstest.assert(e.message.indexOf("Unsupported srs name:") === 0, "Error is the expected one");
- }
- djstest.done();
- });
-
- djstest.addFullTest(true, function atomReadEntryGmlPointValueTest() {
- var entryXml =
- "<entry \r\n\
- xmlns:m='http://schemas.microsoft.com/ado/2007/08/dataservices/metadata' \r\n\
- xmlns='http://www.w3.org/2005/Atom'> \r\n\
- <content type='application/xml'> \r\n\
- <m:properties xmlns='http://schemas.microsoft.com/ado/2007/08/dataservices' \r\n\
- xmlns:gml='http://www.opengis.net/gml'> \r\n\
- <Point> \r\n\
- <gml:Point> \r\n\
- <gml:pos>1 2 -3 4</gml:pos> \r\n\
- </gml:Point> \r\n\
- </Point> \r\n\
- <PointWithExtraTags> \r\n\
- <gml:Point> \r\n\
- <gml:name>the point</gml:name> \r\n\
- <gml:pos>5 6 7 8</gml:pos> \r\n\
- </gml:Point> \r\n\
- </PointWithExtraTags> \r\n\
- <EmptyPoint > \r\n\
- <gml:Point> \r\n\
- <gml:pos/> \r\n\
- </gml:Point> \r\n\
- </EmptyPoint> \r\n\
- <PointWithSpacesInValue> \r\n\
- <gml:Point> \r\n\
- <gml:pos> 8 9 10 11 12 </gml:pos> \r\n\
- </gml:Point> \r\n\
- </PointWithSpacesInValue> \r\n\
- <PointWithSingleValue> \r\n\
- <gml:Point> \r\n\
- <gml:pos>13</gml:pos> \r\n\
- </gml:Point> \r\n\
- </PointWithSingleValue> \r\n\
- <PointWithSingleValueAndSpaces> \r\n\
- <gml:Point> \r\n\
- <gml:pos> 14 </gml:pos> \r\n\
- </gml:Point> \r\n\
- </PointWithSingleValueAndSpaces> \r\n\
- </m:properties> \r\n\
- </content> \r\n\
- </entry>";
-
- var entry = {
- __metadata: {
- properties: {
- Point: { type: "Edm.Geometry", extensions: [] },
- PointWithExtraTags: { type: "Edm.Geometry", extensions: [] },
- EmptyPoint: { type: "Edm.Geometry", extensions: [] },
- PointWithSpacesInValue: { type: "Edm.Geometry", extensions: [] },
- PointWithSingleValue: { type: "Edm.Geometry", extensions: [] },
- PointWithSingleValueAndSpaces: { type: "Edm.Geometry", extensions: [] }
- }
- },
- Point: {
- __metadata: { type: "Edm.Geometry" },
- type: "Point",
- coordinates: [1, 2, -3, 4]
- },
- PointWithExtraTags: {
- __metadata: { type: "Edm.Geometry" },
- type: "Point",
- coordinates: [5, 6, 7, 8]
- },
- EmptyPoint: {
- __metadata: { type: "Edm.Geometry" },
- type: "Point",
- coordinates: []
- },
- PointWithSpacesInValue: {
- __metadata: { type: "Edm.Geometry" },
- type: "Point",
- coordinates: [8, 9, 10, 11, 12]
- },
- PointWithSingleValue: {
- __metadata: { type: "Edm.Geometry" },
- type: "Point",
- coordinates: [13]
- },
- PointWithSingleValueAndSpaces: {
- __metadata: { type: "Edm.Geometry" },
- type: "Point",
- coordinates: [14]
- }
- };
-
- var response = { headers: { "Content-Type": "application/atom+xml" }, body: entryXml };
-
- OData.atomHandler.read(response);
- djstest.assertAreEqualDeep(response.data, entry, "Entry was read successfully");
- djstest.done();
- });
-
- djstest.addFullTest(true, function atomReadEntryGmlLineStringValueTest() {
- var entryXml =
- "<entry \r\n\
- xmlns:m='http://schemas.microsoft.com/ado/2007/08/dataservices/metadata' \r\n\
- xmlns='http://www.w3.org/2005/Atom'> \r\n\
- <content type='application/xml'> \r\n\
- <m:properties xmlns='http://schemas.microsoft.com/ado/2007/08/dataservices' \r\n\
- xmlns:gml='http://www.opengis.net/gml'> \r\n\
- <LineStringExtraTags> \r\n\
- <gml:LineString> \r\n\
- <gml:name>the line</gml:name> \r\n\
- <gml:posList>1.0 2.0 3.0 4.0</gml:posList> \r\n\
- </gml:LineString> \r\n\
- </LineStringExtraTags> \r\n\
- <LineStringPosList> \r\n\
- <gml:LineString> \r\n\
- <gml:posList>5.0 6.0 7.0 8.0</gml:posList> \r\n\
- </gml:LineString> \r\n\
- </LineStringPosList> \r\n\
- <LineStringEmptyPosList> \r\n\
- <gml:LineString> \r\n\
- <gml:posList/> \r\n\
- </gml:LineString> \r\n\
- </LineStringEmptyPosList> \r\n\
- <LineStringPosAndPoint> \r\n\
- <gml:LineString> \r\n\
- <gml:pos>7 8</gml:pos> \r\n\
- <gml:pointProperty> \r\n\
- <gml:Point> \r\n\
- <gml:pos>9 10 11 12</gml:pos> \r\n\
- </gml:Point> \r\n\
- </gml:pointProperty> \r\n\
- </gml:LineString> \r\n\
- </LineStringPosAndPoint> \r\n\
- <LineStringEmptyPosAndPoint> \r\n\
- <gml:LineString> \r\n\
- <gml:pos/> \r\n\
- <gml:pointProperty> \r\n\
- <gml:Point> \r\n\
- <gml:pos/> \r\n\
- </gml:Point> \r\n\
- </gml:pointProperty> \r\n\
- </gml:LineString> \r\n\
- </LineStringEmptyPosAndPoint> \r\n\
- </m:properties> \r\n\
- </content> \r\n\
- </entry>";
-
- var entry = {
- __metadata: {
- properties: {
- LineStringExtraTags: { type: "Edm.Geometry", extensions: [] },
- LineStringPosList: { type: "Edm.Geometry", extensions: [] },
- LineStringEmptyPosList: { type: "Edm.Geometry", extensions: [] },
- LineStringPosAndPoint: { type: "Edm.Geometry", extensions: [] },
- LineStringEmptyPosAndPoint: { type: "Edm.Geometry", extensions: [] }
- }
- },
- LineStringExtraTags: {
- __metadata: { type: "Edm.Geometry" },
- type: "LineString",
- coordinates: [[1, 2], [3, 4]]
- },
- LineStringPosList: {
- __metadat
<TRUNCATED>
[08/22] olingo-odata4-js git commit: [OLINGO-442] Cleanup bevor
release
Posted by ko...@apache.org.
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/odata-batch-functional-tests.html
----------------------------------------------------------------------
diff --git a/JSLib/tests/odata-batch-functional-tests.html b/JSLib/tests/odata-batch-functional-tests.html
deleted file mode 100644
index c2c3759..0000000
--- a/JSLib/tests/odata-batch-functional-tests.html
+++ /dev/null
@@ -1,43 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
- <title>batch tests</title>
- <meta http-equiv="cache-control" content="no-cache" />
- <meta http-equiv="pragma" content="no-cache" />
- <meta http-equiv="expires" content="-1" />
- <link rel="stylesheet" href="http://code.jquery.com/qunit/qunit-1.10.0.css" type="text/css" />
- <script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/json2/20110223/json2.js"></script>
- <script type="text/javascript" src="http://code.jquery.com/jquery-1.4.4.min.js"></script>
- <script type="text/javascript" src="http://code.jquery.com/qunit/qunit-1.10.0.js"></script>
- <script type="text/javascript" src="common/ODataReadOracle.js"></script>
- <script type="text/javascript" src="common/TestSynchronizerClient.js"></script>
- <script type="text/javascript">
- window.TestSynchronizer.init(QUnit);
- </script>
-
- <script type="text/javascript" src="../src/datajs.js"></script>
- <script type="text/javascript" src="../src/utils.js"></script>
- <script type="text/javascript" src="../src/xml.js"></script>
-
- <script type="text/javascript" src="../src/odata-utils.js"></script>
- <script type="text/javascript" src="../src/odata-handler.js"></script>
- <script type="text/javascript" src="../src/odata-gml.js"></script>
- <script type="text/javascript" src="../src/odata-xml.js"></script>
- <script type="text/javascript" src="../src/odata-net.js"></script>
- <script type="text/javascript" src="../src/odata-json-light.js"></script>
- <script type="text/javascript" src="../src/odata-json.js"></script>
- <script type="text/javascript" src="../src/odata-atom.js"></script>
- <script type="text/javascript" src="../src/odata-metadata.js"></script>
- <script type="text/javascript" src="../src/odata-batch.js"></script>
- <script type="text/javascript" src="../src/odata.js"></script>
-
- <script type="text/javascript" src="common/djstest.js"></script>
- <script type="text/javascript" src="odata-batch-functional-tests.js"></script>
-</head>
-<body>
- <h1 id="qunit-header">batch tests</h1>
- <h2 id="qunit-banner"></h2>
- <h2 id="qunit-userAgent"></h2>
- <ol id="qunit-tests"></ol>
-</body>
-</html>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/odata-batch-functional-tests.js
----------------------------------------------------------------------
diff --git a/JSLib/tests/odata-batch-functional-tests.js b/JSLib/tests/odata-batch-functional-tests.js
deleted file mode 100644
index 8fa648e..0000000
--- a/JSLib/tests/odata-batch-functional-tests.js
+++ /dev/null
@@ -1,270 +0,0 @@
-/// <reference path="common/djstest.js" />
-/// <reference path="../src/odata.js" />
-/// <reference path="../src/odata-batch.js" />
-/// <reference path="common/ODataReadOracle.js" />
-
-(function (window, undefined) {
- OData.defaultHandler.accept = "application/json;q=0.9, application/atomsvc+xml;q=0.8, */*;q=0.1";
-
- var unexpectedErrorHandler = function (err) {
- djstest.assert(false, "Unexpected call to error handler with error: " + djstest.toString(err));
- djstest.done();
- };
-
- var determineExpected = function (batchRequests) {
- var expected = 0;
- $.each(batchRequests, function (_, batchRequest) {
- // 2 assertions per request: response code and data
- if (batchRequest.__changeRequests) {
- expected += batchRequest.__changeRequests.length * 2;
- } else {
- expected += 2;
- }
- });
-
- // 2 more assertions than the number of requests in batch: response code and batch response length
- return expected + 2;
- };
-
- var verifyBatchRequest = function(serviceRoot, batchRequests, elementTypes, done) {
- odatajs.oData.request({ requestUri: serviceRoot + "/$batch", method: "POST", data: { __batchRequests: batchRequests } },
- function(data, response) {
- djstest.assertAreEqual(response.statusCode, httpStatusCode.accepted, "Verify response code");
- djstest.assertAreEqual(data.__batchResponses.length, batchRequests.length, "Verify batch response count");
- verifyBatchResponses(batchRequests, elementTypes, serviceRoot, data.__batchResponses, done);
- },
- unexpectedErrorHandler, OData.batchHandler);
- };
-
- var verifyBatchResponses = function (batchRequests, elementTypes, serviceRoot, batchResponses, done) {
- forEachAsync(batchRequests, function (index, batchRequest, doneOne) {
- if (batchRequest.requestUri) {
- var readFeedOrEntry = elementTypes[index] == "feed" ? ODataReadOracle.readFeed : ODataReadOracle.readEntry;
- djstest.assertAreEqual(batchResponses[index].statusCode, httpStatusCode.ok, "Verify response code for: GET " + batchRequest.requestUri);
- readFeedOrEntry(serviceRoot + "/" + batchRequest.requestUri, function (expectedData) {
- djstest.assertAreEqualDeep(batchResponses[index].data, expectedData, "Verify data for: GET " + batchRequest.requestUri);
- doneOne();
- }, batchRequests[index].headers.Accept);
- }
- else if (batchRequest.__changeRequests) {
- verifyChangeResponses(batchRequest.__changeRequests, batchResponses[index].__changeResponses, function () { doneOne(); });
- }
- }, done);
- }
-
- var verifyChangeResponses = function (changeRequests, changeResponses, done) {
- forEachAsync(changeRequests, function (index, changeRequest, doneOne) {
- var httpOperation = changeRequest.method + " " + changeRequest.requestUri;
- var changeResponse = changeResponses[index];
-
- if (changeRequest.method == "POST") {
- djstest.assertAreEqual(changeResponse.statusCode, httpStatusCode.created, "Verify response code for: " + httpOperation);
- ODataReadOracle.readEntry(changeResponse.headers["Location"], function (expectedData) {
- djstest.assertAreEqualDeep(changeResponse.data, expectedData, "Verify response data for: " + httpOperation);
- doneOne();
- }, changeRequest.headers.Accept);
- }
- else if (changeRequest.method == "PUT") {
- djstest.assertAreEqual(changeResponse.statusCode, httpStatusCode.noContent, "Verify response code for: " + httpOperation);
- djstest.assertAreEqual(changeResponse.body, "", "Verify empty body for: " + httpOperation);
- doneOne();
- }
- else if (changeRequest.method == "DELETE") {
- djstest.assertAreEqual(changeResponse.statusCode, httpStatusCode.noContent, "Verify response code for: " + httpOperation);
- djstest.assertAreEqual(changeResponse.body, "", "Verify empty body for: " + httpOperation);
- doneOne();
- }
- }, done);
- }
-
- var forEachAsync = function (array, callback, done) {
- var count = 0;
- var doneOne = function () {
- count++;
- if (count == array.length) {
- done();
- }
- }
-
- $.each(array, function (index, element) { callback(index, element, doneOne); });
- };
-
- var service = "./endpoints/FoodStoreDataServiceV4.svc";
- var batchUri = service + "/$batch";
-
- var httpStatusCode = {
- ok: 200,
- created: 201,
- accepted: 202,
- noContent: 204
- };
-
- var mimeTypes = [undefined, /*"application/atom+xml",*/ "application/json;odata.metadata=minimal"];
-
- module("Functional", {
- setup: function () {
- djstest.wait(function (done) {
- $.post(service + "/ResetData", done);
- });
- }
- });
-
- $.each(mimeTypes, function (_, mimeType) {
- var acceptHeaders = mimeType ? { Accept: mimeType} : undefined;
- var mimeHeaders = mimeType ? { "Content-Type": mimeType, Accept: mimeType} : undefined;
-
- djstest.addTest(function multipleRetrieves(acceptHeaders) {
- var uriSegments = ["Foods(0)", "Foods?$filter=FoodID eq 1", "Foods?$top=2"];
- var elementTypes = ["entry", "feed", "feed"];
-
- var batchRequests = $.map(uriSegments, function (uriSegment) {
- return { requestUri: uriSegment, method: "GET", headers: acceptHeaders }
- });
-
- djstest.assertsExpected(determineExpected(batchRequests));
- verifyBatchRequest(service, batchRequests, elementTypes, function () { djstest.done(); });
- }, "Multiple retrieves: mimeType = " + mimeType, acceptHeaders);
-
- djstest.addTest(function multipleChangesets(params) {
- var batchRequests = [
- {
- __changeRequests: [
- { requestUri: "Categories", method: "POST", headers: djstest.clone(params.mimeHeaders), data:
- { CategoryID: 42, Name: "New Category" }
- }
- ]
- },
- {
- __changeRequests: [
- { requestUri: "Categories(1)", method: "PUT", headers: djstest.clone(params.mimeHeaders), data:
- { CategoryID: 1, Name: "Updated Category" }
- },
- { requestUri: "Categories(0)", method: "DELETE", headers: djstest.clone(params.acceptHeaders) }
- ]
- }
- ];
- var elementTypes = [null, null];
-
- djstest.assertsExpected(determineExpected(batchRequests));
- verifyBatchRequest(service, batchRequests, elementTypes, function () { djstest.done(); });
- }, "Multiple changesets: mimeType = " + mimeType, { acceptHeaders: acceptHeaders, mimeHeaders: mimeHeaders });
-
- djstest.addTest(function multipleRetrievesAndChangesets(params) {
- // Header needs to be cloned because it is mutable; this means that after processing one request in the batch
- // the header object will be modified
- var batchRequests = [
- { requestUri: "Foods(0)", method: "GET", headers: djstest.clone(params.acceptHeaders) },
- { requestUri: "Foods?$filter=FoodID eq 1", method: "GET", headers: djstest.clone(params.acceptHeaders) },
- {
- __changeRequests: [
- { requestUri: "Categories", method: "POST", headers: djstest.clone(params.mimeHeaders), data:
- { CategoryID: 42, Name: "New Category" }
- }
- ]
- },
- { requestUri: "Foods?$top=2", method: "GET", headers: djstest.clone(params.acceptHeaders) },
- {
- __changeRequests: [
- { requestUri: "Categories(1)", method: "PUT", headers: djstest.clone(params.mimeHeaders), data:
- { CategoryID: 1, Name: "Updated Category" }
- },
- { requestUri: "Categories(0)", method: "DELETE", headers: djstest.clone(params.acceptHeaders) }
- ]
- }
- ];
- var elementTypes = ["entry", "feed", null, "feed", null];
-
- djstest.assertsExpected(determineExpected(batchRequests));
- verifyBatchRequest(service, batchRequests, elementTypes, function () { djstest.done(); });
- }, "Multiple retrieves and changesets: mimeType = " + mimeType, { acceptHeaders: acceptHeaders, mimeHeaders: mimeHeaders });
-
- djstest.addTest(function singleRetrieve(acceptHeaders) {
- var batchRequests = [{ requestUri: "Foods(2)", method: "GET", headers: acceptHeaders}];
- var elementTypes = ["entry"];
-
- djstest.assertsExpected(determineExpected(batchRequests));
- verifyBatchRequest(service, batchRequests, elementTypes, function () { djstest.done(); });
- }, "Single retrieve: mimeType = " + mimeType, acceptHeaders);
-
- djstest.addTest(function singleChangeset(params) {
- var batchRequests = [
- {
- __changeRequests: [
- { requestUri: "Categories", method: "POST", headers: djstest.clone(params.mimeHeaders), data:
- { CategoryID: 42, Name: "New Category" }
- },
- { requestUri: "Categories(1)", method: "PUT", headers: djstest.clone(params.mimeHeaders), data:
- { CategoryID: 1, Name: "Updated Category" }
- }
- ]
- }
- ];
- var elementTypes = [null];
-
- djstest.assertsExpected(determineExpected(batchRequests));
- verifyBatchRequest(service, batchRequests, elementTypes, function () { djstest.done(); });
- }, "Single changeset: mimeType = " + mimeType, { acceptHeaders: acceptHeaders, mimeHeaders: mimeHeaders });
-
- djstest.addTest(function singleRetrieveAndChangeset(params) {
- var batchRequests = [
- { requestUri: "Foods(0)", method: "GET", headers: djstest.clone(params.acceptHeaders) },
- {
- __changeRequests: [
- { requestUri: "Categories", method: "POST", headers: djstest.clone(params.mimeHeaders), data:
- { CategoryID: 42, Name: "New Category" }
- },
- { requestUri: "Categories(1)", method: "PUT", headers: djstest.clone(params.mimeHeaders), data:
- { CategoryID: 1, Name: "Updated Category" }
- }
- ]
- }
- ];
- var elementTypes = ["entry", null];
-
- djstest.assertsExpected(determineExpected(batchRequests));
- verifyBatchRequest(service, batchRequests, elementTypes, function () { djstest.done(); });
- }, "Single retrieve and changeset: mimeType = " + mimeType, { acceptHeaders: acceptHeaders, mimeHeaders: mimeHeaders });
- });
-
- djstest.addTest(function updateOutsideChangeset() {
- var batchRequests = [{ requestUri: "Categories", method: "POST", data: { CategoryID: 42, Name: "New Category"}}];
-
- djstest.assertsExpected(1);
- odatajs.oData.request({ requestUri: batchUri, method: "POST", data: { __batchRequests: batchRequests} },
- function (data, response) {
- djstest.assert(response.body.indexOf("An error occurred while processing this request.") > -1, "Verify response error message");
- djstest.done();
- }, unexpectedErrorHandler, OData.batchHandler
- );
- }, "Update outside changeset");
-
- djstest.addTest(function retrieveInsideChangeset() {
-
- var batchRequests = [
- { requestUri: "Foods(0)", method: "GET" },
- { __changeRequests: [
- { requestUri: "Categories", method: "POST", data: { CategoryID: 42, Name: "New Category"} },
- { requestUri: "Categories(1)", method: "PUT", data: { CategoryID: 1, Name: "Updated Category"} }
- ]
- },
- { requestUri: "Foods(1)", method: "GET" },
- { __changeRequests: [
- { requestUri: "Categories", method: "POST", data: { CategoryID: 42, Name: "New Category"} },
- { requestUri: "Categories(1)", method: "PUT", data: { CategoryID: 1, Name: "Updated Category"} },
- { requestUri: "Foods", method: "GET" }
- ]
- }
- ];
-
- odatajs.oData.request({ requestUri: batchUri, method: "POST", data: { __batchRequests: batchRequests} },
- function (data, response) {
- var batchResponses = data.__batchResponses;
- var error = batchResponses[3].__changeResponses[0];
- djstest.assert(error.response.body.indexOf("An error occurred while processing this request.") > -1, "Response contains expected message");
- // Verify that the responses prior to the error are the expected ones.
- batchRequests.splice(3, 1);
- batchResponses.splice(3, 1);
- verifyBatchResponses(batchRequests, ["entry", null], service, batchResponses, function () { djstest.done(); });
- }, unexpectedErrorHandler, OData.batchHandler);
- }, "Retrieve inside changeset");
-})(this);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/odata-batch-tests.js
----------------------------------------------------------------------
diff --git a/JSLib/tests/odata-batch-tests.js b/JSLib/tests/odata-batch-tests.js
deleted file mode 100644
index 4cb274d..0000000
--- a/JSLib/tests/odata-batch-tests.js
+++ /dev/null
@@ -1,551 +0,0 @@
-/// <reference path="../src/odata-net.js" />
-/// <reference path="../src/odata.js" />
-/// <reference path="common/djstest.js" />
-/// <reference path="common/mockHttpClient.js" />
-
-// odata-batch-tests.js
-
-(function (window, undefined) {
- // DATAJS INTERNAL START
- var defaultAcceptString = "application/json;q=0.9, application/atomsvc+xml;q=0.8, */*;q=0.1";
-
- var testPayload = {
- CategoryID : 42,
- Name: "New Category",
- ID : "odata",
- version: "4.0"
- };
-
- // to do: test Atom payload
- // var atomPayload = OData.atomSerializer(OData.atomHandler, testPayload, { "OData-Version": "4.0" });
- var jsonPayload = OData.jsonSerializer(OData.jsonHandler, testPayload, { "OData-Version": "4.0" });
-
- djstest.addTest(function writeRequestTest() {
- var request = {
- headers: { "Content-Type": "plain/text; charset=utf-8", Accept: "*/*", "OData-Version": "2.0" },
- requestUri: "http://temp.org",
- method: "GET",
- body: "test request"
- };
- var expected = "GET http://temp.org HTTP/1.1\r\n" +
- "Content-Type: plain/text; charset=utf-8\r\n" +
- "Accept: */*\r\n" +
- "OData-Version: 2.0\r\n" +
- "\r\n" +
- "test request";
-
- var actual = OData.writeRequest(request);
- djstest.assertAreEqual(actual, expected, "WriteRequest serializes a request properly");
- djstest.done();
- });
-
- djstest.addTest(function serializeSimpleBatchTest() {
-
- var request = {
- requestUri: "http://temp.org",
- method: "POST",
- data: { __batchRequests: [
- { requestUri: "http://feed(1)", headers: {} },
- { requestUri: "http://feed(2)", headers: { "Accept": "application/json;odata.metadata=minimal" }, method: "GET" }
- ]
- }
- };
-
- var template = "\r\n--<batchBoundary>\r\n" +
- "Content-Type: application/http\r\n" +
- "Content-Transfer-Encoding: binary\r\n" +
- "\r\n" +
- "GET http://feed(1) HTTP/1.1\r\n" +
- "Accept: " + defaultAcceptString + "\r\n" +
- "OData-MaxVersion: 4.0\r\n" +
- "\r\n" +
- "\r\n--<batchBoundary>\r\n" +
- "Content-Type: application/http\r\n" +
- "Content-Transfer-Encoding: binary\r\n" +
- "\r\n" +
- "GET http://feed(2) HTTP/1.1\r\n" +
- "Accept: application/json;odata.metadata=minimal\r\n" +
- "OData-MaxVersion: 4.0\r\n" +
- "\r\n" +
- "\r\n--<batchBoundary>--\r\n";
-
- MockHttpClient.clear().addRequestVerifier(request.requestUri, function (request) {
- var cType = OData.contentType(request.headers["Content-Type"]);
- var boundary = cType.properties["boundary"];
- var expected = template.replace(/<batchBoundary>/g, boundary);
-
- djstest.assert(boundary, "Request content type has its boundary set");
- djstest.assertAreEqual(request.body, expected, "Request body is serialized properly");
- djstest.done();
- });
-
- odatajs.oData.request(request, null, null, OData.batchHandler, MockHttpClient);
- });
-
- djstest.addTest(function serializeComplexBatchTest() {
-
- var request = {
- requestUri: "http://temp.org",
- method: "POST",
- data: { __batchRequests: [
- { requestUri: "http://feed(1)", headers: {} },
- { requestUri: "http://feed(2)", headers: { "Accept": "application/json;odata.metadata=minimal" }, method: "GET" },
- { __changeRequests: [
- { requestUri: "http://feed(1)", headers: {}, method: "POST", data: testPayload }
- // to do: test atom payload
-// { requestUri: "http://feed(2)", headers: { "Content-Type": "application/atom+xml", "OData-Version": "4.0" }, method: "PUT", data: testPayload }//
- ]
- },
- { requestUri: "http://feed(1)", headers: {} }
- ]
- }
- };
-
- //
- var template = "\r\n--<batchBoundary>\r\n" +
- "Content-Type: application/http\r\n" +
- "Content-Transfer-Encoding: binary\r\n" +
- "\r\n" +
- "GET http://feed(1) HTTP/1.1\r\n" +
- "Accept: " + defaultAcceptString + "\r\n" +
- "OData-MaxVersion: 4.0\r\n" +
- "\r\n" +
- "\r\n--<batchBoundary>\r\n" +
- "Content-Type: application/http\r\n" +
- "Content-Transfer-Encoding: binary\r\n" +
- "\r\n" +
- "GET http://feed(2) HTTP/1.1\r\n" +
- "Accept: application/json;odata.metadata=minimal\r\n" +
- "OData-MaxVersion: 4.0\r\n" +
- "\r\n" +
- "\r\n--<batchBoundary>\r\n" +
- "Content-Type: multipart/mixed; boundary=<changesetBoundary>\r\n" +
- "\r\n--<changesetBoundary>\r\n" +
- "Content-Type: application/http\r\n" +
- "Content-Transfer-Encoding: binary\r\n" +
- "\r\n" +
- "POST http://feed(1) HTTP/1.1\r\n" +
- "Accept: " + defaultAcceptString + "\r\n" +
- "OData-Version: 4.0\r\n" +
- "Content-Type: application/json\r\n" +
- "OData-MaxVersion: 4.0\r\n" +
- "\r\n" +
- jsonPayload +
- "\r\n--<changesetBoundary>--\r\n" +
- "\r\n--<batchBoundary>\r\n" +
- "Content-Type: application/http\r\n" +
- "Content-Transfer-Encoding: binary\r\n" +
- "\r\n" +
- "GET http://feed(1) HTTP/1.1\r\n" +
- "Accept: " + defaultAcceptString + "\r\n" +
- "OData-MaxVersion: 4.0\r\n" +
- "\r\n" +
- "\r\n--<batchBoundary>--\r\n";
-
- MockHttpClient.clear().addRequestVerifier(request.requestUri, function (request) {
- // Get the boundaries from the request.
- var start = request.body.indexOf("multipart/mixed");
- var end = request.body.indexOf("\r\n", start);
-
- var csetBoundary = OData.contentType(request.body.substring(start, end)).properties["boundary"];
- var batchBoundary = OData.contentType(request.headers["Content-Type"]).properties["boundary"];
-
- var expected = template.replace(/<batchBoundary>/g, batchBoundary);
- expected = expected.replace(/<changesetBoundary>/g, csetBoundary);
-
- djstest.assert(batchBoundary, "Request content type has its boundary set");
- djstest.assert(csetBoundary, "Changeset content type has its boundary set");
- djstest.assertAreEqual(request.body, expected, "Request body is serialized properly");
- djstest.done();
- });
-
- odatajs.oData.request(request, null, null, OData.batchHandler, MockHttpClient);
- });
-
- djstest.addTest(function serializeChangeSetTest() {
- var request = {
- requestUri: "http://temp.org",
- method: "POST",
- data: {
- __batchRequests: [
- { __changeRequests: [
- { requestUri: "http://feed(1)", headers: {}, method: "POST", data: testPayload }
-// { requestUri: "http://feed(2)", headers: { "Content-Type": "application/atom+xml", "OData-Version": "4.0" }, method: "PUT", data: testPayload }
- ]
- }
- ]
- }
- };
-
- // To do: test atom payload
- var template = "\r\n--<batchBoundary>\r\n" +
- "Content-Type: multipart/mixed; boundary=<changesetBoundary>\r\n" +
- "\r\n--<changesetBoundary>\r\n" +
- "Content-Type: application/http\r\n" +
- "Content-Transfer-Encoding: binary\r\n" +
- "\r\n" +
- "POST http://feed(1) HTTP/1.1\r\n" +
- "Accept: " + defaultAcceptString + "\r\n" +
- "OData-Version: 4.0\r\n" +
- "Content-Type: application/json\r\n" +
- "OData-MaxVersion: 4.0\r\n" +
- "\r\n" +
- jsonPayload +
- "\r\n--<changesetBoundary>--\r\n" +
- "\r\n--<batchBoundary>--\r\n";
-
- MockHttpClient.clear().addRequestVerifier(request.requestUri, function (request) {
- // Get the boundaries from the request.
- var start = request.body.indexOf("multipart/mixed");
- var end = request.body.indexOf("\r\n", start);
-
- var csetBoundary = OData.contentType(request.body.substring(start, end)).properties["boundary"];
- var batchBoundary = OData.contentType(request.headers["Content-Type"]).properties["boundary"];
-
- var expected = template.replace(/<batchBoundary>/g, batchBoundary);
- expected = expected.replace(/<changesetBoundary>/g, csetBoundary);
-
- djstest.assert(batchBoundary, "Request content type has its boundary set");
- djstest.assert(csetBoundary, "Changeset content type has its boundary set");
- djstest.assertAreEqual(request.body, expected, "Request body is serialized properly");
- djstest.done();
- });
-
- odatajs.oData.request(request, null, null, OData.batchHandler, MockHttpClient);
- });
-
- djstest.addTest(function serializeNestedChangeSetsTest() {
- var request = {
- requestUri: "http://temp.org",
- method: "POST",
- data: testPayload
- };
-
- djstest.expectException(function () {
- odatajs.oData.request(request, null, null, OData.batchHandler);
- });
-
- djstest.done();
- });
-
- djstest.addTest(function serializeNonBatchObjectTest() {
- var request = {
- requestUri: "http://temp.org",
- method: "POST",
- data: {
- __batchRequests: [
- { __changeRequests: [
- { __changeRequests: [
- { requestUri: "http://feed(2)", headers: { "Content-Type": "application/json", "OData-Version": "4.0" }, method: "PUT", data: testPayload }
- ]
- }
- ]
- }
- ]
- }
- };
-
- djstest.expectException(function () {
- odatajs.oData.request(request, null, null, OData.batchHandler);
- });
-
- djstest.done();
- });
-
- djstest.addTest(function readSimpleBatchTest() {
- var response = {
- statusCode: 202,
- statusText: "Accepted",
- headers: {
- "Content-Type": "multipart/mixed; boundary=batchresponse_b61ab173-39c7-45ea-ade4-941efae85ab9"
- },
- body: "--batchresponse_b61ab173-39c7-45ea-ade4-941efae85ab9\r\n\
-Content-Type: application/http\r\n\
-Content-Transfer-Encoding: binary\r\n\
-\r\n\
-HTTP/1.1 201 Created\r\n\
-OData-Version: 4.0;\r\n\
-Content-Type: application/json;odata.metadata=minimal;odata.streaming=true;IEEE754Compatible=false;charset=utf-8\r\n\
-X-Content-Type-Options: nosniff\r\n\
-Cache-Control: no-cache\r\n\
-Location: http://localhost:46541/tests/endpoints/FoodStoreDataServiceV4.svc/Categories(42)\r\n\
-\r\n\
-{\"@odata.context\":\"http://localhost:46541/tests/endpoints/FoodStoreDataServiceV4.svc/$metadata#Categories/$entity\",\"Icon@odata.mediaContentType\":\"image/gif\",\"CategoryID\":42,\"Name\":\"New Category\"}\r\n\
---batchresponse_b61ab173-39c7-45ea-ade4-941efae85ab9\r\n\
-Content-Type: application/http\r\n\
-Content-Transfer-Encoding: binary\r\n\
-\r\n\
-HTTP/1.1 201 Created\r\n\
-OData-Version: 4.0;\r\n\
-Content-Type: application/json;odata.metadata=minimal;odata.streaming=true;IEEE754Compatible=false;charset=utf-8\r\n\
-X-Content-Type-Options: nosniff\r\n\
-Cache-Control: no-cache\r\n\
-Location: http://localhost:46541/tests/endpoints/FoodStoreDataServiceV4.svc/Categories(43)\r\n\
-\r\n\
-{\"@odata.context\":\"http://localhost:46541/tests/endpoints/FoodStoreDataServiceV4.svc/$metadata#Categories/$entity\",\"Icon@odata.mediaContentType\":\"image/gif\",\"CategoryID\":43,\"Name\":\"New Category\"}\r\n\
---batchresponse_b61ab173-39c7-45ea-ade4-941efae85ab9--\r\n\
-"
- };
-
- MockHttpClient.clear().addResponse("http://testuri.org", response);
- odatajs.oData.read("http://testuri.org", function (data, response) {
- djstest.assert(data.__batchResponses, "data.__batchResponses is defined");
- djstest.assertAreEqual(data.__batchResponses[0].headers["Location"], "http://localhost:46541/tests/endpoints/FoodStoreDataServiceV4.svc/Categories(42)", "part 1 of the response was read");
- djstest.assertAreEqual(data.__batchResponses[1].headers["Location"], "http://localhost:46541/tests/endpoints/FoodStoreDataServiceV4.svc/Categories(43)", "part 2 of the response was read");
- djstest.assertAreEqual(data.__batchResponses[0].data["CategoryID"], 42, "part 1 data of the response was read");
- djstest.assertAreEqual(data.__batchResponses[1].data["CategoryID"], 43, "part 2 data of the response was read");
- djstest.done();
- }, null, OData.batchHandler, MockHttpClient);
- });
-
- djstest.addTest(function readBatchWithChangesetTest() {
- var response = {
- statusCode: 202,
- statusText: "Accepted",
- headers: {
- "Content-Type": "multipart/mixed; boundary=batchresponse_fb681875-73dc-4e62-9898-a0af89021341"
- },
- body: "--batchresponse_fb681875-73dc-4e62-9898-a0af89021341\r\n\
-Content-Type: multipart/mixed; boundary=changesetresponse_905a1494-fd76-4846-93f9-a3431f0bf5a2\r\n\
-\r\n\
---changesetresponse_905a1494-fd76-4846-93f9-a3431f0bf5a2\r\n\
-Content-Type: application/http\r\n\
-Content-Transfer-Encoding: binary\r\n\
-\r\n\
-HTTP/1.1 201 OK\r\n\
-OData-Version: 4.0;\r\n\
-Content-Type: application/json;odata.metadata=minimal;odata.streaming=true;IEEE754Compatible=false;charset=utf-8\r\n\
-X-Content-Type-Options: nosniff\r\n\
-Cache-Control: no-cache\r\n\
-Location: http://localhost:46541/tests/endpoints/FoodStoreDataServiceV4.svc/Categories(42)\r\n\
-\r\n\
-{\"@odata.context\":\"http://localhost:46541/tests/endpoints/FoodStoreDataServiceV4.svc/$metadata#Categories/$entity\",\"Icon@odata.mediaContentType\":\"image/gif\",\"CategoryID\":42,\"Name\":\"New Category\"}\r\n\
---changesetresponse_905a1494-fd76-4846-93f9-a3431f0bf5a2\r\n\
-Content-Type: application/http\r\n\
-Content-Transfer-Encoding: binary\r\n\
-\r\n\
-HTTP/1.1 204 No Content\r\n\
-X-Content-Type-Options: nosniff\r\n\
-Cache-Control: no-cache\r\n\
-OData-Version: 4.0;\r\n\
-\r\n\
-\r\n\
---changesetresponse_905a1494-fd76-4846-93f9-a3431f0bf5a2--\r\n\
---batchresponse_fb681875-73dc-4e62-9898-a0af89021341\r\n\
-Content-Type: application/http\r\n\
-Content-Transfer-Encoding: binary\r\n\
-\r\n\
-HTTP/1.1 201 Created\r\n\
-OData-Version: 4.0;\r\n\
-Content-Type: application/json;odata.metadata=minimal;odata.streaming=true;IEEE754Compatible=false;charset=utf-8\r\n\
-X-Content-Type-Options: nosniff\r\n\
-Cache-Control: no-cache\r\n\
-Location: http://localhost:46541/tests/endpoints/FoodStoreDataServiceV4.svc/Categories(41)\r\n\
-\r\n\
-{\"@odata.context\":\"http://localhost:46541/tests/endpoints/FoodStoreDataServiceV4.svc/$metadata#Categories/$entity\",\"Icon@odata.mediaContentType\":\"image/gif\",\"CategoryID\":41,\"Name\":\"New Category\"}\r\n\
---batchresponse_fb681875-73dc-4e62-9898-a0af89021341\r\n\
-Content-Type: multipart/mixed; boundary=changesetresponse_92cc2ae8-a5f2-47fc-aaa3-1ff9e7453b07\r\n\
-\r\n\
---changesetresponse_92cc2ae8-a5f2-47fc-aaa3-1ff9e7453b07\r\n\
-Content-Type: application/http\r\n\
-Content-Transfer-Encoding: binary\r\n\
-\r\n\
-HTTP/1.1 201 OK\r\n\
-OData-Version: 4.0;\r\n\
-Content-Type: application/json;odata.metadata=minimal;odata.streaming=true;IEEE754Compatible=false;charset=utf-8\r\n\
-X-Content-Type-Options: nosniff\r\n\
-Cache-Control: no-cache\r\n\
-Location: http://localhost:46541/tests/endpoints/FoodStoreDataServiceV4.svc/Categories(43)\r\n\
-\r\n\
-{\"@odata.context\":\"http://localhost:46541/tests/endpoints/FoodStoreDataServiceV4.svc/$metadata#Categories/$entity\",\"Icon@odata.mediaContentType\":\"image/gif\",\"CategoryID\":43,\"Name\":\"New Category\"}\r\n\
---changesetresponse_92cc2ae8-a5f2-47fc-aaa3-1ff9e7453b07\r\n\
-Content-Type: application/http\r\n\
-Content-Transfer-Encoding: binary\r\n\
-\r\n\
-HTTP/1.1 204 No Content\r\n\
-X-Content-Type-Options: nosniff\r\n\
-Cache-Control: no-cache\r\n\
-OData-Version: 4.0;\r\n\
-\r\n\
-\r\n\
---changesetresponse_92cc2ae8-a5f2-47fc-aaa3-1ff9e7453b07--\r\n\
---batchresponse_fb681875-73dc-4e62-9898-a0af89021341--\r\n\
-"
- };
-
- MockHttpClient.clear().addResponse("http://testuri.org", response);
- odatajs.oData.read("http://testuri.org", function (data, response) {
-
- var batchResponses = data.__batchResponses;
- djstest.assert(batchResponses, "data contains the batch responses");
-
- var changesetResponses = batchResponses[0].__changeResponses;
- djstest.assert(changesetResponses, "batch response 1 contains the change set responses");
- var changesetResponses3 = batchResponses[2].__changeResponses;
- djstest.assert(changesetResponses3, "batch response 3 contains the change set responses");
-
- djstest.assertAreEqual(batchResponses[0].data, undefined, "No data defined for batch response 1");
- djstest.assertAreEqual(changesetResponses[0].headers["Location"], "http://localhost:46541/tests/endpoints/FoodStoreDataServiceV4.svc/Categories(42)", "part 1 of the changeset response of the response 1 was read");
- djstest.assertAreEqual(changesetResponses[0].data["CategoryID"], 42, "part 1 data of the changeset response of the response 1 was read");
- djstest.assertAreEqual(changesetResponses[1].data, undefined, "No data defined for no content only response in part 2 of the changeset response of the response 1");
-
- djstest.assertAreEqual(batchResponses[1].headers["Location"], "http://localhost:46541/tests/endpoints/FoodStoreDataServiceV4.svc/Categories(41)", "response 2 was read");
- djstest.assertAreEqual(batchResponses[1].data["CategoryID"], 41, "response 2 data was read");
-
- djstest.assertAreEqual(batchResponses[2].data, undefined, "No data defined for");
- djstest.assertAreEqual(changesetResponses3[0].headers["Location"], "http://localhost:46541/tests/endpoints/FoodStoreDataServiceV4.svc/Categories(43)", "part 1 of the changeset response of the response 3 was read");
- djstest.assertAreEqual(changesetResponses3[0].data["CategoryID"], 43, "part 1 data of the changeset response of the response 3 was read");
- djstest.assertAreEqual(changesetResponses3[1].data, undefined, "No data defined for no content only response in part 2 of the changeset response of the response 3");
- djstest.done();
- }, null, OData.batchHandler, MockHttpClient);
- });
-
- djstest.addTest(function readBatchWithErrorPartTest() {
- var response = {
- statusCode: 202,
- statusText: "Accepted",
- headers: {
- "Content-Type": "multipart/mixed; boundary=batchresponse_9402a3ab-260f-4fa4-af01-0b30db397c8d"
- },
- body: "--batchresponse_9402a3ab-260f-4fa4-af01-0b30db397c8d\r\n\
-Content-Type: application/http\r\n\
-Content-Transfer-Encoding: binary\r\n\
-\r\n\
-HTTP/1.1 200 OK\r\n\
-Cache-Control: no-cache\r\n\
-OData-Version: 4.0;\r\n\
-Content-Type: application/json;charset=utf-8\r\n\
-Location: http://localhost:46541/tests/endpoints/FoodStoreDataServiceV4.svc/Categories(1)\r\n\
-\r\n\
-{\"error\":{\"code\":\"\",\"message\":\"Resource not found for the segment 'Categories(1)'.\"}}\r\n\
---batchresponse_9402a3ab-260f-4fa4-af01-0b30db397c8d\r\n\
-Content-Type: application/http\r\n\
-Content-Transfer-Encoding: binary\r\n\
-\r\n\
-HTTP/1.1 400 Bad Request\r\n\
-OData-Version: 4.0;\r\n\
-Content-Type: application/json\r\n\
-{\"error\":{\"code\":\"\",\"message\":\"Error processing request stream.'.\"}}\r\n\
---batchresponse_9402a3ab-260f-4fa4-af01-0b30db397c8d--\r\n\
-"
- };
-
- MockHttpClient.clear().addResponse("http://testuri.org", response);
- odatajs.oData.read("http://testuri.org", function (data, response) {
- var batchResponses = data.__batchResponses;
- djstest.assert(batchResponses, "data.__batchResponses is defined");
- djstest.assertAreEqual(batchResponses.length, 2, "batch contains two responses");
- djstest.assertAreEqual(batchResponses[0].headers["Location"], "http://localhost:46541/tests/endpoints/FoodStoreDataServiceV4.svc/Categories(1)", "part 1 of the response was read");
- djstest.assert(batchResponses[1].response, "part 2 of the response was read");
- djstest.done();
- }, null, OData.batchHandler, MockHttpClient);
- });
-
-
- djstest.addTest(function readMalformedMultipartResponseThrowsException() {
- var response = {
- statusCode: 202,
- statusText: "Accepted",
- headers: {
- "Content-Type": "multipart/mixed; boundary=batchresponse_fb681875-73dc-4e62-9898-a0af89021341"
- },
- body: "--batchresponse_fb681875-73dc-4e62-9898-a0af89021341\r\n\
-Content-Type: application/http\r\n\
-Content-Transfer-Encoding: binary\r\n\
-\r\n\
-HTTP/1.1 200 OK\r\n\
-Cache-Control: no-cache\r\n\
-OData-Version: 4.0;\r\n\
-Content-Type: application/json;charset=utf-8\r\n\
-Location: http://localhost:46541/tests/endpoints/FoodStoreDataServiceV4.svc/Categories(1)\r\n\
-\r\n\
-{\"error\":{\"code\":\"\",\"message\":\"Resource not found for the segment 'Categories(1)'.\"}}\r\n\
---batchresponse_fb681875-73dc-4e62-9898-a0af89021341\r\n\
-Content-Type: multipart/mixed; boundary=changesetresponse_2f9c6ba7-b330-4e7c-bf2a-db521996c243\r\n\
-\r\n\
---changesetresponse_2f9c6ba7-b330-4e7c-bf2a-db521996c243\r\n\
-Content-Type: application/http\r\n\
-Content-Transfer-Encoding: binary\r\n\
-\r\n\
-HTTP/1.1 404 Not Found\r\n\
-X-Content-Type-Options: nosniff\r\n\
-OData-Version: 4.0;\r\n\
-Content-Type: application/json;odata.metadata=minimal;odata.streaming=true;IEEE754Compatible=false;charset=utf-8\r\n\
-\r\n\
-{\"error\":{\"code\":\"\",\"message\":\GET operation cannot be specified in a change set. Only PUT, POST and DELETE operations can be specified in a change set..'.\"}}\r\n\
---changesetresponse_2f9c6ba7-b330-4e7c-bf2a-db521996c243--\r\n\
---batchresponse_fb681875-73dc-4e62-9898-a0af89021341--\r\n\
-"
- };
-
- MockHttpClient.clear().addResponse("http://testuri.org", response);
- odatajs.oData.read("http://testuri.org", function (data, response) {
- var batchResponses = data.__batchResponses;
- djstest.assert(batchResponses, "data.__batchResponses is defined");
- djstest.assertAreEqual(batchResponses.length, 2, "batch contains two responses");
- djstest.assertAreEqual(batchResponses[0].headers["Location"], "http://localhost:46541/tests/endpoints/FoodStoreDataServiceV4.svc/Categories(1)", "part 1 of the response was read");
-
- var error = batchResponses[1].__changeResponses[0];
- djstest.assert(error.response.body.indexOf("GET operation cannot be specified in a change set") > -1, "Response contains expected message");
- djstest.done();
- }, null, OData.batchHandler, MockHttpClient);
- djstest.done();
- });
-
- djstest.addTest(function batchRequestContextIsPushedToThePartsHandlersTest() {
- var testHandler = {
- read: function (response, context) {
- djstest.assert(context.recognizeDates, "Recognize dates was set properly on the part request context");
- },
- write: function (request, context) {
- djstest.assert(context.recognizeDates, "Recognize dates was set properly on the part request context");
- }
- };
-
- var batch = {
- headers: {},
- __batchRequests: [
- { requestUri: "http://someUri" },
- { __changeRequests: [
- { requestUri: "http://someUri", method: "POST", data: { p1: 500} }
- ]
- }
- ]
- };
-
- var request = { requestUri: "http://someuri", headers: {}, data: batch };
- var response = {
- statusCode: 202,
- statusText: "Accepted",
- headers: {
- "Content-Type": "multipart/mixed; boundary=batchresponse_fb681875-73dc-4e62-9898-a0af89021341"
- },
- body: '--batchresponse_fb681875-73dc-4e62-9898-a0af89021341\r\n' +
- 'Content-Type: application/http\r\n' +
- 'Content-Transfer-Encoding: binary\r\n' +
- '\r\n' +
- 'HTTP/1.1 200 OK\r\n' +
- 'Cache-Control: no-cache\r\n' +
- 'OData-Version: 1.0;\r\n' +
- 'Content-Type: application/json\r\n' +
- '\r\n' +
- '{ "p1": 500 }\r\n' +
- '\r\n' +
- '--batchresponse_fb681875-73dc-4e62-9898-a0af89021341--\r\n'
- };
-
- var oldPartHandler = OData.batchHandler.partHandler;
-
- OData.batchHandler.partHandler = testHandler;
-
- OData.batchHandler.write(request, { recognizeDates: true });
- OData.batchHandler.read(response, { recognizeDates: true });
-
- OData.batchHandler.partHandler = oldPartHandler;
-
- djstest.done();
- });
-
-
- // DATAJS INTERNAL END
-})(this);
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/odata-cache-filter-functional-tests.html
----------------------------------------------------------------------
diff --git a/JSLib/tests/odata-cache-filter-functional-tests.html b/JSLib/tests/odata-cache-filter-functional-tests.html
deleted file mode 100644
index 9c5da7e..0000000
--- a/JSLib/tests/odata-cache-filter-functional-tests.html
+++ /dev/null
@@ -1,56 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
- <title>datajs.cache filter functional tests</title>
- <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
- <meta http-equiv="cache-control" content="no-cache"/>
- <meta http-equiv="pragma" content="no-cache"/>
- <meta http-equiv="expires" content="-1"/>
-
- <link rel="stylesheet" href="http://code.jquery.com/qunit/qunit-1.10.0.css" type="text/css" />
- <script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/json2/20110223/json2.js"></script>
- <script type="text/javascript" src="http://code.jquery.com/jquery-1.4.4.min.js"></script>
- <script type="text/javascript" src="http://code.jquery.com/qunit/qunit-1.10.0.js"></script>
- <script type="text/javascript" src="common/TestSynchronizerClient.js"></script>
- <script type="text/javascript">
- window.TestSynchronizer.init(QUnit);
- </script>
-
- <script type="text/javascript" src="../src/datajs.js"></script>
- <script type="text/javascript" src="../src/utils.js"></script>
- <script type="text/javascript" src="../src/xml.js"></script>
-
- <script type="text/javascript" src="../src/odata-utils.js"></script>
- <script type="text/javascript" src="../src/odata-handler.js"></script>
- <script type="text/javascript" src="../src/odata-gml.js"></script>
- <script type="text/javascript" src="../src/odata-xml.js"></script>
- <script type="text/javascript" src="../src/odata-net.js"></script>
- <script type="text/javascript" src="../src/odata-json-light.js"></script>
- <script type="text/javascript" src="../src/odata-json.js"></script>
- <script type="text/javascript" src="../src/odata-atom.js"></script>
- <script type="text/javascript" src="../src/odata-metadata.js"></script>
- <script type="text/javascript" src="../src/odata-batch.js"></script>
- <script type="text/javascript" src="../src/odata.js"></script>
-
- <script type="text/javascript" src="../src/store-dom.js"></script>
- <script type="text/javascript" src="../src/store-indexeddb.js"></script>
- <script type="text/javascript" src="../src/store-memory.js"></script>
- <script type="text/javascript" src="../src/store.js"></script>
-
- <script type="text/javascript" src="../src/deferred.js"></script>
- <script type="text/javascript" src="../src/cache-source.js"></script>
- <script type="text/javascript" src="../src/cache.js"></script>
-
- <script type="text/javascript" src="common/djstest.js"></script>
- <script type="text/javascript" src="common/CacheOracle.js"></script>
- <script type="text/javascript" src="common/ObservableHttpClient.js"></script>
- <script type="text/javascript" src="common/ODataReadOracle.js"></script>
- <script type="text/javascript" src="odata-cache-filter-functional-tests.js"></script>
-</head>
-<body>
- <h1 id="qunit-header">datajs.cache filter functional tests</h1>
- <h2 id="qunit-banner"></h2>
- <h2 id="qunit-userAgent"></h2>
- <ol id="qunit-tests"></ol>
-</body>
-</html>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/odata-cache-filter-functional-tests.js
----------------------------------------------------------------------
diff --git a/JSLib/tests/odata-cache-filter-functional-tests.js b/JSLib/tests/odata-cache-filter-functional-tests.js
deleted file mode 100644
index eaf9d48..0000000
--- a/JSLib/tests/odata-cache-filter-functional-tests.js
+++ /dev/null
@@ -1,416 +0,0 @@
-/// <reference path="../src/datajs.js" />
-/// <reference path="../src/odata-utils.js" />
-/// <reference path="../src/cache.js" />
-/// <reference path="common/djstest.js" />
-
-(function (window, undefined) {
- OData.defaultHandler.accept = "application/json;q=0.9, application/atomsvc+xml;q=0.8, */*;q=0.1";
- var feeds = [
- { feed: "./endpoints/FoodStoreDataServiceV4.svc/Foods" }
- ];
-
- var itemsInCollection = 16;
-
- var pageSize = 3;
- var readRangeStart = pageSize + 1;
- var readRangeTake = pageSize;
-
- // Indices for filterForward after an initial readRange has partially filled the cache
- var filterForwardAfterReadIndices = [
- readRangeStart - 1, // before items in the cache
- readRangeStart, // beginning of items in the cache
- readRangeStart + readRangeTake, // last item prefetched in the cache
- readRangeStart + readRangeTake + 1 // past range already in cache
- ];
-
- // Indices for filterBack after an initial readRange has partially filled the cache
- var filterBackAfterReadIndices = [
- readRangeStart - 1, // before items in the cache
- readRangeStart, // beginning of items in the cache
- readRangeStart + readRangeTake, // last item prefetched in the cache
- readRangeStart + readRangeTake + 1 // past range already in cache
- ];
-
- // Counts for filterForward after a readRange has partially filled the cache
- var filterForwardAfterReadCounts = [
- -5, // Get all items
- 3, // Subset of all items found in the cache
- itemsInCollection
- ];
-
- // Counts for filterBack after a readRange has partially filled the cache
- var filterBackAfterReadCounts = [
- -5, // Get all items
- 3, // Subset of all items found in the cache
- itemsInCollection
- ];
-
- // Indices for single filterForward
- var singleFilterForwardIndices = [
- -5,
- itemsInCollection - 1,
- itemsInCollection, // beyond the end of the collection
- itemsInCollection + pageSize // more than one page beyond the collection
- ];
-
- // Indices for single filterBack
- var singleFilterBackIndices = [
- -1,
- 0,
- itemsInCollection - 1
- ];
-
- // Count for single filterForward
- var singleFilterForwardCounts = [
- 5,
- itemsInCollection + 1 // more than number of items in collection
- ];
-
- // Count for single filterBack
- var singleFilterBackCounts = [
- 5,
- itemsInCollection + 1 // more than number of items in collection
- ];
-
- // Index/count variations for multiple filterForwards
- var multipleFilterForwards = [
- { index: 0, count: -1 }, // everything
- {index: 2, count: 5 }, // range in first half
- {index: 4, count: 7 }, // range in the middle to overlap first and second half
- {index: 9, count: 4} // range in second half
- ];
-
- // Index/count variations for multiple filterBacks
- var multipleFilterBacks = [
- { index: itemsInCollection - 1, count: -1 }, // everything
- {index: itemsInCollection - 2, count: 5 }, // range in second half
- {index: itemsInCollection - 4, count: 7 }, // range in the middle to overlap first and second half
- {index: itemsInCollection - 9, count: 4} // range in first half
- ];
-
-
- var invalidIndices = [NaN, undefined, Infinity, "not a valid value"];
- var invalidCounts = [NaN, undefined, Infinity, "not a valid value"];
-
- // Predicate which returns all items in the collection
- var getAllItemsPredicate = function (item) {
- return true;
- };
-
- // Predicate which returns none of the items in the collection
- var getNoItemsPredicate = function (item) {
- return false;
- };
-
- var getEveryThirdPredicate = function (item) {
- return ((item.FoodID % 3) === 0);
- };
-
- var filterPredicates = [
- getAllItemsPredicate,
- getNoItemsPredicate,
- getEveryThirdPredicate
- ];
-
- var expectException = function (cache) {
- djstest.assert(false, "We should not get here because the an exception is expected.");
- djstest.destroyCacheAndDone(cache);
- };
-
- var makeUnexpectedErrorHandler = function (cache) {
- return function (err) {
- djstest.assert(false, "Unexpected call to error handler with error: " + djstest.toString(err));
- if (cache) {
- djstest.destroyCacheAndDone(cache);
- } else {
- djstest.done();
- }
- };
- };
-
- var validateFilterResultsAndRequests = function (feed, cache, index, count, predicate, finished, backwards, session, cacheOracle) {
- /// <summary>Runs filter and validates the results and network requests</summary>
- /// <param name="feed" type="Object">The feed being read from</param>
- /// <param name="cache" type="Object">The cache to perform the filter on</param>
- /// <param name="index" type="Integer">The index value</param>
- /// <param name="count" type="Integer">The count value</param>
- /// <param name="predicate" type="Object">Filter string to append to the feed to validate the predicate</param>
- /// <param name="finished" type="Function">Callback function called after data is verified</param>
- /// <param name="session" type="Object">Session object to validate the network requests</param>
- /// <param name="cacheOracle" type="Object">cacheOracle object to validate the network requests</param>
-
- if (count < 0) {
- count = itemsInCollection;
- }
-
- if (index < 0) {
- index = 0;
- }
-
- window.ODataReadOracle.readJsonAcrossServerPages(feed, function (expectData) {
- if (backwards) {
- cache.filterBack(index, count, predicate).then(function (actualResults) {
- var expectedResults = CacheOracle.getExpectedFilterResults(expectData, index, count, predicate, backwards);
- djstest.assertAreEqualDeep(actualResults, expectedResults, "results for " + "filterBack requests");
-
- if (session && cacheOracle) {
- // If the count is not satisfied in the expected results, read to the beginning of the collection
- // otherwise read to the first expected index
- var firstIndex = 0;
- if (expectedResults.value.length != 0) {
- firstIndex = (expectedResults.value.length < count) ? 0 : expectedResults.value[0].index;
- }
- // The effective count is the number of items between the first and last index
- var expectedCount = index - firstIndex + 1;
- cacheOracle.verifyRequests(session.requests, session.responses, firstIndex, expectedCount, "filterBack requests", backwards);
- }
- finished();
- });
- }
- else {
- cache.filterForward(index, count, predicate).then(function (actualResults) {
- var expectedResults = CacheOracle.getExpectedFilterResults(expectData, index, count, predicate, backwards)
- djstest.assertAreEqualDeep(actualResults, expectedResults, "results for " + "filterForward requests");
-
- if (session && cacheOracle) {
- if (expectedResults.value.length > 0) {
- // If the count is not satisfied in the expected results, read to the end of the collection
- // otherwise read to the last index
- var lastIndex = (expectedResults.value.length < count) ? itemsInCollection : expectedResults.value[expectedResults.value.length - 1].index + 1;
- // One request is made if the index is outside the range of the collection if the end of the collection has not yet been found
- var expectedCount = (index < itemsInCollection) ? (lastIndex - index) : 1;
- }
- else {
- var expectedCount = itemsInCollection;
- }
-
- cacheOracle.verifyRequests(session.requests, session.responses, index, expectedCount, "filterForward requests", backwards);
- }
- finished();
- });
- }
- });
- };
-
- var createMultipleFilterTestName = function (scenarioName, params) {
- return "Testing " + scenarioName + (params.backwards ? "filterBack: " : "filterForward: ") + " of " + params.feed + " with predicate " + params.predicate + " [index " +
- params.firstIndex + ", count " + params.firstCount + "] and [index " + params.secondIndex + ", count " + params.secondCount +
- "] with pageSize " + params.pageSize + ", and prefetch " + params.prefetchSize;
- };
-
- var createSingleFilterTestName = function (scenarioName, params) {
- return "Testing " + scenarioName + (params.backwards ? "filterBack: " : "filterForward: ") + " of " + params.feed + " with predicate " + params.predicate + " [index " +
- params.index + ", count " + params.count + "] with pageSize " + params.pageSize + ", and prefetch " + params.prefetchSize;
- };
-
- var singleFilterTest = function (params) {
- djstest.assertsExpected(2);
- var options = { name: "cache" + new Date().valueOf(), source: params.feed, pageSize: params.pageSize, prefetchSize: params.prefetchSize };
-
- var cache = odatajs.createDataCache(options);
- var cacheOracle = new CacheOracle(params.feed, params.pageSize, itemsInCollection);
- var session = this.observableHttpClient.newSession();
- validateFilterResultsAndRequests(params.feed, cache, params.index, params.count, params.predicate, function () { djstest.destroyCacheAndDone(cache) }, params.backwards, session, cacheOracle);
- };
-
- var filterAfterReadRangeTest = function (params) {
- djstest.assertsExpected(3);
- var options = { name: "cache" + new Date().valueOf(), source: params.feed, pageSize: params.pageSize, prefetchSize: params.prefetchSize };
-
- var cache = odatajs.createDataCache(options);
- var cacheOracle = new CacheOracle(params.feed, params.pageSize, itemsInCollection);
- var session = this.observableHttpClient.newSession();
-
- cache.readRange(params.skip, params.take).then(function (data) {
- cacheOracle.verifyRequests(session.requests, session.responses, params.skip, params.take, "readRange requests");
- session.clear();
- validateFilterResultsAndRequests(params.feed, cache, params.index, params.count, params.predicate, function () { djstest.destroyCacheAndDone(cache); }, params.backwards, session, cacheOracle);
- });
- };
-
- var parallelFilterTest = function (params) {
- djstest.assertsExpected(2);
- var options = { name: "cache" + new Date().valueOf(), source: params.feed, pageSize: params.pageSize, prefetchSize: params.prefetchSize };
-
- var cache = odatajs.createDataCache(options);
-
- var firstfilter = function (finished) {
- validateFilterResultsAndRequests(params.feed, cache, params.firstIndex, params.firstCount, params.predicate, finished, params.backwards);
- };
-
- var secondfilter = function (finished) {
- validateFilterResultsAndRequests(params.feed, cache, params.secondIndex, params.secondCount, params.predicate, finished, params.backwards);
- };
-
- djstest.asyncDo([firstfilter, secondfilter], function () {
- djstest.destroyCacheAndDone(cache);
- });
- };
-
- var serialFilterTest = function (params) {
- djstest.assertsExpected(4);
- var options = { name: "cache" + new Date().valueOf(), source: params.feed, pageSize: params.pageSize, prefetchSize: params.prefetchSize };
-
- var cache = odatajs.createDataCache(options);
- var cacheOracle = new CacheOracle(params.feed, params.pageSize, itemsInCollection);
- var session = this.observableHttpClient.newSession();
-
- var filterMethod = function (index, count, predicate, backwards) {
- if (backwards) {
- return cache.filterBack(index, count, predicate);
- }
- else {
- return cache.filterForward(index, count, predicate)
- }
- }
-
- filterMethod(params.firstIndex, params.firstCount, params.predicate, params.backwards).then(
- function (results) {
- validateFilterResultsAndRequests(params.feed, cache, params.firstIndex, params.firstCount, params.predicate,
- function () {
- session.clear();
- validateFilterResultsAndRequests(params.feed, cache, params.secondIndex, params.secondCount, params.predicate, function () { djstest.destroyCacheAndDone(cache) }, params.backwards, session, cacheOracle);
- }, params.backwards, session, cacheOracle);
- });
- };
-
- module("Functional", {
- setup: function () {
- this.observableHttpClient = new ObservableHttpClient();
- OData.defaultHttpClient = this.observableHttpClient;
- },
-
- teardown: function () {
- OData.defaultHttpClient = this.observableHttpClient.provider;
- }
- });
-
- $.each(filterPredicates, function (_, filterPredicate) {
- $.each(feeds, function (_, feedObject) {
- $.each(filterForwardAfterReadCounts, function (_, filterCount) {
- $.each(filterForwardAfterReadIndices, function (_, filterIndex) {
- var parameters = { index: filterIndex, count: filterCount, predicate: filterPredicate, feed: feedObject.feed, take: readRangeTake,
- skip: readRangeStart, pageSize: pageSize, prefetchSize: 0, backwards: false
- };
- djstest.addTest(filterAfterReadRangeTest, createSingleFilterTestName("after readRange, ", parameters), parameters);
- });
- });
-
- $.each(filterBackAfterReadCounts, function (_, filterCount) {
- $.each(filterBackAfterReadIndices, function (_, filterIndex) {
- var parameters = { index: filterIndex, count: filterCount, predicate: filterPredicate, feed: feedObject.feed, take: readRangeTake,
- skip: readRangeStart, pageSize: pageSize, prefetchSize: 0, backwards: true
- };
- djstest.addTest(filterAfterReadRangeTest, createSingleFilterTestName("After readRange, ", parameters), parameters);
- });
- });
- });
-
- $.each(singleFilterForwardIndices, function (_, filterIndex) {
- $.each(singleFilterForwardCounts, function (_, filterCount) {
- var parameters = { index: filterIndex, count: filterCount, predicate: filterPredicate, feed: feeds[0].feed, pageSize: pageSize, prefetchSize: 0, backwards: false };
- djstest.addTest(singleFilterTest, createSingleFilterTestName("single ", parameters), parameters);
- });
- });
-
- $.each(singleFilterBackIndices, function (_, filterIndex) {
- $.each(singleFilterBackCounts, function (_, filterCount) {
- var parameters = { index: filterIndex, count: filterCount, predicate: filterPredicate, feed: feeds[0].feed, pageSize: pageSize, prefetchSize: 0, backwards: true };
- djstest.addTest(singleFilterTest, createSingleFilterTestName("single ", parameters), parameters);
- });
- });
-
- $.each(multipleFilterForwards, function (_, firstFilter) {
- $.each(multipleFilterForwards, function (_, secondFilter) {
- var serialParameters = { firstIndex: firstFilter.index, firstCount: firstFilter.count, secondIndex: secondFilter.index, secondCount: secondFilter.count,
- predicate: filterPredicate, feed: feeds[0].feed, pageSize: pageSize, prefetchSize: 0, backwards: false
- };
- djstest.addTest(serialFilterTest, createMultipleFilterTestName("serial ", serialParameters), serialParameters);
- });
- });
-
- $.each(multipleFilterBacks, function (_, firstFilter) {
- $.each(multipleFilterBacks, function (_, secondFilter) {
- var serialParameters = { firstIndex: firstFilter.index, firstCount: firstFilter.count, secondIndex: secondFilter.index, secondCount: secondFilter.count,
- predicate: filterPredicate, feed: feeds[0].feed, pageSize: pageSize, prefetchSize: 0, backwards: true
- };
- djstest.addTest(serialFilterTest, createMultipleFilterTestName("serial ", serialParameters), serialParameters);
- });
- });
-
- $.each(multipleFilterForwards, function (_, firstFilter) {
- $.each(multipleFilterForwards, function (_, secondFilter) {
- var parallelParameters = { firstIndex: firstFilter.index, firstCount: firstFilter.count, secondIndex: secondFilter.index, secondCount: secondFilter.count,
- predicate: filterPredicate, feed: feeds[0].feed, pageSize: pageSize, prefetchSize: 6, backwards: false
- };
- djstest.addTest(parallelFilterTest, createMultipleFilterTestName("parallel ", parallelParameters), parallelParameters);
- });
- });
-
- $.each(multipleFilterBacks, function (_, firstFilter) {
- $.each(multipleFilterBacks, function (_, secondFilter) {
- var parallelParameters = { firstIndex: firstFilter.index, firstCount: firstFilter.count, secondIndex: secondFilter.index, secondCount: secondFilter.count,
- predicate: filterPredicate, feed: feeds[0].feed, pageSize: pageSize, prefetchSize: 6, backwards: true
- };
- djstest.addTest(parallelFilterTest, createMultipleFilterTestName("parallel ", parallelParameters), parallelParameters);
- });
- });
-
- $.each([true, false], function (_, isBackwards) {
- var zeroCountParameters = { index: 0, count: 0, predicate: filterPredicate, feed: feeds[0].feed, take: readRangeTake,
- skip: readRangeStart, pageSize: pageSize, prefetchSize: 0, backwards: isBackwards
- };
- djstest.addTest(singleFilterTest, createSingleFilterTestName("Count 0 ", zeroCountParameters), zeroCountParameters);
- });
- });
-
- $.each([true, false], function (_, backwards) {
- $.each(invalidIndices, function (_, invalidIndex) {
- var invalidIndexParameters = { index: invalidIndex, count: -1, predicate: filterPredicates[0], feed: feeds[0].feed, pageSize: pageSize, prefetchSize: 0, backwards: backwards };
-
- djstest.addTest(
- function (params) {
- djstest.assertsExpected(1);
- var options = { name: "cache" + new Date().valueOf(), source: params.feed };
- var cache = odatajs.createDataCache(options);
- try {
- params.backwards ?
- cache.filterForward(params.index, params.count, params.predicate).then(function (results) {
- djstest.log(results);
- }) :
- cache.filterForward(params.index, params.count, params.predicate).then(function (results) {
- djstest.log(results);
- });
- expectException(cache);
- } catch (e) {
- djstest.assertAreEqual(e.message, "'index' must be a valid number.", "Error message validation");
- djstest.destroyCacheAndDone(cache);
- }
- }, createSingleFilterTestName("invalid index ", invalidIndexParameters), invalidIndexParameters);
- });
-
- $.each(invalidCounts, function (_, invalidCount) {
- var invalidCountParameters = { index: 0, count: invalidCount, predicate: filterPredicates[0], feed: feeds[0].feed, pageSize: pageSize, prefetchSize: 0, backwards: backwards };
-
- djstest.addTest(
- function (params) {
- djstest.assertsExpected(1);
- var options = { name: "cache" + new Date().valueOf(), source: params.feed };
- var cache = odatajs.createDataCache(options);
- try {
- params.backwards ?
- cache.filterBack(params.index, params.count, params.predicate).then(function (results) {
- djstest.log(results);
- }) :
- cache.filterForward(params.index, params.count, params.predicate).then(function (results) {
- djstest.log(results);
- });
- expectException(cache);
- } catch (e) {
- djstest.assertAreEqual(e.message, "'count' must be a valid number.", "Error message validation");
- djstest.destroyCacheAndDone(cache);
- }
- }, createSingleFilterTestName("invalid count ", invalidCountParameters), invalidCountParameters);
- });
- });
-})(this);
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/odata-cache-fperf-tests.html
----------------------------------------------------------------------
diff --git a/JSLib/tests/odata-cache-fperf-tests.html b/JSLib/tests/odata-cache-fperf-tests.html
deleted file mode 100644
index 3323199..0000000
--- a/JSLib/tests/odata-cache-fperf-tests.html
+++ /dev/null
@@ -1,54 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
- <title>datajs.cache functional perf tests</title>
- <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
- <meta http-equiv="cache-control" content="no-cache"/>
- <meta http-equiv="pragma" content="no-cache"/>
- <meta http-equiv="expires" content="-1"/>
-
- <link rel="stylesheet" href="http://code.jquery.com/qunit/qunit-1.10.0.css" type="text/css" />
- <script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/json2/20110223/json2.js"></script>
- <script type="text/javascript" src="http://code.jquery.com/jquery-1.4.4.min.js"></script>
- <script type="text/javascript" src="http://code.jquery.com/qunit/qunit-1.10.0.js"></script>
- <script type="text/javascript" src="common/TestSynchronizerClient.js"></script>
- <script type="text/javascript">
- window.TestSynchronizer.init(QUnit);
- </script>
-
- <script type="text/javascript" src="../src/datajs.js"></script>
- <script type="text/javascript" src="../src/utils.js"></script>
- <script type="text/javascript" src="../src/xml.js"></script>
-
- <script type="text/javascript" src="../src/odata-utils.js"></script>
- <script type="text/javascript" src="../src/odata-handler.js"></script>
- <script type="text/javascript" src="../src/odata-gml.js"></script>
- <script type="text/javascript" src="../src/odata-xml.js"></script>
- <script type="text/javascript" src="../src/odata-net.js"></script>
- <script type="text/javascript" src="../src/odata-json-light.js"></script>
- <script type="text/javascript" src="../src/odata-json.js"></script>
- <script type="text/javascript" src="../src/odata-atom.js"></script>
- <script type="text/javascript" src="../src/odata-metadata.js"></script>
- <script type="text/javascript" src="../src/odata-batch.js"></script>
- <script type="text/javascript" src="../src/odata.js"></script>
-
- <script type="text/javascript" src="../src/store-dom.js"></script>
- <script type="text/javascript" src="../src/store-indexeddb.js"></script>
- <script type="text/javascript" src="../src/store-memory.js"></script>
- <script type="text/javascript" src="../src/store.js"></script>
-
- <script type="text/javascript" src="../src/deferred.js"></script>
- <script type="text/javascript" src="../src/cache-source.js"></script>
- <script type="text/javascript" src="../src/cache.js"></script>
-
- <script type="text/javascript" src="common/CacheOracle.js"></script>
- <script type="text/javascript" src="common/djstest.js"></script>
- <script type="text/javascript" src="odata-cache-fperf-tests.js"></script>
-</head>
-<body>
- <h1 id="qunit-header">datajs.cache functional perf tests</h1>
- <h2 id="qunit-banner"></h2>
- <h2 id="qunit-userAgent"></h2>
- <ol id="qunit-tests"></ol>
-</body>
-</html>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/odata-cache-fperf-tests.js
----------------------------------------------------------------------
diff --git a/JSLib/tests/odata-cache-fperf-tests.js b/JSLib/tests/odata-cache-fperf-tests.js
deleted file mode 100644
index 68c415f..0000000
--- a/JSLib/tests/odata-cache-fperf-tests.js
+++ /dev/null
@@ -1,103 +0,0 @@
-/// <reference path="../src/datajs.js" />
-/// <reference path="../src/odata-utils.js" />
-/// <reference path="../src/cache.js" />
-/// <reference path="common/CacheOracle.js" />
-/// <reference path="common/djstest.js" />
-
-(function (window, undefined) {
-
- var slowHttpClient = {
- latency: 750,
- provider: OData.defaultHttpClient,
- request: function (request, success, error) {
- setTimeout(function () {
- slowHttpClient.provider.request(request, success, error);
- }, slowHttpClient.latency);
- }
- };
-
- var feeds = [
- { uri: "./endpoints/FoodStoreDataServiceV4.svc/Foods" }
- ];
-
- module("Functional", {
- setup: function () {
- OData.defaultHttpClient = slowHttpClient;
- },
- teardown: function () {
- OData.defaultHttpClient = slowHttpClient.provider;
- }
- });
-
- var cacheReadRangeWallClockTest = function (totalReads, interval, mechanism, source, pageSize, prefetchSize, generateRange, threshold) {
- /// <summary>Cache readRange wall-clock test</summary>
- /// <remarks>
- /// The average time computed by the wall-clock test does *not* include the initial readRange
- /// </remarks>
- /// <param name="totalReads">Number of reads to collect data from</param>
- /// <param name="interval">Interval (milliseconds) between reads</param>
- /// <param name="mechanism">The cache store mechanism</param>
- /// <param name="source">The feed source</param>
- /// <param name="pageSize">The page size</param>
- /// <param name="prefetchSize">The prefetch size</param>
- /// <param name="generateRange">The range generator function: given the read index, returns the readRange index and count</param>
- /// <param name="threshold">The average read time threshold for test to pass; if not specified, defaults to the slowHttpClient latency</param>
- /// <returns>The test function</param>
- return function () {
- var cache = odatajs.createDataCache({ name: "cache" + new Date().valueOf(), source: source, pageSize: pageSize, prefetchSize: prefetchSize });
- var totalTime = 0;
- var readCount = 0;
-
- var callReadRange = function () {
- var range = generateRange(readCount);
- var startTime = new Date().valueOf();
- cache.readRange(range.index, range.count).then(function (data) {
- var duration = (new Date().valueOf()) - startTime;
- djstest.log("readRange " + readCount + " [" + range.index + ", " + range.count + "]: " + duration + "ms");
-
- // The first readRange is not counted
- totalTime += (readCount > 0) ? duration : 0;
- readCount += 1;
-
- if (readCount < totalReads) {
- setTimeout(callReadRange, interval);
- } else {
- // The first readRange is not counted
- var averageTime = totalTime / (totalReads - 1);
- var actualThreshold = threshold === undefined ? slowHttpClient.latency : threshold;
- djstest.assert(averageTime < actualThreshold, "Average: " + averageTime + "ms, Threshold: " + actualThreshold + "ms");
- djstest.destroyCacheAndDone(cache);
- }
- }, function (err) {
- djstest.fail("Unexpected call to error handler with error: " + djstest.toString(err));
- djstest.destroyCacheAndDone(cache);
- });
- };
-
- callReadRange();
- };
- };
-
- $.each(CacheOracle.mechanisms, function (_, mechanism) {
- if (mechanism !== "best" && CacheOracle.isMechanismAvailable(mechanism)) {
- $.each(feeds, function (_, feed) {
- djstest.addTest(cacheReadRangeWallClockTest(2, 1000, mechanism, feed.uri, 5, 0, function () {
- return { index: 0, count: 5 };
- }), "Cache small single-page wall-clock test with " + mechanism + " on " + feed.uri);
-
- djstest.addTest(cacheReadRangeWallClockTest(5, 1000, mechanism, feed.uri, 3, -1, function (readCount) {
- return { index: readCount * 3, count: 3 };
- }), "Cache page-by-page wall-clock test with " + mechanism + " on " + feed.uri);
-
- djstest.addTest(cacheReadRangeWallClockTest(5, 1000, mechanism, feed.uri, 3, -1, function (readCount) {
- return { index: readCount, count: 3 };
- }), "Cache line-by-line wall-clock test with " + mechanism + " on " + feed.uri);
- });
-
- var largeFeedUri = "./endpoints/LargeCollectionService.svc/Customers";
- djstest.addTest(cacheReadRangeWallClockTest(2, 1000, mechanism, largeFeedUri, 100, 0, function () {
- return { index: 0, count: 500 };
- }), "Cache large single-page wall-clock test with " + mechanism + " on " + largeFeedUri, undefined, 60000);
- }
- });
-})(this);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/4621d41c/JSLib/tests/odata-cache-functional-tests.html
----------------------------------------------------------------------
diff --git a/JSLib/tests/odata-cache-functional-tests.html b/JSLib/tests/odata-cache-functional-tests.html
deleted file mode 100644
index e6f2992..0000000
--- a/JSLib/tests/odata-cache-functional-tests.html
+++ /dev/null
@@ -1,56 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
- <title>OData tests against local service</title>
- <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
- <meta http-equiv="cache-control" content="no-cache"/>
- <meta http-equiv="pragma" content="no-cache"/>
- <meta http-equiv="expires" content="-1"/>
-
- <link rel="stylesheet" href="http://code.jquery.com/qunit/qunit-1.10.0.css" type="text/css" />
- <script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/json2/20110223/json2.js"></script>
- <script type="text/javascript" src="http://code.jquery.com/jquery-1.4.4.min.js"></script>
- <script type="text/javascript" src="http://code.jquery.com/qunit/qunit-1.10.0.js"></script>
- <script type="text/javascript" src="common/TestSynchronizerClient.js"></script>
- <script type="text/javascript">
- window.TestSynchronizer.init(QUnit);
- </script>
-
- <script type="text/javascript" src="../src/datajs.js"></script>
- <script type="text/javascript" src="../src/utils.js"></script>
- <script type="text/javascript" src="../src/xml.js"></script>
-
- <script type="text/javascript" src="../src/odata-utils.js"></script>
- <script type="text/javascript" src="../src/odata-handler.js"></script>
- <script type="text/javascript" src="../src/odata-gml.js"></script>
- <script type="text/javascript" src="../src/odata-xml.js"></script>
- <script type="text/javascript" src="../src/odata-net.js"></script>
- <script type="text/javascript" src="../src/odata-json-light.js"></script>
- <script type="text/javascript" src="../src/odata-json.js"></script>
- <script type="text/javascript" src="../src/odata-atom.js"></script>
- <script type="text/javascript" src="../src/odata-metadata.js"></script>
- <script type="text/javascript" src="../src/odata-batch.js"></script>
- <script type="text/javascript" src="../src/odata.js"></script>
-
- <script type="text/javascript" src="../src/store-dom.js"></script>
- <script type="text/javascript" src="../src/store-indexeddb.js"></script>
- <script type="text/javascript" src="../src/store-memory.js"></script>
- <script type="text/javascript" src="../src/store.js"></script>
-
- <script type="text/javascript" src="../src/deferred.js"></script>
- <script type="text/javascript" src="../src/cache-source.js"></script>
- <script type="text/javascript" src="../src/cache.js"></script>
-
- <script type="text/javascript" src="common/djstest.js"></script>
- <script type="text/javascript" src="common/CacheOracle.js"></script>
- <script type="text/javascript" src="common/ObservableHttpClient.js"></script>
- <script type="text/javascript" src="common/ODataReadOracle.js"></script>
- <script type="text/javascript" src="odata-cache-functional-tests.js"></script>
-</head>
-<body>
- <h1 id="qunit-header">datajs.cache tests against local in-memory service</h1>
- <h2 id="qunit-banner"></h2>
- <h2 id="qunit-userAgent"></h2>
- <ol id="qunit-tests"></ol>
-</body>
-</html>