You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by bi...@apache.org on 2014/05/09 09:22:15 UTC

[06/24] a) Convert all the DataJS supported functionality from V3 to V4. 1. Remove all the Json verbose logic, make the DataJS accepted and returned javascript object be in Json light format. (Since Json verbose has been completely removed on V4, making

http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/e387fc92/JSLib/tests/code/jsdate.cs
----------------------------------------------------------------------
diff --git a/JSLib/tests/code/jsdate.cs b/JSLib/tests/code/jsdate.cs
index 40996d0..4f57fe6 100644
--- a/JSLib/tests/code/jsdate.cs
+++ b/JSLib/tests/code/jsdate.cs
@@ -1,40 +1,40 @@
-/// <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 System.Spatial;
-    using Microsoft.Data.OData;
-
-    [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");
-        }
-    }
+/// <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/e387fc92/JSLib/tests/code/jsonobject.cs
----------------------------------------------------------------------
diff --git a/JSLib/tests/code/jsonobject.cs b/JSLib/tests/code/jsonobject.cs
index 79b914e..35b080c 100644
--- a/JSLib/tests/code/jsonobject.cs
+++ b/JSLib/tests/code/jsonobject.cs
@@ -1,80 +1,80 @@
-/// <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();
-        }
-    }
+/// <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/e387fc92/JSLib/tests/code/readerutils.cs
----------------------------------------------------------------------
diff --git a/JSLib/tests/code/readerutils.cs b/JSLib/tests/code/readerutils.cs
index 35b98ba..6d12978 100644
--- a/JSLib/tests/code/readerutils.cs
+++ b/JSLib/tests/code/readerutils.cs
@@ -1,48 +1,68 @@
-using System.Net;
-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;
-        }
-
-    }
+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

