package com.couchbase.cityexplorer;
import android.content.Context;
import android.util.Log;
import com.couchbase.lite.CouchbaseLiteException;
import com.couchbase.lite.Database;
import com.couchbase.lite.Emitter;
import com.couchbase.lite.LiveQuery;
import com.couchbase.lite.Manager;
import com.couchbase.lite.Mapper;
import com.couchbase.lite.Query;
import com.couchbase.lite.QueryEnumerator;
import com.couchbase.lite.QueryRow;
import com.couchbase.lite.Reducer;
import com.couchbase.lite.View;
import com.couchbase.lite.android.AndroidContext;
import com.couchbase.lite.auth.Authenticator;
import com.couchbase.lite.auth.BasicAuthenticator;
import com.couchbase.lite.replicator.Replication;
import com.google.android.gms.analytics.Logger;
import com.google.android.gms.drive.internal.QueryRequest;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;
public class SyncManager {
private static final String DATABASE_NAME = "cityexplorer";
private static final String SYNC_URL = "http://localhost:4984/db/";
private static final String CITIES_VIEW = "getCities";
private Context context;
private Manager manager;
private Database database;
public SyncManager(Context context) {
this.context = context;
Manager.enableLogging("CityExplorer", Logger.LogLevel.VERBOSE);
Manager.enableLogging("Sync", Logger.LogLevel.VERBOSE);
openDatabase();
}
private void openDatabase() {
try {
manager = new Manager(new AndroidContext(context), Manager.DEFAULT_OPTIONS);
} catch (IOException e) {
e.printStackTrace();
}
try {
database = manager.getDatabase(DATABASE_NAME);
} catch (CouchbaseLiteException e) {
e.printStackTrace();
}
registerViews();
queryCities();
startSync();
}
private void registerViews() {
View citiesView = database.getView(CITIES_VIEW);
citiesView.setMapReduce(new Mapper() {
@Override
public void map(Map<String, Object> document, Emitter emitter) {
if (document.get("type") != null && document.get("type").equals("city")) {
List<Object> key = new ArrayList<Object>();
key.add(document.get("city"));
emitter.emit(key, null);
}
}
}, new Reducer() {
@Override
public Object reduce(List<Object> keys, List<Object> values, boolean rereduce) {
return new Integer(values.size());
}
}, "9");
}
private void queryCities() {
final Query query = database.getView(CITIES_VIEW).createQuery();
query.setGroupLevel(1);
LiveQuery liveQuery = query.toLiveQuery();
liveQuery.addChangeListener(new LiveQuery.ChangeListener() {
@Override
public void changed(LiveQuery.ChangeEvent event) {
try {
QueryEnumerator enumeration = query.run();
for (QueryRow row : enumeration) {
Log.d("CityExplorer", "Row is " + row.getValue() + " and key " + row.getKey());
}
} catch (CouchbaseLiteException e) {
e.printStackTrace();
}
}
});
liveQuery.start();
}
private void startSync() {
URL url = null;
try {
url = new URL(SYNC_URL);
} catch (MalformedURLException e) {
e.printStackTrace();
}
Authenticator authenticator = new BasicAuthenticator("james", "letmein");
Replication push = database.createPushReplication(url);
push.setContinuous(true);
push.setAuthenticator(authenticator);
push.start();
Replication pull = database.createPullReplication(url);
pull.setContinuous(true);
pull.setAuthenticator(authenticator);
pull.start();
}
public Database getDatabase() {
return database;
}
public void setDatabase(Database database) {
this.database = database;
}
}