{"action":"created","comment":{"url":"https://api.github.com/repos/apache/beam/pulls/comments/114223941","pull_request_review_id":35672991,"id":114223941,"diff_hunk":"@@ -0,0 +1,259 @@\n+/*\n+ * Licensed to the Apache Software Foundation (ASF) under one\n+ * or more contributor license agreements.  See the NOTICE file\n+ * distributed with this work for additional information\n+ * regarding copyright ownership.  The ASF licenses this file\n+ * to you under the Apache License, Version 2.0 (the\n+ * \"License\"); you may not use this file except in compliance\n+ * with the License.  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 org.apache.beam.runners.dataflow.util;\n+\n+import com.fasterxml.jackson.annotation.JsonTypeInfo;\n+import com.fasterxml.jackson.annotation.JsonTypeInfo.As;\n+import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;\n+import com.fasterxml.jackson.core.JsonProcessingException;\n+import com.fasterxml.jackson.databind.DatabindContext;\n+import com.fasterxml.jackson.databind.DeserializationFeature;\n+import com.fasterxml.jackson.databind.JavaType;\n+import com.fasterxml.jackson.databind.ObjectMapper;\n+import com.fasterxml.jackson.databind.annotation.JsonTypeIdResolver;\n+import com.fasterxml.jackson.databind.jsontype.impl.TypeIdResolverBase;\n+import com.fasterxml.jackson.databind.module.SimpleModule;\n+import com.fasterxml.jackson.databind.type.TypeFactory;\n+import com.google.common.collect.ImmutableMap;\n+import java.lang.reflect.TypeVariable;\n+import java.util.ArrayList;\n+import java.util.HashMap;\n+import java.util.List;\n+import java.util.Map;\n+import javax.annotation.Nullable;\n+import org.apache.beam.sdk.coders.Coder;\n+import org.apache.beam.sdk.coders.IterableCoder;\n+import org.apache.beam.sdk.coders.KvCoder;\n+import org.apache.beam.sdk.coders.LengthPrefixCoder;\n+import org.apache.beam.sdk.transforms.windowing.GlobalWindow;\n+import org.apache.beam.sdk.transforms.windowing.IntervalWindow;\n+import org.apache.beam.sdk.util.PropertyNames;\n+import org.apache.beam.sdk.util.WindowedValue;\n+\n+/**\n+ * Utility for converting objects between Java and Cloud representations.\n+ */\n+public final class Serializer {\n+  /** A mapping from well known coder types to their implementing classes. */\n+  private static final Map<String, Class<?>> WELL_KNOWN_CODER_TYPES =\n+      ImmutableMap.<String, Class<?>>builder()\n+          .put(\"kind:pair\", KvCoder.class)\n+          .put(\"kind:stream\", IterableCoder.class)\n+          .put(\"kind:global_window\", GlobalWindow.Coder.class)\n+          .put(\"kind:interval_window\", IntervalWindow.IntervalWindowCoder.class)\n+          .put(\"kind:length_prefix\", LengthPrefixCoder.class)\n+          .put(\"kind:windowed_value\", WindowedValue.FullWindowedValueCoder.class)\n+          .build();\n+\n+  // Delay initialization of statics until the first call to Serializer.\n+  private static class SingletonHelper {\n+    static final ObjectMapper OBJECT_MAPPER = createObjectMapper();\n+    static final ObjectMapper TREE_MAPPER = createTreeMapper();\n+\n+    /**\n+     * Creates the object mapper that will be used for serializing Google API\n+     * client maps into Jackson trees.\n+     */\n+    private static ObjectMapper createTreeMapper() {\n+      return new ObjectMapper();\n+    }\n+\n+    /**\n+     * Creates the object mapper that will be used for deserializing Jackson\n+     * trees into objects.\n+     */\n+    private static ObjectMapper createObjectMapper() {\n+      ObjectMapper m = new ObjectMapper();\n+      // Ignore properties that are not used by the object.\n+      m.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);\n+\n+      // For parameters of type Object, use the @type property to determine the\n+      // class to instantiate.\n+      //\n+      // TODO: It would be ideal to do this for all non-final classes.  The\n+      // problem with using DefaultTyping.NON_FINAL is that it insists on having\n+      // type information in the JSON for classes with useful default\n+      // implementations, such as List.  Ideally, we'd combine these defaults\n+      // with available type information if that information's present.\n+      m.enableDefaultTypingAsProperty(\n+           ObjectMapper.DefaultTyping.JAVA_LANG_OBJECT,\n+           PropertyNames.OBJECT_TYPE_NAME);\n+\n+      m.registerModule(new Jackson2Module());\n+\n+      return m;\n+    }\n+  }\n+\n+  /**\n+   * Deserializes an object from a Dataflow structured encoding (represented in\n+   * Java as a map).\n+   *\n+   * <p>The standard Dataflow SDK object serialization protocol is based on JSON.\n+   * Data is typically encoded as a JSON object whose fields represent the\n+   * object's data.\n+   *\n+   * <p>The actual deserialization is performed by Jackson, which can deserialize\n+   * public fields, use JavaBean setters, or use injection annotations to\n+   * indicate how to construct the object.  The {@link ObjectMapper} used is\n+   * configured to use the \"@type\" field as the name of the class to instantiate\n+   * (supporting polymorphic types), and may be further configured by\n+   * annotations or via {@link ObjectMapper#registerModule}.\n+   *\n+   * @see <a href=\"http://wiki.fasterxml.com/JacksonFAQ#Data_Binding.2C_general\">\n+   * Jackson Data-Binding</a>\n+   * @see <a href=\"https://github.com/FasterXML/jackson-annotations/wiki/Jackson-Annotations\">\n+   * Jackson-Annotations</a>\n+   * @param serialized the object in untyped decoded form (i.e. a nested {@link Map})\n+   * @param clazz the expected object class\n+   */\n+  public static <T> T deserialize(Map<String, Object> serialized, Class<T> clazz) {\n+    try {\n+      return SingletonHelper.OBJECT_MAPPER.treeToValue(\n+          SingletonHelper.TREE_MAPPER.valueToTree(\n+              deserializeCloudKnownTypes(serialized)),\n+          clazz);\n+    } catch (JsonProcessingException e) {\n+      throw new RuntimeException(\n+          \"Unable to deserialize class \" + clazz, e);\n+    }\n+  }\n+\n+  /**\n+   * Recursively walks the supplied map, looking for well-known cloud type information (keyed as\n+   * {@link PropertyNames#OBJECT_TYPE_NAME}, matching a URI value from the {@link CloudKnownType}\n+   * enum. Upon finding this type information, it converts it into the correspondingly typed Java\n+   * value.\n+   */\n+  @SuppressWarnings(\"unchecked\")\n+  private static Object deserializeCloudKnownTypes(Object src) {\n+    if (src instanceof Map) {\n+      Map<String, Object> srcMap = (Map<String, Object>) src;\n+      @Nullable Object value = srcMap.get(PropertyNames.SCALAR_FIELD_NAME);\n+      @Nullable CloudKnownType type =\n+          CloudKnownType.forUri((String) srcMap.get(PropertyNames.OBJECT_TYPE_NAME));\n+      if (type != null && value != null) {\n+        // It's a value of a well-known cloud type; let the known type handler\n+        // handle the translation.\n+        Object result = type.parse(value, type.defaultClass());\n+        return result;\n+      }\n+      // Otherwise, it's just an ordinary map.\n+      Map<String, Object> dest = new HashMap<>(srcMap.size());\n+      for (Map.Entry<String, Object> entry : srcMap.entrySet()) {\n+        dest.put(entry.getKey(), deserializeCloudKnownTypes(entry.getValue()));\n+      }\n+      return dest;\n+    }\n+    if (src instanceof List) {\n+      List<Object> srcList = (List<Object>) src;\n+      List<Object> dest = new ArrayList<>(srcList.size());\n+      for (Object obj : srcList) {\n+        dest.add(deserializeCloudKnownTypes(obj));\n+      }\n+      return dest;\n+    }\n+    // Neither a Map nor a List; no translation needed.\n+    return src;\n+  }\n+\n+  /**\n+   * A {@link com.fasterxml.jackson.databind.Module} that adds the type\n+   * resolver needed for Coder definitions.\n+   */","path":"runners/google-cloud-dataflow-java/src/main/java/org/apache/beam/runners/dataflow/util/Serializer.java","position":178,"original_position":178,"commit_id":"de48180cc1811e98035a322543270dd58cbdf932","original_commit_id":"de48180cc1811e98035a322543270dd58cbdf932","user":{"login":"lukecwik","id":10078956,"avatar_url":"https://avatars0.githubusercontent.com/u/10078956?v=3","gravatar_id":"","url":"https://api.github.com/users/lukecwik","html_url":"https://github.com/lukecwik","followers_url":"https://api.github.com/users/lukecwik/followers","following_url":"https://api.github.com/users/lukecwik/following{/other_user}","gists_url":"https://api.github.com/users/lukecwik/gists{/gist_id}","starred_url":"https://api.github.com/users/lukecwik/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lukecwik/subscriptions","organizations_url":"https://api.github.com/users/lukecwik/orgs","repos_url":"https://api.github.com/users/lukecwik/repos","events_url":"https://api.github.com/users/lukecwik/events{/privacy}","received_events_url":"https://api.github.com/users/lukecwik/received_events","type":"User","site_admin":false},"body":"Mark as @Deprecated since we won't need this going forward either once everything is using CloudObjects","created_at":"2017-05-01T23:35:08Z","updated_at":"2017-05-01T23:36:07Z","html_url":"https://github.com/apache/beam/pull/2808#discussion_r114223941","pull_request_url":"https://api.github.com/repos/apache/beam/pulls/2808","_links":{"self":{"href":"https://api.github.com/repos/apache/beam/pulls/comments/114223941"},"html":{"href":"https://github.com/apache/beam/pull/2808#discussion_r114223941"},"pull_request":{"href":"https://api.github.com/repos/apache/beam/pulls/2808"}}},"pull_request":{"url":"https://api.github.com/repos/apache/beam/pulls/2808","id":118450959,"html_url":"https://github.com/apache/beam/pull/2808","diff_url":"https://github.com/apache/beam/pull/2808.diff","patch_url":"https://github.com/apache/beam/pull/2808.patch","issue_url":"https://api.github.com/repos/apache/beam/issues/2808","number":2808,"state":"open","locked":false,"title":"Copy CloudObject to the Dataflow Module","user":{"login":"tgroh","id":429866,"avatar_url":"https://avatars1.githubusercontent.com/u/429866?v=3","gravatar_id":"","url":"https://api.github.com/users/tgroh","html_url":"https://github.com/tgroh","followers_url":"https://api.github.com/users/tgroh/followers","following_url":"https://api.github.com/users/tgroh/following{/other_user}","gists_url":"https://api.github.com/users/tgroh/gists{/gist_id}","starred_url":"https://api.github.com/users/tgroh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tgroh/subscriptions","organizations_url":"https://api.github.com/users/tgroh/orgs","repos_url":"https://api.github.com/users/tgroh/repos","events_url":"https://api.github.com/users/tgroh/events{/privacy}","received_events_url":"https://api.github.com/users/tgroh/received_events","type":"User","site_admin":false},"body":"Be sure to do all of the following to help us incorporate your contribution\r\nquickly and easily:\r\n\r\n - [ ] Make sure the PR title is formatted like:\r\n   `[BEAM-<Jira issue #>] Description of pull request`\r\n - [ ] Make sure tests pass via `mvn clean verify`. (Even better, enable\r\n       Travis-CI on your fork and ensure the whole test matrix passes).\r\n - [ ] Replace `<Jira issue #>` in the title with the actual Jira issue\r\n       number, if there is one.\r\n - [ ] If this contribution is large, please file an Apache\r\n       [Individual Contributor License Agreement](https://www.apache.org/licenses/icla.pdf).\r\n\r\n---\r\nOnce migrated in the Dataflow worker, these classes can be removed from\r\nthe sdk.\r\n","created_at":"2017-05-01T22:08:47Z","updated_at":"2017-05-01T23:36:07Z","closed_at":null,"merged_at":null,"merge_commit_sha":"ae827648d7f58b7ed0edf15e427a258ae45d4514","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/apache/beam/pulls/2808/commits","review_comments_url":"https://api.github.com/repos/apache/beam/pulls/2808/comments","review_comment_url":"https://api.github.com/repos/apache/beam/pulls/comments{/number}","comments_url":"https://api.github.com/repos/apache/beam/issues/2808/comments","statuses_url":"https://api.github.com/repos/apache/beam/statuses/de48180cc1811e98035a322543270dd58cbdf932","head":{"label":"tgroh:fork_cloud_object","ref":"fork_cloud_object","sha":"de48180cc1811e98035a322543270dd58cbdf932","user":{"login":"tgroh","id":429866,"avatar_url":"https://avatars1.githubusercontent.com/u/429866?v=3","gravatar_id":"","url":"https://api.github.com/users/tgroh","html_url":"https://github.com/tgroh","followers_url":"https://api.github.com/users/tgroh/followers","following_url":"https://api.github.com/users/tgroh/following{/other_user}","gists_url":"https://api.github.com/users/tgroh/gists{/gist_id}","starred_url":"https://api.github.com/users/tgroh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tgroh/subscriptions","organizations_url":"https://api.github.com/users/tgroh/orgs","repos_url":"https://api.github.com/users/tgroh/repos","events_url":"https://api.github.com/users/tgroh/events{/privacy}","received_events_url":"https://api.github.com/users/tgroh/received_events","type":"User","site_admin":false},"repo":{"id":52644388,"name":"beam","full_name":"tgroh/beam","owner":{"login":"tgroh","id":429866,"avatar_url":"https://avatars1.githubusercontent.com/u/429866?v=3","gravatar_id":"","url":"https://api.github.com/users/tgroh","html_url":"https://github.com/tgroh","followers_url":"https://api.github.com/users/tgroh/followers","following_url":"https://api.github.com/users/tgroh/following{/other_user}","gists_url":"https://api.github.com/users/tgroh/gists{/gist_id}","starred_url":"https://api.github.com/users/tgroh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tgroh/subscriptions","organizations_url":"https://api.github.com/users/tgroh/orgs","repos_url":"https://api.github.com/users/tgroh/repos","events_url":"https://api.github.com/users/tgroh/events{/privacy}","received_events_url":"https://api.github.com/users/tgroh/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/tgroh/beam","description":"Mirror of Apache Beam","fork":true,"url":"https://api.github.com/repos/tgroh/beam","forks_url":"https://api.github.com/repos/tgroh/beam/forks","keys_url":"https://api.github.com/repos/tgroh/beam/keys{/key_id}","collaborators_url":"https://api.github.com/repos/tgroh/beam/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/tgroh/beam/teams","hooks_url":"https://api.github.com/repos/tgroh/beam/hooks","issue_events_url":"https://api.github.com/repos/tgroh/beam/issues/events{/number}","events_url":"https://api.github.com/repos/tgroh/beam/events","assignees_url":"https://api.github.com/repos/tgroh/beam/assignees{/user}","branches_url":"https://api.github.com/repos/tgroh/beam/branches{/branch}","tags_url":"https://api.github.com/repos/tgroh/beam/tags","blobs_url":"https://api.github.com/repos/tgroh/beam/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/tgroh/beam/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/tgroh/beam/git/refs{/sha}","trees_url":"https://api.github.com/repos/tgroh/beam/git/trees{/sha}","statuses_url":"https://api.github.com/repos/tgroh/beam/statuses/{sha}","languages_url":"https://api.github.com/repos/tgroh/beam/languages","stargazers_url":"https://api.github.com/repos/tgroh/beam/stargazers","contributors_url":"https://api.github.com/repos/tgroh/beam/contributors","subscribers_url":"https://api.github.com/repos/tgroh/beam/subscribers","subscription_url":"https://api.github.com/repos/tgroh/beam/subscription","commits_url":"https://api.github.com/repos/tgroh/beam/commits{/sha}","git_commits_url":"https://api.github.com/repos/tgroh/beam/git/commits{/sha}","comments_url":"https://api.github.com/repos/tgroh/beam/comments{/number}","issue_comment_url":"https://api.github.com/repos/tgroh/beam/issues/comments{/number}","contents_url":"https://api.github.com/repos/tgroh/beam/contents/{+path}","compare_url":"https://api.github.com/repos/tgroh/beam/compare/{base}...{head}","merges_url":"https://api.github.com/repos/tgroh/beam/merges","archive_url":"https://api.github.com/repos/tgroh/beam/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/tgroh/beam/downloads","issues_url":"https://api.github.com/repos/tgroh/beam/issues{/number}","pulls_url":"https://api.github.com/repos/tgroh/beam/pulls{/number}","milestones_url":"https://api.github.com/repos/tgroh/beam/milestones{/number}","notifications_url":"https://api.github.com/repos/tgroh/beam/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/tgroh/beam/labels{/name}","releases_url":"https://api.github.com/repos/tgroh/beam/releases{/id}","deployments_url":"https://api.github.com/repos/tgroh/beam/deployments","created_at":"2016-02-27T01:43:32Z","updated_at":"2017-03-14T22:58:34Z","pushed_at":"2017-05-01T23:35:22Z","git_url":"git://github.com/tgroh/beam.git","ssh_url":"git@github.com:tgroh/beam.git","clone_url":"https://github.com/tgroh/beam.git","svn_url":"https://github.com/tgroh/beam","homepage":"","size":35650,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_projects":true,"has_downloads":true,"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":"apache:master","ref":"master","sha":"ba539b6ceb521119e3c6ea7d3a8c5f571b3a5abb","user":{"login":"apache","id":47359,"avatar_url":"https://avatars3.githubusercontent.com/u/47359?v=3","gravatar_id":"","url":"https://api.github.com/users/apache","html_url":"https://github.com/apache","followers_url":"https://api.github.com/users/apache/followers","following_url":"https://api.github.com/users/apache/following{/other_user}","gists_url":"https://api.github.com/users/apache/gists{/gist_id}","starred_url":"https://api.github.com/users/apache/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache/subscriptions","organizations_url":"https://api.github.com/users/apache/orgs","repos_url":"https://api.github.com/users/apache/repos","events_url":"https://api.github.com/users/apache/events{/privacy}","received_events_url":"https://api.github.com/users/apache/received_events","type":"Organization","site_admin":false},"repo":{"id":50904245,"name":"beam","full_name":"apache/beam","owner":{"login":"apache","id":47359,"avatar_url":"https://avatars3.githubusercontent.com/u/47359?v=3","gravatar_id":"","url":"https://api.github.com/users/apache","html_url":"https://github.com/apache","followers_url":"https://api.github.com/users/apache/followers","following_url":"https://api.github.com/users/apache/following{/other_user}","gists_url":"https://api.github.com/users/apache/gists{/gist_id}","starred_url":"https://api.github.com/users/apache/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache/subscriptions","organizations_url":"https://api.github.com/users/apache/orgs","repos_url":"https://api.github.com/users/apache/repos","events_url":"https://api.github.com/users/apache/events{/privacy}","received_events_url":"https://api.github.com/users/apache/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/apache/beam","description":"Mirror of Apache Beam","fork":false,"url":"https://api.github.com/repos/apache/beam","forks_url":"https://api.github.com/repos/apache/beam/forks","keys_url":"https://api.github.com/repos/apache/beam/keys{/key_id}","collaborators_url":"https://api.github.com/repos/apache/beam/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/apache/beam/teams","hooks_url":"https://api.github.com/repos/apache/beam/hooks","issue_events_url":"https://api.github.com/repos/apache/beam/issues/events{/number}","events_url":"https://api.github.com/repos/apache/beam/events","assignees_url":"https://api.github.com/repos/apache/beam/assignees{/user}","branches_url":"https://api.github.com/repos/apache/beam/branches{/branch}","tags_url":"https://api.github.com/repos/apache/beam/tags","blobs_url":"https://api.github.com/repos/apache/beam/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/apache/beam/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/apache/beam/git/refs{/sha}","trees_url":"https://api.github.com/repos/apache/beam/git/trees{/sha}","statuses_url":"https://api.github.com/repos/apache/beam/statuses/{sha}","languages_url":"https://api.github.com/repos/apache/beam/languages","stargazers_url":"https://api.github.com/repos/apache/beam/stargazers","contributors_url":"https://api.github.com/repos/apache/beam/contributors","subscribers_url":"https://api.github.com/repos/apache/beam/subscribers","subscription_url":"https://api.github.com/repos/apache/beam/subscription","commits_url":"https://api.github.com/repos/apache/beam/commits{/sha}","git_commits_url":"https://api.github.com/repos/apache/beam/git/commits{/sha}","comments_url":"https://api.github.com/repos/apache/beam/comments{/number}","issue_comment_url":"https://api.github.com/repos/apache/beam/issues/comments{/number}","contents_url":"https://api.github.com/repos/apache/beam/contents/{+path}","compare_url":"https://api.github.com/repos/apache/beam/compare/{base}...{head}","merges_url":"https://api.github.com/repos/apache/beam/merges","archive_url":"https://api.github.com/repos/apache/beam/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/apache/beam/downloads","issues_url":"https://api.github.com/repos/apache/beam/issues{/number}","pulls_url":"https://api.github.com/repos/apache/beam/pulls{/number}","milestones_url":"https://api.github.com/repos/apache/beam/milestones{/number}","notifications_url":"https://api.github.com/repos/apache/beam/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/apache/beam/labels{/name}","releases_url":"https://api.github.com/repos/apache/beam/releases{/id}","deployments_url":"https://api.github.com/repos/apache/beam/deployments","created_at":"2016-02-02T08:00:06Z","updated_at":"2017-05-01T17:47:07Z","pushed_at":"2017-05-01T23:35:47Z","git_url":"git://github.com/apache/beam.git","ssh_url":"git@github.com:apache/beam.git","clone_url":"https://github.com/apache/beam.git","svn_url":"https://github.com/apache/beam","homepage":"","size":33759,"stargazers_count":1105,"watchers_count":1105,"language":"Java","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":607,"mirror_url":"git://git.apache.org/beam.git","open_issues_count":72,"forks":607,"open_issues":72,"watchers":1105,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/apache/beam/pulls/2808"},"html":{"href":"https://github.com/apache/beam/pull/2808"},"issue":{"href":"https://api.github.com/repos/apache/beam/issues/2808"},"comments":{"href":"https://api.github.com/repos/apache/beam/issues/2808/comments"},"review_comments":{"href":"https://api.github.com/repos/apache/beam/pulls/2808/comments"},"review_comment":{"href":"https://api.github.com/repos/apache/beam/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/apache/beam/pulls/2808/commits"},"statuses":{"href":"https://api.github.com/repos/apache/beam/statuses/de48180cc1811e98035a322543270dd58cbdf932"}}}}
{"actor":{"display_login":"lukecwik"}}