{"action":"created","comment":{"url":"https://api.github.com/repos/google/nomulus/pulls/comments/87660078","pull_request_review_id":8267638,"id":87660078,"diff_hunk":"@@ -0,0 +1,329 @@\n+// Copyright 2016 The Nomulus Authors. All Rights Reserved.\n+//\n+// Licensed under the Apache License, Version 2.0 (the \"License\");\n+// you may not use this file except in compliance with the License.\n+// You may obtain a copy of the License at\n+//\n+//     http://www.apache.org/licenses/LICENSE-2.0\n+//\n+// Unless required by applicable law or agreed to in writing, software\n+// distributed under the License is distributed on an \"AS IS\" BASIS,\n+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+// See the License for the specific language governing permissions and\n+// limitations under the License.\n+\n+package google.registry.rde;\n+\n+import static com.google.common.base.Preconditions.checkArgument;\n+import static com.google.common.base.Preconditions.checkState;\n+import static google.registry.model.ofy.ObjectifyService.ofy;\n+import static google.registry.util.DateTimeUtils.END_OF_TIME;\n+\n+import com.google.common.base.Ascii;\n+import com.google.common.base.Function;\n+import com.google.common.collect.ImmutableSet;\n+import com.google.common.collect.Iterables;\n+import com.google.common.net.InternetDomainName;\n+import com.googlecode.objectify.Key;\n+import com.googlecode.objectify.VoidWork;\n+import google.registry.model.billing.BillingEvent;\n+import google.registry.model.billing.BillingEvent.Flag;\n+import google.registry.model.billing.BillingEvent.Reason;\n+import google.registry.model.contact.ContactResource;\n+import google.registry.model.domain.DesignatedContact;\n+import google.registry.model.domain.DomainResource;\n+import google.registry.model.domain.GracePeriod;\n+import google.registry.model.domain.rgp.GracePeriodStatus;\n+import google.registry.model.domain.secdns.DelegationSignerData;\n+import google.registry.model.eppcommon.StatusValue;\n+import google.registry.model.host.HostResource;\n+import google.registry.model.index.ForeignKeyIndex;\n+import google.registry.model.poll.PollMessage;\n+import google.registry.model.registry.Registries;\n+import google.registry.model.registry.Registry;\n+import google.registry.model.reporting.HistoryEntry;\n+import google.registry.model.transfer.TransferData;\n+import google.registry.model.transfer.TransferStatus;\n+import google.registry.util.XmlToEnumMapper;\n+import google.registry.xjc.domain.XjcDomainContactType;\n+import google.registry.xjc.domain.XjcDomainNsType;\n+import google.registry.xjc.domain.XjcDomainStatusType;\n+import google.registry.xjc.rdedomain.XjcRdeDomain;\n+import google.registry.xjc.rdedomain.XjcRdeDomainElement;\n+import google.registry.xjc.rdedomain.XjcRdeDomainTransferDataType;\n+import google.registry.xjc.rgp.XjcRgpStatusType;\n+import google.registry.xjc.secdns.XjcSecdnsDsDataType;\n+import org.joda.time.DateTime;\n+\n+/** Utility class that converts an {@link XjcRdeDomainElement} into a {@link DomainResource}. */\n+final class XjcToDomainResourceConverter extends XjcToEppResourceConverter {\n+\n+  private static final XmlToEnumMapper<TransferStatus> TRANSFER_STATUS_MAPPER =\n+      XmlToEnumMapper.create(TransferStatus.values());\n+\n+  private static final Function<XjcDomainStatusType, StatusValue> STATUS_CONVERTER =\n+      new Function<XjcDomainStatusType, StatusValue>() {\n+    @Override\n+    public StatusValue apply(XjcDomainStatusType status) {\n+      return convertStatusType(status);\n+    }\n+  };\n+\n+  private static final Function<String, Key<HostResource>> HOST_OBJ_CONVERTER =\n+      new Function<String, Key<HostResource>>() {\n+        @Override\n+        public Key<HostResource> apply(String fullyQualifiedHostName) {\n+          Key<HostResource> key = ForeignKeyIndex.loadAndGetKey(\n+              HostResource.class,\n+              fullyQualifiedHostName,\n+              DateTime.now());\n+          checkState(key != null,\n+              String.format(\"HostResource not found with name '%s'\", fullyQualifiedHostName));\n+          return key;\n+        }\n+  };\n+\n+  private static final Function<XjcDomainContactType, DesignatedContact> CONTACT_CONVERTER =\n+      new Function<XjcDomainContactType, DesignatedContact>() {\n+        @Override\n+        public DesignatedContact apply(XjcDomainContactType contact) {\n+          return convertContactType(contact);\n+        }\n+  };\n+\n+  private static final Function<XjcSecdnsDsDataType, DelegationSignerData> SECDNS_CONVERTER =\n+      new Function<XjcSecdnsDsDataType, DelegationSignerData>() {\n+\n+        @Override\n+        public DelegationSignerData apply(XjcSecdnsDsDataType secdns) {\n+          return convertSecdnsDsDataType(secdns);\n+        }\n+\n+  };\n+\n+  /** Converts {@link XjcRgpStatus} to {@link GracePeriod} */\n+  private static class GracePeriodConverter\n+      implements Function<XjcRgpStatusType, GracePeriod> {\n+\n+    private final XjcRdeDomain domain;\n+    private final Key<BillingEvent.Recurring> autoRenewBillingEvent;\n+    private final Registry tld;\n+\n+    GracePeriodConverter(XjcRdeDomain domain, Key<BillingEvent.Recurring> autoRenewBillingEvent) {\n+      this.domain = domain;\n+      this.autoRenewBillingEvent = autoRenewBillingEvent;\n+      this.tld = Registry.get(\n+          Registries.findTldForNameOrThrow(InternetDomainName.from(domain.getName())).toString());\n+    }\n+\n+    @Override\n+    public GracePeriod apply(XjcRgpStatusType gracePeriodStatus) {\n+      // TODO: (wolfgang) address these items in code review:\n+      // verify that this logic is correct\n+      switch(gracePeriodStatus.getS()) {\n+        case ADD_PERIOD:\n+          return GracePeriod.createWithoutBillingEvent(\n+              GracePeriodStatus.ADD,\n+              domain.getCrDate().plus(this.tld.getAddGracePeriodLength()),\n+              domain.getCrRr().getClient());\n+        case AUTO_RENEW_PERIOD:\n+          return GracePeriod.createForRecurring(\n+              GracePeriodStatus.AUTO_RENEW,\n+              domain.getUpDate().plus(this.tld.getAutoRenewGracePeriodLength()),\n+              domain.getClID(),\n+              autoRenewBillingEvent);\n+        case PENDING_DELETE:\n+          return GracePeriod.createWithoutBillingEvent(\n+              GracePeriodStatus.PENDING_DELETE,\n+              domain.getUpDate().plus(this.tld.getPendingDeleteLength()),\n+              domain.getClID());\n+        case REDEMPTION_PERIOD:\n+          return GracePeriod.createWithoutBillingEvent(\n+              GracePeriodStatus.REDEMPTION,\n+              domain.getUpDate().plus(this.tld.getRedemptionGracePeriodLength()),\n+              domain.getClID());\n+        case RENEW_PERIOD:\n+          return GracePeriod.createWithoutBillingEvent(\n+              GracePeriodStatus.RENEW,\n+              domain.getUpDate().plus(this.tld.getRenewGracePeriodLength()),\n+              domain.getClID());\n+        case TRANSFER_PERIOD:\n+          return GracePeriod.createWithoutBillingEvent(\n+              GracePeriodStatus.TRANSFER,\n+              domain.getUpDate().plus(this.tld.getTransferGracePeriodLength()),\n+              domain.getTrnData().getReRr().getValue());\n+        default:\n+          throw new IllegalArgumentException(\n+              \"Unsupported grace period status: \" + gracePeriodStatus.getS());\n+      }\n+    }\n+  }\n+\n+  /** Converts {@link XjcRdeDomain} to {@link DomainResource}. */\n+  static DomainResource convertDomain(XjcRdeDomain domain) {\n+    // First create history entry and autorenew billing event/poll message\n+    // Autorenew billing event is required for creating AUTO_RENEW grace period\n+    HistoryEntry historyEntry = createHistoryEntry(domain);","path":"java/google/registry/rde/XjcToDomainResourceConverter.java","position":163,"original_position":166,"commit_id":"99b5fb83932158c70e14de6e317c2a7f21afc6f4","original_commit_id":"2939b4749e3a539b5c64001eb95c15b917cc7b69","user":{"login":"wolfgangmeyers","id":1783800,"avatar_url":"https://avatars.githubusercontent.com/u/1783800?v=3","gravatar_id":"","url":"https://api.github.com/users/wolfgangmeyers","html_url":"https://github.com/wolfgangmeyers","followers_url":"https://api.github.com/users/wolfgangmeyers/followers","following_url":"https://api.github.com/users/wolfgangmeyers/following{/other_user}","gists_url":"https://api.github.com/users/wolfgangmeyers/gists{/gist_id}","starred_url":"https://api.github.com/users/wolfgangmeyers/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wolfgangmeyers/subscriptions","organizations_url":"https://api.github.com/users/wolfgangmeyers/orgs","repos_url":"https://api.github.com/users/wolfgangmeyers/repos","events_url":"https://api.github.com/users/wolfgangmeyers/events{/privacy}","received_events_url":"https://api.github.com/users/wolfgangmeyers/received_events","type":"User","site_admin":false},"body":"Transactions have been removed","created_at":"2016-11-11T21:18:05Z","updated_at":"2016-11-11T21:18:05Z","html_url":"https://github.com/google/nomulus/pull/39#discussion_r87660078","pull_request_url":"https://api.github.com/repos/google/nomulus/pulls/39","_links":{"self":{"href":"https://api.github.com/repos/google/nomulus/pulls/comments/87660078"},"html":{"href":"https://github.com/google/nomulus/pull/39#discussion_r87660078"},"pull_request":{"href":"https://api.github.com/repos/google/nomulus/pulls/39"}}},"pull_request":{"url":"https://api.github.com/repos/google/nomulus/pulls/39","id":92401903,"html_url":"https://github.com/google/nomulus/pull/39","diff_url":"https://github.com/google/nomulus/pull/39.diff","patch_url":"https://github.com/google/nomulus/pull/39.patch","issue_url":"https://api.github.com/repos/google/nomulus/issues/39","number":39,"state":"open","locked":false,"title":"Add XjcToDomainResourceConverter","user":{"login":"wolfgangmeyers","id":1783800,"avatar_url":"https://avatars.githubusercontent.com/u/1783800?v=3","gravatar_id":"","url":"https://api.github.com/users/wolfgangmeyers","html_url":"https://github.com/wolfgangmeyers","followers_url":"https://api.github.com/users/wolfgangmeyers/followers","following_url":"https://api.github.com/users/wolfgangmeyers/following{/other_user}","gists_url":"https://api.github.com/users/wolfgangmeyers/gists{/gist_id}","starred_url":"https://api.github.com/users/wolfgangmeyers/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wolfgangmeyers/subscriptions","organizations_url":"https://api.github.com/users/wolfgangmeyers/orgs","repos_url":"https://api.github.com/users/wolfgangmeyers/repos","events_url":"https://api.github.com/users/wolfgangmeyers/events{/privacy}","received_events_url":"https://api.github.com/users/wolfgangmeyers/received_events","type":"User","site_admin":false},"body":"","created_at":"2016-11-04T19:29:58Z","updated_at":"2016-11-11T21:18:05Z","closed_at":null,"merged_at":null,"merge_commit_sha":"332171748020c81955a0742a18e232b6af6d1807","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/google/nomulus/pulls/39/commits","review_comments_url":"https://api.github.com/repos/google/nomulus/pulls/39/comments","review_comment_url":"https://api.github.com/repos/google/nomulus/pulls/comments{/number}","comments_url":"https://api.github.com/repos/google/nomulus/issues/39/comments","statuses_url":"https://api.github.com/repos/google/nomulus/statuses/99b5fb83932158c70e14de6e317c2a7f21afc6f4","head":{"label":"wolfgangmeyers:domains-import","ref":"domains-import","sha":"99b5fb83932158c70e14de6e317c2a7f21afc6f4","user":{"login":"wolfgangmeyers","id":1783800,"avatar_url":"https://avatars.githubusercontent.com/u/1783800?v=3","gravatar_id":"","url":"https://api.github.com/users/wolfgangmeyers","html_url":"https://github.com/wolfgangmeyers","followers_url":"https://api.github.com/users/wolfgangmeyers/followers","following_url":"https://api.github.com/users/wolfgangmeyers/following{/other_user}","gists_url":"https://api.github.com/users/wolfgangmeyers/gists{/gist_id}","starred_url":"https://api.github.com/users/wolfgangmeyers/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wolfgangmeyers/subscriptions","organizations_url":"https://api.github.com/users/wolfgangmeyers/orgs","repos_url":"https://api.github.com/users/wolfgangmeyers/repos","events_url":"https://api.github.com/users/wolfgangmeyers/events{/privacy}","received_events_url":"https://api.github.com/users/wolfgangmeyers/received_events","type":"User","site_admin":false},"repo":{"id":72874930,"name":"nomulus","full_name":"wolfgangmeyers/nomulus","owner":{"login":"wolfgangmeyers","id":1783800,"avatar_url":"https://avatars.githubusercontent.com/u/1783800?v=3","gravatar_id":"","url":"https://api.github.com/users/wolfgangmeyers","html_url":"https://github.com/wolfgangmeyers","followers_url":"https://api.github.com/users/wolfgangmeyers/followers","following_url":"https://api.github.com/users/wolfgangmeyers/following{/other_user}","gists_url":"https://api.github.com/users/wolfgangmeyers/gists{/gist_id}","starred_url":"https://api.github.com/users/wolfgangmeyers/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wolfgangmeyers/subscriptions","organizations_url":"https://api.github.com/users/wolfgangmeyers/orgs","repos_url":"https://api.github.com/users/wolfgangmeyers/repos","events_url":"https://api.github.com/users/wolfgangmeyers/events{/privacy}","received_events_url":"https://api.github.com/users/wolfgangmeyers/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/wolfgangmeyers/nomulus","description":"Top-level domain name registry service on Google App Engine","fork":true,"url":"https://api.github.com/repos/wolfgangmeyers/nomulus","forks_url":"https://api.github.com/repos/wolfgangmeyers/nomulus/forks","keys_url":"https://api.github.com/repos/wolfgangmeyers/nomulus/keys{/key_id}","collaborators_url":"https://api.github.com/repos/wolfgangmeyers/nomulus/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/wolfgangmeyers/nomulus/teams","hooks_url":"https://api.github.com/repos/wolfgangmeyers/nomulus/hooks","issue_events_url":"https://api.github.com/repos/wolfgangmeyers/nomulus/issues/events{/number}","events_url":"https://api.github.com/repos/wolfgangmeyers/nomulus/events","assignees_url":"https://api.github.com/repos/wolfgangmeyers/nomulus/assignees{/user}","branches_url":"https://api.github.com/repos/wolfgangmeyers/nomulus/branches{/branch}","tags_url":"https://api.github.com/repos/wolfgangmeyers/nomulus/tags","blobs_url":"https://api.github.com/repos/wolfgangmeyers/nomulus/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/wolfgangmeyers/nomulus/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/wolfgangmeyers/nomulus/git/refs{/sha}","trees_url":"https://api.github.com/repos/wolfgangmeyers/nomulus/git/trees{/sha}","statuses_url":"https://api.github.com/repos/wolfgangmeyers/nomulus/statuses/{sha}","languages_url":"https://api.github.com/repos/wolfgangmeyers/nomulus/languages","stargazers_url":"https://api.github.com/repos/wolfgangmeyers/nomulus/stargazers","contributors_url":"https://api.github.com/repos/wolfgangmeyers/nomulus/contributors","subscribers_url":"https://api.github.com/repos/wolfgangmeyers/nomulus/subscribers","subscription_url":"https://api.github.com/repos/wolfgangmeyers/nomulus/subscription","commits_url":"https://api.github.com/repos/wolfgangmeyers/nomulus/commits{/sha}","git_commits_url":"https://api.github.com/repos/wolfgangmeyers/nomulus/git/commits{/sha}","comments_url":"https://api.github.com/repos/wolfgangmeyers/nomulus/comments{/number}","issue_comment_url":"https://api.github.com/repos/wolfgangmeyers/nomulus/issues/comments{/number}","contents_url":"https://api.github.com/repos/wolfgangmeyers/nomulus/contents/{+path}","compare_url":"https://api.github.com/repos/wolfgangmeyers/nomulus/compare/{base}...{head}","merges_url":"https://api.github.com/repos/wolfgangmeyers/nomulus/merges","archive_url":"https://api.github.com/repos/wolfgangmeyers/nomulus/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/wolfgangmeyers/nomulus/downloads","issues_url":"https://api.github.com/repos/wolfgangmeyers/nomulus/issues{/number}","pulls_url":"https://api.github.com/repos/wolfgangmeyers/nomulus/pulls{/number}","milestones_url":"https://api.github.com/repos/wolfgangmeyers/nomulus/milestones{/number}","notifications_url":"https://api.github.com/repos/wolfgangmeyers/nomulus/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/wolfgangmeyers/nomulus/labels{/name}","releases_url":"https://api.github.com/repos/wolfgangmeyers/nomulus/releases{/id}","deployments_url":"https://api.github.com/repos/wolfgangmeyers/nomulus/deployments","created_at":"2016-11-04T18:30:31Z","updated_at":"2016-11-04T18:30:38Z","pushed_at":"2016-11-11T21:17:15Z","git_url":"git://github.com/wolfgangmeyers/nomulus.git","ssh_url":"git@github.com:wolfgangmeyers/nomulus.git","clone_url":"https://github.com/wolfgangmeyers/nomulus.git","svn_url":"https://github.com/wolfgangmeyers/nomulus","homepage":"https://registry.google","size":8376,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_downloads":false,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"google:master","ref":"master","sha":"9122372e38943e95097e134bf0129817ebf58269","user":{"login":"google","id":1342004,"avatar_url":"https://avatars.githubusercontent.com/u/1342004?v=3","gravatar_id":"","url":"https://api.github.com/users/google","html_url":"https://github.com/google","followers_url":"https://api.github.com/users/google/followers","following_url":"https://api.github.com/users/google/following{/other_user}","gists_url":"https://api.github.com/users/google/gists{/gist_id}","starred_url":"https://api.github.com/users/google/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/google/subscriptions","organizations_url":"https://api.github.com/users/google/orgs","repos_url":"https://api.github.com/users/google/repos","events_url":"https://api.github.com/users/google/events{/privacy}","received_events_url":"https://api.github.com/users/google/received_events","type":"Organization","site_admin":false},"repo":{"id":52821506,"name":"nomulus","full_name":"google/nomulus","owner":{"login":"google","id":1342004,"avatar_url":"https://avatars.githubusercontent.com/u/1342004?v=3","gravatar_id":"","url":"https://api.github.com/users/google","html_url":"https://github.com/google","followers_url":"https://api.github.com/users/google/followers","following_url":"https://api.github.com/users/google/following{/other_user}","gists_url":"https://api.github.com/users/google/gists{/gist_id}","starred_url":"https://api.github.com/users/google/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/google/subscriptions","organizations_url":"https://api.github.com/users/google/orgs","repos_url":"https://api.github.com/users/google/repos","events_url":"https://api.github.com/users/google/events{/privacy}","received_events_url":"https://api.github.com/users/google/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/google/nomulus","description":"Top-level domain name registry service on Google App Engine","fork":false,"url":"https://api.github.com/repos/google/nomulus","forks_url":"https://api.github.com/repos/google/nomulus/forks","keys_url":"https://api.github.com/repos/google/nomulus/keys{/key_id}","collaborators_url":"https://api.github.com/repos/google/nomulus/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/google/nomulus/teams","hooks_url":"https://api.github.com/repos/google/nomulus/hooks","issue_events_url":"https://api.github.com/repos/google/nomulus/issues/events{/number}","events_url":"https://api.github.com/repos/google/nomulus/events","assignees_url":"https://api.github.com/repos/google/nomulus/assignees{/user}","branches_url":"https://api.github.com/repos/google/nomulus/branches{/branch}","tags_url":"https://api.github.com/repos/google/nomulus/tags","blobs_url":"https://api.github.com/repos/google/nomulus/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/google/nomulus/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/google/nomulus/git/refs{/sha}","trees_url":"https://api.github.com/repos/google/nomulus/git/trees{/sha}","statuses_url":"https://api.github.com/repos/google/nomulus/statuses/{sha}","languages_url":"https://api.github.com/repos/google/nomulus/languages","stargazers_url":"https://api.github.com/repos/google/nomulus/stargazers","contributors_url":"https://api.github.com/repos/google/nomulus/contributors","subscribers_url":"https://api.github.com/repos/google/nomulus/subscribers","subscription_url":"https://api.github.com/repos/google/nomulus/subscription","commits_url":"https://api.github.com/repos/google/nomulus/commits{/sha}","git_commits_url":"https://api.github.com/repos/google/nomulus/git/commits{/sha}","comments_url":"https://api.github.com/repos/google/nomulus/comments{/number}","issue_comment_url":"https://api.github.com/repos/google/nomulus/issues/comments{/number}","contents_url":"https://api.github.com/repos/google/nomulus/contents/{+path}","compare_url":"https://api.github.com/repos/google/nomulus/compare/{base}...{head}","merges_url":"https://api.github.com/repos/google/nomulus/merges","archive_url":"https://api.github.com/repos/google/nomulus/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/google/nomulus/downloads","issues_url":"https://api.github.com/repos/google/nomulus/issues{/number}","pulls_url":"https://api.github.com/repos/google/nomulus/pulls{/number}","milestones_url":"https://api.github.com/repos/google/nomulus/milestones{/number}","notifications_url":"https://api.github.com/repos/google/nomulus/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/google/nomulus/labels{/name}","releases_url":"https://api.github.com/repos/google/nomulus/releases{/id}","deployments_url":"https://api.github.com/repos/google/nomulus/deployments","created_at":"2016-02-29T20:16:48Z","updated_at":"2016-11-09T19:24:32Z","pushed_at":"2016-11-11T21:17:16Z","git_url":"git://github.com/google/nomulus.git","ssh_url":"git@github.com:google/nomulus.git","clone_url":"https://github.com/google/nomulus.git","svn_url":"https://github.com/google/nomulus","homepage":"https://registry.google","size":9358,"stargazers_count":782,"watchers_count":782,"language":"Java","has_issues":true,"has_downloads":false,"has_wiki":false,"has_pages":true,"forks_count":70,"mirror_url":null,"open_issues_count":7,"forks":70,"open_issues":7,"watchers":782,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/google/nomulus/pulls/39"},"html":{"href":"https://github.com/google/nomulus/pull/39"},"issue":{"href":"https://api.github.com/repos/google/nomulus/issues/39"},"comments":{"href":"https://api.github.com/repos/google/nomulus/issues/39/comments"},"review_comments":{"href":"https://api.github.com/repos/google/nomulus/pulls/39/comments"},"review_comment":{"href":"https://api.github.com/repos/google/nomulus/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/google/nomulus/pulls/39/commits"},"statuses":{"href":"https://api.github.com/repos/google/nomulus/statuses/99b5fb83932158c70e14de6e317c2a7f21afc6f4"}}}}
{"actor":{"display_login":"wolfgangmeyers"}}