]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.reflection/src/org/simantics/scl/reflection/OntologyVersions.java
Several Wiki documentation view improvements.
[simantics/platform.git] / bundles / org.simantics.scl.reflection / src / org / simantics / scl / reflection / OntologyVersions.java
1 package org.simantics.scl.reflection;\r
2 \r
3 import java.net.URL;\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
9 \r
10 import org.eclipse.core.internal.runtime.PlatformActivator;\r
11 import org.osgi.framework.Bundle;\r
12 import org.osgi.framework.Version;\r
13 \r
14 public class OntologyVersions {\r
15 \r
16         private static final boolean PRINT = false;\r
17         \r
18         private static OntologyVersions INSTANCE;\r
19         \r
20         private final Pattern versionExtractPattern = Pattern.compile("^.*-(\\d+\\.\\d+)");\r
21 \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
26         \r
27         private OntologyVersions() {\r
28 \r
29                 Map<String, Version> versions = new HashMap<String, Version>(); \r
30                 \r
31                 if(PRINT) System.err.println("== Ontology report ==");\r
32         for(Bundle bundle : PlatformActivator.getContext().getBundles()) {\r
33                 \r
34                 URL url = bundle.getEntry("graph.tg");\r
35                 if (url==null) continue;\r
36                 try {\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
42                 } finally {\r
43                 }\r
44                 \r
45         }\r
46         \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
55         }\r
56         \r
57                 if(PRINT) System.err.println("== Ontology report ends ==");\r
58         \r
59         unversionedPattern = Pattern.compile("(" + joinKeys(unversionedToCurrent) + ")");\r
60         currentPattern = Pattern.compile("(" + joinKeys(currentToUnversioned) + ")");\r
61                 \r
62         }\r
63         \r
64         public static OntologyVersions getInstance() {\r
65                 if(INSTANCE == null) {\r
66                         INSTANCE = new OntologyVersions();\r
67                 }\r
68                 return INSTANCE;\r
69         }\r
70 \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
77                 first = false;\r
78                 b.append(key);\r
79         }\r
80         return b.toString();\r
81     }\r
82     \r
83     /*\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
86      * \r
87      * @param text Any string\r
88      */\r
89     public String currentVersion(String text) {\r
90         \r
91         Matcher matcher = unversionedPattern.matcher(text);\r
92 \r
93         StringBuffer sb = new StringBuffer(text.length());\r
94         while(matcher.find()) {\r
95             matcher.appendReplacement(sb, unversionedToCurrent.get(matcher.group(1)));\r
96         }\r
97         matcher.appendTail(sb);\r
98         return sb.toString();\r
99 \r
100     }\r
101     \r
102     /*\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
105      * \r
106      * @param text Any string\r
107      */\r
108     public String unversioned(String text) {\r
109         \r
110         Matcher matcher = currentPattern.matcher(text);\r
111 \r
112         StringBuffer sb = new StringBuffer(text.length());\r
113         while(matcher.find()) {\r
114             matcher.appendReplacement(sb, currentToUnversioned.get(matcher.group(1)));\r
115         }\r
116         matcher.appendTail(sb);\r
117         return sb.toString();\r
118 \r
119     }\r
120 \r
121     /**\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
125      * \r
126      * @param text Any string\r
127      */\r
128     public String currentOntologyVersion(String ontologyURI) {\r
129         String versionedURI = currentVersion(ontologyURI);\r
130         Matcher m = versionExtractPattern.matcher(versionedURI);\r
131         if (!m.matches())\r
132             throw new IllegalArgumentException("Cannot extract version from ontology URI '" + ontologyURI + "' with pattern " + versionExtractPattern.pattern());\r
133         return m.group(1);\r
134     }\r
135     \r
136 }\r