1 package fi.vtt.simantics.procore.internal;
\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
20 public class XSupportImpl implements XSupport {
\r
21 final private boolean DEBUG = false;
\r
22 final private SessionImplSocket session;
\r
24 XSupportImpl(SessionImplSocket session) {
\r
25 this.session = session;
\r
29 public void corruptPageTableAndDie() throws DatabaseException {
\r
30 execute("corruptPageTableAndDie");
\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
43 public int corruptClusterTable(long clusterId)
\r
44 throws DatabaseException {
\r
45 return session.clusterTable.makeProxy(ClusterUID.make(0,666), clusterId).getClusterKey();
\r
49 public void flushCluster(Resource r) throws ServiceException {
\r
50 session.writeSupport.flushCluster(r);
\r
54 public void breakConnection() throws DatabaseException {
\r
55 throw new DatabaseException("XSupport.breakConnection not implemented.");
\r
59 public void setClusterStreamOff(boolean setOff)
\r
60 throws DatabaseException {
\r
61 session.clusterTranslator.setStreamOff(setOff);
\r
65 public int clearMetadataCache()
\r
66 throws DatabaseException {
\r
67 return session.graphSession.metadataCache.clear();
\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
76 session.state.commitAndContinue2(wograph.getService(WriteGraphImpl.class), session.clusterStream, wtraits);
\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
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
94 private ClusterImpl getCluster(Resource resource)
\r
95 throws DatabaseException {
\r
96 if (null == resource)
\r
98 int key = session.getService(SerialisationSupport.class).getTransientId(resource);
\r
99 return (ClusterImpl)session.clusterTranslator.getClusterByResourceKey(key);
\r
103 public void setServiceMode(boolean allow, boolean create) {
\r
105 new Throwable("printing stack trace").printStackTrace();
\r
106 System.out.println("XSupportImpl.setServiceMode allow=" + allow + " create=" + create + ", old mode=" + session.serviceMode);
\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
116 public Resource convertDelayedResourceToResource(Resource resource) {
\r
117 return DelayedWriteGraph.convertDelayedResource(resource);
\r
120 public String execute(String command)
\r
121 throws DatabaseException {
\r
122 boolean transaction = true;
\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
130 return session.graphSession.execute(command);
\r
133 session.state.stopReadTransaction();
\r
137 public void testCluster(Session session)
\r
138 throws DatabaseException {
\r
139 TestCluster.test(session);
\r
142 public ClusterUID[] listClusters() throws DatabaseException {
\r
143 return session.graphSession.listClusters();
\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
152 public void purge() throws DatabaseException {
\r
153 if (null == session)
\r
155 if (null == session.graphSession)
\r
157 Database db = session.graphSession.dbSession.getDatabase();
\r
158 db.purgeDatabase();
\r