package org.zalando.catwatch.backend.github; import org.kohsuke.github.GHCommit; import org.kohsuke.github.GHOrganization; import org.kohsuke.github.GHRepository; import org.kohsuke.github.GHTag; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.Collections; import java.util.Date; import java.util.List; import java.util.Map; /** * Wrapper for GHRepository 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 GHRepository */ public class RepositoryWrapper { private static final Logger logger = LoggerFactory.getLogger(RepositoryWrapper.class); private final GHRepository repository; private final GHOrganization organization; RepositoryWrapper(GHRepository repository, GHOrganization organization) { this.repository = repository; this.organization = organization; } private List<GHRepository.Contributor> contributors; private List<GHCommit> commits; private List<GHTag> tags; public int getId() { return repository.getId(); } public String getName() { return repository.getName(); } public URL getUrl() { return repository.getHtmlUrl(); } public String getDescription() { return repository.getDescription(); } public int getStarsCount() { return repository.getWatchers(); } public int getForksCount() { return repository.getForks(); } public int getSize() { return repository.getSize(); } public Date getLastPushed() { return repository.getPushedAt(); } public String getPrimaryLanguage() { return repository.getLanguage(); } public Map<String, Long> listLanguages() { try { return repository.listLanguages(); } catch (IOException e) { logger.warn("No languages found for project '{}' of organization '{}'.", repository.getName(), organization.getLogin()); return Collections.<String, Long>emptyMap(); } } public String getOrganizationName() { return organization.getLogin(); } public List<GHCommit> listCommits() { if (this.commits == null) { try { this.commits = repository.listCommits().asList(); } catch (Error e) { logger.warn("No commits found for project '{}' of organization '{}'.", repository.getName(), organization.getLogin()); this.commits = Collections.<GHCommit>emptyList(); } } return this.commits; } public List<GHRepository.Contributor> listContributors() { if (this.contributors == null) { try { this.contributors = repository.listContributors().asList(); } catch (Throwable t) { logger.warn("No contributors found for project '{}' of organization '{}'.", repository.getName(), organization.getLogin()); this.contributors = Collections.<GHRepository.Contributor>emptyList(); } } return this.contributors; } public List<GHTag> listTags() { if (this.tags == null) { try { this.tags = repository.listTags().asList(); } catch (Throwable t) { logger.warn("No tags found for project '{}' of organization '{}'.", repository.getName(), organization.getLogin()); this.tags = Collections.<GHTag>emptyList(); } } return this.tags; } public InputStream getFileContent(String path) throws IOException { return repository.getFileContent(path).read(); } }