added persistence layer

This commit is contained in:
yb 2021-05-26 10:34:58 +02:00
parent 58e17fd4ea
commit d6e14a4eb2
68 changed files with 911 additions and 943 deletions

View File

@ -48,7 +48,7 @@ android {
if (it.name == 'testDebugUnitTest') {
systemProperty 'debug', 'true'
}
}
}
}
@ -126,6 +126,7 @@ dependencies {
implementation project(":services:core")
implementation project(":services:localstorage")
}

View File

@ -0,0 +1,369 @@
{
"formatVersion": 1,
"database": {
"version": 1,
"identityHash": "d28b1e0e329b50864a35edd04cfde3dc",
"entities": [
{
"tableName": "EventEntity",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `created_at` TEXT, `name` TEXT, `description` TEXT, `ecu` TEXT, `vehicle` TEXT, `vehicleId` INTEGER, FOREIGN KEY(`vehicleId`) REFERENCES `VehicleEntity`(`vehicleId`) ON UPDATE NO ACTION ON DELETE SET NULL )",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "createdAt",
"columnName": "created_at",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "description",
"columnName": "description",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "ecu",
"columnName": "ecu",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "vehicle",
"columnName": "vehicle",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "vehicleId",
"columnName": "vehicleId",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [],
"foreignKeys": [
{
"table": "VehicleEntity",
"onDelete": "SET NULL",
"onUpdate": "NO ACTION",
"columns": [
"vehicleId"
],
"referencedColumns": [
"vehicleId"
]
}
]
},
{
"tableName": "VehicleEntity",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`vehicleId` INTEGER PRIMARY KEY AUTOINCREMENT, `vin` TEXT, `model` TEXT, `brand` TEXT, `addedAt` TEXT)",
"fields": [
{
"fieldPath": "vehicleId",
"columnName": "vehicleId",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "vin",
"columnName": "vin",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "model",
"columnName": "model",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "brand",
"columnName": "brand",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "addedAt",
"columnName": "addedAt",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"vehicleId"
],
"autoGenerate": true
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "VehicleInfoEntity",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`infoVehicleId` INTEGER NOT NULL, `key` TEXT, `value` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`infoVehicleId`) REFERENCES `VehicleEntity`(`vehicleId`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "infoVehicleId",
"columnName": "infoVehicleId",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "key",
"columnName": "key",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "value",
"columnName": "value",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [],
"foreignKeys": [
{
"table": "VehicleEntity",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"infoVehicleId"
],
"referencedColumns": [
"vehicleId"
]
}
]
},
{
"tableName": "VehicleSystemEntity",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`vehicleId` INTEGER NOT NULL, `systemId` TEXT, `systemName` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`vehicleId`) REFERENCES `VehicleEntity`(`vehicleId`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "vehicleId",
"columnName": "vehicleId",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "systemId",
"columnName": "systemId",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "systemName",
"columnName": "systemName",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [],
"foreignKeys": [
{
"table": "VehicleEntity",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"vehicleId"
],
"referencedColumns": [
"vehicleId"
]
}
]
},
{
"tableName": "LeaseEntity",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`leaseId` INTEGER PRIMARY KEY AUTOINCREMENT, `created_at` TEXT, `delivered_at` TEXT, `appointmentStart` TEXT, `appointmentEnd` TEXT, `vehicle` TEXT, `token` TEXT)",
"fields": [
{
"fieldPath": "leaseId",
"columnName": "leaseId",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "createdAt",
"columnName": "created_at",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "deliveredAt",
"columnName": "delivered_at",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "appointmentStart",
"columnName": "appointmentStart",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "appointmentEnd",
"columnName": "appointmentEnd",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "vehicle",
"columnName": "vehicle",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "token",
"columnName": "token",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"leaseId"
],
"autoGenerate": true
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "LeaseSystemEntity",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`leaseId` INTEGER NOT NULL, `systemId` TEXT, `systemName` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`leaseId`) REFERENCES `LeaseEntity`(`leaseId`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "leaseId",
"columnName": "leaseId",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "systemId",
"columnName": "systemId",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "systemName",
"columnName": "systemName",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [],
"foreignKeys": [
{
"table": "LeaseEntity",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"leaseId"
],
"referencedColumns": [
"leaseId"
]
}
]
},
{
"tableName": "LeaseInfoEntity",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`leaseId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`leaseId`) REFERENCES `LeaseEntity`(`leaseId`) ON UPDATE NO ACTION ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "leaseId",
"columnName": "leaseId",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [],
"foreignKeys": [
{
"table": "LeaseEntity",
"onDelete": "CASCADE",
"onUpdate": "NO ACTION",
"columns": [
"leaseId"
],
"referencedColumns": [
"leaseId"
]
}
]
}
],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"d28b1e0e329b50864a35edd04cfde3dc\")"
]
}
}

View File

@ -1,91 +0,0 @@
package eu.csc.vehown.services.persistence;
import android.content.Context;
import androidx.room.Room;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import eu.csc.vehown.services.persistence.dao.LeaseEntityDao;
import eu.csc.vehown.services.persistence.dao.VehicleDao;
import eu.csc.vehown.services.persistence.dao.VehicleInfoDao;
import eu.csc.vehown.services.persistence.entity.lease.LeaseEntity;
import eu.csc.vehown.services.persistence.entity.vehicle.VehicleEntity;
import eu.csc.vehown.services.persistence.entity.vehicle.VehicleWithEvents;
import eu.csc.vehown.services.persistence.entity.vehicle.VehicleWithInfos;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.io.IOException;
import java.util.logging.Logger;
import static org.hamcrest.core.IsEqual.equalTo;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
@RunWith(AndroidJUnit4.class)
public class SimpleEntityReadWriteTest {
private LeaseEntityDao leaseDao;
private VehicleDao vehicleDao;
private VehicleOwnerDatabase db;
private static Logger logger = Logger.getLogger(SimpleEntityReadWriteTest.class.getSimpleName());
private VehicleInfoDao vehicleInfoDao;
@Before
public void createDb() {
Context context = ApplicationProvider.getApplicationContext();
db = Room.inMemoryDatabaseBuilder(context, VehicleOwnerDatabase.class).build();
leaseDao = db.leaseDao();
vehicleDao = db.vehicleDao();
vehicleInfoDao = db.vehicleInfoDao();
}
@After
public void closeDb() throws IOException {
db.close();
}
@Test
public void writeUserAndReadInList() throws Exception {logger.info("START");
System.out.println("ASD");
LeaseEntity lease = TestUtil.createExampleLease();
LeaseEntity lease2 = TestUtil.createExampleLease();
leaseDao.insert(lease);
leaseDao.insert(lease2);
System.out.println(lease.getLeaseId());
//List<User> byName = userDao.findUsersByName("george");
assertThat(leaseDao.selectAll().size(), equalTo(2));
}
@Test
public void testVehicleEvents(){
vehicleDao.insert(TestUtil.getExampleVehicle());
VehicleEntity vehicleEntity = vehicleDao.loadVehicleEntityByVin(TestUtil.getExampleVehicle().getVin());
assertNotNull(vehicleEntity);
vehicleInfoDao.insert(TestUtil.getVehicleInfoEntities(vehicleEntity));
VehicleWithInfos infos = vehicleDao.getVehicleInfos(vehicleEntity.getVehicleId());
assertEquals(infos.infos.size(), TestUtil.getVehicleInfoEntities(vehicleEntity).size());
assertEquals(2, vehicleInfoDao.getAll().size());
vehicleDao.deleteVehicle(vehicleEntity);
assertEquals(0, vehicleInfoDao.getAll().size());
VehicleWithEvents vehicleWithEvents = vehicleDao.getVehicleEvents(1L);
}
}

View File

@ -14,7 +14,7 @@ public class LoginDataSource {
LoggedInUser fakeUser =
new LoggedInUser(
java.util.UUID.randomUUID().toString(),
"Jane Doe");
"John Doe");
return new Result.Success<>(fakeUser);
} catch (Exception e) {
return new Result.Error(new IOException("Error logging in", e));

View File

@ -10,7 +10,7 @@ import java.util.List;
@Getter
@Setter
@NoArgsConstructor
public class CustomerVehicle implements Serializable, ICustomerVehicle {
public class CustomerVehicle extends LocalStorageIdentifier<Long> implements Serializable, ICustomerVehicle {
private String vin;
private String licenseplate;

View File

@ -10,19 +10,18 @@ import java.text.DateFormat;
@Getter
@Setter
@NoArgsConstructor
public class Event implements Serializable {
public class Event implements IEvent, Serializable {
public enum EventStatus { UNDEFINED, PERMANENT, PENDING, CONFIRMED }
public enum EventSeverity { LOW, MEDIUM, HIGH }
private String id;
private String name;
private String description;
private String ecu;
private String vehicle;
private long timestamp;
private EventStatus status;
private EventSeverity severity;
private String id;
private String name;
private String description;
private String ecuId;
private String vehicle;
private Long timestamp;
private EventStatus status;
private EventSeverity severity;
public Event(String name) {
this.name = name;
@ -35,11 +34,11 @@ public class Event implements Serializable {
this.timestamp = timestamp;
}
public Event(String id, String name, String description, String ecu, String vehicle, long timestamp, EventStatus status, EventSeverity severity) {
public Event(String id, String name, String description, String ecuId, String vehicle, long timestamp, EventStatus status, EventSeverity severity) {
this.id = id;
this.name = name;
this.description = description;
this.ecu = ecu;
this.ecuId = ecuId;
this.vehicle = vehicle;
this.timestamp = timestamp;
this.status = status;
@ -56,7 +55,7 @@ public class Event implements Serializable {
"id='" + id + '\'' +
", name='" + name + '\'' +
", description='" + description + '\'' +
", ecu='" + ecu + '\'' +
", ecu='" + ecuId + '\'' +
", vehicle='" + vehicle + '\'' +
", timestamp=" + timestamp +
", status=" + status +

View File

@ -10,6 +10,7 @@ import java.io.Serializable;
@Setter
@NoArgsConstructor
public class RepairShop implements Serializable, IRepairShop {
private String name;
private String address;
private String homepage;

View File

@ -5,8 +5,7 @@ import android.util.Log;
import eu.csc.vehown.data.model.IRepairShop;
import eu.csc.vehown.data.model.RepairShop;
import eu.csc.vehown.services.persistence.ExampleDataClient;
import eu.csc.vehown.services.persistence.PersistenceFactory;
import eu.csc.vehown.services.persistence.entity.lease.LeaseEntity;
import eu.csc.vehown.services.rest.data.GrantedLeaseResponse;
import lombok.var;
@ -54,7 +53,7 @@ public class ServiceManager {
public void storeLeaseResponse(GrantedLeaseResponse leaseResponse){
Log.d(TAG, "START SAVING LEASE");
/*
LeaseEntity leaseEntity = new LeaseEntity();
leaseEntity.setVehicle(leaseResponse.getVehicle());
leaseEntity.setAppointmentStart(leaseResponse.getValidFrom());
@ -65,6 +64,9 @@ public class ServiceManager {
var db = PersistenceFactory.generateDatabase(this.context);
db.leaseDao().insert(leaseEntity);
*/
}

View File

@ -2,6 +2,7 @@ package eu.csc.vehown.services.persistence;
import asn.GTLease.Lease;
import eu.csc.vehown.data.model.*;
import eu.csc.vehown.persist.localstorage.ExampleVehicle;
import java.text.SimpleDateFormat;
import java.util.*;
@ -18,6 +19,7 @@ public class ExampleDataClient implements IPersistenceClient {
public static final VehicleSystem System_OBDII = new VehicleSystem("obd-ii", "OBD II");
public static final VehicleSystem System_ABS = new VehicleSystem("abs", "ABS");
public static final VehicleSystem System_WiFi = new VehicleSystem("wifi", "WiFi");
public static final LoggedInUser exampleLoggedInUser = new LoggedInUser();
public static final Event exampleEvent1 = new Event("1", "P0100", "Mass or Volume Air Flow 'A' Circuit", "OBDII1", "Dodge Charger '265G21'", 1620649836986L, Event.EventStatus.CONFIRMED, Event.EventSeverity.HIGH);
@ -32,11 +34,14 @@ public class ExampleDataClient implements IPersistenceClient {
private static final SimpleDateFormat dateFormat;
static {
dateFormat = new SimpleDateFormat("yyyy/dd/MM HH:mm", Locale.ENGLISH);
dateFormat.setTimeZone(TimeZone.getDefault());
customerVehicle.systems = new ArrayList<>();
customerVehicle.systems.add(System_GNSS);
customerVehicle.systems.add(System_IMU);
customerVehicle.systems.add(System_OBDII);
@ -54,6 +59,7 @@ public class ExampleDataClient implements IPersistenceClient {
exampleEvents2 = new Event[] {exampleEvent1, exampleEvent2, e3, e4, e5, e6, e7, e8, e9 };
}
public static SimpleDateFormat getDateFormat() {
return dateFormat;
}

View File

@ -9,4 +9,8 @@ public interface IPersistenceClient {
TreatmentPlan getTreatmentPlan();
}

View File

@ -1,47 +0,0 @@
package eu.csc.vehown.services.persistence;
import android.content.Context;
import android.util.Log;
import androidx.room.Room;
import static eu.csc.vehown.services.persistence.VehicleOwnerDatabase.dbName;
public class PersistenceFactory {
private static final String TAG = PersistenceFactory.class.getSimpleName();
public static IPersistenceClient getInstance(Context activity) {
return new ExampleDataClient();
}
public static VehicleOwnerDatabase generateDatabase(Context context){
VehicleOwnerDatabase db = Room.databaseBuilder(context,
VehicleOwnerDatabase.class, dbName).build();
return db;
}
public static void LoadExampleData(Context context){
Log.d(TAG, "START LOADING EXAMPLE DATA");
try{
VehicleOwnerDatabase database = generateDatabase(context);
database.vehicleDao().deleteAll();
}
catch (Exception ex){
Log.d(TAG, ex.toString());
}
}
}

View File

@ -1,63 +0,0 @@
package eu.csc.vehown.services.persistence;
import eu.csc.vehown.services.persistence.entity.lease.LeaseEntity;
import eu.csc.vehown.services.persistence.entity.vehicle.VehicleEntity;
import eu.csc.vehown.services.persistence.entity.vehicle.VehicleInfoEntity;
import java.util.ArrayList;
import java.util.List;
public class TestUtil {
private static TestUtil instance;
public static TestUtil getInstance() {
if(instance == null){
instance = new TestUtil();
}
return instance;
}
private TestUtil(){
}
public static LeaseEntity createExampleLease() {
LeaseEntity leaseEntity = new LeaseEntity();
return leaseEntity;
}
public static VehicleEntity getExampleVehicle(){
VehicleEntity vehicleEntity = new VehicleEntity("ASD", "FORD", "FOCUS");
return vehicleEntity;
}
public static List<VehicleInfoEntity> getVehicleInfoEntities(VehicleEntity vehicleEntity){
ArrayList<VehicleInfoEntity> result = new ArrayList<VehicleInfoEntity>();
result.add(new VehicleInfoEntity(vehicleEntity.getVehicleId(), "model", "Ford"));
result.add(new VehicleInfoEntity(vehicleEntity.getVehicleId(), "brand", "Focus"));
return result;
}
}

View File

@ -1,44 +0,0 @@
package eu.csc.vehown.services.persistence;
import androidx.room.Database;
import androidx.room.RoomDatabase;
import eu.csc.vehown.services.persistence.dao.*;
import eu.csc.vehown.services.persistence.entity.events.EventEntity;
import eu.csc.vehown.services.persistence.entity.lease.LeaseEntity;
import eu.csc.vehown.services.persistence.entity.lease.LeaseInfoEntity;
import eu.csc.vehown.services.persistence.entity.lease.LeaseSystemEntity;
import eu.csc.vehown.services.persistence.entity.vehicle.VehicleEntity;
import eu.csc.vehown.services.persistence.entity.vehicle.VehicleInfoEntity;
import eu.csc.vehown.services.persistence.entity.vehicle.VehicleSystemEntity;
@Database(entities = {
EventEntity.class,
VehicleEntity.class,
VehicleInfoEntity.class,
VehicleSystemEntity.class,
LeaseEntity.class,
LeaseSystemEntity.class,
LeaseInfoEntity.class,
},
exportSchema = true,
version = 1)
public abstract class VehicleOwnerDatabase extends RoomDatabase {
public static final String dbName = "vehicleOwnerDB";
public abstract EventDao eventDao();
public abstract VehicleDao vehicleDao();
public abstract LeaseEntityDao leaseDao();
public abstract VehicleInfoDao vehicleInfoDao();
}

View File

@ -1,20 +0,0 @@
package eu.csc.vehown.services.persistence.converter;
import androidx.room.TypeConverter;
import java.util.Date;
public class Converters {
@TypeConverter
public static Date fromTimestamp(Long value) {
return value == null ? null : new Date(value);
}
@TypeConverter
public static Long dateToTimestamp(Date date) {
return date == null ? null : date.getTime();
}
}

View File

@ -1,38 +0,0 @@
package eu.csc.vehown.services.persistence.converter;
import androidx.room.TypeConverter;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
public class TimestampConverter {
private static DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@TypeConverter
public static Date fromTimestamp(String value) {
if (value != null) {
try {
TimeZone timeZone = TimeZone.getTimeZone("IST");
df.setTimeZone(timeZone);
return df.parse(value);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
} else {
return null;
}
}
@TypeConverter
public static String dateToTimestamp(Date value) {
TimeZone timeZone = TimeZone.getTimeZone("IST");
df.setTimeZone(timeZone);
return value == null ? null : df.format(value);
}
}

View File

@ -1,19 +0,0 @@
package eu.csc.vehown.services.persistence.dao;
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.Update;
@Dao
public interface BaseDao<T> {
@Insert
Long insert(T item);
@Delete
void delete(T item);
@Update
void update(T item);
}

View File

@ -1,8 +0,0 @@
package eu.csc.vehown.services.persistence.dao;
import androidx.room.Dao;
import eu.csc.vehown.services.persistence.entity.events.EventEntity;
@Dao
public interface EventDao extends BaseDao<EventEntity> {
}

View File

@ -1,21 +0,0 @@
package eu.csc.vehown.services.persistence.dao;
import androidx.room.Dao;
import androidx.room.Query;
import eu.csc.vehown.services.persistence.entity.lease.LeaseEntity;
import eu.csc.vehown.services.persistence.entity.lease.LeaseWithSystems;
import java.util.List;
@Dao
public interface LeaseEntityDao extends BaseDao<LeaseEntity> {
@Query("SELECT * FROM LeaseEntity")
List<LeaseEntity> selectAll();
@Query("SELECT * FROM leaseentity where leaseId = :leaseId")
LeaseWithSystems getLeaseWithSystemsByLeaseId(long leaseId);
}

View File

@ -1,52 +0,0 @@
package eu.csc.vehown.services.persistence.dao;
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.Query;
import androidx.room.Transaction;
import eu.csc.vehown.services.persistence.entity.vehicle.VehicleEntity;
import eu.csc.vehown.services.persistence.entity.vehicle.VehicleWithEvents;
import eu.csc.vehown.services.persistence.entity.vehicle.VehicleWithInfos;
import eu.csc.vehown.services.persistence.entity.vehicle.VehicleWithSystems;
import java.util.List;
@Dao
public interface VehicleDao {
@Insert
void insert(VehicleEntity entity);
@Query("DELETE FROM VehicleEntity")
void deleteAll();
@Query("SELECT * FROM VehicleEntity where vin = :vin")
VehicleEntity loadVehicleEntityByVin(String vin);
@Transaction
@Query("SELECT * FROM VehicleEntity where vehicleId = :id")
public VehicleWithEvents getVehicleEvents(Long id);
@Transaction
@Query("SELECT * FROM VehicleEntity where vehicleId = :id")
public VehicleWithInfos getVehicleInfos(Long id);
@Delete
void deleteVehicle(VehicleEntity vehicleEntity);
@Transaction
@Query("SELECT * FROM VehicleEntity")
public List<VehicleWithEvents> getVehicleEvents();
@Transaction
@Query("SELECT * FROM VehicleEntity WHERE vin = :vin")
public VehicleWithSystems getVehicleWithSystemsByVin(String vin);
@Transaction
@Query("SELECT * FROM VehicleEntity WHERE vehicleId = :vehicleId")
public VehicleWithSystems getVehicleWithSystemsByVehicleId(long vehicleId);
}

View File

@ -1,20 +0,0 @@
package eu.csc.vehown.services.persistence.dao;
import androidx.room.Dao;
import androidx.room.Insert;
import androidx.room.Query;
import java.util.List;
import eu.csc.vehown.services.persistence.entity.vehicle.VehicleInfoEntity;
@Dao
public interface VehicleInfoDao {
@Insert
void insert(List<VehicleInfoEntity> items);
@Query("SeLECT * FROM VehicleInfoEntity")
List<VehicleInfoEntity> getAll();
}

View File

@ -1,15 +0,0 @@
package eu.csc.vehown.services.persistence.entity;
import androidx.room.PrimaryKey;
import lombok.*;
@Getter
@Setter
@NoArgsConstructor
public abstract class BaseIdentifiable {
@PrimaryKey(autoGenerate = true)
private Long id;
}

View File

@ -1,50 +0,0 @@
package eu.csc.vehown.services.persistence.entity.events;
import androidx.room.*;
import eu.csc.vehown.services.persistence.converter.TimestampConverter;
import eu.csc.vehown.services.persistence.entity.vehicle.VehicleEntity;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.util.Date;
@Getter
@Setter
@NoArgsConstructor
@Entity(
foreignKeys = {
@ForeignKey(entity = VehicleEntity.class,
parentColumns = "vehicleId",
childColumns = "vehicleId",
onDelete = ForeignKey.SET_NULL)})
public class EventEntity {
@PrimaryKey(autoGenerate = true)
private int id;
@ColumnInfo(name = "created_at")
@TypeConverters({TimestampConverter.class})
private Date createdAt;
@ColumnInfo(name = "name")
private String name;
@ColumnInfo(name = "description")
private String description;
@ColumnInfo(name = "ecu")
private String ecu;
@ColumnInfo(name = "vehicle")
private String vehicle;
@ColumnInfo(name = "vehicleId")
private Long vehicleId;
}

View File

@ -1,48 +0,0 @@
package eu.csc.vehown.services.persistence.entity.lease;
import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.PrimaryKey;
import androidx.room.TypeConverters;
import eu.csc.vehown.services.persistence.converter.TimestampConverter;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.util.Date;
@Getter
@Setter
@NoArgsConstructor
@Entity
public class LeaseEntity{
@PrimaryKey(autoGenerate = true)
private Long leaseId;
@ColumnInfo(name = "created_at")
@TypeConverters({TimestampConverter.class})
private Date createdAt;
@ColumnInfo(name = "delivered_at")
@TypeConverters({TimestampConverter.class})
private Date deliveredAt = null;
@TypeConverters({TimestampConverter.class})
private Date appointmentStart;
@TypeConverters({TimestampConverter.class})
private Date appointmentEnd;
@ColumnInfo(name = "vehicle")
private String vehicle;
@ColumnInfo(name="token")
private String token;
}

View File

@ -1,30 +0,0 @@
package eu.csc.vehown.services.persistence.entity.lease;
import androidx.room.Entity;
import androidx.room.ForeignKey;
import eu.csc.vehown.services.persistence.entity.BaseIdentifiable;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@NoArgsConstructor
@Entity(
foreignKeys = {
@ForeignKey(entity = LeaseEntity.class,
parentColumns = "leaseId",
childColumns = "leaseId",
onDelete = ForeignKey.CASCADE)})
public class LeaseInfoEntity extends BaseIdentifiable {
//@ForeignKey(entity = LeaseEntity.class, parentColumns = "", childColumns = "")
private long leaseId;
}

View File

@ -1,34 +0,0 @@
package eu.csc.vehown.services.persistence.entity.lease;
import androidx.room.Entity;
import androidx.room.ForeignKey;
import eu.csc.vehown.services.persistence.entity.BaseIdentifiable;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@NoArgsConstructor
@Entity(
foreignKeys = {
@ForeignKey(entity = LeaseEntity.class,
parentColumns = "leaseId",
childColumns = "leaseId",
onDelete = ForeignKey.CASCADE)})
public class LeaseSystemEntity extends BaseIdentifiable {
//@ForeignKey(entity = LeaseEntity.class, parentColumns = "", childColumns = "")
private long leaseId;
private String systemId;
private String systemName;
}

View File

@ -1,9 +0,0 @@
package eu.csc.vehown.services.persistence.entity.lease;
public enum LeaseTransferStatus {
DOWNLOAD,
TRANSFER,
TRANSFERED
}

View File

@ -1,17 +0,0 @@
package eu.csc.vehown.services.persistence.entity.lease;
import androidx.room.Embedded;
import androidx.room.Relation;
public class LeaseWithInfoEntity {
@Embedded
public LeaseEntity lease;
@Relation(
parentColumn = "leaseId",
entityColumn = "infoLeaseId"
)
public LeaseInfoEntity leaseInfo;
}

View File

@ -1,18 +0,0 @@
package eu.csc.vehown.services.persistence.entity.lease;
import androidx.room.Embedded;
import androidx.room.Relation;
import java.util.List;
public class LeaseWithSystems {
@Embedded
public LeaseEntity lease;
@Relation(
parentColumn = "leaseId",
entityColumn = "leaseId"
)
public List<LeaseSystemEntity> systems;
}

View File

@ -1,24 +0,0 @@
package eu.csc.vehown.services.persistence.entity.treatmentplan;
import androidx.annotation.NonNull;
import androidx.room.Entity;
import eu.csc.vehown.services.persistence.entity.BaseIdentifiable;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@NoArgsConstructor
@Entity
public class TreatmentPlanEntity extends BaseIdentifiable {
@NonNull
private String orderNo;
}

View File

@ -1,25 +0,0 @@
package eu.csc.vehown.services.persistence.entity.treatmentplan;
import androidx.room.Entity;
import eu.csc.vehown.services.persistence.entity.BaseIdentifiable;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@NoArgsConstructor
@Entity
public class TreatmentProposal extends BaseIdentifiable {
private String orderNo;
private String vehicle;
private String estimatedCost;
private String vehicleImage;
private String description;
}

View File

@ -1,40 +0,0 @@
package eu.csc.vehown.services.persistence.entity.vehicle;
import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.PrimaryKey;
import androidx.room.TypeConverters;
import eu.csc.vehown.services.persistence.converter.TimestampConverter;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.time.Instant;
import java.util.Date;
@Getter
@Setter
@NoArgsConstructor
@Entity
public class VehicleEntity {
@PrimaryKey(autoGenerate = true)
private Long vehicleId;
private String vin;
private String model;
private String brand;
@ColumnInfo()
@TypeConverters({TimestampConverter.class})
private Date addedAt;
public VehicleEntity(String vin, String model, String brand) {
this.vin = vin;
this.model = model;
this.brand = brand;
this.addedAt = Date.from(Instant.now());
}
}

View File

@ -1,37 +0,0 @@
package eu.csc.vehown.services.persistence.entity.vehicle;
import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.ForeignKey;
import eu.csc.vehown.services.persistence.entity.BaseIdentifiable;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@NoArgsConstructor
@Entity(
foreignKeys = {
@ForeignKey(entity = VehicleEntity.class,
parentColumns = "vehicleId",
childColumns = "infoVehicleId",
onDelete = ForeignKey.CASCADE)})
public class VehicleInfoEntity extends BaseIdentifiable {
@ColumnInfo
private long infoVehicleId;
private String key;
private String value;
public VehicleInfoEntity(long infoVehicleId, String key, String value) {
this.infoVehicleId = infoVehicleId;
this.key = key;
this.value = value;
}
}

View File

@ -1,35 +0,0 @@
package eu.csc.vehown.services.persistence.entity.vehicle;
import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.ForeignKey;
import eu.csc.vehown.services.persistence.entity.BaseIdentifiable;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@NoArgsConstructor
@Entity(
foreignKeys = {
@ForeignKey(entity = VehicleEntity.class,
parentColumns = "vehicleId",
childColumns = "vehicleId",
onDelete = ForeignKey.CASCADE)})
public class VehicleSystemEntity extends BaseIdentifiable {
@ColumnInfo
private long vehicleId;
private String systemId;
private String systemName;
public VehicleSystemEntity(long vehicleId, String systemId, String systemName) {
this.vehicleId = vehicleId;
this.systemId = systemId;
this.systemName = systemName;
}
}

View File

@ -1,23 +0,0 @@
package eu.csc.vehown.services.persistence.entity.vehicle;
import androidx.room.Embedded;
import androidx.room.Relation;
import java.util.List;
import eu.csc.vehown.services.persistence.entity.events.EventEntity;
public class VehicleWithEvents {
@Embedded
public VehicleEntity vehicleEntity;
@Relation(
parentColumn = "vehicleId",
entityColumn = "vehicleId"
)
public List<EventEntity> events;
}

View File

@ -1,19 +0,0 @@
package eu.csc.vehown.services.persistence.entity.vehicle;
import androidx.room.Embedded;
import androidx.room.Relation;
import java.util.List;
public class VehicleWithInfos {
@Embedded
public VehicleEntity vehicleEntity;
@Relation(
parentColumn = "vehicleId",
entityColumn = "infoVehicleId"
)
public List<VehicleInfoEntity> infos;
}

View File

@ -1,21 +0,0 @@
package eu.csc.vehown.services.persistence.entity.vehicle;
import androidx.room.Embedded;
import androidx.room.Relation;
import java.util.List;
public class VehicleWithSystems {
@Embedded
public VehicleEntity vehicleEntity;
@Relation(
parentColumn = "vehicleId",
entityColumn = "vehicleId"
)
public List<VehicleSystemEntity> systems;
}

View File

@ -143,7 +143,7 @@ public class UGPService extends Service implements IDataConsts, Runnable {
Event e = new Event(id);
e.setId(id);
e.setDescription(cp.getDtcBaseName(Locale.ENGLISH, d.getDtcBaseId(), NameType.longname));
e.setEcu(cp.getName(locale, IdentifierType.ecu, d.getEcuId(), NameType.shortname));
e.setEcuId(cp.getName(locale, IdentifierType.ecu, d.getEcuId(), NameType.shortname));
e.setVehicle(vehicle);
e.setTimestamp(d.getTimestamp());
if (d.getStatus().getConfirmedDTC()) {

View File

@ -11,10 +11,15 @@ import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.fragment.app.Fragment;
import eu.csc.vehown.R;
import eu.csc.vehown.data.TestUtil;
import eu.csc.vehown.data.model.CustomerVehicle;
import eu.csc.vehown.persist.localstorage.ExampleVehicle;
import eu.csc.vehown.persist.localstorage.PersistenceFactory;
import eu.csc.vehown.persist.localstorage.exception.EntityExistsException;
import eu.csc.vehown.services.mqtt.MqttClient;
import eu.csc.vehown.services.notifications.NotificationService;
import eu.csc.vehown.services.persistence.ExampleDataClient;
import eu.csc.vehown.services.persistence.PersistenceFactory;
import eu.csc.vehown.ui.reportEvent.ReportEventActivity;
import eu.csc.vehown.ui.svi.RegisterSVIActivity;
import eu.csc.vehown.ui.svi.UploadLeaseActivity;
@ -77,7 +82,16 @@ public class DashboardFragment extends Fragment {
});
root.findViewById(R.id.btnLoadExampleData).setOnClickListener(v -> {
PersistenceFactory.LoadExampleData(getContext());
CustomerVehicle customerVehicle = ExampleDataClient.customerVehicle;
ExampleVehicle exampleVehicle = new ExampleVehicle(customerVehicle, customerVehicle.systems);
try {
PersistenceFactory.LoadExampleData(getContext(), exampleVehicle);
} catch (EntityExistsException e) {
e.printStackTrace();
}
});
root.findViewById(R.id.btnUploadLease).setOnClickListener(v -> {

View File

@ -14,7 +14,9 @@ import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.RecyclerView;
import eu.csc.vehown.R;
import eu.csc.vehown.data.model.Event;
import eu.csc.vehown.services.persistence.PersistenceFactory;
import eu.csc.vehown.persist.localstorage.PersistenceFactory;
import eu.csc.vehown.services.persistence.ExampleDataClient;
import java.text.SimpleDateFormat;
import java.util.*;
@ -30,10 +32,12 @@ public class SelectEventsActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_select_events);
((Toolbar) findViewById(R.id.toolbar)).setTitle(R.string.select_events);
events = PersistenceFactory.getInstance(this).getEvents();
events = ExampleDataClient.getExampleEvents1();
RecyclerView recyclerView = findViewById(R.id.events_list);
assert recyclerView != null;
eventsAdapter = new EventsAdapter();
@ -83,7 +87,7 @@ public class SelectEventsActivity extends AppCompatActivity {
holder.tvId.setText(event.getId());
holder.tvName.setText(event.getName());
holder.tvDescription.setText(event.getDescription());
holder.tvEcu.setText(event.getEcu());
holder.tvEcu.setText(event.getEcuId());
holder.tvTimestamp.setText(dateFormat.format(new Date(event.getTimestamp())));
if (isSelected(position)) {
holder.itemView.setBackgroundResource(R.color.grey4);

View File

@ -47,14 +47,14 @@ public class RetrofitApiClientTest {
request.addEvent(ExampleDataClient.exampleEvent1.getId(),
ExampleDataClient.exampleEvent1.getName(),
ExampleDataClient.exampleEvent1.getDescription(),
ExampleDataClient.exampleEvent1.getEcu(),
ExampleDataClient.exampleEvent1.getEcuId(),
ExampleDataClient.exampleEvent1.getVehicle(),
ExampleDataClient.exampleEvent1.getTimestamp());
request.addEvent(ExampleDataClient.exampleEvent2.getId(),
ExampleDataClient.exampleEvent2.getName(),
ExampleDataClient.exampleEvent2.getDescription(),
ExampleDataClient.exampleEvent2.getEcu(),
ExampleDataClient.exampleEvent2.getEcuId(),
ExampleDataClient.exampleEvent2.getVehicle(),
ExampleDataClient.exampleEvent2.getTimestamp());

View File

@ -2,7 +2,14 @@ plugins {
id 'java-library'
}
dependencies {
implementation 'org.projectlombok:lombok:1.18.20'
annotationProcessor 'org.projectlombok:lombok:1.18.20'
}
java {
sourceCompatibility = JavaVersion.VERSION_1_7
targetCompatibility = JavaVersion.VERSION_1_7
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}

View File

@ -1,4 +1,27 @@
package eu.csc.ssv.core.services;
public class CustomerVehicle {
import eu.csc.vehown.data.model.ICustomerVehicle;
import eu.csc.vehown.data.model.LocalStorageIdentifier;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.io.Serializable;
@Getter
@Setter
@NoArgsConstructor
public class CustomerVehicle extends LocalStorageIdentifier<Long> implements Serializable, ICustomerVehicle {
private String vin;
private String licenseplate;
private String model;
private String brand;
public CustomerVehicle(String vin, String licenseplate, String model, String brand) {
this.vin = vin;
this.licenseplate = licenseplate;
this.model = model;
this.brand = brand;
}
}

View File

@ -0,0 +1,30 @@
package eu.csc.ssv.core.services;
import eu.csc.vehown.data.model.IEvent;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@NoArgsConstructor
public class VehicleEvent implements IEvent {
private String name;
private String description;
private String ecuId;
private String vehicle;
private Long timestamp;
private EventStatus status;
private EventSeverity severity;
public VehicleEvent(String name, String description, String ecuId, String vehicle, long timestamp, EventStatus status, EventSeverity severity) {
this.name = name;
this.description = description;
this.ecuId = ecuId;
this.vehicle = vehicle;
this.timestamp = timestamp;
this.status = status;
this.severity = severity;
}
}

View File

@ -0,0 +1,21 @@
package eu.csc.vehown.data;
import eu.csc.ssv.core.services.CustomerVehicle;
import eu.csc.ssv.core.services.VehicleEvent;
import eu.csc.vehown.data.model.ICustomerVehicle;
import eu.csc.vehown.data.model.IEvent;
public abstract class TestUtil {
public static ICustomerVehicle getDodgeChargerVehicle(){
return new CustomerVehicle("2C3CDXHGXJH265621", "265G21", "Charger", "Dodge");
}
public static final IEvent exampleEvent1 = new VehicleEvent("P0100", "Mass or Volume Air Flow 'A' Circuit", "OBDII1", "Dodge Charger '265G21'", 1620649836986L, IEvent.EventStatus.CONFIRMED, IEvent.EventSeverity.HIGH);
public static final IEvent exampleEvent2 = new VehicleEvent("P0200", "Injector Circuit/Open", "OBDII1", "Dodge Charger '265G21'", 1620649836987L, IEvent.EventStatus.CONFIRMED, IEvent.EventSeverity.HIGH);
}

View File

@ -0,0 +1,24 @@
package eu.csc.vehown.data.model;
import java.util.Date;
public interface IEvent {
enum EventStatus { UNDEFINED, PERMANENT, PENDING, CONFIRMED }
enum EventSeverity { LOW, MEDIUM, HIGH }
String getName();
String getDescription();
String getVehicle();
Long getTimestamp();
String getEcuId();
EventStatus getStatus();
EventSeverity getSeverity();
;
}

View File

@ -0,0 +1,15 @@
package eu.csc.vehown.data.model;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@NoArgsConstructor
public abstract class LocalStorageIdentifier<T> {
private T localIdentifier;
}

View File

@ -44,6 +44,7 @@ dependencies {
implementation project(":services:core")
compileOnly 'org.projectlombok:lombok:1.18.16'

View File

@ -0,0 +1,86 @@
package eu.csc.vehown.persist.localstorage.service;
import android.content.Context;
import androidx.room.Room;
import androidx.test.core.app.ApplicationProvider;
import eu.csc.ssv.core.services.VehicleEvent;
import eu.csc.vehown.data.TestUtil;
import eu.csc.vehown.data.model.ICustomerVehicle;
import eu.csc.vehown.persist.localstorage.VehicleOwnerDatabase;
import eu.csc.vehown.persist.localstorage.exception.EntityExistsException;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
import static org.junit.Assert.*;
public class LocalStorageServiceImplTest {
private VehicleOwnerDatabase db;
private LocalStorageServiceImpl persistenceService;
@Before
public void setUp() throws Exception {
Context context = ApplicationProvider.getApplicationContext();
db = Room.inMemoryDatabaseBuilder(context, VehicleOwnerDatabase.class).build();
this.persistenceService = new LocalStorageServiceImpl(db);
}
@After
public void tearDown() throws Exception {
db.close();
}
@Test
public void storeVehicleSystems(){
}
@Test
public void storeEvent() throws EntityExistsException {
ICustomerVehicle testVehicle = TestUtil.getDodgeChargerVehicle();
Long vehicleId = storeVehicle(testVehicle);
persistenceService.storeEvent(TestUtil.exampleEvent1, testVehicle.getVin());
assertEquals(1, persistenceService.getVehicleEvents(vehicleId).events.size());
persistenceService.storeEvent(TestUtil.exampleEvent1, testVehicle.getVin());
assertEquals(2, persistenceService.getVehicleEvents(vehicleId).events.size());
}
private Long storeVehicle(ICustomerVehicle customerVehicle) throws EntityExistsException {
return persistenceService.storeNewVehicle(customerVehicle, new ArrayList<>());
}
@Test
public void storeVehicle() {
try {
Long id = storeVehicle(TestUtil.getDodgeChargerVehicle());
assertNotNull(id);
} catch (EntityExistsException e) {
e.printStackTrace();
}
try {
Long id = persistenceService.storeNewVehicle(TestUtil.getDodgeChargerVehicle(), new ArrayList<>());
assertNotNull(id);
} catch (EntityExistsException e) {
assertNotNull(e);
}
}
}

View File

@ -0,0 +1,22 @@
package eu.csc.vehown.persist.localstorage;
import eu.csc.vehown.data.model.ICustomerVehicle;
import eu.csc.vehown.data.model.IVehicleSystem;
import lombok.Getter;
import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.List;
@NoArgsConstructor
@Getter
public class ExampleVehicle {
private ICustomerVehicle vehicle;
private List<IVehicleSystem> vehicleSystems;
public ExampleVehicle(ICustomerVehicle vehicle, List<? extends IVehicleSystem> vehicleSystems) {
this.vehicle = vehicle;
this.vehicleSystems = new ArrayList<>(vehicleSystems);
}
}

View File

@ -3,7 +3,8 @@ package eu.csc.vehown.persist.localstorage;
import android.content.Context;
import android.util.Log;
import androidx.room.Room;
import eu.csc.vehown.persist.localstorage.exception.EntityExistsException;
import eu.csc.vehown.persist.localstorage.service.LocalStorageServiceImpl;
public class PersistenceFactory {
@ -11,35 +12,36 @@ public class PersistenceFactory {
private static final String TAG = PersistenceFactory.class.getSimpleName();
public static VehicleOwnerDatabase generateDatabase(Context context){
VehicleOwnerDatabase db = Room.databaseBuilder(context,
VehicleOwnerDatabase.class, VehicleOwnerDatabase.dbName).build();
VehicleOwnerDatabase.class, VehicleOwnerDatabase.dbName)
.allowMainThreadQueries()
.build();
return db;
}
public static void LoadExampleData(Context context){
public static void LoadExampleData(Context context, ExampleVehicle exampleVehicle) throws EntityExistsException {
Log.d(TAG, "START LOADING EXAMPLE DATA");
try{
VehicleOwnerDatabase database = generateDatabase(context);
LocalStorageServiceImpl localStorageService = new LocalStorageServiceImpl(database);
database.vehicleDao().deleteAll();
localStorageService.storeNewVehicle(exampleVehicle.getVehicle(), exampleVehicle.getVehicleSystems());
}
catch (Exception ex){
Log.d(TAG, ex.toString());
}
}
}

View File

@ -39,6 +39,8 @@ public class TestUtil {
public static VehicleEntity getExampleVehicle(){
VehicleEntity vehicleEntity = new VehicleEntity("ASD", "FORD", "FOCUS");

View File

@ -2,10 +2,7 @@ package eu.csc.vehown.persist.localstorage;
import androidx.room.Database;
import androidx.room.RoomDatabase;
import eu.csc.vehown.persist.localstorage.dao.EventDao;
import eu.csc.vehown.persist.localstorage.dao.LeaseEntityDao;
import eu.csc.vehown.persist.localstorage.dao.VehicleDao;
import eu.csc.vehown.persist.localstorage.dao.VehicleInfoDao;
import eu.csc.vehown.persist.localstorage.dao.*;
import eu.csc.vehown.persist.localstorage.entity.events.EventEntity;
import eu.csc.vehown.persist.localstorage.entity.lease.LeaseEntity;
import eu.csc.vehown.persist.localstorage.entity.lease.LeaseInfoEntity;
@ -40,6 +37,7 @@ public abstract class VehicleOwnerDatabase extends RoomDatabase {
public abstract VehicleDao vehicleDao();
public abstract LeaseEntityDao leaseDao();
public abstract VehicleInfoDao vehicleInfoDao();
public abstract VehicleSystemDao vehicleSystemDao();

View File

@ -1,20 +0,0 @@
package eu.csc.vehown.persist.localstorage.converter;
import androidx.room.TypeConverter;
import java.util.Date;
public class Converters {
@TypeConverter
public static Date fromTimestamp(Long value) {
return value == null ? null : new Date(value);
}
@TypeConverter
public static Long dateToTimestamp(Date date) {
return date == null ? null : date.getTime();
}
}

View File

@ -0,0 +1,30 @@
package eu.csc.vehown.persist.localstorage.converter;
import androidx.room.TypeConverter;
import eu.csc.vehown.data.model.IEvent;
public class EventConverters {
@TypeConverter
public static IEvent.EventStatus toEventStatus(String value)
{
return IEvent.EventStatus.valueOf(value);
}
@TypeConverter
public static String fromEventStatus(IEvent.EventStatus value){
return value.name();
}
@TypeConverter
public static IEvent.EventSeverity toEventSeverity(String value)
{
return IEvent.EventSeverity.valueOf(value);
}
@TypeConverter
public static String fromEventSeverity(IEvent.EventSeverity value){
return value.name();
}
}

View File

@ -17,6 +17,6 @@ public interface LeaseEntityDao extends BaseDao<LeaseEntity> {
@Query("SELECT * FROM leaseentity where leaseId = :leaseId")
LeaseWithSystems getLeaseWithSystemsByLeaseId(long leaseId);
LeaseWithSystems getLeaseWithSystemsByLeaseId(Long leaseId);
}

View File

@ -19,8 +19,11 @@ import java.util.List;
@Dao
public interface VehicleDao {
@Insert
void insert(VehicleEntity entity);
Long insert(VehicleEntity entity);
@Query("DELETE FROM VehicleEntity")
void deleteAll();
@ -50,4 +53,8 @@ public interface VehicleDao {
@Transaction
@Query("SELECT * FROM VehicleEntity WHERE vehicleId = :vehicleId")
public VehicleWithSystems getVehicleWithSystemsByVehicleId(long vehicleId);
@Query("SELECT EXISTS(SELECT * FROM VehicleEntity WHERE vin=:vin)")
public boolean checkIfVehicleExistsByVin(String vin);
}

View File

@ -14,7 +14,7 @@ public interface VehicleInfoDao {
@Insert
void insert(List<VehicleInfoEntity> items);
@Query("SeLECT * FROM VehicleInfoEntity")
@Query("SELECT * FROM VehicleInfoEntity")
List<VehicleInfoEntity> getAll();
}

View File

@ -0,0 +1,20 @@
package eu.csc.vehown.persist.localstorage.dao;
import androidx.room.Dao;
import androidx.room.Insert;
import androidx.room.Query;
import eu.csc.vehown.persist.localstorage.entity.vehicle.VehicleInfoEntity;
import eu.csc.vehown.persist.localstorage.entity.vehicle.VehicleSystemEntity;
import java.util.List;
@Dao
public interface VehicleSystemDao {
@Insert
void insert(List<VehicleSystemEntity> values);
@Query("DELETE FROM VehicleSystemEntity WHERE vehicleId=:vehicleId")
void removeSystemsByVehicleId(long vehicleId);
}

View File

@ -2,10 +2,13 @@ package eu.csc.vehown.persist.localstorage.entity.events;
import androidx.room.*;
import eu.csc.vehown.data.model.IEvent;
import eu.csc.vehown.persist.localstorage.converter.EventConverters;
import eu.csc.vehown.persist.localstorage.converter.TimestampConverter;
import eu.csc.vehown.persist.localstorage.entity.vehicle.VehicleEntity;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.Setter;
import java.util.Date;
@ -22,11 +25,9 @@ import java.util.Date;
onDelete = ForeignKey.SET_NULL)})
public class EventEntity {
@PrimaryKey(autoGenerate = true)
private int id;
@ColumnInfo(name = "created_at")
@TypeConverters({TimestampConverter.class})
private Date createdAt;
@ -37,7 +38,6 @@ public class EventEntity {
@ColumnInfo(name = "description")
private String description;
@ColumnInfo(name = "ecu")
private String ecu;
@ -48,4 +48,20 @@ public class EventEntity {
private Long vehicleId;
@ColumnInfo(name = "severity")
@TypeConverters({EventConverters.class})
private IEvent.EventSeverity severity;
@ColumnInfo(name = "status")
@TypeConverters({EventConverters.class})
private IEvent.EventStatus status;
public void setVehicleReference(@NonNull VehicleEntity vehicleEntity) {
this.vehicleId = vehicleEntity.getVehicleId();
this.vehicle = vehicleEntity.getVin();
}
}

View File

@ -4,6 +4,7 @@ import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.ForeignKey;
import eu.csc.vehown.data.model.IVehicleSystem;
import eu.csc.vehown.persist.localstorage.entity.BaseIdentifiable;
import lombok.Getter;
import lombok.NoArgsConstructor;
@ -33,4 +34,11 @@ public class VehicleSystemEntity extends BaseIdentifiable {
this.systemId = systemId;
this.systemName = systemName;
}
public VehicleSystemEntity(IVehicleSystem system, long vehicleId){
this.vehicleId = vehicleId;
this.systemId = system.getId();
this.systemName = system.getName();
}
}

View File

@ -0,0 +1,11 @@
package eu.csc.vehown.persist.localstorage.exception;
import eu.csc.vehown.persist.localstorage.entity.vehicle.VehicleEntity;
public class EntityExistsException extends Throwable {
public EntityExistsException(Class clazz) {
super(String.format("Entity %s already exists", clazz.getSimpleName()));
}
}

View File

@ -1,7 +1,114 @@
package eu.csc.vehown.persist.localstorage.service;
import eu.csc.vehown.data.model.ICustomerVehicle;
import eu.csc.vehown.data.model.IEvent;
import eu.csc.vehown.data.model.IVehicleSystem;
import eu.csc.vehown.persist.localstorage.VehicleOwnerDatabase;
import eu.csc.vehown.persist.localstorage.dao.EventDao;
import eu.csc.vehown.persist.localstorage.dao.VehicleDao;
import eu.csc.vehown.persist.localstorage.dao.VehicleInfoDao;
import eu.csc.vehown.persist.localstorage.dao.VehicleSystemDao;
import eu.csc.vehown.persist.localstorage.entity.events.EventEntity;
import eu.csc.vehown.persist.localstorage.entity.vehicle.VehicleEntity;
import eu.csc.vehown.persist.localstorage.entity.vehicle.VehicleSystemEntity;
import eu.csc.vehown.persist.localstorage.entity.vehicle.VehicleWithEvents;
import eu.csc.vehown.persist.localstorage.exception.EntityExistsException;
import lombok.var;
import java.util.*;
public class LocalStorageServiceImpl {
private final VehicleDao vehicleRepo;
private final EventDao eventRepo;
private final VehicleInfoDao vehicleInfoRepo;
private final VehicleSystemDao vehicleSystemRepo;
private VehicleOwnerDatabase vehicleOwnerDatabase;
public LocalStorageServiceImpl(VehicleOwnerDatabase vehicleOwnerDatabase) {
this.vehicleOwnerDatabase = vehicleOwnerDatabase;
this.vehicleRepo = vehicleOwnerDatabase.vehicleDao();
this.eventRepo = vehicleOwnerDatabase.eventDao();
this.vehicleInfoRepo = vehicleOwnerDatabase.vehicleInfoDao();
this.vehicleSystemRepo = vehicleOwnerDatabase.vehicleSystemDao();
}
public Long storeEvent(IEvent event, String vehicleVin) {
EventEntity eventEntity = new EventEntity();
eventEntity.setEcu(event.getEcuId());
eventEntity.setCreatedAt(convertTimestampToDate(event.getTimestamp()));
eventEntity.setVehicleReference(vehicleOwnerDatabase.vehicleDao().loadVehicleEntityByVin(vehicleVin));
eventEntity.setSeverity(event.getSeverity());
eventEntity.setStatus(event.getStatus());
eventEntity.setName(event.getName());
eventEntity.setDescription(event.getDescription());
return eventRepo.insert(eventEntity);
}
public void storeVehicleSystems(ICustomerVehicle customerVehicle, List<IVehicleSystem> vehicleSystems) throws EntityExistsException {
if (!vehicleOwnerDatabase.vehicleDao().checkIfVehicleExistsByVin(customerVehicle.getVin())) {
throw new EntityExistsException(VehicleEntity.class);
}
VehicleEntity ve = getVehicleByVin(customerVehicle.getVin());
vehicleSystemRepo.removeSystemsByVehicleId(ve.getVehicleId());
List<VehicleSystemEntity> vehicleSystemEntities = new ArrayList<>();
vehicleSystems.forEach(x -> {
vehicleSystemEntities.add(new VehicleSystemEntity(x, ve.getVehicleId()));
});
vehicleSystemRepo.insert(vehicleSystemEntities);
}
public VehicleEntity getVehicleByVin(String vin) {
return vehicleRepo.loadVehicleEntityByVin(vin);
}
public Long storeNewVehicle(ICustomerVehicle customerVehicle, List<IVehicleSystem> systems) throws EntityExistsException {
if (vehicleOwnerDatabase.vehicleDao().checkIfVehicleExistsByVin(customerVehicle.getVin())) {
throw new EntityExistsException(VehicleEntity.class);
}
VehicleEntity vehicleEntity = new VehicleEntity();
vehicleEntity.setBrand(customerVehicle.getBrand());
vehicleEntity.setLicensePlate(customerVehicle.getLicenseplate());
vehicleEntity.setModel(customerVehicle.getModel());
vehicleEntity.setVin(customerVehicle.getVin());
long id = vehicleOwnerDatabase.vehicleDao().insert(vehicleEntity);
storeVehicleSystems(customerVehicle, systems);
return id;
}
private Date convertTimestampToDate(long ts) {
var calender = new GregorianCalendar();
calender.setTimeInMillis(ts);
return calender.getTime();
}
public VehicleWithEvents getVehicleEvents(Long vehicleId) {
return vehicleRepo.getVehicleEvents(vehicleId);
}
}

View File

@ -0,0 +1,26 @@
package eu.csc.vehown.persist.localstorage.service;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
public class LocalStorageServiceImplTest {
@Before
public void setUp() throws Exception {
}
@After
public void tearDown() throws Exception {
}
@Test
public void storeEvent() {
}
@Test
public void storeVehicle() {
}
}