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