1 package org.simantics.modeling;
\r
3 import java.util.ArrayList;
\r
4 import java.util.Arrays;
\r
5 import java.util.Collections;
\r
6 import java.util.List;
\r
8 import org.simantics.databoard.Bindings;
\r
9 import org.simantics.db.ReadGraph;
\r
10 import org.simantics.db.Resource;
\r
11 import org.simantics.db.exception.DatabaseException;
\r
12 import org.simantics.db.request.Read;
\r
13 import org.simantics.scl.compiler.environment.LocalEnvironment;
\r
14 import org.simantics.scl.compiler.environment.specification.EnvironmentSpecification;
\r
15 import org.simantics.scl.compiler.errors.CompilationError;
\r
16 import org.simantics.scl.compiler.module.repository.ImportFailure;
\r
17 import org.simantics.scl.compiler.module.repository.ImportFailureException;
\r
18 import org.simantics.scl.compiler.runtime.RuntimeEnvironment;
\r
19 import org.simantics.scl.compiler.top.ExpressionEvaluator;
\r
20 import org.simantics.scl.compiler.top.SCLExpressionCompilationException;
\r
21 import org.simantics.structural.stubs.StructuralResource2;
\r
23 public class ComponentTypeScriptRequest implements Read<ComponentTypeScriptResult> {
\r
25 private Resource script;
\r
26 private Resource componentType;
\r
28 public ComponentTypeScriptRequest(Resource script, Resource componentType) {
\r
29 this.script = script;
\r
30 this.componentType = componentType;
\r
34 public ComponentTypeScriptResult perform(ReadGraph graph) throws DatabaseException {
\r
35 IComponentTypeScriptEnvironmentFactory factory = graph.adapt(componentType, IComponentTypeScriptEnvironmentFactory.class);
\r
37 EnvironmentSpecification spec = factory.getRuntimeEnvironmentSpecification(graph, componentType);
\r
39 RuntimeEnvironment runtime;
\r
41 runtime = graph.syncRequest(new ComponentTypeScriptRuntimeEnvironmentRequest(spec));
\r
43 catch (DatabaseException e) {
\r
44 if (e.getCause() instanceof ImportFailureException) {
\r
45 ImportFailureException cause = (ImportFailureException)e.getCause();
\r
46 // if one of the scl modules can not be imported just show an error
\r
47 // at the very start of the editor
\r
48 List<CompilationError> errors = new ArrayList<CompilationError>();
\r
49 for (ImportFailure failure : cause.failures) {
\r
50 errors.add(new CompilationError(0, failure.toString()));
\r
52 return new ComponentTypeScriptResult(errors, null);
\r
59 StructuralResource2 str = StructuralResource2.getInstance(graph);
\r
60 String code = graph.getRelatedValue(script, str.ComponentTypeScript_code, Bindings.STRING);
\r
62 ExpressionEvaluator eval = new ExpressionEvaluator(runtime, code);
\r
63 eval.interpretIfPossible(false).parseAsBlock(true);
\r
65 // set the local environment if necessary
\r
66 LocalEnvironment local = factory.getLocalEnvironment(graph, componentType);
\r
68 eval.localEnvironment(local);
\r
72 result = eval.eval();
\r
74 catch (SCLExpressionCompilationException e) {
\r
75 return new ComponentTypeScriptResult(Arrays.asList(e.getErrors()), null);
\r
78 return new ComponentTypeScriptResult(Collections.<CompilationError>emptyList(),
\r
80 factory.getModuleReads(local),
\r
81 factory.getModuleWrites(local));
\r
85 public int hashCode() {
\r
86 final int prime = 31;
\r
88 result = prime * result
\r
89 + ((componentType == null) ? 0 : componentType.hashCode());
\r
90 result = prime * result + ((script == null) ? 0 : script.hashCode());
\r
95 public boolean equals(Object obj) {
\r
100 if (getClass() != obj.getClass())
\r
102 ComponentTypeScriptRequest other = (ComponentTypeScriptRequest) obj;
\r
103 if (componentType == null) {
\r
104 if (other.componentType != null)
\r
106 } else if (!componentType.equals(other.componentType))
\r
108 if (script == null) {
\r
109 if (other.script != null)
\r
111 } else if (!script.equals(other.script))
\r