1 package org.simantics.scl.reflection;
\r
4 import java.util.Collection;
\r
5 import java.util.HashMap;
\r
6 import java.util.Map;
\r
7 import java.util.regex.Matcher;
\r
8 import java.util.regex.Pattern;
\r
10 import org.eclipse.core.internal.runtime.PlatformActivator;
\r
11 import org.osgi.framework.Bundle;
\r
12 import org.osgi.framework.Version;
\r
14 public class OntologyVersions {
\r
16 private static final boolean PRINT = false;
\r
18 private static OntologyVersions INSTANCE;
\r
20 private final Pattern versionExtractPattern = Pattern.compile("^.*-(\\d+\\.\\d+)");
\r
22 private Map<String, String> unversionedToCurrent = new HashMap<String, String>();
\r
23 private Map<String, String> currentToUnversioned = new HashMap<String, String>();
\r
24 final private Pattern unversionedPattern;
\r
25 final private Pattern currentPattern;
\r
27 private OntologyVersions() {
\r
29 Map<String, Version> versions = new HashMap<String, Version>();
\r
31 if(PRINT) System.err.println("== Ontology report ==");
\r
32 for(Bundle bundle : PlatformActivator.getContext().getBundles()) {
\r
34 URL url = bundle.getEntry("graph.tg");
\r
35 if (url==null) continue;
\r
37 String name = (String) bundle.getHeaders().get("Bundle-Name");
\r
38 Version osgiVersion = bundle.getVersion();
\r
39 Version previous = versions.get(name);
\r
40 if(previous == null || osgiVersion.compareTo(previous) > 0) versions.put(name, osgiVersion);
\r
41 if(PRINT) System.err.println("found: " + name + ":" + osgiVersion);
\r
47 for(Map.Entry<String, Version> entry : versions.entrySet()) {
\r
48 int minor = entry.getValue().getMinor();
\r
49 int major = entry.getValue().getMajor();
\r
50 String unversioned = entry.getKey() + "-0.0";
\r
51 String versioned = entry.getKey() + "-" + major + "." + minor;
\r
52 unversionedToCurrent.put(unversioned, versioned);
\r
53 currentToUnversioned.put(versioned, unversioned);
\r
54 if(PRINT) System.err.println("latest: " + versioned);
\r
57 if(PRINT) System.err.println("== Ontology report ends ==");
\r
59 unversionedPattern = Pattern.compile("(" + joinKeys(unversionedToCurrent) + ")");
\r
60 currentPattern = Pattern.compile("(" + joinKeys(currentToUnversioned) + ")");
\r
64 public static OntologyVersions getInstance() {
\r
65 if(INSTANCE == null) {
\r
66 INSTANCE = new OntologyVersions();
\r
71 private String joinKeys(Map<String,String> tokens) {
\r
72 Collection<String> keys = tokens.keySet();
\r
73 StringBuilder b = new StringBuilder();
\r
74 boolean first = true;
\r
75 for(String key : keys) {
\r
76 if(!first) b.append("|");
\r
80 return b.toString();
\r
84 * Replaces all references to URIs with unversioned ontologies with current versions
\r
85 * e.g. http://www.simantics.org/Layer0-0.0 => http://www.simantics.org/Layer0-1.0
\r
87 * @param text Any string
\r
89 public String currentVersion(String text) {
\r
91 Matcher matcher = unversionedPattern.matcher(text);
\r
93 StringBuffer sb = new StringBuffer(text.length());
\r
94 while(matcher.find()) {
\r
95 matcher.appendReplacement(sb, unversionedToCurrent.get(matcher.group(1)));
\r
97 matcher.appendTail(sb);
\r
98 return sb.toString();
\r
103 * Replaces all references to URIs from current ontologies with unversioned ones
\r
104 * e.g. http://www.simantics.org/Layer0-1.0 => http://www.simantics.org/Layer0-0.0
\r
106 * @param text Any string
\r
108 public String unversioned(String text) {
\r
110 Matcher matcher = currentPattern.matcher(text);
\r
112 StringBuffer sb = new StringBuffer(text.length());
\r
113 while(matcher.find()) {
\r
114 matcher.appendReplacement(sb, currentToUnversioned.get(matcher.group(1)));
\r
116 matcher.appendTail(sb);
\r
117 return sb.toString();
\r
122 * Calculates the current version of the specified version-agnostic URI and
\r
123 * returns only the version part.
\r
124 * e.g. http://www.simantics.org/Layer0-0.0 => 1.1
\r
126 * @param text Any string
\r
128 public String currentOntologyVersion(String ontologyURI) {
\r
129 String versionedURI = currentVersion(ontologyURI);
\r
130 Matcher m = versionExtractPattern.matcher(versionedURI);
\r
132 throw new IllegalArgumentException("Cannot extract version from ontology URI '" + ontologyURI + "' with pattern " + versionExtractPattern.pattern());
\r