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