16
16
17
17
import static com .google .firebase .database .connection .ConnectionUtils .hardAssert ;
18
18
19
+ import com .google .android .gms .tasks .Task ;
20
+ import com .google .android .gms .tasks .TaskCompletionSource ;
19
21
import com .google .firebase .database .connection .util .RetryHelper ;
20
22
import com .google .firebase .database .logging .LogWrapper ;
21
23
import com .google .firebase .database .util .GAuthToken ;
@@ -37,23 +39,23 @@ private interface ConnectionRequestCallback {
37
39
void onResponse (Map <String , Object > response );
38
40
}
39
41
40
- private static class ListenQuerySpec {
42
+ private static class QuerySpec {
41
43
private final List <String > path ;
42
44
private final Map <String , Object > queryParams ;
43
45
44
- public ListenQuerySpec (List <String > path , Map <String , Object > queryParams ) {
46
+ public QuerySpec (List <String > path , Map <String , Object > queryParams ) {
45
47
this .path = path ;
46
48
this .queryParams = queryParams ;
47
49
}
48
50
49
51
@ Override
50
52
public boolean equals (Object o ) {
51
53
if (this == o ) return true ;
52
- if (!(o instanceof ListenQuerySpec )) {
54
+ if (!(o instanceof QuerySpec )) {
53
55
return false ;
54
56
}
55
57
56
- ListenQuerySpec that = (ListenQuerySpec ) o ;
58
+ QuerySpec that = (QuerySpec ) o ;
57
59
58
60
if (!path .equals (that .path )) {
59
61
return false ;
@@ -76,13 +78,13 @@ public String toString() {
76
78
77
79
private static class OutstandingListen {
78
80
private final RequestResultCallback resultCallback ;
79
- private final ListenQuerySpec query ;
81
+ private final QuerySpec query ;
80
82
private final ListenHashProvider hashFunction ;
81
83
private final Long tag ;
82
84
83
85
private OutstandingListen (
84
86
RequestResultCallback callback ,
85
- ListenQuerySpec query ,
87
+ QuerySpec query ,
86
88
Long tag ,
87
89
ListenHashProvider hashFunction ) {
88
90
this .resultCallback = callback ;
@@ -91,7 +93,7 @@ private OutstandingListen(
91
93
this .tag = tag ;
92
94
}
93
95
94
- public ListenQuerySpec getQuery () {
96
+ public QuerySpec getQuery () {
95
97
return query ;
96
98
}
97
99
@@ -256,7 +258,7 @@ private enum ConnectionState {
256
258
private List <OutstandingDisconnect > onDisconnectRequestQueue ;
257
259
private Map <Long , OutstandingPut > outstandingPuts ;
258
260
259
- private Map <ListenQuerySpec , OutstandingListen > listens ;
261
+ private Map <QuerySpec , OutstandingListen > listens ;
260
262
private String authToken ;
261
263
private boolean forceAuthTokenRefresh ;
262
264
private final ConnectionContext context ;
@@ -281,7 +283,7 @@ public PersistentConnectionImpl(
281
283
this .executorService = context .getExecutorService ();
282
284
this .authTokenProvider = context .getAuthTokenProvider ();
283
285
this .hostInfo = info ;
284
- this .listens = new HashMap <ListenQuerySpec , OutstandingListen >();
286
+ this .listens = new HashMap <QuerySpec , OutstandingListen >();
285
287
this .requestCBHash = new HashMap <Long , ConnectionRequestCallback >();
286
288
this .outstandingPuts = new HashMap <Long , OutstandingPut >();
287
289
this .onDisconnectRequestQueue = new ArrayList <OutstandingDisconnect >();
@@ -328,7 +330,7 @@ public void listen(
328
330
ListenHashProvider currentHashFn ,
329
331
Long tag ,
330
332
RequestResultCallback listener ) {
331
- ListenQuerySpec query = new ListenQuerySpec (path , queryParams );
333
+ QuerySpec query = new QuerySpec (path , queryParams );
332
334
if (logger .logsDebug ()) logger .debug ("Listening on " + query );
333
335
// TODO: Fix this somehow?
334
336
// hardAssert(query.isDefault() || !query.loadsAllData(), "listen() called for non-default but
@@ -344,6 +346,21 @@ public void listen(
344
346
doIdleCheck ();
345
347
}
346
348
349
+ @ Override
350
+ public Task <Object > get (List <String > path , Map <String , Object > queryParams ) {
351
+ QuerySpec query = new QuerySpec (path , queryParams );
352
+ TaskCompletionSource <Object > source = new TaskCompletionSource <>();
353
+ Task <Object > task ;
354
+ if (connected ()) {
355
+ task = sendGet (query , source );
356
+ } else {
357
+ source .setException (new Exception ("Client offline!" ));
358
+ task = source .getTask ();
359
+ }
360
+ doIdleCheck ();
361
+ return task ;
362
+ }
363
+
347
364
@ Override
348
365
public void initialize () {
349
366
this .tryScheduleReconnect ();
@@ -456,7 +473,7 @@ public void onKill(String reason) {
456
473
457
474
@ Override
458
475
public void unlisten (List <String > path , Map <String , Object > queryParams ) {
459
- ListenQuerySpec query = new ListenQuerySpec (path , queryParams );
476
+ QuerySpec query = new QuerySpec (path , queryParams );
460
477
if (logger .logsDebug ()) logger .debug ("unlistening on " + query );
461
478
462
479
// TODO: fix this by understanding query params?
@@ -731,7 +748,7 @@ private void sendUnlisten(OutstandingListen listen) {
731
748
sendAction (REQUEST_ACTION_QUERY_UNLISTEN , request , null );
732
749
}
733
750
734
- private OutstandingListen removeListen (ListenQuerySpec query ) {
751
+ private OutstandingListen removeListen (QuerySpec query ) {
735
752
if (logger .logsDebug ()) logger .debug ("removing query " + query );
736
753
if (!listens .containsKey (query )) {
737
754
if (logger .logsDebug ())
@@ -749,8 +766,8 @@ private OutstandingListen removeListen(ListenQuerySpec query) {
749
766
private Collection <OutstandingListen > removeListens (List <String > path ) {
750
767
if (logger .logsDebug ()) logger .debug ("removing all listens at path " + path );
751
768
List <OutstandingListen > removedListens = new ArrayList <OutstandingListen >();
752
- for (Map .Entry <ListenQuerySpec , OutstandingListen > entry : listens .entrySet ()) {
753
- ListenQuerySpec query = entry .getKey ();
769
+ for (Map .Entry <QuerySpec , OutstandingListen > entry : listens .entrySet ()) {
770
+ QuerySpec query = entry .getKey ();
754
771
OutstandingListen listen = entry .getValue ();
755
772
if (query .path .equals (path )) {
756
773
removedListens .add (listen );
@@ -1049,6 +1066,32 @@ public void onResponse(Map<String, Object> response) {
1049
1066
});
1050
1067
}
1051
1068
1069
+ private Task <Object > sendGet (final QuerySpec query , TaskCompletionSource <Object > source ) {
1070
+ Map <String , Object > request = new HashMap <String , Object >();
1071
+ request .put (REQUEST_PATH , ConnectionUtils .pathToString (query .path ));
1072
+ request .put (REQUEST_QUERIES , query .queryParams );
1073
+ sendAction (
1074
+ REQUEST_ACTION_QUERY ,
1075
+ request ,
1076
+ new ConnectionRequestCallback () {
1077
+ @ Override
1078
+ public void onResponse (Map <String , Object > response ) {
1079
+ String status = (String ) response .get (REQUEST_STATUS );
1080
+ if (status .equals ("ok" )) {
1081
+ String pathString = (String ) response .get (SERVER_DATA_UPDATE_PATH );
1082
+ List <String > path = ConnectionUtils .stringToPath (pathString );
1083
+ Object body = response .get (SERVER_DATA_UPDATE_BODY );
1084
+ Long tagNumber = ConnectionUtils .longFromObject (response .get (SERVER_DATA_TAG ));
1085
+ delegate .onDataUpdate (path , body , /*isMerge=*/ false , /*tagNumber=*/ tagNumber );
1086
+ source .setResult (body );
1087
+ } else {
1088
+ source .setException (new Exception ((String ) response .get (SERVER_DATA_UPDATE_BODY )));
1089
+ }
1090
+ }
1091
+ });
1092
+ return source .getTask ();
1093
+ }
1094
+
1052
1095
private void sendListen (final OutstandingListen listen ) {
1053
1096
Map <String , Object > request = new HashMap <String , Object >();
1054
1097
request .put (REQUEST_PATH , ConnectionUtils .pathToString (listen .getQuery ().path ));
@@ -1136,7 +1179,7 @@ public void onResponse(Map<String, Object> response) {
1136
1179
}
1137
1180
1138
1181
@ SuppressWarnings ("unchecked" )
1139
- private void warnOnListenerWarnings (List <String > warnings , ListenQuerySpec query ) {
1182
+ private void warnOnListenerWarnings (List <String > warnings , QuerySpec query ) {
1140
1183
if (warnings .contains ("no_index" )) {
1141
1184
String indexSpec = "\" .indexOn\" : \" " + query .queryParams .get ("i" ) + '\"' ;
1142
1185
logger .warn (
0 commit comments