{"action":"created","comment":{"url":"https://api.github.com/repos/caskdata/cdap/pulls/comments/39575386","id":39575386,"diff_hunk":"@@ -71,11 +90,91 @@ public RuntimeInfo run(Program program, ProgramOptions options) {\n     ProgramRunner runner = programRunnerFactory.create(ProgramRunnerFactory.Type.valueOf(program.getType().name()));\n     Preconditions.checkNotNull(runner, \"Fail to get ProgramRunner for type \" + program.getType());\n     ProgramOptions optionsWithRunId = addRunId(options, RunIds.generate());\n-    final RuntimeInfo runtimeInfo = createRuntimeInfo(runner.run(program, optionsWithRunId), program);\n-    programStarted(runtimeInfo);\n+    File tempDir = createTempDirectory(program.getId());\n+    Runnable cleanUpTask = createCleanupTask(tempDir);\n+    ProgramOptions optionsWithPlugins = createPluginSnapshot(optionsWithRunId, program.getId().getNamespace(), tempDir,\n+                                                             program.getApplicationSpecification());\n+    final RuntimeInfo runtimeInfo = createRuntimeInfo(runner.run(program, optionsWithPlugins), program);\n+    programStarted(runtimeInfo, cleanUpTask);\n     return runtimeInfo;\n   }\n \n+  private Runnable createCleanupTask(final File... resources) {\n+    return new Runnable() {\n+      @Override\n+      public void run() {\n+        for (File file : resources) {\n+          if (file == null) {\n+            continue;\n+          }\n+\n+          try {\n+            if (file.isDirectory()) {\n+              DirUtils.deleteDirectoryContents(file);\n+            } else {\n+              file.delete();\n+            }\n+          } catch (Throwable t) {\n+            LOG.warn(\"Exception when cleaning up resource {}\", file, t);\n+          }\n+        }\n+      }\n+    };\n+  }\n+\n+  /**\n+   * Creates a local temporary directory for this program run.\n+   */\n+  private File createTempDirectory(Id.Program programId) {\n+    File tempDir = new File(cConf.get(Constants.CFG_LOCAL_DATA_DIR),\n+                            cConf.get(Constants.AppFabric.TEMP_DIR)).getAbsoluteFile();\n+    File dir = new File(tempDir, String.format(\"%s.%s.%s.%s.%s\",\n+                                               programId.getType().name().toLowerCase(),\n+                                               programId.getNamespaceId(), programId.getApplicationId(),\n+                                               programId.getId(), UUID.randomUUID().toString()));\n+    dir.mkdirs();\n+    return dir;\n+  }\n+\n+  /**\n+   * Return the copy of the {@link ProgramOptions} including locations of plugin artifacts in it.\n+   * @param options the {@link ProgramOptions} in which the locations of plugin artifacts needs to be included\n+   * @param namespace Id of the Program's namespace\n+   * @param tempDir Temporary Directory to create the plugin artifact snapshot\n+   * @param appSpec program's Application Specification\n+   * @return the copy of the program options with locations of plugin artifacts included in them\n+   */\n+  private ProgramOptions createPluginSnapshot(ProgramOptions options, Id.Namespace namespace, File tempDir,\n+                                              @Nullable ApplicationSpecification appSpec) {\n+    // appSpec is null in an unit test\n+    if (appSpec == null) {\n+      return options;\n+    }\n+\n+    Id.Artifact appArtifactId = Id.Artifact.from(namespace, appSpec.getArtifactId());\n+    ImmutableMap.Builder<String, String> builder = ImmutableMap.builder();\n+    builder.putAll(options.getArguments().asMap());\n+    for (Map.Entry<String, Plugin> pluginEntry : appSpec.getPlugins().entrySet()) {\n+      Plugin plugin = pluginEntry.getValue();\n+      try {\n+        Map.Entry<ArtifactDescriptor, PluginClass> artifactEntry = artifactRepository.getPlugin(","path":"cdap-app-fabric/src/main/java/co/cask/cdap/app/runtime/AbstractProgramRuntimeService.java","position":143,"original_position":143,"commit_id":"28974180337583f97812e951d99bf6afde31062a","original_commit_id":"28974180337583f97812e951d99bf6afde31062a","user":{"login":"albertshau","id":5215004,"avatar_url":"https://avatars.githubusercontent.com/u/5215004?v=3","gravatar_id":"","url":"https://api.github.com/users/albertshau","html_url":"https://github.com/albertshau","followers_url":"https://api.github.com/users/albertshau/followers","following_url":"https://api.github.com/users/albertshau/following{/other_user}","gists_url":"https://api.github.com/users/albertshau/gists{/gist_id}","starred_url":"https://api.github.com/users/albertshau/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/albertshau/subscriptions","organizations_url":"https://api.github.com/users/albertshau/orgs","repos_url":"https://api.github.com/users/albertshau/repos","events_url":"https://api.github.com/users/albertshau/events{/privacy}","received_events_url":"https://api.github.com/users/albertshau/received_events","type":"User","site_admin":false},"body":"use `artifactRepository.getArtifact(pluginArtifactId)` instead of adding this method","created_at":"2015-09-15T22:43:28Z","updated_at":"2015-09-15T22:43:28Z","html_url":"https://github.com/caskdata/cdap/pull/3958#discussion_r39575386","pull_request_url":"https://api.github.com/repos/caskdata/cdap/pulls/3958","_links":{"self":{"href":"https://api.github.com/repos/caskdata/cdap/pulls/comments/39575386"},"html":{"href":"https://github.com/caskdata/cdap/pull/3958#discussion_r39575386"},"pull_request":{"href":"https://api.github.com/repos/caskdata/cdap/pulls/3958"}}},"pull_request":{"url":"https://api.github.com/repos/caskdata/cdap/pulls/3958","id":45106816,"html_url":"https://github.com/caskdata/cdap/pull/3958","diff_url":"https://github.com/caskdata/cdap/pull/3958.diff","patch_url":"https://github.com/caskdata/cdap/pull/3958.patch","issue_url":"https://api.github.com/repos/caskdata/cdap/issues/3958","number":3958,"state":"open","locked":false,"title":"CDAP-3604 Localize plugin Jars for both standalone and distributed runs","user":{"login":"gokulavasan","id":558459,"avatar_url":"https://avatars.githubusercontent.com/u/558459?v=3","gravatar_id":"","url":"https://api.github.com/users/gokulavasan","html_url":"https://github.com/gokulavasan","followers_url":"https://api.github.com/users/gokulavasan/followers","following_url":"https://api.github.com/users/gokulavasan/following{/other_user}","gists_url":"https://api.github.com/users/gokulavasan/gists{/gist_id}","starred_url":"https://api.github.com/users/gokulavasan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gokulavasan/subscriptions","organizations_url":"https://api.github.com/users/gokulavasan/orgs","repos_url":"https://api.github.com/users/gokulavasan/repos","events_url":"https://api.github.com/users/gokulavasan/events{/privacy}","received_events_url":"https://api.github.com/users/gokulavasan/received_events","type":"User","site_admin":false},"body":"JIRA : https://issues.cask.co/browse/CDAP-3604\r\n\r\nBuild : http://builds.cask.co/browse/CDAP-RBT422-1","created_at":"2015-09-15T21:47:33Z","updated_at":"2015-09-15T22:43:28Z","closed_at":null,"merged_at":null,"merge_commit_sha":"f5bf2a7b676f9c967c1f754594eabe36021d08e0","assignee":{"login":"albertshau","id":5215004,"avatar_url":"https://avatars.githubusercontent.com/u/5215004?v=3","gravatar_id":"","url":"https://api.github.com/users/albertshau","html_url":"https://github.com/albertshau","followers_url":"https://api.github.com/users/albertshau/followers","following_url":"https://api.github.com/users/albertshau/following{/other_user}","gists_url":"https://api.github.com/users/albertshau/gists{/gist_id}","starred_url":"https://api.github.com/users/albertshau/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/albertshau/subscriptions","organizations_url":"https://api.github.com/users/albertshau/orgs","repos_url":"https://api.github.com/users/albertshau/repos","events_url":"https://api.github.com/users/albertshau/events{/privacy}","received_events_url":"https://api.github.com/users/albertshau/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/caskdata/cdap/pulls/3958/commits","review_comments_url":"https://api.github.com/repos/caskdata/cdap/pulls/3958/comments","review_comment_url":"https://api.github.com/repos/caskdata/cdap/pulls/comments{/number}","comments_url":"https://api.github.com/repos/caskdata/cdap/issues/3958/comments","statuses_url":"https://api.github.com/repos/caskdata/cdap/statuses/28974180337583f97812e951d99bf6afde31062a","head":{"label":"caskdata:fix/cdap-3594","ref":"fix/cdap-3594","sha":"28974180337583f97812e951d99bf6afde31062a","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}","created_at":"2014-08-02T09:00:10Z","updated_at":"2015-09-13T05:41:31Z","pushed_at":"2015-09-15T22:36:12Z","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":861841,"stargazers_count":67,"watchers_count":67,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":19,"mirror_url":null,"open_issues_count":10,"forks":19,"open_issues":10,"watchers":67,"default_branch":"develop"}},"base":{"label":"caskdata:release/3.2","ref":"release/3.2","sha":"cf5ea04cfad642af3953823938c72aee0a79aea2","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}","created_at":"2014-08-02T09:00:10Z","updated_at":"2015-09-13T05:41:31Z","pushed_at":"2015-09-15T22:36:12Z","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":861841,"stargazers_count":67,"watchers_count":67,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":19,"mirror_url":null,"open_issues_count":10,"forks":19,"open_issues":10,"watchers":67,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/caskdata/cdap/pulls/3958"},"html":{"href":"https://github.com/caskdata/cdap/pull/3958"},"issue":{"href":"https://api.github.com/repos/caskdata/cdap/issues/3958"},"comments":{"href":"https://api.github.com/repos/caskdata/cdap/issues/3958/comments"},"review_comments":{"href":"https://api.github.com/repos/caskdata/cdap/pulls/3958/comments"},"review_comment":{"href":"https://api.github.com/repos/caskdata/cdap/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/caskdata/cdap/pulls/3958/commits"},"statuses":{"href":"https://api.github.com/repos/caskdata/cdap/statuses/28974180337583f97812e951d99bf6afde31062a"}}}}