{"action":"created","comment":{"url":"https://api.github.com/repos/apache/storm/pulls/comments/50899194","id":50899194,"diff_hunk":"@@ -1382,5 +1422,438 @@ public static TopologyInfo getTopologyInfo(String name, String asUser, Map storm\n     public static int toPositive(int number) {\n         return number & Integer.MAX_VALUE;\n     }\n-}\n \n+\n+\n+    //Everything from here on is translated from the old util.clj (storm-core/src/clj/backtype.storm/util.clj)\n+\n+    //Wraps an exception in a RuntimeException if needed\n+    public static Exception wrapInRuntime (Exception e) {\n+        if (e instanceof RuntimeException) {\n+            return e;\n+        } else {\n+            return (new RuntimeException(e));\n+        }\n+    }\n+\n+    public static final boolean isOnWindows = \"Windows_NT\".equals(System.getenv(\"OS\"));\n+\n+    public static final String filePathSeparator = System.getProperty(\"file.separator\");\n+\n+    public static final String classPathSeparator = System.getProperty(\"path.separator\");\n+\n+\n+    /*\n+        Returns the first item of coll for which (pred item) returns logical true.\n+        Consumes sequences up to the first match, will consume the entire sequence\n+        and return nil if no match is found.\n+     */\n+    public static Object findFirst (IPredicate pred, Collection coll) {\n+        if (coll == null || pred == null) {\n+            return null;\n+        } else {\n+            Iterator<Object> iter = coll.iterator();\n+            if (iter==null || !iter.hasNext()) {\n+                return null;\n+            } else {\n+                do {\n+                    Object obj = iter.next();\n+                    if (pred.test(obj)) {\n+                        return obj;\n+                    }\n+                } while (iter.hasNext());\n+                return null;\n+            }\n+        }\n+    }\n+\n+    public static Object findFirst (IPredicate pred, Map map) {\n+        if (map == null || pred == null) {\n+            return null;\n+        } else {\n+            Iterator<Object> iter = map.entrySet().iterator();\n+            if (iter==null || !iter.hasNext()) {\n+                return null;\n+            } else {\n+                do {\n+                    Object obj = iter.next();\n+                    if (pred.test(obj)) {\n+                        return obj;\n+                    }\n+                } while (iter.hasNext());\n+                return null;\n+            }\n+        }\n+    }\n+    /*\n+        Note: since the following functions are nowhere used in Storm, they were not translated:\n+        dissoc-in\n+        indexed\n+        positions\n+        assoc-conj\n+        set-delta\n+\n+        clojurify-structure  because it wouldn't make sense without clojure\n+     */\n+\n+\n+    public static String localHostname () throws UnknownHostException {\n+        return _instance.localHostnameImpl();\n+    }\n+\n+    protected String localHostnameImpl () throws UnknownHostException {\n+        return InetAddress.getLocalHost().getCanonicalHostName();\n+    }\n+\n+    private static String memoizedLocalHostnameString = null;\n+\n+    public static String memoizedLocalHostname () throws UnknownHostException {\n+        if (memoizedLocalHostnameString == null) {\n+            memoizedLocalHostnameString = localHostname();\n+        }\n+        return memoizedLocalHostnameString;\n+    }\n+\n+    /*\n+        checks conf for STORM_LOCAL_HOSTNAME.\n+        when unconfigured, falls back to (memoized) guess by `local-hostname`.\n+    */\n+    public static String hostname (Map<String, Object> conf) throws UnknownHostException  {\n+        if (conf == null) {\n+            return memoizedLocalHostname();\n+        }\n+        Object hostnameString = conf.get(Config.STORM_LOCAL_HOSTNAME);\n+        if (hostnameString == null ) {\n+            return memoizedLocalHostname();\n+        }\n+        if (hostnameString.equals(\"\")) {\n+            return memoizedLocalHostname();\n+        }\n+        return hostnameString.toString();\n+    }\n+\n+    public static String uuid() {\n+        return UUID.randomUUID().toString();\n+    }\n+\n+    public static int currentTimeSecs() {\n+        return Time.currentTimeSecs();\n+    }\n+\n+    public static long currentTimeMillis() {\n+        return Time.currentTimeMillis();\n+    }\n+\n+    public static long secsToMillisLong(double secs) {\n+        return (long) (1000 * secs);\n+    }\n+\n+    public static Vector<String> tokenizePath (String path) {\n+        String[] tokens = path.split(\"/\");\n+        Vector<String> outputs = new Vector<String>();\n+        if (tokens == null || tokens.length == 0) {\n+            return null;\n+        }\n+        for (String tok: tokens) {\n+            if (!tok.isEmpty()) {\n+                outputs.add(tok);\n+            }\n+        }\n+        return outputs;\n+    }\n+\n+    public static String parentPath(String path) {\n+        if (path == null) {\n+            return \"/\";\n+        }\n+        Vector<String> tokens = tokenizePath(path);\n+        int length = tokens.size();\n+        if (length == 0) {\n+            return \"/\";\n+        }\n+        String output = \"\";\n+        for (int i = 0; i < length - 1; i++) {  //length - 1 to mimic \"butlast\" from the old clojure code\n+            output = output + \"/\" + tokens.get(i);\n+        }\n+        return output;\n+    }\n+\n+    public static String toksToPath (Vector<String> toks) {\n+        if (toks == null) {\n+            return \"/\";\n+        }\n+        int length = toks.size();\n+        if (length == 0) {\n+            return \"/\";\n+        }\n+        String output = \"\";\n+        for (int i = 0; i < length; i++) {\n+            output = output + \"/\" + toks.get(i);\n+        }\n+        return output;\n+    }\n+    public static String normalizePath (String path) {\n+        return toksToPath(tokenizePath(path));\n+    }\n+\n+    /* TODO: This function was originally written to replace map-val in util.clj. But we decided to change the coding\n+             style in the caller functions to a more Java style for loop. This is mentioned in TODOs across the clojure\n+             files.\n+     */\n+    public static Map mapVal (IFn aFn, Map amap) {\n+        Map newMap = new HashMap();\n+        if (amap == null) {\n+            return newMap;\n+        }\n+        if (amap.keySet()==null) {\n+            return newMap;\n+        }\n+        for (Object key: amap.keySet()) {\n+            Object value = amap.get(key);\n+            if (value == null) {\n+                newMap.put(key, null);\n+            } else {\n+                Object newValue = aFn.eval(value);\n+                newMap.put(key, newValue);\n+            }\n+        }\n+        return newMap;\n+    }\n+\n+    /* TODO: This function was originally written to replace map-val in util.clj. But we decided to change the coding\n+         style in the caller functions to a more Java style for loop. This is mentioned in TODOs across the clojure\n+         files.\n+    */\n+//    public static Map filterVal(IPredicate aFn, Map amap) {\n+//        Map newMap = new HashMap();\n+//        if (amap == null) {\n+//            return newMap;\n+//        }\n+//        for (Object key: amap.keySet()) {\n+//            Object value = amap.get(key);\n+//            if(aFn.test(value)) {\n+//                newMap.put(key, value);\n+//            }\n+//        }\n+//        return newMap;\n+//    }\n+\n+    /* TODO: This function was originally written to replace filter-key in util.clj. But we decided to change the coding\n+         style in the caller functions to a more Java style for loop + if conditionals. This is mentioned in TODOs\n+         across the clojure files.\n+    */\n+//    public static Map filterKey(IPredicate aFn, Map amap) {\n+//        Map newMap = new HashMap();\n+//        if (amap == null) {\n+//            return newMap;\n+//        }\n+//        for (Object key: amap.keySet()) {\n+//            Object value = amap.get(key);\n+//            if(aFn.test(key)) {\n+//                newMap.put(key, value);\n+//            }\n+//        }\n+//        return newMap;\n+//    }\n+\n+    /* TODO: This function was originally written to replace map-key in util.clj. But we decided to change the coding\n+         style in the caller functions to a more Java style for loop. This is mentioned in TODOs across the clojure\n+         files.\n+    */\n+//    public static Map mapKey (IFn aFn, Map amap) {\n+//        Map newMap = new HashMap();\n+//        if (amap == null) {\n+//            return newMap;\n+//        }\n+//        for (Object key: amap.keySet()) {\n+//            Object value = amap.get(key);\n+//            Object newKey = aFn.eval(key);\n+//            newMap.put(newKey, value);\n+//        }\n+//        return newMap;\n+//    }\n+\n+    /* TODO: This function was originally written to replace separate in util.clj. But since it was only used in\n+    transactional_test.clj, the separate function was moved there for now.\n+    */\n+    public static Vector<Collection> separate (IPredicate pred, Collection aseq) {\n+        Vector<Collection> outputVector = new Vector<Collection>();\n+        Collection pass = new HashSet();\n+        Collection notPass = new HashSet();\n+        for (Object obj: aseq) {\n+            if (pred.test(obj)) {\n+                pass.add(obj);\n+            } else {\n+                notPass.add(obj);\n+            }\n+        }\n+        outputVector.add(pass);\n+        outputVector.add(notPass);\n+        return outputVector;\n+    }\n+\n+    public static void exitProcess (int val, Object... msg) {\n+        String combinedErrorMessage = \"\";\n+        for (Object oneMessage: msg) {\n+            combinedErrorMessage = combinedErrorMessage + oneMessage.toString();\n+        }\n+        LOG.error(\"halting process: \" + combinedErrorMessage, new RuntimeException(combinedErrorMessage));\n+        Runtime.getRuntime().exit(val);\n+    }\n+\n+    public static Double sum(Collection<Number> vals) {\n+        double sum = 0.0;\n+        double dVal;\n+        if (vals == null) {\n+            return 0.0;\n+        }\n+        for (Number val: vals) {\n+            dVal = val.doubleValue();\n+            sum = sum + dVal;\n+        }\n+        return new Double(sum);\n+    }\n+\n+\n+    public static Object defaulted(Object val, Object defaultObj) {\n+        if (val != null) {\n+            return val;\n+        } else {\n+            return defaultObj;\n+        }\n+    }\n+\n+    /**\n+     * Deletes a file or directory and its contents if it exists. Does not\n+     * complain if the input is null or does not exist.\n+     * @param path the path to the file or directory\n+     */\n+    public static void forceDelete(String path) {\n+        _instance.forceDeleteImpl(path);\n+    }\n+\n+    protected void forceDeleteImpl(String path) {\n+        LOG.debug(\"Deleting path {}\", path);\n+        if (checkFileExists(path)) {\n+            try {\n+                FileUtils.forceDelete(new File(path));\n+            } catch (IOException ignored) {}\n+        }\n+    }\n+\n+    /**\n+     * Creates a symbolic link to the target\n+     * @param dir the parent directory of the link\n+     * @param targetDir the parent directory of the link's target\n+     * @param targetFilename the file name of the links target\n+     * @param filename the file name of the link\n+     * @return the path of the link if it did not exist, otherwise null\n+     * @throws IOException\n+     */\n+    public static Path createSymlink(String dir, String targetDir,\n+            String targetFilename, String filename) throws IOException {\n+        Path path = Paths.get(dir, filename).toAbsolutePath();\n+        Path target = Paths.get(targetDir, targetFilename).toAbsolutePath();","path":"storm-core/src/jvm/org/apache/storm/utils/Utils.java","position":471,"original_position":471,"commit_id":"69c3ab748684db5a35f8abf6ca61fe7cfc45894c","original_commit_id":"69c3ab748684db5a35f8abf6ca61fe7cfc45894c","user":{"login":"revans2","id":3441321,"avatar_url":"https://avatars.githubusercontent.com/u/3441321?v=3","gravatar_id":"","url":"https://api.github.com/users/revans2","html_url":"https://github.com/revans2","followers_url":"https://api.github.com/users/revans2/followers","following_url":"https://api.github.com/users/revans2/following{/other_user}","gists_url":"https://api.github.com/users/revans2/gists{/gist_id}","starred_url":"https://api.github.com/users/revans2/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/revans2/subscriptions","organizations_url":"https://api.github.com/users/revans2/orgs","repos_url":"https://api.github.com/users/revans2/repos","events_url":"https://api.github.com/users/revans2/events{/privacy}","received_events_url":"https://api.github.com/users/revans2/received_events","type":"User","site_admin":false},"body":"Didn't have them before.","created_at":"2016-01-26T21:01:11Z","updated_at":"2016-01-26T21:01:11Z","html_url":"https://github.com/apache/storm/pull/1043#discussion_r50899194","pull_request_url":"https://api.github.com/repos/apache/storm/pulls/1043","_links":{"self":{"href":"https://api.github.com/repos/apache/storm/pulls/comments/50899194"},"html":{"href":"https://github.com/apache/storm/pull/1043#discussion_r50899194"},"pull_request":{"href":"https://api.github.com/repos/apache/storm/pulls/1043"}}},"pull_request":{"url":"https://api.github.com/repos/apache/storm/pulls/1043","id":57105127,"html_url":"https://github.com/apache/storm/pull/1043","diff_url":"https://github.com/apache/storm/pull/1043.diff","patch_url":"https://github.com/apache/storm/pull/1043.patch","issue_url":"https://api.github.com/repos/apache/storm/issues/1043","number":1043,"state":"open","locked":false,"title":"Storm 1226","user":{"login":"rfarivar","id":8742608,"avatar_url":"https://avatars.githubusercontent.com/u/8742608?v=3","gravatar_id":"","url":"https://api.github.com/users/rfarivar","html_url":"https://github.com/rfarivar","followers_url":"https://api.github.com/users/rfarivar/followers","following_url":"https://api.github.com/users/rfarivar/following{/other_user}","gists_url":"https://api.github.com/users/rfarivar/gists{/gist_id}","starred_url":"https://api.github.com/users/rfarivar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rfarivar/subscriptions","organizations_url":"https://api.github.com/users/rfarivar/orgs","repos_url":"https://api.github.com/users/rfarivar/repos","events_url":"https://api.github.com/users/rfarivar/events{/privacy}","received_events_url":"https://api.github.com/users/rfarivar/received_events","type":"User","site_admin":false},"body":"This is translating util.clj into java functions mostly in utils/Utils.java. \r\n\r\nTranslation is half way done, passing all unit tests. Putting the pull request up to get reviews. ","created_at":"2016-01-25T17:47:12Z","updated_at":"2016-01-26T21:01:11Z","closed_at":null,"merged_at":null,"merge_commit_sha":"157c244648708b5d0b51246724e1b57a319f7e9b","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/apache/storm/pulls/1043/commits","review_comments_url":"https://api.github.com/repos/apache/storm/pulls/1043/comments","review_comment_url":"https://api.github.com/repos/apache/storm/pulls/comments{/number}","comments_url":"https://api.github.com/repos/apache/storm/issues/1043/comments","statuses_url":"https://api.github.com/repos/apache/storm/statuses/69c3ab748684db5a35f8abf6ca61fe7cfc45894c","head":{"label":"rfarivar:STORM-1226","ref":"STORM-1226","sha":"69c3ab748684db5a35f8abf6ca61fe7cfc45894c","user":{"login":"rfarivar","id":8742608,"avatar_url":"https://avatars.githubusercontent.com/u/8742608?v=3","gravatar_id":"","url":"https://api.github.com/users/rfarivar","html_url":"https://github.com/rfarivar","followers_url":"https://api.github.com/users/rfarivar/followers","following_url":"https://api.github.com/users/rfarivar/following{/other_user}","gists_url":"https://api.github.com/users/rfarivar/gists{/gist_id}","starred_url":"https://api.github.com/users/rfarivar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rfarivar/subscriptions","organizations_url":"https://api.github.com/users/rfarivar/orgs","repos_url":"https://api.github.com/users/rfarivar/repos","events_url":"https://api.github.com/users/rfarivar/events{/privacy}","received_events_url":"https://api.github.com/users/rfarivar/received_events","type":"User","site_admin":false},"repo":{"id":31548918,"name":"storm","full_name":"rfarivar/storm","owner":{"login":"rfarivar","id":8742608,"avatar_url":"https://avatars.githubusercontent.com/u/8742608?v=3","gravatar_id":"","url":"https://api.github.com/users/rfarivar","html_url":"https://github.com/rfarivar","followers_url":"https://api.github.com/users/rfarivar/followers","following_url":"https://api.github.com/users/rfarivar/following{/other_user}","gists_url":"https://api.github.com/users/rfarivar/gists{/gist_id}","starred_url":"https://api.github.com/users/rfarivar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rfarivar/subscriptions","organizations_url":"https://api.github.com/users/rfarivar/orgs","repos_url":"https://api.github.com/users/rfarivar/repos","events_url":"https://api.github.com/users/rfarivar/events{/privacy}","received_events_url":"https://api.github.com/users/rfarivar/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/rfarivar/storm","description":"Mirror of Apache Storm","fork":true,"url":"https://api.github.com/repos/rfarivar/storm","forks_url":"https://api.github.com/repos/rfarivar/storm/forks","keys_url":"https://api.github.com/repos/rfarivar/storm/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rfarivar/storm/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rfarivar/storm/teams","hooks_url":"https://api.github.com/repos/rfarivar/storm/hooks","issue_events_url":"https://api.github.com/repos/rfarivar/storm/issues/events{/number}","events_url":"https://api.github.com/repos/rfarivar/storm/events","assignees_url":"https://api.github.com/repos/rfarivar/storm/assignees{/user}","branches_url":"https://api.github.com/repos/rfarivar/storm/branches{/branch}","tags_url":"https://api.github.com/repos/rfarivar/storm/tags","blobs_url":"https://api.github.com/repos/rfarivar/storm/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rfarivar/storm/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rfarivar/storm/git/refs{/sha}","trees_url":"https://api.github.com/repos/rfarivar/storm/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rfarivar/storm/statuses/{sha}","languages_url":"https://api.github.com/repos/rfarivar/storm/languages","stargazers_url":"https://api.github.com/repos/rfarivar/storm/stargazers","contributors_url":"https://api.github.com/repos/rfarivar/storm/contributors","subscribers_url":"https://api.github.com/repos/rfarivar/storm/subscribers","subscription_url":"https://api.github.com/repos/rfarivar/storm/subscription","commits_url":"https://api.github.com/repos/rfarivar/storm/commits{/sha}","git_commits_url":"https://api.github.com/repos/rfarivar/storm/git/commits{/sha}","comments_url":"https://api.github.com/repos/rfarivar/storm/comments{/number}","issue_comment_url":"https://api.github.com/repos/rfarivar/storm/issues/comments{/number}","contents_url":"https://api.github.com/repos/rfarivar/storm/contents/{+path}","compare_url":"https://api.github.com/repos/rfarivar/storm/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rfarivar/storm/merges","archive_url":"https://api.github.com/repos/rfarivar/storm/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rfarivar/storm/downloads","issues_url":"https://api.github.com/repos/rfarivar/storm/issues{/number}","pulls_url":"https://api.github.com/repos/rfarivar/storm/pulls{/number}","milestones_url":"https://api.github.com/repos/rfarivar/storm/milestones{/number}","notifications_url":"https://api.github.com/repos/rfarivar/storm/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rfarivar/storm/labels{/name}","releases_url":"https://api.github.com/repos/rfarivar/storm/releases{/id}","deployments_url":"https://api.github.com/repos/rfarivar/storm/deployments","created_at":"2015-03-02T16:08:53Z","updated_at":"2016-01-13T20:06:17Z","pushed_at":"2016-01-25T17:45:20Z","git_url":"git://github.com/rfarivar/storm.git","ssh_url":"git@github.com:rfarivar/storm.git","clone_url":"https://github.com/rfarivar/storm.git","svn_url":"https://github.com/rfarivar/storm","homepage":null,"size":28520,"stargazers_count":0,"watchers_count":0,"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":0,"default_branch":"master"}},"base":{"label":"apache:master","ref":"master","sha":"36f03ed7e6031ee3a212ba38f051615ea3c6584d","user":{"login":"apache","id":47359,"avatar_url":"https://avatars.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":14135470,"name":"storm","full_name":"apache/storm","owner":{"login":"apache","id":47359,"avatar_url":"https://avatars.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/storm","description":"Mirror of Apache Storm","fork":false,"url":"https://api.github.com/repos/apache/storm","forks_url":"https://api.github.com/repos/apache/storm/forks","keys_url":"https://api.github.com/repos/apache/storm/keys{/key_id}","collaborators_url":"https://api.github.com/repos/apache/storm/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/apache/storm/teams","hooks_url":"https://api.github.com/repos/apache/storm/hooks","issue_events_url":"https://api.github.com/repos/apache/storm/issues/events{/number}","events_url":"https://api.github.com/repos/apache/storm/events","assignees_url":"https://api.github.com/repos/apache/storm/assignees{/user}","branches_url":"https://api.github.com/repos/apache/storm/branches{/branch}","tags_url":"https://api.github.com/repos/apache/storm/tags","blobs_url":"https://api.github.com/repos/apache/storm/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/apache/storm/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/apache/storm/git/refs{/sha}","trees_url":"https://api.github.com/repos/apache/storm/git/trees{/sha}","statuses_url":"https://api.github.com/repos/apache/storm/statuses/{sha}","languages_url":"https://api.github.com/repos/apache/storm/languages","stargazers_url":"https://api.github.com/repos/apache/storm/stargazers","contributors_url":"https://api.github.com/repos/apache/storm/contributors","subscribers_url":"https://api.github.com/repos/apache/storm/subscribers","subscription_url":"https://api.github.com/repos/apache/storm/subscription","commits_url":"https://api.github.com/repos/apache/storm/commits{/sha}","git_commits_url":"https://api.github.com/repos/apache/storm/git/commits{/sha}","comments_url":"https://api.github.com/repos/apache/storm/comments{/number}","issue_comment_url":"https://api.github.com/repos/apache/storm/issues/comments{/number}","contents_url":"https://api.github.com/repos/apache/storm/contents/{+path}","compare_url":"https://api.github.com/repos/apache/storm/compare/{base}...{head}","merges_url":"https://api.github.com/repos/apache/storm/merges","archive_url":"https://api.github.com/repos/apache/storm/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/apache/storm/downloads","issues_url":"https://api.github.com/repos/apache/storm/issues{/number}","pulls_url":"https://api.github.com/repos/apache/storm/pulls{/number}","milestones_url":"https://api.github.com/repos/apache/storm/milestones{/number}","notifications_url":"https://api.github.com/repos/apache/storm/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/apache/storm/labels{/name}","releases_url":"https://api.github.com/repos/apache/storm/releases{/id}","deployments_url":"https://api.github.com/repos/apache/storm/deployments","created_at":"2013-11-05T08:00:14Z","updated_at":"2016-01-26T18:20:51Z","pushed_at":"2016-01-26T19:13:41Z","git_url":"git://github.com/apache/storm.git","ssh_url":"git@github.com:apache/storm.git","clone_url":"https://github.com/apache/storm.git","svn_url":"https://github.com/apache/storm","homepage":null,"size":157594,"stargazers_count":2780,"watchers_count":2780,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":2083,"mirror_url":"git://git.apache.org/storm.git","open_issues_count":66,"forks":2083,"open_issues":66,"watchers":2780,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/apache/storm/pulls/1043"},"html":{"href":"https://github.com/apache/storm/pull/1043"},"issue":{"href":"https://api.github.com/repos/apache/storm/issues/1043"},"comments":{"href":"https://api.github.com/repos/apache/storm/issues/1043/comments"},"review_comments":{"href":"https://api.github.com/repos/apache/storm/pulls/1043/comments"},"review_comment":{"href":"https://api.github.com/repos/apache/storm/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/apache/storm/pulls/1043/commits"},"statuses":{"href":"https://api.github.com/repos/apache/storm/statuses/69c3ab748684db5a35f8abf6ca61fe7cfc45894c"}}}}