Fixing a deadlock. Some improvements to ModuleSourceRepository API
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / source / repository / MapModuleSourceRepository.java
1 package org.simantics.scl.compiler.source.repository;
2
3 import java.util.Collection;
4
5 import org.simantics.scl.compiler.module.Module;
6 import org.simantics.scl.compiler.module.repository.UpdateListener;
7 import org.simantics.scl.compiler.source.ModuleSource;
8 import org.simantics.scl.compiler.source.PrecompiledModuleSource;
9
10 import gnu.trove.map.hash.THashMap;
11 import gnu.trove.procedure.TObjectProcedure;
12
13 /**
14  * An implementation of {@link ModuleSourceRepository} as a finite map.
15  * This implementation does not support listening module changes,
16  * so it should not be modified after it has been taken into use.
17  * 
18  * @author Hannu Niemistö
19  */
20 public class MapModuleSourceRepository implements ModuleSourceRepository {
21     THashMap<String, ModuleSource> modules = new THashMap<String, ModuleSource>();
22     THashMap<String, String> documentations = new THashMap<String, String>();
23     
24     public MapModuleSourceRepository() {
25     }
26     
27     public MapModuleSourceRepository(ModuleSource ... descriptors) {
28         for(ModuleSource descriptor : descriptors)
29             addModuleDescriptor(descriptor);
30     }
31     
32     public MapModuleSourceRepository(Module ... modules) {
33         for(Module module : modules)
34             addModule(module);
35     }
36     
37     public void addModuleDescriptor(ModuleSource descriptor) {
38         modules.put(descriptor.getModuleName(), descriptor);
39     }
40     
41     public void addModule(Module module) {
42         addModuleDescriptor(new PrecompiledModuleSource(module));
43     }
44     
45     public void addDocumentation(String documentationName, String documentation) {
46         documentations.put(documentationName, documentation);
47     }
48
49     @Override
50     public ModuleSource getModuleSource(String moduleName,
51             UpdateListener listener) {
52         return modules.get(moduleName);
53     }
54
55     @Override
56     public Collection<String> getModuleNames() {
57         return modules.keySet();
58     }
59     
60     @Override
61     public void forAllModules(TObjectProcedure<String> procedure) {
62         modules.forEachKey(procedure);
63     }
64
65     @Override
66     public String getDocumentation(String documentationName) {
67         return documentations.get(documentationName);
68     }
69     
70     @Override
71     public Collection<String> getDocumentationNames() {
72         return documentations.keySet();
73     }
74 }