package de.ironjan.mensaupb.persistence;
import android.text.TextUtils;
import com.j256.ormlite.field.FieldType;
import com.j256.ormlite.field.SqlType;
import com.j256.ormlite.field.types.StringType;
import com.j256.ormlite.support.DatabaseResults;
import java.sql.SQLException;
import java.util.Arrays;
import de.ironjan.mensaupb.stw.rest_api.Allergen;
/**
* A custom persister that saves an AllergensArray as String in the database.
*/
public class AllergensArrayPersister extends StringType {
private static final String DELIMITER = ";";
private static AllergensArrayPersister instance = null;
private AllergensArrayPersister() {
super(SqlType.STRING, new Class<?>[]{Allergen.class});
}
public synchronized static AllergensArrayPersister getSingleton() {
if (instance == null) {
instance = new AllergensArrayPersister();
}
return instance;
}
@Override
public Object parseDefaultString(FieldType fieldType, String defaultStr) {
return Allergen.UNKNOWN;
}
@Override
public Object javaToSqlArg(FieldType fieldType, Object object) throws SQLException {
if (!(object instanceof Allergen[])) {
throw new IllegalArgumentException("Must only persist Allergen[]");
}
Allergen[] allergens = (Allergen[]) object;
if (allergens.length == 0) {
return "";
}
Arrays.sort(allergens);
StringBuilder stringBuffer = new StringBuilder(DELIMITER);
for (Allergen allergen : allergens) {
stringBuffer.append(allergen.toString());
stringBuffer.append(DELIMITER);
}
return stringBuffer.toString();
}
@Override
public Object resultToSqlArg(FieldType fieldType, DatabaseResults results, int columnPos) throws SQLException {
String allergensAsString = results.getString(columnPos);
if (TextUtils.isEmpty(allergensAsString) || (allergensAsString.length() <= 1)) {
return new Allergen[0];
}
// we need to remove the first and last DELIMITER. The format is ';(A;)+' where 'A' is an allergen or additional
String strippedAllergenString = allergensAsString.substring(1, allergensAsString.length() - 1);
String[] splittedAllergensAsString = strippedAllergenString.split(DELIMITER);
int numberOfAllergens = splittedAllergensAsString.length;
Allergen[] allergens = new Allergen[numberOfAllergens];
for (int i = 0; i < numberOfAllergens; i++) {
allergens[i] = Allergen.fromString(splittedAllergensAsString[i]);
}
return allergens;
}
}