1 package org.simantics.db.impl.graph;
\r
3 import gnu.trove.set.hash.TIntHashSet;
\r
6 import java.io.FileInputStream;
\r
7 import java.io.FileNotFoundException;
\r
8 import java.io.IOException;
\r
9 import java.io.RandomAccessFile;
\r
10 import java.util.HashMap;
\r
12 import org.simantics.databoard.Bindings;
\r
13 import org.simantics.databoard.binding.error.BindingException;
\r
14 import org.simantics.databoard.parser.repository.DataValueRepository;
\r
15 import org.simantics.db.ReadGraph;
\r
16 import org.simantics.db.Resource;
\r
17 import org.simantics.db.VirtualGraph;
\r
18 import org.simantics.db.WriteGraph;
\r
19 import org.simantics.db.exception.DatabaseException;
\r
20 import org.simantics.db.impl.ResourceImpl;
\r
21 import org.simantics.db.service.TransferableGraphSupport;
\r
22 import org.simantics.db.service.VirtualGraphSupport;
\r
23 import org.simantics.utils.Development;
\r
24 import org.simantics.utils.FileUtils;
\r
26 public class WriteLogger {
\r
28 //final public static String LOG = "WriteLogger.log";
\r
30 public static File logFile;
\r
31 public static RandomAccessFile raf;
\r
32 public static boolean enable = false;
\r
33 public static TIntHashSet created;
\r
36 if(Development.DEVELOPMENT) {
\r
37 created = new TIntHashSet();
\r
38 logFile = new File("write.log");
\r
40 raf = new RandomAccessFile(logFile, "rw");
\r
41 } catch (FileNotFoundException e) {
\r
42 e.printStackTrace();
\r
47 private static String resourceLog(ReadGraph graph, Resource resource) throws DatabaseException {
\r
48 if(!enable) return null;
\r
49 if(resource == null) return "N";
\r
50 ResourceImpl impl = (ResourceImpl)resource;
\r
52 if(created.contains(id)) return "I" + impl.id;
\r
54 String uri = graph.getPossibleURI(resource);
\r
55 if(uri != null) return "U" + uri;
\r
60 private static String virtualGraphLog(ReadGraph graph) {
\r
61 WriteGraphImpl impl = (WriteGraphImpl)graph;
\r
62 VirtualGraph vg = impl.getProvider();
\r
63 if(vg == null) return "N";
\r
65 if(VirtualGraph.Persistency.MEMORY == vg.getPersistency()) return "M" + vg.getIdentifier();
\r
66 else return "W" + vg.getIdentifier();
\r
70 private static void logLine(String line) {
\r
73 byte[] data = line.getBytes();
\r
75 } catch (IOException e) {
\r
80 public static void logClaim(ReadGraph graph, Resource subject, Resource predicate, Resource inverse, Resource object) throws DatabaseException {
\r
81 logLine("C\t" + virtualGraphLog(graph) + "\t" + resourceLog(graph, subject) + "\t" + resourceLog(graph, predicate) + "\t" + resourceLog(graph, inverse) + "\t" + resourceLog(graph, object) + "\n");
\r
84 public static void logDeny(ReadGraph graph, Resource subject, Resource predicate, Resource inverse, Resource object) throws DatabaseException {
\r
85 logLine("D\t" + virtualGraphLog(graph) + "\t" + resourceLog(graph, subject) + "\t" + resourceLog(graph, predicate) + "\t" + resourceLog(graph, inverse) + "\t" + resourceLog(graph, object) + "\n");
\r
88 public static void logNewResource(ReadGraph graph, Resource subject) throws DatabaseException {
\r
90 ResourceImpl impl = (ResourceImpl)subject;
\r
91 created.add(impl.id);
\r
92 logLine("R\t" + virtualGraphLog(graph) + "\t" + resourceLog(graph, subject) + "\n");
\r
95 public static void logValue(ReadGraph graph, Resource subject, byte[] value) throws DatabaseException {
\r
98 logLine("V\t" + virtualGraphLog(graph) + "\t" + resourceLog(graph, subject) + "\t" + Bindings.BYTE_ARRAY.toString(value) + "\n");
\r
99 } catch (BindingException e) {
\r
100 e.printStackTrace();
\r
104 private static Resource readResource(WriteGraph graph, String id, HashMap<String, Resource> ids) throws DatabaseException {
\r
105 if(id.startsWith("I")) {
\r
106 Resource result = ids.get(id);
\r
107 if(result == null) {
\r
108 System.err.println("undeclared id='" + id + "'");
\r
111 } else if (id.startsWith("U")) {
\r
112 return graph.getPossibleResource(id.substring(1));
\r
118 private static VirtualGraph vg = null;
\r
120 private static VirtualGraph getVirtualGraph(WriteGraphImpl graph, String id) {
\r
122 if("N".equals(id)) return null;
\r
123 VirtualGraphSupport vgs = graph.getService(VirtualGraphSupport.class);
\r
124 if (id.startsWith("M")) {
\r
125 return vgs.getMemoryPersistent(id.substring(1));
\r
127 return vgs.getWorkspacePersistent(id.substring(1));
\r
132 private static WriteGraphImpl applyVirtualGraph(WriteGraphImpl graph, String id) {
\r
133 VirtualGraph target = getVirtualGraph(graph, id);
\r
136 return (WriteGraphImpl)graph.newSync(target);
\r
143 public static void read(WriteGraph _graph) throws Exception {
\r
145 WriteGraphImpl graph = (WriteGraphImpl)_graph;
\r
146 String data = FileUtils.getContents(new FileInputStream(logFile)).replace("\r", "");
\r
147 HashMap<String, Resource> ids = new HashMap<String, Resource>();
\r
148 for(String line : data.split("\n")) {
\r
149 String[] parts = line.split("\t");
\r
150 if("C".equals(parts[0])) {
\r
151 graph = applyVirtualGraph(graph, parts[1]);
\r
152 Resource subject = readResource(graph, parts[2], ids);
\r
153 Resource predicate = readResource(graph, parts[3], ids);
\r
154 Resource inverse = readResource(graph, parts[4], ids);
\r
155 Resource object = readResource(graph, parts[5], ids);
\r
156 if(subject == null || predicate == null || object == null) {
\r
157 System.err.println("skipped statement");
\r
159 graph.claim(subject, predicate, inverse, object);
\r
161 } else if("D".equals(parts[0])) {
\r
162 graph = applyVirtualGraph(graph, parts[1]);
\r
163 Resource subject = readResource(graph, parts[2], ids);
\r
164 Resource predicate = readResource(graph, parts[3], ids);
\r
165 Resource inverse = readResource(graph, parts[4], ids);
\r
166 Resource object = readResource(graph, parts[5], ids);
\r
167 if(subject == null || predicate == null || object == null) {
\r
168 System.err.println("skipped statement");
\r
170 graph.deny(subject, predicate, inverse, object);
\r
172 } else if ("R".equals(parts[0])) {
\r
173 graph = applyVirtualGraph(graph, parts[1]);
\r
174 Resource resource = graph.newResource();
\r
175 ids.put(parts[2], resource);
\r
176 } else if ("V".equals(parts[0])) {
\r
177 graph = applyVirtualGraph(graph, parts[1]);
\r
178 Resource subject = readResource(graph, parts[2], ids);
\r
179 // This is an error
\r
180 if(subject == null) continue;
\r
181 byte[] value = (byte[])Bindings.BYTE_ARRAY.parseValue(parts[3], new DataValueRepository());
\r
182 TransferableGraphSupport tgSupport =
\r
183 graph.getService(TransferableGraphSupport.class);
\r
184 tgSupport.setValue(graph, subject, vg, value);
\r