summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKostya <mail@sartin.in>2026-08-13 16:24:24 +0000
committerKostya <mail@sartin.in>2026-08-13 16:24:24 +0000
commitae8486da5c542d6af9a2e0f9f7cc39729a055eee (patch)
tree2b8294ca875290bfbb6d4c32bfffa7d7373e7374
parent40fa8c52d2afc87c76b2d38566e9920120b2da3c (diff)
downloadguess-market-ae8486da5c542d6af9a2e0f9f7cc39729a055eee.tar.gz
guess-market-ae8486da5c542d6af9a2e0f9f7cc39729a055eee.tar.xz
guess-market-ae8486da5c542d6af9a2e0f9f7cc39729a055eee.zip
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.
-rw-r--r--api/src/main/java/market/guess/api/EventDetailDTO.java9
-rw-r--r--api/src/main/java/market/guess/api/GuessMarketContext.java22
-rw-r--r--api/src/main/java/market/guess/api/MarketStateDTO.java10
-rw-r--r--api/src/main/java/market/guess/api/OptionStateDTO.java3
-rw-r--r--api/src/main/java/market/guess/api/PurchaseReceiptDTO.java10
-rw-r--r--engine/src/main/java/market/guess/engine/provider/LocalGuessMarketContext.java69
-rw-r--r--service/.classpath31
-rw-r--r--service/.project29
-rw-r--r--service/src/main/java/market/guess/service/LocalGuessMarketContext.java62
9 files changed, 170 insertions, 75 deletions
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 @@
1package market.guess.api;
2
3import java.util.List;
4
5public record EventDetailDTO(
6 EventSummaryDTO summary,
7 MarketStateDTO state,
8 List<TradeRowDTO> history,
9 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 @@
1package market.guess.api; 1package market.guess.api;
2 2
3import java.nio.file.Path;
3import java.util.List; 4import java.util.List;
5import market.guess.exception.GuessMarketException;
4 6
5public interface GuessMarketContext { 7public interface GuessMarketContext {
6 LoadResultDTO LoadAsync(); 8 LoadResultDTO loadEvents(Path path);
7 9
8 void SaveChangesAsync(); 10 List<EventSummaryDTO> listEvents();
9 11
10 List<EventSummaryDTO> GetAllEventsAsync(); 12 boolean isLoaded();
11 13
12 void GetEventInfoByIdAsync(); 14 EventDetailDTO getEvent(String eventKey);
13 15
14 void CreateEventAsync(); 16 PurchaseReceiptDTO buyShares(String userName, String eventKey, String optionKey, long quantity)
17 throws GuessMarketException;
15 18
16 void UpdateEventAsync(); 19 EventDetailDTO closeEvent(String userName, String eventKey, String winningOptionKey)
20 throws GuessMarketException;
21
22 AccountDTO account(String userName);
23
24 void saveState(Path path) throws GuessMarketException;
25
26 LoadResultDTO restoreState(Path path);
17} 27}
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 @@
1package market.guess.api;
2
3import java.util.List;
4
5public record MarketStateDTO(
6 String eventKey,
7 MechanismType mechanism,
8 List<OptionStateDTO> options,
9 String accountBalance,
10 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 @@
1package market.guess.api;
2
3public 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 @@
1package market.guess.api;
2
3public record PurchaseReceiptDTO(
4 String eventKey,
5 String optionName,
6 long quantity,
7 String sharesCost,
8 String commission,
9 String totalPaid,
10 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 @@
1package market.guess.engine.provider;
2
3import jakarta.xml.bind.JAXBContext;
4import jakarta.xml.bind.Marshaller;
5import java.io.File;
6import java.util.List;
7import market.guess.api.EventSummaryDTO;
8import market.guess.api.GuessMarketContext;
9import market.guess.api.LoadResultDTO;
10import market.guess.api.ProblemDTO;
11import market.guess.engine.model.GuessMarket;
12
13public class LocalGuessMarketContext implements GuessMarketContext {
14 private GuessMarket context;
15
16 @Override
17 public LoadResultDTO LoadAsync() {
18 var file = new File("test-data/ex-1/multiple.xml");
19 try {
20 var ctx = JAXBContext.newInstance(GuessMarket.class);
21 var unmarshaller = ctx.createUnmarshaller();
22
23 context = (GuessMarket) unmarshaller.unmarshal(file);
24 return LoadResultDTO.success(file.getPath(), context.getGMEvents().getGMEvent().size());
25 } catch (Exception e) {
26 e.printStackTrace();
27 return LoadResultDTO.failure(
28 file.getPath(), List.of(new ProblemDTO("LOAD_FAILED", e.getMessage(), file.getPath())));
29 }
30 }
31
32 @Override
33 public void SaveChangesAsync() {
34 try {
35
36 var ctx = JAXBContext.newInstance(GuessMarket.class);
37 var marshaller = ctx.createMarshaller();
38 marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
39
40 var file = new File("test-data/ex-1/output.xml");
41 marshaller.marshal(context, file);
42 } catch (Exception ex) {
43 ex.printStackTrace();
44 }
45 }
46
47 @Override
48 public List<EventSummaryDTO> GetAllEventsAsync() {
49 throw new UnsupportedOperationException("Unimplemented method 'GetEventInfoByIdAsync'");
50 }
51
52 @Override
53 public void GetEventInfoByIdAsync() {
54 // TODO Auto-generated method stub
55 throw new UnsupportedOperationException("Unimplemented method 'GetEventInfoByIdAsync'");
56 }
57
58 @Override
59 public void CreateEventAsync() {
60 // TODO Auto-generated method stub
61 throw new UnsupportedOperationException("Unimplemented method 'CreateEventAsync'");
62 }
63
64 @Override
65 public void UpdateEventAsync() {
66 // TODO Auto-generated method stub
67 throw new UnsupportedOperationException("Unimplemented method 'UpdateEventAsync'");
68 }
69}
diff --git a/service/.classpath b/service/.classpath
new file mode 100644
index 0000000..b46be83
--- /dev/null
+++ b/service/.classpath
@@ -0,0 +1,31 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<classpath>
3 <classpathentry kind="src" output="bin/classes" path="src/main/java"/>
4 <classpathentry kind="src" output="bin/test-classes" path="src/test/java">
5 <attributes>
6 <attribute name="test" value="true"/>
7 </attributes>
8 </classpathentry>
9 <classpathentry kind="src" path="/guess-market-api">
10 <attributes>
11 <attribute name="module" value="true"/>
12 </attributes>
13 </classpathentry>
14 <classpathentry kind="lib" path="../lib/jaxb/angus-activation.jar"/>
15 <classpathentry kind="lib" path="../lib/jaxb/jakarta.activation-api.jar"/>
16 <classpathentry kind="lib" path="../lib/jaxb/jaxb-core.jar"/>
17 <classpathentry kind="lib" path="../lib/jaxb/jaxb-impl.jar"/>
18 <classpathentry kind="lib" path="../lib/jaxb/jaxb-xjc.jar"/>
19 <classpathentry kind="lib" path="../lib/jaxb/jakarta.xml.bind-api.jar"/>
20 <classpathentry kind="lib" path="../lib/jaxb/jaxb-jxc.jar"/>
21 <classpathentry kind="lib" path="../lib/gson/gson-2.11.0.jar" sourcepath="../lib/gson/gson-2.11.0-sources.jar"/>
22 <classpathentry kind="lib" path="../lib/junit/junit-platform-console-standalone-6.1.1.jar"/>
23 <classpathentry kind="lib" path="../lib/mockito/mockito-core-5.23.0.jar"/>
24 <classpathentry kind="lib" path="../lib/mockito/byte-buddy-1.17.7.jar"/>
25 <classpathentry kind="lib" path="../lib/mockito/byte-buddy-agent-1.17.7.jar"/>
26 <classpathentry kind="lib" path="../lib/mockito/objenesis-3.3.jar"/>
27 <classpathentry kind="lib" path="../lib/mockito/mockito-junit-jupiter-5.23.0.jar"/>
28 <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
29 <classpathentry kind="output" path="bin"/>
30</classpath>
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 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<projectDescription>
3 <name>guess-market-service</name>
4 <comment></comment>
5 <projects>
6 <project>guess-market-api</project>
7 </projects>
8 <buildSpec>
9 <buildCommand>
10 <name>org.eclipse.jdt.core.javabuilder</name>
11 <arguments></arguments>
12 </buildCommand>
13 </buildSpec>
14 <natures>
15 <nature>org.eclipse.jdt.core.javanature</nature>
16 </natures>
17 <filteredResources>
18 <filter>
19 <id>1784965956299</id>
20 <name></name>
21 <type>30</type>
22 <matcher>
23 <id>org.eclipse.core.resources.regexFilterMatcher</id>
24 <arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
25 </matcher>
26 </filter>
27 </filteredResources>
28</projectDescription>
29
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 @@
1package market.guess.service;
2
3import java.nio.file.Path;
4import java.util.List;
5import market.guess.api.AccountDTO;
6import market.guess.api.EventDetailDTO;
7import market.guess.api.EventSummaryDTO;
8import market.guess.api.GuessMarketContext;
9import market.guess.api.LoadResultDTO;
10import market.guess.api.PurchaseReceiptDTO;
11import market.guess.exception.GuessMarketException;
12
13public final class LocalGuessMarketContext implements GuessMarketContext {
14
15 @Override
16 public LoadResultDTO loadEvents(Path path) {
17 throw new UnsupportedOperationException("Unimplemented method 'loadEvents'");
18 }
19
20 @Override
21 public List<EventSummaryDTO> listEvents() {
22 throw new UnsupportedOperationException("Unimplemented method 'listEvents'");
23 }
24
25 @Override
26 public boolean isLoaded() {
27 throw new UnsupportedOperationException("Unimplemented method 'isLoaded'");
28 }
29
30 @Override
31 public EventDetailDTO getEvent(String eventKey) {
32 throw new UnsupportedOperationException("Unimplemented method 'getEvent'");
33 }
34
35 @Override
36 public PurchaseReceiptDTO buyShares(
37 String userName, String eventKey, String optionKey, long quantity)
38 throws GuessMarketException {
39 throw new UnsupportedOperationException("Unimplemented method 'buyShares'");
40 }
41
42 @Override
43 public EventDetailDTO closeEvent(String userName, String eventKey, String winningOptionKey)
44 throws GuessMarketException {
45 throw new UnsupportedOperationException("Unimplemented method 'closeEvent'");
46 }
47
48 @Override
49 public AccountDTO account(String userName) {
50 throw new UnsupportedOperationException("Unimplemented method 'account'");
51 }
52
53 @Override
54 public void saveState(Path path) throws GuessMarketException {
55 throw new UnsupportedOperationException("Unimplemented method 'saveState'");
56 }
57
58 @Override
59 public LoadResultDTO restoreState(Path path) {
60 throw new UnsupportedOperationException("Unimplemented method 'restoreState'");
61 }
62}