aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKostya <mail@sartin.in>2026-08-23 14:05:29 +0000
committerKostya <mail@sartin.in>2026-08-23 14:05:29 +0000
commit843820ea9f357220d69f3795f3289ee41eed355c (patch)
tree57323a2e1cd4d4c0addd57eadc31d0f36c612e96
parentfbfd2e275e9d645e4ec8a1874bc57d98b1c38300 (diff)
downloadguess-market-843820ea9f357220d69f3795f3289ee41eed355c.tar.gz
guess-market-843820ea9f357220d69f3795f3289ee41eed355c.tar.xz
guess-market-843820ea9f357220d69f3795f3289ee41eed355c.zip
model: relocate market DTOs out of the flat api package
Move AccountDTO/MarketDTO/MarketStateDTO/PurchaseReceiptDTO/TradeRowDTO out of the catch-all api package into model.market (and LedgerDTO into model.ledger), matching the existing model.event convention so DTOs live next to the domain they describe rather than in the interface package. Relocate LedgerMapper from mapper.v2 to infrastructure.adapter to match the module's established package layout, and update all call sites and imports accordingly. Also register the ui-desktop module in the build tooling: add it to MODULES, add openjfx to the shipped runtime libs, and generalize package.sh so each executable module (ui-console, ui-desktop) gets its own Main-Class/Class-Path manifest and run script instead of special-casing ui-console. Fold long Class-Path manifest lines at 72 bytes per the JAR spec, since adding ui-desktop's dependencies pushed the line past the limit.
-rw-r--r--api/src/main/java/market/guess/api/GuessMarketContext.java1
-rw-r--r--api/src/main/java/market/guess/model/event/EventDetailDTO.java4
-rw-r--r--api/src/main/java/market/guess/model/ledger/LedgerDTO.java (renamed from api/src/main/java/market/guess/api/AccountDTO.java)5
-rw-r--r--api/src/main/java/market/guess/model/market/MarketDTO.java (renamed from api/src/main/java/market/guess/api/MarketDTO.java)2
-rw-r--r--api/src/main/java/market/guess/model/market/MarketStateDTO.java (renamed from api/src/main/java/market/guess/api/MarketStateDTO.java)2
-rw-r--r--api/src/main/java/market/guess/model/market/PurchaseReceiptDTO.java (renamed from api/src/main/java/market/guess/api/PurchaseReceiptDTO.java)2
-rw-r--r--api/src/main/java/market/guess/model/market/TradeRowDTO.java (renamed from api/src/main/java/market/guess/api/TradeRowDTO.java)2
-rw-r--r--service/src/main/java/market/guess/service/LocalGuessMarketContext.java4
-rw-r--r--service/src/main/java/market/guess/service/catalog/infrastructure/adapter/LedgerMapper.java10
-rw-r--r--service/src/main/java/market/guess/service/catalog/infrastructure/mapper/v2/LedgerMapper.java11
-rw-r--r--service/src/main/java/market/guess/service/domain/Event.java6
-rw-r--r--service/src/main/java/market/guess/service/domain/Market.java2
-rw-r--r--service/src/test/java/market/guess/service/catalog/infrastructure/adapter/LedgerMapperTest.java (renamed from service/src/test/java/market/guess/service/catalog/infrastructure/mapper/v2/LedgerMapperTest.java)36
-rw-r--r--tools/_util.sh27
-rw-r--r--tools/package.sh75
-rw-r--r--ui-console/src/main/java/market/guess/ui/console/io/InputProcessor.java7
16 files changed, 118 insertions, 78 deletions
diff --git a/api/src/main/java/market/guess/api/GuessMarketContext.java b/api/src/main/java/market/guess/api/GuessMarketContext.java
index e11defb..4edb437 100644
--- a/api/src/main/java/market/guess/api/GuessMarketContext.java
+++ b/api/src/main/java/market/guess/api/GuessMarketContext.java
@@ -2,6 +2,7 @@ package market.guess.api;
2 2
3import java.math.BigDecimal; 3import java.math.BigDecimal;
4import market.guess.model.event.EventDetailDTO; 4import market.guess.model.event.EventDetailDTO;
5import market.guess.model.market.PurchaseReceiptDTO;
5 6
6public interface GuessMarketContext { 7public interface GuessMarketContext {
7 Result<PurchaseReceiptDTO> placeOrder( 8 Result<PurchaseReceiptDTO> placeOrder(
diff --git a/api/src/main/java/market/guess/model/event/EventDetailDTO.java b/api/src/main/java/market/guess/model/event/EventDetailDTO.java
index 9f59b53..f5c4edf 100644
--- a/api/src/main/java/market/guess/model/event/EventDetailDTO.java
+++ b/api/src/main/java/market/guess/model/event/EventDetailDTO.java
@@ -1,8 +1,8 @@
1package market.guess.model.event; 1package market.guess.model.event;
2 2
3import java.util.List; 3import java.util.List;
4import market.guess.api.MarketStateDTO; 4import market.guess.model.market.MarketStateDTO;
5import market.guess.api.TradeRowDTO; 5import market.guess.model.market.TradeRowDTO;
6 6
7public record EventDetailDTO( 7public record EventDetailDTO(
8 EventSummaryDTO summary, 8 EventSummaryDTO summary,
diff --git a/api/src/main/java/market/guess/api/AccountDTO.java b/api/src/main/java/market/guess/model/ledger/LedgerDTO.java
index 134c88b..d527c12 100644
--- a/api/src/main/java/market/guess/api/AccountDTO.java
+++ b/api/src/main/java/market/guess/model/ledger/LedgerDTO.java
@@ -1,7 +1,6 @@
1package market.guess.api; 1package market.guess.model.ledger;
2 2
3import java.util.List; 3import java.util.List;
4import market.guess.model.ledger.LedgerEntryDTO;
5 4
6public record AccountDTO( 5public record LedgerDTO(
7 String owner, String balance, boolean blocked, List<LedgerEntryDTO> entries) {} 6 String owner, String balance, boolean blocked, List<LedgerEntryDTO> entries) {}
diff --git a/api/src/main/java/market/guess/api/MarketDTO.java b/api/src/main/java/market/guess/model/market/MarketDTO.java
index b7c48a2..6b31375 100644
--- a/api/src/main/java/market/guess/api/MarketDTO.java
+++ b/api/src/main/java/market/guess/model/market/MarketDTO.java
@@ -1,3 +1,3 @@
1package market.guess.api; 1package market.guess.model.market;
2 2
3public record MarketDTO(String key, String name, String price, String volume) {} 3public record MarketDTO(String key, String name, String price, String volume) {}
diff --git a/api/src/main/java/market/guess/api/MarketStateDTO.java b/api/src/main/java/market/guess/model/market/MarketStateDTO.java
index da2fff0..3e9b967 100644
--- a/api/src/main/java/market/guess/api/MarketStateDTO.java
+++ b/api/src/main/java/market/guess/model/market/MarketStateDTO.java
@@ -1,4 +1,4 @@
1package market.guess.api; 1package market.guess.model.market;
2 2
3import java.util.List; 3import java.util.List;
4import market.guess.model.event.MechanismType; 4import market.guess.model.event.MechanismType;
diff --git a/api/src/main/java/market/guess/api/PurchaseReceiptDTO.java b/api/src/main/java/market/guess/model/market/PurchaseReceiptDTO.java
index 02e8007..0341542 100644
--- a/api/src/main/java/market/guess/api/PurchaseReceiptDTO.java
+++ b/api/src/main/java/market/guess/model/market/PurchaseReceiptDTO.java
@@ -1,4 +1,4 @@
1package market.guess.api; 1package market.guess.model.market;
2 2
3import java.util.List; 3import java.util.List;
4 4
diff --git a/api/src/main/java/market/guess/api/TradeRowDTO.java b/api/src/main/java/market/guess/model/market/TradeRowDTO.java
index 68d159a..d3053b3 100644
--- a/api/src/main/java/market/guess/api/TradeRowDTO.java
+++ b/api/src/main/java/market/guess/model/market/TradeRowDTO.java
@@ -1,4 +1,4 @@
1package market.guess.api; 1package market.guess.model.market;
2 2
3public record TradeRowDTO( 3public record TradeRowDTO(
4 String at, String userName, String optionName, String quantity, String pricePaid) {} 4 String at, String userName, String optionName, String quantity, String pricePaid) {}
diff --git a/service/src/main/java/market/guess/service/LocalGuessMarketContext.java b/service/src/main/java/market/guess/service/LocalGuessMarketContext.java
index f04324b..c85dadf 100644
--- a/service/src/main/java/market/guess/service/LocalGuessMarketContext.java
+++ b/service/src/main/java/market/guess/service/LocalGuessMarketContext.java
@@ -3,10 +3,10 @@ package market.guess.service;
3import java.math.BigDecimal; 3import java.math.BigDecimal;
4import java.time.Instant; 4import java.time.Instant;
5import market.guess.api.GuessMarketContext; 5import market.guess.api.GuessMarketContext;
6import market.guess.api.PurchaseReceiptDTO;
7import market.guess.api.Result; 6import market.guess.api.Result;
8import market.guess.api.TradeRowDTO;
9import market.guess.model.event.EventDetailDTO; 7import market.guess.model.event.EventDetailDTO;
8import market.guess.model.market.PurchaseReceiptDTO;
9import market.guess.model.market.TradeRowDTO;
10import market.guess.service.catalog.infrastructure.MarketContext; 10import market.guess.service.catalog.infrastructure.MarketContext;
11import market.guess.service.domain.Order; 11import market.guess.service.domain.Order;
12import market.guess.service.fulfillment.FulfillmentContext; 12import market.guess.service.fulfillment.FulfillmentContext;
diff --git a/service/src/main/java/market/guess/service/catalog/infrastructure/adapter/LedgerMapper.java b/service/src/main/java/market/guess/service/catalog/infrastructure/adapter/LedgerMapper.java
new file mode 100644
index 0000000..5a46540
--- /dev/null
+++ b/service/src/main/java/market/guess/service/catalog/infrastructure/adapter/LedgerMapper.java
@@ -0,0 +1,10 @@
1package market.guess.service.catalog.infrastructure.adapter;
2
3import market.guess.model.ledger.LedgerDTO;
4import market.guess.service.ledger.Ledger;
5import org.mapstruct.Mapper;
6
7@Mapper
8public interface LedgerMapper {
9 LedgerDTO ledgerToLedgerDTO(Ledger ledger);
10}
diff --git a/service/src/main/java/market/guess/service/catalog/infrastructure/mapper/v2/LedgerMapper.java b/service/src/main/java/market/guess/service/catalog/infrastructure/mapper/v2/LedgerMapper.java
deleted file mode 100644
index fe0ea38..0000000
--- a/service/src/main/java/market/guess/service/catalog/infrastructure/mapper/v2/LedgerMapper.java
+++ /dev/null
@@ -1,11 +0,0 @@
1package market.guess.service.catalog.infrastructure.mapper.v2;
2
3import market.guess.api.AccountDTO;
4import market.guess.service.ledger.Ledger;
5import org.mapstruct.Mapper;
6
7@Mapper
8public interface LedgerMapper {
9
10 AccountDTO ledgerToLedgerDTO(Ledger account);
11}
diff --git a/service/src/main/java/market/guess/service/domain/Event.java b/service/src/main/java/market/guess/service/domain/Event.java
index 1e17457..4517a4e 100644
--- a/service/src/main/java/market/guess/service/domain/Event.java
+++ b/service/src/main/java/market/guess/service/domain/Event.java
@@ -4,13 +4,13 @@ import java.math.BigDecimal;
4import java.time.Instant; 4import java.time.Instant;
5import java.util.ArrayList; 5import java.util.ArrayList;
6import java.util.List; 6import java.util.List;
7import market.guess.api.MarketDTO;
8import market.guess.api.MarketStateDTO;
9import market.guess.api.TradeRowDTO;
10import market.guess.model.event.CommissionTiming; 7import market.guess.model.event.CommissionTiming;
11import market.guess.model.event.EventStatus; 8import market.guess.model.event.EventStatus;
12import market.guess.model.event.EventSummaryDTO; 9import market.guess.model.event.EventSummaryDTO;
13import market.guess.model.ledger.LedgerType; 10import market.guess.model.ledger.LedgerType;
11import market.guess.model.market.MarketDTO;
12import market.guess.model.market.MarketStateDTO;
13import market.guess.model.market.TradeRowDTO;
14import market.guess.service.helpers.BigDecimalOptions; 14import market.guess.service.helpers.BigDecimalOptions;
15import market.guess.service.helpers.InstantOptions; 15import market.guess.service.helpers.InstantOptions;
16import market.guess.service.ledger.Ledger; 16import market.guess.service.ledger.Ledger;
diff --git a/service/src/main/java/market/guess/service/domain/Market.java b/service/src/main/java/market/guess/service/domain/Market.java
index 3ff7e2d..c5960e3 100644
--- a/service/src/main/java/market/guess/service/domain/Market.java
+++ b/service/src/main/java/market/guess/service/domain/Market.java
@@ -1,7 +1,7 @@
1package market.guess.service.domain; 1package market.guess.service.domain;
2 2
3import java.math.BigDecimal; 3import java.math.BigDecimal;
4import market.guess.api.MarketDTO; 4import market.guess.model.market.MarketDTO;
5 5
6public final class Market { 6public final class Market {
7 private final String key; 7 private final String key;
diff --git a/service/src/test/java/market/guess/service/catalog/infrastructure/mapper/v2/LedgerMapperTest.java b/service/src/test/java/market/guess/service/catalog/infrastructure/adapter/LedgerMapperTest.java
index 9e00411..976442c 100644
--- a/service/src/test/java/market/guess/service/catalog/infrastructure/mapper/v2/LedgerMapperTest.java
+++ b/service/src/test/java/market/guess/service/catalog/infrastructure/adapter/LedgerMapperTest.java
@@ -1,4 +1,4 @@
1package market.guess.service.catalog.infrastructure.mapper.v2; 1package market.guess.service.catalog.infrastructure.adapter;
2 2
3import static org.junit.Assert.assertEquals; 3import static org.junit.Assert.assertEquals;
4import static org.junit.Assert.assertFalse; 4import static org.junit.Assert.assertFalse;
@@ -8,7 +8,7 @@ import static org.junit.Assert.assertTrue;
8import java.math.BigDecimal; 8import java.math.BigDecimal;
9import java.time.Instant; 9import java.time.Instant;
10import java.util.List; 10import java.util.List;
11import market.guess.api.AccountDTO; 11import market.guess.model.ledger.LedgerDTO;
12import market.guess.model.ledger.LedgerEntryDTO; 12import market.guess.model.ledger.LedgerEntryDTO;
13import market.guess.model.ledger.LedgerType; 13import market.guess.model.ledger.LedgerType;
14import market.guess.service.ledger.Ledger; 14import market.guess.service.ledger.Ledger;
@@ -29,7 +29,7 @@ public class LedgerMapperTest {
29 public void mapsOwnerAndBalanceAsStrings() { 29 public void mapsOwnerAndBalanceAsStrings() {
30 Ledger ledger = new Ledger("alice", new BigDecimal("100")); 30 Ledger ledger = new Ledger("alice", new BigDecimal("100"));
31 31
32 AccountDTO dto = mapper.ledgerToLedgerDTO(ledger); 32 LedgerDTO dto = mapper.ledgerToLedgerDTO(ledger);
33 33
34 assertEquals("alice", dto.owner()); 34 assertEquals("alice", dto.owner());
35 assertEquals("100.00", dto.balance()); 35 assertEquals("100.00", dto.balance());
@@ -39,7 +39,7 @@ public class LedgerMapperTest {
39 public void emptyEntriesMapToEmptyList() { 39 public void emptyEntriesMapToEmptyList() {
40 Ledger ledger = new Ledger("alice", new BigDecimal("0")); 40 Ledger ledger = new Ledger("alice", new BigDecimal("0"));
41 41
42 AccountDTO dto = mapper.ledgerToLedgerDTO(ledger); 42 LedgerDTO dto = mapper.ledgerToLedgerDTO(ledger);
43 43
44 assertTrue(dto.entries().isEmpty()); 44 assertTrue(dto.entries().isEmpty());
45 } 45 }
@@ -49,12 +49,20 @@ public class LedgerMapperTest {
49 Ledger ledger = new Ledger("bob", new BigDecimal("0")); 49 Ledger ledger = new Ledger("bob", new BigDecimal("0"));
50 ledger.record( 50 ledger.record(
51 new LedgerEntry( 51 new LedgerEntry(
52 1, Instant.parse("2026-01-01T00:00:00Z"), LedgerType.DEPOSIT, 52 1,
53 new BigDecimal("50.00"), new BigDecimal("50.00"), "first")); 53 Instant.parse("2026-01-01T00:00:00Z"),
54 LedgerType.DEPOSIT,
55 new BigDecimal("50.00"),
56 new BigDecimal("50.00"),
57 "first"));
54 ledger.record( 58 ledger.record(
55 new LedgerEntry( 59 new LedgerEntry(
56 2, Instant.parse("2026-01-02T00:00:00Z"), LedgerType.PURCHASE, 60 2,
57 new BigDecimal("-20.00"), new BigDecimal("30.00"), "second")); 61 Instant.parse("2026-01-02T00:00:00Z"),
62 LedgerType.PURCHASE,
63 new BigDecimal("-20.00"),
64 new BigDecimal("30.00"),
65 "second"));
58 66
59 List<LedgerEntryDTO> entries = mapper.ledgerToLedgerDTO(ledger).entries(); 67 List<LedgerEntryDTO> entries = mapper.ledgerToLedgerDTO(ledger).entries();
60 68
@@ -84,16 +92,18 @@ public class LedgerMapperTest {
84 92
85 /** 93 /**
86 * LedgerEntry.id/time and Ledger's account-blocked state have no matching AccountDTO/ 94 * LedgerEntry.id/time and Ledger's account-blocked state have no matching AccountDTO/
87 * LedgerEntryDTO source property, so MapStruct leaves them at their Java defaults. This 95 * LedgerEntryDTO source property, so MapStruct leaves them at their Java defaults. This pins that
88 * pins that known gap; once the mapper is taught to fill seq/at/blocked, update these 96 * known gap; once the mapper is taught to fill seq/at/blocked, update these assertions instead of
89 * assertions instead of deleting them. 97 * deleting them.
90 */ 98 */
91 @Test 99 @Test
92 public void unmappedTargetPropertiesFallBackToDefaults() { 100 public void unmappedTargetPropertiesFallBackToDefaults() {
93 Ledger ledger = new Ledger("dave", new BigDecimal("0")); 101 Ledger ledger = new Ledger("dave", new BigDecimal("0"));
94 ledger.record(new LedgerEntry(7, Instant.now(), LedgerType.COMMISSION, BigDecimal.ONE, BigDecimal.ONE, "n")); 102 ledger.record(
103 new LedgerEntry(
104 7, Instant.now(), LedgerType.COMMISSION, BigDecimal.ONE, BigDecimal.ONE, "n"));
95 105
96 AccountDTO dto = mapper.ledgerToLedgerDTO(ledger); 106 LedgerDTO dto = mapper.ledgerToLedgerDTO(ledger);
97 107
98 assertFalse(dto.blocked()); 108 assertFalse(dto.blocked());
99 LedgerEntryDTO entry = dto.entries().get(0); 109 LedgerEntryDTO entry = dto.entries().get(0);
diff --git a/tools/_util.sh b/tools/_util.sh
index fde4797..a041f2d 100644
--- a/tools/_util.sh
+++ b/tools/_util.sh
@@ -5,15 +5,18 @@ case "$(uname -s)" in
5 *) SEP=":" ;; 5 *) SEP=":" ;;
6esac 6esac
7 7
8MODULES="api service ui-console" 8MODULES="api service ui-console ui-desktop"
9 9
10DEPS_api="" 10DEPS_api=""
11DEPS_service="api" 11DEPS_service="api"
12DEPS_ui_console="api service" 12DEPS_ui_console="api service"
13DEPS_ui_desktop=""
13 14
14RUNTIME_LIB_DIRS="pico jaxb gson" 15RUNTIME_LIB_DIRS="pico jaxb gson openjfx"
15 16
16MAIN_CLASS="market.guess.ui.console.App" 17EXECUTABLES="ui-console ui-desktop"
18MAINCLASS_ui_console="market.guess.ui.console.App"
19MAINCLASS_ui_desktop="market.guess.ui.desktop.Launcher"
17 20
18JAVA_HOME_DIR=$(java -XshowSettings:properties -version 2>&1 | tr -d '\r' | sed -n 's/^ *java\.home = //p') 21JAVA_HOME_DIR=$(java -XshowSettings:properties -version 2>&1 | tr -d '\r' | sed -n 's/^ *java\.home = //p')
19case "$(uname -s)" in 22case "$(uname -s)" in
@@ -45,6 +48,24 @@ deps_of() {
45 eval "printf '%s' \"\${$v}\"" 48 eval "printf '%s' \"\${$v}\""
46} 49}
47 50
51mainclass_of() {
52 local v="MAINCLASS_$(echo "$1" | tr '-' '_')"
53 eval "printf '%s' \"\${$v}\""
54}
55
56# JAR manifest lines are capped at 72 bytes; a raw "Key: value" line trips
57# `line too long` once enough jars are on the Class-Path (openjfx pushed us
58# over it). Fold per spec: continuation lines start with a single space.
59write_manifest_attr() {
60 local file="$1" line="$2: $3"
61 : >"$file"
62 while [ "${#line}" -gt 72 ]; do
63 printf '%s\n' "${line:0:72}" >>"$file"
64 line=" ${line:72}"
65 done
66 printf '%s\n\n' "$line" >>"$file"
67}
68
48module_cp() { 69module_cp() {
49 local cp="" 70 local cp=""
50 for d in "$@"; do cp="$cp${cp:+$SEP}build/classes/$d"; done 71 for d in "$@"; do cp="$cp${cp:+$SEP}build/classes/$d"; done
diff --git a/tools/package.sh b/tools/package.sh
index a85ee6c..186dab5 100644
--- a/tools/package.sh
+++ b/tools/package.sh
@@ -22,63 +22,74 @@ for d in $RUNTIME_LIB_DIRS; do
22 echo " lib/$d/ ($n jars)" 22 echo " lib/$d/ ($n jars)"
23done 23done
24 24
25echo "=== Generating console manifest ===" 25echo "=== Generating executable manifests ==="
26# Generated from what is actually staged, never hand-maintained. Four silent 26# Generated from what is actually staged, never hand-maintained. Four silent
27# failure modes: wildcards match nothing; a missing trailing newline makes jar 27# failure modes: wildcards match nothing; a missing trailing newline makes jar
28# drop the line; paths are relative to this jar; and java -jar ignores -cp, so 28# drop the line; paths are relative to this jar; and java -jar ignores -cp, so
29# this line is the entire classpath at runtime. 29# this line is the entire classpath at runtime.
30MF="$TMP/console-manifest.txt" 30for e in $EXECUTABLES; do
31CPLINE="" 31 CPLINE=""
32for m in $MODULES; do 32 for m in $MODULES; do
33 [ "$m" = ui-console ] && continue 33 [ "$m" = "$e" ] && continue
34 CPLINE="$CPLINE${CPLINE:+ }$m.jar" 34 CPLINE="$CPLINE${CPLINE:+ }$m.jar"
35done 35 done
36for d in $RUNTIME_LIB_DIRS; do 36 for d in $RUNTIME_LIB_DIRS; do
37 for j in "$DIST"/lib/"$d"/*.jar; do 37 for j in "$DIST"/lib/"$d"/*.jar; do
38 [ -f "$j" ] || continue 38 [ -f "$j" ] || continue
39 CPLINE="$CPLINE lib/$d/$(basename "$j")" 39 CPLINE="$CPLINE lib/$d/$(basename "$j")"
40 done
40 done 41 done
42 write_manifest_attr "$TMP/$e-manifest.txt" "Class-Path" "$CPLINE"
43 echo " $e: $CPLINE"
41done 44done
42printf 'Class-Path: %s\n\n' "$CPLINE" >"$MF"
43echo " $CPLINE"
44 45
45echo "=== Packaging ===" 46echo "=== Packaging ==="
46for m in $MODULES; do 47for m in $MODULES; do
47 if [ "$m" = ui-console ]; then 48 case " $EXECUTABLES " in
48 "$JAR" --create --file "$DIST/$m.jar" \ 49 *" $m "*)
49 --main-class "$MAIN_CLASS" --manifest "$MF" -C "build/classes/$m" . 50 "$JAR" --create --file "$DIST/$m.jar" --main-class "$(mainclass_of "$m")" \
50 else 51 --manifest "$TMP/$m-manifest.txt" -C "build/classes/$m" .
52 ;;
53 *)
51 "$JAR" --create --file "$DIST/$m.jar" -C "build/classes/$m" . 54 "$JAR" --create --file "$DIST/$m.jar" -C "build/classes/$m" .
52 fi 55 ;;
56 esac
53 echo " $DIST/$m.jar" 57 echo " $DIST/$m.jar"
54done 58done
55 59
56cat >"$DIST/run.bat" <<'EOF' 60for e in $EXECUTABLES; do
61 cat >"$DIST/run-${e#ui-}.bat" <<EOF
57@echo off 62@echo off
58cd /d "%~dp0" 63cd /d "%~dp0"
59java -jar "%~dp0ui-console.jar" 64java -jar "%~dp0$e.jar"
60if errorlevel 1 pause 65if errorlevel 1 pause
61EOF 66EOF
67done
62 68
63[ -f README.pdf ] && cp README.pdf "$DIST/" 69[ -f README.pdf ] && cp README.pdf "$DIST/"
64 70
65echo "=== Manifest as it actually landed in the jar ===" 71echo "=== Manifest as it actually landed in the jar ==="
66# Cheapest check that prevents a Level-0: if Main-Class or Class-Path didn't 72# Cheapest check that prevents a Level-0: if Main-Class or Class-Path didn't
67# survive, it surfaces here instead of on the grader's machine. 73# survive, it surfaces here instead of on the grader's machine.
68rm -rf "$TMP/mf" && mkdir -p "$TMP/mf" 74for e in $EXECUTABLES; do
69(cd "$TMP/mf" && "$JAR" -xf "$OLDPWD/$DIST/ui-console.jar" META-INF/MANIFEST.MF) 75 rm -rf "$TMP/mf" && mkdir -p "$TMP/mf"
70sed 's/^/ /' "$TMP/mf/META-INF/MANIFEST.MF" 76 (cd "$TMP/mf" && "$JAR" -xf "$OLDPWD/$DIST/$e.jar" META-INF/MANIFEST.MF)
77 echo "-- $e.jar --"
78 sed 's/^/ /' "$TMP/mf/META-INF/MANIFEST.MF"
71 79
72grep -q '^Main-Class:' "$TMP/mf/META-INF/MANIFEST.MF" || { 80 grep -q '^Main-Class:' "$TMP/mf/META-INF/MANIFEST.MF" || {
73 echo "*** Main-Class missing ***" 81 echo "*** Main-Class missing in $e.jar ***"
74 exit 1 82 exit 1
75} 83 }
76grep -q 'Class-Path:' "$TMP/mf/META-INF/MANIFEST.MF" || { 84 grep -q 'Class-Path:' "$TMP/mf/META-INF/MANIFEST.MF" || {
77 echo "*** Class-Path missing ***" 85 echo "*** Class-Path missing in $e.jar ***"
78 exit 1 86 exit 1
79} 87 }
88done
80 89
81echo "======================================" 90echo "======================================"
82echo "Self-contained output in $DIST" 91echo "Self-contained output in $DIST"
83echo " cd $DIST && java -jar ui-console.jar" 92for e in $EXECUTABLES; do
93 echo " cd $DIST && java -jar $e.jar"
94done
84echo "======================================" 95echo "======================================"
diff --git a/ui-console/src/main/java/market/guess/ui/console/io/InputProcessor.java b/ui-console/src/main/java/market/guess/ui/console/io/InputProcessor.java
index 3ff752c..69a9a9a 100644
--- a/ui-console/src/main/java/market/guess/ui/console/io/InputProcessor.java
+++ b/ui-console/src/main/java/market/guess/ui/console/io/InputProcessor.java
@@ -5,9 +5,9 @@ import java.nio.file.Path;
5import java.util.List; 5import java.util.List;
6import java.util.Scanner; 6import java.util.Scanner;
7import java.util.function.Function; 7import java.util.function.Function;
8import market.guess.api.MarketStateDTO; 8import market.guess.model.market.MarketStateDTO;
9import market.guess.api.PurchaseReceiptDTO; 9import market.guess.model.market.PurchaseReceiptDTO;
10import market.guess.api.TradeRowDTO; 10import market.guess.model.market.TradeRowDTO;
11 11
12public final class InputProcessor { 12public final class InputProcessor {
13 private static final int OPTION_WIDTH = 18; 13 private static final int OPTION_WIDTH = 18;
@@ -192,4 +192,3 @@ public final class InputProcessor {
192 padRight(at, AT_WIDTH)); 192 padRight(at, AT_WIDTH));
193 } 193 }
194} 194}
195