{"action":"created","comment":{"url":"https://api.github.com/repos/apache/commons-lang/pulls/comments/29613233","id":29613233,"diff_hunk":"@@ -0,0 +1,461 @@\n+/*\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\n+ * contributor license agreements.  See the NOTICE file distributed with\n+ * this work for additional information regarding copyright ownership.\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\n+ * (the \"License\"); you may not use this file except in compliance with\n+ * the License.  You may obtain a copy of 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,\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+ * See the License for the specific language governing permissions and\n+ * limitations under the License.\n+ */\n+package org.apache.commons.lang3;\n+\n+import java.util.ArrayList;\n+import java.util.Collection;\n+import java.util.Collections;\n+import java.util.List;\n+\n+/**\n+ * <p>\n+ * Helpers for {@code java.lang.Thread} and {@code java.lang.ThreadGroup}.\n+ * </p>\n+ * <p>\n+ * #ThreadSafe#\n+ * </p>\n+ *\n+ * @see java.lang.Thread\n+ * @see java.lang.ThreadGroup\n+ * @since 3.5\n+ * @version $Id$\n+ */\n+public class ThreadUtils {\n+\n+    /**\n+     * Return the active thread with the specified id if it belong's to the specified thread group.\n+     *\n+     * @param threadId The thread id\n+     * @param threadGroup The thread group\n+     * @return The thread which belongs to a specified thread group and the thread's id match the specified id.\n+     * {@code null} is returned if no such thread exists\n+     * @throws IllegalArgumentException if the specified id is zero or negative or the group is null\n+     * @throws  SecurityException\n+     *          if the current thread cannot access the system thread group\n+     *\n+     * @throws  SecurityException  if the current thread cannot modify\n+     *          thread groups from this thread's thread group up to the system thread group\n+     */\n+    public static Thread findThreadById(final long threadId, final ThreadGroup threadGroup) {\n+        if (threadGroup == null) {\n+            throw new IllegalArgumentException(\"The thread group must not be null\");\n+        }\n+        final Thread thread = findThreadById(threadId);\n+        if(thread != null && threadGroup.equals(thread.getThreadGroup())) {\n+            return thread;\n+        }\n+        return null;\n+    }\n+\n+    /**\n+     * Return the active thread with the specified id if it belong's to a thread group with the specified group name.\n+     *\n+     * @param threadId The thread id\n+     * @param threadGroupName The thread group name\n+     * @return The threads which belongs to a thread group with the specified group name and the thread's id match the specified id.\n+     * {@code null} is returned if no such thread exists\n+     * @throws IllegalArgumentException if the specified id is zero or negative or the group name is null\n+     * @throws  SecurityException\n+     *          if the current thread cannot access the system thread group\n+     *\n+     * @throws  SecurityException  if the current thread cannot modify\n+     *          thread groups from this thread's thread group up to the system thread group\n+     */\n+    public static Thread findThreadById(final long threadId, final String threadGroupName) {\n+        if (threadGroupName == null) {\n+            throw new IllegalArgumentException(\"The thread group name must not be null\");\n+        }\n+        final Thread thread = findThreadById(threadId);\n+        if(thread != null && thread.getThreadGroup() != null && thread.getThreadGroup().getName().equals(threadGroupName)) {\n+            return thread;\n+        }\n+        return null;\n+    }\n+\n+    /**\n+     * Return active threads with the specified name if they belong to a specified thread group.\n+     *\n+     * @param threadName The thread name\n+     * @param threadGroupName The thread group\n+     * @return The threads which belongs to a thread group and the thread's name match the specified name,\n+     * An empty collection is returned if no such thread exists. The collection returned is always unmodifiable.\n+     * @throws IllegalArgumentException if the specified thread name or group is null\n+     * @throws  SecurityException\n+     *          if the current thread cannot access the system thread group\n+     *\n+     * @throws  SecurityException  if the current thread cannot modify\n+     *          thread groups from this thread's thread group up to the system thread group\n+     */\n+    public static Collection<Thread> findThreadsByName(final String threadName, final ThreadGroup threadGroup) {\n+        return findThreads(threadGroup, false, new NamePredicate(threadName));\n+    }\n+\n+    /**\n+     * Return active threads with the specified name if they belong to a thread group with the specified group name.\n+     *\n+     * @param threadName The thread name\n+     * @param threadGroupName The thread group name\n+     * @return The threads which belongs to a thread group with the specified group name and the thread's name match the specified name,\n+     * An empty collection is returned if no such thread exists. The collection returned is always unmodifiable.\n+     * @throws IllegalArgumentException if the specified thread name or group name is null\n+     * @throws  SecurityException\n+     *          if the current thread cannot access the system thread group\n+     *\n+     * @throws  SecurityException  if the current thread cannot modify\n+     *          thread groups from this thread's thread group up to the system thread group\n+     */\n+    public static Collection<Thread> findThreadsByName(final String threadName, final String threadGroupName) {\n+        if (threadName == null) {\n+            throw new IllegalArgumentException(\"The thread name must not be null\");\n+        }\n+        if (threadGroupName == null) {\n+            throw new IllegalArgumentException(\"The thread group name must not be null\");\n+        }\n+\n+        final Collection<Thread> result = new ArrayList<Thread>();\n+        NamePredicate threadNamePredicate = null;\n+        for(final ThreadGroup group : findThreadGroups(new NamePredicate(threadGroupName))) {\n+            result.addAll(findThreads(group, false, threadNamePredicate==null?(threadNamePredicate=new NamePredicate(threadName)):threadNamePredicate));\n+        }\n+        return Collections.unmodifiableCollection(result);\n+    }\n+\n+    /**\n+     * Return active thread groups with the specified group name.\n+     *\n+     * @param threadGroupName The thread group name\n+     * @return the thread groups with the specified group name or an empty collection if no such thread group exists. The collection returned is always unmodifiable.\n+     * @throws IllegalArgumentException if group name is null\n+     * @throws  SecurityException\n+     *          if the current thread cannot access the system thread group\n+     *\n+     * @throws  SecurityException  if the current thread cannot modify\n+     *          thread groups from this thread's thread group up to the system thread group\n+     */\n+    public static Collection<ThreadGroup> findThreadGroupsByName(final String threadGroupName) {\n+        return findThreadGroups(new NamePredicate(threadGroupName));\n+    }\n+\n+    /**\n+     * Return all active thread groups excluding the system thread group (A thread group is active if it has been not destroyed).\n+     *\n+     * @return all thread groups excluding the system thread group. The collection returned is always unmodifiable.\n+     * @throws  SecurityException\n+     *          if the current thread cannot access the system thread group\n+     *\n+     * @throws  SecurityException  if the current thread cannot modify\n+     *          thread groups from this thread's thread group up to the system thread group\n+     */\n+    public static Collection<ThreadGroup> getAllThreadGroups() {\n+        return findThreadGroups(ALWAYS_TRUE_PREDICATE);\n+    }\n+\n+    /**\n+     * Return the system thread group (sometimes also referred as \"root thread group\").\n+     *\n+     * @return the system thread group\n+     * @throws  SecurityException  if the current thread cannot modify\n+     *          thread groups from this thread's thread group up to the system thread group\n+     */\n+    public static ThreadGroup getSystemThreadGroup() {\n+        ThreadGroup threadGroup = Thread.currentThread().getThreadGroup();\n+        while(threadGroup.getParent() != null) {\n+            threadGroup = threadGroup.getParent();\n+        }\n+        return threadGroup;\n+    }\n+\n+    /**\n+     * Return all active threads (A thread is active if it has been started and has not yet died).\n+     *\n+     * @return all active threads. The collection returned is always unmodifiable.\n+     * @throws  SecurityException\n+     *          if the current thread cannot access the system thread group\n+     *\n+     * @throws  SecurityException  if the current thread cannot modify\n+     *          thread groups from this thread's thread group up to the system thread group\n+     */\n+    public static Collection<Thread> getAllThreads() {\n+        return findThreads(ALWAYS_TRUE_PREDICATE);\n+    }\n+\n+    /**\n+     * Return active threads with the specified name.\n+     *\n+     * @param threadName The thread name\n+     * @return The threads with the specified name or an empty collection if no such thread exists. The collection returned is always unmodifiable.\n+     * @throws IllegalArgumentException if the specified name is null\n+     * @throws  SecurityException\n+     *          if the current thread cannot access the system thread group\n+     *\n+     * @throws  SecurityException  if the current thread cannot modify\n+     *          thread groups from this thread's thread group up to the system thread group\n+     */\n+    public static Collection<Thread> findThreadsByName(final String threadName) {\n+        return findThreads(new NamePredicate(threadName));\n+    }\n+\n+    /**\n+     * Return the active thread with the specified id.\n+     *\n+     * @param threadId The thread id\n+     * @return The thread with the specified id or {@code null} if no such thread exists\n+     * @throws IllegalArgumentException if the specified id is zero or negative\n+     * @throws  SecurityException\n+     *          if the current thread cannot access the system thread group\n+     *\n+     * @throws  SecurityException  if the current thread cannot modify\n+     *          thread groups from this thread's thread group up to the system thread group\n+     */\n+    public static Thread findThreadById(final long threadId) {\n+        final Collection<Thread> result = findThreads(new ThreadIdPredicate(threadId));\n+\n+        if(result.isEmpty()) {\n+            return null;\n+        } else {\n+            return result.iterator().next();\n+        }\n+\n+    }\n+\n+    /**\n+     * <p>\n+     * ThreadUtils instances should NOT be constructed in standard programming. Instead, the class should be used as\n+     * {@code ThreadUtils.getAllThreads()}\n+     * </p>\n+     * <p>\n+     * This constructor is public to permit tools that require a JavaBean instance to operate.\n+     * </p>\n+     */\n+    public ThreadUtils() {\n+        super();\n+    }\n+\n+    /**\n+     * A predicate for selecting threads.\n+     */\n+    //if java minimal version for lang becomes 1.8 extend this interface from java.util.function.Predicate\n+    public static interface ThreadPredicate /*extends java.util.function.Predicate<Thread>*/{\n+\n+        /**\n+         * Evaluates this predicate on the given thread.\n+         * @param thread the thread\n+         * @return {@code true} if the thread matches the predicate, otherwise {@code false}\n+         */\n+        boolean test(Thread thread);\n+    }\n+\n+    /**\n+     * A predicate for selecting threadgroups.\n+     */\n+    //if java minimal version for lang becomes 1.8 extend this interface from java.util.function.Predicate\n+    public static interface ThreadGroupPredicate /*extends java.util.function.Predicate<ThreadGroup>*/{\n+        \n+        /**\n+         * Evaluates this predicate on the given threadgroup.\n+         * @param threadGroup the threadgroup\n+         * @return {@code true} if the threadGroup matches the predicate, otherwise {@code false}\n+         */\n+        boolean test(ThreadGroup threadGroup);\n+    }\n+\n+    /**\n+     * Predicate which always returns true.\n+     */\n+    public static final AlwaysTruePredicate ALWAYS_TRUE_PREDICATE = new AlwaysTruePredicate();\n+\n+    /**\n+     * A predicate implementation which always returns true.\n+     */\n+    private final static class AlwaysTruePredicate implements ThreadPredicate, ThreadGroupPredicate{\n+\n+        private AlwaysTruePredicate() {\n+        }\n+\n+        @Override\n+        public boolean test(@SuppressWarnings(\"unused\") final ThreadGroup threadGroup) {\n+            return true;\n+        }\n+\n+        @Override\n+        public boolean test(@SuppressWarnings(\"unused\") final Thread thread) {\n+            return true;\n+        }\n+\n+    }\n+\n+    /**\n+     * A predicate implementation which matches a thread or threadgroup name.\n+     */\n+    public static class NamePredicate implements ThreadPredicate, ThreadGroupPredicate {\n+\n+        private final String name;\n+\n+        /**\n+         * Predicate constructor\n+         * \n+         * @param name thread or threadgroup name\n+         * @throws IllegalArgumentException if the name is {@code null}\n+         */\n+        public NamePredicate(final String name) {\n+            super();\n+            if (name == null) {\n+                throw new IllegalArgumentException(\"The name must not be null\");\n+            }\n+            this.name = name;\n+        }\n+\n+        @Override\n+        public boolean test(final ThreadGroup threadGroup) {\n+            return threadGroup != null && threadGroup.getName().equals(name);\n+        }\n+\n+        @Override\n+        public boolean test(final Thread thread) {\n+            return thread != null && thread.getName().equals(name);\n+        }\n+    }\n+\n+    /**\n+     * A predicate implementation which matches a thread id.\n+     */\n+    public static class ThreadIdPredicate implements ThreadPredicate {\n+\n+        private final long threadId;\n+\n+        /**\n+         * Predicate constructor\n+         * \n+         * @param threadId the threadId to match\n+         * @throws IllegalArgumentException if the threadId is zero or negative\n+         */\n+        public ThreadIdPredicate(final long threadId) {\n+            super();\n+            if (threadId <= 0) {\n+                throw new IllegalArgumentException(\"The thread id must be greater than zero\");\n+            }\n+            this.threadId = threadId;\n+        }\n+\n+        @Override\n+        public boolean test(final Thread thread) {\n+            return thread != null && thread.getId() == threadId;\n+        }\n+    }\n+\n+    /**\n+     * Select all active threads which match the given predicate.\n+     * \n+     * @param predicate the predicate\n+     * @return An unmodifiable {@code Collection} of active threads matching the given predicate\n+     * \n+     * @throws IllegalArgumentException if the predicate is null\n+     * @throws  SecurityException\n+     *          if the current thread cannot access the system thread group\n+     * @throws  SecurityException  if the current thread cannot modify\n+     *          thread groups from this thread's thread group up to the system thread group\n+     */\n+    public static Collection<Thread> findThreads(final ThreadPredicate predicate){\n+        return findThreads(getSystemThreadGroup(), true, predicate);\n+    }\n+\n+    /**\n+     * Select all active threadgroups which match the given predicate.\n+     * \n+     * @param predicate\n+     * @return An unmodifiable {@code Collection} of active threadgroups matching the given predicate\n+     * @throws IllegalArgumentException if the predicate is null\n+     * @throws  SecurityException\n+     *          if the current thread cannot access the system thread group\n+     * @throws  SecurityException  if the current thread cannot modify\n+     *          thread groups from this thread's thread group up to the system thread group\n+     */\n+    public static Collection<ThreadGroup> findThreadGroups(final ThreadGroupPredicate predicate){\n+        return findThreadGroups(getSystemThreadGroup(), true, predicate);\n+    }\n+\n+    /**\n+     * Select all active threads which match the given predicate and which belongs to the given thread group (or one of its subgroups).\n+     * \n+     * @param group the thread group\n+     * @param recurse if {@code true} then evaluate the predicate recursively on all threads in all subgroups of the given group \n+     * @param predicate the predicate\n+     * @return An unmodifiable {@code Collection} of active threads which match the given predicate and which belongs to the given thread group\n+     * @throws IllegalArgumentException if the given group or predicate is null\n+     * @throws  SecurityException  if the current thread cannot modify\n+     *          thread groups from this thread's thread group up to the system thread group\n+     */\n+    public static Collection<Thread> findThreads(final ThreadGroup group, final boolean recurse, final ThreadPredicate predicate) {\n+        if (group == null) {\n+            throw new IllegalArgumentException(\"The group must not be null\");\n+        }\n+        if (predicate == null) {\n+            throw new IllegalArgumentException(\"The predicate must not be null\");\n+        }\n+\n+        int count = group.activeCount();\n+        Thread[] threads;\n+        do {\n+            threads = new Thread[count + (count >> 1) + 1];\n+            count = group.enumerate(threads, recurse);\n+        } while (count >= threads.length);\n+\n+        final List<Thread> result = new ArrayList<Thread>(count);\n+        for (int i = 0; i < count; ++i) {\n+            if (predicate.test(threads[i])) {\n+                result.add(threads[i]);\n+            }\n+        }\n+        return Collections.unmodifiableCollection(result);\n+    }\n+\n+    /**\n+     * Select all active threadgroups which match the given predicate and which is a subgroup of the given thread group (or one of its subgroups).\n+     * \n+     * @param group the thread group\n+     * @param recurse if {@code true} then evaluate the predicate recursively on all threadgroups in all subgroups of the given group \n+     * @param predicate the predicate\n+     * @return An unmodifiable {@code Collection} of active threadgroups which match the given predicate and which is a subgroup of the given thread group\n+     * @throws IllegalArgumentException if the given group or predicate is null\n+     * @throws  SecurityException  if the current thread cannot modify\n+     *          thread groups from this thread's thread group up to the system thread group\n+     */\n+    public static Collection<ThreadGroup> findThreadGroups(final ThreadGroup group, final boolean recurse, final ThreadGroupPredicate predicate){\n+        if (group == null) {\n+            throw new IllegalArgumentException(\"The group must not be null\");\n+        }\n+        if (predicate == null) {\n+            throw new IllegalArgumentException(\"The predicate must not be null\");\n+        }\n+        \n+        int count = group.activeGroupCount();\n+        ThreadGroup[] threadGroups;\n+        do {\n+            threadGroups = new ThreadGroup[count + (count>>1) + 1];","path":"src/main/java/org/apache/commons/lang3/ThreadUtils.java","position":448,"original_position":448,"commit_id":"1974c83561d09cf73a575f992fbd8416e3354d20","original_commit_id":"1974c83561d09cf73a575f992fbd8416e3354d20","user":{"login":"CodingFabian","id":176132,"avatar_url":"https://avatars.githubusercontent.com/u/176132?v=3","gravatar_id":"","url":"https://api.github.com/users/CodingFabian","html_url":"https://github.com/CodingFabian","followers_url":"https://api.github.com/users/CodingFabian/followers","following_url":"https://api.github.com/users/CodingFabian/following{/other_user}","gists_url":"https://api.github.com/users/CodingFabian/gists{/gist_id}","starred_url":"https://api.github.com/users/CodingFabian/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CodingFabian/subscriptions","organizations_url":"https://api.github.com/users/CodingFabian/orgs","repos_url":"https://api.github.com/users/CodingFabian/repos","events_url":"https://api.github.com/users/CodingFabian/events{/privacy}","received_events_url":"https://api.github.com/users/CodingFabian/received_events","type":"User","site_admin":false},"body":"ok, maybe add a comment, so that a maintainer in 3 years will not say WTF? :)","created_at":"2015-05-04T19:09:10Z","updated_at":"2015-05-04T19:09:10Z","html_url":"https://github.com/apache/commons-lang/pull/78#discussion_r29613233","pull_request_url":"https://api.github.com/repos/apache/commons-lang/pulls/78","_links":{"self":{"href":"https://api.github.com/repos/apache/commons-lang/pulls/comments/29613233"},"html":{"href":"https://github.com/apache/commons-lang/pull/78#discussion_r29613233"},"pull_request":{"href":"https://api.github.com/repos/apache/commons-lang/pulls/78"}}},"pull_request":{"url":"https://api.github.com/repos/apache/commons-lang/pulls/78","id":34608892,"html_url":"https://github.com/apache/commons-lang/pull/78","diff_url":"https://github.com/apache/commons-lang/pull/78.diff","patch_url":"https://github.com/apache/commons-lang/pull/78.patch","issue_url":"https://api.github.com/repos/apache/commons-lang/issues/78","number":78,"state":"open","locked":false,"title":"Add ThreadUtils (2nd PR)","user":{"login":"salyh","id":3762447,"avatar_url":"https://avatars.githubusercontent.com/u/3762447?v=3","gravatar_id":"","url":"https://api.github.com/users/salyh","html_url":"https://github.com/salyh","followers_url":"https://api.github.com/users/salyh/followers","following_url":"https://api.github.com/users/salyh/following{/other_user}","gists_url":"https://api.github.com/users/salyh/gists{/gist_id}","starred_url":"https://api.github.com/users/salyh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/salyh/subscriptions","organizations_url":"https://api.github.com/users/salyh/orgs","repos_url":"https://api.github.com/users/salyh/repos","events_url":"https://api.github.com/users/salyh/events{/privacy}","received_events_url":"https://api.github.com/users/salyh/received_events","type":"User","site_admin":false},"body":"Add org.apache.commons.lang3.ThreadUtils which provide helper methods related to java.lang.Thread (2nd PR)\r\n\r\nThis PR replaces https://github.com/apache/commons-lang/pull/61\r\n\r\nThreadUtils class exposes the following static methods:\r\nfindThreadById(long)\r\nfindThreadById(long, String)\r\nfindThreadById(long, ThreadGroup)\r\nfindThreadGroups(ThreadGroup, boolean, ThreadGroupPredicate)\r\nfindThreadGroups(ThreadGroupPredicate)\r\nfindThreadGroupsByName(String)\r\nfindThreads(ThreadGroup, boolean, ThreadPredicate)\r\nfindThreads(ThreadPredicate)\r\nfindThreadsByName(String)\r\nfindThreadsByName(String, String)\r\nfindThreadsByName(String, ThreadGroup)\r\ngetAllThreadGroups()\r\ngetAllThreads()\r\ngetSystemThreadGroup()\r\n","created_at":"2015-05-03T22:21:06Z","updated_at":"2015-05-04T19:09:11Z","closed_at":null,"merged_at":null,"merge_commit_sha":"ce3a3e4f5b4d3bc833aaeb77fdee7504e5504cfc","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/apache/commons-lang/pulls/78/commits","review_comments_url":"https://api.github.com/repos/apache/commons-lang/pulls/78/comments","review_comment_url":"https://api.github.com/repos/apache/commons-lang/pulls/comments{/number}","comments_url":"https://api.github.com/repos/apache/commons-lang/issues/78/comments","statuses_url":"https://api.github.com/repos/apache/commons-lang/statuses/1974c83561d09cf73a575f992fbd8416e3354d20","head":{"label":"salyh:threadutilsmaster","ref":"threadutilsmaster","sha":"1974c83561d09cf73a575f992fbd8416e3354d20","user":{"login":"salyh","id":3762447,"avatar_url":"https://avatars.githubusercontent.com/u/3762447?v=3","gravatar_id":"","url":"https://api.github.com/users/salyh","html_url":"https://github.com/salyh","followers_url":"https://api.github.com/users/salyh/followers","following_url":"https://api.github.com/users/salyh/following{/other_user}","gists_url":"https://api.github.com/users/salyh/gists{/gist_id}","starred_url":"https://api.github.com/users/salyh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/salyh/subscriptions","organizations_url":"https://api.github.com/users/salyh/orgs","repos_url":"https://api.github.com/users/salyh/repos","events_url":"https://api.github.com/users/salyh/events{/privacy}","received_events_url":"https://api.github.com/users/salyh/received_events","type":"User","site_admin":false},"repo":{"id":23145035,"name":"commons-lang","full_name":"salyh/commons-lang","owner":{"login":"salyh","id":3762447,"avatar_url":"https://avatars.githubusercontent.com/u/3762447?v=3","gravatar_id":"","url":"https://api.github.com/users/salyh","html_url":"https://github.com/salyh","followers_url":"https://api.github.com/users/salyh/followers","following_url":"https://api.github.com/users/salyh/following{/other_user}","gists_url":"https://api.github.com/users/salyh/gists{/gist_id}","starred_url":"https://api.github.com/users/salyh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/salyh/subscriptions","organizations_url":"https://api.github.com/users/salyh/orgs","repos_url":"https://api.github.com/users/salyh/repos","events_url":"https://api.github.com/users/salyh/events{/privacy}","received_events_url":"https://api.github.com/users/salyh/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/salyh/commons-lang","description":"Mirror of Apache Commons Lang","fork":true,"url":"https://api.github.com/repos/salyh/commons-lang","forks_url":"https://api.github.com/repos/salyh/commons-lang/forks","keys_url":"https://api.github.com/repos/salyh/commons-lang/keys{/key_id}","collaborators_url":"https://api.github.com/repos/salyh/commons-lang/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/salyh/commons-lang/teams","hooks_url":"https://api.github.com/repos/salyh/commons-lang/hooks","issue_events_url":"https://api.github.com/repos/salyh/commons-lang/issues/events{/number}","events_url":"https://api.github.com/repos/salyh/commons-lang/events","assignees_url":"https://api.github.com/repos/salyh/commons-lang/assignees{/user}","branches_url":"https://api.github.com/repos/salyh/commons-lang/branches{/branch}","tags_url":"https://api.github.com/repos/salyh/commons-lang/tags","blobs_url":"https://api.github.com/repos/salyh/commons-lang/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/salyh/commons-lang/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/salyh/commons-lang/git/refs{/sha}","trees_url":"https://api.github.com/repos/salyh/commons-lang/git/trees{/sha}","statuses_url":"https://api.github.com/repos/salyh/commons-lang/statuses/{sha}","languages_url":"https://api.github.com/repos/salyh/commons-lang/languages","stargazers_url":"https://api.github.com/repos/salyh/commons-lang/stargazers","contributors_url":"https://api.github.com/repos/salyh/commons-lang/contributors","subscribers_url":"https://api.github.com/repos/salyh/commons-lang/subscribers","subscription_url":"https://api.github.com/repos/salyh/commons-lang/subscription","commits_url":"https://api.github.com/repos/salyh/commons-lang/commits{/sha}","git_commits_url":"https://api.github.com/repos/salyh/commons-lang/git/commits{/sha}","comments_url":"https://api.github.com/repos/salyh/commons-lang/comments{/number}","issue_comment_url":"https://api.github.com/repos/salyh/commons-lang/issues/comments{/number}","contents_url":"https://api.github.com/repos/salyh/commons-lang/contents/{+path}","compare_url":"https://api.github.com/repos/salyh/commons-lang/compare/{base}...{head}","merges_url":"https://api.github.com/repos/salyh/commons-lang/merges","archive_url":"https://api.github.com/repos/salyh/commons-lang/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/salyh/commons-lang/downloads","issues_url":"https://api.github.com/repos/salyh/commons-lang/issues{/number}","pulls_url":"https://api.github.com/repos/salyh/commons-lang/pulls{/number}","milestones_url":"https://api.github.com/repos/salyh/commons-lang/milestones{/number}","notifications_url":"https://api.github.com/repos/salyh/commons-lang/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/salyh/commons-lang/labels{/name}","releases_url":"https://api.github.com/repos/salyh/commons-lang/releases{/id}","created_at":"2014-08-20T10:36:00Z","updated_at":"2014-08-13T09:32:30Z","pushed_at":"2015-05-04T07:03:24Z","git_url":"git://github.com/salyh/commons-lang.git","ssh_url":"git@github.com:salyh/commons-lang.git","clone_url":"https://github.com/salyh/commons-lang.git","svn_url":"https://github.com/salyh/commons-lang","homepage":null,"size":18569,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":1,"forks":1,"open_issues":1,"watchers":0,"default_branch":"trunk"}},"base":{"label":"apache:master","ref":"master","sha":"8e7ea70a33ecb8db5207849ea6371b4a5a8ffd26","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":206378,"name":"commons-lang","full_name":"apache/commons-lang","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/commons-lang","description":"Mirror of Apache Commons Lang","fork":false,"url":"https://api.github.com/repos/apache/commons-lang","forks_url":"https://api.github.com/repos/apache/commons-lang/forks","keys_url":"https://api.github.com/repos/apache/commons-lang/keys{/key_id}","collaborators_url":"https://api.github.com/repos/apache/commons-lang/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/apache/commons-lang/teams","hooks_url":"https://api.github.com/repos/apache/commons-lang/hooks","issue_events_url":"https://api.github.com/repos/apache/commons-lang/issues/events{/number}","events_url":"https://api.github.com/repos/apache/commons-lang/events","assignees_url":"https://api.github.com/repos/apache/commons-lang/assignees{/user}","branches_url":"https://api.github.com/repos/apache/commons-lang/branches{/branch}","tags_url":"https://api.github.com/repos/apache/commons-lang/tags","blobs_url":"https://api.github.com/repos/apache/commons-lang/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/apache/commons-lang/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/apache/commons-lang/git/refs{/sha}","trees_url":"https://api.github.com/repos/apache/commons-lang/git/trees{/sha}","statuses_url":"https://api.github.com/repos/apache/commons-lang/statuses/{sha}","languages_url":"https://api.github.com/repos/apache/commons-lang/languages","stargazers_url":"https://api.github.com/repos/apache/commons-lang/stargazers","contributors_url":"https://api.github.com/repos/apache/commons-lang/contributors","subscribers_url":"https://api.github.com/repos/apache/commons-lang/subscribers","subscription_url":"https://api.github.com/repos/apache/commons-lang/subscription","commits_url":"https://api.github.com/repos/apache/commons-lang/commits{/sha}","git_commits_url":"https://api.github.com/repos/apache/commons-lang/git/commits{/sha}","comments_url":"https://api.github.com/repos/apache/commons-lang/comments{/number}","issue_comment_url":"https://api.github.com/repos/apache/commons-lang/issues/comments{/number}","contents_url":"https://api.github.com/repos/apache/commons-lang/contents/{+path}","compare_url":"https://api.github.com/repos/apache/commons-lang/compare/{base}...{head}","merges_url":"https://api.github.com/repos/apache/commons-lang/merges","archive_url":"https://api.github.com/repos/apache/commons-lang/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/apache/commons-lang/downloads","issues_url":"https://api.github.com/repos/apache/commons-lang/issues{/number}","pulls_url":"https://api.github.com/repos/apache/commons-lang/pulls{/number}","milestones_url":"https://api.github.com/repos/apache/commons-lang/milestones{/number}","notifications_url":"https://api.github.com/repos/apache/commons-lang/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/apache/commons-lang/labels{/name}","releases_url":"https://api.github.com/repos/apache/commons-lang/releases{/id}","created_at":"2009-05-21T01:24:46Z","updated_at":"2015-05-04T18:56:35Z","pushed_at":"2015-05-04T18:56:35Z","git_url":"git://github.com/apache/commons-lang.git","ssh_url":"git@github.com:apache/commons-lang.git","clone_url":"https://github.com/apache/commons-lang.git","svn_url":"https://github.com/apache/commons-lang","homepage":null,"size":28611,"stargazers_count":262,"watchers_count":262,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":163,"mirror_url":"git://git.apache.org/commons-lang.git","open_issues_count":13,"forks":163,"open_issues":13,"watchers":262,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/apache/commons-lang/pulls/78"},"html":{"href":"https://github.com/apache/commons-lang/pull/78"},"issue":{"href":"https://api.github.com/repos/apache/commons-lang/issues/78"},"comments":{"href":"https://api.github.com/repos/apache/commons-lang/issues/78/comments"},"review_comments":{"href":"https://api.github.com/repos/apache/commons-lang/pulls/78/comments"},"review_comment":{"href":"https://api.github.com/repos/apache/commons-lang/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/apache/commons-lang/pulls/78/commits"},"statuses":{"href":"https://api.github.com/repos/apache/commons-lang/statuses/1974c83561d09cf73a575f992fbd8416e3354d20"}}}}