Search in sources :

Example 1 with XGraviteeIODefinition

use of io.gravitee.rest.api.service.swagger.converter.extension.XGraviteeIODefinition in project gravitee-management-rest-api by gravitee-io.

the class OAIToAPIConverter method visit.

@Override
public SwaggerApiEntity visit(OpenAPI oai) {
    final SwaggerApiEntity apiEntity = new SwaggerApiEntity();
    // Name
    apiEntity.setName(oai.getInfo().getTitle());
    // Description
    apiEntity.setDescription(oai.getInfo().getDescription() == null ? "Description of " + apiEntity.getName() : oai.getInfo().getDescription());
    // Version
    apiEntity.setVersion(oai.getInfo().getVersion());
    fill(apiEntity, oai);
    // Use X-Gravitee to add information in API
    XGraviteeIODefinition xGraviteeIODefinition = null;
    if (oai.getExtensions() != null && oai.getExtensions().get(X_GRAVITEEIO_DEFINITION_VENDOR_EXTENSION) != null) {
        xGraviteeIODefinition = new ObjectMapper().convertValue(oai.getExtensions().get(X_GRAVITEEIO_DEFINITION_VENDOR_EXTENSION), XGraviteeIODefinition.class);
    }
    // Proxy
    Proxy proxy = new Proxy();
    String defaultEndpoint = null;
    // Proxy - Endpoints
    if (!oai.getServers().isEmpty()) {
        List<String> evaluatedServerUrl = mapServersToEndpoint(oai.getServers());
        EndpointGroup defaultGroup = new EndpointGroup();
        defaultGroup.setName("default-group");
        if (evaluatedServerUrl == null) {
            defaultGroup.setEndpoints(singleton(new HttpEndpoint("default", defaultEndpoint)));
        } else if (evaluatedServerUrl.size() == 1) {
            defaultEndpoint = evaluatedServerUrl.get(0);
            defaultGroup.setEndpoints(singleton(new HttpEndpoint("default", defaultEndpoint)));
        } else {
            defaultEndpoint = evaluatedServerUrl.get(0);
            defaultGroup.setEndpoints(new HashSet<>());
            for (int i = 0; i < evaluatedServerUrl.size(); i++) {
                defaultGroup.getEndpoints().add(new HttpEndpoint("server" + (i + 1), evaluatedServerUrl.get(i)));
            }
        }
        proxy.setGroups(singleton(defaultGroup));
        apiEntity.setProxy(proxy);
    }
    // Proxy - Context Path / Virtual Host
    if (xGraviteeIODefinition != null && xGraviteeIODefinition.getVirtualHosts() != null) {
        proxy.setVirtualHosts(xGraviteeIODefinition.getVirtualHosts().stream().map(vHost -> new VirtualHost(vHost.getHost(), vHost.getPath(), (vHost.getOverrideEntrypoint() != null ? vHost.getOverrideEntrypoint() : false))).collect(Collectors.toList()));
    } else {
        String contextPath = null;
        if (defaultEndpoint != null) {
            contextPath = URI.create(defaultEndpoint).getPath();
        }
        if (contextPath == null || contextPath.equals("/")) {
            contextPath = apiEntity.getName().replaceAll("\\s+", "").toLowerCase();
        }
        proxy.setVirtualHosts(singletonList(new VirtualHost(contextPath)));
    }
    apiEntity.setProxy(proxy);
    // Add xGraviteeIODefinition config
    if (xGraviteeIODefinition != null) {
        // Categories
        if (xGraviteeIODefinition.getCategories() != null && !xGraviteeIODefinition.getCategories().isEmpty()) {
            apiEntity.setCategories(new HashSet<>(xGraviteeIODefinition.getCategories()));
        }
        // Groups
        if (xGraviteeIODefinition.getGroups() != null && !xGraviteeIODefinition.getGroups().isEmpty()) {
            // Groups in schema are group name. Replace them by id
            Set<String> groupIdsToImport = xGraviteeIODefinition.getGroups().stream().flatMap(group -> groupService.findByName(group).stream()).map(GroupEntity::getId).collect(Collectors.toSet());
            apiEntity.setGroups(groupIdsToImport);
        }
        // Labels
        if (xGraviteeIODefinition.getLabels() != null && !xGraviteeIODefinition.getLabels().isEmpty()) {
            apiEntity.setLabels(xGraviteeIODefinition.getLabels());
        }
        // Metadata
        if (xGraviteeIODefinition.getMetadata() != null && !xGraviteeIODefinition.getMetadata().isEmpty()) {
            final List<ApiMetadataEntity> apiMetadataEntities = xGraviteeIODefinition.getMetadata().stream().map(metadata -> {
                ApiMetadataEntity apiMetadata = new ApiMetadataEntity();
                apiMetadata.setKey(IdGenerator.generate(metadata.getName()));
                apiMetadata.setName(metadata.getName());
                apiMetadata.setValue(metadata.getValue());
                apiMetadata.setFormat(metadata.getFormat() != null ? MetadataFormat.valueOf(metadata.getFormat().name()) : MetadataFormat.STRING);
                return apiMetadata;
            }).collect(Collectors.toList());
            apiEntity.setMetadata(apiMetadataEntities);
        }
        // Picture
        if (xGraviteeIODefinition.getPicture() != null && !StringUtils.isEmpty(xGraviteeIODefinition.getPicture())) {
            if (xGraviteeIODefinition.getPicture().matches(PICTURE_REGEX)) {
                apiEntity.setPicture(xGraviteeIODefinition.getPicture());
            }
        }
        // Properties
        if (xGraviteeIODefinition.getProperties() != null && !xGraviteeIODefinition.getProperties().isEmpty()) {
            Properties properties = new Properties();
            properties.setProperties(xGraviteeIODefinition.getProperties().stream().map(prop -> new Property(prop.getKey(), prop.getValue())).collect(Collectors.toList()));
            apiEntity.setProperties(properties);
        }
        // Tags
        if (xGraviteeIODefinition.getTags() != null && !xGraviteeIODefinition.getTags().isEmpty()) {
            final Map<String, String> tagMap = tagService.findByReference(GraviteeContext.getCurrentOrganization(), TagReferenceType.ORGANIZATION).stream().collect(toMap(TagEntity::getId, TagEntity::getName));
            final Set<String> tagIdToAdd = xGraviteeIODefinition.getTags().stream().map(tag -> findTagIdByName(tagMap, tag)).filter(Objects::nonNull).collect(Collectors.toSet());
            if (tagIdToAdd != null && !tagIdToAdd.isEmpty()) {
                apiEntity.setTags(tagIdToAdd);
            }
        }
        // Visibility
        if (xGraviteeIODefinition.getVisibility() != null) {
            apiEntity.setVisibility(Visibility.valueOf(xGraviteeIODefinition.getVisibility().name()));
        }
    }
    return apiEntity;
}
Also used : java.util(java.util) Properties(io.gravitee.definition.model.Properties) GraviteeContext(io.gravitee.rest.api.service.common.GraviteeContext) Operation(io.swagger.v3.oas.models.Operation) PolicyOperationVisitorManager(io.gravitee.rest.api.service.impl.swagger.policy.PolicyOperationVisitorManager) StringUtils(org.apache.commons.lang3.StringUtils) Collections.singletonList(java.util.Collections.singletonList) OAIOperationVisitor(io.gravitee.rest.api.service.impl.swagger.visitor.v3.OAIOperationVisitor) PolicyHelper.clearNullValues(io.gravitee.rest.api.service.validator.PolicyHelper.clearNullValues) IdGenerator(io.gravitee.common.utils.IdGenerator) Matcher(java.util.regex.Matcher) Collections.singleton(java.util.Collections.singleton) Collectors.toMap(java.util.stream.Collectors.toMap) OpenAPI(io.swagger.v3.oas.models.OpenAPI) io.gravitee.rest.api.model(io.gravitee.rest.api.model) HttpEndpoint(io.gravitee.definition.model.endpoint.HttpEndpoint) ServerVariables(io.swagger.v3.oas.models.servers.ServerVariables) URI(java.net.URI) GroupService(io.gravitee.rest.api.service.GroupService) XGraviteeIODefinition(io.gravitee.rest.api.service.swagger.converter.extension.XGraviteeIODefinition) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) PathItem(io.swagger.v3.oas.models.PathItem) OAIDescriptor(io.gravitee.rest.api.service.swagger.OAIDescriptor) io.gravitee.definition.model(io.gravitee.definition.model) Collectors(java.util.stream.Collectors) OAIDescriptorVisitor(io.gravitee.rest.api.service.impl.swagger.visitor.v3.OAIDescriptorVisitor) Consumer(java.util.function.Consumer) Server(io.swagger.v3.oas.models.servers.Server) HttpMethod(io.gravitee.common.http.HttpMethod) CollectionUtils(org.springframework.util.CollectionUtils) SwaggerApiEntity(io.gravitee.rest.api.model.api.SwaggerApiEntity) ServerVariable(io.swagger.v3.oas.models.servers.ServerVariable) Pattern(java.util.regex.Pattern) Policy(io.gravitee.policy.api.swagger.Policy) TagService(io.gravitee.rest.api.service.TagService) Properties(io.gravitee.definition.model.Properties) HttpEndpoint(io.gravitee.definition.model.endpoint.HttpEndpoint) XGraviteeIODefinition(io.gravitee.rest.api.service.swagger.converter.extension.XGraviteeIODefinition) SwaggerApiEntity(io.gravitee.rest.api.model.api.SwaggerApiEntity) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper)

Aggregations

ObjectMapper (com.fasterxml.jackson.databind.ObjectMapper)1 HttpMethod (io.gravitee.common.http.HttpMethod)1 IdGenerator (io.gravitee.common.utils.IdGenerator)1 io.gravitee.definition.model (io.gravitee.definition.model)1 Properties (io.gravitee.definition.model.Properties)1 HttpEndpoint (io.gravitee.definition.model.endpoint.HttpEndpoint)1 Policy (io.gravitee.policy.api.swagger.Policy)1 io.gravitee.rest.api.model (io.gravitee.rest.api.model)1 SwaggerApiEntity (io.gravitee.rest.api.model.api.SwaggerApiEntity)1 GroupService (io.gravitee.rest.api.service.GroupService)1 TagService (io.gravitee.rest.api.service.TagService)1 GraviteeContext (io.gravitee.rest.api.service.common.GraviteeContext)1 PolicyOperationVisitorManager (io.gravitee.rest.api.service.impl.swagger.policy.PolicyOperationVisitorManager)1 OAIDescriptorVisitor (io.gravitee.rest.api.service.impl.swagger.visitor.v3.OAIDescriptorVisitor)1 OAIOperationVisitor (io.gravitee.rest.api.service.impl.swagger.visitor.v3.OAIOperationVisitor)1 OAIDescriptor (io.gravitee.rest.api.service.swagger.OAIDescriptor)1 XGraviteeIODefinition (io.gravitee.rest.api.service.swagger.converter.extension.XGraviteeIODefinition)1 PolicyHelper.clearNullValues (io.gravitee.rest.api.service.validator.PolicyHelper.clearNullValues)1 OpenAPI (io.swagger.v3.oas.models.OpenAPI)1 Operation (io.swagger.v3.oas.models.Operation)1