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

com.capitalone.dashboard.model.GitHubParsed Maven / Gradle / Ivy

package com.capitalone.dashboard.model;

import com.capitalone.dashboard.misc.HygieiaException;
import org.springframework.util.StringUtils;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.stream.IntStream;

public class GitHubParsed {
    private String url;
    private String apiUrl;
    private String baseApiUrl;
    private String graphQLUrl;
    private String orgName;
    private String repoName;

    private static final String SEGMENT_API = "/api/v3/repos";
    private static final String BASE_API = "/api/v3/";
    private static final String PUBLIC_GITHUB_BASE_API = "api.github.com/";
    private static final String PUBLIC_GITHUB_REPO_HOST = "api.github.com/repos";
    private static final String PUBLIC_GITHUB_HOST_NAME = "github.com";

    private static final String SEGMENT_GRAPHQL = "/api/graphql";
    private static final String PUBLIC_GITHUB_GRAPHQL = "api.github.com/graphql";



    public GitHubParsed(String url) throws MalformedURLException, HygieiaException {
        this.url = url;
        parse();
    }

    public void updateForRedirect(String redirectedUrl) throws MalformedURLException, HygieiaException {
        this.url = redirectedUrl;
        parse();
    }

    private void parse() throws MalformedURLException, HygieiaException {
        if (StringUtils.isEmpty(url)) {
            throw new HygieiaException("Empty github repo URL: ", HygieiaException.BAD_DATA);
        }
        if (url.endsWith(".git")) {
            url = url.substring(0, url.lastIndexOf(".git"));
        }
        
        if (url.contains(BASE_API) || url.contains(PUBLIC_GITHUB_BASE_API)) {
            convertUrl();
        }
        URL u = new URL(url);
        String host = u.getHost();
        String protocol = u.getProtocol();
        String path = u.getPath();
        String[] parts = path.split("/");
        if (parts.length < 3) {
            throw new HygieiaException("Bad github repo URL: " + url, HygieiaException.BAD_DATA);
        }
        orgName = parts[1];
        repoName = parts[2];
        if (host.startsWith(PUBLIC_GITHUB_HOST_NAME)) {
            baseApiUrl = protocol + "://" + PUBLIC_GITHUB_BASE_API;
            apiUrl = protocol + "://" + PUBLIC_GITHUB_REPO_HOST + path;
            graphQLUrl = protocol + "://" + PUBLIC_GITHUB_GRAPHQL;
        } else if (parts.length>3) {
            orgName = parts[parts.length-2];
            repoName = parts[parts.length-1];
            StringBuilder baseUrl = new StringBuilder(protocol + "://" + host);
            if (u.getPort()>0) baseUrl.append(':').append(u.getPort());
            IntStream.range(1, parts.length - 2).forEach(i -> baseUrl.append('/').append(parts[i]));
            apiUrl = baseUrl + SEGMENT_API + '/' + orgName + '/' + repoName;
            baseApiUrl = baseUrl + BASE_API;
            graphQLUrl = baseUrl + SEGMENT_GRAPHQL;
        } else {
            String baseUrl = protocol + "://" + host;
            if (u.getPort()>0) baseUrl += ":" + u.getPort();
            apiUrl = baseUrl + SEGMENT_API + path;
            baseApiUrl = baseUrl + BASE_API;
            graphQLUrl = baseUrl + SEGMENT_GRAPHQL;
        }
    }

    private void convertUrl()  {
        if (url.contains(BASE_API)) {
            if (url.contains(SEGMENT_API)) {
                url = url.replace(SEGMENT_API, "");
            } else {
                url = url.replace(BASE_API, "/");
            }
        } else {
            url = url.replace(PUBLIC_GITHUB_BASE_API, PUBLIC_GITHUB_HOST_NAME);
        }
    }

    public String getUrl() {
        return url;
    }

    public String getApiUrl() {
        return apiUrl;
    }

    public String getBaseApiUrl() {
        return baseApiUrl;
    }

    public String getOrgName() {
        return orgName;
    }

    public String getRepoName() {
        return repoName;
    }

    public String getGraphQLUrl() {
        return graphQLUrl;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof GitHubParsed)) return false;

        GitHubParsed that = (GitHubParsed) o;

        return url.equals(that.url);
    }

    @Override
    public int hashCode() {
        return url.hashCode();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy