From 6e7cc64b435f912c877553c75070d412c6f7426b Mon Sep 17 00:00:00 2001 From: MrLetsplay Date: Wed, 5 Jun 2024 22:06:14 +0200 Subject: [PATCH] Fix bugs, Add more document/bag methods --- .../document/ArrayCharBag.java | 5 ++++ .../shareclientcore/document/CharBag.java | 5 ++++ .../document/SharedDocument.java | 30 ++++++++++++++----- 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/main/java/me/mrletsplay/shareclientcore/document/ArrayCharBag.java b/src/main/java/me/mrletsplay/shareclientcore/document/ArrayCharBag.java index 1890ebc..cbfc2b9 100644 --- a/src/main/java/me/mrletsplay/shareclientcore/document/ArrayCharBag.java +++ b/src/main/java/me/mrletsplay/shareclientcore/document/ArrayCharBag.java @@ -41,6 +41,11 @@ public class ArrayCharBag implements CharBag { return chars.get(index); } + @Override + public void clear() { + chars.clear(); + } + @Override public int size() { return chars.size(); diff --git a/src/main/java/me/mrletsplay/shareclientcore/document/CharBag.java b/src/main/java/me/mrletsplay/shareclientcore/document/CharBag.java index 99b807d..99dfbbd 100644 --- a/src/main/java/me/mrletsplay/shareclientcore/document/CharBag.java +++ b/src/main/java/me/mrletsplay/shareclientcore/document/CharBag.java @@ -26,6 +26,11 @@ public interface CharBag { */ public Char get(int index); + /** + * Removes all chars from this bag + */ + public void clear(); + /** * Returns the number of chars in this bag * @return The number of chars diff --git a/src/main/java/me/mrletsplay/shareclientcore/document/SharedDocument.java b/src/main/java/me/mrletsplay/shareclientcore/document/SharedDocument.java index c36b3b5..048576f 100644 --- a/src/main/java/me/mrletsplay/shareclientcore/document/SharedDocument.java +++ b/src/main/java/me/mrletsplay/shareclientcore/document/SharedDocument.java @@ -36,27 +36,26 @@ public class SharedDocument implements MessageListener { insert(0, initialContents, Identifier.DEFAULT_SITE); } } - + public SharedDocument(RemoteConnection connection, String path, String initialContents) { - this(connection, path, initialContents.getBytes(StandardCharsets.UTF_8)); + this(connection, path, initialContents == null ? null : initialContents.getBytes(StandardCharsets.UTF_8)); } public SharedDocument(RemoteConnection connection, String path) { - this(connection, path, null); + this(connection, path, (byte[]) null); } - private Change[] insert(int index, String str, int site) { + private Change[] insert(int index, byte[] bytes, int site) throws IllegalArgumentException { if(index < 0 || index >= charBag.size() - 1) throw new IllegalArgumentException("Index out of bounds"); Char charBefore = charBag.get(index); Char charAfter = charBag.get(index +1); - byte[] chars = str.getBytes(StandardCharsets.UTF_8); - Change[] changes = new Change[chars.length]; - for(int i = 0; i < chars.length; i++) { + Change[] changes = new Change[bytes.length]; + for(int i = 0; i < bytes.length; i++) { Identifier[] newPos = Util.generatePositionBetween(charBefore.position(), charAfter.position(), site); lamport++; - Char ch = new Char(newPos, lamport, chars[i]); + Char ch = new Char(newPos, lamport, bytes[i]); charBag.add(ch); changes[i] = new Change(path, ChangeType.ADD, ch); charBefore = ch; @@ -65,6 +64,21 @@ public class SharedDocument implements MessageListener { return changes; } + private Change[] insert(int index, String str, int site) throws IllegalArgumentException { + return insert(index, str.getBytes(StandardCharsets.UTF_8), site); + } + + /** + * Removes all characters from this document.
+ *
+ * Note: This is not the same as calling {@link #getCharBag() getCharBag()}.{@link CharBag#clear() clear()}, because documents rely on the {@link Char#START_OF_DOCUMENT} and {@link Char#END_OF_DOCUMENT} characters to exist in the document. + */ + public void clear() { + charBag.clear(); + charBag.add(Char.START_OF_DOCUMENT); + charBag.add(Char.END_OF_DOCUMENT); + } + /** * Inserts characters into the document at the specified index * @param index The index to insert at