]> gerrit.simantics Code Review - simantics/interop.git/blob - org.simantics.xml.sax/src/org/simantics/xml/sax/OntologyCombinator.java
0d084161dc4839b421a58ad2bd6585cddebaffeb
[simantics/interop.git] / org.simantics.xml.sax / src / org / simantics / xml / sax / OntologyCombinator.java
1 package org.simantics.xml.sax;\r
2 \r
3 import java.io.BufferedReader;\r
4 import java.io.BufferedWriter;\r
5 import java.io.File;\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
15 \r
16 public class OntologyCombinator {\r
17         \r
18         \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
24                 \r
25                 \r
26                 String packageLineStart = "package";\r
27                 String resourceLineStart = "public final Resource ";\r
28                 String uriLineStart = "public static final String ";\r
29                 \r
30                 \r
31                 \r
32                 for (File inputFile : inputFiles) {\r
33                         BufferedReader reader = new BufferedReader(new FileReader(inputFile));\r
34                         try {\r
35                                 String line;\r
36                                 String uri = null;\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
41                                         line = line.trim();\r
42                                         if (line.startsWith(resourceLineStart)) {\r
43                                                 String res = line.substring(resourceLineStart.length(), line.length()-1);\r
44                                                 resources.add(res);\r
45                                         } else if (line.startsWith(uriLineStart)) {\r
46                                                 String euri = line.substring(line.indexOf('"')+1, line.length()-2);\r
47                                                 if (uri == null) {\r
48                                                         uri = euri;\r
49                                                 } else {\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
54                                                                         break;\r
55                                                                 }\r
56                                                         }\r
57                                                 }\r
58                                         } else if (line.startsWith(packageLineStart)) {\r
59                                                 packageLine = line;\r
60                                         }\r
61                                 }\r
62                                 if (uri != null && uri.length() > 6) {\r
63                                         if (uri.endsWith("/")) {\r
64                                                 uri = uri.substring(0, uri.length()-1);\r
65                                         }\r
66                                         ontologyUris.add(uri);\r
67                                 }\r
68                                 else\r
69                                         throw new IOException("Could not resolve ontology uri for file " + inputFile.getName());\r
70                         } finally {\r
71                                 reader.close();\r
72                         }\r
73                 }\r
74                 List<String> sortedResourcses = new ArrayList<>();\r
75                 sortedResourcses.addAll(resources);\r
76                 Collections.sort(sortedResourcses);\r
77                 \r
78                 PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter(outputFile)));\r
79                 String className = outputFile.getName();\r
80                 int dp = className.indexOf(".");\r
81                 if (dp > 0)\r
82                         className = className.substring(0,dp);\r
83                 \r
84                 try {\r
85                         writer.println(packageLine);\r
86                         writer.println();\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
97                         writer.println();\r
98                         writer.println();\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
103                         writer.println();\r
104                         writer.println("  private Resource ontologyResource;");\r
105                         writer.println("  private Object resourceObject;");\r
106                         writer.println();\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
113                         }\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
166                         }\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
171                         }\r
172                         writer.println("  }");\r
173                         writer.println("}");\r
174                         \r
175                         \r
176                 }       finally {\r
177                         writer.close();\r
178                 }\r
179                 \r
180         }\r
181 }\r