diff --git a/common/common/src/main/java/dev/enola/common/io/resource/EmptyResource.java b/common/common/src/main/java/dev/enola/common/io/resource/EmptyResource.java index 3dcf44ccd..ae161a316 100644 --- a/common/common/src/main/java/dev/enola/common/io/resource/EmptyResource.java +++ b/common/common/src/main/java/dev/enola/common/io/resource/EmptyResource.java @@ -34,15 +34,14 @@ public class EmptyResource implements ReadableResource { // TODO Perhaps rename this to VoidResource with void:/ URI? static final String SCHEME = "empty"; - + private static final URI EMPTY_URI = URI.create(SCHEME + ":?"); private final MediaType mediaType; private final URI uri; public EmptyResource(MediaType mediaType) { this.mediaType = mediaType; - // TODO Why withoutParameters()? Remove! - this.uri = URI.create(SCHEME + ":" + mediaType.withoutParameters()); + this.uri = URIs.addMediaType(EMPTY_URI, mediaType); } @Override diff --git a/common/common/src/main/java/dev/enola/common/io/resource/URIs.java b/common/common/src/main/java/dev/enola/common/io/resource/URIs.java index b84f3813b..079ebf119 100644 --- a/common/common/src/main/java/dev/enola/common/io/resource/URIs.java +++ b/common/common/src/main/java/dev/enola/common/io/resource/URIs.java @@ -63,13 +63,20 @@ public static URI addMediaType(URI uri, MediaType mediaType) { } private static URI addQueryParameter(URI uri, String key, String value) { + String connector; if (uri.getQuery() != null && uri.getQuery().contains(key)) { return uri; } else if (uri.getQuery() == null) { - return URI.create(uri.toString() + "?" + key + "=" + encodeQueryParameterValue(value)); + if (!uri.getSchemeSpecificPart().contains("?")) { + connector = "?"; + } else { + // Special case of "scheme:?"-like URIs with "empty" query + connector = ""; + } } else { - return URI.create(uri.toString() + "&" + key + "=" + encodeQueryParameterValue(value)); + connector = "&"; } + return URI.create(uri + connector + key + "=" + encodeQueryParameterValue(value)); } private static String encodeQueryParameterValue(String value) { diff --git a/common/common/src/test/java/dev/enola/common/io/resource/EmptyResourceTest.java b/common/common/src/test/java/dev/enola/common/io/resource/EmptyResourceTest.java index f7d01f38b..7b421ae66 100644 --- a/common/common/src/test/java/dev/enola/common/io/resource/EmptyResourceTest.java +++ b/common/common/src/test/java/dev/enola/common/io/resource/EmptyResourceTest.java @@ -24,6 +24,7 @@ import org.junit.Test; import java.io.IOException; +import java.net.URI; public class EmptyResourceTest { @Test @@ -32,6 +33,7 @@ public void testEmptyResource() throws IOException { assertThat(e.byteSource().isEmpty()).isTrue(); assertThat(e.charSource().isEmpty()).isTrue(); assertThat(e.mediaType()).isEqualTo(YamlMediaType.YAML_UTF_8); - assertThat(e.uri().toString()).isEqualTo("empty:application/yaml"); + assertThat(e.uri()) + .isEqualTo(URI.create("empty:?mediaType=application%2Fyaml%3Bcharset%3Dutf-8")); } } diff --git a/common/common/src/test/java/dev/enola/common/io/resource/URIsTest.java b/common/common/src/test/java/dev/enola/common/io/resource/URIsTest.java index fade3197c..670f1f46c 100644 --- a/common/common/src/test/java/dev/enola/common/io/resource/URIsTest.java +++ b/common/common/src/test/java/dev/enola/common/io/resource/URIsTest.java @@ -84,6 +84,10 @@ public void testAddMediaType() throws URISyntaxException { var uri2expected = URI.create("scheme:something?mediaType=text%2Fplain%3Bcharset%3Dutf-8"); assertThat(uri2).isEqualTo(uri2expected); assertThat(URIs.getMediaType(uri2expected)).isEqualTo(mt2); + + var uri3 = URIs.addMediaType(URI.create("scheme:?"), mt1); + var uri3expected = URI.create("scheme:?mediaType=image%2Fgif"); + assertThat(uri3).isEqualTo(uri3expected); } @Test diff --git a/docs/use/list/index.md b/docs/use/list/index.md index 18bcd7408..e9d25f39a 100644 --- a/docs/use/list/index.md +++ b/docs/use/list/index.md @@ -47,7 +47,7 @@ Note how the section above showed some additional entity kinds, in addition to t It's possible to list only those built-in entity kinds, using an "empty" model URI, like this: ```bash cd .././.././.. -$ ./enola list --model empty:application/json enola.entity_kind +$ ./enola list --model "empty:?mediaType=application/json" enola.entity_kind ... ``` diff --git a/docs/use/list/schema.md b/docs/use/list/schema.md index 1470d591f..54c4a4152 100644 --- a/docs/use/list/schema.md +++ b/docs/use/list/schema.md @@ -21,6 +21,6 @@ Because the "schemas" are internally Entities (of _Kind_ `enola.schema`), they can also [be listed](index.md): ```bash cd .././.././.. -$ ./enola list --model empty:application/json --format=yaml enola.schema +$ ./enola list --model "empty:?mediaType=application/json" --format=yaml enola.schema ... ```