diff --git a/headless-services/sprotty-si-view/client/css/page.css b/headless-services/sprotty-si-view/client/css/page.css index fc17b4ff0..555630d7d 100644 --- a/headless-services/sprotty-si-view/client/css/page.css +++ b/headless-services/sprotty-si-view/client/css/page.css @@ -21,6 +21,13 @@ color: #888; } +#refresh { + width: 20%; +} +#target-url { + width: 80%; +} + .help { margin-top: 24px; text-align: right; diff --git a/headless-services/sprotty-si-view/client/index.html b/headless-services/sprotty-si-view/client/index.html index c22a3cfa5..0b6da2f81 100644 --- a/headless-services/sprotty-si-view/client/index.html +++ b/headless-services/sprotty-si-view/client/index.html @@ -15,7 +15,7 @@

Spring Integration Graph

- +

diff --git a/headless-services/sprotty-si-view/client/src/standalone.ts b/headless-services/sprotty-si-view/client/src/standalone.ts index ff99873bd..6670ad700 100644 --- a/headless-services/sprotty-si-view/client/src/standalone.ts +++ b/headless-services/sprotty-si-view/client/src/standalone.ts @@ -55,7 +55,6 @@ export default function runStandalone() { dispatcher.dispatch(requestModelAction()); }); - function getOptionFromDom(att: string) : string | null { const appDiv = document.getElementById('sprotty-app'); if (appDiv) { @@ -65,7 +64,9 @@ export default function runStandalone() { } function getTarget() : string { - return getOptionFromDom('target') || 'target-missing'; + const input = document.getElementById('target-url'); + const target = input && input.value; + return target || 'target-missing'; } function requestModelAction() : RequestModelAction { diff --git a/headless-services/sprotty-si-view/src/main/java/org/springframework/ide/si/view/GraphDataProvider.java b/headless-services/sprotty-si-view/src/main/java/org/springframework/ide/si/view/GraphDataProvider.java index f8838ebe4..10dbee51e 100644 --- a/headless-services/sprotty-si-view/src/main/java/org/springframework/ide/si/view/GraphDataProvider.java +++ b/headless-services/sprotty-si-view/src/main/java/org/springframework/ide/si/view/GraphDataProvider.java @@ -2,15 +2,13 @@ package org.springframework.ide.si.view; import java.net.URL; -import org.apache.commons.io.IOUtils; +import org.eclipse.sprotty.RequestModelAction; import org.springframework.ide.si.view.json.SpringIntegrationGraphJson; import org.springframework.util.Assert; -import com.google.gson.Gson; - @FunctionalInterface public interface GraphDataProvider { - SpringIntegrationGraphJson getGraph() throws Exception; + SpringIntegrationGraphJson getGraph(RequestModelAction modelRequest) throws Exception; static GraphDataProvider fromClasspathResource(String path) { if (!path.startsWith("/")) { @@ -22,9 +20,17 @@ public interface GraphDataProvider { } static GraphDataProvider fromUrl(URL resource) { - return () -> { - String jsonString = IOUtils.toString(resource); - return new Gson().fromJson(jsonString, SpringIntegrationGraphJson.class); + return (RequestModelAction modelRequest) -> { + return SpringIntegrationGraphJson.readFrom(resource); + }; + } + + static GraphDataProvider fromUrlOption(String propName) { + return (RequestModelAction modelRequest) -> { + String urlStr = modelRequest.getOptions().get(propName); + Assert.hasText(urlStr, "Url must be provided in modelRequest.options."+propName); + URL url = new URL(modelRequest.getOptions().get(propName)); + return SpringIntegrationGraphJson.readFrom(url); }; } } diff --git a/headless-services/sprotty-si-view/src/main/java/org/springframework/ide/si/view/MockGraphData.java b/headless-services/sprotty-si-view/src/main/java/org/springframework/ide/si/view/MockGraphData.java deleted file mode 100644 index 91b4872b2..000000000 --- a/headless-services/sprotty-si-view/src/main/java/org/springframework/ide/si/view/MockGraphData.java +++ /dev/null @@ -1,333 +0,0 @@ -package org.springframework.ide.si.view; - -import java.io.IOException; - -import org.springframework.ide.si.view.json.SpringIntegrationGraphJson; - -import com.google.gson.Gson; -import com.google.gson.JsonObject; - -public class MockGraphData implements GraphDataProvider { - - public static String data = "{\n" + - "contentDescriptor: {\n" + - "providerVersion: \"5.1.6.RELEASE\",\n" + - "providerFormatVersion: 1,\n" + - "provider: \"spring-integration\"\n" + - "},\n" + - "nodes: [\n" + - "{\n" + - "nodeId: 1,\n" + - "name: \"news\",\n" + - "stats: {\n" + - "countsEnabled: true,\n" + - "statsEnabled: true,\n" + - "loggingEnabled: true,\n" + - "sendCount: 20,\n" + - "sendErrorCount: 0,\n" + - "timeSinceLastSend: 3017590.1150589883,\n" + - "meanSendRate: 0.006416917317469066,\n" + - "meanErrorRate: 0,\n" + - "meanErrorRatio: 0,\n" + - "meanSendDuration: 0.6229622172698512,\n" + - "minSendDuration: 0.36042,\n" + - "maxSendDuration: 5.398724,\n" + - "standardDeviationSendDuration: 0.6248008418287394,\n" + - "sendDuration: {\n" + - "count: 20,\n" + - "min: 0.36042,\n" + - "max: 5.398724,\n" + - "mean: 0.6229622172698512,\n" + - "standardDeviation: 0.6248008418287394,\n" + - "countLong: 20\n" + - "},\n" + - "sendRate: {\n" + - "count: 20,\n" + - "min: 4.519030865997076,\n" + - "max: 5.000686829984188,\n" + - "mean: 0.006416915226255189,\n" + - "standardDeviation: 0.003059182339655441,\n" + - "countLong: 20\n" + - "},\n" + - "errorRate: {\n" + - "count: 0,\n" + - "min: 0,\n" + - "max: 0,\n" + - "mean: 0,\n" + - "standardDeviation: 0,\n" + - "countLong: 0\n" + - "}\n" + - "},\n" + - "componentType: \"channel\",\n" + - "properties: { }\n" + - "},\n" + - "{\n" + - "nodeId: 2,\n" + - "name: \"file\",\n" + - "stats: {\n" + - "countsEnabled: true,\n" + - "statsEnabled: true,\n" + - "loggingEnabled: true,\n" + - "sendCount: 20,\n" + - "sendErrorCount: 0,\n" + - "timeSinceLastSend: 3017591.1391609907,\n" + - "meanSendRate: 0.006416922929073101,\n" + - "meanErrorRate: 0,\n" + - "meanErrorRatio: 0,\n" + - "meanSendDuration: 0.35330047484316307,\n" + - "minSendDuration: 0.208864,\n" + - "maxSendDuration: 2.849803,\n" + - "standardDeviationSendDuration: 0.33755534347541105,\n" + - "sendDuration: {\n" + - "count: 20,\n" + - "min: 0.208864,\n" + - "max: 2.849803,\n" + - "mean: 0.35330047484316307,\n" + - "standardDeviation: 0.33755534347541105,\n" + - "countLong: 20\n" + - "},\n" + - "sendRate: {\n" + - "count: 20,\n" + - "min: 4.516921804994345,\n" + - "max: 5.000899210005999,\n" + - "mean: 0.00641692253069279,\n" + - "standardDeviation: 0.003073929309381288,\n" + - "countLong: 20\n" + - "},\n" + - "errorRate: {\n" + - "count: 0,\n" + - "min: 0,\n" + - "max: 0,\n" + - "mean: 0,\n" + - "standardDeviation: 0,\n" + - "countLong: 0\n" + - "}\n" + - "},\n" + - "componentType: \"channel\",\n" + - "properties: { }\n" + - "},\n" + - "{\n" + - "nodeId: 3,\n" + - "name: \"nullChannel\",\n" + - "stats: {\n" + - "countsEnabled: true,\n" + - "statsEnabled: true,\n" + - "loggingEnabled: true,\n" + - "sendCount: 0,\n" + - "sendErrorCount: 0,\n" + - "timeSinceLastSend: 0,\n" + - "meanSendRate: 0,\n" + - "meanErrorRate: 0,\n" + - "meanErrorRatio: 0,\n" + - "meanSendDuration: 0,\n" + - "minSendDuration: 0,\n" + - "maxSendDuration: 0,\n" + - "standardDeviationSendDuration: 0,\n" + - "sendDuration: {\n" + - "count: 0,\n" + - "min: 0,\n" + - "max: 0,\n" + - "mean: 0,\n" + - "standardDeviation: 0,\n" + - "countLong: 0\n" + - "},\n" + - "sendRate: {\n" + - "count: 0,\n" + - "min: 0,\n" + - "max: 0,\n" + - "mean: 0,\n" + - "standardDeviation: 0,\n" + - "countLong: 0\n" + - "},\n" + - "errorRate: {\n" + - "count: 0,\n" + - "min: 0,\n" + - "max: 0,\n" + - "mean: 0,\n" + - "standardDeviation: 0,\n" + - "countLong: 0\n" + - "}\n" + - "},\n" + - "componentType: \"null-channel\",\n" + - "properties: { }\n" + - "},\n" + - "{\n" + - "nodeId: 4,\n" + - "name: \"errorChannel\",\n" + - "stats: {\n" + - "countsEnabled: true,\n" + - "statsEnabled: true,\n" + - "loggingEnabled: true,\n" + - "sendCount: 0,\n" + - "sendErrorCount: 0,\n" + - "timeSinceLastSend: 0,\n" + - "meanSendRate: 0,\n" + - "meanErrorRate: 0,\n" + - "meanErrorRatio: 0,\n" + - "meanSendDuration: 0,\n" + - "minSendDuration: 0,\n" + - "maxSendDuration: 0,\n" + - "standardDeviationSendDuration: 0,\n" + - "sendDuration: {\n" + - "count: 0,\n" + - "min: 0,\n" + - "max: 0,\n" + - "mean: 0,\n" + - "standardDeviation: 0,\n" + - "countLong: 0\n" + - "},\n" + - "sendRate: {\n" + - "count: 0,\n" + - "min: 0,\n" + - "max: 0,\n" + - "mean: 0,\n" + - "standardDeviation: 0,\n" + - "countLong: 0\n" + - "},\n" + - "errorRate: {\n" + - "count: 0,\n" + - "min: 0,\n" + - "max: 0,\n" + - "mean: 0,\n" + - "standardDeviation: 0,\n" + - "countLong: 0\n" + - "}\n" + - "},\n" + - "componentType: \"publish-subscribe-channel\",\n" + - "properties: { }\n" + - "},\n" + - "{\n" + - "nodeId: 5,\n" + - "name: \"news.adapter\",\n" + - "stats: {\n" + - "messageCount: 20\n" + - "},\n" + - "componentType: \"feed:inbound-channel-adapter\",\n" + - "properties: { },\n" + - "output: \"news\",\n" + - "errors: null\n" + - "},\n" + - "{\n" + - "nodeId: 6,\n" + - "name: \"org.springframework.integration.config.ConsumerEndpointFactoryBean#0\",\n" + - "stats: {\n" + - "activeCount: 0,\n" + - "duration: {\n" + - "count: 20,\n" + - "min: 0.346117,\n" + - "max: 4.516881,\n" + - "mean: 0.585700683679285,\n" + - "standardDeviation: 0.5242315172537475,\n" + - "countLong: 20\n" + - "},\n" + - "countsEnabled: true,\n" + - "statsEnabled: true,\n" + - "loggingEnabled: true,\n" + - "maxDuration: 4.516881,\n" + - "minDuration: 0.346117,\n" + - "meanDuration: 0.585700683679285,\n" + - "errorCount: 0,\n" + - "handleCount: 20,\n" + - "standardDeviationDuration: 0.5242315172537475\n" + - "},\n" + - "componentType: \"transformer\",\n" + - "properties: {\n" + - "expression: \"payload.title + ' @ ' + payload.link + ' '\"\n" + - "},\n" + - "output: \"file\",\n" + - "input: \"news\"\n" + - "},\n" + - "{\n" + - "nodeId: 7,\n" + - "name: \"file.adapter\",\n" + - "stats: {\n" + - "activeCount: 0,\n" + - "duration: {\n" + - "count: 20,\n" + - "min: 0.192626,\n" + - "max: 2.602112,\n" + - "mean: 0.3295736390049931,\n" + - "standardDeviation: 0.31151136752438835,\n" + - "countLong: 20\n" + - "},\n" + - "countsEnabled: true,\n" + - "statsEnabled: true,\n" + - "loggingEnabled: true,\n" + - "maxDuration: 2.602112,\n" + - "minDuration: 0.192626,\n" + - "meanDuration: 0.3295736390049931,\n" + - "errorCount: 0,\n" + - "handleCount: 20,\n" + - "standardDeviationDuration: 0.31151136752438835\n" + - "},\n" + - "componentType: \"message-handler\",\n" + - "properties: { },\n" + - "output: null,\n" + - "input: \"file\"\n" + - "},\n" + - "{\n" + - "nodeId: 8,\n" + - "name: \"_org.springframework.integration.errorLogger\",\n" + - "stats: {\n" + - "activeCount: 0,\n" + - "duration: {\n" + - "count: 0,\n" + - "min: 0,\n" + - "max: 0,\n" + - "mean: 0,\n" + - "standardDeviation: 0,\n" + - "countLong: 0\n" + - "},\n" + - "countsEnabled: true,\n" + - "statsEnabled: true,\n" + - "loggingEnabled: true,\n" + - "maxDuration: 0,\n" + - "minDuration: 0,\n" + - "meanDuration: 0,\n" + - "errorCount: 0,\n" + - "handleCount: 0,\n" + - "standardDeviationDuration: 0\n" + - "},\n" + - "componentType: \"logging-channel-adapter\",\n" + - "properties: { },\n" + - "output: null,\n" + - "input: \"errorChannel\"\n" + - "}\n" + - "],\n" + - "links: [\n" + - "{\n" + - "from: 5,\n" + - "to: 1,\n" + - "type: \"output\"\n" + - "},\n" + - "{\n" + - "from: 1,\n" + - "to: 6,\n" + - "type: \"input\"\n" + - "},\n" + - "{\n" + - "from: 6,\n" + - "to: 2,\n" + - "type: \"output\"\n" + - "},\n" + - "{\n" + - "from: 2,\n" + - "to: 7,\n" + - "type: \"input\"\n" + - "},\n" + - "{\n" + - "from: 4,\n" + - "to: 8,\n" + - "type: \"input\"\n" + - "}\n" + - "]\n" + - "}"; - - @Override - public SpringIntegrationGraphJson getGraph() throws IOException { - Gson gson = new Gson().newBuilder().setPrettyPrinting().create(); - JsonObject json = gson.fromJson(data, JsonObject.class); - System.out.println(gson.toJson(json)); - return gson.fromJson(json, SpringIntegrationGraphJson.class); - } -} diff --git a/headless-services/sprotty-si-view/src/main/java/org/springframework/ide/si/view/SIDiagramGenerator.java b/headless-services/sprotty-si-view/src/main/java/org/springframework/ide/si/view/SIDiagramGenerator.java index ab627a5b5..26ed2a739 100644 --- a/headless-services/sprotty-si-view/src/main/java/org/springframework/ide/si/view/SIDiagramGenerator.java +++ b/headless-services/sprotty-si-view/src/main/java/org/springframework/ide/si/view/SIDiagramGenerator.java @@ -76,7 +76,7 @@ public class SIDiagramGenerator implements DiagramGenerator { public synchronized SModelRoot generateModel(String clientId, RequestModelAction modelRequest) { nodesById.clear(); try { - SpringIntegrationGraphJson jsonData = graphDataProvider.getGraph(); + SpringIntegrationGraphJson jsonData = graphDataProvider.getGraph(modelRequest); return toSprottyGraph(jsonData); } catch (Exception e) { log.error("", e); @@ -166,7 +166,7 @@ public class SIDiagramGenerator implements DiagramGenerator { centerNode(compartment); SLabel label = new SLabel(); - label.setId(id + "-lanbel"); + label.setId(id + "-label"); label.setType("node:label"); label.setText(labelText); centerNode(label); diff --git a/headless-services/sprotty-si-view/src/main/java/org/springframework/ide/si/view/SprottySiViewApplication.java b/headless-services/sprotty-si-view/src/main/java/org/springframework/ide/si/view/SprottySiViewApplication.java index 6142a5ae0..78972a752 100644 --- a/headless-services/sprotty-si-view/src/main/java/org/springframework/ide/si/view/SprottySiViewApplication.java +++ b/headless-services/sprotty-si-view/src/main/java/org/springframework/ide/si/view/SprottySiViewApplication.java @@ -8,6 +8,7 @@ import org.eclipse.sprotty.layout.SprottyLayoutConfigurator; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; +import org.springframework.ide.si.view.json.SpringIntegrationGraphJson; @SpringBootApplication public class SprottySiViewApplication { @@ -15,7 +16,9 @@ public class SprottySiViewApplication { @Bean GraphDataProvider graphDataProvider() { // return new MockGraphData(); - return GraphDataProvider.fromClasspathResource("/sample.json"); +// return GraphDataProvider.fromClasspathResource("/sample.json"); + + return GraphDataProvider.fromUrlOption("target"); } @Bean diff --git a/headless-services/sprotty-si-view/src/main/java/org/springframework/ide/si/view/json/SpringIntegrationGraphJson.java b/headless-services/sprotty-si-view/src/main/java/org/springframework/ide/si/view/json/SpringIntegrationGraphJson.java index 9bd309ff7..237e0661b 100644 --- a/headless-services/sprotty-si-view/src/main/java/org/springframework/ide/si/view/json/SpringIntegrationGraphJson.java +++ b/headless-services/sprotty-si-view/src/main/java/org/springframework/ide/si/view/json/SpringIntegrationGraphJson.java @@ -1,5 +1,11 @@ package org.springframework.ide.si.view.json; +import java.io.IOException; +import java.net.URL; + +import org.apache.commons.io.IOUtils; + +import com.google.gson.Gson; import com.google.gson.JsonObject; public class SpringIntegrationGraphJson extends PrettyJson { @@ -26,4 +32,8 @@ public class SpringIntegrationGraphJson extends PrettyJson { public void setLinks(SpringIntegrationEdgeJson[] links) { this.links = links; } + public static SpringIntegrationGraphJson readFrom(URL resource) throws IOException { + String jsonString = IOUtils.toString(resource); + return new Gson().fromJson(jsonString, SpringIntegrationGraphJson.class); + } }