/** * Copyright© 2016, Oracle and/or its affiliates. All rights reserved. */ /** * Class that represents a storage object resource that can be used to store data. * @param storageCollection {StorageCollection} * @param json {Object} * @constructor * @global */ function StorageObject(storageCollection, json, utils, platform) { utils = utils || mcs._utils; platform = platform || mcs.mobileBackendManager.platform; var HEADERS = utils.HEADERS; var _backend = storageCollection._getBackend(); var _storageCollection = storageCollection; var _payload = null; if (json) { /** * A service generated ID for the StorageObject. The ID is unique in the StorageCollection. * @type {String} */ this.id = json.id; /** * A user-provided name for the StorageObject. A StorageCollection may have multiple StorageObjects with the same name. * @type {String} */ this.name = json.name; /** * The length of data content in bytes stored in the StorageObject. * @type {Number} */ this.contentLength = json.contentLength; /** * The media-type associated with the StorageObject. * @type {String} */ this.contentType = json.contentType; this._eTag = json.eTag; /** * The name of the user who created the StorageObject. * @type {String} */ this.createdBy = json.createdBy; /** * Server-generated timestamp when the StorageObject was created. * @type {String} */ this.createdOn = json.createdOn; /** * The name of the user who last updated the StorageObject. * @type {String} */ this.modifiedBy = json.modifiedBy; /** * Server-generated timestamp for when the StorageObject was last updated. * @type {String} */ this.modifiedOn = json.modifiedOn; } /** * Returns the current StorageObject payload. * * @return Current Storage object payload. */ this.getPayload = function(){ return _payload; }; /** * Sets the payload for the StorageObject. * * @param payload The payload to be associated with StorageObject. */ this.setPayload =function(payload){ _payload = payload; }; /** * Returns the current StorageCollection. * * @return Current StorageCollection. */ this.getstorageCollection = function(){ return _storageCollection; }; /** * Returns the current StorageObject. * * @return Current StorageObject. */ this.getStorage = function(){ return _storageCollection._storage }; /** * Loads a StorageObject's contents from an object. * @param payload {Object} The object to load from. * @example payload: "Hello my name is Mia and this is a sample payload". * @param contentType {String} The media-type to associate with the content. * @example contentType: "application/json,text/plain". */ this.loadPayload = function(payload, contentType) { _payload = payload; this.contentType = contentType; if(this.contentType == utils.ACCEPT_TYPES.TEXT_PLAIN){ if(typeof _payload == "string") { _payload = payload; } } else if(this.contentType == utils.ACCEPT_TYPES.APPLICATION_JSON){ if(typeof _payload == "string"){ _payload = payload; } else if(typeof _payload == "object"){ _payload = JSON.stringify(payload); } } this.contentLength = _payload.length; }; /** * Sets a StorageObject's display name from an object. * @param name {Object} The object's name to be associated with the object. * @example name: "JSFile中国人.txt" * @returns The object's name in UTC-8 ASCII format. */ this.setDisplayName = function(name){ this.name = name; }; /** * Returns a StorageObject's display name from an object. * * @returns String object's name decoded if encoded into the MobileBackend. */ this.getDisplayName = function(){ return this.name; }; /** * Callback invoked after successfully downloading data from the StorageObject. * @callback StorageObject~readPayloadSuccessCallback * @param statusCode {Number} Any HTTP status code returned from the server, if available. * @param mobileObject {Object} The downloaded data. * @deprecated Use promises instead */ /** * Callback invoked on error. * @callback StorageObject~errorCallback * @param statusCode {Number} Any HTTP status code returned from the server, if available. * @param message {String} The HTTP payload from the server, if available, or an error message. * @deprecated Use promises instead */ /** * Returns the contents of the StorageObject. May result in a download from the service if the contents were not * previously downloaded. * @param [successCallback] {StorageObject~readPayloadSuccessCallback} Callback invoked on success (deprecated use promises instead). * @param [errorCallback] {StorageObject~errorCallback} Callback invoked on error (deprecated use promises instead). * @param objectType responseType for the XMLHttpRequest Object. * @return {Promise.<StorageObject|NetworkResponse>} */ this.readPayload = function(successCallback, errorCallback, objectType) { var payload = this.getPayload(); if(!payload) { // TODO: remove assign when callbacks is replaced with promises if(typeof successCallback !== 'function'){ objectType = successCallback; } var storageObject = this; var headers = _backend.getHttpHeaders(utils.MODULE_NAMES.STORAGE); var url = "storage/collections/" + _storageCollection.id + "/objects/" + this.id; if(_storageCollection.userId !== null && _storageCollection.getUserIsolated()){ url += "?user=" + _storageCollection.userId; } return platform.invokeService({ method: utils.HTTP_METHODS.GET, url: _backend.getPlatformUrl(url), headers: headers, responseType: objectType || "blob" }).then(invokeServiceSuccess,invokeServiceError); } else { if(successCallback && typeof successCallback === 'function'){ successCallback(payload); } return Promise.resolve(payload); } function invokeServiceSuccess(response) { storageObject.setPayload(response.data); storageObject.name = decodeURI(response.headers[HEADERS.ORACLE_MOBILE_NAME.toLowerCase()]); storageObject._eTag = response.headers[HEADERS.E_TAG.toLowerCase()]; storageObject.contentLength = response.data.size; storageObject.contentType = response.headers[HEADERS.CONTENT_TYPE.toLowerCase()]; storageObject.createdBy = response.headers[HEADERS.ORACLE_MOBILE_CREATED_BY.toLowerCase()]; storageObject.createdOn = response.headers[HEADERS.ORACLE_MOBILE_CREATED_ON.toLowerCase()]; storageObject.modifiedBy = response.headers[HEADERS.ORACLE_MOBILE_MODIFIED_BY.toLowerCase()]; storageObject.modifiedOn = response.headers[HEADERS.ORACLE_MOBILE_MODIFIED_ON.toLowerCase()]; if (successCallback && typeof successCallback === 'function') { successCallback(storageObject); } return storageObject; } function invokeServiceError(response) { if(errorCallback) { errorCallback(response.statusCode, response.data); } else { return Promise.reject(response); } } }; }