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