From d3eaa644b347e287484f807154bd54e1e72de57a Mon Sep 17 00:00:00 2001 From: Radek Davidek Date: Wed, 1 Oct 2025 18:48:22 +0200 Subject: [PATCH] swagger as yaml from exported zip --- pom.xml | 5 ++ .../cz/trask/apioperator/AbstractProcess.java | 5 ++ .../java/cz/trask/apioperator/ApiSync.java | 2 +- .../cz/trask/apioperator/impl/Import.java | 60 +++++-------------- 4 files changed, 26 insertions(+), 46 deletions(-) diff --git a/pom.xml b/pom.xml index 10b7ac9..9606c72 100644 --- a/pom.xml +++ b/pom.xml @@ -33,6 +33,11 @@ gson 2.13.1 + + org.yaml + snakeyaml + 2.4 + diff --git a/src/main/java/cz/trask/apioperator/AbstractProcess.java b/src/main/java/cz/trask/apioperator/AbstractProcess.java index 3eaa80b..1996e37 100644 --- a/src/main/java/cz/trask/apioperator/AbstractProcess.java +++ b/src/main/java/cz/trask/apioperator/AbstractProcess.java @@ -16,6 +16,7 @@ import javax.net.ssl.HttpsURLConnection; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.yaml.snakeyaml.Yaml; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -31,12 +32,16 @@ public abstract class AbstractProcess { private static Logger log = LogManager.getLogger(AbstractProcess.class); protected Gson gson; + + protected Yaml yaml; protected ConfigManager config = ConfigManager.getInstance(); protected AbstractProcess() { gson = new GsonBuilder().create(); + + yaml = new Yaml(); setTrustStoreCredentials(); diff --git a/src/main/java/cz/trask/apioperator/ApiSync.java b/src/main/java/cz/trask/apioperator/ApiSync.java index 2d52a22..350efd6 100644 --- a/src/main/java/cz/trask/apioperator/ApiSync.java +++ b/src/main/java/cz/trask/apioperator/ApiSync.java @@ -24,7 +24,7 @@ public class ApiSync { if (sp.getCommand().equalsIgnoreCase("import")) { log.info("Import command selected."); - Import imp = new Import(sp); + Import imp = new Import(); imp.process(); } } diff --git a/src/main/java/cz/trask/apioperator/impl/Import.java b/src/main/java/cz/trask/apioperator/impl/Import.java index 94e9acd..957de05 100644 --- a/src/main/java/cz/trask/apioperator/impl/Import.java +++ b/src/main/java/cz/trask/apioperator/impl/Import.java @@ -18,15 +18,14 @@ import org.apache.logging.log4j.Logger; import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonObject; -import com.google.gson.JsonParser; import com.google.gson.reflect.TypeToken; import cz.trask.apioperator.AbstractProcess; import cz.trask.apioperator.model.APIInfo; import cz.trask.apioperator.model.APIList; +import cz.trask.apioperator.model.FileType; import cz.trask.apioperator.model.HttpResponse; import cz.trask.apioperator.model.RegisterResponse; -import cz.trask.apioperator.model.StartParameters; import cz.trask.apioperator.model.TokenResponse; import cz.trask.apioperator.model.ZipEntryData; import cz.trask.apioperator.utils.ZipExtractor; @@ -40,22 +39,6 @@ import io.apicurio.registry.rest.v2.beans.Rule; import io.apicurio.registry.rest.v2.beans.VersionSearchResults; import io.apicurio.registry.types.RuleType; -/** - * Import class – reads APIs from WSO2 APIM and publishes them to Apicurio. - * - *

- * All major improvements from the original code: - *

- *

- */ public class Import extends AbstractProcess { private static final Logger log = LogManager.getLogger(Import.class); @@ -63,11 +46,9 @@ public class Import extends AbstractProcess { private final AtomicInteger apiCounter = new AtomicInteger(1); private final Gson gson = new Gson(); - private final StartParameters sp; private final RegistryClient client; - public Import(StartParameters sp) throws Exception { - this.sp = sp; + public Import() throws Exception { this.client = RegistryClientFactory.create(config.getApicurioApiUrl()); } @@ -143,8 +124,6 @@ public class Import extends AbstractProcess { Map httpHeaders = Collections.singletonMap("Authorization", "Bearer " + tokenResponse.getAccess_token()); - String type = mapApiType(api.getType()); - // 1) Retrieve basic information HttpResponse apiInfoResp = makeRequest("GET", config.getSourceDevportalApiUrl() + "/apis/" + api.getId(), httpHeaders, Collections.emptyMap()); @@ -153,17 +132,23 @@ public class Import extends AbstractProcess { config.getSourcePublisherApiUrl() + "/subscriptions?apiId=" + api.getId(), httpHeaders, Collections.emptyMap()); - HttpResponse swaggerResp = makeRequest("GET", - config.getSourcePublisherApiUrl() + "/apis/" + api.getId() + "/swagger", httpHeaders, - Collections.emptyMap()); - // 2) Export the API as a zip HttpResponse exportedZip = makeRequest("GET", config.getSourcePublisherApiUrl() + "/apis/export?apiId=" + api.getId(), httpHeaders, Collections.emptyMap(), true); List zipEntries = ZipExtractor.extractFilesFromZip(exportedZip.getResponseBytes()); - + + String swagger = null; + + for (ZipEntryData e : zipEntries) { + if (e.getType().toString().equals(FileType.OPENAPI.toString())) { + log.debug("Found main API definition file: {}", e.getName()); + swagger = new String(e.getContent()); + break; + } + } + // 3) Deserialize JSON responses TypeToken> mapType = new TypeToken<>() { }; @@ -190,7 +175,8 @@ public class Import extends AbstractProcess { + devPortUrl; // 6) Update the swagger with the description and servers - JsonObject swaggerObj = JsonParser.parseString(swaggerResp.getResponse()).getAsJsonObject(); + Map swaggerMap = yaml.load(swagger); + JsonObject swaggerObj = gson.toJsonTree(swaggerMap).getAsJsonObject(); updateSwagger(swaggerObj, apiMap, fullDesc); // 7) Prepare artifact creation/update @@ -258,22 +244,6 @@ public class Import extends AbstractProcess { /* Helper methods */ /* --------------------------------------------------------------------- */ - private String mapApiType(String type) { - // Java 11 does not support switch‑expressions - switch (type) { - case "HTTP": - return "OPENAPI"; - case "GRAPHQL": - return "GRAPHQL"; - case "WS": - return "ASYNCAPI"; - case "SOAP": - return "WSDL"; - default: - return type; - } - } - private void updateSwagger(JsonObject swagger, Map apiMap, String description) { JsonObject info = swagger.getAsJsonObject("info"); if (info != null) {