Merge pull request #1515 from nasa/open1498

Removed contextualization warning.
This commit is contained in:
Pete Richards 2017-04-04 15:44:16 -07:00 committed by GitHub
commit df0d4dff6f
11 changed files with 30 additions and 266 deletions

View File

@ -49,7 +49,6 @@ define([
"./src/services/Now", "./src/services/Now",
"./src/services/Throttle", "./src/services/Throttle",
"./src/services/Topic", "./src/services/Topic",
"./src/services/Contextualize",
"./src/services/Instantiate", "./src/services/Instantiate",
'legacyRegistry' 'legacyRegistry'
], function ( ], function (
@ -81,7 +80,6 @@ define([
Now, Now,
Throttle, Throttle,
Topic, Topic,
Contextualize,
Instantiate, Instantiate,
legacyRegistry legacyRegistry
) { ) {
@ -284,8 +282,7 @@ define([
"key": "composition", "key": "composition",
"implementation": CompositionCapability, "implementation": CompositionCapability,
"depends": [ "depends": [
"$injector", "$injector"
"contextualize"
] ]
}, },
{ {
@ -380,13 +377,6 @@ define([
"$log" "$log"
] ]
}, },
{
"key": "contextualize",
"implementation": Contextualize,
"depends": [
"$log"
]
},
{ {
"key": "instantiate", "key": "instantiate",
"implementation": Instantiate, "implementation": Instantiate,

View File

@ -24,7 +24,8 @@
* Module defining CompositionCapability. Created by vwoeltje on 11/7/14. * Module defining CompositionCapability. Created by vwoeltje on 11/7/14.
*/ */
define( define(
function () { ['./ContextualDomainObject'],
function (ContextualDomainObject) {
/** /**
* Composition capability. A domain object's composition is the set of * Composition capability. A domain object's composition is the set of
@ -38,13 +39,12 @@ define(
* @constructor * @constructor
* @implements {Capability} * @implements {Capability}
*/ */
function CompositionCapability($injector, contextualize, domainObject) { function CompositionCapability($injector, domainObject) {
// Get a reference to the object service from $injector // Get a reference to the object service from $injector
this.injectObjectService = function () { this.injectObjectService = function () {
this.objectService = $injector.get("objectService"); this.objectService = $injector.get("objectService");
}; };
this.contextualize = contextualize;
this.domainObject = domainObject; this.domainObject = domainObject;
} }
@ -115,7 +115,6 @@ define(
CompositionCapability.prototype.invoke = function () { CompositionCapability.prototype.invoke = function () {
var domainObject = this.domainObject, var domainObject = this.domainObject,
model = domainObject.getModel(), model = domainObject.getModel(),
contextualize = this.contextualize,
ids; ids;
// Then filter out non-existent objects, // Then filter out non-existent objects,
@ -125,7 +124,7 @@ define(
return ids.filter(function (id) { return ids.filter(function (id) {
return objects[id]; return objects[id];
}).map(function (id) { }).map(function (id) {
return contextualize(objects[id], domainObject); return new ContextualDomainObject(objects[id], domainObject);
}); });
} }

View File

@ -21,8 +21,8 @@
*****************************************************************************/ *****************************************************************************/
define( define(
[], ['./ContextualDomainObject'],
function () { function (ContextualDomainObject) {
/** /**
* Implements the `instantiation` capability. This allows new domain * Implements the `instantiation` capability. This allows new domain
@ -70,11 +70,7 @@ define(
var newObject = this.instantiateFn(model, id); var newObject = this.instantiateFn(model, id);
this.contextualizeFn = this.contextualizeFn || return new ContextualDomainObject(newObject, this.domainObject);
this.$injector.get("contextualize");
return this.contextualizeFn(newObject, this.domainObject);
}; };
/** /**

View File

@ -1,82 +0,0 @@
/*****************************************************************************
* Open MCT, Copyright (c) 2014-2016, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
define(
['../capabilities/ContextualDomainObject'],
function (ContextualDomainObject) {
/**
* Wrap a domain object such that it has a `context` capability
* referring to a specific parent.
*
* Usage:
*
* contextualize(domainObject, parentObject)
*
* Attempting to contextualize an object with a parent that does
* not include that object in its composition may have
* unpredictable results; a warning will be logged if this occurs.
*
* @returns {Function}
* @memberof platform/core
*/
function Contextualize($log) {
function validate(id, parentObject) {
var model = parentObject && parentObject.getModel(),
composition = (model || {}).composition || [];
if (composition.indexOf(id) === -1) {
$log.warn([
"Attempted to contextualize",
id,
"in",
parentObject && parentObject.getId(),
"but that object does not contain",
id,
"in its composition.",
"Unexpected behavior may follow."
].join(" "));
}
}
/**
* Contextualize this domain object.
* @param {DomainObject} domainObject the domain object
* to wrap with a context
* @param {DomainObject} parentObject the domain object
* which should appear as the contextual parent
*/
return function (domainObject, parentObject) {
// Don't validate while editing; consistency is not
// necessarily expected due to unsaved changes.
var editor = domainObject.getCapability('editor');
if (!editor || !editor.inEditContext()) {
validate(domainObject.getId(), parentObject);
}
return new ContextualDomainObject(domainObject, parentObject);
};
}
return Contextualize;
}
);

View File

@ -41,7 +41,6 @@ define(
describe("The composition capability", function () { describe("The composition capability", function () {
var mockDomainObject, var mockDomainObject,
mockInjector, mockInjector,
mockContextualize,
mockObjectService, mockObjectService,
composition; composition;
@ -72,19 +71,11 @@ define(
return (name === "objectService") && mockObjectService; return (name === "objectService") && mockObjectService;
} }
}; };
mockContextualize = jasmine.createSpy('contextualize');
// Provide a minimal (e.g. no error-checking) implementation
// of contextualize for simplicity
mockContextualize.andCallFake(function (domainObject, parentObject) {
return new ContextualDomainObject(domainObject, parentObject);
});
mockObjectService.getObjects.andReturn(mockPromise([])); mockObjectService.getObjects.andReturn(mockPromise([]));
composition = new CompositionCapability( composition = new CompositionCapability(
mockInjector, mockInjector,
mockContextualize,
mockDomainObject mockDomainObject
); );
}); });

View File

@ -28,7 +28,6 @@ define(
var mockInjector, var mockInjector,
mockIdentifierService, mockIdentifierService,
mockInstantiate, mockInstantiate,
mockContextualize,
mockIdentifier, mockIdentifier,
mockNow, mockNow,
mockDomainObject, mockDomainObject,
@ -37,7 +36,6 @@ define(
beforeEach(function () { beforeEach(function () {
mockInjector = jasmine.createSpyObj("$injector", ["get"]); mockInjector = jasmine.createSpyObj("$injector", ["get"]);
mockInstantiate = jasmine.createSpy("instantiate"); mockInstantiate = jasmine.createSpy("instantiate");
mockContextualize = jasmine.createSpy("contextualize");
mockIdentifierService = jasmine.createSpyObj( mockIdentifierService = jasmine.createSpyObj(
'identifierService', 'identifierService',
['parse', 'generate'] ['parse', 'generate']
@ -53,8 +51,7 @@ define(
mockInjector.get.andCallFake(function (key) { mockInjector.get.andCallFake(function (key) {
return { return {
'instantiate': mockInstantiate, 'instantiate': mockInstantiate
'contextualize': mockContextualize
}[key]; }[key];
}); });
mockIdentifierService.parse.andReturn(mockIdentifier); mockIdentifierService.parse.andReturn(mockIdentifier);
@ -85,18 +82,12 @@ define(
'hasCapability' 'hasCapability'
]), testModel = { someKey: "some value" }; ]), testModel = { someKey: "some value" };
mockInstantiate.andReturn(mockDomainObj); mockInstantiate.andReturn(mockDomainObj);
mockContextualize.andCallFake(function (x) { instantiation.instantiate(testModel);
return x;
});
expect(instantiation.instantiate(testModel))
.toBe(mockDomainObj);
expect(mockInstantiate) expect(mockInstantiate)
.toHaveBeenCalledWith({ .toHaveBeenCalledWith({
someKey: "some value", someKey: "some value",
modified: mockNow() modified: mockNow()
}, jasmine.any(String)); }, jasmine.any(String));
expect(mockContextualize)
.toHaveBeenCalledWith(mockDomainObj, mockDomainObject);
}); });
}); });

View File

@ -1,103 +0,0 @@
/*****************************************************************************
* Open MCT, Copyright (c) 2014-2016, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* Open MCT is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* Open MCT includes source code licensed under additional open source
* licenses. See the Open Source Licenses file (LICENSES.md) included with
* this source code distribution or the Licensing information page available
* at runtime from the About dialog for additional information.
*****************************************************************************/
define(
["../../src/services/Contextualize"],
function (Contextualize) {
var DOMAIN_OBJECT_METHODS = [
'getId',
'getModel',
'getCapability',
'hasCapability',
'useCapability'
];
describe("The 'contextualize' service", function () {
var mockLog,
mockDomainObject,
mockParentObject,
mockEditor,
testParentModel,
contextualize;
beforeEach(function () {
testParentModel = { composition: ["abc"] };
mockLog = jasmine.createSpyObj(
"$log",
["error", "warn", "info", "debug"]
);
mockDomainObject =
jasmine.createSpyObj('domainObject', DOMAIN_OBJECT_METHODS);
mockParentObject =
jasmine.createSpyObj('parentObject', DOMAIN_OBJECT_METHODS);
mockEditor =
jasmine.createSpyObj('editor', ['inEditContext']);
mockDomainObject.getId.andReturn("abc");
mockDomainObject.getModel.andReturn({});
mockParentObject.getId.andReturn("parent");
mockParentObject.getModel.andReturn(testParentModel);
mockEditor.inEditContext.andReturn(false);
mockDomainObject.getCapability.andCallFake(function (c) {
return c === 'editor' && mockEditor;
});
contextualize = new Contextualize(mockLog);
});
it("attaches a context capability", function () {
var contextualizedObject =
contextualize(mockDomainObject, mockParentObject);
expect(contextualizedObject.getId()).toEqual("abc");
expect(contextualizedObject.getCapability("context"))
.toBeDefined();
expect(contextualizedObject.getCapability("context").getParent())
.toBe(mockParentObject);
});
it("issues a warning if composition does not match", function () {
// Precondition - normally it should not issue a warning
contextualize(mockDomainObject, mockParentObject);
expect(mockLog.warn).not.toHaveBeenCalled();
testParentModel.composition = ["xyz"];
contextualize(mockDomainObject, mockParentObject);
expect(mockLog.warn).toHaveBeenCalled();
});
it("does not issue warnings for objects being edited", function () {
mockEditor.inEditContext.andReturn(true);
testParentModel.composition = ["xyz"];
contextualize(mockDomainObject, mockParentObject);
expect(mockLog.warn).not.toHaveBeenCalled();
});
});
}
);

View File

@ -132,7 +132,6 @@ define([
"provides": "objectService", "provides": "objectService",
"implementation": LocatingObjectDecorator, "implementation": LocatingObjectDecorator,
"depends": [ "depends": [
"contextualize",
"$q", "$q",
"$log" "$log"
] ]

View File

@ -22,7 +22,8 @@
define( define(
function () { ['../../../core/src/capabilities/ContextualDomainObject'],
function (ContextualDomainObject) {
/** /**
* Ensures that domain objects are loaded with a context capability * Ensures that domain objects are loaded with a context capability
@ -31,8 +32,7 @@ define(
* @implements {ObjectService} * @implements {ObjectService}
* @memberof platform/entanglement * @memberof platform/entanglement
*/ */
function LocatingObjectDecorator(contextualize, $q, $log, objectService) { function LocatingObjectDecorator($q, $log, objectService) {
this.contextualize = contextualize;
this.$log = $log; this.$log = $log;
this.objectService = objectService; this.objectService = objectService;
this.$q = $q; this.$q = $q;
@ -41,7 +41,6 @@ define(
LocatingObjectDecorator.prototype.getObjects = function (ids) { LocatingObjectDecorator.prototype.getObjects = function (ids) {
var $q = this.$q, var $q = this.$q,
$log = this.$log, $log = this.$log,
contextualize = this.contextualize,
objectService = this.objectService, objectService = this.objectService,
result = {}; result = {};
@ -76,7 +75,7 @@ define(
return loadObjectInContext(location, exclude) return loadObjectInContext(location, exclude)
.then(function (parent) { .then(function (parent) {
// ...and then contextualize with it! // ...and then contextualize with it!
return contextualize(domainObject, parent); return new ContextualDomainObject(domainObject, parent);
}); });
} }

View File

@ -23,13 +23,13 @@
define( define(
[ [
'../../src/services/LocatingObjectDecorator' '../../src/services/LocatingObjectDecorator',
'../../../core/src/capabilities/ContextualDomainObject'
], ],
function (LocatingObjectDecorator) { function (LocatingObjectDecorator, ContextualDomainObject) {
describe("LocatingObjectDecorator", function () { describe("LocatingObjectDecorator", function () {
var mockContextualize, var mockQ,
mockQ,
mockLog, mockLog,
mockObjectService, mockObjectService,
mockCallback, mockCallback,
@ -57,21 +57,12 @@ define(
}; };
testObjects = {}; testObjects = {};
mockContextualize = jasmine.createSpy("contextualize");
mockQ = jasmine.createSpyObj("$q", ["when", "all"]); mockQ = jasmine.createSpyObj("$q", ["when", "all"]);
mockLog = mockLog =
jasmine.createSpyObj("$log", ["error", "warn", "info", "debug"]); jasmine.createSpyObj("$log", ["error", "warn", "info", "debug"]);
mockObjectService = mockObjectService =
jasmine.createSpyObj("objectService", ["getObjects"]); jasmine.createSpyObj("objectService", ["getObjects"]);
mockContextualize.andCallFake(function (domainObject, parentObject) {
// Not really what contextualize does, but easy to test!
return {
testObject: domainObject,
testParent: parentObject
};
});
mockQ.when.andCallFake(testPromise); mockQ.when.andCallFake(testPromise);
mockQ.all.andCallFake(function (promises) { mockQ.all.andCallFake(function (promises) {
var result = {}; var result = {};
@ -97,28 +88,21 @@ define(
}); });
decorator = new LocatingObjectDecorator( decorator = new LocatingObjectDecorator(
mockContextualize,
mockQ, mockQ,
mockLog, mockLog,
mockObjectService mockObjectService
); );
}); });
it("contextualizes domain objects by location", function () { it("contextualizes domain objects", function () {
decorator.getObjects(['b', 'c']).then(mockCallback); decorator.getObjects(['b', 'c']).then(mockCallback);
expect(mockCallback).toHaveBeenCalledWith({ expect(mockCallback).toHaveBeenCalled();
b: {
testObject: testObjects.b, var callbackObj = mockCallback.mostRecentCall.args[0];
testParent: testObjects.a expect(testObjects.b.getCapability('context')).not.toBeDefined();
}, expect(testObjects.c.getCapability('context')).not.toBeDefined();
c: { expect(callbackObj.b.getCapability('context')).toBeDefined();
testObject: testObjects.c, expect(callbackObj.c.getCapability('context')).toBeDefined();
testParent: {
testObject: testObjects.b,
testParent: testObjects.a
}
}
});
}); });
it("warns on cycle detection", function () { it("warns on cycle detection", function () {

View File

@ -24,13 +24,13 @@
* Module defining AlternateCompositionCapability. Created by vwoeltje on 11/7/14. * Module defining AlternateCompositionCapability. Created by vwoeltje on 11/7/14.
*/ */
define([ define([
'../../api/objects/object-utils' '../../api/objects/object-utils',
], function (objectUtils) { '../../../platform/core/src/capabilities/ContextualDomainObject'
], function (objectUtils, ContextualDomainObject) {
function AlternateCompositionCapability($injector, domainObject) { function AlternateCompositionCapability($injector, domainObject) {
this.domainObject = domainObject; this.domainObject = domainObject;
this.getDependencies = function () { this.getDependencies = function () {
this.instantiate = $injector.get("instantiate"); this.instantiate = $injector.get("instantiate");
this.contextualize = $injector.get("contextualize");
this.getDependencies = undefined; this.getDependencies = undefined;
this.openmct = $injector.get("openmct"); this.openmct = $injector.get("openmct");
}.bind(this); }.bind(this);
@ -74,7 +74,7 @@ define([
var keyString = objectUtils.makeKeyString(child.identifier); var keyString = objectUtils.makeKeyString(child.identifier);
var oldModel = objectUtils.toOldFormat(child); var oldModel = objectUtils.toOldFormat(child);
var newDO = this.instantiate(oldModel, keyString); var newDO = this.instantiate(oldModel, keyString);
return this.contextualize(newDO, this.domainObject); return new ContextualDomainObject(newDO, this.domainObject);
}; };