From 4bc25acb8086df68836950af08faeacd382e5427 Mon Sep 17 00:00:00 2001 From: Antti Villberg Date: Wed, 19 Feb 2020 14:28:24 +0200 Subject: [PATCH] Support for creating shared ontology dump to git More generic implementation gitlab #452 Change-Id: Icaeb7d33386b037f48c5154b1fe8777b04f3b38d --- .../graph/Modeling.pgraph | 26 +- .../scl/Simantics/Testing.scl | 7 + .../org/simantics/modeling/ContentDumps.java | 112 +++++++ .../modeling/utils/DumpOntologyStructure.java | 280 +++++------------- ...sComponentTypePropertiesResultRequest.java | 115 +++---- .../structural2/ConnectionImpl2.java | 4 +- 6 files changed, 291 insertions(+), 253 deletions(-) create mode 100644 bundles/org.simantics.modeling/src/org/simantics/modeling/ContentDumps.java diff --git a/bundles/org.simantics.modeling.ontology/graph/Modeling.pgraph b/bundles/org.simantics.modeling.ontology/graph/Modeling.pgraph index dca29f9bf..52a37f738 100644 --- a/bundles/org.simantics.modeling.ontology/graph/Modeling.pgraph +++ b/bundles/org.simantics.modeling.ontology/graph/Modeling.pgraph @@ -536,4 +536,28 @@ MOD.IssueDecorationStyle : DIA.Style MOD.PreferredDiagramEditorID "Resource -> Vector Byte" Vector Byte" + +L0.PGraph + MOD.contentDumpFunction + MOD.PGraphContentDumpFunction + @L0.sclValue "pgraphContentDump" "Resource -> Vector Byte" + +STR.Component + MOD.contentDumpFunction + MOD.StructuralComponentContentDumpFunction + @L0.sclValue "structuralComponentContentDump" "Resource -> Vector Byte" + +SEL.GenericParameterType + MOD.contentDumpFunction + MOD.GenericParameterTypeContentDumpFunction + @L0.sclValue "genericParameterTypeContentDump" "Resource -> Vector Byte" + \ No newline at end of file diff --git a/bundles/org.simantics.modeling/scl/Simantics/Testing.scl b/bundles/org.simantics.modeling/scl/Simantics/Testing.scl index ce70dd034..5742b4f41 100644 --- a/bundles/org.simantics.modeling/scl/Simantics/Testing.scl +++ b/bundles/org.simantics.modeling/scl/Simantics/Testing.scl @@ -4,3 +4,10 @@ include "Simantics/Variables" importJava "org.simantics.modeling.ModelingUtils" where withinEpsilon :: Double -> Double -> Double -> String exportModel :: Resource -> String -> String -> Integer -> () + +importJava "org.simantics.modeling.ContentDumps" where + sclModuleContentDump :: Resource -> Vector Byte + pgraphContentDump :: Resource -> Vector Byte + structuralComponentContentDump :: Resource -> Vector Byte + genericParameterTypeContentDump :: Resource -> Vector Byte + diff --git a/bundles/org.simantics.modeling/src/org/simantics/modeling/ContentDumps.java b/bundles/org.simantics.modeling/src/org/simantics/modeling/ContentDumps.java new file mode 100644 index 000000000..bc3b65a03 --- /dev/null +++ b/bundles/org.simantics.modeling/src/org/simantics/modeling/ContentDumps.java @@ -0,0 +1,112 @@ +package org.simantics.modeling; + +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.util.TreeMap; +import java.util.TreeSet; + +import org.simantics.databoard.Bindings; +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.common.utils.CommonDBUtils; +import org.simantics.db.exception.DatabaseException; +import org.simantics.db.layer0.variable.Variable; +import org.simantics.db.layer0.variable.Variables; +import org.simantics.graphfile.ontology.GraphFileResource; +import org.simantics.layer0.Layer0; +import org.simantics.modeling.utils.ComponentTypeViewerPropertyInfo; +import org.simantics.modeling.utils.HeadlessComponentTypePropertiesResultRequest; +import org.simantics.structural.stubs.StructuralResource2; +import org.simantics.structural2.variables.Connection; +import org.simantics.structural2.variables.VariableConnectionPointDescriptor; + +public class ContentDumps { + + private static Charset UTF8 = StandardCharsets.UTF_8; + + public static byte[] sclModuleContentDump(ReadGraph graph, Resource resource) throws DatabaseException { + Layer0 L0 = Layer0.getInstance(graph); + String def = graph.getRelatedValue(resource, L0.SCLModule_definition, Bindings.STRING); + return def.getBytes(UTF8); + } + + public static byte[] pgraphContentDump(ReadGraph graph, Resource resource) throws DatabaseException { + Layer0 L0 = Layer0.getInstance(graph); + String def = graph.getRelatedValue(resource, L0.PGraph_definition, Bindings.STRING); + return def.getBytes(UTF8); + } + + public static byte[] graphFileContentDump(ReadGraph graph, Resource resource) throws DatabaseException { + GraphFileResource GF = GraphFileResource.getInstance(graph); + return graph.getRelatedValue(resource, GF.HasFiledata, Bindings.BYTE_ARRAY); + } + + public static byte[] structuralComponentContentDump(ReadGraph graph, Resource resource) throws DatabaseException { + + StringBuilder dump = new StringBuilder(); + + Variable v = Variables.getVariable(graph, resource); + + TreeSet types = new TreeSet<>(); + for(Resource t : graph.getPrincipalTypes(resource)) { + types.add(graph.getURI(t)); + } + for(String uri : types) { + dump.append(uri); + dump.append("\n"); + } + + TreeMap properties = new TreeMap<>(); + for(Variable property : v.getProperties(graph)) + properties.put(property.getName(graph), property); + for(Variable property : properties.values()) { + String possibleValue = property.getPossiblePropertyValue(graph, "HasDisplayValue", Bindings.STRING); + if(possibleValue != null) { + dump.append(property.getName(graph)); + dump.append(" "); + dump.append(possibleValue); + dump.append("\n"); + } + if(property.getClassifications(graph).contains(StructuralResource2.URIs.ConnectionRelation)) { + dump.append(property.getName(graph)); + Connection c = property.getValue(graph); + TreeSet rvis = new TreeSet<>(); + for(VariableConnectionPointDescriptor desc : c.getConnectionPointDescriptors(graph, null)) { + rvis.add(desc.getRelativeRVI(graph, v)); + } + for(String rvi : rvis) { + dump.append(" "); + dump.append(rvi); + } + dump.append("\n"); + } + } + return dump.toString().getBytes(UTF8); + } + + public static byte[] genericParameterTypeContentDump(ReadGraph graph, Resource resource) throws DatabaseException { + + Layer0 L0 = Layer0.getInstance(graph); + StructuralResource2 STR = StructuralResource2.getInstance(graph); + Resource componentType = CommonDBUtils.possibleObjectWithType(graph, resource, L0.PartOf, STR.ComponentType); + + ComponentTypeViewerPropertyInfo pi = HeadlessComponentTypePropertiesResultRequest.readPropertyInfo(graph, resource, componentType, false); + StringBuilder dump = new StringBuilder(); + dump.append(pi.type); + dump.append(" "); + dump.append(pi.defaultValue); + if(pi.unit != null) { + dump.append(" "); + dump.append(pi.unit); + } + dump.append(" "); + dump.append(pi.label); + if(pi.description != null) { + dump.append(" "); + dump.append(pi.description); + } + return dump.toString().getBytes(UTF8); + + } + +} diff --git a/bundles/org.simantics.modeling/src/org/simantics/modeling/utils/DumpOntologyStructure.java b/bundles/org.simantics.modeling/src/org/simantics/modeling/utils/DumpOntologyStructure.java index a2d9e5c12..79622f15e 100644 --- a/bundles/org.simantics.modeling/src/org/simantics/modeling/utils/DumpOntologyStructure.java +++ b/bundles/org.simantics.modeling/src/org/simantics/modeling/utils/DumpOntologyStructure.java @@ -2,211 +2,102 @@ package org.simantics.modeling.utils; import java.io.File; import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.Collection; import java.util.HashMap; -import java.util.HashSet; import java.util.Map; -import java.util.Set; import java.util.TreeMap; -import java.util.TreeSet; -import org.simantics.databoard.Bindings; +import org.simantics.Simantics; import org.simantics.db.ReadGraph; import org.simantics.db.Resource; -import org.simantics.db.common.NamedResource; import org.simantics.db.common.utils.CommonDBUtils; import org.simantics.db.common.utils.NameUtils; import org.simantics.db.exception.DatabaseException; import org.simantics.db.layer0.variable.Variable; import org.simantics.db.layer0.variable.Variables; -import org.simantics.graphfile.ontology.GraphFileResource; import org.simantics.layer0.Layer0; -import org.simantics.structural.stubs.StructuralResource2; -import org.simantics.structural2.variables.Connection; -import org.simantics.structural2.variables.VariableConnectionPointDescriptor; +import org.simantics.modeling.ModelingResources; +import org.simantics.scl.runtime.function.Function; import org.simantics.utils.FileUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import gnu.trove.list.array.TByteArrayList; public class DumpOntologyStructure { + private static final Logger LOGGER = LoggerFactory.getLogger(DumpOntologyStructure.class); + private Resource ontology; - private Set containers = new HashSet<>(); - private Set folders = new HashSet<>(); private Map names = new HashMap<>(); private Map parents = new HashMap<>(); private Map libraryFolders = new HashMap<>(); - private Set modules = new HashSet<>(); - private Map moduleCodes = new HashMap<>(); - private Set pgraphs = new HashSet<>(); - private Map pgraphCodes = new HashMap<>(); - private Set graphFiles = new HashSet<>(); - private Map graphFileBytes = new HashMap<>(); - private Set componentTypes = new HashSet<>(); - private Map componentTypeDumps = new HashMap<>(); - private Set components = new HashSet<>(); - private Map componentDumps = new HashMap<>(); + private Map contentDumps = new HashMap<>(); private void readNameAndParent(ReadGraph graph, Resource container, Resource r) throws DatabaseException { parents.put(r, container); names.put(r, NameUtils.getSafeName(graph, r)); } - private void readLibraries(ReadGraph graph, Resource container) throws DatabaseException { - Layer0 L0 = Layer0.getInstance(graph); - for(Resource r : CommonDBUtils.objectsWithType(graph, container, L0.ConsistsOf, L0.Library)) { - folders.add(r); - names.put(r, NameUtils.getSafeName(graph, r)); - parents.put(r, container); - readNameAndParent(graph, container, r); - readLibraries(graph, r); - } - containers.addAll(folders); + private Collection containers() { + return parents.values(); } - private void readComponentTypes(ReadGraph graph) throws DatabaseException { - Layer0 L0 = Layer0.getInstance(graph); - StructuralResource2 STR = StructuralResource2.getInstance(graph); - for(Resource container : containers) { - for(Resource r : CommonDBUtils.objectsWithType(graph, container, L0.ConsistsOf, STR.ComponentType)) { - folders.add(r); - componentTypes.add(r); - readNameAndParent(graph, container, r); - ComponentTypePropertiesResult data = graph.syncRequest(new HeadlessComponentTypePropertiesResultRequest(r)); - StringBuilder dump = new StringBuilder(); - for(ComponentTypeViewerPropertyInfo pi : data.getProperties()) { - dump.append(pi.name); - dump.append(" "); - dump.append(pi.type); - dump.append(" "); - dump.append(pi.defaultValue); - if(pi.unit != null) { - dump.append(" "); - dump.append(pi.unit); - } - dump.append(" "); - dump.append(pi.label); - if(pi.description != null) { - dump.append(" "); - dump.append(pi.description); - } - dump.append("\n"); - } - for(NamedResource nr : data.getConnectionPoints()) { - dump.append("cp "); - dump.append(nr.getName()); - dump.append("\n"); - } - componentTypeDumps.put(r, dump.toString()); - } - } - containers.addAll(folders); - } - - private void readComposites(ReadGraph graph) throws DatabaseException { + private void readHierarchy(ReadGraph graph, Resource container) throws DatabaseException { Layer0 L0 = Layer0.getInstance(graph); - StructuralResource2 STR = StructuralResource2.getInstance(graph); - for(Resource container : containers) { - for(Resource r : CommonDBUtils.objectsWithType(graph, container, L0.ConsistsOf, STR.Composite)) { - folders.add(r); + for(Resource r : CommonDBUtils.objectsWithType(graph, container, L0.ConsistsOf, L0.Entity)) { + try { readNameAndParent(graph, container, r); + readHierarchy(graph, r); + } catch (DatabaseException e) { + LOGGER.error("Error while reading content dump hierarchy for " + r, e); } } - containers.addAll(folders); } - private void readComponents(ReadGraph graph) throws DatabaseException { - Layer0 L0 = Layer0.getInstance(graph); - StructuralResource2 STR = StructuralResource2.getInstance(graph); - for(Resource container : containers) { - for(Resource r : CommonDBUtils.objectsWithType(graph, container, L0.ConsistsOf, STR.Component)) { - if(folders.contains(r)) - continue; - components.add(r); - readNameAndParent(graph, container, r); - Variable v = Variables.getVariable(graph, r); - TreeMap properties = new TreeMap<>(); - for(Variable property : v.getProperties(graph)) - properties.put(property.getName(graph), property); - StringBuilder dump = new StringBuilder(); - for(Variable property : properties.values()) { - String possibleValue = property.getPossiblePropertyValue(graph, "HasDisplayValue", Bindings.STRING); - if(possibleValue != null) { - dump.append(property.getName(graph)); - dump.append(" "); - dump.append(possibleValue); - dump.append("\n"); - } - if(property.getClassifications(graph).contains(StructuralResource2.URIs.ConnectionRelation)) { - dump.append(property.getName(graph)); - Connection c = property.getValue(graph); - TreeSet rvis = new TreeSet<>(); - for(VariableConnectionPointDescriptor desc : c.getConnectionPointDescriptors(graph, null)) { - rvis.add(desc.getRelativeRVI(graph, v)); - } - for(String rvi : rvis) { - dump.append(" "); - dump.append(rvi); + private void readGeneric(ReadGraph graph) throws DatabaseException { + ModelingResources MOD = ModelingResources.getInstance(graph); + for(Resource r : parents.keySet()) { + if(contentDumps.containsKey(r)) + continue; + TByteArrayList result = new TByteArrayList(); + try { + TreeMap sortedTypes = new TreeMap<>(); + for(Resource type : graph.getTypes(r)) { + String uri = graph.getPossibleURI(type); + if(uri != null) + sortedTypes.put(uri, type); + } + for(Resource type : sortedTypes.values()) { + try { + Variable typeVariable = Variables.getVariable(graph, type); + @SuppressWarnings("rawtypes") + Function f = typeVariable.getPossiblePropertyValue(graph, MOD.contentDumpFunction); + if(f != null) { + @SuppressWarnings("unchecked") + byte[] dump = (byte[])Simantics.applySCLRead(graph, f, r); + if(dump != null) { + result.add(dump); + } } - dump.append("\n"); + } catch (DatabaseException e) { + LOGGER.error("Error while computing content dump for " + r, e); } } - componentDumps.put(r, dump.toString()); - } - } - } - - private void readSCLModules(ReadGraph graph) throws DatabaseException { - Layer0 L0 = Layer0.getInstance(graph); - for(Resource container : containers) { - for(Resource r : CommonDBUtils.objectsWithType(graph, container, L0.ConsistsOf, L0.SCLModule)) { - String code = graph.getPossibleRelatedValue(r, L0.SCLModule_definition, Bindings.STRING); - if(code != null) { - moduleCodes.put(r, code); - } - modules.add(r); - readNameAndParent(graph, container, r); - } - } - } - - private void readPGraphs(ReadGraph graph) throws DatabaseException { - Layer0 L0 = Layer0.getInstance(graph); - for(Resource container : containers) { - for(Resource r : CommonDBUtils.objectsWithType(graph, container, L0.ConsistsOf, L0.PGraph)) { - String code = graph.getPossibleRelatedValue(r, L0.PGraph_definition, Bindings.STRING); - if(code != null) { - pgraphCodes.put(r, code); - } - pgraphs.add(r); - readNameAndParent(graph, container, r); - } - } - } - - private void readGraphFiles(ReadGraph graph) throws DatabaseException { - Layer0 L0 = Layer0.getInstance(graph); - GraphFileResource GF = GraphFileResource.getInstance(graph); - for(Resource container : containers) { - for(Resource r : CommonDBUtils.objectsWithType(graph, container, L0.ConsistsOf, GF.File)) { - byte[] bytes = graph.getPossibleRelatedValue(r, GF.HasFiledata, Bindings.BYTE_ARRAY); - if(bytes != null) { - graphFileBytes.put(r, bytes); - } - graphFiles.add(r); - readNameAndParent(graph, container, r); + if(result.size() > 0) + contentDumps.put(r, result.toArray()); + } catch (DatabaseException e) { + LOGGER.error("Error while computing content dump for " + r, e); } } } public void read(ReadGraph graph, Resource ontology) throws DatabaseException { this.ontology = ontology; - containers.add(ontology); - readLibraries(graph, ontology); - readComponentTypes(graph); - readComposites(graph); - readComponents(graph); - readSCLModules(graph); - readPGraphs(graph); - readGraphFiles(graph); + readHierarchy(graph, ontology); + readGeneric(graph); } private File escapeFile(File file) { @@ -223,69 +114,58 @@ public class DumpOntologyStructure { if(folder.exists()) FileUtils.deleteAll(folder); folder.mkdirs(); - writeLibraries(folder); - writeSCLModules(folder); - writePGraphs(folder); - writeGraphFiles(folder); - writeComponentTypes(folder); - writeComponents(folder); + writeDirectories(folder); + writeResources(folder); } private File getFolder(File root, Resource library) { if(ontology.equals(library)) return root; Resource parent = parents.get(library); + if(parent == null) + throw new IllegalStateException("null parent for " + library); File parentFolder = getFolder(root, parent); return new File(parentFolder, FileUtils.escapeFileName(names.get(library))); } - - private File getParentFolder(File root, Resource r) { - Resource parent = parents.get(r); - return getFolder(root, parent); - } - private File getFile(File root, Resource r) { - return new File(getParentFolder(root, r), FileUtils.escapeFileName(names.get(r))); + private File getFile(File rootFolder, Resource r) { + Resource parent = parents.get(r); + File folder = getFolder(rootFolder, parent); + return new File(folder, FileUtils.escapeFileName(names.get(r))); } - private void writeLibraries(File rootFolder) { - for(Resource library : folders) { + private void writeDirectories(File rootFolder) { + for(Resource library : containers()) { File folder = getFolder(rootFolder, library); folder.mkdirs(); libraryFolders.put(library, folder); } } - - private void writeSCLModules(File rootFolder) throws IOException { - for(Resource r : modules) { - FileUtils.writeFile(getFile(rootFolder, r), moduleCodes.get(r).getBytes()); + + private void writeResources(File rootFolder) throws IOException { + for(Resource r : parents.keySet()) { + writeResource(rootFolder, r); } } - private void writePGraphs(File rootFolder) throws IOException { - for(Resource r : pgraphs) { - FileUtils.writeFile(getFile(rootFolder, r), pgraphCodes.get(r).getBytes()); - } + private boolean isParent(Resource r) { + return parents.values().contains(r); } - - private void writeGraphFiles(File rootFolder) throws IOException { - for(Resource r : graphFiles) { - FileUtils.writeFile(getFile(rootFolder, r), graphFileBytes.get(r)); + + private void writeResource(File rootFolder, Resource resource) throws IOException { + byte[] dump = contentDumps.get(resource); + if(dump == null) + dump = "".getBytes(StandardCharsets.UTF_8); + if(isParent(resource)) { + if(dump.length > 0) + FileUtils.writeFile(new File(getFolder(rootFolder, resource), "__contents__"), dump); + } else { + write(rootFolder, resource, dump); } } - private void writeComponentTypes(File rootFolder) throws IOException { - for(Resource r : componentTypes) { - File folder = getFolder(rootFolder, r); - File file = new File(folder, "__interface__"); - FileUtils.writeFile(file, componentTypeDumps.get(r).getBytes()); - } + private void write(File rootFolder, Resource resource, byte[] bytes) throws IOException { + FileUtils.writeFile(getFile(rootFolder, resource), bytes); } - private void writeComponents(File rootFolder) throws IOException { - for(Resource r : components) { - FileUtils.writeFile(getFile(rootFolder, r), componentDumps.get(r).getBytes()); - } - } - } diff --git a/bundles/org.simantics.modeling/src/org/simantics/modeling/utils/HeadlessComponentTypePropertiesResultRequest.java b/bundles/org.simantics.modeling/src/org/simantics/modeling/utils/HeadlessComponentTypePropertiesResultRequest.java index a2f7138b4..757643dbd 100644 --- a/bundles/org.simantics.modeling/src/org/simantics/modeling/utils/HeadlessComponentTypePropertiesResultRequest.java +++ b/bundles/org.simantics.modeling/src/org/simantics/modeling/utils/HeadlessComponentTypePropertiesResultRequest.java @@ -52,12 +52,70 @@ public class HeadlessComponentTypePropertiesResultRequest extends UniqueRead result = new ArrayList<>(); List connectionPoints = new ArrayList<>(); Layer0 L0 = Layer0.getInstance(graph); - Layer0X L0X = Layer0X.getInstance(graph); StructuralResource2 STR = StructuralResource2.getInstance(graph); boolean typeIsImmutable = graph.isImmutable(componentType) @@ -67,67 +125,22 @@ public class HeadlessComponentTypePropertiesResultRequest extends UniqueRead getConnectionPointDescriptors(ReadGraph graph, Resource relationType) throws DatabaseException { - throw new IllegalStateException(); + return Collections.emptyList(); + //throw new IllegalStateException(); } @Override -- 2.43.2