{"action":"created","comment":{"url":"https://api.github.com/repos/dotCMS/core/pulls/comments/202847332","pull_request_review_id":137623333,"id":202847332,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIwMjg0NzMzMg==","diff_hunk":"@@ -0,0 +1,289 @@\n+package com.dotcms.rest.api.v1.system.monitor;\n+\n+import com.dotcms.business.CloseDBIfOpened;\n+import com.dotcms.concurrent.DotConcurrentFactory;\n+import com.dotcms.concurrent.DotSubmitter;\n+import com.dotcms.content.elasticsearch.business.IndiciesAPI;\n+import com.dotcms.content.elasticsearch.util.ESClient;\n+import com.dotcms.enterprise.cluster.ClusterFactory;\n+import com.dotcms.repackage.javax.ws.rs.InternalServerErrorException;\n+import com.dotcms.repackage.javax.ws.rs.core.Context;\n+import com.dotcms.util.HttpRequestDataUtil;\n+import com.dotcms.util.network.IPUtils;\n+import com.dotmarketing.beans.Host;\n+import com.dotmarketing.beans.Identifier;\n+import com.dotmarketing.business.APILocator;\n+import com.dotmarketing.common.db.DotConnect;\n+import com.dotmarketing.exception.DotDataException;\n+import com.dotmarketing.util.*;\n+import com.liferay.util.StringPool;\n+import net.jodah.failsafe.CircuitBreaker;\n+import net.jodah.failsafe.Failsafe;\n+import org.elasticsearch.client.Client;\n+import org.elasticsearch.index.query.QueryBuilders;\n+\n+import javax.servlet.http.HttpServletRequest;\n+import java.io.File;\n+import java.io.OutputStream;\n+import java.net.UnknownHostException;\n+import java.nio.file.Files;\n+import java.util.List;\n+import java.util.Map;\n+import java.util.concurrent.*;\n+\n+class MonitorHelper {\n+\n+    public static final String SYSTEM_STATUS_API_IP_ACL = \"SYSTEM_STATUS_API_IP_ACL\";\n+    public static final String DEFAULT_IP_ACL_VALUE     = \"127.0.0.1/32,0:0:0:0:0:0:0:1/128\";\n+    private final IndiciesAPI  indiciesAPI              =  APILocator.getIndiciesAPI();\n+\n+    public Boolean getAccessAllowed(final @Context HttpServletRequest request) throws UnknownHostException {\n+\n+        final String configIpACL = Config.getStringProperty\n+                (SYSTEM_STATUS_API_IP_ACL, DEFAULT_IP_ACL_VALUE);\n+        final String[] aclIPs = configIpACL != null?\n+                configIpACL.split(StringPool.COMMA): null;\n+\n+        final String clientIP = HttpRequestDataUtil.getIpAddress(request).\n+                toString().split(StringPool.FORWARD_SLASH)[1];\n+        boolean accessAllowed = false;\n+\n+        if(aclIPs == null) {\n+\n+            accessAllowed = true;\n+        } else {\n+\n+            for(final String aclIP : aclIPs) {\n+                if(IPUtils.isIpInCIDR(clientIP, aclIP)) {\n+                    accessAllowed = true;\n+                    break;\n+                }\n+            }\n+        }\n+\n+        return accessAllowed;\n+    } // getAccessAllowed.\n+\n+\n+    @CloseDBIfOpened\n+    public MonitorResultView getMonitorStats (final boolean extendedFormat) throws Throwable {\n+\n+        final IndiciesAPI.IndiciesInfo indiciesInfo   = this.indiciesAPI.loadIndicies();\n+        final long localFsTimeOut                     = Config.getLongProperty(\"SYSTEM_STATUS_API_LOCAL_FS_TIMEOUT\", 1000);\n+        final long cacheTimeOut                       = Config.getLongProperty(\"SYSTEM_STATUS_API_CACHE_TIMEOUT\", 1000);\n+        final long assetsFsTimeOut                    = Config.getLongProperty(\"SYSTEM_STATUS_API_ASSET_FS_TIMEOUT\", 1000);\n+        final long indexTimeout                       = Config.getLongProperty(\"SYSTEM_STATUS_API_INDEX_TIMEOUT\", 1000);\n+        final long dbTimeout                          = Config.getLongProperty(\"SYSTEM_STATUS_API_DB_TIMEOUT\", 1000);\n+        final boolean dbSelectHealthy                 = dbCount(dbTimeout);\n+        final boolean indexLiveHealthy                = indexCount(indiciesInfo.live, indexTimeout);\n+        final boolean indexWorkingHealthy             = indexCount(indiciesInfo.working, indexTimeout);\n+        final boolean cacheHealthy                    = cache(cacheTimeOut);\n+        final boolean localFSHealthy                  = localFiles(localFsTimeOut);\n+        final boolean assetFSHealthy                  = assetFiles(assetsFsTimeOut);\n+        final MonitorResultView.Builder monitorView   = new MonitorResultView.Builder();\n+\n+\n+        monitorView.dotCMSHealthy(false).frontendHealthy(false).backendHealthy(false)\n+                .dbSelectHealthy(dbSelectHealthy).indexLiveHealthy(indexLiveHealthy)\n+                .indexWorkingHealthy(indexWorkingHealthy)\n+                .cacheHealthy(cacheHealthy).localFSHealthy(localFSHealthy)\n+                .assetFSHealthy(assetFSHealthy);\n+\n+        if (extendedFormat) {\n+            monitorView.serverID(getServerID(localFsTimeOut))\n+                    .clusterID(getClusterID(dbTimeout));\n+        }\n+\n+        if (dbSelectHealthy && indexLiveHealthy && indexWorkingHealthy && cacheHealthy && localFSHealthy && assetFSHealthy) {\n+\n+            monitorView.dotCMSHealthy(true).frontendHealthy(true).backendHealthy (true);\n+        } else if (!indexWorkingHealthy && dbSelectHealthy && indexLiveHealthy && cacheHealthy && localFSHealthy && assetFSHealthy) {\n+\n+            monitorView.frontendHealthy (true);\n+        }\n+\n+        return monitorView.build();\n+    } // getMonitorStats.\n+\n+\n+    private boolean dbCount(final long dbTimeout) throws Throwable {\n+\n+        return Failsafe\n+                .with(breaker())\n+                .withFallback(Boolean.FALSE)\n+                .get(this.failFastBooleanPolicy(dbTimeout, this::dbCountCallback));\n+\n+    }\n+\n+    @CloseDBIfOpened\n+    private Boolean dbCountCallback() throws DotDataException {\n+        final DotConnect dc = new DotConnect();\n+        dc.setSQL(\"select count(*) as count from contentlet\");\n+        final List<Map<String,String>> results = dc.loadResults();\n+        long count = Long.parseLong(results.get(0).get(\"count\"));\n+        return count > 0;\n+    }\n+\n+\n+    private boolean indexCount(final String idx, final long indexTimeout) throws Throwable {\n+\n+        return Failsafe\n+                .with(breaker())\n+                .withFallback(Boolean.FALSE)\n+                .get(this.failFastBooleanPolicy(indexTimeout, () -> indexCountCallback(idx)));\n+    }\n+\n+    @CloseDBIfOpened\n+    private Boolean indexCountCallback(String idx) {\n+        final Client client = new ESClient().getClient();\n+        final long totalHits = client.prepareSearch(idx)\n+                .setQuery(QueryBuilders.termQuery(\"_type\", \"content\"))\n+                .setSize(0)\n+                .execute()\n+                .actionGet()\n+                .getHits()\n+                .getTotalHits();\n+        return totalHits > 0;\n+    }\n+\n+    private boolean cache(final long cacheTimeOut) throws Throwable {\n+\n+        return Failsafe\n+                .with(breaker())\n+                .withFallback(Boolean.FALSE)\n+                .get(this.failFastBooleanPolicy(cacheTimeOut, this::cacheCallback));\n+\n+    }\n+\n+    @CloseDBIfOpened\n+    private Boolean cacheCallback() {\n+\n+        Identifier id = null;\n+\n+        try {\n+            id = APILocator.getIdentifierAPI().loadFromCache(Host.SYSTEM_HOST);\n+            if(id==null || !UtilMethods.isSet(id.getId())){\n+                id =  APILocator.getIdentifierAPI().find(Host.SYSTEM_HOST);\n+                id =  APILocator.getIdentifierAPI().loadFromCache(Host.SYSTEM_HOST);\n+            }\n+        } catch (DotDataException e) {\n+            Logger.error(this, e.getMessage(), e);\n+        }\n+\n+        return id!=null && UtilMethods.isSet(id.getId());\n+    }\n+\n+\n+    private boolean localFiles(final long localFsTimeOut) throws Throwable {\n+\n+        return Failsafe\n+                .with(breaker())\n+                .withFallback(Boolean.FALSE)\n+                .get(this.failFastBooleanPolicy(localFsTimeOut, () -> {\n+\n+                    final String realPath = ConfigUtils.getDynamicContentPath()\n+                            + File.separator\n+                            + \"monitor\"\n+                            + File.separator\n+                            + System.currentTimeMillis();\n+                    File file = new File(realPath);\n+                    file.mkdirs();\n+                    file.delete();\n+                    file.createNewFile();\n+\n+                    try(OutputStream os = Files.newOutputStream(file.toPath())){\n+                        os.write(UUIDUtil.uuid().getBytes());\n+                    }\n+                    file.delete();\n+                    return Boolean.TRUE;\n+                }));\n+    }\n+\n+\n+    private boolean assetFiles(final long assetsFsTimeOut) throws Throwable {\n+\n+        return Failsafe\n+                .with(breaker())\n+                .withFallback(Boolean.FALSE)\n+                .get(this.failFastBooleanPolicy(assetsFsTimeOut, () -> {\n+                    final String realPath =APILocator.getFileAssetAPI().getRealAssetPath(UUIDUtil.uuid());\n+                    final File file = new File(realPath);\n+                    file.mkdirs();\n+                    file.delete();\n+                    file.createNewFile();\n+\n+                    try(OutputStream os = Files.newOutputStream(file.toPath())){\n+                        os.write(UUIDUtil.uuid().getBytes());\n+                    }\n+                    file.delete();\n+\n+                    return true;\n+                }));\n+    }\n+\n+    private Callable<Boolean> failFastBooleanPolicy(long thresholdMilliseconds, final Callable<Boolean> callable) throws Throwable {\n+        return ()-> {\n+            try {\n+                final DotSubmitter executorService = DotConcurrentFactory.getInstance().getSubmitter(DotConcurrentFactory.DOT_SYSTEM_THREAD_POOL);\n+                final Future<Boolean> task = executorService.submit(callable);\n+                return task.get(thresholdMilliseconds, TimeUnit.MILLISECONDS);\n+            } catch (ExecutionException e) {\n+                throw new InternalServerErrorException(\"Internal exception \", e.getCause());\n+            } catch (TimeoutException e) {\n+                throw new InternalServerErrorException(\"Execution aborted, exceeded allowed \" + thresholdMilliseconds + \" threshold\", e.getCause());","path":"dotCMS/src/main/java/com/dotcms/rest/api/v1/system/monitor/MonitorHelper.java","position":233,"original_position":233,"commit_id":"9313fcc13e1df3a9bddd67a663c15355bfeb5644","original_commit_id":"9313fcc13e1df3a9bddd67a663c15355bfeb5644","user":{"login":"codacy-bot","id":19940114,"node_id":"MDQ6VXNlcjE5OTQwMTE0","avatar_url":"https://avatars1.githubusercontent.com/u/19940114?v=4","gravatar_id":"","url":"https://api.github.com/users/codacy-bot","html_url":"https://github.com/codacy-bot","followers_url":"https://api.github.com/users/codacy-bot/followers","following_url":"https://api.github.com/users/codacy-bot/following{/other_user}","gists_url":"https://api.github.com/users/codacy-bot/gists{/gist_id}","starred_url":"https://api.github.com/users/codacy-bot/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/codacy-bot/subscriptions","organizations_url":"https://api.github.com/users/codacy-bot/orgs","repos_url":"https://api.github.com/users/codacy-bot/repos","events_url":"https://api.github.com/users/codacy-bot/events{/privacy}","received_events_url":"https://api.github.com/users/codacy-bot/received_events","type":"User","site_admin":false},"body":"![Codacy](https://app.codacy.com/assets/images/favicon.png) Issue found: [New exception is thrown in catch block, original stack trace may be lost](https://app.codacy.com/app/dotCMS/core/pullRequest?prid=1909357)","created_at":"2018-07-16T22:41:18Z","updated_at":"2018-07-16T22:41:18Z","html_url":"https://github.com/dotCMS/core/pull/14855#discussion_r202847332","pull_request_url":"https://api.github.com/repos/dotCMS/core/pulls/14855","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/dotCMS/core/pulls/comments/202847332"},"html":{"href":"https://github.com/dotCMS/core/pull/14855#discussion_r202847332"},"pull_request":{"href":"https://api.github.com/repos/dotCMS/core/pulls/14855"}}},"pull_request":{"url":"https://api.github.com/repos/dotCMS/core/pulls/14855","id":201777828,"node_id":"MDExOlB1bGxSZXF1ZXN0MjAxNzc3ODI4","html_url":"https://github.com/dotCMS/core/pull/14855","diff_url":"https://github.com/dotCMS/core/pull/14855.diff","patch_url":"https://github.com/dotCMS/core/pull/14855.patch","issue_url":"https://api.github.com/repos/dotCMS/core/issues/14855","number":14855,"state":"open","locked":false,"title":"Issue 14764 move system monitor into core refactor5.0","user":{"login":"jdotcms","id":19578350,"node_id":"MDQ6VXNlcjE5NTc4MzUw","avatar_url":"https://avatars0.githubusercontent.com/u/19578350?v=4","gravatar_id":"","url":"https://api.github.com/users/jdotcms","html_url":"https://github.com/jdotcms","followers_url":"https://api.github.com/users/jdotcms/followers","following_url":"https://api.github.com/users/jdotcms/following{/other_user}","gists_url":"https://api.github.com/users/jdotcms/gists{/gist_id}","starred_url":"https://api.github.com/users/jdotcms/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jdotcms/subscriptions","organizations_url":"https://api.github.com/users/jdotcms/orgs","repos_url":"https://api.github.com/users/jdotcms/repos","events_url":"https://api.github.com/users/jdotcms/events{/privacy}","received_events_url":"https://api.github.com/users/jdotcms/received_events","type":"User","site_admin":false},"body":"","created_at":"2018-07-16T22:30:51Z","updated_at":"2018-07-16T22:41:18Z","closed_at":null,"merged_at":null,"merge_commit_sha":"0ac0081a948813ec79c9591b3f45a910962db3d0","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/dotCMS/core/pulls/14855/commits","review_comments_url":"https://api.github.com/repos/dotCMS/core/pulls/14855/comments","review_comment_url":"https://api.github.com/repos/dotCMS/core/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dotCMS/core/issues/14855/comments","statuses_url":"https://api.github.com/repos/dotCMS/core/statuses/9313fcc13e1df3a9bddd67a663c15355bfeb5644","head":{"label":"dotCMS:issue-14764-move-system-monitor-into-core-refactor5.0","ref":"issue-14764-move-system-monitor-into-core-refactor5.0","sha":"9313fcc13e1df3a9bddd67a663c15355bfeb5644","user":{"login":"dotCMS","id":1005263,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEwMDUyNjM=","avatar_url":"https://avatars3.githubusercontent.com/u/1005263?v=4","gravatar_id":"","url":"https://api.github.com/users/dotCMS","html_url":"https://github.com/dotCMS","followers_url":"https://api.github.com/users/dotCMS/followers","following_url":"https://api.github.com/users/dotCMS/following{/other_user}","gists_url":"https://api.github.com/users/dotCMS/gists{/gist_id}","starred_url":"https://api.github.com/users/dotCMS/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dotCMS/subscriptions","organizations_url":"https://api.github.com/users/dotCMS/orgs","repos_url":"https://api.github.com/users/dotCMS/repos","events_url":"https://api.github.com/users/dotCMS/events{/privacy}","received_events_url":"https://api.github.com/users/dotCMS/received_events","type":"Organization","site_admin":false},"repo":{"id":3729629,"node_id":"MDEwOlJlcG9zaXRvcnkzNzI5NjI5","name":"core","full_name":"dotCMS/core","owner":{"login":"dotCMS","id":1005263,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEwMDUyNjM=","avatar_url":"https://avatars3.githubusercontent.com/u/1005263?v=4","gravatar_id":"","url":"https://api.github.com/users/dotCMS","html_url":"https://github.com/dotCMS","followers_url":"https://api.github.com/users/dotCMS/followers","following_url":"https://api.github.com/users/dotCMS/following{/other_user}","gists_url":"https://api.github.com/users/dotCMS/gists{/gist_id}","starred_url":"https://api.github.com/users/dotCMS/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dotCMS/subscriptions","organizations_url":"https://api.github.com/users/dotCMS/orgs","repos_url":"https://api.github.com/users/dotCMS/repos","events_url":"https://api.github.com/users/dotCMS/events{/privacy}","received_events_url":"https://api.github.com/users/dotCMS/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/dotCMS/core","description":"Source Code for dotCMS Java Enterprise Content Management System","fork":false,"url":"https://api.github.com/repos/dotCMS/core","forks_url":"https://api.github.com/repos/dotCMS/core/forks","keys_url":"https://api.github.com/repos/dotCMS/core/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dotCMS/core/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dotCMS/core/teams","hooks_url":"https://api.github.com/repos/dotCMS/core/hooks","issue_events_url":"https://api.github.com/repos/dotCMS/core/issues/events{/number}","events_url":"https://api.github.com/repos/dotCMS/core/events","assignees_url":"https://api.github.com/repos/dotCMS/core/assignees{/user}","branches_url":"https://api.github.com/repos/dotCMS/core/branches{/branch}","tags_url":"https://api.github.com/repos/dotCMS/core/tags","blobs_url":"https://api.github.com/repos/dotCMS/core/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dotCMS/core/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dotCMS/core/git/refs{/sha}","trees_url":"https://api.github.com/repos/dotCMS/core/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dotCMS/core/statuses/{sha}","languages_url":"https://api.github.com/repos/dotCMS/core/languages","stargazers_url":"https://api.github.com/repos/dotCMS/core/stargazers","contributors_url":"https://api.github.com/repos/dotCMS/core/contributors","subscribers_url":"https://api.github.com/repos/dotCMS/core/subscribers","subscription_url":"https://api.github.com/repos/dotCMS/core/subscription","commits_url":"https://api.github.com/repos/dotCMS/core/commits{/sha}","git_commits_url":"https://api.github.com/repos/dotCMS/core/git/commits{/sha}","comments_url":"https://api.github.com/repos/dotCMS/core/comments{/number}","issue_comment_url":"https://api.github.com/repos/dotCMS/core/issues/comments{/number}","contents_url":"https://api.github.com/repos/dotCMS/core/contents/{+path}","compare_url":"https://api.github.com/repos/dotCMS/core/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dotCMS/core/merges","archive_url":"https://api.github.com/repos/dotCMS/core/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dotCMS/core/downloads","issues_url":"https://api.github.com/repos/dotCMS/core/issues{/number}","pulls_url":"https://api.github.com/repos/dotCMS/core/pulls{/number}","milestones_url":"https://api.github.com/repos/dotCMS/core/milestones{/number}","notifications_url":"https://api.github.com/repos/dotCMS/core/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dotCMS/core/labels{/name}","releases_url":"https://api.github.com/repos/dotCMS/core/releases{/id}","deployments_url":"https://api.github.com/repos/dotCMS/core/deployments","created_at":"2012-03-15T15:24:14Z","updated_at":"2018-07-16T19:43:24Z","pushed_at":"2018-07-16T22:30:52Z","git_url":"git://github.com/dotCMS/core.git","ssh_url":"git@github.com:dotCMS/core.git","clone_url":"https://github.com/dotCMS/core.git","svn_url":"https://github.com/dotCMS/core","homepage":"http://dotcms.com","size":310344,"stargazers_count":382,"watchers_count":382,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":313,"mirror_url":null,"archived":false,"open_issues_count":1954,"license":{"key":"gpl-3.0","name":"GNU General Public License v3.0","spdx_id":"GPL-3.0","url":"https://api.github.com/licenses/gpl-3.0","node_id":"MDc6TGljZW5zZTk="},"forks":313,"open_issues":1954,"watchers":382,"default_branch":"master"}},"base":{"label":"dotCMS:master","ref":"master","sha":"e01c93d30fe2308683ef17d46cd948777821d900","user":{"login":"dotCMS","id":1005263,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEwMDUyNjM=","avatar_url":"https://avatars3.githubusercontent.com/u/1005263?v=4","gravatar_id":"","url":"https://api.github.com/users/dotCMS","html_url":"https://github.com/dotCMS","followers_url":"https://api.github.com/users/dotCMS/followers","following_url":"https://api.github.com/users/dotCMS/following{/other_user}","gists_url":"https://api.github.com/users/dotCMS/gists{/gist_id}","starred_url":"https://api.github.com/users/dotCMS/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dotCMS/subscriptions","organizations_url":"https://api.github.com/users/dotCMS/orgs","repos_url":"https://api.github.com/users/dotCMS/repos","events_url":"https://api.github.com/users/dotCMS/events{/privacy}","received_events_url":"https://api.github.com/users/dotCMS/received_events","type":"Organization","site_admin":false},"repo":{"id":3729629,"node_id":"MDEwOlJlcG9zaXRvcnkzNzI5NjI5","name":"core","full_name":"dotCMS/core","owner":{"login":"dotCMS","id":1005263,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEwMDUyNjM=","avatar_url":"https://avatars3.githubusercontent.com/u/1005263?v=4","gravatar_id":"","url":"https://api.github.com/users/dotCMS","html_url":"https://github.com/dotCMS","followers_url":"https://api.github.com/users/dotCMS/followers","following_url":"https://api.github.com/users/dotCMS/following{/other_user}","gists_url":"https://api.github.com/users/dotCMS/gists{/gist_id}","starred_url":"https://api.github.com/users/dotCMS/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dotCMS/subscriptions","organizations_url":"https://api.github.com/users/dotCMS/orgs","repos_url":"https://api.github.com/users/dotCMS/repos","events_url":"https://api.github.com/users/dotCMS/events{/privacy}","received_events_url":"https://api.github.com/users/dotCMS/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/dotCMS/core","description":"Source Code for dotCMS Java Enterprise Content Management System","fork":false,"url":"https://api.github.com/repos/dotCMS/core","forks_url":"https://api.github.com/repos/dotCMS/core/forks","keys_url":"https://api.github.com/repos/dotCMS/core/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dotCMS/core/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dotCMS/core/teams","hooks_url":"https://api.github.com/repos/dotCMS/core/hooks","issue_events_url":"https://api.github.com/repos/dotCMS/core/issues/events{/number}","events_url":"https://api.github.com/repos/dotCMS/core/events","assignees_url":"https://api.github.com/repos/dotCMS/core/assignees{/user}","branches_url":"https://api.github.com/repos/dotCMS/core/branches{/branch}","tags_url":"https://api.github.com/repos/dotCMS/core/tags","blobs_url":"https://api.github.com/repos/dotCMS/core/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dotCMS/core/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dotCMS/core/git/refs{/sha}","trees_url":"https://api.github.com/repos/dotCMS/core/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dotCMS/core/statuses/{sha}","languages_url":"https://api.github.com/repos/dotCMS/core/languages","stargazers_url":"https://api.github.com/repos/dotCMS/core/stargazers","contributors_url":"https://api.github.com/repos/dotCMS/core/contributors","subscribers_url":"https://api.github.com/repos/dotCMS/core/subscribers","subscription_url":"https://api.github.com/repos/dotCMS/core/subscription","commits_url":"https://api.github.com/repos/dotCMS/core/commits{/sha}","git_commits_url":"https://api.github.com/repos/dotCMS/core/git/commits{/sha}","comments_url":"https://api.github.com/repos/dotCMS/core/comments{/number}","issue_comment_url":"https://api.github.com/repos/dotCMS/core/issues/comments{/number}","contents_url":"https://api.github.com/repos/dotCMS/core/contents/{+path}","compare_url":"https://api.github.com/repos/dotCMS/core/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dotCMS/core/merges","archive_url":"https://api.github.com/repos/dotCMS/core/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dotCMS/core/downloads","issues_url":"https://api.github.com/repos/dotCMS/core/issues{/number}","pulls_url":"https://api.github.com/repos/dotCMS/core/pulls{/number}","milestones_url":"https://api.github.com/repos/dotCMS/core/milestones{/number}","notifications_url":"https://api.github.com/repos/dotCMS/core/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dotCMS/core/labels{/name}","releases_url":"https://api.github.com/repos/dotCMS/core/releases{/id}","deployments_url":"https://api.github.com/repos/dotCMS/core/deployments","created_at":"2012-03-15T15:24:14Z","updated_at":"2018-07-16T19:43:24Z","pushed_at":"2018-07-16T22:30:52Z","git_url":"git://github.com/dotCMS/core.git","ssh_url":"git@github.com:dotCMS/core.git","clone_url":"https://github.com/dotCMS/core.git","svn_url":"https://github.com/dotCMS/core","homepage":"http://dotcms.com","size":310344,"stargazers_count":382,"watchers_count":382,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":313,"mirror_url":null,"archived":false,"open_issues_count":1954,"license":{"key":"gpl-3.0","name":"GNU General Public License v3.0","spdx_id":"GPL-3.0","url":"https://api.github.com/licenses/gpl-3.0","node_id":"MDc6TGljZW5zZTk="},"forks":313,"open_issues":1954,"watchers":382,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dotCMS/core/pulls/14855"},"html":{"href":"https://github.com/dotCMS/core/pull/14855"},"issue":{"href":"https://api.github.com/repos/dotCMS/core/issues/14855"},"comments":{"href":"https://api.github.com/repos/dotCMS/core/issues/14855/comments"},"review_comments":{"href":"https://api.github.com/repos/dotCMS/core/pulls/14855/comments"},"review_comment":{"href":"https://api.github.com/repos/dotCMS/core/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dotCMS/core/pulls/14855/commits"},"statuses":{"href":"https://api.github.com/repos/dotCMS/core/statuses/9313fcc13e1df3a9bddd67a663c15355bfeb5644"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"codacy-bot"}}