Update SharedDocument, Fix generatePositionBetween, Name magic constant
This commit is contained in:
parent
b7a6de759e
commit
3baa9ce1e2
@ -10,8 +10,8 @@ import me.mrletsplay.shareclientcore.connection.SerializableObject;
|
|||||||
|
|
||||||
public record Char(Identifier[] position, int lamport, char value) implements SerializableObject {
|
public record Char(Identifier[] position, int lamport, char value) implements SerializableObject {
|
||||||
|
|
||||||
public static final Char START_OF_DOCUMENT = new Char(new Identifier[] { new Identifier(1, 0) }, 0, '^');
|
public static final Char START_OF_DOCUMENT = new Char(new Identifier[] { new Identifier(1, Identifier.DEFAULT_SITE) }, 0, '^');
|
||||||
public static final Char END_OF_DOCUMENT = new Char(new Identifier[] { new Identifier(Util.BASE - 1, 0) }, 0, '$');
|
public static final Char END_OF_DOCUMENT = new Char(new Identifier[] { new Identifier(Util.BASE - 1, Identifier.DEFAULT_SITE) }, 0, '$');
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
|
@ -2,6 +2,8 @@ package me.mrletsplay.shareclientcore.document;
|
|||||||
|
|
||||||
public record Identifier(int digit, int site) implements Comparable<Identifier> {
|
public record Identifier(int digit, int site) implements Comparable<Identifier> {
|
||||||
|
|
||||||
|
public static final int DEFAULT_SITE = 0;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int compareTo(Identifier o) {
|
public int compareTo(Identifier o) {
|
||||||
int tmp;
|
int tmp;
|
||||||
|
@ -21,25 +21,27 @@ public class SharedDocument implements MessageListener {
|
|||||||
private int lamport;
|
private int lamport;
|
||||||
private Set<DocumentListener> listeners;
|
private Set<DocumentListener> listeners;
|
||||||
|
|
||||||
public SharedDocument(RemoteConnection connection, String path) {
|
public SharedDocument(RemoteConnection connection, String path, String initialContents) {
|
||||||
this.connection = connection;
|
this.connection = connection;
|
||||||
connection.addListener(this);
|
|
||||||
|
|
||||||
this.charBag = new ArrayCharBag();
|
this.charBag = new ArrayCharBag();
|
||||||
charBag.add(Char.START_OF_DOCUMENT);
|
|
||||||
charBag.add(Char.END_OF_DOCUMENT);
|
|
||||||
|
|
||||||
this.path = path;
|
this.path = path;
|
||||||
this.site = connection.getSiteID();
|
this.site = connection.getSiteID();
|
||||||
this.listeners = new HashSet<>();
|
this.listeners = new HashSet<>();
|
||||||
|
|
||||||
|
connection.addListener(this);
|
||||||
|
|
||||||
|
charBag.add(Char.START_OF_DOCUMENT);
|
||||||
|
charBag.add(Char.END_OF_DOCUMENT);
|
||||||
|
if(initialContents != null && !initialContents.isEmpty()) {
|
||||||
|
insert(0, initialContents, Identifier.DEFAULT_SITE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public SharedDocument(RemoteConnection connection, String path) {
|
||||||
* Inserts characters into the document at the specified index
|
this(connection, path, null);
|
||||||
* @param index The index to insert at
|
}
|
||||||
* @param str The string to insert
|
|
||||||
*/
|
private Change[] insert(int index, String str, int site) {
|
||||||
public void localInsert(int index, String str) {
|
|
||||||
if(index < 0 || index >= charBag.size() - 1) throw new IllegalArgumentException("Index out of bounds");
|
if(index < 0 || index >= charBag.size() - 1) throw new IllegalArgumentException("Index out of bounds");
|
||||||
|
|
||||||
Char charBefore = charBag.get(index);
|
Char charBefore = charBag.get(index);
|
||||||
@ -56,6 +58,17 @@ public class SharedDocument implements MessageListener {
|
|||||||
charBefore = ch;
|
charBefore = ch;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return changes;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inserts characters into the document at the specified index
|
||||||
|
* @param index The index to insert at
|
||||||
|
* @param str The string to insert
|
||||||
|
*/
|
||||||
|
public void localInsert(int index, String str) {
|
||||||
|
Change[] changes = insert(index, str, site);
|
||||||
|
|
||||||
for(Change c : changes) {
|
for(Change c : changes) {
|
||||||
try {
|
try {
|
||||||
connection.send(new ChangeMessage(c));
|
connection.send(new ChangeMessage(c));
|
||||||
|
@ -23,7 +23,7 @@ public class Util {
|
|||||||
|
|
||||||
List<Identifier> newPosition = new ArrayList<>();
|
List<Identifier> newPosition = new ArrayList<>();
|
||||||
|
|
||||||
for(int i = 0; i < Math.min(before.length, after.length) + 1; i++) {
|
for(int i = 0; i < Math.max(before.length, after.length) + 1; i++) {
|
||||||
Identifier c1 = i >= before.length ? new Identifier(0, site) : before[i];
|
Identifier c1 = i >= before.length ? new Identifier(0, site) : before[i];
|
||||||
Identifier c2 = i >= after.length ? new Identifier(BASE - 1, site) : after[i];
|
Identifier c2 = i >= after.length ? new Identifier(BASE - 1, site) : after[i];
|
||||||
|
|
||||||
|
@ -123,6 +123,15 @@ public class DecimalTest {
|
|||||||
assertArrayEquals(expected, newIdent);
|
assertArrayEquals(expected, newIdent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGeneratePosition_3() {
|
||||||
|
Identifier[] a = { new Identifier(1, 0) };
|
||||||
|
Identifier[] b = { new Identifier(1, 0), new Identifier(0, 0), new Identifier(1, 0) };
|
||||||
|
Identifier[] newIdent = Util.generatePositionBetween(a, b, 0);
|
||||||
|
Identifier[] expected = { new Identifier(1, 0), new Identifier(0, 0), new Identifier(0, 0), new Identifier(1, 0) };
|
||||||
|
assertArrayEquals(expected, newIdent);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGeneratePositionInvalidInputFails() {
|
public void testGeneratePositionInvalidInputFails() {
|
||||||
Identifier[] a = { new Identifier(1, 0), new Identifier(2, 2) };
|
Identifier[] a = { new Identifier(1, 0), new Identifier(2, 2) };
|
||||||
|
Loading…
Reference in New Issue
Block a user