]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.osgi/src/org/simantics/scl/osgi/internal/ServiceBasedModuleSourceRepository.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.scl.osgi / src / org / simantics / scl / osgi / internal / ServiceBasedModuleSourceRepository.java
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 (file)
index 0000000..9b173e4
--- /dev/null
@@ -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<ModuleSourceRepository, ModuleSourceRepository> sourceRepositories;
+
+    public ServiceBasedModuleSourceRepository(BundleContext context) {
+        sourceRepositories = new ServiceTracker<ModuleSourceRepository, ModuleSourceRepository>(
+                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<String> procedure) {
+        for(Object sourceRepository_ : sourceRepositories.getServices()) {
+            ModuleSourceRepository sourceLoader = (ModuleSourceRepository)sourceRepository_;
+            sourceLoader.forAllModules(procedure);
+        }
+    }
+    
+    @Override
+    public void forAllDocumentations(TObjectProcedure<String> 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() {
+    }
+
+}