import { Utils } from '../common/Utils';
const __ = {
private: Symbol('private'),
}
/**
* @class RelationshipManager
* The relationship manager.
* @memberof THING
*/
class RelationshipManager {
/**
* The relationship manager to manage object(s) life.
*/
constructor() {
this[__.private] = {};
let _private = this[__.private];
_private.relationships = [];
}
addRelationship(relationship) {
let _private = this[__.private];
_private.relationships.push(relationship);
this.notifyObjectAddRelationship(relationship.source, relationship);
this.notifyObjectAddRelationship(relationship.target, relationship);
}
removeRelationship(relationship) {
let _private = this[__.private];
Utils.removeFromArray(_private.relationships, relationship);
this.notifyObjectRemoveRelationship(relationship.source, relationship);
this.notifyObjectRemoveRelationship(relationship.target, relationship);
}
notifyObjectAddRelationship(object, relationship) {
if (object) {
if (Utils.isArray(object)) {
object.forEach((object) => {
object.addRelationship(relationship);
})
} else {
object.addRelationship(relationship);
}
}
}
notifyObjectRemoveRelationship(object, relationship) {
if (object) {
if (Utils.isArray(object)) {
object.forEach((object) => {
object.removeRelationship(relationship);
})
} else {
object.removeRelationship(relationship);
}
}
}
notifyRelationshipRemoveObject(relationship, object) {
relationship.releaseObject(object);
}
queryRelationships(options = {}) {
let _private = this[__.private];
let result = [];
result = _private.relationships.filter((relationship) => {
return relationship.test(options);
})
return result;
}
dispose() {
let _private = this[__.private];
_private.relationships.forEach(relationship => {
relationship.destroy();
});
_private.relationships = [];
}
get relationships() {
let _private = this[__.private];
return _private.relationships;
}
}
export { RelationshipManager }