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