From c49a9f0c83d790c332e46bd8aaa6a4936faef610 Mon Sep 17 00:00:00 2001 From: BoykoAlex Date: Mon, 26 Aug 2019 18:58:56 -0400 Subject: [PATCH] POC finalized --- .../commons/commons-sprotty/pom.xml | 9 +- .../commons/sprotty/elk/ElkLayoutEngine.java | 19 --- .../vscode/commons/sprotty/elk/ElkUtils.java | 114 ------------------ .../scan/DiagramServerConfiguration.java | 31 +---- .../sprotty/scan/DiagramServerManager.java | 3 +- .../LiveBeansDiagramServerManager.java | 19 ++- .../app/diagram/MockDiagramServerModel.java | 94 --------------- .../boot/app/diagram/PopupModelFactory.java | 36 ------ .../ide/vscode/boot/test/LayoutTest.java | 54 --------- .../src/standalone.ts | 1 + 10 files changed, 21 insertions(+), 359 deletions(-) delete mode 100644 headless-services/commons/commons-sprotty/src/main/java/org/springframework/ide/vscode/commons/sprotty/elk/ElkLayoutEngine.java delete mode 100644 headless-services/commons/commons-sprotty/src/main/java/org/springframework/ide/vscode/commons/sprotty/elk/ElkUtils.java delete mode 100644 headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/diagram/MockDiagramServerModel.java delete mode 100644 headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/diagram/PopupModelFactory.java delete mode 100644 headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/test/LayoutTest.java diff --git a/headless-services/commons/commons-sprotty/pom.xml b/headless-services/commons/commons-sprotty/pom.xml index c0f680c71..208f7cf4b 100644 --- a/headless-services/commons/commons-sprotty/pom.xml +++ b/headless-services/commons/commons-sprotty/pom.xml @@ -30,16 +30,15 @@ org.eclipse.sprotty.server ${sprotty-version} - - org.eclipse.elk - org.eclipse.elk.core - ${elk-version} + org.eclipse.sprotty + org.eclipse.sprotty.layout + ${sprotty-version} org.eclipse.elk org.eclipse.elk.alg.layered ${elk-version} - + \ No newline at end of file diff --git a/headless-services/commons/commons-sprotty/src/main/java/org/springframework/ide/vscode/commons/sprotty/elk/ElkLayoutEngine.java b/headless-services/commons/commons-sprotty/src/main/java/org/springframework/ide/vscode/commons/sprotty/elk/ElkLayoutEngine.java deleted file mode 100644 index c14c8fc49..000000000 --- a/headless-services/commons/commons-sprotty/src/main/java/org/springframework/ide/vscode/commons/sprotty/elk/ElkLayoutEngine.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.springframework.ide.vscode.commons.sprotty.elk; - -import org.eclipse.elk.core.RecursiveGraphLayoutEngine; -import org.eclipse.elk.core.util.BasicProgressMonitor; -import org.eclipse.elk.graph.ElkNode; -import org.eclipse.sprotty.ILayoutEngine; -import org.eclipse.sprotty.SModelRoot; - -public class ElkLayoutEngine implements ILayoutEngine { - - @Override - public void layout(SModelRoot root) { - ElkUtils utils = new ElkUtils(root); - ElkNode graph = utils.graph; - new RecursiveGraphLayoutEngine().layout(graph, new BasicProgressMonitor()); - utils.applyLayout(); - } - -} diff --git a/headless-services/commons/commons-sprotty/src/main/java/org/springframework/ide/vscode/commons/sprotty/elk/ElkUtils.java b/headless-services/commons/commons-sprotty/src/main/java/org/springframework/ide/vscode/commons/sprotty/elk/ElkUtils.java deleted file mode 100644 index 1ff3b0a76..000000000 --- a/headless-services/commons/commons-sprotty/src/main/java/org/springframework/ide/vscode/commons/sprotty/elk/ElkUtils.java +++ /dev/null @@ -1,114 +0,0 @@ -package org.springframework.ide.vscode.commons.sprotty.elk; - -import java.util.ArrayList; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -import org.eclipse.elk.alg.layered.options.ContentAlignment; -import org.eclipse.elk.alg.layered.options.FixedAlignment; -import org.eclipse.elk.alg.layered.options.LayeredOptions; -import org.eclipse.elk.alg.layered.options.NodePlacementStrategy; -import org.eclipse.elk.core.options.Alignment; -import org.eclipse.elk.core.options.Direction; -import org.eclipse.elk.graph.ElkBendPoint; -import org.eclipse.elk.graph.ElkEdge; -import org.eclipse.elk.graph.ElkEdgeSection; -import org.eclipse.elk.graph.ElkNode; -import org.eclipse.elk.graph.properties.IProperty; -import org.eclipse.elk.graph.properties.Property; -import org.eclipse.elk.graph.util.ElkGraphUtil; -import org.eclipse.sprotty.Point; -import org.eclipse.sprotty.SEdge; -import org.eclipse.sprotty.SModelElement; -import org.eclipse.sprotty.SModelRoot; -import org.eclipse.sprotty.SNode; -import org.eclipse.sprotty.SShapeElement; -import org.springframework.util.Assert; - -public class ElkUtils { - - private static final IProperty SPROTTY_ELEMENT = new Property<>("sprotty-element"); - public final ElkNode graph; - private Map nodes = new HashMap<>();; - - public ElkUtils(SModelRoot root) { - graph = ElkGraphUtil.createGraph(); - -// graph.setProperty(LayeredOptions.DIRECTION, Direction.DOWN); -// graph.setProperty(LayeredOptions.CONTENT_ALIGNMENT, EnumSet.of(ContentAlignment.H_CENTER)); -// graph.setProperty(LayeredOptions.ALIGNMENT, Alignment.RIGHT); - -// graph.setProperty(LayeredOptions.NODE_PLACEMENT_STRATEGY, NodePlacementStrategy.SIMPLE); - graph.setProperty(LayeredOptions.NODE_PLACEMENT_BK_FIXED_ALIGNMENT, FixedAlignment.BALANCED); - - List edges = new ArrayList<>(); - for (SModelElement child : root.getChildren()) { - System.out.println(child.getClass()); - if (child instanceof SNode) { - nodes.put(child.getId(), toElk((SNode)child, graph)); - } else if (child instanceof SEdge) { - edges.add((SEdge)child); - } else { - throw new IllegalArgumentException("Unsupported graph layout element"); - } - } - - for (SEdge edge : edges) { - toElk(edge); - } - } - - private ElkEdge toElk(SEdge child) { - ElkNode source = nodes.get(child.getSourceId()); - ElkNode target = nodes.get(child.getTargetId()); - Assert.isTrue(source != null); - Assert.isTrue(target != null); - ElkEdge edge = ElkGraphUtil.createSimpleEdge(source, target); - edge.setProperty(SPROTTY_ELEMENT, child); - return edge; - } - - private ElkNode toElk(SNode child, ElkNode parent) { - ElkNode node = ElkGraphUtil.createNode(parent); - node.setX(child.getPosition().getX()); - node.setY(child.getPosition().getY()); - node.setWidth(child.getSize().getWidth()); - node.setHeight(child.getSize().getHeight()); - node.setIdentifier(child.getId()); - node.setProperty(SPROTTY_ELEMENT, child); -// node.setProperty(LayeredOptions.ALIGNMENT, Alignment.CENTER); - return node; - } - - public void applyLayout() { - for (Entry entry : nodes.entrySet()) { - ElkNode elkNode = entry.getValue(); - SModelElement element = elkNode.getProperty(SPROTTY_ELEMENT); - if (element instanceof SShapeElement) { - SShapeElement shape = (SShapeElement) element; - shape.setPosition(new Point(elkNode.getX(), elkNode.getY())); - } - } - - for (ElkEdge elkEdge : graph.getContainedEdges()) { - SModelElement element = elkEdge.getProperty(SPROTTY_ELEMENT); - if (element instanceof SEdge) { - SEdge edge = (SEdge) element; - List bendpoints = new ArrayList<>(); - for (ElkEdgeSection section : elkEdge.getSections()) { - bendpoints.add(new Point(section.getStartX(), section.getStartY())); - for (ElkBendPoint elkBend : section.getBendPoints()) { - Point bendpoint = new Point(elkBend.getX(), elkBend.getY()); - bendpoints.add(bendpoint); - } - bendpoints.add(new Point(section.getEndX(), section.getEndY())); - } - edge.setRoutingPoints(bendpoints); - } - } - } - -} diff --git a/headless-services/commons/commons-sprotty/src/main/java/org/springframework/ide/vscode/commons/sprotty/scan/DiagramServerConfiguration.java b/headless-services/commons/commons-sprotty/src/main/java/org/springframework/ide/vscode/commons/sprotty/scan/DiagramServerConfiguration.java index d686468c7..64acf48ef 100644 --- a/headless-services/commons/commons-sprotty/src/main/java/org/springframework/ide/vscode/commons/sprotty/scan/DiagramServerConfiguration.java +++ b/headless-services/commons/commons-sprotty/src/main/java/org/springframework/ide/vscode/commons/sprotty/scan/DiagramServerConfiguration.java @@ -1,45 +1,18 @@ package org.springframework.ide.vscode.commons.sprotty.scan; import org.eclipse.elk.alg.layered.options.LayeredMetaDataProvider; -import org.eclipse.elk.core.data.LayoutMetaDataService; -import org.eclipse.sprotty.IDiagramExpansionListener; -import org.eclipse.sprotty.IDiagramOpenListener; -import org.eclipse.sprotty.IDiagramSelectionListener; import org.eclipse.sprotty.ILayoutEngine; -import org.eclipse.sprotty.IModelUpdateListener; -import org.eclipse.sprotty.SModelCloner; +import org.eclipse.sprotty.layout.ElkLayoutEngine; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.ide.vscode.commons.sprotty.elk.ElkLayoutEngine; @Configuration public class DiagramServerConfiguration { - @Bean public IModelUpdateListener modelUpdateListener() { - return new IModelUpdateListener.NullImpl(); - } - @Bean public ILayoutEngine layoutEngine() { - LayoutMetaDataService.getInstance().registerLayoutMetaDataProviders(new LayeredMetaDataProvider()); + ElkLayoutEngine.initialize(new LayeredMetaDataProvider()); return new ElkLayoutEngine(); } - @Bean public IDiagramSelectionListener diagramSelectionListener() { - return new IDiagramSelectionListener.NullImpl(); - } - - @Bean public IDiagramExpansionListener diagramExpansionListener() { - return new IDiagramExpansionListener.NullImpl(); - } - - @Bean public IDiagramOpenListener diagramOpenListener() { - return new IDiagramOpenListener.NullImpl(); - } - - @Bean public SModelCloner modelCloner() { - return new SModelCloner(); - } - - } diff --git a/headless-services/commons/commons-sprotty/src/main/java/org/springframework/ide/vscode/commons/sprotty/scan/DiagramServerManager.java b/headless-services/commons/commons-sprotty/src/main/java/org/springframework/ide/vscode/commons/sprotty/scan/DiagramServerManager.java index c1c0b94fe..a7ff32883 100644 --- a/headless-services/commons/commons-sprotty/src/main/java/org/springframework/ide/vscode/commons/sprotty/scan/DiagramServerManager.java +++ b/headless-services/commons/commons-sprotty/src/main/java/org/springframework/ide/vscode/commons/sprotty/scan/DiagramServerManager.java @@ -3,9 +3,8 @@ package org.springframework.ide.vscode.commons.sprotty.scan; import java.util.function.Consumer; import org.eclipse.sprotty.ActionMessage; -import org.eclipse.sprotty.IDiagramServer; -public interface DiagramServerManager /*extends IDiagramServer.Provider*/ { +public interface DiagramServerManager { void setRemoteEndpoint(Consumer remoteEndpoint); diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/diagram/LiveBeansDiagramServerManager.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/diagram/LiveBeansDiagramServerManager.java index d9a77e566..c69a4e7af 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/diagram/LiveBeansDiagramServerManager.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/diagram/LiveBeansDiagramServerManager.java @@ -17,11 +17,11 @@ import org.eclipse.sprotty.SEdge; import org.eclipse.sprotty.SGraph; import org.eclipse.sprotty.SLabel; import org.eclipse.sprotty.SModelElement; -import org.eclipse.sprotty.SModelRoot; import org.eclipse.sprotty.SNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; import org.springframework.ide.vscode.boot.java.handlers.RunningAppProvider; import org.springframework.ide.vscode.commons.boot.app.cli.SpringBootApp; import org.springframework.ide.vscode.commons.boot.app.cli.livebean.LiveBean; @@ -37,6 +37,11 @@ import com.google.common.cache.CacheBuilder; @Component public class LiveBeansDiagramServerManager implements DiagramServerManager { + public static final SGraph EMPTY_GRAPH = new SGraph(((Consumer) (SGraph it) -> { + it.setType("NONE"); + it.setId("EMPTY"); + })); + private static final Logger log = LoggerFactory.getLogger(LiveBeansDiagramServerManager.class); private Cache servers = CacheBuilder.newBuilder().build(); @@ -47,9 +52,11 @@ public class LiveBeansDiagramServerManager implements DiagramServerManager { @Autowired private ILayoutEngine layoutEngine; + @Autowired + private ApplicationContext appContext; + private Consumer remoteEndpoint; -// @Override private IDiagramServer getDiagramServer(String clientId) { try { return servers.get(clientId, () -> { @@ -82,7 +89,7 @@ public class LiveBeansDiagramServerManager implements DiagramServerManager { } } - private SModelRoot generateModel(String clientId) { + private SGraph generateModel(String clientId) { try { Collection apps = runningAppProvider.getAllRunningSpringApps(); if (!apps.isEmpty()) { @@ -97,11 +104,11 @@ public class LiveBeansDiagramServerManager implements DiagramServerManager { } catch (Exception e) { log.error("{}", e); } - return SGraph.EMPTY_ROOT; + return EMPTY_GRAPH; } - private SModelRoot toSprottyGraph(SpringBootApp app) throws Exception { - SModelRoot graph = new SModelRoot(); + private SGraph toSprottyGraph(SpringBootApp app) throws Exception { + SGraph graph = new SGraph(); graph.setId(app.getProcessName()); graph.setType("graph"); diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/diagram/MockDiagramServerModel.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/diagram/MockDiagramServerModel.java deleted file mode 100644 index 4e44eebf0..000000000 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/diagram/MockDiagramServerModel.java +++ /dev/null @@ -1,94 +0,0 @@ -package org.springframework.ide.vscode.boot.app.diagram; - -import java.util.ArrayList; - -import org.eclipse.sprotty.Dimension; -import org.eclipse.sprotty.IDiagramServer; -import org.eclipse.sprotty.Point; -import org.eclipse.sprotty.SCompartment; -import org.eclipse.sprotty.SEdge; -import org.eclipse.sprotty.SLabel; -import org.eclipse.sprotty.SModelRoot; -import org.eclipse.sprotty.SNode; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.scheduling.TaskScheduler; -import org.springframework.stereotype.Component; - -import net.bytebuddy.utility.RandomString; - - -//@Component -public class MockDiagramServerModel implements InitializingBean { - - @Autowired - IDiagramServer diagramServer; - - @Autowired - @Qualifier("taskScheduler") - private TaskScheduler taskScheduler; - - @Override - public void afterPropertiesSet() throws Exception { -// taskScheduler.scheduleAtFixedRate(() -> diagramServer.setModel(generateModel()), Duration.ofSeconds(5)); - diagramServer.setModel(generateModel(10)); - } - - public static SModelRoot generateModel(int nodesNum) { - SModelRoot graph = new SModelRoot(); - graph.setId("graph"); - graph.setType("graph"); - - SNode node0 = createBean("node0", "main", new Point(100, 100), new Dimension(120, 40)); - - graph.setChildren(new ArrayList<>()); - graph.getChildren().add(node0); - - for (int i = 1; i < nodesNum; i++) { - SNode node = createBean("node" + i, RandomString.make(((int) Math.round(Math.random()* 10 + 1))), new Point(Math.random() * 1024, Math.random() * 768), new Dimension(120, 40)); - SEdge edge = createEdge("edge-" + i, node0.getId(), node.getId()); - graph.getChildren().add(edge); - graph.getChildren().add(node); - - } - - return graph; - } - - private static SNode createBean(String id, String labelText, Point location, Dimension size) { - SNode node = new SNode(); - node.setId(id); - node.setType("node:bean"); - node.setLayout("vbox"); - node.setPosition(new Point(Math.random() * 1024, Math.random() * 768)); - node.setSize(new Dimension(80, 80)); - node.setChildren(new ArrayList<>()); - - SCompartment compartment = new SCompartment(); - compartment.setId(id + "-comp"); - compartment.setType("compartment"); - compartment.setLayout("hbox"); - compartment.setChildren(new ArrayList<>()); - - SLabel label = new SLabel(); - label.setId(id + "-lanbel"); - label.setType("node:label"); - label.setText(labelText); - - compartment.getChildren().add(label); - node.getChildren().add(compartment); - - return node; - } - - private static SEdge createEdge(String id, String sourceId, String targetId) { - SEdge edge = new SEdge(); - edge.setId(id); - edge.setType("edge:straight"); - edge.setSourceId(sourceId); - edge.setTargetId(targetId); - return edge; - } - -} diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/diagram/PopupModelFactory.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/diagram/PopupModelFactory.java deleted file mode 100644 index 5af0dc12f..000000000 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/diagram/PopupModelFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.springframework.ide.vscode.boot.app.diagram; - -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.sprotty.IDiagramServer; -import org.eclipse.sprotty.IPopupModelFactory; -import org.eclipse.sprotty.RequestPopupModelAction; -import org.eclipse.sprotty.SGraph; -import org.eclipse.sprotty.SLabel; -import org.eclipse.sprotty.SModelElement; -import org.eclipse.sprotty.SModelRoot; -import org.springframework.stereotype.Component; - -@Component -public class PopupModelFactory implements IPopupModelFactory { - - @Override - public SModelRoot createPopupModel(SModelElement element, RequestPopupModelAction request, IDiagramServer server) { - -// SGraph graph = new SGraph(); -// graph.setId("popup"); -// List children = new ArrayList<>(); -// -// SLabel label = new SLabel(); -// label.setType("node:label"); -// label.setText("I'm a tooltip!"); -// children.add(label); -// -// graph.setChildren(children); -// -// return graph; - return null; - } - -} diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/test/LayoutTest.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/test/LayoutTest.java deleted file mode 100644 index 5233b015b..000000000 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/test/LayoutTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.springframework.ide.vscode.boot.test; - -import static org.junit.Assert.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotEquals; - -import java.util.HashMap; -import java.util.Map; - -import org.eclipse.elk.alg.layered.options.LayeredMetaDataProvider; -import org.eclipse.elk.core.RecursiveGraphLayoutEngine; -import org.eclipse.elk.core.data.LayoutMetaDataService; -import org.eclipse.elk.core.util.BasicProgressMonitor; -import org.eclipse.elk.graph.ElkNode; -import org.eclipse.sprotty.Point; -import org.eclipse.sprotty.SModelRoot; -import org.junit.Test; -import org.springframework.ide.vscode.boot.app.diagram.MockDiagramServerModel; -import org.springframework.ide.vscode.commons.sprotty.elk.ElkUtils; - - -public class LayoutTest { - - @Test - public void testCreateGraph() throws Exception { - SModelRoot modelRoot = MockDiagramServerModel.generateModel(10); - ElkNode graph = new ElkUtils(modelRoot).graph; - assertNotNull(graph); - assertEquals(10, graph.getChildren().size()); - assertEquals(9, graph.getContainedEdges().size()); - } - - @Test - public void testLayout() throws Exception { - LayoutMetaDataService.getInstance().registerLayoutMetaDataProviders(new LayeredMetaDataProvider()); - - SModelRoot modelRoot = MockDiagramServerModel.generateModel(10); - ElkNode graph = new ElkUtils(modelRoot).graph; - - Map locations = new HashMap<>(); - - for (ElkNode child : graph.getChildren()) { - locations.put(child.getIdentifier(), new Point(child.getX(), child.getY())); - } - - new RecursiveGraphLayoutEngine().layout(graph, new BasicProgressMonitor()); - - for (ElkNode child : graph.getChildren()) { - assertNotEquals(locations.get(child.getIdentifier()), new Point(child.getX(), child.getY())); - } - - } - -} diff --git a/nodejs-packages/sprotty-live-beans-client/src/standalone.ts b/nodejs-packages/sprotty-live-beans-client/src/standalone.ts index e87162d67..ac735260e 100644 --- a/nodejs-packages/sprotty-live-beans-client/src/standalone.ts +++ b/nodejs-packages/sprotty-live-beans-client/src/standalone.ts @@ -108,6 +108,7 @@ export default function runStandalone(clientId: string) { if (modelSource instanceof VSCodeWebViewDiagramServer) { console.log('Listen and acquire VSCode API with client-id = ' + clientId); modelSource.listen(acquireVsCodeApi()); + dispatcher.dispatch(new RequestModelAction()); } console.log('Before requesting model');