Skip to content

Commit 08673c9

Browse files
committed
Extracted and tested the database interactions from ModifierSequence
1 parent ae24508 commit 08673c9

File tree

9 files changed

+330
-122
lines changed

9 files changed

+330
-122
lines changed

app/src/main/java/fr/free/nrw/commons/CommonsApplication.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
import fr.free.nrw.commons.di.CommonsApplicationComponent;
2828
import fr.free.nrw.commons.di.CommonsApplicationModule;
2929
import fr.free.nrw.commons.di.DaggerCommonsApplicationComponent;
30-
import fr.free.nrw.commons.modifications.ModifierSequence;
30+
import fr.free.nrw.commons.modifications.ModifierSequenceDao;
3131
import fr.free.nrw.commons.utils.FileUtils;
3232
import io.reactivex.android.schedulers.AndroidSchedulers;
3333
import io.reactivex.schedulers.Schedulers;
@@ -168,7 +168,7 @@ private void updateAllDatabases() {
168168
dbOpenHelper.getReadableDatabase().close();
169169
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
170170

171-
ModifierSequence.Table.onDelete(db);
171+
ModifierSequenceDao.Table.onDelete(db);
172172
CategoryDao.Table.onDelete(db);
173173
ContributionDao.Table.onDelete(db);
174174
}

app/src/main/java/fr/free/nrw/commons/data/DBOpenHelper.java

+5-4
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,16 @@
55
import android.database.sqlite.SQLiteOpenHelper;
66

77
import fr.free.nrw.commons.contributions.ContributionDao;
8-
import fr.free.nrw.commons.modifications.ModifierSequence;
8+
import fr.free.nrw.commons.modifications.ModifierSequenceDao;
99

