diff --git a/src/plugins/condition/Condition.js b/src/plugins/condition/Condition.js index 9f87af5029..6ca48dd2c4 100644 --- a/src/plugins/condition/Condition.js +++ b/src/plugins/condition/Condition.js @@ -28,10 +28,7 @@ import {computeCondition} from "./utils/evaluator"; /* * conditionConfiguration = { -* identifier: { -* key: '', -* namespace: '' -* }, +* id: uuid, * trigger: 'any'/'all', * criteria: [ * { @@ -48,14 +45,14 @@ export default class ConditionClass extends EventEmitter { /** * Manages criteria and emits the result of - true or false - based on criteria evaluated. * @constructor - * @param conditionConfiguration: {identifier: {domainObject.identifier},trigger: enum, criteria: Array of {id: uuid, operation: enum, input: Array, metaDataKey: string, key: {domainObject.identifier} } + * @param conditionConfiguration: {id: uuid,trigger: enum, criteria: Array of {id: uuid, operation: enum, input: Array, metaDataKey: string, key: {domainObject.identifier} } * @param openmct */ constructor(conditionConfiguration, openmct) { super(); this.openmct = openmct; - this.id = this.openmct.objects.makeKeyString(conditionConfiguration.identifier); + this.id = conditionConfiguration.id; this.criteria = []; this.criteriaResults = {}; this.result = undefined; @@ -63,16 +60,11 @@ export default class ConditionClass extends EventEmitter { this.createCriteria(conditionConfiguration.configuration.criteria); } this.trigger = conditionConfiguration.configuration.trigger; - this.openmct.objects.get(this.id).then(obj => this.observeForChanges(obj)); } - observeForChanges(conditionDO) { - this.stopObservingForChanges = this.openmct.objects.observe(conditionDO, '*', this.update.bind(this)); - } - - update(newDomainObject) { - this.updateTrigger(newDomainObject.configuration.trigger); - this.updateCriteria(newDomainObject.configuration.criteria); + update(conditionConfiguration) { + this.updateTrigger(conditionConfiguration.configuration.trigger); + this.updateCriteria(conditionConfiguration.configuration.criteria); } updateTrigger(trigger) { diff --git a/src/plugins/condition/ConditionManager.js b/src/plugins/condition/ConditionManager.js index c7249b95a0..e10237e062 100644 --- a/src/plugins/condition/ConditionManager.js +++ b/src/plugins/condition/ConditionManager.js @@ -25,71 +25,52 @@ import uuid from "uuid"; import EventEmitter from 'EventEmitter'; export default class ConditionManager extends EventEmitter { - constructor(domainObject, openmct) { + constructor(conditionSetDomainObject, openmct) { super(); this.openmct = openmct; - this.domainObject = domainObject; + this.conditionSetDomainObject = conditionSetDomainObject; this.timeAPI = this.openmct.time; this.latestTimestamp = {}; - this.instantiate = this.openmct.$injector.get('instantiate'); this.initialize(); + + this.stopObservingForChanges = this.openmct.objects.observe(this.conditionSetDomainObject, '*', (newDomainObject) => { + this.update(newDomainObject); + }); } initialize() { this.conditionResults = {}; - this.observeForChanges(this.domainObject); - this.conditionCollection = []; - if (this.domainObject.configuration.conditionCollection.length) { - this.domainObject.configuration.conditionCollection.forEach((conditionConfigurationId, index) => { - this.openmct.objects.get(conditionConfigurationId).then((conditionConfiguration) => { - this.initCondition(conditionConfiguration, index) - }); + this.conditionClassCollection = []; + if (this.conditionSetDomainObject.configuration.conditionCollection.length) { + this.conditionSetDomainObject.configuration.conditionCollection.forEach((conditionConfiguration, index) => { + this.initCondition(conditionConfiguration, index); }); - } else { - this.addCondition(true); } } - observeForChanges(domainObject) { - //TODO: Observe only the conditionCollection property instead of the whole domainObject - this.stopObservingForChanges = this.openmct.objects.observe(domainObject, '*', this.handleConditionCollectionUpdated.bind(this)); + update(newDomainObject) { + this.destroy(); + this.conditionSetDomainObject = newDomainObject; + this.stopObservingForChanges = this.openmct.objects.observe(this.conditionSetDomainObject, '*', (newDO) => { + this.update(newDO); + }); + this.initialize(); } - handleConditionCollectionUpdated(newDomainObject) { - let oldConditionIdentifiers = this.domainObject.configuration.conditionCollection.map((conditionConfigurationId) => { - return this.openmct.objects.makeKeyString(conditionConfigurationId); - }); - let newConditionIdentifiers = newDomainObject.configuration.conditionCollection.map((conditionConfigurationId) => { - return this.openmct.objects.makeKeyString(conditionConfigurationId); - }); - - this.domainObject = newDomainObject; - - //check for removed conditions - oldConditionIdentifiers.forEach((identifier, index) => { - if (newConditionIdentifiers.indexOf(identifier) < 0) { - this.removeCondition(identifier); - } - }); - - let newConditionCount = this.domainObject.configuration.conditionCollection.length - this.conditionCollection.length; - - for (let i = 0; i < newConditionCount; i++) { - let conditionConfigurationId = this.domainObject.configuration.conditionCollection[i]; - this.openmct.objects.get(conditionConfigurationId).then((conditionConfiguration) => { - this.initCondition(conditionConfiguration, i); - }); - } - + updateCondition(conditionConfiguration, index) { + let condition = this.conditionClassCollection[index]; + condition.update(conditionConfiguration); + this.conditionSetDomainObject.configuration.conditionCollection[index] = conditionConfiguration; + this.persistConditions(); } initCondition(conditionConfiguration, index) { let condition = new Condition(conditionConfiguration, this.openmct); condition.on('conditionResultUpdated', this.handleConditionResult.bind(this)); if (index !== undefined) { - this.conditionCollection.splice(index + 1, 0, condition); + this.conditionClassCollection.splice(index + 1, 0, condition); } else { - this.conditionCollection.unshift(condition); + this.conditionClassCollection.unshift(condition); } //There are no criteria for a default condition and hence no subscriptions. //Hence the conditionResult must be manually triggered for it. @@ -98,30 +79,25 @@ export default class ConditionManager extends EventEmitter { } } - createConditionDomainObject(isDefault, conditionConfiguration) { + createCondition(conditionConfiguration) { let conditionObj; if (conditionConfiguration) { conditionObj = { ...conditionConfiguration, - name: `Copy of ${conditionConfiguration.name}`, - identifier: { - ...this.domainObject.identifier, - key: uuid() + id: uuid(), + configuration: { + ...conditionConfiguration.configuration, + name: `Copy of ${conditionConfiguration.configuration.name}` } }; } else { conditionObj = { - isDefault: isDefault, - type: 'condition', - identifier: { - ...this.domainObject.identifier, - key: uuid() - }, + id: uuid(), configuration: { - name: isDefault ? 'Default' : 'Unnamed Condition', + name: 'Unnamed Condition', output: 'false', trigger: 'all', - criteria: isDefault ? [] : [{ + criteria: [{ telemetry: '', operation: '', input: [], @@ -131,58 +107,48 @@ export default class ConditionManager extends EventEmitter { summary: '' }; } - let conditionDomainObjectKeyString = this.openmct.objects.makeKeyString(conditionObj.identifier); - let newDomainObject = this.instantiate(conditionObj, conditionDomainObjectKeyString); - return newDomainObject.useCapability('adapter'); + return conditionObj; } - addCondition(isDefault, index) { - this.createAndSaveConditionDomainObject(!!isDefault, index); + addCondition() { + this.createAndSaveCondition(); } - cloneCondition(conditionConfigurationId, index) { - this.openmct.objects.get(conditionConfigurationId).then((conditionConfiguration) => { - this.createAndSaveConditionDomainObject(false, index, conditionConfiguration); - }); + cloneCondition(conditionConfiguration, index) { + this.createAndSaveCondition(index, conditionConfiguration); } - createAndSaveConditionDomainObject(isDefault, index, conditionConfiguration) { - let newConditionDomainObject = this.createConditionDomainObject(isDefault, conditionConfiguration); - //persist the condition domain object so that we can do an openmct.objects.get on it and only persist the identifier in the conditionCollection of conditionSet - this.openmct.objects.mutate(newConditionDomainObject, 'created', new Date()); + createAndSaveCondition(index, conditionConfiguration) { + let newCondition = this.createCondition(conditionConfiguration); if (index !== undefined) { - this.domainObject.configuration.conditionCollection.splice(index + 1, 0, newConditionDomainObject.identifier); + this.conditionSetDomainObject.configuration.conditionCollection.splice(index + 1, 0, newCondition); } else { - this.domainObject.configuration.conditionCollection.unshift(newConditionDomainObject.identifier); + this.conditionSetDomainObject.configuration.conditionCollection.unshift(newCondition); } - this.persist(); + this.initCondition(newCondition, index); + this.persistConditions(); } - removeCondition(identifier) { - let found = this.findConditionById(identifier); - if (found) { - let index = found.index; - let condition = this.conditionCollection[index]; - let conditionIdAsString = condition.id; - condition.destroyCriteria(); - condition.off('conditionResultUpdated', this.handleConditionResult.bind(this)); - this.conditionCollection.splice(index, 1); - this.domainObject.configuration.conditionCollection.splice(index, 1); - if (this.conditionResults[conditionIdAsString] !== undefined) { - delete this.conditionResults[conditionIdAsString]; - } - this.persist(); - this.handleConditionResult(); + removeCondition(index) { + let condition = this.conditionClassCollection[index]; + condition.destroyCriteria(); + condition.off('conditionResultUpdated', this.handleConditionResult.bind(this)); + this.conditionClassCollection.splice(index, 1); + this.conditionSetDomainObject.configuration.conditionCollection.splice(index, 1); + if (this.conditionResults[condition.id] !== undefined) { + delete this.conditionResults[condition.id]; } + this.persistConditions(); + this.handleConditionResult(); } - findConditionById(identifier) { + findConditionById(id) { let found; - for (let i=0, ii=this.conditionCollection.length; i < ii; i++) { - if (this.conditionCollection[i].id === this.openmct.objects.makeKeyString(identifier)) { + for (let i=0, ii=this.conditionClassCollection.length; i < ii; i++) { + if (this.conditionClassCollection[i].id === id) { found = { - item: this.conditionCollection[i], + item: this.conditionClassCollection[i], index: i }; break; @@ -192,51 +158,48 @@ export default class ConditionManager extends EventEmitter { return found; } - //this.$set(this.conditionCollection, reorderEvent.newIndex, oldConditions[reorderEvent.oldIndex]); + //this.$set(this.conditionClassCollection, reorderEvent.newIndex, oldConditions[reorderEvent.oldIndex]); reorderConditions(reorderPlan) { - let oldConditions = Array.from(this.domainObject.configuration.conditionCollection); + let oldConditions = Array.from(this.conditionSetDomainObject.configuration.conditionCollection); let newCollection = []; reorderPlan.forEach((reorderEvent) => { let item = oldConditions[reorderEvent.oldIndex]; newCollection.push(item); - this.domainObject.configuration.conditionCollection = newCollection; + this.conditionSetDomainObject.configuration.conditionCollection = newCollection; }); - this.persist(); + this.persistConditions(); } handleConditionResult(resultObj) { - let conditionCollection = this.domainObject.configuration.conditionCollection; - let currentConditionIdentifier = conditionCollection[conditionCollection.length-1]; + const conditionCollection = this.conditionSetDomainObject.configuration.conditionCollection; + let currentCondition = conditionCollection[conditionCollection.length-1]; if (resultObj) { - let idAsString = this.openmct.objects.makeKeyString(resultObj.id); - if (this.findConditionById(idAsString)) { - this.conditionResults[idAsString] = resultObj.data.result; + const id = resultObj.id; + if (this.findConditionById(id)) { + this.conditionResults[id] = resultObj.data.result; } this.updateTimestamp(resultObj.data); } for (let i = 0; i < conditionCollection.length - 1; i++) { - let conditionIdAsString = this.openmct.objects.makeKeyString(conditionCollection[i]); - if (this.conditionResults[conditionIdAsString]) { + if (this.conditionResults[conditionCollection[i].id]) { //first condition to be true wins - currentConditionIdentifier = conditionCollection[i]; + currentCondition = conditionCollection[i]; break; } } - this.openmct.objects.get(currentConditionIdentifier).then((obj) => { - this.emit('conditionSetResultUpdated', - Object.assign( - { - output: obj.configuration.output, - id: this.domainObject.identifier, - conditionId: currentConditionIdentifier - }, - this.latestTimestamp - ) + this.emit('conditionSetResultUpdated', + Object.assign( + { + output: currentCondition.configuration.output, + id: this.conditionSetDomainObject.identifier, + conditionId: currentCondition.id + }, + this.latestTimestamp ) - }); + ) } updateTimestamp(timestamp) { @@ -249,15 +212,15 @@ export default class ConditionManager extends EventEmitter { }); } - persist() { - this.openmct.objects.mutate(this.domainObject, 'configuration.conditionCollection', this.domainObject.configuration.conditionCollection); + persistConditions() { + this.openmct.objects.mutate(this.conditionSetDomainObject, 'configuration.conditionCollection', this.conditionSetDomainObject.configuration.conditionCollection); } destroy() { - if (typeof this.stopObservingForChanges === 'function') { + if(this.stopObservingForChanges) { this.stopObservingForChanges(); } - this.conditionCollection.forEach((condition) => { + this.conditionClassCollection.forEach((condition) => { condition.off('conditionResultUpdated', this.handleConditionResult); condition.destroy(); }) diff --git a/src/plugins/condition/ConditionManagerSpec.js b/src/plugins/condition/ConditionManagerSpec.js index c5e50e9694..76ca982fc8 100644 --- a/src/plugins/condition/ConditionManagerSpec.js +++ b/src/plugins/condition/ConditionManagerSpec.js @@ -27,6 +27,13 @@ describe('ConditionManager', () => { let conditionMgr; let mockListener; let openmct = {}; + let mockCondition = { + isDefault: true, + id: '1234-5678', + configuration: { + criteria: [] + } + }; let conditionSetDomainObject = { identifier: { namespace: "", @@ -35,15 +42,9 @@ describe('ConditionManager', () => { type: "conditionSet", location: "mine", configuration: { - conditionCollection: [] - } - }; - let mockConditionDomainObject = { - isDefault: true, - type: 'condition', - identifier: { - namespace: '', - key: '1234-5678' + conditionCollection: [ + mockCondition + ] } }; @@ -55,7 +56,7 @@ describe('ConditionManager', () => { let mockDomainObject = { useCapability: function () { - return mockConditionDomainObject; + return mockCondition; } }; mockInstantiate.and.callFake(function () { @@ -78,7 +79,7 @@ describe('ConditionManager', () => { openmct.objects.get.and.returnValues(new Promise(function (resolve, reject) { resolve(conditionSetDomainObject); }), new Promise(function (resolve, reject) { - resolve(mockConditionDomainObject); + resolve(mockCondition); })); openmct.objects.makeKeyString.and.returnValue(conditionSetDomainObject.identifier.key); openmct.objects.observe.and.returnValue(function () {}); @@ -90,9 +91,9 @@ describe('ConditionManager', () => { }); it('creates a conditionCollection with a default condition', function () { - expect(conditionMgr.domainObject.configuration.conditionCollection.length).toEqual(1); - let defaultConditionIdentifier = conditionMgr.domainObject.configuration.conditionCollection[0]; - expect(defaultConditionIdentifier).toEqual(mockConditionDomainObject.identifier); + expect(conditionMgr.conditionSetDomainObject.configuration.conditionCollection.length).toEqual(1); + let defaultConditionId = conditionMgr.conditionClassCollection[0].id; + expect(defaultConditionId).toEqual(mockCondition.id); }); }); diff --git a/src/plugins/condition/ConditionSetTelemetryProvider.js b/src/plugins/condition/ConditionSetTelemetryProvider.js index cf721654ce..59ca24eb76 100644 --- a/src/plugins/condition/ConditionSetTelemetryProvider.js +++ b/src/plugins/condition/ConditionSetTelemetryProvider.js @@ -1,3 +1,25 @@ +/***************************************************************************** + * Open MCT, Copyright (c) 2014-2020, 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. + *****************************************************************************/ + import ConditionManager from './ConditionManager' export default class ConditionSetTelemetryProvider { diff --git a/src/plugins/condition/ConditionSpec.js b/src/plugins/condition/ConditionSpec.js index b29cec9dd9..cd8253cf50 100644 --- a/src/plugins/condition/ConditionSpec.js +++ b/src/plugins/condition/ConditionSpec.js @@ -64,6 +64,7 @@ describe("The condition", function () { openmct.telemetry.getMetadata.and.returnValue(testTelemetryObject.telemetry.values); testConditionDefinition = { + id: '123-456', configuration: { trigger: TRIGGER.ANY, criteria: [ diff --git a/src/plugins/condition/StyleRuleManager.js b/src/plugins/condition/StyleRuleManager.js index 1d5b010c09..972e8b58a7 100644 --- a/src/plugins/condition/StyleRuleManager.js +++ b/src/plugins/condition/StyleRuleManager.js @@ -64,15 +64,13 @@ export default class StyleRuleManager extends EventEmitter { updateConditionStylesMap(conditionStyles) { let conditionStyleMap = {}; conditionStyles.forEach((conditionStyle) => { - const identifier = this.openmct.objects.makeKeyString(conditionStyle.conditionIdentifier); - conditionStyleMap[identifier] = conditionStyle.style; + conditionStyleMap[conditionStyle.conditionId] = conditionStyle.style; }); this.conditionalStyleMap = conditionStyleMap; } handleConditionSetResultUpdated(resultData) { - let identifier = this.openmct.objects.makeKeyString(resultData.conditionId); - let foundStyle = this.conditionalStyleMap[identifier]; + let foundStyle = this.conditionalStyleMap[resultData.conditionId]; if (foundStyle) { if (foundStyle !== this.currentStyle) { this.currentStyle = foundStyle; diff --git a/src/plugins/condition/components/Condition.vue b/src/plugins/condition/components/Condition.vue index 37114f8b26..f3258cb890 100644 --- a/src/plugins/condition/components/Condition.vue +++ b/src/plugins/condition/components/Condition.vue @@ -23,14 +23,13 @@