From 3405dee26a227f495d3c00ac7feebb76ab982b96 Mon Sep 17 00:00:00 2001 From: Huell Date: Wed, 21 May 2025 11:03:51 +0200 Subject: [PATCH 01/11] WIP --- .../standalone/analysis/Converter.java | 64 ++++++++++++++----- 1 file changed, 47 insertions(+), 17 deletions(-) diff --git a/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/analysis/Converter.java b/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/analysis/Converter.java index bf79a40..7f3b5ab 100644 --- a/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/analysis/Converter.java +++ b/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/analysis/Converter.java @@ -6,6 +6,11 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.awt.Color; +import java.nio.charset.StandardCharsets; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; import org.apache.log4j.Level; import org.apache.log4j.Logger; @@ -154,7 +159,9 @@ private static List parseConstraints(WebEditorDfd webEditorD return webEditorDfd.constraints().stream() .filter(it -> it.constraint() != null && !it.constraint().isEmpty()) .map(it -> { - return AnalysisConstraint.fromString(new StringView(it.constraint())).getResult(); + var constraint = AnalysisConstraint.fromString(new StringView(it.constraint())).getResult(); + constraint.setName(it.name()); + return constraint; }).toList(); } @@ -176,20 +183,17 @@ private static List runAnalysis(DataFlowDiagramAndDictionary dfd, Lis } private static WebEditorDfd annotateViolations(WebEditorDfd webEditorDfd, List violations) { - Map nodeToAnnotationMap = new HashMap<>(); + Map> nodeToAnnotationMap = new HashMap<>(); for (int i = 0; i < violations.size(); i++) { - final int index = i; - violations.get(i).getMatchedVertices().stream().forEach(it -> { + var violation = violations.get(i); + violation.getMatchedVertices().stream().forEach(it -> { var node = webEditorDfd.model().children().stream() .filter(child -> child.id().equals(((Node)it.getReferencedElement()).getId())).findFirst().orElseThrow(); - var annotation = ""; + nodeToAnnotationMap.putIfAbsent(node, new ArrayList<>()); if (nodeToAnnotationMap.containsKey(node)) { - annotation = nodeToAnnotationMap.get(node); - annotation += "\n"; + nodeToAnnotationMap.get(node).add("Constraint " + violation.getName() + " violated"); } - annotation += "Constraint " + index + " violated"; - nodeToAnnotationMap.put(node, annotation); }); } @@ -197,23 +201,49 @@ private static WebEditorDfd annotateViolations(WebEditorDfd webEditorDfd, List { + annotations.add(new Annotation(annotation, "bolt", stringToColorHex(annotation))); + }); + - var annotation = new Annotation(builder.toString(), "bolt", "#ff0000"); - var newChild = new Child(child.text(), child.labels(), child.ports(), child.id(), child.type(), null, null,annotation, child.children()); + var newChild = new Child(child.text(), child.labels(), child.ports(), child.id(), child.type(), null, null, annotations, child.children()); newChildren.add(newChild); } } - webEditorDfd.model().children().removeAll(nodeToAnnotationMap.keySet()); + var nodesToRemove = new ArrayList(); + + nodeToAnnotationMap.keySet().forEach(node -> { + for (Child child : webEditorDfd.model().children()) { + if (child.id().equals(node.id())) { + nodesToRemove.add(child); + break; + } + } + }); + + webEditorDfd.model().children().removeAll(nodesToRemove); webEditorDfd.model().children().addAll(newChildren); return webEditorDfd; } - + public static String stringToColorHex(String input) { + byte[] hash; + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + hash = md.digest(input.getBytes(StandardCharsets.UTF_8)); + } catch (NoSuchAlgorithmException e) { + hash = new byte[] {(byte)0x80, (byte)0x80, (byte)0x80, 0}; + } + float hue = (hash[0] & 0xFF) / 255f; + float saturation = 0.5f + ((hash[1] & 0xFF) / 255f) * 0.5f; + float brightness = 0.3f + ((hash[2] & 0xFF) / 255f) * 0.5f; + saturation = Math.max(0.5f, Math.min(saturation, 1.0f)); + brightness = Math.max(0.3f, Math.min(brightness, 0.8f)); + Color color = Color.getHSBColor(hue, saturation, brightness); + return String.format("#%02X%02X%02X", color.getRed(), color.getGreen(), color.getBlue()); + } } From 327135d24b8d57f9113382731dab54a330faf13a Mon Sep 17 00:00:00 2001 From: Huell Date: Thu, 22 May 2025 14:29:23 +0200 Subject: [PATCH 02/11] Feat: Move analysis logic to converter --- .../standalone/analysis/Converter.java | 24 ++++++++----------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/analysis/Converter.java b/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/analysis/Converter.java index 7f3b5ab..8fdfe2c 100644 --- a/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/analysis/Converter.java +++ b/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/analysis/Converter.java @@ -113,13 +113,13 @@ public static WebEditorDfd analyzeAnnotate(WebEditorDfd webEditorDfd) { var webEditorconverter = new Web2DFDConverter(); var dd = webEditorconverter.convert(new WebEditorConverterModel(webEditorDfd)); var dfdConverter = new DFD2WebConverter(); - var newJson = dfdConverter.convert(dd).getModel(); - if (webEditorDfd.constraints() != null && !webEditorDfd.constraints().isEmpty()) { + if (webEditorDfd.constraints() != null && !webEditorDfd.constraints().isEmpty()) { var constraints = parseConstraints(webEditorDfd); - var violations = runAnalysis(dd, constraints); - newJson.constraints().addAll(webEditorDfd.constraints()); //Reapply constraints - return annotateViolations(newJson, violations); + dfdConverter.setConditions(constraints); } + var newJson = dfdConverter.convert(dd).getModel(); + if (webEditorDfd.constraints() != null && !webEditorDfd.constraints().isEmpty()) + newJson.constraints().addAll(webEditorDfd.constraints()); //Reapply constraints return newJson; } catch (Exception e) { e.printStackTrace(); @@ -183,7 +183,7 @@ private static List runAnalysis(DataFlowDiagramAndDictionary dfd, Lis } private static WebEditorDfd annotateViolations(WebEditorDfd webEditorDfd, List violations) { - Map> nodeToAnnotationMap = new HashMap<>(); + Map> nodeToAnnotationMap = new HashMap<>(); for (int i = 0; i < violations.size(); i++) { var violation = violations.get(i); @@ -191,9 +191,8 @@ private static WebEditorDfd annotateViolations(WebEditorDfd webEditorDfd, List child.id().equals(((Node)it.getReferencedElement()).getId())).findFirst().orElseThrow(); nodeToAnnotationMap.putIfAbsent(node, new ArrayList<>()); - if (nodeToAnnotationMap.containsKey(node)) { - nodeToAnnotationMap.get(node).add("Constraint " + violation.getName() + " violated"); - } + String message = "Constraint " + violation.getName() + " violated"; + nodeToAnnotationMap.get(node).add(new Annotation(message, "bolt", stringToColorHex(message), violation.getTransposeFlowGraph().hashCode())); }); } @@ -202,11 +201,8 @@ private static WebEditorDfd annotateViolations(WebEditorDfd webEditorDfd, List { - annotations.add(new Annotation(annotation, "bolt", stringToColorHex(annotation))); - }); - + annotations.addAll(nodeToAnnotationMap.get(child)); var newChild = new Child(child.text(), child.labels(), child.ports(), child.id(), child.type(), null, null, annotations, child.children()); newChildren.add(newChild); @@ -230,7 +226,7 @@ private static WebEditorDfd annotateViolations(WebEditorDfd webEditorDfd, List Date: Mon, 16 Jun 2025 12:29:36 +0200 Subject: [PATCH 03/11] Feat: Replace/Remove sysout with logger, Add more informative error handling --- .../META-INF/MANIFEST.MF | 6 +- .../standalone/analysis/Converter.java | 318 ++++++------------ .../websocket/WebSocketServerHandler.java | 50 ++- .../websocket/WebSocketServerUtils.java | 1 - ...alone.targetplatform.targetplatform.target | 9 - 5 files changed, 134 insertions(+), 250 deletions(-) diff --git a/bundles/org.dataflowanalysis.standalone/META-INF/MANIFEST.MF b/bundles/org.dataflowanalysis.standalone/META-INF/MANIFEST.MF index 91f5849..7dc618d 100644 --- a/bundles/org.dataflowanalysis.standalone/META-INF/MANIFEST.MF +++ b/bundles/org.dataflowanalysis.standalone/META-INF/MANIFEST.MF @@ -25,7 +25,11 @@ Require-Bundle: org.dataflowanalysis.dfd.datadictionary;bundle-version="2.0.0", org.dataflowanalysis.pcm.extension.nodecharacteristics;bundle-version="0.1.0", org.dataflowanalysis.analysis.pcm, org.palladiosimulator.commons.stoex;bundle-version="5.2.1", - de.uka.ipd.sdq.stoex.analyser;bundle-version="5.2.1" + de.uka.ipd.sdq.stoex.analyser;bundle-version="5.2.1", + com.fasterxml.jackson.core.jackson-core;bundle-version="2.13.2", + com.fasterxml.jackson.core.jackson-annotations;bundle-version="2.13.2", + com.fasterxml.jackson.core.jackson-databind;bundle-version="2.13.2", + org.apache.log4j;bundle-version="1.2.24" Automatic-Module-Name: DataFlowAnalalysisStandalone Bundle-RequiredExecutionEnvironment: JavaSE-17 Export-Package: diff --git a/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/analysis/Converter.java b/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/analysis/Converter.java index 8fdfe2c..1d56b5b 100644 --- a/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/analysis/Converter.java +++ b/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/analysis/Converter.java @@ -1,24 +1,13 @@ package org.dataflowanalysis.standalone.analysis; import java.io.File; +import java.io.IOException; import java.nio.file.Files; -import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import java.awt.Color; -import java.nio.charset.StandardCharsets; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; - -import org.apache.log4j.Level; import org.apache.log4j.Logger; -import org.dataflowanalysis.analysis.dfd.DFDDataFlowAnalysisBuilder; -import org.dataflowanalysis.analysis.dfd.resource.DFDModelResourceProvider; import org.dataflowanalysis.analysis.dfd.simple.DFDSimpleTransposeFlowGraphFinder; import org.dataflowanalysis.analysis.dsl.AnalysisConstraint; -import org.dataflowanalysis.analysis.dsl.result.DSLResult; import org.dataflowanalysis.analysis.utils.StringView; import org.dataflowanalysis.converter.dfd2web.DataFlowDiagramAndDictionary; import org.dataflowanalysis.converter.dfd2web.DFD2WebConverter; @@ -27,12 +16,9 @@ import org.dataflowanalysis.converter.web2dfd.Web2DFDConverter; import org.dataflowanalysis.converter.web2dfd.WebEditorConverterModel; import org.dataflowanalysis.converter.web2dfd.model.WebEditorDfd; -import org.dataflowanalysis.converter.web2dfd.model.Child; -import org.dataflowanalysis.converter.web2dfd.model.Annotation; import org.dataflowanalysis.dfd.datadictionary.DataDictionary; import org.dataflowanalysis.dfd.datadictionary.datadictionaryPackage; import org.dataflowanalysis.dfd.dataflowdiagram.DataFlowDiagram; -import org.dataflowanalysis.dfd.dataflowdiagram.Node; import org.dataflowanalysis.dfd.dataflowdiagram.dataflowdiagramPackage; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.resource.Resource; @@ -42,204 +28,112 @@ import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl; public class Converter { - - private static final Logger logger = Logger.getLogger(AnalysisConstraint.class); - - /** - * Convertes a DFD from the Ecore to the WebEditor Json representation - * @param dfd File where DFD is saved - * @param dd File where DD is saved - * @return Created WebEditor Json representation - */ - public static WebEditorDfd convertDFD(File dfd, File dd){ - try { - var converter = new DFD2WebConverter(); - - ResourceSet rs = new ResourceSetImpl(); - rs.getResourceFactoryRegistry().getExtensionToFactoryMap().put(Resource.Factory.Registry.DEFAULT_EXTENSION, new XMIResourceFactoryImpl()); - rs.getPackageRegistry().put(dataflowdiagramPackage.eNS_URI, dataflowdiagramPackage.eINSTANCE); - rs.getPackageRegistry().put(datadictionaryPackage.eNS_URI, datadictionaryPackage.eINSTANCE); + + private static final Logger logger = Logger.getLogger(Converter.class); - Resource ddResource = rs.getResource(URI.createFileURI(dd.toString()), true); - Resource dfdResource = rs.getResource(URI.createFileURI(dfd.toString()), true); - System.out.println(dd.toString()); - System.out.println(dfd.toString()); - EcoreUtil.resolveAll(rs); - EcoreUtil.resolveAll(ddResource); - EcoreUtil.resolveAll(dfdResource); - DataFlowDiagramAndDictionary dfdAndDD = new DataFlowDiagramAndDictionary((DataFlowDiagram)dfdResource.getContents().get(0), (DataDictionary)ddResource.getContents().get(0)); - - var newJson = converter.convert(dfdAndDD); - - return newJson.getModel(); - - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - - /** - * Convertes a Model in PCM representation into a WebEditor Json represenation - * @param usageModelFile File where Usage Model is saved - * @param allocationModelFile File where Allocation Model is saved - * @param nodeCharacteristicsFile File where Node Characteristics Model is saved - * @return Created WebEditor Json representation - */ - public static WebEditorDfd convertPCM(File usageModelFile, File allocationModelFile, File nodeCharacteristicsFile){ - try { - var converter = new PCM2DFDConverter(); - var dfd = converter.convert(new PCMConverterModel(usageModelFile.toString(), allocationModelFile.toString(), nodeCharacteristicsFile.toString())); - - - var dfdConverter = new DFD2WebConverter(); - dfdConverter.setTransposeFlowGraphFinder(DFDSimpleTransposeFlowGraphFinder.class); - return dfdConverter.convert(dfd).getModel(); - - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - - /** - * Analyzes a Model in WebEditor Json Representation and returns the analyzed Model - * @param webEditorDfd Model to be analyzed - * @return Analyzed Model - */ - public static WebEditorDfd analyzeAnnotate(WebEditorDfd webEditorDfd) { - try { - var webEditorconverter = new Web2DFDConverter(); - var dd = webEditorconverter.convert(new WebEditorConverterModel(webEditorDfd)); - var dfdConverter = new DFD2WebConverter(); - if (webEditorDfd.constraints() != null && !webEditorDfd.constraints().isEmpty()) { - var constraints = parseConstraints(webEditorDfd); - dfdConverter.setConditions(constraints); - } - var newJson = dfdConverter.convert(dd).getModel(); - if (webEditorDfd.constraints() != null && !webEditorDfd.constraints().isEmpty()) - newJson.constraints().addAll(webEditorDfd.constraints()); //Reapply constraints - return newJson; - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - - /** - * Converts a model in WebEditor Json representation into the DFD metamodel representation and return the DFD files as a concatenated string - * @param webEditorDfd model in WebEditor Json representation to be converted - * @param name Name of the files to be created - * @return Concatenation of DFD and DD files as string - */ - public static String convertToDFDandStringify(WebEditorDfd webEditorDfd, String name) { - try { - var converter = new Web2DFDConverter(); - var dfd = converter.convert(new WebEditorConverterModel(webEditorDfd)); - String tempDir = System.getProperty("java.io.tmpdir"); - var dfdFile = new File(tempDir, name + ".dataflowdiagram"); - var ddFile = new File(tempDir, name + ".datadictionary"); - dfd.save(dfdFile.getParent(), name); - - String dfdContent = Files.readString(dfdFile.toPath()); - String ddContent = Files.readString(ddFile.toPath()); + /** + * Convertes a DFD from the Ecore to the WebEditor Json representation + * @param dfd File where DFD is saved + * @param dd File where DD is saved + * @return Created WebEditor Json representation + */ + public static WebEditorDfd convertDFD(File dfd, File dd){ + var converter = new DFD2WebConverter(); + + ResourceSet rs = new ResourceSetImpl(); + rs.getResourceFactoryRegistry().getExtensionToFactoryMap().put(Resource.Factory.Registry.DEFAULT_EXTENSION, new XMIResourceFactoryImpl()); + rs.getPackageRegistry().put(dataflowdiagramPackage.eNS_URI, dataflowdiagramPackage.eINSTANCE); + rs.getPackageRegistry().put(datadictionaryPackage.eNS_URI, datadictionaryPackage.eINSTANCE); - dfdFile.delete(); - ddFile.delete(); - return dfdContent + "\n" + ddContent; - - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - private static List parseConstraints(WebEditorDfd webEditorDfd) { - return webEditorDfd.constraints().stream() - .filter(it -> it.constraint() != null && !it.constraint().isEmpty()) - .map(it -> { - var constraint = AnalysisConstraint.fromString(new StringView(it.constraint())).getResult(); - constraint.setName(it.name()); - return constraint; - }).toList(); - } - - private static List runAnalysis(DataFlowDiagramAndDictionary dfd, List constraints) { - var analysis = new DFDDataFlowAnalysisBuilder() - .standalone() - .modelProjectName(" ") - .useCustomResourceProvider(new DFDModelResourceProvider(dfd.dataDictionary(), dfd.dataFlowDiagram())) - .build(); - + Resource ddResource = rs.getResource(URI.createFileURI(dd.toString()), true); + Resource dfdResource = rs.getResource(URI.createFileURI(dfd.toString()), true); + EcoreUtil.resolveAll(rs); + EcoreUtil.resolveAll(ddResource); + EcoreUtil.resolveAll(dfdResource); + DataFlowDiagramAndDictionary dfdAndDD = new DataFlowDiagramAndDictionary((DataFlowDiagram)dfdResource.getContents().get(0), (DataDictionary)ddResource.getContents().get(0)); + + var newJson = converter.convert(dfdAndDD); + + return newJson.getModel(); + } + + + /** + * Convertes a Model in PCM representation into a WebEditor Json represenation + * @param usageModelFile File where Usage Model is saved + * @param allocationModelFile File where Allocation Model is saved + * @param nodeCharacteristicsFile File where Node Characteristics Model is saved + * @return Created WebEditor Json representation + */ + public static WebEditorDfd convertPCM(File usageModelFile, File allocationModelFile, File nodeCharacteristicsFile){ + var converter = new PCM2DFDConverter(); + var dfd = converter.convert(new PCMConverterModel(usageModelFile.toString(), allocationModelFile.toString(), nodeCharacteristicsFile.toString())); + + + var dfdConverter = new DFD2WebConverter(); + dfdConverter.setTransposeFlowGraphFinder(DFDSimpleTransposeFlowGraphFinder.class); + return dfdConverter.convert(dfd).getModel(); + } + + /** + * Analyzes a Model in WebEditor Json Representation and returns the analyzed Model + * @param webEditorDfd Model to be analyzed + * @return Analyzed Model + */ + public static WebEditorDfd analyzeAnnotate(WebEditorDfd webEditorDfd) { + var webEditorconverter = new Web2DFDConverter(); + var dd = webEditorconverter.convert(new WebEditorConverterModel(webEditorDfd)); + var dfdConverter = new DFD2WebConverter(); + if (webEditorDfd.constraints() != null && !webEditorDfd.constraints().isEmpty()) { + var constraints = parseConstraints(webEditorDfd); + dfdConverter.setConditions(constraints); + } + var newJson = dfdConverter.convert(dd).getModel(); + if (webEditorDfd.constraints() != null && !webEditorDfd.constraints().isEmpty()) + newJson.constraints().addAll(webEditorDfd.constraints()); //Reapply constraints + return newJson; + } + + /** + * Converts a model in WebEditor Json representation into the DFD metamodel representation and return the DFD files as a concatenated string + * @param webEditorDfd model in WebEditor Json representation to be converted + * @param name Name of the files to be created + * @return Concatenation of DFD and DD files as string + */ + public static String convertToDFDandStringify(WebEditorDfd webEditorDfd, String name) { + try { + var converter = new Web2DFDConverter(); + var dfd = converter.convert(new WebEditorConverterModel(webEditorDfd)); + String tempDir = System.getProperty("java.io.tmpdir"); + var dfdFile = new File(tempDir, name + ".dataflowdiagram"); + var ddFile = new File(tempDir, name + ".datadictionary"); + dfd.save(dfdFile.getParent(), name); + + String dfdContent = Files.readString(dfdFile.toPath()); + String ddContent = Files.readString(ddFile.toPath()); - logger.setLevel(Level.DEBUG); - - var tfg = analysis.findFlowGraphs(); - tfg.evaluate(); - - - return constraints.stream().flatMap(it -> it.findViolations(tfg).stream()).toList(); - } - - private static WebEditorDfd annotateViolations(WebEditorDfd webEditorDfd, List violations) { - Map> nodeToAnnotationMap = new HashMap<>(); - - for (int i = 0; i < violations.size(); i++) { - var violation = violations.get(i); - violation.getMatchedVertices().stream().forEach(it -> { - var node = webEditorDfd.model().children().stream() - .filter(child -> child.id().equals(((Node)it.getReferencedElement()).getId())).findFirst().orElseThrow(); - nodeToAnnotationMap.putIfAbsent(node, new ArrayList<>()); - String message = "Constraint " + violation.getName() + " violated"; - nodeToAnnotationMap.get(node).add(new Annotation(message, "bolt", stringToColorHex(message), violation.getTransposeFlowGraph().hashCode())); - }); - } - - List newChildren = new ArrayList<>(); - - for (Child child : webEditorDfd.model().children()) { - if (nodeToAnnotationMap.containsKey(child)) { - var annotations = child.annotations(); - - annotations.addAll(nodeToAnnotationMap.get(child)); - - var newChild = new Child(child.text(), child.labels(), child.ports(), child.id(), child.type(), null, null, annotations, child.children()); - newChildren.add(newChild); - } - } - - var nodesToRemove = new ArrayList(); - - nodeToAnnotationMap.keySet().forEach(node -> { - for (Child child : webEditorDfd.model().children()) { - if (child.id().equals(node.id())) { - nodesToRemove.add(child); - break; - } - } - }); - - webEditorDfd.model().children().removeAll(nodesToRemove); - webEditorDfd.model().children().addAll(newChildren); - - return webEditorDfd; - } - - private static String stringToColorHex(String input) { - byte[] hash; - try { - MessageDigest md = MessageDigest.getInstance("MD5"); - hash = md.digest(input.getBytes(StandardCharsets.UTF_8)); - } catch (NoSuchAlgorithmException e) { - hash = new byte[] {(byte)0x80, (byte)0x80, (byte)0x80, 0}; - } - float hue = (hash[0] & 0xFF) / 255f; - float saturation = 0.5f + ((hash[1] & 0xFF) / 255f) * 0.5f; - float brightness = 0.3f + ((hash[2] & 0xFF) / 255f) * 0.5f; - saturation = Math.max(0.5f, Math.min(saturation, 1.0f)); - brightness = Math.max(0.3f, Math.min(brightness, 0.8f)); - Color color = Color.getHSBColor(hue, saturation, brightness); - return String.format("#%02X%02X%02X", color.getRed(), color.getGreen(), color.getBlue()); - } + dfdFile.delete(); + ddFile.delete(); + return dfdContent + "\n" + ddContent; + + } catch (IOException e) { + e.printStackTrace(); + return "Error"; + } + } + + private static List parseConstraints(WebEditorDfd webEditorDfd) { + return webEditorDfd.constraints().stream() + .filter(it -> it.constraint() != null && !it.constraint().isEmpty()) + .map(it -> { + StringView string = new StringView("- " + it.name() + ": " + it.constraint()); + var constraint = AnalysisConstraint.fromString(string); + if (constraint.failed()) { + logger.error(constraint.getError()); + throw new IllegalArgumentException("Unable to parse constraint: " + it.name()); + } + var constraint2 = constraint.getResult(); + return constraint2; + }).toList(); + } } diff --git a/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/websocket/WebSocketServerHandler.java b/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/websocket/WebSocketServerHandler.java index 4891e02..9820d66 100644 --- a/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/websocket/WebSocketServerHandler.java +++ b/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/websocket/WebSocketServerHandler.java @@ -4,6 +4,8 @@ import java.io.IOException; import java.util.Map; import java.util.HashMap; + +import org.apache.log4j.Logger; import org.dataflowanalysis.converter.web2dfd.model.WebEditorDfd; import org.dataflowanalysis.standalone.analysis.Converter; import org.eclipse.jetty.websocket.api.Session; @@ -17,6 +19,7 @@ public class WebSocketServerHandler extends WebSocketAdapter { private static Map sessions = new HashMap<>(); private static int index = 0; + private final Logger logger = Logger.getLogger(WebSocketServerHandler.class); /** * Assigns an ID for identification on websocket connection @@ -26,7 +29,7 @@ public class WebSocketServerHandler extends WebSocketAdapter public void onWebSocketConnect(Session sess) { super.onWebSocketConnect(sess); - System.out.println("WS connection established"); + logger.info("WS connection established"); sessions.put(index, sess); try { @@ -48,13 +51,15 @@ public void onWebSocketText(String message) var analysisThread = new Thread(() -> { var id = Integer.parseInt(message.split(":")[0]); String returnMessage = handleIncomingMessage(id, message.substring(message.indexOf(":")+1)); - if (returnMessage != null) { + try { - sessions.get(id).getRemote().sendString(returnMessage); + if (!returnMessage.endsWith("null")) sessions.get(id).getRemote().sendString(returnMessage); + else {sessions.get(id).getRemote().sendString("Error: Unknown Error"); + } } catch (IOException e) { - e.printStackTrace(); + e.printStackTrace(); } - } + }); analysisThread.start(); } @@ -72,19 +77,10 @@ public void onWebSocketError(Throwable cause) cause.printStackTrace(System.err); } - public static void shutDownFrontend() { - for (var sess : sessions.values()) { - try { - sess.getRemote().sendString("Shutdown"); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - private String handleIncomingMessage(int id, String message) { - System.out.println(message); - System.out.println("Message received"); + logger.info("Message received"); + logger.debug(message); + var objectMapper = new ObjectMapper(); WebEditorDfd newJson = null; @@ -113,16 +109,16 @@ else if (message.startsWith("DFD:")) { try { return name + ":" + objectMapper.writeValueAsString(newJson); } catch (JsonProcessingException e) { - return null; + return "Error:" + " Unable to read Json"; } } - private WebEditorDfd deserializeJsonAndAnnotate(String json) throws IllegalArgumentException{ + private WebEditorDfd deserializeJsonAndAnnotate(String json){ var objectMapper = new ObjectMapper(); WebEditorDfd webEditorDfd; try { webEditorDfd = objectMapper.readValue(json, WebEditorDfd.class); - } catch (Exception e) { + } catch (IOException e) { e.printStackTrace(); throw new IllegalArgumentException("Invalid Json Model"); } @@ -131,12 +127,12 @@ private WebEditorDfd deserializeJsonAndAnnotate(String json) throws IllegalArgum return Converter.analyzeAnnotate(webEditorDfd); } - private WebEditorDfd deserializeJson(String json) throws IllegalArgumentException { + private WebEditorDfd deserializeJson(String json){ var objectMapper = new ObjectMapper(); WebEditorDfd webEditorDfd; try { webEditorDfd = objectMapper.readValue(json, WebEditorDfd.class); - } catch (Exception e) { + } catch (IOException e) { e.printStackTrace(); throw new IllegalArgumentException("Invalid Json Model"); } @@ -153,9 +149,9 @@ private WebEditorDfd safeLoadAndConvertDFDString(String message, String name) { var dfd = createAndWriteTempFile(name + ".dataflowdiagram", dfdMessage); var dd = createAndWriteTempFile(name + ".datadictionary", ddMessage); return Converter.convertDFD(dfd, dd); - } catch (Exception e) { - e.printStackTrace(); - return null; + } catch (IOException e) { + e.printStackTrace(); + throw new IllegalArgumentException("Invalid DFD Model"); } } @@ -188,9 +184,9 @@ private WebEditorDfd safeLoadAndConvertPCMString(String message) { } } return Converter.convertPCM(usageModelFile, allocationFile, nodeCharacteristicsFile); - } catch (Exception e) { + } catch (IOException e) { e.printStackTrace(); - return null; + throw new IllegalArgumentException("Invalid PCM Model"); } } diff --git a/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/websocket/WebSocketServerUtils.java b/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/websocket/WebSocketServerUtils.java index bae1690..8018468 100644 --- a/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/websocket/WebSocketServerUtils.java +++ b/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/websocket/WebSocketServerUtils.java @@ -44,7 +44,6 @@ private static void startServer() { } catch (Exception e) { - // TODO Auto-generated catch block e.printStackTrace(); } } diff --git a/releng/org.dataflowanalysis.standalone.targetplatform/org.dataflowanalysis.standalone.targetplatform.targetplatform.target b/releng/org.dataflowanalysis.standalone.targetplatform/org.dataflowanalysis.standalone.targetplatform.targetplatform.target index b56c274..6d7d707 100644 --- a/releng/org.dataflowanalysis.standalone.targetplatform/org.dataflowanalysis.standalone.targetplatform.targetplatform.target +++ b/releng/org.dataflowanalysis.standalone.targetplatform/org.dataflowanalysis.standalone.targetplatform.targetplatform.target @@ -142,18 +142,9 @@ - - - - - - - - - \ No newline at end of file From 8cb5534a6389492f78906f90c36711e772ce43f9 Mon Sep 17 00:00:00 2001 From: Huell Date: Thu, 3 Jul 2025 13:21:15 +0200 Subject: [PATCH 04/11] Feat: Allow preservation of layout --- .../standalone/analysis/Converter.java | 11 ++++++++--- .../standalone/websocket/WebSocketServerHandler.java | 2 ++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/analysis/Converter.java b/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/analysis/Converter.java index 1d56b5b..cb726aa 100644 --- a/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/analysis/Converter.java +++ b/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/analysis/Converter.java @@ -89,9 +89,14 @@ public static WebEditorDfd analyzeAnnotate(WebEditorDfd webEditorDfd) { dfdConverter.setConditions(constraints); } var newJson = dfdConverter.convert(dd).getModel(); - if (webEditorDfd.constraints() != null && !webEditorDfd.constraints().isEmpty()) - newJson.constraints().addAll(webEditorDfd.constraints()); //Reapply constraints - return newJson; + + for (var child : newJson.model().children()) { + if (child.type().startsWith("node") && child.annotations() != null) { + var oldNode = webEditorDfd.model().children().stream().filter(node -> node.id().equals(child.id())).findAny().orElseThrow(); + oldNode.annotations().addAll(child.annotations()); + } + } + return webEditorDfd; } /** diff --git a/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/websocket/WebSocketServerHandler.java b/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/websocket/WebSocketServerHandler.java index 9820d66..20e6b38 100644 --- a/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/websocket/WebSocketServerHandler.java +++ b/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/websocket/WebSocketServerHandler.java @@ -5,6 +5,7 @@ import java.util.Map; import java.util.HashMap; +import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.dataflowanalysis.converter.web2dfd.model.WebEditorDfd; import org.dataflowanalysis.standalone.analysis.Converter; @@ -78,6 +79,7 @@ public void onWebSocketError(Throwable cause) } private String handleIncomingMessage(int id, String message) { + logger.setLevel(Level.DEBUG); logger.info("Message received"); logger.debug(message); From 109609aec52d6405f4fbb26413f3f94b392cf45e Mon Sep 17 00:00:00 2001 From: Huell Date: Thu, 3 Jul 2025 13:38:41 +0200 Subject: [PATCH 05/11] Fix: Remove old non custom annotations --- .../org/dataflowanalysis/standalone/analysis/Converter.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/analysis/Converter.java b/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/analysis/Converter.java index cb726aa..fcc4bbc 100644 --- a/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/analysis/Converter.java +++ b/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/analysis/Converter.java @@ -93,6 +93,9 @@ public static WebEditorDfd analyzeAnnotate(WebEditorDfd webEditorDfd) { for (var child : newJson.model().children()) { if (child.type().startsWith("node") && child.annotations() != null) { var oldNode = webEditorDfd.model().children().stream().filter(node -> node.id().equals(child.id())).findAny().orElseThrow(); + //Necessary if ugly if we want to preserver custom annotations + var annotationsToRemove = oldNode.annotations().stream().filter(a -> a.message().startsWith("Propagated") || a.message().startsWith("Incoming") || a.message().startsWith("Constraint")).toList(); + oldNode.annotations().removeAll(annotationsToRemove); oldNode.annotations().addAll(child.annotations()); } } From fe6263c0d0f9d794f98e689c39190ba4a7431e08 Mon Sep 17 00:00:00 2001 From: Huell Date: Mon, 7 Jul 2025 12:29:41 +0200 Subject: [PATCH 06/11] Fix: DFD loading bug --- .../standalone/websocket/WebSocketServerHandler.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/websocket/WebSocketServerHandler.java b/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/websocket/WebSocketServerHandler.java index 20e6b38..47ec1f6 100644 --- a/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/websocket/WebSocketServerHandler.java +++ b/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/websocket/WebSocketServerHandler.java @@ -100,7 +100,7 @@ else if (message.startsWith("Json2DFD:")) { return name + ":" + Converter.convertToDFDandStringify(webEditorDfd, name); } else if (message.startsWith("DFD:")) { - newJson = safeLoadAndConvertDFDString(message, name); + newJson = safeLoadAndConvertDFDString(message); } else { newJson = safeLoadAndConvertPCMString(message); } @@ -143,8 +143,10 @@ private WebEditorDfd deserializeJson(String json){ return webEditorDfd; } - private WebEditorDfd safeLoadAndConvertDFDString(String message, String name) { + private WebEditorDfd safeLoadAndConvertDFDString(String message) { message = message.replaceFirst("DFD:", ""); + var name = message.split(":")[0]; + message = message.replaceFirst(name + ":", ""); var dfdMessage = message.split("\n:DD:\n")[0]; var ddMessage = message.split("\n:DD:\n")[1]; try { From 166f94c733c53e21a32265a64aa21e0ce7f5e83b Mon Sep 17 00:00:00 2001 From: Huell Date: Wed, 9 Jul 2025 11:26:49 +0200 Subject: [PATCH 07/11] Adjust target platform --- ...wanalysis.standalone.targetplatform.targetplatform.target | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/releng/org.dataflowanalysis.standalone.targetplatform/org.dataflowanalysis.standalone.targetplatform.targetplatform.target b/releng/org.dataflowanalysis.standalone.targetplatform/org.dataflowanalysis.standalone.targetplatform.targetplatform.target index 6d7d707..dc69b79 100644 --- a/releng/org.dataflowanalysis.standalone.targetplatform/org.dataflowanalysis.standalone.targetplatform.targetplatform.target +++ b/releng/org.dataflowanalysis.standalone.targetplatform/org.dataflowanalysis.standalone.targetplatform.targetplatform.target @@ -144,7 +144,10 @@ - + + + + \ No newline at end of file From 6ade755e7604faea558128ebe409dbc806351369 Mon Sep 17 00:00:00 2001 From: Huell Date: Mon, 14 Jul 2025 12:03:17 +0200 Subject: [PATCH 08/11] Feat: Edit targetplatform --- ...alysis.standalone.targetplatform.targetplatform.target | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/releng/org.dataflowanalysis.standalone.targetplatform/org.dataflowanalysis.standalone.targetplatform.targetplatform.target b/releng/org.dataflowanalysis.standalone.targetplatform/org.dataflowanalysis.standalone.targetplatform.targetplatform.target index dc69b79..c8d6ef0 100644 --- a/releng/org.dataflowanalysis.standalone.targetplatform/org.dataflowanalysis.standalone.targetplatform.targetplatform.target +++ b/releng/org.dataflowanalysis.standalone.targetplatform/org.dataflowanalysis.standalone.targetplatform.targetplatform.target @@ -144,10 +144,10 @@ - - - - + + + + \ No newline at end of file From f7f684bea6be608b2f2ec93790235ff4c9968d96 Mon Sep 17 00:00:00 2001 From: Huell Date: Mon, 14 Jul 2025 12:20:54 +0200 Subject: [PATCH 09/11] =?UTF-8?q?Fix:=20Remove=20newlines=20from=20constra?= =?UTF-8?q?ints=20for=20parsing=C2=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/org/dataflowanalysis/standalone/analysis/Converter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/analysis/Converter.java b/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/analysis/Converter.java index fcc4bbc..745ce7f 100644 --- a/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/analysis/Converter.java +++ b/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/analysis/Converter.java @@ -134,7 +134,7 @@ private static List parseConstraints(WebEditorDfd webEditorD return webEditorDfd.constraints().stream() .filter(it -> it.constraint() != null && !it.constraint().isEmpty()) .map(it -> { - StringView string = new StringView("- " + it.name() + ": " + it.constraint()); + StringView string = new StringView("- " + it.name() + ": " + it.constraint().replace("\n", "")); var constraint = AnalysisConstraint.fromString(string); if (constraint.failed()) { logger.error(constraint.getError()); From 463fc34a23bf4166009cd21c5dad92693d2ce568 Mon Sep 17 00:00:00 2001 From: Huell Date: Wed, 23 Jul 2025 11:05:53 +0200 Subject: [PATCH 10/11] Fix: Rename condition to constraint --- .../src/org/dataflowanalysis/standalone/analysis/Converter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/analysis/Converter.java b/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/analysis/Converter.java index 745ce7f..76f3c13 100644 --- a/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/analysis/Converter.java +++ b/bundles/org.dataflowanalysis.standalone/src/org/dataflowanalysis/standalone/analysis/Converter.java @@ -86,7 +86,7 @@ public static WebEditorDfd analyzeAnnotate(WebEditorDfd webEditorDfd) { var dfdConverter = new DFD2WebConverter(); if (webEditorDfd.constraints() != null && !webEditorDfd.constraints().isEmpty()) { var constraints = parseConstraints(webEditorDfd); - dfdConverter.setConditions(constraints); + dfdConverter.setConstraints(constraints); } var newJson = dfdConverter.convert(dd).getModel(); From b15d85dae5fa677d259d33aee851f99d76b493cb Mon Sep 17 00:00:00 2001 From: Huell Date: Thu, 24 Jul 2025 10:57:25 +0200 Subject: [PATCH 11/11] Fix: Target platform --- ...alysis.standalone.targetplatform.targetplatform.target | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/releng/org.dataflowanalysis.standalone.targetplatform/org.dataflowanalysis.standalone.targetplatform.targetplatform.target b/releng/org.dataflowanalysis.standalone.targetplatform/org.dataflowanalysis.standalone.targetplatform.targetplatform.target index c8d6ef0..6ddbef9 100644 --- a/releng/org.dataflowanalysis.standalone.targetplatform/org.dataflowanalysis.standalone.targetplatform.targetplatform.target +++ b/releng/org.dataflowanalysis.standalone.targetplatform/org.dataflowanalysis.standalone.targetplatform.targetplatform.target @@ -144,10 +144,10 @@ - - - - + + + + \ No newline at end of file