]> gerrit.simantics Code Review - simantics/r.git/blob - org.simantics.r/scl/R/RConfiguration.scl
7ad0196779d8da3a5094986eb7de99037eba6710
[simantics/r.git] / org.simantics.r / scl / R / RConfiguration.scl
1 import "R/R" as R\r
2 \r
3 import "Simantics/DB"\r
4 import "http://www.simantics.org/R-1.0" as ROntology\r
5 import "http://www.simantics.org/Layer0-1.1" as L0\r
6 \r
7 """Creates a new session configuration to graph as a part of the parent resource. This function does\r
8 not link it to any other resources."""\r
9 createSessionConfiguration :: Resource -> R.SessionConfiguration -> <WriteGraph> Resource\r
10 createSessionConfiguration parent (R.SessionConfiguration host port username password) = do \r
11     r = newResource ()\r
12     claim r L0.InstanceOf ROntology.SessionConfiguration\r
13     claim r L0.PartOf parent\r
14     sessionName = host + "-" + show port\r
15     claimRelatedValue r L0.HasName sessionName\r
16     claimRelatedValue r ROntology.SessionConfiguration.host host\r
17     claimRelatedValue r ROntology.SessionConfiguration.port port\r
18     claimRelatedValue r ROntology.SessionConfiguration.username username\r
19     claimRelatedValue r ROntology.SessionConfiguration.password password\r
20     r\r
21 \r
22 """Add an R script into the session configuration resource. The script is executed when a new session is opened with the createSession function."""\r
23 addScript :: Resource -> String -> <WriteGraph> Resource\r
24 addScript sessionConfiguration scriptText = do \r
25     r = newResource ()\r
26     claim r L0.InstanceOf ROntology.Script\r
27     claim sessionConfiguration ROntology.SessionConfiguration.hasScript r\r
28     claimRelatedValue r ROntology.Script.text scriptText\r
29     r\r
30 \r
31 """Read session configuration from the database."""\r
32 readSessionConfiguration :: Resource -> <ReadGraph> R.SessionConfiguration\r
33 readSessionConfiguration r = R.SessionConfiguration\r
34     (relatedValue r ROntology.SessionConfiguration.host)\r
35     (relatedValue r ROntology.SessionConfiguration.port)\r
36     (relatedValue r ROntology.SessionConfiguration.username)\r
37     (relatedValue r ROntology.SessionConfiguration.password)\r
38 \r
39 """Write an R session into the database."""\r
40 writeSession :: R.Session -> <WriteGraph> Resource\r
41 writeSession session = do \r
42     r = newResource ()\r
43     claim r L0.InstanceOf ROntology.Session\r
44     claimRelatedValue r L0.HasName $ R.sessionIdOf session\r
45     r\r
46 \r
47 """Execute the scripts defined for a session configuration using the given session."""\r
48 executeScripts :: Resource -> R.Session -> <ReadGraph,Proc> ()\r
49 executeScripts configurationResource session = for (configurationResource # ROntology.SessionConfiguration.hasScript) $ \s -> do\r
50     scriptText = relatedValue s ROntology.Script.text\r
51     R.asyncExec session (R.evalR_ scriptText)\r
52 \r
53 """Read an R session from the database. If the session has been closed, a new session is opened with the\r
54 same configuration."""\r
55 readSession :: Resource -> <ReadGraph,Proc> R.Session\r
56 readSession r = let\r
57     sessionId = relatedValue r L0.HasName\r
58   in match R.sessionById sessionId with\r
59       Just session -> session\r
60       Nothing -> do\r
61         configurationResource = singleObject r L0.PartOf\r
62         session = R.getOrCreateSession (readSessionConfiguration $ configurationResource) sessionId\r
63         executeScripts configurationResource session\r
64         session\r
65       \r
66 """Create a session based on a given session configuration resource."""\r
67 createSession :: Resource -> <WriteGraph,Proc> Resource\r
68 createSession configurationResource = do\r
69     session = R.createSession $ readSessionConfiguration configurationResource\r
70     executeScripts configurationResource session\r
71     sessionResource = writeSession session\r
72     claim configurationResource L0.ConsistsOf sessionResource\r
73     sessionResource\r
74 \r
75 """Delete a session resource and close the session that it represents."""\r
76 deleteSession :: Resource -> <WriteGraph,Proc> ()\r
77 deleteSession r = do\r
78     session = readSession r\r
79     R.closeSession session\r
80     denyAllStatements r\r
81 \r