in firebase-database/src/main/java/com/google/firebase/database/connection/PersistentConnectionImpl.java [949:1002]
private void onDataPush(String action, Map<String, Object> body) {
if (logger.logsDebug()) logger.debug("handleServerMessage: " + action + " " + body);
if (action.equals(SERVER_ASYNC_DATA_UPDATE) || action.equals(SERVER_ASYNC_DATA_MERGE)) {
boolean isMerge = action.equals(SERVER_ASYNC_DATA_MERGE);
String pathString = (String) body.get(SERVER_DATA_UPDATE_PATH);
Object payloadData = body.get(SERVER_DATA_UPDATE_BODY);
Long tagNumber = ConnectionUtils.longFromObject(body.get(SERVER_DATA_TAG));
// ignore empty merges
if (isMerge && (payloadData instanceof Map) && ((Map) payloadData).size() == 0) {
if (logger.logsDebug()) logger.debug("ignoring empty merge for path " + pathString);
} else {
List<String> path = ConnectionUtils.stringToPath(pathString);
delegate.onDataUpdate(path, payloadData, isMerge, tagNumber);
}
} else if (action.equals(SERVER_ASYNC_DATA_RANGE_MERGE)) {
String pathString = (String) body.get(SERVER_DATA_UPDATE_PATH);
List<String> path = ConnectionUtils.stringToPath(pathString);
Object payloadData = body.get(SERVER_DATA_UPDATE_BODY);
Long tag = ConnectionUtils.longFromObject(body.get(SERVER_DATA_TAG));
@SuppressWarnings("unchecked")
List<Map<String, Object>> ranges = (List<Map<String, Object>>) payloadData;
List<RangeMerge> rangeMerges = new ArrayList<RangeMerge>();
for (Map<String, Object> range : ranges) {
String startString = (String) range.get(SERVER_DATA_START_PATH);
String endString = (String) range.get(SERVER_DATA_END_PATH);
List<String> start = startString != null ? ConnectionUtils.stringToPath(startString) : null;
List<String> end = endString != null ? ConnectionUtils.stringToPath(endString) : null;
Object update = range.get(SERVER_DATA_RANGE_MERGE);
rangeMerges.add(new RangeMerge(start, end, update));
}
if (rangeMerges.isEmpty()) {
if (logger.logsDebug()) logger.debug("Ignoring empty range merge for path " + pathString);
} else {
this.delegate.onRangeMergeUpdate(path, rangeMerges, tag);
}
} else if (action.equals(SERVER_ASYNC_LISTEN_CANCELLED)) {
String pathString = (String) body.get(SERVER_DATA_UPDATE_PATH);
List<String> path = ConnectionUtils.stringToPath(pathString);
onListenRevoked(path);
} else if (action.equals(SERVER_ASYNC_AUTH_REVOKED)) {
String status = (String) body.get(REQUEST_STATUS);
String reason = (String) body.get(SERVER_DATA_UPDATE_BODY);
onAuthRevoked(status, reason);
} else if (action.equals(SERVER_ASYNC_APP_CHECK_REVOKED)) {
String status = (String) body.get(REQUEST_STATUS);
String reason = (String) body.get(SERVER_DATA_UPDATE_BODY);
onAppCheckRevoked(status, reason);
} else if (action.equals(SERVER_ASYNC_SECURITY_DEBUG)) {
onSecurityDebugPacket(body);
} else {
if (logger.logsDebug()) logger.debug("Unrecognized action from server: " + action);
}
}