]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
1 package org.simantics.db.impl.graph;\r
2 \r
3 import gnu.trove.set.hash.TIntHashSet;\r
4 \r
5 import java.io.File;\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
11 \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
25 \r
26 public class WriteLogger {\r
27 \r
28     //final public static String LOG = "WriteLogger.log";\r
29 \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
34 \r
35     static {\r
36         if(Development.DEVELOPMENT) {\r
37                 created = new TIntHashSet();\r
38                 logFile = new File("write.log");\r
39                 try {\r
40                         raf = new RandomAccessFile(logFile, "rw");\r
41                         } catch (FileNotFoundException e) {\r
42                                 e.printStackTrace();\r
43                         }\r
44         }\r
45     }\r
46 \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
51         int id = impl.id;\r
52         if(created.contains(id)) return "I" + impl.id;\r
53         else {\r
54                 String uri = graph.getPossibleURI(resource);\r
55                 if(uri != null) return "U" + uri;\r
56                 else return "N";\r
57         }\r
58     }\r
59     \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
64         else {\r
65                 if(VirtualGraph.Persistency.MEMORY == vg.getPersistency()) return "M" + vg.getIdentifier();\r
66                 else return "W" + vg.getIdentifier();\r
67         }\r
68     }\r
69     \r
70     private static void logLine(String line) {\r
71         if(!enable) return;\r
72         try {\r
73                 byte[] data = line.getBytes();\r
74                 raf.write(data);\r
75         } catch (IOException e) {\r
76                 \r
77         }\r
78     }\r
79     \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
82     }\r
83 \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
86     }\r
87 \r
88     public static void logNewResource(ReadGraph graph, Resource subject) throws DatabaseException {\r
89         if(!enable) return;\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
93     }\r
94 \r
95     public static void logValue(ReadGraph graph, Resource subject, byte[] value) throws DatabaseException {\r
96         if(!enable) return;\r
97         try {\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
101                 }\r
102     }\r
103 \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
109                 }\r
110                 return result;\r
111         } else if (id.startsWith("U")) {\r
112                 return graph.getPossibleResource(id.substring(1));\r
113         } else {\r
114                 return null;\r
115         }\r
116     }\r
117     \r
118         private static VirtualGraph vg = null;\r
119         \r
120         private static VirtualGraph getVirtualGraph(WriteGraphImpl graph, String id) {\r
121                 \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
126                 } else {\r
127                         return vgs.getWorkspacePersistent(id.substring(1));\r
128                 }\r
129                 \r
130         }\r
131         \r
132         private static WriteGraphImpl applyVirtualGraph(WriteGraphImpl graph, String id) {\r
133                 VirtualGraph target = getVirtualGraph(graph, id);\r
134                 if(target != vg) {\r
135                         vg = target;\r
136                         return (WriteGraphImpl)graph.newSync(target); \r
137                 } else {\r
138                         return graph;\r
139                 }\r
140         }\r
141         \r
142 \r
143     public static void read(WriteGraph _graph) throws Exception {\r
144         vg = null;\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
158                         } else {\r
159                                 graph.claim(subject, predicate, inverse, object);\r
160                         }\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
169                         } else {\r
170                                 graph.deny(subject, predicate, inverse, object);\r
171                         }\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
185                         \r
186                 }\r
187         }\r
188     }\r
189 \r
190 }\r