From 53403f26e2e5abddb5aad8fce10137a76aac0af4 Mon Sep 17 00:00:00 2001 From: Rene Pfeuffer Date: Wed, 15 Jan 2020 17:38:11 +0100 Subject: [PATCH 1/4] Add optional i18n keys for violations and make path optional --- scm-ui/ui-components/src/BackendErrorNotification.tsx | 3 ++- scm-ui/ui-components/src/errors.ts | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/scm-ui/ui-components/src/BackendErrorNotification.tsx b/scm-ui/ui-components/src/BackendErrorNotification.tsx index 5319243f79..0ab184e7c4 100644 --- a/scm-ui/ui-components/src/BackendErrorNotification.tsx +++ b/scm-ui/ui-components/src/BackendErrorNotification.tsx @@ -56,7 +56,8 @@ class BackendErrorNotification extends React.Component { {error.violations.map((violation, index) => { return (
  • - {violation.path}: {violation.message} + {violation.path && {violation.path}:} {violation.message}{" "} + {violation.key && t(violation.key)}
  • ); })} diff --git a/scm-ui/ui-components/src/errors.ts b/scm-ui/ui-components/src/errors.ts index 5171fe07b4..d1a53e52c9 100644 --- a/scm-ui/ui-components/src/errors.ts +++ b/scm-ui/ui-components/src/errors.ts @@ -2,9 +2,10 @@ type Context = { type: string; id: string; }[]; -type Violation = { - path: string; +export type Violation = { + path?: string; message: string; + key?: string; }; export type BackendErrorContent = { From 2d755aae9a5671c832560039206c8a5e9d0aef88 Mon Sep 17 00:00:00 2001 From: Rene Pfeuffer Date: Thu, 16 Jan 2020 08:56:57 +0100 Subject: [PATCH 2/4] Fix plugin load order The old algorithm failed, because the tree below lead to the issue, that the scm-branchwp-plugin was loaded before the scm-review-plugin was ready. This commit changes the order in the way, that leafs are loaded last. +- scm-editor-plugin d +- scm-branchwp-plugin a +- scm-mail-plugin c +- scm-review-plugin b +- scm-branchwp-plugin a +- scm-branchwp-plugin a --- .../sonia/scm/plugin/PluginProcessor.java | 40 +++---------- .../java/sonia/scm/plugin/PluginTree.java | 47 +++++++++++++-- .../java/sonia/scm/plugin/PluginTreeTest.java | 60 ++++++++++--------- 3 files changed, 83 insertions(+), 64 deletions(-) diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/PluginProcessor.java b/scm-webapp/src/main/java/sonia/scm/plugin/PluginProcessor.java index 431cb44e1b..031f31694e 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/PluginProcessor.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/PluginProcessor.java @@ -191,11 +191,11 @@ public final class PluginProcessor logger.info("install plugin tree:\n{}", pluginTree); - List rootNodes = pluginTree.getRootNodes(); + List leafLastNodes = pluginTree.getLeafLastNodes(); logger.trace("create plugin wrappers and build classloaders"); - Set wrappers = createPluginWrappers(classLoader, rootNodes); + Set wrappers = createPluginWrappers(classLoader, leafLastNodes); logger.debug("collected {} plugins", wrappers.size()); @@ -259,33 +259,6 @@ public final class PluginProcessor } } - /** - * Method description - * - * - * @param plugins - * @param classLoader - * @param nodes - * - * @throws IOException - */ - private void appendPluginWrappers(Set plugins, - ClassLoader classLoader, List nodes) - throws IOException - { - - // TODO fix plugin loading order - for (PluginNode node : nodes) - { - appendPluginWrapper(plugins, classLoader, node); - } - - for (PluginNode node : nodes) - { - appendPluginWrappers(plugins, classLoader, node.getChildren()); - } - } - /** * Method description * @@ -484,19 +457,22 @@ public final class PluginProcessor * * * @param classLoader - * @param rootNodes + * @param nodes * * @return * * @throws IOException */ private Set createPluginWrappers(ClassLoader classLoader, - List rootNodes) + List nodes) throws IOException { Set plugins = Sets.newHashSet(); - appendPluginWrappers(plugins, classLoader, rootNodes); + for (PluginNode node : nodes) + { + appendPluginWrapper(plugins, classLoader, node); + } return plugins; } diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/PluginTree.java b/scm-webapp/src/main/java/sonia/scm/plugin/PluginTree.java index 2ebe06db02..1eb2704c90 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/PluginTree.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/PluginTree.java @@ -39,6 +39,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Arrays; +import java.util.LinkedHashSet; +import java.util.LinkedList; import java.util.List; //~--- JDK imports ------------------------------------------------------------ @@ -134,13 +136,26 @@ public final class PluginTree * * @return */ - public List getRootNodes() + public List getLeafLastNodes() { - return rootNodes; + LinkedHashSet leafFirst = new LinkedHashSet<>(); + + rootNodes.forEach(node -> appendLeafFirst(leafFirst, node)); + + LinkedList leafLast = new LinkedList<>(); + + leafFirst.stream().map(PluginNodeHashWrapper::getPluginNode).forEach(leafLast::addFirst); + + return leafLast; } - //~--- methods -------------------------------------------------------------- + private void appendLeafFirst(LinkedHashSet leafFirst, PluginNode node) { + node.getChildren().forEach(child -> appendLeafFirst(leafFirst, child)); + leafFirst.add(new PluginNodeHashWrapper(node)); + } + + //~--- methods -------------------------------------------------------------- /** * Method description * @@ -235,8 +250,32 @@ public final class PluginTree append(buffer, indent + " ", child); } } -//~--- fields --------------------------------------------------------------- + + //~--- fields --------------------------------------------------------------- /** Field description */ private final List rootNodes = Lists.newArrayList(); + + private static class PluginNodeHashWrapper { + private final PluginNode pluginNode; + + private PluginNodeHashWrapper(PluginNode pluginNode) { + this.pluginNode = pluginNode; + } + + public PluginNode getPluginNode() { + return pluginNode; + } + + @Override + public int hashCode() { + return pluginNode.getId().hashCode(); + } + + @Override + public boolean equals(Object obj) { + return obj instanceof PluginNodeHashWrapper + && ((PluginNodeHashWrapper) obj).pluginNode.getId().equals(this.pluginNode.getId()); + } + } } diff --git a/scm-webapp/src/test/java/sonia/scm/plugin/PluginTreeTest.java b/scm-webapp/src/test/java/sonia/scm/plugin/PluginTreeTest.java index 33a139aa5a..6e4e001885 100644 --- a/scm-webapp/src/test/java/sonia/scm/plugin/PluginTreeTest.java +++ b/scm-webapp/src/test/java/sonia/scm/plugin/PluginTreeTest.java @@ -76,7 +76,7 @@ public class PluginTreeTest false, null, null); ExplodedSmp smp = createSmp(plugin); - new PluginTree(smp).getRootNodes(); + new PluginTree(smp).getLeafLastNodes(); } /** @@ -88,7 +88,7 @@ public class PluginTreeTest @Test(expected = PluginNotInstalledException.class) public void testPluginNotInstalled() throws IOException { - new PluginTree(createSmpWithDependency("b", "a")).getRootNodes(); + new PluginTree(createSmpWithDependency("b", "a")).getLeafLastNodes(); } /** @@ -98,10 +98,10 @@ public class PluginTreeTest * @throws IOException */ @Test - public void testRootNotes() throws IOException + public void testNodes() throws IOException { List smps = createSmps("a", "b", "c"); - List nodes = unwrapIds(new PluginTree(smps).getRootNodes()); + List nodes = unwrapIds(new PluginTree(smps).getLeafLastNodes()); assertThat(nodes, containsInAnyOrder("a", "b", "c")); } @@ -119,7 +119,7 @@ public class PluginTreeTest null, null); ExplodedSmp smp = createSmp(plugin); - new PluginTree(smp).getRootNodes(); + new PluginTree(smp).getLeafLastNodes(); } /** @@ -140,17 +140,31 @@ public class PluginTreeTest //J+ PluginTree tree = new PluginTree(smps); - List rootNodes = tree.getRootNodes(); + List nodes = tree.getLeafLastNodes(); - assertThat(unwrapIds(rootNodes), containsInAnyOrder("a")); + System.out.println(tree); - PluginNode a = rootNodes.get(0); + assertThat(unwrapIds(nodes), contains("a", "b", "c")); + } - assertThat(unwrapIds(a.getChildren()), containsInAnyOrder("b", "c")); + @Test + public void testComplexDependencies() throws IOException + { + //J- + ExplodedSmp[] smps = new ExplodedSmp[]{ + createSmpWithDependency("a", "b", "c", "d"), + createSmpWithDependency("b", "c"), + createSmpWithDependency("c"), + createSmpWithDependency("d") + }; + //J+ - PluginNode b = a.getChild("b"); + PluginTree tree = new PluginTree(smps); + List nodes = tree.getLeafLastNodes(); - assertThat(unwrapIds(b.getChildren()), containsInAnyOrder("c")); + System.out.println(tree); + + assertThat(unwrapIds(nodes), contains("d", "c", "b", "a")); } @Test @@ -162,15 +176,11 @@ public class PluginTreeTest }; PluginTree tree = new PluginTree(smps); - List rootNodes = tree.getRootNodes(); + List nodes = tree.getLeafLastNodes(); - assertThat(unwrapIds(rootNodes), containsInAnyOrder("a")); + System.out.println(tree); - PluginNode a = rootNodes.get(0); - assertThat(unwrapIds(a.getChildren()), containsInAnyOrder("b", "c")); - - PluginNode b = a.getChild("b"); - assertThat(unwrapIds(b.getChildren()), containsInAnyOrder("c")); + assertThat(unwrapIds(nodes), contains("a", "b", "c")); } @Test @@ -185,15 +195,9 @@ public class PluginTreeTest System.out.println(tree); - List rootNodes = tree.getRootNodes(); + List nodes = tree.getLeafLastNodes(); - assertThat(unwrapIds(rootNodes), containsInAnyOrder("a")); - - PluginNode a = rootNodes.get(0); - assertThat(unwrapIds(a.getChildren()), containsInAnyOrder("b")); - - PluginNode b = a.getChild("b"); - assertThat(unwrapIds(b.getChildren()), containsInAnyOrder("c")); + assertThat(unwrapIds(nodes), contains("a", "b", "c")); } @Test @@ -203,9 +207,9 @@ public class PluginTreeTest }; PluginTree tree = new PluginTree(smps); - List rootNodes = tree.getRootNodes(); + List nodes = tree.getLeafLastNodes(); - assertThat(unwrapIds(rootNodes), containsInAnyOrder("a")); + assertThat(unwrapIds(nodes), containsInAnyOrder("a")); } /** From 3602976ff109ba0c4c6cd713be69dc135fc4cfb4 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Thu, 16 Jan 2020 10:27:34 +0100 Subject: [PATCH 3/4] removed unnecessary plugin node wrapper Removed PluginNodeHashWrapper and moved equals and hashCode logic into PluginNode --- .../java/sonia/scm/plugin/PluginNode.java | 11 +++++++ .../java/sonia/scm/plugin/PluginTree.java | 31 +++---------------- 2 files changed, 15 insertions(+), 27 deletions(-) diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/PluginNode.java b/scm-webapp/src/main/java/sonia/scm/plugin/PluginNode.java index 94a048770f..08cff50457 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/PluginNode.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/PluginNode.java @@ -175,6 +175,17 @@ public final class PluginNode this.wrapper = wrapper; } + @Override + public int hashCode() { + return getId().hashCode(); + } + + @Override + public boolean equals(Object obj) { + return obj instanceof PluginNode + && ((PluginNode) obj).getId().equals(this.getId()); + } + @Override public String toString() { return plugin.getPath().toString() + " -> " + children; diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/PluginTree.java b/scm-webapp/src/main/java/sonia/scm/plugin/PluginTree.java index 1eb2704c90..d7dfafbe02 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/PluginTree.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/PluginTree.java @@ -138,20 +138,20 @@ public final class PluginTree */ public List getLeafLastNodes() { - LinkedHashSet leafFirst = new LinkedHashSet<>(); + LinkedHashSet leafFirst = new LinkedHashSet<>(); rootNodes.forEach(node -> appendLeafFirst(leafFirst, node)); LinkedList leafLast = new LinkedList<>(); - leafFirst.stream().map(PluginNodeHashWrapper::getPluginNode).forEach(leafLast::addFirst); + leafFirst.forEach(leafLast::addFirst); return leafLast; } - private void appendLeafFirst(LinkedHashSet leafFirst, PluginNode node) { + private void appendLeafFirst(LinkedHashSet leafFirst, PluginNode node) { node.getChildren().forEach(child -> appendLeafFirst(leafFirst, child)); - leafFirst.add(new PluginNodeHashWrapper(node)); + leafFirst.add(node); } @@ -255,27 +255,4 @@ public final class PluginTree /** Field description */ private final List rootNodes = Lists.newArrayList(); - - private static class PluginNodeHashWrapper { - private final PluginNode pluginNode; - - private PluginNodeHashWrapper(PluginNode pluginNode) { - this.pluginNode = pluginNode; - } - - public PluginNode getPluginNode() { - return pluginNode; - } - - @Override - public int hashCode() { - return pluginNode.getId().hashCode(); - } - - @Override - public boolean equals(Object obj) { - return obj instanceof PluginNodeHashWrapper - && ((PluginNodeHashWrapper) obj).pluginNode.getId().equals(this.pluginNode.getId()); - } - } } From b999b8529660a8cc011ee0a886149f01ac16fb4e Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Thu, 16 Jan 2020 09:54:43 +0000 Subject: [PATCH 4/4] Close branch feature/keys_for_violations