]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling/src/org/simantics/modeling/scl/GraphModuleSourceRepository.java
Testing SonarQube with Simantics Platform SDK - still
[simantics/platform.git] / bundles / org.simantics.modeling / src / org / simantics / modeling / scl / GraphModuleSourceRepository.java
1 package org.simantics.modeling.scl;\r
2 \r
3 import java.util.Collection;\r
4 \r
5 import org.simantics.Simantics;\r
6 import org.simantics.db.ReadGraph;\r
7 import org.simantics.db.RequestProcessorSpecific;\r
8 import org.simantics.db.Resource;\r
9 import org.simantics.db.WriteGraph;\r
10 import org.simantics.db.common.request.UnaryRead;\r
11 import org.simantics.db.common.request.WriteRequest;\r
12 import org.simantics.db.exception.DatabaseException;\r
13 import org.simantics.db.procedure.SyncListener;\r
14 import org.simantics.db.request.Read;\r
15 import org.simantics.layer0.Layer0;\r
16 import org.simantics.modeling.ModelingUtils;\r
17 import org.simantics.scl.compiler.module.repository.UpdateListener;\r
18 import org.simantics.scl.compiler.source.ModuleSource;\r
19 import org.simantics.scl.compiler.source.StringModuleSource;\r
20 import org.simantics.scl.compiler.source.repository.ModuleSourceRepository;\r
21 import org.simantics.scl.runtime.SCLContext;\r
22 import org.simantics.scl.runtime.tuple.Tuple0;\r
23 \r
24 import gnu.trove.procedure.TObjectProcedure;\r
25 import gnu.trove.set.hash.THashSet;\r
26 \r
27 public enum GraphModuleSourceRepository implements ModuleSourceRepository {\r
28     INSTANCE;\r
29 \r
30     @Override\r
31     public ModuleSource getModuleSource(final String moduleName, UpdateListener listener) {\r
32         if(!moduleName.startsWith("http://"))\r
33             return null;\r
34 \r
35         Object graph = SCLContext.getCurrent().get("graph");\r
36         RequestProcessorSpecific requestProcessor;\r
37         if(graph instanceof ReadGraph)\r
38             requestProcessor = (ReadGraph)graph;\r
39         else\r
40             requestProcessor = Simantics.getSession();\r
41 \r
42         Read<ModuleSource> request = new ReadModuleSource(moduleName);\r
43 \r
44         try {\r
45             if(listener != null)\r
46                 return requestProcessor.syncRequest(request, new ModuleListener(listener, moduleName));\r
47             else\r
48                 return requestProcessor.syncRequest(request);\r
49         } catch (DatabaseException e) {\r
50             e.printStackTrace();\r
51             return null;\r
52         }\r
53     }\r
54 \r
55     static class ModuleListener implements SyncListener<ModuleSource> {\r
56         UpdateListener listener;\r
57         boolean alreadyExecutedOnce;\r
58         final String moduleName;\r
59         public ModuleListener(UpdateListener listener, String moduleName) {\r
60             this.listener = listener;\r
61             this.moduleName = moduleName;\r
62         }\r
63         @Override\r
64         public boolean isDisposed() {\r
65             return listener == null;\r
66         }\r
67         private void fireUpdate(ReadGraph graph) {\r
68             if(listener != null) {\r
69                 SCLContext context = SCLContext.getCurrent();\r
70                 Object oldGraph = context.put("graph", graph);\r
71                 try {\r
72                     listener.notifyAboutUpdate();\r
73                 } finally {\r
74                     listener = null;\r
75                     context.put("graph", oldGraph);\r
76                 }\r
77             }\r
78         }\r
79         @Override\r
80         public void execute(ReadGraph graph, ModuleSource result)\r
81                 throws DatabaseException {\r
82             if(alreadyExecutedOnce)\r
83                 fireUpdate(graph);\r
84             else\r
85                 alreadyExecutedOnce = true;\r
86         }\r
87         @Override\r
88         public void exception(ReadGraph graph, Throwable t)\r
89                 throws DatabaseException {\r
90             t.printStackTrace();\r
91             if(alreadyExecutedOnce && listener != null)\r
92                 fireUpdate(graph);\r
93         }\r
94     };\r
95     \r
96     public static class GraphModuleSource extends StringModuleSource {\r
97 \r
98         public GraphModuleSource(String moduleName, ClassLoader classLoader, String moduleText) {\r
99             super(moduleName, classLoader, moduleText);\r
100         }\r
101         \r
102         @Override\r
103         public boolean isUpdateable() {\r
104             return true;\r
105         }\r
106         \r
107         @Override\r
108         public void update(String newSourceText) {\r
109             try {\r
110                 Simantics.getSession().syncRequest(new WriteModuleSource(getModuleName(), newSourceText));\r
111             } catch (DatabaseException e) {\r
112                 e.printStackTrace();\r
113             }\r
114         }\r
115     }\r
116 \r
117     static class ReadModuleSource extends UnaryRead<String, ModuleSource> {\r
118         public ReadModuleSource(String moduleName) {\r
119             super(moduleName);\r
120         }\r
121 \r
122         @Override\r
123         public ModuleSource perform(ReadGraph graph) throws DatabaseException {\r
124             Resource moduleResource = graph.getPossibleResource(parameter);\r
125             if(moduleResource == null)\r
126                 return null;\r
127             Layer0 L0 = Layer0.getInstance(graph);\r
128             if(!graph.isInstanceOf(moduleResource, L0.SCLModule))\r
129                 return null;\r
130             String text = graph.getRelatedValue(moduleResource, L0.SCLModule_definition);\r
131             return new GraphModuleSource(parameter, getClass().getClassLoader(), text);\r
132         }\r
133     }\r
134     \r
135     static class WriteModuleSource extends WriteRequest {\r
136         private final String moduleURI;\r
137         private final String sourceText;\r
138         \r
139         public WriteModuleSource(String moduleURI, String sourceText) {\r
140             this.moduleURI = moduleURI;\r
141             this.sourceText = sourceText;\r
142         }\r
143 \r
144         @Override\r
145         public void perform(WriteGraph graph) throws DatabaseException {\r
146             Resource moduleResource = graph.getPossibleResource(moduleURI);\r
147             if(moduleResource == null)\r
148                 return;\r
149             Layer0 L0 = Layer0.getInstance(graph);\r
150             if(!graph.isInstanceOf(moduleResource, L0.SCLModule))\r
151                 return;\r
152             graph.claimLiteral(moduleResource, L0.SCLModule_definition, sourceText);\r
153         }\r
154     }\r
155 \r
156     @Override\r
157     public void forAllModules(TObjectProcedure<String> procedure) {\r
158         THashSet<String> moduleURIs;\r
159         try {\r
160             moduleURIs = Simantics.getSession().syncRequest(new Read<THashSet<String>>() {\r
161                 @Override\r
162                 public THashSet<String> perform(ReadGraph graph)\r
163                         throws DatabaseException {\r
164                     THashSet<String> result = new THashSet<String>(); \r
165                     Resource projectResource = Simantics.getProjectResource();\r
166                     Layer0 L0 = Layer0.getInstance(graph);\r
167                     for(Resource model : graph.getObjects(projectResource, L0.ConsistsOf)) {\r
168                         if(graph.isInstanceOf(model, L0.IndexRoot)) {\r
169                             for(Resource module : ModelingUtils.searchByType(graph, model, L0.SCLModule))\r
170                                 result.add(graph.getURI(module));\r
171                         }\r
172                     }\r
173                     \r
174                     Collection<Resource> ontologies = Simantics.applySCL("Simantics/SharedOntologies", "getSharedOntologies", graph, Tuple0.INSTANCE);\r
175                     for (Resource ontology : ontologies) {\r
176                         for(Resource module : ModelingUtils.searchByType(graph, ontology, L0.SCLModule))\r
177                             result.add(graph.getURI(module));\r
178                     }\r
179                     \r
180                     return result;\r
181                 }\r
182             });\r
183             moduleURIs.forEach(procedure);\r
184         } catch (DatabaseException e) {\r
185             e.printStackTrace();\r
186         }\r
187     }\r
188 \r
189     @Override\r
190     public void checkUpdates() {\r
191     }\r
192 \r
193     @Override\r
194     public String getDocumentation(String documentationName) {\r
195         return null;\r
196     }\r
197 \r
198     @Override\r
199     public void forAllDocumentations(TObjectProcedure<String> procedure) {\r
200     }\r
201 \r
202     @Override\r
203     public void clear() {\r
204     }\r
205 }\r