Java 将GitHub问题下载到.csv文件

Java 将GitHub问题下载到.csv文件,java,csv,github,egit,github-api,Java,Csv,Github,Egit,Github Api,GitHub使用EclipseGit发布下载,但不返回任何内容 最近,我一直在尝试创建一个java桌面应用程序(用于windows),它将从特定的GitHub问题存储库下载GitHub问题,并将它们保存在.csv文件中 我已经使用Swing创建了一个简单的GUI来启用存储库名称的输入。我还使用eclipse的egit库建立到GitHub的连接,以便下载问题。我使用身份验证,使用.properties文件输入,以验证egit与GitHub的连接 以下是我的应用程序用于下载问题并将其写入.csv文件

GitHub使用EclipseGit发布下载,但不返回任何内容

最近,我一直在尝试创建一个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!";
    }
}
此代码也可从以下网址获得:

整个存储库可在以下位置找到:

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


有人知道为什么会这样吗?可能是我遗漏了一个身份验证问题?

看起来您使用的方法是用来检索问题的

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

公共静态void outputCsv(字符串文件名,字符串[]headerName,
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;
}
列表列表结果,HttpServletRequest请求){ HttpServletResponse=ResponseUtil.getResponse(); 输出流输出; 试一试{ //编码文件名 fileName=Util.encodeUnicode文件名(文件名,请求); response.setStatus(HttpServletResponse.SC_OK); setContentType(“应用程序/八位字节流;字符集=” +常量(常量编码); response.setHeader(“内容处置”、“附件;文件名=\”) +文件名+“\”); 响应.setCharacterEncoding(常量.CONST_SJIS_编码); out=response.getOutputStream(); CSVWriter writer=新的CSVWriter(新的OutputStreamWriter(输出, 常数。常数(窗口编码), 常量(常量、CSV、分隔符、逗号); //将列表结果数据转换为列表 List List=CONVERTLISTDATOCSVARRAY(listResult, 头名); //写列表数据 writer.writeAll(列表); writer.close(); out.close(); }捕获(例外e){ e、 printStackTrace(); } } 私有静态列表convertListDataToCsvArray( 列表结果,字符串[]标题名称){ List listCsv=新建ArrayList(); //第一行是标题 listcv.add(headerName); for(T对象:listResult){ //获取对象的所有字段 Field[]fields=object.getClass().getFields(); //初始行 String[]行=新字符串[headerName.length]; int指数=0; 用于(字段:字段){ 试一试{ if(field.getType().equals(Long.class)){ //读取字段值并设置为字符串数组 Long value=(Long)field.get(object); 行[index]=value!=null?字符串。valueOf(value):“”; }else if(field.getType().equals(String.class)){ //读取字段值并设置为字符串数组 字符串值=(字符串)字段。获取(对象); 行[索引]=值!=空?值:“”; }else if(field.getType().equals(BigDecimal.class)){ //读取字段值并设置为字符串数组 BigDecimal值=(BigDecimal)字段。获取(对象); 行[index]=value!=null?字符串。valueOf(value):“”; } }捕获(IllegalArgumentException e){ e、 printStackTrace(); }捕获(非法访问例外e){ e、 printStackTrace(); } 索引++; } //添加行 添加(行); } 返回列表CSV; }
在尝试了一些新的API包装后,我发现了一个可以工作的API库。我现在使用连接到GitHub

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

存储库是否可能没有问题,或者您提供的存储库是否错误?我假设头行总是在文件中,您只是看不到任何其他数据。我尝试了多个存储库,并检查了我使用的存储库中是否存在未解决的问题。我也尝试过使用封闭存储库。getOpenIssues使用整数返回存储库中的问题数。我正在寻找一种方法,用存储库实际返回问题对象。也许IssueService中有一种方法?@psgs我更新了我的答案。我错过了
getOpenIssues
返回计数的消息。我在项目中发现了一个测试,它与您正在做的事情类似。这些评论表明它可能就是你要找的。非常感谢你对这个问题的回答!不幸的是,这个答案没有以安全的方式使用GitHub API,并且使用了一些我宁愿避免的长方法。谢谢,psgs。
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!";
    }
}