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/02/26 12:54:58 UTC

[5/6] olingo-odata4-js git commit: [OLINGO-442] Check testcases/Cleanup Code/fix jsdoc

http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/5bff25da/src/lib/odata/json.js
----------------------------------------------------------------------
diff --git a/src/lib/odata/json.js b/src/lib/odata/json.js
index 6a6968a..f00b54c 100644
--- a/src/lib/odata/json.js
+++ b/src/lib/odata/json.js
@@ -37,6 +37,8 @@ var isObject = utils.isObject;
 //var normalizeURI = utils.normalizeURI;
 var parseInt10 = utils.parseInt10;
 var getFormatKind = utils.getFormatKind;
+var convertByteArrayToHexString = utils.convertByteArrayToHexString;
+
 
 var formatDateTimeOffset = oDataUtils.formatDateTimeOffset;
 var formatDuration = oDataUtils.formatDuration;
@@ -54,7 +56,6 @@ var lookupDefaultEntityContainer = oDataUtils.lookupDefaultEntityContainer;
 var lookupProperty = oDataUtils.lookupProperty;
 var MAX_DATA_SERVICE_VERSION = oDataUtils.MAX_DATA_SERVICE_VERSION;
 var maxVersion = oDataUtils.maxVersion;
-var XXXparseDateTime = oDataUtils.XXXparseDateTime;
 
 var isPrimitiveEdmType = oDataUtils.isPrimitiveEdmType;
 var isGeographyEdmType = oDataUtils.isGeographyEdmType;
@@ -80,81 +81,17 @@ var DELTATYPE_DELETED_LINK = "dl";
 var jsonMediaType = "application/json";
 var jsonContentType = oDataHandler.contentType(jsonMediaType);
 
+var jsonSerializableMetadata = ["@odata.id", "@odata.type"];
 
