From 0dc7c37151328c8ed5c4720379f5b99b62525dc1 Mon Sep 17 00:00:00 2001 From: jsimomaa Date: Mon, 22 May 2017 12:05:09 +0300 Subject: [PATCH] Better and prettier printing refs 7224 Change-Id: I6afdcfe04f4cef811c514b1c2f42478ebee30646 --- .../refactoring/FixExportedOntology.java | 20 +- .../graph/representation/PrettyPrintTG.java | 485 ++++++++++-------- .../PGraphEditorDocumentProvider.java | 15 +- 3 files changed, 295 insertions(+), 225 deletions(-) diff --git a/bundles/org.simantics.graph/src/org/simantics/graph/refactoring/FixExportedOntology.java b/bundles/org.simantics.graph/src/org/simantics/graph/refactoring/FixExportedOntology.java index bf0224103..ea449417d 100644 --- a/bundles/org.simantics.graph/src/org/simantics/graph/refactoring/FixExportedOntology.java +++ b/bundles/org.simantics.graph/src/org/simantics/graph/refactoring/FixExportedOntology.java @@ -7,11 +7,13 @@ import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; import org.simantics.databoard.binding.Binding; import org.simantics.databoard.binding.mutable.Variant; import org.simantics.databoard.container.DataContainer; import org.simantics.databoard.container.DataContainers; +import org.simantics.graph.representation.PrettyPrintTG; import org.simantics.graph.representation.TransferableGraph1; /** @@ -20,7 +22,7 @@ import org.simantics.graph.representation.TransferableGraph1; */ public class FixExportedOntology { - static void convertExportedSharedOntologyIntoBundleOntology(Path input, Path output) throws Exception { + static TransferableGraph1 convertExportedSharedOntologyIntoBundleOntology(Path input, Path output) throws Exception { System.out.format("Converting exported shared ontology%n\t" + input.toString() + "%nto bundle-compatible ontology%n\t" + output.toString()); try (InputStream is = new BufferedInputStream(Files.newInputStream(input), 128*1024)) { DataInput dis = new DataInputStream(is); @@ -33,16 +35,22 @@ public class FixExportedOntology { DataContainers.writeFile(output.toFile(), new DataContainer( container.format, container.version, container.metadata, new Variant(TransferableGraph1.BINDING, graph))); + + return graph; + } } public static void main(String[] args) throws Exception { - if (args.length < 1) { - System.out.println("Required arguments: []"); - } else if (args.length < 2) { + if (args.length == 0) { + System.out.println("Required arguments: []"); + } else if (args.length == 1) { Path input = Paths.get(args[0]); - Path output = input.getParent().resolve(input.getName(input.getNameCount()-1) + ".fixed"); - convertExportedSharedOntologyIntoBundleOntology(input, output); + Path output1 = input.getParent().resolve("graph.tg"); + TransferableGraph1 tg = convertExportedSharedOntologyIntoBundleOntology(input, output1); + String listing = PrettyPrintTG.print(tg); + Path output2 = Paths.get(args[0].substring(0, args[0].length() - ".sharedLibrary".length()) + ".pgraph"); + Files.write(output2, listing.getBytes(),StandardOpenOption.CREATE); } else { convertExportedSharedOntologyIntoBundleOntology(Paths.get(args[0]), Paths.get(args[1])); } diff --git a/bundles/org.simantics.graph/src/org/simantics/graph/representation/PrettyPrintTG.java b/bundles/org.simantics.graph/src/org/simantics/graph/representation/PrettyPrintTG.java index 3243b82bd..00d17100e 100644 --- a/bundles/org.simantics.graph/src/org/simantics/graph/representation/PrettyPrintTG.java +++ b/bundles/org.simantics.graph/src/org/simantics/graph/representation/PrettyPrintTG.java @@ -4,15 +4,22 @@ import java.io.BufferedInputStream; import java.io.DataInput; import java.io.DataInputStream; import java.io.InputStream; +import java.math.BigInteger; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.ArrayList; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; import java.util.HashMap; -import java.util.List; import java.util.Map; +import java.util.Set; import java.util.TreeMap; +import java.util.TreeSet; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.simantics.databoard.Bindings; +import org.simantics.databoard.Datatypes; import org.simantics.databoard.binding.Binding; import org.simantics.databoard.binding.mutable.Variant; import org.simantics.databoard.container.DataContainers; @@ -29,41 +36,49 @@ import gnu.trove.set.hash.TLongHashSet; public class PrettyPrintTG extends TransferableGraphUtils { int blankCounter = 0; - + MessageDigest m; + + private final Pattern versionExtractPattern = Pattern.compile("^.*-(\\d+\\.\\d+)"); + final StringBuilder output; - + final Map ontologies = new HashMap<>(knownOntologies); + final Set referencedOntologies = new TreeSet<>(); + static class ResourceInfo { final boolean hasURI; final String name; final int resource; boolean newResource = false; - int owner = 0; + + // -1 = no owner, -2 = multiple owners + int owner = -1; int ownerPredicate = 0; String aliasURI = null; TIntArrayList owned = new TIntArrayList(); - TIntArrayList statements = new TIntArrayList(); + //TIntObjectHashMap statements = new TIntObjectHashMap(); public ResourceInfo(boolean hasURI, String name, int resource) { this.hasURI = hasURI; this.name = name; this.resource = resource; } } - - public PrettyPrintTG(StringBuilder b) { + + public PrettyPrintTG(StringBuilder b) throws NoSuchAlgorithmException { output = b; + m = MessageDigest.getInstance("SHA-256"); } - - public PrettyPrintTG() { + + public PrettyPrintTG() throws NoSuchAlgorithmException { this(new StringBuilder()); } TIntObjectHashMap infos = new TIntObjectHashMap<>(); - + String tgNodeName(String name) { if(name.contains(" ")) return "\"" + name + "\""; else return name; } - + ResourceInfo recurseURI(TransferableGraph1 graph, Identity parent, String parentName) { String name = parentName + "." + tgNodeName(getName(parent)); ResourceInfo info = new ResourceInfo(true, name, parent.resource); @@ -73,8 +88,8 @@ public class PrettyPrintTG extends TransferableGraphUtils { } return info; } - - void discoverBlank(TransferableGraph1 graph, int resource, TIntArrayList todo) { + + void discoverBlank(TransferableGraph1 graph, int resource, TIntArrayList todo) throws Exception { TIntArrayList statements = getStatements(graph, resource); for(int i=0;i " + predicateURI + " " + existing.name); } else { - existing.owner = -1; + existing.owner = -2; //System.err.println("Multiple owners " + info.name + " => " + predicateURI + " " + existing.name); } } - info.statements = statements; + } - - String printValue(Value value) { + + String printValue(Value value) throws Exception { Variant variant = value.value; Datatype dt = variant.getBinding().type(); - return "\"" + variant.getValue() + "\""; - } - - void fixInstanceOf(TransferableGraph1 graph, ResourceInfo info) { - Identity id = getIdentity(graph, info.resource); - if(id == null) return; - if(id.definition instanceof Internal) { - Identity instanceOf = findExternal(graph, "http://www.simantics.org/Layer0-1.1/InstanceOf"); - Identity library = findExternal(graph, "http://www.simantics.org/Layer0-1.1/Library"); - info.statements.add(instanceOf.resource); - info.statements.add(library.resource); + if(Datatypes.STRING.equals(dt)) { + String s = (String)variant.getValue(Bindings.STRING); + if(s.contains("\n")) { + return "\"\"\"" + s + "\"\"\""; + } else { + return "\"" + s + "\""; + } + } else if(Datatypes.BOOLEAN.equals(dt)) { + Boolean i = (Boolean)variant.getValue(Bindings.BOOLEAN); + return i ? "true" : "false"; + } else if(Datatypes.INTEGER.equals(dt)) { + Integer i = (Integer)variant.getValue(Bindings.INTEGER); + return i.toString(); + } else if(Datatypes.LONG.equals(dt)) { + Long i = (Long)variant.getValue(Bindings.LONG); + return i.toString(); + } else { + byte[] data = variant.getBinding().serializer().serialize(variant.getValue()); + m.reset(); + m.update(data, 0, data.length); + return "\"" + new BigInteger(1, m.digest()).toString(16) + "\""; } + } - + + // void fixInstanceOf(TransferableGraph1 graph, ResourceInfo info) { + // Identity id = getIdentity(graph, info.resource); + // if(id == null) return; + // if(id.definition instanceof Internal) { + // Identity instanceOf = findExternal(graph, "http://www.simantics.org/Layer0-1.1/InstanceOf"); + // Identity library = findExternal(graph, "http://www.simantics.org/Layer0-1.1/Library"); + // info.statements.add(instanceOf.resource); + // info.statements.add(library.resource); + // } + // } + public static String getExternalURI(TransferableGraph1 tg, External ext) { String name = ext.name; if(name.contains(" ")) name = name.replace(" ", "_").replaceAll("@", "_");//name = "\"" + name + "\""; int parentId = ext.parent; //if(parentId == 0) return ext.name; -// else { - Identity id = getIdentity(tg, parentId); - if(id.definition instanceof External) { - return getExternalURI(tg, (External)id.definition) + "/" + name; - } else if(id.definition instanceof Root) { - Root root = (Root)id.definition; - return "http:/" + root.name + "/" + name; - } else { - return null; - } -// } + // else { + Identity id = getIdentity(tg, parentId); + if(id.definition instanceof External) { + return getExternalURI(tg, (External)id.definition) + "/" + name; + } else if(id.definition instanceof Root) { + Root root = (Root)id.definition; + return "http:/" + root.name + "/" + name; + } else { + return null; + } + // } } public static String getExternalURI(TransferableGraph1 tg, int resource) { @@ -161,148 +197,143 @@ public class PrettyPrintTG extends TransferableGraphUtils { } return null; } - + String rewritePredicateURI(TransferableGraph1 graph, int predicate) { + String uri = getExternalURI(graph, predicate); - if(uri == null) return null; - uri = uri.replace("http://www.simantics.org/Modeling-1.2", "MOD"); - uri = uri.replace("http://www.simantics.org/Layer0-1.1", "L0"); - uri = uri.replace("http://www.simantics.org/Layer0X-1.1", "L0X"); - uri = uri.replace("http://www.simantics.org/Diagram-2.2", "DIA"); - uri = uri.replace("http://www.simantics.org/Structural-1.2", "STR"); - uri = uri.replace("http://www.simantics.org/Documentation-1.2", "DOCU"); - uri = uri.replace("http://www.simantics.org/Document-1.2", "DOC"); - uri = uri.replace("http://www.simantics.org/G2D-1.1", "G2D"); - uri = uri.replace("http://www.simantics.org/Image2-1.2", "IMAGE2"); - uri = uri.replace("http://www.simantics.org/SelectionView-1.2", "SEL"); - uri = uri.replace("http://www.simantics.org/Viewpoint-1.2", "VP"); - uri = uri.replace("http://www.simantics.org/GraphFile-0.1", "GRAPHFILE"); - uri = uri.replace("http://www.semantum.fi/Simupedia-1.0", "SIMUPEDIA"); - uri = uri.replace("http://www.semantum.fi/SimupediaWorkbench-1.0", "SIMUPEDIA_WB"); - uri = uri.replace("http://www.apros.fi/OperationUI-6.6", "APROS_OPER"); - uri = uri.replace("http://semantum.fi/SimupediaStandardLibrary@1.3-trunk", "SIMUPEDIA_STD"); + if(uri == null) { + ResourceInfo info = infos.get(predicate); + if(info != null) return info.name; + return "_"; + } + + for(String ontology : ontologies.keySet()) { + if(uri.contains(ontology)) { + String key = ontologies.get(ontology); + uri = uri.replace(ontology, key); + referencedOntologies.add(ontology); + } + } + uri = uri.replace("/", "."); + return uri; + + } + + void indent(int indent) { + for(int i=0;i> statements, String predicate, String object) { - List objects = statements.get(predicate); + void addStatement(Map> statements, String predicate, String object) { + Set objects = statements.get(predicate); if(objects == null) { - objects = new ArrayList(); + objects = new TreeSet<>(); statements.put(predicate, objects); } objects.add(object); } - - void printURI(TransferableGraph1 graph, ResourceInfo info) { - - if(!info.hasURI) return; - - Map> statements = new HashMap<>(); + + void printURI(TransferableGraph1 graph, ResourceInfo info, boolean requireURI, int indent) { + + if(requireURI && !info.hasURI) return; + + Map> statements = new TreeMap<>(); Identity consistsOf = findExternal(graph, "http://www.simantics.org/Layer0-1.1/ConsistsOf"); TLongHashSet processed = new TLongHashSet(); for(int i=0;i"); - } else if (info.aliasURI != null) { - output.append(info.name + " = <" + info.aliasURI + ">"); - } else { - output.append(info.name); - } - - List instanceOfs = statements.get("L0.InstanceOf"); - if(instanceOfs != null) { - for(String instanceOf : instanceOfs) { - output.append(" : " + instanceOf); - } - } - List subrelationOfs = statements.get("L0.SubrelationOf"); - if(subrelationOfs != null) { - for(String subrelationOf : subrelationOfs) { - output.append(" "); + } else if (info.aliasURI != null) { + output.append(info.name + " = <" + info.aliasURI + ">"); + } else { + output.append(info.name); } - } - - List inherits = statements.get("L0.Inherits"); - if(inherits != null) { - for(String inherit : inherits) { - output.append(" instanceOfs = statements.get("L0.InstanceOf"); + if(instanceOfs != null) { + for(String instanceOf : instanceOfs) { + output.append(" : " + instanceOf); + } } + Set subrelationOfs = statements.get("L0.SubrelationOf"); + if(subrelationOfs != null) { + for(String subrelationOf : subrelationOfs) { + output.append(" inherits = statements.get("L0.Inherits"); + if(inherits != null) { + for(String inherit : inherits) { + output.append(" > entry : statements.entrySet()) { + + for(Map.Entry> entry : statements.entrySet()) { String predicate = entry.getKey(); if("L0.InstanceOf".equals(predicate)) continue; if("L0.SubrelationOf".equals(predicate)) continue; if("L0.Inherits".equals(predicate)) continue; - List objects = entry.getValue(); + if("L0.PartOf".equals(predicate)) continue; + Set objects = entry.getValue(); if(objects.size() == 1) { - output.append(" " + predicate + " " + objects.iterator().next() + "\n"); + indent(indent+1); + output.append(predicate + " " + objects.iterator().next() + "\n"); } else{ - output.append(" " + predicate + "\n"); + indent(indent+1); + output.append(predicate + "\n"); for(String object : objects) { - output.append(" " + object + "\n"); + indent(indent+1); + output.append(" " + object + "\n"); } } } + + for(int i=0;i knownOntologies = new HashMap<>(); + + static { + knownOntologies.put("http://www.simantics.org/Layer0-1.1", "L0"); + knownOntologies.put("http://www.simantics.org/Layer0X-1.1", "L0X"); + knownOntologies.put("http://www.simantics.org/Modeling-1.2", "MOD"); + knownOntologies.put("http://www.simantics.org/Diagram-2.2", "DIA"); + knownOntologies.put("http://www.simantics.org/Structural-1.2", "STR"); + knownOntologies.put("http://www.simantics.org/Document-1.2", "DOC"); + knownOntologies.put("http://www.simantics.org/Documentation-1.2", "DOCU"); + knownOntologies.put("http://www.simantics.org/G2D-1.1", "G2D"); + knownOntologies.put("http://www.simantics.org/SelectionView-1.2", "SEL"); + knownOntologies.put("http://www.simantics.org/Viewpoint-1.2", "VP"); + knownOntologies.put("http://www.simantics.org/Image2-1.2", "IMAGE2"); + knownOntologies.put("http://www.simantics.org/GraphFile-0.1", "GRAPHFILE"); + knownOntologies.put("http://www.simantics.org/Project-1.2", "PROJECT"); + knownOntologies.put("http://www.semantum.fi/Simupedia-1.0", "SIMUPEDIA"); + knownOntologies.put("http://www.semantum.fi/SimupediaWorkbench-1.0", "SIMUPEDIA_WORKBENCH"); + } - void prettyPrint(TransferableGraph1 graph) { - // Discover resources with URI -// for(Identity id : TransferableGraphUtils.getRoots(graph)) { -// String name = "ROOT"; -// ResourceInfo info = new ResourceInfo(true, name, id.resource); -// infos.put(id.resource, info); -// for(Identity child : getChildren(graph, id)) { -// ResourceInfo childInfo = recurseURI(graph, child, name); -// childInfo.newResource = true; -// } -// } - for(Identity id : graph.identities) { - if(id.definition instanceof Internal) { - Internal internal = (Internal)id.definition; - Identity parent = TransferableGraphUtils.getIdentity(graph, internal.parent); - if(parent.definition instanceof External) { - String name = "BASE"; - ResourceInfo info = new ResourceInfo(true, name, id.resource); - info.aliasURI = TransferableGraphUtils.getURI(graph, id.resource); - info.newResource = true; - infos.put(id.resource, info); - for(Identity child : getChildren(graph, id)) { - recurseURI(graph, child, name); - } + void prettyPrint(TransferableGraph1 graph) throws Exception { + + for(Identity id : graph.identities) { + if(id.definition instanceof Internal) { + Internal internal = (Internal)id.definition; + Identity parent = TransferableGraphUtils.getIdentity(graph, internal.parent); + if(parent.definition instanceof External) { + String name = "BASE"; + ResourceInfo info = new ResourceInfo(true, name, id.resource); + info.aliasURI = TransferableGraphUtils.getURI(graph, id.resource); + info.newResource = true; + infos.put(id.resource, info); + for(Identity child : getChildren(graph, id)) { + recurseURI(graph, child, name); } } + } else if (id.definition instanceof External) { + External ext = (External)id.definition; + // Try to detect shared libraries + if(ext.name.contains("@")) { + + int index = ext.name.indexOf('@'); + String prefix = ext.name.substring(0, index); + int index2 = ext.name.indexOf('/', index); + String ontology = index2 == -1 ? ext.name : ext.name.substring(0, index2); + String uri = TransferableGraphUtils.getURI(graph, id.resource); + ontologies.put(uri, prefix); + + } else if (ext.name.contains("-")) { + + String uri = TransferableGraphUtils.getURI(graph, id.resource); + Matcher m = versionExtractPattern.matcher(uri); + if (m.matches()) { + if(!ontologies.containsKey(uri)) { + int index = ext.name.indexOf('-'); + String prefix = ext.name.substring(0, index); + ontologies.put(uri, prefix); + } + } + + } + + + } - // Discover other resources - TIntArrayList todo = new TIntArrayList(); - for(ResourceInfo info : infos.valueCollection()) - todo.add(info.resource); - while(!todo.isEmpty()) { - int resource = todo.removeAt(todo.size()-1); - discoverBlank(graph, resource, todo); + } + // Discover other resources + TIntArrayList todo = new TIntArrayList(); + for(ResourceInfo info : infos.valueCollection()) + todo.add(info.resource); + while(!todo.isEmpty()) { + int resource = todo.removeAt(todo.size()-1); + discoverBlank(graph, resource, todo); + } + for(ResourceInfo info : infos.valueCollection()) + discoverOwners(graph, info); + // for(ResourceInfo info : infos.valueCollection()) + // fixInstanceOf(graph, info); + for(ResourceInfo info : infos.valueCollection()) + if(info.owner >= 0) { + ResourceInfo ownerInfo = infos.get(info.owner); + ownerInfo.owned.add(info.ownerPredicate); + ownerInfo.owned.add(info.resource); } - for(ResourceInfo info : infos.valueCollection()) - discoverOwners(graph, info); - for(ResourceInfo info : infos.valueCollection()) - fixInstanceOf(graph, info); - for(ResourceInfo info : infos.valueCollection()) - if(info.owner > 0) { - ResourceInfo ownerInfo = infos.get(info.owner); - ownerInfo.owned.add(info.ownerPredicate); - ownerInfo.owned.add(info.resource); - } else if (info.owner == 0) { - //System.err.println("faf1"); - } else if (info.owner == -1) { - //System.err.println("faf2"); - } - - TreeMap order = new TreeMap<>(); - for(ResourceInfo info : infos.valueCollection()) - order.put(info.name, info); - - this.output.append("MOD = \n"); - this.output.append("L0 = \n"); - this.output.append("L0X = \n"); - this.output.append("DIA = \n"); - this.output.append("STR = \n"); - this.output.append("DOCU = \n"); - this.output.append("DOC = \n"); - this.output.append("G2D = \n"); - this.output.append("SEL = \n"); - this.output.append("VP = \n"); - this.output.append("IMAGE2 = \n"); - this.output.append("GRAPHFILE = \n"); - this.output.append("APROS_OPER = \n"); - this.output.append("SIMUPEDIA = \n"); - this.output.append("SIMUPEDIA_WB = \n"); - this.output.append("SIMUPEDIA_STD = \n"); - - for(ResourceInfo info : order.values()) - printURI(graph, info); - + + TreeMap order = new TreeMap<>(); + for(ResourceInfo info : infos.valueCollection()) + order.put(info.name, info); + + for(ResourceInfo info : order.values()) + printURI(graph, info, true, 0); + + for(ResourceInfo info : order.values()) + if(!info.hasURI && info.owner < 0) + printURI(graph, info, false, 0); + + StringBuilder refs = new StringBuilder(); + for(String ontology : referencedOntologies) { + String key = ontologies.get(ontology); + refs.append(key + " = <" + ontology + ">\n"); + } + output.insert(0, refs.toString()); + } - - public static String print(TransferableGraph1 tg) { + + public static String print(TransferableGraph1 tg) throws Exception { StringBuilder b = new StringBuilder(); new PrettyPrintTG(b).prettyPrint(tg); return b.toString(); diff --git a/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/componentTypeEditor/PGraphEditorDocumentProvider.java b/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/componentTypeEditor/PGraphEditorDocumentProvider.java index ad247b6bd..eeaab985c 100644 --- a/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/componentTypeEditor/PGraphEditorDocumentProvider.java +++ b/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/componentTypeEditor/PGraphEditorDocumentProvider.java @@ -60,14 +60,17 @@ public class PGraphEditorDocumentProvider extends AbstractDocumentProvider { return new Document(currentText != null ? currentText : ""); } else { Resource indexRoot = graph.syncRequest(new PossibleIndexRoot(resource)); - if(indexRoot != null && graph.isInstanceOf(indexRoot, L0.Ontology)) { - TransferableGraph1 tg = ModelingUtils.exportSharedOntology(graph, indexRoot, null, Constants.SHARED_LIBRARY_FORMAT, Constants.SHARED_LIBRARY_CURRENT_VERSION); - GraphRefactoringUtils.fixOntologyExport(tg); - currentText = PrettyPrintTG.print(tg); - errorHappened = false; + try { + if(indexRoot != null && graph.isInstanceOf(indexRoot, L0.Ontology)) { + TransferableGraph1 tg = ModelingUtils.exportSharedOntology(graph, indexRoot, null, Constants.SHARED_LIBRARY_FORMAT, Constants.SHARED_LIBRARY_CURRENT_VERSION); + GraphRefactoringUtils.fixOntologyExport(tg); + currentText = PrettyPrintTG.print(tg); + errorHappened = false; + } return new Document(currentText != null ? currentText : ""); + } catch (Exception e) { + throw new DatabaseException("Could not get PGraph from " + resource); } - throw new DatabaseException("Could not get PGraph from " + resource); } } }); -- 2.43.2