diff --git a/openapi-generator-config-java.yml b/openapi-generator-config-java.yml index ed33088..767e548 100644 --- a/openapi-generator-config-java.yml +++ b/openapi-generator-config-java.yml @@ -13,3 +13,8 @@ additionalProperties: scmConnection: scm:git@github.com:stackitcloud/stackit-sdk-java.git scmDeveloperConnection: scm:git@github.com:stackitcloud/stackit-sdk-java.git scmUrl: https://github.com/stackitcloud/stackit-sdk-java + +files: + custom/serviceApi.mustache: + templateType: API + destinationFilename: ServiceApi.java diff --git a/scripts/generate-sdk/languages/java.sh b/scripts/generate-sdk/languages/java.sh index b2c7bb8..fa6da55 100644 --- a/scripts/generate-sdk/languages/java.sh +++ b/scripts/generate-sdk/languages/java.sh @@ -79,6 +79,8 @@ generate_java_sdk() { service="${service_json##*/}" service="${service%.json}" + service_pascal_case=$(to_pascal_case "${service}") + # Remove invalid characters to ensure a valid Java pkg name service="${service//-/}" # remove dashes service="${service// /}" # remove spaces @@ -117,10 +119,17 @@ generate_java_sdk() { --git-user-id ${GIT_USER_ID} \ --git-repo-id ${GIT_REPO_ID} \ --global-property apis,models,modelTests=false,modelDocs=false,apiDocs=false,apiTests=false,supportingFiles \ - --additional-properties=artifactId="stackit-sdk-${service}",artifactDescription="${SERVICE_DESCRIPTION}",invokerPackage="cloud.stackit.sdk.${service}",modelPackage="cloud.stackit.sdk.${service}.model",apiPackage="cloud.stackit.sdk.${service}.api" >/dev/null \ - --http-user-agent stackit-sdk-java/"${service}" \ + --additional-properties=artifactId="stackit-sdk-${service}",artifactDescription="${SERVICE_DESCRIPTION}",invokerPackage="cloud.stackit.sdk.${service}",modelPackage="cloud.stackit.sdk.${service}.model",apiPackage="cloud.stackit.sdk.${service}.api",serviceName="${service_pascal_case}" >/dev/null \ + --http-user-agent stackit-sdk-java/"${service}" \ --config openapi-generator-config-java.yml + # Rename DefaultApiServiceApi.java to {serviceName}Api.java + # This approach is a workaround because the file name cannot be set dynamically via --additional-properties or the config file in OpenAPI Generator. + api_file="${SERVICES_FOLDER}/${service}/src/main/java/cloud/stackit/sdk/${service}/api/DefaultApiServiceApi.java" + if [ -f "$api_file" ]; then + mv "$api_file" "${SERVICES_FOLDER}/${service}/src/main/java/cloud/stackit/sdk/${service}/api/${service_pascal_case}Api.java" + fi + # Remove unnecessary files rm "${SERVICES_FOLDER}/${service}/.openapi-generator-ignore" rm -r "${SERVICES_FOLDER}/${service}/.openapi-generator/" @@ -154,3 +163,15 @@ generate_java_sdk() { cd "${SDK_REPO_LOCAL_PATH}" make fmt } + +to_pascal_case() { + # Joins all arguments, splits on space or dash, capitalizes each part, and concatenates. + echo "$1" | awk -F'[- ]' '{ + for (i=1; i<=NF; i++) { + $i = toupper(substr($i,1,1)) tolower(substr($i,2)) + } + printf "%s", $1 + for (i=2; i<=NF; i++) printf "%s", $i + print "" + }' +} \ No newline at end of file diff --git a/templates/java/api.mustache b/templates/java/api.mustache index a121f5b..eba41c8 100644 --- a/templates/java/api.mustache +++ b/templates/java/api.mustache @@ -56,7 +56,8 @@ import cloud.stackit.sdk.core.config.CoreConfiguration; import cloud.stackit.sdk.core.exception.ApiException; {{#operations}} -public class {{classname}} { +// Package-private access to enforce service-specific API usage (DefaultApi => Api) +class {{classname}} { private ApiClient localVarApiClient; private int localHostIndex; private String localCustomBaseUrl; diff --git a/templates/java/custom/serviceApi.mustache b/templates/java/custom/serviceApi.mustache new file mode 100644 index 0000000..7f90aa9 --- /dev/null +++ b/templates/java/custom/serviceApi.mustache @@ -0,0 +1,15 @@ +package {{invokerPackage}}.api; + +import cloud.stackit.sdk.core.config.CoreConfiguration; +import java.io.IOException; + +public class {{serviceName}}Api extends DefaultApi { + public {{serviceName}}Api() throws IOException { + super(); + } + + public {{serviceName}}Api(CoreConfiguration configuration) + throws IOException { + super(configuration); + } +} \ No newline at end of file