Skip to content
This repository was archived by the owner on Nov 3, 2022. It is now read-only.

[#27] unknown providers and relation targets are added on the fly #48

Merged
merged 3 commits into from
Nov 21, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@ docs/build
_static
_templates
/.env
/.iml
*.iml
1 change: 1 addition & 0 deletions src/main/java/de/bonndan/nivio/input/Indexer.java
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ public ProcessLog reIndex(final LandscapeDescription input) {
Map<ItemDescription, List<String>> templatesAndTargets = new HashMap<>();
new SourceReferencesResolver(formatFactory, logger).resolve(input, templatesAndTargets);
new TemplateResolver().processTemplates(input, templatesAndTargets);
new InstantItemResolver(logger).processTargets(input);
new RelationResolver(logger).processRelations(input);
input.getGroups().forEach((identifier, groupItem) -> {
Group g = new Group();
Expand Down
88 changes: 88 additions & 0 deletions src/main/java/de/bonndan/nivio/input/InstantItemResolver.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package de.bonndan.nivio.input;

import de.bonndan.nivio.input.dto.ItemDescription;
import de.bonndan.nivio.input.dto.LandscapeDescription;
import de.bonndan.nivio.model.*;
import org.springframework.util.StringUtils;

import java.util.*;

/**
* If the landscape is configured as "greedy", new items are created on the fly by a reference name.
*
* @todo add hosts as soon as relation resolver supports hosts
*/
public class InstantItemResolver {

private final ProcessLog log;

public InstantItemResolver(ProcessLog log) {
this.log = log;
}

public void processTargets(LandscapeDescription landscape) {

if (!landscape.getConfig().isGreedy()) {
return;
}

List<ItemDescription> all = landscape.getItemDescriptions();

HashSet<ItemDescription> newItems = new HashSet<>();
all.forEach(itemDescription -> newItems.addAll(resolveTargets(itemDescription, all)));

landscape.addItems(newItems);
}

private List<ItemDescription> resolveTargets(ItemDescription description, List<ItemDescription> allItems) {

List<ItemDescription> newItems = new ArrayList<>();
//providers
description.getProvidedBy().forEach(term -> {
Optional<? extends LandscapeItem> provider = Items.query(term.toLowerCase(), allItems).stream().findFirst();

if (provider.isEmpty()) {
newItems.add(createItem(term));
}
});

//other relations
description.getRelations().forEach(rel -> {

//skip sources, since only the targets are in the list

//find targets
if (!StringUtils.isEmpty(rel.getTarget()) && !hasTarget(rel.getTarget().toLowerCase(), allItems)) {
newItems.add(createItem(rel.getTarget()));
}
});

return newItems;
}

/**
* Creates a new item description with source/target as identifier
*/
private ItemDescription createItem(String term) {
ItemDescription itemDescription = new ItemDescription();
FullyQualifiedIdentifier fqi = FullyQualifiedIdentifier.from(term);
itemDescription.setGroup(fqi.getGroup());
itemDescription.setIdentifier(fqi.getIdentifier());
return itemDescription;
}

private boolean hasTarget(String term, List<ItemDescription> allItems) {

if (StringUtils.isEmpty(term)) {
return true;
}

Collection<? extends LandscapeItem> result = Items.query(term, allItems);
if (result.size() > 1) {
log.warn("Found ambiguous sources matching " + term);
return true;
}

return result.size() != 0;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ public class LandscapeDescription implements Landscape {
*/
private List<ItemDescription> itemDescriptions = new ArrayList<>();

private LandscapeConfig config;
private LandscapeConfig config = new LandscapeConfig();

private boolean isPartial = false;

Expand Down Expand Up @@ -135,7 +135,7 @@ public LandscapeImpl toLandscape() {
return landscape;
}

public void addItems(List<ItemDescription> incoming) {
public void addItems(Collection<ItemDescription> incoming) {
if (incoming == null)
return;

Expand Down
10 changes: 10 additions & 0 deletions src/main/java/de/bonndan/nivio/model/LandscapeConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

public class LandscapeConfig {

private boolean greedy = true;

private JGraphXConfig jgraphx = new JGraphXConfig();

public JGraphXConfig getJgraphx() {
Expand All @@ -12,6 +14,14 @@ public void setJgraphx(JGraphXConfig jgraphx) {
this.jgraphx = jgraphx;
}

public boolean isGreedy() {
return greedy;
}

public void setGreedy(boolean greedy) {
this.greedy = greedy;
}

/**
* @link https://jgraph.github.io/mxgraph/java/docs/com/mxgraph/layout/mxOrganicLayout.html
*/
Expand Down
4 changes: 2 additions & 2 deletions src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ logging:
level:
root: INFO

#server:
# port: 8081
server:
port: 8081
---
spring:
profiles: test
Expand Down
84 changes: 84 additions & 0 deletions src/test/java/de/bonndan/nivio/input/InstantItemResolverTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
package de.bonndan.nivio.input;

import de.bonndan.nivio.input.dto.ItemDescription;
import de.bonndan.nivio.input.dto.LandscapeDescription;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.util.Arrays;

import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.mock;

class InstantItemResolverTest {

private InstantItemResolver instantItemResolver;
private LandscapeDescription landscapeDescription;

@BeforeEach
public void setup() {

instantItemResolver = new InstantItemResolver(mock(ProcessLog.class));
}

@Test
public void addsNewItems() {

landscapeDescription = new LandscapeDescription();
ItemDescription a = new ItemDescription();
a.setIdentifier("a");
a.setGroup("a");
a.getProvidedBy().add("providerA");
landscapeDescription.getItemDescriptions().add(a);

ItemDescription b = new ItemDescription();
b.setIdentifier("b");
b.setGroup("b");
a.setRelations(Arrays.asList("adistanttarget"));

landscapeDescription.getItemDescriptions().add(b);
landscapeDescription.getConfig().setGreedy(true);

instantItemResolver.processTargets(landscapeDescription);
assertEquals(4, landscapeDescription.getItemDescriptions().size());
}

@Test
public void addsNewItemsOnlyOnce() {

landscapeDescription = new LandscapeDescription();
ItemDescription a = new ItemDescription();
a.setIdentifier("a");
a.setGroup("a");
a.getProvidedBy().add("providerA");
landscapeDescription.getItemDescriptions().add(a);

ItemDescription b = new ItemDescription();
b.setIdentifier("b");
b.setGroup("b");
a.setRelations(Arrays.asList("adistanttarget"));
landscapeDescription.getItemDescriptions().add(b);

ItemDescription c = new ItemDescription();
c.setIdentifier("c");
c.setGroup("c");
c.setRelations(Arrays.asList("adistanttarget"));
landscapeDescription.getItemDescriptions().add(c);

landscapeDescription.getConfig().setGreedy(true);


instantItemResolver.processTargets(landscapeDescription);

//3 given plus 2 resolved (like above)
assertEquals(5, landscapeDescription.getItemDescriptions().size());

assertTrue(landscapeDescription.getItemDescriptions().stream()
.anyMatch(itemDescription -> itemDescription.getIdentifier().equals("providera"))
);

assertTrue(landscapeDescription.getItemDescriptions().stream()
.anyMatch(itemDescription -> itemDescription.getIdentifier().equals("adistanttarget"))
);
}
}
1 change: 1 addition & 0 deletions src/test/resources/example/example_env.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ sources:
format: nivio

config:
greedy: false
jgraphx:
#nodeDistributionCostFactor: 9000000.0
#edgeLengthCostFactor;
Expand Down
Binary file modified src/test/resources/example/example_four_groups_debug.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.