{"action":"created","comment":{"url":"https://api.github.com/repos/datastax/java-driver/pulls/comments/35407910","id":35407910,"diff_hunk":"@@ -0,0 +1,379 @@\n+## Custom Codecs\n+\n+[JAVA-721][JAVA-721] finally brings a frequently requested feature: to support out-of-the-box, transparent and user-configurable mapping of CQL types to arbitrary Java objects.\n+ \n+Practical use cases that justify such a feature are numerous:\n+\n+* Ability to map CQL timestamp, date and time columns to Java 8 or Joda Time classes (rather than the built-in mappings for Date, [LocalDate][LocalDate] and Long);\n+* Ability to map CQL varchar columns directly to JSON or XML mapped objects (i.e. using frameworks such as Jackson);\n+* Ability to map CQL user-defined types to Java objects;\n+* Ability to map CQL lists directly to Java arrays;\n+* Ability to map CQL collections directly to Scala collections;\n+* etc.\n+\n+### Overview of the serialization mechanism\n+\n+The central piece in the new serialization mechanism introduced by JAVA-721 is [TypeCodec][TypeCodec], \n+which is now part of the driver's public API.\n+\n+Each `TypeCodec` supports a bidirectional mapping between a Java type and a CQL type. A `TypeCodec` is thus capable of 4 basic operations:\n+\n+* [Serialize][serialize] a Java object into a CQL value;\n+* [Deserialize][deserialize] a CQL value into a Java object;\n+* [Format][TypeCodec.format] a Java object into a CQL literal;\n+* [Parse][TypeCodec.parse] a CQL literal into a Java object.\n+\n+Additionally, it implements inspection methods that verify if the codec is suitable for a specific\n+CQL type and/or Java object.\n+\n+`TypeCodec` is now intended to be freely subclassed by users willing to implement their own serialization logic.\n+However, users are only required to do so when they want to extend\n+the driver's default set of codecs by registering additional codecs that handle\n+Java types that the driver is otherwise unable to process. For all other users, \n+the built-in set of codecs that is bundled with the driver provides\n+exactly the same functionality that the driver used to offer so far, \n+with out-of-the-box conversion from all CQL types to standard Java equivalents.\n+\n+Refer to the [javadocs][TypeCodec] of `TypeCodec` for more information.\n+\n+`TypeCodec`s are centralized in a [CodecRegistry][CodecRegistry] instance. \n+Whenever the driver needs to perform one of the aforementioned operations, \n+it will lookup for an appropriate codec in a `CodecRegistry`. \n+`CodecRegistry` is also used to manually register user-created codecs (see below for detailed instructions).\n+It also caches codec lookup results for faster execution whenever possible.\n+\n+`CodecRegistry` is not meant to be subclassed by clients.\n+Refer to the [javadocs][CodecRegistry] of User `CodecRegistry` for more information.\n+\n+### Implementing and using custom codecs\n+\n+Let's consider the following scenario: a user has JSON documents stored in a varchar column, and wants \n+the driver to automatically map that column to a Java object using the [Jackson][Jackson] library, \n+instead of returning the raw JSON string.\n+\n+The table structure is as follows:\n+\n+```sql\n+CREATE TABLE t (id int PRIMARY KEY, json VARCHAR);\n+```\n+\n+The first step is to implement a suitable codec. Using Jackson, here is what a Json codec could like like:\n+\n+```java\n+/**\n+ * A simple Json codec.\n+ */\n+public class JsonCodec<T> extends TypeCodec.StringParsingCodec<T> {\n+\n+    private final ObjectMapper objectMapper;\n+\n+    public JsonCodec(Class<T> javaType, ObjectMapper objectMapper) {\n+        super(javaType);\n+        this.objectMapper = objectMapper;\n+    }\n+\n+    @Override\n+    @SuppressWarnings(\"unchecked\")\n+    public T fromString(String value) {\n+        if (value == null)\n+            return null;\n+        try {\n+            return (T) objectMapper.readValue(value, getJavaType().getRawType());\n+        } catch (IOException e) {\n+            throw new InvalidTypeException(e.getMessage(), e);\n+        }\n+    }\n+\n+    @Override\n+    public String toString(T value) {\n+        if (value == null)\n+            return null;\n+        try {\n+            return objectMapper.writeValueAsString(value);\n+        } catch (JsonProcessingException e) {\n+            throw new InvalidTypeException(e.getMessage(), e);\n+        }\n+    }\n+}\n+```\n+\n+As you can see, the driver already provides a convenient base class: [StringParsingCodec][StringParsingCodec].\n+\n+A few implementation guidelines:\n+\n+* Your codecs should be thread-safe, or better yet, immutable;\n+* Your codecs should be fast: do not forget that codecs are executed often and are usually very \"hot\" pieces of code;\n+* Your codecs should never block.\n+\n+Note: the code above is an example and is not particularly efficient;\n+it suffers from the overhead of deserializing raw bytes into a String, \n+to only then parse the String into an object.\n+More advanced solutions that read the underlying byte stream directly are possible.\n+\n+The second step is to register your codec:\n+\n+```java\n+ObjectMapper objectMapper = ...\n+CodecRegistry myCodecRegistry = new CodecRegistry().register(new JsonCodec<MyPojo>(MyPojo.class, objectMapper));\n+```\n+\n+When you instantiate a `CodecRegistry`, it automatically registers all the default codecs used by the driver.\n+This ensures that the registry will not lack of an essential codec. *You cannot deregister default codecs, only\n+register new ones*.\n+\n+The third step is to associate your `CodecRegistry` instance with your `Cluster` instance:\n+\n+```java\n+Cluster cluster = new Cluster.builder().withCodecRegistry(myCodecRegistry).build();\n+```\n+\n+From now on, your codec is fully operational. It will be used every time the driver encounters\n+a `MyPojo` instance when executing queries, or when you ask it to retrieve a `MyPojo` instance from a `ResultSet`.\n+\n+For example, here is how to save a `MyPojo` object:\n+\n+```java\n+MyPojo myPojo = ...\n+// Using SimpleStatement\n+Statement stmt = new SimpleStatement(\"INSERT INTO t (id, json) VALUES (?, ?)\", 42, myPojo));\n+// Using the Query Builder\n+BuiltStatement insertStmt = insertInto(\"t\")\n+    .value(\"id\", 42)\n+    .value(\"json\", myPojo);    \n+// Using BoundStatements\n+PreparedStatement ps = session.prepare(\"INSERT INTO t (id, json) VALUES (?, ?)\");\n+BoundStatement bs1 = ps.bind(42, myPojo); // or alternatively...\n+BoundStatement bs2 = ps.bind()\n+    .setInt(0, 42)\n+    .set(1, myPojo, MyPojo.class); //newly-created set() method\n+```\n+\n+And here is how to retrieve a `MyPojo` object converted from a JSON document:\n+\n+```java\n+ResultSet rows = session.execute(...);\n+Row row = one();\n+// Let the driver convert the string for you...\n+MyPojo myPojo = row.get(1, MyPojo.class); // newly-created get() method\n+// ... or retrieve the raw string if you need it\n+String json = row.get(1, String.class); // row.getString(1) would have worked too\n+```\n+\n+Tip: `Row` and `BoundStatement` have several methods to set and retrieve values. \n+But if you plan to use custom codecs,\n+make sure that you use preferably the new `get()` and `set()` methods: these new methods \n+avoid any ambiguity by requiring the user to explicitly specify the desired Java type,\n+thus forcing the driver to pick the right codec for the right task. \n+\n+### Support for parameterized types\n+\n+The new `get()` and `set()` methods can even be used to retrieve collections or other\n+user-defined parameterized types; simply use the `get()` and `set()` variants that\n+take a Guava's [TypeToken][TypeToken] parameter:\n+\n+```java\n+Row row = ...\n+List<MyPojo> myPojos = row.get(\"jsonList\", new TypeToken<List<MyPojo>>(){}); \n+// or alternatively, the following also works for collections:\n+List<MyPojo> myPojos = row.getList(\"jsonList\", MyPojo.class); \n+```\n+\n+### Support for collections, user types, tuples and Java Enums\n+\n+`CodecRegistry` instances not only store default codecs and user-defined codecs;\n+they can also create new codecs on the fly, based on the set of codecs they currently hold.\n+\n+* Codecs for [UserType][UserType] instances are created on the fly using [UDTCodec][UDTCodec];\n+* Codecs for [TupleType][TupleType] instances are created on the fly using [TupleCodec][TupleCodec];\n+* Codecs for Java Enums are created on the fly using [EnumStringCodec][EnumStringCodec];\n+* Codecs for collections of Enums, user types and tuple types are created on the fly using","path":"features/custom_codecs/README.md","position":189,"original_position":189,"commit_id":"24e85ef2c77b39de9fc773a862fb2c645800e795","original_commit_id":"24e85ef2c77b39de9fc773a862fb2c645800e795","user":{"login":"olim7t","id":259423,"avatar_url":"https://avatars.githubusercontent.com/u/259423?v=3","gravatar_id":"","url":"https://api.github.com/users/olim7t","html_url":"https://github.com/olim7t","followers_url":"https://api.github.com/users/olim7t/followers","following_url":"https://api.github.com/users/olim7t/following{/other_user}","gists_url":"https://api.github.com/users/olim7t/gists{/gist_id}","starred_url":"https://api.github.com/users/olim7t/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/olim7t/subscriptions","organizations_url":"https://api.github.com/users/olim7t/orgs","repos_url":"https://api.github.com/users/olim7t/repos","events_url":"https://api.github.com/users/olim7t/events{/privacy}","received_events_url":"https://api.github.com/users/olim7t/received_events","type":"User","site_admin":false},"body":"> Codecs for collections of Enums, user types and tuple types are created on the fly using\r\n    [ListCodec][ListCodec], [SetCodec][SetCodec] and [MapCodec][MapCodec].\r\n\r\nThis is not restricted to enum, UDTs and tuples. Suggestion:\r\n\r\n\"Codecs for collections are created on the fly using [ListCodec], [SetCodec] and [MapCodec], if their element types can be handled by existing codecs (or codecs that can themselves be generated)\".","created_at":"2015-07-24T09:24:20Z","updated_at":"2015-07-24T09:24:20Z","html_url":"https://github.com/datastax/java-driver/pull/387#discussion_r35407910","pull_request_url":"https://api.github.com/repos/datastax/java-driver/pulls/387","_links":{"self":{"href":"https://api.github.com/repos/datastax/java-driver/pulls/comments/35407910"},"html":{"href":"https://github.com/datastax/java-driver/pull/387#discussion_r35407910"},"pull_request":{"href":"https://api.github.com/repos/datastax/java-driver/pulls/387"}}},"pull_request":{"url":"https://api.github.com/repos/datastax/java-driver/pulls/387","id":38447297,"html_url":"https://github.com/datastax/java-driver/pull/387","diff_url":"https://github.com/datastax/java-driver/pull/387.diff","patch_url":"https://github.com/datastax/java-driver/pull/387.patch","issue_url":"https://api.github.com/repos/datastax/java-driver/issues/387","number":387,"state":"open","locked":false,"title":"JAVA-721: Allow user to register custom type codecs (2.2 branch).","user":{"login":"adutra","id":463876,"avatar_url":"https://avatars.githubusercontent.com/u/463876?v=3","gravatar_id":"","url":"https://api.github.com/users/adutra","html_url":"https://github.com/adutra","followers_url":"https://api.github.com/users/adutra/followers","following_url":"https://api.github.com/users/adutra/following{/other_user}","gists_url":"https://api.github.com/users/adutra/gists{/gist_id}","starred_url":"https://api.github.com/users/adutra/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/adutra/subscriptions","organizations_url":"https://api.github.com/users/adutra/orgs","repos_url":"https://api.github.com/users/adutra/repos","events_url":"https://api.github.com/users/adutra/events{/privacy}","received_events_url":"https://api.github.com/users/adutra/received_events","type":"User","site_admin":false},"body":"README file:\r\nhttps://github.com/datastax/java-driver/blob/java721-2.2/features/custom_codecs/README.md\r\n\r\nUpgrade Guide:\r\nhttps://github.com/datastax/java-driver/blob/java721-2.2/upgrade_guide/README.md\r\n\r\n","created_at":"2015-06-24T14:24:13Z","updated_at":"2015-07-24T09:24:20Z","closed_at":null,"merged_at":null,"merge_commit_sha":"8363a8025b6029e27877cf06793b3864aeb3b9b6","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/datastax/java-driver/pulls/387/commits","review_comments_url":"https://api.github.com/repos/datastax/java-driver/pulls/387/comments","review_comment_url":"https://api.github.com/repos/datastax/java-driver/pulls/comments{/number}","comments_url":"https://api.github.com/repos/datastax/java-driver/issues/387/comments","statuses_url":"https://api.github.com/repos/datastax/java-driver/statuses/24e85ef2c77b39de9fc773a862fb2c645800e795","head":{"label":"datastax:java721-2.2","ref":"java721-2.2","sha":"24e85ef2c77b39de9fc773a862fb2c645800e795","user":{"login":"datastax","id":573369,"avatar_url":"https://avatars.githubusercontent.com/u/573369?v=3","gravatar_id":"","url":"https://api.github.com/users/datastax","html_url":"https://github.com/datastax","followers_url":"https://api.github.com/users/datastax/followers","following_url":"https://api.github.com/users/datastax/following{/other_user}","gists_url":"https://api.github.com/users/datastax/gists{/gist_id}","starred_url":"https://api.github.com/users/datastax/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/datastax/subscriptions","organizations_url":"https://api.github.com/users/datastax/orgs","repos_url":"https://api.github.com/users/datastax/repos","events_url":"https://api.github.com/users/datastax/events{/privacy}","received_events_url":"https://api.github.com/users/datastax/received_events","type":"Organization","site_admin":false},"repo":{"id":6765281,"name":"java-driver","full_name":"datastax/java-driver","owner":{"login":"datastax","id":573369,"avatar_url":"https://avatars.githubusercontent.com/u/573369?v=3","gravatar_id":"","url":"https://api.github.com/users/datastax","html_url":"https://github.com/datastax","followers_url":"https://api.github.com/users/datastax/followers","following_url":"https://api.github.com/users/datastax/following{/other_user}","gists_url":"https://api.github.com/users/datastax/gists{/gist_id}","starred_url":"https://api.github.com/users/datastax/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/datastax/subscriptions","organizations_url":"https://api.github.com/users/datastax/orgs","repos_url":"https://api.github.com/users/datastax/repos","events_url":"https://api.github.com/users/datastax/events{/privacy}","received_events_url":"https://api.github.com/users/datastax/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/datastax/java-driver","description":"DataStax Java Driver for Apache Cassandra","fork":false,"url":"https://api.github.com/repos/datastax/java-driver","forks_url":"https://api.github.com/repos/datastax/java-driver/forks","keys_url":"https://api.github.com/repos/datastax/java-driver/keys{/key_id}","collaborators_url":"https://api.github.com/repos/datastax/java-driver/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/datastax/java-driver/teams","hooks_url":"https://api.github.com/repos/datastax/java-driver/hooks","issue_events_url":"https://api.github.com/repos/datastax/java-driver/issues/events{/number}","events_url":"https://api.github.com/repos/datastax/java-driver/events","assignees_url":"https://api.github.com/repos/datastax/java-driver/assignees{/user}","branches_url":"https://api.github.com/repos/datastax/java-driver/branches{/branch}","tags_url":"https://api.github.com/repos/datastax/java-driver/tags","blobs_url":"https://api.github.com/repos/datastax/java-driver/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/datastax/java-driver/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/datastax/java-driver/git/refs{/sha}","trees_url":"https://api.github.com/repos/datastax/java-driver/git/trees{/sha}","statuses_url":"https://api.github.com/repos/datastax/java-driver/statuses/{sha}","languages_url":"https://api.github.com/repos/datastax/java-driver/languages","stargazers_url":"https://api.github.com/repos/datastax/java-driver/stargazers","contributors_url":"https://api.github.com/repos/datastax/java-driver/contributors","subscribers_url":"https://api.github.com/repos/datastax/java-driver/subscribers","subscription_url":"https://api.github.com/repos/datastax/java-driver/subscription","commits_url":"https://api.github.com/repos/datastax/java-driver/commits{/sha}","git_commits_url":"https://api.github.com/repos/datastax/java-driver/git/commits{/sha}","comments_url":"https://api.github.com/repos/datastax/java-driver/comments{/number}","issue_comment_url":"https://api.github.com/repos/datastax/java-driver/issues/comments{/number}","contents_url":"https://api.github.com/repos/datastax/java-driver/contents/{+path}","compare_url":"https://api.github.com/repos/datastax/java-driver/compare/{base}...{head}","merges_url":"https://api.github.com/repos/datastax/java-driver/merges","archive_url":"https://api.github.com/repos/datastax/java-driver/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/datastax/java-driver/downloads","issues_url":"https://api.github.com/repos/datastax/java-driver/issues{/number}","pulls_url":"https://api.github.com/repos/datastax/java-driver/pulls{/number}","milestones_url":"https://api.github.com/repos/datastax/java-driver/milestones{/number}","notifications_url":"https://api.github.com/repos/datastax/java-driver/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/datastax/java-driver/labels{/name}","releases_url":"https://api.github.com/repos/datastax/java-driver/releases{/id}","created_at":"2012-11-19T18:44:41Z","updated_at":"2015-07-24T05:18:03Z","pushed_at":"2015-07-24T06:01:35Z","git_url":"git://github.com/datastax/java-driver.git","ssh_url":"git@github.com:datastax/java-driver.git","clone_url":"https://github.com/datastax/java-driver.git","svn_url":"https://github.com/datastax/java-driver","homepage":null,"size":23496,"stargazers_count":487,"watchers_count":487,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":344,"mirror_url":null,"open_issues_count":34,"forks":344,"open_issues":34,"watchers":487,"default_branch":"2.1"}},"base":{"label":"datastax:2.2","ref":"2.2","sha":"c1d8d70035a9e6d9795c188c0af67d9e7d6cbb60","user":{"login":"datastax","id":573369,"avatar_url":"https://avatars.githubusercontent.com/u/573369?v=3","gravatar_id":"","url":"https://api.github.com/users/datastax","html_url":"https://github.com/datastax","followers_url":"https://api.github.com/users/datastax/followers","following_url":"https://api.github.com/users/datastax/following{/other_user}","gists_url":"https://api.github.com/users/datastax/gists{/gist_id}","starred_url":"https://api.github.com/users/datastax/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/datastax/subscriptions","organizations_url":"https://api.github.com/users/datastax/orgs","repos_url":"https://api.github.com/users/datastax/repos","events_url":"https://api.github.com/users/datastax/events{/privacy}","received_events_url":"https://api.github.com/users/datastax/received_events","type":"Organization","site_admin":false},"repo":{"id":6765281,"name":"java-driver","full_name":"datastax/java-driver","owner":{"login":"datastax","id":573369,"avatar_url":"https://avatars.githubusercontent.com/u/573369?v=3","gravatar_id":"","url":"https://api.github.com/users/datastax","html_url":"https://github.com/datastax","followers_url":"https://api.github.com/users/datastax/followers","following_url":"https://api.github.com/users/datastax/following{/other_user}","gists_url":"https://api.github.com/users/datastax/gists{/gist_id}","starred_url":"https://api.github.com/users/datastax/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/datastax/subscriptions","organizations_url":"https://api.github.com/users/datastax/orgs","repos_url":"https://api.github.com/users/datastax/repos","events_url":"https://api.github.com/users/datastax/events{/privacy}","received_events_url":"https://api.github.com/users/datastax/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/datastax/java-driver","description":"DataStax Java Driver for Apache Cassandra","fork":false,"url":"https://api.github.com/repos/datastax/java-driver","forks_url":"https://api.github.com/repos/datastax/java-driver/forks","keys_url":"https://api.github.com/repos/datastax/java-driver/keys{/key_id}","collaborators_url":"https://api.github.com/repos/datastax/java-driver/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/datastax/java-driver/teams","hooks_url":"https://api.github.com/repos/datastax/java-driver/hooks","issue_events_url":"https://api.github.com/repos/datastax/java-driver/issues/events{/number}","events_url":"https://api.github.com/repos/datastax/java-driver/events","assignees_url":"https://api.github.com/repos/datastax/java-driver/assignees{/user}","branches_url":"https://api.github.com/repos/datastax/java-driver/branches{/branch}","tags_url":"https://api.github.com/repos/datastax/java-driver/tags","blobs_url":"https://api.github.com/repos/datastax/java-driver/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/datastax/java-driver/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/datastax/java-driver/git/refs{/sha}","trees_url":"https://api.github.com/repos/datastax/java-driver/git/trees{/sha}","statuses_url":"https://api.github.com/repos/datastax/java-driver/statuses/{sha}","languages_url":"https://api.github.com/repos/datastax/java-driver/languages","stargazers_url":"https://api.github.com/repos/datastax/java-driver/stargazers","contributors_url":"https://api.github.com/repos/datastax/java-driver/contributors","subscribers_url":"https://api.github.com/repos/datastax/java-driver/subscribers","subscription_url":"https://api.github.com/repos/datastax/java-driver/subscription","commits_url":"https://api.github.com/repos/datastax/java-driver/commits{/sha}","git_commits_url":"https://api.github.com/repos/datastax/java-driver/git/commits{/sha}","comments_url":"https://api.github.com/repos/datastax/java-driver/comments{/number}","issue_comment_url":"https://api.github.com/repos/datastax/java-driver/issues/comments{/number}","contents_url":"https://api.github.com/repos/datastax/java-driver/contents/{+path}","compare_url":"https://api.github.com/repos/datastax/java-driver/compare/{base}...{head}","merges_url":"https://api.github.com/repos/datastax/java-driver/merges","archive_url":"https://api.github.com/repos/datastax/java-driver/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/datastax/java-driver/downloads","issues_url":"https://api.github.com/repos/datastax/java-driver/issues{/number}","pulls_url":"https://api.github.com/repos/datastax/java-driver/pulls{/number}","milestones_url":"https://api.github.com/repos/datastax/java-driver/milestones{/number}","notifications_url":"https://api.github.com/repos/datastax/java-driver/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/datastax/java-driver/labels{/name}","releases_url":"https://api.github.com/repos/datastax/java-driver/releases{/id}","created_at":"2012-11-19T18:44:41Z","updated_at":"2015-07-24T05:18:03Z","pushed_at":"2015-07-24T06:01:35Z","git_url":"git://github.com/datastax/java-driver.git","ssh_url":"git@github.com:datastax/java-driver.git","clone_url":"https://github.com/datastax/java-driver.git","svn_url":"https://github.com/datastax/java-driver","homepage":null,"size":23496,"stargazers_count":487,"watchers_count":487,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":344,"mirror_url":null,"open_issues_count":34,"forks":344,"open_issues":34,"watchers":487,"default_branch":"2.1"}},"_links":{"self":{"href":"https://api.github.com/repos/datastax/java-driver/pulls/387"},"html":{"href":"https://github.com/datastax/java-driver/pull/387"},"issue":{"href":"https://api.github.com/repos/datastax/java-driver/issues/387"},"comments":{"href":"https://api.github.com/repos/datastax/java-driver/issues/387/comments"},"review_comments":{"href":"https://api.github.com/repos/datastax/java-driver/pulls/387/comments"},"review_comment":{"href":"https://api.github.com/repos/datastax/java-driver/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/datastax/java-driver/pulls/387/commits"},"statuses":{"href":"https://api.github.com/repos/datastax/java-driver/statuses/24e85ef2c77b39de9fc773a862fb2c645800e795"}}}}