@accordproject/concerto-core
Version:
Core Implementation for the Concerto Modeling Language
99 lines (90 loc) • 3.81 kB
JavaScript
/*
* 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.
*/
;
const Identifiable = require('./identifiable');
const ModelUtil = require('../modelutil');
const ResourceId = require('./resourceid');
// Types needed for TypeScript generation.
/* eslint-disable no-unused-vars */
/* istanbul ignore next */
if (global === undefined) {
const ModelManager = require('../modelmanager');
}
/* eslint-enable no-unused-vars */
/**
* A Relationship is a typed pointer to an instance. I.e the relationship
* with namespace = 'org.example', type = 'Vehicle' and id = 'ABC' creates
* a pointer that points at an instance of org.example.Vehicle with the id
* ABC.
*
* Applications should retrieve instances from {@link Factory}
*
* @extends Identifiable
* @see See {@link Identifiable}
* @class
* @memberof module:concerto-core
*/
class Relationship extends Identifiable {
/**
* Create an asset. Use the Factory to create instances.
* <p>
* <strong>Note: Only to be called by framework code. Applications should
* retrieve instances from {@link Factory}</strong>
* </p>
*
* @param {ModelManager} modelManager - The ModelManager for this instance
* @param {ClassDeclaration} classDeclaration - The class declaration for this instance.
* @param {string} ns - The namespace this instance.
* @param {string} type - The type this instance.
* @param {string} id - The identifier of this instance.
* @param {string} timestamp - The timestamp of this instance
* @private
*/
constructor(modelManager, classDeclaration, ns, type, id, timestamp) {
super(modelManager, classDeclaration, ns, type, id, timestamp);
// we use this metatag to identify the instance as a relationship
this.$class = 'Relationship';
}
/**
* Returns the string representation of this class
* @return {String} the string representation of the class
*/
toString() {
return 'Relationship {id=' + this.getFullyQualifiedIdentifier() + '}';
}
/**
* Determine if this identifiable is a relationship.
* @return {boolean} True if this identifiable is a relationship,
* false if not.
*/
isRelationship() {
return true;
}
/**
* Contructs a Relationship instance from a URI representation (created using toURI).
* @param {ModelManager} modelManager - the model manager to bind the relationship to
* @param {String} uriAsString - the URI as a string, generated using Identifiable.toURI()
* @param {String} [defaultNamespace] - default namespace to use for backwards compatability
* @param {String} [defaultType] - default type to use for backwards compatability
* @return {Relationship} the relationship
*/
static fromURI(modelManager, uriAsString, defaultNamespace, defaultType) {
const resourceId = ResourceId.fromURI(uriAsString, defaultNamespace, defaultType);
let fqt = ModelUtil.getFullyQualifiedName(resourceId.namespace, resourceId.type);
let classDeclaration = modelManager.getType(fqt);
let relationship = new Relationship(modelManager, classDeclaration, resourceId.namespace, resourceId.type, resourceId.id);
return relationship;
}
}
module.exports = Relationship;