将GitHub问题下载到.csv文件

时间:2014-02-17 11:33:31

标签: java csv github egit github-api

GitHub使用eclipse下载问题,不会返回任何内容。

最近,我一直在尝试创建一个Java桌面应用程序(用于Windows),它将从特定的GitHub问题库下载GitHub问题,并将它们保存在.csv文件中。

我使用Swing创建了一个简单的GUI来启用存储库名称的输入。我也使用eclipse的egit库来建立与GitHub的连接以便下载问题。我使用身份验证,使用.properties文件输入,以验证egit与GitHub的连接。

以下是我的应用程序用于下载问题并将其写入.csv文件的主要代码:

package io.github.psgs.issuesdownload;

import io.github.psgs.issuesdownload.gui.GUI;
import org.eclipse.egit.github.core.Issue;
import org.eclipse.egit.github.core.client.GitHubClient;
import org.eclipse.egit.github.core.service.IssueService;

import java.io.FileWriter;
import java.io.IOException;

public class IssuesDownload {

    public static void main(String[] args) {
        try {
        Config.loadConfiguration();
        } catch(IOException ex) {

        }
        GUI.main(args);
    }

    public static String saveIssues(String repoDetails) {
        String[] repoInfo = repoDetails.split("/");
        String repoOwner = repoInfo[0];
        String repoName = repoInfo[1];

        GitHubClient client = new GitHubClient();
        client.setCredentials(Config.githubuser, Config.githubpass);

        IssueService issueService = new IssueService(client);

        try {
            FileWriter writer = new FileWriter("issues.csv");
            //String[] header = {"Id", "Title", "Creator", "Assignee", "Milestone", "State", "Body Text"};
            writer.append("Id, Title, Creator, Assignee, Milestone, State, Body Text");
            writer.append("\n");

            for (Issue issue : issueService.getIssues(repoOwner, repoName, null)) {
                //String[] data = {String.valueOf(issue.getId()), issue.getTitle(), issue.getUser().getName(), issue.getAssignee().getName(), issue.getMilestone().getTitle(), issue.getState(), issue.getBodyText()};
                writer.append(String.valueOf(issue.getId()) + ",");
                writer.append(issue.getTitle() + ",");
                writer.append(issue.getUser().getName() + ",");
                writer.append(issue.getAssignee().getName() + ",");
                writer.append(issue.getMilestone().getTitle() + ",");
                writer.append(issue.getState() + ",");
                writer.append(issue.getBodyText());
                writer.append("\n");
            }
            writer.flush();
            writer.close();
            return "Download Complete!";
        } catch (IOException ex) {
            System.out.println("An IOException has occured!");
            ex.printStackTrace();
            if (ex.getMessage().equalsIgnoreCase("api.github.com")) {
                return "An error has occured, reaching " + ex.getMessage() + "! Please check your network connection.";
            }
        }
        return "An error has occured!";
    }
}

此代码也可在以下网址获得:https://gist.github.com/psgs/9048602

整个存储库位于:https://github.com/psgs/IssuesDownload

当我运行此代码时,如果.properties文件与compile .jar文件位于同一目录中,则GitHub问题不会出现在.csv文件中。我已经测试了.csv文件输出,并且在删除下载代码时标题写得正确。

有人知道为什么会这样吗?也许这是我错过的身份验证问题?

3 个答案:

答案 0 :(得分:2)

尝试了一些新的API包装后,我发现了一个可以运行的API库。我现在使用Kohsuke Kawaguchi's GitHub API for Java连接到GitHub。

<dependency>
        <groupId>org.kohsuke</groupId>
        <artifactId>github-api</artifactId>
        <version>1.49</version>
</dependency>

我的代码现在如下所示:

package io.github.psgs.issuesdownload;

import io.github.psgs.issuesdownload.gui.GUI;
import org.kohsuke.github.GHIssue;
import org.kohsuke.github.GHIssueState;
import org.kohsuke.github.GHRepository;
import org.kohsuke.github.GitHub;

import java.io.FileWriter;
import java.io.IOException;

public class IssuesDownload {

    public static void main(String[] args) {
        try {
            Config.loadConfiguration();
        } catch (IOException ex) {
            System.out.println("An IOException had occured while loading the configuration!");
            ex.printStackTrace();
        }
        GUI.main(args);
    }

