1 package org.simantics.db.common;
\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
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
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
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
30 public UndoMetadata(byte[] data) {
\r
31 super((byte[])null);
\r
35 private void initialize(byte[] data) {
\r
38 UndoMetadata um = deserialise(null, data);
\r
39 comments = um.comments;
\r
43 } catch (Exception e) {
\r
44 Logger.defaultLogError(e);
\r
50 public byte[] serialise(Session session) {
\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
57 oos.writeBoolean(redo);
\r
58 oos.writeLong(begin);
\r
61 return os.toByteArray();
\r
62 } catch (Exception e) {
\r
64 e.printStackTrace();
\r
65 Logger.defaultLogError(e.toString());
\r
70 public static UndoMetadata deserialise(Session session, byte[] 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
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
85 return new UndoMetadata(bytes, redo, begin, end);
\r
86 } catch (Throwable e) {
\r
87 Logger.defaultLogError(e);
\r
89 return new UndoMetadata(null, false, 0, 0);
\r
91 public boolean isRedo() {
\r
94 public long getBeginCSId() {
\r
97 public long getEndCSId() {
\r
100 public void setTypeAndRange(UndoMetadata um) {
\r
105 public void setTypeAndRange(boolean redo, long begin, long end) {
\r
107 this.begin = begin;
\r
110 public String getType() {
\r
111 return redo ? "Redo" : "Undo";
\r
113 public String getRange() {
\r
114 return "[" + begin + "," + end + "]";
\r
116 public String getHeader() {
\r
117 return getType() + getRange();
\r