GitHub PullRequestReviewCommentEvent at 2014-10-16 21:21:28
Repository: wildfly-core
Actor: bstansberry
Payload: {"action":"created","comment":{"url":"https://api.github.com/repos/wildfly/wildfly-core/pulls/comments/18987643","id":18987643,"diff_hunk":"@@ -0,0 +1,301 @@\n+/*\n+ * Copyright (C) 2014 Red Hat, inc., and individual contributors\n+ * as indicated by the @author tags. See the copyright.txt file in the\n+ * distribution for a full listing of individual contributors.\n+ *\n+ * This library is free software; you can redistribute it and/or\n+ * modify it under the terms of the GNU Lesser General Public\n+ * License as published by the Free Software Foundation; either\n+ * version 2.1 of the License, or (at your option) any later version.\n+ *\n+ * This library is distributed in the hope that it will be useful,\n+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\n+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n+ * Lesser General Public License for more details.\n+ *\n+ * You should have received a copy of the GNU Lesser General Public\n+ * License along with this library; if not, write to the Free Software\n+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,\n+ * MA 02110-1301  USA\n+ */\n+package org.jboss.as.server.deployment;\n+\n+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.CHILD_TYPE;\n+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.CONTENT;\n+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.DEPLOYMENT;\n+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.DEPLOYMENT_OVERLAY;\n+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.FAILED;\n+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.HASH;\n+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.HOST;\n+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.HOST_STATE;\n+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.LOCAL_HOST_NAME;\n+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.MANAGEMENT_CLIENT_CONTENT;\n+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP;\n+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP_ADDR;\n+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OUTCOME;\n+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.PROCESS_STATE;\n+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.READ_CHILDREN_NAMES_OPERATION;\n+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.RESULT;\n+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ROLLOUT_PLANS;\n+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SERVER;\n+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SERVER_GROUP;\n+\n+import java.io.IOException;\n+import java.util.HashMap;\n+import java.util.HashSet;\n+import java.util.Map;\n+import java.util.Set;\n+import java.util.concurrent.ScheduledExecutorService;\n+import java.util.concurrent.ScheduledFuture;\n+import java.util.concurrent.TimeUnit;\n+import org.jboss.as.controller.ControlledProcessState;\n+import org.jboss.as.controller.ControlledProcessStateService;\n+import org.jboss.as.controller.PathAddress;\n+import org.jboss.as.controller.PathElement;\n+import org.jboss.as.controller.client.ModelControllerClient;\n+import org.jboss.as.controller.client.helpers.Operations;\n+import org.jboss.as.repository.ContentReference;\n+import org.jboss.as.repository.ContentRepository;\n+import org.jboss.as.server.logging.ServerLogger;\n+import org.jboss.dmr.ModelNode;\n+\n+\n+/**\n+ *\n+ * @author <a href=\"mailto:ehugonne@redhat.com\">Emmanuel Hugonnet</a> (c) 2014 Red Hat, inc.\n+ */\n+public class ContentRepositoryCleaner {\n+\n+    private final ContentRepository contentRepository;\n+    private final ModelControllerClient client;\n+    private final ControlledProcessStateService controlledProcessStateService;\n+    private final ScheduledExecutorService scheduledExecutor;\n+\n+    private long cleanInterval = 0L;\n+    private volatile boolean enabled;\n+    private ScheduledFuture<?> cleanTask;\n+\n+    private final ContentRepositoryCleanerTask cleanRunnable = new ContentRepositoryCleanerTask();\n+\n+    private class ContentRepositoryCleanerTask implements Runnable {\n+\n+        @Override\n+        public void run() {\n+            clean();\n+        }\n+    }\n+\n+    public ContentRepositoryCleaner(ContentRepository contentRepository, ModelControllerClient client,\n+            ControlledProcessStateService controlledProcessStateService, ScheduledExecutorService scheduledExecutor,\n+            long interval) {\n+        this.contentRepository = contentRepository;\n+        this.controlledProcessStateService = controlledProcessStateService;\n+        this.client = client;\n+        this.scheduledExecutor = scheduledExecutor;\n+        this.enabled = true;\n+        this.cleanInterval = interval;\n+    }\n+\n+    public boolean isEnabled() {\n+        return enabled;\n+    }\n+\n+    public long getCleanInterval() {\n+        return cleanInterval;\n+    }\n+\n+    /**\n+     * Invoke with the object monitor held\n+     */\n+    private void cancelScan() {\n+        if (cleanTask != null) {\n+            cleanTask.cancel(false);\n+            cleanTask = null;\n+        }\n+        try {\n+            client.close();\n+        } catch (IOException ex) {\n+            ServerLogger.ROOT_LOGGER.error(\"Error stopping content repository cleaner\", ex);\n+        }\n+    }\n+\n+    public synchronized void startScan() {\n+        if (enabled) {\n+            cleanTask = scheduledExecutor.scheduleWithFixedDelay(cleanRunnable, cleanInterval, cleanInterval, TimeUnit.MILLISECONDS);\n+        }\n+    }\n+\n+    /**\n+     * {@inheritDoc}\n+     */\n+    public synchronized void stopScan() {\n+        this.enabled = false;\n+        cancelScan();\n+    }\n+\n+    void clean() {\n+        if (controlledProcessStateService.getCurrentState() == ControlledProcessState.State.RUNNING) {\n+            Map<String, Set<ContentReference>> allReferences = listAllAvailableDeployments();\n+            Set<ContentReference> references = new HashSet<>();\n+            for (Set<ContentReference> allReferencedContents : allReferences.values()) {\n+                references.addAll(allReferencedContents);\n+            }\n+            contentRepository.syncReferences(references);\n+        }\n+    }\n+\n+    /**\n+     * List all contents (deplyments and rollout plans).\n+     * @return all contents (deplyments and rollout plans).\n+     */\n+    private Map<String, ContentReference> listAllContents() {\n+        Map<String, ContentReference> contents = new HashMap<>();\n+        final ModelNode deploymentNames = readChildrenNames(PathAddress.EMPTY_ADDRESS, DEPLOYMENT);\n+        if (deploymentNames.isDefined()) {\n+            for (ModelNode deploymentNode : deploymentNames.asList()) {\n+                String deploymentName = deploymentNode.asString();\n+                ContentReference reference = readContentReference(PathAddress.EMPTY_ADDRESS,DEPLOYMENT, deploymentName);\n+                if (reference != null) {\n+                    contents.put(deploymentName, reference);\n+                }\n+            }\n+        }\n+        final ModelNode deploymentOverlayNames = readChildrenNames(PathAddress.EMPTY_ADDRESS, DEPLOYMENT_OVERLAY);\n+        if (deploymentOverlayNames.isDefined()) {\n+            for (ModelNode deploymentOverlayNode : deploymentOverlayNames.asList()) {\n+                String deploymentOverlayName = deploymentOverlayNode.asString();\n+                PathAddress overlayAddress = PathAddress.EMPTY_ADDRESS.append(DEPLOYMENT_OVERLAY, deploymentOverlayName);\n+                ModelNode contentNamesResult = readChildrenNames(overlayAddress, CONTENT);\n+                if (contentNamesResult.isDefined()) {\n+                    for (ModelNode contentNameNode : contentNamesResult.asList()) {\n+                        String contentName = contentNameNode.asString();\n+                        PathAddress contentParentAddress = PathAddress.pathAddress(overlayAddress, PathElement.pathElement(CONTENT, contentName));\n+                        ModelNode hashResult = readAttribute(contentParentAddress.toModelNode(), CONTENT);\n+                        if (hashResult.isDefined()) {\n+                            ContentReference reference = ModelContentReference.fromDeploymentAddress(contentParentAddress, hashResult.asBytes()).toReference();\n+                            contents.put(deploymentOverlayName, reference);\n+                        }\n+                    }\n+                }\n+            }\n+        }\n+        PathAddress rolloutPlansAddress = PathAddress.pathAddress(MANAGEMENT_CLIENT_CONTENT, ROLLOUT_PLANS);\n+        final ModelNode rolloutPlansHash = readAttribute(rolloutPlansAddress.toModelNode(), HASH);\n+        if (rolloutPlansHash.isDefined()) {\n+            byte[] hash = rolloutPlansHash.asBytes();\n+            contents.put(ROLLOUT_PLANS, ModelContentReference.fromDeploymentAddress(rolloutPlansAddress, hash).toReference());\n+        }\n+        return contents;\n+    }\n+\n+    private ContentReference readContentReference(PathAddress address, String type, String name) {\n+        PathAddress contentParentAddress = PathAddress.pathAddress(address, PathElement.pathElement(type, name));\n+        ModelNode hashResult = readAttribute(contentParentAddress.toModelNode(), CONTENT);\n+        if (hashResult.isDefined()) {\n+            for (ModelNode attribute : hashResult.asList()) {\n+                if (attribute.has(HASH)) {\n+                    return ModelContentReference.fromDeploymentAddress(contentParentAddress, attribute.get(HASH).asBytes()).toReference();\n+                }\n+            }\n+        }\n+        return null;\n+    }\n+\n+    private Map<String, Set<ContentReference>> listAllAvailableDeployments() {\n+        Map<String, ContentReference> deployments = listAllContents();\n+        Map<String, Set<ContentReference>> allDeployments = new HashMap<String, Set<ContentReference>>();\n+        for (Map.Entry<String, ContentReference> deployment : deployments.entrySet()) {\n+            Set<ContentReference> references = new HashSet<>();\n+            references.add(deployment.getValue());\n+            allDeployments.put(deployment.getKey(), references);\n+        }\n+        ModelNode hostNode = readAttribute(PathAddress.EMPTY_ADDRESS.toModelNode(), LOCAL_HOST_NAME);\n+        if (hostNode.isDefined() && hostNode.hasDefined(LOCAL_HOST_NAME)) {\n+            String hostName = hostNode.get(LOCAL_HOST_NAME).asString();\n+            PathAddress hostAddress = PathAddress.pathAddress(HOST, hostName);\n+            if (isHostRunning(hostName)) {\n+                final ModelNode serverResult = readChildrenNames(hostAddress, SERVER);\n+                if (serverResult.isDefined()) {\n+                    for (ModelNode serverNode : serverResult.asList()) {\n+                        String serverName = serverNode.asString();\n+                        if (isServerRunning(hostName, serverName)) {","path":"server/src/main/java/org/jboss/as/server/deployment/ContentRepositoryCleaner.java","position":221,"original_position":221,"commit_id":"41c463d8ac43826acb11c2053a7bfab6edb83758","original_commit_id":"41c463d8ac43826acb11c2053a7bfab6edb83758","user":{"login":"bstansberry","id":299242,"avatar_url":"https://avatars.githubusercontent.com/u/299242?v=2","gravatar_id":"","url":"https://api.github.com/users/bstansberry","html_url":"https://github.com/bstansberry","followers_url":"https://api.github.com/users/bstansberry/followers","following_url":"https://api.github.com/users/bstansberry/following{/other_user}","gists_url":"https://api.github.com/users/bstansberry/gists{/gist_id}","starred_url":"https://api.github.com/users/bstansberry/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bstansberry/subscriptions","organizations_url":"https://api.github.com/users/bstansberry/orgs","repos_url":"https://api.github.com/users/bstansberry/repos","events_url":"https://api.github.com/users/bstansberry/events{/privacy}","received_events_url":"https://api.github.com/users/bstansberry/received_events","type":"User","site_admin":false},"body":"You don't need to contact the remote server to find out its server group. It's available locally in the corresponding server-config resource.\r\n\r\nBut, it's not valid to require a chain from a running server back to a deployment to add a reference. Here are what count as valid references:\r\n\r\n1) For a deployment resource:\r\na) if the process is a standalone server or a master host controller, or a slave HC running with the --backup setting, a reference in a /deployment=* resource. The master HC or a --backup slave HC are responsible for keeping the entire repo.\r\nb) for a slave host controller not running with --backup, a reference in a /deployment=* resource is not relevant and should be ignored. Such a slave should not keep content solely based on /deployment=* because it's only responsible for content it *may* need locally. What's needed is a reference in a /server-group=*/deployment=* resource. If the slave is maintaining that server group in its model, whether it's used or not by a server, it is responsible for keeping the necessary content available.\r\n\r\nA slave can be configured to ignore server groups unrelated to its servers. If it does this, it won't have the server group reference.\r\n\r\n2) For a deployment overlay resource\r\na) and b) same as for deployment\r\n\r\n3) For client content references, any reference in the model counts.","created_at":"2014-10-16T21:21:28Z","updated_at":"2014-10-16T21:21:28Z","html_url":"https://github.com/wildfly/wildfly-core/pull/237#discussion_r18987643","pull_request_url":"https://api.github.com/repos/wildfly/wildfly-core/pulls/237","_links":{"self":{"href":"https://api.github.com/repos/wildfly/wildfly-core/pulls/comments/18987643"},"html":{"href":"https://github.com/wildfly/wildfly-core/pull/237#discussion_r18987643"},"pull_request":{"href":"https://api.github.com/repos/wildfly/wildfly-core/pulls/237"}}},"pull_request":{"url":"https://api.github.com/repos/wildfly/wildfly-core/pulls/237","id":22551298,"html_url":"https://github.com/wildfly/wildfly-core/pull/237","diff_url":"https://github.com/wildfly/wildfly-core/pull/237.diff","patch_url":"https://github.com/wildfly/wildfly-core/pull/237.patch","issue_url":"https://api.github.com/repos/wildfly/wildfly-core/issues/237","number":237,"state":"open","locked":false,"title":"[WFLY-122] : Clean unreferenced items from the content repository","user":{"login":"ehsavoie","id":73053,"avatar_url":"https://avatars.githubusercontent.com/u/73053?v=2","gravatar_id":"","url":"https://api.github.com/users/ehsavoie","html_url":"https://github.com/ehsavoie","followers_url":"https://api.github.com/users/ehsavoie/followers","following_url":"https://api.github.com/users/ehsavoie/following{/other_user}","gists_url":"https://api.github.com/users/ehsavoie/gists{/gist_id}","starred_url":"https://api.github.com/users/ehsavoie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ehsavoie/subscriptions","organizations_url":"https://api.github.com/users/ehsavoie/orgs","repos_url":"https://api.github.com/users/ehsavoie/repos","events_url":"https://api.github.com/users/ehsavoie/events{/privacy}","received_events_url":"https://api.github.com/users/ehsavoie/received_events","type":"User","site_admin":false},"body":"Contents in content repositories are now cleaned. We are looking for all referenced contents in the model :\r\n * deployments\r\n * overlays\r\n * rollout-plans\r\nAll contents that are not referenced will be removed.\r\n\r\nJira : https://issues.jboss.org/browse/WFLY-122","created_at":"2014-10-10T10:18:10Z","updated_at":"2014-10-16T21:21:28Z","closed_at":null,"merged_at":null,"merge_commit_sha":"4e2980ab104f4ef19968d4d358dfffb668d25d64","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/wildfly/wildfly-core/pulls/237/commits","review_comments_url":"https://api.github.com/repos/wildfly/wildfly-core/pulls/237/comments","review_comment_url":"https://api.github.com/repos/wildfly/wildfly-core/pulls/comments/{number}","comments_url":"https://api.github.com/repos/wildfly/wildfly-core/issues/237/comments","statuses_url":"https://api.github.com/repos/wildfly/wildfly-core/statuses/41c463d8ac43826acb11c2053a7bfab6edb83758","head":{"label":"ehsavoie:WFLY-122","ref":"WFLY-122","sha":"41c463d8ac43826acb11c2053a7bfab6edb83758","user":{"login":"ehsavoie","id":73053,"avatar_url":"https://avatars.githubusercontent.com/u/73053?v=2","gravatar_id":"","url":"https://api.github.com/users/ehsavoie","html_url":"https://github.com/ehsavoie","followers_url":"https://api.github.com/users/ehsavoie/followers","following_url":"https://api.github.com/users/ehsavoie/following{/other_user}","gists_url":"https://api.github.com/users/ehsavoie/gists{/gist_id}","starred_url":"https://api.github.com/users/ehsavoie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ehsavoie/subscriptions","organizations_url":"https://api.github.com/users/ehsavoie/orgs","repos_url":"https://api.github.com/users/ehsavoie/repos","events_url":"https://api.github.com/users/ehsavoie/events{/privacy}","received_events_url":"https://api.github.com/users/ehsavoie/received_events","type":"User","site_admin":false},"repo":{"id":21896147,"name":"wildfly-core","full_name":"ehsavoie/wildfly-core","owner":{"login":"ehsavoie","id":73053,"avatar_url":"https://avatars.githubusercontent.com/u/73053?v=2","gravatar_id":"","url":"https://api.github.com/users/ehsavoie","html_url":"https://github.com/ehsavoie","followers_url":"https://api.github.com/users/ehsavoie/followers","following_url":"https://api.github.com/users/ehsavoie/following{/other_user}","gists_url":"https://api.github.com/users/ehsavoie/gists{/gist_id}","starred_url":"https://api.github.com/users/ehsavoie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ehsavoie/subscriptions","organizations_url":"https://api.github.com/users/ehsavoie/orgs","repos_url":"https://api.github.com/users/ehsavoie/repos","events_url":"https://api.github.com/users/ehsavoie/events{/privacy}","received_events_url":"https://api.github.com/users/ehsavoie/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/ehsavoie/wildfly-core","description":"The core runtime that is used by the Wildfly application server","fork":true,"url":"https://api.github.com/repos/ehsavoie/wildfly-core","forks_url":"https://api.github.com/repos/ehsavoie/wildfly-core/forks","keys_url":"https://api.github.com/repos/ehsavoie/wildfly-core/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ehsavoie/wildfly-core/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ehsavoie/wildfly-core/teams","hooks_url":"https://api.github.com/repos/ehsavoie/wildfly-core/hooks","issue_events_url":"https://api.github.com/repos/ehsavoie/wildfly-core/issues/events{/number}","events_url":"https://api.github.com/repos/ehsavoie/wildfly-core/events","assignees_url":"https://api.github.com/repos/ehsavoie/wildfly-core/assignees{/user}","branches_url":"https://api.github.com/repos/ehsavoie/wildfly-core/branches{/branch}","tags_url":"https://api.github.com/repos/ehsavoie/wildfly-core/tags","blobs_url":"https://api.github.com/repos/ehsavoie/wildfly-core/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ehsavoie/wildfly-core/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ehsavoie/wildfly-core/git/refs{/sha}","trees_url":"https://api.github.com/repos/ehsavoie/wildfly-core/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ehsavoie/wildfly-core/statuses/{sha}","languages_url":"https://api.github.com/repos/ehsavoie/wildfly-core/languages","stargazers_url":"https://api.github.com/repos/ehsavoie/wildfly-core/stargazers","contributors_url":"https://api.github.com/repos/ehsavoie/wildfly-core/contributors","subscribers_url":"https://api.github.com/repos/ehsavoie/wildfly-core/subscribers","subscription_url":"https://api.github.com/repos/ehsavoie/wildfly-core/subscription","commits_url":"https://api.github.com/repos/ehsavoie/wildfly-core/commits{/sha}","git_commits_url":"https://api.github.com/repos/ehsavoie/wildfly-core/git/commits{/sha}","comments_url":"https://api.github.com/repos/ehsavoie/wildfly-core/comments{/number}","issue_comment_url":"https://api.github.com/repos/ehsavoie/wildfly-core/issues/comments/{number}","contents_url":"https://api.github.com/repos/ehsavoie/wildfly-core/contents/{+path}","compare_url":"https://api.github.com/repos/ehsavoie/wildfly-core/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ehsavoie/wildfly-core/merges","archive_url":"https://api.github.com/repos/ehsavoie/wildfly-core/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ehsavoie/wildfly-core/downloads","issues_url":"https://api.github.com/repos/ehsavoie/wildfly-core/issues{/number}","pulls_url":"https://api.github.com/repos/ehsavoie/wildfly-core/pulls{/number}","milestones_url":"https://api.github.com/repos/ehsavoie/wildfly-core/milestones{/number}","notifications_url":"https://api.github.com/repos/ehsavoie/wildfly-core/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ehsavoie/wildfly-core/labels{/name}","releases_url":"https://api.github.com/repos/ehsavoie/wildfly-core/releases{/id}","created_at":"2014-07-16T10:20:50Z","updated_at":"2014-08-07T07:28:12Z","pushed_at":"2014-10-16T17:56:12Z","git_url":"git://github.com/ehsavoie/wildfly-core.git","ssh_url":"git@github.com:ehsavoie/wildfly-core.git","clone_url":"https://github.com/ehsavoie/wildfly-core.git","svn_url":"https://github.com/ehsavoie/wildfly-core","homepage":null,"size":34471,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":true,"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":"wildfly:master","ref":"master","sha":"1a9a5fe3bcd8a20228044d8173c9916182021e9f","user":{"login":"wildfly","id":3066274,"avatar_url":"https://avatars.githubusercontent.com/u/3066274?v=2","gravatar_id":"","url":"https://api.github.com/users/wildfly","html_url":"https://github.com/wildfly","followers_url":"https://api.github.com/users/wildfly/followers","following_url":"https://api.github.com/users/wildfly/following{/other_user}","gists_url":"https://api.github.com/users/wildfly/gists{/gist_id}","starred_url":"https://api.github.com/users/wildfly/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wildfly/subscriptions","organizations_url":"https://api.github.com/users/wildfly/orgs","repos_url":"https://api.github.com/users/wildfly/repos","events_url":"https://api.github.com/users/wildfly/events{/privacy}","received_events_url":"https://api.github.com/users/wildfly/received_events","type":"Organization","site_admin":false},"repo":{"id":21394954,"name":"wildfly-core","full_name":"wildfly/wildfly-core","owner":{"login":"wildfly","id":3066274,"avatar_url":"https://avatars.githubusercontent.com/u/3066274?v=2","gravatar_id":"","url":"https://api.github.com/users/wildfly","html_url":"https://github.com/wildfly","followers_url":"https://api.github.com/users/wildfly/followers","following_url":"https://api.github.com/users/wildfly/following{/other_user}","gists_url":"https://api.github.com/users/wildfly/gists{/gist_id}","starred_url":"https://api.github.com/users/wildfly/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wildfly/subscriptions","organizations_url":"https://api.github.com/users/wildfly/orgs","repos_url":"https://api.github.com/users/wildfly/repos","events_url":"https://api.github.com/users/wildfly/events{/privacy}","received_events_url":"https://api.github.com/users/wildfly/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/wildfly/wildfly-core","description":"The core runtime that is used by the Wildfly application server","fork":false,"url":"https://api.github.com/repos/wildfly/wildfly-core","forks_url":"https://api.github.com/repos/wildfly/wildfly-core/forks","keys_url":"https://api.github.com/repos/wildfly/wildfly-core/keys{/key_id}","collaborators_url":"https://api.github.com/repos/wildfly/wildfly-core/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/wildfly/wildfly-core/teams","hooks_url":"https://api.github.com/repos/wildfly/wildfly-core/hooks","issue_events_url":"https://api.github.com/repos/wildfly/wildfly-core/issues/events{/number}","events_url":"https://api.github.com/repos/wildfly/wildfly-core/events","assignees_url":"https://api.github.com/repos/wildfly/wildfly-core/assignees{/user}","branches_url":"https://api.github.com/repos/wildfly/wildfly-core/branches{/branch}","tags_url":"https://api.github.com/repos/wildfly/wildfly-core/tags","blobs_url":"https://api.github.com/repos/wildfly/wildfly-core/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/wildfly/wildfly-core/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/wildfly/wildfly-core/git/refs{/sha}","trees_url":"https://api.github.com/repos/wildfly/wildfly-core/git/trees{/sha}","statuses_url":"https://api.github.com/repos/wildfly/wildfly-core/statuses/{sha}","languages_url":"https://api.github.com/repos/wildfly/wildfly-core/languages","stargazers_url":"https://api.github.com/repos/wildfly/wildfly-core/stargazers","contributors_url":"https://api.github.com/repos/wildfly/wildfly-core/contributors","subscribers_url":"https://api.github.com/repos/wildfly/wildfly-core/subscribers","subscription_url":"https://api.github.com/repos/wildfly/wildfly-core/subscription","commits_url":"https://api.github.com/repos/wildfly/wildfly-core/commits{/sha}","git_commits_url":"https://api.github.com/repos/wildfly/wildfly-core/git/commits{/sha}","comments_url":"https://api.github.com/repos/wildfly/wildfly-core/comments{/number}","issue_comment_url":"https://api.github.com/repos/wildfly/wildfly-core/issues/comments/{number}","contents_url":"https://api.github.com/repos/wildfly/wildfly-core/contents/{+path}","compare_url":"https://api.github.com/repos/wildfly/wildfly-core/compare/{base}...{head}","merges_url":"https://api.github.com/repos/wildfly/wildfly-core/merges","archive_url":"https://api.github.com/repos/wildfly/wildfly-core/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/wildfly/wildfly-core/downloads","issues_url":"https://api.github.com/repos/wildfly/wildfly-core/issues{/number}","pulls_url":"https://api.github.com/repos/wildfly/wildfly-core/pulls{/number}","milestones_url":"https://api.github.com/repos/wildfly/wildfly-core/milestones{/number}","notifications_url":"https://api.github.com/repos/wildfly/wildfly-core/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/wildfly/wildfly-core/labels{/name}","releases_url":"https://api.github.com/repos/wildfly/wildfly-core/releases{/id}","created_at":"2014-07-01T16:33:34Z","updated_at":"2014-09-06T22:42:49Z","pushed_at":"2014-10-16T19:54:57Z","git_url":"git://github.com/wildfly/wildfly-core.git","ssh_url":"git@github.com:wildfly/wildfly-core.git","clone_url":"https://github.com/wildfly/wildfly-core.git","svn_url":"https://github.com/wildfly/wildfly-core","homepage":null,"size":38745,"stargazers_count":3,"watchers_count":3,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":72,"mirror_url":null,"open_issues_count":9,"forks":72,"open_issues":9,"watchers":3,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/wildfly/wildfly-core/pulls/237"},"html":{"href":"https://github.com/wildfly/wildfly-core/pull/237"},"issue":{"href":"https://api.github.com/repos/wildfly/wildfly-core/issues/237"},"comments":{"href":"https://api.github.com/repos/wildfly/wildfly-core/issues/237/comments"},"review_comments":{"href":"https://api.github.com/repos/wildfly/wildfly-core/pulls/237/comments"},"review_comment":{"href":"https://api.github.com/repos/wildfly/wildfly-core/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/wildfly/wildfly-core/pulls/237/commits"},"statuses":{"href":"https://api.github.com/repos/wildfly/wildfly-core/statuses/41c463d8ac43826acb11c2053a7bfab6edb83758"}}}}