--- /dev/null
+package org.simantics.db.impl.graph;\r
+\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
+import java.io.File;\r
+import java.io.FileInputStream;\r
+import java.io.FileNotFoundException;\r
+import java.io.IOException;\r
+import java.io.RandomAccessFile;\r
+import java.util.HashMap;\r
+\r
+import org.simantics.databoard.Bindings;\r
+import org.simantics.databoard.binding.error.BindingException;\r
+import org.simantics.databoard.parser.repository.DataValueRepository;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.VirtualGraph;\r
+import org.simantics.db.WriteGraph;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.impl.ResourceImpl;\r
+import org.simantics.db.service.TransferableGraphSupport;\r
+import org.simantics.db.service.VirtualGraphSupport;\r
+import org.simantics.utils.Development;\r
+import org.simantics.utils.FileUtils;\r
+\r
+public class WriteLogger {\r
+\r
+ //final public static String LOG = "WriteLogger.log";\r
+\r
+ public static File logFile;\r
+ public static RandomAccessFile raf;\r
+ public static boolean enable = false;\r
+ public static TIntHashSet created;\r
+\r
+ static {\r
+ if(Development.DEVELOPMENT) {\r
+ created = new TIntHashSet();\r
+ logFile = new File("write.log");\r
+ try {\r
+ raf = new RandomAccessFile(logFile, "rw");\r
+ } catch (FileNotFoundException e) {\r
+ e.printStackTrace();\r
+ }\r
+ }\r
+ }\r
+\r
+ private static String resourceLog(ReadGraph graph, Resource resource) throws DatabaseException {\r
+ if(!enable) return null;\r
+ if(resource == null) return "N";\r
+ ResourceImpl impl = (ResourceImpl)resource;\r
+ int id = impl.id;\r
+ if(created.contains(id)) return "I" + impl.id;\r
+ else {\r
+ String uri = graph.getPossibleURI(resource);\r
+ if(uri != null) return "U" + uri;\r
+ else return "N";\r
+ }\r
+ }\r
+ \r
+ private static String virtualGraphLog(ReadGraph graph) {\r
+ WriteGraphImpl impl = (WriteGraphImpl)graph;\r
+ VirtualGraph vg = impl.getProvider();\r
+ if(vg == null) return "N";\r
+ else {\r
+ if(VirtualGraph.Persistency.MEMORY == vg.getPersistency()) return "M" + vg.getIdentifier();\r
+ else return "W" + vg.getIdentifier();\r
+ }\r
+ }\r
+ \r
+ private static void logLine(String line) {\r
+ if(!enable) return;\r
+ try {\r
+ byte[] data = line.getBytes();\r
+ raf.write(data);\r
+ } catch (IOException e) {\r
+ \r
+ }\r
+ }\r
+ \r
+ public static void logClaim(ReadGraph graph, Resource subject, Resource predicate, Resource inverse, Resource object) throws DatabaseException {\r
+ logLine("C\t" + virtualGraphLog(graph) + "\t" + resourceLog(graph, subject) + "\t" + resourceLog(graph, predicate) + "\t" + resourceLog(graph, inverse) + "\t" + resourceLog(graph, object) + "\n");\r
+ }\r
+\r
+ public static void logDeny(ReadGraph graph, Resource subject, Resource predicate, Resource inverse, Resource object) throws DatabaseException {\r
+ logLine("D\t" + virtualGraphLog(graph) + "\t" + resourceLog(graph, subject) + "\t" + resourceLog(graph, predicate) + "\t" + resourceLog(graph, inverse) + "\t" + resourceLog(graph, object) + "\n");\r
+ }\r
+\r
+ public static void logNewResource(ReadGraph graph, Resource subject) throws DatabaseException {\r
+ if(!enable) return;\r
+ ResourceImpl impl = (ResourceImpl)subject;\r
+ created.add(impl.id);\r
+ logLine("R\t" + virtualGraphLog(graph) + "\t" + resourceLog(graph, subject) + "\n");\r
+ }\r
+\r
+ public static void logValue(ReadGraph graph, Resource subject, byte[] value) throws DatabaseException {\r
+ if(!enable) return;\r
+ try {\r
+ logLine("V\t" + virtualGraphLog(graph) + "\t" + resourceLog(graph, subject) + "\t" + Bindings.BYTE_ARRAY.toString(value) + "\n");\r
+ } catch (BindingException e) {\r
+ e.printStackTrace();\r
+ }\r
+ }\r
+\r
+ private static Resource readResource(WriteGraph graph, String id, HashMap<String, Resource> ids) throws DatabaseException {\r
+ if(id.startsWith("I")) {\r
+ Resource result = ids.get(id);\r
+ if(result == null) {\r
+ System.err.println("undeclared id='" + id + "'");\r
+ }\r
+ return result;\r
+ } else if (id.startsWith("U")) {\r
+ return graph.getPossibleResource(id.substring(1));\r
+ } else {\r
+ return null;\r
+ }\r
+ }\r
+ \r
+ private static VirtualGraph vg = null;\r
+ \r
+ private static VirtualGraph getVirtualGraph(WriteGraphImpl graph, String id) {\r
+ \r
+ if("N".equals(id)) return null;\r
+ VirtualGraphSupport vgs = graph.getService(VirtualGraphSupport.class);\r
+ if (id.startsWith("M")) {\r
+ return vgs.getMemoryPersistent(id.substring(1));\r
+ } else {\r
+ return vgs.getWorkspacePersistent(id.substring(1));\r
+ }\r
+ \r
+ }\r
+ \r
+ private static WriteGraphImpl applyVirtualGraph(WriteGraphImpl graph, String id) {\r
+ VirtualGraph target = getVirtualGraph(graph, id);\r
+ if(target != vg) {\r
+ vg = target;\r
+ return (WriteGraphImpl)graph.newSync(target); \r
+ } else {\r
+ return graph;\r
+ }\r
+ }\r
+ \r
+\r
+ public static void read(WriteGraph _graph) throws Exception {\r
+ vg = null;\r
+ WriteGraphImpl graph = (WriteGraphImpl)_graph;\r
+ String data = FileUtils.getContents(new FileInputStream(logFile)).replace("\r", "");\r
+ HashMap<String, Resource> ids = new HashMap<String, Resource>();\r
+ for(String line : data.split("\n")) {\r
+ String[] parts = line.split("\t");\r
+ if("C".equals(parts[0])) {\r
+ graph = applyVirtualGraph(graph, parts[1]);\r
+ Resource subject = readResource(graph, parts[2], ids);\r
+ Resource predicate = readResource(graph, parts[3], ids);\r
+ Resource inverse = readResource(graph, parts[4], ids);\r
+ Resource object = readResource(graph, parts[5], ids);\r
+ if(subject == null || predicate == null || object == null) {\r
+ System.err.println("skipped statement");\r
+ } else {\r
+ graph.claim(subject, predicate, inverse, object);\r
+ }\r
+ } else if("D".equals(parts[0])) {\r
+ graph = applyVirtualGraph(graph, parts[1]);\r
+ Resource subject = readResource(graph, parts[2], ids);\r
+ Resource predicate = readResource(graph, parts[3], ids);\r
+ Resource inverse = readResource(graph, parts[4], ids);\r
+ Resource object = readResource(graph, parts[5], ids);\r
+ if(subject == null || predicate == null || object == null) {\r
+ System.err.println("skipped statement");\r
+ } else {\r
+ graph.deny(subject, predicate, inverse, object);\r
+ }\r
+ } else if ("R".equals(parts[0])) {\r
+ graph = applyVirtualGraph(graph, parts[1]);\r
+ Resource resource = graph.newResource();\r
+ ids.put(parts[2], resource);\r
+ } else if ("V".equals(parts[0])) {\r
+ graph = applyVirtualGraph(graph, parts[1]);\r
+ Resource subject = readResource(graph, parts[2], ids);\r
+ // This is an error\r
+ if(subject == null) continue;\r
+ byte[] value = (byte[])Bindings.BYTE_ARRAY.parseValue(parts[3], new DataValueRepository());\r
+ TransferableGraphSupport tgSupport = \r
+ graph.getService(TransferableGraphSupport.class);\r
+ tgSupport.setValue(graph, subject, vg, value);\r
+ \r
+ }\r
+ }\r
+ }\r
+\r
+}\r