From ca1206602dc1d36ff1716e7a29fc8cd8ede9c1fd Mon Sep 17 00:00:00 2001 From: Thomas Francart Date: Wed, 21 Jul 2021 12:17:09 +0200 Subject: [PATCH] Fixes for ability to not draw arrows pointing to an empty box --- .../java/fr/sparna/rdf/shacl/diagram/Main.java | 4 ++-- .../rdf/shacl/diagram/PlantUmlRenderer.java | 4 ++-- .../rdf/shacl/diagram/ShaclPlantUmlWriter.java | 14 +++++++++----- .../rdf/shacl/doc/PlantUmlSourceGenerator.java | 12 +++++++++--- .../fr/sparna/rdf/shacl/doc/SVGGenerator.java | 6 +++--- .../java/fr/sparna/rdf/shacl/app/draw/Draw.java | 4 ++-- .../rdf/shacl/shaclplay/doc/DocController.java | 3 ++- .../rdf/shacl/shaclplay/draw/DrawController.java | 16 +++++++++++----- 8 files changed, 40 insertions(+), 23 deletions(-) diff --git a/shacl-diagram/src/main/java/fr/sparna/rdf/shacl/diagram/Main.java b/shacl-diagram/src/main/java/fr/sparna/rdf/shacl/diagram/Main.java index 448c7d2b..1a8b8b01 100644 --- a/shacl-diagram/src/main/java/fr/sparna/rdf/shacl/diagram/Main.java +++ b/shacl-diagram/src/main/java/fr/sparna/rdf/shacl/diagram/Main.java @@ -37,8 +37,8 @@ public static void main(String[] args) throws Exception { } - ShaclPlantUmlWriter writer = new ShaclPlantUmlWriter(true, false); - String output = writer.writeInPlantUml(shaclGraph,owlGraph,outExpandDiagram); + ShaclPlantUmlWriter writer = new ShaclPlantUmlWriter(true, false, outExpandDiagram); + String output = writer.writeInPlantUml(shaclGraph,owlGraph); String outputDirectory ="C:/Temp" ; //args[1]; diff --git a/shacl-diagram/src/main/java/fr/sparna/rdf/shacl/diagram/PlantUmlRenderer.java b/shacl-diagram/src/main/java/fr/sparna/rdf/shacl/diagram/PlantUmlRenderer.java index 87955e87..982f6bd4 100644 --- a/shacl-diagram/src/main/java/fr/sparna/rdf/shacl/diagram/PlantUmlRenderer.java +++ b/shacl-diagram/src/main/java/fr/sparna/rdf/shacl/diagram/PlantUmlRenderer.java @@ -232,14 +232,14 @@ public String renderDefault(PlantUmlProperty property, String boxName) { return output; } - public String renderNodeShape(PlantUmlBox box, List GlobalBox, boolean outExpandDiagram) { + public String renderNodeShape(PlantUmlBox box, List GlobalBox, boolean avoidArrowsToEmptyBoxes) { // String declaration = "Class"+" // "+"\""+box.getNameshape()+"\""+((box.getNametargetclass() != null)?" // "+"<"+box.getNametargetclass()+">":""); String declaration = ""; // Array for control inverse - if (outExpandDiagram) { + if (avoidArrowsToEmptyBoxes) { if (box.getProperties().size() > 0) { declaration = "Class" + " " + "\"" + box.getLabel() + "\""; diff --git a/shacl-diagram/src/main/java/fr/sparna/rdf/shacl/diagram/ShaclPlantUmlWriter.java b/shacl-diagram/src/main/java/fr/sparna/rdf/shacl/diagram/ShaclPlantUmlWriter.java index e2322ce5..642212f1 100644 --- a/shacl-diagram/src/main/java/fr/sparna/rdf/shacl/diagram/ShaclPlantUmlWriter.java +++ b/shacl-diagram/src/main/java/fr/sparna/rdf/shacl/diagram/ShaclPlantUmlWriter.java @@ -6,10 +6,8 @@ import java.util.stream.Collectors; import org.apache.jena.rdf.model.Model; -import org.apache.jena.rdf.model.Property; import org.apache.jena.rdf.model.RDFNode; import org.apache.jena.rdf.model.Resource; -import org.apache.jena.vocabulary.OWL; import org.apache.jena.vocabulary.RDF; import org.topbraid.shacl.vocabulary.SH; @@ -17,14 +15,20 @@ public class ShaclPlantUmlWriter { protected boolean includeSubclassLinks = true; protected boolean generateAnchorHyperlink = false; + protected boolean avoidArrowsToEmptyBoxes = true; - public ShaclPlantUmlWriter(boolean includeSubclassLinks, boolean generateAnchorHyperlink) { + public ShaclPlantUmlWriter( + boolean includeSubclassLinks, + boolean generateAnchorHyperlink, + boolean avoidArrowsToEmptyBoxes + ) { super(); this.includeSubclassLinks = includeSubclassLinks; this.generateAnchorHyperlink = generateAnchorHyperlink; + this.avoidArrowsToEmptyBoxes = avoidArrowsToEmptyBoxes; } - public String writeInPlantUml(Model shaclGraph, Model owlGraph, boolean outExpandDiagram) { + public String writeInPlantUml(Model shaclGraph, Model owlGraph) { // read everything typed as NodeShape List nodeShapes = shaclGraph.listResourcesWithProperty(RDF.type, SH.NodeShape).toList(); @@ -95,7 +99,7 @@ public String writeInPlantUml(Model shaclGraph, Model owlGraph, boolean outExpan } for (PlantUmlBox plantUmlBox : plantUmlBoxes.stream().filter(b -> b.getPackageName().equals(aPackage)).collect(Collectors.toList())) { - sourceuml.append(renderer.renderNodeShape(plantUmlBox,plantUmlBoxes,outExpandDiagram)); + sourceuml.append(renderer.renderNodeShape(plantUmlBox,plantUmlBoxes,this.avoidArrowsToEmptyBoxes)); } if(!aPackage.equals("")) { diff --git a/shacl-doc/src/main/java/fr/sparna/rdf/shacl/doc/PlantUmlSourceGenerator.java b/shacl-doc/src/main/java/fr/sparna/rdf/shacl/doc/PlantUmlSourceGenerator.java index 80139cea..48dec931 100644 --- a/shacl-doc/src/main/java/fr/sparna/rdf/shacl/doc/PlantUmlSourceGenerator.java +++ b/shacl-doc/src/main/java/fr/sparna/rdf/shacl/doc/PlantUmlSourceGenerator.java @@ -9,18 +9,24 @@ public class PlantUmlSourceGenerator { - public String generatePlantUmlDiagram(Model shapesModel, Model owlModel, boolean subclasssOf,boolean Classlink, boolean outExpandDiagram) throws IOException { + public String generatePlantUmlDiagram( + Model shapesModel, + Model owlModel, + boolean subclasssOf, + boolean Classlink, + boolean avoidArrowsToEmptyBoxes + ) throws IOException { // draw - without subclasses links // set first parameter to true to draw subclassOf links - ShaclPlantUmlWriter writer = new ShaclPlantUmlWriter(subclasssOf, Classlink); + ShaclPlantUmlWriter writer = new ShaclPlantUmlWriter(subclasssOf, Classlink, avoidArrowsToEmptyBoxes); Model finalModel = ModelFactory.createDefaultModel(); finalModel.add(shapesModel); if(owlModel != null) { finalModel.add(owlModel); } //String plantUmlString = writer.writeInPlantUml(finalModel,,outExpandDiagram); - String plantUmlString = writer.writeInPlantUml(shapesModel,owlModel,outExpandDiagram); + String plantUmlString = writer.writeInPlantUml(shapesModel,owlModel); return plantUmlString; } diff --git a/shacl-doc/src/main/java/fr/sparna/rdf/shacl/doc/SVGGenerator.java b/shacl-doc/src/main/java/fr/sparna/rdf/shacl/doc/SVGGenerator.java index ca9246d6..86785c87 100644 --- a/shacl-doc/src/main/java/fr/sparna/rdf/shacl/doc/SVGGenerator.java +++ b/shacl-doc/src/main/java/fr/sparna/rdf/shacl/doc/SVGGenerator.java @@ -14,18 +14,18 @@ public class SVGGenerator { - public String generateSvgDiagram(Model shapesModel, Model owlModel,boolean outExpandDiagram) throws IOException { + public String generateSvgDiagram(Model shapesModel, Model owlModel,boolean avoidArrowsToEmptyBoxes) throws IOException { // draw - without subclasses links // set first parameter to true to draw subclassOf links - ShaclPlantUmlWriter writer = new ShaclPlantUmlWriter(true, true); + ShaclPlantUmlWriter writer = new ShaclPlantUmlWriter(true, true, avoidArrowsToEmptyBoxes); Model finalModel = ModelFactory.createDefaultModel(); finalModel.add(shapesModel); if(owlModel != null) { finalModel.add(owlModel); } //String plantUmlString = writer.writeInPlantUml(finalModel); - String plantUmlString = writer.writeInPlantUml(shapesModel,owlModel,outExpandDiagram); + String plantUmlString = writer.writeInPlantUml(shapesModel,owlModel); // System.out.println(plantUmlString); diff --git a/shacl-play-app/src/main/java/fr/sparna/rdf/shacl/app/draw/Draw.java b/shacl-play-app/src/main/java/fr/sparna/rdf/shacl/app/draw/Draw.java index a6658ff3..c474ec56 100644 --- a/shacl-play-app/src/main/java/fr/sparna/rdf/shacl/app/draw/Draw.java +++ b/shacl-play-app/src/main/java/fr/sparna/rdf/shacl/app/draw/Draw.java @@ -33,9 +33,9 @@ public void execute(Object args) throws Exception { InputModelReader.populateModel(shapesModel, a.getInput(), null); // draw - ShaclPlantUmlWriter writer = new ShaclPlantUmlWriter(a.isIncludeSubclasses(), false); + ShaclPlantUmlWriter writer = new ShaclPlantUmlWriter(a.isIncludeSubclasses(), false, true); // TODO : add parameter with OWL file - String plantUmlString = writer.writeInPlantUml(shapesModel, ModelFactory.createDefaultModel(), false); + String plantUmlString = writer.writeInPlantUml(shapesModel, ModelFactory.createDefaultModel()); for(File outputFile : a.getOutput()) { diff --git a/shacl-play/src/main/java/fr/sparna/rdf/shacl/shaclplay/doc/DocController.java b/shacl-play/src/main/java/fr/sparna/rdf/shacl/shaclplay/doc/DocController.java index cdeb7565..8fcd5ca7 100644 --- a/shacl-play/src/main/java/fr/sparna/rdf/shacl/shaclplay/doc/DocController.java +++ b/shacl-play/src/main/java/fr/sparna/rdf/shacl/shaclplay/doc/DocController.java @@ -167,7 +167,8 @@ protected void doOutputDoc( ShapesDocumentationReaderIfc reader = new ShapesDocumentationModelReader(true); ShapesDocumentation doc = reader.readShapesDocumentation( shapesModel, - null, + // OWL graph + ModelFactory.createDefaultModel(), "en", filename, false diff --git a/shacl-play/src/main/java/fr/sparna/rdf/shacl/shaclplay/draw/DrawController.java b/shacl-play/src/main/java/fr/sparna/rdf/shacl/shaclplay/draw/DrawController.java index 840bc107..dc6d0fe8 100644 --- a/shacl-play/src/main/java/fr/sparna/rdf/shacl/shaclplay/draw/DrawController.java +++ b/shacl-play/src/main/java/fr/sparna/rdf/shacl/shaclplay/draw/DrawController.java @@ -185,14 +185,20 @@ protected void doOutputDiagram( FORMAT format, HttpServletResponse response ) throws IOException { - // includes the subClassOf links in the generated diagram - // don't generate hyperlinks - ShaclPlantUmlWriter writer = new ShaclPlantUmlWriter(true, false); + + + ShaclPlantUmlWriter writer = new ShaclPlantUmlWriter( + // includes the subClassOf links in the generated diagram + true, + // don't generate hyperlinks + false, + // avoid arrows to empty boxes + true); String plantumlString = writer.writeInPlantUml( shapesModel, // OWL Model - ModelFactory.createDefaultModel(), - false); + ModelFactory.createDefaultModel() + ); response.setContentType(format.mimeType); response.setHeader("Content-Disposition", "inline; filename=\""+filename+"."+format.extension+"\"");