]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.osgi/src/org/simantics/scl/osgi/internal/ServiceBasedModuleSourceRepository.java
Fixing a deadlock. Some improvements to ModuleSourceRepository API
[simantics/platform.git] / bundles / org.simantics.scl.osgi / src / org / simantics / scl / osgi / internal / ServiceBasedModuleSourceRepository.java
index 9b173e48d7c1c3f6d8ecccb9cdda762afae9d935..ac8384c242bf54e834148f6cfa8b7c31d2220024 100644 (file)
@@ -1,6 +1,7 @@
 package org.simantics.scl.osgi.internal;
 
-import gnu.trove.procedure.TObjectProcedure;
+import java.util.ArrayList;
+import java.util.Collection;
 
 import org.osgi.framework.BundleContext;
 import org.osgi.util.tracker.ServiceTracker;
@@ -8,6 +9,8 @@ import org.simantics.scl.compiler.module.repository.UpdateListener;
 import org.simantics.scl.compiler.source.ModuleSource;
 import org.simantics.scl.compiler.source.repository.ModuleSourceRepository;
 
+import gnu.trove.procedure.TObjectProcedure;
+
 public class ServiceBasedModuleSourceRepository implements ModuleSourceRepository {
 
     ServiceTracker<ModuleSourceRepository, ModuleSourceRepository> sourceRepositories;
@@ -45,6 +48,7 @@ public class ServiceBasedModuleSourceRepository implements ModuleSourceRepositor
     
     @Override
     public String getDocumentation(String documentationName) {
+        // getServices is internally synchronized, so no need to synchronize here
         Object[] services = sourceRepositories.getServices();
         if(services != null)
             for(Object sourceRepository_ : services) {
@@ -58,18 +62,43 @@ public class ServiceBasedModuleSourceRepository implements ModuleSourceRepositor
 
     @Override
     public void forAllModules(TObjectProcedure<String> procedure) {
-        for(Object sourceRepository_ : sourceRepositories.getServices()) {
-            ModuleSourceRepository sourceLoader = (ModuleSourceRepository)sourceRepository_;
-            sourceLoader.forAllModules(procedure);
-        }
+        // getServices is internally synchronized, so no need to synchronize here
+        Object[] services = sourceRepositories.getServices();
+        if(services != null)
+            for(Object sourceRepository_ : services) {
+                ModuleSourceRepository sourceLoader = (ModuleSourceRepository)sourceRepository_;
+                sourceLoader.forAllModules(procedure);
+            }
+    }
+    
+    @Override
+    public Collection<String> getModuleNames() {
+        ArrayList<String> result = new ArrayList<>();
+        forAllModules((String name) -> {
+            result.add(name);
+            return true;
+        });
+        return result;
     }
     
     @Override
     public void forAllDocumentations(TObjectProcedure<String> procedure) {
-        for(Object sourceRepository_ : sourceRepositories.getServices()) {
-            ModuleSourceRepository sourceLoader = (ModuleSourceRepository)sourceRepository_;
-            sourceLoader.forAllDocumentations(procedure);
-        }
+        Object[] services = sourceRepositories.getServices();
+        if(services != null)
+            for(Object sourceRepository_ : services) {
+                ModuleSourceRepository sourceLoader = (ModuleSourceRepository)sourceRepository_;
+                sourceLoader.forAllDocumentations(procedure);
+            }
+    }
+    
+    @Override
+    public Collection<String> getDocumentationNames() {
+        ArrayList<String> result = new ArrayList<>();
+        forAllDocumentations((String name) -> {
+            result.add(name);
+            return true;
+        });
+        return result;
     }
 
     @Override
@@ -80,8 +109,4 @@ public class ServiceBasedModuleSourceRepository implements ModuleSourceRepositor
         }
     }
 
-    @Override
-    public void clear() {
-    }
-
 }