X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.scl.osgi%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fosgi%2Finternal%2FServiceBasedModuleSourceRepository.java;h=ac8384c242bf54e834148f6cfa8b7c31d2220024;hp=9b173e48d7c1c3f6d8ecccb9cdda762afae9d935;hb=8d60995e2ff936c9a360c7fdb69cc4ed44666bc5;hpb=5c111109af1939b28b1ff68539208652664ced27 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..ac8384c24 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; @@ -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 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 +109,4 @@ public class ServiceBasedModuleSourceRepository implements ModuleSourceRepositor } } - @Override - public void clear() { - } - }