diff --git a/docs/CODEBASE_MAP.md b/docs/CODEBASE_MAP.md
index 31fe474..f3983a4 100644
--- a/docs/CODEBASE_MAP.md
+++ b/docs/CODEBASE_MAP.md
@@ -237,10 +237,6 @@ Server (listens on spawn:// URI)
ApplicationSubscriber receives ◄─── EmbeddedServer.createProducer().publish(item)
```
-**Known bugs in `spawn-jdk`:**
-- `PatchModule.detect()` has a split-on-`=` bug for `--patch-module=module=path` args (no limit — third segment dropped).
-- `AbstractHeapSize`: memory unit suffix derived from first letter of enum name — adding a misnamed `MemorySize` enum would produce wrong JVM flag silently.
-
---
### `spawn-local-platform`
@@ -322,16 +318,13 @@ Server (listens on spawn:// URI)
| `ImageName` | (image reference) | Handles tags, SHA256 refs, registry prefixing |
| `ExposedPort` | `ExposedPorts` | Metadata only; use `PublishPort` for host mapping |
| `PublishPort` | `HostConfig.PortBindings` | |
-| `Bind` | `HostConfig.Binds` | **Bug:** `requireNonNull` checks wrong param name |
+| `Bind` | `HostConfig.Binds` | |
| `Command` | `Cmd` | Sets container CMD array |
| `ContainerName` | `?name=` query param | 409 if duplicate |
| `NetworkName` | `HostConfig.NetworkMode` | |
| `PublishAllPorts` | `HostConfig.PublishAllPorts` | `@Default ENABLED` |
| `KillSignal` | `signal` query param | Enum: `SIGKILL` (`@Default`), `SIGTERM`, `SIGQUIT`, `SIGHUP` |
-**Known bugs in `spawn-docker`:**
-- `Bind`: `requireNonNull` for `internalPath` references `externalPath` param name (copy-paste; runtime behavior correct)
-
---
### `spawn-docker-jdk`
@@ -363,11 +356,6 @@ Server (listens on spawn:// URI)
| `model/DockerImage.java` | `Image` impl; `start()` creates then starts container; auto-removes on start failure |
| `model/AbstractJsonBasedResult.java` | DI-injected `Session` + `JsonValue` (base-json); `at(keys)` / `text(keys)` / `intAt` / `boolAt` navigation helpers |
-**Known bugs:**
-- `GetSystemEvents` and `DockerContainer` have debug `System.out.println` calls in production code
-- `CopyFiles` constructor validation inverts the check (throws when file has content instead of when it's empty)
-- `NetworkInformation.driver()` reads lowercase `"driver"` but Docker API returns `"Driver"` → always returns empty string
-- `ContainerInformation.links()`: splits on `:` — `ArrayIndexOutOfBoundsException` if link string has no colon
## Conventions
diff --git a/spawn-docker-jdk/src/main/java/build/spawn/docker/jdk/command/GetSystemEvents.java b/spawn-docker-jdk/src/main/java/build/spawn/docker/jdk/command/GetSystemEvents.java
index 7ef3029..4feba95 100644
--- a/spawn-docker-jdk/src/main/java/build/spawn/docker/jdk/command/GetSystemEvents.java
+++ b/spawn-docker-jdk/src/main/java/build/spawn/docker/jdk/command/GetSystemEvents.java
@@ -22,7 +22,6 @@
import build.base.flow.Publicist;
import build.base.flow.Subscriber;
-import build.base.json.JsonFormat;
import build.base.json.JsonValue;
import build.base.naming.UniqueNameGenerator;
import build.spawn.docker.Event;
@@ -70,8 +69,6 @@ public void onNext(final JsonValue item) {
final var context = createContext();
context.bind(JsonValue.class).to(item);
- System.out.println("Raw Event: [" + name + "] " + item.toJsonString(JsonFormat.PRETTY));
-
// publish "Action" events as ActionEvents
if (item.asObject().has("Action")) {
final var event = context.create(ActionEvent.class);
diff --git a/spawn-docker-jdk/src/main/java/build/spawn/docker/jdk/model/ContainerInformation.java b/spawn-docker-jdk/src/main/java/build/spawn/docker/jdk/model/ContainerInformation.java
index 9d2155d..f75eea7 100644
--- a/spawn-docker-jdk/src/main/java/build/spawn/docker/jdk/model/ContainerInformation.java
+++ b/spawn-docker-jdk/src/main/java/build/spawn/docker/jdk/model/ContainerInformation.java
@@ -118,8 +118,10 @@ public Stream links() {
final List linkList = new ArrayList<>();
for (final JsonValue entry : linksArray.values()) {
final String text = entry instanceof JsonString s ? s.value() : entry.toJsonString();
- final String[] split = text.split(":");
- linkList.add(Link.of(split[0], split[1]));
+ final String[] split = text.split(":", 2);
+ if (split.length == 2) {
+ linkList.add(Link.of(split[0], split[1]));
+ }
}
return linkList.stream();
diff --git a/spawn-docker-jdk/src/main/java/build/spawn/docker/jdk/model/DockerContainer.java b/spawn-docker-jdk/src/main/java/build/spawn/docker/jdk/model/DockerContainer.java
index f2fbdf1..5ac119e 100644
--- a/spawn-docker-jdk/src/main/java/build/spawn/docker/jdk/model/DockerContainer.java
+++ b/spawn-docker-jdk/src/main/java/build/spawn/docker/jdk/model/DockerContainer.java
@@ -132,8 +132,6 @@ private void onPostInject() {
// obtain the identity for the Container from the JsonValue
this.id = jsonValue().getString("Id");
- System.out.println("Created Container: " + this.id.substring(this.id.length() - 8));
-
// establish a CompletingSubscriber for the Container
this.completingSubscriber = new CompletingSubscriber<>();
@@ -147,10 +145,7 @@ private void onPostInject() {
// establish the CompletableFuture to identify when the Container has started
this.onStart = this.completingSubscriber.when(
event -> "start".equals(event.action()),
- __ -> {
- System.out.println("Started Container: " + this.id.substring(this.id.length() - 8));
- return this;
- });
+ __ -> this);
// establish the CompletableFuture to identify when the Container has terminated (died)
this.onExit = this.completingSubscriber.when(event -> {
@@ -170,10 +165,7 @@ private void onPostInject() {
return false;
},
- _ -> {
- System.out.println("Exited Container: " + this.id.substring(this.id.length() - 8));
- return this;
- });
+ _ -> this);
this.exitValue = null;
}
diff --git a/spawn-docker-jdk/src/main/java/build/spawn/docker/jdk/model/NetworkInformation.java b/spawn-docker-jdk/src/main/java/build/spawn/docker/jdk/model/NetworkInformation.java
index ebc4f6a..1358ca1 100644
--- a/spawn-docker-jdk/src/main/java/build/spawn/docker/jdk/model/NetworkInformation.java
+++ b/spawn-docker-jdk/src/main/java/build/spawn/docker/jdk/model/NetworkInformation.java
@@ -34,7 +34,7 @@ public class NetworkInformation
@Override
public String driver() {
- return text("driver");
+ return text("Driver");
}
@Override
diff --git a/spawn-jdk/src/main/java/build/spawn/jdk/option/AbstractHeapSize.java b/spawn-jdk/src/main/java/build/spawn/jdk/option/AbstractHeapSize.java
index f3f6cf1..802e5a5 100644
--- a/spawn-jdk/src/main/java/build/spawn/jdk/option/AbstractHeapSize.java
+++ b/spawn-jdk/src/main/java/build/spawn/jdk/option/AbstractHeapSize.java
@@ -77,7 +77,14 @@ else if (memorySize == null) {
@Override
public Stream resolve(final Platform platform, final ConfigurationBuilder options) {
- return Stream.of(getOption() + this.units + this.memorySize.name().toLowerCase().substring(0, 1));
+ final String suffix = switch (this.memorySize) {
+ case B -> "";
+ case KiB, KB -> "k";
+ case MiB, MB -> "m";
+ case GiB, GB -> "g";
+ default -> throw new IllegalArgumentException("Unsupported memory size for heap: " + this.memorySize);
+ };
+ return Stream.of(getOption() + this.units + suffix);
}
@Override
diff --git a/spawn-jdk/src/main/java/build/spawn/jdk/option/PatchModule.java b/spawn-jdk/src/main/java/build/spawn/jdk/option/PatchModule.java
index 5b6035a..932d027 100644
--- a/spawn-jdk/src/main/java/build/spawn/jdk/option/PatchModule.java
+++ b/spawn-jdk/src/main/java/build/spawn/jdk/option/PatchModule.java
@@ -155,7 +155,7 @@ public static Stream detect() {
.stream()
.filter(argument -> argument.startsWith("--patch-module="))
.map(argument -> argument.substring("--patch-module=".length()))
- .map(argument -> argument.split("="))
+ .map(argument -> argument.split("=", 2))
.map(array -> PatchModule.of(array[0], array[1]));
}
}
diff --git a/spawn-local-jdk/src/main/java/build/spawn/platform/local/jdk/LocalJDKLauncher.java b/spawn-local-jdk/src/main/java/build/spawn/platform/local/jdk/LocalJDKLauncher.java
index 0343c59..92bafad 100644
--- a/spawn-local-jdk/src/main/java/build/spawn/platform/local/jdk/LocalJDKLauncher.java
+++ b/spawn-local-jdk/src/main/java/build/spawn/platform/local/jdk/LocalJDKLauncher.java
@@ -186,7 +186,7 @@ public LocalProcess createProcess(final LocalMachine machine,
// --- launch the Java Application ---
this.diagnostics.addRow("Application Launch Command", String.join(" ", processBuilder.command()));
- LOGGER.info("\n" + "build.spawn: Launching JDK-based Application...\n"
+ LOGGER.debug("\n" + "build.spawn: Launching JDK-based Application...\n"
+ "--------------------------------------------------------------\n" + "{0}"
+ "--------------------------------------------------------------", this.diagnostics);