9b173e48d7c1c3f6d8ecccb9cdda762afae9d935
[simantics/platform.git] / bundles / org.simantics.scl.osgi / src / org / simantics / scl / osgi / internal / ServiceBasedModuleSourceRepository.java
1 package org.simantics.scl.osgi.internal;
2
3 import gnu.trove.procedure.TObjectProcedure;
4
5 import org.osgi.framework.BundleContext;
6 import org.osgi.util.tracker.ServiceTracker;
7 import org.simantics.scl.compiler.module.repository.UpdateListener;
8 import org.simantics.scl.compiler.source.ModuleSource;
9 import org.simantics.scl.compiler.source.repository.ModuleSourceRepository;
10
11 public class ServiceBasedModuleSourceRepository implements ModuleSourceRepository {
12
13     ServiceTracker<ModuleSourceRepository, ModuleSourceRepository> sourceRepositories;
14
15     public ServiceBasedModuleSourceRepository(BundleContext context) {
16         sourceRepositories = new ServiceTracker<ModuleSourceRepository, ModuleSourceRepository>(
17                 context, ModuleSourceRepository.class, null);
18         sourceRepositories.open();
19     }
20
21     @Override
22     public ModuleSource getModuleSource(String moduleName,
23             UpdateListener listener) {
24         ModuleSource result = null;
25         Object[] services = sourceRepositories.getServices();
26         if(services != null)
27             for(Object sourceRepository_ : services) {
28                 ModuleSourceRepository sourceLoader = (ModuleSourceRepository)sourceRepository_;
29                 ModuleSource source = sourceLoader.getModuleSource(moduleName, listener);
30                 if(source != null) {
31                     if(result != null) {
32                         double resultPriority = result.getPriority();
33                         double sourcePriority = source.getPriority();
34                         if(resultPriority > sourcePriority)
35                             continue;
36                         if(resultPriority == sourcePriority)
37                             throw new RuntimeException("Module " + moduleName + " has two sources " + result + ", " +
38                                     source + " with the same priority.");
39                     }
40                     result = source;
41                 }
42             }
43         return result;
44     }
45     
46     @Override
47     public String getDocumentation(String documentationName) {
48         Object[] services = sourceRepositories.getServices();
49         if(services != null)
50             for(Object sourceRepository_ : services) {
51                 ModuleSourceRepository sourceLoader = (ModuleSourceRepository)sourceRepository_;
52                 String documentation = sourceLoader.getDocumentation(documentationName);
53                 if(documentation != null)
54                     return documentation;
55             }
56         return null;
57     }
58
59     @Override
60     public void forAllModules(TObjectProcedure<String> procedure) {
61         for(Object sourceRepository_ : sourceRepositories.getServices()) {
62             ModuleSourceRepository sourceLoader = (ModuleSourceRepository)sourceRepository_;
63             sourceLoader.forAllModules(procedure);
64         }
65     }
66     
67     @Override
68     public void forAllDocumentations(TObjectProcedure<String> procedure) {
69         for(Object sourceRepository_ : sourceRepositories.getServices()) {
70             ModuleSourceRepository sourceLoader = (ModuleSourceRepository)sourceRepository_;
71             sourceLoader.forAllDocumentations(procedure);
72         }
73     }
74
75     @Override
76     public void checkUpdates() {
77         for(Object service_ : sourceRepositories.getServices()) {
78             ModuleSourceRepository service = (ModuleSourceRepository)service_;
79             service.checkUpdates();
80         }
81     }
82
83     @Override
84     public void clear() {
85     }
86
87 }