]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - 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
diff --git a/bundles/org.simantics.db.common/src/org/simantics/db/common/UndoMetadata.java b/bundles/org.simantics.db.common/src/org/simantics/db/common/UndoMetadata.java
new file mode 100644 (file)
index 0000000..b832565
--- /dev/null
@@ -0,0 +1,119 @@
+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