http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/e387fc92/JSLib/tests/common/ODataReadOracle.js
----------------------------------------------------------------------
diff --git a/JSLib/tests/common/ODataReadOracle.js b/JSLib/tests/common/ODataReadOracle.js
index a0c0bbc..a507028 100644
--- a/JSLib/tests/common/ODataReadOracle.js
+++ b/JSLib/tests/common/ODataReadOracle.js
@@ -1,275 +1,205 @@
-// 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;odata=verbose";
-    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) {
-            if (!data.results) {
-                data = { results: 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) {
-                if (!data.results) {
-                    data = { results: 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>
-        $.getJSON(
-            "./common/ODataReadOracle.svc/ReadMetadata?url=" + escape(url),
-            function (data) {
-                removeProperty(data.d, "__type");
-                success(data.d);
-            }
-        );
-    };
-
-    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>
-
-        $.getJSON(
-            "./common/ODataReadOracle.svc/ReadServiceDocument?url=" + escape(url) + "&mimeType=" + mimeType,
-            function (data) {
-                removeProperty(data.d, "__type");
-                if (mimeType == jsonMime) {
-                    removeProperty(data.d, "extensions");
-                    $.each(data.d["workspaces"], function (_, workspace) {
-                        delete workspace["title"];
-                    });
-                }
-                success(data.d);
-            }
-        );
-    };
-
-    var readJson = function (url, success) {
-        $.ajax({
-            url: url,
-            accepts: null,
-            dataType: "json",
-            beforeSend: function (xhr) {
-                xhr.setRequestHeader("Accept", jsonMime);
-                xhr.setRequestHeader("MaxDataServiceVersion", "3.0");
-            },
-            success: function (data) {
-                success(data.d);
-            }
-        });
-    };
-
-    var readJsonAcrossServerPages = function (url, success) {
-        var data = [];
-        var readPage = function (url) {
-            readJson(url, function (feedData) {
-                var results = feedData.results || feedData;
-                var next = feedData.__next;
-
-                data = data.concat(results);
-                if (next) {
-                    readPage(next);
-                } else {
-                    success(data);
-                }
-            });
-        };
-
-        readPage(url);
-    }
-
-    var getReadMethod = function (mimeType, defaultEndpoint) {
-        switch (mimeType) {
-            case universalMime:
-            case atomMime:
-                return defaultEndpoint;
-            case jsonMime:
-            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 reviver = mimeType === jsonMime || mimeType === undefined ? (recognizeDates ? odataDateReviver : undefined) : oracleDateReviver;
-        var url = "./common/ODataReadOracle.svc/" + endpoint;
-        $.ajax({
-            type: method,
-            url: url,
-            data: data,
-            dataType: "text",
-            success: function (data) {
-                var json = JSON.parse(data, reviver);
-                removeProperty(json.d, "__type");
-                success(json.d);
-            }
-        });
-    };
-
-    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);
-            }
-        }
-    }
-
-    var oracleDateReviver = function (key, value) {
-        /// <summary>Revives date objects received from the oracle service</summary>
-        if (value && value["__type"] && value["__type"].search("JsDate") > -1) {
-            var data = new Date(value.milliseconds);
-            if (value["__edmType"]) {
-                data["__edmType"] = value["__edmType"];
-            }
-
-            if (value["__offset"]) {
-                data["__offset"] = value["__offset"];
-            }
-
-            return data;
-        }
-
-        return value;
-    }
-
-    var odataDateReviver = function (key, value) {
-        /// <summary>Revives date objects received from OData JSON payloads</summary>
-        var regexp = /^\/Date\((-?\d+)(\+|-)?(\d+)?\)\/$/;
-        var matches = regexp.exec(value);
-        if (matches) {
-            var milliseconds = parseInt(matches[1], 10);
-            if (!isNaN(milliseconds)) {
-                var result = new Date(milliseconds);
-                if (matches[2]) {
-                    var sign = matches[2];
-                    var offsetMinutes = parseInt(matches[3], 10);
-                    if (sign === "-") {
-                        offsetMinutes = -offsetMinutes;
-                    }
-
-                    result.setUTCMinutes(result.getUTCMinutes() - offsetMinutes);
-                    result["__edmType"] = "Edm.DateTimeOffset";
-                    result["__offset"] = minutesToOffset(offsetMinutes);
-                }
-                return result;
-            }
-        }
-
-        return value;
-    }
-
-    var minutesToOffset = function (minutes) {
-        var padIfNeeded = function (value) {
-            var result = value.toString(10);
-            return result.length < 2 ? "0" + result : result;
-        };
-
-        var sign;
-        if (minutes < 0) {
-            sign = "-";
-            minutes = -minutes;
-        } else {
-            sign = "+";
-        }
-
-        var hours = Math.floor(minutes / 60);
-        minutes = minutes - (60 * hours);
-
-        return sign + padIfNeeded(hours) + ":" + padIfNeeded(minutes);
-    };
-
-    window.ODataReadOracle = {
-        readFeed: readFeed,
-        readEntry: readEntry,
-        readFeedLoopback: readFeedLoopback,
-        readEntryLoopback: readEntryLoopback,
-        readLinksEntry: readLinksEntry,
-        readLinksFeed: readLinksFeed,
-        readJson: readJson,
-        readJsonAcrossServerPages: readJsonAcrossServerPages,
-        readMetadata: readMetadata,
-        readServiceDocument: readServiceDocument
-    };
+// 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/e387fc92/JSLib/tests/common/ODataReadOracle.svc
----------------------------------------------------------------------
diff --git a/JSLib/tests/common/ODataReadOracle.svc b/JSLib/tests/common/ODataReadOracle.svc
index 32b4d50..6a4c6f7 100644
--- a/JSLib/tests/common/ODataReadOracle.svc
+++ b/JSLib/tests/common/ODataReadOracle.svc
@@ -1,182 +1,189 @@
-<%@ 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 System.Spatial;
-    using Microsoft.Data.OData;
-
-    /// <summary>
-    /// Oracle for the OData.read library function
-    /// </summary>
-    [ServiceContract]
-    [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
-    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
-    public class ODataReadOracle
-    {
-        const string jsonVerboseMediaType = "application/json;odata=verbose";
-
-        /// <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>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 ReadMetadata(string url)
-        {
-            WebResponse response = WebRequest.Create(ResolveUri(url, UriKind.Absolute)).GetResponse();
-            return CsdlReader.ReadCsdl(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>
-        /// <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(jsonVerboseMediaType))
-            {
-                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 user, string password)
-        {
-            HttpWebRequest request = (HttpWebRequest)ReaderUtils.CreateRequest(ResolveUri(url, UriKind.Absolute), user, password);
-            request.Accept = jsonVerboseMediaType + "; charset=utf-8";
-            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();
-        }
-    }
+<%@ 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