Radek Davidek 8d7bc54713 refactor
2025-10-21 19:52:15 +02:00

302 lines
12 KiB
Java

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<String, Object> 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<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.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<String> 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<URITemplate> 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<String, Object> 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<ApiDefinition45.Operation> mapOperations(Set<URITemplate> uriTemplates) {
if (uriTemplates == null || uriTemplates.isEmpty())
return Collections.emptyList();
List<ApiDefinition45.Operation> 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;
}
}