{"action":"created","comment":{"url":"https://api.github.com/repos/infinispan/infinispan/pulls/comments/34244631","id":34244631,"diff_hunk":"@@ -321,4 +327,31 @@ public boolean undelete(boolean doUndelete) {\n       return false;\n    }\n \n+   public static class Externalizer extends AbstractExternalizer<ReadCommittedEntry> {","path":"core/src/main/java/org/infinispan/container/entries/ReadCommittedEntry.java","position":25,"original_position":25,"commit_id":"45e9120caeedb30ff43d800f00187d42f8c2a7b0","original_commit_id":"45e9120caeedb30ff43d800f00187d42f8c2a7b0","user":{"login":"danberindei","id":504907,"avatar_url":"https://avatars.githubusercontent.com/u/504907?v=3","gravatar_id":"","url":"https://api.github.com/users/danberindei","html_url":"https://github.com/danberindei","followers_url":"https://api.github.com/users/danberindei/followers","following_url":"https://api.github.com/users/danberindei/following{/other_user}","gists_url":"https://api.github.com/users/danberindei/gists{/gist_id}","starred_url":"https://api.github.com/users/danberindei/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/danberindei/subscriptions","organizations_url":"https://api.github.com/users/danberindei/orgs","repos_url":"https://api.github.com/users/danberindei/repos","events_url":"https://api.github.com/users/danberindei/events{/privacy}","received_events_url":"https://api.github.com/users/danberindei/received_events","type":"User","site_admin":false},"body":"If entry views were not serializable, function implementations could not return them :) Or do you already have functions that need this?","created_at":"2015-07-09T11:08:55Z","updated_at":"2015-07-09T11:08:55Z","html_url":"https://github.com/infinispan/infinispan/pull/3571#discussion_r34244631","pull_request_url":"https://api.github.com/repos/infinispan/infinispan/pulls/3571","_links":{"self":{"href":"https://api.github.com/repos/infinispan/infinispan/pulls/comments/34244631"},"html":{"href":"https://github.com/infinispan/infinispan/pull/3571#discussion_r34244631"},"pull_request":{"href":"https://api.github.com/repos/infinispan/infinispan/pulls/3571"}}},"pull_request":{"url":"https://api.github.com/repos/infinispan/infinispan/pulls/3571","id":39092714,"html_url":"https://github.com/infinispan/infinispan/pull/3571","diff_url":"https://github.com/infinispan/infinispan/pull/3571.diff","patch_url":"https://github.com/infinispan/infinispan/pull/3571.patch","issue_url":"https://api.github.com/repos/infinispan/infinispan/issues/3571","number":3571,"state":"open","locked":false,"title":"ISPN-5553 Functional Java 8 API","user":{"login":"galderz","id":50187,"avatar_url":"https://avatars.githubusercontent.com/u/50187?v=3","gravatar_id":"","url":"https://api.github.com/users/galderz","html_url":"https://github.com/galderz","followers_url":"https://api.github.com/users/galderz/followers","following_url":"https://api.github.com/users/galderz/following{/other_user}","gists_url":"https://api.github.com/users/galderz/gists{/gist_id}","starred_url":"https://api.github.com/users/galderz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/galderz/subscriptions","organizations_url":"https://api.github.com/users/galderz/orgs","repos_url":"https://api.github.com/users/galderz/repos","events_url":"https://api.github.com/users/galderz/events{/privacy}","received_events_url":"https://api.github.com/users/galderz/received_events","type":"User","site_admin":false},"body":"Preview PR\r\n\r\nIt'd be good to include it in Beta1 for people to play with it, but it might be too tight.\r\n\r\nWhat's included?\r\n\r\n* FunctionalMap API based around lambdas with added flexibility compared to existing ConcurrentMap or JCache. This is particularly useful for those users wanting more advanced use of Infinispan.\r\n* API separated into three categories: read-only, write-only, read-write.\r\n* APIs available that work on single-key and multi-key.\r\n* This API is supported for local, distributed and replicated mode.\r\n* This new API provides a more flexible way to pass in flags, which are now called `Param`. In fact, you can now have private flags, which should make it easier for us to keep public vs private flags. See [ISPN-2201](https://issues.jboss.org/browse/ISPN-2201)\r\n* Metadata handling has also been improved making it more easy to add new MetaParam types. Previously, we'd have had to modify Metadata interface. The new approach is way more flexible. See javadocs.\r\n* Contains a helper class `MarshallableFunctionalInterfaces` with marshallable function/consumer implementations of some of the most typically used lambdas.\r\n* Lambdas for write-only and read-write operations are marshalled in clustered environments. For read-only operations, entries are brought from other nodes and lambdas executed locally.\r\n* Once locking is in, you'll be able to do replace operations based on equality based on metadata, e.g. version. This is very useful for Hot Rod, see [ISPN-4972](https://issues.jboss.org/browse/ISPN-4972).\r\n\r\nWhat's not included (which will come later on, hopefully in 8.0 series)?\r\n* Locking granularity to come, but as a preview: all write-only and read-write operations will acquire locks preemptively, so that lambdas are executed with those locks held.\r\n* ~~Implemented feedback from Dan: \"*Get rid of MetaParam.ID and instead search by MetaParam class type*\"~~ 45e9120caeedb30ff43d800f00187d42f8c2a7b0\r\n* Might also rename MetaParam impls to start with `Meta*`, more easily signals type with only class name.\r\n* ~~Implement feedback from Dan: \"*Move to Created/Lifepspan and LastUsed/MaxIdle meta param pairs*\"~~ <-- Having pairs without nice support from the IDE (e.g. Tuples) would not help hugely here, because pairs could only be used when retrieving the meta params from the entry. Why is that? Because in these pairs, once of the params is writable (e.g. lifespan or maxidle) and the other is not (created or last used), so when writing, you could only write one of the pair ones. Sure, when reading you could retrieve them as a pair, but it's little gain if you it doesn't make sense to write them as a pair too.\r\n* Make `NonTxBackupOwnerBecomingPrimaryOwnerTest` run with `FunctionalConcurrentMap`. This will make sure value matchers are working as expected.\r\n* Test expiration capabilities of new functional map APIs.\r\n* Test interoperability with data stored via Cache API.\r\n* Complete functional map listener implementation and add tests.\r\n* Integration with cache loaders/stores.\r\n* How would write-skew checks work with new API? Test with repeteable tests (kinda linked to locking).\r\n* Some of the multi-key command interceptor implementations are very similar to existing PutAll/GetAll commands. We should reduce duplication and maybe consolidate. In the end, PutAll and GetAll are specific implementations of the more general operations.\r\n* Feel free to add more things ;)","created_at":"2015-07-02T15:08:55Z","updated_at":"2015-07-09T11:08:55Z","closed_at":null,"merged_at":null,"merge_commit_sha":"ac916e73e219cd7b15c0fb77e9305ed19627c0b1","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/infinispan/infinispan/pulls/3571/commits","review_comments_url":"https://api.github.com/repos/infinispan/infinispan/pulls/3571/comments","review_comment_url":"https://api.github.com/repos/infinispan/infinispan/pulls/comments{/number}","comments_url":"https://api.github.com/repos/infinispan/infinispan/issues/3571/comments","statuses_url":"https://api.github.com/repos/infinispan/infinispan/statuses/45e9120caeedb30ff43d800f00187d42f8c2a7b0","head":{"label":"galderz:t_j8api","ref":"t_j8api","sha":"45e9120caeedb30ff43d800f00187d42f8c2a7b0","user":{"login":"galderz","id":50187,"avatar_url":"https://avatars.githubusercontent.com/u/50187?v=3","gravatar_id":"","url":"https://api.github.com/users/galderz","html_url":"https://github.com/galderz","followers_url":"https://api.github.com/users/galderz/followers","following_url":"https://api.github.com/users/galderz/following{/other_user}","gists_url":"https://api.github.com/users/galderz/gists{/gist_id}","starred_url":"https://api.github.com/users/galderz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/galderz/subscriptions","organizations_url":"https://api.github.com/users/galderz/orgs","repos_url":"https://api.github.com/users/galderz/repos","events_url":"https://api.github.com/users/galderz/events{/privacy}","received_events_url":"https://api.github.com/users/galderz/received_events","type":"User","site_admin":false},"repo":{"id":1864151,"name":"infinispan","full_name":"galderz/infinispan","owner":{"login":"galderz","id":50187,"avatar_url":"https://avatars.githubusercontent.com/u/50187?v=3","gravatar_id":"","url":"https://api.github.com/users/galderz","html_url":"https://github.com/galderz","followers_url":"https://api.github.com/users/galderz/followers","following_url":"https://api.github.com/users/galderz/following{/other_user}","gists_url":"https://api.github.com/users/galderz/gists{/gist_id}","starred_url":"https://api.github.com/users/galderz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/galderz/subscriptions","organizations_url":"https://api.github.com/users/galderz/orgs","repos_url":"https://api.github.com/users/galderz/repos","events_url":"https://api.github.com/users/galderz/events{/privacy}","received_events_url":"https://api.github.com/users/galderz/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/galderz/infinispan","description":"Infinispan is an open source data grid platform and highly scalable NoSQL cloud data store.","fork":true,"url":"https://api.github.com/repos/galderz/infinispan","forks_url":"https://api.github.com/repos/galderz/infinispan/forks","keys_url":"https://api.github.com/repos/galderz/infinispan/keys{/key_id}","collaborators_url":"https://api.github.com/repos/galderz/infinispan/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/galderz/infinispan/teams","hooks_url":"https://api.github.com/repos/galderz/infinispan/hooks","issue_events_url":"https://api.github.com/repos/galderz/infinispan/issues/events{/number}","events_url":"https://api.github.com/repos/galderz/infinispan/events","assignees_url":"https://api.github.com/repos/galderz/infinispan/assignees{/user}","branches_url":"https://api.github.com/repos/galderz/infinispan/branches{/branch}","tags_url":"https://api.github.com/repos/galderz/infinispan/tags","blobs_url":"https://api.github.com/repos/galderz/infinispan/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/galderz/infinispan/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/galderz/infinispan/git/refs{/sha}","trees_url":"https://api.github.com/repos/galderz/infinispan/git/trees{/sha}","statuses_url":"https://api.github.com/repos/galderz/infinispan/statuses/{sha}","languages_url":"https://api.github.com/repos/galderz/infinispan/languages","stargazers_url":"https://api.github.com/repos/galderz/infinispan/stargazers","contributors_url":"https://api.github.com/repos/galderz/infinispan/contributors","subscribers_url":"https://api.github.com/repos/galderz/infinispan/subscribers","subscription_url":"https://api.github.com/repos/galderz/infinispan/subscription","commits_url":"https://api.github.com/repos/galderz/infinispan/commits{/sha}","git_commits_url":"https://api.github.com/repos/galderz/infinispan/git/commits{/sha}","comments_url":"https://api.github.com/repos/galderz/infinispan/comments{/number}","issue_comment_url":"https://api.github.com/repos/galderz/infinispan/issues/comments{/number}","contents_url":"https://api.github.com/repos/galderz/infinispan/contents/{+path}","compare_url":"https://api.github.com/repos/galderz/infinispan/compare/{base}...{head}","merges_url":"https://api.github.com/repos/galderz/infinispan/merges","archive_url":"https://api.github.com/repos/galderz/infinispan/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/galderz/infinispan/downloads","issues_url":"https://api.github.com/repos/galderz/infinispan/issues{/number}","pulls_url":"https://api.github.com/repos/galderz/infinispan/pulls{/number}","milestones_url":"https://api.github.com/repos/galderz/infinispan/milestones{/number}","notifications_url":"https://api.github.com/repos/galderz/infinispan/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/galderz/infinispan/labels{/name}","releases_url":"https://api.github.com/repos/galderz/infinispan/releases{/id}","created_at":"2011-06-08T08:01:30Z","updated_at":"2015-05-05T10:24:25Z","pushed_at":"2015-07-03T14:40:22Z","git_url":"git://github.com/galderz/infinispan.git","ssh_url":"git@github.com:galderz/infinispan.git","clone_url":"https://github.com/galderz/infinispan.git","svn_url":"https://github.com/galderz/infinispan","homepage":"http://www.infinispan.org","size":83118,"stargazers_count":1,"watchers_count":1,"language":"Java","has_issues":false,"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":1,"default_branch":"master"}},"base":{"label":"infinispan:master","ref":"master","sha":"eec8e815e60800df5024078929029c2141a6221d","user":{"login":"infinispan","id":458093,"avatar_url":"https://avatars.githubusercontent.com/u/458093?v=3","gravatar_id":"","url":"https://api.github.com/users/infinispan","html_url":"https://github.com/infinispan","followers_url":"https://api.github.com/users/infinispan/followers","following_url":"https://api.github.com/users/infinispan/following{/other_user}","gists_url":"https://api.github.com/users/infinispan/gists{/gist_id}","starred_url":"https://api.github.com/users/infinispan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/infinispan/subscriptions","organizations_url":"https://api.github.com/users/infinispan/orgs","repos_url":"https://api.github.com/users/infinispan/repos","events_url":"https://api.github.com/users/infinispan/events{/privacy}","received_events_url":"https://api.github.com/users/infinispan/received_events","type":"Organization","site_admin":false},"repo":{"id":1050944,"name":"infinispan","full_name":"infinispan/infinispan","owner":{"login":"infinispan","id":458093,"avatar_url":"https://avatars.githubusercontent.com/u/458093?v=3","gravatar_id":"","url":"https://api.github.com/users/infinispan","html_url":"https://github.com/infinispan","followers_url":"https://api.github.com/users/infinispan/followers","following_url":"https://api.github.com/users/infinispan/following{/other_user}","gists_url":"https://api.github.com/users/infinispan/gists{/gist_id}","starred_url":"https://api.github.com/users/infinispan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/infinispan/subscriptions","organizations_url":"https://api.github.com/users/infinispan/orgs","repos_url":"https://api.github.com/users/infinispan/repos","events_url":"https://api.github.com/users/infinispan/events{/privacy}","received_events_url":"https://api.github.com/users/infinispan/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/infinispan/infinispan","description":"Infinispan is an open source data grid platform and highly scalable NoSQL cloud data store.","fork":false,"url":"https://api.github.com/repos/infinispan/infinispan","forks_url":"https://api.github.com/repos/infinispan/infinispan/forks","keys_url":"https://api.github.com/repos/infinispan/infinispan/keys{/key_id}","collaborators_url":"https://api.github.com/repos/infinispan/infinispan/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/infinispan/infinispan/teams","hooks_url":"https://api.github.com/repos/infinispan/infinispan/hooks","issue_events_url":"https://api.github.com/repos/infinispan/infinispan/issues/events{/number}","events_url":"https://api.github.com/repos/infinispan/infinispan/events","assignees_url":"https://api.github.com/repos/infinispan/infinispan/assignees{/user}","branches_url":"https://api.github.com/repos/infinispan/infinispan/branches{/branch}","tags_url":"https://api.github.com/repos/infinispan/infinispan/tags","blobs_url":"https://api.github.com/repos/infinispan/infinispan/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/infinispan/infinispan/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/infinispan/infinispan/git/refs{/sha}","trees_url":"https://api.github.com/repos/infinispan/infinispan/git/trees{/sha}","statuses_url":"https://api.github.com/repos/infinispan/infinispan/statuses/{sha}","languages_url":"https://api.github.com/repos/infinispan/infinispan/languages","stargazers_url":"https://api.github.com/repos/infinispan/infinispan/stargazers","contributors_url":"https://api.github.com/repos/infinispan/infinispan/contributors","subscribers_url":"https://api.github.com/repos/infinispan/infinispan/subscribers","subscription_url":"https://api.github.com/repos/infinispan/infinispan/subscription","commits_url":"https://api.github.com/repos/infinispan/infinispan/commits{/sha}","git_commits_url":"https://api.github.com/repos/infinispan/infinispan/git/commits{/sha}","comments_url":"https://api.github.com/repos/infinispan/infinispan/comments{/number}","issue_comment_url":"https://api.github.com/repos/infinispan/infinispan/issues/comments{/number}","contents_url":"https://api.github.com/repos/infinispan/infinispan/contents/{+path}","compare_url":"https://api.github.com/repos/infinispan/infinispan/compare/{base}...{head}","merges_url":"https://api.github.com/repos/infinispan/infinispan/merges","archive_url":"https://api.github.com/repos/infinispan/infinispan/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/infinispan/infinispan/downloads","issues_url":"https://api.github.com/repos/infinispan/infinispan/issues{/number}","pulls_url":"https://api.github.com/repos/infinispan/infinispan/pulls{/number}","milestones_url":"https://api.github.com/repos/infinispan/infinispan/milestones{/number}","notifications_url":"https://api.github.com/repos/infinispan/infinispan/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/infinispan/infinispan/labels{/name}","releases_url":"https://api.github.com/repos/infinispan/infinispan/releases{/id}","created_at":"2010-11-04T12:33:19Z","updated_at":"2015-07-03T08:04:31Z","pushed_at":"2015-07-08T21:12:36Z","git_url":"git://github.com/infinispan/infinispan.git","ssh_url":"git@github.com:infinispan/infinispan.git","clone_url":"https://github.com/infinispan/infinispan.git","svn_url":"https://github.com/infinispan/infinispan","homepage":"http://www.infinispan.org","size":154404,"stargazers_count":387,"watchers_count":387,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":296,"mirror_url":null,"open_issues_count":12,"forks":296,"open_issues":12,"watchers":387,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/infinispan/infinispan/pulls/3571"},"html":{"href":"https://github.com/infinispan/infinispan/pull/3571"},"issue":{"href":"https://api.github.com/repos/infinispan/infinispan/issues/3571"},"comments":{"href":"https://api.github.com/repos/infinispan/infinispan/issues/3571/comments"},"review_comments":{"href":"https://api.github.com/repos/infinispan/infinispan/pulls/3571/comments"},"review_comment":{"href":"https://api.github.com/repos/infinispan/infinispan/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/infinispan/infinispan/pulls/3571/commits"},"statuses":{"href":"https://api.github.com/repos/infinispan/infinispan/statuses/45e9120caeedb30ff43d800f00187d42f8c2a7b0"}}}}