diff --git a/com.avaloq.tools.ddk.xtext.expression/META-INF/MANIFEST.MF b/com.avaloq.tools.ddk.xtext.expression/META-INF/MANIFEST.MF index 23a5517a5..63bc92ef5 100644 --- a/com.avaloq.tools.ddk.xtext.expression/META-INF/MANIFEST.MF +++ b/com.avaloq.tools.ddk.xtext.expression/META-INF/MANIFEST.MF @@ -23,7 +23,8 @@ Require-Bundle: org.eclipse.xtext, org.eclipse.jdt.launching, org.eclipse.core.resources, org.eclipse.core.runtime, - org.eclipse.xtext.xbase.lib;bundle-version="2.14.0" + org.eclipse.xtext.xbase.lib, + com.avaloq.tools.ddk Import-Package: org.apache.logging.log4j, org.apache.log4j Export-Package: com.avaloq.tools.ddk.xtext.expression, diff --git a/com.avaloq.tools.ddk.xtext.expression/src/com/avaloq/tools/ddk/xtext/expression/generator/EClassComparator.java b/com.avaloq.tools.ddk.xtext.expression/src/com/avaloq/tools/ddk/xtext/expression/generator/EClassComparator.java index a57fa04e6..79f6da21c 100644 --- a/com.avaloq.tools.ddk.xtext.expression/src/com/avaloq/tools/ddk/xtext/expression/generator/EClassComparator.java +++ b/com.avaloq.tools.ddk.xtext.expression/src/com/avaloq/tools/ddk/xtext/expression/generator/EClassComparator.java @@ -19,6 +19,7 @@ import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EcorePackage; +import com.avaloq.tools.ddk.util.Graph; import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.base.Predicates; diff --git a/com.avaloq.tools.ddk.xtext.generator.test/META-INF/MANIFEST.MF b/com.avaloq.tools.ddk.xtext.generator.test/META-INF/MANIFEST.MF index b1da6aedb..85d0d8f6d 100644 --- a/com.avaloq.tools.ddk.xtext.generator.test/META-INF/MANIFEST.MF +++ b/com.avaloq.tools.ddk.xtext.generator.test/META-INF/MANIFEST.MF @@ -7,7 +7,7 @@ Bundle-Vendor: Avaloq Group AG Bundle-RequiredExecutionEnvironment: JavaSE-17 Bundle-ActivationPolicy: lazy Fragment-Host: com.avaloq.tools.ddk.xtext.generator -Require-Bundle: com.avaloq.tools.ddk.test.core, +Require-Bundle: com.avaloq.tools.ddk.test.core, com.avaloq.tools.ddk.xtext.expression, com.avaloq.tools.ddk.xtext.test.core, org.eclipse.xtend, @@ -16,7 +16,8 @@ Require-Bundle: com.avaloq.tools.ddk.test.core, org.junit, org.mockito, com.avaloq.tools.ddk.xtext.ui, - org.eclipse.xtext.xtext.generator + org.eclipse.xtext.xtext.generator, + com.avaloq.tools.ddk Export-Package: com.avaloq.tools.ddk.xtext.generator.test.generator Import-Package: org.eclipse.xtext.ui.resource Automatic-Module-Name: com.avaloq.tools.ddk.xtext.generator.test diff --git a/com.avaloq.tools.ddk.xtext.generator.test/src/com/avaloq/tools/ddk/xtext/generator/test/util/GraphTest.java b/com.avaloq.tools.ddk.xtext.generator.test/src/com/avaloq/tools/ddk/xtext/generator/test/util/GraphTest.java index a822ee512..04b62f018 100644 --- a/com.avaloq.tools.ddk.xtext.generator.test/src/com/avaloq/tools/ddk/xtext/generator/test/util/GraphTest.java +++ b/com.avaloq.tools.ddk.xtext.generator.test/src/com/avaloq/tools/ddk/xtext/generator/test/util/GraphTest.java @@ -18,16 +18,28 @@ import org.junit.Test; -import com.avaloq.tools.ddk.xtext.expression.generator.Graph; +import com.avaloq.tools.ddk.util.Graph; import com.google.common.collect.HashMultimap; import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.Multimap; -@SuppressWarnings("PMD.JUnitAssertionsShouldIncludeMessage") +@SuppressWarnings({"nls", "PMD.JUnitAssertionsShouldIncludeMessage"}) public class GraphTest { // CHECKSTYLE:CONSTANTS-OFF + private static Graph create(final Multimap graph) { + Graph g = new Graph(); + for (Map.Entry entry : graph.entries()) { + String from = entry.getKey(); + String to = entry.getValue(); + g.addNode(from); + g.addNode(to); + g.addEdge(from, to); + } + return g; + } + @Test public void testTopologicalSorting() { Multimap graph = HashMultimap.create(); @@ -42,7 +54,7 @@ public void testTopologicalSorting() { graph.put("8", "9"); graph.put("8", "10"); - List sorted = Graph.create(graph).sort(); + List sorted = create(graph).sort(); assertSorting(graph, sorted); } @@ -51,7 +63,7 @@ public void testDependencyCycle() { Multimap graph = ImmutableMultimap.of("1", "2", "2", "3", "3", "1"); try { - Graph.create(graph).sort(); + create(graph).sort(); fail(); } catch (IllegalStateException e) { assertTrue(true); // NOPMD diff --git a/com.avaloq.tools.ddk.xtext.expression/src/com/avaloq/tools/ddk/xtext/expression/generator/Graph.java b/com.avaloq.tools.ddk/src/com/avaloq/tools/ddk/util/Graph.java similarity index 69% rename from com.avaloq.tools.ddk.xtext.expression/src/com/avaloq/tools/ddk/xtext/expression/generator/Graph.java rename to com.avaloq.tools.ddk/src/com/avaloq/tools/ddk/util/Graph.java index 833e6671e..28230e9ce 100644 --- a/com.avaloq.tools.ddk.xtext.expression/src/com/avaloq/tools/ddk/xtext/expression/generator/Graph.java +++ b/com.avaloq.tools.ddk/src/com/avaloq/tools/ddk/util/Graph.java @@ -8,19 +8,16 @@ * Contributors: * Avaloq Group AG - initial API and implementation *******************************************************************************/ -package com.avaloq.tools.ddk.xtext.expression.generator; +package com.avaloq.tools.ddk.util; +import java.util.ArrayList; import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; -import com.google.common.base.Function; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import com.google.common.collect.Multimap; -import com.google.common.collect.Sets; - /** * A generic graph which can be topologically sorted. @@ -38,8 +35,8 @@ public class Graph { */ private static class Node { private final T ref; - private final Set> inEdges = Sets.newLinkedHashSet(); - private final Set> outEdges = Sets.newLinkedHashSet(); + private final Set> inEdges = new LinkedHashSet<>(); + private final Set> outEdges = new LinkedHashSet<>(); Node(final T ref) { this.ref = ref; @@ -64,7 +61,7 @@ public String toString() { } } - private final Map> nodes = Maps.newLinkedHashMap(); + private final Map> nodes = new LinkedHashMap<>(); /** * Helper method to create a new graph. @@ -83,27 +80,6 @@ public static Graph create(final Iterable nodes) { return g; } - /** - * Helper method to create a new graph. - * - * @param - * node type - * @param graph - * graph as multiset where values represent targets of edges with key as source - * @return graph - */ - public static Graph create(final Multimap graph) { - Graph g = new Graph(); - for (Map.Entry entry : graph.entries()) { - T from = entry.getKey(); - T to = entry.getValue(); - g.addNode(from); - g.addNode(to); - g.addEdge(from, to); - } - return g; - } - /** * Adds a node to this graph. * @@ -140,13 +116,11 @@ public Graph addEdge(final T from, final T to) { * @return sorted graph */ public List sort() { - // TODO try to sort to something as close as possible to the original - // L <- Empty list that will contain the sorted elements - List> l = Lists.newArrayList(); + List> l = new ArrayList<>(); // S <- Set of all nodes with no incoming edges - Set> s = Sets.newLinkedHashSet(); + Set> s = new LinkedHashSet<>(); for (Node n : nodes.values()) { if (n.inEdges.isEmpty()) { s.add(n); @@ -180,16 +154,11 @@ public List sort() { // Check to see if all edges are removed for (Node n : nodes.values()) { if (!n.inEdges.isEmpty()) { - throw new IllegalStateException("Cycle present, topological sort not possible: " + n.ref + " -> " + n.inEdges); + throw new IllegalStateException("Cycle present, topological sort not possible: " + n.ref + " -> " + n.inEdges); //$NON-NLS-1$ //$NON-NLS-2$ } } - return Lists.transform(l, new Function, T>() { - @Override - public T apply(final Node from) { - return from.ref; - } - }); + return l.stream().map(f -> f.ref).toList(); } }