Fixing a deadlock. Some improvements to ModuleSourceRepository API
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / source / repository / CompositeModuleSourceRepository.java
1 package org.simantics.scl.compiler.source.repository;
2
3 import java.util.ArrayList;
4 import java.util.Collection;
5
6 import org.simantics.scl.compiler.module.repository.UpdateListener;
7 import org.simantics.scl.compiler.source.ModuleSource;
8
9 import gnu.trove.procedure.TObjectProcedure;
10
11 public class CompositeModuleSourceRepository implements ModuleSourceRepository {
12     public final ModuleSourceRepository[] children;
13
14     public CompositeModuleSourceRepository(ModuleSourceRepository ... children) {
15         this.children = children;
16     }
17
18     @Override
19     public ModuleSource getModuleSource(String moduleName,
20             UpdateListener listener) {
21         ModuleSource result = null;
22         for(ModuleSourceRepository sourceRepository : children) {
23             ModuleSource source = sourceRepository.getModuleSource(moduleName, listener);
24             if(source != null) {
25                 if(result != null) {
26                     double resultPriority = result.getPriority();
27                     double sourcePriority = source.getPriority();
28                     if(resultPriority > sourcePriority)
29                         continue;
30                     if(resultPriority == sourcePriority)
31                         throw new RuntimeException("Module " + moduleName + " has two sources " + result + ", " +
32                                 source + " with the same priority.");
33                 }
34                 result = source;
35             }
36         }
37         return result;
38     }
39     
40     @Override
41     public String getDocumentation(String documentationName) {
42         for(ModuleSourceRepository sourceRepository : children) {
43             String documentation = sourceRepository.getDocumentation(documentationName);
44             if(documentation != null)
45                 return documentation;
46         }
47         return null;
48     }
49
50     @Override
51     public void forAllModules(TObjectProcedure<String> procedure) {
52         for(ModuleSourceRepository sourceRepository : children)
53             sourceRepository.forAllModules(procedure);
54     }
55     
56     @Override
57     public Collection<String> getModuleNames() {
58         ArrayList<String> result = new ArrayList<>();
59         forAllModules((String name) -> {
60             result.add(name);
61             return true;
62         });
63         return result;
64     }
65     
66     @Override
67     public void forAllDocumentations(TObjectProcedure<String> procedure) {
68         for(ModuleSourceRepository sourceRepository : children)
69             sourceRepository.forAllDocumentations(procedure);
70     }
71     
72     @Override
73     public Collection<String> getDocumentationNames() {
74         ArrayList<String> result = new ArrayList<>();
75         forAllDocumentations((String name) -> {
76             result.add(name);
77             return true;
78         });
79         return result;
80     }
81
82     @Override
83     public void checkUpdates() {
84         for (ModuleSourceRepository child : children)
85             child.checkUpdates();
86     }
87
88     @Override
89     public void clear() {
90         for (ModuleSourceRepository child : children)
91             child.clear();
92     }
93 }