private void reportChanges(JSONObject changeObj) throws Exception {
String docId = changeObj.getString("id");
boolean deleted = changeObj.optBoolean("deleted", false);
JSONArray changes = changeObj.getJSONArray("changes");
JSONObject change = changes.getJSONObject(0);
String rev = change.getString("rev");
CouchDbChangeListener.Type type = CouchDbChangeListener.Type.DOC_UPDATED;
if( deleted ) {
type = CouchDbChangeListener.Type.DOC_DELETED;
} else if( rev.startsWith("1-") ) {
type = CouchDbChangeListener.Type.DOC_CREATED;
}
List<CouchDbChangeListener> copyListeners = new Vector<CouchDbChangeListener>();
synchronized (this) {
copyListeners.addAll(listeners);
}
for(CouchDbChangeListener listener : copyListeners){
try {
listener.change(type, docId, rev, changeObj, null);
} catch(Exception e) {
logger.error("Error while reporting database change",e);
}
}
}