]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/repository/MapModuleSourceRepository.java
(refs #7374) Created CommandSessionWithModules
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / source / repository / MapModuleSourceRepository.java
index 6cbf03aef8756df416144fbf649922b40bb1f4b2..61a1d2c958526db87ef442d0155bafe1bbf6a602 100644 (file)
@@ -1,13 +1,17 @@
 package org.simantics.scl.compiler.source.repository;
 
-import gnu.trove.map.hash.THashMap;
-import gnu.trove.procedure.TObjectProcedure;
+import java.util.ArrayList;
+import java.util.Collection;
 
 import org.simantics.scl.compiler.module.Module;
 import org.simantics.scl.compiler.module.repository.UpdateListener;
+import org.simantics.scl.compiler.module.repository.UpdateListener.Observable;
 import org.simantics.scl.compiler.source.ModuleSource;
 import org.simantics.scl.compiler.source.PrecompiledModuleSource;
 
+import gnu.trove.map.hash.THashMap;
+import gnu.trove.procedure.TObjectProcedure;
+
 /**
  * An implementation of {@link ModuleSourceRepository} as a finite map.
  * This implementation does not support listening module changes,
@@ -19,6 +23,8 @@ public class MapModuleSourceRepository implements ModuleSourceRepository {
     THashMap<String, ModuleSource> modules = new THashMap<String, ModuleSource>();
     THashMap<String, String> documentations = new THashMap<String, String>();
     
+    THashMap<String, ArrayList<UpdateListener>> listeners = new THashMap<String, ArrayList<UpdateListener>>(); 
+    
     public MapModuleSourceRepository() {
     }
     
@@ -34,6 +40,12 @@ public class MapModuleSourceRepository implements ModuleSourceRepository {
     
     public void addModuleDescriptor(ModuleSource descriptor) {
         modules.put(descriptor.getModuleName(), descriptor);
+        synchronized (listeners) {
+            ArrayList<UpdateListener> list = listeners.get(descriptor.getModuleName());
+            if(list != null)
+                for(UpdateListener listener : list.toArray(new UpdateListener[list.size()]))
+                    listener.notifyAboutUpdate();
+        }
     }
     
     public void addModule(Module module) {
@@ -47,9 +59,37 @@ public class MapModuleSourceRepository implements ModuleSourceRepository {
     @Override
     public ModuleSource getModuleSource(String moduleName,
             UpdateListener listener) {
+        if(listener != null) {
+            synchronized(listeners) {
+                ArrayList<UpdateListener> list = listeners.get(moduleName);
+                if(list == null) {
+                    list = new ArrayList<UpdateListener>(2);
+                    listeners.put(moduleName, list);
+                }
+                list.add(listener);
+            }
+            listener.addObservable(new Observable() {
+                @Override
+                public void removeListener(UpdateListener listener) {
+                    synchronized(listeners) {
+                        ArrayList<UpdateListener> list = listeners.get(moduleName);
+                        if(list != null) {
+                            list.remove(listener);
+                            if(list.isEmpty())
+                                listeners.remove(moduleName);
+                        }
+                    }
+                }
+            });
+        }
         return modules.get(moduleName);
     }
 
+    @Override
+    public Collection<String> getModuleNames() {
+        return modules.keySet();
+    }
+    
     @Override
     public void forAllModules(TObjectProcedure<String> procedure) {
         modules.forEachKey(procedure);
@@ -61,16 +101,7 @@ public class MapModuleSourceRepository implements ModuleSourceRepository {
     }
     
     @Override
-    public void forAllDocumentations(TObjectProcedure<String> procedure) {
-        for(String documentationName : documentations.keySet())
-            procedure.execute(documentationName);
-    }
-    
-    @Override
-    public void checkUpdates() {
-    }
-
-    @Override
-    public void clear() {
+    public Collection<String> getDocumentationNames() {
+        return documentations.keySet();
     }
 }