diff options
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 @@ | |||
| 1 | package market.guess.api; | ||
| 2 | |||
| 3 | import java.util.List; | ||
| 4 | |||
| 5 | public 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 @@ | |||
| 1 | package market.guess.api; | 1 | package market.guess.api; |
| 2 | 2 | ||
| 3 | import java.nio.file.Path; | ||
| 3 | import java.util.List; | 4 | import java.util.List; |
| 5 | import market.guess.exception.GuessMarketException; | ||
| 4 | 6 | ||
| 5 | public interface GuessMarketContext { | 7 | public 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 @@ | |||
| 1 | package market.guess.api; | ||
| 2 | |||
| 3 | import java.util.List; | ||
| 4 | |||
| 5 | public 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 @@ | |||
| 1 | package market.guess.api; | ||
| 2 | |||
| 3 | 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 @@ | |||
| 1 | package market.guess.api; | ||
| 2 | |||
| 3 | public 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 @@ | |||
| 1 | package market.guess.engine.provider; | ||
| 2 | |||
| 3 | import jakarta.xml.bind.JAXBContext; | ||
| 4 | import jakarta.xml.bind.Marshaller; | ||
| 5 | import java.io.File; | ||
| 6 | import java.util.List; | ||
| 7 | import market.guess.api.EventSummaryDTO; | ||
| 8 | import market.guess.api.GuessMarketContext; | ||
| 9 | import market.guess.api.LoadResultDTO; | ||
| 10 | import market.guess.api.ProblemDTO; | ||
| 11 | import market.guess.engine.model.GuessMarket; | ||
| 12 | |||
| 13 | public 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 @@ | |||
| 1 | package market.guess.service; | ||
| 2 | |||
| 3 | import java.nio.file.Path; | ||
| 4 | import java.util.List; | ||
| 5 | import market.guess.api.AccountDTO; | ||
| 6 | import market.guess.api.EventDetailDTO; | ||
| 7 | import market.guess.api.EventSummaryDTO; | ||
| 8 | import market.guess.api.GuessMarketContext; | ||
| 9 | import market.guess.api.LoadResultDTO; | ||
| 10 | import market.guess.api.PurchaseReceiptDTO; | ||
| 11 | import market.guess.exception.GuessMarketException; | ||
| 12 | |||
| 13 | public 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 | } | ||