public ITradingOffice createTradingOffice(IPlayer owner, ICity city, int value) { for (IBuilding building : city.getBuildings()) { if (building.getOwner()==owner && building instanceof ITradingOffice){ throw new IllegalStateException("The player may only obtain one trading office per city"); } } IStorage storage = createStorage(owner, city); IBalanceSheet lastWeek; IBalanceSheet thisWeek; ICity hometown = owner.getHometown(); if (hometown.equals(city)) { lastWeek = interactionFactory.createInitialBalanceSheet(city, owner); thisWeek = interactionFactory.createBalanceSheetFromPreviousWeek((BalanceSheet) lastWeek); } else { Optional<ITradingOffice> mainOffice = owner.findTradingOffice(hometown); Preconditions.checkArgument(mainOffice.isPresent(), "There has to be a trading office in the hometown"); lastWeek = mainOffice.get().getBalanceLastWeek(); thisWeek = mainOffice.get().getCurrentWeek(); } TradingOffice office = (TradingOffice) context.getBean("tradingOffice", new Object[]{owner, city, value, storage, lastWeek, thisWeek}); city.build(office); clientServerEventBus.post(new BuildingFinished(office, owner, city)); return office; } }