2014-11-29 02:39:19 +00:00
|
|
|
/*global define*/
|
2014-11-29 00:06:54 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Module defining TelemetryCapability. Created by vwoeltje on 11/12/14.
|
|
|
|
*/
|
|
|
|
define(
|
|
|
|
[],
|
|
|
|
function () {
|
|
|
|
"use strict";
|
|
|
|
|
|
|
|
/**
|
2014-11-29 04:59:41 +00:00
|
|
|
* A telemetry capability provides a means of requesting telemetry
|
|
|
|
* for a specific object, and for unwrapping the response (to get
|
|
|
|
* at the specific data which is appropriate to the domain object.)
|
2014-11-29 00:06:54 +00:00
|
|
|
*
|
|
|
|
* @constructor
|
|
|
|
*/
|
2014-11-29 04:29:30 +00:00
|
|
|
function TelemetryCapability($injector, $q, $log, domainObject) {
|
|
|
|
var telemetryService;
|
|
|
|
|
|
|
|
// We could depend on telemetryService directly, but
|
|
|
|
// there isn't a platform implementation of this;
|
|
|
|
function getTelemetryService() {
|
|
|
|
if (!telemetryService) {
|
|
|
|
try {
|
|
|
|
telemetryService =
|
|
|
|
$q.when($injector.get("telemetryService"));
|
|
|
|
} catch (e) {
|
2014-11-29 04:59:41 +00:00
|
|
|
// $injector should throw is telemetryService
|
|
|
|
// is unavailable or unsatisfiable.
|
2014-11-29 04:29:30 +00:00
|
|
|
$log.warn("Telemetry service unavailable");
|
|
|
|
telemetryService = $q.reject(e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return telemetryService;
|
|
|
|
}
|
|
|
|
|
2014-11-29 04:59:41 +00:00
|
|
|
// Build a request object. This takes the request that was
|
|
|
|
// passed to the capability, and adds source, id, and key
|
|
|
|
// fields associated with the object (from its type definition
|
|
|
|
// and/or its model)
|
2014-11-29 00:06:54 +00:00
|
|
|
function buildRequest(request) {
|
2014-11-29 04:59:41 +00:00
|
|
|
// Start with any "telemetry" field in type; use that as a
|
|
|
|
// basis for the request.
|
2014-11-29 00:06:54 +00:00
|
|
|
var type = domainObject.getCapability("type"),
|
2014-11-29 04:29:30 +00:00
|
|
|
typeRequest = (type && type.getDefinition().telemetry) || {},
|
2014-11-29 00:06:54 +00:00
|
|
|
modelTelemetry = domainObject.getModel().telemetry,
|
|
|
|
fullRequest = Object.create(typeRequest);
|
|
|
|
|
2014-11-29 04:59:41 +00:00
|
|
|
// Add properties from the telemetry field of this
|
|
|
|
// specific domain object.
|
2014-11-29 00:06:54 +00:00
|
|
|
Object.keys(modelTelemetry).forEach(function (k) {
|
|
|
|
fullRequest[k] = modelTelemetry[k];
|
|
|
|
});
|
|
|
|
|
2014-11-29 04:59:41 +00:00
|
|
|
// Add properties from this specific requestData call.
|
2014-11-29 00:06:54 +00:00
|
|
|
Object.keys(request).forEach(function (k) {
|
|
|
|
fullRequest[k] = request[k];
|
|
|
|
});
|
|
|
|
|
2014-11-29 04:59:41 +00:00
|
|
|
// Ensure an ID and key are present
|
2014-11-29 00:06:54 +00:00
|
|
|
if (!fullRequest.id) {
|
|
|
|
fullRequest.id = domainObject.getId();
|
|
|
|
}
|
|
|
|
if (!fullRequest.key) {
|
|
|
|
fullRequest.key = domainObject.getId();
|
|
|
|
}
|
|
|
|
|
|
|
|
return fullRequest;
|
|
|
|
}
|
|
|
|
|
2014-11-29 04:59:41 +00:00
|
|
|
// Issue a request for telemetry data
|
2014-11-29 00:06:54 +00:00
|
|
|
function requestTelemetry(request) {
|
|
|
|
// Bring in any defaults from the object model
|
|
|
|
var fullRequest = buildRequest(request || {}),
|
|
|
|
source = fullRequest.source,
|
|
|
|
key = fullRequest.key;
|
|
|
|
|
2014-11-29 04:59:41 +00:00
|
|
|
// Pull out the relevant field from the larger,
|
|
|
|
// structured response.
|
2014-11-29 00:06:54 +00:00
|
|
|
function getRelevantResponse(response) {
|
2014-11-29 04:29:30 +00:00
|
|
|
return ((response || {})[source] || {})[key] || {};
|
|
|
|
}
|
|
|
|
|
2014-11-29 04:59:41 +00:00
|
|
|
// Issue a request to the service
|
2014-11-29 04:29:30 +00:00
|
|
|
function requestTelemetryFromService(telemetryService) {
|
|
|
|
return telemetryService.requestTelemetry([fullRequest]);
|
2014-11-29 00:06:54 +00:00
|
|
|
}
|
|
|
|
|
2014-11-29 04:59:41 +00:00
|
|
|
// If a telemetryService is not available,
|
|
|
|
// getTelemetryService() should reject, and this should
|
|
|
|
// bubble through subsequent then calls.
|
2014-11-29 04:29:30 +00:00
|
|
|
return getTelemetryService()
|
|
|
|
.then(requestTelemetryFromService)
|
2014-11-29 00:06:54 +00:00
|
|
|
.then(getRelevantResponse);
|
|
|
|
}
|
|
|
|
|
|
|
|
return {
|
2014-11-29 04:59:41 +00:00
|
|
|
/**
|
|
|
|
* Request telemetry data for this specific domain object.
|
|
|
|
* @param {TelemetryRequest} [request] parameters for this
|
|
|
|
* specific request
|
|
|
|
* @returns {Promise} a promise for the resulting telemetry
|
|
|
|
* object
|
|
|
|
*/
|
2014-11-29 00:06:54 +00:00
|
|
|
requestData: requestTelemetry,
|
2014-11-29 04:59:41 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Get metadata about this domain object's associated
|
|
|
|
* telemetry.
|
|
|
|
*/
|
2014-11-29 00:06:54 +00:00
|
|
|
getMetadata: function () {
|
2014-11-29 04:59:41 +00:00
|
|
|
// metadata just looks like a request,
|
|
|
|
// so use buildRequest to bring in both
|
|
|
|
// type-level and object-level telemetry
|
|
|
|
// properties
|
2014-11-29 00:06:54 +00:00
|
|
|
return buildRequest({});
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2014-11-29 04:59:41 +00:00
|
|
|
/**
|
|
|
|
* The telemetry capability is applicable when a
|
|
|
|
* domain object model has a "telemetry" field.
|
|
|
|
*/
|
2014-11-29 00:06:54 +00:00
|
|
|
TelemetryCapability.appliesTo = function (model) {
|
2014-11-29 04:29:30 +00:00
|
|
|
return (model &&
|
2014-11-29 04:59:41 +00:00
|
|
|
model.telemetry) ? true : false;
|
2014-11-29 02:39:19 +00:00
|
|
|
};
|
2014-11-29 00:06:54 +00:00
|
|
|
|
|
|
|
return TelemetryCapability;
|
|
|
|
}
|
|
|
|
);
|