package org.simantics.graph.representation; import java.io.BufferedInputStream; import java.io.DataInput; import java.io.DataInputStream; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TreeMap; import org.simantics.databoard.binding.Binding; import org.simantics.databoard.binding.mutable.Variant; import org.simantics.databoard.container.DataContainers; import org.simantics.databoard.type.Datatype; import gnu.trove.list.array.TIntArrayList; import gnu.trove.map.hash.TIntObjectHashMap; import gnu.trove.set.hash.TLongHashSet; /** * @author Antti Villberg * @since 1.24.0 */ public class PrettyPrintTG extends TransferableGraphUtils { int blankCounter = 0; final StringBuilder output; static class ResourceInfo { final boolean hasURI; final String name; final int resource; boolean newResource = false; int owner = 0; int ownerPredicate = 0; String aliasURI = null; TIntArrayList owned = new TIntArrayList(); TIntArrayList statements = new TIntArrayList(); public ResourceInfo(boolean hasURI, String name, int resource) { this.hasURI = hasURI; this.name = name; this.resource = resource; } } public PrettyPrintTG(StringBuilder b) { output = b; } public PrettyPrintTG() { 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); infos.put(parent.resource, info); for(Identity child : getChildren(graph, parent)) { recurseURI(graph, child, name); } return info; } void discoverBlank(TransferableGraph1 graph, int resource, TIntArrayList todo) { TIntArrayList statements = getStatements(graph, resource); for(int i=0;i " + predicateURI + " " + existing.name); } else { existing.owner = -1; //System.err.println("Multiple owners " + info.name + " => " + predicateURI + " " + existing.name); } } info.statements = statements; } String printValue(Value value) { 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); } } 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; } // } } public static String getExternalURI(TransferableGraph1 tg, int resource) { Identity id = getIdentity(tg, resource); if(id == null) return null; if(id.definition instanceof External) { External ext = (External)id.definition; return getExternalURI(tg, ext); } 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"); uri = uri.replace("/", "."); return uri; } void printBlank(TransferableGraph1 graph, String predicateURI2, ResourceInfo info) { if(info.hasURI) return; output.append(" " + predicateURI2 + " " + info.name + "\n"); Value value = findValue(graph, info.resource); if(value != null) { } // for(int i=0;i> statements, String predicate, String object) { List objects = statements.get(predicate); if(objects == null) { objects = new ArrayList(); statements.put(predicate, objects); } objects.add(object); } void printURI(TransferableGraph1 graph, ResourceInfo info) { if(!info.hasURI) return; Map> statements = new HashMap<>(); 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(" inherits = statements.get("L0.Inherits"); if(inherits != null) { for(String inherit : inherits) { output.append(" > 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(objects.size() == 1) { output.append(" " + predicate + " " + objects.iterator().next() + "\n"); } else{ output.append(" " + predicate + "\n"); for(String object : objects) { output.append(" " + object + "\n"); } } } } void prettyPrint(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); org.simantics.databoard.container.DataContainer container = DataContainers.readFile(dis); Binding binding = TransferableGraph1.BINDING; TransferableGraph1 graph = (TransferableGraph1)container.content.getValue(binding); prettyPrint(graph); Files.write(output, this.output.toString().getBytes()); } } 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); } } } } // 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); } 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); } public static String print(TransferableGraph1 tg) { StringBuilder b = new StringBuilder(); new PrettyPrintTG(b).prettyPrint(tg); return b.toString(); } public static void main(String[] args) throws Exception { if (args.length < 1) { System.out.println("Required arguments: []"); } else if (args.length < 2) { Path input = Paths.get(args[0]); Path output = input.getParent().resolve(input.getName(input.getNameCount()-1) + ".fixed"); new PrettyPrintTG().prettyPrint(input, output); } else { new PrettyPrintTG().prettyPrint(Paths.get(args[0]), Paths.get(args[1])); } } }