1 package org.simantics.db.common.utils;
3 import java.util.Collection;
4 import java.util.HashSet;
7 import org.simantics.databoard.Bindings;
8 import org.simantics.databoard.util.URIStringUtils;
9 import org.simantics.db.ReadGraph;
10 import org.simantics.db.Resource;
11 import org.simantics.db.common.NamedResource;
12 import org.simantics.db.common.request.PossibleIndexRoot;
13 import org.simantics.db.exception.DatabaseException;
14 import org.simantics.layer0.Layer0;
16 public class Versions {
18 public static String make(String baseName, String version) {
19 return baseName + "@" + version;
22 public static String getBaseVersion(String version) {
24 Integer.parseInt(version);
26 } catch (NumberFormatException e) {
31 public static String getBaseName(String name) {
32 int pos = name.lastIndexOf('@');
33 if(pos == -1) return name;
34 return name.substring(0, pos);
37 public static String getVersion(String name) {
38 if(name == null) return null;
39 if(!name.contains("@")) return null;
40 int pos = name.lastIndexOf('@');
41 return name.substring(pos+1);
44 public static String getBaseName(ReadGraph graph, Resource artifact) throws DatabaseException {
45 Layer0 L0 = Layer0.getInstance(graph);
46 String name = graph.getPossibleRelatedValue(artifact, L0.HasName, Bindings.STRING);
47 if(name == null) return "";
48 if(!name.contains("@")) return name;
49 int pos = name.lastIndexOf('@');
50 return name.substring(0, pos);
53 public static String getVersion(ReadGraph graph, Resource artifact) throws DatabaseException {
54 Layer0 L0 = Layer0.getInstance(graph);
55 String name = graph.getPossibleRelatedValue(artifact, L0.HasName, Bindings.STRING);
56 return getVersion(name);
59 public static Collection<NamedResource> getOlderVersions(ReadGraph graph, Resource artifact) throws DatabaseException {
61 Set<NamedResource> result = new HashSet<NamedResource>();
63 VersionInfo info = graph.syncRequest(new VersionInfoRequest(artifact));
64 result.addAll(info.getOlderVersions());
66 Resource indexRoot = graph.syncRequest(new PossibleIndexRoot(artifact));
67 if(indexRoot == null || indexRoot.equals(artifact)) return result;
69 VersionInfo versions = graph.syncRequest(new VersionInfoRequest(indexRoot));
70 for(NamedResource ontology : versions.getOlderVersions()) {
71 VersionMap map = match(graph, artifact, ontology.getResource());
72 result.addAll(map.getOlderOrEqualVersions(graph, artifact));
79 public static Collection<NamedResource> getNewerVersions(ReadGraph graph, Resource artifact) throws DatabaseException {
81 Set<NamedResource> result = new HashSet<NamedResource>();
83 VersionInfo info = graph.syncRequest(new VersionInfoRequest(artifact));
84 result.addAll(info.getNewerVersions());
86 Resource indexRoot = graph.syncRequest(new PossibleIndexRoot(artifact));
87 if(indexRoot == null || indexRoot.equals(artifact)) return result;
89 VersionInfo versions = graph.syncRequest(new VersionInfoRequest(indexRoot));
90 for(NamedResource ontology : versions.getNewerVersions()) {
91 VersionMap map = match(graph, artifact, ontology.getResource());
92 result.addAll(map.getNewerOrEqualVersions(graph, artifact));
99 public static VersionMap match(ReadGraph graph, Resource type, Resource newOntology) throws DatabaseException {
100 Resource originalOntology = graph.syncRequest(new PossibleIndexRoot(type));
101 String originalURI = graph.getURI(originalOntology);
102 String newOntologyURI = graph.getURI(newOntology);
103 String typeURI = graph.getURI(type);
104 String typeURIInNewOntology = newOntologyURI + typeURI.substring(originalURI.length());
105 String[] parts = URIStringUtils.splitURI(typeURIInNewOntology);
106 Resource newLibrary = graph.getPossibleResource(parts[0]);
107 if(newLibrary == null) return null;
108 return graph.syncRequest(new VersionMapRequest(newLibrary));
111 public static String getStandardNameString(ReadGraph graph, Resource r) throws DatabaseException {
113 Layer0 L0 = Layer0.getInstance(graph);
114 String name = graph.getPossibleRelatedValue(r, L0.HasName, Bindings.STRING);
116 VersionInfo versions = graph.syncRequest(new VersionInfoRequest(r));
117 if(versions.versions.size() != 1) {
118 int pos = name.lastIndexOf('@');
119 if(pos == -1) return name + " [No version]";
120 String base = name.substring(0, pos);
121 String version = name.substring(pos+1);
122 return base + " [Version " + version + "]";
124 return versions.baseName;
128 return NameUtils.getSafeName(graph, r);
132 public static String getStandardPathNameString(ReadGraph graph, Resource r) throws DatabaseException {
134 Layer0 L0 = Layer0.getInstance(graph);
136 String standardName = getStandardNameString(graph, r);
138 Resource indexRoot = graph.syncRequest(new PossibleIndexRoot(r));
139 if(indexRoot.equals(r)) return standardName;
141 Resource indexRootParent = graph.getPossibleObject(indexRoot, L0.PartOf);
143 String indexRootName = getStandardNameString(graph, indexRoot);
144 String indexRootParentURI = graph.getPossibleURI(indexRootParent);
146 Resource parent = graph.getPossibleObject(r, L0.PartOf);
147 String parentURI = graph.getURI(parent);
148 String indexRootURI = graph.getPossibleURI(indexRoot);
149 String path = (parent.equals(indexRoot)) ? "" : parentURI.substring(indexRootURI.length()+1) + "/";
151 return path + standardName + " in " + indexRootParentURI + indexRootName;