All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.qdesrame.openapi.diff.compare.SecurityRequirementDiff Maven / Gradle / Ivy

There is a newer version: 1.2.0
Show newest version
package com.qdesrame.openapi.diff.compare;

import com.qdesrame.openapi.diff.model.ChangedSecurityRequirement;
import com.qdesrame.openapi.diff.model.ChangedSecurityScheme;
import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;

import java.util.*;

/**
 * Created by adarsh.sharma on 07/01/18.
 */
public class SecurityRequirementDiff {
    private OpenApiDiff openApiDiff;
    private Components leftComponents;
    private Components rightComponents;

    public SecurityRequirementDiff(OpenApiDiff openApiDiff) {
        this.openApiDiff = openApiDiff;
        this.leftComponents = openApiDiff.getOldSpecOpenApi() != null ? openApiDiff.getOldSpecOpenApi().getComponents() : null;
        this.rightComponents = openApiDiff.getNewSpecOpenApi() != null ? openApiDiff.getNewSpecOpenApi().getComponents() : null;
    }

    private LinkedHashMap> contains(SecurityRequirement right, String schemeRef) {
        SecurityScheme leftSecurityScheme = leftComponents.getSecuritySchemes().get(schemeRef);
        LinkedHashMap> found = new LinkedHashMap<>();

        for (Map.Entry> entry : right.entrySet()) {
            SecurityScheme rightSecurityScheme = rightComponents.getSecuritySchemes().get(entry.getKey());
            if (leftSecurityScheme.getType() == rightSecurityScheme.getType()) {
                switch (leftSecurityScheme.getType()) {
                    case APIKEY:
                        if (leftSecurityScheme.getName().equals(rightSecurityScheme.getName())) {
                            found.put(entry.getKey(), entry.getValue());
                            return found;
                        }
                        break;

                    case OAUTH2:
                    case HTTP:
                    case OPENIDCONNECT:
                        found.put(entry.getKey(), entry.getValue());
                        return found;
                }
            }
        }

        return found;
    }

    public Optional diff(SecurityRequirement left, SecurityRequirement right) {
        ChangedSecurityRequirement changedSecurityRequirement =
                new ChangedSecurityRequirement(left, right != null ? getCopy(right) : null);

        left = left == null ? new SecurityRequirement() : left;
        right = right == null ? new SecurityRequirement() : right;

        for (String leftSchemeRef : left.keySet()) {
            LinkedHashMap> rightSec = contains(right, leftSchemeRef);
            if (rightSec.isEmpty()) {
                changedSecurityRequirement.addMissing(leftSchemeRef, left.get(leftSchemeRef));
            } else {
                String rightSchemeRef = rightSec.keySet().stream().findFirst().get();
                right.remove(rightSchemeRef);
                Optional diff = openApiDiff.getSecuritySchemeDiff()
                        .diff(leftSchemeRef, left.get(leftSchemeRef), rightSchemeRef, rightSec.get(rightSchemeRef));
                diff.ifPresent(changedSecurityRequirement::addChanged);
            }
        }
        right.entrySet().stream().forEach(x -> changedSecurityRequirement.addIncreased(x.getKey(), x.getValue()));

        return changedSecurityRequirement.isDiff() ? Optional.of(changedSecurityRequirement) : Optional.empty();
    }

    public static SecurityRequirement getCopy(LinkedHashMap> right) {
        SecurityRequirement newSecurityRequirement = new SecurityRequirement();
        right.entrySet().stream().forEach(e -> newSecurityRequirement.put(e.getKey(), new ArrayList<>(e.getValue())));
        return newSecurityRequirement;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy