package org.codefaces.web.urls.github; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.codefaces.ui.SCMConfigurableElement; import org.codefaces.ui.SCMURLConfiguration; import org.codefaces.web.urls.URLParsingStrategy; public class GitHubUrlParseStrategy implements URLParsingStrategy { // TODO use GitHubConstants private static final String BRANCHES_FOLDER_NAME = "branches"; private static final String MASTER_BRANCH = BRANCHES_FOLDER_NAME + "/master"; private static final String SCM_KIND = "GitHub"; private static final String HTTP_PREFIX = "http://"; private static final String HTTPS_PREFIX = "https://"; private static final String GITHUB_COM = "github.com"; private static final String OPTIONAL_ENDING_SLASH_PATTERN = "(?:/)?"; private static final Pattern URL_PATTERN = Pattern.compile("((?:" + Pattern.quote(HTTP_PREFIX + GITHUB_COM) + "|" + Pattern.quote(HTTPS_PREFIX + GITHUB_COM) + ")/[^/]+/[^/]+)(?:/[^/]+/([^/]+).*)?" + OPTIONAL_ENDING_SLASH_PATTERN); @Override public boolean canParse(String url) { return URL_PATTERN.matcher(url).matches(); } @Override public SCMURLConfiguration buildConfigurations(String url) { SCMURLConfiguration config = new SCMURLConfiguration(); Matcher matcher = URL_PATTERN.matcher(url); if (matcher.matches()) { String repoUrl = matcher.group(1); String branchName = matcher.group(2); if (repoUrl != null) { config.put(SCMConfigurableElement.REPO_URL, repoUrl); } if (branchName != null) { config.put(SCMConfigurableElement.BASE_DIRECTORY, BRANCHES_FOLDER_NAME + "/" + branchName); } else { config.put(SCMConfigurableElement.BASE_DIRECTORY, MASTER_BRANCH); } config.put(SCMConfigurableElement.SCM_KIND, SCM_KIND); } return config; } }