diff options
| author | Kostya <mail@sartin.in> | 2026-08-23 14:05:29 +0000 |
|---|---|---|
| committer | Kostya <mail@sartin.in> | 2026-08-23 14:05:29 +0000 |
| commit | 843820ea9f357220d69f3795f3289ee41eed355c (patch) | |
| tree | 57323a2e1cd4d4c0addd57eadc31d0f36c612e96 | |
| parent | fbfd2e275e9d645e4ec8a1874bc57d98b1c38300 (diff) | |
| download | guess-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.
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 | ||
| 3 | import java.math.BigDecimal; | 3 | import java.math.BigDecimal; |
| 4 | import market.guess.model.event.EventDetailDTO; | 4 | import market.guess.model.event.EventDetailDTO; |
| 5 | import market.guess.model.market.PurchaseReceiptDTO; | ||
| 5 | 6 | ||
| 6 | public interface GuessMarketContext { | 7 | public 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 @@ | |||
| 1 | package market.guess.model.event; | 1 | package market.guess.model.event; |
| 2 | 2 | ||
| 3 | import java.util.List; | 3 | import java.util.List; |
| 4 | import market.guess.api.MarketStateDTO; | 4 | import market.guess.model.market.MarketStateDTO; |
| 5 | import market.guess.api.TradeRowDTO; | 5 | import market.guess.model.market.TradeRowDTO; |
| 6 | 6 | ||
| 7 | public record EventDetailDTO( | 7 | public 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 @@ | |||
| 1 | package market.guess.api; | 1 | package market.guess.model.ledger; |
| 2 | 2 | ||
| 3 | import java.util.List; | 3 | import java.util.List; |
| 4 | import market.guess.model.ledger.LedgerEntryDTO; | ||
| 5 | 4 | ||
| 6 | public record AccountDTO( | 5 | public 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 @@ | |||
| 1 | package market.guess.api; | 1 | package market.guess.model.market; |
| 2 | 2 | ||
| 3 | public record MarketDTO(String key, String name, String price, String volume) {} | 3 | public 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 @@ | |||
| 1 | package market.guess.api; | 1 | package market.guess.model.market; |
| 2 | 2 | ||
| 3 | import java.util.List; | 3 | import java.util.List; |
| 4 | import market.guess.model.event.MechanismType; | 4 | import 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 @@ | |||
| 1 | package market.guess.api; | 1 | package market.guess.model.market; |
| 2 | 2 | ||
| 3 | import java.util.List; | 3 | import 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 @@ | |||
| 1 | package market.guess.api; | 1 | package market.guess.model.market; |
| 2 | 2 | ||
| 3 | public record TradeRowDTO( | 3 | public 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; | |||
| 3 | import java.math.BigDecimal; | 3 | import java.math.BigDecimal; |
| 4 | import java.time.Instant; | 4 | import java.time.Instant; |
| 5 | import market.guess.api.GuessMarketContext; | 5 | import market.guess.api.GuessMarketContext; |
| 6 | import market.guess.api.PurchaseReceiptDTO; | ||
| 7 | import market.guess.api.Result; | 6 | import market.guess.api.Result; |
| 8 | import market.guess.api.TradeRowDTO; | ||
| 9 | import market.guess.model.event.EventDetailDTO; | 7 | import market.guess.model.event.EventDetailDTO; |
| 8 | import market.guess.model.market.PurchaseReceiptDTO; | ||
| 9 | import market.guess.model.market.TradeRowDTO; | ||
| 10 | import market.guess.service.catalog.infrastructure.MarketContext; | 10 | import market.guess.service.catalog.infrastructure.MarketContext; |
| 11 | import market.guess.service.domain.Order; | 11 | import market.guess.service.domain.Order; |
| 12 | import market.guess.service.fulfillment.FulfillmentContext; | 12 | import 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 @@ | |||
| 1 | package market.guess.service.catalog.infrastructure.adapter; | ||
| 2 | |||
| 3 | import market.guess.model.ledger.LedgerDTO; | ||
| 4 | import market.guess.service.ledger.Ledger; | ||
| 5 | import org.mapstruct.Mapper; | ||
| 6 | |||
| 7 | @Mapper | ||
| 8 | public 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 @@ | |||
| 1 | package market.guess.service.catalog.infrastructure.mapper.v2; | ||
| 2 | |||
| 3 | import market.guess.api.AccountDTO; | ||
| 4 | import market.guess.service.ledger.Ledger; | ||
| 5 | import org.mapstruct.Mapper; | ||
| 6 | |||
| 7 | @Mapper | ||
| 8 | public 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; | |||
| 4 | import java.time.Instant; | 4 | import java.time.Instant; |
| 5 | import java.util.ArrayList; | 5 | import java.util.ArrayList; |
| 6 | import java.util.List; | 6 | import java.util.List; |
| 7 | import market.guess.api.MarketDTO; | ||
| 8 | import market.guess.api.MarketStateDTO; | ||
| 9 | import market.guess.api.TradeRowDTO; | ||
| 10 | import market.guess.model.event.CommissionTiming; | 7 | import market.guess.model.event.CommissionTiming; |
| 11 | import market.guess.model.event.EventStatus; | 8 | import market.guess.model.event.EventStatus; |
| 12 | import market.guess.model.event.EventSummaryDTO; | 9 | import market.guess.model.event.EventSummaryDTO; |
| 13 | import market.guess.model.ledger.LedgerType; | 10 | import market.guess.model.ledger.LedgerType; |
| 11 | import market.guess.model.market.MarketDTO; | ||
| 12 | import market.guess.model.market.MarketStateDTO; | ||
| 13 | import market.guess.model.market.TradeRowDTO; | ||
| 14 | import market.guess.service.helpers.BigDecimalOptions; | 14 | import market.guess.service.helpers.BigDecimalOptions; |
| 15 | import market.guess.service.helpers.InstantOptions; | 15 | import market.guess.service.helpers.InstantOptions; |
| 16 | import market.guess.service.ledger.Ledger; | 16 | import 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 @@ | |||
| 1 | package market.guess.service.domain; | 1 | package market.guess.service.domain; |
| 2 | 2 | ||
| 3 | import java.math.BigDecimal; | 3 | import java.math.BigDecimal; |
| 4 | import market.guess.api.MarketDTO; | 4 | import market.guess.model.market.MarketDTO; |
| 5 | 5 | ||
| 6 | public final class Market { | 6 | public 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 @@ | |||
| 1 | package market.guess.service.catalog.infrastructure.mapper.v2; | 1 | package market.guess.service.catalog.infrastructure.adapter; |
| 2 | 2 | ||
| 3 | import static org.junit.Assert.assertEquals; | 3 | import static org.junit.Assert.assertEquals; |
| 4 | import static org.junit.Assert.assertFalse; | 4 | import static org.junit.Assert.assertFalse; |
| @@ -8,7 +8,7 @@ import static org.junit.Assert.assertTrue; | |||
| 8 | import java.math.BigDecimal; | 8 | import java.math.BigDecimal; |
| 9 | import java.time.Instant; | 9 | import java.time.Instant; |
| 10 | import java.util.List; | 10 | import java.util.List; |
| 11 | import market.guess.api.AccountDTO; | 11 | import market.guess.model.ledger.LedgerDTO; |
| 12 | import market.guess.model.ledger.LedgerEntryDTO; | 12 | import market.guess.model.ledger.LedgerEntryDTO; |
| 13 | import market.guess.model.ledger.LedgerType; | 13 | import market.guess.model.ledger.LedgerType; |
| 14 | import market.guess.service.ledger.Ledger; | 14 | import 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=":" ;; |
| 6 | esac | 6 | esac |
| 7 | 7 | ||
| 8 | MODULES="api service ui-console" | 8 | MODULES="api service ui-console ui-desktop" |
| 9 | 9 | ||
| 10 | DEPS_api="" | 10 | DEPS_api="" |
| 11 | DEPS_service="api" | 11 | DEPS_service="api" |
| 12 | DEPS_ui_console="api service" | 12 | DEPS_ui_console="api service" |
| 13 | DEPS_ui_desktop="" | ||
| 13 | 14 | ||
| 14 | RUNTIME_LIB_DIRS="pico jaxb gson" | 15 | RUNTIME_LIB_DIRS="pico jaxb gson openjfx" |
| 15 | 16 | ||
| 16 | MAIN_CLASS="market.guess.ui.console.App" | 17 | EXECUTABLES="ui-console ui-desktop" |
| 18 | MAINCLASS_ui_console="market.guess.ui.console.App" | ||
| 19 | MAINCLASS_ui_desktop="market.guess.ui.desktop.Launcher" | ||
| 17 | 20 | ||
| 18 | JAVA_HOME_DIR=$(java -XshowSettings:properties -version 2>&1 | tr -d '\r' | sed -n 's/^ *java\.home = //p') | 21 | JAVA_HOME_DIR=$(java -XshowSettings:properties -version 2>&1 | tr -d '\r' | sed -n 's/^ *java\.home = //p') |
| 19 | case "$(uname -s)" in | 22 | case "$(uname -s)" in |
| @@ -45,6 +48,24 @@ deps_of() { | |||
| 45 | eval "printf '%s' \"\${$v}\"" | 48 | eval "printf '%s' \"\${$v}\"" |
| 46 | } | 49 | } |
| 47 | 50 | ||
| 51 | mainclass_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. | ||
| 59 | write_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 | |||
| 48 | module_cp() { | 69 | module_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)" |
| 23 | done | 23 | done |
| 24 | 24 | ||
| 25 | echo "=== Generating console manifest ===" | 25 | echo "=== 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. |
| 30 | MF="$TMP/console-manifest.txt" | 30 | for e in $EXECUTABLES; do |
| 31 | CPLINE="" | 31 | CPLINE="" |
| 32 | for 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" |
| 35 | done | 35 | done |
| 36 | for 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" | ||
| 41 | done | 44 | done |
| 42 | printf 'Class-Path: %s\n\n' "$CPLINE" >"$MF" | ||
| 43 | echo " $CPLINE" | ||
| 44 | 45 | ||
| 45 | echo "=== Packaging ===" | 46 | echo "=== Packaging ===" |
| 46 | for m in $MODULES; do | 47 | for 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" |
| 54 | done | 58 | done |
| 55 | 59 | ||
| 56 | cat >"$DIST/run.bat" <<'EOF' | 60 | for e in $EXECUTABLES; do |
| 61 | cat >"$DIST/run-${e#ui-}.bat" <<EOF | ||
| 57 | @echo off | 62 | @echo off |
| 58 | cd /d "%~dp0" | 63 | cd /d "%~dp0" |
| 59 | java -jar "%~dp0ui-console.jar" | 64 | java -jar "%~dp0$e.jar" |
| 60 | if errorlevel 1 pause | 65 | if errorlevel 1 pause |
| 61 | EOF | 66 | EOF |
| 67 | done | ||
| 62 | 68 | ||
| 63 | [ -f README.pdf ] && cp README.pdf "$DIST/" | 69 | [ -f README.pdf ] && cp README.pdf "$DIST/" |
| 64 | 70 | ||
| 65 | echo "=== Manifest as it actually landed in the jar ===" | 71 | echo "=== 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. |
| 68 | rm -rf "$TMP/mf" && mkdir -p "$TMP/mf" | 74 | for 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" |
| 70 | sed '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 | ||
| 72 | grep -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 | } |
| 76 | grep -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 | } |
| 88 | done | ||
| 80 | 89 | ||
| 81 | echo "======================================" | 90 | echo "======================================" |
| 82 | echo "Self-contained output in $DIST" | 91 | echo "Self-contained output in $DIST" |
| 83 | echo " cd $DIST && java -jar ui-console.jar" | 92 | for e in $EXECUTABLES; do |
| 93 | echo " cd $DIST && java -jar $e.jar" | ||
| 94 | done | ||
| 84 | echo "======================================" | 95 | echo "======================================" |
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; | |||
| 5 | import java.util.List; | 5 | import java.util.List; |
| 6 | import java.util.Scanner; | 6 | import java.util.Scanner; |
| 7 | import java.util.function.Function; | 7 | import java.util.function.Function; |
| 8 | import market.guess.api.MarketStateDTO; | 8 | import market.guess.model.market.MarketStateDTO; |
| 9 | import market.guess.api.PurchaseReceiptDTO; | 9 | import market.guess.model.market.PurchaseReceiptDTO; |
| 10 | import market.guess.api.TradeRowDTO; | 10 | import market.guess.model.market.TradeRowDTO; |
| 11 | 11 | ||
| 12 | public final class InputProcessor { | 12 | public 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 | |||