]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.procore/src/fi/vtt/simantics/procore/internal/XSupportImpl.java
Merge commit 'b9450ae'
[simantics/platform.git] / bundles / org.simantics.db.procore / src / fi / vtt / simantics / procore / internal / XSupportImpl.java
1 package fi.vtt.simantics.procore.internal;\r
2 \r
3 import org.simantics.db.Database;\r
4 import org.simantics.db.Resource;\r
5 import org.simantics.db.Session;\r
6 import org.simantics.db.WriteOnlyGraph;\r
7 import org.simantics.db.common.utils.Logger;\r
8 import org.simantics.db.exception.DatabaseException;\r
9 import org.simantics.db.exception.ServiceException;\r
10 import org.simantics.db.impl.graph.DelayedWriteGraph;\r
11 import org.simantics.db.impl.graph.WriteGraphImpl;\r
12 import org.simantics.db.procore.cluster.ClusterImpl;\r
13 import org.simantics.db.procore.cluster.TestCluster;\r
14 import org.simantics.db.procore.protocol.Constants;\r
15 import org.simantics.db.request.WriteTraits;\r
16 import org.simantics.db.service.ClusterUID;\r
17 import org.simantics.db.service.SerialisationSupport;\r
18 import org.simantics.db.service.XSupport;\r
19 \r
20 public class XSupportImpl implements XSupport {\r
21     final private boolean DEBUG = false;\r
22     final private SessionImplSocket session;\r
23 \r
24     XSupportImpl(SessionImplSocket session) {\r
25         this.session = session;\r
26     }\r
27 \r
28     @Override\r
29     public void corruptPageTableAndDie() throws DatabaseException {\r
30         execute("corruptPageTableAndDie");\r
31     }\r
32 \r
33     @Override\r
34     public void corruptCluster(Resource r) throws DatabaseException {\r
35         ClusterImpl cluster = getCluster(r);\r
36         long clusterId = Constants.NewClusterId;\r
37         if (null == cluster.cc)\r
38             cluster.cc = new ClusterChange(session.clusterStream, cluster);\r
39         session.clusterStream.corruptCluster(cluster.cc, clusterId);\r
40     }\r
41 \r
42     @Override\r
43     public int corruptClusterTable(long clusterId)\r
44     throws DatabaseException {\r
45         return session.clusterTable.makeProxy(ClusterUID.make(0,666), clusterId).getClusterKey();\r
46     }\r
47 \r
48     @Override\r
49     public void flushCluster(Resource r) throws ServiceException {\r
50         session.writeSupport.flushCluster(r);\r
51     }\r
52 \r
53     @Override\r
54     public void breakConnection() throws DatabaseException {\r
55         throw new DatabaseException("XSupport.breakConnection not implemented.");\r
56     }\r
57 \r
58     @Override\r
59     public void setClusterStreamOff(boolean setOff)\r
60     throws DatabaseException {\r
61         session.clusterTranslator.setStreamOff(setOff);\r
62     }\r
63 \r
64     @Override\r
65     public int clearMetadataCache()\r
66     throws DatabaseException {\r
67         return session.graphSession.metadataCache.clear();\r
68     }\r
69 \r
70     @Override\r
71     public <T> void commitAndContinue(WriteOnlyGraph wograph, WriteTraits wtraits) {\r
72         if(wograph instanceof DelayedWriteGraph) {\r
73                 DelayedWriteGraph dw = (DelayedWriteGraph)wograph;\r
74                 dw.addCommitAndContinue();\r
75         } else {\r
76                 session.state.commitAndContinue2(wograph.getService(WriteGraphImpl.class), session.clusterStream, wtraits);\r
77         }\r
78     }\r
79 \r
80     @Override\r
81     public boolean getImmutable(Resource resource)\r
82     throws DatabaseException {\r
83         if(!resource.isPersistent()) return false;\r
84         ClusterImpl clusterImpl = getCluster(resource);\r
85         return clusterImpl.getImmutable();\r
86     }\r
87 \r
88     @Override\r
89     public void setImmutable(Resource resource, boolean immutable)\r
90     throws DatabaseException {\r
91         ClusterImpl clusterImpl = getCluster(resource);\r
92         clusterImpl.setImmutable(immutable, session.clusterTranslator);\r
93     }\r
94     private ClusterImpl getCluster(Resource resource)\r
95     throws DatabaseException {\r
96         if (null == resource)\r
97             return null;\r
98         int key = session.getService(SerialisationSupport.class).getTransientId(resource);\r
99         return (ClusterImpl)session.clusterTranslator.getClusterByResourceKey(key);\r
100     }\r
101 \r
102     @Override\r
103     public void setServiceMode(boolean allow, boolean create) {\r
104         if  (DEBUG) {\r
105             new Throwable("printing stack trace").printStackTrace();\r
106             System.out.println("XSupportImpl.setServiceMode allow=" + allow + " create=" + create + ", old mode=" + session.serviceMode);\r
107         }\r
108         int newServiceMode = (allow ? 1:0) + (create ? 2:0);\r
109         if(newServiceMode != session.serviceMode) {\r
110                 session.serviceMode = newServiceMode; \r
111                 session.writeSupport.flushCluster();\r
112                 session.clusterSetsSupport.clear();\r
113         }\r
114     }\r
115     @Override\r
116     public Resource convertDelayedResourceToResource(Resource resource) {\r
117         return DelayedWriteGraph.convertDelayedResource(resource);\r
118     }\r
119     @Override\r
120     public String execute(String command)\r
121     throws DatabaseException {\r
122         boolean transaction = true;\r
123         try {\r
124             session.state.startReadTransaction(Integer.MIN_VALUE);\r
125         } catch (Throwable t) {\r
126             Logger.defaultLogError("Trying to muddle on.", t);\r
127             transaction = false;\r
128         }\r
129         try {\r
130             return session.graphSession.execute(command);\r
131         } finally {\r
132             if (transaction)\r
133                 session.state.stopReadTransaction();\r
134         }\r
135     }\r
136     @Override\r
137     public void testCluster(Session session)\r
138     throws DatabaseException {\r
139         TestCluster.test(session);\r
140     }\r
141     @Override\r
142     public ClusterUID[] listClusters() throws DatabaseException {\r
143         return session.graphSession.listClusters();\r
144     }\r
145     @Override\r
146     public void deleteCluster(ClusterUID clusterUID) throws DatabaseException {\r
147         ClusterImpl clusterImpl = session.clusterTable.getClusterByClusterUIDOrMakeProxy(clusterUID);\r
148         //clusterImpl.setDeleted(true, session.clusterTranslator);\r
149         session.clusterTranslator.setDeleted(clusterImpl, true);\r
150     }\r
151     @Override\r
152     public void purge() throws DatabaseException {\r
153         if (null == session)\r
154             return;\r
155         if (null == session.graphSession)\r
156             return;\r
157         Database db = session.graphSession.dbSession.getDatabase();\r
158         db.purgeDatabase();\r
159     }\r
160 \r
161     @Override\r
162     public boolean rolledback() {\r
163         return session.graphSession.rolledback();\r
164     }\r
165 }\r