Fixing a deadlock. Some improvements to ModuleSourceRepository API
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / source / repository / ClassModuleSourceRepository.java
1 package org.simantics.scl.compiler.source.repository;
2
3 import java.io.IOException;
4 import java.net.URL;
5 import java.util.Collection;
6
7 import org.simantics.scl.compiler.module.ImportDeclaration;
8 import org.simantics.scl.compiler.module.repository.UpdateListener;
9 import org.simantics.scl.compiler.source.ClassModuleSource;
10 import org.simantics.scl.compiler.source.ModuleSource;
11
12 import gnu.trove.procedure.TObjectProcedure;
13 import gnu.trove.set.hash.THashSet;
14
15 public class ClassModuleSourceRepository implements ModuleSourceRepository {
16     
17     private final Class<?> clazz;
18     private final String path;
19     private final ClassLoader classLoader;
20     private final THashSet<String> modules = new THashSet<String>();
21     
22     public ClassModuleSourceRepository(Class<?> clazz, ClassLoader classLoader, String path) throws IOException {
23         this.clazz = clazz;
24         this.path = path;
25         this.classLoader = classLoader;
26         URL url = clazz.getResource(path);
27         if(url == null)
28             throw new IOException("Didn't find a folder " + path + " relative to the class " + clazz.getName() + ".");
29         ModuleBrowsingUtil.collectModuleSourcesAt(modules, url);
30     }
31
32     @Override
33     public ModuleSource getModuleSource(String moduleName,
34             UpdateListener listener) {
35         if(!modules.contains(moduleName))
36             return null;
37         return new ClassModuleSource(moduleName, clazz, classLoader, path + "/" + moduleName + ".scl", getBuiltinImports());
38     }
39
40     @Override
41     public Collection<String> getModuleNames() {
42         return modules;
43     }
44     
45     @Override
46     public void forAllModules(TObjectProcedure<String> procedure) {
47         modules.forEach(procedure);
48     }
49     
50     protected ImportDeclaration[] getBuiltinImports() {
51         return ClassModuleSource.DEFAULT_IMPORTS;
52     }
53 }