1010
public class DBOpenHelper extends SQLiteOpenHelper {
1111

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

1515
/**
16-
* Do not use, please call CommonsApplication.getDBOpenHelper()
16+
* Do not use directly - @Inject an instance where it's needed and let
17+
* dependency injection take care of managing this as a singleton.
1718
*/
1819
public DBOpenHelper(Context context) {
1920
super(context, DATABASE_NAME, null, DATABASE_VERSION);
@@ -22,14 +23,14 @@ public DBOpenHelper(Context context) {
2223
@Override
2324
public void onCreate(SQLiteDatabase sqLiteDatabase) {
2425
ContributionDao.Table.onCreate(sqLiteDatabase);
25-
ModifierSequence.Table.onCreate(sqLiteDatabase);
26+
ModifierSequenceDao.Table.onCreate(sqLiteDatabase);
2627
CategoryDao.Table.onCreate(sqLiteDatabase);
2728
}
2829

2930
@Override
3031
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int from, int to) {
3132
ContributionDao.Table.onUpdate(sqLiteDatabase, from, to);
32-
ModifierSequence.Table.onUpdate(sqLiteDatabase, from, to);
33+
ModifierSequenceDao.Table.onUpdate(sqLiteDatabase, from, to);
3334
CategoryDao.Table.onUpdate(sqLiteDatabase, from, to);
3435
}
3536
}

app/src/main/java/fr/free/nrw/commons/modifications/ModificationsContentProvider.java

+10-8
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@
1616
import fr.free.nrw.commons.data.DBOpenHelper;
1717
import timber.log.Timber;
1818

19+
import static fr.free.nrw.commons.modifications.ModifierSequenceDao.Table.TABLE_NAME;
20+
1921
public class ModificationsContentProvider extends ContentProvider {
2022

2123
private static final int MODIFICATIONS = 1;
2224
private static final int MODIFICATIONS_ID = 2;
2325

2426
public static final String AUTHORITY = "fr.free.nrw.commons.modifications.contentprovider";
25-
private static final String BASE_PATH = "modifications";
27+
public static final String BASE_PATH = "modifications";
2628

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

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

5254
int uriType = uriMatcher.match(uri);
5355

@@ -78,7 +80,7 @@ public Uri insert(@NonNull Uri uri, ContentValues contentValues) {
7880
long id = 0;
7981
switch (uriType) {
8082
case MODIFICATIONS:
81-
id = sqlDB.insert(ModifierSequence.Table.TABLE_NAME, null, contentValues);
83+
id = sqlDB.insert(TABLE_NAME, null, contentValues);
8284
break;
8385
default:
8486
throw new IllegalArgumentException("Unknown URI: " + uri);
@@ -94,7 +96,7 @@ public int delete(@NonNull Uri uri, String s, String[] strings) {
9496
switch (uriType) {
9597
case MODIFICATIONS_ID:
9698
String id = uri.getLastPathSegment();
97-
sqlDB.delete(ModifierSequence.Table.TABLE_NAME,
99+
sqlDB.delete(TABLE_NAME,
98100
"_id = ?",
99101
new String[] { id }
100102
);
@@ -114,7 +116,7 @@ public int bulkInsert(@NonNull Uri uri, @NonNull ContentValues[] values) {
114116
case MODIFICATIONS:
115117
for (ContentValues value: values) {
116118
Timber.d("Inserting! %s", value);
117-
sqlDB.insert(ModifierSequence.Table.TABLE_NAME, null, value);
119+
sqlDB.insert(TABLE_NAME, null, value);
118120
}
119121
break;
120122
default:
@@ -140,7 +142,7 @@ public int update(@NonNull Uri uri, ContentValues contentValues, String selectio
140142
int rowsUpdated = 0;
141143
switch (uriType) {
142144
case MODIFICATIONS:
143-
rowsUpdated = sqlDB.update(ModifierSequence.Table.TABLE_NAME,
145+
rowsUpdated = sqlDB.update(TABLE_NAME,
144146
contentValues,
145147
selection,
146148
selectionArgs);
@@ -149,9 +151,9 @@ public int update(@NonNull Uri uri, ContentValues contentValues, String selectio
149151
int id = Integer.valueOf(uri.getLastPathSegment());
150152

151153
if (TextUtils.isEmpty(selection)) {
152-
rowsUpdated = sqlDB.update(ModifierSequence.Table.TABLE_NAME,
154+
rowsUpdated = sqlDB.update(TABLE_NAME,
153155
contentValues,
154-
ModifierSequence.Table.COLUMN_ID + " = ?",
156+
ModifierSequenceDao.Table.COLUMN_ID + " = ?",
155157
new String[] { String.valueOf(id) } );
156158
} else {
157159
throw new IllegalArgumentException("Parameter `selection` should be empty when updating an ID");

app/src/main/java/fr/free/nrw/commons/modifications/ModificationsSyncAdapter.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,8 @@ public void onPerformSync(Account account, Bundle bundle, String s, ContentProvi
8383
contributionsClient = getContext().getContentResolver().acquireContentProviderClient(ContributionsContentProvider.AUTHORITY);
8484

8585
while (!allModifications.isAfterLast()) {
86-
ModifierSequence sequence = ModifierSequence.fromCursor(allModifications);
87-
sequence.setContentProviderClient(contentProviderClient);
86+
ModifierSequence sequence = ModifierSequenceDao.fromCursor(allModifications);
87+
ModifierSequenceDao dao = new ModifierSequenceDao(contributionsClient);
8888
Contribution contrib;
8989

9090
Cursor contributionCursor;
@@ -122,7 +122,7 @@ public void onPerformSync(Account account, Bundle bundle, String s, ContentProvi
122122
// FIXME: Log this somewhere else
123123
Timber.d("Non success result! %s", editResult);
124124
} else {
125-
sequence.delete();
125+
dao.delete(sequence);
126126
}
127127
}
128128
allModifications.moveToNext();
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,8 @@
11
package fr.free.nrw.commons.modifications;
22

3-
import android.content.ContentProviderClient;
4-
import android.content.ContentValues;
5-
import android.database.Cursor;
6-
import android.database.sqlite.SQLiteDatabase;
73
import android.net.Uri;
8-
import android.os.RemoteException;
94

105
import org.json.JSONArray;
11-
import org.json.JSONException;
126
import org.json.JSONObject;
137

148
import java.util.ArrayList;
@@ -17,37 +11,36 @@ public class ModifierSequence {
1711
private Uri mediaUri;
1812
private ArrayList<PageModifier> modifiers;
1913
private Uri contentUri;
20-
private ContentProviderClient client;
2114

2215
public ModifierSequence(Uri mediaUri) {
2316
this.mediaUri = mediaUri;
2417
modifiers = new ArrayList<>();
2518
}
2619

27-
public ModifierSequence(Uri mediaUri, JSONObject data) {
20+
ModifierSequence(Uri mediaUri, JSONObject data) {
2821
this(mediaUri);
2922
JSONArray modifiersJSON = data.optJSONArray("modifiers");
3023
for (int i = 0; i < modifiersJSON.length(); i++) {
3124
modifiers.add(PageModifier.fromJSON(modifiersJSON.optJSONObject(i)));
3225
}
3326
}
3427

35-
public Uri getMediaUri() {
28+
Uri getMediaUri() {
3629
return mediaUri;
3730
}
3831

3932
public void queueModifier(PageModifier modifier) {
4033
modifiers.add(modifier);
4134
}
4235

43-
public String executeModifications(String pageName, String pageContents) {
36+
String executeModifications(String pageName, String pageContents) {
4437
for (PageModifier modifier: modifiers) {
4538
pageContents = modifier.doModification(pageName, pageContents);
4639
}
4740
return pageContents;
4841
}
4942

50-
public String getEditSummary() {
43+
String getEditSummary() {
5144
StringBuilder editSummary = new StringBuilder();
5245
for (PageModifier modifier: modifiers) {
5346
editSummary.append(modifier.getEditSumary()).append(" ");
@@ -56,97 +49,16 @@ public String getEditSummary() {
5649
return editSummary.toString();
5750
}
5851

59-
public JSONObject toJSON() {
60-
JSONObject data = new JSONObject();
61-
try {
62-
JSONArray modifiersJSON = new JSONArray();
63-
for (PageModifier modifier: modifiers) {
64-
modifiersJSON.put(modifier.toJSON());
65-
}
66-
data.put("modifiers", modifiersJSON);
67-
return data;
68-
} catch (JSONException e) {
69-
throw new RuntimeException(e);
70-
}
71-
}
72-
73-
public ContentValues toContentValues() {
74-
ContentValues cv = new ContentValues();
75-
cv.put(Table.COLUMN_MEDIA_URI, mediaUri.toString());
76-
cv.put(Table.COLUMN_DATA, toJSON().toString());
77-
return cv;
52+
ArrayList<PageModifier> getModifiers() {
53+
return modifiers;
7854
}
7955

80-
public static ModifierSequence fromCursor(Cursor cursor) {
81-
// Hardcoding column positions!
82-
ModifierSequence ms = null;
83-
try {
84-
ms = new ModifierSequence(Uri.parse(cursor.getString(1)),
85-
new JSONObject(cursor.getString(2)));
86-
} catch (JSONException e) {
87-
throw new RuntimeException(e);
88-
}
89-
ms.contentUri = ModificationsContentProvider.uriForId(cursor.getInt(0));
90-
91-
return ms;
92-
}
93-
94-
public void save() {
95-
try {
96-
if (contentUri == null) {
97-
contentUri = client.insert(ModificationsContentProvider.BASE_URI, this.toContentValues());
98-
} else {
99-
client.update(contentUri, toContentValues(), null, null);
100-
}
101-
} catch (RemoteException e) {
102-
throw new RuntimeException(e);
103-
}
104-
}
105-
106-
public void delete() {
107-
try {
108-
client.delete(contentUri, null, null);
109-
} catch (RemoteException e) {
110-
throw new RuntimeException(e);
111-
}
56+
Uri getContentUri() {
57+
return contentUri;
11258
}
11359

114-
public void setContentProviderClient(ContentProviderClient client) {
115-
this.client = client;
60+
void setContentUri(Uri contentUri) {
61+
this.contentUri = contentUri;
11662
}
11763

118-
public static class Table {
119-
public static final String TABLE_NAME = "modifications";
120-
121-
public static final String COLUMN_ID = "_id";
122-
public static final String COLUMN_MEDIA_URI = "mediauri";
123-
public static final String COLUMN_DATA = "data";
124-
125-
// NOTE! KEEP IN SAME ORDER AS THEY ARE DEFINED UP THERE. HELPS HARD CODE COLUMN INDICES.
126-
public static final String[] ALL_FIELDS = {
127-
COLUMN_ID,
128-
COLUMN_MEDIA_URI,
129-
COLUMN_DATA
130-
};
131-
132-
private static final String CREATE_TABLE_STATEMENT = "CREATE TABLE " + TABLE_NAME + " ("
133-
+ "_id INTEGER PRIMARY KEY,"
134-
+ "mediauri STRING,"
135-
+ "data STRING"
136-
+ ");";
137-
138-
public static void onCreate(SQLiteDatabase db) {
139-
db.execSQL(CREATE_TABLE_STATEMENT);
140-
}
141-
142-
public static void onUpdate(SQLiteDatabase db, int from, int to) {
143-
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
144-
onCreate(db);
145-
}
146-
147-
public static void onDelete(SQLiteDatabase db) {
148-
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
149-
onCreate(db);
150-
}
151-
}
15264
}

0 commit comments

Comments
 (0)