Skip to content
Snippets Groups Projects
Commit 09a6e225 authored by Johannes Mey's avatar Johannes Mey
Browse files

add websocket diagram provider

parent 2f66b9da
No related branches found
No related tags found
No related merge requests found
...@@ -41,6 +41,11 @@ dependencies { ...@@ -41,6 +41,11 @@ dependencies {
testImplementation group: 'org.assertj', name: 'assertj-core', version: "${assertj_version}" testImplementation group: 'org.assertj', name: 'assertj-core', version: "${assertj_version}"
testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: "${jupyter_version}" testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: "${jupyter_version}"
testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: "${jupyter_version}" testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: "${jupyter_version}"
implementation group: 'io.javalin', name: 'javalin', version: "${javalin_version}"
implementation group: 'org.json', name: 'json', version: '20220320'
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.13.3'
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.13.3'
implementation group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.31'
} }
def versionFile = 'src/main/resources/Version.properties' def versionFile = 'src/main/resources/Version.properties'
......
...@@ -4,3 +4,4 @@ jupyter_version = 5.8.2 ...@@ -4,3 +4,4 @@ jupyter_version = 5.8.2
assertj_version = 3.22.0 assertj_version = 3.22.0
grammar2uml_version = 0.2.1 grammar2uml_version = 0.2.1
jastaddgradle_version = 1.14.5 jastaddgradle_version = 1.14.5
javalin_version = 4.6.3
package de.tudresden.inf.st.mg.common;
import com.fasterxml.jackson.databind.ObjectMapper;
import de.tudresden.inf.st.mg.common.DiagramProvider.AST;
import io.javalin.Javalin;
import io.javalin.http.ContentType;
import io.javalin.websocket.WsContext;
import org.eclipse.jetty.util.ConcurrentHashSet;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class DiagramProvider {
private static DiagramProvider INSTANCE;
private static Map<WsContext, String> clients = new ConcurrentHashMap<>();
public static DiagramProvider getInstance() {
if (INSTANCE == null) {
INSTANCE = new DiagramProvider();
}
return INSTANCE;
}
private List<AST> asts;
private DiagramProvider() {
asts = new ArrayList<>();
Javalin app = Javalin.create().start(7070);
app.get("/", ctx -> ctx.result("Hello World"));
app.get("/asts/", ctx -> {
ctx.json(asts);
});
app.ws("ast-events", ws -> {
ws.onConnect(ctx -> {
System.err.println("somebody connected " +ctx.host());
clients.put(ctx, ctx.host());
});
ws.onClose(ctx -> {
System.err.println("somebody disconnected");
clients.remove(ctx);
});
ws.onMessage(ctx -> {
System.err.println("somebody sent us a message: " + ctx.message());
});
});
}
public void publishAst(Date timestamp, int step, String parseRule, Path diagramPath) {
System.err.println("publishing AST");
try {
asts.add(new AST(timestamp, step, parseRule, Files.readString(diagramPath)));
clients.keySet().forEach(session -> {
System.err.println("sending");
session.send(asts);
});
} catch (IOException e) {
System.err.println("Unable to read AST diagram file " + diagramPath);
e.printStackTrace();
}
}
public void publishContext() {
}
public static class AST {
public Date timestamp;
public int step;
public String parseRule;
public String diagram;
public AST(Date timestamp, int step, String parseRule, String diagram) {
this.timestamp = timestamp;
this.step = step;
this.parseRule = parseRule;
this.diagram = diagram;
}
}
}
...@@ -9,6 +9,7 @@ import java.io.IOException; ...@@ -9,6 +9,7 @@ import java.io.IOException;
import java.nio.file.Path; import java.nio.file.Path;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Arrays; import java.util.Arrays;
import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -41,7 +42,7 @@ public abstract class MotionGrammarParser<T extends MotionGrammarElement> { ...@@ -41,7 +42,7 @@ public abstract class MotionGrammarParser<T extends MotionGrammarElement> {
final String H_T = "F2D8AC"; final String H_T = "F2D8AC";
try { try {
Path svgPath = MotionGrammarConfig.astDiagramDir.resolve("AST-" + String.format("%03d", timeStep_) + "-" + new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss.SSS").format(new java.util.Date()) + "-" + step + ".svg");
Dumper.read(rootContainer_.getChild(0)) Dumper.read(rootContainer_.getChild(0))
.setBackgroundColorMethod(n -> (n == highlightNode ? (n instanceof Token ? H_T : H_N) : (n instanceof Token ? N_T : N_N))) .setBackgroundColorMethod(n -> (n == highlightNode ? (n instanceof Token ? H_T : H_N) : (n instanceof Token ? N_T : N_N)))
.includeChildWhen((parentNode, childNode, contextName) -> !(parentNode instanceof Token)) .includeChildWhen((parentNode, childNode, contextName) -> !(parentNode instanceof Token))
...@@ -64,7 +65,9 @@ public abstract class MotionGrammarParser<T extends MotionGrammarElement> { ...@@ -64,7 +65,9 @@ public abstract class MotionGrammarParser<T extends MotionGrammarElement> {
.customPreamble("title " + step) .customPreamble("title " + step)
.skinParam(SkinParamBooleanSetting.Shadowing, false) .skinParam(SkinParamBooleanSetting.Shadowing, false)
.skinParam(SkinParamStringSetting.backgroundColor, "white") .skinParam(SkinParamStringSetting.backgroundColor, "white")
.dumpAsSVG(svgPath)
.dumpAsPNG(MotionGrammarConfig.astDiagramDir.resolve("AST-" + String.format("%03d", timeStep_) + "-" + new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss.SSS").format(new java.util.Date()) + "-" + step + ".png")); .dumpAsPNG(MotionGrammarConfig.astDiagramDir.resolve("AST-" + String.format("%03d", timeStep_) + "-" + new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss.SSS").format(new java.util.Date()) + "-" + step + ".png"));
DiagramProvider.getInstance().publishAst(new Date(), timeStep_, step, svgPath);
timeStep_++; timeStep_++;
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
......
...@@ -3,6 +3,7 @@ package de.tudresden.inf.st.mg; ...@@ -3,6 +3,7 @@ package de.tudresden.inf.st.mg;
import de.tudresden.inf.st.mg.common.MotionGrammarParser; import de.tudresden.inf.st.mg.common.MotionGrammarParser;
import de.tudresden.inf.st.mg.jastadd.model.*; import de.tudresden.inf.st.mg.jastadd.model.*;
import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import java.io.File; import java.io.File;
...@@ -36,6 +37,7 @@ public class ParserTest { ...@@ -36,6 +37,7 @@ public class ParserTest {
} }
@Test @Test
@Disabled
void runLodUnloadParser() throws MotionGrammarParser.ParseException { void runLodUnloadParser() throws MotionGrammarParser.ParseException {
// for some reason, the best random seed value here is 1 and not 0??? // for some reason, the best random seed value here is 1 and not 0???
...@@ -63,6 +65,11 @@ public class ParserTest { ...@@ -63,6 +65,11 @@ public class ParserTest {
var result = parser.parse(); var result = parser.parse();
assertThat(result).isNotNull().isInstanceOf(Tidy.class); assertThat(result).isNotNull().isInstanceOf(Tidy.class);
try {
Thread.sleep(100000*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment