api def parser

This commit is contained in:
Radek Davidek 2025-10-16 13:06:41 +02:00
parent 75cb4ee4bb
commit 5507cb938e
3 changed files with 193 additions and 6 deletions

10
pom.xml
View File

@ -43,6 +43,16 @@
<artifactId>snakeyaml</artifactId> <artifactId>snakeyaml</artifactId>
<version>2.4</version> <version>2.4</version>
</dependency> </dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.19.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
<version>2.19.2</version>
</dependency>
<dependency> <dependency>
<groupId>org.apache.commons</groupId> <groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId> <artifactId>commons-lang3</artifactId>

View File

@ -14,7 +14,10 @@ import java.util.concurrent.atomic.AtomicInteger;
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.yaml.snakeyaml.Yaml;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import com.google.gson.JsonArray; import com.google.gson.JsonArray;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import com.google.gson.reflect.TypeToken; import com.google.gson.reflect.TypeToken;
@ -27,6 +30,7 @@ import cz.trask.migration.model.HttpResponse;
import cz.trask.migration.model.RegisterResponse; import cz.trask.migration.model.RegisterResponse;
import cz.trask.migration.model.TokenResponse; import cz.trask.migration.model.TokenResponse;
import cz.trask.migration.model.ZipEntryData; import cz.trask.migration.model.ZipEntryData;
import cz.trask.migration.model.v32.ApiDefinition;
import io.apicurio.registry.rest.client.RegistryClient; import io.apicurio.registry.rest.client.RegistryClient;
import io.apicurio.registry.rest.client.RegistryClientFactory; import io.apicurio.registry.rest.client.RegistryClientFactory;
import io.apicurio.registry.rest.client.exception.VersionAlreadyExistsException; import io.apicurio.registry.rest.client.exception.VersionAlreadyExistsException;
@ -197,7 +201,7 @@ public class ImportToApicurio extends AbstractProcess {
api.getName(), fullDesc, null, null, null, api.getName(), fullDesc, null, null, null,
new ByteArrayInputStream(swaggerObj.toString().getBytes()), references); new ByteArrayInputStream(swaggerObj.toString().getBytes()), references);
setMetaAndRules(meta, props, tagsList); setArtifactMetaData(meta, props, tagsList);
// Create the three required rules // Create the three required rules
createRule(meta, "NONE", RuleType.COMPATIBILITY); createRule(meta, "NONE", RuleType.COMPATIBILITY);
createRule(meta, "NONE", RuleType.VALIDITY); createRule(meta, "NONE", RuleType.VALIDITY);
@ -219,7 +223,7 @@ public class ImportToApicurio extends AbstractProcess {
ArtifactMetaData meta = client.updateArtifact(group, mainArtifactId, api.getVersion(), ArtifactMetaData meta = client.updateArtifact(group, mainArtifactId, api.getVersion(),
api.getName(), fullDesc, new ByteArrayInputStream(swaggerObj.toString().getBytes()), api.getName(), fullDesc, new ByteArrayInputStream(swaggerObj.toString().getBytes()),
references); references);
setMetaAndRules(meta, props, tagsList); setArtifactMetaData(meta, props, tagsList);
} else { } else {
// Version already exists no action needed // Version already exists no action needed
log.warn("API {} with version {} already exists. Skipping import.", api.getContext(), log.warn("API {} with version {} already exists. Skipping import.", api.getContext(),
@ -321,6 +325,9 @@ public class ImportToApicurio extends AbstractProcess {
List<ArtifactReference> references = new ArrayList<>(); List<ArtifactReference> references = new ArrayList<>();
for (ZipEntryData entry : zipEntries) { for (ZipEntryData entry : zipEntries) {
String artifactId = api.getName() + "/" + api.getVersion() + "/" + entry.getName(); String artifactId = api.getName() + "/" + api.getVersion() + "/" + entry.getName();
ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
ApiDefinition apiDef = mapper.readValue(entry.getContent(), ApiDefinition.class);
// Create the artifact (versioned) // Create the artifact (versioned)
try (ByteArrayInputStream is = new ByteArrayInputStream(entry.getContent())) { try (ByteArrayInputStream is = new ByteArrayInputStream(entry.getContent())) {
@ -328,7 +335,7 @@ public class ImportToApicurio extends AbstractProcess {
api.getVersion(), is); api.getVersion(), is);
Map<String, String> props = new LinkedHashMap<>(); Map<String, String> props = new LinkedHashMap<>();
props.put(PARAM_SOURCE_APIM, VERSION_32); props.put(PARAM_SOURCE_APIM, VERSION_32);
setMetaAndRules(meta, props, Collections.emptyList()); setArtifactMetaData(meta, props, Collections.emptyList());
} }
ArtifactReference ref = new ArtifactReference(); ArtifactReference ref = new ArtifactReference();
@ -341,12 +348,14 @@ public class ImportToApicurio extends AbstractProcess {
return references; return references;
} }
private void setMetaAndRules(ArtifactMetaData meta, Map<String, String> props, List<String> tags) { private void setArtifactMetaData(ArtifactMetaData meta, Map<String, String> props, List<String> tags) {
EditableMetaData metaData = new EditableMetaData(); EditableMetaData metaData = new EditableMetaData();
metaData.setName(meta.getName()); metaData.setName(meta.getName());
metaData.setDescription(meta.getDescription()); metaData.setDescription(meta.getDescription());
metaData.setProperties(props); if (props != null)
metaData.setLabels(tags); metaData.setProperties(props);
if (tags != null)
metaData.setLabels(tags);
client.updateArtifactMetaData(meta.getGroupId(), meta.getId(), metaData); client.updateArtifactMetaData(meta.getGroupId(), meta.getId(), metaData);
} }

View File

@ -0,0 +1,168 @@
package cz.trask.migration.model.v32;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
public class ApiDefinition {
public static class CorsConfiguration {
@JsonProperty("corsConfigurationEnabled")
public boolean corsConfigurationEnabled;
@JsonProperty("accessControlAllowOrigins")
public List<String> accessControlAllowOrigins;
@JsonProperty("accessControlAllowCredentials")
public boolean accessControlAllowCredentials;
@JsonProperty("accessControlAllowHeaders")
public List<String> accessControlAllowHeaders;
@JsonProperty("accessControlAllowMethods")
public List<String> accessControlAllowMethods;
}
public static class Tier {
public String name;
public String displayName;
public String description;
public long requestsPerMin;
public long requestCount;
public int unitTime;
public String timeUnit;
public String tierPlan;
public boolean stopOnQuotaReached;
}
public static class EndpointSecurity {
public static class SecurityConfig {
public String password;
public String tokenUrl;
public String clientId;
public String clientSecret;
public String customParameters;
public String type;
public String grantType;
public boolean enabled;
public String username;
}
public SecurityConfig production;
public SecurityConfig sandbox;
}
public static class Id {
public String providerName;
public String apiName;
public String version;
public long id;
}
public static class ApiTierPolicy {
public String name;
public String displayName;
public String description;
public long requestsPerMin;
public long requestCount;
public int unitTime;
public String timeUnit;
public String tierPlan;
public boolean stopOnQuotaReached;
}
public static class EndpointConfig {
public String endpoint_type;
public Endpoint sandbox_endpoints;
public Endpoint production_endpoints;
public EndpointSecurity endpoint_security;
public static class Endpoint {
public String url;
}
public static class EndpointSecurity {
public SecurityConfig production;
public SecurityConfig sandbox;
public static class SecurityConfig {
public String password;
public String tokenUrl;
public String clientId;
public String clientSecret;
public String customParameters;
public String type;
public String grantType;
public boolean enabled;
public String username;
}
}
}
// --- Hlavní pole ---
public Id id;
public String uuid;
public String type;
public String context;
public String contextTemplate;
public List<String> tags;
public List<String> documents;
public String lastUpdated;
public List<Tier> availableTiers;
public List<Object> availableSubscriptionLevelPolicies;
public List<Object> uriTemplates;
public boolean apiHeaderChanged;
public boolean apiResourcePatternsChanged;
public String status;
public String visibility;
public List<String> gatewayLabels;
public boolean endpointSecured;
public boolean endpointAuthDigest;
public String transports;
public String inSequence;
public boolean advertiseOnly;
public String subscriptionAvailability;
public CorsConfiguration corsConfiguration;
@JsonDeserialize(using = EndpointConfigDeserializer.class)
public EndpointConfig endpointConfig;
public String responseCache;
public int cacheTimeout;
public String implementation;
public String authorizationHeader;
public List<Object> scopes;
public boolean isDefaultVersion;
public boolean isPublishedDefaultVersion;
public List<String> keyManagers;
public List<String> environments;
public String createdTime;
public Map<String, Object> additionalProperties;
public Map<String, Object> monetizationProperties;
public boolean isMonetizationEnabled;
public List<String> environmentList;
public String apiSecurity;
public List<Object> endpoints;
public boolean enableSchemaValidation;
public List<Object> apiCategories;
public boolean enableStore;
public String accessControl;
public double rating;
public boolean isLatest;
public static class EndpointConfigDeserializer extends JsonDeserializer<EndpointConfig> {
@Override
public EndpointConfig deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
String json = p.getValueAsString(); // YAML string
ObjectMapper mapper = new ObjectMapper(); // běžný JSON mapper
return mapper.readValue(json, EndpointConfig.class);
}
}
}