2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 import {Requirement, CompositionCiLinkBase, ComponentInstance, CapabilitiesGroup, RequirementsGroup, MatchReqToCapability, MatchBase,
22 MatchReqToReq,CompositionCiNodeBase, Component, Capability} from "app/models";
24 * Created by obarda on 1/1/2017.
27 export class MatchCapabilitiesRequirementsUtils {
32 public static linkable(requirement1:Requirement, requirement2:Requirement, vlCapability:Capability):boolean {
33 return MatchCapabilitiesRequirementsUtils.isMatch(requirement1, vlCapability) && MatchCapabilitiesRequirementsUtils.isMatch(requirement2, vlCapability);
38 * Shows + icon in corner of each node passed in
39 * @param filteredNodesData
42 public highlightMatchingComponents(filteredNodesData, cy:Cy.Instance) {
43 _.each(filteredNodesData, (data:any) => {
44 let node = cy.getElementById(data.id);
45 cy.emit('showhandle', [node]);
50 * Adds opacity to each node that cannot be linked to hovered node
51 * @param filteredNodesData
54 * @param hoveredNodeData
56 public fadeNonMachingComponents(filteredNodesData, nodesData, cy:Cy.Instance, hoveredNodeData?) {
57 let fadeNodes = _.xorWith(nodesData, filteredNodesData, (node1, node2) => {
58 return node1.id === node2.id;
60 if (hoveredNodeData) {
61 _.remove(fadeNodes, hoveredNodeData);
64 _.each(fadeNodes, (node) => {
65 cy.getElementById(node.id).style({'background-image-opacity': 0.4});
71 * Resets all nodes to regular opacity
74 public resetFadedNodes(cy:Cy.Instance) {
76 cy.nodes().style({'background-image-opacity': 1});
80 // -------------------------------------------ALL FUNCTIONS NEED REFACTORING---------------------------------------------------------------//
82 private static requirementFulfilled(fromNodeId:string, requirement:any, links:Array<CompositionCiLinkBase>):boolean {
83 return _.some(links, {
85 'fromNode': fromNodeId,
87 'requirementOwnerId': requirement.ownerId,
88 'requirement': requirement.name,
90 'type': requirement.relationship
98 private static isMatch(requirement:Requirement, capability:Capability):boolean {
99 if (capability.type === requirement.capability) {
100 if (requirement.node) {
101 if (_.includes(capability.capabilitySources, requirement.node)) {
111 private getFromToMatches(requirements1:RequirementsGroup,
112 requirements2:RequirementsGroup,
113 capabilities:CapabilitiesGroup,
114 links:Array<CompositionCiLinkBase>,
117 vlCapability?:Capability):Array<MatchBase> {
118 let matches:Array<MatchBase> = new Array<MatchBase>();
119 _.forEach(requirements1, (requirementValue:Array<Requirement>, key) => {
120 _.forEach(requirementValue, (requirement:Requirement) => {
121 if (requirement.name !== "dependency" && !MatchCapabilitiesRequirementsUtils.requirementFulfilled(fromId, requirement, links)) {
122 _.forEach(capabilities, (capabilityValue:Array<Capability>, key) => {
123 _.forEach(capabilityValue, (capability:Capability) => {
124 if (MatchCapabilitiesRequirementsUtils.isMatch(requirement, capability)) {
125 let match:MatchReqToCapability = new MatchReqToCapability(requirement, capability, true, fromId, toId);
131 _.forEach(requirements2, (requirement2Value:Array<Requirement>, key) => {
132 _.forEach(requirement2Value, (requirement2:Requirement) => {
133 if (!MatchCapabilitiesRequirementsUtils.requirementFulfilled(toId, requirement2, links) && MatchCapabilitiesRequirementsUtils.linkable(requirement, requirement2, vlCapability)) {
134 let match:MatchReqToReq = new MatchReqToReq(requirement, requirement2, true, fromId, toId);
146 private getToFromMatches(requirements:RequirementsGroup, capabilities:CapabilitiesGroup, links:Array<CompositionCiLinkBase>, fromId:string, toId:string):Array<MatchReqToCapability> {
147 let matches:Array<MatchReqToCapability> = [];
148 _.forEach(requirements, (requirementValue:Array<Requirement>, key) => {
149 _.forEach(requirementValue, (requirement:Requirement) => {
150 if (requirement.name !== "dependency" && !MatchCapabilitiesRequirementsUtils.requirementFulfilled(toId, requirement, links)) {
151 _.forEach(capabilities, (capabilityValue:Array<Capability>, key) => {
152 _.forEach(capabilityValue, (capability:Capability) => {
153 if (MatchCapabilitiesRequirementsUtils.isMatch(requirement, capability)) {
154 let match:MatchReqToCapability = new MatchReqToCapability(requirement, capability, false, toId, fromId);
165 public getMatchedRequirementsCapabilities(fromComponentInstance:ComponentInstance,
166 toComponentInstance:ComponentInstance,
167 links:Array<CompositionCiLinkBase>,
168 vl?:Component):Array<MatchBase> {//TODO allow for VL array
171 let linkCapabilities:Array<Capability> = vl.capabilities.findValueByKey('linkable');
172 if (linkCapabilities) {
173 linkCapability = linkCapabilities[0];
176 let fromToMatches:Array<MatchBase> = this.getFromToMatches(fromComponentInstance.requirements,
177 toComponentInstance.requirements,
178 toComponentInstance.capabilities,
180 fromComponentInstance.uniqueId,
181 toComponentInstance.uniqueId,
183 let toFromMatches:Array<MatchReqToCapability> = this.getToFromMatches(toComponentInstance.requirements,
184 fromComponentInstance.capabilities,
186 fromComponentInstance.uniqueId,
187 toComponentInstance.uniqueId);
189 return fromToMatches.concat(toFromMatches);
194 * Step I: Check if capabilities of component match requirements of nodeDataArray
195 * 1. Get component capabilities and loop on each capability
196 * 2. Inside the loop, perform another loop on all nodeDataArray, and fetch the requirements for each one
197 * 3. Loop on the requirements, and verify match (see in code the rules)
199 * Step II: Check if requirements of component match capabilities of nodeDataArray
200 * 1. Get component requirements and loop on each requirement
203 * @param component - this is the hovered resource of the left panel of composition screen
204 * @param nodeDataArray - Array of resource instances that are on the canvas
205 * @param links -getMatchedRequirementsCapabilities
207 * @returns {any[]|T[]}
209 public findByMatchingCapabilitiesToRequirements(component:Component,
210 nodeDataArray:Array<CompositionCiNodeBase>,
211 links:Array<CompositionCiLinkBase>,
212 vl?:Component):Array<any> {//TODO allow for VL array
217 let capabilities:any = component.capabilities;
218 _.forEach(capabilities, (capabilityValue:Array<any>, capabilityKey)=> {
219 _.forEach(capabilityValue, (capability)=> {
220 _.forEach(nodeDataArray, (node:CompositionCiNodeBase)=> {
221 if (node && node.componentInstance) {
222 let requirements:any = node.componentInstance.requirements;
223 let fromNodeId:string = node.componentInstance.uniqueId;
224 _.forEach(requirements, (requirementValue:Array<any>, requirementKey)=> {
225 _.forEach(requirementValue, (requirement)=> {
226 if (requirement.name !== "dependency" && MatchCapabilitiesRequirementsUtils.isMatch(requirement, capability)
227 && !MatchCapabilitiesRequirementsUtils.requirementFulfilled(fromNodeId, requirement, links)) {
240 let requirements:any = component.requirements;
241 let fromNodeId:string = component.uniqueId;
242 let linkCapability:Array<Capability> = vl ? vl.capabilities.findValueByKey('linkable') : undefined;
244 _.forEach(requirements, (requirementValue:Array<any>, requirementKey)=> {
245 _.forEach(requirementValue, (requirement)=> {
246 if (requirement.name !== "dependency" && !MatchCapabilitiesRequirementsUtils.requirementFulfilled(fromNodeId, requirement, links)) {
247 _.forEach(nodeDataArray, (node:any)=> {
248 if (node && node.componentInstance && node.category !== 'groupCp') {
249 let capabilities:any = node.componentInstance.capabilities;
250 _.forEach(capabilities, (capabilityValue:Array<any>, capabilityKey)=> {
251 _.forEach(capabilityValue, (capability)=> {
252 if (MatchCapabilitiesRequirementsUtils.isMatch(requirement, capability)) {
257 if (linkCapability) {
258 let linkRequirements = node.componentInstance.requirements;
259 _.forEach(linkRequirements, (value:Array<any>, key)=> {
260 _.forEach(value, (linkRequirement)=> {
261 if (!MatchCapabilitiesRequirementsUtils.requirementFulfilled(node.componentInstance.uniqueId, linkRequirement, links)
262 && MatchCapabilitiesRequirementsUtils.linkable(requirement, linkRequirement, linkCapability[0])) {
279 MatchCapabilitiesRequirementsUtils.$inject = [];