]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/repository/ProceduralModuleSourceRepository.java
(refs #7562) Better handling of exceptions in procedural modules
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / source / repository / ProceduralModuleSourceRepository.java
1 package org.simantics.scl.compiler.source.repository;
2
3 import java.util.Collection;
4 import java.util.Collections;
5 import java.util.List;
6
7 import org.simantics.scl.compiler.common.names.Name;
8 import org.simantics.scl.compiler.elaboration.expressions.EExternalConstant;
9 import org.simantics.scl.compiler.elaboration.modules.SCLValue;
10 import org.simantics.scl.compiler.errors.Failable;
11 import org.simantics.scl.compiler.module.ConcreteModule;
12 import org.simantics.scl.compiler.module.repository.ModuleRepository;
13 import org.simantics.scl.compiler.module.repository.UpdateListener;
14 import org.simantics.scl.compiler.runtime.RuntimeModule;
15 import org.simantics.scl.compiler.source.ModuleSource;
16 import org.simantics.scl.compiler.source.PrecompiledModuleSource;
17 import org.simantics.scl.compiler.source.repository.procedural.ProceduralValueDefinition;
18 import org.simantics.scl.compiler.top.ValueNotFound;
19 import org.slf4j.Logger;
20 import org.slf4j.LoggerFactory;
21
22 public abstract class ProceduralModuleSourceRepository implements ModuleSourceRepository {
23
24     private static final Logger LOGGER = LoggerFactory.getLogger(ProceduralModuleSourceRepository.class);
25     
26     public static final String PREFIX = "procedural:";
27     
28     protected abstract ModuleRepository getModuleRepository(UpdateListener listener);
29     
30     @Override
31     public Collection<String> getModuleNames() {
32         return Collections.emptyList();
33     }
34
35     @Override
36     public ModuleSource getModuleSource(String moduleName, UpdateListener listener) {
37         if(!moduleName.startsWith(PREFIX))
38             return null;
39         
40         String sourceModuleName = moduleName.substring(PREFIX.length());
41         Failable<RuntimeModule> sourceModuleF = getModuleRepository(listener)
42                 .getRuntimeModule(sourceModuleName, listener);
43         if(!sourceModuleF.didSucceed())
44             return null;
45         
46         RuntimeModule sourceModule = sourceModuleF.getResult();
47         Object values;
48         try {
49             values = sourceModule.getValue("values");
50         } catch (ValueNotFound e) {
51             return null; // normal
52         } catch (Throwable e) {
53             // abnormal exception
54             LOGGER.error("Failed to find value " + moduleName + "/values", e);
55             return null;
56         }
57         
58         if(!(values instanceof List))
59             return null;
60         
61         ConcreteModule module = new ConcreteModule(moduleName);
62         for(Object item : (List)values) {
63             if(!(item instanceof ProceduralValueDefinition))
64                 return null;
65             ProceduralValueDefinition def = (ProceduralValueDefinition)item;
66
67             SCLValue value = new SCLValue(Name.create(moduleName, def.name));
68             value.setType(def.type);
69             value.setExpression(new EExternalConstant(def.value, def.type));
70             value.setInlineInSimplification(true);
71             module.addValue(value);
72         }
73         module.setParentClassLoader(getClass().getClassLoader());
74         return new PrecompiledModuleSource(module);
75     }
76
77 }