UNPKG

@openui5/sap.ui.core

Version:

OpenUI5 Core Library sap.ui.core

218 lines (205 loc) 7.21 kB
/*! * OpenUI5 * (c) Copyright 2009-2021 SAP SE or an SAP affiliate company. * Licensed under the Apache License, Version 2.0 - see LICENSE.txt. */ //Provides class sap.ui.model.odata.v4.ODataUtils sap.ui.define([ "sap/ui/core/CalendarType", "sap/ui/core/format/DateFormat", "sap/ui/model/odata/ODataUtils", "sap/ui/model/odata/v4/lib/_Helper" ], function (CalendarType, DateFormat, BaseODataUtils, _Helper) { "use strict"; // see http://docs.oasis-open.org/odata/odata/v4.0/errata02/os/complete/abnf/odata-abnf-construction-rules.txt var oDateFormatter, oDateTimeOffsetFormatter, sDateValue = "\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])", oTimeFormatter, sTimeOfDayValue = "(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(\\.\\d{1,12})?)?", rDate = new RegExp("^" + sDateValue + "$"), rDateTimeOffset = new RegExp("^" + sDateValue + "T" + sTimeOfDayValue + "(?:Z|[-+](?:0\\d|1[0-3]):[0-5]\\d|[-+]14:00)$", "i"), rTimeOfDay = new RegExp("^" + sTimeOfDayValue + "$"), /** * @classdesc * A collection of methods which help to consume OData V4 services. * * @public * @since 1.43.0 * @namespace * @alias sap.ui.model.odata.v4.ODataUtils */ ODataUtils = { /** * Sets the static date and time formatter instances. * * @private */ _setDateTimeFormatter : function () { oDateFormatter = DateFormat.getDateInstance({ calendarType : CalendarType.Gregorian, pattern: "yyyy-MM-dd", strictParsing : true, UTC : true }); oDateTimeOffsetFormatter = DateFormat.getDateTimeInstance({ calendarType : CalendarType.Gregorian, pattern : "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", strictParsing : true }); oTimeFormatter = DateFormat.getTimeInstance({ calendarType : CalendarType.Gregorian, pattern : "HH:mm:ss.SSS", strictParsing : true, UTC : true }); }, /** * Compares the given OData values. * * @param {any} vValue1 * The first value to compare * @param {any} vValue2 * The second value to compare * @param {boolean|string} [vEdmType] * If <code>true</code> or "Decimal", the string values <code>vValue1</code> and * <code>vValue2</code> are assumed to be valid "Edm.Decimal" or "Edm.Int64" values * and are compared as a decimal number (only sign, integer and fraction digits; no * exponential format). * If "DateTime", the string values <code>vValue1</code> and <code>vValue2</code> * are assumed to be valid "Edm.DateTimeOffset" values and are compared based on the * corresponding number of milliseconds since 1 January, 1970 UTC. * Otherwise the values are compared with the JavaScript operators <code>===</code> * and <code>></code>. * @return {number} * The result of the comparison: <code>0</code> if the values are equal, * <code>1</code> if the first value is larger, <code>-1</code> if the second value * is larger, <code>NaN</code> if they cannot be compared * * @public * @since 1.43.0 */ compare : function (vValue1, vValue2, vEdmType) { if (vEdmType === true || vEdmType === "Decimal") { return BaseODataUtils.compare(vValue1, vValue2, true); } if (vEdmType === "DateTime") { return BaseODataUtils.compare( ODataUtils.parseDateTimeOffset(vValue1), ODataUtils.parseDateTimeOffset(vValue2)); } return BaseODataUtils.compare(vValue1, vValue2); }, /** * Formats the given OData value into a literal suitable for usage in data binding paths * and URLs. * * @param {any} vValue * The value according to "OData JSON Format Version 4.0" section * "7.1 Primitive Value" * @param {string} sType * The OData primitive type, e.g. "Edm.String" * @returns {string} * The literal according to "OData Version 4.0 Part 2: URL Conventions" section * "5.1.1.6.1 Primitive Literals" * @throws {Error} * If the value is undefined or the type is not supported * * @example <caption>Use <code>formatLiteral</code> together with * <code>encodeURIComponent</code> to create a properly encoded data binding path for * {@link sap.ui.model.odata.v4.ODataModel}.</caption> * var sSalesOrderId = ODataUtils.formatLiteral("A/B&C", "Edm.String"), * // expected result: "'A/B&C'" * sPath = "/" + encodeURIComponent("SalesOrderList(" + sSalesOrderId + ")"); * // expected result: "/SalesOrderList('A%2FB%26C')" * * @public * @since 1.64.0 */ formatLiteral : function (vValue, sType) { return _Helper.formatLiteral(vValue, sType); }, /** * Parses an "Edm.Date" value and returns the corresponding JavaScript <code>Date</code> * value (UTC with a time value of "00:00:00"). * * @param {string} sDate * The "Edm.Date" value to parse * @returns {Date} * The JavaScript <code>Date</code> value * @throws {Error} * If the input cannot be parsed * * @public * @since 1.43.0 */ parseDate : function (sDate) { var oDate = rDate.test(sDate) && oDateFormatter.parse(sDate); if (!oDate) { throw new Error("Not a valid Edm.Date value: " + sDate); } return oDate; }, /** * Parses an "Edm.DateTimeOffset" value and returns the corresponding JavaScript * <code>Date</code> value. * * @param {string} sDateTimeOffset * The "Edm.DateTimeOffset" value to parse * @returns {Date} * The JavaScript <code>Date</code> value * @throws {Error} * If the input cannot be parsed * * @public * @since 1.43.0 */ parseDateTimeOffset : function (sDateTimeOffset) { var oDateTimeOffset, aMatches = rDateTimeOffset.exec(sDateTimeOffset); if (aMatches) { if (aMatches[1] && aMatches[1].length > 4) { // "round" to millis, BEWARE of the dot! sDateTimeOffset = sDateTimeOffset.replace(aMatches[1], aMatches[1].slice(0, 4)); } oDateTimeOffset = oDateTimeOffsetFormatter.parse(sDateTimeOffset.toUpperCase()); } if (!oDateTimeOffset) { throw new Error("Not a valid Edm.DateTimeOffset value: " + sDateTimeOffset); } return oDateTimeOffset; }, /** * Parses an "Edm.TimeOfDay" value and returns the corresponding JavaScript * <code>Date</code> value (UTC with a date value of "1970-01-01"). * * @param {string} sTimeOfDay * The "Edm.TimeOfDay" value to parse * @returns {Date} * The JavaScript <code>Date</code> value * @throws {Error} * If the input cannot be parsed * * @public * @since 1.43.0 */ parseTimeOfDay : function (sTimeOfDay) { var oTimeOfDay; if (rTimeOfDay.test(sTimeOfDay)) { if (sTimeOfDay.length > 12) { // "round" to millis: "HH:mm:ss.SSS" sTimeOfDay = sTimeOfDay.slice(0, 12); } oTimeOfDay = oTimeFormatter.parse(sTimeOfDay); } if (!oTimeOfDay) { throw new Error("Not a valid Edm.TimeOfDay value: " + sTimeOfDay); } return oTimeOfDay; } }; ODataUtils._setDateTimeFormatter(); return ODataUtils; }, /* bExport= */ true);