1 package org.simantics.xml.sax;
3 import java.io.BufferedReader;
4 import java.io.BufferedWriter;
6 import java.io.FileReader;
7 import java.io.FileWriter;
8 import java.io.IOException;
9 import java.io.PrintWriter;
10 import java.util.ArrayList;
11 import java.util.Collections;
12 import java.util.HashSet;
13 import java.util.List;
16 public class OntologyCombinator {
18 String packageLineStart = new String("package");
19 String resourceLineStart = "public final Resource ";
20 String uriLineStart = "public static final String ";
22 Set<String> resources = new HashSet<>();
23 List<String> ontologyUris = new ArrayList<>();
24 List<String> classNames = new ArrayList<>();
25 String packageLine = null;
26 List<String> sortedResourcses;
28 protected void process(File[] inputFiles) throws IOException {
29 for (File inputFile : inputFiles) {
30 BufferedReader reader = new BufferedReader(new FileReader(inputFile));
34 String filename = inputFile.getName();
35 String classname = filename.substring(0,filename.length()-5);
36 classNames.add(classname);
37 while ((line = reader.readLine()) != null) {
39 if (line.startsWith(resourceLineStart)) {
40 String res = line.substring(resourceLineStart.length(), line.length()-1);
42 } else if (line.startsWith(uriLineStart)) {
43 String euri = line.substring(line.indexOf('"')+1, line.length()-2);
47 int max = Math.min(euri.length(), uri.length());
48 for (int i = 0; i < max; i++) {
49 if (euri.charAt(i) != uri.charAt(i)) {
50 uri = uri.substring(0,i);
55 } else if (line.startsWith(packageLineStart)) {
59 if (uri != null && uri.length() > 6) {
60 if (uri.endsWith("/")) {
61 uri = uri.substring(0, uri.length()-1);
63 ontologyUris.add(uri);
66 throw new IOException("Could not resolve ontology uri for file " + inputFile.getName());
72 sortedResourcses = new ArrayList<>();
73 sortedResourcses.addAll(resources);
74 Collections.sort(sortedResourcses);
78 public void combine(File[] inputFiles, File outputFile) throws IOException{
81 PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter(outputFile)));
82 String className = outputFile.getName();
83 int dp = className.indexOf(".");
85 className = className.substring(0,dp);
88 writer.println(packageLine);
90 writer.println("import java.lang.reflect.Field;");
91 writer.println("import java.util.Collection;");
92 writer.println("import java.util.HashMap;");
93 writer.println("import java.util.Map;");
94 writer.println("import org.simantics.Simantics;");
95 writer.println("import org.simantics.db.ReadGraph;");
96 writer.println("import org.simantics.db.Resource;");
97 writer.println("import org.simantics.db.exception.DatabaseException;");
98 writer.println("import org.simantics.db.request.Read;");
99 writer.println("import org.simantics.layer0.Layer0;");
102 writer.println("public class " + className + " {");
103 writer.println(" private static boolean init = false;");
104 writer.println(" private static Map<Resource, Object> resourceObjects = new HashMap<>();");
105 writer.println(" private static Map<Resource, "+className+"> loaderObjects = new HashMap<>();");
107 writer.println(" private Resource ontologyResource;");
108 writer.println(" private Object resourceObject;");
110 writer.println(" static void init(ReadGraph graph) throws DatabaseException{");
111 writer.println(" if (init)");
112 writer.println(" return;");
114 for (int i = 0; i < inputFiles.length; i++) {
115 writer.println(" add(graph.getResource(\"" +ontologyUris.get(i) +"\"), " + classNames.get(i) +".getInstance(graph));");
118 writer.println(" init = true;");
119 writer.println(" }");
121 writer.println(" public static void add(Resource resource, Object object) {");
122 writer.println(" if (resource == null || object == null)");
123 writer.println(" throw new IllegalArgumentException();");
124 writer.println(" resourceObjects.put(resource, object);");
125 writer.println(" loaderObjects.put(resource, new "+className+"(resource, object));");
126 writer.println(" }");
128 writer.println(" public static "+className+" getOntology(final Resource res) throws DatabaseException {");
129 writer.println(" return Simantics.getSession().syncRequest(new Read<"+className+">() {");
130 writer.println(" @Override");
131 writer.println(" public "+className+" perform(ReadGraph graph) throws DatabaseException {");
132 writer.println(" return getOntology(graph, res);");
133 writer.println(" }");
134 writer.println(" });");
135 writer.println(" }");
137 writer.println(" public static "+className+" getOntology(ReadGraph graph, Resource res) throws DatabaseException{");
138 writer.println(" init(graph);");
139 writer.println(" Layer0 L0 = Layer0.getInstance(graph);");
140 writer.println(" Collection<Resource> types = graph.getTypes(res);");
141 writer.println(" for (Resource type : types) {");
142 writer.println(" Resource part = graph.getPossibleObject(type, L0.PartOf);");
143 writer.println(" while (part != null) {");
144 writer.println(" if (loaderObjects.containsKey(part))");
145 writer.println(" return loaderObjects.get(part);");
146 writer.println(" part = graph.getPossibleObject(part, L0.PartOf);");
147 writer.println(" }");
148 writer.println(" }");
149 writer.println(" return null;");
150 writer.println(" }");
152 writer.println(" private "+className+"(Resource ontologyRes, Object resourceObject) {");
153 writer.println(" this.ontologyResource = ontologyRes;");
154 writer.println(" this.resourceObject = resourceObject;");
155 writer.println(" init();");
156 writer.println(" }");
158 writer.println(" private Resource get(String name) {");
159 writer.println(" try {");
160 writer.println(" Field field = resourceObject.getClass().getDeclaredField(name);");
161 writer.println(" return (Resource)field.get(resourceObject);");
162 writer.println(" } catch (Exception e){");
163 writer.println(" return null;");
164 writer.println(" }");
165 writer.println(" }");
167 for (String s : sortedResourcses) {
168 writer.println(" public Resource "+s+";");
171 writer.println(" private void init() {");
172 for (String s : sortedResourcses) {
173 writer.println(" "+s+" = get(\""+s+"\");");
175 writer.println(" }");