package de.ironjan.mensaupb.sync;
import android.annotation.SuppressLint;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.provider.BaseColumns;
import android.support.annotation.NonNull;
import android.text.TextUtils;
import org.androidannotations.annotations.EProvider;
import org.androidannotations.annotations.res.StringRes;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import de.ironjan.mensaupb.BuildConfig;
import de.ironjan.mensaupb.R;
import de.ironjan.mensaupb.persistence.DatabaseHelper;
import de.ironjan.mensaupb.persistence.DatabaseManager;
import de.ironjan.mensaupb.stw.rest_api.StwMenu;
/**
* A content provider for the downloaded menu data.
*/
@SuppressLint("Registered")
@EProvider
public class MenuContentProvider extends ContentProvider {
private static final String MENUS_PATH = "menus";
private static final String SINGLE_MENUS_PATH = MENUS_PATH + "/#";
private static final Uri ROOT = Uri.parse("content://" + ProviderContract.AUTHORITY + "/");
public static final Uri MENU_URI = Uri.withAppendedPath(ROOT, MENUS_PATH);
private static final int MENUS_MATCH = 1;
private static final int SINGLE_MENUS_MATCH = 2;
private static final UriMatcher sUriMatcher = new UriMatcher(0);
static {
sUriMatcher.addURI(ProviderContract.AUTHORITY, MENUS_PATH, MENUS_MATCH);
sUriMatcher.addURI(ProviderContract.AUTHORITY, SINGLE_MENUS_PATH, SINGLE_MENUS_MATCH);
}
private final Logger LOGGER = LoggerFactory.getLogger(MenuContentProvider.class.getSimpleName());
@StringRes(R.string.mensae)
String mensaeString;
private DatabaseHelper getHelper() {
DatabaseManager dbManager = new DatabaseManager();
return dbManager.getHelper(getContext());
}
@Override
public boolean onCreate() {
return true;
}
@Override
public Cursor query(@NonNull Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
// TODO checkProjection(uri, projection);
queryBuilder.setTables(StwMenu.TABLE);
SQLiteDatabase db = getHelper().getReadableDatabase();
if (TextUtils.isEmpty(sortOrder)) {
sortOrder = StwMenu.SORT_ORDER + " ASC";
}
switch (sUriMatcher.match(uri)) {
case MENUS_MATCH:
break;
case SINGLE_MENUS_MATCH:
selection = BaseColumns._ID + " = ?";
selectionArgs = new String[]{uri.getLastPathSegment()};
break;
default:
throw new IllegalArgumentException("Uri unknown.");
}
Cursor cursor = queryBuilder.query(db, projection, selection,
selectionArgs, null, null, sortOrder);
cursor.setNotificationUri(getContext().getContentResolver(), uri);
return cursor;
}
private void checkProjection(Uri uri, String[] projection) {
final String[] allowedColumns = buildAllowedColumns(uri);
checkAllowedColumns(projection, allowedColumns);
}
private void checkAllowedColumns(String[] projection, String[] allowedColumns) {
Set<String> allowedColumnsSet = new HashSet<>(allowedColumns.length);
Collections.addAll(allowedColumnsSet, allowedColumns);
for (String requestedColumn : projection) {
boolean columnIsNotAllowed = !allowedColumnsSet.contains(requestedColumn);
if (columnIsNotAllowed) {
throw new IllegalArgumentException(requestedColumn + " is not an allowedColumnsSet column.");
}
}
}
private String[] buildAllowedColumns(Uri uri) {
final String[] allowedColumns;
switch (sUriMatcher.match(uri)) {
case MENUS_MATCH:
case SINGLE_MENUS_MATCH:
allowedColumns = new String[]{}; // TODO use real allowed columns
break;
default:
throw new IllegalArgumentException("Uri unknown.");
}
return allowedColumns;
}
@Override
public String getType(@NonNull Uri uri) {
return null;
}
@Override
public Uri insert(@NonNull Uri uri, ContentValues contentValues) {
switch (sUriMatcher.match(uri)) {
case MENUS_MATCH:
SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
// TODO check projection
queryBuilder.setTables(StwMenu.TABLE);
SQLiteDatabase db = getHelper().getWritableDatabase();
long _id = db.insert(StwMenu.TABLE, null, contentValues);
return Uri.withAppendedPath(MENU_URI, "/" + _id);
default:
throw new IllegalArgumentException("Unknown Uri");
}
}
@Override
public int delete(@NonNull Uri uri, String where, String[] whereArgs) {
switch (sUriMatcher.match(uri)) {
case MENUS_MATCH:
final SQLiteDatabase db = getHelper().getWritableDatabase();
final int delete = db.delete(StwMenu.TABLE, where, whereArgs);
if (BuildConfig.DEBUG)
LOGGER.info("Deleted {} menus via delete({},{},{})", new Object[]{delete, uri, where, whereArgs});
return delete;
default:
throw new IllegalArgumentException("Unknown Uri");
}
}
@Override
public int update(@NonNull Uri uri, ContentValues contentValues, String s, String[] strings) {
switch (sUriMatcher.match(uri)) {
case MENUS_MATCH:
SQLiteDatabase db = getHelper().getWritableDatabase();
// TODO check projection
return db.update(StwMenu.TABLE, contentValues, s, strings);
default:
throw new IllegalArgumentException("Unknown Uri");
}
}
}