]> gerrit.simantics Code Review - simantics/r.git/blob - org.simantics.r.scl/src/org/simantics/r/scl/RSessionManager.java
Share project "org.simantics.r.feature" into "https://www.simantics.org/svn/simantics"
[simantics/r.git] / org.simantics.r.scl / src / org / simantics / r / scl / RSessionManager.java
1 package org.simantics.r.scl;\r
2 \r
3 import java.util.UUID;\r
4 import java.util.concurrent.ConcurrentHashMap;\r
5 \r
6 import org.rosuda.REngine.Rserve.RConnection;\r
7 import org.rosuda.REngine.Rserve.RserveException;\r
8 import org.simantics.scl.runtime.function.Function;\r
9 \r
10 public class RSessionManager {\r
11     static ConcurrentHashMap<String, RSession> CONNECTIONS =\r
12             new ConcurrentHashMap<String, RSession>(); \r
13     \r
14     public static RSession getSession(String id) {\r
15         // CONNECTIONS is ConcurrentHashMap so no synchronization is needed here\r
16         return CONNECTIONS.get(id);\r
17     }\r
18     \r
19     public static RSession createSession(RSessionConfiguration configuration) throws RserveException {\r
20         synchronized(CONNECTIONS) {\r
21             String id = UUID.randomUUID().toString();\r
22             return createSession(configuration, id);\r
23         }\r
24     }\r
25     \r
26     public static Object withConfiguration(RSessionConfiguration configuration, @SuppressWarnings("rawtypes") Function f) throws RserveException {\r
27         RSession session = createSession(configuration);\r
28         try {\r
29             return session.syncExec(f);\r
30         } catch (InterruptedException e) {\r
31             throw new RuntimeException(e);\r
32         } finally {\r
33             session.close();\r
34         }\r
35     }\r
36     \r
37     public static RSession getOrCreateSession(RSessionConfiguration configuration, String id) throws RserveException {\r
38         synchronized(CONNECTIONS) {\r
39             RSession session = getSession(id);\r
40             if(session == null)\r
41                 return createSession(configuration, id);\r
42             else\r
43                 return session;\r
44         }\r
45     }\r
46     \r
47     private static RSession createSession(RSessionConfiguration configuration, String id) throws RserveException {\r
48         synchronized(CONNECTIONS) {\r
49             RConnection connection = new RConnection(configuration.host, configuration.port);\r
50             if(configuration.username != null && !configuration.username.isEmpty())\r
51                 connection.login(configuration.username, configuration.password);\r
52             RSession managedConnection = new RSession(connection, id);\r
53             CONNECTIONS.put(id, managedConnection);\r
54             return managedConnection;\r
55         }\r
56     }\r
57 }\r