Source: synchronization/processors/sync-processor.js

/**
 * Copyright© 2016, Oracle and/or its affiliates. All rights reserved.
 */


function SyncProcessor(backend, apiName, endpointPath, resolvingOfflineUpdate, utils, persistence) {
  var HEADERS = utils.HEADERS;
  var RESOURCE_TYPES = utils.RESOURCE_TYPES;
  var _ = persistence.common;

  this.apiName = apiName;
  this.endpointPath = endpointPath;
  this.resolvingOfflineUpdate = resolvingOfflineUpdate;

  this.getHttpHeaders = function(requestHeaders){
    var headers = backend.getHttpHeaders(utils.MODULE_NAMES.SYNC, requestHeaders);
    headers[HEADERS.ORACLE_MOBILE_SYNC_AGENT] = true;
    return headers;
  };

  this.getType = function(responseHeaders, responseData){
    var type = SyncResourceType.file;
    // get object type from response headers
    var resourceType = responseHeaders[HEADERS.ORACLE_MOBILE_SYNC_RESOURCE_TYPE.toLowerCase()];
    if(resourceType != null) {
      if(resourceType === RESOURCE_TYPES.ITEM) {
        type = SyncResourceType.item;
      } else if(resourceType === RESOURCE_TYPES.COLLECTION) {
        type = SyncResourceType.collection;
      }
    } else {
      // in offline mode there is no resource type header, try to detect the type from responseData
      if(_.isString(responseData)){
        try
        {
          var json = JSON.parse(responseData);
          // TODO: validate functionality
          if(_.isArray(json)){
            // the object is collection
            type = SyncResourceType.collection;
          } else {
            type = SyncResourceType.item;
          }
        }
        catch(e)
        {
          // the string is not json, so it is file
          type = SyncResourceType.file;
        }
      }
    }
    return type;
  };

  this.getUri = function(response, url){
    var location = response && response.headers ? response.headers[HEADERS.LOCATION.toLowerCase()] : null;
    if(location != null){
      return '/' + location;
    } else {
      var obj = null;
      if(response.data){
        if(typeof response.data === 'string'){
          obj = response.data != '' ? JSON.parse(response.data): null;
        } else {
          obj = response.data;
        }
      }
      if(obj && obj[persistence.options.module.URI_KEY]){
        var uri = obj[persistence.options.module.URI_KEY];
        delete obj[persistence.options.module.URI_KEY];
        return uri;
      } else {
        //
        return persistence.options.parseURL(url).path;
      }
    }
  };

  this.createResource = function(method, url, statusCode, requestHeaders, responseHeaders, requestData, responseData) {

    var location = response.headers[HEADERS.LOCATION.toLowerCase()];
    if(location != null) {
      location = '/' + location;
    } else {
      location = url;
    }

    var type = SyncResourceType.file;
    // get object type from response headers
    var resourceType = responseHeaders[HEADERS.ORACLE_MOBILE_SYNC_RESOURCE_TYPE.toLowerCase()];
    if(resourceType != null) {
      if(resourceType == RESOURCE_TYPES.ITEM) {
        type = SyncResourceType.item;
      } else if(resourceType == RESOURCE_TYPES.COLLECTION) {
        type = SyncResourceType.collection;
      }
    } else {
      // in offline mode there is no resource type header, try to detect the type from responseData
      if(_.isString(responseData)){
        try
        {
          var json = JSON.parse(responseData);
          // TODO: validate functionality
          if(_.isArray(json)){
            // the object is collection
            type = SyncResourceType.collection;
          } else {
            type = SyncResourceType.item;
          }
        }
        catch(e)
        {
          // the string is not json, so it is file
          type = SyncResourceType.file;
        }
      }
    }

    return null;
    // new SyncResource(
    //   _synchronization,
    //   location,
    //   type,
    //   new Date().toISOString(),
    //   requestHeaders,
    //   responseHeaders,
    //   requestData,
    //   responseData
    // );
  }

}