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;fp=bundles%2Forg.simantics.scl.osgi%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fosgi%2Finternal%2FServiceBasedModuleSourceRepository.java;h=9b173e48d7c1c3f6d8ecccb9cdda762afae9d935;hb=969bd23cab98a79ca9101af33334000879fb60c5;hp=0000000000000000000000000000000000000000;hpb=866dba5cd5a3929bbeae85991796acb212338a08;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 new file mode 100644 index 000000000..9b173e48d --- /dev/null +++ b/bundles/org.simantics.scl.osgi/src/org/simantics/scl/osgi/internal/ServiceBasedModuleSourceRepository.java @@ -0,0 +1,87 @@ +package org.simantics.scl.osgi.internal; + +import gnu.trove.procedure.TObjectProcedure; + +import org.osgi.framework.BundleContext; +import org.osgi.util.tracker.ServiceTracker; +import org.simantics.scl.compiler.module.repository.UpdateListener; +import org.simantics.scl.compiler.source.ModuleSource; +import org.simantics.scl.compiler.source.repository.ModuleSourceRepository; + +public class ServiceBasedModuleSourceRepository implements ModuleSourceRepository { + + ServiceTracker sourceRepositories; + + public ServiceBasedModuleSourceRepository(BundleContext context) { + sourceRepositories = new ServiceTracker( + context, ModuleSourceRepository.class, null); + sourceRepositories.open(); + } + + @Override + public ModuleSource getModuleSource(String moduleName, + UpdateListener listener) { + ModuleSource result = null; + Object[] services = sourceRepositories.getServices(); + if(services != null) + for(Object sourceRepository_ : services) { + ModuleSourceRepository sourceLoader = (ModuleSourceRepository)sourceRepository_; + ModuleSource source = sourceLoader.getModuleSource(moduleName, listener); + if(source != null) { + if(result != null) { + double resultPriority = result.getPriority(); + double sourcePriority = source.getPriority(); + if(resultPriority > sourcePriority) + continue; + if(resultPriority == sourcePriority) + throw new RuntimeException("Module " + moduleName + " has two sources " + result + ", " + + source + " with the same priority."); + } + result = source; + } + } + return result; + } + + @Override + public String getDocumentation(String documentationName) { + Object[] services = sourceRepositories.getServices(); + if(services != null) + for(Object sourceRepository_ : services) { + ModuleSourceRepository sourceLoader = (ModuleSourceRepository)sourceRepository_; + String documentation = sourceLoader.getDocumentation(documentationName); + if(documentation != null) + return documentation; + } + return null; + } + + @Override + public void forAllModules(TObjectProcedure procedure) { + for(Object sourceRepository_ : sourceRepositories.getServices()) { + ModuleSourceRepository sourceLoader = (ModuleSourceRepository)sourceRepository_; + sourceLoader.forAllModules(procedure); + } + } + + @Override + public void forAllDocumentations(TObjectProcedure procedure) { + for(Object sourceRepository_ : sourceRepositories.getServices()) { + ModuleSourceRepository sourceLoader = (ModuleSourceRepository)sourceRepository_; + sourceLoader.forAllDocumentations(procedure); + } + } + + @Override + public void checkUpdates() { + for(Object service_ : sourceRepositories.getServices()) { + ModuleSourceRepository service = (ModuleSourceRepository)service_; + service.checkUpdates(); + } + } + + @Override + public void clear() { + } + +}