http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/87e35975/odatajs/src/lib/odata/utils.js ---------------------------------------------------------------------- diff --git a/odatajs/src/lib/odata/utils.js b/odatajs/src/lib/odata/utils.js deleted file mode 100644 index b728f14..0000000 --- a/odatajs/src/lib/odata/utils.js +++ /dev/null @@ -1,1265 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - /** @module odata/utils */ - -var utils = require('./../odatajs/utils.js'); - -// Imports -var assigned = utils.assigned; -var contains = utils.contains; -var find = utils.find; -var isArray = utils.isArray; -var isDate = utils.isDate; -var isObject = utils.isObject; -var parseInt10 = utils.parseInt10; - - -/** Gets the type name of a data item value that belongs to a feed, an entry, a complex type property, or a collection property - * @param {string} value - Value of the data item from which the type name is going to be retrieved. - * @param {object} [metadata] - Object containing metadata about the data tiem. - * @returns {string} Data item type name; null if the type name cannot be found within the value or the metadata - * This function will first try to get the type name from the data item's value itself if it is an object with a __metadata property; otherwise - * it will try to recover it from the metadata. If both attempts fail, it will return null. - */ -var dataItemTypeName = function (value, metadata) { - var valueTypeName = ((value && value.__metadata) || {}).type; - return valueTypeName || (metadata ? metadata.type : null); -}; - -var EDM = "Edm."; -var EDM_BOOLEAN = EDM + "Boolean"; -var EDM_BYTE = EDM + "Byte"; -var EDM_SBYTE = EDM + "SByte"; -var EDM_INT16 = EDM + "Int16"; -var EDM_INT32 = EDM + "Int32"; -var EDM_INT64 = EDM + "Int64"; -var EDM_SINGLE = EDM + "Single"; -var EDM_DOUBLE = EDM + "Double"; -var EDM_DECIMAL = EDM + "Decimal"; -var EDM_STRING = EDM + "String"; - -var EDM_BINARY = EDM + "Binary"; -var EDM_DATE = EDM + "Date"; -var EDM_DATETIMEOFFSET = EDM + "DateTimeOffset"; -var EDM_DURATION = EDM + "Duration"; -var EDM_GUID = EDM + "Guid"; -var EDM_TIMEOFDAY = EDM + "Time"; - -var GEOGRAPHY = "Geography"; -var EDM_GEOGRAPHY = EDM + GEOGRAPHY; -var EDM_GEOGRAPHY_POINT = EDM_GEOGRAPHY + "Point"; -var EDM_GEOGRAPHY_LINESTRING = EDM_GEOGRAPHY + "LineString"; -var EDM_GEOGRAPHY_POLYGON = EDM_GEOGRAPHY + "Polygon"; -var EDM_GEOGRAPHY_COLLECTION = EDM_GEOGRAPHY + "Collection"; -var EDM_GEOGRAPHY_MULTIPOLYGON = EDM_GEOGRAPHY + "MultiPolygon"; -var EDM_GEOGRAPHY_MULTILINESTRING = EDM_GEOGRAPHY + "MultiLineString"; -var EDM_GEOGRAPHY_MULTIPOINT = EDM_GEOGRAPHY + "MultiPoint"; - -var GEOGRAPHY_POINT = GEOGRAPHY + "Point"; -var GEOGRAPHY_LINESTRING = GEOGRAPHY + "LineString"; -var GEOGRAPHY_POLYGON = GEOGRAPHY + "Polygon"; -var GEOGRAPHY_COLLECTION = GEOGRAPHY + "Collection"; -var GEOGRAPHY_MULTIPOLYGON = GEOGRAPHY + "MultiPolygon"; -var GEOGRAPHY_MULTILINESTRING = GEOGRAPHY + "MultiLineString"; -var GEOGRAPHY_MULTIPOINT = GEOGRAPHY + "MultiPoint"; - -var GEOMETRY = "Geometry"; -var EDM_GEOMETRY = EDM + GEOMETRY; -var EDM_GEOMETRY_POINT = EDM_GEOMETRY + "Point"; -var EDM_GEOMETRY_LINESTRING = EDM_GEOMETRY + "LineString"; -var EDM_GEOMETRY_POLYGON = EDM_GEOMETRY + "Polygon"; -var EDM_GEOMETRY_COLLECTION = EDM_GEOMETRY + "Collection"; -var EDM_GEOMETRY_MULTIPOLYGON = EDM_GEOMETRY + "MultiPolygon"; -var EDM_GEOMETRY_MULTILINESTRING = EDM_GEOMETRY + "MultiLineString"; -var EDM_GEOMETRY_MULTIPOINT = EDM_GEOMETRY + "MultiPoint"; - -var GEOMETRY_POINT = GEOMETRY + "Point"; -var GEOMETRY_LINESTRING = GEOMETRY + "LineString"; -var GEOMETRY_POLYGON = GEOMETRY + "Polygon"; -var GEOMETRY_COLLECTION = GEOMETRY + "Collection"; -var GEOMETRY_MULTIPOLYGON = GEOMETRY + "MultiPolygon"; -var GEOMETRY_MULTILINESTRING = GEOMETRY + "MultiLineString"; -var GEOMETRY_MULTIPOINT = GEOMETRY + "MultiPoint"; - -var GEOJSON_POINT = "Point"; -var GEOJSON_LINESTRING = "LineString"; -var GEOJSON_POLYGON = "Polygon"; -var GEOJSON_MULTIPOINT = "MultiPoint"; -var GEOJSON_MULTILINESTRING = "MultiLineString"; -var GEOJSON_MULTIPOLYGON = "MultiPolygon"; -var GEOJSON_GEOMETRYCOLLECTION = "GeometryCollection"; - -var primitiveEdmTypes = [ - EDM_STRING, - EDM_INT32, - EDM_INT64, - EDM_BOOLEAN, - EDM_DOUBLE, - EDM_SINGLE, - EDM_DATE, - EDM_DATETIMEOFFSET, - EDM_DURATION, - EDM_TIMEOFDAY, - EDM_DECIMAL, - EDM_GUID, - EDM_BYTE, - EDM_INT16, - EDM_SBYTE, - EDM_BINARY -]; - -var geometryEdmTypes = [ - EDM_GEOMETRY, - EDM_GEOMETRY_POINT, - EDM_GEOMETRY_LINESTRING, - EDM_GEOMETRY_POLYGON, - EDM_GEOMETRY_COLLECTION, - EDM_GEOMETRY_MULTIPOLYGON, - EDM_GEOMETRY_MULTILINESTRING, - EDM_GEOMETRY_MULTIPOINT -]; - -var geometryTypes = [ - GEOMETRY, - GEOMETRY_POINT, - GEOMETRY_LINESTRING, - GEOMETRY_POLYGON, - GEOMETRY_COLLECTION, - GEOMETRY_MULTIPOLYGON, - GEOMETRY_MULTILINESTRING, - GEOMETRY_MULTIPOINT -]; - -var geographyEdmTypes = [ - EDM_GEOGRAPHY, - EDM_GEOGRAPHY_POINT, - EDM_GEOGRAPHY_LINESTRING, - EDM_GEOGRAPHY_POLYGON, - EDM_GEOGRAPHY_COLLECTION, - EDM_GEOGRAPHY_MULTIPOLYGON, - EDM_GEOGRAPHY_MULTILINESTRING, - EDM_GEOGRAPHY_MULTIPOINT -]; - -var geographyTypes = [ - GEOGRAPHY, - GEOGRAPHY_POINT, - GEOGRAPHY_LINESTRING, - GEOGRAPHY_POLYGON, - GEOGRAPHY_COLLECTION, - GEOGRAPHY_MULTIPOLYGON, - GEOGRAPHY_MULTILINESTRING, - GEOGRAPHY_MULTIPOINT -]; - -/** Invokes a function once per schema in metadata. - * @param metadata - Metadata store; one of edmx, schema, or an array of any of them. - * @param {Function} callback - Callback function to invoke once per schema. - * @returns The first truthy value to be returned from the callback; null or the last falsy value otherwise. - */ -function forEachSchema(metadata, callback) { - - - if (!metadata) { - return null; - } - - if (isArray(metadata)) { - var i, len, result; - for (i = 0, len = metadata.length; i < len; i++) { - result = forEachSchema(metadata[i], callback); - if (result) { - return result; - } - } - - return null; - } else { - if (metadata.dataServices) { - return forEachSchema(metadata.dataServices.schema, callback); - } - - return callback(metadata); - } -} - -/** 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> - * @returns {String} Formatted text. - * If the value is already as string it's returned as-is.</remarks> - */ -function formatMilliseconds(ms, ns) { - - // Avoid generating milliseconds if not necessary. - if (ms === 0) { - ms = ""; - } else { - ms = "." + formatNumberWidth(ms.toString(), 3); - } - if (ns > 0) { - if (ms === "") { - ms = ".000"; - } - ms += formatNumberWidth(ns.toString(), 4); - } - return ms; -} - -function formatDateTimeOffsetJSON(value) { - return "\/Date(" + value.getTime() + ")\/"; -} - -/** Formats a DateTime or DateTimeOffset value a string. - * @param {Date} value - Value to format - * @returns {String} Formatted text. - * If the value is already as string it's returned as-is -´*/ -function formatDateTimeOffset(value) { - - if (typeof value === "string") { - return value; - } - - var hasOffset = isDateTimeOffset(value); - var offset = getCanonicalTimezone(value.__offset); - if (hasOffset && offset !== "Z") { - // We're about to change the value, so make a copy. - value = new Date(value.valueOf()); - - var timezone = parseTimezone(offset); - var hours = value.getUTCHours() + (timezone.d * timezone.h); - var minutes = value.getUTCMinutes() + (timezone.d * timezone.m); - - value.setUTCHours(hours, minutes); - } else if (!hasOffset) { - // Don't suffix a 'Z' for Edm.DateTime values. - offset = ""; - } - - var year = value.getUTCFullYear(); - var month = value.getUTCMonth() + 1; - var sign = ""; - if (year <= 0) { - year = -(year - 1); - sign = "-"; - } - - var ms = formatMilliseconds(value.getUTCMilliseconds(), value.__ns); - - return sign + - formatNumberWidth(year, 4) + "-" + - formatNumberWidth(month, 2) + "-" + - formatNumberWidth(value.getUTCDate(), 2) + "T" + - formatNumberWidth(value.getUTCHours(), 2) + ":" + - formatNumberWidth(value.getUTCMinutes(), 2) + ":" + - formatNumberWidth(value.getUTCSeconds(), 2) + - ms + offset; -} - -/** Converts a duration to a string in xsd:duration format. - * @param {Object} value - Object with ms and __edmType properties. - * @returns {String} String representation of the time object in xsd:duration format. - */ -function formatDuration(value) { - - var ms = value.ms; - - var sign = ""; - if (ms < 0) { - sign = "-"; - ms = -ms; - } - - var days = Math.floor(ms / 86400000); - ms -= 86400000 * days; - var hours = Math.floor(ms / 3600000); - ms -= 3600000 * hours; - var minutes = Math.floor(ms / 60000); - ms -= 60000 * minutes; - var seconds = Math.floor(ms / 1000); - ms -= seconds * 1000; - - return sign + "P" + - formatNumberWidth(days, 2) + "DT" + - formatNumberWidth(hours, 2) + "H" + - formatNumberWidth(minutes, 2) + "M" + - formatNumberWidth(seconds, 2) + - formatMilliseconds(ms, value.ns) + "S"; -} - -/** Formats the specified value to the given width. - * @param {Number} value - Number to format (non-negative). - * @param {Number} width - Minimum width for number. - * @param {Boolean} append - Flag indicating if the value is padded at the beginning (false) or at the end (true). - * @returns {String} Text representation. - */ -function formatNumberWidth(value, width, append) { - var result = value.toString(10); - while (result.length < width) { - if (append) { - result += "0"; - } else { - result = "0" + result; - } - } - - return result; -} - -/** Gets the canonical timezone representation. - * @param {String} timezone - Timezone representation. - * @returns {String} An 'Z' string if the timezone is absent or 0; the timezone otherwise. - */ -function getCanonicalTimezone(timezone) { - - return (!timezone || timezone === "Z" || timezone === "+00:00" || timezone === "-00:00") ? "Z" : timezone; -} - -/** Gets the type of a collection type name. - * @param {String} typeName - Type name of the collection. - * @returns {String} Type of the collection; null if the type name is not a collection type. - */ -function getCollectionType(typeName) { - - if (typeof typeName === "string") { - var end = typeName.indexOf(")", 10); - if (typeName.indexOf("Collection(") === 0 && end > 0) { - return typeName.substring(11, end); - } - } - return null; -} - -/** Sends a request containing OData payload to a server. -* @param request - Object that represents the request to be sent.. -* @param success - Callback for a successful read operation. -* @param error - Callback for handling errors. -* @param handler - Handler for data serialization. -* @param httpClient - HTTP client layer. -* @param context - Context used for processing the request -*/ -function invokeRequest(request, success, error, handler, httpClient, context) { - - return httpClient.request(request, function (response) { - try { - if (response.headers) { - normalizeHeaders(response.headers); - } - - if (response.data === undefined && response.statusCode !== 204) { - handler.read(response, context); - } - } catch (err) { - if (err.request === undefined) { - err.request = request; - } - if (err.response === undefined) { - err.response = response; - } - error(err); - return; - } - // errors in success handler for sync requests result in error handler calls. So here we fix this. - try { - success(response.data, response); - } catch (err) { - err.bIsSuccessHandlerError = true; - throw err; - } - }, error); -} - -/** Tests whether a value is a batch object in the library's internal representation. - * @param value - Value to test. - * @returns {Boolean} True is the value is a batch object; false otherwise. - */ -function isBatch(value) { - - return isComplex(value) && isArray(value.__batchRequests); -} - -// Regular expression used for testing and parsing for a collection type. -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. - * @returns {Boolean} True is the value is a feed value; false otherwise. - */ -function isCollection(value, typeName) { - - var colData = value && value.results || value; - return !!colData && - (isCollectionType(typeName)) || - (!typeName && isArray(colData) && !isComplex(colData[0])); -} - -/** Checks whether the specified type name is a collection type. - * @param {String} typeName - Name of type to check. - * @returns {Boolean} True if the type is the name of a collection type; false otherwise. - */ -function isCollectionType(typeName) { - return collectionTypeRE.test(typeName); -} - -/** Tests whether a value is a complex type value in the library's internal representation. - * @param value - Value to test. - * @returns {Boolean} True is the value is a complex type value; false otherwise. - */ -function isComplex(value) { - - return !!value && - isObject(value) && - !isArray(value) && - !isDate(value); -} - -/** Checks whether a Date object is DateTimeOffset value - * @param {Date} value - Value to check - * @returns {Boolean} true if the value is a DateTimeOffset, false otherwise. - */ -function isDateTimeOffset(value) { - return (value.__edmType === "Edm.DateTimeOffset" || (!value.__edmType && value.__offset)); -} - -/** Tests whether a value is a deferred navigation property in the library's internal representation. - * @param value - Value to test. - * @returns {Boolean} True is the value is a deferred navigation property; false otherwise. - */ -function isDeferred(value) { - - if (!value && !isComplex(value)) { - return false; - } - var metadata = value.__metadata || {}; - var deferred = value.__deferred || {}; - return !metadata.type && !!deferred.uri; -} - -/** Tests whether a value is an entry object in the library's internal representation. - * @param value - Value to test. - * @returns {Boolean} True is the value is an entry object; false otherwise. - */ -function isEntry(value) { - - return isComplex(value) && value.__metadata && "uri" in value.__metadata; -} - -/** 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. - * @returns {Boolean} True is the value is a feed value; false otherwise. - */ -function isFeed(value, typeName) { - - var feedData = value && value.results || value; - return isArray(feedData) && ( - (!isCollectionType(typeName)) && - (isComplex(feedData[0])) - ); -} - -/** Checks whether the specified type name is a geography EDM type. - * @param {String} typeName - Name of type to check. - * @returns {Boolean} True if the type is a geography EDM type; false otherwise. - */ -function isGeographyEdmType(typeName) { - - //check with edm - var ret = contains(geographyEdmTypes, typeName) || - (typeName.indexOf('.') === -1 && contains(geographyTypes, typeName)); - return ret; - -} - -/** Checks whether the specified type name is a geometry EDM type. - * @param {String} typeName - Name of type to check. - * @returns {Boolean} True if the type is a geometry EDM type; false otherwise. - */ -function isGeometryEdmType(typeName) { - - var ret = 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. - */ -function isNamedStream(value) { - - if (!value && !isComplex(value)) { - return false; - } - var metadata = value.__metadata; - var mediaResource = value.__mediaresource; - return !metadata && !!mediaResource && !!mediaResource.media_src; -} - -/** Tests whether a value is a primitive type value in the library's internal representation. - * @param value - Value to test. - * @returns {Boolean} True is the value is a primitive type value. - * Date objects are considered primitive types by the library. - */ -function isPrimitive(value) { - - return isDate(value) || - typeof value === "string" || - typeof value === "number" || - typeof value === "boolean"; -} - -/** Checks whether the specified type name is a primitive EDM type. - * @param {String} typeName - Name of type to check. - * @returns {Boolean} True if the type is a primitive EDM type; false otherwise. - */ -function isPrimitiveEdmType(typeName) { - - return contains(primitiveEdmTypes, typeName); -} - -/** Gets the kind of a navigation property value. - * @param value - Value of the navigation property. - * @param {Object} [propertyModel] - Object that describes the navigation property in an OData conceptual schema. - * @returns {String} String value describing the kind of the navigation property; null if the kind cannot be determined. - */ -function navigationPropertyKind(value, propertyModel) { - - if (isDeferred(value)) { - return "deferred"; - } - if (isEntry(value)) { - return "entry"; - } - if (isFeed(value)) { - return "feed"; - } - if (propertyModel && propertyModel.relationship) { - if (value === null || value === undefined || !isFeed(value)) { - return "entry"; - } - return "feed"; - } - return null; -} - -/** Looks up a property by name. - * @param {Array} properties - Array of property objects as per EDM metadata (may be null) - * @param {String} name - Name to look for. - * @returns {Object} The property object; null if not found. - */ -function lookupProperty(properties, name) { - - return find(properties, function (property) { - return property.name === name; - }); -} - -/** Looks up a 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. - * @param {String} kind - Kind of object to look for as per EDM metadata. - * @returns An type description if the name is found; null otherwise - */ -function lookupInMetadata(name, metadata, kind) { - - return (name) ? forEachSchema(metadata, function (schema) { - return lookupInSchema(name, schema, kind); - }) : null; -} - -/** Looks up a entity set by name. - * @param {Array} properties - 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. - */ -function lookupEntitySet(entitySets, name) { - - return find(entitySets, function (entitySet) { - return entitySet.name === name; - }); -} - -/** Looks up a entity set by name. - * @param {Array} properties - 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. - */ -function lookupSingleton(singletons, name) { - - return find(singletons, function (singleton) { - return singleton.name === 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> - */ -function lookupComplexType(name, metadata) { - - return lookupInMetadata(name, metadata, "complexType"); -} - -/** 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> - */ -function lookupEntityType(name, metadata) { - - return lookupInMetadata(name, metadata, "entityType"); -} - - -/** 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> - */ -function lookupDefaultEntityContainer(metadata) { - - return forEachSchema(metadata, function (schema) { - if (isObject(schema.entityContainer)) { - return schema.entityContainer; - } - }); -} - -/** 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> - */ -function lookupEntityContainer(name, metadata) { - - return lookupInMetadata(name, metadata, "entityContainer"); -} - -/** Looks up a function import by name. - * @param {Array} properties - 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. - */ -function lookupFunctionImport(functionImports, name) { - return find(functionImports, function (functionImport) { - return functionImport.name === name; - }); -} - -/** Looks up the target entity type for a navigation property. - * @param {Object} navigationProperty - - * @param {Object} metadata - - * @returns {String} The entity type name for the specified property, null if not found. - */ -function lookupNavigationPropertyType(navigationProperty, metadata) { - - var result = null; - if (navigationProperty) { - var rel = navigationProperty.relationship; - var association = forEachSchema(metadata, function (schema) { - // The name should be the namespace qualified name in 'ns'.'type' format. - var nameOnly = removeNamespace(schema.namespace, rel); - var associations = schema.association; - if (nameOnly && associations) { - var i, len; - for (i = 0, len = associations.length; i < len; i++) { - if (associations[i].name === nameOnly) { - return associations[i]; - } - } - } - return null; - }); - - if (association) { - var end = association.end[0]; - if (end.role !== navigationProperty.toRole) { - end = association.end[1]; - // For metadata to be valid, end.role === navigationProperty.toRole now. - } - result = end.type; - } - } - return result; -} - -/** Looks up the target entityset name for a navigation property. - * @param {Object} navigationProperty - - * @param {Object} metadata - - * @returns {String} The entityset name for the specified property, null if not found. - */ -function lookupNavigationPropertyEntitySet(navigationProperty, sourceEntitySetName, metadata) { - - if (navigationProperty) { - var rel = navigationProperty.relationship; - var associationSet = forEachSchema(metadata, function (schema) { - var containers = schema.entityContainer; - for (var i = 0; i < containers.length; i++) { - var associationSets = containers[i].associationSet; - if (associationSets) { - for (var j = 0; j < associationSets.length; j++) { - if (associationSets[j].association == rel) { - return associationSets[j]; - } - } - } - } - return null; - }); - if (associationSet && associationSet.end[0] && associationSet.end[1]) { - return (associationSet.end[0].entitySet == sourceEntitySetName) ? associationSet.end[1].entitySet : associationSet.end[0].entitySet; - } - } - return null; -} - -/** Gets the entitySet info, container name and functionImports for an entitySet - * @param {Object} navigationProperty - - * @param {Object} metadata - - * @returns {Object} The info about the entitySet. - */ -function getEntitySetInfo(entitySetName, metadata) { - - var info = forEachSchema(metadata, function (schema) { - var container = schema.entityContainer; - var entitySets = container.entitySet; - if (entitySets) { - for (var j = 0; j < entitySets.length; j++) { - if (entitySets[j].name == entitySetName) { - return { entitySet: entitySets[j], containerName: container.name, functionImport: container.functionImport }; - } - } - } - return null; - }); - - return info; -} - -/** Given an expected namespace prefix, removes it from a full name. - * @param {String} ns - Expected namespace. - * @param {String} fullName - Full name in 'ns'.'name' form. - * @returns {String} The local name, null if it isn't found in the expected namespace. - */ -function removeNamespace(ns, fullName) { - - if (fullName.indexOf(ns) === 0 && fullName.charAt(ns.length) === ".") { - return fullName.substr(ns.length + 1); - } - - return null; -} - -/** Looks up a schema object by name. - * @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> - */ -function lookupInSchema(name, schema, kind) { - - if (name && schema) { - // The name should be the namespace qualified name in 'ns'.'type' format. - var nameOnly = removeNamespace(schema.namespace, name); - if (nameOnly) { - return find(schema[kind], function (item) { - return item.name === nameOnly; - }); - } - } - return null; -} - -/** Compares to version strings and returns the higher one. - * @param {String} left - Version string in the form "major.minor.rev" - * @param {String} right - Version string in the form "major.minor.rev" - * @returns {String} The higher version string. - */ -function maxVersion(left, right) { - - if (left === right) { - return left; - } - - var leftParts = left.split("."); - var rightParts = right.split("."); - - var len = (leftParts.length >= rightParts.length) ? - leftParts.length : - rightParts.length; - - for (var i = 0; i < len; i++) { - var leftVersion = leftParts[i] && parseInt10(leftParts[i]); - var rightVersion = rightParts[i] && parseInt10(rightParts[i]); - if (leftVersion > rightVersion) { - return left; - } - if (leftVersion < rightVersion) { - return right; - } - } -} - -var normalHeaders = { - // Headers shared by request and response - "content-type": "Content-Type", - "content-encoding": "Content-Encoding", - "content-length": "Content-Length", - "odata-version": "OData-Version", - - // Headers used by request - "accept": "Accept", - "accept-charset": "Accept-Charset", - "if-match": "If-Match", - "if-none-match": "If-None-Match", - "odata-isolation": "OData-Isolation", - "odata-maxversion": "OData-MaxVersion", - "prefer": "Prefer", - "content-id": "Content-ID", - "content-transfer-encoding": "Content-Transfer-Encoding", - - // Headers used by response - "etag": "ETag", - "location": "Location", - "odata-entityid": "OData-EntityId", - "preference-applied": "Preference-Applied", - "retry-after": "Retry-After" -}; - -/** Normalizes headers so they can be found with consistent casing. - * @param {Object} headers - Dictionary of name/value pairs. - */ -function normalizeHeaders(headers) { - - for (var name in headers) { - var lowerName = name.toLowerCase(); - var normalName = normalHeaders[lowerName]; - if (normalName && name !== normalName) { - var val = headers[name]; - delete headers[name]; - headers[normalName] = val; - } - } -} - -/** Parses a string into a boolean value. - * @param propertyValue - Value to parse. - * @returns {Boolean} true if the property value is 'true'; false otherwise. - */ -function parseBool(propertyValue) { - - if (typeof propertyValue === "boolean") { - return propertyValue; - } - - return typeof propertyValue === "string" && propertyValue.toLowerCase() === "true"; -} - - -// The captured indices for this expression are: -// 0 - complete input -// 1,2,3 - year with optional minus sign, month, day -// 4,5,6 - hours, minutes, seconds -// 7 - optional milliseconds -// 8 - everything else (presumably offset information) -var parseDateTimeRE = /^(-?\d{4,})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(?::(\d{2}))?(?:\.(\d+))?(.*)$/; - -/** Parses a string into a DateTime value. - * @param {String} value - Value to parse. - * @param {Boolean} withOffset - Whether offset is expected. - * @returns {Date} The parsed value. - */ -function parseDateTimeMaybeOffset(value, withOffset, nullOnError) { - - // We cannot parse this in cases of failure to match or if offset information is specified. - var parts = parseDateTimeRE.exec(value); - var offset = (parts) ? getCanonicalTimezone(parts[8]) : null; - - if (!parts || (!withOffset && offset !== "Z")) { - if (nullOnError) { - return null; - } - throw { message: "Invalid date/time value" }; - } - - // Pre-parse years, account for year '0' being invalid in dateTime. - var year = parseInt10(parts[1]); - if (year <= 0) { - year++; - } - - // Pre-parse optional milliseconds, fill in default. Fail if value is too precise. - var ms = parts[7]; - var ns = 0; - if (!ms) { - ms = 0; - } else { - if (ms.length > 7) { - if (nullOnError) { - return null; - } - throw { message: "Cannot parse date/time value to given precision." }; - } - - ns = formatNumberWidth(ms.substring(3), 4, true); - ms = formatNumberWidth(ms.substring(0, 3), 3, true); - - ms = parseInt10(ms); - ns = parseInt10(ns); - } - - // Pre-parse other time components and offset them if necessary. - var hours = parseInt10(parts[4]); - var minutes = parseInt10(parts[5]); - var seconds = parseInt10(parts[6]) || 0; - if (offset !== "Z") { - // The offset is reversed to get back the UTC date, which is - // what the API will eventually have. - var timezone = parseTimezone(offset); - var direction = -(timezone.d); - hours += timezone.h * direction; - minutes += timezone.m * direction; - } - - // Set the date and time separately with setFullYear, so years 0-99 aren't biased like in Date.UTC. - var result = new Date(); - result.setUTCFullYear( - year, // Year. - parseInt10(parts[2]) - 1, // Month (zero-based for Date.UTC and setFullYear). - parseInt10(parts[3]) // Date. - ); - result.setUTCHours(hours, minutes, seconds, ms); - - if (isNaN(result.valueOf())) { - if (nullOnError) { - return null; - } - throw { message: "Invalid date/time value" }; - } - - if (withOffset) { - result.__edmType = "Edm.DateTimeOffset"; - result.__offset = offset; - } - - if (ns) { - result.__ns = ns; - } - - return result; -} - -/** Parses a string into a Date object. - * @param {String} propertyValue - Value to parse. - * @returns {Date} The parsed with year, month, day set, time values are set to 0 - */ -function parseDate(propertyValue, nullOnError) { - var parts = propertyValue.split('-'); - - if (parts.length != 3 && nullOnError) { - return null; - } - return new Date( - parseInt10(parts[0]), // Year. - parseInt10(parts[1]) - 1, // Month (zero-based for Date.UTC and setFullYear). - parseInt10(parts[2], - 0,0,0,0) // Date. - ); - -} - -var parseTimeOfDayRE = /^(\d+):(\d+)(:(\d+)(.(\d+))?)?$/; - -function parseTimeOfDay(propertyValue, nullOnError) { - var parts = parseTimeOfDayRE.exec(propertyValue); - - - return { - 'h' :parseInt10(parts[1]), - 'm' :parseInt10(parts[2]), - 's' :parseInt10(parts[4]), - 'ms' :parseInt10(parts[6]), - }; -} - -/** Parses a string into a DateTimeOffset value. - * @param {String} propertyValue - Value to parse. - * @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 - * timezone-aware Date APIs will only work with the local timezone. - */ -function parseDateTimeOffset(propertyValue, nullOnError) { - - - return parseDateTimeMaybeOffset(propertyValue, true, nullOnError); -} - -// The captured indices for this expression are: -// 0 - complete input -// 1 - direction -// 2,3,4 - years, months, days -// 5,6,7,8 - hours, minutes, seconds, miliseconds - -var parseTimeRE = /^([+-])?P(?:(\d+)Y)?(?:(\d+)M)?(?:(\d+)D)?(?:T(?:(\d+)H)?(?:(\d+)M)?(?:(\d+)(?:\.(\d+))?S)?)?/; - -function isEdmDurationValue(value) { - parseTimeRE.test(value); -} - -/** Parses a string in xsd:duration format. - * @param {String} duration - Duration value. - - * This method will throw an exception if the input string has a year or a month component. - - * @returns {Object} Object representing the time - */ -function parseDuration(duration) { - - var parts = parseTimeRE.exec(duration); - - if (parts === null) { - throw { message: "Invalid duration value." }; - } - - var years = parts[2] || "0"; - var months = parts[3] || "0"; - var days = parseInt10(parts[4] || 0); - var hours = parseInt10(parts[5] || 0); - var minutes = parseInt10(parts[6] || 0); - var seconds = parseFloat(parts[7] || 0); - - if (years !== "0" || months !== "0") { - throw { message: "Unsupported duration value." }; - } - - var ms = parts[8]; - var ns = 0; - if (!ms) { - ms = 0; - } else { - if (ms.length > 7) { - throw { message: "Cannot parse duration value to given precision." }; - } - - ns = formatNumberWidth(ms.substring(3), 4, true); - ms = formatNumberWidth(ms.substring(0, 3), 3, true); - - ms = parseInt10(ms); - ns = parseInt10(ns); - } - - ms += seconds * 1000 + minutes * 60000 + hours * 3600000 + days * 86400000; - - if (parts[1] === "-") { - ms = -ms; - } - - var result = { ms: ms, __edmType: "Edm.Time" }; - - if (ns) { - result.ns = ns; - } - return result; -} - -/** Parses a timezone description in (+|-)nn:nn format. - * @param {String} timezone - Timezone offset. - * @returns {Object} An object with a (d)irection property of 1 for + and -1 for -, offset (h)ours and offset (m)inutes. - */ -function parseTimezone(timezone) { - - var direction = timezone.substring(0, 1); - direction = (direction === "+") ? 1 : -1; - - var offsetHours = parseInt10(timezone.substring(1)); - var offsetMinutes = parseInt10(timezone.substring(timezone.indexOf(":") + 1)); - return { d: direction, h: offsetHours, m: offsetMinutes }; -} - -/** Prepares a request object so that it can be sent through the network. -* @param request - Object that represents the request to be sent. -* @param handler - Handler for data serialization -* @param context - Context used for preparing the request -*/ -function prepareRequest(request, handler, context) { - - // Default to GET if no method has been specified. - if (!request.method) { - request.method = "GET"; - } - - if (!request.headers) { - request.headers = {}; - } else { - normalizeHeaders(request.headers); - } - - if (request.headers.Accept === undefined) { - request.headers.Accept = handler.accept; - } - - if (assigned(request.data) && request.body === undefined) { - handler.write(request, context); - } - - if (!assigned(request.headers["OData-MaxVersion"])) { - request.headers["OData-MaxVersion"] = handler.maxDataServiceVersion || "4.0"; - } - - if (request.async === undefined) { - request.async = true; - } - -} - -/** Traverses a tree of objects invoking callback for every value. - * @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 object with traversed properties. - Unlike the JSON reviver, this won't delete null members.</remarks> -*/ -function traverseInternal(item, owner, callback) { - - if (item && typeof item === "object") { - for (var name in item) { - var value = item[name]; - var result = traverseInternal(value, name, callback); - result = callback(name, result, owner); - if (result !== value) { - if (value === undefined) { - delete item[name]; - } else { - item[name] = result; - } - } - } - } - - return item; -} - -/** Traverses a tree of objects invoking callback for every value. - * @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> -*/ -function traverse(item, callback) { - - return callback("", traverseInternal(item, "", callback)); -} - -exports.dataItemTypeName = dataItemTypeName; -exports.EDM_BINARY = EDM_BINARY; -exports.EDM_BOOLEAN = EDM_BOOLEAN; -exports.EDM_BYTE = EDM_BYTE; -exports.EDM_DATE = EDM_DATE; -exports.EDM_DATETIMEOFFSET = EDM_DATETIMEOFFSET; -exports.EDM_DURATION = EDM_DURATION; -exports.EDM_DECIMAL = EDM_DECIMAL; -exports.EDM_DOUBLE = EDM_DOUBLE; -exports.EDM_GEOGRAPHY = EDM_GEOGRAPHY; -exports.EDM_GEOGRAPHY_POINT = EDM_GEOGRAPHY_POINT; -exports.EDM_GEOGRAPHY_LINESTRING = EDM_GEOGRAPHY_LINESTRING; -exports.EDM_GEOGRAPHY_POLYGON = EDM_GEOGRAPHY_POLYGON; -exports.EDM_GEOGRAPHY_COLLECTION = EDM_GEOGRAPHY_COLLECTION; -exports.EDM_GEOGRAPHY_MULTIPOLYGON = EDM_GEOGRAPHY_MULTIPOLYGON; -exports.EDM_GEOGRAPHY_MULTILINESTRING = EDM_GEOGRAPHY_MULTILINESTRING; -exports.EDM_GEOGRAPHY_MULTIPOINT = EDM_GEOGRAPHY_MULTIPOINT; -exports.EDM_GEOMETRY = EDM_GEOMETRY; -exports.EDM_GEOMETRY_POINT = EDM_GEOMETRY_POINT; -exports.EDM_GEOMETRY_LINESTRING = EDM_GEOMETRY_LINESTRING; -exports.EDM_GEOMETRY_POLYGON = EDM_GEOMETRY_POLYGON; -exports.EDM_GEOMETRY_COLLECTION = EDM_GEOMETRY_COLLECTION; -exports.EDM_GEOMETRY_MULTIPOLYGON = EDM_GEOMETRY_MULTIPOLYGON; -exports.EDM_GEOMETRY_MULTILINESTRING = EDM_GEOMETRY_MULTILINESTRING; -exports.EDM_GEOMETRY_MULTIPOINT = EDM_GEOMETRY_MULTIPOINT; -exports.EDM_GUID = EDM_GUID; -exports.EDM_INT16 = EDM_INT16; -exports.EDM_INT32 = EDM_INT32; -exports.EDM_INT64 = EDM_INT64; -exports.EDM_SBYTE = EDM_SBYTE; -exports.EDM_SINGLE = EDM_SINGLE; -exports.EDM_STRING = EDM_STRING; -exports.EDM_TIMEOFDAY = EDM_TIMEOFDAY; -exports.GEOJSON_POINT = GEOJSON_POINT; -exports.GEOJSON_LINESTRING = GEOJSON_LINESTRING; -exports.GEOJSON_POLYGON = GEOJSON_POLYGON; -exports.GEOJSON_MULTIPOINT = GEOJSON_MULTIPOINT; -exports.GEOJSON_MULTILINESTRING = GEOJSON_MULTILINESTRING; -exports.GEOJSON_MULTIPOLYGON = GEOJSON_MULTIPOLYGON; -exports.GEOJSON_GEOMETRYCOLLECTION = GEOJSON_GEOMETRYCOLLECTION; -exports.forEachSchema = forEachSchema; -exports.formatDateTimeOffset = formatDateTimeOffset; -exports.formatDateTimeOffsetJSON = formatDateTimeOffsetJSON; -exports.formatDuration = formatDuration; -exports.formatNumberWidth = formatNumberWidth; -exports.getCanonicalTimezone = getCanonicalTimezone; -exports.getCollectionType = getCollectionType; -exports.invokeRequest = invokeRequest; -exports.isBatch = isBatch; -exports.isCollection = isCollection; -exports.isCollectionType = isCollectionType; -exports.isComplex = isComplex; -exports.isDateTimeOffset = isDateTimeOffset; -exports.isDeferred = isDeferred; -exports.isEntry = isEntry; -exports.isFeed = isFeed; -exports.isGeographyEdmType = isGeographyEdmType; -exports.isGeometryEdmType = isGeometryEdmType; -exports.isNamedStream = isNamedStream; -exports.isPrimitive = isPrimitive; -exports.isPrimitiveEdmType = isPrimitiveEdmType; -exports.lookupComplexType = lookupComplexType; -exports.lookupDefaultEntityContainer = lookupDefaultEntityContainer; -exports.lookupEntityContainer = lookupEntityContainer; -exports.lookupEntitySet = lookupEntitySet; -exports.lookupSingleton = lookupSingleton; -exports.lookupEntityType = lookupEntityType; -exports.lookupFunctionImport = lookupFunctionImport; -exports.lookupNavigationPropertyType = lookupNavigationPropertyType; -exports.lookupNavigationPropertyEntitySet = lookupNavigationPropertyEntitySet; -exports.lookupInSchema = lookupInSchema; -exports.lookupProperty = lookupProperty; -exports.lookupInMetadata = lookupInMetadata; -exports.getEntitySetInfo = getEntitySetInfo; -exports.maxVersion = maxVersion; -exports.navigationPropertyKind = navigationPropertyKind; -exports.normalizeHeaders = normalizeHeaders; -exports.parseBool = parseBool; - - -exports.parseDate = parseDate; -exports.parseDateTimeOffset = parseDateTimeOffset; -exports.parseDuration = parseDuration; -exports.parseTimeOfDay = parseTimeOfDay; - -exports.parseInt10 = parseInt10; -exports.prepareRequest = prepareRequest; -exports.removeNamespace = removeNamespace; -exports.traverse = traverse; -
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/87e35975/odatajs/src/lib/odatajs/deferred.js ---------------------------------------------------------------------- diff --git a/odatajs/src/lib/odatajs/deferred.js b/odatajs/src/lib/odatajs/deferred.js deleted file mode 100644 index 7d5fd68..0000000 --- a/odatajs/src/lib/odatajs/deferred.js +++ /dev/null @@ -1,189 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -/** @module datajs/deferred */ - - - -/** Creates a new function to forward a call. - * @param {Object} thisValue - Value to use as the 'this' object. - * @param {String} name - Name of function to forward to. - * @param {Object} returnValue - Return value for the forward call (helps keep identity when chaining calls). - * @returns {Function} A new function that will forward a call. - */ -function forwardCall(thisValue, name, returnValue) { - return function () { - thisValue[name].apply(thisValue, arguments); - return returnValue; - }; -} - -/** Initializes a new DjsDeferred object. - * <ul> - * <li> Compability Note A - Ordering of callbacks through chained 'then' invocations <br> - * - * The Wiki entry at http://wiki.commonjs.org/wiki/Promises/A - * implies that .then() returns a distinct object. - * - * For compatibility with http://api.jquery.com/category/deferred-object/ - * we return this same object. This affects ordering, as - * the jQuery version will fire callbacks in registration - * order regardless of whether they occur on the result - * or the original object. - * </li> - * <li>Compability Note B - Fulfillment value <br> - * - * The Wiki entry at http://wiki.commonjs.org/wiki/Promises/A - * implies that the result of a success callback is the - * fulfillment value of the object and is received by - * other success callbacks that are chained. - * - * For compatibility with http://api.jquery.com/category/deferred-object/ - * we disregard this value instead. - * </li></ul> - * @class DjsDeferred - */ - function DjsDeferred() { - this._arguments = undefined; - this._done = undefined; - this._fail = undefined; - this._resolved = false; - this._rejected = false; -} - - -DjsDeferred.prototype = { - - /** Adds success and error callbacks for this deferred object. - * See Compatibility Note A. - * @method DjsDeferred#then - * @param {function} [fulfilledHandler] - Success callback ( may be null) - * @param {function} [errorHandler] - Error callback ( may be null) - */ - then: function (fulfilledHandler, errorHandler) { - - if (fulfilledHandler) { - if (!this._done) { - this._done = [fulfilledHandler]; - } else { - this._done.push(fulfilledHandler); - } - } - - if (errorHandler) { - if (!this._fail) { - this._fail = [errorHandler]; - } else { - this._fail.push(errorHandler); - } - } - - //// See Compatibility Note A in the DjsDeferred constructor. - //// if (!this._next) { - //// this._next = createDeferred(); - //// } - //// return this._next.promise(); - - if (this._resolved) { - this.resolve.apply(this, this._arguments); - } else if (this._rejected) { - this.reject.apply(this, this._arguments); - } - - return this; - }, - - /** Invokes success callbacks for this deferred object. - * All arguments are forwarded to success callbacks. - * @method DjsDeferred#resolve - */ - resolve: function (/* args */) { - if (this._done) { - var i, len; - for (i = 0, len = this._done.length; i < len; i++) { - //// See Compability Note B - Fulfillment value. - //// var nextValue = - this._done[i].apply(null, arguments); - } - - //// See Compatibility Note A in the DjsDeferred constructor. - //// this._next.resolve(nextValue); - //// delete this._next; - - this._done = undefined; - this._resolved = false; - this._arguments = undefined; - } else { - this._resolved = true; - this._arguments = arguments; - } - }, - - /** Invokes error callbacks for this deferred object. - * All arguments are forwarded to error callbacks. - * @method DjsDeferred#reject - */ - reject: function (/* args */) { - - if (this._fail) { - var i, len; - for (i = 0, len = this._fail.length; i < len; i++) { - this._fail[i].apply(null, arguments); - } - - this._fail = undefined; - this._rejected = false; - this._arguments = undefined; - } else { - this._rejected = true; - this._arguments = arguments; - } - }, - - /** Returns a version of this object that has only the read-only methods available. - * @method DjsDeferred#promise - * @returns An object with only the promise object. - */ - - promise: function () { - var result = {}; - result.then = forwardCall(this, "then", result); - return result; - } -}; - -/** Creates a deferred object. - * @returns {DjsDeferred} A new deferred object. If jQuery is installed, then a jQueryDeferred object is returned, which provides a superset of features. -*/ -function createDeferred() { - if (window.jQuery && window.jQuery.Deferred) { - return new window.jQuery.Deferred(); - } else { - return new DjsDeferred(); - } -}; - - - - -/** createDeferred (see {@link module:datajs/deferred~createDeferred}) */ -exports.createDeferred = createDeferred; - -/** DjsDeferred (see {@link DjsDeferred}) */ -exports.DjsDeferred = DjsDeferred; \ No newline at end of file http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/87e35975/odatajs/src/lib/odatajs/utils.js ---------------------------------------------------------------------- diff --git a/odatajs/src/lib/odatajs/utils.js b/odatajs/src/lib/odatajs/utils.js deleted file mode 100644 index 27af705..0000000 --- a/odatajs/src/lib/odatajs/utils.js +++ /dev/null @@ -1,582 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -/** @module datajs/utils */ - - -function inBrowser() { - return typeof window !== 'undefined'; -} - -/** Creates a new ActiveXObject from the given progId. - * @param {String} progId - ProgId string of the desired ActiveXObject. - * @returns {Object} The ActiveXObject instance. Null if ActiveX is not supported by the browser. - * This function throws whatever exception might occur during the creation - * of the ActiveXObject. -*/ -var activeXObject = function (progId) { - - if (window.ActiveXObject) { - return new window.ActiveXObject(progId); - } - return null; -}; - -/** Checks whether the specified value is different from null and undefined. - * @param [value] Value to check ( may be null) - * @returns {Boolean} true if the value is assigned; false otherwise. -*/ -function assigned(value) { - return value !== null && value !== undefined; -} - -/** Checks whether the specified item is in the array. - * @param {Array} [arr] Array to check in. - * @param item - Item to look for. - * @returns {Boolean} true if the item is contained, false otherwise. -*/ -function contains(arr, item) { - var i, len; - for (i = 0, len = arr.length; i < len; i++) { - if (arr[i] === item) { - return true; - } - } - return false; -} - -/** 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> - */ -function defined(a, b) { - return (a !== undefined) ? a : b; -} - -/** Delays the invocation of the specified function until execution unwinds. - * @param {Function} callback - Callback function. - */ -function delay(callback) { - - if (arguments.length === 1) { - window.setTimeout(callback, 0); - return; - } - - var args = Array.prototype.slice.call(arguments, 1); - window.setTimeout(function () { - callback.apply(this, args); - }, 0); -} - -/** Throws an exception in case that a condition evaluates to false. - * @param {Boolean} condition - Condition to evaluate. - * @param {String} message - Message explaining the assertion. - * @param {Object} data - Additional data to be included in the exception. - */ -// DATAJS INTERNAL START -function djsassert(condition, message, data) { - - - if (!condition) { - throw { message: "Assert fired: " + message, data: data }; - } -} -// DATAJS INTERNAL END - -/** Extends the target with the specified values. - * @param {Object} target - Object to add properties to. - * @param {Object} values - Object with properties to add into target. - * @returns {Object} The target object. -*/ -function extend(target, values) { - for (var name in values) { - target[name] = values[name]; - } - - return target; -} - -function find(arr, callback) { - /** Returns the first item in the array that makes the callback function true. - * @param {Array} [arr] Array to check in. ( may be null) - * @param {Function} callback - Callback function to invoke once per item in the array. - * @returns The first item that makes the callback return true; null otherwise or if the array is null. - */ - - if (arr) { - var i, len; - for (i = 0, len = arr.length; i < len; i++) { - if (callback(arr[i])) { - return arr[i]; - } - } - } - return null; -} - -function isArray(value) { - /** Checks whether the specified value is an array object. - * @param value - Value to check. - * @returns {Boolean} true if the value is an array object; false otherwise. - */ - - return Object.prototype.toString.call(value) === "[object Array]"; -} - -/** Checks whether the specified value is a Date object. - * @param value - Value to check. - * @returns {Boolean} true if the value is a Date object; false otherwise. - */ -function isDate(value) { - return Object.prototype.toString.call(value) === "[object Date]"; -} - -/** Tests whether a value is an object. - * @param value - Value to test. - * @returns {Boolean} True is the value is an object; false otherwise. - * Per javascript rules, null and array values are objects and will cause this function to return true. - */ -function isObject(value) { - return typeof value === "object"; -} - -/** Parses a value in base 10. - * @param {String} value - String value to parse. - * @returns {Number} The parsed value, NaN if not a valid value. -*/ -function parseInt10(value) { - return parseInt(value, 10); -} - -/** Renames a property in an object. - * @param {Object} obj - Object in which the property will be renamed. - * @param {String} oldName - Name of the property that will be renamed. - * @param {String} newName - New name of the property. - * This function will not do anything if the object doesn't own a property with the specified old name. - */ -function renameProperty(obj, oldName, newName) { - if (obj.hasOwnProperty(oldName)) { - obj[newName] = obj[oldName]; - delete obj[oldName]; - } -} - -/** Default error handler. - * @param {Object} error - Error to handle. - */ -function throwErrorCallback(error) { - throw error; -} - -/** Removes leading and trailing whitespaces from a string. - * @param {String str String to trim - * @returns {String} The string with no leading or trailing whitespace. - */ -function trimString(str) { - if (str.trim) { - return str.trim(); - } - - return str.replace(/^\s+|\s+$/g, ''); -} - -/** Returns a default value in place of undefined. - * @param [value] Value to check (may be null) - * @param defaultValue - Value to return if value is undefined. - * @returns value if it's defined; defaultValue otherwise. - * This should only be used for cases where falsy values are valid; - * otherwise the pattern should be 'x = (value) ? value : defaultValue;'. - */ -function undefinedDefault(value, defaultValue) { - return (value !== undefined) ? value : defaultValue; -} - -// Regular expression that splits a uri into its components: -// 0 - is the matched string. -// 1 - is the scheme. -// 2 - is the authority. -// 3 - is the path. -// 4 - is the query. -// 5 - is the fragment. -var uriRegEx = /^([^:\/?#]+:)?(\/\/[^\/?#]*)?([^?#:]+)?(\?[^#]*)?(#.*)?/; -var uriPartNames = ["scheme", "authority", "path", "query", "fragment"]; - -/** Gets information about the components of the specified URI. - * @param {String} uri - URI to get information from. - * @return {Object} An object with an isAbsolute flag and part names (scheme, authority, etc.) if available. - */ -function getURIInfo(uri) { - var result = { isAbsolute: false }; - - if (uri) { - var matches = uriRegEx.exec(uri); - if (matches) { - var i, len; - for (i = 0, len = uriPartNames.length; i < len; i++) { - if (matches[i + 1]) { - result[uriPartNames[i]] = matches[i + 1]; - } - } - } - if (result.scheme) { - result.isAbsolute = true; - } - } - - return result; -} - -/** Builds a URI string from its components. - * @param {Object} uriInfo - An object with uri parts (scheme, authority, etc.). - * @returns {String} URI string. - */ -function getURIFromInfo(uriInfo) { - return "".concat( - uriInfo.scheme || "", - uriInfo.authority || "", - uriInfo.path || "", - uriInfo.query || "", - uriInfo.fragment || ""); -} - -// Regular expression that splits a uri authority into its subcomponents: -// 0 - is the matched string. -// 1 - is the userinfo subcomponent. -// 2 - is the host subcomponent. -// 3 - is the port component. -var uriAuthorityRegEx = /^\/{0,2}(?:([^@]*)@)?([^:]+)(?::{1}(\d+))?/; - -// Regular expression that matches percentage enconded octects (i.e %20 or %3A); -var pctEncodingRegEx = /%[0-9A-F]{2}/ig; - -/** Normalizes the casing of a URI. - * @param {String} uri - URI to normalize, absolute or relative. - * @returns {String} The URI normalized to lower case. -*/ -function normalizeURICase(uri) { - var uriInfo = getURIInfo(uri); - var scheme = uriInfo.scheme; - var authority = uriInfo.authority; - - if (scheme) { - uriInfo.scheme = scheme.toLowerCase(); - if (authority) { - var matches = uriAuthorityRegEx.exec(authority); - if (matches) { - uriInfo.authority = "//" + - (matches[1] ? matches[1] + "@" : "") + - (matches[2].toLowerCase()) + - (matches[3] ? ":" + matches[3] : ""); - } - } - } - - uri = getURIFromInfo(uriInfo); - - return uri.replace(pctEncodingRegEx, function (str) { - return str.toLowerCase(); - }); -} - -/** Normalizes a possibly relative URI with a base URI. - * @param {String} uri - URI to normalize, absolute or relative - * @param {String} base - Base URI to compose with (may be null) - * @returns {String} The composed URI if relative; the original one if absolute. - */ -function normalizeURI(uri, base) { - if (!base) { - return uri; - } - - var uriInfo = getURIInfo(uri); - if (uriInfo.isAbsolute) { - return uri; - } - - var baseInfo = getURIInfo(base); - var normInfo = {}; - var path; - - if (uriInfo.authority) { - normInfo.authority = uriInfo.authority; - path = uriInfo.path; - normInfo.query = uriInfo.query; - } else { - if (!uriInfo.path) { - path = baseInfo.path; - normInfo.query = uriInfo.query || baseInfo.query; - } else { - if (uriInfo.path.charAt(0) === '/') { - path = uriInfo.path; - } else { - path = mergeUriPathWithBase(uriInfo.path, baseInfo.path); - } - normInfo.query = uriInfo.query; - } - normInfo.authority = baseInfo.authority; - } - - normInfo.path = removeDotsFromPath(path); - - normInfo.scheme = baseInfo.scheme; - normInfo.fragment = uriInfo.fragment; - - return getURIFromInfo(normInfo); -} - -/** Merges the path of a relative URI and a base URI. - * @param {String} uriPath - Relative URI path.</param> - * @param {String} basePath - Base URI path. - * @returns {String} A string with the merged path. - */ -function mergeUriPathWithBase(uriPath, basePath) { - var path = "/"; - var end; - - if (basePath) { - end = basePath.lastIndexOf("/"); - path = basePath.substring(0, end); - - if (path.charAt(path.length - 1) !== "/") { - path = path + "/"; - } - } - - return path + uriPath; -} - -/** Removes the special folders . and .. from a URI's path. - * @param {string} path - URI path component. - * @returns {String} Path without any . and .. folders. - */ -function removeDotsFromPath(path) { - var result = ""; - var segment = ""; - var end; - - while (path) { - if (path.indexOf("..") === 0 || path.indexOf(".") === 0) { - path = path.replace(/^\.\.?\/?/g, ""); - } else if (path.indexOf("/..") === 0) { - path = path.replace(/^\/\..\/?/g, "/"); - end = result.lastIndexOf("/"); - if (end === -1) { - result = ""; - } else { - result = result.substring(0, end); - } - } else if (path.indexOf("/.") === 0) { - path = path.replace(/^\/\.\/?/g, "/"); - } else { - segment = path; - end = path.indexOf("/", 1); - if (end !== -1) { - segment = path.substring(0, end); - } - result = result + segment; - path = path.replace(segment, ""); - } - } - return result; -} - -function convertByteArrayToHexString(str) { - var arr = []; - if (window.atob === undefined) { - arr = decodeBase64(str); - } else { - var binaryStr = window.atob(str); - for (var i = 0; i < binaryStr.length; i++) { - arr.push(binaryStr.charCodeAt(i)); - } - } - var hexValue = ""; - var hexValues = "0123456789ABCDEF"; - for (var j = 0; j < arr.length; j++) { - var t = arr[j]; - hexValue += hexValues[t >> 4]; - hexValue += hexValues[t & 0x0F]; - } - return hexValue; -} - -function decodeBase64(str) { - var binaryString = ""; - for (var i = 0; i < str.length; i++) { - var base65IndexValue = getBase64IndexValue(str[i]); - var binaryValue = ""; - if (base65IndexValue !== null) { - binaryValue = base65IndexValue.toString(2); - binaryString += addBase64Padding(binaryValue); - } - } - var byteArray = []; - var numberOfBytes = parseInt(binaryString.length / 8, 10); - for (i = 0; i < numberOfBytes; i++) { - var intValue = parseInt(binaryString.substring(i * 8, (i + 1) * 8), 2); - byteArray.push(intValue); - } - return byteArray; -} - -function getBase64IndexValue(character) { - var asciiCode = character.charCodeAt(0); - var asciiOfA = 65; - var differenceBetweenZanda = 6; - if (asciiCode >= 65 && asciiCode <= 90) { // between "A" and "Z" inclusive - return asciiCode - asciiOfA; - } else if (asciiCode >= 97 && asciiCode <= 122) { // between 'a' and 'z' inclusive - return asciiCode - asciiOfA - differenceBetweenZanda; - } else if (asciiCode >= 48 && asciiCode <= 57) { // between '0' and '9' inclusive - return asciiCode + 4; - } else if (character == "+") { - return 62; - } else if (character == "/") { - return 63; - } else { - return null; - } -} - -function addBase64Padding(binaryString) { - while (binaryString.length < 6) { - binaryString = "0" + binaryString; - } - return binaryString; - -} - -function getJsonValueArraryLength(data) { - if (data && data.value) { - return data.value.length; - } - - return 0; -} - -function sliceJsonValueArray(data, start, end) { - if (data === undefined || data.value === undefined) { - return data; - } - - if (start < 0) { - start = 0; - } - - var length = getJsonValueArraryLength(data); - if (length < end) { - end = length; - } - - var newdata = {}; - for (var property in data) { - if (property == "value") { - newdata[property] = data[property].slice(start, end); - } else { - newdata[property] = data[property]; - } - } - - return newdata; -} - -function concatJsonValueArray(data, concatData) { - if (concatData === undefined || concatData.value === undefined) { - return data; - } - - if (data === undefined || Object.keys(data).length === 0) { - return concatData; - } - - if (data.value === undefined) { - data.value = concatData.value; - return data; - } - - data.value = data.value.concat(concatData.value); - - return data; -} - -function endsWith(input, search) { - return input.indexOf(search, input.length - search.length) !== -1; -} - -function startsWith (input, search) { - return input.indexOf(search) === 0; -} - -function getFormatKind(format, defaultFormatKind) { - var formatKind = defaultFormatKind; - if (!assigned(format)) { - return formatKind; - } - - var normalizedFormat = format.toLowerCase(); - switch (normalizedFormat) { - case "none": - formatKind = 0; - break; - case "minimal": - formatKind = 1; - break; - case "full": - formatKind = 2; - break; - default: - break; - } - - return formatKind; -} - - - - -exports.inBrowser = inBrowser; -exports.activeXObject = activeXObject; -exports.assigned = assigned; -exports.contains = contains; -exports.defined = defined; -exports.delay = delay; -exports.djsassert = djsassert; -exports.extend = extend; -exports.find = find; -exports.getURIInfo = getURIInfo; -exports.isArray = isArray; -exports.isDate = isDate; -exports.isObject = isObject; -exports.normalizeURI = normalizeURI; -exports.normalizeURICase = normalizeURICase; -exports.parseInt10 = parseInt10; -exports.renameProperty = renameProperty; -exports.throwErrorCallback = throwErrorCallback; -exports.trimString = trimString; -exports.undefinedDefault = undefinedDefault; -exports.decodeBase64 = decodeBase64; -exports.convertByteArrayToHexString = convertByteArrayToHexString; -exports.getJsonValueArraryLength = getJsonValueArraryLength; -exports.sliceJsonValueArray = sliceJsonValueArray; -exports.concatJsonValueArray = concatJsonValueArray; -exports.startsWith = startsWith; -exports.endsWith = endsWith; -exports.getFormatKind = getFormatKind; \ No newline at end of file
