package org.zalando.catwatch.backend.github;
import org.kohsuke.github.GHOrganization;
import org.kohsuke.github.GHRepository;
import org.kohsuke.github.GHTeam;
import org.kohsuke.github.GHUser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
/**
* Wrapper for GHOrganization object.
* <p>
* The objective of this class is to deal with exceptions during fetching
* data via Kohsuke GitHub API so that TakeSnapshotTask is kept free from
* try/catch clutter. For some reason the library throws Error on empty
* responses (e.g. no contributors for project). Another scenario for
* throwing an exception is having not enough rights to see private
* details (e.g. teams of organization).
*
* @see GHOrganization
*/
public class OrganizationWrapper {
private static final Logger logger = LoggerFactory.getLogger(OrganizationWrapper.class);
private final GHOrganization organization;
private final List<RepositoryWrapper> repositories;
private List<GHUser> members;
private List<GHTeam> teams;
OrganizationWrapper(GHOrganization organization) {
this.organization = organization;
List<RepositoryWrapper> repositories;
try {
repositories = organization.listRepositories().asList().stream()
.filter(r -> !r.isPrivate()) // deal with public repos only
.filter(r -> !r.isFork()) // skip forks as they change statistics significantly
.map(repository -> new RepositoryWrapper(repository, organization))
.collect(Collectors.toList());
} catch (Throwable t) {
logger.warn("No repositories found for organization '{}'.", organization.getLogin());
repositories = Collections.<RepositoryWrapper>emptyList();
}
this.repositories = Collections.unmodifiableList(repositories);
}
public List<GHTeam> listTeams() {
if (this.teams == null) {
try {
this.teams = organization.listTeams().asList();
} catch (Throwable t) {
logger.warn("No teams found for organization '{}'.", organization.getLogin());
this.teams = Collections.<GHTeam>emptyList();
}
}
return this.teams;
}
public List<GHUser> listMembers() {
if (this.members == null) {
try {
this.members = organization.listMembers().asList();
} catch (Throwable t) {
logger.warn("No public members found for organization '{}'.", organization.getLogin());
this.members = Collections.<GHUser>emptyList();
}
}
return this.members;
}
public List<RepositoryWrapper> listRepositories() {
return repositories;
}
public int getId() {
return organization.getId();
}
public int getPublicRepoCount() {
try {
return organization.getPublicRepoCount();
} catch (IOException e) {
logger.warn("No public repositories count found for organization '{}'.", organization.getLogin());
return 0;
}
}
public String getLogin() {
return organization.getLogin();
}
public Boolean contributorIsMember(GHRepository.Contributor contributor) {
return this.listMembers().contains(contributor);
}
}