package market.guess.ui.desktop; import java.time.Clock; import market.guess.api.AccountContext; import market.guess.api.CatalogContext; import market.guess.api.GuessMarketContext; import market.guess.service.LocalGuessMarketContext; import market.guess.service.catalog.LocalCatalogContext; import market.guess.service.catalog.infrastructure.MarketContext; import market.guess.service.catalog.infrastructure.mapper.v2.EventMapperV2; import market.guess.service.catalog.infrastructure.provider.Loader; import market.guess.service.catalog.infrastructure.provider.v2.XMLLoaderV2; import market.guess.service.catalog.infrastructure.provider.v2.XMLValidatorV2; import market.guess.service.catalog.infrastructure.repository.EventRepository; import market.guess.service.catalog.infrastructure.repository.InMemoryEventRepository; import market.guess.service.catalog.infrastructure.repository.InMemoryUserRepository; import market.guess.service.catalog.infrastructure.repository.UserRepository; import market.guess.service.fulfillment.FulfillmentContext; import market.guess.service.fulfillment.LocalFulfillmentContext; import market.guess.service.ledger.LedgerContext; import market.guess.service.ledger.LocalAccountContext; import market.guess.service.matching.LocalMatchingEngine; import market.guess.service.matching.MatchingEngine; import market.guess.service.risk.LocalRiskEngine; import market.guess.service.risk.RiskEngine; import market.guess.service.settlement.LocalSettlementContext; import market.guess.service.settlement.SettlementContext; public final class ServiceEngine { private final CatalogContext catalogContext; private final GuessMarketContext marketContext; private final AccountContext accountContext; public ServiceEngine() { this(Clock.systemUTC()); } public ServiceEngine(Clock clock) { EventRepository eventRepo = new InMemoryEventRepository(); UserRepository userRepo = new InMemoryUserRepository(); MarketContext marketContextInfrastructure = new MarketContext(eventRepo, userRepo); EventMapperV2 mapper = new EventMapperV2(); XMLValidatorV2 validator = new XMLValidatorV2(); Loader loader = new XMLLoaderV2(eventRepo, userRepo, mapper, validator); this.catalogContext = new LocalCatalogContext(loader, marketContextInfrastructure, eventRepo); this.accountContext = new LocalAccountContext(userRepo); LedgerContext ledgerContext = new LedgerContext(userRepo, clock); RiskEngine risk = new LocalRiskEngine(eventRepo); MatchingEngine matching = new LocalMatchingEngine(clock); FulfillmentContext fulfillment = new LocalFulfillmentContext(ledgerContext); SettlementContext settlement = new LocalSettlementContext(ledgerContext); this.marketContext = new LocalGuessMarketContext( marketContextInfrastructure, risk, matching, fulfillment, settlement); } public CatalogContext getCatalogContext() { return catalogContext; } public GuessMarketContext getMarketContext() { return marketContext; } public AccountContext getAccountContext() { return accountContext; } }