{"action":"created","comment":{"url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/pulls/comments/39873201","id":39873201,"diff_hunk":"@@ -0,0 +1,421 @@\n+package org.sagebionetworks.bridge.udd.synapse;\n+\n+import java.io.BufferedReader;\n+import java.io.File;\n+import java.io.IOException;\n+import java.util.ArrayList;\n+import java.util.HashMap;\n+import java.util.List;\n+import java.util.Map;\n+import java.util.Set;\n+import java.util.concurrent.Callable;\n+import java.util.concurrent.TimeUnit;\n+\n+import au.com.bytecode.opencsv.CSVWriter;\n+import com.google.common.base.Stopwatch;\n+import com.google.common.base.Strings;\n+import org.sagebionetworks.client.exceptions.SynapseException;\n+import org.sagebionetworks.repo.model.file.BulkFileDownloadResponse;\n+import org.sagebionetworks.repo.model.file.FileDownloadSummary;\n+import org.sagebionetworks.util.csv.CsvNullReader;\n+import org.slf4j.Logger;\n+import org.slf4j.LoggerFactory;\n+\n+import org.sagebionetworks.bridge.udd.dynamodb.UploadSchema;\n+import org.sagebionetworks.bridge.udd.exceptions.AsyncTaskExecutionException;\n+import org.sagebionetworks.bridge.udd.exceptions.AsyncTimeoutException;\n+import org.sagebionetworks.bridge.udd.helper.FileHelper;\n+\n+/**\n+ * A one-shot asynchronous task to query a Synapse table and download the CSV. This task returns the struct of files\n+ * downloaded. This includes the CSV (if the query pulls data from the table) and a ZIP with the attached file handles\n+ * (if there are any).\n+ */\n+public class SynapseDownloadFromTableTask implements Callable<SynapseDownloadFromTableResult> {\n+    private static final Logger LOG = LoggerFactory.getLogger(SynapseDownloadFromTableTask.class);\n+\n+    private static final String COL_HEALTH_CODE = \"healthCode\";\n+    private static final String ERROR_DOWNLOADING_ATTACHMENT = \"Unknown error downloading attachment\";\n+    private static final String QUERY_TEMPLATE =\n+            \"SELECT * FROM %s WHERE healthCode = '%s' AND uploadDate >= '%s' AND uploadDate <= '%s'\";\n+\n+    // Task parameters. Params is passed in by constructor. Context is created by this task.\n+    private final SynapseDownloadFromTableParameters params;\n+    private final SynapseDownloadFromTableContext ctx = new SynapseDownloadFromTableContext();\n+\n+    // Helpers and config objects. Originates from Spring configs and is passed in through setters using a similar\n+    // pattern.\n+    private FileHelper fileHelper;\n+    private SynapseHelper synapseHelper;\n+\n+    /**\n+     * Constructs this task with the specified task parameters\n+     *\n+     * @param params\n+     *         task parameters\n+     */\n+    public SynapseDownloadFromTableTask(SynapseDownloadFromTableParameters params) {\n+        this.params = params;\n+    }\n+\n+    /**\n+     * Wrapper class around the file system. Used by unit tests to test the functionality without hitting the real file\n+     * system.\n+     */\n+    public final void setFileHelper(FileHelper fileHelper) {\n+        this.fileHelper = fileHelper;\n+    }\n+\n+    /** Synapse helper, used to download CSV and bulk file download from Synapse. */\n+    public final void setSynapseHelper(SynapseHelper synapseHelper) {\n+        this.synapseHelper = synapseHelper;\n+    }\n+\n+    /**\n+     * Executes the SynapseDownloadFromTableTask. Returns the list of files downloaded. These files all live in the\n+     * temp directory passed in from the task parameters.\n+     *\n+     * @return list of files downloaded\n+     */\n+    @Override\n+    public SynapseDownloadFromTableResult call() {\n+        try {\n+            downloadCsv();\n+            if (filterNoDataCsvFiles()) {\n+                // return an empty result, to signify no data\n+                return new SynapseDownloadFromTableResult.Builder().build();\n+            }\n+            getColumnInfoFromCsv();\n+\n+            if (ctx.getColumnInfo().getFileHandleColumnIndexSet().isEmpty()) {\n+                LOG.info(\"No file handles columns in file \" + ctx.getCsvFilePath() +\n+                        \". Skipping extracting and downloading file handles.\");\n+            } else {\n+                extractFileHandleIdsFromCsv();\n+\n+                if (ctx.getFileHandleIdSet().isEmpty()) {\n+                    // This is rare but possible.\n+                    LOG.info(\"No file handles to download for file \" + ctx.getCsvFilePath() +\n+                            \". Skipping downloading file handles.\");\n+                } else {\n+                    bulkDownloadFileHandles();\n+                }\n+            }\n+\n+            editCsv();\n+\n+            return new SynapseDownloadFromTableResult.Builder().withCsvFile(ctx.getCsvFile())\n+                    .withBulkDownloadFile(ctx.getBulkDownloadFile()).build();\n+        } catch (RuntimeException ex) {\n+            // Cleanup files. No need to leave garbage behind.\n+            cleanupFiles();\n+            throw new AsyncTaskExecutionException(ex);\n+        }\n+    }\n+\n+    /**\n+     * Queries a Synapse table based on the params and downloads the result as a CSV. This method reads all params\n+     * (except schema) from {@link SynapseDownloadFromTableParameters} to generate the query and writes the resulting\n+     * CSV to {@link SynapseDownloadFromTableContext#setCsvFile}.\n+     */\n+    private void downloadCsv() {\n+        String synapseTableId = params.getSynapseTableId();\n+        File csvFile = fileHelper.newFile(params.getTempDir(), params.getSchema().getKey().toString() + \".csv\");\n+        String csvFilePath = csvFile.getAbsolutePath();\n+\n+        Stopwatch downloadCsvStopwatch = Stopwatch.createStarted();\n+        try {\n+            String query = String.format(QUERY_TEMPLATE, synapseTableId, params.getHealthCode(), params.getStartDate(),\n+                    params.getEndDate());\n+            String csvFileHandleId = synapseHelper.generateFileHandleFromTableQuery(query, synapseTableId);\n+            synapseHelper.downloadFileHandle(csvFileHandleId, csvFile);\n+            ctx.setCsvFile(csvFile);\n+        } catch (AsyncTimeoutException | SynapseException ex) {\n+            throw new AsyncTaskExecutionException(\"Error downloading synapse table \" + synapseTableId + \" to file \" +\n+                    csvFilePath + \": \" + ex.getMessage(), ex);\n+        } finally {\n+            downloadCsvStopwatch.stop();\n+            LOG.info(\"Downloading from synapse table \" + synapseTableId + \" to file \" + csvFilePath + \" took \" +\n+                    downloadCsvStopwatch.elapsed(TimeUnit.MILLISECONDS) + \" ms\");\n+        }\n+    }\n+\n+    /**\n+     * <p>\n+     * Sometimes, a Synapse table contains no data for the given user and time range. This method counts the lines in\n+     * the file to determine if that is the case. If there aren't at least 2 lines (header row plus at least one data\n+     * row), we filter out the file. (The actual filtering is done by the caller. We simply return true if we should\n+     * filter.)\n+     * </p>\n+     * <p>\n+     * This method reads from {@link SynapseDownloadFromTableContext#getCsvFile} and doesn't write anything back to\n+     * the context.\n+     * </p>\n+     *\n+     * @return true if the file should be filtered because there's no user data\n+     */\n+    private boolean filterNoDataCsvFiles() {\n+        int numLines = 0;\n+        try (BufferedReader csvFileReader = fileHelper.getReader(ctx.getCsvFile())) {\n+            while (csvFileReader.readLine() != null) {\n+                numLines++;\n+                if (numLines >= 2) {\n+                    // We only need to read 2 lines (1 header, 1 user data). Now that we've read 2 lines, we can\n+                    // short-circuit\n+                    break;","path":"src/main/java/org/sagebionetworks/bridge/udd/synapse/SynapseDownloadFromTableTask.java","position":165,"original_position":165,"commit_id":"5df74a75d8b1086fca1d3ff656c7822ad5b568fb","original_commit_id":"5df74a75d8b1086fca1d3ff656c7822ad5b568fb","user":{"login":"alxdarksage","id":5589085,"avatar_url":"https://avatars.githubusercontent.com/u/5589085?v=3","gravatar_id":"","url":"https://api.github.com/users/alxdarksage","html_url":"https://github.com/alxdarksage","followers_url":"https://api.github.com/users/alxdarksage/followers","following_url":"https://api.github.com/users/alxdarksage/following{/other_user}","gists_url":"https://api.github.com/users/alxdarksage/gists{/gist_id}","starred_url":"https://api.github.com/users/alxdarksage/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/alxdarksage/subscriptions","organizations_url":"https://api.github.com/users/alxdarksage/orgs","repos_url":"https://api.github.com/users/alxdarksage/repos","events_url":"https://api.github.com/users/alxdarksage/events{/privacy}","received_events_url":"https://api.github.com/users/alxdarksage/received_events","type":"User","site_admin":false},"body":"Seems like this method could be shorter by returning false here, then cleaning up and returning true after while loop (which, because file was empty, only made it 0-1 loops anyway).","created_at":"2015-09-18T16:21:11Z","updated_at":"2015-09-18T16:21:11Z","html_url":"https://github.com/Sage-Bionetworks/BridgeUserDataDownloadService/pull/6#discussion_r39873201","pull_request_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/pulls/6","_links":{"self":{"href":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/pulls/comments/39873201"},"html":{"href":"https://github.com/Sage-Bionetworks/BridgeUserDataDownloadService/pull/6#discussion_r39873201"},"pull_request":{"href":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/pulls/6"}}},"pull_request":{"url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/pulls/6","id":45111628,"html_url":"https://github.com/Sage-Bionetworks/BridgeUserDataDownloadService/pull/6","diff_url":"https://github.com/Sage-Bionetworks/BridgeUserDataDownloadService/pull/6.diff","patch_url":"https://github.com/Sage-Bionetworks/BridgeUserDataDownloadService/pull/6.patch","issue_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/issues/6","number":6,"state":"open","locked":false,"title":"Download data as CSVs and attachments instead of as raw JSON","user":{"login":"DwayneJengSage","id":9541190,"avatar_url":"https://avatars.githubusercontent.com/u/9541190?v=3","gravatar_id":"","url":"https://api.github.com/users/DwayneJengSage","html_url":"https://github.com/DwayneJengSage","followers_url":"https://api.github.com/users/DwayneJengSage/followers","following_url":"https://api.github.com/users/DwayneJengSage/following{/other_user}","gists_url":"https://api.github.com/users/DwayneJengSage/gists{/gist_id}","starred_url":"https://api.github.com/users/DwayneJengSage/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/DwayneJengSage/subscriptions","organizations_url":"https://api.github.com/users/DwayneJengSage/orgs","repos_url":"https://api.github.com/users/DwayneJengSage/repos","events_url":"https://api.github.com/users/DwayneJengSage/events{/privacy}","received_events_url":"https://api.github.com/users/DwayneJengSage/received_events","type":"User","site_admin":false},"body":"This involves integrating with Synapse and refactoring the code. See also https://sagebionetworks.jira.com/browse/BRIDGE-771\r\n\r\nTesting done:\r\n* \"mvn clean verify\" succeeds (build, unit tests, jacoco coverage check, findbugs check)\r\n* manually tested getting data and no data emails","created_at":"2015-09-15T22:40:37Z","updated_at":"2015-09-18T16:21:11Z","closed_at":null,"merged_at":null,"merge_commit_sha":"c643ed2f8e623842049227c6c9d351b73bfa3352","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/pulls/6/commits","review_comments_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/pulls/6/comments","review_comment_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/issues/6/comments","statuses_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/statuses/5df74a75d8b1086fca1d3ff656c7822ad5b568fb","head":{"label":"DwayneJengSage:develop","ref":"develop","sha":"5df74a75d8b1086fca1d3ff656c7822ad5b568fb","user":{"login":"DwayneJengSage","id":9541190,"avatar_url":"https://avatars.githubusercontent.com/u/9541190?v=3","gravatar_id":"","url":"https://api.github.com/users/DwayneJengSage","html_url":"https://github.com/DwayneJengSage","followers_url":"https://api.github.com/users/DwayneJengSage/followers","following_url":"https://api.github.com/users/DwayneJengSage/following{/other_user}","gists_url":"https://api.github.com/users/DwayneJengSage/gists{/gist_id}","starred_url":"https://api.github.com/users/DwayneJengSage/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/DwayneJengSage/subscriptions","organizations_url":"https://api.github.com/users/DwayneJengSage/orgs","repos_url":"https://api.github.com/users/DwayneJengSage/repos","events_url":"https://api.github.com/users/DwayneJengSage/events{/privacy}","received_events_url":"https://api.github.com/users/DwayneJengSage/received_events","type":"User","site_admin":false},"repo":{"id":39233629,"name":"BridgeUserDataDownloadService","full_name":"DwayneJengSage/BridgeUserDataDownloadService","owner":{"login":"DwayneJengSage","id":9541190,"avatar_url":"https://avatars.githubusercontent.com/u/9541190?v=3","gravatar_id":"","url":"https://api.github.com/users/DwayneJengSage","html_url":"https://github.com/DwayneJengSage","followers_url":"https://api.github.com/users/DwayneJengSage/followers","following_url":"https://api.github.com/users/DwayneJengSage/following{/other_user}","gists_url":"https://api.github.com/users/DwayneJengSage/gists{/gist_id}","starred_url":"https://api.github.com/users/DwayneJengSage/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/DwayneJengSage/subscriptions","organizations_url":"https://api.github.com/users/DwayneJengSage/orgs","repos_url":"https://api.github.com/users/DwayneJengSage/repos","events_url":"https://api.github.com/users/DwayneJengSage/events{/privacy}","received_events_url":"https://api.github.com/users/DwayneJengSage/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/DwayneJengSage/BridgeUserDataDownloadService","description":"Bridge User Data Download (BUDD) Service","fork":true,"url":"https://api.github.com/repos/DwayneJengSage/BridgeUserDataDownloadService","forks_url":"https://api.github.com/repos/DwayneJengSage/BridgeUserDataDownloadService/forks","keys_url":"https://api.github.com/repos/DwayneJengSage/BridgeUserDataDownloadService/keys{/key_id}","collaborators_url":"https://api.github.com/repos/DwayneJengSage/BridgeUserDataDownloadService/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/DwayneJengSage/BridgeUserDataDownloadService/teams","hooks_url":"https://api.github.com/repos/DwayneJengSage/BridgeUserDataDownloadService/hooks","issue_events_url":"https://api.github.com/repos/DwayneJengSage/BridgeUserDataDownloadService/issues/events{/number}","events_url":"https://api.github.com/repos/DwayneJengSage/BridgeUserDataDownloadService/events","assignees_url":"https://api.github.com/repos/DwayneJengSage/BridgeUserDataDownloadService/assignees{/user}","branches_url":"https://api.github.com/repos/DwayneJengSage/BridgeUserDataDownloadService/branches{/branch}","tags_url":"https://api.github.com/repos/DwayneJengSage/BridgeUserDataDownloadService/tags","blobs_url":"https://api.github.com/repos/DwayneJengSage/BridgeUserDataDownloadService/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/DwayneJengSage/BridgeUserDataDownloadService/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/DwayneJengSage/BridgeUserDataDownloadService/git/refs{/sha}","trees_url":"https://api.github.com/repos/DwayneJengSage/BridgeUserDataDownloadService/git/trees{/sha}","statuses_url":"https://api.github.com/repos/DwayneJengSage/BridgeUserDataDownloadService/statuses/{sha}","languages_url":"https://api.github.com/repos/DwayneJengSage/BridgeUserDataDownloadService/languages","stargazers_url":"https://api.github.com/repos/DwayneJengSage/BridgeUserDataDownloadService/stargazers","contributors_url":"https://api.github.com/repos/DwayneJengSage/BridgeUserDataDownloadService/contributors","subscribers_url":"https://api.github.com/repos/DwayneJengSage/BridgeUserDataDownloadService/subscribers","subscription_url":"https://api.github.com/repos/DwayneJengSage/BridgeUserDataDownloadService/subscription","commits_url":"https://api.github.com/repos/DwayneJengSage/BridgeUserDataDownloadService/commits{/sha}","git_commits_url":"https://api.github.com/repos/DwayneJengSage/BridgeUserDataDownloadService/git/commits{/sha}","comments_url":"https://api.github.com/repos/DwayneJengSage/BridgeUserDataDownloadService/comments{/number}","issue_comment_url":"https://api.github.com/repos/DwayneJengSage/BridgeUserDataDownloadService/issues/comments{/number}","contents_url":"https://api.github.com/repos/DwayneJengSage/BridgeUserDataDownloadService/contents/{+path}","compare_url":"https://api.github.com/repos/DwayneJengSage/BridgeUserDataDownloadService/compare/{base}...{head}","merges_url":"https://api.github.com/repos/DwayneJengSage/BridgeUserDataDownloadService/merges","archive_url":"https://api.github.com/repos/DwayneJengSage/BridgeUserDataDownloadService/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/DwayneJengSage/BridgeUserDataDownloadService/downloads","issues_url":"https://api.github.com/repos/DwayneJengSage/BridgeUserDataDownloadService/issues{/number}","pulls_url":"https://api.github.com/repos/DwayneJengSage/BridgeUserDataDownloadService/pulls{/number}","milestones_url":"https://api.github.com/repos/DwayneJengSage/BridgeUserDataDownloadService/milestones{/number}","notifications_url":"https://api.github.com/repos/DwayneJengSage/BridgeUserDataDownloadService/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/DwayneJengSage/BridgeUserDataDownloadService/labels{/name}","releases_url":"https://api.github.com/repos/DwayneJengSage/BridgeUserDataDownloadService/releases{/id}","created_at":"2015-07-17T03:46:44Z","updated_at":"2015-07-17T04:45:29Z","pushed_at":"2015-09-18T06:45:16Z","git_url":"git://github.com/DwayneJengSage/BridgeUserDataDownloadService.git","ssh_url":"git@github.com:DwayneJengSage/BridgeUserDataDownloadService.git","clone_url":"https://github.com/DwayneJengSage/BridgeUserDataDownloadService.git","svn_url":"https://github.com/DwayneJengSage/BridgeUserDataDownloadService","homepage":null,"size":194,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"develop"}},"base":{"label":"Sage-Bionetworks:develop","ref":"develop","sha":"624c67ac9ac8a7182e05b183449aee98163f2b2b","user":{"login":"Sage-Bionetworks","id":1250897,"avatar_url":"https://avatars.githubusercontent.com/u/1250897?v=3","gravatar_id":"","url":"https://api.github.com/users/Sage-Bionetworks","html_url":"https://github.com/Sage-Bionetworks","followers_url":"https://api.github.com/users/Sage-Bionetworks/followers","following_url":"https://api.github.com/users/Sage-Bionetworks/following{/other_user}","gists_url":"https://api.github.com/users/Sage-Bionetworks/gists{/gist_id}","starred_url":"https://api.github.com/users/Sage-Bionetworks/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Sage-Bionetworks/subscriptions","organizations_url":"https://api.github.com/users/Sage-Bionetworks/orgs","repos_url":"https://api.github.com/users/Sage-Bionetworks/repos","events_url":"https://api.github.com/users/Sage-Bionetworks/events{/privacy}","received_events_url":"https://api.github.com/users/Sage-Bionetworks/received_events","type":"Organization","site_admin":false},"repo":{"id":39233461,"name":"BridgeUserDataDownloadService","full_name":"Sage-Bionetworks/BridgeUserDataDownloadService","owner":{"login":"Sage-Bionetworks","id":1250897,"avatar_url":"https://avatars.githubusercontent.com/u/1250897?v=3","gravatar_id":"","url":"https://api.github.com/users/Sage-Bionetworks","html_url":"https://github.com/Sage-Bionetworks","followers_url":"https://api.github.com/users/Sage-Bionetworks/followers","following_url":"https://api.github.com/users/Sage-Bionetworks/following{/other_user}","gists_url":"https://api.github.com/users/Sage-Bionetworks/gists{/gist_id}","starred_url":"https://api.github.com/users/Sage-Bionetworks/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Sage-Bionetworks/subscriptions","organizations_url":"https://api.github.com/users/Sage-Bionetworks/orgs","repos_url":"https://api.github.com/users/Sage-Bionetworks/repos","events_url":"https://api.github.com/users/Sage-Bionetworks/events{/privacy}","received_events_url":"https://api.github.com/users/Sage-Bionetworks/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Sage-Bionetworks/BridgeUserDataDownloadService","description":"Bridge User Data Download (BUDD) Service","fork":false,"url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService","forks_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/forks","keys_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/teams","hooks_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/hooks","issue_events_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/issues/events{/number}","events_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/events","assignees_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/assignees{/user}","branches_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/branches{/branch}","tags_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/tags","blobs_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/git/refs{/sha}","trees_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/statuses/{sha}","languages_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/languages","stargazers_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/stargazers","contributors_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/contributors","subscribers_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/subscribers","subscription_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/subscription","commits_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/commits{/sha}","git_commits_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/git/commits{/sha}","comments_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/comments{/number}","issue_comment_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/issues/comments{/number}","contents_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/contents/{+path}","compare_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/merges","archive_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/downloads","issues_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/issues{/number}","pulls_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/pulls{/number}","milestones_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/milestones{/number}","notifications_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/labels{/name}","releases_url":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/releases{/id}","created_at":"2015-07-17T03:41:34Z","updated_at":"2015-07-29T22:31:17Z","pushed_at":"2015-09-18T06:45:17Z","git_url":"git://github.com/Sage-Bionetworks/BridgeUserDataDownloadService.git","ssh_url":"git@github.com:Sage-Bionetworks/BridgeUserDataDownloadService.git","clone_url":"https://github.com/Sage-Bionetworks/BridgeUserDataDownloadService.git","svn_url":"https://github.com/Sage-Bionetworks/BridgeUserDataDownloadService","homepage":null,"size":244,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":1,"forks":1,"open_issues":1,"watchers":0,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/pulls/6"},"html":{"href":"https://github.com/Sage-Bionetworks/BridgeUserDataDownloadService/pull/6"},"issue":{"href":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/issues/6"},"comments":{"href":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/issues/6/comments"},"review_comments":{"href":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/pulls/6/comments"},"review_comment":{"href":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/pulls/6/commits"},"statuses":{"href":"https://api.github.com/repos/Sage-Bionetworks/BridgeUserDataDownloadService/statuses/5df74a75d8b1086fca1d3ff656c7822ad5b568fb"}}}}