package cz.trask.migration.mapper; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; 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; import cz.trask.migration.util.CredentialsDecoder; public class ApiDefinitionMapper { public static ApiDefinition45 map(ApiDefinition32 oldApi, APIDefinition openApiParser, String swagger) throws Exception { if (oldApi == null) return null; ApiDefinition45 newApi = new ApiDefinition45(); newApi.setType("api"); newApi.setVersion("v4.5.0"); 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(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(swaggerData.get("basePath") != null ? swaggerData.get("basePath").toString() : ""); data.setLifeCycleStatus(oldApi.getStatus()); data.setDefaultVersion(oldApi.isDefaultVersion()); data.setRevision(false); data.setEnableSchemaValidation(oldApi.isEnableSchemaValidation()); data.setAuthorizationHeader(oldApi.getAuthorizationHeader()); data.setTransport( oldApi.getTransports() != null ? List.of(oldApi.getTransports().split(",")) : Collections.emptyList()); data.setTags(oldApi.getTags()); data.setVisibility(oldApi.getVisibility().toUpperCase()); data.setVisibleRoles(Collections.emptyList()); data.setVisibleTenants(Collections.emptyList()); data.setAccessControl("NONE"); data.setAccessControlRoles(Collections.emptyList()); data.setOrganizationPolicies(Collections.emptyList()); data.setType(oldApi.getType()); data.setAudiences(Arrays.asList("all")); List policies = new ArrayList<>(); for (ApiDefinition32.Tier tier : oldApi.getAvailableTiers()) { if (tier.getName() != null && !tier.getName().isEmpty()) { policies.add(tier.getName()); } } data.setPolicies(policies); if (oldApi.getApiSecurity() != null && !oldApi.getApiSecurity().isEmpty()) { data.setSecurityScheme( Arrays.stream(oldApi.getApiSecurity().split(",")).map(String::trim).collect(Collectors.toList())); } 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())); data.setCacheTimeout(oldApi.getCacheTimeout()); // ---------- CORS ---------- data.setCorsConfiguration(mapCors(oldApi.getCorsConfiguration())); // ---------- endpoint ---------- data.setEndpointConfig(mapEndpointConfig(oldApi.getEndpointConfig())); data.setEndpointImplementationType(oldApi.getImplementation()); // ---------- API policies ---------- data.setApiPolicies(mapApiPolicies(oldApi)); // ---------- key managers ---------- data.setKeyManagers(oldApi.getKeyManagers()); // ---------- advertise info ---------- ApiDefinition45.AdvertiseInfo ai = new ApiDefinition45.AdvertiseInfo(); ai.setAdvertised(oldApi.isAdvertiseOnly()); ai.setApiOwner(oldApi.getId() != null ? oldApi.getId().getProviderName() : null); ai.setVendor("WSO2"); data.setAdvertiseInfo(ai); data.setVisibleOrganizations(Arrays.asList("none")); // ---------- gateway ---------- data.setGatewayVendor("wso2"); data.setGatewayType("wso2/synapse"); // ---------- business & monetization ---------- data.setBusinessInformation(oldApi.getMonetizationProperties()); data.setAdditionalProperties(Collections.emptyList()); data.setAdditionalPropertiesMap(oldApi.getAdditionalProperties()); // ---------- subscription ---------- data.setSubscriptionAvailability(oldApi.getSubscriptionAvailability().toUpperCase()); data.setSubscriptionAvailableTenants(Collections.emptyList()); // ---------- operations ---------- Set uriTemplates = openApiParser.getURITemplates(swagger); data.setOperations(mapOperations(uriTemplates)); // ---------- additional metadata ---------- data.setCreatedTime(oldApi.getCreatedTime()); data.setLastUpdatedTime(oldApi.getLastUpdated()); // ---------- mediace ---------- data.setMediationPolicies(oldApi.getDocuments()); newApi.setData(data); return newApi; } private static ApiPolicies mapApiPolicies(ApiDefinition32 oldApi) { ApiDefinition45.ApiPolicies apiPolicies = new ApiDefinition45.ApiPolicies(); // ---------- request policies ---------- 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(""); requestPolicy.setParameters(Collections.emptyMap()); apiPolicies.setRequest(List.of(requestPolicy)); } else apiPolicies.setRequest(Collections.emptyList()); // ---------- response policies ---------- 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(""); requestPolicy.setParameters(Collections.emptyMap()); apiPolicies.setResponse(List.of(requestPolicy)); } else apiPolicies.setResponse(Collections.emptyList()); // ---------- fault policies ---------- 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(""); requestPolicy.setParameters(Collections.emptyMap()); apiPolicies.setFault(List.of(requestPolicy)); } else apiPolicies.setFault(Collections.emptyList()); return apiPolicies; } private static ApiDefinition45.CorsConfiguration mapCors(ApiDefinition32.CorsConfiguration oldCors) { if (oldCors == null) return null; ApiDefinition45.CorsConfiguration cors = new ApiDefinition45.CorsConfiguration(); cors.setCorsConfigurationEnabled(oldCors.isCorsConfigurationEnabled()); cors.setAccessControlAllowOrigins(oldCors.getAccessControlAllowOrigins()); cors.setAccessControlAllowHeaders(oldCors.getAccessControlAllowHeaders()); cors.setAccessControlAllowMethods(oldCors.getAccessControlAllowMethods()); cors.setAccessControlAllowCredentials(oldCors.isAccessControlAllowCredentials()); return cors; } private static ApiDefinition45.EndpointConfig mapEndpointConfig(ApiDefinition32.EndpointConfig oldEndpoint) { if (oldEndpoint == null) return null; ApiDefinition45.EndpointConfig newEndpoint = new ApiDefinition45.EndpointConfig(); newEndpoint.setEndpoint_type(oldEndpoint.getEndpointType()); if (oldEndpoint.getSandboxEndpoints() != null) { ApiDefinition45.EndpointGroup sandbox = new ApiDefinition45.EndpointGroup(); sandbox.setUrl(oldEndpoint.getSandboxEndpoints().getUrl()); newEndpoint.setSandbox_endpoints(sandbox); } if (oldEndpoint.getProductionEndpoints() != null) { ApiDefinition45.EndpointGroup production = new ApiDefinition45.EndpointGroup(); production.setUrl(oldEndpoint.getProductionEndpoints().getUrl()); newEndpoint.setProduction_endpoints(production); } if (oldEndpoint.getEndpointSecurity() != null) { ApiDefinition45.EndpointSecurity security = new ApiDefinition45.EndpointSecurity(); security.setSandbox(mapSecurityEnv(oldEndpoint.getEndpointSecurity().getSandbox())); security.setProduction(mapSecurityEnv(oldEndpoint.getEndpointSecurity().getProduction())); newEndpoint.setEndpoint_security(security); } return newEndpoint; } private static ApiDefinition45.SecurityEnv mapSecurityEnv(ApiDefinition32.SecurityEnvironment oldSec) { if (oldSec == null) return null; ApiDefinition45.SecurityEnv newSec = new ApiDefinition45.SecurityEnv(); newSec.setType(oldSec.getType()); newSec.setTokenUrl(oldSec.getTokenUrl()); newSec.setClientId(oldSec.getClientId()); newSec.setClientSecret(CredentialsDecoder.decodeCredentials(oldSec.getClientSecret(), AbstractProcess.PRIVATE_KEY_APIM_32)); newSec.setUsername(oldSec.getUsername()); newSec.setPassword(oldSec.getPassword()); newSec.setGrantType(oldSec.getGrantType()); newSec.setEnabled(oldSec.isEnabled()); newSec.setConnectionTimeoutDuration(0); newSec.setSocketTimeoutDuration(0); newSec.setConnectionRequestTimeoutDuration(0); newSec.setProxyConfigs(new ApiDefinition45.ProxyConfigs()); // ---------- parse customParameters JSON string ---------- if (oldSec.getCustomParameters() != null && !oldSec.getCustomParameters().isEmpty()) { try { Map map = AbstractProcess.mapperYaml.readValue(oldSec.getCustomParameters(), new TypeReference<>() { }); newSec.setCustomParameters(map); } catch (Exception e) { newSec.setCustomParameters(Collections.emptyMap()); } } else { newSec.setCustomParameters(Collections.emptyMap()); } // ---------- parse additionalProperties JSON string ---------- newSec.setAdditionalProperties(Collections.emptyMap()); return newSec; } private static List mapOperations(Set uriTemplates) { if (uriTemplates == null || uriTemplates.isEmpty()) return Collections.emptyList(); List operations = new ArrayList<>(); 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()); } } 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; } }