/*******************************************************************************
* Copyright (c) 2012-2016 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.ide.ext.github.server;
import com.google.inject.Inject;
import org.eclipse.che.api.core.ApiException;
import org.eclipse.che.dto.server.DtoFactory;
import org.eclipse.che.ide.ext.github.shared.Collaborators;
import org.eclipse.che.ide.ext.github.shared.GitHubPullRequest;
import org.eclipse.che.ide.ext.github.shared.GitHubPullRequestHead;
import org.eclipse.che.ide.ext.github.shared.GitHubPullRequestList;
import org.eclipse.che.ide.ext.github.shared.GitHubRepository;
import org.eclipse.che.ide.ext.github.shared.GitHubRepositoryList;
import org.eclipse.che.ide.ext.github.shared.GitHubUser;
import org.kohsuke.github.GHCommitPointer;
import org.kohsuke.github.GHPersonSet;
import org.kohsuke.github.GHPullRequest;
import org.kohsuke.github.GHRepository;
import org.kohsuke.github.GHUser;
import org.kohsuke.github.PagedIterable;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* Factory class used for converting kohsuke GitHub instances to DTO objects
*
* @author Igor Vinokur
*/
public class GitHubDTOFactory {
@Inject
GitHubFactory gitHub;
/**
* Create DTO object of GitHub repositories collection from given repositories list
* @param ghRepositoriesList collection of repositories from kohsuke GitHub library
* @return DTO object
* @throws IOException
*/
public GitHubRepositoryList createRepositoriesList(PagedIterable<GHRepository> ghRepositoriesList) throws ApiException, IOException {
GitHubRepositoryList dtoRepositoriesList = DtoFactory.getInstance().createDto(GitHubRepositoryList.class);
List<GitHubRepository> dtoRepositories = new ArrayList<>();
for (GHRepository ghRepository : ghRepositoriesList) {
dtoRepositories.add(createRepository(ghRepository));
}
dtoRepositoriesList.setRepositories(dtoRepositories);
return dtoRepositoriesList;
}
/**
* Create DTO object of GitHub repositories collection from given repository
* @param ghRepository repository from kohsuke GitHub library
* @return DTO object
* @throws IOException
*/
public GitHubRepositoryList createRepositoriesList(GHRepository ghRepository) throws ApiException, IOException {
GitHubRepositoryList dtoRepositoriesList = DtoFactory.getInstance().createDto(GitHubRepositoryList.class);
List<GitHubRepository> dtoRepositories = new ArrayList<>();
dtoRepositories.add(createRepository(ghRepository));
dtoRepositoriesList.setRepositories(dtoRepositories);
return dtoRepositoriesList;
}
/**
* Create DTO object of GitHub repositories without repositories
* @return DTO object
* @throws IOException
*/
public GitHubRepositoryList createRepositoriesList() throws IOException {
return DtoFactory.getInstance().createDto(GitHubRepositoryList.class);
}
/**
* Create DTO object of GitHub repository from given repository
* @param ghRepository repository from kohsuke GitHub library
* @return DTO object
* @throws IOException
*/
public GitHubRepository createRepository(GHRepository ghRepository) throws ApiException, IOException {
GitHubRepository dtoRepository = DtoFactory.getInstance().createDto(GitHubRepository.class);
dtoRepository.setName(ghRepository.getName());
dtoRepository.setUrl(String.valueOf(ghRepository.getUrl()));
dtoRepository.setHomepage(ghRepository.getHomepage());
dtoRepository.setForks(ghRepository.getForks());
dtoRepository.setLanguage(ghRepository.getLanguage());
dtoRepository.setFork(ghRepository.isFork());
dtoRepository.setWatchers(ghRepository.getWatchers());
dtoRepository.setPrivateRepo(ghRepository.isPrivate());
dtoRepository.setSize(ghRepository.getSize());
dtoRepository.setDescription(ghRepository.getDescription());
dtoRepository.setSshUrl(ghRepository.getSshUrl());
dtoRepository.setHtmlUrl(ghRepository.gitHttpTransportUrl());
dtoRepository.setUpdatedAt(String.valueOf(ghRepository.getUpdatedAt()));
dtoRepository.setGitUrl(ghRepository.getGitTransportUrl());
dtoRepository.setHasWiki(ghRepository.hasWiki());
dtoRepository.setCloneUrl(String.valueOf(ghRepository.getUrl()));
dtoRepository.setSvnUrl(ghRepository.getSvnUrl());
dtoRepository.setOpenedIssues(ghRepository.getOpenIssueCount());
dtoRepository.setCreatedAt(String.valueOf(ghRepository.getCreatedAt()));
dtoRepository.setPushedAt(String.valueOf(ghRepository.getPushedAt()));
dtoRepository.setHasDownloads(ghRepository.hasDownloads());
dtoRepository.setHasIssues(ghRepository.hasIssues());
if (ghRepository.isFork() && ghRepository.getParent() != null) {
dtoRepository.setParent(createRepository(ghRepository.getParent()));
}
//if a repository is received from list, parent in repo is null, so we have to get repo separately to get his parent
if (ghRepository.isFork() && ghRepository.getParent() == null) {
dtoRepository.setParent(createRepository(gitHub.connect().getUser(ghRepository.getOwner().getLogin())
.getRepository(ghRepository.getName()).getParent()));
}
return dtoRepository;
}
/**
* Create DTO object of GitHub pull-requests collection from given pull-requests
* @param ghPullRequestsList collection of pull-requests from kohsuke GitHub library
* @return DTO object
* @throws IOException
*/
public GitHubPullRequestList createPullRequestsList(PagedIterable<GHPullRequest> ghPullRequestsList) throws IOException {
GitHubPullRequestList gitHubPullRequestList = DtoFactory.getInstance().createDto(GitHubPullRequestList.class);
List<GitHubPullRequest> dtoPullRequestsList = new ArrayList<>();
for (GHPullRequest ghPullRequest : ghPullRequestsList) {
dtoPullRequestsList.add(createPullRequest(ghPullRequest));
}
gitHubPullRequestList.setPullRequests(dtoPullRequestsList);
return gitHubPullRequestList;
}
/**
* Create DTO object of GitHub pull-requests collection from given pull-request
* @param ghPullRequest pull-request from kohsuke GitHub library
* @return DTO object
* @throws IOException
*/
public GitHubPullRequestList createPullRequestsList(GHPullRequest ghPullRequest) throws IOException {
GitHubPullRequestList gitHubPullRequestList = DtoFactory.getInstance().createDto(GitHubPullRequestList.class);
List<GitHubPullRequest> dtoPullRequestsList = new ArrayList<>();
dtoPullRequestsList.add(createPullRequest(ghPullRequest));
gitHubPullRequestList.setPullRequests(dtoPullRequestsList);
return gitHubPullRequestList;
}
/**
* Create DTO object of GitHub pull-request from given pull-request
* @param ghPullRequest pull-request from kohsuke GitHub library
* @return DTO object
* @throws IOException
*/
public GitHubPullRequest createPullRequest(GHPullRequest ghPullRequest) throws IOException {
GitHubPullRequest dtoPullRequest = DtoFactory.getInstance().createDto(GitHubPullRequest.class);
dtoPullRequest.setId(String.valueOf(ghPullRequest.getId()));
dtoPullRequest.setUrl(String.valueOf(ghPullRequest.getUrl()));
dtoPullRequest.setHtmlUrl(String.valueOf(ghPullRequest.getHtmlUrl()));
dtoPullRequest.setNumber(String.valueOf(ghPullRequest.getNumber()));
dtoPullRequest.setState(ghPullRequest.getState().toString());
dtoPullRequest.setHead(createPullRequestHead(ghPullRequest.getHead()));
dtoPullRequest.setMerged(ghPullRequest.isMerged());
if (ghPullRequest.getMergedBy() != null) {
dtoPullRequest.setMergedBy(createUser(ghPullRequest.getMergedBy()));
}
if (ghPullRequest.getMergeable() !=null) {
dtoPullRequest.setMergeable(ghPullRequest.getMergeable());
}
return dtoPullRequest;
}
/**
* Create DTO object of GitHub collaborators collection from given users
* @param ghCollaborators collection of users from kohsuke GitHub library
* @return DTO object
* @throws IOException
*/
public Collaborators createCollaborators(GHPersonSet<GHUser> ghCollaborators) throws IOException {
Collaborators collaborators = DtoFactory.getInstance().createDto(Collaborators.class);
for (GHUser collaborator : ghCollaborators) {
collaborators.getCollaborators().add(createUser(collaborator));
}
return collaborators;
}
/**
* Create DTO object of GitHub user from given user
* @param ghUser user from kohsuke GitHub library
* @return DTO object
* @throws IOException
*/
public GitHubUser createUser(GHUser ghUser) throws IOException {
GitHubUser dtoUser = DtoFactory.getInstance().createDto(GitHubUser.class);
dtoUser.setId(String.valueOf(ghUser.getId()));
dtoUser.setHtmlUrl(ghUser.getHtmlUrl().toString());
dtoUser.setAvatarUrl(ghUser.getAvatarUrl());
dtoUser.setBio(ghUser.getBlog());
dtoUser.setCompany(ghUser.getCompany());
dtoUser.setEmail(ghUser.getEmail());
dtoUser.setFollowers(ghUser.getFollowersCount());
dtoUser.setFollowing(ghUser.getFollowingCount());
dtoUser.setLocation(ghUser.getLocation());
dtoUser.setLogin(ghUser.getLogin());
dtoUser.setName(ghUser.getName());
dtoUser.setPublicGists(ghUser.getPublicGistCount());
dtoUser.setPublicRepos(ghUser.getPublicRepoCount());
dtoUser.setUrl(String.valueOf(ghUser.getUrl()));
dtoUser.setGravatarId(ghUser.getGravatarId());
return dtoUser;
}
/**
* Create DTO object of GitHub pull-request head from given pull-request head
* @param ghPullRequestHead pull-request head from kohsuke GitHub library
* @return DTO object
*/
public GitHubPullRequestHead createPullRequestHead(GHCommitPointer ghPullRequestHead){
GitHubPullRequestHead dtoPullRequestHead = DtoFactory.getInstance().createDto(GitHubPullRequestHead.class);
dtoPullRequestHead.setLabel(ghPullRequestHead.getLabel());
dtoPullRequestHead.setRef(ghPullRequestHead.getRef());
dtoPullRequestHead.setSha(ghPullRequestHead.getSha());
return dtoPullRequestHead;
}
}