2016-05-26 17:50:06 +02:00
|
|
|
package org.gcube.portlets.widgets.githubconnector.server.git;
|
|
|
|
|
|
|
|
import java.io.ByteArrayInputStream;
|
|
|
|
import java.io.InputStream;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.List;
|
|
|
|
|
|
|
|
import org.apache.commons.codec.binary.Base64;
|
|
|
|
import org.eclipse.egit.github.core.Blob;
|
|
|
|
import org.eclipse.egit.github.core.Repository;
|
|
|
|
import org.eclipse.egit.github.core.RepositoryContents;
|
|
|
|
import org.eclipse.egit.github.core.client.GitHubClient;
|
|
|
|
import org.eclipse.egit.github.core.service.ContentsService;
|
|
|
|
import org.eclipse.egit.github.core.service.DataService;
|
|
|
|
import org.eclipse.egit.github.core.service.RepositoryService;
|
|
|
|
import org.gcube.portlets.widgets.githubconnector.server.storage.StorageUtil;
|
|
|
|
import org.gcube.portlets.widgets.githubconnector.shared.exception.ServiceException;
|
2016-06-15 18:25:04 +02:00
|
|
|
import org.gcube.portlets.widgets.githubconnector.shared.git.data.GitHubRepository;
|
|
|
|
import org.gcube.portlets.widgets.githubconnector.shared.git.data.credential.GitHubCredential;
|
|
|
|
import org.gcube.portlets.widgets.githubconnector.shared.git.data.credential.GitHubCredentialLogin;
|
|
|
|
import org.gcube.portlets.widgets.githubconnector.shared.git.data.credential.GitHubCredentialOAuth2;
|
2016-05-26 17:50:06 +02:00
|
|
|
import org.slf4j.Logger;
|
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* @author Giancarlo Panichi email: <a
|
|
|
|
* href="mailto:g.panichi@isti.cnr.it">g.panichi@isti.cnr.it</a>
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
public class GitConnectorService {
|
|
|
|
private static Logger logger = LoggerFactory
|
|
|
|
.getLogger(GitConnectorService.class);
|
|
|
|
|
|
|
|
private GitHubClient gitHubClient;
|
|
|
|
private String userName;
|
2016-06-13 18:26:53 +02:00
|
|
|
|
2016-05-26 17:50:06 +02:00
|
|
|
/**
|
|
|
|
*
|
2016-06-13 18:26:53 +02:00
|
|
|
* @param userName
|
|
|
|
* @param gitHubCredential
|
2016-05-26 17:50:06 +02:00
|
|
|
*/
|
2016-06-13 18:26:53 +02:00
|
|
|
public GitConnectorService(String userName, GitHubCredential gitHubCredential) {
|
2016-05-26 17:50:06 +02:00
|
|
|
this.userName = userName;
|
2016-06-13 18:26:53 +02:00
|
|
|
if(gitHubCredential!=null&& gitHubCredential.getType()!=null){
|
|
|
|
if(gitHubCredential instanceof GitHubCredentialLogin){
|
|
|
|
GitHubCredentialLogin gitHubCredentialLogin=(GitHubCredentialLogin) gitHubCredential;
|
|
|
|
gitHubClient = new GitHubClient();
|
|
|
|
gitHubClient.setCredentials(gitHubCredentialLogin.getUser()
|
|
|
|
,gitHubCredentialLogin.getPassword());
|
|
|
|
} else {
|
|
|
|
if(gitHubCredential instanceof GitHubCredentialOAuth2){
|
|
|
|
GitHubCredentialOAuth2 gitHubCredentialOAuth2=(GitHubCredentialOAuth2) gitHubCredential;
|
|
|
|
gitHubClient = new GitHubClient();
|
|
|
|
gitHubClient.setOAuth2Token(gitHubCredentialOAuth2.getToken());
|
|
|
|
} else {
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-05-26 17:50:06 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public ArrayList<GitHubRepository> getRepositories(String repositoryOwner)
|
|
|
|
throws ServiceException {
|
|
|
|
try {
|
|
|
|
RepositoryService service;
|
|
|
|
if (gitHubClient == null) {
|
|
|
|
service = new RepositoryService();
|
|
|
|
} else {
|
|
|
|
service = new RepositoryService(gitHubClient);
|
|
|
|
}
|
|
|
|
|
|
|
|
List<Repository> repositories = service
|
|
|
|
.getRepositories(repositoryOwner);
|
|
|
|
ArrayList<GitHubRepository> gitHubRepositories = GitHubRepositoryBuilder
|
|
|
|
.build(repositories);
|
|
|
|
logger.debug("Repositories: "+gitHubRepositories);
|
|
|
|
return gitHubRepositories;
|
|
|
|
} catch (Throwable e) {
|
|
|
|
logger.error(e.getLocalizedMessage());
|
|
|
|
e.printStackTrace();
|
|
|
|
throw new ServiceException(e.getLocalizedMessage(), e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void cloneRepository(String destinationFolderId,
|
|
|
|
String repositoryOwner, String repositoryName)
|
|
|
|
throws ServiceException {
|
|
|
|
try {
|
|
|
|
|
|
|
|
RepositoryService service;
|
|
|
|
if (gitHubClient == null) {
|
|
|
|
service = new RepositoryService();
|
|
|
|
} else {
|
|
|
|
service = new RepositoryService(gitHubClient);
|
|
|
|
}
|
|
|
|
Repository repository = service.getRepository(repositoryOwner,
|
|
|
|
repositoryName);
|
|
|
|
|
|
|
|
logger.debug("Repository: [Name=" + repository.getName()
|
|
|
|
+ ", Watcher=" + repository.getWatchers() + ", GitUrl="
|
|
|
|
+ repository.getGitUrl() + "]");
|
|
|
|
createContent(destinationFolderId, repository, null);
|
|
|
|
|
|
|
|
} catch (ServiceException e) {
|
|
|
|
throw e;
|
|
|
|
} catch (Throwable e) {
|
|
|
|
logger.error(e.getLocalizedMessage());
|
|
|
|
e.printStackTrace();
|
|
|
|
throw new ServiceException(e.getLocalizedMessage(), e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private void createContent(String destinationFolderId, Repository repo,
|
|
|
|
String path) throws ServiceException {
|
|
|
|
try {
|
|
|
|
ContentsService contentsService;
|
|
|
|
if (gitHubClient == null) {
|
|
|
|
contentsService = new ContentsService();
|
|
|
|
} else {
|
|
|
|
contentsService = new ContentsService(gitHubClient);
|
|
|
|
|
|
|
|
}
|
|
|
|
List<RepositoryContents> listRepositoryContents;
|
|
|
|
if (path == null) {
|
|
|
|
listRepositoryContents = contentsService.getContents(repo);
|
|
|
|
} else {
|
|
|
|
listRepositoryContents = contentsService
|
|
|
|
.getContents(repo, path);
|
|
|
|
}
|
|
|
|
|
|
|
|
for (RepositoryContents contents : listRepositoryContents) {
|
|
|
|
logger.debug("Contents: [name=" + contents.getName()
|
|
|
|
+ ", type=" + contents.getType() + ", encoding="
|
|
|
|
+ contents.getEncoding() + ", path="
|
|
|
|
+ contents.getPath() + ", sha=" + contents.getSha()
|
|
|
|
+ "]");
|
|
|
|
if (contents.getType() != null) {
|
|
|
|
if (contents.getType().compareToIgnoreCase(
|
|
|
|
RepositoryContents.TYPE_FILE) == 0) {
|
|
|
|
createFile(destinationFolderId, repo, contents);
|
|
|
|
} else {
|
|
|
|
if (contents.getType().compareToIgnoreCase(
|
|
|
|
RepositoryContents.TYPE_DIR) == 0) {
|
|
|
|
createDirectory(destinationFolderId, repo, contents);
|
|
|
|
} else {
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
} catch (ServiceException e) {
|
|
|
|
throw e;
|
|
|
|
} catch (Throwable e) {
|
|
|
|
logger.error(e.getLocalizedMessage());
|
|
|
|
e.printStackTrace();
|
|
|
|
throw new ServiceException(e.getLocalizedMessage(), e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private void createDirectory(String destinationFolderId,
|
|
|
|
Repository repository, RepositoryContents contents)
|
|
|
|
throws ServiceException {
|
|
|
|
try {
|
|
|
|
logger.debug("Directory: [destinationFolderId="
|
|
|
|
+ destinationFolderId + ", folderName="
|
|
|
|
+ contents.getName() + ", folderDescription="
|
|
|
|
+ contents.getName() + "]");
|
|
|
|
StorageUtil.createFolderOnWorkspace(userName, destinationFolderId,
|
|
|
|
contents.getName(), contents.getName());
|
|
|
|
|
|
|
|
createContent(destinationFolderId, repository, contents.getPath());
|
|
|
|
} catch (ServiceException e) {
|
|
|
|
throw e;
|
|
|
|
} catch (Throwable e) {
|
|
|
|
logger.error(e.getLocalizedMessage());
|
|
|
|
e.printStackTrace();
|
|
|
|
throw new ServiceException(e.getLocalizedMessage(), e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private void createFile(String destinationFolderId, Repository repository,
|
|
|
|
RepositoryContents contents) throws ServiceException {
|
|
|
|
try {
|
|
|
|
DataService dataService;
|
|
|
|
if (gitHubClient == null) {
|
|
|
|
dataService = new DataService();
|
|
|
|
} else {
|
|
|
|
dataService = new DataService(gitHubClient);
|
|
|
|
}
|
|
|
|
|
|
|
|
Blob blob = dataService.getBlob(repository, contents.getSha());
|
|
|
|
logger.debug("Blob: [encoding=" + blob.getEncoding() + "]");
|
|
|
|
if (blob.getEncoding().compareToIgnoreCase(
|
|
|
|
RepositoryContents.ENCODING_BASE64) == 0) {
|
|
|
|
byte[] decodedBytes = Base64.decodeBase64(blob.getContent()
|
|
|
|
.getBytes());
|
|
|
|
|
|
|
|
InputStream is = new ByteArrayInputStream(decodedBytes);
|
|
|
|
StorageUtil.saveOnWorkspace(userName, destinationFolderId,
|
|
|
|
contents.getName(), contents.getName(), is);
|
|
|
|
// logger.debug(new String(decodedBytes));
|
|
|
|
}
|
|
|
|
|
|
|
|
} catch (Throwable e) {
|
|
|
|
logger.error(e.getLocalizedMessage());
|
|
|
|
e.printStackTrace();
|
|
|
|
throw new ServiceException(e.getLocalizedMessage(), e);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|