1 import {Requirement, CompositionCiLinkBase, ComponentInstance, CapabilitiesGroup, RequirementsGroup, MatchReqToCapability, MatchBase,
2 MatchReqToReq,CompositionCiNodeBase, Component, Capability} from "app/models";
4 * Created by obarda on 1/1/2017.
7 export class MatchCapabilitiesRequirementsUtils {
12 public static linkable(requirement1:Requirement, requirement2:Requirement, vlCapability:Capability):boolean {
13 return MatchCapabilitiesRequirementsUtils.isMatch(requirement1, vlCapability) && MatchCapabilitiesRequirementsUtils.isMatch(requirement2, vlCapability);
18 * Shows + icon in corner of each node passed in
19 * @param filteredNodesData
22 public highlightMatchingComponents(filteredNodesData, cy:Cy.Instance) {
23 _.each(filteredNodesData, (data:any) => {
24 let node = cy.getElementById(data.id);
25 cy.emit('showhandle', [node]);
30 * Adds opacity to each node that cannot be linked to hovered node
31 * @param filteredNodesData
34 * @param hoveredNodeData
36 public fadeNonMachingComponents(filteredNodesData, nodesData, cy:Cy.Instance, hoveredNodeData?) {
37 let fadeNodes = _.xorWith(nodesData, filteredNodesData, (node1, node2) => {
38 return node1.id === node2.id;
40 if (hoveredNodeData) {
41 _.remove(fadeNodes, hoveredNodeData);
44 _.each(fadeNodes, (node) => {
45 cy.getElementById(node.id).style({'background-image-opacity': 0.4});
51 * Resets all nodes to regular opacity
54 public resetFadedNodes(cy:Cy.Instance) {
56 cy.nodes().style({'background-image-opacity': 1});
60 // -------------------------------------------ALL FUNCTIONS NEED REFACTORING---------------------------------------------------------------//
62 private static requirementFulfilled(fromNodeId:string, requirement:any, links:Array<CompositionCiLinkBase>):boolean {
63 return _.some(links, {
65 'fromNode': fromNodeId,
67 'requirementOwnerId': requirement.ownerId,
68 'requirement': requirement.name,
70 'type': requirement.relationship
78 private static isMatch(requirement:Requirement, capability:Capability):boolean {
79 if (capability.type === requirement.capability) {
80 if (requirement.node) {
81 if (_.includes(capability.capabilitySources, requirement.node)) {
91 private getFromToMatches(requirements1:RequirementsGroup,
92 requirements2:RequirementsGroup,
93 capabilities:CapabilitiesGroup,
94 links:Array<CompositionCiLinkBase>,
97 vlCapability?:Capability):Array<MatchBase> {
98 let matches:Array<MatchBase> = new Array<MatchBase>();
99 _.forEach(requirements1, (requirementValue:Array<Requirement>, key) => {
100 _.forEach(requirementValue, (requirement:Requirement) => {
101 if (requirement.name !== "dependency" && !MatchCapabilitiesRequirementsUtils.requirementFulfilled(fromId, requirement, links)) {
102 _.forEach(capabilities, (capabilityValue:Array<Capability>, key) => {
103 _.forEach(capabilityValue, (capability:Capability) => {
104 if (MatchCapabilitiesRequirementsUtils.isMatch(requirement, capability)) {
105 let match:MatchReqToCapability = new MatchReqToCapability(requirement, capability, true, fromId, toId);
111 _.forEach(requirements2, (requirement2Value:Array<Requirement>, key) => {
112 _.forEach(requirement2Value, (requirement2:Requirement) => {
113 if (!MatchCapabilitiesRequirementsUtils.requirementFulfilled(toId, requirement2, links) && MatchCapabilitiesRequirementsUtils.linkable(requirement, requirement2, vlCapability)) {
114 let match:MatchReqToReq = new MatchReqToReq(requirement, requirement2, true, fromId, toId);
126 private getToFromMatches(requirements:RequirementsGroup, capabilities:CapabilitiesGroup, links:Array<CompositionCiLinkBase>, fromId:string, toId:string):Array<MatchReqToCapability> {
127 let matches:Array<MatchReqToCapability> = [];
128 _.forEach(requirements, (requirementValue:Array<Requirement>, key) => {
129 _.forEach(requirementValue, (requirement:Requirement) => {
130 if (requirement.name !== "dependency" && !MatchCapabilitiesRequirementsUtils.requirementFulfilled(toId, requirement, links)) {
131 _.forEach(capabilities, (capabilityValue:Array<Capability>, key) => {
132 _.forEach(capabilityValue, (capability:Capability) => {
133 if (MatchCapabilitiesRequirementsUtils.isMatch(requirement, capability)) {
134 let match:MatchReqToCapability = new MatchReqToCapability(requirement, capability, false, toId, fromId);
145 public getMatchedRequirementsCapabilities(fromComponentInstance:ComponentInstance,
146 toComponentInstance:ComponentInstance,
147 links:Array<CompositionCiLinkBase>,
148 vl?:Component):Array<MatchBase> {//TODO allow for VL array
151 let linkCapabilities:Array<Capability> = vl.capabilities.findValueByKey('linkable');
152 if (linkCapabilities) {
153 linkCapability = linkCapabilities[0];
156 let fromToMatches:Array<MatchBase> = this.getFromToMatches(fromComponentInstance.requirements,
157 toComponentInstance.requirements,
158 toComponentInstance.capabilities,
160 fromComponentInstance.uniqueId,
161 toComponentInstance.uniqueId,
163 let toFromMatches:Array<MatchReqToCapability> = this.getToFromMatches(toComponentInstance.requirements,
164 fromComponentInstance.capabilities,
166 fromComponentInstance.uniqueId,
167 toComponentInstance.uniqueId);
169 return fromToMatches.concat(toFromMatches);
174 * Step I: Check if capabilities of component match requirements of nodeDataArray
175 * 1. Get component capabilities and loop on each capability
176 * 2. Inside the loop, perform another loop on all nodeDataArray, and fetch the requirements for each one
177 * 3. Loop on the requirements, and verify match (see in code the rules)
179 * Step II: Check if requirements of component match capabilities of nodeDataArray
180 * 1. Get component requirements and loop on each requirement
183 * @param component - this is the hovered resource of the left panel of composition screen
184 * @param nodeDataArray - Array of resource instances that are on the canvas
185 * @param links -getMatchedRequirementsCapabilities
187 * @returns {any[]|T[]}
189 public findByMatchingCapabilitiesToRequirements(component:Component,
190 nodeDataArray:Array<CompositionCiNodeBase>,
191 links:Array<CompositionCiLinkBase>,
192 vl?:Component):Array<any> {//TODO allow for VL array
197 let capabilities:any = component.capabilities;
198 _.forEach(capabilities, (capabilityValue:Array<any>, capabilityKey)=> {
199 _.forEach(capabilityValue, (capability)=> {
200 _.forEach(nodeDataArray, (node:CompositionCiNodeBase)=> {
201 if (node && node.componentInstance) {
202 let requirements:any = node.componentInstance.requirements;
203 let fromNodeId:string = node.componentInstance.uniqueId;
204 _.forEach(requirements, (requirementValue:Array<any>, requirementKey)=> {
205 _.forEach(requirementValue, (requirement)=> {
206 if (requirement.name !== "dependency" && MatchCapabilitiesRequirementsUtils.isMatch(requirement, capability)
207 && !MatchCapabilitiesRequirementsUtils.requirementFulfilled(fromNodeId, requirement, links)) {
220 let requirements:any = component.requirements;
221 let fromNodeId:string = component.uniqueId;
222 let linkCapability:Array<Capability> = vl ? vl.capabilities.findValueByKey('linkable') : undefined;
224 _.forEach(requirements, (requirementValue:Array<any>, requirementKey)=> {
225 _.forEach(requirementValue, (requirement)=> {
226 if (requirement.name !== "dependency" && !MatchCapabilitiesRequirementsUtils.requirementFulfilled(fromNodeId, requirement, links)) {
227 _.forEach(nodeDataArray, (node:any)=> {
228 if (node && node.componentInstance && node.category !== 'groupCp') {
229 let capabilities:any = node.componentInstance.capabilities;
230 _.forEach(capabilities, (capabilityValue:Array<any>, capabilityKey)=> {
231 _.forEach(capabilityValue, (capability)=> {
232 if (MatchCapabilitiesRequirementsUtils.isMatch(requirement, capability)) {
237 if (linkCapability) {
238 let linkRequirements = node.componentInstance.requirements;
239 _.forEach(linkRequirements, (value:Array<any>, key)=> {
240 _.forEach(value, (linkRequirement)=> {
241 if (!MatchCapabilitiesRequirementsUtils.requirementFulfilled(node.componentInstance.uniqueId, linkRequirement, links)
242 && MatchCapabilitiesRequirementsUtils.linkable(requirement, linkRequirement, linkCapability[0])) {
259 MatchCapabilitiesRequirementsUtils.$inject = [];