--- /dev/null
+package org.simantics.db.common;\r
+\r
+import java.io.ByteArrayInputStream;\r
+import java.io.ByteArrayOutputStream;\r
+import java.io.ObjectInputStream;\r
+import java.io.ObjectOutputStream;\r
+import java.util.TreeMap;\r
+\r
+import org.simantics.db.Session;\r
+import org.simantics.db.common.utils.Logger;\r
+import org.simantics.db.common.utils.Serializers;\r
+\r
+public class UndoMetadata extends ACommentMetadata {\r
+ private boolean redo; // False if this was a undo operation.\r
+ private long begin; // Identifies first change set that was reverted.\r
+ private long end; // Identifies last change set that was reverted.\r
+ public UndoMetadata(byte[] comments, boolean redo, long begin, long end) {\r
+ super(comments);\r
+ this.redo = redo;\r
+ this.begin = begin;\r
+ this.end = end;\r
+ }\r
+ public UndoMetadata(TreeMap<String, byte[]> metadata) {\r
+ super((byte[])null);\r
+ if (null != metadata) {\r
+ byte[] data = metadata.get(UndoMetadata.class.getName());\r
+ initialize(data);\r
+ }\r
+ }\r
+ public UndoMetadata(byte[] data) {\r
+ super((byte[])null);\r
+ initialize(data);\r
+ }\r
+\r
+ private void initialize(byte[] data) {\r
+ if (null != data) {\r
+ try {\r
+ UndoMetadata um = deserialise(null, data);\r
+ comments = um.comments;\r
+ redo = um.redo;\r
+ begin = um.begin;\r
+ end = um.end;\r
+ } catch (Exception e) {\r
+ Logger.defaultLogError(e);\r
+ }\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public byte[] serialise(Session session) {\r
+ try {\r
+ ByteArrayOutputStream os = new ByteArrayOutputStream();\r
+ ObjectOutputStream oos = new ObjectOutputStream(os);\r
+ byte[] bytes = Serializers.serializeStrings(comments.toArray(new String[comments.size()]));\r
+ oos.writeInt(bytes.length);\r
+ oos.write(bytes);\r
+ oos.writeBoolean(redo);\r
+ oos.writeLong(begin);\r
+ oos.writeLong(end);\r
+ oos.close();\r
+ return os.toByteArray();\r
+ } catch (Exception e) {\r
+ if (DEBUG)\r
+ e.printStackTrace();\r
+ Logger.defaultLogError(e.toString());\r
+ }\r
+ return new byte[0];\r
+ }\r
+\r
+ public static UndoMetadata deserialise(Session session, byte[] input) {\r
+ try {\r
+ if (null == input)\r
+ return new UndoMetadata(null, false, 0, 0);\r
+ ByteArrayInputStream is = new ByteArrayInputStream(input);\r
+ ObjectInputStream ois = new ObjectInputStream(is);\r
+ int len = ois.readInt();\r
+ if (len < 0)\r
+ throw new Error("Deserialisation error. Illegal string length=" + len);\r
+ byte[] bytes = new byte[len];\r
+ ois.readFully(bytes);\r
+ boolean redo = ois.readBoolean();\r
+ long begin = ois.readLong();\r
+ long end = ois.readLong();\r
+ ois.close();\r
+ return new UndoMetadata(bytes, redo, begin, end);\r
+ } catch (Throwable e) {\r
+ Logger.defaultLogError(e);\r
+ }\r
+ return new UndoMetadata(null, false, 0, 0);\r
+ }\r
+ public boolean isRedo() {\r
+ return redo;\r
+ }\r
+ public long getBeginCSId() {\r
+ return begin;\r
+ }\r
+ public long getEndCSId() {\r
+ return end;\r
+ }\r
+ public void setTypeAndRange(UndoMetadata um) {\r
+ redo = ! um.redo;\r
+ begin = um.begin;\r
+ end = um.end;\r
+ }\r
+ public void setTypeAndRange(boolean redo, long begin, long end) {\r
+ this.redo = redo;\r
+ this.begin = begin;\r
+ this.end = end;\r
+ }\r
+ public String getType() {\r
+ return redo ? "Redo" : "Undo";\r
+ }\r
+ public String getRange() {\r
+ return "[" + begin + "," + end + "]";\r
+ }\r
+ public String getHeader() {\r
+ return getType() + getRange();\r
+ }\r
+}\r