    public static String saveIssues(String repoDetails, GHIssueState issueState) {

        String[] repoInfo = repoDetails.split("/");

        try {
            GitHub github = GitHub.connectUsingOAuth(Config.githubtoken);
            GHRepository repository = github.getUser(repoInfo[0]).getRepository(repoInfo[1]);

            FileWriter writer = new FileWriter("issues.csv");
            writer.append("Id, Title, Creator, Assignee, Milestone, State, Body Text");
            writer.append("\n");

            for (GHIssue issue : repository.getIssues(issueState)) {
                writer.append(String.valueOf(issue.getNumber()) + ",");
                writer.append(issue.getTitle() + ",");
                writer.append(issue.getUser().getLogin() + ",");
                if (issue.getAssignee() != null) {
                    writer.append(issue.getAssignee().getName() + ",");
                } else {
                    writer.append(" ,");
                }
                if (issue.getMilestone() != null) {
                    writer.append(issue.getMilestone().getTitle() + ",");
                } else {
                    writer.append(" ,");
                }
                writer.append(issue.getState() + ",");
                writer.append(issue.getBody() + ",");
                writer.append("\n");
            }
            writer.flush();
            writer.close();
            return "Download Complete!";
        } catch (IOException ex) {
            System.out.println("An IOException has occured!");
            ex.printStackTrace();
            if (ex.getMessage().equalsIgnoreCase("api.github.com")) {
            return "An error has occurred reaching " + ex.getMessage() + "! Please check your network connection.";
            }
        }
        return "An error has occured!";
    }
}

答案 1 :(得分:0)

看起来您正在使用的方法旨在用于检索currently authenticated user的问题。

也许this test(在项目的存储库中)会有所帮助。我看到的唯一区别是你没有传递singletonMap,我不确定你是否必须这样做。

答案 2 :(得分:0)

public static <T> void outputCsv(String fileName, String[] headerName,
        List<T> listResult, HttpServletRequest request) {
    HttpServletResponse response = ResponseUtil.getResponse();
    OutputStream out;
    try {
        // Encode file name
        fileName = Util.encodeUnicodeFile(fileName, request);

        response.setStatus(HttpServletResponse.SC_OK);
        response.setContentType("application/octet-stream; charset="
                + Constant.CONST_SJIS_ENCODING);
        response.setHeader("Content-disposition", "attachment; filename=\""
                + fileName + "\"");
        response.setCharacterEncoding(Constant.CONST_SJIS_ENCODING);

        out = response.getOutputStream();

        CSVWriter writer = new CSVWriter(new OutputStreamWriter(out,
                Constant.CONST_WINDOW_JAPAN_ENCODING),
                Constant.CONST_CSV_SEPARATOR_COMMA);
        // Convert list result data to List <String[]>
        List<String[]> list = convertListDataToCsvArray(listResult,
                headerName);

        // Write list data
        writer.writeAll(list);
        writer.close();

        out.close();

    } catch (Exception e) {
        e.printStackTrace();
    }
}
private static <T> List<String[]> convertListDataToCsvArray(
        List<T> listResult, String[] headerName) {
    List<String[]> listCsv = new ArrayList<String[]>();
    // First row is header
    listCsv.add(headerName);

    for (T object : listResult) {
        // Get all fields of object
        Field[] fields = object.getClass().getFields();
        // Init row
        String[] row = new String[headerName.length];

        int index = 0;
        for (Field field : fields) {
            try {
                if (field.getType().equals(Long.class)) {
                    // Read field value and set to string array
                    Long value = (Long) field.get(object);
                    row[index] = value != null ? String.valueOf(value) : "";
                } else if (field.getType().equals(String.class)) {
                    // Read field value and set to string array
                    String value = (String) field.get(object);
                    row[index] = value != null ? value : "";
                } else if (field.getType().equals(BigDecimal.class)) {
                    // Read field value and set to string array
                    BigDecimal value = (BigDecimal) field.get(object);
                    row[index] = value != null ? String.valueOf(value) : "";
                }

            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            index++;
        }
        // Add row
        listCsv.add(row);
    }

    return listCsv;
}