--- /dev/null
+package org.simantics.scl.compiler.source.repository;
+
+import gnu.trove.procedure.TObjectProcedure;
+import gnu.trove.set.hash.THashSet;
+
+import java.io.IOException;
+import java.net.URL;
+
+import org.simantics.scl.compiler.module.ImportDeclaration;
+import org.simantics.scl.compiler.module.repository.UpdateListener;
+import org.simantics.scl.compiler.source.ClassModuleSource;
+import org.simantics.scl.compiler.source.ModuleSource;
+
+public class ClassModuleSourceRepository extends AbstractModuleSourceRepository {
+
+ private final Class<?> clazz;
+ private final String path;
+ private final ClassLoader classLoader;
+ private final THashSet<String> modules = new THashSet<String>();
+
+ public ClassModuleSourceRepository(Class<?> clazz, ClassLoader classLoader, String path) throws IOException {
+ this.clazz = clazz;
+ this.path = path;
+ this.classLoader = classLoader;
+ URL url = clazz.getResource(path);
+ if(url == null)
+ throw new IOException("Didn't find a folder " + path + " relative to the class " + clazz.getName() + ".");
+ ModuleBrowsingUtil.collectModuleSourcesAt(modules, url);
+ }
+
+ @Override
+ public ModuleSource getModuleSource(String moduleName,
+ UpdateListener listener) {
+ if(!modules.contains(moduleName))
+ return null;
+ return new ClassModuleSource(moduleName, clazz, classLoader, path + "/" + moduleName + ".scl", getBuiltinImports());
+ }
+
+ @Override
+ public void forAllModules(TObjectProcedure<String> procedure) {
+ modules.forEach(procedure);
+ }
+
+ protected ImportDeclaration[] getBuiltinImports() {
+ return ClassModuleSource.DEFAULT_IMPORTS;
+ }
+
+ @Override
+ public void clear() {
+
+ }
+}