1 package org.simantics.scl.compiler.source.repository;
3 import java.util.ArrayList;
4 import java.util.Collection;
6 import org.simantics.scl.compiler.module.Module;
7 import org.simantics.scl.compiler.module.repository.UpdateListener;
8 import org.simantics.scl.compiler.module.repository.UpdateListener.Observable;
9 import org.simantics.scl.compiler.source.ModuleSource;
10 import org.simantics.scl.compiler.source.PrecompiledModuleSource;
12 import gnu.trove.map.hash.THashMap;
13 import gnu.trove.procedure.TObjectProcedure;
16 * An implementation of {@link ModuleSourceRepository} as a finite map.
17 * This implementation does not support listening module changes,
18 * so it should not be modified after it has been taken into use.
20 * @author Hannu Niemistö
22 public class MapModuleSourceRepository implements ModuleSourceRepository {
23 THashMap<String, ModuleSource> modules = new THashMap<String, ModuleSource>();
24 THashMap<String, String> documentations = new THashMap<String, String>();
26 THashMap<String, ArrayList<UpdateListener>> listeners = new THashMap<String, ArrayList<UpdateListener>>();
28 public MapModuleSourceRepository() {
31 public MapModuleSourceRepository(ModuleSource ... descriptors) {
32 for(ModuleSource descriptor : descriptors)
33 addModuleDescriptor(descriptor);
36 public MapModuleSourceRepository(Module ... modules) {
37 for(Module module : modules)
41 public void addModuleDescriptor(ModuleSource descriptor) {
42 modules.put(descriptor.getModuleName(), descriptor);
43 synchronized (listeners) {
44 ArrayList<UpdateListener> list = listeners.get(descriptor.getModuleName());
46 for(UpdateListener listener : list.toArray(new UpdateListener[list.size()]))
47 listener.notifyAboutUpdate();
51 public void addModule(Module module) {
52 addModuleDescriptor(new PrecompiledModuleSource(module));
55 public void addDocumentation(String documentationName, String documentation) {
56 documentations.put(documentationName, documentation);
60 public ModuleSource getModuleSource(String moduleName,
61 UpdateListener listener) {
62 if(listener != null) {
63 synchronized(listeners) {
64 ArrayList<UpdateListener> list = listeners.get(moduleName);
66 list = new ArrayList<UpdateListener>(2);
67 listeners.put(moduleName, list);
71 listener.addObservable(new Observable() {
73 public void removeListener(UpdateListener listener) {
74 synchronized(listeners) {
75 ArrayList<UpdateListener> list = listeners.get(moduleName);
77 list.remove(listener);
79 listeners.remove(moduleName);
85 return modules.get(moduleName);
89 public Collection<String> getModuleNames() {
90 return modules.keySet();
94 public void forAllModules(TObjectProcedure<String> procedure) {
95 modules.forEachKey(procedure);
99 public String getDocumentation(String documentationName) {
100 return documentations.get(documentationName);
104 public Collection<String> getDocumentationNames() {
105 return documentations.keySet();