]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.db.impl/src/org/simantics/db/impl/graph/WriteLogger.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.db.impl / src / org / simantics / db / impl / graph / WriteLogger.java
diff --git a/bundles/org.simantics.db.impl/src/org/simantics/db/impl/graph/WriteLogger.java b/bundles/org.simantics.db.impl/src/org/simantics/db/impl/graph/WriteLogger.java
new file mode 100644 (file)
index 0000000..eb1484b
--- /dev/null
@@ -0,0 +1,190 @@
+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