]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.common/src/org/simantics/db/common/UndoMetadata.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.db.common / src / org / simantics / db / common / UndoMetadata.java
1 package org.simantics.db.common;\r
2 \r
3 import java.io.ByteArrayInputStream;\r
4 import java.io.ByteArrayOutputStream;\r
5 import java.io.ObjectInputStream;\r
6 import java.io.ObjectOutputStream;\r
7 import java.util.TreeMap;\r
8 \r
9 import org.simantics.db.Session;\r
10 import org.simantics.db.common.utils.Logger;\r
11 import org.simantics.db.common.utils.Serializers;\r
12 \r
13 public class UndoMetadata extends ACommentMetadata {\r
14     private boolean redo; // False if this was a undo operation.\r
15     private long begin; // Identifies first change set that was reverted.\r
16     private long end; // Identifies last change set that was reverted.\r
17     public UndoMetadata(byte[] comments, boolean redo, long begin, long end) {\r
18         super(comments);\r
19         this.redo = redo;\r
20         this.begin = begin;\r
21         this.end = end;\r
22     }\r
23     public UndoMetadata(TreeMap<String, byte[]> metadata) {\r
24         super((byte[])null);\r
25         if (null != metadata) {\r
26             byte[] data = metadata.get(UndoMetadata.class.getName());\r
27             initialize(data);\r
28         }\r
29     }\r
30     public UndoMetadata(byte[] data) {\r
31         super((byte[])null);\r
32         initialize(data);\r
33     }\r
34 \r
35     private void initialize(byte[] data) {\r
36         if (null != data) {\r
37             try {\r
38                 UndoMetadata um = deserialise(null, data);\r
39                 comments = um.comments;\r
40                 redo = um.redo;\r
41                 begin = um.begin;\r
42                 end = um.end;\r
43             } catch (Exception e) {\r
44                 Logger.defaultLogError(e);\r
45             }\r
46         }\r
47     }\r
48 \r
49     @Override\r
50     public byte[] serialise(Session session) {\r
51         try {\r
52             ByteArrayOutputStream os = new ByteArrayOutputStream();\r
53             ObjectOutputStream oos = new ObjectOutputStream(os);\r
54             byte[] bytes = Serializers.serializeStrings(comments.toArray(new String[comments.size()]));\r
55             oos.writeInt(bytes.length);\r
56             oos.write(bytes);\r
57             oos.writeBoolean(redo);\r
58             oos.writeLong(begin);\r
59             oos.writeLong(end);\r
60             oos.close();\r
61             return os.toByteArray();\r
62         } catch (Exception e) {\r
63             if (DEBUG)\r
64                 e.printStackTrace();\r
65             Logger.defaultLogError(e.toString());\r
66         }\r
67         return new byte[0];\r
68     }\r
69 \r
70     public static UndoMetadata deserialise(Session session, byte[] input) {\r
71         try {\r
72             if (null == input)\r
73                 return new UndoMetadata(null, false, 0, 0);\r
74             ByteArrayInputStream is = new ByteArrayInputStream(input);\r
75             ObjectInputStream ois = new ObjectInputStream(is);\r
76             int len = ois.readInt();\r
77             if (len < 0)\r
78                 throw new Error("Deserialisation error. Illegal string length=" + len);\r
79             byte[] bytes = new byte[len];\r
80             ois.readFully(bytes);\r
81             boolean redo = ois.readBoolean();\r
82             long begin = ois.readLong();\r
83             long end = ois.readLong();\r
84             ois.close();\r
85             return new UndoMetadata(bytes, redo, begin, end);\r
86         } catch (Throwable e) {\r
87             Logger.defaultLogError(e);\r
88         }\r
89         return new UndoMetadata(null, false, 0, 0);\r
90     }\r
91     public boolean isRedo() {\r
92         return redo;\r
93     }\r
94     public long getBeginCSId() {\r
95         return begin;\r
96     }\r
97     public long getEndCSId() {\r
98         return end;\r
99     }\r
100     public void setTypeAndRange(UndoMetadata um) {\r
101         redo = ! um.redo;\r
102         begin = um.begin;\r
103         end = um.end;\r
104     }\r
105     public void setTypeAndRange(boolean redo, long begin, long end) {\r
106         this.redo = redo;\r
107         this.begin = begin;\r
108         this.end = end;\r
109     }\r
110     public String getType() {\r
111         return redo ? "Redo" : "Undo";\r
112     }\r
113     public String getRange() {\r
114         return "[" + begin + "," + end + "]";\r
115     }\r
116     public String getHeader() {\r
117         return getType() + getRange();\r
118     }\r
119 }\r