]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.osgi/src/org/simantics/scl/osgi/internal/ServiceBasedModuleSourceRepository.java
(refs #7613) Removed some module sources as declarative services
[simantics/platform.git] / bundles / org.simantics.scl.osgi / src / org / simantics / scl / osgi / internal / ServiceBasedModuleSourceRepository.java
index 9b173e48d7c1c3f6d8ecccb9cdda762afae9d935..e9d4abd4a01e3a825275f028b31429f5e7852edc 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;
@@ -22,6 +25,7 @@ public class ServiceBasedModuleSourceRepository implements ModuleSourceRepositor
     public ModuleSource getModuleSource(String moduleName,
             UpdateListener listener) {
         ModuleSource result = null;
+        ModuleSourceRepository resultRepository = null;
         Object[] services = sourceRepositories.getServices();
         if(services != null)
             for(Object sourceRepository_ : services) {
@@ -34,10 +38,11 @@ public class ServiceBasedModuleSourceRepository implements ModuleSourceRepositor
                         if(resultPriority > sourcePriority)
                             continue;
                         if(resultPriority == sourcePriority)
-                            throw new RuntimeException("Module " + moduleName + " has two sources " + result + ", " +
-                                    source + " with the same priority.");
+                            throw new RuntimeException("Module " + moduleName + " has two sources " + result + " (from "+resultRepository+"), " +
+                                    source + " (from "+sourceLoader+")  with the same priority.");
                     }
                     result = source;
+                    resultRepository = sourceLoader;
                 }
             }
         return result;
@@ -45,6 +50,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 +64,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 +111,4 @@ public class ServiceBasedModuleSourceRepository implements ModuleSourceRepositor
         }
     }
 
-    @Override
-    public void clear() {
-    }
-
 }