/* * 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. */ 'use strict'; const Logger = require('composer-common').Logger; const LOG = Logger.getLog('Factory'); /** * Do not attempt to create an instance of this class.<br> * You must use the {@link module:composer-runtime#getFactory getFactory} * method instead. * * @class Factory * @classdesc A factory creates new instances of assets, participants, transactions, * and relationships. * @memberof module:composer-runtime * @public */ /** * A class that represents a factory in the transaction processor API. The * transaction processor API should expose no internal properties or internal * methods which could be accessed or misused. * @private */ class Factory { /** * Constructor. * @param {Factory} factory The factory to use. * @private */ constructor(factory) { const method = 'constructor'; LOG.entry(method, factory); /** * Create a new instance of an asset, participant, or transaction. The * properties of the new instance should be set as standard JavaScript * object properties. The new instance can then be stored in a registry * using the appropriate registry APIs, for example {@link * module:composer-runtime.AssetRegistry AssetRegistry}. * @example * // Get the factory. * var factory = getFactory(); * // Create a new vehicle. * var vehicle = factory.newInstance('org.acme', 'Vehicle', 'VEHICLE_1'); * // Set the properties of the new vehicle. * vehicle.colour = 'BLUE'; * vehicle.manufacturer = 'Toyota'; * @public * @method module:composer-runtime.Factory#newInstance * @param {string} ns The namespace of the resource to create. * @param {string} type The type of the resource to create. * @param {string} id The identifier of the new resource. * @return {Resource} The new instance of the resource. * @throws {Error} If the specified type (specified by the namespace and * type) is not defined in the current version of the business network. */ this.newInstance = function newInstance(ns, type, id) { return factory.newInstance(ns, type, id); }; /** * Create a new relationship with a given namespace, type, and identifier. * A relationship is a typed pointer to an instance. For example, a new * relationship with namespace 'org.acme', type 'Vehicle' and identifier * 'VEHICLE_1' creates` a pointer that points at an existing instance of * org.acme.Vehicle with the identifier 'VEHICLE_1'. * @example * // The existing driver of the vehicle. * var driver; * // Get the factory. * var factory = getFactory(); * // Create a new relationship to the vehicle. * var vehicle = factory.newRelationship('org.acme', 'Vehicle', 'VEHICLE_1'); * // Set the relationship as the value of the vehicle property of the driver. * driver.vehicle = vehicle; * @public * @method module:composer-runtime.Factory#newRelationship * @param {string} ns The namespace of the resource referenced by the relationship. * @param {string} type The type of the resource referenced by the relationship. * @param {string} id The identifier of the resource referenced by the relationship. * @return {Relationship} The new instance of the relationship. * @throws {Error} If the specified type (specified by the namespace and * type) is not defined in the current version of the business network. */ this.newRelationship = function newRelationship(ns, type, id) { return factory.newRelationship(ns, type, id); }; Object.freeze(this); LOG.exit(method); } } module.exports = Factory;