aboutsummaryrefslogtreecommitdiffstats
path: root/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/CompositionBusinessLogic.java
diff options
context:
space:
mode:
Diffstat (limited to 'catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/CompositionBusinessLogic.java')
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/CompositionBusinessLogic.java489
1 files changed, 244 insertions, 245 deletions
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/CompositionBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/CompositionBusinessLogic.java
index f6a108cf75..90f807475f 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/CompositionBusinessLogic.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/CompositionBusinessLogic.java
@@ -20,15 +20,7 @@
package org.openecomp.sdc.be.components.impl;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Optional;
-import java.util.Set;
-import java.util.stream.Collectors;
-
+import fj.data.Either;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
import org.openecomp.sdc.be.datatypes.enums.OriginTypeEnum;
@@ -39,7 +31,14 @@ import org.openecomp.sdc.exception.ResponseFormat;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
-import fj.data.Either;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
/**
* This class holds the logic of arranging resource instance on the canvas for imported VF
@@ -49,240 +48,240 @@ import fj.data.Either;
*/
@Component("compositionBusinessLogic")
public class CompositionBusinessLogic {
- @Autowired
- private VFComponentInstanceBusinessLogic vfComponentInstanceBusinessLogic;
-
- private static final int VFC_CANVAS_ELEMENT_SIZE = 50;
- private static final int CP_CANVAS_ELEMENT_SIZE = 21;
- private static final int CANVAS_WIDTH = 1000;
- private static final int CANVAS_HEIGHT = 700;
- private static final int SPACE_BETWEEN_ELEMENTS = VFC_CANVAS_ELEMENT_SIZE * 4;
- private static final double CP_RADIUS_FACTOR = 0.4;
-
- enum RelativePosition {
- LEFT, RIGHT, UP, DOWN
- };
-
- protected Either<List<ComponentInstance>, ResponseFormat> setPositionsForComponentInstances(Resource resource, String userId) {
- Either<List<ComponentInstance>, ResponseFormat> result = Either.left(resource.getComponentInstances());
-
- boolean isNotAllPositionsCalculated = resource.getComponentInstances() == null
- || resource.getComponentInstances().stream().filter(p -> (p.getPosX() == null || p.getPosX().isEmpty()) || (p.getPosY() == null || p.getPosY().isEmpty())).findAny().isPresent();
-
- if (isNotAllPositionsCalculated && resource.getComponentInstances() != null) {
- // Arrange Icons In Spiral Pattern
- Map<ImmutablePair<Double, Double>, ComponentInstance> componentInstanceLocations = buildSpiralPatternPositioningForComponentInstances(resource);
-
- // Set Relative Locations According to Canvas Size
- componentInstanceLocations.entrySet().stream().forEach(e -> setRelativePosition(e));
-
- // Update in DB
- result = vfComponentInstanceBusinessLogic.updateComponentInstance(ComponentTypeEnum.RESOURCE_PARAM_NAME, resource.getUniqueId(), userId, resource.getComponentInstances(), false, false);
-
- }
- return result;
-
- }
-
- private void setRelativePosition(Entry<ImmutablePair<Double, Double>, ComponentInstance> entry) {
- int xCenter = CANVAS_WIDTH / 2;
- int yCenter = CANVAS_HEIGHT / 2;
-
- ImmutablePair<Double, Double> matrixPosition = entry.getKey();
- ComponentInstance componentInstance = entry.getValue();
- componentInstance.setPosX(calculateCompositionPosition(xCenter, matrixPosition.getLeft(), componentInstance));
- componentInstance.setPosY(calculateCompositionPosition(yCenter, matrixPosition.getRight(), componentInstance));
- }
-
- private String calculateCompositionPosition(int center, double relativePosition, ComponentInstance componentInstance) {
- final double topLeftCanvasPosition = center + relativePosition * CompositionBusinessLogic.SPACE_BETWEEN_ELEMENTS;
- double offsetedCanvasPosition;
- switch (componentInstance.getOriginType()) {
- case CP:
- offsetedCanvasPosition = topLeftCanvasPosition - CompositionBusinessLogic.CP_CANVAS_ELEMENT_SIZE / 2;
- break;
- case VL:
- offsetedCanvasPosition = topLeftCanvasPosition - CompositionBusinessLogic.CP_CANVAS_ELEMENT_SIZE / 2;
- break;
- case VF:
- offsetedCanvasPosition = topLeftCanvasPosition - CompositionBusinessLogic.VFC_CANVAS_ELEMENT_SIZE / 2;
- break;
- case VFC:
- offsetedCanvasPosition = topLeftCanvasPosition - CompositionBusinessLogic.VFC_CANVAS_ELEMENT_SIZE / 2;
- break;
- case VFCMT:
- offsetedCanvasPosition = topLeftCanvasPosition - CompositionBusinessLogic.VFC_CANVAS_ELEMENT_SIZE / 2;
- break;
- default:
- offsetedCanvasPosition = topLeftCanvasPosition - CompositionBusinessLogic.VFC_CANVAS_ELEMENT_SIZE / 2;
- break;
- }
- return String.valueOf(offsetedCanvasPosition);
- }
-
- protected Map<ImmutablePair<Double, Double>, ComponentInstance> buildSpiralPatternPositioningForComponentInstances(Resource resource) {
-
- Map<ImmutablePair<Double, Double>, ComponentInstance> componentInstanceLocations = new HashMap<>();
-
- List<ComponentInstance> componentInstances = new ArrayList<>();
- componentInstances.addAll(resource.getComponentInstances());
- Map<ComponentInstance, List<ComponentInstance>> connectededCps = getCpsConnectedToVFC(componentInstances, resource);
- // Remove all cp that are connected from the list
- componentInstances.removeAll(connectededCps.values().stream().flatMap(e -> e.stream()).collect(Collectors.toList()));
-
- buildSpiralPatternForMajorComponents(componentInstanceLocations, componentInstances);
- buildCirclePatternForCps(componentInstanceLocations, connectededCps);
-
- return componentInstanceLocations;
- }
-
- protected void buildCirclePatternForCps(Map<ImmutablePair<Double, Double>, ComponentInstance> componentInstLocations, Map<ComponentInstance, List<ComponentInstance>> connectedCps) {
-
- for (Entry<ComponentInstance, List<ComponentInstance>> vfcCpList : connectedCps.entrySet()) {
- Entry<ImmutablePair<Double, Double>, ComponentInstance> vfcOfTheCps = componentInstLocations.entrySet().stream().filter(p -> p.getValue().getUniqueId().equals(vfcCpList.getKey().getUniqueId())).findAny().get();
- buildCirclePatternForOneGroupOfCps(vfcOfTheCps.getKey(), vfcCpList.getValue(), componentInstLocations);
- }
-
- }
-
- private void buildCirclePatternForOneGroupOfCps(ImmutablePair<Double, Double> vfcLocation, List<ComponentInstance> cpsGroup, Map<ImmutablePair<Double, Double>, ComponentInstance> componentInstLocations) {
- final int numberOfCps = cpsGroup.size();
- double angleBetweenCps = (!cpsGroup.isEmpty()) ? Math.toRadians(360) / numberOfCps : 0;
- double currentAngle = 0;
- Double xCenter = vfcLocation.getLeft();
- Double yCenter = vfcLocation.getRight();
- for (ComponentInstance currCp : cpsGroup) {
- double cpXposition = xCenter + CompositionBusinessLogic.CP_RADIUS_FACTOR * Math.cos(currentAngle);
- double cpYposition = yCenter + CompositionBusinessLogic.CP_RADIUS_FACTOR * Math.sin(currentAngle);
- componentInstLocations.put(new ImmutablePair<Double, Double>(cpXposition, cpYposition), currCp);
- currentAngle += angleBetweenCps;
- }
-
- }
-
- private void buildSpiralPatternForMajorComponents(Map<ImmutablePair<Double, Double>, ComponentInstance> componentInstanceLocations, List<ComponentInstance> componentInstances) {
- int elementsCounter = 0;
- ImmutablePair<Double, Double> currPlacement;
- ImmutablePair<Double, Double> prevPlacement = null;
- RelativePosition relationToPrevElement = null;
- for (ComponentInstance curr : componentInstances) {
- elementsCounter++;
- if (elementsCounter == 1) {
- currPlacement = new ImmutablePair<Double, Double>(0D, 0D);
- } else if (elementsCounter == 2) {
- currPlacement = new ImmutablePair<Double, Double>(-1D, 0D);
- relationToPrevElement = RelativePosition.LEFT;
- } else {
- relationToPrevElement = getRelativePositionForCurrentElement(componentInstanceLocations, relationToPrevElement, prevPlacement);
- currPlacement = getRelativeElementLocation(prevPlacement, relationToPrevElement);
-
- }
-
- componentInstanceLocations.put(currPlacement, curr);
- prevPlacement = currPlacement;
- }
- }
-
- protected Map<ComponentInstance, List<ComponentInstance>> getCpsConnectedToVFC(List<ComponentInstance> allComponentInstances, Resource vf) {
- Map<ComponentInstance, List<ComponentInstance>> vfcWithItsCps = new HashMap<>();
- List<RequirementCapabilityRelDef> allRelations = vf.getComponentInstancesRelations();
- for (ComponentInstance curr : allComponentInstances) {
- // Filters Only CPs
- if (curr.getOriginType() == OriginTypeEnum.CP) {
- // List Of elements the CP is connected to
- List<RequirementCapabilityRelDef> connectedToList = allRelations.stream().filter(p -> p.getFromNode().equals(curr.getUniqueId()) || p.getToNode().equals(curr.getUniqueId())).collect(Collectors.toList());
- // Adds Only CPs Which are connected to VFC
- filterCpConnectedToVFC(allComponentInstances, vfcWithItsCps, curr, connectedToList);
- }
- }
- return vfcWithItsCps;
- }
-
- private void filterCpConnectedToVFC(List<ComponentInstance> allComponentInstances, Map<ComponentInstance, List<ComponentInstance>> vfcWithItsCps, ComponentInstance currCP, List<RequirementCapabilityRelDef> connectedToTheCPList) {
- if (!connectedToTheCPList.isEmpty()) {
- // Set Of Ids Of components Instances which are connected certain CP
- Set<String> mateIds = connectedToTheCPList.stream().map(cpRelation -> cpRelation.getFromNode().equals(currCP.getUniqueId()) ? cpRelation.getToNode() : cpRelation.getFromNode()).collect(Collectors.toSet());
-
- // Vfc Component instance Connected to the CP
- Optional<ComponentInstance> optionalVfcConnectedToCP = allComponentInstances.stream().
- // All instances connected to CP
- filter(p -> mateIds.contains(p.getUniqueId())).
- // Filter in only VFC connected to the CP
- filter(p -> p.getOriginType() == OriginTypeEnum.VFC).findAny();
-
- if (optionalVfcConnectedToCP.isPresent()) {
- final ComponentInstance vfcWithCps = optionalVfcConnectedToCP.get();
- if (vfcWithItsCps.containsKey(vfcWithCps)) {
- vfcWithItsCps.get(vfcWithCps).add(currCP);
- } else {
- List<ComponentInstance> cpsList = new ArrayList<>();
- cpsList.add(currCP);
- vfcWithItsCps.put(vfcWithCps, cpsList);
- }
- }
- }
- }
-
- private RelativePosition getRelativePositionForCurrentElement(Map<ImmutablePair<Double, Double>, ComponentInstance> componentInstanceLocations, RelativePosition relationToPrevElement, ImmutablePair<Double, Double> prevPlacement) {
- switch (relationToPrevElement) {
- case LEFT: {
- boolean isOccupied = isAdjacentElementOccupied(prevPlacement, RelativePosition.UP, componentInstanceLocations);
- relationToPrevElement = isOccupied ? RelativePosition.LEFT : RelativePosition.UP;
- break;
- }
- case RIGHT: {
- boolean isOccupied = isAdjacentElementOccupied(prevPlacement, RelativePosition.DOWN, componentInstanceLocations);
- relationToPrevElement = isOccupied ? RelativePosition.RIGHT : RelativePosition.DOWN;
- break;
- }
- case UP: {
- boolean isOccupied = isAdjacentElementOccupied(prevPlacement, RelativePosition.RIGHT, componentInstanceLocations);
- relationToPrevElement = isOccupied ? RelativePosition.UP : RelativePosition.RIGHT;
- break;
- }
- case DOWN: {
- boolean isOccupied = isAdjacentElementOccupied(prevPlacement, RelativePosition.LEFT, componentInstanceLocations);
- relationToPrevElement = isOccupied ? RelativePosition.DOWN : RelativePosition.LEFT;
- break;
- }
- default: {
- throw new UnsupportedOperationException();
- }
- }
- return relationToPrevElement;
- }
-
- private boolean isAdjacentElementOccupied(ImmutablePair<Double, Double> currElement, RelativePosition adjacentElementRelationToCurrElement, Map<ImmutablePair<Double, Double>, ComponentInstance> allElements) {
-
- ImmutablePair<Double, Double> adjacentElementPosition = getRelativeElementLocation(currElement, adjacentElementRelationToCurrElement);
- return allElements.containsKey(adjacentElementPosition);
- }
-
- private ImmutablePair<Double, Double> getRelativeElementLocation(ImmutablePair<Double, Double> currElement, RelativePosition relativeLocation) {
- ImmutablePair<Double, Double> relativeElementPosition;
- switch (relativeLocation) {
-
- case LEFT: {
- relativeElementPosition = new ImmutablePair<Double, Double>(currElement.getLeft() - 1, currElement.getRight());
- break;
- }
- case RIGHT: {
- relativeElementPosition = new ImmutablePair<Double, Double>(currElement.getLeft() + 1, currElement.getRight());
- break;
- }
- case UP: {
- relativeElementPosition = new ImmutablePair<Double, Double>(currElement.getLeft(), currElement.getRight() + 1);
- break;
- }
- case DOWN: {
- relativeElementPosition = new ImmutablePair<Double, Double>(currElement.getLeft(), currElement.getRight() - 1);
- break;
- }
- default: {
- throw new UnsupportedOperationException();
- }
- }
- return relativeElementPosition;
- }
+ @Autowired
+ private ComponentInstanceBusinessLogic componentInstanceBusinessLogic;
+
+ private static final int VFC_CANVAS_ELEMENT_SIZE = 50;
+ private static final int CP_CANVAS_ELEMENT_SIZE = 21;
+ private static final int CANVAS_WIDTH = 1000;
+ private static final int CANVAS_HEIGHT = 700;
+ private static final int SPACE_BETWEEN_ELEMENTS = VFC_CANVAS_ELEMENT_SIZE * 4;
+ private static final double CP_RADIUS_FACTOR = 0.4;
+
+ enum RelativePosition {
+ LEFT, RIGHT, UP, DOWN
+ };
+
+ protected Either<List<ComponentInstance>, ResponseFormat> setPositionsForComponentInstances(Resource resource, String userId) {
+ Either<List<ComponentInstance>, ResponseFormat> result = Either.left(resource.getComponentInstances());
+
+ boolean isNotAllPositionsCalculated = resource.getComponentInstances() == null
+ || resource.getComponentInstances().stream().filter(p -> (p.getPosX() == null || p.getPosX().isEmpty()) || (p.getPosY() == null || p.getPosY().isEmpty())).findAny().isPresent();
+
+ if (isNotAllPositionsCalculated && resource.getComponentInstances() != null) {
+ // Arrange Icons In Spiral Pattern
+ Map<ImmutablePair<Double, Double>, ComponentInstance> componentInstanceLocations = buildSpiralPatternPositioningForComponentInstances(resource);
+
+ // Set Relative Locations According to Canvas Size
+ componentInstanceLocations.entrySet().stream().forEach(e -> setRelativePosition(e));
+
+ // Update in DB
+ result = componentInstanceBusinessLogic.updateComponentInstance(ComponentTypeEnum.RESOURCE_PARAM_NAME, resource.getUniqueId(), userId, resource.getComponentInstances(), false, false);
+
+ }
+ return result;
+
+ }
+
+ private void setRelativePosition(Entry<ImmutablePair<Double, Double>, ComponentInstance> entry) {
+ int xCenter = CANVAS_WIDTH / 2;
+ int yCenter = CANVAS_HEIGHT / 2;
+
+ ImmutablePair<Double, Double> matrixPosition = entry.getKey();
+ ComponentInstance componentInstance = entry.getValue();
+ componentInstance.setPosX(calculateCompositionPosition(xCenter, matrixPosition.getLeft(), componentInstance));
+ componentInstance.setPosY(calculateCompositionPosition(yCenter, matrixPosition.getRight(), componentInstance));
+ }
+
+ private String calculateCompositionPosition(int center, double relativePosition, ComponentInstance componentInstance) {
+ final double topLeftCanvasPosition = center + relativePosition * CompositionBusinessLogic.SPACE_BETWEEN_ELEMENTS;
+ double offsetedCanvasPosition;
+ switch (componentInstance.getOriginType()) {
+ case CP:
+ offsetedCanvasPosition = topLeftCanvasPosition - CompositionBusinessLogic.CP_CANVAS_ELEMENT_SIZE / 2;
+ break;
+ case VL:
+ offsetedCanvasPosition = topLeftCanvasPosition - CompositionBusinessLogic.CP_CANVAS_ELEMENT_SIZE / 2;
+ break;
+ case VF:
+ offsetedCanvasPosition = topLeftCanvasPosition - CompositionBusinessLogic.VFC_CANVAS_ELEMENT_SIZE / 2;
+ break;
+ case VFC:
+ offsetedCanvasPosition = topLeftCanvasPosition - CompositionBusinessLogic.VFC_CANVAS_ELEMENT_SIZE / 2;
+ break;
+ case VFCMT:
+ offsetedCanvasPosition = topLeftCanvasPosition - CompositionBusinessLogic.VFC_CANVAS_ELEMENT_SIZE / 2;
+ break;
+ default:
+ offsetedCanvasPosition = topLeftCanvasPosition - CompositionBusinessLogic.VFC_CANVAS_ELEMENT_SIZE / 2;
+ break;
+ }
+ return String.valueOf(offsetedCanvasPosition);
+ }
+
+ protected Map<ImmutablePair<Double, Double>, ComponentInstance> buildSpiralPatternPositioningForComponentInstances(Resource resource) {
+
+ Map<ImmutablePair<Double, Double>, ComponentInstance> componentInstanceLocations = new HashMap<>();
+
+ List<ComponentInstance> componentInstances = new ArrayList<>();
+ componentInstances.addAll(resource.getComponentInstances());
+ Map<ComponentInstance, List<ComponentInstance>> connectededCps = getCpsConnectedToVFC(componentInstances, resource);
+ // Remove all cp that are connected from the list
+ componentInstances.removeAll(connectededCps.values().stream().flatMap(e -> e.stream()).collect(Collectors.toList()));
+
+ buildSpiralPatternForMajorComponents(componentInstanceLocations, componentInstances);
+ buildCirclePatternForCps(componentInstanceLocations, connectededCps);
+
+ return componentInstanceLocations;
+ }
+
+ protected void buildCirclePatternForCps(Map<ImmutablePair<Double, Double>, ComponentInstance> componentInstLocations, Map<ComponentInstance, List<ComponentInstance>> connectedCps) {
+
+ for (Entry<ComponentInstance, List<ComponentInstance>> vfcCpList : connectedCps.entrySet()) {
+ Entry<ImmutablePair<Double, Double>, ComponentInstance> vfcOfTheCps = componentInstLocations.entrySet().stream().filter(p -> p.getValue().getUniqueId().equals(vfcCpList.getKey().getUniqueId())).findAny().get();
+ buildCirclePatternForOneGroupOfCps(vfcOfTheCps.getKey(), vfcCpList.getValue(), componentInstLocations);
+ }
+
+ }
+
+ private void buildCirclePatternForOneGroupOfCps(ImmutablePair<Double, Double> vfcLocation, List<ComponentInstance> cpsGroup, Map<ImmutablePair<Double, Double>, ComponentInstance> componentInstLocations) {
+ final int numberOfCps = cpsGroup.size();
+ double angleBetweenCps = (!cpsGroup.isEmpty()) ? Math.toRadians(360) / numberOfCps : 0;
+ double currentAngle = 0;
+ Double xCenter = vfcLocation.getLeft();
+ Double yCenter = vfcLocation.getRight();
+ for (ComponentInstance currCp : cpsGroup) {
+ double cpXposition = xCenter + CompositionBusinessLogic.CP_RADIUS_FACTOR * Math.cos(currentAngle);
+ double cpYposition = yCenter + CompositionBusinessLogic.CP_RADIUS_FACTOR * Math.sin(currentAngle);
+ componentInstLocations.put(new ImmutablePair<Double, Double>(cpXposition, cpYposition), currCp);
+ currentAngle += angleBetweenCps;
+ }
+
+ }
+
+ private void buildSpiralPatternForMajorComponents(Map<ImmutablePair<Double, Double>, ComponentInstance> componentInstanceLocations, List<ComponentInstance> componentInstances) {
+ int elementsCounter = 0;
+ ImmutablePair<Double, Double> currPlacement;
+ ImmutablePair<Double, Double> prevPlacement = null;
+ RelativePosition relationToPrevElement = null;
+ for (ComponentInstance curr : componentInstances) {
+ elementsCounter++;
+ if (elementsCounter == 1) {
+ currPlacement = new ImmutablePair<Double, Double>(0D, 0D);
+ } else if (elementsCounter == 2) {
+ currPlacement = new ImmutablePair<Double, Double>(-1D, 0D);
+ relationToPrevElement = RelativePosition.LEFT;
+ } else {
+ relationToPrevElement = getRelativePositionForCurrentElement(componentInstanceLocations, relationToPrevElement, prevPlacement);
+ currPlacement = getRelativeElementLocation(prevPlacement, relationToPrevElement);
+
+ }
+
+ componentInstanceLocations.put(currPlacement, curr);
+ prevPlacement = currPlacement;
+ }
+ }
+
+ protected Map<ComponentInstance, List<ComponentInstance>> getCpsConnectedToVFC(List<ComponentInstance> allComponentInstances, Resource vf) {
+ Map<ComponentInstance, List<ComponentInstance>> vfcWithItsCps = new HashMap<>();
+ List<RequirementCapabilityRelDef> allRelations = vf.getComponentInstancesRelations();
+ for (ComponentInstance curr : allComponentInstances) {
+ // Filters Only CPs
+ if (curr.getOriginType() == OriginTypeEnum.CP) {
+ // List Of elements the CP is connected to
+ List<RequirementCapabilityRelDef> connectedToList = allRelations.stream().filter(p -> p.getFromNode().equals(curr.getUniqueId()) || p.getToNode().equals(curr.getUniqueId())).collect(Collectors.toList());
+ // Adds Only CPs Which are connected to VFC
+ filterCpConnectedToVFC(allComponentInstances, vfcWithItsCps, curr, connectedToList);
+ }
+ }
+ return vfcWithItsCps;
+ }
+
+ private void filterCpConnectedToVFC(List<ComponentInstance> allComponentInstances, Map<ComponentInstance, List<ComponentInstance>> vfcWithItsCps, ComponentInstance currCP, List<RequirementCapabilityRelDef> connectedToTheCPList) {
+ if (!connectedToTheCPList.isEmpty()) {
+ // Set Of Ids Of components Instances which are connected certain CP
+ Set<String> mateIds = connectedToTheCPList.stream().map(cpRelation -> cpRelation.getFromNode().equals(currCP.getUniqueId()) ? cpRelation.getToNode() : cpRelation.getFromNode()).collect(Collectors.toSet());
+
+ // Vfc Component instance Connected to the CP
+ Optional<ComponentInstance> optionalVfcConnectedToCP = allComponentInstances.stream().
+ // All instances connected to CP
+ filter(p -> mateIds.contains(p.getUniqueId())).
+ // Filter in only VFC connected to the CP
+ filter(p -> p.getOriginType() == OriginTypeEnum.VFC).findAny();
+
+ if (optionalVfcConnectedToCP.isPresent()) {
+ final ComponentInstance vfcWithCps = optionalVfcConnectedToCP.get();
+ if (vfcWithItsCps.containsKey(vfcWithCps)) {
+ vfcWithItsCps.get(vfcWithCps).add(currCP);
+ } else {
+ List<ComponentInstance> cpsList = new ArrayList<>();
+ cpsList.add(currCP);
+ vfcWithItsCps.put(vfcWithCps, cpsList);
+ }
+ }
+ }
+ }
+
+ private RelativePosition getRelativePositionForCurrentElement(Map<ImmutablePair<Double, Double>, ComponentInstance> componentInstanceLocations, RelativePosition relationToPrevElement, ImmutablePair<Double, Double> prevPlacement) {
+ switch (relationToPrevElement) {
+ case LEFT: {
+ boolean isOccupied = isAdjacentElementOccupied(prevPlacement, RelativePosition.UP, componentInstanceLocations);
+ relationToPrevElement = isOccupied ? RelativePosition.LEFT : RelativePosition.UP;
+ break;
+ }
+ case RIGHT: {
+ boolean isOccupied = isAdjacentElementOccupied(prevPlacement, RelativePosition.DOWN, componentInstanceLocations);
+ relationToPrevElement = isOccupied ? RelativePosition.RIGHT : RelativePosition.DOWN;
+ break;
+ }
+ case UP: {
+ boolean isOccupied = isAdjacentElementOccupied(prevPlacement, RelativePosition.RIGHT, componentInstanceLocations);
+ relationToPrevElement = isOccupied ? RelativePosition.UP : RelativePosition.RIGHT;
+ break;
+ }
+ case DOWN: {
+ boolean isOccupied = isAdjacentElementOccupied(prevPlacement, RelativePosition.LEFT, componentInstanceLocations);
+ relationToPrevElement = isOccupied ? RelativePosition.DOWN : RelativePosition.LEFT;
+ break;
+ }
+ default: {
+ throw new UnsupportedOperationException();
+ }
+ }
+ return relationToPrevElement;
+ }
+
+ private boolean isAdjacentElementOccupied(ImmutablePair<Double, Double> currElement, RelativePosition adjacentElementRelationToCurrElement, Map<ImmutablePair<Double, Double>, ComponentInstance> allElements) {
+
+ ImmutablePair<Double, Double> adjacentElementPosition = getRelativeElementLocation(currElement, adjacentElementRelationToCurrElement);
+ return allElements.containsKey(adjacentElementPosition);
+ }
+
+ private ImmutablePair<Double, Double> getRelativeElementLocation(ImmutablePair<Double, Double> currElement, RelativePosition relativeLocation) {
+ ImmutablePair<Double, Double> relativeElementPosition;
+ switch (relativeLocation) {
+
+ case LEFT: {
+ relativeElementPosition = new ImmutablePair<Double, Double>(currElement.getLeft() - 1, currElement.getRight());
+ break;
+ }
+ case RIGHT: {
+ relativeElementPosition = new ImmutablePair<Double, Double>(currElement.getLeft() + 1, currElement.getRight());
+ break;
+ }
+ case UP: {
+ relativeElementPosition = new ImmutablePair<Double, Double>(currElement.getLeft(), currElement.getRight() + 1);
+ break;
+ }
+ case DOWN: {
+ relativeElementPosition = new ImmutablePair<Double, Double>(currElement.getLeft(), currElement.getRight() - 1);
+ break;
+ }
+ default: {
+ throw new UnsupportedOperationException();
+ }
+ }
+ return relativeElementPosition;
+ }
}