]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling/src/org/simantics/modeling/ComponentTypeScriptRequest.java
Sync git svn branch with SVN repository r33366.
[simantics/platform.git] / bundles / org.simantics.modeling / src / org / simantics / modeling / ComponentTypeScriptRequest.java
1 package org.simantics.modeling;\r
2 \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
7 \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
22 \r
23 public class ComponentTypeScriptRequest implements Read<ComponentTypeScriptResult> {\r
24 \r
25     private Resource script;\r
26     private Resource componentType;\r
27 \r
28     public ComponentTypeScriptRequest(Resource script, Resource componentType) {\r
29         this.script = script;\r
30         this.componentType = componentType;\r
31     }\r
32     \r
33     @Override\r
34     public ComponentTypeScriptResult perform(ReadGraph graph) throws DatabaseException {\r
35         IComponentTypeScriptEnvironmentFactory factory = graph.adapt(componentType, IComponentTypeScriptEnvironmentFactory.class);\r
36 \r
37         EnvironmentSpecification spec = factory.getRuntimeEnvironmentSpecification(graph, componentType);\r
38         \r
39         RuntimeEnvironment runtime;\r
40         try {\r
41             runtime = graph.syncRequest(new ComponentTypeScriptRuntimeEnvironmentRequest(spec));\r
42         }\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
51                 }\r
52                 return new ComponentTypeScriptResult(errors, null);\r
53             }\r
54             else {\r
55                 throw e;\r
56             }\r
57         }\r
58         \r
59         StructuralResource2 str = StructuralResource2.getInstance(graph);\r
60         String code = graph.getRelatedValue(script, str.ComponentTypeScript_code, Bindings.STRING);\r
61         \r
62         ExpressionEvaluator eval = new ExpressionEvaluator(runtime, code);\r
63         eval.interpretIfPossible(false).parseAsBlock(true);\r
64         \r
65         // set the local environment if necessary\r
66         LocalEnvironment local = factory.getLocalEnvironment(graph, componentType);\r
67         if (local != null)\r
68             eval.localEnvironment(local);\r
69         \r
70         Object result;\r
71         try {\r
72             result = eval.eval();\r
73         }\r
74         catch (SCLExpressionCompilationException e) {\r
75             return new ComponentTypeScriptResult(Arrays.asList(e.getErrors()), null);\r
76         }\r
77         \r
78         return new ComponentTypeScriptResult(Collections.<CompilationError>emptyList(), \r
79                                              result, \r
80                                              factory.getModuleReads(local), \r
81                                              factory.getModuleWrites(local));\r
82     }\r
83     \r
84     @Override\r
85     public int hashCode() {\r
86         final int prime = 31;\r
87         int result = 1;\r
88         result = prime * result\r
89                 + ((componentType == null) ? 0 : componentType.hashCode());\r
90         result = prime * result + ((script == null) ? 0 : script.hashCode());\r
91         return result;\r
92     }\r
93 \r
94     @Override\r
95     public boolean equals(Object obj) {\r
96         if (this == obj)\r
97             return true;\r
98         if (obj == null)\r
99             return false;\r
100         if (getClass() != obj.getClass())\r
101             return false;\r
102         ComponentTypeScriptRequest other = (ComponentTypeScriptRequest) obj;\r
103         if (componentType == null) {\r
104             if (other.componentType != null)\r
105                 return false;\r
106         } else if (!componentType.equals(other.componentType))\r
107             return false;\r
108         if (script == null) {\r
109             if (other.script != null)\r
110                 return false;\r
111         } else if (!script.equals(other.script))\r
112             return false;\r
113         return true;\r
114     }\r
115 \r
116 }\r