aboutsummaryrefslogtreecommitdiffstats
path: root/catalog-ui/src/app/directives/graphs-v2/composition-graph/utils
diff options
context:
space:
mode:
authorTal Gitelman <tg851x@intl.att.com>2017-12-10 18:55:03 +0200
committerTal Gitelman <tg851x@intl.att.com>2017-12-10 19:33:38 +0200
commit51d50f0ef642e0f996a1c8b8d2ef4838bdfec892 (patch)
tree3ac236a864d74d19b0f5c9020891a7a7e5c31b44 /catalog-ui/src/app/directives/graphs-v2/composition-graph/utils
parentb5cc2e0695f195716d6ccdc65e73807a6632ec70 (diff)
Final commit to master merge from
Change-Id: Ib464f9a8828437c86fe6def8af238aaf83473507 Issue-ID: SDC-714 Signed-off-by: Tal Gitelman <tg851x@intl.att.com>
Diffstat (limited to 'catalog-ui/src/app/directives/graphs-v2/composition-graph/utils')
-rw-r--r--catalog-ui/src/app/directives/graphs-v2/composition-graph/utils/composition-graph-general-utils.ts14
-rw-r--r--catalog-ui/src/app/directives/graphs-v2/composition-graph/utils/composition-graph-links-utils.ts47
-rw-r--r--catalog-ui/src/app/directives/graphs-v2/composition-graph/utils/match-capability-requierment-utils.ts238
3 files changed, 104 insertions, 195 deletions
diff --git a/catalog-ui/src/app/directives/graphs-v2/composition-graph/utils/composition-graph-general-utils.ts b/catalog-ui/src/app/directives/graphs-v2/composition-graph/utils/composition-graph-general-utils.ts
index 0ea38af825..da7d48e6ae 100644
--- a/catalog-ui/src/app/directives/graphs-v2/composition-graph/utils/composition-graph-general-utils.ts
+++ b/catalog-ui/src/app/directives/graphs-v2/composition-graph/utils/composition-graph-general-utils.ts
@@ -18,7 +18,7 @@
* ============LICENSE_END=========================================================
*/
-import {ComponentInstance, Component, MatchReqToCapability, MatchBase, CompositionCiLinkBase, CompositionCiNodeUcpeCp} from "app/models";
+import {ComponentInstance, Component, Match, CompositionCiLinkBase, CompositionCiNodeUcpeCp} from "app/models";
import {QueueUtils, Dictionary, GraphUIObjects} from "app/utils";
import {LoaderService} from "app/services";
import {MatchCapabilitiesRequirementsUtils} from "./match-capability-requierment-utils";
@@ -106,16 +106,16 @@ export class CompositionGraphGeneralUtils {
* @param cy - Cytoscape instance
* @param fromUcpeInstance
* @param toComponentInstance
- * @returns {MatchReqToCapability}
+ * @returns {Match}
*/
- public canBeHostedOn(cy:Cy.Instance, fromUcpeInstance:ComponentInstance, toComponentInstance:ComponentInstance):MatchReqToCapability {
+ public canBeHostedOn(cy:Cy.Instance, fromUcpeInstance:ComponentInstance, toComponentInstance:ComponentInstance):Match {
- let matches:Array<MatchBase> = this.matchCapabilitiesRequirementsUtils.getMatchedRequirementsCapabilities(fromUcpeInstance, toComponentInstance, this.getAllCompositionCiLinks(cy));
- let hostedOnMatch:MatchBase = _.find(matches, (match:MatchReqToCapability) => {
+ let matches:Array<Match> = this.matchCapabilitiesRequirementsUtils.getMatchedRequirementsCapabilities(fromUcpeInstance, toComponentInstance, this.getAllCompositionCiLinks(cy));
+ let hostedOnMatch:Match = _.find(matches, (match:Match) => {
return match.requirement.capability.toLowerCase() === 'tosca.capabilities.container';
});
- return <MatchReqToCapability>hostedOnMatch;
+ return hostedOnMatch;
};
@@ -128,7 +128,7 @@ export class CompositionGraphGeneralUtils {
*/
private isValidDropInsideUCPE(cy:Cy.Instance, nodeToInsert:ComponentInstance, ucpeNode:ComponentInstance):boolean {
- let hostedOnMatch:MatchReqToCapability = this.canBeHostedOn(cy, ucpeNode, nodeToInsert);
+ let hostedOnMatch:Match = this.canBeHostedOn(cy, ucpeNode, nodeToInsert);
let result:boolean = !angular.isUndefined(hostedOnMatch) || nodeToInsert.isVl(); //group validation
return result;
diff --git a/catalog-ui/src/app/directives/graphs-v2/composition-graph/utils/composition-graph-links-utils.ts b/catalog-ui/src/app/directives/graphs-v2/composition-graph/utils/composition-graph-links-utils.ts
index 05f99ae9ea..89c5e14602 100644
--- a/catalog-ui/src/app/directives/graphs-v2/composition-graph/utils/composition-graph-links-utils.ts
+++ b/catalog-ui/src/app/directives/graphs-v2/composition-graph/utils/composition-graph-links-utils.ts
@@ -21,25 +21,17 @@
/**
* Created by obarda on 6/28/2016.
*/
-import {GraphUIObjects, ComponentInstanceFactory, ResourceType} from "app/utils";
-import {LeftPaletteLoaderService, LoaderService} from "app/services";
+import {GraphUIObjects} from "app/utils";
+import {LoaderService} from "app/services";
import {
NodeUcpe,
CompositionCiNodeVf,
- MatchReqToCapability,
- MatchBase,
- MatchReqToReq,
- ComponentInstance,
+ Match,
CompositionCiNodeBase,
RelationshipModel,
- RelationMenuDirectiveObj,
- CapabilitiesGroup,
+ ConnectRelationModel,
LinksFactory,
- NodesFactory,
- RequirementsGroup,
Component,
- Relationship,
- Capability,
LinkMenu,
Point,
CompositionCiLinkBase
@@ -105,16 +97,16 @@ export class CompositionGraphLinkUtils {
);
};
- private createSimpleLink = (match:MatchReqToCapability, cy:Cy.Instance, component:Component):void => {
+ private createSimpleLink = (match:Match, cy:Cy.Instance, component:Component):void => {
let newRelation:RelationshipModel = match.matchToRelationModel();
let linkObg:CompositionCiLinkBase = this.linksFactory.createGraphLink(cy, newRelation, newRelation.relationships[0]);
this.createLink(linkObg, cy, component);
};
- public createLinkFromMenu = (cy:Cy.Instance, chosenMatch:MatchBase, component:Component):void => {
+ public createLinkFromMenu = (cy:Cy.Instance, chosenMatch:Match, component:Component):void => {
if (chosenMatch) {
- if (chosenMatch && chosenMatch instanceof MatchReqToCapability) {
+ if (chosenMatch && chosenMatch instanceof Match) {
this.createSimpleLink(chosenMatch, cy, component);
}
}
@@ -128,18 +120,18 @@ export class CompositionGraphLinkUtils {
* @param matchesArray
* @returns {Array<MatchBase>}
*/
- public filterUcpeLinks(fromNode:CompositionCiNodeBase, toNode:CompositionCiNodeBase, matchesArray:Array<MatchBase>):any {
+ public filterUcpeLinks(fromNode:CompositionCiNodeBase, toNode:CompositionCiNodeBase, matchesArray:Array<Match>):any {
- let matchLink:Array<MatchBase>;
+ let matchLink:Array<Match>;
if (fromNode.isUcpePart) {
- matchLink = _.filter(matchesArray, (match:MatchBase) => {
+ matchLink = _.filter(matchesArray, (match:Match) => {
return match.isOwner(fromNode.id);
});
}
if (toNode.isUcpePart) {
- matchLink = _.filter(matchesArray, (match:MatchBase) => {
+ matchLink = _.filter(matchesArray, (match:Match) => {
return match.isOwner(toNode.id);
});
}
@@ -154,14 +146,14 @@ export class CompositionGraphLinkUtils {
* @param toNode
* @returns {any}
*/
- public onLinkDrawn(cy:Cy.Instance, fromNode:Cy.CollectionFirstNode, toNode:Cy.CollectionFirstNode):RelationMenuDirectiveObj {
+ public onLinkDrawn(cy:Cy.Instance, fromNode:Cy.CollectionFirstNode, toNode:Cy.CollectionFirstNode):ConnectRelationModel {
if (!this.commonGraphUtils.nodeLocationsCompatible(cy, fromNode, toNode)) {
return null;
}
let linkModel:Array<CompositionCiLinkBase> = this.generalGraphUtils.getAllCompositionCiLinks(cy);
- let possibleRelations:Array<MatchBase> = this.matchCapabilitiesRequirementsUtils.getMatchedRequirementsCapabilities(fromNode.data().componentInstance,
+ let possibleRelations:Array<Match> = this.matchCapabilitiesRequirementsUtils.getMatchedRequirementsCapabilities(fromNode.data().componentInstance,
toNode.data().componentInstance, linkModel);
//filter relations found to limit to specific ucpe-cp
@@ -169,8 +161,8 @@ export class CompositionGraphLinkUtils {
//if found possibleRelations between the nodes we create relation menu directive and open the link menu
if (possibleRelations.length) {
- let menuPosition = this.generalGraphUtils.getLinkMenuPosition(cy, toNode.renderedPoint());
- return new RelationMenuDirectiveObj(fromNode.data(), toNode.data(), menuPosition, possibleRelations);
+ // let menuPosition = this.generalGraphUtils.getLinkMenuPosition(cy, toNode.renderedPoint());
+ return new ConnectRelationModel(fromNode.data(), toNode.data(), possibleRelations);
}
return null;
};
@@ -209,7 +201,7 @@ export class CompositionGraphLinkUtils {
* @param vfNode
*/
public createVfToUcpeLink = (component:Component, cy:Cy.Instance, ucpeNode:NodeUcpe, vfNode:CompositionCiNodeVf):void => {
- let hostedOnMatch:MatchReqToCapability = this.generalGraphUtils.canBeHostedOn(cy, ucpeNode.componentInstance, vfNode.componentInstance);
+ let hostedOnMatch:Match = this.generalGraphUtils.canBeHostedOn(cy, ucpeNode.componentInstance, vfNode.componentInstance);
/* create relation */
let newRelation = new RelationshipModel();
newRelation.fromNode = ucpeNode.id;
@@ -224,13 +216,12 @@ export class CompositionGraphLinkUtils {
/**
* Handles click event on links.
* If one edge selected: do nothing.
- /*Two edges selected - always select all
- /* Three or more edges: first click - select all, secondary click - select single.
+ * Two or more edges: first click - select all, secondary click - select single.
* @param cy
* @param event
*/
public handleLinkClick(cy:Cy.Instance, event:Cy.EventObject) {
- if (cy.$('edge:selected').length > 2 && event.cyTarget[0].selected()) {
+ if (cy.$('edge:selected').length > 1 && event.cyTarget[0].selected()) {
cy.$(':selected').unselect();
} else {
@@ -256,7 +247,7 @@ export class CompositionGraphLinkUtils {
* @returns {Point}
*/
public calculateLinkMenuPosition(event, elementWidth, elementHeight):Point {
- let point:Point = new Point(event.originalEvent.x, event.originalEvent.y);
+ let point:Point = new Point(event.originalEvent.clientX, event.originalEvent.clientY);
if (event.originalEvent.view.screen.height - elementHeight < point.y) {
point.y = event.originalEvent.view.screen.height - elementHeight;
}
diff --git a/catalog-ui/src/app/directives/graphs-v2/composition-graph/utils/match-capability-requierment-utils.ts b/catalog-ui/src/app/directives/graphs-v2/composition-graph/utils/match-capability-requierment-utils.ts
index 5f717512f5..6a02381902 100644
--- a/catalog-ui/src/app/directives/graphs-v2/composition-graph/utils/match-capability-requierment-utils.ts
+++ b/catalog-ui/src/app/directives/graphs-v2/composition-graph/utils/match-capability-requierment-utils.ts
@@ -18,22 +18,17 @@
* ============LICENSE_END=========================================================
*/
-import {Requirement, CompositionCiLinkBase, ComponentInstance, CapabilitiesGroup, RequirementsGroup, MatchReqToCapability, MatchBase,
- MatchReqToReq,CompositionCiNodeBase, Component, Capability} from "app/models";
+import {
+ Requirement, CompositionCiLinkBase, CapabilitiesGroup, RequirementsGroup, Match,
+ CompositionCiNodeBase, Component, Capability
+} from "app/models";
+import {ComponentInstance} from "../../../../models/componentsInstances/componentInstance";
/**
* Created by obarda on 1/1/2017.
*/
export class MatchCapabilitiesRequirementsUtils {
- constructor() {
- }
-
- public static linkable(requirement1:Requirement, requirement2:Requirement, vlCapability:Capability):boolean {
- return MatchCapabilitiesRequirementsUtils.isMatch(requirement1, vlCapability) && MatchCapabilitiesRequirementsUtils.isMatch(requirement2, vlCapability);
- };
-
-
/**
* Shows + icon in corner of each node passed in
* @param filteredNodesData
@@ -77,9 +72,7 @@ export class MatchCapabilitiesRequirementsUtils {
})
}
- // -------------------------------------------ALL FUNCTIONS NEED REFACTORING---------------------------------------------------------------//
-
- private static requirementFulfilled(fromNodeId:string, requirement:any, links:Array<CompositionCiLinkBase>):boolean {
+ private static isRequirementFulfilled(fromNodeId:string, requirement:any, links:Array<CompositionCiLinkBase>):boolean {
return _.some(links, {
'relation': {
'fromNode': fromNodeId,
@@ -108,172 +101,97 @@ export class MatchCapabilitiesRequirementsUtils {
return false;
};
- private getFromToMatches(requirements1:RequirementsGroup,
- requirements2:RequirementsGroup,
- capabilities:CapabilitiesGroup,
- links:Array<CompositionCiLinkBase>,
- fromId:string,
- toId:string,
- vlCapability?:Capability):Array<MatchBase> {
- let matches:Array<MatchBase> = new Array<MatchBase>();
- _.forEach(requirements1, (requirementValue:Array<Requirement>, key) => {
- _.forEach(requirementValue, (requirement:Requirement) => {
- if (requirement.name !== "dependency" && !MatchCapabilitiesRequirementsUtils.requirementFulfilled(fromId, requirement, links)) {
- _.forEach(capabilities, (capabilityValue:Array<Capability>, key) => {
- _.forEach(capabilityValue, (capability:Capability) => {
- if (MatchCapabilitiesRequirementsUtils.isMatch(requirement, capability)) {
- let match:MatchReqToCapability = new MatchReqToCapability(requirement, capability, true, fromId, toId);
- matches.push(match);
- }
- });
- });
- if (vlCapability) {
- _.forEach(requirements2, (requirement2Value:Array<Requirement>, key) => {
- _.forEach(requirement2Value, (requirement2:Requirement) => {
- if (!MatchCapabilitiesRequirementsUtils.requirementFulfilled(toId, requirement2, links) && MatchCapabilitiesRequirementsUtils.linkable(requirement, requirement2, vlCapability)) {
- let match:MatchReqToReq = new MatchReqToReq(requirement, requirement2, true, fromId, toId);
- matches.push(match);
- }
- });
- });
- }
- }
- });
- });
- return matches;
- }
-
- private getToFromMatches(requirements:RequirementsGroup, capabilities:CapabilitiesGroup, links:Array<CompositionCiLinkBase>, fromId:string, toId:string):Array<MatchReqToCapability> {
- let matches:Array<MatchReqToCapability> = [];
- _.forEach(requirements, (requirementValue:Array<Requirement>, key) => {
- _.forEach(requirementValue, (requirement:Requirement) => {
- if (requirement.name !== "dependency" && !MatchCapabilitiesRequirementsUtils.requirementFulfilled(toId, requirement, links)) {
- _.forEach(capabilities, (capabilityValue:Array<Capability>, key) => {
- _.forEach(capabilityValue, (capability:Capability) => {
- if (MatchCapabilitiesRequirementsUtils.isMatch(requirement, capability)) {
- let match:MatchReqToCapability = new MatchReqToCapability(requirement, capability, false, toId, fromId);
- matches.push(match);
- }
- });
- });
- }
- });
- });
- return matches;
- }
-
public getMatchedRequirementsCapabilities(fromComponentInstance:ComponentInstance,
toComponentInstance:ComponentInstance,
- links:Array<CompositionCiLinkBase>,
- vl?:Component):Array<MatchBase> {//TODO allow for VL array
- let linkCapability;
- if (vl) {
- let linkCapabilities:Array<Capability> = vl.capabilities.findValueByKey('linkable');
- if (linkCapabilities) {
- linkCapability = linkCapabilities[0];
- }
- }
- let fromToMatches:Array<MatchBase> = this.getFromToMatches(fromComponentInstance.requirements,
- toComponentInstance.requirements,
+ links:Array<CompositionCiLinkBase>):Array<Match> {
+ let fromToMatches:Array<Match> = this.getMatches(fromComponentInstance.requirements,
toComponentInstance.capabilities,
links,
fromComponentInstance.uniqueId,
- toComponentInstance.uniqueId,
- linkCapability);
- let toFromMatches:Array<MatchReqToCapability> = this.getToFromMatches(toComponentInstance.requirements,
+ toComponentInstance.uniqueId, true);
+ let toFromMatches:Array<Match> = this.getMatches(toComponentInstance.requirements,
fromComponentInstance.capabilities,
links,
fromComponentInstance.uniqueId,
- toComponentInstance.uniqueId);
+ toComponentInstance.uniqueId, false);
return fromToMatches.concat(toFromMatches);
}
+ /***** REFACTORED FUNCTIONS START HERE *****/
+
+ public getMatches(requirements:RequirementsGroup, capabilities:CapabilitiesGroup, links:Array<CompositionCiLinkBase>,
+ fromId:string, toId:string, isFromTo: boolean):Array<Match> {
+ let matches:Array<Match> = [];
+ let unfulfilledReqs = this.getUnfulfilledRequirements(fromId, requirements, links);
+ _.forEach(unfulfilledReqs, (req)=> {
+ _.forEach(_.flatten(_.values(capabilities)), (capability:Capability)=> {
+ if (MatchCapabilitiesRequirementsUtils.isMatch(req, capability)) {
+ if(isFromTo) {
+ matches.push(new Match(req, capability, isFromTo, fromId, toId));
+ } else{
+ matches.push(new Match(req, capability, isFromTo, toId, fromId));
+ }
+ }
+ });
+ });
+ return matches;
+ }
+
+ public getUnfulfilledRequirements = (fromNodeId:string, requirements:RequirementsGroup, links:Array<CompositionCiLinkBase>):Array<Requirement>=> {
+
+ let requirementArray:Array<Requirement> = [];
+ _.forEach(_.flatten(_.values(requirements)), (requirement:Requirement)=> {
+ if (requirement.name !== "dependency" && !MatchCapabilitiesRequirementsUtils.isRequirementFulfilled(fromNodeId, requirement, links)) {
+ requirementArray.push(requirement);
+ }
+ });
+ return requirementArray;
+ };
+
/**
- * Step I: Check if capabilities of component match requirements of nodeDataArray
- * 1. Get component capabilities and loop on each capability
- * 2. Inside the loop, perform another loop on all nodeDataArray, and fetch the requirements for each one
- * 3. Loop on the requirements, and verify match (see in code the rules)
- *
- * Step II: Check if requirements of component match capabilities of nodeDataArray
- * 1. Get component requirements and loop on each requirement
- * 2.
- *
- * @param component - this is the hovered resource of the left panel of composition screen
- * @param nodeDataArray - Array of resource instances that are on the canvas
- * @param links -getMatchedRequirementsCapabilities
- * @param vl -
- * @returns {any[]|T[]}
+ * Returns true if there is a match between the capabilities and requirements that are passed in
+ * @param requirements
+ * @param capabilities
+ * @returns {boolean}
*/
- public findByMatchingCapabilitiesToRequirements(component:Component,
- nodeDataArray:Array<CompositionCiNodeBase>,
- links:Array<CompositionCiLinkBase>,
- vl?:Component):Array<any> {//TODO allow for VL array
- let res = [];
-
- // STEP I
- {
- let capabilities:any = component.capabilities;
- _.forEach(capabilities, (capabilityValue:Array<any>, capabilityKey)=> {
- _.forEach(capabilityValue, (capability)=> {
- _.forEach(nodeDataArray, (node:CompositionCiNodeBase)=> {
- if (node && node.componentInstance) {
- let requirements:any = node.componentInstance.requirements;
- let fromNodeId:string = node.componentInstance.uniqueId;
- _.forEach(requirements, (requirementValue:Array<any>, requirementKey)=> {
- _.forEach(requirementValue, (requirement)=> {
- if (requirement.name !== "dependency" && MatchCapabilitiesRequirementsUtils.isMatch(requirement, capability)
- && !MatchCapabilitiesRequirementsUtils.requirementFulfilled(fromNodeId, requirement, links)) {
- res.push(node);
- }
- });
- });
- }
- });
- });
+ public containsMatch = (requirements:Array<Requirement>, capabilities:CapabilitiesGroup):boolean => {
+ return _.some(requirements, (req:Requirement)=> {
+ return _.some(_.flatten(_.values(capabilities)), (capability:Capability) => {
+ return MatchCapabilitiesRequirementsUtils.isMatch(req, capability);
});
- }
+ });
+ };
- // STEP II
- {
- let requirements:any = component.requirements;
- let fromNodeId:string = component.uniqueId;
- let linkCapability:Array<Capability> = vl ? vl.capabilities.findValueByKey('linkable') : undefined;
+ /**
+ * Returns array of nodes that can connect to the component.
+ * In order to connect, one of the following conditions must be met:
+ * 1. component has an unfulfilled requirement that matches a node's capabilities
+ * 2. node has an unfulfilled requirement that matches the component's capabilities
+ * 3. vl is passed in which has the capability to fulfill requirement from component and requirement on node.
+ */
+ public findMatchingNodes(component:Component, nodeDataArray:Array<CompositionCiNodeBase>,
+ links:Array<CompositionCiLinkBase>):Array<any> //TODO allow for VL array and TEST
+ {
+ let componentRequirements:Array<Requirement> = this.getUnfulfilledRequirements(component.uniqueId, component.requirements, links);
+ return _.filter(nodeDataArray, (node:any)=> {
+ if (node && node.componentInstance) {
+
+ //Check if component has an unfulfilled requirement that can be met by one of nodes's capabilities (#1)
+ if (componentRequirements.length && node.category !== 'groupCp' && this.containsMatch(componentRequirements, node.componentInstance.capabilities)) {
+ return true;
- _.forEach(requirements, (requirementValue:Array<any>, requirementKey)=> {
- _.forEach(requirementValue, (requirement)=> {
- if (requirement.name !== "dependency" && !MatchCapabilitiesRequirementsUtils.requirementFulfilled(fromNodeId, requirement, links)) {
- _.forEach(nodeDataArray, (node:any)=> {
- if (node && node.componentInstance && node.category !== 'groupCp') {
- let capabilities:any = node.componentInstance.capabilities;
- _.forEach(capabilities, (capabilityValue:Array<any>, capabilityKey)=> {
- _.forEach(capabilityValue, (capability)=> {
- if (MatchCapabilitiesRequirementsUtils.isMatch(requirement, capability)) {
- res.push(node);
- }
- });
- });
- if (linkCapability) {
- let linkRequirements = node.componentInstance.requirements;
- _.forEach(linkRequirements, (value:Array<any>, key)=> {
- _.forEach(value, (linkRequirement)=> {
- if (!MatchCapabilitiesRequirementsUtils.requirementFulfilled(node.componentInstance.uniqueId, linkRequirement, links)
- && MatchCapabilitiesRequirementsUtils.linkable(requirement, linkRequirement, linkCapability[0])) {
- res.push(node);
- }
- });
- });
- }
- }
- });
+ } else { //Check if node has unfulfilled requirement that can be filled by component (#2)
+ let nodeRequirements:Array<Requirement> = this.getUnfulfilledRequirements(node.componentInstance.uniqueId, node.componentInstance.requirements, links);
+ if (!nodeRequirements.length) return false;
+ if (this.containsMatch(nodeRequirements, component.capabilities)) {
+ return true;
}
- });
- });
- }
-
- return _.uniq(res);
- };
+ }
+ }
+ });
+ }
}
MatchCapabilitiesRequirementsUtils.$inject = [];