-// 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+)?\)\/$/;
-
-/** Formats the given minutes into (+/-)hh:mm format.
- * @param {Number} minutes - Number of minutes to format.
- * @returns {String} The minutes in (+/-)hh:mm format.
- */
-function minutesToOffset(minutes) {
-
-    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);
-}
-
-/** Parses the JSON Date representation into a Date object.
- * @param {String} value - String value.
- * @returns {Date} A Date object if the value matches one; falsy otherwise.
- */
-function parseJsonDateString(value) {
-
-    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.
 
-/** Parses a JSON OData payload.
+/** Extend JSON OData payload with metadata
  * @param handler - This handler.
  * @param text - Payload text (this parser also handles pre-parsed objects).
  * @param {Object} context - Object with parsing context.
- * @return An object representation of the OData payload.</returns>
+ * @return An object representation of the OData payload.
  */
 function jsonParser(handler, text, context) {
     var recognizeDates = defined(context.recognizeDates, handler.recognizeDates);
@@ -172,11 +109,11 @@ function jsonParser(handler, text, context) {
         return json;
     }
     else if (payloadFormat === 1) {
-        return readPayloadMinimal(json, model, recognizeDates);
+        return addMinimalMetadataToJsonPayload(json, model, recognizeDates);
     }
     else if (payloadFormat === 2) {
         // to do: using the EDM Model to get the type of each property instead of just guessing.
-        return readPayloadFull(json, model, recognizeDates);
+        return addFullMetadataToJsonPayload(json, model, recognizeDates);
     }
     else {
         return json;
@@ -184,47 +121,156 @@ function jsonParser(handler, text, context) {
 }
 
 
-function addType(data, name, value ) {
-    var fullName = name + '@odata.type';
 
-    if ( data[fullName] === undefined) {
-        data[fullName] = '#' + value;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+// 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+)?\)\/$/;
+
+
+// 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 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;
+    }
+};
+
+/** Serializes a ODataJs payload structure to the wire format which can be send to the server
+ * @param handler - This handler.
+ * @param data - Data to serialize.
+ * @param {Object} context - Object with serialization context.
+ * @returns {String} The string representation of data.
+ */
+function jsonSerializer(handler, data, context) {
+
+    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 = formatJsonRequestPayload(data);
+        if (newdata) {
+            return JSON.stringify(newdata,jsonReplacer);
+        }
     }
+    return undefined;
 }
 
-function addTypeNoEdm(data, name, value ) {
-    var fullName = name + '@odata.type';
 
-    if ( data[fullName] === undefined) {
-        if ( value.substring(0,4)==='Edm.') {
-            data[fullName] = '#' + value.substring(4);
-        } else {
-            data[fullName] = '#' + value;
+
+
+/** Convert OData objects for serialisation in to a new data structure
+ * @param data - Data to serialize.
+ * @returns {String} The string representation of data.
+ */
+function formatJsonRequestPayload(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] = formatJsonRequestPayload(data[i]);
         }
 
+        return newArrayData;
+    }
+
+    var newdata = {};
+    for (var property in data) {
+        if (isJsonSerializableProperty(property)) {
+            newdata[property] = formatJsonRequestPayload(data[property]);
+        }
     }
+
+    return newdata;
 }
 
-function addTypeColNoEdm(data, name, value ) {
-    var fullName = name + '@odata.type';
+/** Determine form the attribute name if the attribute is a serializable property
+ * @param attribute
+ * @returns {boolean}
+ */
+function isJsonSerializableProperty(attribute) {
+    if (!attribute) {
+        return false;
+    }
 
-    if ( data[fullName] === undefined) {
-        if ( value.substring(0,4)==='Edm.') {
-            data[fullName] = '#Collection('+value.substring(4)+ ')';
-        } else {
-            data[fullName] = '#Collection('+value+ ')';
+    if (attribute.indexOf("@odata.") == -1) {
+        return true;
+    }
+
+    var i, len;
+    for (i = 0, len = jsonSerializableMetadata.length; i < len; i++) {
+        var name = jsonSerializableMetadata[i];
+        if (attribute.indexOf(name) != -1) {
+            return true;
         }
     }
+
+    return false;
+}
+
+/** Creates an object containing information for the json payload.
+ * @param {String} kind - JSON payload kind
+ * @param {String} type - Type name of the JSON payload.
+ * @returns {Object} Object with kind and type fields.
+ */
+function jsonMakePayloadInfo(kind, type) {
+    return { kind: kind, type: type || null };
 }
 
 
-/* Adds typeinformation for String, Boolean and numerical EDM-types. 
- * The type is determined from the odata-json-format-v4.0.doc specification
- * @param data - Date which will be extendet
- * @param {Boolean} recognizeDates - True if strings formatted as datetime values should be treated as datetime values. False otherwise.
- * @returns An object representation of the OData payload.
+
+/** Add metadata to an JSON payload complex object containing full metadata
+ * @param {Object} data - Data structure to be extended
+ * @param {Object} model - Metadata model
+ * @param {Boolean} recognizeDates - Flag indicating whether datetime literal strings should be converted to JavaScript Date objects.
  */
-function readPayloadFull(data, model, recognizeDates) {
+function addFullMetadataToJsonPayload(data, model, recognizeDates) {
     var type;
     if (utils.isObject(data)) {
         for (var key in data) {
@@ -232,35 +278,40 @@ function readPayloadFull(data, model, recognizeDates) {
                 if (key.indexOf('@') === -1) {
                     if (utils.isArray(data[key])) {
                         for (var i = 0; i < data[key].length; ++i) {
-                            readPayloadFull(data[key][i], model, recognizeDates);
+                            addFullMetadataToJsonPayload(data[key][i], model, recognizeDates);
                         }
                     } else if (utils.isObject(data[key])) {
                         if (data[key] !== null) {
                             //don't step into geo.. objects
-                            var isGeo = false;
                             type = data[key+'@odata.type'];
-                            if (type && (isGeographyEdmType(type) || isGeometryEdmType(type))) {
-                                // is gemometry type
+                            if (!type) {
+                                //type unknown
+                                addFullMetadataToJsonPayload(data[key], model, recognizeDates);
                             } else {
-                                readPayloadFull(data[key], model, recognizeDates);
+                                type = type.substring(1);
+                                if  (isGeographyEdmType(type) || isGeometryEdmType(type)) {
+                                    // don't add type info for geo* types
+                                } else {
+                                    addFullMetadataToJsonPayload(data[key], model, recognizeDates);
+                                }
                             }
                         }
                     } else {
                         type = data[key + '@odata.type'];
 
                         // On .Net OData library, some basic EDM type is omitted, e.g. Edm.String, Edm.Int, and etc.
-                        // For the full metadata payload, we need to full fill the @data.type for each property if it is missing. 
+                        // For the full metadata payload, we need to full fill the @data.type for each property if it is missing.
                         // We do this is to help the OlingoJS consumers to easily get the type of each property.
                         if (!assigned(type)) {
-                            // Guessing the "type" from the type of the value is not the right way here. 
-                            // To do: we need to get the type from metadata instead of guessing. 
+                            // Guessing the "type" from the type of the value is not the right way here.
+                            // To do: we need to get the type from metadata instead of guessing.
                             var typeFromObject = typeof data[key];
                             if (typeFromObject === 'string') {
                                 addType(data, key, 'String');
                             } else if (typeFromObject === 'boolean') {
                                 addType(data, key, 'Boolean');
                             } else if (typeFromObject === 'number') {
-                                if (data[key] % 1 === 0) { // has fraction 
+                                if (data[key] % 1 === 0) { // has fraction
                                     addType(data, key, 'Int32'); // the biggst integer
                                 } else {
                                     addType(data, key, 'Decimal'); // the biggst float single,doulbe,decimal
@@ -281,96 +332,424 @@ function readPayloadFull(data, model, recognizeDates) {
     return data;
 }
 
-/** Serializes the data by returning its string representation.
- * @param handler - This handler.
- * @param data - Data to serialize.
- * @param {Object} context - Object with serialization context.
- * @returns {String} The string representation of data.
+/** Loop through the properties of an JSON payload object, look up the type info of the property and call
+ * the appropriate add*MetadataToJsonPayloadObject function
+ * @param {Object} data - Data structure to be extended
+ * @param {String} objectInfoType - Information about the data (name,type,typename,...)
+ * @param {String} baseURI - Base Url
+ * @param {Object} model - Metadata model
+ * @param {Boolean} recognizeDates - Flag indicating whether datetime literal strings should be converted to JavaScript Date objects.
  */
-function jsonSerializer(handler, data, context) {
+function checkProperties(data, objectInfoType, baseURI, model, recognizeDates) {
+    for (var name in data) {
+        if (name.indexOf("@") === -1) {
+            var curType = objectInfoType;
+            var propertyValue = data[name];
+            var property = lookupProperty(curType.property,name); //TODO SK add check for parent type
 
-    var dataServiceVersion = context.dataServiceVersion || "4.0";
-    var cType = context.contentType = context.contentType || jsonContentType;
+            while (( property === null) && (curType.baseType !== undefined)) {
+                curType = lookupEntityType(curType.baseType, model);
+                property = lookupProperty(curType.property,name);
+            }
 
-    if (cType && cType.mediaType === jsonContentType.mediaType) {
-        context.dataServiceVersion = maxVersion(dataServiceVersion, "4.0");
-        var newdata = formatJsonRequestPayload(data);
-        if (newdata) {
-            return JSON.stringify(newdata);
+            if ( isArray(propertyValue)) {
+                //data[name+'@odata.type'] = '#' + property.type;
+                if (isCollectionType(property.type)) {
+                    addTypeColNoEdm(data,name,property.type.substring(11,property.type.length-1));
+                } else {
+                    addTypeNoEdm(data,name,property.type);
+                }
+
+
+                for ( var i = 0; i < propertyValue.length; i++) {
+                    addMetadataToJsonMinimalPayloadComplex(propertyValue[i], property, baseURI, model, recognizeDates);
+                }
+            } else if (isObject(propertyValue) && (propertyValue !== null)) {
+                addMetadataToJsonMinimalPayloadComplex(propertyValue, property, baseURI, model, recognizeDates);
+            } else {
+                //data[name+'@odata.type'] = '#' + property.type;
+                addTypeNoEdm(data,name,property.type);
+                if (recognizeDates) {
+                    convertDates(data, name, property.type);
+                }
+            }
         }
     }
-
-    return undefined;
 }
 
-function formatJsonRequestPayload(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] = formatJsonRequestPayload(data[i]);
-        }
+/** Add metadata to an JSON payload object containing minimal metadata
+ * @param {Object} data - Json response payload object
+ * @param {Object} model - Object describing an OData conceptual schema
+ * @param {Boolean} recognizeDates - Flag indicating whether datetime literal strings should be converted to JavaScript Date objects.
+ * @returns {Object} Object in the library's representation.
+ */
+function addMinimalMetadataToJsonPayload(data, model, recognizeDates) {
 
-        return newArrayData;
+    if (!assigned(model) || isArray(model)) {
+        return data;
     }
 
-    var newdata = {};
-    for (var property in data) {
-        if (isJsonSerializableProperty(property)) {
-            newdata[property] = formatJsonRequestPayload(data[property]);
+    var baseURI = data[contextUrlAnnotation];
+    var payloadInfo = createPayloadInfo(data, model);
+
+    switch (payloadInfo.detectedPayloadKind) {
+
+        case PAYLOADTYPE_VALUE:
+            if (payloadInfo.type !== null) {
+                return addMetadataToJsonMinimalPayloadEntity(data, payloadInfo, baseURI, model, recognizeDates);
+            } else {
+                return addTypeNoEdm(data,'value', payloadInfo.typeName);
+            }
+
+        case PAYLOADTYPE_FEED:
+            return addMetadataToJsonMinimalPayloadFeed(data, model, payloadInfo, baseURI, recognizeDates);
+
+        case PAYLOADTYPE_ENTRY:
+            return addMetadataToJsonMinimalPayloadEntity(data, payloadInfo, baseURI, model, recognizeDates);
+
+        case PAYLOADTYPE_COLLECTION:
+            return addMetadataToJsonMinimalPayloadCollection(data, model, payloadInfo, baseURI, recognizeDates);
+
+        case PAYLOADTYPE_PROPERTY:
+            if (payloadInfo.type !== null) {
+                return addMetadataToJsonMinimalPayloadEntity(data, payloadInfo, baseURI, model, recognizeDates);
+            } else {
+                return addTypeNoEdm(data,'value', payloadInfo.typeName);
+            }
+
+        case PAYLOADTYPE_SVCDOC:
+            return data;
+
+        case PAYLOADTYPE_LINKS:
+            return data;
+    }
+
+    return data;
+}
+
+/** Add metadata to an JSON payload feed object containing minimal metadata
+ * @param {Object} data - Data structure to be extended
+ * @param {Object} model - Metadata model
+ * @param {String} feedInfo - Information about the data (name,type,typename,...)
+ * @param {String} baseURI - Base Url
+ * @param {Boolean} recognizeDates - Flag indicating whether datetime literal strings should be converted to JavaScript Date objects.
+ */
+function addMetadataToJsonMinimalPayloadFeed(data, model, feedInfo, baseURI, recognizeDates) {
+    var entries = [];
+    var items = data.value;
+    var i,len;
+    var entry;
+    for (i = 0, len = items.length; i < len; i++) {
+        var item = items[i];
+        if ( defined(item['@odata.type'])) { // in case of mixed feeds
+            var typeName = item['@odata.type'].substring(1);
+            var type = lookupEntityType( typeName, model);
+            var entryInfo = {
+                contentTypeOdata : feedInfo.contentTypeOdata,
+                detectedPayloadKind : feedInfo.detectedPayloadKind,
+                name : feedInfo.name,
+                type : type,
+                typeName : typeName
+            };
+
+            entry = addMetadataToJsonMinimalPayloadEntity(item, entryInfo, baseURI, model, recognizeDates);
+        } else {
+            entry = addMetadataToJsonMinimalPayloadEntity(item, feedInfo, baseURI, model, recognizeDates);
         }
+
+        entries.push(entry);
     }
+    data.value = entries;
+    return data;
+}
 
-    return newdata;
+
+/** Add metadata to an JSON payload entity object containing minimal metadata
+ * @param {Object} data - Data structure to be extended
+ * @param {String} objectInfo - Information about the data (name,type,typename,...)
+ * @param {String} baseURI - Base Url
+ * @param {Object} model - Metadata model
+ * @param {Boolean} recognizeDates - Flag indicating whether datetime literal strings should be converted to JavaScript Date objects.
+ */
+function addMetadataToJsonMinimalPayloadEntity(data, objectInfo, baseURI, model, recognizeDates) {
+    addType(data,'',objectInfo.typeName);
+
+    var keyType = objectInfo.type;
+    while ((defined(keyType)) && ( keyType.key === undefined) && (keyType.baseType !== undefined)) {
+        keyType = lookupEntityType(keyType.baseType, model);
+    }
+
+    if (keyType.key !== undefined) {
+        var lastIdSegment = objectInfo.name + jsonGetEntryKey(data, keyType);
+        data['@odata.id'] = baseURI.substring(0, baseURI.lastIndexOf("$metadata")) + lastIdSegment;
+        data['@odata.editLink'] = lastIdSegment;
+    }
+
+    //var serviceURI = baseURI.substring(0, baseURI.lastIndexOf("$metadata"));
+
+    checkProperties(data, objectInfo.type, baseURI, model, recognizeDates);
+
+    return data;
 }
 
-/** JSON replacer function for converting a value to its JSON representation.
- * @param {Object} value - Value to convert.</param>
- * @returns {String} JSON representation of the input value.
- * This method is used during JSON serialization and invoked only by the JSON.stringify function.
- * It should never be called directly.
+/** Add metadata to an JSON payload complex object containing minimal metadata
+ * @param {Object} data - Data structure to be extended
+ * @param {String} property - Information about the data (name,type,typename,...)
+ * @param {String} baseURI - Base Url
+ * @param {Object} model - Metadata model
+ * @param {Boolean} recognizeDates - Flag indicating whether datetime literal strings should be converted to JavaScript Date objects.
  */
-function jsonReplacer(_, value) {
-    
+function addMetadataToJsonMinimalPayloadComplex(data, property, baseURI, model, recognizeDates) {
+    var type = property.type;
+    if (isCollectionType(property.type)) {
+        type =property.type.substring(11,property.type.length-1);
+    }
 
-    if (value && value.__edmType === "Edm.Time") {
-        return formatDuration(value);
-    } else {
-        return value;
+    addType(data,'',property.type);
+
+    var propertyType = lookupComplexType(type, model);
+    if (propertyType === null)  {
+        return; //TODO check what to do if the type is not known e.g. type #GeometryCollection
     }
+
+    checkProperties(data, propertyType, baseURI, model, recognizeDates);
 }
 
+/** Add metadata to an JSON payload collection object containing minimal metadata
+ * @param {Object} data - Data structure to be extended
+ * @param {Object} model - Metadata model
+ * @param {String} collectionInfo - Information about the data (name,type,typename,...)
+ * @param {String} baseURI - Base Url
+ * @param {Boolean} recognizeDates - Flag indicating whether datetime literal strings should be converted to JavaScript Date objects.
+ */
+function addMetadataToJsonMinimalPayloadCollection(data, model, collectionInfo, baseURI, recognizeDates) {
 
-/** Creates an object containing information for the json payload.
- * @param {String} kind - JSON payload kind, one of the PAYLOADTYPE_XXX constant values.
- * @param {String} typeName - Type name of the JSON payload.
- * @returns {Object} Object with kind and type fields.
+    addTypeColNoEdm(data,'', collectionInfo.typeName);
+
+    if (collectionInfo.type !== null) {
+        var entries = [];
+
+        var items = data.value;
+        var i,len;
+        var entry;
+        for (i = 0, len = items.length; i < len; i++) {
+            var item = items[i];
+            if ( defined(item['@odata.type'])) { // in case of mixed collections
+                var typeName = item['@odata.type'].substring(1);
+                var type = lookupEntityType( typeName, model);
+                var entryInfo = {
+                    contentTypeOdata : collectionInfo.contentTypeOdata,
+                    detectedPayloadKind : collectionInfo.detectedPayloadKind,
+                    name : collectionInfo.name,
+                    type : type,
+                    typeName : typeName
+                };
+
+                entry = addMetadataToJsonMinimalPayloadEntity(item, entryInfo, baseURI, model, recognizeDates);
+            } else {
+                entry = addMetadataToJsonMinimalPayloadEntity(item, collectionInfo, baseURI, model, recognizeDates);
+            }
+
+            entries.push(entry);
+        }
+        data.value = entries;
+    }
+    return data;
+}
+
+/** Add an OData type tag to an JSON payload object
+ * @param {Object} data - Data structure to be extended
+ * @param {String} name - Name of the property whose type is set
+ * @param {String} value - Type name
  */
-function jsonMakePayloadInfo(kind, type) {
+function addType(data, name, value ) {
+    var fullName = name + '@odata.type';
 
-    /// TODO docu
-    /// <field name="kind" type="String">Kind of the JSON payload. One of the PAYLOADTYPE_XXX constant values.</field>
-    /// <field name="type" type="String">Data type of the JSON payload.</field>
+    if ( data[fullName] === undefined) {
+        data[fullName] = '#' + value;
+    }
+}
 
-    return { kind: kind, type: type || null };
+/** Add an OData type tag to an JSON payload object collection (without "Edm." namespace)
+ * @param {Object} data - Data structure to be extended
+ * @param {String} name - Name of the property whose type is set
+ * @param {String} typeName - Type name
+ */
+function addTypeColNoEdm(data, name, typeName ) {
+    var fullName = name + '@odata.type';
+
+    if ( data[fullName] === undefined) {
+        if ( typeName.substring(0,4)==='Edm.') {
+            data[fullName] = '#Collection('+typeName.substring(4)+ ')';
+        } else {
+            data[fullName] = '#Collection('+typeName+ ')';
+        }
+    }
+}
+
+
+/** Add an OData type tag to an JSON payload object (without "Edm." namespace)
+ * @param {Object} data - Data structure to be extended
+ * @param {String} name - Name of the property whose type is set
+ * @param {String} value - Type name
+ */
+function addTypeNoEdm(data, name, value ) {
+    var fullName = name + '@odata.type';
+
+    if ( data[fullName] === undefined) {
+        if ( value.substring(0,4)==='Edm.') {
+            data[fullName] = '#' + value.substring(4);
+        } else {
+            data[fullName] = '#' + value;
+        }
+    }
+    return data;
+}
+/** Convert the date/time format of an property from the JSON payload object (without "Edm." namespace)
+ * @param {Object} data - Data structure to be extended
+ * @param propertyName - Name of the property to be changed
+ * @param type - Type
+ */
+function convertDates(data, propertyName,type) {
+    if (type === 'Edm.Date') {
+        data[propertyName] = oDataUtils.parseDate(data[propertyName], true);
+    } else if (type === 'Edm.DateTimeOffset') {
+        data[propertyName] = oDataUtils.parseDateTimeOffset(data[propertyName], true);
+    } else if (type === 'Edm.Duration') {
+        data[propertyName] = oDataUtils.parseDuration(data[propertyName], true);
+    } else if (type === 'Edm.Time') {
+        data[propertyName] = oDataUtils.parseTime(data[propertyName], true);
+    }
+}
+
+/** Convert the date/time format of an property from the JSON payload object
+ * @param {Object} data - Data structure to be extended
+ * @param propertyName - Name of the property to be changed
+ * @param type - Type
+ */
+function convertDatesNoEdm(data, propertyName,type) {
+    if (type === 'Date') {
+        data[propertyName] = oDataUtils.parseDate(data[propertyName], true);
+    } else if (type === 'DateTimeOffset') {
+        data[propertyName] = oDataUtils.parseDateTimeOffset(data[propertyName], true);
+    } else if (type === 'Duration') {
+        data[propertyName] = oDataUtils.parseDuration(data[propertyName], true);
+    } else if (type === 'Time') {
+        data[propertyName] = oDataUtils.parseTime(data[propertyName], true);
+    }
+}
+
+/** Formats a value according to Uri literal format
+ * @param value - Value to be formatted.
+ * @param type - Edm type of the value
+ * @returns {string} Value after formatting
+ */
+function formatLiteral(value, type) {
+
+    value = "" + formatRawLiteral(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;
+    }
+}
+
+/** convert raw byteArray to hexString if the property is an binary property
+ * @param value - Value to be formatted.
+ * @param type - Edm type of the value
+ * @returns {string} Value after formatting
+ */
+function formatRawLiteral(value, type) {
+    switch (type) {
+        case "Edm.Binary":
+            return convertByteArrayToHexString(value);
+        default:
+            return value;
+    }
+}
+
+/** Formats the given minutes into (+/-)hh:mm format.
+ * @param {Number} minutes - Number of minutes to format.
+ * @returns {String} The minutes in (+/-)hh:mm format.
+ */
+function minutesToOffset(minutes) {
+
+    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);
+}
+
+/** Parses the JSON Date representation into a Date object.
+ * @param {String} value - String value.
+ * @returns {Date} A Date object if the value matches one; falsy otherwise.
+ */
+function parseJsonDateString(value) {
+
+    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.
 }
 
 /** Creates an object containing information for the context
- * TODO check dou layout
- * @returns {Object} Object with type information
- * @returns {Object.detectedPayloadKind(optional)}  see constants starting with PAYLOADTYPE_
- * @returns {Object.deltaKind(optional)}  deltainformation, one of the following valus DELTATYPE_FEED | DELTATYPE_DELETED_ENTRY | DELTATYPE_LINK | DELTATYPE_DELETED_LINK
- * @returns {Object.typeName(optional)}  name of the type
- * @returns {Object.type(optional)}  object containing type information for entity- and complex-types ( null if a typeName is a primitive)
-*/
+ * @param {String} fragments - Uri fragment
+ * @param {Object} model - Object describing an OData conceptual schema
+ * @returns {Object} type(optional)  object containing type information for entity- and complex-types ( null if a typeName is a primitive)
+ */
 function parseContextUriFragment( fragments, model ) {
     var ret = {};
 
@@ -395,14 +774,14 @@ function parseContextUriFragment( fragments, model ) {
         } else {
             //TODO check for navigation resource
         }
-    } 
+    }
 
     ret.type = undefined;
     ret.typeName = undefined;
 
     var fragmentParts = fragments.split("/");
     var type;
-    
+
     for(var i = 0; i < fragmentParts.length; ++i) {
         var fragment = fragmentParts[i];
         if (ret.typeName === undefined) {
@@ -414,7 +793,7 @@ function parseContextUriFragment( fragments, model ) {
                     if ( fragment.charAt(index)=='(') {
                         rCount --;
                     } else if ( fragment.charAt(index)==')') {
-                        rCount ++;    
+                        rCount ++;
                     }
                 }
 
@@ -422,7 +801,7 @@ function parseContextUriFragment( fragments, model ) {
                     //TODO throw error
                 }
 
-                //remove the projected entity from the fragment; TODO decide if we want to store the projected entity 
+                //remove the projected entity from the fragment; TODO decide if we want to store the projected entity
                 var inPharenthesis = fragment.substring(index+2,fragment.length - 1);
                 fragment = fragment.substring(0,index+1);
 
@@ -482,7 +861,7 @@ function parseContextUriFragment( fragments, model ) {
                 continue;
             }
 
-            
+
 
             //TODO throw ERROR
         } else {
@@ -492,7 +871,7 @@ function parseContextUriFragment( fragments, model ) {
                 ret.detectedPayloadKind = PAYLOADTYPE_ENTRY;
                 // Capter 10.3 and 10.6
                 continue;
-            } 
+            }
 
             //check for derived types
             if (fragment.indexOf('.') !== -1) {
@@ -518,18 +897,18 @@ function parseContextUriFragment( fragments, model ) {
                 if (property !== null) {
                     //PAYLOADTYPE_COLLECTION
                     ret.typeName = property.type;
-                    
-                    
+
+
                     if (utils.startsWith(property.type, 'Collection')) {
                         ret.detectedPayloadKind = PAYLOADTYPE_COLLECTION;
                         var tmp12 =  property.type.substring(10+1,property.type.length - 1);
                         ret.typeName = tmp12;
-                        ret.type = lookupComplexType(tmp12, model);    
+                        ret.type = lookupComplexType(tmp12, model);
                         ret.detectedPayloadKind = PAYLOADTYPE_COLLECTION;
                     } else {
-                        ret.type = lookupComplexType(property.type, model);    
+                        ret.type = lookupComplexType(property.type, model);
                         ret.detectedPayloadKind = PAYLOADTYPE_PROPERTY;
-                    }    
+                    }
 
                     ret.name = fragment;
                     // Capter 10.15
@@ -557,6 +936,7 @@ function parseContextUriFragment( fragments, model ) {
     return ret;
 }
 
+
 /** Infers the information describing the JSON payload from its metadata annotation, structure, and data model.
  * @param {Object} data - Json response payload object.
  * @param {Object} model - Object describing an OData conceptual schema.
@@ -565,10 +945,8 @@ function parseContextUriFragment( fragments, model ) {
  * 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 payload.
  * @return Object with kind and type fields. Null if there is no metadata annotation or the payload info cannot be obtained..
-*/
+ */
 function createPayloadInfo(data, model) {
-    
-
     var metadataUri = data[contextUrlAnnotation];
     if (!metadataUri || typeof metadataUri !== "string") {
         return null;
@@ -582,45 +960,9 @@ function createPayloadInfo(data, model) {
     var fragment = metadataUri.substring(fragmentStart + 1);
     return parseContextUriFragment(fragment,model);
 }
-
-/** Processe a JSON response payload with metadata-minimal
- * @param {Object} data - Json response payload object
- * @param {Object} model - Object describing an OData conceptual schema
- * @param {Boolean} recognizeDates - Flag indicating whether datetime literal strings should be converted to JavaScript Date objects.
- * @returns {Object} Object in the library's representation.
- */
-function readPayloadMinimal(data, model, recognizeDates) {
-
-    if (!assigned(model) || isArray(model)) {
-        return data;
-    }
-
-    var baseURI = data[contextUrlAnnotation];
-    var payloadInfo = createPayloadInfo(data, model);
-
-    switch (payloadInfo.detectedPayloadKind) {
-        case PAYLOADTYPE_VALUE:
-            return readPayloadMinimalProperty(data, model, payloadInfo, baseURI, recognizeDates);
-        case PAYLOADTYPE_FEED:
-            return readPayloadMinimalFeed(data, model, payloadInfo, baseURI, recognizeDates);
-        case PAYLOADTYPE_ENTRY:
-            return readPayloadMinimalEntry(data, model, payloadInfo, baseURI, recognizeDates);
-        case PAYLOADTYPE_COLLECTION:
-            return readPayloadMinimalCollection(data, model, payloadInfo, baseURI, recognizeDates);
-        case PAYLOADTYPE_PROPERTY:
-            return readPayloadMinimalProperty(data, model, payloadInfo, baseURI, recognizeDates);
-        case PAYLOADTYPE_SVCDOC:
-            return data;
-        case PAYLOADTYPE_LINKS:
-            return data;
-    }
-
-    return data;
-}
-
 /** Gets the key of an entry.
  * @param {Object} data - JSON entry.
- *
+ * @param {Object} data - EDM entity model for key loockup.
  * @returns {string} Entry instance key.
  */
 function jsonGetEntryKey(data, entityModel) {
@@ -647,260 +989,11 @@ function jsonGetEntryKey(data, entityModel) {
     entityInstanceKey += ")";
     return entityInstanceKey;
 }
-
-function readPayloadMinimalProperty(data, model, collectionInfo, baseURI, recognizeDates) {
-    if (collectionInfo.type !== null) {
-        readPayloadMinimalObject(data, collectionInfo, baseURI, model, recognizeDates);
-    } else {
-        addTypeNoEdm(data,'value', collectionInfo.typeName);
-        //data['value@odata.type'] = '#'+collectionInfo.typeName;
-    }
-    return data;
-}
-
-function readPayloadMinimalCollection(data, model, collectionInfo, baseURI, recognizeDates) {
-    //data['@odata.type'] = '#Collection('+collectionInfo.typeName + ')';
-    addTypeColNoEdm(data,'', collectionInfo.typeName);
-
-    if (collectionInfo.type !== null) {
-        var entries = [];
-
-        var items = data.value;
-        for (i = 0, len = items.length; i < len; i++) {
-            var item = items[i];
-            if ( defined(item['@odata.type'])) { // in case of mixed collections
-                var typeName = item['@odata.type'].substring(1);
-                var type = lookupEntityType( typeName, model);
-                var entryInfo = {
-                    contentTypeOdata : collectionInfo.contentTypeOdata,
-                    detectedPayloadKind : collectionInfo.detectedPayloadKind,
-                    name : collectionInfo.name,
-                    type : type,
-                    typeName : typeName
-                };
-
-                entry = readPayloadMinimalObject(item, entryInfo, baseURI, model, recognizeDates);
-            } else {
-                entry = readPayloadMinimalObject(item, collectionInfo, baseURI, model, recognizeDates);
-            }
-            
-            entries.push(entry);
-        }
-        data.value = entries;
-    }
-    return data;
-}
-
-function readPayloadMinimalFeed(data, model, feedInfo, baseURI, recognizeDates) {
-    var entries = [];
-    var items = data.value;
-    for (i = 0, len = items.length; i < len; i++) {
-        var item = items[i];
-        if ( defined(item['@odata.type'])) { // in case of mixed feeds
-            var typeName = item['@odata.type'].substring(1);
-            var type = lookupEntityType( typeName, model);
-            var entryInfo = {
-                contentTypeOdata : feedInfo.contentTypeOdata,
-                detectedPayloadKind : feedInfo.detectedPayloadKind,
-                name : feedInfo.name,
-                type : type,
-                typeName : typeName
-            };
-
-            entry = readPayloadMinimalObject(item, entryInfo, baseURI, model, recognizeDates);
-        } else {
-            entry = readPayloadMinimalObject(item, feedInfo, baseURI, model, recognizeDates);
-        }
-        
-        entries.push(entry);
-    }
-    data.value = entries;
-    return data;
-}
-
-function readPayloadMinimalEntry(data, model, entryInfo, baseURI, recognizeDates) {
-    return readPayloadMinimalObject(data, entryInfo, baseURI, model, recognizeDates);
-}
-
-/** Formats a value according to Uri literal format
- * @param value - Value to be formatted.
- * @param type - Edm type of the value
- * @returns {string} Value after formatting
- */
-function formatLiteral(value, type) {
-
-    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;
-    }
-}
-
-function formatRowLiteral(value, type) {
-    switch (type) {
-        case "Edm.Binary":
-            return convertByteArrayToHexString(value);
-        default:
-            return value;
-    }
-}
-
-function convertDates(data, propertyName,type) {
-    if (type === 'Edm.Date') {
-        data[propertyName] = oDataUtils.parseDate(data[propertyName], true);
-    } else if (type === 'Edm.DateTimeOffset') {
-        data[propertyName] = oDataUtils.parseDateTimeOffset(data[propertyName], true);
-    } else if (type === 'Edm.Duration') {
-        data[propertyName] = oDataUtils.parseDuration(data[propertyName], true);
-    } else if (type === 'Edm.Time') {
-        data[propertyName] = oDataUtils.parseTime(data[propertyName], true);
-    }
-}
-
-function convertDatesNoEdm(data, propertyName,type) {
-    if (type === 'Date') {
-        data[propertyName] = oDataUtils.parseDate(data[propertyName], true);
-    } else if (type === 'DateTimeOffset') {
-        data[propertyName] = oDataUtils.parseDateTimeOffset(data[propertyName], true);
-    } else if (type === 'Duration') {
-        data[propertyName] = oDataUtils.parseDuration(data[propertyName], true);
-    } else if (type === 'Time') {
-        data[propertyName] = oDataUtils.parseTime(data[propertyName], true);
-    }
-}
-
-function checkProperties(data, objectInfoType, baseURI, model, recognizeDates) {
-    for (var name in data) {
-        if (name.indexOf("@") === -1) {
-            var curType = objectInfoType;
-            var propertyValue = data[name];
-            var property = lookupProperty(curType.property,name); //TODO SK add check for parent type
-
-            while (( property === null) && (curType.baseType !== undefined)) {
-                curType = lookupEntityType(curType.baseType, model);
-                property = lookupProperty(curType.property,name);
-            }
-            
-            if ( isArray(propertyValue)) {
-                //data[name+'@odata.type'] = '#' + property.type;
-                if (isCollectionType(property.type)) {
-                    addTypeColNoEdm(data,name,property.type.substring(11,property.type.length-1));
-                } else {
-                    addTypeNoEdm(data,name,property.type);
-                }
-
-
-                for ( var i = 0; i < propertyValue.length; i++) {
-                    readPayloadMinimalComplexObject(propertyValue[i], property, baseURI, model, recognizeDates);
-                }
-            } else if (isObject(propertyValue) && (propertyValue !== null)) {
-                readPayloadMinimalComplexObject(propertyValue, property, baseURI, model, recognizeDates);
-            } else {
-                //data[name+'@odata.type'] = '#' + property.type;
-                addTypeNoEdm(data,name,property.type);
-                if (recognizeDates) {
-                    convertDates(data, name, property.type);
-                }
-            }
-        }
-    }
-}
-
-function readPayloadMinimalComplexObject(data, property, baseURI, model, recognizeDates) {
-    var type = property.type;
-    if (isCollectionType(property.type)) {
-        type =property.type.substring(11,property.type.length-1);
-    }
-
-    //data['@odata.type'] = '#'+type;
-    addType(data,'',property.type);
-
-
-    var propertyType = lookupComplexType(type, model);
-    if (propertyType === null)  {
-        return; //TODO check what to do if the type is not known e.g. type #GeometryCollection
-    }
-  
-    checkProperties(data, propertyType, baseURI, model, recognizeDates);
-}
-
-function readPayloadMinimalObject(data, objectInfo, baseURI, model, recognizeDates) {
-    //data['@odata.type'] = '#'+objectInfo.typeName;
-    addType(data,'',objectInfo.typeName);
-
-    var keyType = objectInfo.type;
-    while ((defined(keyType)) && ( keyType.key === undefined) && (keyType.baseType !== undefined)) {
-        keyType = lookupEntityType(keyType.baseType, model);
-    }
-
-    //if ((keyType !== undefined) && (keyType.key !== undefined)) { 
-    if (keyType.key !== undefined) { 
-        var lastIdSegment = objectInfo.name + jsonGetEntryKey(data, keyType);
-        data['@odata.id'] = baseURI.substring(0, baseURI.lastIndexOf("$metadata")) + lastIdSegment;
-        data['@odata.editLink'] = lastIdSegment;
-    }
-
-    var serviceURI = baseURI.substring(0, baseURI.lastIndexOf("$metadata"));
-    //json ComputeUrisIfMissing(data, entryInfo, actualType, serviceURI, dataModel, baseTypeModel);
-
-    checkProperties(data, objectInfo.type, baseURI, model, recognizeDates);
-    
-    return data;
-}
-
-var jsonSerializableMetadata = ["@odata.id", "@odata.type"];
-
-function isJsonSerializableProperty(property) {
-    if (!property) {
-        return false;
-    }
-
-    if (property.indexOf("@odata.") == -1) {
-        return true;
-    } 
-
-    var i, len;
-    for (i = 0, len = jsonSerializableMetadata.length; i < len; i++) {
-        var name = jsonSerializableMetadata[i];
-        if (property.indexOf(name) != -1) {
-            return true;
-        }
-    }
-
-    return false;
-}
-
 /** Determines whether a type name is a primitive type in a JSON payload.
  * @param {String} typeName - Type name to test.
  * @returns {Boolean} True if the type name an EDM primitive type or an OData spatial type; false otherwise.
  */
 function jsonIsPrimitiveType(typeName) {
-
     return isPrimitiveEdmType(typeName) || isGeographyEdmType(typeName) || isGeometryEdmType(typeName);
 }
 
@@ -908,8 +1001,6 @@ function jsonIsPrimitiveType(typeName) {
 var jsonHandler = oDataHandler.handler(jsonParser, jsonSerializer, jsonMediaType, MAX_DATA_SERVICE_VERSION);
 jsonHandler.recognizeDates = false;
 
-
-
 exports.createPayloadInfo = createPayloadInfo;
 exports.jsonHandler = jsonHandler;
 exports.jsonParser = jsonParser;

http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/5bff25da/src/lib/odata/metadata.js
----------------------------------------------------------------------
diff --git a/src/lib/odata/metadata.js b/src/lib/odata/metadata.js
index e37161f..9fdcdfd 100644
--- a/src/lib/odata/metadata.js
+++ b/src/lib/odata/metadata.js
@@ -16,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+'use strict';
 
 /** @module odata/metadata */
 
@@ -363,7 +364,7 @@ var schema = {
 /** Converts a Pascal-case identifier into a camel-case identifier.
  * @param {String} text - Text to convert.
  * @returns {String} Converted text.
- * If the text starts with multiple uppercase characters, it is left as-is.</remarks>
+ * If the text starts with multiple uppercase characters, it is left as-is.
  */
 function scriptCase(text) {
 
@@ -459,7 +460,6 @@ function parseConceptualModelElement(element) {
         // 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) {
@@ -503,7 +503,7 @@ function parseConceptualModelElement(element) {
 /** Parses a metadata document.
  * @param handler - This handler.
  * @param {String} text - Metadata text.
- * @returns An object representation of the conceptual model.</returns>
+ * @returns An object representation of the conceptual model.
  */
 function metadataParser(handler, text) {
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/5bff25da/src/lib/odata/net-browser.js
----------------------------------------------------------------------
diff --git a/src/lib/odata/net-browser.js b/src/lib/odata/net-browser.js
index eec9248..8d956ff 100644
--- a/src/lib/odata/net-browser.js
+++ b/src/lib/odata/net-browser.js
@@ -41,11 +41,9 @@ var ticks = 0;
  */
 function canUseJSONP(request) {
     
-    if (request.method && request.method !== "GET") {
-        return false;
-    }
+    return !(request.method && request.method !== "GET");
+
 
-    return true;
 }
 
 /** Creates an IFRAME tag for loading the JSONP script
@@ -64,7 +62,7 @@ function createIFrame(url) {
 
     writeHtmlToIFrame(iframe, html);
     return iframe;
-};
+}
 
 /** Creates a XmlHttpRequest object.
  * @returns {XmlHttpRequest} XmlHttpRequest object.
@@ -129,7 +127,7 @@ function removeCallback(name, tick) {
             ticks -= 1;
         }
     }
-};
+}
 
 /** Removes an iframe.
  * @param {Object} iframe - The iframe to remove.
@@ -142,7 +140,7 @@ function removeIFrame(iframe) {
     }
 
     return null;
-};
+}
 
 /** Reads response headers into array.
  * @param {XMLHttpRequest} xhr - HTTP request with response available.
@@ -184,7 +182,12 @@ exports.defaultHttpClient = {
      * @param {Function} error - Error callback with an error object.
      * @returns {Object} Object with an 'abort' method for the operation.
      */
-    request: function (request, success, error) {
+    request: function createRequest() {
+
+        var that = this;
+
+
+        return function(request, success, error) {
 
         var result = {};
         var xhr = null;
@@ -217,9 +220,9 @@ exports.defaultHttpClient = {
 
         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);
+        var enableJsonpCallback = defined(request.enableJsonpCallback , that.enableJsonpCallback);
+        var callbackParameterName = defined(request.callbackParameterName, that.callbackParameterName);
+        var formatQueryString = defined(request.formatQueryString, that.formatQueryString);
         if (!enableJsonpCallback || isLocalUrl(url)) {
 
             xhr = createXmlHttpRequest();
@@ -331,6 +334,7 @@ exports.defaultHttpClient = {
 
         return result;
     }
+    }()
 };
 
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/5bff25da/src/lib/odata/net.js
----------------------------------------------------------------------
diff --git a/src/lib/odata/net.js b/src/lib/odata/net.js
index c3a5863..be45295 100644
--- a/src/lib/odata/net.js
+++ b/src/lib/odata/net.js
@@ -16,14 +16,14 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
+'use strict';
 /** @module odata/net */
 
 
 var http = require('http');
 var utils    = require('./../utils.js');
 var url = require("url");
-// Imports.
+
 
 var defined = utils.defined;
 var delay = utils.delay;
@@ -52,8 +52,8 @@ function canUseJSONP(request) {
 */
 function isAbsoluteUrl(url) {
     return url.indexOf("http://") === 0 ||
-        url.indexOf("https://") === 0 ||
-        url.indexOf("file://") === 0;
+           url.indexOf("https://") === 0 ||
+           url.indexOf("file://") === 0;
 }
 
 /** Checks whether the specified URL is local to the current context.
@@ -74,15 +74,13 @@ function isLocalUrl(url) {
 
 
 /** Reads response headers into array.
- * @param {XMLHttpRequest} xhr - HTTP request with response available.
- * @param {Array} headers - Target array to fill with name/value pairs.
+ * @param {Object} inHeader
+ * @param {Array} outHeader
  */
 function readResponseHeaders(inHeader, outHeader) {
     for (var property in inHeader) {
         
         if (inHeader.hasOwnProperty(property)) {
-            //console.log(property);
-            //console.log(inHeader[property]);
             outHeader[property] = inHeader[property];
         }
     }
@@ -120,11 +118,9 @@ exports.defaultHttpClient = {
         }   
         
 
-        //console.log('options'+JSON.stringify(options));
         var xhr = http.request(options);
 
         result.abort = function () {
-            //console.log('_4');
             if (done) {
                 return;
             }
@@ -140,7 +136,6 @@ exports.defaultHttpClient = {
 
         // Set the timeout if available.
         if (request.timeoutMS) {
-            //console.log('_6');
             xhr.setTimeout(request.timeoutMS,function () {
                 if (!done) {
                     done = true;
@@ -151,40 +146,31 @@ exports.defaultHttpClient = {
         }
 
         xhr.on('error', function(e) {
-            //console.log('_22'+e);
             var response = { requestUri: url, statusCode: 400, statusText: e.message };
             error({ message: "HTTP request failed", request: request, response: response });
         });
              
 
         xhr.on('response', function (resp) {
-            //console.log('1');
             if (done || xhr === null) {
                 return;
             }
-            //console.log('2');
-            
+
             var headers = [];
             readResponseHeaders(resp.headers, headers);
                         
             var body = '';
 
             resp.on('data', function(chunk) {
-                ///console.log('chunk'+JSON.stringify(chunk));
                 body+=chunk;
-                //console.log('3');
-                
             });
             resp.on('end', function() {
-                //console.log('4');
                 // do what you do
                 var response = { requestUri: url, statusCode: resp.statusCode, statusText: '', headers: headers, body: body };
 
                 done = true;
                 xhr = null;
                 if (resp.statusCode >= 200 && resp.statusCode <= 299) {
-                    //console.log('5');
-                    //console.log(response);
                     success(response);
                 } else {
                     error({ message: "HTTP request failed", request: request, response: response });
@@ -193,16 +179,11 @@ exports.defaultHttpClient = {
         });
 
         //xhr.open(request.method || "GET", url, true,);
-        //console.log(request.body);
-        //console.log('_1');
         if (request.body) {
-            //console.log('_2');
             xhr.write(request.body);
         }
-        //console.log('_3');
         xhr.end();
-        //console.log('_4');
-         
+
         return result;
     }
 };

http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/5bff25da/src/lib/odata/odatautils.js
----------------------------------------------------------------------
diff --git a/src/lib/odata/odatautils.js b/src/lib/odata/odatautils.js
index a44fa05..78b9c5a 100644
--- a/src/lib/odata/odatautils.js
+++ b/src/lib/odata/odatautils.js
@@ -16,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+'use strict';
  /** @module odata/utils */
 
 var utils    = require('./../utils.js');
@@ -200,10 +201,10 @@ function forEachSchema(metadata, callback) {
 }
 
 /** Formats a millisecond and a nanosecond value into a single string.
- * @param {Numaber} ms - Number of milliseconds to format.</param>
- * @param {Numaber} ns - Number of nanoseconds to format.</param>
+ * @param {Number} ms - Number of milliseconds to format.
+ * @param {Number} ns - Number of nanoseconds to format.
  * @returns {String} Formatted text.
- * If the value is already as string it's returned as-is.</remarks>
+ * If the value is already as string it's returned as-is.
  */
 function formatMilliseconds(ms, ns) {
 
@@ -400,7 +401,7 @@ var collectionTypeRE = /Collection\((.*)\)/;
 
 /** Tests whether a value is a collection value in the library's internal representation.
  * @param value - Value to test.
- * @param {Sting} typeName - Type name of the value. This is used to disambiguate from a collection property value.
+ * @param {String} typeName - Type name of the value. This is used to disambiguate from a collection property value.
  * @returns {Boolean} True is the value is a feed value; false otherwise.
  */
 function isCollection(value, typeName) {
@@ -464,7 +465,7 @@ function isEntry(value) {
 
 /** Tests whether a value is a feed value in the library's internal representation.
  * @param value - Value to test.
- * @param {Sting} typeName - Type name of the value. This is used to disambiguate from a collection property value.
+ * @param {String} typeName - Type name of the value. This is used to disambiguate from a collection property value.
  * @returns {Boolean} True is the value is a feed value; false otherwise.
  */
 function isFeed(value, typeName) {
@@ -481,11 +482,9 @@ function isFeed(value, typeName) {
  * @returns {Boolean} True if the type is a geography EDM type; false otherwise.
  */
 function isGeographyEdmType(typeName) {
-
     //check with edm
-    var ret = contains(geographyEdmTypes, typeName) || 
+    return contains(geographyEdmTypes, typeName) ||
         (typeName.indexOf('.') === -1 && contains(geographyTypes, typeName));
-    return ret; 
         
 }
 
@@ -494,12 +493,12 @@ function isGeographyEdmType(typeName) {
  * @returns {Boolean} True if the type is a geometry EDM type; false otherwise.
  */
 function isGeometryEdmType(typeName) {
-
-    var ret = contains(geometryEdmTypes, typeName) ||
+    return contains(geometryEdmTypes, typeName) ||
         (typeName.indexOf('.') === -1 && contains(geometryTypes, typeName));
-    return ret; 
 }
 
+
+
 /** Tests whether a value is a named stream value in the library's internal representation.
  * @param value - Value to test.
  * @returns {Boolean} True is the value is a named stream; false otherwise.
@@ -587,7 +586,7 @@ function lookupInMetadata(name, metadata, kind) {
 }
 
 /** Looks up a entity set by name.
- * @param {Array} properties - Array of entity set objects as per EDM metadata( may be null)
+ * @param {Array} entitySets - Array of entity set objects as per EDM metadata( may be null)
  * @param {String} name - Name to look for.
  * @returns {Object} The entity set object; null if not found.
  */
@@ -599,7 +598,7 @@ function lookupEntitySet(entitySets, name) {
 }
 
 /** Looks up a entity set by name.
- * @param {Array} properties - Array of entity set objects as per EDM metadata (may be null)
+ * @param {Array} singletons - Array of entity set objects as per EDM metadata (may be null)
  * @param {String} name - Name to look for.
  * @returns {Object} The entity set object; null if not found.
  */
@@ -613,7 +612,7 @@ function lookupSingleton(singletons, name) {
 /** Looks up a complex type object by name.
  * @param {String} name - Name, possibly null or empty.
  * @param metadata - Metadata store; one of edmx, schema, or an array of any of them.
- * @returns A complex type description if the name is found; null otherwise.</returns>
+ * @returns A complex type description if the name is found; null otherwise.
  */
 function lookupComplexType(name, metadata) {
 
@@ -623,7 +622,7 @@ function lookupComplexType(name, metadata) {
 /** Looks up an entity type object by name.
  * @param {String} name - Name, possibly null or empty.
  * @param metadata - Metadata store; one of edmx, schema, or an array of any of them.
- * @returns An entity type description if the name is found; null otherwise.</returns>
+ * @returns An entity type description if the name is found; null otherwise.
  */
 function lookupEntityType(name, metadata) {
 
@@ -632,9 +631,8 @@ function lookupEntityType(name, metadata) {
 
 
 /** Looks up an
- * @param {String} name - Name, possibly null or empty.
  * @param metadata - Metadata store; one of edmx, schema, or an array of any of them.
- * @returns An entity container description if the name is found; null otherwise.</returns>
+ * @returns An entity container description if the name is found; null otherwise.
  */
 function lookupDefaultEntityContainer(metadata) {
 
@@ -648,7 +646,7 @@ function lookupDefaultEntityContainer(metadata) {
 /** Looks up an entity container object by name.
  * @param {String} name - Name, possibly null or empty.
  * @param metadata - Metadata store; one of edmx, schema, or an array of any of them.
- * @returns An entity container description if the name is found; null otherwise.</returns>
+ * @returns An entity container description if the name is found; null otherwise.
  */
 function lookupEntityContainer(name, metadata) {
 
@@ -656,7 +654,7 @@ function lookupEntityContainer(name, metadata) {
 }
 
 /** Looks up a function import by name.
- * @param {Array} properties - Array of function import objects as per EDM metadata (May be null)
+ * @param {Array} functionImports - Array of function import objects as per EDM metadata (May be null)
  * @param {String} name - Name to look for.
  * @returns {Object} The entity set object; null if not found.
  */
@@ -705,7 +703,9 @@ function lookupNavigationPropertyType(navigationProperty, metadata) {
 
 /** Looks up the target entityset name for a navigation property.
  * @param {Object} navigationProperty - 
- * @param {Object} metadata - 
+ * @param {Object} sourceEntitySetName -
+ * @param {Object} metadata -
+ * metadata
  * @returns {String} The entityset name for the specified property, null if not found.
  */
 function lookupNavigationPropertyEntitySet(navigationProperty, sourceEntitySetName, metadata) {
@@ -734,7 +734,7 @@ function lookupNavigationPropertyEntitySet(navigationProperty, sourceEntitySetNa
 }
 
 /** Gets the entitySet info, container name and functionImports for an entitySet
- * @param {Object} navigationProperty - 
+ * @param {Object} entitySetName -
  * @param {Object} metadata - 
  * @returns {Object} The info about the entitySet.
  */
@@ -774,7 +774,7 @@ function removeNamespace(ns, fullName) {
  * @param {String} name - Name (assigned).
  * @param schema - Schema object as per EDM metadata.
  * @param {String} kind - Kind of object to look for as per EDM metadata.
- * @returns An entity type description if the name is found; null otherwise.</returns>
+ * @returns An entity type description if the name is found; null otherwise.
  */
 function lookupInSchema(name, schema, kind) {
 
@@ -887,6 +887,7 @@ var parseDateTimeRE = /^(-?\d{4,})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(?::(\d{2}))?(
 /** Parses a string into a DateTime value.
  * @param {String} value - Value to parse.
  * @param {Boolean} withOffset - Whether offset is expected.
+ * @param {Boolean} nullOnError - return null instead of throwing an exception
  * @returns {Date} The parsed value.
  */
 function parseDateTimeMaybeOffset(value, withOffset, nullOnError) {
@@ -971,6 +972,7 @@ function parseDateTimeMaybeOffset(value, withOffset, nullOnError) {
 
 /** Parses a string into a Date object.
  * @param {String} propertyValue - Value to parse.
+ * @param {Boolean} nullOnError - return null instead of throwing an exception
  * @returns {Date} The parsed with year, month, day set, time values are set to 0
  */
 function parseDate(propertyValue, nullOnError) {
@@ -990,6 +992,11 @@ function parseDate(propertyValue, nullOnError) {
 
 var parseTimeOfDayRE = /^(\d+):(\d+)(:(\d+)(.(\d+))?)?$/;
 
+/**Parses a time into a Date object.
+ * @param propertyValue
+ * @param {Boolean} nullOnError - return null instead of throwing an exception
+ * @returns {{h: Number, m: Number, s: Number, ms: Number}}
+ */
 function parseTimeOfDay(propertyValue, nullOnError) {
     var parts = parseTimeOfDayRE.exec(propertyValue);
 
@@ -998,15 +1005,14 @@ function parseTimeOfDay(propertyValue, nullOnError) {
         'h' :parseInt10(parts[1]),
         'm' :parseInt10(parts[2]),
         's' :parseInt10(parts[4]),
-        'ms' :parseInt10(parts[6]),
+        'ms' :parseInt10(parts[6])
      };
 }
 
 /** Parses a string into a DateTimeOffset value.
  * @param {String} propertyValue - Value to parse.
+ * @param {Boolean} nullOnError - return null instead of throwing an exception
  * @returns {Date} The parsed value.
-
-
  * 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
@@ -1138,9 +1144,10 @@ function prepareRequest(request, handler, context) {
 
 /** Traverses a tree of objects invoking callback for every value.
  * @param {Object} item - Object or array to traverse.
+ * @param {Object} owner - Pass through each callback
  * @param {Function} callback - Callback function with key and value, similar to JSON.parse reviver.
  * @returns {Object} The object with traversed properties.
- Unlike the JSON reviver, this won't delete null members.</remarks>
+ Unlike the JSON reviver, this won't delete null members.
 */
 function traverseInternal(item, owner, callback) {
 
@@ -1166,7 +1173,7 @@ function traverseInternal(item, owner, callback) {
  * @param {Object} item - Object or array to traverse.
  * @param {Function} callback - Callback function with key and value, similar to JSON.parse reviver.
  * @returns {Object} The traversed object.
- * Unlike the JSON reviver, this won't delete null members.</remarks>
+ * Unlike the JSON reviver, this won't delete null members.
 */
 function traverse(item, callback) {
 
@@ -1263,3 +1270,4 @@ exports.prepareRequest = prepareRequest;
 exports.removeNamespace = removeNamespace;
 exports.traverse = traverse;
 
+

http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/5bff25da/src/lib/store.js
----------------------------------------------------------------------
diff --git a/src/lib/store.js b/src/lib/store.js
index 5989253..9dd2701 100644
--- a/src/lib/store.js
+++ b/src/lib/store.js
@@ -16,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+//'use strict';
 
  /** @module store */
 
@@ -49,6 +50,13 @@ exports.createStore = function (name, mechanism) {
     throw { message: "Failed to create store", name: name, mechanism: mechanism };
 };
 
+
+var mechanisms = {
+    indexeddb: IndexedDBStore,
+    dom: DomStore,
+    memory: MemoryStore
+};
+
 exports.mechanisms = mechanisms;
 
 
@@ -56,8 +64,3 @@ exports.DomStore       = DomStore       = require('./store/dom.js');
 exports.IndexedDBStore = IndexedDBStore = require('./store/indexeddb.js');
 exports.MemoryStore    = MemoryStore    = require('./store/memory.js');
 
-var mechanisms = {
-    indexeddb: IndexedDBStore,
-    dom: DomStore,
-    memory: MemoryStore
-};
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/5bff25da/src/lib/store/dom.js
----------------------------------------------------------------------
diff --git a/src/lib/store/dom.js b/src/lib/store/dom.js
index 355b70e..e14bb6b 100644
--- a/src/lib/store/dom.js
+++ b/src/lib/store/dom.js
@@ -16,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+'use strict';
 
 /** @module store/dom */
 
@@ -46,7 +47,8 @@ function domStoreDateToJSON() {
 /** This method is used during JSON parsing and invoked only by the reviver function.
  * It should never be called directly.
  * @summary JSON reviver function for converting an object representing a Date in a JSON stream to a Date object
- * @param Object - Object to convert.
+ * @param value _
+ * @param value - Object to convert.
  * @returns {Date} Date object.
  */
 function domStoreJSONToDate(_, value) {
@@ -116,8 +118,8 @@ DomStore.isSupported = function () {
  * @method module:store/dom~DomStore#add
  * @param {String} key - Key string.
  * @param value - Value that is going to be added to the store.
- * @param {Funcktion} success - Callback for a successful add operation.</param>
- * @param {Funcktion} [error] - Callback for handling errors. If not specified then store.defaultError is invoked.</param>
+ * @param {Function} success - Callback for a successful add operation.
+ * @param {Function} [error] - Callback for handling errors. If not specified then store.defaultError is invoked.
  * This method errors out if the store already contains the specified key.
  */
 DomStore.prototype.add = function (key, value, success, error) {
@@ -137,8 +139,8 @@ DomStore.prototype.add = function (key, value, success, error) {
  * @method module:store/dom~DomStore#addOrUpdate
  * @param {String} key - Key string.
  * @param value - Value that is going to be added or updated to the store.
- * @param {Function} success - Callback for a successful add or update operation.</param>
- * @param {Function} [error] - Callback for handling errors. If not specified then store.defaultError is invoked.</param>
+ * @param {Function} success - Callback for a successful add or update operation.
+ * @param {Function} [error] - Callback for handling errors. If not specified then store.defaultError is invoked.
  */
 DomStore.prototype.addOrUpdate = function (key, value, success, error) {
     error = error || this.defaultError;
@@ -175,8 +177,8 @@ DomStore.prototype.addOrUpdate = function (key, value, success, error) {
 /** In case of an error, this method will not restore any keys that might have been deleted at that point.
  * @summary Removes all the data associated with this store object.
  * @method module:store/dom~DomStore#clear
- * @param {Function} success - Callback for a successful clear operation.</param>
- * @param {Function} [error] - Callback for handling errors. If not specified then store.defaultError is invoked.</param>
+ * @param {Function} success - Callback for a successful clear operation.
+ * @param {Function} [error] - Callback for handling errors. If not specified then store.defaultError is invoked.
  */
 DomStore.prototype.clear = function (success, error) {
 
@@ -209,8 +211,8 @@ DomStore.prototype.close = function () {
 /** Checks whether a key exists in the store.
  * @method module:store/dom~DomStore#contains
  * @param {String} key - Key string.
- * @param {Function} success - Callback indicating whether the store contains the key or not.</param>
- * @param {Function} [error] - Callback for handling errors. If not specified then store.defaultError is invoked.</param>
+ * @param {Function} success - Callback indicating whether the store contains the key or not.
+ * @param {Function} [error] - Callback for handling errors. If not specified then store.defaultError is invoked.
 */
 DomStore.prototype.contains = function (key, success, error) {
     error = error || this.defaultError;
@@ -227,8 +229,8 @@ DomStore.prototype.defaultError = throwErrorCallback;
 
 /** Gets all the keys that exist in the store.
  * @method module:store/dom~DomStore#getAllKeys
- * @param {Function} success - Callback for a successful get operation.</param>
- * @param {Function} [error] - Callback for handling errors. If not specified then store.defaultError is invoked.</param>
+ * @param {Function} success - Callback for a successful get operation.
+ * @param {Function} [error] - Callback for handling errors. If not specified then store.defaultError is invoked.
  */
 DomStore.prototype.getAllKeys = function (success, error) {
 
@@ -288,8 +290,8 @@ DomStore.prototype.read = function (key, success, error) {
 /** Removes a key and its value from the store.
  * @method module:store/dom~DomStore#remove
  * @param {String} key - Key string.
- * @param {Funtion} success - Callback for a successful remove operation.</param>
- * @param {Funtion} [error] - Callback for handling errors. If not specified then store.defaultError is invoked.</param>
+ * @param {Function} success - Callback for a successful remove operation.
+ * @param {Function} [error] - Callback for handling errors. If not specified then store.defaultError is invoked.
  */
 DomStore.prototype.remove = function (key, success, error) {
     error = error || this.defaultError;

http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/5bff25da/src/lib/store/indexeddb.js
----------------------------------------------------------------------
diff --git a/src/lib/store/indexeddb.js b/src/lib/store/indexeddb.js
index 0150e3f..aea0a50 100644
--- a/src/lib/store/indexeddb.js
+++ b/src/lib/store/indexeddb.js
@@ -16,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+'use strict';
 
 /** @module store/indexeddb */
 var utils = require('./../utils.js');
@@ -122,7 +123,7 @@ function openStoreDb(store, success, error) {
 
 /** Opens a new transaction to the store
  * @param {IndexedDBStore} store - The store object
- * @param {Short} mode - The read/write mode of the transaction (constants from IDBTransaction)
+ * @param {Integer} mode - The read/write mode of the transaction (constants from IDBTransaction)
  * @param {Function} success - The success callback
  * @param {Function} error - The error callback
  */
@@ -266,6 +267,7 @@ IndexedDBStore.prototype.clear = function (success, error) {
         transaction.objectStore(name).clear();
     }, error);
 };
+
 /** Closes the connection to the database
  * @method module:store/indexeddb~IndexedDBStore#close
 */

http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/5bff25da/src/lib/store/memory.js
----------------------------------------------------------------------
diff --git a/src/lib/store/memory.js b/src/lib/store/memory.js
index fa49e01..a9c69d4 100644
--- a/src/lib/store/memory.js
+++ b/src/lib/store/memory.js
@@ -16,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+'use strict';
 
 /** @module store/memory */
 
@@ -68,12 +69,12 @@ function MemoryStore(name) {
     }
 
     /** This method errors out if the store already contains the specified key.
-     * @summery Adds a new value identified by a key to the store.
+     * @summary Adds a new value identified by a key to the store.
      * @method module:store/memory~MemoryStore#add
      * @param {String} key - Key string.
      * @param value - Value that is going to be added to the store.
-     * @param {Function} success - Callback for a successful add operation.</param>
-     * @param {Function} error - Callback for handling errors. If not specified then store.defaultError is invoked.</param>
+     * @param {Function} success - Callback for a successful add operation.
+     * @param {Function} error - Callback for handling errors. If not specified then store.defaultError is invoked.
      */
     this.add = function (key, value, success, error) {
         error = getErrorCallback(error);
@@ -92,8 +93,8 @@ function MemoryStore(name) {
      * @method module:store/memory~MemoryStore#addOrUpdate
      * @param {String} key - Key string.
      * @param value - Value that is going to be added or updated to the store.
-     * @param {Function} success - Callback for a successful add or update operation.</param>
-     * @param {Function} [error] - Callback for handling errors. If not specified then store.defaultError is invoked.</param>
+     * @param {Function} success - Callback for a successful add or update operation.
+     * @param {Function} [error] - Callback for handling errors. If not specified then store.defaultError is invoked.
     */
     this.addOrUpdate = function (key, value, success, error) {
         
@@ -116,7 +117,7 @@ function MemoryStore(name) {
 
     /** Removes all the data associated with this store object.
      * @method module:store/memory~MemoryStore#clear
-     * @param {Function} success>Callback for a successful clear operation.
+     * @param {Function} success - Callback for a successful clear operation.
      */
     this.clear = function (success) {
         items = [];
@@ -128,7 +129,7 @@ function MemoryStore(name) {
     /** Checks whether a key exists in the store.
      * @method module:store/memory~MemoryStore#contains
      * @param {String} key - Key string.
-     * @param {Funktion} success - Callback indicating whether the store contains the key or not.</param>
+     * @param {Function} success - Callback indicating whether the store contains the key or not.
      */
     this.contains = function (key, success) {
         var contained = keys.hasOwnProperty(key);
@@ -137,7 +138,7 @@ function MemoryStore(name) {
 
     /** Gets all the keys that exist in the store.
      * @method module:store/memory~MemoryStore#getAllKeys
-     * @param {Function} success - Callback for a successful get operation.</param>
+     * @param {Function} success - Callback for a successful get operation.
      */
     this.getAllKeys = function (success) {
 
@@ -151,8 +152,8 @@ function MemoryStore(name) {
     /** Reads the value associated to a key in the store.
      * @method module:store/memory~MemoryStore#read
      * @param {String} key - Key string.
-     * @param {Function} Function - Callback for a successful reads operation.</param>
-     * @param {Function{}Function - Callback for handling errors. If not specified then store.defaultError is invoked.</param>
+     * @param {Function} success - Callback for a successful reads operation.
+     * @param {Function} error - Callback for handling errors. If not specified then store.defaultError is invoked.
      */
     this.read = function (key, success, error) {
         error = getErrorCallback(error);
@@ -166,8 +167,8 @@ function MemoryStore(name) {
     /** Removes a key and its value from the store.
      * @method module:store/memory~MemoryStore#remove
      * @param {String} key - Key string.
-     * @param {Function} success - Callback for a successful remove operation.</param>
-     * @param {Function} [error] - Callback for handling errors. If not specified then store.defaultError is invoked.</param>
+     * @param {Function} success - Callback for a successful remove operation.
+     * @param {Function} [error] - Callback for handling errors. If not specified then store.defaultError is invoked.
      */
     this.remove = function (key, success, error) {
         error = getErrorCallback(error);
@@ -197,8 +198,8 @@ function MemoryStore(name) {
      * @method module:store/memory~MemoryStore#update
      * @param {String} key - Key string.
      * @param value - New value.
-     * @param {Function} success - Callback for a successful update operation.</param>
-     * @param {Function} [error] - Callback for handling errors. If not specified then store.defaultError is invoked.</param>
+     * @param {Function} success - Callback for a successful update operation.
+     * @param {Function} [error] - Callback for handling errors. If not specified then store.defaultError is invoked.
      * This method errors out if the specified key is not found in the store.
      */
     this.update = function (key, value, success, error) {

http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/5bff25da/src/lib/utils.js
----------------------------------------------------------------------
diff --git a/src/lib/utils.js b/src/lib/utils.js
index 27af705..77b2cde 100644
--- a/src/lib/utils.js
+++ b/src/lib/utils.js
@@ -16,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+'use strict';
 
 /** @module datajs/utils */
 
@@ -64,7 +65,7 @@ function contains(arr, item) {
 /** Given two values, picks the first one that is not undefined.
  * @param a - First value.
  * @param b - Second value.
- * @returns a if it's a defined value; else b.</returns>
+ * @returns a if it's a defined value; else b.
  */
 function defined(a, b) {
     return (a !== undefined) ? a : b;
@@ -187,7 +188,7 @@ function throwErrorCallback(error) {
 }
 
 /** Removes leading and trailing whitespaces from a string.
- * @param {String str String to trim
+ * @param {String} str String to trim
  * @returns {String} The string with no leading or trailing whitespace.
  */
 function trimString(str) {
@@ -343,7 +344,7 @@ function normalizeURI(uri, base) {
 }
 
 /** Merges the path of a relative URI and a base URI.
- * @param {String} uriPath - Relative URI path.</param>
+ * @param {String} uriPath - Relative URI path.
  * @param {String} basePath - Base URI path.
  * @returns {String} A string with the merged path.
  */