mirror of
https://github.com/ChronosX88/JGUN.git
synced 2024-11-24 07:22:18 +00:00
Implemented gun.on()
This commit is contained in:
parent
9b1b38c1d7
commit
243cc61786
@ -9,11 +9,13 @@ import io.github.chronosx88.JGUN.storageBackends.StorageBackend;
|
|||||||
import org.java_websocket.client.WebSocketClient;
|
import org.java_websocket.client.WebSocketClient;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
public class Dispatcher {
|
public class Dispatcher {
|
||||||
private final Map<String, BaseCompletableFuture<?>> pendingFutures = new ConcurrentHashMap<>();
|
private final Map<String, BaseCompletableFuture<?>> pendingFutures = new ConcurrentHashMap<>();
|
||||||
|
private final Map<String, NodeChangeListener> changeListeners = new HashMap<>();
|
||||||
private final Peer peer;
|
private final Peer peer;
|
||||||
private final StorageBackend graphStorage;
|
private final StorageBackend graphStorage;
|
||||||
private final Dup dup;
|
private final Dup dup;
|
||||||
@ -40,6 +42,7 @@ public class Dispatcher {
|
|||||||
if(message.has("@")) {
|
if(message.has("@")) {
|
||||||
handleIncomingAck(message);
|
handleIncomingAck(message);
|
||||||
}
|
}
|
||||||
|
peer.emit(message.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
private JSONObject handleGet(JSONObject getData) {
|
private JSONObject handleGet(JSONObject getData) {
|
||||||
@ -52,7 +55,14 @@ public class Dispatcher {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private JSONObject handlePut(JSONObject message) {
|
private JSONObject handlePut(JSONObject message) {
|
||||||
HAM.mix(new InMemoryGraph(message.getJSONObject("put")), graphStorage);
|
InMemoryGraph diff = HAM.mix(new InMemoryGraph(message.getJSONObject("put")), graphStorage);
|
||||||
|
if(diff != null) {
|
||||||
|
for(Map.Entry<String, Node> entry : diff.entries()) {
|
||||||
|
if(changeListeners.containsKey(entry.getKey())) {
|
||||||
|
changeListeners.get(entry.getKey()).onChange(entry.getValue().toUserJSONObject());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
return new JSONObject() // Acknowledgment
|
return new JSONObject() // Acknowledgment
|
||||||
.put( "#", dup.track(Dup.random()) )
|
.put( "#", dup.track(Dup.random()) )
|
||||||
.put( "@", message.getString("#") )
|
.put( "@", message.getString("#") )
|
||||||
@ -64,7 +74,7 @@ public class Dispatcher {
|
|||||||
if(pendingFutures.containsKey(ack.getString("@"))) {
|
if(pendingFutures.containsKey(ack.getString("@"))) {
|
||||||
BaseCompletableFuture<?> future = pendingFutures.get(ack.getString("@"));
|
BaseCompletableFuture<?> future = pendingFutures.get(ack.getString("@"));
|
||||||
if(future instanceof FutureGet) {
|
if(future instanceof FutureGet) {
|
||||||
((FutureGet) future).complete(ack.getJSONObject("put"));
|
((FutureGet) future).complete(new InMemoryGraph(ack.getJSONObject("put")).toUserJSONObject());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -91,4 +101,8 @@ public class Dispatcher {
|
|||||||
peer.emit(jsonGet.toString());
|
peer.emit(jsonGet.toString());
|
||||||
}).start();
|
}).start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void addChangeListener(String soul, NodeChangeListener listener) {
|
||||||
|
changeListeners.put(soul, listener);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -73,4 +73,8 @@ public class Node implements Comparable<Node> {
|
|||||||
soul = metadata.getJSONObject("_").getString("#");
|
soul = metadata.getJSONObject("_").getString("#");
|
||||||
states = metadata.getJSONObject("_").getJSONObject(">");
|
states = metadata.getJSONObject("_").getJSONObject(">");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public JSONObject toUserJSONObject() {
|
||||||
|
return values;
|
||||||
|
}
|
||||||
}
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
package io.github.chronosx88.JGUN;
|
||||||
|
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
@FunctionalInterface
|
||||||
|
public interface NodeChangeListener {
|
||||||
|
void onChange(JSONObject node);
|
||||||
|
}
|
@ -95,4 +95,8 @@ public class PathRef {
|
|||||||
dispatcher.sendPutRequest(futurePut.getFutureID(), temp);
|
dispatcher.sendPutRequest(futurePut.getFutureID(), temp);
|
||||||
return futurePut;
|
return futurePut;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void on(NodeChangeListener changeListener) {
|
||||||
|
dispatcher.addChangeListener(String.join("/", path), changeListener);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,25 +21,27 @@ public class MainClientServer {
|
|||||||
} catch (UnknownHostException e) {
|
} catch (UnknownHostException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
gun.get("random").on(data -> {
|
||||||
|
if(data != null) {
|
||||||
|
System.out.println("New change in \"random\"! " + data.toString(2));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
gun.get("random").get("dVFtzE9CL").on(data -> {
|
||||||
|
if(data != null) {
|
||||||
|
System.out.println("New change in \"random/dVFtzE9CL\"! " + data.toString(2));
|
||||||
|
} else {
|
||||||
|
System.out.println("Now random/dVFtzE9CL is null!");
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
FuturePut futurePut = gun.get("random").get("dVFtzE9CL").put(new JSONObject().put("hello", "world"));
|
FuturePut futurePut = gun.get("random").get("dVFtzE9CL").put(new JSONObject().put("hello", "world"));
|
||||||
boolean success = futurePut.await();
|
boolean success = futurePut.await();
|
||||||
System.out.println("[FuturePut] Success: " + success);
|
System.out.println("[FuturePut] Success: " + success);
|
||||||
FutureGet futureGet = gun.get("random").get("dVFtzE9CL").getData();
|
|
||||||
JSONObject result = futureGet.await();
|
|
||||||
System.out.println("[FutureGet] Result of get: " + result.toString(2));
|
|
||||||
FuturePut futurePut1 = gun.get("random").get("dVFtzE9CL").put(new JSONObject().put("hello", "123"));
|
FuturePut futurePut1 = gun.get("random").get("dVFtzE9CL").put(new JSONObject().put("hello", "123"));
|
||||||
System.out.println("[FuturePut1] Putting an item again: " + futurePut1.await());
|
System.out.println("[FuturePut1] Putting an item again: " + futurePut1.await());
|
||||||
FutureGet futureGet1 = gun.get("random").get("dVFtzE9CL").getData();
|
|
||||||
JSONObject result1 = futureGet1.await();
|
|
||||||
System.out.println("[FutureGet] Result of get: " + result1.toString(2));
|
|
||||||
System.out.println("Deleting an item random/dVFtzE9CL");
|
System.out.println("Deleting an item random/dVFtzE9CL");
|
||||||
gun.get("random").get("dVFtzE9CL").put(null).await();
|
gun.get("random").get("dVFtzE9CL").put(null).await();
|
||||||
JSONObject resultNull = gun.get("random").get("dVFtzE9CL").getData().await();
|
|
||||||
if(resultNull == null) {
|
|
||||||
System.out.println("Now random/dVFtzE9CL is null!");
|
|
||||||
}
|
|
||||||
gun.get("random").put(new JSONObject().put("hello", "world")).await();
|
gun.get("random").put(new JSONObject().put("hello", "world")).await();
|
||||||
System.out.println(gun.get("random").getData().await().toString(2));
|
|
||||||
}).start();
|
}).start();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -63,6 +63,14 @@ public class InMemoryGraph implements StorageBackend {
|
|||||||
return jsonObject;
|
return jsonObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public JSONObject toUserJSONObject() {
|
||||||
|
JSONObject jsonObject = new JSONObject();
|
||||||
|
for(Map.Entry<String, Node> entry : nodes.entrySet()) {
|
||||||
|
jsonObject.put(entry.getKey(), entry.getValue().toUserJSONObject());
|
||||||
|
}
|
||||||
|
return jsonObject;
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isEmpty() {
|
public boolean isEmpty() {
|
||||||
return nodes.isEmpty();
|
return nodes.isEmpty();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user