Skip to content

Commit

Permalink
Extracted and tested the database interactions from ModifierSequence
Browse files Browse the repository at this point in the history
  • Loading branch information
psh committed Jan 4, 2018
1 parent ae24508 commit 08673c9
Show file tree
Hide file tree
Showing 9 changed files with 330 additions and 122 deletions.
4 changes: 2 additions & 2 deletions app/src/main/java/fr/free/nrw/commons/CommonsApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
import fr.free.nrw.commons.di.CommonsApplicationComponent;
import fr.free.nrw.commons.di.CommonsApplicationModule;
import fr.free.nrw.commons.di.DaggerCommonsApplicationComponent;
import fr.free.nrw.commons.modifications.ModifierSequence;
import fr.free.nrw.commons.modifications.ModifierSequenceDao;
import fr.free.nrw.commons.utils.FileUtils;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
Expand Down Expand Up @@ -168,7 +168,7 @@ private void updateAllDatabases() {
dbOpenHelper.getReadableDatabase().close();
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();

ModifierSequence.Table.onDelete(db);
ModifierSequenceDao.Table.onDelete(db);
CategoryDao.Table.onDelete(db);
ContributionDao.Table.onDelete(db);
}
Expand Down
9 changes: 5 additions & 4 deletions app/src/main/java/fr/free/nrw/commons/data/DBOpenHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,16 @@
import android.database.sqlite.SQLiteOpenHelper;

import fr.free.nrw.commons.contributions.ContributionDao;
import fr.free.nrw.commons.modifications.ModifierSequence;
import fr.free.nrw.commons.modifications.ModifierSequenceDao;

