{"action":"created","comment":{"url":"https://api.github.com/repos/caskdata/cdap/pulls/comments/75533562","id":75533562,"diff_hunk":"@@ -0,0 +1,90 @@\n+/*\n+ * Copyright © 016 Cask Data, Inc.\n+ *\n+ * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n+ * use this file except in compliance with the License. You may obtain a copy of\n+ * 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, WITHOUT\n+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n+ * License for the specific language governing permissions and limitations under\n+ * the License.\n+ */\n+package co.cask.cdap.internal.app.store;\n+\n+import co.cask.cdap.api.common.Bytes;\n+import co.cask.cdap.api.dataset.lib.AbstractDataset;\n+import co.cask.cdap.api.dataset.table.Row;\n+import co.cask.cdap.api.dataset.table.Scanner;\n+import co.cask.cdap.api.dataset.table.Table;\n+import co.cask.cdap.data2.dataset2.lib.table.MDSKey;\n+import co.cask.cdap.proto.id.PreviewId;\n+import com.google.gson.Gson;\n+\n+import java.util.ArrayList;\n+import java.util.HashMap;\n+import java.util.List;\n+import java.util.Map;\n+\n+/**\n+ * Store for the preview data.\n+ */\n+public class PreviewDataset extends AbstractDataset {\n+  static final String PREVIEW_TABLE_NAME = \"preview.table\";\n+  private static final Gson GSON = new Gson();\n+  private static final byte[] LOGGER = Bytes.toBytes(\"l\");\n+  private static final byte[] PROPERTY = Bytes.toBytes(\"p\");\n+  private static final byte[] VALUE = Bytes.toBytes(\"v\");\n+  private static final byte[] COUNT_RECORD_TYPE = Bytes.toBytes(\"c\");\n+  private static final byte[] DATA_RECORD_TYPE = Bytes.toBytes(\"d\");\n+\n+  private final Table table;\n+\n+  PreviewDataset(Table table) {\n+    super(PREVIEW_TABLE_NAME, table);\n+    this.table = table;\n+  }\n+\n+  void put(PreviewId previewId, String loggerName, String propertyName, Object value) {\n+    MDSKey mdsKey = new MDSKey.Builder().add(previewId.getNamespace())\n+      .add(previewId.getPreview()).add(COUNT_RECORD_TYPE).build();\n+    long recordCount = table.incrementAndGet(mdsKey.getKey(), COUNT_RECORD_TYPE, 1L);\n+\n+    mdsKey = new MDSKey.Builder().add(previewId.getNamespace())\n+      .add(previewId.getPreview()).add(loggerName).add(DATA_RECORD_TYPE).add(recordCount).build();\n+\n+    byte[][] columns = new byte[][] { LOGGER, PROPERTY, VALUE };\n+    byte[][] values = new byte[][] {\n+      Bytes.toBytes(loggerName),\n+      Bytes.toBytes(propertyName),\n+      Bytes.toBytes(GSON.toJson(value))\n+    };\n+\n+    table.put(mdsKey.getKey(), columns, values);\n+  }\n+\n+  Map<String, List<String>> get(PreviewId previewId, String loggerName) {\n+    byte[] startRowKey = new MDSKey.Builder().add(previewId.getNamespace())\n+      .add(previewId.getPreview()).add(loggerName).add(DATA_RECORD_TYPE).build().getKey();\n+    byte[] stopRowKey = new MDSKey(Bytes.stopKeyForPrefix(startRowKey)).getKey();\n+\n+    Scanner scanner = table.scan(startRowKey, stopRowKey);","path":"cdap-app-fabric/src/main/java/co/cask/cdap/internal/app/store/PreviewDataset.java","position":74,"original_position":74,"commit_id":"c66b3c19bc0a6ab2442986abc9ba68984196310b","original_commit_id":"7649399b747aa2cc98191524cceebc5b0cee436f","user":{"login":"sreevatsanraman","id":1148913,"avatar_url":"https://avatars.githubusercontent.com/u/1148913?v=3","gravatar_id":"","url":"https://api.github.com/users/sreevatsanraman","html_url":"https://github.com/sreevatsanraman","followers_url":"https://api.github.com/users/sreevatsanraman/followers","following_url":"https://api.github.com/users/sreevatsanraman/following{/other_user}","gists_url":"https://api.github.com/users/sreevatsanraman/gists{/gist_id}","starred_url":"https://api.github.com/users/sreevatsanraman/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sreevatsanraman/subscriptions","organizations_url":"https://api.github.com/users/sreevatsanraman/orgs","repos_url":"https://api.github.com/users/sreevatsanraman/repos","events_url":"https://api.github.com/users/sreevatsanraman/events{/privacy}","received_events_url":"https://api.github.com/users/sreevatsanraman/received_events","type":"User","site_admin":false},"body":"close scanner in a finally block","created_at":"2016-08-19T18:49:54Z","updated_at":"2016-08-19T18:49:54Z","html_url":"https://github.com/caskdata/cdap/pull/6511#discussion_r75533562","pull_request_url":"https://api.github.com/repos/caskdata/cdap/pulls/6511","_links":{"self":{"href":"https://api.github.com/repos/caskdata/cdap/pulls/comments/75533562"},"html":{"href":"https://github.com/caskdata/cdap/pull/6511#discussion_r75533562"},"pull_request":{"href":"https://api.github.com/repos/caskdata/cdap/pulls/6511"}}},"pull_request":{"url":"https://api.github.com/repos/caskdata/cdap/pulls/6511","id":81938560,"html_url":"https://github.com/caskdata/cdap/pull/6511","diff_url":"https://github.com/caskdata/cdap/pull/6511.diff","patch_url":"https://github.com/caskdata/cdap/pull/6511.patch","issue_url":"https://api.github.com/repos/caskdata/cdap/issues/6511","number":6511,"state":"open","locked":false,"title":"Fix/preview runtime feature","user":{"login":"sagarkapare","id":5713570,"avatar_url":"https://avatars.githubusercontent.com/u/5713570?v=3","gravatar_id":"","url":"https://api.github.com/users/sagarkapare","html_url":"https://github.com/sagarkapare","followers_url":"https://api.github.com/users/sagarkapare/followers","following_url":"https://api.github.com/users/sagarkapare/following{/other_user}","gists_url":"https://api.github.com/users/sagarkapare/gists{/gist_id}","starred_url":"https://api.github.com/users/sagarkapare/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sagarkapare/subscriptions","organizations_url":"https://api.github.com/users/sagarkapare/orgs","repos_url":"https://api.github.com/users/sagarkapare/repos","events_url":"https://api.github.com/users/sagarkapare/events{/privacy}","received_events_url":"https://api.github.com/users/sagarkapare/received_events","type":"User","site_admin":false},"body":"This PR contains the following changes - \r\n1. PreviewHttpHandler for handling the REST endpoints for preview.\r\n2. PreviewStore implementation which is responsible for storing the preview data.\r\n3. Passing PreviewId to all program context.\r\n4. App template changes to emit the preview data.","created_at":"2016-08-19T07:37:33Z","updated_at":"2016-08-19T18:49:54Z","closed_at":null,"merged_at":null,"merge_commit_sha":"f949718090e49db5ebcfb81639f17a461c08cb63","assignee":{"login":"chtyim","id":885032,"avatar_url":"https://avatars.githubusercontent.com/u/885032?v=3","gravatar_id":"","url":"https://api.github.com/users/chtyim","html_url":"https://github.com/chtyim","followers_url":"https://api.github.com/users/chtyim/followers","following_url":"https://api.github.com/users/chtyim/following{/other_user}","gists_url":"https://api.github.com/users/chtyim/gists{/gist_id}","starred_url":"https://api.github.com/users/chtyim/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chtyim/subscriptions","organizations_url":"https://api.github.com/users/chtyim/orgs","repos_url":"https://api.github.com/users/chtyim/repos","events_url":"https://api.github.com/users/chtyim/events{/privacy}","received_events_url":"https://api.github.com/users/chtyim/received_events","type":"User","site_admin":false},"assignees":[{"login":"chtyim","id":885032,"avatar_url":"https://avatars.githubusercontent.com/u/885032?v=3","gravatar_id":"","url":"https://api.github.com/users/chtyim","html_url":"https://github.com/chtyim","followers_url":"https://api.github.com/users/chtyim/followers","following_url":"https://api.github.com/users/chtyim/following{/other_user}","gists_url":"https://api.github.com/users/chtyim/gists{/gist_id}","starred_url":"https://api.github.com/users/chtyim/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chtyim/subscriptions","organizations_url":"https://api.github.com/users/chtyim/orgs","repos_url":"https://api.github.com/users/chtyim/repos","events_url":"https://api.github.com/users/chtyim/events{/privacy}","received_events_url":"https://api.github.com/users/chtyim/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/caskdata/cdap/pulls/6511/commits","review_comments_url":"https://api.github.com/repos/caskdata/cdap/pulls/6511/comments","review_comment_url":"https://api.github.com/repos/caskdata/cdap/pulls/comments{/number}","comments_url":"https://api.github.com/repos/caskdata/cdap/issues/6511/comments","statuses_url":"https://api.github.com/repos/caskdata/cdap/statuses/c66b3c19bc0a6ab2442986abc9ba68984196310b","head":{"label":"caskdata:fix/preview-runtime-feature","ref":"fix/preview-runtime-feature","sha":"c66b3c19bc0a6ab2442986abc9ba68984196310b","user":{"login":"caskdata","id":8123023,"avatar_url":"https://avatars.githubusercontent.com/u/8123023?v=3","gravatar_id":"","url":"https://api.github.com/users/caskdata","html_url":"https://github.com/caskdata","followers_url":"https://api.github.com/users/caskdata/followers","following_url":"https://api.github.com/users/caskdata/following{/other_user}","gists_url":"https://api.github.com/users/caskdata/gists{/gist_id}","starred_url":"https://api.github.com/users/caskdata/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/caskdata/subscriptions","organizations_url":"https://api.github.com/users/caskdata/orgs","repos_url":"https://api.github.com/users/caskdata/repos","events_url":"https://api.github.com/users/caskdata/events{/privacy}","received_events_url":"https://api.github.com/users/caskdata/received_events","type":"Organization","site_admin":false},"repo":{"id":22542759,"name":"cdap","full_name":"caskdata/cdap","owner":{"login":"caskdata","id":8123023,"avatar_url":"https://avatars.githubusercontent.com/u/8123023?v=3","gravatar_id":"","url":"https://api.github.com/users/caskdata","html_url":"https://github.com/caskdata","followers_url":"https://api.github.com/users/caskdata/followers","following_url":"https://api.github.com/users/caskdata/following{/other_user}","gists_url":"https://api.github.com/users/caskdata/gists{/gist_id}","starred_url":"https://api.github.com/users/caskdata/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/caskdata/subscriptions","organizations_url":"https://api.github.com/users/caskdata/orgs","repos_url":"https://api.github.com/users/caskdata/repos","events_url":"https://api.github.com/users/caskdata/events{/privacy}","received_events_url":"https://api.github.com/users/caskdata/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/caskdata/cdap","description":"Cask Data Application Platform (CDAP)","fork":false,"url":"https://api.github.com/repos/caskdata/cdap","forks_url":"https://api.github.com/repos/caskdata/cdap/forks","keys_url":"https://api.github.com/repos/caskdata/cdap/keys{/key_id}","collaborators_url":"https://api.github.com/repos/caskdata/cdap/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/caskdata/cdap/teams","hooks_url":"https://api.github.com/repos/caskdata/cdap/hooks","issue_events_url":"https://api.github.com/repos/caskdata/cdap/issues/events{/number}","events_url":"https://api.github.com/repos/caskdata/cdap/events","assignees_url":"https://api.github.com/repos/caskdata/cdap/assignees{/user}","branches_url":"https://api.github.com/repos/caskdata/cdap/branches{/branch}","tags_url":"https://api.github.com/repos/caskdata/cdap/tags","blobs_url":"https://api.github.com/repos/caskdata/cdap/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/caskdata/cdap/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/caskdata/cdap/git/refs{/sha}","trees_url":"https://api.github.com/repos/caskdata/cdap/git/trees{/sha}","statuses_url":"https://api.github.com/repos/caskdata/cdap/statuses/{sha}","languages_url":"https://api.github.com/repos/caskdata/cdap/languages","stargazers_url":"https://api.github.com/repos/caskdata/cdap/stargazers","contributors_url":"https://api.github.com/repos/caskdata/cdap/contributors","subscribers_url":"https://api.github.com/repos/caskdata/cdap/subscribers","subscription_url":"https://api.github.com/repos/caskdata/cdap/subscription","commits_url":"https://api.github.com/repos/caskdata/cdap/commits{/sha}","git_commits_url":"https://api.github.com/repos/caskdata/cdap/git/commits{/sha}","comments_url":"https://api.github.com/repos/caskdata/cdap/comments{/number}","issue_comment_url":"https://api.github.com/repos/caskdata/cdap/issues/comments{/number}","contents_url":"https://api.github.com/repos/caskdata/cdap/contents/{+path}","compare_url":"https://api.github.com/repos/caskdata/cdap/compare/{base}...{head}","merges_url":"https://api.github.com/repos/caskdata/cdap/merges","archive_url":"https://api.github.com/repos/caskdata/cdap/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/caskdata/cdap/downloads","issues_url":"https://api.github.com/repos/caskdata/cdap/issues{/number}","pulls_url":"https://api.github.com/repos/caskdata/cdap/pulls{/number}","milestones_url":"https://api.github.com/repos/caskdata/cdap/milestones{/number}","notifications_url":"https://api.github.com/repos/caskdata/cdap/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/caskdata/cdap/labels{/name}","releases_url":"https://api.github.com/repos/caskdata/cdap/releases{/id}","deployments_url":"https://api.github.com/repos/caskdata/cdap/deployments","created_at":"2014-08-02T09:00:10Z","updated_at":"2016-07-29T12:19:53Z","pushed_at":"2016-08-19T18:48:45Z","git_url":"git://github.com/caskdata/cdap.git","ssh_url":"git@github.com:caskdata/cdap.git","clone_url":"https://github.com/caskdata/cdap.git","svn_url":"https://github.com/caskdata/cdap","homepage":"http://cdap.io","size":631424,"stargazers_count":137,"watchers_count":137,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":53,"mirror_url":null,"open_issues_count":13,"forks":53,"open_issues":13,"watchers":137,"default_branch":"release/3.5"}},"base":{"label":"caskdata:release/3.5","ref":"release/3.5","sha":"c04696270860500cdde08b0aea1c66c7c28ecccb","user":{"login":"caskdata","id":8123023,"avatar_url":"https://avatars.githubusercontent.com/u/8123023?v=3","gravatar_id":"","url":"https://api.github.com/users/caskdata","html_url":"https://github.com/caskdata","followers_url":"https://api.github.com/users/caskdata/followers","following_url":"https://api.github.com/users/caskdata/following{/other_user}","gists_url":"https://api.github.com/users/caskdata/gists{/gist_id}","starred_url":"https://api.github.com/users/caskdata/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/caskdata/subscriptions","organizations_url":"https://api.github.com/users/caskdata/orgs","repos_url":"https://api.github.com/users/caskdata/repos","events_url":"https://api.github.com/users/caskdata/events{/privacy}","received_events_url":"https://api.github.com/users/caskdata/received_events","type":"Organization","site_admin":false},"repo":{"id":22542759,"name":"cdap","full_name":"caskdata/cdap","owner":{"login":"caskdata","id":8123023,"avatar_url":"https://avatars.githubusercontent.com/u/8123023?v=3","gravatar_id":"","url":"https://api.github.com/users/caskdata","html_url":"https://github.com/caskdata","followers_url":"https://api.github.com/users/caskdata/followers","following_url":"https://api.github.com/users/caskdata/following{/other_user}","gists_url":"https://api.github.com/users/caskdata/gists{/gist_id}","starred_url":"https://api.github.com/users/caskdata/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/caskdata/subscriptions","organizations_url":"https://api.github.com/users/caskdata/orgs","repos_url":"https://api.github.com/users/caskdata/repos","events_url":"https://api.github.com/users/caskdata/events{/privacy}","received_events_url":"https://api.github.com/users/caskdata/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/caskdata/cdap","description":"Cask Data Application Platform (CDAP)","fork":false,"url":"https://api.github.com/repos/caskdata/cdap","forks_url":"https://api.github.com/repos/caskdata/cdap/forks","keys_url":"https://api.github.com/repos/caskdata/cdap/keys{/key_id}","collaborators_url":"https://api.github.com/repos/caskdata/cdap/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/caskdata/cdap/teams","hooks_url":"https://api.github.com/repos/caskdata/cdap/hooks","issue_events_url":"https://api.github.com/repos/caskdata/cdap/issues/events{/number}","events_url":"https://api.github.com/repos/caskdata/cdap/events","assignees_url":"https://api.github.com/repos/caskdata/cdap/assignees{/user}","branches_url":"https://api.github.com/repos/caskdata/cdap/branches{/branch}","tags_url":"https://api.github.com/repos/caskdata/cdap/tags","blobs_url":"https://api.github.com/repos/caskdata/cdap/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/caskdata/cdap/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/caskdata/cdap/git/refs{/sha}","trees_url":"https://api.github.com/repos/caskdata/cdap/git/trees{/sha}","statuses_url":"https://api.github.com/repos/caskdata/cdap/statuses/{sha}","languages_url":"https://api.github.com/repos/caskdata/cdap/languages","stargazers_url":"https://api.github.com/repos/caskdata/cdap/stargazers","contributors_url":"https://api.github.com/repos/caskdata/cdap/contributors","subscribers_url":"https://api.github.com/repos/caskdata/cdap/subscribers","subscription_url":"https://api.github.com/repos/caskdata/cdap/subscription","commits_url":"https://api.github.com/repos/caskdata/cdap/commits{/sha}","git_commits_url":"https://api.github.com/repos/caskdata/cdap/git/commits{/sha}","comments_url":"https://api.github.com/repos/caskdata/cdap/comments{/number}","issue_comment_url":"https://api.github.com/repos/caskdata/cdap/issues/comments{/number}","contents_url":"https://api.github.com/repos/caskdata/cdap/contents/{+path}","compare_url":"https://api.github.com/repos/caskdata/cdap/compare/{base}...{head}","merges_url":"https://api.github.com/repos/caskdata/cdap/merges","archive_url":"https://api.github.com/repos/caskdata/cdap/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/caskdata/cdap/downloads","issues_url":"https://api.github.com/repos/caskdata/cdap/issues{/number}","pulls_url":"https://api.github.com/repos/caskdata/cdap/pulls{/number}","milestones_url":"https://api.github.com/repos/caskdata/cdap/milestones{/number}","notifications_url":"https://api.github.com/repos/caskdata/cdap/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/caskdata/cdap/labels{/name}","releases_url":"https://api.github.com/repos/caskdata/cdap/releases{/id}","deployments_url":"https://api.github.com/repos/caskdata/cdap/deployments","created_at":"2014-08-02T09:00:10Z","updated_at":"2016-07-29T12:19:53Z","pushed_at":"2016-08-19T18:48:45Z","git_url":"git://github.com/caskdata/cdap.git","ssh_url":"git@github.com:caskdata/cdap.git","clone_url":"https://github.com/caskdata/cdap.git","svn_url":"https://github.com/caskdata/cdap","homepage":"http://cdap.io","size":631424,"stargazers_count":137,"watchers_count":137,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":53,"mirror_url":null,"open_issues_count":13,"forks":53,"open_issues":13,"watchers":137,"default_branch":"release/3.5"}},"_links":{"self":{"href":"https://api.github.com/repos/caskdata/cdap/pulls/6511"},"html":{"href":"https://github.com/caskdata/cdap/pull/6511"},"issue":{"href":"https://api.github.com/repos/caskdata/cdap/issues/6511"},"comments":{"href":"https://api.github.com/repos/caskdata/cdap/issues/6511/comments"},"review_comments":{"href":"https://api.github.com/repos/caskdata/cdap/pulls/6511/comments"},"review_comment":{"href":"https://api.github.com/repos/caskdata/cdap/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/caskdata/cdap/pulls/6511/commits"},"statuses":{"href":"https://api.github.com/repos/caskdata/cdap/statuses/c66b3c19bc0a6ab2442986abc9ba68984196310b"}}}}
{"actor":{"display_login":"sreevatsanraman"}}