baja/ord/ServiceScheme.js

/**
 * @copyright 2015 Tridium, Inc. All Rights Reserved.
 * @author Gareth Johnson
 */

/**
 * Defines {@link baja.ServiceScheme}.
 * @module baja/ord/ServiceScheme
 */
define([ "bajaScript/comm",
        "bajaScript/baja/ord/OrdScheme",
        "bajaScript/baja/ord/OrdTarget",
        "bajaScript/baja/comm/Callback" ], 
    function (baja, OrdScheme, OrdTarget, Callback) {
  
  "use strict";
  
  var subclass = baja.subclass,
      callSuper = baja.callSuper;
        
  /**
   * Service ORD Scheme.
   * 
   * This scheme is used to resolve a Service running in a Station.
   * 
   * @class
   * @alias baja.ServiceScheme
   * @extends baja.OrdScheme
   * @private
   */    
  var ServiceScheme = function ServiceScheme() {
    callSuper(ServiceScheme, this, arguments);
  };
  
  subclass(ServiceScheme, OrdScheme);
  
  /**
   * Default Service Scheme instance.
   * @private
   * @type {baja.ServiceScheme}
   */
  ServiceScheme.DEFAULT = new ServiceScheme();
      
  /**
   * Called when an ORD is resolved.
   *
   * @private
   *
   * @see baja.OrdScheme#resolve
   *
   * @param {module:baja/ord/OrdTarget} target  the current ORD Target.
   * @param {baja.OrdQuery} query  the ORD Query used in resolving the ORD.
   * @param {module:baja/ord/OrdQueryListCursor} cursor  the ORD Query List 
   * cursor used for helping to asynchronously resolve the ORD.
   * @param {Object} options  options used for resolving an ORD.
   */ 
  ServiceScheme.prototype.resolve = function (target, query, cursor, options) {
    
    var object = target.object,
        typeSpec = query.getBody(),
        space,
        ok,
        fail;
    
    if (!baja.hasType(object)) {
      throw new Error("Not based via ComponentSpace. Invalid Object");
    } 
    
    if (object.getType().isComponent()) {
      space = object.getComponentSpace();
    } else if (object.getType().is("baja:ComponentSpace")) {
      space = object;
    } else if (object.getType().is("baja:ISession") && object.station) {
      space = object.station;
    }
    
    // Pick up whether the Space is null
    if (!baja.hasType(space)) {
      throw new Error("Not based via ComponentSpace");
    }
    
    if (!space.hasCallbacks()) {
      throw new Error("Unable to resolve Service: " + typeSpec);
    }
    
    
    ok = function (comp) {
      var newTarget = new OrdTarget(target);
      newTarget.object = comp;
      cursor.resolveNext(newTarget, options);
    };
    
    fail = function (err) {
      options.callback.fail(err);
    };
    
    space.getCallbacks().getService(typeSpec, new Callback(ok, fail));
  };
  
  return ServiceScheme;
});