public class DBOpenHelper extends SQLiteOpenHelper {

private static final String DATABASE_NAME = "commons.db";
private static final int DATABASE_VERSION = 6;

/**
* Do not use, please call CommonsApplication.getDBOpenHelper()
* Do not use directly - @Inject an instance where it's needed and let
* dependency injection take care of managing this as a singleton.
*/
public DBOpenHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
Expand All @@ -22,14 +23,14 @@ public DBOpenHelper(Context context) {
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
ContributionDao.Table.onCreate(sqLiteDatabase);
ModifierSequence.Table.onCreate(sqLiteDatabase);
ModifierSequenceDao.Table.onCreate(sqLiteDatabase);
CategoryDao.Table.onCreate(sqLiteDatabase);
}

@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int from, int to) {
ContributionDao.Table.onUpdate(sqLiteDatabase, from, to);
ModifierSequence.Table.onUpdate(sqLiteDatabase, from, to);
ModifierSequenceDao.Table.onUpdate(sqLiteDatabase, from, to);
CategoryDao.Table.onUpdate(sqLiteDatabase, from, to);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,15 @@
import fr.free.nrw.commons.data.DBOpenHelper;
import timber.log.Timber;

import static fr.free.nrw.commons.modifications.ModifierSequenceDao.Table.TABLE_NAME;

public class ModificationsContentProvider extends ContentProvider {

private static final int MODIFICATIONS = 1;
private static final int MODIFICATIONS_ID = 2;

public static final String AUTHORITY = "fr.free.nrw.commons.modifications.contentprovider";
private static final String BASE_PATH = "modifications";
public static final String BASE_PATH = "modifications";

public static final Uri BASE_URI = Uri.parse("content://" + AUTHORITY + "/" + BASE_PATH);

Expand All @@ -47,7 +49,7 @@ public boolean onCreate() {
@Override
public Cursor query(@NonNull Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
queryBuilder.setTables(ModifierSequence.Table.TABLE_NAME);
queryBuilder.setTables(TABLE_NAME);

int uriType = uriMatcher.match(uri);

Expand Down Expand Up @@ -78,7 +80,7 @@ public Uri insert(@NonNull Uri uri, ContentValues contentValues) {
long id = 0;
switch (uriType) {
case MODIFICATIONS:
id = sqlDB.insert(ModifierSequence.Table.TABLE_NAME, null, contentValues);
id = sqlDB.insert(TABLE_NAME, null, contentValues);
break;
default:
throw new IllegalArgumentException("Unknown URI: " + uri);
Expand All @@ -94,7 +96,7 @@ public int delete(@NonNull Uri uri, String s, String[] strings) {
switch (uriType) {
case MODIFICATIONS_ID:
String id = uri.getLastPathSegment();
sqlDB.delete(ModifierSequence.Table.TABLE_NAME,
sqlDB.delete(TABLE_NAME,
"_id = ?",
new String[] { id }
);
Expand All @@ -114,7 +116,7 @@ public int bulkInsert(@NonNull Uri uri, @NonNull ContentValues[] values) {
case MODIFICATIONS:
for (ContentValues value: values) {
Timber.d("Inserting! %s", value);
sqlDB.insert(ModifierSequence.Table.TABLE_NAME, null, value);
sqlDB.insert(TABLE_NAME, null, value);
}
break;
default:
Expand All @@ -140,7 +142,7 @@ public int update(@NonNull Uri uri, ContentValues contentValues, String selectio
int rowsUpdated = 0;
switch (uriType) {
case MODIFICATIONS:
rowsUpdated = sqlDB.update(ModifierSequence.Table.TABLE_NAME,
rowsUpdated = sqlDB.update(TABLE_NAME,
contentValues,
selection,
selectionArgs);
Expand All @@ -149,9 +151,9 @@ public int update(@NonNull Uri uri, ContentValues contentValues, String selectio
int id = Integer.valueOf(uri.getLastPathSegment());

if (TextUtils.isEmpty(selection)) {
rowsUpdated = sqlDB.update(ModifierSequence.Table.TABLE_NAME,
rowsUpdated = sqlDB.update(TABLE_NAME,
contentValues,
ModifierSequence.Table.COLUMN_ID + " = ?",
ModifierSequenceDao.Table.COLUMN_ID + " = ?",
new String[] { String.valueOf(id) } );
} else {
throw new IllegalArgumentException("Parameter `selection` should be empty when updating an ID");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,8 @@ public void onPerformSync(Account account, Bundle bundle, String s, ContentProvi
contributionsClient = getContext().getContentResolver().acquireContentProviderClient(ContributionsContentProvider.AUTHORITY);

while (!allModifications.isAfterLast()) {
ModifierSequence sequence = ModifierSequence.fromCursor(allModifications);
sequence.setContentProviderClient(contentProviderClient);
ModifierSequence sequence = ModifierSequenceDao.fromCursor(allModifications);
ModifierSequenceDao dao = new ModifierSequenceDao(contributionsClient);
Contribution contrib;

Cursor contributionCursor;
Expand Down Expand Up @@ -122,7 +122,7 @@ public void onPerformSync(Account account, Bundle bundle, String s, ContentProvi
// FIXME: Log this somewhere else
Timber.d("Non success result! %s", editResult);
} else {
sequence.delete();
dao.delete(sequence);
}
}
allModifications.moveToNext();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,8 @@
package fr.free.nrw.commons.modifications;

import android.content.ContentProviderClient;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.os.RemoteException;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
Expand All @@ -17,37 +11,36 @@ public class ModifierSequence {
private Uri mediaUri;
private ArrayList<PageModifier> modifiers;
private Uri contentUri;
private ContentProviderClient client;

public ModifierSequence(Uri mediaUri) {
this.mediaUri = mediaUri;
modifiers = new ArrayList<>();
}

public ModifierSequence(Uri mediaUri, JSONObject data) {
ModifierSequence(Uri mediaUri, JSONObject data) {
this(mediaUri);
JSONArray modifiersJSON = data.optJSONArray("modifiers");
for (int i = 0; i < modifiersJSON.length(); i++) {
modifiers.add(PageModifier.fromJSON(modifiersJSON.optJSONObject(i)));
}
}

public Uri getMediaUri() {
Uri getMediaUri() {
return mediaUri;
}

public void queueModifier(PageModifier modifier) {
modifiers.add(modifier);
}

public String executeModifications(String pageName, String pageContents) {
String executeModifications(String pageName, String pageContents) {
for (PageModifier modifier: modifiers) {
pageContents = modifier.doModification(pageName, pageContents);
}
return pageContents;
}

public String getEditSummary() {
String getEditSummary() {
StringBuilder editSummary = new StringBuilder();
for (PageModifier modifier: modifiers) {
editSummary.append(modifier.getEditSumary()).append(" ");
Expand All @@ -56,97 +49,16 @@ public String getEditSummary() {
return editSummary.toString();
}

public JSONObject toJSON() {
JSONObject data = new JSONObject();
try {
JSONArray modifiersJSON = new JSONArray();
for (PageModifier modifier: modifiers) {
modifiersJSON.put(modifier.toJSON());
}
data.put("modifiers", modifiersJSON);
return data;
} catch (JSONException e) {
throw new RuntimeException(e);
}
}

public ContentValues toContentValues() {
ContentValues cv = new ContentValues();
cv.put(Table.COLUMN_MEDIA_URI, mediaUri.toString());
cv.put(Table.COLUMN_DATA, toJSON().toString());
return cv;
ArrayList<PageModifier> getModifiers() {
return modifiers;
}

public static ModifierSequence fromCursor(Cursor cursor) {
// Hardcoding column positions!
ModifierSequence ms = null;
try {
ms = new ModifierSequence(Uri.parse(cursor.getString(1)),
new JSONObject(cursor.getString(2)));
} catch (JSONException e) {
throw new RuntimeException(e);
}
ms.contentUri = ModificationsContentProvider.uriForId(cursor.getInt(0));

return ms;
}

public void save() {
try {
if (contentUri == null) {
contentUri = client.insert(ModificationsContentProvider.BASE_URI, this.toContentValues());
} else {
client.update(contentUri, toContentValues(), null, null);
}
} catch (RemoteException e) {
throw new RuntimeException(e);
}
}

public void delete() {
try {
client.delete(contentUri, null, null);
} catch (RemoteException e) {
throw new RuntimeException(e);
}
Uri getContentUri() {
return contentUri;
}

public void setContentProviderClient(ContentProviderClient client) {
this.client = client;
void setContentUri(Uri contentUri) {
this.contentUri = contentUri;
}

public static class Table {
public static final String TABLE_NAME = "modifications";

public static final String COLUMN_ID = "_id";
public static final String COLUMN_MEDIA_URI = "mediauri";
public static final String COLUMN_DATA = "data";

// NOTE! KEEP IN SAME ORDER AS THEY ARE DEFINED UP THERE. HELPS HARD CODE COLUMN INDICES.
public static final String[] ALL_FIELDS = {
COLUMN_ID,
COLUMN_MEDIA_URI,
COLUMN_DATA
};

private static final String CREATE_TABLE_STATEMENT = "CREATE TABLE " + TABLE_NAME + " ("
+ "_id INTEGER PRIMARY KEY,"
+ "mediauri STRING,"
+ "data STRING"
+ ");";

public static void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_TABLE_STATEMENT);
}

public static void onUpdate(SQLiteDatabase db, int from, int to) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}

public static void onDelete(SQLiteDatabase db) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
}
}
Loading

0 comments on commit 08673c9

Please sign in to comment.