]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/repository/CompositeModuleSourceRepository.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / source / repository / CompositeModuleSourceRepository.java
diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/repository/CompositeModuleSourceRepository.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/repository/CompositeModuleSourceRepository.java
new file mode 100644 (file)
index 0000000..ce3f775
--- /dev/null
@@ -0,0 +1,68 @@
+package org.simantics.scl.compiler.source.repository;
+
+import gnu.trove.procedure.TObjectProcedure;
+
+import org.simantics.scl.compiler.module.repository.UpdateListener;
+import org.simantics.scl.compiler.source.ModuleSource;
+
+public class CompositeModuleSourceRepository implements ModuleSourceRepository {
+    public final ModuleSourceRepository[] children;
+
+    public CompositeModuleSourceRepository(ModuleSourceRepository ... children) {
+        this.children = children;
+    }
+
+    @Override
+    public ModuleSource getModuleSource(String moduleName,
+            UpdateListener listener) {
+        ModuleSource result = null;
+        for(ModuleSourceRepository sourceRepository : children) {
+            ModuleSource source = sourceRepository.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) {
+        for(ModuleSourceRepository sourceRepository : children) {
+            String documentation = sourceRepository.getDocumentation(documentationName);
+            if(documentation != null)
+                return documentation;
+        }
+        return null;
+    }
+
+    @Override
+    public void forAllModules(TObjectProcedure<String> procedure) {
+        for(ModuleSourceRepository sourceRepository : children)
+            sourceRepository.forAllModules(procedure);
+    }
+    
+    @Override
+    public void forAllDocumentations(TObjectProcedure<String> procedure) {
+        for(ModuleSourceRepository sourceRepository : children)
+            sourceRepository.forAllDocumentations(procedure);
+    }
+
+    @Override
+    public void checkUpdates() {
+    }
+
+    @Override
+    public void clear() {
+        for (ModuleSourceRepository child : children)
+            child.clear();
+    }
+}