From ae8486da5c542d6af9a2e0f9f7cc39729a055eee Mon Sep 17 00:00:00 2001 From: Kostya Date: Thu, 13 Aug 2026 16:24:24 +0000 Subject: Add service module with stubbed LocalGuessMarketContext GuessMarketContext gained a richer surface (loadEvents/listEvents/ buyShares/closeEvent/account/save-restoreState) backed by new EventDetailDTO, MarketStateDTO, OptionStateDTO and PurchaseReceiptDTO. The old engine-module provider implemented the previous shape and is removed; market.guess.service.LocalGuessMarketContext replaces it as a stub, each method throwing UnsupportedOperationException pending a real implementation. --- .../main/java/market/guess/api/EventDetailDTO.java | 9 +++ .../java/market/guess/api/GuessMarketContext.java | 22 +++++-- .../main/java/market/guess/api/MarketStateDTO.java | 10 ++++ .../main/java/market/guess/api/OptionStateDTO.java | 3 + .../java/market/guess/api/PurchaseReceiptDTO.java | 10 ++++ .../engine/provider/LocalGuessMarketContext.java | 69 ---------------------- service/.classpath | 31 ++++++++++ service/.project | 29 +++++++++ .../guess/service/LocalGuessMarketContext.java | 62 +++++++++++++++++++ 9 files changed, 170 insertions(+), 75 deletions(-) create mode 100644 api/src/main/java/market/guess/api/EventDetailDTO.java create mode 100644 api/src/main/java/market/guess/api/MarketStateDTO.java create mode 100644 api/src/main/java/market/guess/api/OptionStateDTO.java create mode 100644 api/src/main/java/market/guess/api/PurchaseReceiptDTO.java delete mode 100644 engine/src/main/java/market/guess/engine/provider/LocalGuessMarketContext.java create mode 100644 service/.classpath create mode 100644 service/.project create mode 100644 service/src/main/java/market/guess/service/LocalGuessMarketContext.java diff --git a/api/src/main/java/market/guess/api/EventDetailDTO.java b/api/src/main/java/market/guess/api/EventDetailDTO.java new file mode 100644 index 0000000..893f153 --- /dev/null +++ b/api/src/main/java/market/guess/api/EventDetailDTO.java @@ -0,0 +1,9 @@ +package market.guess.api; + +import java.util.List; + +public record EventDetailDTO( + EventSummaryDTO summary, + MarketStateDTO state, + List history, + String winningOption) {} diff --git a/api/src/main/java/market/guess/api/GuessMarketContext.java b/api/src/main/java/market/guess/api/GuessMarketContext.java index d3954cd..f010e1c 100644 --- a/api/src/main/java/market/guess/api/GuessMarketContext.java +++ b/api/src/main/java/market/guess/api/GuessMarketContext.java @@ -1,17 +1,27 @@ package market.guess.api; +import java.nio.file.Path; import java.util.List; +import market.guess.exception.GuessMarketException; public interface GuessMarketContext { - LoadResultDTO LoadAsync(); + LoadResultDTO loadEvents(Path path); - void SaveChangesAsync(); + List listEvents(); - List GetAllEventsAsync(); + boolean isLoaded(); - void GetEventInfoByIdAsync(); + EventDetailDTO getEvent(String eventKey); - void CreateEventAsync(); + PurchaseReceiptDTO buyShares(String userName, String eventKey, String optionKey, long quantity) + throws GuessMarketException; - void UpdateEventAsync(); + EventDetailDTO closeEvent(String userName, String eventKey, String winningOptionKey) + throws GuessMarketException; + + AccountDTO account(String userName); + + void saveState(Path path) throws GuessMarketException; + + LoadResultDTO restoreState(Path path); } diff --git a/api/src/main/java/market/guess/api/MarketStateDTO.java b/api/src/main/java/market/guess/api/MarketStateDTO.java new file mode 100644 index 0000000..f49b2aa --- /dev/null +++ b/api/src/main/java/market/guess/api/MarketStateDTO.java @@ -0,0 +1,10 @@ +package market.guess.api; + +import java.util.List; + +public record MarketStateDTO( + String eventKey, + MechanismType mechanism, + List options, + String accountBalance, + String commissionCollected) {} diff --git a/api/src/main/java/market/guess/api/OptionStateDTO.java b/api/src/main/java/market/guess/api/OptionStateDTO.java new file mode 100644 index 0000000..c002fdd --- /dev/null +++ b/api/src/main/java/market/guess/api/OptionStateDTO.java @@ -0,0 +1,3 @@ +package market.guess.api; + +public record OptionStateDTO(String optionKey, String name, String price, long sharesOutstanding) {} diff --git a/api/src/main/java/market/guess/api/PurchaseReceiptDTO.java b/api/src/main/java/market/guess/api/PurchaseReceiptDTO.java new file mode 100644 index 0000000..bd5b2f7 --- /dev/null +++ b/api/src/main/java/market/guess/api/PurchaseReceiptDTO.java @@ -0,0 +1,10 @@ +package market.guess.api; + +public record PurchaseReceiptDTO( + String eventKey, + String optionName, + long quantity, + String sharesCost, + String commission, + String totalPaid, + MarketStateDTO stateAfter) {} diff --git a/engine/src/main/java/market/guess/engine/provider/LocalGuessMarketContext.java b/engine/src/main/java/market/guess/engine/provider/LocalGuessMarketContext.java deleted file mode 100644 index 000e2a7..0000000 --- a/engine/src/main/java/market/guess/engine/provider/LocalGuessMarketContext.java +++ /dev/null @@ -1,69 +0,0 @@ -package market.guess.engine.provider; - -import jakarta.xml.bind.JAXBContext; -import jakarta.xml.bind.Marshaller; -import java.io.File; -import java.util.List; -import market.guess.api.EventSummaryDTO; -import market.guess.api.GuessMarketContext; -import market.guess.api.LoadResultDTO; -import market.guess.api.ProblemDTO; -import market.guess.engine.model.GuessMarket; - -public class LocalGuessMarketContext implements GuessMarketContext { - private GuessMarket context; - - @Override - public LoadResultDTO LoadAsync() { - var file = new File("test-data/ex-1/multiple.xml"); - try { - var ctx = JAXBContext.newInstance(GuessMarket.class); - var unmarshaller = ctx.createUnmarshaller(); - - context = (GuessMarket) unmarshaller.unmarshal(file); - return LoadResultDTO.success(file.getPath(), context.getGMEvents().getGMEvent().size()); - } catch (Exception e) { - e.printStackTrace(); - return LoadResultDTO.failure( - file.getPath(), List.of(new ProblemDTO("LOAD_FAILED", e.getMessage(), file.getPath()))); - } - } - - @Override - public void SaveChangesAsync() { - try { - - var ctx = JAXBContext.newInstance(GuessMarket.class); - var marshaller = ctx.createMarshaller(); - marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); - - var file = new File("test-data/ex-1/output.xml"); - marshaller.marshal(context, file); - } catch (Exception ex) { - ex.printStackTrace(); - } - } - - @Override - public List GetAllEventsAsync() { - throw new UnsupportedOperationException("Unimplemented method 'GetEventInfoByIdAsync'"); - } - - @Override - public void GetEventInfoByIdAsync() { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'GetEventInfoByIdAsync'"); - } - - @Override - public void CreateEventAsync() { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'CreateEventAsync'"); - } - - @Override - public void UpdateEventAsync() { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'UpdateEventAsync'"); - } -} diff --git a/service/.classpath b/service/.classpath new file mode 100644 index 0000000..b46be83 --- /dev/null +++ b/service/.classpath @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/service/.project b/service/.project new file mode 100644 index 0000000..25a42b3 --- /dev/null +++ b/service/.project @@ -0,0 +1,29 @@ + + + guess-market-service + + + guess-market-api + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.jdt.core.javanature + + + + 1784965956299 + + 30 + + org.eclipse.core.resources.regexFilterMatcher + node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ + + + + + diff --git a/service/src/main/java/market/guess/service/LocalGuessMarketContext.java b/service/src/main/java/market/guess/service/LocalGuessMarketContext.java new file mode 100644 index 0000000..cabb6ac --- /dev/null +++ b/service/src/main/java/market/guess/service/LocalGuessMarketContext.java @@ -0,0 +1,62 @@ +package market.guess.service; + +import java.nio.file.Path; +import java.util.List; +import market.guess.api.AccountDTO; +import market.guess.api.EventDetailDTO; +import market.guess.api.EventSummaryDTO; +import market.guess.api.GuessMarketContext; +import market.guess.api.LoadResultDTO; +import market.guess.api.PurchaseReceiptDTO; +import market.guess.exception.GuessMarketException; + +public final class LocalGuessMarketContext implements GuessMarketContext { + + @Override + public LoadResultDTO loadEvents(Path path) { + throw new UnsupportedOperationException("Unimplemented method 'loadEvents'"); + } + + @Override + public List listEvents() { + throw new UnsupportedOperationException("Unimplemented method 'listEvents'"); + } + + @Override + public boolean isLoaded() { + throw new UnsupportedOperationException("Unimplemented method 'isLoaded'"); + } + + @Override + public EventDetailDTO getEvent(String eventKey) { + throw new UnsupportedOperationException("Unimplemented method 'getEvent'"); + } + + @Override + public PurchaseReceiptDTO buyShares( + String userName, String eventKey, String optionKey, long quantity) + throws GuessMarketException { + throw new UnsupportedOperationException("Unimplemented method 'buyShares'"); + } + + @Override + public EventDetailDTO closeEvent(String userName, String eventKey, String winningOptionKey) + throws GuessMarketException { + throw new UnsupportedOperationException("Unimplemented method 'closeEvent'"); + } + + @Override + public AccountDTO account(String userName) { + throw new UnsupportedOperationException("Unimplemented method 'account'"); + } + + @Override + public void saveState(Path path) throws GuessMarketException { + throw new UnsupportedOperationException("Unimplemented method 'saveState'"); + } + + @Override + public LoadResultDTO restoreState(Path path) { + throw new UnsupportedOperationException("Unimplemented method 'restoreState'"); + } +} -- cgit v1.2.3