diff --git a/pom.xml b/pom.xml index b57745c..0a84bd0 100644 --- a/pom.xml +++ b/pom.xml @@ -44,6 +44,11 @@ 1.18.38 provided + + org.wso2.carbon.apimgt + org.wso2.carbon.apimgt.impl + 9.31.86 + diff --git a/src/main/java/cz/trask/migration/AbstractProcess.java b/src/main/java/cz/trask/migration/AbstractProcess.java index 917f5f1..fecbac4 100644 --- a/src/main/java/cz/trask/migration/AbstractProcess.java +++ b/src/main/java/cz/trask/migration/AbstractProcess.java @@ -35,9 +35,8 @@ public abstract class AbstractProcess { protected static final String PARAM_SOURCE_APIM = "source_apim"; protected static final String VERSION_32 = "v32"; - protected static ObjectMapper mapper; - - protected static ObjectMapper mapperYaml; + public static ObjectMapper mapper; + public static ObjectMapper mapperYaml; protected ConfigManager config = ConfigManager.getInstance(); @@ -47,9 +46,10 @@ public abstract class AbstractProcess { YAMLFactory yamlFactory = new YAMLFactory(); yamlFactory.configure(YAMLGenerator.Feature.WRITE_DOC_START_MARKER, false); yamlFactory.configure(YAMLGenerator.Feature.MINIMIZE_QUOTES, true); + yamlFactory.configure(YAMLGenerator.Feature.SPLIT_LINES, false); mapperYaml = new ObjectMapper(yamlFactory); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - + setTrustStoreCredentials(); javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(new javax.net.ssl.HostnameVerifier() { diff --git a/src/main/java/cz/trask/migration/impl/v45/ExportToWso2FromV32.java b/src/main/java/cz/trask/migration/impl/v45/ExportToWso2FromV32.java index 3e22c36..6af4b13 100644 --- a/src/main/java/cz/trask/migration/impl/v45/ExportToWso2FromV32.java +++ b/src/main/java/cz/trask/migration/impl/v45/ExportToWso2FromV32.java @@ -2,10 +2,10 @@ package cz.trask.migration.impl.v45; import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; -import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; 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.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.mapper.ApiDefinitionMapper; @@ -161,13 +164,17 @@ public class ExportToWso2FromV32 extends AbstractProcess { } public static byte[] prepareApiZipFile32to45(RegistryClient client, SearchedVersion ver, - List ref) throws IOException { + List ref) throws Exception { String baseDir = ver.getName() + "-" + ver.getVersion() + "/"; try (ByteArrayOutputStream baos = new ByteArrayOutputStream(); ZipOutputStream zos = new ZipOutputStream(baos)) { + ApiDefinition32 apiDef = null; + APIDefinition openApiParser = null; + String contentStr = null; + for (ArtifactReference r : ref) { 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(); if (FileType.APIDEF.toString().equals(amd.getGroupId())) { - ApiDefinition32 apiDef = mapperYaml.readValue(content, ApiDefinition32.class); - ApiDefinition45 apiDef45 = ApiDefinitionMapper.map(apiDef); + apiDef = mapperYaml.readValue(content, ApiDefinition32.class); + } 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); - FileOutputStream fos = new FileOutputStream(r.getName()); + FileOutputStream fos = new FileOutputStream("api.yaml"); fos.write(content); fos.flush(); fos.close(); diff --git a/src/main/java/cz/trask/migration/mapper/ApiDefinitionMapper.java b/src/main/java/cz/trask/migration/mapper/ApiDefinitionMapper.java index e2aa681..5115065 100644 --- a/src/main/java/cz/trask/migration/mapper/ApiDefinitionMapper.java +++ b/src/main/java/cz/trask/migration/mapper/ApiDefinitionMapper.java @@ -5,12 +5,16 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; -import java.util.UUID; +import java.util.Set; import java.util.stream.Collectors; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; +import org.wso2.carbon.apimgt.api.APIDefinition; +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.ApiDefinition45; import cz.trask.migration.model.ApiDefinition45.ApiPolicies; @@ -18,9 +22,8 @@ import cz.trask.migration.util.CredentialsDecoder; public class ApiDefinitionMapper { - private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); - - public static ApiDefinition45 map(ApiDefinition32 oldApi) { + public static ApiDefinition45 map(ApiDefinition32 oldApi, APIDefinition openApiParser, String swagger) + throws Exception { if (oldApi == null) return null; @@ -30,13 +33,19 @@ public class ApiDefinitionMapper { ApiDefinition45.DataSection data = new ApiDefinition45.DataSection(); + Map swaggerData = AbstractProcess.mapperYaml.readValue(swagger, Map.class); + // ---------- základní metadata ---------- data.setId(oldApi.getUuid()); data.setName(oldApi.getId() != null ? oldApi.getId().getApiName() : null); - // data.setDescription(oldApi.getDescription()); + data.setDescription(swaggerData.get("info") != null + ? ((Map) swaggerData.get("info")).get("description") != null + ? ((Map) swaggerData.get("info")).get("description").toString() + : "" + : ""); data.setVersion(oldApi.getId() != null ? oldApi.getId().getVersion() : 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.setDefaultVersion(oldApi.isDefaultVersion()); data.setRevision(false); @@ -68,13 +77,22 @@ public class ApiDefinitionMapper { } else { data.setSecurityScheme(Collections.emptyList()); } - + data.setApiKeyHeader("ApiKey"); data.setOrganizationId("carbon.super"); data.setAsyncTransportProtocols(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 ---------- data.setResponseCachingEnabled( oldApi.getResponseCache() != null && !"disabled".equalsIgnoreCase(oldApi.getResponseCache())); @@ -99,7 +117,7 @@ public class ApiDefinitionMapper { ai.setApiOwner(oldApi.getId() != null ? oldApi.getId().getProviderName() : null); ai.setVendor("WSO2"); data.setAdvertiseInfo(ai); - + data.setVisibleOrganizations(Arrays.asList("none")); // ---------- gateway ---------- @@ -116,7 +134,8 @@ public class ApiDefinitionMapper { data.setSubscriptionAvailableTenants(Collections.emptyList()); // ---------- operations ---------- - data.setOperations(mapOperations(oldApi)); + Set uriTemplates = openApiParser.getURITemplates(swagger); + data.setOperations(mapOperations(uriTemplates)); // ---------- additional metadata ---------- data.setCreatedTime(oldApi.getCreatedTime()); @@ -132,39 +151,39 @@ public class ApiDefinitionMapper { private static ApiPolicies mapApiPolicies(ApiDefinition32 oldApi) { ApiDefinition45.ApiPolicies apiPolicies = new ApiDefinition45.ApiPolicies(); // ---------- request policies ---------- - if (oldApi.getInSequence()!=null && !oldApi.getInSequence().isEmpty()) { + if (oldApi.getInSequence() != null && !oldApi.getInSequence().isEmpty()) { ApiDefinition45.Policy requestPolicy = new ApiDefinition45.Policy(); requestPolicy.setPolicyName(oldApi.getInSequence()); requestPolicy.setPolicyType("common"); requestPolicy.setPolicyVersion("v1"); - requestPolicy.setPolicyId(UUID.randomUUID().toString()); + requestPolicy.setPolicyId(""); requestPolicy.setParameters(Collections.emptyMap()); apiPolicies.setRequest(List.of(requestPolicy)); } else apiPolicies.setRequest(Collections.emptyList()); // ---------- response policies ---------- - if (oldApi.getOutSequence()!=null && !oldApi.getOutSequence().isEmpty()) { + if (oldApi.getOutSequence() != null && !oldApi.getOutSequence().isEmpty()) { ApiDefinition45.Policy requestPolicy = new ApiDefinition45.Policy(); requestPolicy.setPolicyName(oldApi.getOutSequence()); requestPolicy.setPolicyType("common"); requestPolicy.setPolicyVersion("v1"); - requestPolicy.setPolicyId(UUID.randomUUID().toString()); + requestPolicy.setPolicyId(""); requestPolicy.setParameters(Collections.emptyMap()); apiPolicies.setResponse(List.of(requestPolicy)); } else apiPolicies.setResponse(Collections.emptyList()); // ---------- fault policies ---------- - if (oldApi.getFaultSequence()!=null && !oldApi.getFaultSequence().isEmpty()) { + if (oldApi.getFaultSequence() != null && !oldApi.getFaultSequence().isEmpty()) { ApiDefinition45.Policy requestPolicy = new ApiDefinition45.Policy(); requestPolicy.setPolicyName(oldApi.getFaultSequence()); requestPolicy.setPolicyType("common"); requestPolicy.setPolicyVersion("v1"); - requestPolicy.setPolicyId(UUID.randomUUID().toString()); + requestPolicy.setPolicyId(""); requestPolicy.setParameters(Collections.emptyMap()); apiPolicies.setFault(List.of(requestPolicy)); } else apiPolicies.setFault(Collections.emptyList()); - + return apiPolicies; } @@ -230,7 +249,7 @@ public class ApiDefinitionMapper { // ---------- parse customParameters JSON string ---------- if (oldSec.getCustomParameters() != null && !oldSec.getCustomParameters().isEmpty()) { try { - Map map = OBJECT_MAPPER.readValue(oldSec.getCustomParameters(), new TypeReference<>() { + Map map = AbstractProcess.mapperYaml.readValue(oldSec.getCustomParameters(), new TypeReference<>() { }); newSec.setCustomParameters(map); } catch (Exception e) { @@ -246,28 +265,37 @@ public class ApiDefinitionMapper { return newSec; } - private static List mapOperations(ApiDefinition32 oldApi) { - if (oldApi.getUriTemplates() == null || oldApi.getUriTemplates().isEmpty()) + private static List mapOperations(Set uriTemplates) { + if (uriTemplates == null || uriTemplates.isEmpty()) return Collections.emptyList(); - return oldApi.getUriTemplates().stream().map(templateObj -> { - ApiDefinition45.Operation op = new ApiDefinition45.Operation(); - if (templateObj instanceof Map) { - Map template = (Map) 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()); + List operations = new ArrayList<>(); - ApiDefinition45.OperationPolicies opPolicies = new ApiDefinition45.OperationPolicies(); - opPolicies.setRequest(Collections.emptyList()); - opPolicies.setResponse(Collections.emptyList()); - opPolicies.setFault(Collections.emptyList()); - op.setOperationPolicies(opPolicies); + for (URITemplate uriTemplate : uriTemplates) { + + ApiDefinition45.Operation op = new ApiDefinition45.Operation(); + op.setId(""); + 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; } } diff --git a/src/main/java/cz/trask/migration/model/ApiDefinition45.java b/src/main/java/cz/trask/migration/model/ApiDefinition45.java index ea2855e..c50d9ef 100644 --- a/src/main/java/cz/trask/migration/model/ApiDefinition45.java +++ b/src/main/java/cz/trask/migration/model/ApiDefinition45.java @@ -181,8 +181,8 @@ public class ApiDefinition45 { private String verb; private String authType; private String throttlingPolicy; - private List scopes; - private List usedProductIds; + private List scopes; + private List usedProductIds; private OperationPolicies operationPolicies; }