diff --git a/samples/client/3_0_3_unit_test/java/.openapi-generator/FILES b/samples/client/3_0_3_unit_test/java/.openapi-generator/FILES index a593d7f1f54..d5c8ee62cc5 100644 --- a/samples/client/3_0_3_unit_test/java/.openapi-generator/FILES +++ b/samples/client/3_0_3_unit_test/java/.openapi-generator/FILES @@ -88,6 +88,7 @@ docs/components/schemas/UriReferenceFormat.md docs/components/schemas/UriTemplateFormat.md docs/servers/Server0.md pom.xml +src/main/java/org/openapijsonschematools/client/RootServerInfo.java src/main/java/org/openapijsonschematools/client/components/schemas/AdditionalpropertiesAllowsASchemaWhichShouldValidate.java src/main/java/org/openapijsonschematools/client/components/schemas/AdditionalpropertiesAreAllowedByDefault.java src/main/java/org/openapijsonschematools/client/components/schemas/AdditionalpropertiesCanExistByItself.java @@ -175,6 +176,7 @@ src/main/java/org/openapijsonschematools/client/components/schemas/UniqueitemsVa src/main/java/org/openapijsonschematools/client/components/schemas/UriFormat.java src/main/java/org/openapijsonschematools/client/components/schemas/UriReferenceFormat.java src/main/java/org/openapijsonschematools/client/components/schemas/UriTemplateFormat.java +src/main/java/org/openapijsonschematools/client/configurations/ApiConfiguration.java src/main/java/org/openapijsonschematools/client/configurations/JsonSchemaKeywordFlags.java src/main/java/org/openapijsonschematools/client/configurations/SchemaConfiguration.java src/main/java/org/openapijsonschematools/client/exceptions/BaseException.java @@ -277,7 +279,9 @@ src/main/java/org/openapijsonschematools/client/schemas/validation/UniqueItemsVa src/main/java/org/openapijsonschematools/client/schemas/validation/UnsetAnyTypeJsonSchema.java src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationData.java src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationMetadata.java +src/main/java/org/openapijsonschematools/client/servers/Server.java src/main/java/org/openapijsonschematools/client/servers/Server0.java +src/main/java/org/openapijsonschematools/client/servers/ServerProvider.java src/main/java/org/openapijsonschematools/client/servers/ServerWithVariables.java src/main/java/org/openapijsonschematools/client/servers/ServerWithoutVariables.java src/test/java/org/openapijsonschematools/client/configurations/JsonSchemaKeywordFlagsTest.java diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/RootServerInfo.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/RootServerInfo.java new file mode 100644 index 00000000000..d5c2f5cb5fd --- /dev/null +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/RootServerInfo.java @@ -0,0 +1,73 @@ +package org.openapijsonschematools.client; + +import org.openapijsonschematools.client.exceptions.UnsetPropertyException; +import org.openapijsonschematools.client.servers.Server0; +import org.openapijsonschematools.client.servers.Server; +import org.openapijsonschematools.client.servers.ServerProvider; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.AbstractMap; +import java.util.Map; +import java.util.Objects; +import java.util.EnumMap; + +public class RootServerInfo implements ServerProvider { + final private Servers servers; + final private ServerIndex serverIndex; + + public RootServerInfo() { + this.servers = new Servers(); + this.serverIndex = ServerIndex.SERVER_0; + } + + public RootServerInfo(Servers servers, ServerIndex serverIndex) { + this.servers = servers; + this.serverIndex = serverIndex; + } + + public static class Servers { + private final EnumMap servers; + + public Servers() { + servers = new EnumMap<>( + Map.ofEntries( + new AbstractMap.SimpleEntry<>( + ServerIndex.SERVER_0, + new Server0() + ) + ) + ); + } + + public Servers( + @Nullable Server0 server0 + ) { + servers = new EnumMap<>( + Map.ofEntries( + new AbstractMap.SimpleEntry<>( + ServerIndex.SERVER_0, + Objects.requireNonNullElseGet(server0, Server0::new) + ) + ) + ); + } + + public Server get(ServerIndex serverIndex) { + if (servers.containsKey(serverIndex)) { + return get(serverIndex); + } + throw new UnsetPropertyException(serverIndex+" is unset"); + } + } + + public enum ServerIndex { + SERVER_0 + } + + public Server getServer(@Nullable ServerIndex serverIndex) { + if (serverIndex == null) { + return servers.get(this.serverIndex); + } + return servers.get(serverIndex); + } +} \ No newline at end of file diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/configurations/ApiConfiguration.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/configurations/ApiConfiguration.java new file mode 100644 index 00000000000..a580e5a1f9b --- /dev/null +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/configurations/ApiConfiguration.java @@ -0,0 +1,37 @@ +package org.openapijsonschematools.client.configurations; + +import org.openapijsonschematools.client.servers.Server; +import org.openapijsonschematools.client.RootServerInfo; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.Objects; + +public class ApiConfiguration { + private final ServerInfo serverInfo; + + public ApiConfiguration() { + serverInfo = new ServerInfo(); + } + + public ApiConfiguration(ServerInfo serverInfo) { + this.serverInfo = serverInfo; + } + + public static class ServerInfo { + protected final RootServerInfo rootServerInfo; + + public ServerInfo() { + rootServerInfo = new RootServerInfo(); + } + + public ServerInfo( + @Nullable RootServerInfo rootServerInfo + ) { + this.rootServerInfo = Objects.requireNonNullElseGet(rootServerInfo, RootServerInfo::new); + } + } + + public Server getServer(RootServerInfo. @Nullable ServerIndex serverIndex) { + return serverInfo.rootServerInfo.getServer(serverIndex); + } +} \ No newline at end of file diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/servers/Server.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/servers/Server.java new file mode 100644 index 00000000000..f5159644ccc --- /dev/null +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/servers/Server.java @@ -0,0 +1,6 @@ +package org.openapijsonschematools.client.servers; + +public interface Server { + String url(); +} + diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/servers/Server0.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/servers/Server0.java index 9e5175e6180..f74d6d47db4 100644 --- a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/servers/Server0.java +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/servers/Server0.java @@ -2,7 +2,7 @@ import org.openapijsonschematools.client.servers.ServerWithoutVariables; -class Server0 extends ServerWithoutVariables { +public class Server0 extends ServerWithoutVariables { public Server0() { super("https://someserver.com/v1"); } diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/servers/ServerProvider.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/servers/ServerProvider.java new file mode 100644 index 00000000000..8c93a971aae --- /dev/null +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/servers/ServerProvider.java @@ -0,0 +1,8 @@ +package org.openapijsonschematools.client.servers; + +import org.checkerframework.checker.nullness.qual.Nullable; + +public interface ServerProvider { + Server getServer(@Nullable T serverIndex); +} + diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/servers/ServerWithVariables.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/servers/ServerWithVariables.java index acdb6d730ed..68748bcfcae 100644 --- a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/servers/ServerWithVariables.java +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/servers/ServerWithVariables.java @@ -2,7 +2,7 @@ import java.util.Map; -public abstract class ServerWithVariables> { +public abstract class ServerWithVariables> implements Server { public final String url; public final T variables; @@ -13,5 +13,9 @@ protected ServerWithVariables(String url, T variables) { } this.url = url; } + + public String url(){ + return url; + } } diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/servers/ServerWithoutVariables.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/servers/ServerWithoutVariables.java index 903ac3f4c7d..c41ac2e77e5 100644 --- a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/servers/ServerWithoutVariables.java +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/servers/ServerWithoutVariables.java @@ -1,10 +1,14 @@ package org.openapijsonschematools.client.servers; -public abstract class ServerWithoutVariables { +public abstract class ServerWithoutVariables implements Server { public final String url; protected ServerWithoutVariables(String url) { this.url = url; } + + public String url(){ + return url; + } } diff --git a/samples/client/3_1_0_unit_test/java/.openapi-generator/FILES b/samples/client/3_1_0_unit_test/java/.openapi-generator/FILES index 70bd77d7041..a7cc708c990 100644 --- a/samples/client/3_1_0_unit_test/java/.openapi-generator/FILES +++ b/samples/client/3_1_0_unit_test/java/.openapi-generator/FILES @@ -144,6 +144,7 @@ docs/components/schemas/UuidFormat.md docs/components/schemas/ValidateAgainstCorrectBranchThenVsElse.md docs/servers/Server0.md pom.xml +src/main/java/org/openapijsonschematools/client/RootServerInfo.java src/main/java/org/openapijsonschematools/client/components/schemas/ASchemaGivenForPrefixitems.java src/main/java/org/openapijsonschematools/client/components/schemas/AdditionalItemsAreAllowedByDefault.java src/main/java/org/openapijsonschematools/client/components/schemas/AdditionalpropertiesAreAllowedByDefault.java @@ -287,6 +288,7 @@ src/main/java/org/openapijsonschematools/client/components/schemas/UriReferenceF src/main/java/org/openapijsonschematools/client/components/schemas/UriTemplateFormat.java src/main/java/org/openapijsonschematools/client/components/schemas/UuidFormat.java src/main/java/org/openapijsonschematools/client/components/schemas/ValidateAgainstCorrectBranchThenVsElse.java +src/main/java/org/openapijsonschematools/client/configurations/ApiConfiguration.java src/main/java/org/openapijsonschematools/client/configurations/JsonSchemaKeywordFlags.java src/main/java/org/openapijsonschematools/client/configurations/SchemaConfiguration.java src/main/java/org/openapijsonschematools/client/exceptions/BaseException.java @@ -389,7 +391,9 @@ src/main/java/org/openapijsonschematools/client/schemas/validation/UniqueItemsVa src/main/java/org/openapijsonschematools/client/schemas/validation/UnsetAnyTypeJsonSchema.java src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationData.java src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationMetadata.java +src/main/java/org/openapijsonschematools/client/servers/Server.java src/main/java/org/openapijsonschematools/client/servers/Server0.java +src/main/java/org/openapijsonschematools/client/servers/ServerProvider.java src/main/java/org/openapijsonschematools/client/servers/ServerWithVariables.java src/main/java/org/openapijsonschematools/client/servers/ServerWithoutVariables.java src/test/java/org/openapijsonschematools/client/configurations/JsonSchemaKeywordFlagsTest.java diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/RootServerInfo.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/RootServerInfo.java new file mode 100644 index 00000000000..d5c2f5cb5fd --- /dev/null +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/RootServerInfo.java @@ -0,0 +1,73 @@ +package org.openapijsonschematools.client; + +import org.openapijsonschematools.client.exceptions.UnsetPropertyException; +import org.openapijsonschematools.client.servers.Server0; +import org.openapijsonschematools.client.servers.Server; +import org.openapijsonschematools.client.servers.ServerProvider; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.AbstractMap; +import java.util.Map; +import java.util.Objects; +import java.util.EnumMap; + +public class RootServerInfo implements ServerProvider { + final private Servers servers; + final private ServerIndex serverIndex; + + public RootServerInfo() { + this.servers = new Servers(); + this.serverIndex = ServerIndex.SERVER_0; + } + + public RootServerInfo(Servers servers, ServerIndex serverIndex) { + this.servers = servers; + this.serverIndex = serverIndex; + } + + public static class Servers { + private final EnumMap servers; + + public Servers() { + servers = new EnumMap<>( + Map.ofEntries( + new AbstractMap.SimpleEntry<>( + ServerIndex.SERVER_0, + new Server0() + ) + ) + ); + } + + public Servers( + @Nullable Server0 server0 + ) { + servers = new EnumMap<>( + Map.ofEntries( + new AbstractMap.SimpleEntry<>( + ServerIndex.SERVER_0, + Objects.requireNonNullElseGet(server0, Server0::new) + ) + ) + ); + } + + public Server get(ServerIndex serverIndex) { + if (servers.containsKey(serverIndex)) { + return get(serverIndex); + } + throw new UnsetPropertyException(serverIndex+" is unset"); + } + } + + public enum ServerIndex { + SERVER_0 + } + + public Server getServer(@Nullable ServerIndex serverIndex) { + if (serverIndex == null) { + return servers.get(this.serverIndex); + } + return servers.get(serverIndex); + } +} \ No newline at end of file diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/configurations/ApiConfiguration.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/configurations/ApiConfiguration.java new file mode 100644 index 00000000000..a580e5a1f9b --- /dev/null +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/configurations/ApiConfiguration.java @@ -0,0 +1,37 @@ +package org.openapijsonschematools.client.configurations; + +import org.openapijsonschematools.client.servers.Server; +import org.openapijsonschematools.client.RootServerInfo; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.Objects; + +public class ApiConfiguration { + private final ServerInfo serverInfo; + + public ApiConfiguration() { + serverInfo = new ServerInfo(); + } + + public ApiConfiguration(ServerInfo serverInfo) { + this.serverInfo = serverInfo; + } + + public static class ServerInfo { + protected final RootServerInfo rootServerInfo; + + public ServerInfo() { + rootServerInfo = new RootServerInfo(); + } + + public ServerInfo( + @Nullable RootServerInfo rootServerInfo + ) { + this.rootServerInfo = Objects.requireNonNullElseGet(rootServerInfo, RootServerInfo::new); + } + } + + public Server getServer(RootServerInfo. @Nullable ServerIndex serverIndex) { + return serverInfo.rootServerInfo.getServer(serverIndex); + } +} \ No newline at end of file diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/servers/Server.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/servers/Server.java new file mode 100644 index 00000000000..f5159644ccc --- /dev/null +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/servers/Server.java @@ -0,0 +1,6 @@ +package org.openapijsonschematools.client.servers; + +public interface Server { + String url(); +} + diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/servers/Server0.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/servers/Server0.java index 9e5175e6180..f74d6d47db4 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/servers/Server0.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/servers/Server0.java @@ -2,7 +2,7 @@ import org.openapijsonschematools.client.servers.ServerWithoutVariables; -class Server0 extends ServerWithoutVariables { +public class Server0 extends ServerWithoutVariables { public Server0() { super("https://someserver.com/v1"); } diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/servers/ServerProvider.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/servers/ServerProvider.java new file mode 100644 index 00000000000..8c93a971aae --- /dev/null +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/servers/ServerProvider.java @@ -0,0 +1,8 @@ +package org.openapijsonschematools.client.servers; + +import org.checkerframework.checker.nullness.qual.Nullable; + +public interface ServerProvider { + Server getServer(@Nullable T serverIndex); +} + diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/servers/ServerWithVariables.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/servers/ServerWithVariables.java index acdb6d730ed..68748bcfcae 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/servers/ServerWithVariables.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/servers/ServerWithVariables.java @@ -2,7 +2,7 @@ import java.util.Map; -public abstract class ServerWithVariables> { +public abstract class ServerWithVariables> implements Server { public final String url; public final T variables; @@ -13,5 +13,9 @@ protected ServerWithVariables(String url, T variables) { } this.url = url; } + + public String url(){ + return url; + } } diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/servers/ServerWithoutVariables.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/servers/ServerWithoutVariables.java index 903ac3f4c7d..c41ac2e77e5 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/servers/ServerWithoutVariables.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/servers/ServerWithoutVariables.java @@ -1,10 +1,14 @@ package org.openapijsonschematools.client.servers; -public abstract class ServerWithoutVariables { +public abstract class ServerWithoutVariables implements Server { public final String url; protected ServerWithoutVariables(String url) { this.url = url; } + + public String url(){ + return url; + } } diff --git a/samples/client/petstore/java/.openapi-generator/FILES b/samples/client/petstore/java/.openapi-generator/FILES index b92667a4474..47f55d4319b 100644 --- a/samples/client/petstore/java/.openapi-generator/FILES +++ b/samples/client/petstore/java/.openapi-generator/FILES @@ -305,6 +305,7 @@ docs/servers/Server0.md docs/servers/Server1.md docs/servers/Server2.md pom.xml +src/main/java/org/openapijsonschematools/client/RootServerInfo.java src/main/java/org/openapijsonschematools/client/components/headers/int32jsoncontenttypeheader/content/applicationjson/Int32JsonContentTypeHeaderSchema.java src/main/java/org/openapijsonschematools/client/components/headers/numberheader/NumberHeaderSchema.java src/main/java/org/openapijsonschematools/client/components/headers/refcontentschemaheader/content/applicationjson/RefContentSchemaHeaderSchema.java @@ -465,6 +466,7 @@ src/main/java/org/openapijsonschematools/client/components/schemas/UUIDString.ja src/main/java/org/openapijsonschematools/client/components/schemas/User.java src/main/java/org/openapijsonschematools/client/components/schemas/Whale.java src/main/java/org/openapijsonschematools/client/components/schemas/Zebra.java +src/main/java/org/openapijsonschematools/client/configurations/ApiConfiguration.java src/main/java/org/openapijsonschematools/client/configurations/JsonSchemaKeywordFlags.java src/main/java/org/openapijsonschematools/client/configurations/SchemaConfiguration.java src/main/java/org/openapijsonschematools/client/exceptions/BaseException.java @@ -611,10 +613,12 @@ src/main/java/org/openapijsonschematools/client/paths/fakewildcardresponses/get/ src/main/java/org/openapijsonschematools/client/paths/fakewildcardresponses/get/responses/response3xx/content/applicationjson/Schema.java src/main/java/org/openapijsonschematools/client/paths/fakewildcardresponses/get/responses/response4xx/content/applicationjson/Schema.java src/main/java/org/openapijsonschematools/client/paths/fakewildcardresponses/get/responses/response5xx/content/applicationjson/Schema.java +src/main/java/org/openapijsonschematools/client/paths/foo/get/FooGetServerInfo.java src/main/java/org/openapijsonschematools/client/paths/foo/get/responses/responsedefault/content/applicationjson/Schema.java src/main/java/org/openapijsonschematools/client/paths/foo/get/servers/FooGetServer0.java src/main/java/org/openapijsonschematools/client/paths/foo/get/servers/FooGetServer1.java src/main/java/org/openapijsonschematools/client/paths/foo/get/servers/server1/Variables.java +src/main/java/org/openapijsonschematools/client/paths/petfindbystatus/PetfindbystatusServerInfo.java src/main/java/org/openapijsonschematools/client/paths/petfindbystatus/get/QueryParameters.java src/main/java/org/openapijsonschematools/client/paths/petfindbystatus/get/parameters/parameter0/Schema0.java src/main/java/org/openapijsonschematools/client/paths/petfindbystatus/servers/PetfindbystatusServer0.java @@ -755,9 +759,11 @@ src/main/java/org/openapijsonschematools/client/schemas/validation/UniqueItemsVa src/main/java/org/openapijsonschematools/client/schemas/validation/UnsetAnyTypeJsonSchema.java src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationData.java src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationMetadata.java +src/main/java/org/openapijsonschematools/client/servers/Server.java src/main/java/org/openapijsonschematools/client/servers/Server0.java src/main/java/org/openapijsonschematools/client/servers/Server1.java src/main/java/org/openapijsonschematools/client/servers/Server2.java +src/main/java/org/openapijsonschematools/client/servers/ServerProvider.java src/main/java/org/openapijsonschematools/client/servers/ServerWithVariables.java src/main/java/org/openapijsonschematools/client/servers/ServerWithoutVariables.java src/main/java/org/openapijsonschematools/client/servers/server0/Variables.java diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/RootServerInfo.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/RootServerInfo.java new file mode 100644 index 00000000000..b94c5bb4b28 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/RootServerInfo.java @@ -0,0 +1,95 @@ +package org.openapijsonschematools.client; + +import org.openapijsonschematools.client.exceptions.UnsetPropertyException; +import org.openapijsonschematools.client.servers.Server0; +import org.openapijsonschematools.client.servers.Server1; +import org.openapijsonschematools.client.servers.Server2; +import org.openapijsonschematools.client.servers.Server; +import org.openapijsonschematools.client.servers.ServerProvider; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.AbstractMap; +import java.util.Map; +import java.util.Objects; +import java.util.EnumMap; + +public class RootServerInfo implements ServerProvider { + final private Servers servers; + final private ServerIndex serverIndex; + + public RootServerInfo() { + this.servers = new Servers(); + this.serverIndex = ServerIndex.SERVER_0; + } + + public RootServerInfo(Servers servers, ServerIndex serverIndex) { + this.servers = servers; + this.serverIndex = serverIndex; + } + + public static class Servers { + private final EnumMap servers; + + public Servers() { + servers = new EnumMap<>( + Map.ofEntries( + new AbstractMap.SimpleEntry<>( + ServerIndex.SERVER_0, + new Server0() + ), + new AbstractMap.SimpleEntry<>( + ServerIndex.SERVER_1, + new Server1() + ), + new AbstractMap.SimpleEntry<>( + ServerIndex.SERVER_2, + new Server2() + ) + ) + ); + } + + public Servers( + @Nullable Server0 server0, + @Nullable Server1 server1, + @Nullable Server2 server2 + ) { + servers = new EnumMap<>( + Map.ofEntries( + new AbstractMap.SimpleEntry<>( + ServerIndex.SERVER_0, + Objects.requireNonNullElseGet(server0, Server0::new) + ), + new AbstractMap.SimpleEntry<>( + ServerIndex.SERVER_1, + Objects.requireNonNullElseGet(server1, Server1::new) + ), + new AbstractMap.SimpleEntry<>( + ServerIndex.SERVER_2, + Objects.requireNonNullElseGet(server2, Server2::new) + ) + ) + ); + } + + public Server get(ServerIndex serverIndex) { + if (servers.containsKey(serverIndex)) { + return get(serverIndex); + } + throw new UnsetPropertyException(serverIndex+" is unset"); + } + } + + public enum ServerIndex { + SERVER_0, + SERVER_1, + SERVER_2 + } + + public Server getServer(@Nullable ServerIndex serverIndex) { + if (serverIndex == null) { + return servers.get(this.serverIndex); + } + return servers.get(serverIndex); + } +} \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/configurations/ApiConfiguration.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/configurations/ApiConfiguration.java new file mode 100644 index 00000000000..d600ad69de9 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/configurations/ApiConfiguration.java @@ -0,0 +1,53 @@ +package org.openapijsonschematools.client.configurations; + +import org.openapijsonschematools.client.servers.Server; +import org.openapijsonschematools.client.RootServerInfo; +import org.openapijsonschematools.client.paths.foo.get.FooGetServerInfo; +import org.openapijsonschematools.client.paths.petfindbystatus.PetfindbystatusServerInfo; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.Objects; + +public class ApiConfiguration { + private final ServerInfo serverInfo; + + public ApiConfiguration() { + serverInfo = new ServerInfo(); + } + + public ApiConfiguration(ServerInfo serverInfo) { + this.serverInfo = serverInfo; + } + + public static class ServerInfo { + protected final RootServerInfo rootServerInfo; + protected final FooGetServerInfo fooGetServerInfo; + protected final PetfindbystatusServerInfo petfindbystatusServerInfo; + + public ServerInfo() { + rootServerInfo = new RootServerInfo(); + fooGetServerInfo = new FooGetServerInfo(); + petfindbystatusServerInfo = new PetfindbystatusServerInfo(); + } + + public ServerInfo( + @Nullable RootServerInfo rootServerInfo, + @Nullable FooGetServerInfo fooGetServerInfo, + @Nullable PetfindbystatusServerInfo petfindbystatusServerInfo + ) { + this.rootServerInfo = Objects.requireNonNullElseGet(rootServerInfo, RootServerInfo::new); + this.fooGetServerInfo = Objects.requireNonNullElseGet(fooGetServerInfo, FooGetServerInfo::new); + this.petfindbystatusServerInfo = Objects.requireNonNullElseGet(petfindbystatusServerInfo, PetfindbystatusServerInfo::new); + } + } + + public Server getServer(RootServerInfo. @Nullable ServerIndex serverIndex) { + return serverInfo.rootServerInfo.getServer(serverIndex); + } + public Server getServer(FooGetServerInfo. @Nullable ServerIndex serverIndex) { + return serverInfo.fooGetServerInfo.getServer(serverIndex); + } + public Server getServer(PetfindbystatusServerInfo. @Nullable ServerIndex serverIndex) { + return serverInfo.petfindbystatusServerInfo.getServer(serverIndex); + } +} \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/foo/get/FooGetServerInfo.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/foo/get/FooGetServerInfo.java new file mode 100644 index 00000000000..45d598bb653 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/foo/get/FooGetServerInfo.java @@ -0,0 +1,84 @@ +package org.openapijsonschematools.client.paths.foo.get; + +import org.openapijsonschematools.client.exceptions.UnsetPropertyException; +import org.openapijsonschematools.client.paths.foo.get.servers.FooGetServer0; +import org.openapijsonschematools.client.paths.foo.get.servers.FooGetServer1; +import org.openapijsonschematools.client.servers.Server; +import org.openapijsonschematools.client.servers.ServerProvider; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.AbstractMap; +import java.util.Map; +import java.util.Objects; +import java.util.EnumMap; + +public class FooGetServerInfo implements ServerProvider { + final private Servers servers; + final private ServerIndex serverIndex; + + public FooGetServerInfo() { + this.servers = new Servers(); + this.serverIndex = ServerIndex.SERVER_0; + } + + public FooGetServerInfo(Servers servers, ServerIndex serverIndex) { + this.servers = servers; + this.serverIndex = serverIndex; + } + + public static class Servers { + private final EnumMap servers; + + public Servers() { + servers = new EnumMap<>( + Map.ofEntries( + new AbstractMap.SimpleEntry<>( + ServerIndex.SERVER_0, + new FooGetServer0() + ), + new AbstractMap.SimpleEntry<>( + ServerIndex.SERVER_1, + new FooGetServer1() + ) + ) + ); + } + + public Servers( + @Nullable FooGetServer0 server0, + @Nullable FooGetServer1 server1 + ) { + servers = new EnumMap<>( + Map.ofEntries( + new AbstractMap.SimpleEntry<>( + ServerIndex.SERVER_0, + Objects.requireNonNullElseGet(server0, FooGetServer0::new) + ), + new AbstractMap.SimpleEntry<>( + ServerIndex.SERVER_1, + Objects.requireNonNullElseGet(server1, FooGetServer1::new) + ) + ) + ); + } + + public Server get(ServerIndex serverIndex) { + if (servers.containsKey(serverIndex)) { + return get(serverIndex); + } + throw new UnsetPropertyException(serverIndex+" is unset"); + } + } + + public enum ServerIndex { + SERVER_0, + SERVER_1 + } + + public Server getServer(@Nullable ServerIndex serverIndex) { + if (serverIndex == null) { + return servers.get(this.serverIndex); + } + return servers.get(serverIndex); + } +} \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/foo/get/servers/FooGetServer0.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/foo/get/servers/FooGetServer0.java index 515598c4bc9..1ea6b69b607 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/foo/get/servers/FooGetServer0.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/foo/get/servers/FooGetServer0.java @@ -2,7 +2,7 @@ import org.openapijsonschematools.client.servers.ServerWithoutVariables; -class FooGetServer0 extends ServerWithoutVariables { +public class FooGetServer0 extends ServerWithoutVariables { public FooGetServer0() { super("https://path-server-test.petstore.local/v2"); } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/foo/get/servers/FooGetServer1.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/foo/get/servers/FooGetServer1.java index 3f43ac01d6e..4c00686226e 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/foo/get/servers/FooGetServer1.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/foo/get/servers/FooGetServer1.java @@ -8,7 +8,7 @@ import java.util.AbstractMap; -class FooGetServer1 extends ServerWithVariables { +public class FooGetServer1 extends ServerWithVariables { public FooGetServer1() { super( diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petfindbystatus/PetfindbystatusServerInfo.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petfindbystatus/PetfindbystatusServerInfo.java new file mode 100644 index 00000000000..6e499330caf --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petfindbystatus/PetfindbystatusServerInfo.java @@ -0,0 +1,84 @@ +package org.openapijsonschematools.client.paths.petfindbystatus; + +import org.openapijsonschematools.client.exceptions.UnsetPropertyException; +import org.openapijsonschematools.client.paths.petfindbystatus.servers.PetfindbystatusServer0; +import org.openapijsonschematools.client.paths.petfindbystatus.servers.PetfindbystatusServer1; +import org.openapijsonschematools.client.servers.Server; +import org.openapijsonschematools.client.servers.ServerProvider; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.AbstractMap; +import java.util.Map; +import java.util.Objects; +import java.util.EnumMap; + +public class PetfindbystatusServerInfo implements ServerProvider { + final private Servers servers; + final private ServerIndex serverIndex; + + public PetfindbystatusServerInfo() { + this.servers = new Servers(); + this.serverIndex = ServerIndex.SERVER_0; + } + + public PetfindbystatusServerInfo(Servers servers, ServerIndex serverIndex) { + this.servers = servers; + this.serverIndex = serverIndex; + } + + public static class Servers { + private final EnumMap servers; + + public Servers() { + servers = new EnumMap<>( + Map.ofEntries( + new AbstractMap.SimpleEntry<>( + ServerIndex.SERVER_0, + new PetfindbystatusServer0() + ), + new AbstractMap.SimpleEntry<>( + ServerIndex.SERVER_1, + new PetfindbystatusServer1() + ) + ) + ); + } + + public Servers( + @Nullable PetfindbystatusServer0 server0, + @Nullable PetfindbystatusServer1 server1 + ) { + servers = new EnumMap<>( + Map.ofEntries( + new AbstractMap.SimpleEntry<>( + ServerIndex.SERVER_0, + Objects.requireNonNullElseGet(server0, PetfindbystatusServer0::new) + ), + new AbstractMap.SimpleEntry<>( + ServerIndex.SERVER_1, + Objects.requireNonNullElseGet(server1, PetfindbystatusServer1::new) + ) + ) + ); + } + + public Server get(ServerIndex serverIndex) { + if (servers.containsKey(serverIndex)) { + return get(serverIndex); + } + throw new UnsetPropertyException(serverIndex+" is unset"); + } + } + + public enum ServerIndex { + SERVER_0, + SERVER_1 + } + + public Server getServer(@Nullable ServerIndex serverIndex) { + if (serverIndex == null) { + return servers.get(this.serverIndex); + } + return servers.get(serverIndex); + } +} \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petfindbystatus/servers/PetfindbystatusServer0.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petfindbystatus/servers/PetfindbystatusServer0.java index 52486b0960f..d548b1da5db 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petfindbystatus/servers/PetfindbystatusServer0.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petfindbystatus/servers/PetfindbystatusServer0.java @@ -2,7 +2,7 @@ import org.openapijsonschematools.client.servers.ServerWithoutVariables; -class PetfindbystatusServer0 extends ServerWithoutVariables { +public class PetfindbystatusServer0 extends ServerWithoutVariables { public PetfindbystatusServer0() { super("https://path-server-test.petstore.local/v2"); } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petfindbystatus/servers/PetfindbystatusServer1.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petfindbystatus/servers/PetfindbystatusServer1.java index 01449e311af..365a0597ded 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petfindbystatus/servers/PetfindbystatusServer1.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petfindbystatus/servers/PetfindbystatusServer1.java @@ -8,7 +8,7 @@ import java.util.AbstractMap; -class PetfindbystatusServer1 extends ServerWithVariables { +public class PetfindbystatusServer1 extends ServerWithVariables { public PetfindbystatusServer1() { super( diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/servers/Server.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/servers/Server.java new file mode 100644 index 00000000000..f5159644ccc --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/servers/Server.java @@ -0,0 +1,6 @@ +package org.openapijsonschematools.client.servers; + +public interface Server { + String url(); +} + diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/servers/Server0.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/servers/Server0.java index d4d772a235f..6327eea827e 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/servers/Server0.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/servers/Server0.java @@ -7,7 +7,7 @@ import java.util.AbstractMap; -class Server0 extends ServerWithVariables { +public class Server0 extends ServerWithVariables { /* petstore server */ diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/servers/Server1.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/servers/Server1.java index 40d76ee508d..12d78391b64 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/servers/Server1.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/servers/Server1.java @@ -7,7 +7,7 @@ import java.util.AbstractMap; -class Server1 extends ServerWithVariables { +public class Server1 extends ServerWithVariables { /* The local server */ diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/servers/Server2.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/servers/Server2.java index cd8cf496918..9d7cb0e0bfb 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/servers/Server2.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/servers/Server2.java @@ -2,7 +2,7 @@ import org.openapijsonschematools.client.servers.ServerWithoutVariables; -class Server2 extends ServerWithoutVariables { +public class Server2 extends ServerWithoutVariables { public Server2() { super("https://localhost:8080"); } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/servers/ServerProvider.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/servers/ServerProvider.java new file mode 100644 index 00000000000..8c93a971aae --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/servers/ServerProvider.java @@ -0,0 +1,8 @@ +package org.openapijsonschematools.client.servers; + +import org.checkerframework.checker.nullness.qual.Nullable; + +public interface ServerProvider { + Server getServer(@Nullable T serverIndex); +} + diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/servers/ServerWithVariables.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/servers/ServerWithVariables.java index acdb6d730ed..68748bcfcae 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/servers/ServerWithVariables.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/servers/ServerWithVariables.java @@ -2,7 +2,7 @@ import java.util.Map; -public abstract class ServerWithVariables> { +public abstract class ServerWithVariables> implements Server { public final String url; public final T variables; @@ -13,5 +13,9 @@ protected ServerWithVariables(String url, T variables) { } this.url = url; } + + public String url(){ + return url; + } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/servers/ServerWithoutVariables.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/servers/ServerWithoutVariables.java index 903ac3f4c7d..c41ac2e77e5 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/servers/ServerWithoutVariables.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/servers/ServerWithoutVariables.java @@ -1,10 +1,14 @@ package org.openapijsonschematools.client.servers; -public abstract class ServerWithoutVariables { +public abstract class ServerWithoutVariables implements Server { public final String url; protected ServerWithoutVariables(String url) { this.url = url; } + + public String url(){ + return url; + } } diff --git a/samples/client/petstore/python/.openapi-generator/FILES b/samples/client/petstore/python/.openapi-generator/FILES index 922904e5692..00870b8b466 100644 --- a/samples/client/petstore/python/.openapi-generator/FILES +++ b/samples/client/petstore/python/.openapi-generator/FILES @@ -1328,7 +1328,7 @@ src/petstore_api/paths/foo/get/responses/response_default/__init__.py src/petstore_api/paths/foo/get/responses/response_default/content/__init__.py src/petstore_api/paths/foo/get/responses/response_default/content/application_json/__init__.py src/petstore_api/paths/foo/get/responses/response_default/content/application_json/schema.py -src/petstore_api/paths/foo/get/servers/__init__.py +src/petstore_api/paths/foo/get/server_s/__init__.py src/petstore_api/paths/foo/get/servers/server_0.py src/petstore_api/paths/foo/get/servers/server_1.py src/petstore_api/paths/pet/__init__.py @@ -1366,7 +1366,7 @@ src/petstore_api/paths/pet_find_by_status/get/security/__init__.py src/petstore_api/paths/pet_find_by_status/get/security/security_requirement_object_0.py src/petstore_api/paths/pet_find_by_status/get/security/security_requirement_object_1.py src/petstore_api/paths/pet_find_by_status/get/security/security_requirement_object_2.py -src/petstore_api/paths/pet_find_by_status/servers/__init__.py +src/petstore_api/paths/pet_find_by_status/server_s/__init__.py src/petstore_api/paths/pet_find_by_status/servers/server_0.py src/petstore_api/paths/pet_find_by_status/servers/server_1.py src/petstore_api/paths/pet_find_by_tags/__init__.py diff --git a/samples/client/petstore/python/src/petstore_api/paths/foo/get/server_s/__init__.py b/samples/client/petstore/python/src/petstore_api/paths/foo/get/server_s/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/samples/client/petstore/python/src/petstore_api/paths/pet_find_by_status/server_s/__init__.py b/samples/client/petstore/python/src/petstore_api/paths/pet_find_by_status/server_s/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/main/java/org/openapijsonschematools/codegen/generatorrunner/DefaultGeneratorRunner.java b/src/main/java/org/openapijsonschematools/codegen/generatorrunner/DefaultGeneratorRunner.java index 971618f0602..0aa2aadc00a 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generatorrunner/DefaultGeneratorRunner.java +++ b/src/main/java/org/openapijsonschematools/codegen/generatorrunner/DefaultGeneratorRunner.java @@ -51,6 +51,7 @@ import org.openapijsonschematools.codegen.generators.openapimodels.CodegenSecurityRequirementValue; import org.openapijsonschematools.codegen.generators.openapimodels.CodegenSecurityScheme; import org.openapijsonschematools.codegen.generators.openapimodels.CodegenServer; +import org.openapijsonschematools.codegen.generators.openapimodels.CodegenServers; import org.openapijsonschematools.codegen.generators.openapimodels.CodegenTag; import org.openapijsonschematools.codegen.generators.openapimodels.CodegenText; import org.openapijsonschematools.codegen.templating.DryRunTemplateManager; @@ -1316,7 +1317,7 @@ Map buildSupportFileBundle( TreeMap headers, TreeMap parameters, TreeMap securitySchemes, - List servers, + CodegenServers servers, TreeMap paths, List> security) { @@ -1324,30 +1325,31 @@ Map buildSupportFileBundle( bundle.put("apiPackage", generator.apiPackage()); URL url = URLPathUtils.getServerURL(openAPI, null); + List allServers = new ArrayList<>(); boolean hasServers = false; if (servers != null) { + allServers.add(servers); hasServers = true; - } else if (paths != null) { + } + if (paths != null) { for (CodegenPathItem pathItem: paths.values()) { if (pathItem.servers != null) { + allServers.add(pathItem.servers); hasServers = true; - break; } if (pathItem.operations != null) { for (CodegenOperation operation: pathItem.operations.values()) { if (operation.servers != null) { + allServers.add(operation.servers); hasServers = true; - break; } } - if (hasServers) { - break; - } } } } bundle.put("openAPI", openAPI); + bundle.put("allServers", allServers); bundle.put("scheme", URLPathUtils.getScheme(url, generator)); bundle.put("contextPath", contextPath); bundle.put("requestBodies", requestBodies); @@ -1391,7 +1393,10 @@ private void generateServers(List files, List servers, Stri if (servers == null && servers.isEmpty()) { return; } - generateXs(files, jsonPath, CodegenConstants.JSON_PATH_LOCATION_TYPE.SERVERS, CodegenConstants.SERVERS, null, true); + Map serversTemplateData = new HashMap<>(); + serversTemplateData.put("packageName", generator.packageName()); + serversTemplateData.put("servers", servers); + generateXs(files, jsonPath, CodegenConstants.JSON_PATH_LOCATION_TYPE.SERVERS, CodegenConstants.SERVERS, serversTemplateData, true); int i = 0; for (CodegenServer server: servers) { @@ -1516,7 +1521,7 @@ public List generate() { // servers String serversJsonPath = "#/servers"; - List servers = generator.fromServers(openAPI.getServers(), serversJsonPath); + CodegenServers servers = generator.fromServers(openAPI.getServers(), serversJsonPath); // paths TreeMap paths = generator.fromPaths(openAPI.getPaths()); generatePaths(files, paths, servers, security); diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/DefaultGenerator.java b/src/main/java/org/openapijsonschematools/codegen/generators/DefaultGenerator.java index 652a4a068d4..b721f41682f 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/DefaultGenerator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/DefaultGenerator.java @@ -43,14 +43,9 @@ import org.openapijsonschematools.codegen.config.GlobalSettings; import org.openapijsonschematools.codegen.generators.generatormetadata.GeneratorLanguage; import org.openapijsonschematools.codegen.generators.generatormetadata.GeneratorType; -import org.openapijsonschematools.codegen.generators.generatormetadata.features.ComponentsFeature; import org.openapijsonschematools.codegen.generators.generatormetadata.features.DataTypeFeature; -import org.openapijsonschematools.codegen.generators.generatormetadata.features.DocumentationFeature; import org.openapijsonschematools.codegen.generators.generatormetadata.features.GlobalFeature; -import org.openapijsonschematools.codegen.generators.generatormetadata.features.OperationFeature; -import org.openapijsonschematools.codegen.generators.generatormetadata.features.ParameterFeature; import org.openapijsonschematools.codegen.generators.generatormetadata.features.SchemaFeature; -import org.openapijsonschematools.codegen.generators.generatormetadata.features.SecurityFeature; import org.openapijsonschematools.codegen.generators.generatormetadata.features.WireFormatFeature; import org.openapijsonschematools.codegen.generators.models.VendorExtension; import org.openapijsonschematools.codegen.generators.openapimodels.ArrayListWithContext; @@ -73,6 +68,7 @@ import org.openapijsonschematools.codegen.generators.openapimodels.CodegenSecurityRequirementValue; import org.openapijsonschematools.codegen.generators.openapimodels.CodegenSecurityScheme; import org.openapijsonschematools.codegen.generators.openapimodels.CodegenServer; +import org.openapijsonschematools.codegen.generators.openapimodels.CodegenServers; import org.openapijsonschematools.codegen.generators.openapimodels.CodegenTag; import org.openapijsonschematools.codegen.generators.openapimodels.CodegenText; import org.openapijsonschematools.codegen.generators.openapimodels.CodegenXml; @@ -2679,7 +2675,7 @@ public CodegenOperation fromOperation(Operation operation, String jsonPath, Link CodegenKey operationId = getOperationId(operation, path, httpMethod); // servers setting - List codegenServers = null; + CodegenServers codegenServers = null; if (operation.getServers() != null && !operation.getServers().isEmpty()) { // use operation-level servers first if defined codegenServers = fromServers(operation.getServers(), jsonPath + "/servers"); @@ -2874,10 +2870,10 @@ public CodegenOperation fromOperation(Operation operation, String jsonPath, Link } operationParameters = new ParameterCollection(allParams, pathParams, queryParams, headerParams, cookieParams); } - ArrayList pathItemQueryParams = null; - ArrayList pathItemPathParams = null; - ArrayList pathItemHeaderParams = null; - ArrayList pathItemCookieParams = null; + ArrayList pathItemQueryParams; + ArrayList pathItemPathParams; + ArrayList pathItemHeaderParams; + ArrayList pathItemCookieParams; ParameterCollection pathItemParams = null; if (!usedPathItemParameters.isEmpty()) { pathItemQueryParams = new ArrayList<>(); @@ -3804,16 +3800,16 @@ private void updatePathsFilepath(String[] pathPieces) { if (pathPieces.length < 4) { return; } - if (pathPieces.length < 5) { - return; - } Set xParameters = new HashSet<>(); xParameters.add("PathParameters"); xParameters.add("QueryParameters"); xParameters.add("HeaderParameters"); xParameters.add("CookieParameters"); if (pathPieces[3].equals("servers")) { - if (pathPieces.length == 5) { + if (pathPieces.length == 4) { + // #/paths/somePath/servers + pathPieces[3] = toServerFilename("s", jsonPath); + } else if (pathPieces.length == 5) { // #/paths/somePath/servers/0 pathPieces[4] = toServerFilename(pathPieces[4], jsonPath); } else { @@ -3821,7 +3817,12 @@ private void updatePathsFilepath(String[] pathPieces) { pathPieces[4] = "server" + pathPieces[4]; pathPieces[5] = "Variables"; } + return; } else if (pathPieces[3].equals("parameters")) { + if (pathPieces.length == 4) { + // #/paths/somePath/parameters + return; + } // #/paths/somePath/parameters/0 pathPieces[4] = toParameterFilename(pathPieces[4], null); if (pathPieces.length >= 7 && pathPieces[5].equals("content")) { @@ -3837,19 +3838,23 @@ private void updatePathsFilepath(String[] pathPieces) { pathPieces[5] = getSchemaFilename(jsonPath); return; } - } else if (pathPieces[4].equals("requestBody")) { + } else if (pathPieces.length == 4) { + // #/paths/SomePath/get + return; + } + if (pathPieces[4].equals("requestBody")) { // #/paths/somePath/get/requestBody pathPieces[4] = requestBodyIdentifier; - } else if (xParameters.contains(pathPieces[4])) { + } + if (xParameters.contains(pathPieces[4])) { // #/paths/somePath/get/PathParameters // synthetic jsonPath pathPieces[4] = getSchemaFilename(jsonPath); - } - if (pathPieces.length < 6) { - return; - } - if (pathPieces[4].equals("servers")) { - if (pathPieces.length == 6) { + } else if (pathPieces[4].equals("servers")) { + if (pathPieces.length == 5) { + // #/paths/somePath/get/servers + pathPieces[4] = toServerFilename("s", jsonPath); + } else if (pathPieces.length == 6) { // #/paths/somePath/get/servers/0 pathPieces[5] = toServerFilename(pathPieces[5], jsonPath); } else { @@ -3857,10 +3862,14 @@ private void updatePathsFilepath(String[] pathPieces) { pathPieces[5] = "server" + pathPieces[5]; pathPieces[6] = "Variables"; } - } else if (pathPieces[4].equals("security")) { + } else if (pathPieces[4].equals("security") && pathPieces.length > 5) { // #/paths/somePath/get/security/0 pathPieces[5] = toSecurityRequirementObjectFilename(pathPieces[5], null); } else if (pathPieces[4].equals("responses")) { + if (pathPieces.length < 6) { + // #/paths/user_login/get/responses -> length 5 + return; + } // #/paths/user_login/get/responses/200 -> 200 -> response_200 -> length 6 String responseJsonPath = "#/paths/" + path + "/" + pathPieces[3] + "/responses/" + pathPieces[5]; pathPieces[5] = toResponseModuleName(pathPieces[5], responseJsonPath); @@ -3897,6 +3906,9 @@ private void updatePathsFilepath(String[] pathPieces) { } } } else if (pathPieces[4].equals("parameters")) { + if (pathPieces.length == 5) { + return; + } // #/paths/somePath/get/parameters/0 -> length 6 pathPieces[5] = toParameterFilename(pathPieces[5], null); @@ -3917,16 +3929,16 @@ private void updatePathsFilepath(String[] pathPieces) { String contentType = ModelUtils.decodeSlashes(pathPieces[6]); pathPieces[6] = toContentTypeFilename(contentType); if (pathPieces.length == 8) { + // #/paths/somePath/get/requestBody/content/application-json/schema pathPieces[7] = getSchemaFilename(jsonPath); } } } } - private void updateServersFilepath(String[] pathPieces) { + protected void updateServersFilepath(String[] pathPieces) { if (pathPieces.length == 2) { // #/servers - return; } else if (pathPieces.length == 3) { // #/servers/0 String jsonPath = "#/servers/" + pathPieces[2]; @@ -4005,6 +4017,9 @@ public String getSubpackage(String jsonPath) { .collect(Collectors.toList()); String subpackage = String.join(".", finalPathPieces); int lastPeriodIndex = subpackage.lastIndexOf("."); + if (lastPeriodIndex < 1) { + return null; + } return subpackage.substring(1,lastPeriodIndex); } @Override @@ -4806,7 +4821,7 @@ public CodegenKey getKey(String key, String keyType, String sourceJsonPath) { case "paths": usedKey = escapeUnsafeCharacters(key); isValid = isValid(usedKey); - snakeCaseName = toModelFilename(usedKey, sourceJsonPath); + snakeCaseName = toPathFilename(usedKey, sourceJsonPath); pascalCaseName = camelize(toPathFilename(usedKey, null)); break; case "misc": @@ -4851,6 +4866,7 @@ public CodegenKey getKey(String key, String keyType, String sourceJsonPath) { isValid = isValid(usedKey); snakeCaseName = toServerFilename(usedKey, sourceJsonPath); pascalCaseName = getPascalCaseServer(usedKey, sourceJsonPath); + camelCaseName = camelize(pascalCaseName, true); break; } if (pascalCaseName != null) { @@ -5045,7 +5061,7 @@ public CodegenPathItem fromPathItem(PathItem pathItem, String jsonPath) { // sort them operations = new TreeMap<>(operations); List specServers = pathItem.getServers(); - List servers = fromServers(specServers, jsonPath + "/servers"); + CodegenServers servers = fromServers(specServers, jsonPath + "/servers"); return new CodegenPathItem( summary, @@ -5057,14 +5073,14 @@ public CodegenPathItem fromPathItem(PathItem pathItem, String jsonPath) { } @Override - public List fromServers(List servers, String jsonPath) { + public CodegenServers fromServers(List servers, String jsonPath) { if (servers == null) { return null; } - List codegenServers = new LinkedList<>(); - int i = 0; + List codegenServers = new ArrayList<>(); boolean rootServer = jsonPath.equals("#/servers"); - for (Server server : servers) { + for (int i = 0; i < servers.size(); i++) { + Server server = servers.get(i); String serverJsonPath = jsonPath + "/" + i; CodegenKey jsonPathPiece = getKey(String.valueOf(i), "servers", serverJsonPath); CodegenText description = getCodegenText(server.getDescription()); @@ -5078,9 +5094,14 @@ public List fromServers(List servers, String jsonPath) { subpackage ); codegenServers.add(cs); - i ++; } - return codegenServers; + CodegenKey jsonPathPiece = getKey("s", "servers", jsonPath); + String serversSubpackage = getSubpackage(jsonPath); + return new CodegenServers( + codegenServers, + jsonPathPiece, + serversSubpackage + ); } @Override diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/Generator.java b/src/main/java/org/openapijsonschematools/codegen/generators/Generator.java index b15c2c4249f..68a47d42177 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/Generator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/Generator.java @@ -36,7 +36,9 @@ import org.openapijsonschematools.codegen.generators.generatormetadata.GeneratorLanguage; import org.openapijsonschematools.codegen.generators.generatormetadata.GeneratorType; import org.openapijsonschematools.codegen.generators.models.VendorExtension; +import org.openapijsonschematools.codegen.generators.openapimodels.ArrayListWithContext; import org.openapijsonschematools.codegen.generators.openapimodels.CodegenRefInfo; +import org.openapijsonschematools.codegen.generators.openapimodels.CodegenServers; import org.openapijsonschematools.codegen.templating.SupportingFile; import org.openapijsonschematools.codegen.generators.models.CliOption; import org.openapijsonschematools.codegen.generators.openapimodels.CodegenHeader; @@ -157,7 +159,7 @@ public interface Generator { CodegenPathItem fromPathItem(PathItem pathItem, String jsonPath); - List fromServers(List servers, String jsonPath); + CodegenServers fromServers(List servers, String jsonPath); CodegenSchema fromServerVariables(Map variables, String jsonPath); diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java index 4a526c26d05..bf18ca47ca8 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java @@ -117,20 +117,51 @@ public String toModuleFilename(String name, String jsonPath) { return usedName.toLowerCase(Locale.ROOT); } + protected void updateServersFilepath(String[] pathPieces) { + if (pathPieces.length == 2) { + // #/servers + pathPieces[1] = "RootServerInfo"; + } else if (pathPieces.length == 3) { + // #/servers/0 + String jsonPath = "#/servers/" + pathPieces[2]; + pathPieces[2] = toServerFilename(pathPieces[2], jsonPath); + } else { + // #/servers/0/variables + pathPieces[2] = toServerFilename(pathPieces[2], null).toLowerCase(Locale.ROOT); + pathPieces[3] = "Variables"; + } + } + @Override public String getPascalCaseServer(String basename, String jsonPath) { if (jsonPath != null) { String[] pathPieces = jsonPath.split("/"); - if (jsonPath.startsWith("#/servers/")) { - return "Server"+pathPieces[2]; - } else if (jsonPath.startsWith("#/paths") && pathPieces.length == 5) { - // #/paths/somePath/servers/0 + if (jsonPath.startsWith("#/servers")) { + if (pathPieces.length == 2) { + // #/servers + return "RootServerInfo"; + } else { + // #/servers/0 + return "Server"+pathPieces[2]; + } + } else if (jsonPath.startsWith("#/paths") && pathPieces.length >= 4 && pathPieces[3].equals("servers")) { CodegenKey pathKey = getKey(ModelUtils.decodeSlashes(pathPieces[2]), "paths"); - return pathKey.pascalCase + "Server"+ pathPieces[4]; - } else if (jsonPath.startsWith("#/paths") && pathPieces.length == 6) { - // #/paths/somePath/get/servers/0 + if (pathPieces.length == 4) { + // #/paths/somePath/servers + return pathKey.pascalCase + "ServerInfo"; + } else { + // #/paths/somePath/servers/0 + return pathKey.pascalCase + "Server"+ pathPieces[4]; + } + } else if (jsonPath.startsWith("#/paths") && pathPieces.length >= 5 && pathPieces[4].equals("servers")) { CodegenKey pathKey = getKey(ModelUtils.decodeSlashes(pathPieces[2]), "paths"); - return pathKey.pascalCase + StringUtils.capitalize(pathPieces[3]) + "Server"+ pathPieces[5]; + if (pathPieces.length == 5) { + // #/paths/somePath/get/servers + return pathKey.pascalCase + StringUtils.capitalize(pathPieces[3]) + "ServerInfo"; + } else { + // #/paths/somePath/get/servers/0 + return pathKey.pascalCase + StringUtils.capitalize(pathPieces[3]) + "Server" + pathPieces[5]; + } } } return "Server" + basename; @@ -682,6 +713,10 @@ public void processOpts() { "src/main/java/packagename/configurations/SchemaConfiguration.hbs", packagePath() + File.separatorChar + "configurations", "SchemaConfiguration.java")); + supportingFiles.add(new SupportingFile( + "src/main/java/packagename/configurations/ApiConfiguration.hbs", + packagePath() + File.separatorChar + "configurations", + "ApiConfiguration.java")); HashMap schemaTemplates = new HashMap<>(); schemaTemplates.put("src/main/java/packagename/components/schemas/Schema.hbs", ".java"); @@ -2325,6 +2360,15 @@ public void setOpenAPI(OpenAPI openAPI) { super.setOpenAPI(openAPI); List servers = openAPI.getServers(); if (servers != null && !servers.isEmpty()) { + supportingFiles.add(new SupportingFile( + "src/main/java/packagename/servers/Server.hbs", + packagePath() + File.separatorChar + "servers", + "Server.java")); + supportingFiles.add(new SupportingFile( + "src/main/java/packagename/servers/ServerProvider.hbs", + packagePath() + File.separatorChar + "servers", + "ServerProvider.java")); + supportingFiles.add(new SupportingFile( "src/main/java/packagename/servers/ServerWithoutVariables.hbs", packagePath() + File.separatorChar + "servers", @@ -2337,7 +2381,13 @@ public void setOpenAPI(OpenAPI openAPI) { jsonPathTemplateFiles.put( CodegenConstants.JSON_PATH_LOCATION_TYPE.SERVER, new HashMap<>() {{ - put("src/main/java/packagename/servers/Server.hbs", ".java"); + put("src/main/java/packagename/servers/ServerN.hbs", ".java"); + }} + ); + jsonPathTemplateFiles.put( + CodegenConstants.JSON_PATH_LOCATION_TYPE.SERVERS, + new HashMap<>() {{ + put("src/main/java/packagename/servers/ServerInfo.hbs", ".java"); }} ); jsonPathDocTemplateFiles.put( diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/openapimodels/CodegenOperation.java b/src/main/java/org/openapijsonschematools/codegen/generators/openapimodels/CodegenOperation.java index d6b2507d76d..28c9d7b446e 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/openapimodels/CodegenOperation.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/openapimodels/CodegenOperation.java @@ -30,7 +30,7 @@ public class CodegenOperation { public final LinkedHashSet errorWildcardStatusCodes; // values like 4 for 4XX public final CodegenText summary, description; public final LinkedHashSet produces; - public final List servers; + public final CodegenServers servers; public final CodegenRequestBody requestBody; // properties where key is contentType, value is a ref schema, encapsulates imports public final CodegenSchema requestBodySchema; @@ -65,7 +65,7 @@ public CodegenOperation( CodegenText summary, CodegenText description, LinkedHashSet produces, - List servers, + CodegenServers servers, CodegenRequestBody requestBody, ParameterCollection parameters, CodegenSchema pathParametersSchema, diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/openapimodels/CodegenPathItem.java b/src/main/java/org/openapijsonschematools/codegen/generators/openapimodels/CodegenPathItem.java index f38754cb087..83f8fd9b0ff 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/openapimodels/CodegenPathItem.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/openapimodels/CodegenPathItem.java @@ -7,10 +7,10 @@ public class CodegenPathItem { public final CodegenText summary; public final CodegenText description; public final TreeMap operations; - public final List servers; + public final CodegenServers servers; public final List parameters; - public CodegenPathItem(CodegenText summary, CodegenText description, TreeMap operations, List servers, List parameters) { + public CodegenPathItem(CodegenText summary, CodegenText description, TreeMap operations, CodegenServers servers, List parameters) { this.summary = summary; this.description = description; this.operations = operations; diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/openapimodels/CodegenServers.java b/src/main/java/org/openapijsonschematools/codegen/generators/openapimodels/CodegenServers.java new file mode 100644 index 00000000000..b510d25c00f --- /dev/null +++ b/src/main/java/org/openapijsonschematools/codegen/generators/openapimodels/CodegenServers.java @@ -0,0 +1,30 @@ +package org.openapijsonschematools.codegen.generators.openapimodels; + +import java.util.AbstractList; +import java.util.Iterator; +import java.util.List; + +/** + * A class to store inline codegenschema definitions + */ +public class CodegenServers extends AbstractList { + public final List servers; + public final CodegenKey jsonPathPiece; + public final String subpackage; + + public CodegenServers(List servers, CodegenKey jsonPathPiece, String subpackage) { + this.servers = servers; + this.jsonPathPiece = jsonPathPiece; + this.subpackage = subpackage; + } + + @Override + public CodegenServer get(int index) { + return this.servers.get(index); + } + + @Override + public int size() { + return this.servers.size(); + } +} diff --git a/src/main/resources/java/src/main/java/packagename/configurations/ApiConfiguration.hbs b/src/main/resources/java/src/main/java/packagename/configurations/ApiConfiguration.hbs new file mode 100644 index 00000000000..a832f9b24f7 --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/configurations/ApiConfiguration.hbs @@ -0,0 +1,53 @@ +package {{{packageName}}}.configurations; + +import {{{packageName}}}.servers.Server; +{{#each allServers}} + {{#if subpackage}} +import {{{packageName}}}.{{subpackage}}.{{jsonPathPiece.pascalCase}}; + {{else}} +import {{packageName}}.{{jsonPathPiece.pascalCase}}; + {{/if}} +{{/each}} +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.Objects; + +public class ApiConfiguration { + private final ServerInfo serverInfo; + + public ApiConfiguration() { + serverInfo = new ServerInfo(); + } + + public ApiConfiguration(ServerInfo serverInfo) { + this.serverInfo = serverInfo; + } + + public static class ServerInfo { + {{#each allServers}} + protected final {{jsonPathPiece.pascalCase}} {{jsonPathPiece.camelCase}}; + {{/each}} + + public ServerInfo() { + {{#each allServers}} + {{jsonPathPiece.camelCase}} = new {{jsonPathPiece.pascalCase}}(); + {{/each}} + } + + public ServerInfo( + {{#each allServers}} + @Nullable {{jsonPathPiece.pascalCase}} {{jsonPathPiece.camelCase}}{{#unless @last}},{{/unless}} + {{/each}} + ) { + {{#each allServers}} + this.{{jsonPathPiece.camelCase}} = Objects.requireNonNullElseGet({{jsonPathPiece.camelCase}}, {{jsonPathPiece.pascalCase}}::new); + {{/each}} + } + } + + {{#each allServers}} + public Server getServer({{jsonPathPiece.pascalCase}}. @Nullable ServerIndex serverIndex) { + return serverInfo.{{jsonPathPiece.camelCase}}.getServer(serverIndex); + } + {{/each}} +} \ No newline at end of file diff --git a/src/main/resources/java/src/main/java/packagename/servers/Server.hbs b/src/main/resources/java/src/main/java/packagename/servers/Server.hbs index 91006af68e1..8d8405a8cd9 100644 --- a/src/main/resources/java/src/main/java/packagename/servers/Server.hbs +++ b/src/main/resources/java/src/main/java/packagename/servers/Server.hbs @@ -1,53 +1,6 @@ -{{#with server}} -package {{{packageName}}}.{{subpackage}}; +package {{{packageName}}}.servers; - {{#with variables}} -import {{{packageName}}}.configurations.JsonSchemaKeywordFlags; -import {{{packageName}}}.configurations.SchemaConfiguration; - {{#neq ../subpackage "servers"}} -import {{{packageName}}}.servers.ServerWithVariables; - {{/neq}} -import {{{packageName}}}.schemas.validation.MapUtils; -import {{{packageName}}}.{{subpackage}}.{{containerJsonPathPiece.pascalCase}}; - -import java.util.AbstractMap; - -class {{../jsonPathPiece.pascalCase}} extends ServerWithVariables<{{containerJsonPathPiece.pascalCase}}.{{mapOutputJsonPathPiece.pascalCase}}> { - {{#if ../description}} - /* - {{../description.original}} - */ - {{/if}} - - public {{../jsonPathPiece.pascalCase}}() { - super( - "{{../url}}", - {{containerJsonPathPiece.pascalCase}}.{{jsonPathPiece.pascalCase}}.getInstance().validate( - MapUtils.makeMap( - {{#each requiredProperties}} - new AbstractMap.SimpleEntry<>("{{{@key.original}}}", {{../containerJsonPathPiece.pascalCase}}.{{jsonPathPiece.pascalCase}}.getInstance().defaultValue()){{#unless @last}},{{/unless}} - {{/each}} - ), - new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone()) - ) - ); - } - public {{../jsonPathPiece.pascalCase}}({{containerJsonPathPiece.pascalCase}}.{{mapOutputJsonPathPiece.pascalCase}} variables) { - super("{{../url}}", variables); - } +public interface Server { + String url(); } - {{else}} -import {{{packageName}}}.servers.ServerWithoutVariables; -class {{jsonPathPiece.pascalCase}} extends ServerWithoutVariables { - {{#if ../description}} - /* - {{../description.original}} - */ - {{/if}} - public {{jsonPathPiece.pascalCase}}() { - super("{{url}}"); - } -} - {{/with}} -{{/with}} \ No newline at end of file diff --git a/src/main/resources/java/src/main/java/packagename/servers/ServerInfo.hbs b/src/main/resources/java/src/main/java/packagename/servers/ServerInfo.hbs new file mode 100644 index 00000000000..3f73b7eb5a3 --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/servers/ServerInfo.hbs @@ -0,0 +1,87 @@ +{{#if servers.subpackage}} +package {{{packageName}}}.{{servers.subpackage}}; +{{else}} +package {{{packageName}}}; +{{/if}} + +import {{{packageName}}}.exceptions.UnsetPropertyException; +{{#each servers}} +import {{{packageName}}}.{{subpackage}}.{{jsonPathPiece.pascalCase}}; +{{/each}} +import {{{packageName}}}.servers.Server; +import {{{packageName}}}.servers.ServerProvider; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.AbstractMap; +import java.util.Map; +import java.util.Objects; +import java.util.EnumMap; + +public class {{servers.jsonPathPiece.pascalCase}} implements ServerProvider<{{servers.jsonPathPiece.pascalCase}}.ServerIndex> { + final private Servers servers; + final private ServerIndex serverIndex; + + public {{servers.jsonPathPiece.pascalCase}}() { + this.servers = new Servers(); + this.serverIndex = ServerIndex.SERVER_0; + } + + public {{servers.jsonPathPiece.pascalCase}}(Servers servers, ServerIndex serverIndex) { + this.servers = servers; + this.serverIndex = serverIndex; + } + + public static class Servers { + private final EnumMap servers; + + public Servers() { + servers = new EnumMap<>( + Map.ofEntries( + {{#each servers}} + new AbstractMap.SimpleEntry<>( + ServerIndex.SERVER_{{@index}}, + new {{jsonPathPiece.pascalCase}}() + ){{#unless @last}},{{/unless}} + {{/each}} + ) + ); + } + + public Servers( + {{#each servers}} + @Nullable {{jsonPathPiece.pascalCase}} server{{@index}}{{#unless @last}},{{/unless}} + {{/each}} + ) { + servers = new EnumMap<>( + Map.ofEntries( + {{#each servers}} + new AbstractMap.SimpleEntry<>( + ServerIndex.SERVER_{{@index}}, + Objects.requireNonNullElseGet(server{{@index}}, {{jsonPathPiece.pascalCase}}::new) + ){{#unless @last}},{{/unless}} + {{/each}} + ) + ); + } + + public Server get(ServerIndex serverIndex) { + if (servers.containsKey(serverIndex)) { + return get(serverIndex); + } + throw new UnsetPropertyException(serverIndex+" is unset"); + } + } + + public enum ServerIndex { + {{#each servers}} + SERVER_{{@index}}{{#unless @last}},{{/unless}} + {{/each}} + } + + public Server getServer(@Nullable ServerIndex serverIndex) { + if (serverIndex == null) { + return servers.get(this.serverIndex); + } + return servers.get(serverIndex); + } +} \ No newline at end of file diff --git a/src/main/resources/java/src/main/java/packagename/servers/ServerN.hbs b/src/main/resources/java/src/main/java/packagename/servers/ServerN.hbs new file mode 100644 index 00000000000..931bccba6b9 --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/servers/ServerN.hbs @@ -0,0 +1,53 @@ +{{#with server}} +package {{{packageName}}}.{{subpackage}}; + + {{#with variables}} +import {{{packageName}}}.configurations.JsonSchemaKeywordFlags; +import {{{packageName}}}.configurations.SchemaConfiguration; + {{#neq ../subpackage "servers"}} +import {{{packageName}}}.servers.ServerWithVariables; + {{/neq}} +import {{{packageName}}}.schemas.validation.MapUtils; +import {{{packageName}}}.{{subpackage}}.{{containerJsonPathPiece.pascalCase}}; + +import java.util.AbstractMap; + +public class {{../jsonPathPiece.pascalCase}} extends ServerWithVariables<{{containerJsonPathPiece.pascalCase}}.{{mapOutputJsonPathPiece.pascalCase}}> { + {{#if ../description}} + /* + {{../description.original}} + */ + {{/if}} + + public {{../jsonPathPiece.pascalCase}}() { + super( + "{{../url}}", + {{containerJsonPathPiece.pascalCase}}.{{jsonPathPiece.pascalCase}}.getInstance().validate( + MapUtils.makeMap( + {{#each requiredProperties}} + new AbstractMap.SimpleEntry<>("{{{@key.original}}}", {{../containerJsonPathPiece.pascalCase}}.{{jsonPathPiece.pascalCase}}.getInstance().defaultValue()){{#unless @last}},{{/unless}} + {{/each}} + ), + new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone()) + ) + ); + } + public {{../jsonPathPiece.pascalCase}}({{containerJsonPathPiece.pascalCase}}.{{mapOutputJsonPathPiece.pascalCase}} variables) { + super("{{../url}}", variables); + } +} + {{else}} +import {{{packageName}}}.servers.ServerWithoutVariables; + +public class {{jsonPathPiece.pascalCase}} extends ServerWithoutVariables { + {{#if ../description}} + /* + {{../description.original}} + */ + {{/if}} + public {{jsonPathPiece.pascalCase}}() { + super("{{url}}"); + } +} + {{/with}} +{{/with}} \ No newline at end of file diff --git a/src/main/resources/java/src/main/java/packagename/servers/ServerProvider.hbs b/src/main/resources/java/src/main/java/packagename/servers/ServerProvider.hbs new file mode 100644 index 00000000000..7ae5f250dda --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/servers/ServerProvider.hbs @@ -0,0 +1,8 @@ +package {{{packageName}}}.servers; + +import org.checkerframework.checker.nullness.qual.Nullable; + +public interface ServerProvider { + Server getServer(@Nullable T serverIndex); +} + diff --git a/src/main/resources/java/src/main/java/packagename/servers/ServerWithVariables.hbs b/src/main/resources/java/src/main/java/packagename/servers/ServerWithVariables.hbs index 4eb078b7ca2..973e0d6649a 100644 --- a/src/main/resources/java/src/main/java/packagename/servers/ServerWithVariables.hbs +++ b/src/main/resources/java/src/main/java/packagename/servers/ServerWithVariables.hbs @@ -2,7 +2,7 @@ package {{{packageName}}}.servers; import java.util.Map; -public abstract class ServerWithVariables> { +public abstract class ServerWithVariables> implements Server { public final String url; public final T variables; @@ -13,5 +13,9 @@ public abstract class ServerWithVariables> { } this.url = url; } + + public String url(){ + return url; + } } diff --git a/src/main/resources/java/src/main/java/packagename/servers/ServerWithoutVariables.hbs b/src/main/resources/java/src/main/java/packagename/servers/ServerWithoutVariables.hbs index 06ae0d7e5f0..8adff0b1825 100644 --- a/src/main/resources/java/src/main/java/packagename/servers/ServerWithoutVariables.hbs +++ b/src/main/resources/java/src/main/java/packagename/servers/ServerWithoutVariables.hbs @@ -1,10 +1,14 @@ package {{{packageName}}}.servers; -public abstract class ServerWithoutVariables { +public abstract class ServerWithoutVariables implements Server { public final String url; protected ServerWithoutVariables(String url) { this.url = url; } + + public String url(){ + return url; + } } diff --git a/src/test/java/org/openapijsonschematools/codegen/generatorrunner/DefaultGeneratorRunnerTest.java b/src/test/java/org/openapijsonschematools/codegen/generatorrunner/DefaultGeneratorRunnerTest.java index bc43f5aeab4..2584da109d3 100644 --- a/src/test/java/org/openapijsonschematools/codegen/generatorrunner/DefaultGeneratorRunnerTest.java +++ b/src/test/java/org/openapijsonschematools/codegen/generatorrunner/DefaultGeneratorRunnerTest.java @@ -25,6 +25,7 @@ import org.openapijsonschematools.codegen.generators.openapimodels.CodegenSchema; import org.openapijsonschematools.codegen.generators.openapimodels.CodegenServer; import org.openapijsonschematools.codegen.common.ModelUtils; +import org.openapijsonschematools.codegen.generators.openapimodels.CodegenServers; import org.testng.Assert; import org.testng.annotations.Test; @@ -608,11 +609,11 @@ public void testHandlesTrailingSlashInServers() { generator.opts(opts); generator.configureGeneratorProperties(); - List servers = config.fromServers(openAPI.getServers(), "#/servers"); + CodegenServers servers = config.fromServers(openAPI.getServers(), "#/servers"); Map bundle = generator.buildSupportFileBundle( null, null, null, null, null, null, servers, null, null); - LinkedList bundleServers = (LinkedList) bundle.get("servers"); + CodegenServers bundleServers = (CodegenServers) bundle.get("servers"); Assert.assertEquals(bundleServers.get(0).url, ""); Assert.assertEquals(bundleServers.get(1).url, "http://trailingshlash.io:80/v1"); Assert.assertEquals(bundleServers.get(2).url, "http://notrailingslash.io:80/v2"); @@ -634,11 +635,11 @@ public void testHandlesRelativeUrlsInServers() { List files = new ArrayList<>(); - List servers = config.fromServers(openAPI.getServers(), "#/servers"); + CodegenServers servers = config.fromServers(openAPI.getServers(), "#/servers"); Map bundle = generator.buildSupportFileBundle( null, null, null, null, null, null, servers, null, null); - LinkedList bundleServers = (LinkedList) bundle.get("servers"); + CodegenServers bundleServers = (CodegenServers) bundle.get("servers"); Assert.assertEquals(bundleServers.get(0).url, "/relative/url"); }