X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.scl.osgi%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fosgi%2Finternal%2FServiceBasedModuleSourceRepository.java;h=e9d4abd4a01e3a825275f028b31429f5e7852edc;hb=2e6e3e26554e638342cf1241374d8816b7536349;hp=9b173e48d7c1c3f6d8ecccb9cdda762afae9d935;hpb=969bd23cab98a79ca9101af33334000879fb60c5;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.scl.osgi/src/org/simantics/scl/osgi/internal/ServiceBasedModuleSourceRepository.java b/bundles/org.simantics.scl.osgi/src/org/simantics/scl/osgi/internal/ServiceBasedModuleSourceRepository.java index 9b173e48d..e9d4abd4a 100644 --- a/bundles/org.simantics.scl.osgi/src/org/simantics/scl/osgi/internal/ServiceBasedModuleSourceRepository.java +++ b/bundles/org.simantics.scl.osgi/src/org/simantics/scl/osgi/internal/ServiceBasedModuleSourceRepository.java @@ -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 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 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 getModuleNames() { + ArrayList result = new ArrayList<>(); + forAllModules((String name) -> { + result.add(name); + return true; + }); + return result; } @Override public void forAllDocumentations(TObjectProcedure 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 getDocumentationNames() { + ArrayList 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() { - } - }