package org.magicdroid.model;
import org.magicdroid.commons.Injector;
import org.magicdroid.features.DetachFeature;
import org.magicdroid.features.IdentifyFeature;
import org.magicdroid.features.JsonFeature;
import org.magicdroid.features.MetaFeature;
import org.magicdroid.features.MetaIterableFeature;
import org.magicdroid.features.PropertyValueProvider;
import org.magicdroid.features.WorkingCopyFeature;
import org.magicdroid.model.impl.AccountServiceImpl;
import org.magicdroid.model.impl.CategoryServiceImpl;
import org.magicdroid.model.impl.ExpenseServiceImpl;
import org.magicdroid.model.impl.MagicdroidMetaModel;
import org.magicdroid.model.impl.PersonServiceImpl;
import org.magicdroid.model.impl.StandardStateFeature;
import org.magicdroid.serializer.MagicdroidJSONSerializer;
import org.magicdroid.serializer.MagicdroidSerializer;
import org.magicdroid.services.AccountService;
import org.magicdroid.services.CategoryService;
import org.magicdroid.services.ExpenseService;
import org.magicdroid.services.PersonService;
import org.magicdroid.services.UnitOfWork;
public abstract class AbstractMagicdroidEnvironment {
private AccountService accountService;
private ExpenseService expenseService;
private CategoryService categoryService;
private PersonService personService;
private UnitOfWork unitOfWorkService;
protected final Injector injector;
public AbstractMagicdroidEnvironment() {
injector = createInjector();
this.preSetup(injector);
this.setup(injector);
this.accountService = injector.create(AccountService.class);
this.expenseService = injector.create(ExpenseService.class);
this.categoryService = injector.create(CategoryService.class);
this.personService = injector.create(PersonService.class);
this.unitOfWorkService = injector.create(UnitOfWork.class);
}
protected Injector createInjector() {
return new Injector();
}
private void preSetup(Injector injector) {
injector
.bind(MetaModel.class, MagicdroidMetaModel.class)
.bind(Account.class, this.getStandardDomainObjectSpec())
.bind(Category.class, this.getStandardDomainObjectSpec())
.bind(Expense.class, this.getStandardDomainObjectSpec())
.bind(Person.class, this.getStandardDomainObjectSpec())
.bind(Account.AccountWC.class, this.getStandardWorkingCopySpec())
.bind(Category.CategoryWC.class, this.getStandardWorkingCopySpec())
.bind(Expense.ExpenseWC.class, this.getStandardWorkingCopySpec())
.bind(Person.PersonWC.class, this.getStandardWorkingCopySpec())
.bind(AccountService.class, AccountServiceImpl.class)
.bind(ExpenseService.class, ExpenseServiceImpl.class)
.bind(CategoryService.class, CategoryServiceImpl.class)
.bind(PersonService.class, PersonServiceImpl.class)
.bind(MagicdroidSerializer.class, MagicdroidJSONSerializer.class)
;
}
protected abstract void setup(Injector injector);
protected Class[] getStandardDomainObjectSpec() {
return new Class[] {
IdentifyFeature.IdConcern.class,
StandardStateFeature.StateConcern.class,
// DetachFeature.Mixin.class,
MetaFeature.MetaFeatureMixin.class,
MetaIterableFeature.Mixin.class,
PropertyValueProvider.Mixin.class,
JsonFeature.Mixin.class,
// Object.class
};
}
protected Class[] getStandardWorkingCopySpec() {
return new Class[] {
WorkingCopyFeature.WorkingCopyConcern.class,
IdentifyFeature.IdConcern.class,
StandardStateFeature.StateConcern.class,
WorkingCopyFeature.Mixin.class,
MetaFeature.MetaFeatureMixin.class,
PropertyValueProvider.Mixin.class,
JsonFeature.Mixin.class,
// Object.class
};
}
protected Class[] getNOPImplementation() {
return new Class[] {
};
}
public AccountService getAccountService() {
return accountService;
}
public CategoryService getCategoryService() {
return categoryService;
}
public PersonService getPersonService() {
return personService;
}
public ExpenseService getExpenseService() {
return expenseService;
}
public UnitOfWork getUnitOfWork() {
return unitOfWorkService;
}
public Injector getInjector() {
return injector;
}
}
|