/**
* Copyright (C) 2013 - 2015 the enviroCar community
*
* This file is part of the enviroCar app.
*
* The enviroCar app is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The enviroCar app is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
* Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with the enviroCar app. If not, see http://www.gnu.org/licenses/.
*/
package org.envirocar.storage;
import android.content.ContentValues;
import android.database.Cursor;
import android.util.Log;
import org.envirocar.core.entity.Car;
import org.envirocar.core.entity.CarImpl;
import org.envirocar.core.entity.Track;
import org.envirocar.core.entity.TrackImpl;
import org.envirocar.core.logging.Logger;
import org.envirocar.core.util.TrackMetadata;
import org.json.JSONException;
import java.util.ArrayList;
import java.util.List;
import rx.Observable;
import rx.Subscriber;
import rx.functions.Func1;
/**
* TODO JavaDoc
*
* @author dewall
*/
class TrackTable {
private static final Logger LOG = Logger.getLogger(TrackTable.class);
public static final String TABLE_TRACK = "tracks";
public static final String KEY_TRACK_ID = "_id";
public static final String KEY_TRACK_NAME = "name";
public static final String KEY_TRACK_DESCRIPTION = "descr";
public static final String KEY_REMOTE_ID = "remoteId";
public static final String KEY_TRACK_STATE = "state";
public static final String KEY_TRACK_CAR_MANUFACTURER = "car_manufacturer";
public static final String KEY_TRACK_CAR_MODEL = "car_model";
public static final String KEY_TRACK_CAR_FUEL_TYPE = "fuel_type";
public static final String KEY_TRACK_CAR_YEAR = "car_construction_year";
public static final String KEY_TRACK_CAR_ENGINE_DISPLACEMENT = "engine_displacement";
public static final String KEY_TRACK_CAR_VIN = "vin";
public static final String KEY_TRACK_CAR_ID = "carId";
public static final String KEY_TRACK_METADATA = "trackMetadata";
public static final String[] ALL_TRACK_KEYS = new String[]{
KEY_TRACK_ID,
KEY_TRACK_NAME,
KEY_TRACK_DESCRIPTION,
KEY_REMOTE_ID,
KEY_TRACK_STATE,
KEY_TRACK_METADATA,
KEY_TRACK_CAR_MANUFACTURER,
KEY_TRACK_CAR_MODEL,
KEY_TRACK_CAR_FUEL_TYPE,
KEY_TRACK_CAR_ENGINE_DISPLACEMENT,
KEY_TRACK_CAR_YEAR,
KEY_TRACK_CAR_VIN,
KEY_TRACK_CAR_ID
};
protected static final String CREATE =
"create table " + TABLE_TRACK + " " +
"(" + KEY_TRACK_ID + " INTEGER primary key, " +
KEY_TRACK_NAME + " BLOB, " +
KEY_TRACK_DESCRIPTION + " BLOB, " +
KEY_REMOTE_ID + " BLOB, " +
KEY_TRACK_STATE + " BLOB, " +
KEY_TRACK_METADATA + " BLOB, " +
KEY_TRACK_CAR_MANUFACTURER + " BLOB, " +
KEY_TRACK_CAR_MODEL + " BLOB, " +
KEY_TRACK_CAR_FUEL_TYPE + " BLOB, " +
KEY_TRACK_CAR_ENGINE_DISPLACEMENT + " BLOB, " +
KEY_TRACK_CAR_YEAR + " BLOB, " +
KEY_TRACK_CAR_VIN + " BLOB, " +
KEY_TRACK_CAR_ID + " BLOB);";
protected static final String DELETE = "DROP TABLE IF EXISTS " + TABLE_TRACK;
protected static final Func1<Cursor, Track> MAPPER = new Func1<Cursor, Track>() {
@Override
public Track call(Cursor cursor) {
return fromCursor(cursor);
}
};
public static final Func1<? super Cursor, ? extends Observable<Track.TrackId>>
TO_TRACK_ID_MAPPER = new Func1<Cursor, Observable<Track.TrackId>>() {
@Override
public Observable<Track.TrackId> call(Cursor cursor) {
return Observable.create(new Observable.OnSubscribe<Track.TrackId>() {
@Override
public void call(Subscriber<? super Track.TrackId> subscriber) {
subscriber.onStart();
cursor.moveToFirst();
for (int i = 1; cursor.moveToNext() && !subscriber.isUnsubscribed(); i++) {
subscriber.onNext(new Track.TrackId(cursor.getLong(
cursor.getColumnIndex(KEY_TRACK_ID))));
}
subscriber.onCompleted();
}
});
}
};
public static final Func1<? super Cursor, ? extends List<Track.TrackId>>
TO_TRACK_ID_LIST_MAPPER = new Func1<Cursor, List<Track.TrackId>>() {
@Override
public List<Track.TrackId> call(Cursor cursor) {
List<Track.TrackId> idList = new ArrayList<>(cursor.getCount());
while(cursor.moveToNext()){
idList.add(new Track.TrackId(cursor.getLong(
cursor.getColumnIndex(KEY_TRACK_ID))));
}
return idList;
}
};
public static ContentValues toContentValues(Track track) {
ContentValues values = new ContentValues();
if (track.getTrackID() != null && track.getTrackID().getId() != 0) {
values.put(KEY_TRACK_ID, track.getTrackID().getId());
}
values.put(KEY_TRACK_NAME, track.getName());
values.put(KEY_TRACK_DESCRIPTION, track.getDescription());
if (track.isRemoteTrack()) {
values.put(KEY_REMOTE_ID, track.getRemoteID());
}
values.put(KEY_TRACK_STATE, track.getTrackStatus().toString());
if (track.getCar() != null) {
values.put(KEY_TRACK_CAR_MANUFACTURER, track.getCar().getManufacturer());
values.put(KEY_TRACK_CAR_MODEL, track.getCar().getModel());
values.put(KEY_TRACK_CAR_FUEL_TYPE, track.getCar().getFuelType().name());
values.put(KEY_TRACK_CAR_ID, track.getCar().getId());
values.put(KEY_TRACK_CAR_ENGINE_DISPLACEMENT, track.getCar()
.getEngineDisplacement());
values.put(KEY_TRACK_CAR_YEAR, track.getCar().getConstructionYear());
}
if (track.getMetadata() != null) {
try {
values.put(KEY_TRACK_METADATA, track.getMetadata().toJsonString());
} catch (JSONException e) {
LOG.warn(e.getMessage(), e);
}
}
return values;
}
public static Track fromCursor(Cursor c) {
Track track = new TrackImpl();
track.setTrackID(new Track.TrackId(c.getLong(c.getColumnIndex(KEY_TRACK_ID))));
track.setRemoteID(c.getString(c.getColumnIndex(KEY_REMOTE_ID)));
track.setName(c.getString(c.getColumnIndex(KEY_TRACK_NAME)));
track.setDescription(c.getString(c.getColumnIndex(KEY_TRACK_DESCRIPTION)));
int statusColumn = c.getColumnIndex(KEY_TRACK_STATE);
if (statusColumn != -1) {
track.setTrackStatus(Track.TrackStatus.valueOf(c.getString(statusColumn)));
} else {
track.setTrackStatus(Track.TrackStatus.FINISHED);
}
String metadata = c.getString(c.getColumnIndex(KEY_TRACK_METADATA));
if (metadata != null) {
try {
track.setMetadata(TrackMetadata.fromJson(c.getString(c.getColumnIndex
(KEY_TRACK_METADATA))));
} catch (JSONException e) {
LOG.warn(e.getMessage(), e);
}
}
track.setCar(createCarFromCursor(c));
return track;
}
private static Car createCarFromCursor(Cursor c) {
Log.e("tag", "" + c.getString(c.getColumnIndex(KEY_TRACK_CAR_MANUFACTURER)) + " "
+ c
.getString(c.getColumnIndex(KEY_TRACK_CAR_ID)));
if (c.getString(c.getColumnIndex(KEY_TRACK_CAR_MANUFACTURER)) == null ||
c.getString(c.getColumnIndex(KEY_TRACK_CAR_MODEL)) == null ||
// c.getString(c.getColumnIndex(KEY_TRACK_CAR_ID)) == null ||
c.getString(c.getColumnIndex(KEY_TRACK_CAR_YEAR)) == null ||
c.getString(c.getColumnIndex(KEY_TRACK_CAR_FUEL_TYPE)) == null ||
c.getString(c.getColumnIndex(KEY_TRACK_CAR_ENGINE_DISPLACEMENT)) == null) {
return null;
}
String manufacturer = c.getString(c.getColumnIndex(KEY_TRACK_CAR_MANUFACTURER));
String model = c.getString(c.getColumnIndex(KEY_TRACK_CAR_MODEL));
String carId = c.getString(c.getColumnIndex(KEY_TRACK_CAR_ID));
Car.FuelType fuelType = Car.FuelType.valueOf(c.getString(c.getColumnIndex
(KEY_TRACK_CAR_FUEL_TYPE)));
int engineDisplacement = c.getInt(c.getColumnIndex(KEY_TRACK_CAR_ENGINE_DISPLACEMENT));
int year = c.getInt(c.getColumnIndex(KEY_TRACK_CAR_YEAR));
return new CarImpl(carId, manufacturer, model, fuelType, year, engineDisplacement);
}
}