Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@
import org.eyeseetea.malariacare.data.database.utils.PopulateDBStrategy;
import org.eyeseetea.malariacare.data.database.utils.PreferencesState;
import org.eyeseetea.malariacare.data.database.utils.populatedb.PopulateDB;
import org.eyeseetea.malariacare.data.remote.IMetadataConfigurationDataSource;
import org.eyeseetea.malariacare.data.repositories.ProgramRepository;
import org.eyeseetea.malariacare.data.sync.factory.ConverterFactory;
import org.eyeseetea.malariacare.data.sync.importer.metadata.configuration.IMetadataConfigurationDataSource;
import org.eyeseetea.malariacare.data.sync.importer.metadata.configuration
.MetadataConfigurationDBImporter;
import org.eyeseetea.malariacare.data.sync.importer.metadata.configuration
Expand Down Expand Up @@ -102,7 +102,8 @@ public void pullMetadata(final IPullController.Callback callback, boolean isDemo
IMetadataConfigurationDataSource metadataConfigurationDataSource =
metadataConfigurationDataSourceFactory.getMetadataConfigurationDataSource();
importer = new MetadataConfigurationDBImporter(
metadataConfigurationDataSource, ConverterFactory.getQuestionConverter()
metadataConfigurationDataSource, ConverterFactory.getQuestionConverter(),
ConverterFactory.getOptionConverter()
);

IProgramRepository programRepository = new ProgramRepository();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
package org.eyeseetea.malariacare.data.remote;

package org.eyeseetea.malariacare.data.sync.importer.metadata.configuration;

import org.eyeseetea.malariacare.domain.entity.Configuration;
import org.eyeseetea.malariacare.domain.entity.Question;

import java.util.List;

public interface IMetadataConfigurationDataSource {

List<Question> getQuestionsByCountryCode(String countryCode) throws Exception;
Metadata getQuestionsByCountryCode(String countryCode) throws Exception;

List<Configuration.CountryVersion> getCountriesVersions() throws Exception;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package org.eyeseetea.malariacare.data.sync.importer.metadata.configuration;

import org.eyeseetea.malariacare.domain.entity.Option;
import org.eyeseetea.malariacare.domain.entity.Question;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class Metadata {
List<Question> questions;
HashMap<String, List<Option>> options;

public Metadata() {
questions = new ArrayList<>();
options = new HashMap<>();
}

public void addQuestion(Question question, List<Option> questionOptions){
questions.add(question);
options.put(question.getCode(), questionOptions);

}

public List<Question> getQuestions() {
return questions;
}

public HashMap<String, List<Option>> getOptions() {
return options;
}

public List<Option> getOptionsByQuestion(String code){
return options.get(code);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,6 @@
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;

import org.eyeseetea.malariacare.data.remote.IMetadataConfigurationDataSource;
import org.eyeseetea.malariacare.data.sync.importer.metadata.configuration.converter
.PhoneFormatConvertToDomainVisitor;
import org.eyeseetea.malariacare.data.sync.importer.metadata.configuration.model
Expand Down Expand Up @@ -102,7 +101,7 @@ public MetadataConfigurationApiClient(String url, BasicAuthInterceptor basicAuth
}

@Override
public List<Question> getQuestionsByCountryCode(String countryCode) throws Exception {
public Metadata getQuestionsByCountryCode(String countryCode) throws Exception {

MetadataConfigurationConverterApiModelToDomain
converter = new MetadataConfigurationConverterApiModelToDomain();
Expand Down Expand Up @@ -345,31 +344,34 @@ private class MetadataConfigurationConverterApiModelToDomain {


@NonNull
private List<Question> convertToDomainQuestionsFrom(
private Metadata convertToDomainQuestionsFrom(
@NonNull List<MetadataConfigurationsApi.Question> apiQuestions) {

List<Question> domainQuestions = new ArrayList<>();
Metadata metadata = new Metadata();

boolean isImportantQuestionSelected = false;
for (int questionIndex = 0; questionIndex < apiQuestions.size(); questionIndex++) {

MetadataConfigurationsApi.Question apiQuestion = apiQuestions.get(questionIndex);

Question domainQuestion = convertToDomainQuestionFrom(apiQuestion, questionIndex);

domainQuestions.add(domainQuestion);

mapDomainQuestionsByCode.put(domainQuestion.getCode(), domainQuestion);

if(!isImportantQuestionSelected) {
isImportantQuestionSelected = isImportantQuestion(domainQuestion);
}

metadata.addQuestion(domainQuestion, convertToDomainOptionsFrom(apiQuestion.options, apiQuestion));
}

setImportantDomainQuestion(domainQuestions, isImportantQuestionSelected);

assignRulesToQuestions();

return domainQuestions;
return metadata;
}

private void setImportantDomainQuestion(List<Question> domainQuestions,
Expand Down Expand Up @@ -554,7 +556,6 @@ private void addDomainRulesTo(Option domainOption,
domainOption.setRules(domainRules);
}


@NonNull
private Question convertToDomainQuestionFrom(
@NonNull MetadataConfigurationsApi.Question apiQuestion, int index) {
Expand All @@ -567,7 +568,6 @@ private Question convertToDomainQuestionFrom(
.index(index)
.type(convertToDomainQuestionTypeFrom(apiQuestion.output))
.visibility(getVisibilityFrom(apiQuestion))
.options(convertToDomainOptionsFrom(apiQuestion.options, apiQuestion))
.compulsory(apiQuestion.compulsory)
.rules(convertToDomainRules(apiQuestion.rules))
.regExp(apiQuestion.validationRegex)
Expand Down Expand Up @@ -746,7 +746,7 @@ private Option convertToDomainOptionFrom(
private Option.Attribute getDefaultAttribute() {
return Option.Attribute.newBuilder()
.id(1)
.backgroundColour("#FFFFFF")
.backgroundColour("FFFFFF")
.horizontalAlignment(Option.Attribute.HorizontalAlignment.NONE)
.verticalAlignment(Option.Attribute.VerticalAlignment.NONE)
.textSize(20).build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@

import android.support.annotation.NonNull;

import com.raizlabs.android.dbflow.annotation.NotNull;

import org.eyeseetea.malariacare.data.database.converts.CountryVersionConvertFromDomainVisitor;
import org.eyeseetea.malariacare.data.database.model.AnswerDB;
import org.eyeseetea.malariacare.data.database.model.CountryVersionDB;
Expand All @@ -18,9 +20,9 @@
import org.eyeseetea.malariacare.data.database.model.QuestionThresholdDB;
import org.eyeseetea.malariacare.data.database.model.SurveyDB;
import org.eyeseetea.malariacare.data.database.model.TabDB;
import org.eyeseetea.malariacare.data.remote.IMetadataConfigurationDataSource;
import org.eyeseetea.malariacare.data.sync.importer.IConvertDomainDBVisitor;
import org.eyeseetea.malariacare.domain.entity.Configuration;
import org.eyeseetea.malariacare.domain.entity.Option;
import org.eyeseetea.malariacare.domain.entity.Program;
import org.eyeseetea.malariacare.domain.entity.Question;
import org.eyeseetea.malariacare.domain.exception.WarningException;
Expand All @@ -34,6 +36,7 @@
public class MetadataConfigurationDBImporter {

private IConvertDomainDBVisitor<Question, QuestionDB> converter;
private IConvertDomainDBVisitor<Option, OptionDB> converterOptions;

private List<QuestionOptionDB> pendingOptionsWithRules = new ArrayList<>();
private List<QuestionThresholdDB> pendingThresholdWithRules = new ArrayList<>();
Expand All @@ -49,9 +52,11 @@ public class MetadataConfigurationDBImporter {

public MetadataConfigurationDBImporter(
@NonNull IMetadataConfigurationDataSource remoteDataSource,
@NonNull IConvertDomainDBVisitor<Question, QuestionDB> converter) throws Exception {
@NonNull IConvertDomainDBVisitor<Question, QuestionDB> converter,
@NonNull IConvertDomainDBVisitor<Option, OptionDB> converterOptions) throws Exception {
this.remoteDataSource = remoteDataSource;
this.converter = converter;
this.converterOptions = converterOptions;
countryVersions = new ArrayList<>();
needToDownloadMetadata = false;
}
Expand Down Expand Up @@ -166,14 +171,14 @@ private void processCountryData(Configuration.CountryVersion country) throws Exc

String countryUID = country.getUid();
int version = country.getVersion();
List<Question> questions = remoteDataSource.getQuestionsByCountryCode(country.getReference());
Metadata metadataByCountries = remoteDataSource.getQuestionsByCountryCode(country.getReference());

if (isCountryNotAlreadyAdded(countryUID)) {
updateMetadataFor(questions,country);
updateMetadataFor(metadataByCountries, country);

} else if (hasMetadataBeenUpdatedFor(countryUID, version)) {
deletePreviousMetadata();
updateMetadataFor(questions,country);
updateMetadataFor(metadataByCountries, country);
}
}

Expand All @@ -185,9 +190,55 @@ private boolean isCountryNotAlreadyAdded(String countryCode) {
return !CountryVersionDB.isCountryAlreadyAdded(countryCode);
}

private void updateMetadataFor(List<Question> questions ,Configuration.CountryVersion country) throws Exception {
private void updateMetadataFor(Metadata metadataByCountries, Configuration.CountryVersion country) throws Exception {
saveInDB(country);
saveQuestionsInDB(questions, country);

saveQuestionsInDB(metadataByCountries, country);
}

private List<OptionDB> saveOptions(Metadata metadata, Question question) {
List<OptionDB> optionDBS = new ArrayList<>();
List<OptionDB> options = getOptionDBsFrom(metadata, question.getCode());
for (OptionDB optionDB : options) {
optionDB.getOptionAttributeDB().save();
optionDB.save();
optionDBS.add(optionDB);
}
return optionDBS;
}


@NotNull
private List<OptionDB> getOptionDBsFrom(@NotNull Metadata metadata, String questionUId) {
List<OptionDB> optionDBS = new ArrayList<>();
List<Option> options = metadata.getOptions().get(questionUId);
if (options != null && options.size() > 0) {
for (Option domainOption : options) {
OptionDB newOptionDB = converterOptions.visit(domainOption);
optionDBS.add(newOptionDB);

if (domainOption.hasRules()) {

List<Option.Rule> domainRules = domainOption.getRules();
List<String> dbRules = convertTODBRulesFrom(domainRules);

newOptionDB.setMatchQuestionsCode(dbRules);

}

}
}
return optionDBS;
}

@NonNull
private List<String> convertTODBRulesFrom(@NonNull List<Option.Rule> domainRules) {
List<String> dbRules = new ArrayList<>();

for (Option.Rule domainRule : domainRules) {
dbRules.add(domainRule.getActionSubject().getCode());
}
return dbRules;
}

private void saveInDB(Configuration.CountryVersion domainCountry) {
Expand All @@ -196,12 +247,14 @@ private void saveInDB(Configuration.CountryVersion domainCountry) {
addProgramMetadata(domainCountry);
}

private void saveQuestionsInDB(List<Question> questions, Configuration.CountryVersion country) {

for (Question question : questions) {
private void saveQuestionsInDB(Metadata metadata, Configuration.CountryVersion country) {
for(Question question : metadata.getQuestions()) {
List<OptionDB> optionDBs = saveOptions(metadata, question);
QuestionDB questionDB = converter.visit(question);
setQuestionRelations(questionDB, country);
save(questionDB);

saveQuestion(question, optionDBs, questionDB);
save(optionDBs, questionDB);

mapQuestionsDBByCode.put(questionDB.getCode(), questionDB);

Expand All @@ -214,10 +267,23 @@ private void saveQuestionsInDB(List<Question> questions, Configuration.CountryVe
}
}
}

addingRulesToQuestion();
}

private void saveQuestion(Question question, List<OptionDB> optionDBs, QuestionDB questionDB) {
AnswerDB answerDB = createAnswer(question.getCode(), optionDBs);
questionDB.setAnswer(answerDB);
questionDB.save();
}

private AnswerDB createAnswer(String name, List<OptionDB> optionDbs) {
AnswerDB answerDB = new AnswerDB();
answerDB.setName(name);
answerDB.setOptionDBs(optionDbs);
answerDB.save();
return answerDB;
}

private void addThreshold(QuestionDB questionDB, Question.Rule rule,
Question.Rule.Condition condition,
Question.Rule.Operator operator) {
Expand Down Expand Up @@ -348,26 +414,11 @@ private QuestionRelationDB saveQuestionRelationDB(@NonNull QuestionDB questionMa
return questionRelationDB;
}

private void save(QuestionDB questionDB) {
AnswerDB answerDB = questionDB.getAnswerDB();
List<OptionDB> questionOptionDBS = answerDB.getOptionDBs();
answerDB.setName(questionDB.getCode());
answerDB.save();
questionDB.setAnswer(answerDB);
questionDB.save();

save(questionOptionDBS, questionDB);

}

private void save(List<OptionDB> questionOptionDBS, QuestionDB questionDB) {

AnswerDB answerDB = questionDB.getAnswerDB();

for (OptionDB optionDB : questionOptionDBS) {
optionDB.setAnswerDB(answerDB);
optionDB.setAnswerDB(questionDB.getAnswerDB());
optionDB.save();

if (optionDB.hasMatches()) {

QuestionOptionDB questionOptionDB = new QuestionOptionDB();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import android.support.annotation.NonNull;

import org.eyeseetea.malariacare.data.database.datasources.SettingsDataSource;
import org.eyeseetea.malariacare.data.remote.IMetadataConfigurationDataSource;
import org.eyeseetea.malariacare.domain.boundary.repositories.ISettingsRepository;
import org.eyeseetea.malariacare.domain.entity.Settings;
import org.eyeseetea.malariacare.network.factory.HTTPClientFactory;
Expand Down
Loading