{"action":"created","comment":{"url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/pulls/comments/149228469","pull_request_review_id":74590731,"id":149228469,"diff_hunk":"@@ -0,0 +1,130 @@\n+package org.opentestsystem.rdw.reporting.common.service.impl;\n+\n+import com.fasterxml.jackson.databind.JsonNode;\n+import com.fasterxml.jackson.databind.ObjectMapper;\n+import com.fasterxml.jackson.databind.node.ObjectNode;\n+import com.fasterxml.jackson.dataformat.javaprop.JavaPropsMapper;\n+import org.opentestsystem.rdw.reporting.common.configuration.TenantProperties;\n+import org.opentestsystem.rdw.reporting.common.i18n.TranslationService;\n+import org.opentestsystem.rdw.reporting.common.service.FrontendTranslationService;\n+import org.opentestsystem.rdw.reporting.common.service.TranslationMergeService;\n+import org.slf4j.Logger;\n+import org.slf4j.LoggerFactory;\n+import org.springframework.core.io.Resource;\n+import org.springframework.core.io.ResourceLoader;\n+import org.springframework.stereotype.Service;\n+\n+import java.io.IOException;\n+import java.io.InputStream;\n+import java.util.Iterator;\n+import java.util.Locale;\n+import java.util.Properties;\n+\n+import static org.springframework.util.StringUtils.isEmpty;\n+\n+/**\n+ * This will read messages from (in order of preference):<ol>\n+ *     <li>{@link org.opentestsystem.rdw.reporting.common.configuration.TenantProperties#getTranslationLocation()}</li>\n+ *     <li>database translation table</li>\n+ * </ol>\n+ */\n+@Service\n+public class DefaultTranslationMergeService implements TranslationMergeService {\n+    private final static Logger logger = LoggerFactory.getLogger(DefaultTranslationMergeService.class);\n+\n+    private final TenantProperties tenantProperties;\n+    private final ResourceLoader resourceLoader;\n+    private final ObjectMapper objectMapper;\n+    private final TranslationService translationService;\n+\n+    public DefaultTranslationMergeService(final TenantProperties tenantProperties,\n+                                          final ResourceLoader resourceLoader,\n+                                          final ObjectMapper objectMapper,\n+                                          final FrontendTranslationService translationService) {\n+        this.tenantProperties = tenantProperties;\n+        this.resourceLoader = resourceLoader;\n+        this.objectMapper = objectMapper;\n+        this.translationService = translationService;\n+    }\n+\n+    //TODO Consider application-level caching scheme - this should almost never change.\n+    @Override\n+    public ObjectNode getLocaleMessages(final Locale locale) {\n+        final ObjectNode messages = new ObjectNode(objectMapper.getNodeFactory());\n+\n+        final Properties translationProperties = new Properties();\n+        translationProperties.putAll(translationService.getTranslationsByCode(locale));\n+        appendProperties(messages, translationProperties);\n+\n+        if (isEmpty(tenantProperties.getTranslationLocation())) {\n+            return messages;\n+        }\n+\n+        final Resource externalMessages = resourceLoader.getResource(getExternalLocation(locale));\n+        appendResource(messages, externalMessages);\n+\n+        return messages;\n+    }\n+\n+    private String getExternalLocation(final Locale locale) {\n+        return tenantProperties.getTranslationLocation() + locale.getLanguage() + \".json\";\n+    }\n+\n+    private void appendProperties(final ObjectNode messages, final Properties properties) {\n+        try {\n+            final JavaPropsMapper propsMapper = new JavaPropsMapper();\n+            final String output = propsMapper.writeValueAsString(properties);\n+            final ObjectNode object = (ObjectNode) propsMapper.readTree(output);\n+            deepMerge(messages, object);\n+        } catch (final IOException e) {\n+            logger.error(\"Unable to parse database translations\", e);\n+        }\n+    }\n+\n+    private void appendResource(final ObjectNode messages, final Resource resource) {\n+        if (!resource.exists()) {\n+            return;\n+        }\n+\n+        try (final InputStream in = resource.getInputStream()) {\n+            final JsonNode resourceNode =  objectMapper.readTree(in);\n+            if (resourceNode.isObject()) {\n+                deepMerge(messages, (ObjectNode) resourceNode);\n+            }\n+        } catch (final IOException e) {\n+            logger.warn(\"Unable to open translation resource: {}\", resource);\n+        }\n+    }\n+\n+    private void deepMerge(final ObjectNode target, final ObjectNode source) {","path":"common-web/src/main/java/org/opentestsystem/rdw/reporting/common/service/impl/DefaultTranslationMergeService.java","position":99,"original_position":99,"commit_id":"6bc8e74403bf92b59116e7bc901d3f222322033a","original_commit_id":"ea35b9a35297527376301ea3093e95d2ec32d5c3","user":{"login":"bgsavage","id":5771116,"avatar_url":"https://avatars2.githubusercontent.com/u/5771116?v=4","gravatar_id":"","url":"https://api.github.com/users/bgsavage","html_url":"https://github.com/bgsavage","followers_url":"https://api.github.com/users/bgsavage/followers","following_url":"https://api.github.com/users/bgsavage/following{/other_user}","gists_url":"https://api.github.com/users/bgsavage/gists{/gist_id}","starred_url":"https://api.github.com/users/bgsavage/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bgsavage/subscriptions","organizations_url":"https://api.github.com/users/bgsavage/orgs","repos_url":"https://api.github.com/users/bgsavage/repos","events_url":"https://api.github.com/users/bgsavage/events{/privacy}","received_events_url":"https://api.github.com/users/bgsavage/received_events","type":"User","site_admin":false},"body":"Other options could be:\r\n1.  Have the api return two separate api objects that get merged on the ui along with the ui / api merge.\r\n2.  Treat the ui \"embedded language\" as resource location, possibly as a hardcoded one, and so everything is merged on the api and the ui only makes the one api call (no resource load of en.json on the ui)","created_at":"2017-11-06T22:52:58Z","updated_at":"2017-11-06T22:52:59Z","html_url":"https://github.com/SmarterApp/RDW_Reporting/pull/570#discussion_r149228469","pull_request_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/pulls/570","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/SmarterApp/RDW_Reporting/pulls/comments/149228469"},"html":{"href":"https://github.com/SmarterApp/RDW_Reporting/pull/570#discussion_r149228469"},"pull_request":{"href":"https://api.github.com/repos/SmarterApp/RDW_Reporting/pulls/570"}},"in_reply_to_id":149215470},"pull_request":{"url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/pulls/570","id":150968704,"html_url":"https://github.com/SmarterApp/RDW_Reporting/pull/570","diff_url":"https://github.com/SmarterApp/RDW_Reporting/pull/570.diff","patch_url":"https://github.com/SmarterApp/RDW_Reporting/pull/570.patch","issue_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/issues/570","number":570,"state":"open","locked":false,"title":"Support configurable languages for the reporting webapp UI","user":{"login":"wtritch","id":617828,"avatar_url":"https://avatars3.githubusercontent.com/u/617828?v=4","gravatar_id":"","url":"https://api.github.com/users/wtritch","html_url":"https://github.com/wtritch","followers_url":"https://api.github.com/users/wtritch/followers","following_url":"https://api.github.com/users/wtritch/following{/other_user}","gists_url":"https://api.github.com/users/wtritch/gists{/gist_id}","starred_url":"https://api.github.com/users/wtritch/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wtritch/subscriptions","organizations_url":"https://api.github.com/users/wtritch/orgs","repos_url":"https://api.github.com/users/wtritch/repos","events_url":"https://api.github.com/users/wtritch/events{/privacy}","received_events_url":"https://api.github.com/users/wtritch/received_events","type":"User","site_admin":false},"body":"This PR allows multiple reporting webapp UI languages by accepting .json files from an arbitrary source, such as our configuration server.","created_at":"2017-11-06T21:49:29Z","updated_at":"2017-11-06T22:52:59Z","closed_at":null,"merged_at":null,"merge_commit_sha":"fe41932a102fd58e03e3f95cba5814f6e6839b0a","assignee":{"login":"jtreuting","id":341584,"avatar_url":"https://avatars0.githubusercontent.com/u/341584?v=4","gravatar_id":"","url":"https://api.github.com/users/jtreuting","html_url":"https://github.com/jtreuting","followers_url":"https://api.github.com/users/jtreuting/followers","following_url":"https://api.github.com/users/jtreuting/following{/other_user}","gists_url":"https://api.github.com/users/jtreuting/gists{/gist_id}","starred_url":"https://api.github.com/users/jtreuting/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jtreuting/subscriptions","organizations_url":"https://api.github.com/users/jtreuting/orgs","repos_url":"https://api.github.com/users/jtreuting/repos","events_url":"https://api.github.com/users/jtreuting/events{/privacy}","received_events_url":"https://api.github.com/users/jtreuting/received_events","type":"User","site_admin":false},"assignees":[{"login":"jtreuting","id":341584,"avatar_url":"https://avatars0.githubusercontent.com/u/341584?v=4","gravatar_id":"","url":"https://api.github.com/users/jtreuting","html_url":"https://github.com/jtreuting","followers_url":"https://api.github.com/users/jtreuting/followers","following_url":"https://api.github.com/users/jtreuting/following{/other_user}","gists_url":"https://api.github.com/users/jtreuting/gists{/gist_id}","starred_url":"https://api.github.com/users/jtreuting/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jtreuting/subscriptions","organizations_url":"https://api.github.com/users/jtreuting/orgs","repos_url":"https://api.github.com/users/jtreuting/repos","events_url":"https://api.github.com/users/jtreuting/events{/privacy}","received_events_url":"https://api.github.com/users/jtreuting/received_events","type":"User","site_admin":false},{"login":"malaffoon","id":5097710,"avatar_url":"https://avatars0.githubusercontent.com/u/5097710?v=4","gravatar_id":"","url":"https://api.github.com/users/malaffoon","html_url":"https://github.com/malaffoon","followers_url":"https://api.github.com/users/malaffoon/followers","following_url":"https://api.github.com/users/malaffoon/following{/other_user}","gists_url":"https://api.github.com/users/malaffoon/gists{/gist_id}","starred_url":"https://api.github.com/users/malaffoon/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/malaffoon/subscriptions","organizations_url":"https://api.github.com/users/malaffoon/orgs","repos_url":"https://api.github.com/users/malaffoon/repos","events_url":"https://api.github.com/users/malaffoon/events{/privacy}","received_events_url":"https://api.github.com/users/malaffoon/received_events","type":"User","site_admin":false},{"login":"bgsavage","id":5771116,"avatar_url":"https://avatars2.githubusercontent.com/u/5771116?v=4","gravatar_id":"","url":"https://api.github.com/users/bgsavage","html_url":"https://github.com/bgsavage","followers_url":"https://api.github.com/users/bgsavage/followers","following_url":"https://api.github.com/users/bgsavage/following{/other_user}","gists_url":"https://api.github.com/users/bgsavage/gists{/gist_id}","starred_url":"https://api.github.com/users/bgsavage/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bgsavage/subscriptions","organizations_url":"https://api.github.com/users/bgsavage/orgs","repos_url":"https://api.github.com/users/bgsavage/repos","events_url":"https://api.github.com/users/bgsavage/events{/privacy}","received_events_url":"https://api.github.com/users/bgsavage/received_events","type":"User","site_admin":false}],"requested_reviewers":[],"milestone":null,"commits_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/pulls/570/commits","review_comments_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/pulls/570/comments","review_comment_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/pulls/comments{/number}","comments_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/issues/570/comments","statuses_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/statuses/6bc8e74403bf92b59116e7bc901d3f222322033a","head":{"label":"SmarterApp:feature/support-multiple-ui-languages","ref":"feature/support-multiple-ui-languages","sha":"6bc8e74403bf92b59116e7bc901d3f222322033a","user":{"login":"SmarterApp","id":7026395,"avatar_url":"https://avatars0.githubusercontent.com/u/7026395?v=4","gravatar_id":"","url":"https://api.github.com/users/SmarterApp","html_url":"https://github.com/SmarterApp","followers_url":"https://api.github.com/users/SmarterApp/followers","following_url":"https://api.github.com/users/SmarterApp/following{/other_user}","gists_url":"https://api.github.com/users/SmarterApp/gists{/gist_id}","starred_url":"https://api.github.com/users/SmarterApp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SmarterApp/subscriptions","organizations_url":"https://api.github.com/users/SmarterApp/orgs","repos_url":"https://api.github.com/users/SmarterApp/repos","events_url":"https://api.github.com/users/SmarterApp/events{/privacy}","received_events_url":"https://api.github.com/users/SmarterApp/received_events","type":"Organization","site_admin":false},"repo":{"id":81362154,"name":"RDW_Reporting","full_name":"SmarterApp/RDW_Reporting","owner":{"login":"SmarterApp","id":7026395,"avatar_url":"https://avatars0.githubusercontent.com/u/7026395?v=4","gravatar_id":"","url":"https://api.github.com/users/SmarterApp","html_url":"https://github.com/SmarterApp","followers_url":"https://api.github.com/users/SmarterApp/followers","following_url":"https://api.github.com/users/SmarterApp/following{/other_user}","gists_url":"https://api.github.com/users/SmarterApp/gists{/gist_id}","starred_url":"https://api.github.com/users/SmarterApp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SmarterApp/subscriptions","organizations_url":"https://api.github.com/users/SmarterApp/orgs","repos_url":"https://api.github.com/users/SmarterApp/repos","events_url":"https://api.github.com/users/SmarterApp/events{/privacy}","received_events_url":"https://api.github.com/users/SmarterApp/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/SmarterApp/RDW_Reporting","description":"RDW reporting tier (web app, backend services, etc.)","fork":false,"url":"https://api.github.com/repos/SmarterApp/RDW_Reporting","forks_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/forks","keys_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/keys{/key_id}","collaborators_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/teams","hooks_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/hooks","issue_events_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/issues/events{/number}","events_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/events","assignees_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/assignees{/user}","branches_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/branches{/branch}","tags_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/tags","blobs_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/git/refs{/sha}","trees_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/git/trees{/sha}","statuses_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/statuses/{sha}","languages_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/languages","stargazers_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/stargazers","contributors_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/contributors","subscribers_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/subscribers","subscription_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/subscription","commits_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/commits{/sha}","git_commits_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/git/commits{/sha}","comments_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/comments{/number}","issue_comment_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/issues/comments{/number}","contents_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/contents/{+path}","compare_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/compare/{base}...{head}","merges_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/merges","archive_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/downloads","issues_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/issues{/number}","pulls_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/pulls{/number}","milestones_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/milestones{/number}","notifications_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/labels{/name}","releases_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/releases{/id}","deployments_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/deployments","created_at":"2017-02-08T18:31:23Z","updated_at":"2017-08-01T00:10:23Z","pushed_at":"2017-11-06T22:02:40Z","git_url":"git://github.com/SmarterApp/RDW_Reporting.git","ssh_url":"git@github.com:SmarterApp/RDW_Reporting.git","clone_url":"https://github.com/SmarterApp/RDW_Reporting.git","svn_url":"https://github.com/SmarterApp/RDW_Reporting","homepage":null,"size":20700,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"develop"}},"base":{"label":"SmarterApp:develop","ref":"develop","sha":"f4333567d07362d730e60b2992046c1f96f449ed","user":{"login":"SmarterApp","id":7026395,"avatar_url":"https://avatars0.githubusercontent.com/u/7026395?v=4","gravatar_id":"","url":"https://api.github.com/users/SmarterApp","html_url":"https://github.com/SmarterApp","followers_url":"https://api.github.com/users/SmarterApp/followers","following_url":"https://api.github.com/users/SmarterApp/following{/other_user}","gists_url":"https://api.github.com/users/SmarterApp/gists{/gist_id}","starred_url":"https://api.github.com/users/SmarterApp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SmarterApp/subscriptions","organizations_url":"https://api.github.com/users/SmarterApp/orgs","repos_url":"https://api.github.com/users/SmarterApp/repos","events_url":"https://api.github.com/users/SmarterApp/events{/privacy}","received_events_url":"https://api.github.com/users/SmarterApp/received_events","type":"Organization","site_admin":false},"repo":{"id":81362154,"name":"RDW_Reporting","full_name":"SmarterApp/RDW_Reporting","owner":{"login":"SmarterApp","id":7026395,"avatar_url":"https://avatars0.githubusercontent.com/u/7026395?v=4","gravatar_id":"","url":"https://api.github.com/users/SmarterApp","html_url":"https://github.com/SmarterApp","followers_url":"https://api.github.com/users/SmarterApp/followers","following_url":"https://api.github.com/users/SmarterApp/following{/other_user}","gists_url":"https://api.github.com/users/SmarterApp/gists{/gist_id}","starred_url":"https://api.github.com/users/SmarterApp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SmarterApp/subscriptions","organizations_url":"https://api.github.com/users/SmarterApp/orgs","repos_url":"https://api.github.com/users/SmarterApp/repos","events_url":"https://api.github.com/users/SmarterApp/events{/privacy}","received_events_url":"https://api.github.com/users/SmarterApp/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/SmarterApp/RDW_Reporting","description":"RDW reporting tier (web app, backend services, etc.)","fork":false,"url":"https://api.github.com/repos/SmarterApp/RDW_Reporting","forks_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/forks","keys_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/keys{/key_id}","collaborators_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/teams","hooks_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/hooks","issue_events_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/issues/events{/number}","events_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/events","assignees_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/assignees{/user}","branches_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/branches{/branch}","tags_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/tags","blobs_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/git/refs{/sha}","trees_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/git/trees{/sha}","statuses_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/statuses/{sha}","languages_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/languages","stargazers_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/stargazers","contributors_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/contributors","subscribers_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/subscribers","subscription_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/subscription","commits_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/commits{/sha}","git_commits_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/git/commits{/sha}","comments_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/comments{/number}","issue_comment_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/issues/comments{/number}","contents_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/contents/{+path}","compare_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/compare/{base}...{head}","merges_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/merges","archive_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/downloads","issues_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/issues{/number}","pulls_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/pulls{/number}","milestones_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/milestones{/number}","notifications_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/labels{/name}","releases_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/releases{/id}","deployments_url":"https://api.github.com/repos/SmarterApp/RDW_Reporting/deployments","created_at":"2017-02-08T18:31:23Z","updated_at":"2017-08-01T00:10:23Z","pushed_at":"2017-11-06T22:02:40Z","git_url":"git://github.com/SmarterApp/RDW_Reporting.git","ssh_url":"git@github.com:SmarterApp/RDW_Reporting.git","clone_url":"https://github.com/SmarterApp/RDW_Reporting.git","svn_url":"https://github.com/SmarterApp/RDW_Reporting","homepage":null,"size":20700,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/SmarterApp/RDW_Reporting/pulls/570"},"html":{"href":"https://github.com/SmarterApp/RDW_Reporting/pull/570"},"issue":{"href":"https://api.github.com/repos/SmarterApp/RDW_Reporting/issues/570"},"comments":{"href":"https://api.github.com/repos/SmarterApp/RDW_Reporting/issues/570/comments"},"review_comments":{"href":"https://api.github.com/repos/SmarterApp/RDW_Reporting/pulls/570/comments"},"review_comment":{"href":"https://api.github.com/repos/SmarterApp/RDW_Reporting/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/SmarterApp/RDW_Reporting/pulls/570/commits"},"statuses":{"href":"https://api.github.com/repos/SmarterApp/RDW_Reporting/statuses/6bc8e74403bf92b59116e7bc901d3f222322033a"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"bgsavage"}}