Fixing a deadlock. Some improvements to ModuleSourceRepository API
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / source / repository / FileModuleSourceRepository.java
1 package org.simantics.scl.compiler.source.repository;
2
3 import java.io.File;
4 import java.io.IOException;
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.FileModuleSource;
11 import org.simantics.scl.compiler.source.ModuleSource;
12
13 import gnu.trove.procedure.TObjectProcedure;
14 import gnu.trove.set.hash.THashSet;
15
16 public class FileModuleSourceRepository implements ModuleSourceRepository {
17     
18     private final File path;
19     private final ClassLoader classLoader;
20     private final THashSet<String> modules = new THashSet<String>();
21     
22     public FileModuleSourceRepository(File path, ClassLoader classLoader) throws IOException {
23         this.path = path;
24         this.classLoader = classLoader;
25         ModuleBrowsingUtil.collectModuleSourcesAt(modules, path);
26     }
27
28     @Override
29     public ModuleSource getModuleSource(String moduleName,
30             UpdateListener listener) {
31         if(!modules.contains(moduleName))
32             return null;
33         return new FileModuleSource(moduleName, classLoader, new File(path, moduleName + ".scl"), getBuiltinImports());
34     }
35
36     @Override
37     public void forAllModules(TObjectProcedure<String> procedure) {
38         modules.forEach(procedure);
39     }
40     
41     @Override
42     public Collection<String> getModuleNames() {
43         return modules;
44     }
45     
46     protected ImportDeclaration[] getBuiltinImports() {
47         return ClassModuleSource.DEFAULT_IMPORTS;
48     }
49 }