--- /dev/null
+package fi.vtt.simantics.procore.internal;\r
+\r
+import org.simantics.db.MonitorContext;\r
+import org.simantics.db.MonitorHandler;\r
+import org.simantics.db.SessionVariables;\r
+import org.simantics.db.service.SessionMonitorSupport;\r
+\r
+public class SessionMonitorSupportImpl implements SessionMonitorSupport {\r
+ \r
+ final private SessionImplSocket session;\r
+ \r
+ SessionMonitorSupportImpl(SessionImplSocket session) {\r
+ this.session = session;\r
+ }\r
+ \r
+ @Override\r
+ public synchronized MonitorContext registerMonitor(MonitorHandler h) {\r
+ assert h != null;\r
+\r
+ MonitorContext ctx = new MonitorContext() {\r
+ @Override\r
+ public int getInteger(String key) {\r
+ if (SessionVariables.QUEUED_READS.equals(key)) {\r
+ return session.state.getReadCount();\r
+ } else if (SessionVariables.QUEUED_WRITES.equals(key)) {\r
+ return session.state.getWriteCount();\r
+ }\r
+ return -1;\r
+ }\r
+\r
+ @Override\r
+ public String getString(String key) {\r
+ return null;\r
+ }\r
+ };\r
+ session.monitorContexts.map(ctx, h);\r
+\r
+ MonitorHandler[] newHandlers = new MonitorHandler[session.monitorHandlers.length + 1];\r
+ System.arraycopy(session.monitorHandlers, 0, newHandlers, 0, session.monitorHandlers.length);\r
+ newHandlers[session.monitorHandlers.length] = h;\r
+ session.monitorHandlers = newHandlers;\r
+\r
+ return ctx;\r
+ }\r
+\r
+ @Override\r
+ public synchronized void unregisterMonitor(MonitorContext ctx) {\r
+ MonitorHandler h = session.monitorContexts.getRight(ctx);\r
+ if (h == null)\r
+ return;\r
+ int i = 0;\r
+ for (i = 0; i < session.monitorHandlers.length; i++) {\r
+ if (h.equals(session.monitorHandlers))\r
+ break;\r
+ }\r
+ if (i < session.monitorHandlers.length) {\r
+ MonitorHandler[] newHandlers = new MonitorHandler[session.monitorHandlers.length - 1];\r
+ System.arraycopy(session.monitorHandlers, 0, newHandlers, 0, i);\r
+ System.arraycopy(session.monitorHandlers, i + 1, newHandlers, i, session.monitorHandlers.length - i - 1);\r
+ }\r
+ }\r
+ \r
+}\r