Skip to content

Commit

Permalink
Fixed bug with type serializer #7
Browse files Browse the repository at this point in the history
  • Loading branch information
ImangazalievM committed Feb 2, 2018
1 parent 540af7f commit c7f8801
Show file tree
Hide file tree
Showing 23 changed files with 317 additions and 199 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ In the plans:
Add this to your app **build.gradle**:

```gradle
compile 'com.reactiveandroid:reactiveandroid:1.3.1'
compile 'com.reactiveandroid:reactiveandroid:1.3.2'
```

## Initial setup
Expand Down
4 changes: 2 additions & 2 deletions reactiveandroid.gradle
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
ext.reactiveandroid = [
libraryVersion : '1.3.1',
libraryVersionCode : 7,
libraryVersion : '1.3.2',
libraryVersionCode : 8,
group : 'com.reactiveandroid',

minSdk : 14,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -168,13 +168,13 @@ public static TableInfo getTableInfo(Class<?> table) {
}

/**
* @param table Table class
* @param modelClass Model class
* @param type Deserialized type class
* @return {@link TypeSerializer} for specified type
*/
@Nullable
public static TypeSerializer getSerializerForType(Class<?> table, Class<?> type) {
return getDatabaseForTable(table).getTypeSerializer(type);
public static TypeSerializer getSerializerForType(Class<?> modelClass, Class<?> type) {
return getDatabaseForTable(modelClass).getTypeSerializer(type);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,8 @@ public class DatabaseInfo {
}};

public DatabaseInfo(Context context, @NonNull DatabaseConfig databaseConfig) {
loadModels(context, databaseConfig);
loadTypeSerializers(databaseConfig);
loadModels(context, databaseConfig);

this.reActiveOpenHelper = new ReActiveOpenHelper(context, databaseConfig, tableInfos.values());

Expand Down Expand Up @@ -132,18 +132,20 @@ private void loadModels(Context context, DatabaseConfig databaseConfig) {
}

private void loadTypeSerializers(DatabaseConfig databaseConfig) {
List<Class<? extends TypeSerializer>> customTypeSerializers = databaseConfig.typeSerializers;
if (customTypeSerializers != null) {
for (Class<? extends TypeSerializer> typeSerializer : customTypeSerializers) {
try {
TypeSerializer instance = typeSerializer.newInstance();
typeSerializers.put(instance.getDeserializedType(), instance);
} catch (InstantiationException e) {
ReActiveLog.e(LogLevel.BASIC, "Couldn't instantiate TypeSerializer.", e);
} catch (IllegalAccessException e) {
ReActiveLog.e(LogLevel.BASIC, "IllegalAccessException while instantiating "
+ typeSerializer.getClass().getCanonicalName(), e);
for (Class<? extends TypeSerializer> typeSerializer : databaseConfig.typeSerializers) {
try {
TypeSerializer instance = typeSerializer.newInstance();
typeSerializers.put(instance.getDeserializedType(), instance);
} catch (Exception e) {
if (e instanceof InstantiationException | e instanceof IllegalAccessException) {
ReActiveLog.e(LogLevel.BASIC, "Couldn't instantiate type " +
"serializer " + typeSerializer.getCanonicalName() +
"Please provide default constructor with public modifier", e);
} else {
ReActiveLog.e(LogLevel.BASIC, "Unknown error while instantiating "
+ typeSerializer.getCanonicalName(), e);
}
throw new RuntimeException(e);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import com.reactiveandroid.annotation.QueryModel;
import com.reactiveandroid.internal.serializer.TypeSerializer;
import com.reactiveandroid.internal.utils.ReflectionUtils;
import com.reactiveandroid.internal.utils.SQLiteUtils;

import java.lang.reflect.Field;
import java.util.ArrayList;
Expand Down Expand Up @@ -67,28 +68,10 @@ public ColumnInfo getColumnInfo(Field field) {
private ColumnInfo createColumnInfo(Field field, Map<Class<?>, TypeSerializer> typeSerializers) {
QueryColumn columnAnnotation = field.getAnnotation(QueryColumn.class);
String columnName = !TextUtils.isEmpty(columnAnnotation.name()) ? columnAnnotation.name() : field.getName();
SQLiteType sqliteType = getFieldSQLiteType(field, typeSerializers);
SQLiteType sqliteType = SQLiteUtils.getFieldSQLiteType(field, typeSerializers);
return new ColumnInfo(columnName, sqliteType, false);
}

private SQLiteType getFieldSQLiteType(Field field, Map<Class<?>, TypeSerializer> typeSerializers) {
SQLiteType sqliteType = null;
Class<?> fieldType = field.getType();

TypeSerializer typeSerializer = typeSerializers.get(field.getType());
if (typeSerializer != null) {
fieldType = typeSerializer.getSerializedType();
}

if (SQLiteType.containsType(fieldType)) {
sqliteType = SQLiteType.getSQLiteTypeForClass(fieldType);
} else if (ReflectionUtils.isModel(fieldType)) {
sqliteType = SQLiteType.INTEGER;
}

return sqliteType;
}

private List<Field> filterQueryColumnFields(List<Field> modelDeclaredFields) {
List<Field> modelColumnFields = new ArrayList<>();
for (Field field : modelDeclaredFields) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import com.reactiveandroid.annotation.UniqueGroup;
import com.reactiveandroid.internal.serializer.TypeSerializer;
import com.reactiveandroid.internal.utils.ReflectionUtils;
import com.reactiveandroid.internal.utils.SQLiteUtils;

import java.lang.reflect.Field;
import java.util.ArrayList;
Expand Down Expand Up @@ -192,7 +193,7 @@ private Field findPrimaryKeyField(Class<?> modelClass) {
private ColumnInfo createColumnInfo(Field field, Map<Class<?>, TypeSerializer> typeSerializers) {
Column columnAnnotation = field.getAnnotation(Column.class);
String columnName = !TextUtils.isEmpty(columnAnnotation.name()) ? columnAnnotation.name() : field.getName();
SQLiteType sqliteType = getFieldSQLiteType(field, typeSerializers);
SQLiteType sqliteType = SQLiteUtils.getFieldSQLiteType(field, typeSerializers);
boolean notNull = columnAnnotation.notNull();
return new ColumnInfo(columnName, sqliteType, notNull);
}
Expand Down Expand Up @@ -231,22 +232,4 @@ private void createColumnIndex(Field field, ColumnInfo columnInfo) {
}
}

private SQLiteType getFieldSQLiteType(Field field, Map<Class<?>, TypeSerializer> typeSerializers) {
SQLiteType sqliteType = null;
Class<?> fieldType = field.getType();

TypeSerializer typeSerializer = typeSerializers.get(field.getType());
if (typeSerializer != null) {
fieldType = typeSerializer.getSerializedType();
}

if (SQLiteType.containsType(fieldType)) {
sqliteType = SQLiteType.getSQLiteTypeForClass(fieldType);
} else if (ReflectionUtils.isModel(fieldType)) {
sqliteType = SQLiteType.INTEGER;
}

return sqliteType;
}

}
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
package com.reactiveandroid.internal.serializer;

import android.support.annotation.NonNull;
import android.support.annotation.Nullable;

import java.math.BigDecimal;

public final class BigDecimalSerializer extends TypeSerializer<BigDecimal, String> {

@Nullable
public String serialize(@NonNull BigDecimal data) {
public String serialize(@Nullable BigDecimal data) {
if (data == null) return null;
return data.toString();
}

@Nullable
public BigDecimal deserialize(@NonNull String data) {
public BigDecimal deserialize(@Nullable String data) {
if (data == null) return null;
return new BigDecimal(data);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,21 @@
package com.reactiveandroid.internal.serializer;

import android.support.annotation.NonNull;
import android.support.annotation.Nullable;

import java.util.Calendar;

public final class CalendarSerializer extends TypeSerializer<Calendar, Long> {

@Nullable
public Long serialize(@NonNull Calendar data) {
public Long serialize(@Nullable Calendar data) {
if (data == null) return null;
return data.getTimeInMillis();
}

@Nullable
public Calendar deserialize(@NonNull Long data) {
public Calendar deserialize(@Nullable Long data) {
if (data == null) return null;

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(data);
return calendar;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
package com.reactiveandroid.internal.serializer;

import android.support.annotation.NonNull;
import android.support.annotation.Nullable;

import java.io.File;

public final class FileSerializer extends TypeSerializer<File, String> {

@Nullable
public String serialize(@NonNull File data) {
public String serialize(@Nullable File data) {
if (data == null) return null;
return data.toString();
}

@Nullable
public File deserialize(@NonNull String data) {
public File deserialize(@Nullable String data) {
if (data == null) return null;
return new File(data);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
package com.reactiveandroid.internal.serializer;

import android.support.annotation.NonNull;
import android.support.annotation.Nullable;

import java.sql.Date;

public final class SqlDateSerializer extends TypeSerializer<Date, Long> {

@Nullable
public Long serialize(@NonNull Date data) {
public Long serialize(@Nullable Date data) {
if (data == null) return null;
return data.getTime();
}

@Nullable
public Date deserialize(@NonNull Long data) {
public Date deserialize(@Nullable Long data) {
if (data == null) return null;
return new Date(data);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,9 @@ public Class<SerializedType> getSerializedType() {
}

@Nullable
public abstract SerializedType serialize(@NonNull DeserializedType data);
public abstract SerializedType serialize(@Nullable DeserializedType data);

@Nullable
public abstract DeserializedType deserialize(@NonNull SerializedType data);
public abstract DeserializedType deserialize(@Nullable SerializedType data);

}
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
package com.reactiveandroid.internal.serializer;

import android.support.annotation.NonNull;
import android.support.annotation.Nullable;

import java.util.UUID;

public final class UUIDSerializer extends TypeSerializer<UUID, String> {

@Nullable
public String serialize(@NonNull UUID data) {
public String serialize(@Nullable UUID data) {
if (data == null) return null;
return data.toString();
}

@Nullable
public UUID deserialize(@NonNull String data) {
public UUID deserialize(@Nullable String data) {
if (data == null) return null;
return UUID.fromString(data);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
package com.reactiveandroid.internal.serializer;

import android.support.annotation.NonNull;
import android.support.annotation.Nullable;

import java.util.Date;

public final class UtilDateSerializer extends TypeSerializer<Date, Long> {

@Nullable
public Long serialize(@NonNull Date data) {
public Long serialize(@Nullable Date data) {
if (data == null) return null;
return data.getTime();
}

@Nullable
public Date deserialize(@NonNull Long data) {
public Date deserialize(@Nullable Long data) {
if (data == null) return null;
return new Date(data);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;

public final class SQLiteUtils {

Expand Down Expand Up @@ -172,6 +173,27 @@ public static List<String> createIndexDefinition(TableInfo tableInfo) {
return definitions;
}

public static SQLiteType getFieldSQLiteType(Field field, Map<Class<?>, TypeSerializer> typeSerializers) {
SQLiteType sqliteType;
Class<?> fieldType = field.getType();

TypeSerializer typeSerializer = typeSerializers.get(field.getType());
if (typeSerializer != null) {
fieldType = typeSerializer.getSerializedType();
}

if (SQLiteType.containsType(fieldType)) {
sqliteType = SQLiteType.getSQLiteTypeForClass(fieldType);
} else if (ReflectionUtils.isModel(fieldType)) {
sqliteType = SQLiteType.INTEGER;
} else {
throw new IllegalStateException("Type serializer for type " + fieldType.getCanonicalName() + " not found");
}

return sqliteType;
}


public static void fillContentValuesForUpdate(Object model,
ModelAdapter modelAdapter,
ContentValues contentValues) {
Expand Down
Loading

0 comments on commit c7f8801

Please sign in to comment.