added UrlTemplates from swagger to api def

This commit is contained in:
Radek Davidek 2025-10-21 19:49:00 +02:00
parent 5b5ce421d5
commit 0176e0ce90
5 changed files with 98 additions and 51 deletions

View File

@ -44,6 +44,11 @@
<version>1.18.38</version> <version>1.18.38</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency>
<groupId>org.wso2.carbon.apimgt</groupId>
<artifactId>org.wso2.carbon.apimgt.impl</artifactId>
<version>9.31.86</version>
</dependency>
</dependencies> </dependencies>
<build> <build>

View File

@ -35,9 +35,8 @@ public abstract class AbstractProcess {
protected static final String PARAM_SOURCE_APIM = "source_apim"; protected static final String PARAM_SOURCE_APIM = "source_apim";
protected static final String VERSION_32 = "v32"; protected static final String VERSION_32 = "v32";
protected static ObjectMapper mapper; public static ObjectMapper mapper;
public static ObjectMapper mapperYaml;
protected static ObjectMapper mapperYaml;
protected ConfigManager config = ConfigManager.getInstance(); protected ConfigManager config = ConfigManager.getInstance();
@ -47,9 +46,10 @@ public abstract class AbstractProcess {
YAMLFactory yamlFactory = new YAMLFactory(); YAMLFactory yamlFactory = new YAMLFactory();
yamlFactory.configure(YAMLGenerator.Feature.WRITE_DOC_START_MARKER, false); yamlFactory.configure(YAMLGenerator.Feature.WRITE_DOC_START_MARKER, false);
yamlFactory.configure(YAMLGenerator.Feature.MINIMIZE_QUOTES, true); yamlFactory.configure(YAMLGenerator.Feature.MINIMIZE_QUOTES, true);
yamlFactory.configure(YAMLGenerator.Feature.SPLIT_LINES, false);
mapperYaml = new ObjectMapper(yamlFactory); mapperYaml = new ObjectMapper(yamlFactory);
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
setTrustStoreCredentials(); setTrustStoreCredentials();
javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(new javax.net.ssl.HostnameVerifier() { javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(new javax.net.ssl.HostnameVerifier() {

View File

@ -2,10 +2,10 @@ package cz.trask.migration.impl.v45;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@ -15,6 +15,9 @@ import java.util.zip.ZipOutputStream;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.wso2.carbon.apimgt.api.APIDefinition;
import org.wso2.carbon.apimgt.api.model.URITemplate;
import org.wso2.carbon.apimgt.impl.definitions.OASParserUtil;
import cz.trask.migration.AbstractProcess; import cz.trask.migration.AbstractProcess;
import cz.trask.migration.mapper.ApiDefinitionMapper; import cz.trask.migration.mapper.ApiDefinitionMapper;
@ -161,13 +164,17 @@ public class ExportToWso2FromV32 extends AbstractProcess {
} }
public static byte[] prepareApiZipFile32to45(RegistryClient client, SearchedVersion ver, public static byte[] prepareApiZipFile32to45(RegistryClient client, SearchedVersion ver,
List<ArtifactReference> ref) throws IOException { List<ArtifactReference> ref) throws Exception {
String baseDir = ver.getName() + "-" + ver.getVersion() + "/"; String baseDir = ver.getName() + "-" + ver.getVersion() + "/";
try (ByteArrayOutputStream baos = new ByteArrayOutputStream(); try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
ZipOutputStream zos = new ZipOutputStream(baos)) { ZipOutputStream zos = new ZipOutputStream(baos)) {
ApiDefinition32 apiDef = null;
APIDefinition openApiParser = null;
String contentStr = null;
for (ArtifactReference r : ref) { for (ArtifactReference r : ref) {
log.info(" - Reference: {} {} {}", r.getGroupId(), r.getArtifactId(), r.getVersion()); log.info(" - Reference: {} {} {}", r.getGroupId(), r.getArtifactId(), r.getVersion());
@ -187,10 +194,17 @@ public class ExportToWso2FromV32 extends AbstractProcess {
byte[] content = client.getContentByGlobalId(amd.getGlobalId()).readAllBytes(); byte[] content = client.getContentByGlobalId(amd.getGlobalId()).readAllBytes();
if (FileType.APIDEF.toString().equals(amd.getGroupId())) { if (FileType.APIDEF.toString().equals(amd.getGroupId())) {
ApiDefinition32 apiDef = mapperYaml.readValue(content, ApiDefinition32.class); apiDef = mapperYaml.readValue(content, ApiDefinition32.class);
ApiDefinition45 apiDef45 = ApiDefinitionMapper.map(apiDef); } else if (FileType.OPENAPI.toString().equals(amd.getGroupId())) {
contentStr = new String(content);
if (contentStr != null)
openApiParser = OASParserUtil.getOASParser(contentStr);
}
if (apiDef != null && openApiParser != null) {
ApiDefinition45 apiDef45 = ApiDefinitionMapper.map(apiDef, openApiParser, contentStr);
content = mapperYaml.writeValueAsBytes(apiDef45); content = mapperYaml.writeValueAsBytes(apiDef45);
FileOutputStream fos = new FileOutputStream(r.getName()); FileOutputStream fos = new FileOutputStream("api.yaml");
fos.write(content); fos.write(content);
fos.flush(); fos.flush();
fos.close(); fos.close();

View File

@ -5,12 +5,16 @@ import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import com.fasterxml.jackson.core.type.TypeReference; import org.wso2.carbon.apimgt.api.APIDefinition;
import com.fasterxml.jackson.databind.ObjectMapper; import org.wso2.carbon.apimgt.api.model.Scope;
import org.wso2.carbon.apimgt.api.model.URITemplate;
import com.fasterxml.jackson.core.type.TypeReference;
import cz.trask.migration.AbstractProcess;
import cz.trask.migration.model.ApiDefinition32; import cz.trask.migration.model.ApiDefinition32;
import cz.trask.migration.model.ApiDefinition45; import cz.trask.migration.model.ApiDefinition45;
import cz.trask.migration.model.ApiDefinition45.ApiPolicies; import cz.trask.migration.model.ApiDefinition45.ApiPolicies;
@ -18,9 +22,8 @@ import cz.trask.migration.util.CredentialsDecoder;
public class ApiDefinitionMapper { public class ApiDefinitionMapper {
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); public static ApiDefinition45 map(ApiDefinition32 oldApi, APIDefinition openApiParser, String swagger)
throws Exception {
public static ApiDefinition45 map(ApiDefinition32 oldApi) {
if (oldApi == null) if (oldApi == null)
return null; return null;
@ -30,13 +33,19 @@ public class ApiDefinitionMapper {
ApiDefinition45.DataSection data = new ApiDefinition45.DataSection(); ApiDefinition45.DataSection data = new ApiDefinition45.DataSection();
Map<String, Object> swaggerData = AbstractProcess.mapperYaml.readValue(swagger, Map.class);
// ---------- základní metadata ---------- // ---------- základní metadata ----------
data.setId(oldApi.getUuid()); data.setId(oldApi.getUuid());
data.setName(oldApi.getId() != null ? oldApi.getId().getApiName() : null); data.setName(oldApi.getId() != null ? oldApi.getId().getApiName() : null);
// data.setDescription(oldApi.getDescription()); data.setDescription(swaggerData.get("info") != null
? ((Map<String, Object>) swaggerData.get("info")).get("description") != null
? ((Map<String, Object>) swaggerData.get("info")).get("description").toString()
: ""
: "");
data.setVersion(oldApi.getId() != null ? oldApi.getId().getVersion() : null); data.setVersion(oldApi.getId() != null ? oldApi.getId().getVersion() : null);
data.setProvider(oldApi.getId() != null ? oldApi.getId().getProviderName() : null); data.setProvider(oldApi.getId() != null ? oldApi.getId().getProviderName() : null);
data.setContext(oldApi.getContext()); data.setContext(swaggerData.get("basePath") != null ? swaggerData.get("basePath").toString() : "");
data.setLifeCycleStatus(oldApi.getStatus()); data.setLifeCycleStatus(oldApi.getStatus());
data.setDefaultVersion(oldApi.isDefaultVersion()); data.setDefaultVersion(oldApi.isDefaultVersion());
data.setRevision(false); data.setRevision(false);
@ -68,13 +77,22 @@ public class ApiDefinitionMapper {
} else { } else {
data.setSecurityScheme(Collections.emptyList()); data.setSecurityScheme(Collections.emptyList());
} }
data.setApiKeyHeader("ApiKey"); data.setApiKeyHeader("ApiKey");
data.setOrganizationId("carbon.super"); data.setOrganizationId("carbon.super");
data.setAsyncTransportProtocols(Collections.emptyList()); data.setAsyncTransportProtocols(Collections.emptyList());
data.setCategories(Collections.emptyList()); data.setCategories(Collections.emptyList());
data.setSubtypeConfiguration(new ApiDefinition45.SubtypeConfiguration());
data.getSubtypeConfiguration().setSubtype("DEFAULT");
data.setScopes(new ArrayList<>());
data.setWebsubSubscriptionConfiguration(new ApiDefinition45.WebsubSubscriptionConfiguration());
data.getWebsubSubscriptionConfiguration().setEnable(false);
data.getWebsubSubscriptionConfiguration().setSecret("");
data.getWebsubSubscriptionConfiguration().setSigningAlgorithm("SHA1");
data.getWebsubSubscriptionConfiguration().setSignatureHeader("x-hub-signature");
// ---------- cache ---------- // ---------- cache ----------
data.setResponseCachingEnabled( data.setResponseCachingEnabled(
oldApi.getResponseCache() != null && !"disabled".equalsIgnoreCase(oldApi.getResponseCache())); oldApi.getResponseCache() != null && !"disabled".equalsIgnoreCase(oldApi.getResponseCache()));
@ -99,7 +117,7 @@ public class ApiDefinitionMapper {
ai.setApiOwner(oldApi.getId() != null ? oldApi.getId().getProviderName() : null); ai.setApiOwner(oldApi.getId() != null ? oldApi.getId().getProviderName() : null);
ai.setVendor("WSO2"); ai.setVendor("WSO2");
data.setAdvertiseInfo(ai); data.setAdvertiseInfo(ai);
data.setVisibleOrganizations(Arrays.asList("none")); data.setVisibleOrganizations(Arrays.asList("none"));
// ---------- gateway ---------- // ---------- gateway ----------
@ -116,7 +134,8 @@ public class ApiDefinitionMapper {
data.setSubscriptionAvailableTenants(Collections.emptyList()); data.setSubscriptionAvailableTenants(Collections.emptyList());
// ---------- operations ---------- // ---------- operations ----------
data.setOperations(mapOperations(oldApi)); Set<URITemplate> uriTemplates = openApiParser.getURITemplates(swagger);
data.setOperations(mapOperations(uriTemplates));
// ---------- additional metadata ---------- // ---------- additional metadata ----------
data.setCreatedTime(oldApi.getCreatedTime()); data.setCreatedTime(oldApi.getCreatedTime());
@ -132,39 +151,39 @@ public class ApiDefinitionMapper {
private static ApiPolicies mapApiPolicies(ApiDefinition32 oldApi) { private static ApiPolicies mapApiPolicies(ApiDefinition32 oldApi) {
ApiDefinition45.ApiPolicies apiPolicies = new ApiDefinition45.ApiPolicies(); ApiDefinition45.ApiPolicies apiPolicies = new ApiDefinition45.ApiPolicies();
// ---------- request policies ---------- // ---------- request policies ----------
if (oldApi.getInSequence()!=null && !oldApi.getInSequence().isEmpty()) { if (oldApi.getInSequence() != null && !oldApi.getInSequence().isEmpty()) {
ApiDefinition45.Policy requestPolicy = new ApiDefinition45.Policy(); ApiDefinition45.Policy requestPolicy = new ApiDefinition45.Policy();
requestPolicy.setPolicyName(oldApi.getInSequence()); requestPolicy.setPolicyName(oldApi.getInSequence());
requestPolicy.setPolicyType("common"); requestPolicy.setPolicyType("common");
requestPolicy.setPolicyVersion("v1"); requestPolicy.setPolicyVersion("v1");
requestPolicy.setPolicyId(UUID.randomUUID().toString()); requestPolicy.setPolicyId("");
requestPolicy.setParameters(Collections.emptyMap()); requestPolicy.setParameters(Collections.emptyMap());
apiPolicies.setRequest(List.of(requestPolicy)); apiPolicies.setRequest(List.of(requestPolicy));
} else } else
apiPolicies.setRequest(Collections.emptyList()); apiPolicies.setRequest(Collections.emptyList());
// ---------- response policies ---------- // ---------- response policies ----------
if (oldApi.getOutSequence()!=null && !oldApi.getOutSequence().isEmpty()) { if (oldApi.getOutSequence() != null && !oldApi.getOutSequence().isEmpty()) {
ApiDefinition45.Policy requestPolicy = new ApiDefinition45.Policy(); ApiDefinition45.Policy requestPolicy = new ApiDefinition45.Policy();
requestPolicy.setPolicyName(oldApi.getOutSequence()); requestPolicy.setPolicyName(oldApi.getOutSequence());
requestPolicy.setPolicyType("common"); requestPolicy.setPolicyType("common");
requestPolicy.setPolicyVersion("v1"); requestPolicy.setPolicyVersion("v1");
requestPolicy.setPolicyId(UUID.randomUUID().toString()); requestPolicy.setPolicyId("");
requestPolicy.setParameters(Collections.emptyMap()); requestPolicy.setParameters(Collections.emptyMap());
apiPolicies.setResponse(List.of(requestPolicy)); apiPolicies.setResponse(List.of(requestPolicy));
} else } else
apiPolicies.setResponse(Collections.emptyList()); apiPolicies.setResponse(Collections.emptyList());
// ---------- fault policies ---------- // ---------- fault policies ----------
if (oldApi.getFaultSequence()!=null && !oldApi.getFaultSequence().isEmpty()) { if (oldApi.getFaultSequence() != null && !oldApi.getFaultSequence().isEmpty()) {
ApiDefinition45.Policy requestPolicy = new ApiDefinition45.Policy(); ApiDefinition45.Policy requestPolicy = new ApiDefinition45.Policy();
requestPolicy.setPolicyName(oldApi.getFaultSequence()); requestPolicy.setPolicyName(oldApi.getFaultSequence());
requestPolicy.setPolicyType("common"); requestPolicy.setPolicyType("common");
requestPolicy.setPolicyVersion("v1"); requestPolicy.setPolicyVersion("v1");
requestPolicy.setPolicyId(UUID.randomUUID().toString()); requestPolicy.setPolicyId("");
requestPolicy.setParameters(Collections.emptyMap()); requestPolicy.setParameters(Collections.emptyMap());
apiPolicies.setFault(List.of(requestPolicy)); apiPolicies.setFault(List.of(requestPolicy));
} else } else
apiPolicies.setFault(Collections.emptyList()); apiPolicies.setFault(Collections.emptyList());
return apiPolicies; return apiPolicies;
} }
@ -230,7 +249,7 @@ public class ApiDefinitionMapper {
// ---------- parse customParameters JSON string ---------- // ---------- parse customParameters JSON string ----------
if (oldSec.getCustomParameters() != null && !oldSec.getCustomParameters().isEmpty()) { if (oldSec.getCustomParameters() != null && !oldSec.getCustomParameters().isEmpty()) {
try { try {
Map<String, Object> map = OBJECT_MAPPER.readValue(oldSec.getCustomParameters(), new TypeReference<>() { Map<String, Object> map = AbstractProcess.mapperYaml.readValue(oldSec.getCustomParameters(), new TypeReference<>() {
}); });
newSec.setCustomParameters(map); newSec.setCustomParameters(map);
} catch (Exception e) { } catch (Exception e) {
@ -246,28 +265,37 @@ public class ApiDefinitionMapper {
return newSec; return newSec;
} }
private static List<ApiDefinition45.Operation> mapOperations(ApiDefinition32 oldApi) { private static List<ApiDefinition45.Operation> mapOperations(Set<URITemplate> uriTemplates) {
if (oldApi.getUriTemplates() == null || oldApi.getUriTemplates().isEmpty()) if (uriTemplates == null || uriTemplates.isEmpty())
return Collections.emptyList(); return Collections.emptyList();
return oldApi.getUriTemplates().stream().map(templateObj -> { List<ApiDefinition45.Operation> operations = new ArrayList<>();
ApiDefinition45.Operation op = new ApiDefinition45.Operation();
if (templateObj instanceof Map) {
Map<String, Object> template = (Map<String, Object>) templateObj;
op.setTarget((String) template.get("uri"));
op.setVerb((String) template.get("verb"));
op.setThrottlingPolicy((String) template.get("throttlingPolicy"));
op.setAuthType((String) template.get("authType"));
op.setScopes(Collections.emptyList());
op.setUsedProductIds(Collections.emptyList());
ApiDefinition45.OperationPolicies opPolicies = new ApiDefinition45.OperationPolicies(); for (URITemplate uriTemplate : uriTemplates) {
opPolicies.setRequest(Collections.emptyList());
opPolicies.setResponse(Collections.emptyList()); ApiDefinition45.Operation op = new ApiDefinition45.Operation();
opPolicies.setFault(Collections.emptyList()); op.setId("");
op.setOperationPolicies(opPolicies); op.setAuthType(uriTemplate.getAuthType());
op.setThrottlingPolicy(uriTemplate.getThrottlingTier());
op.setVerb(uriTemplate.getHTTPVerb());
op.setTarget(uriTemplate.getUriTemplate());
op.setScopes(new ArrayList<>());
for (Scope scope : uriTemplate.getScopes()) {
if (scope != null && scope.getKey() != null && !scope.getKey().isEmpty()) {
op.getScopes().add(scope.getName());
}
} }
return op;
}).collect(Collectors.toList()); op.setUsedProductIds(new ArrayList<>());
ApiDefinition45.OperationPolicies opPolicies = new ApiDefinition45.OperationPolicies();
opPolicies.setRequest(Collections.emptyList());
opPolicies.setResponse(Collections.emptyList());
opPolicies.setFault(Collections.emptyList());
op.setOperationPolicies(opPolicies);
operations.add(op);
}
return operations;
} }
} }

View File

@ -181,8 +181,8 @@ public class ApiDefinition45 {
private String verb; private String verb;
private String authType; private String authType;
private String throttlingPolicy; private String throttlingPolicy;
private List<Object> scopes; private List<String> scopes;
private List<Object> usedProductIds; private List<String> usedProductIds;
private OperationPolicies operationPolicies; private OperationPolicies operationPolicies;
} }