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