]> gerrit.simantics Code Review - simantics/interop.git/blob - org.simantics.xml.sax/src/org/simantics/xml/sax/OntologyCombinator.java
733d027103d964ac31fa5ea982462de6ef0c1a1e
[simantics/interop.git] / org.simantics.xml.sax / src / org / simantics / xml / sax / OntologyCombinator.java
1 package org.simantics.xml.sax;
2
3 import java.io.BufferedReader;
4 import java.io.BufferedWriter;
5 import java.io.File;
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;
14 import java.util.Set;
15
16 public class OntologyCombinator {
17         
18         String packageLineStart = new String("package");
19         String resourceLineStart = "public final Resource ";
20         String uriLineStart = "public static final String ";
21         
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;
27         
28         protected void process(File[] inputFiles) throws IOException {
29                 for (File inputFile : inputFiles) {
30                         BufferedReader reader = new BufferedReader(new FileReader(inputFile));
31                         try {
32                                 String line;
33                                 String uri = null;
34                                 String filename = inputFile.getName();
35                                 String classname = filename.substring(0,filename.length()-5);
36                                 classNames.add(classname);
37                                 while ((line = reader.readLine()) != null) {
38                                         line = line.trim();
39                                         if (line.startsWith(resourceLineStart)) {
40                                                 String res = line.substring(resourceLineStart.length(), line.length()-1);
41                                                 resources.add(res);
42                                         } else if (line.startsWith(uriLineStart)) {
43                                                 String euri = line.substring(line.indexOf('"')+1, line.length()-2);
44                                                 if (uri == null) {
45                                                         uri = euri;
46                                                 } else {
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);
51                                                                         break;
52                                                                 }
53                                                         }
54                                                 }
55                                         } else if (line.startsWith(packageLineStart)) {
56                                                 packageLine = line;
57                                         }
58                                 }
59                                 if (uri != null && uri.length() > 6) {
60                                         if (uri.endsWith("/")) {
61                                                 uri = uri.substring(0, uri.length()-1);
62                                         }
63                                         ontologyUris.add(uri);
64                                 }
65                                 else
66                                         throw new IOException("Could not resolve ontology uri for file " + inputFile.getName());
67                         } finally {
68                                 reader.close();
69                         }
70                 }
71                 
72                 sortedResourcses = new ArrayList<>();
73                 sortedResourcses.addAll(resources);
74                 Collections.sort(sortedResourcses);
75                 
76         }
77         
78         public void combine(File[] inputFiles, File outputFile) throws IOException{
79                 process(inputFiles);
80                 
81                 PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter(outputFile)));
82                 String className = outputFile.getName();
83                 int dp = className.indexOf(".");
84                 if (dp > 0)
85                         className = className.substring(0,dp);
86                 
87                 try {
88                         writer.println(packageLine);
89                         writer.println();
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;");
100                         writer.println();
101                         writer.println();
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<>();");
106                         writer.println();
107                         writer.println("  private Resource ontologyResource;");
108                         writer.println("  private Object resourceObject;");
109                         writer.println();
110                         writer.println("  static void init(ReadGraph graph) throws DatabaseException{");
111                         writer.println("     if (init)");
112                         writer.println("       return;");
113                         writer.println("     ");
114                         for (int i = 0; i < inputFiles.length; i++) {
115                         writer.println("     add(graph.getResource(\"" +ontologyUris.get(i) +"\"), " + classNames.get(i) +".getInstance(graph));");
116                         }
117                         writer.println("     ");
118                         writer.println("     init = true;");
119                         writer.println("  }");
120                         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("  }");
127                         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("  }");
136                         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("  }");
151                         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("  }");
157                         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("  }");
166                         writer.println("  ");
167                         for (String s : sortedResourcses) {
168                     writer.println("  public Resource "+s+";");
169                         }
170                         writer.println("  ");
171                         writer.println("  private void init() {");
172                         for (String s : sortedResourcses) {
173                         writer.println("        "+s+" = get(\""+s+"\");");
174                         }
175                         writer.println("  }");
176                         writer.println("}");
177                         
178                         
179                 }       finally {
180                         writer.close();
181                 }
182                 
183         }
184 }