{"action":"created","comment":{"url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/pulls/comments/28164369","id":28164369,"diff_hunk":"@@ -0,0 +1,527 @@\n+package com.redhat.lightblue.rest.audit;\n+\n+import com.google.common.base.Stopwatch;\n+import org.slf4j.Logger;\n+import org.slf4j.LoggerFactory;\n+\n+import javax.servlet.*;\n+import javax.servlet.annotation.WebFilter;\n+import javax.servlet.http.HttpServletRequest;\n+import javax.servlet.http.HttpServletResponse;\n+import javax.servlet.http.HttpServletResponseWrapper;\n+import java.io.ByteArrayOutputStream;\n+import java.io.IOException;\n+import java.io.PrintWriter;\n+import java.security.Principal;\n+import java.text.SimpleDateFormat;\n+import java.util.Date;\n+import java.util.concurrent.TimeUnit;\n+import java.util.regex.Matcher;\n+import java.util.regex.Pattern;\n+\n+/**\n+ * Filter all the request which must have data or metadata as their context path\n+ *\n+ * Created by lcestari on 4/1/15.\n+ */\n+@WebFilter(urlPatterns = { \"/*\" }) // Handle any request\n+public class LightblueAuditServletFilter implements Filter {\n+\n+    //GET\n+    //AbstractCrudResource @Path(\"/find/{entity}\") or @Path(\"/find/{entity}/{version}\") w/ querystring simpleFind\n+    public static final Pattern simpleFindVersionRegex = Pattern.compile(\"/+find/+(\\\\w+)/+([\\\\S]+)/*\");\n+    public static final Pattern simpleFindRegex = Pattern.compile(\"/+find/+(\\\\w+)/*\");\n+    //AbstractMetadataResource @Path(\"/dependencies\") or @Path(\"/{entity}/dependencies\") or @Path(\"/{entity}/{version}/dependencies\")\n+    public static final Pattern getDepGraphVersionRegex = Pattern.compile(\"/+(\\\\w+)/+([\\\\S]+)/+dependencies/*\");\n+    public static final Pattern getDepGraphEntityRegex = Pattern.compile(\"/+(\\\\w+)/+dependencies/*\");\n+    public static final Pattern getDepGraphRegex = Pattern.compile(\"/+dependencies/*\");\n+    //AbstractMetadataResource @Path(\"/roles\") or @Path(\"/{entity}/roles\") or @Path(\"/{entity}/{version}/roles\") getEntityRoles\n+    public static final Pattern getEntityRolesVersionRegex = Pattern.compile(\"/+(\\\\w+)/+([\\\\S]+)/+roles/*\");\n+    public static final Pattern getEntityRolesEntityRegex = Pattern.compile(\"/+(\\\\w+)/+roles/*\");\n+    public static final Pattern getEntityRolesRegex = Pattern.compile(\"/+roles/*\");\n+    //AbstractMetadataResource @Path(\"/\") or @Path(\"/s={statuses}\") getEntityNames\n+    public static final Pattern getEntityNamesRegex = Pattern.compile(\"/*\");\n+    public static final Pattern getEntityNamesStatusRegex = Pattern.compile(\"/+s=(\\\\w+)/*\");\n+    //AbstractMetadataResource @Path(\"/{entity}\") getEntityVersions\n+    public static final Pattern getEntityVersionsRegex = Pattern.compile(\"/+(\\\\w+)/*\");\n+    //AbstractMetadataResource @Path(\"/{entity}/{version}\") getMetadata\n+    public static final Pattern getMetadataRegex = Pattern.compile(\"/+(\\\\w+)/+([\\\\S]+)/*\");\n+\n+    //POST\n+    //AbstractCrudResource @Path(\"/save/{entity}\") or @Path(\"/save/{entity}/{version}\") save\n+    public static final Pattern saveRegex = Pattern.compile(\"/+save/+(\\\\w+)/*\");\n+    public static final Pattern saveVersionRegex = Pattern.compile(\"/+save/+(\\\\w+)/+([\\\\S]+)/*\");\n+    //AbstractCrudResource @Path(\"/update/{entity}\") or @Path(\"/update/{entity}/{version}\") update\n+    public static final Pattern updateRegex = Pattern.compile(\"/+update/+(\\\\w+)/*\");\n+    public static final Pattern updateVersionRegex = Pattern.compile(\"/+update/+(\\\\w+)/+([\\\\S]+)/*\");\n+    //AbstractCrudResource @Path(\"/delete/{entity}\") or @Path(\"/delete/{entity}/{version}\") delete\n+    public static final Pattern deleteRegex = Pattern.compile(\"/+delete/+(\\\\w+)/*\");\n+    public static final Pattern deleteVersionRegex = Pattern.compile(\"/+delete/+(\\\\w+)/+([\\\\S]+)/*\");\n+    //AbstractCrudResource @Path(\"/find/{entity}\") or @Path(\"/find/{entity}/{version}\") find\n+    public static final Pattern findRegex = Pattern.compile(\"/+find/+(\\\\w+)/*\");\n+    public static final Pattern findVersionRegex = Pattern.compile(\"/+find/+(\\\\w+)/+([\\\\S]+)/*\");\n+    //AbstractMetadataResource @Path(\"/{entity}/{version}/default\") setDefaultVersion\n+    public static final Pattern setDefaultVersionRegex = Pattern.compile(\"/+(\\\\w+)/+([\\\\S]+)/+default/*\");\n+\n+    //PUT\n+    //AbstractCrudResource @Path(\"/insert/{entity}\") or @Path(\"/insert/{entity}/{version}\")  insert\n+    public static final Pattern insertRegex = Pattern.compile(\"/+insert/+(\\\\w+)/*\");\n+    public static final Pattern insertVersionRegex = Pattern.compile(\"/+insert/+(\\\\w+)/+([\\\\S]+)/*\");\n+    //AbstractCrudResource @Path(\"/{entity}\") or @Path(\"/{entity}/{version}\") is insertAlt\n+    public static final Pattern insertAltRegex = Pattern.compile(\"/+(\\\\w+)/*\");\n+    public static final Pattern insertAltVersionRegex = Pattern.compile(\"/+(\\\\w+)/+([\\\\S]+)/*\");\n+    //AbstractMetadataResource @Path(\"/{entity}/{version}\") createMetadata\n+    public static final Pattern createMetadataRegex = Pattern.compile(\"/+(\\\\w+)/+([\\\\S]+)/*\");\n+    //AbstractMetadataResource @Path(\"/{entity}/schema={version}\") createSchema\n+    public static final Pattern createSchemaRegex = Pattern.compile(\"/+(\\\\w+)/+schema=([\\\\S]+)/*\");\n+    //AbstractMetadataResource @Path(\"/{entity}\") updateEntityInfo\n+    public static final Pattern updateEntityInfoRegex = Pattern.compile(\"/+(\\\\w+)/*\");\n+    //AbstractMetadataResource @Path(\"/{entity}/{version}/{status}\") updateSchemaStatus\n+    public static final Pattern updateSchemaStatusRegex = Pattern.compile(\"/+(\\\\w+)/+([\\\\S]+)/+(\\\\w+)/*\");\n+\n+    //DELETE\n+    //AbstractMetadataResource @Path(\"/{entity}\") removeEntity\n+    public static final Pattern removeEntityRegex = Pattern.compile(\"/+(\\\\w+)/*\");\n+    //AbstractMetadataResource @Path(\"/{entity}/default\") clearDefaultVersion\n+    public static final Pattern clearDefaultVersionRegex = Pattern.compile(\"/+(\\\\w+)/+default/*\");\n+\n+\n+    public static final Pattern metatadataRegex = Pattern.compile(\"/+metadata/*\");\n+    public static final Pattern crudRegex = Pattern.compile(\"/+data/*\");\n+    public static final String YYYY_MM_DD_T_HH_MM_SS_SSSZ = \"yyyy-MM-dd'T'HH:mm:ss.SSSZ\";\n+\n+    private static final Logger LOGGER = LoggerFactory.getLogger(LightblueAuditServletFilter.class);\n+    private static final ThreadLocal<SimpleDateFormat> threadDateFormat =  new ThreadLocal<>();\n+\n+    @Override\n+    public void doFilter(ServletRequest req, ServletResponse res,\n+                         FilterChain fChain) throws IOException, ServletException {\n+        /*\n+         NOTE: do not log:\n+           - query parameters\n+           - request body\n+         */\n+        if(LOGGER.isDebugEnabled()) {\n+            LOGGER.debug(\"LightblueAuditServletFilter.doFilter invoked - begin\");\n+        }\n+\n+        HttpServletRequest hReq = (HttpServletRequest) req;\n+        Principal p = hReq.getUserPrincipal();\n+        Stopwatch stopwatch = null;\n+        LogEntryBuilder logEntryBuilder = null;\n+\n+        boolean isMetadata = metatadataRegex.matcher(hReq.getContextPath()).matches();\n+        boolean isCrud = crudRegex.matcher(hReq.getContextPath()).matches();\n+\n+        // audit authenticated requests\n+        boolean auditReqFlag = p != null && (isMetadata || isCrud);\n+\n+        if(auditReqFlag){\n+            if(threadDateFormat.get() == null){\n+                threadDateFormat.set(new SimpleDateFormat(YYYY_MM_DD_T_HH_MM_SS_SSSZ));\n+            }\n+            logEntryBuilder = new LogEntryBuilder();\n+            logEntryBuilder.setPrincipal(p);\n+            logEntryBuilder.setRequestSize(hReq.getContentLength());\n+            logEntryBuilder.setTimestampText(threadDateFormat.get().format(new Date()));\n+            logEntryBuilder.setResource(hReq.getContextPath());\n+\n+            setOperationEnittyVersionStatus(hReq, isMetadata, logEntryBuilder);\n+\n+\n+            HttpServletResponse httpServletResponse = (HttpServletResponse) res;\n+            HttpServletResponse httpServletResponseWrapperBuffered = new HttpServletResponseWrapperBuffered(httpServletResponse,new ByteArrayPrintWriter());\n+            res = httpServletResponseWrapperBuffered;\n+        }\n+\n+        if(auditReqFlag) {\n+            stopwatch = Stopwatch.createStarted();\n+        }\n+\n+        fChain.doFilter(hReq, res);\n+\n+        if(auditReqFlag) {\n+            stopwatch.stop();\n+            long elapsedTime = stopwatch.elapsed(TimeUnit.NANOSECONDS); // elapsedTime in ns\n+            logEntryBuilder.setTimeElapsedInNs(elapsedTime);\n+            HttpServletResponseWrapperBuffered httpServletResponseWrapperBuffered = (HttpServletResponseWrapperBuffered) res;\n+            httpServletResponseWrapperBuffered.byteArrayPrintWriter.printWriter.flush();\n+            byte[] bytes = httpServletResponseWrapperBuffered.byteArrayPrintWriter.toByteArray();\n+            res.getOutputStream().write(bytes);\n+            logEntryBuilder.setResponseSize(bytes.length);\n+            final LogEntry logEntry = logEntryBuilder.createLogEntry();\n+            String logEntryString = String.format(\n+                    \"Audited lightblue rest request => \" +\n+                            \"{ \" +\n+                                \"\\\"initialTimestamp\\\":\\\"%s\\\", \" +\n+                                \"\\\"currentTimestamp\\\":\\\"%s\\\" , \" +\n+                                \"\\\"principal\\\":\\\"%s\\\" , \" +\n+                                \"\\\"resource\\\":\\\"%s\\\" , \" +\n+                                \"\\\"operation\\\":\\\"%s\\\" , \" +\n+                                \"\\\"entityName\\\":\\\"%s\\\" , \" +\n+                                \"\\\"entityVersion\\\":\\\"%s\\\" , \" +\n+                                \"\\\"entityStatus\\\":\\\"%s\\\" , \" +\n+                                \"\\\"requestSize\\\":\\\"%d\\\" , \" +\n+                                \"\\\"responseSize\\\":\\\"%d\\\" , \" +\n+                                \"\\\"timeElapsedInNs\\\":\\\"%d\\\"  \" +\n+                            \" }\",\n+                    logEntry.getTimestampText(),\n+                    threadDateFormat.get().format(new Date()),\n+                    logEntry.getPrincipal().getName(),\n+                    logEntry.getResource(),\n+                    logEntry.getOperation(),\n+                    logEntry.getEntityName(),\n+                    logEntry.getEntityVersion(),\n+                    logEntry.getEntityStatus(),\n+                    logEntry.getRequestSize(),\n+                    logEntry.getResponseSize(),\n+                    logEntry.getTimeElapsedInNs()\n+            );\n+            LOGGER.info(logEntryString);\n+        }\n+\n+        if(LOGGER.isDebugEnabled()) {\n+            LOGGER.debug(\"LightblueAuditServletFilter.doFilter invoked - end\");\n+        }\n+    }\n+\n+    protected void setOperationEnittyVersionStatus(HttpServletRequest hReq, boolean isMetadata, LogEntryBuilder logEntryBuilder) {","path":"common/src/main/java/com/redhat/lightblue/rest/audit/LightblueAuditServletFilter.java","position":188,"original_position":188,"commit_id":"358c699d1550f8c83211cf1dfb9161c1047f617e","original_commit_id":"358c699d1550f8c83211cf1dfb9161c1047f617e","user":{"login":"dcrissman","id":1878960,"avatar_url":"https://avatars.githubusercontent.com/u/1878960?v=3","gravatar_id":"","url":"https://api.github.com/users/dcrissman","html_url":"https://github.com/dcrissman","followers_url":"https://api.github.com/users/dcrissman/followers","following_url":"https://api.github.com/users/dcrissman/following{/other_user}","gists_url":"https://api.github.com/users/dcrissman/gists{/gist_id}","starred_url":"https://api.github.com/users/dcrissman/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dcrissman/subscriptions","organizations_url":"https://api.github.com/users/dcrissman/orgs","repos_url":"https://api.github.com/users/dcrissman/repos","events_url":"https://api.github.com/users/dcrissman/events{/privacy}","received_events_url":"https://api.github.com/users/dcrissman/received_events","type":"User","site_admin":false},"body":"No, I meant something like this...\r\n```java\r\nMatcher m;\r\nif((m = pattern1.matcher(\"\")).matches()){\r\n  //do something\r\n}\r\nelse if((m = pattern2.matcher(\"\")).matches()){\r\n  //do something else\r\n}\r\n//etc\r\n","created_at":"2015-04-10T17:36:17Z","updated_at":"2015-04-10T17:36:17Z","html_url":"https://github.com/lightblue-platform/lightblue-rest/pull/128#discussion_r28164369","pull_request_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/pulls/128","_links":{"self":{"href":"https://api.github.com/repos/lightblue-platform/lightblue-rest/pulls/comments/28164369"},"html":{"href":"https://github.com/lightblue-platform/lightblue-rest/pull/128#discussion_r28164369"},"pull_request":{"href":"https://api.github.com/repos/lightblue-platform/lightblue-rest/pulls/128"}}},"pull_request":{"url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/pulls/128","id":32627385,"html_url":"https://github.com/lightblue-platform/lightblue-rest/pull/128","diff_url":"https://github.com/lightblue-platform/lightblue-rest/pull/128.diff","patch_url":"https://github.com/lightblue-platform/lightblue-rest/pull/128.patch","issue_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/issues/128","number":128,"state":"open","locked":false,"title":"Fixes #120: Log/audit access for REST requests ","user":{"login":"luan-cestari","id":1569137,"avatar_url":"https://avatars.githubusercontent.com/u/1569137?v=3","gravatar_id":"","url":"https://api.github.com/users/luan-cestari","html_url":"https://github.com/luan-cestari","followers_url":"https://api.github.com/users/luan-cestari/followers","following_url":"https://api.github.com/users/luan-cestari/following{/other_user}","gists_url":"https://api.github.com/users/luan-cestari/gists{/gist_id}","starred_url":"https://api.github.com/users/luan-cestari/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/luan-cestari/subscriptions","organizations_url":"https://api.github.com/users/luan-cestari/orgs","repos_url":"https://api.github.com/users/luan-cestari/repos","events_url":"https://api.github.com/users/luan-cestari/events{/privacy}","received_events_url":"https://api.github.com/users/luan-cestari/received_events","type":"User","site_admin":false},"body":"PR for the issue https://github.com/lightblue-platform/lightblue-rest/issues/120","created_at":"2015-04-04T02:17:33Z","updated_at":"2015-04-10T17:36:17Z","closed_at":null,"merged_at":null,"merge_commit_sha":"3dd465272832684d8050a7e62682043830b77c4d","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/pulls/128/commits","review_comments_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/pulls/128/comments","review_comment_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/pulls/comments{/number}","comments_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/issues/128/comments","statuses_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/statuses/358c699d1550f8c83211cf1dfb9161c1047f617e","head":{"label":"luan-cestari:bug-fix-lightblue-platform/lightblue-rest#120","ref":"bug-fix-lightblue-platform/lightblue-rest#120","sha":"358c699d1550f8c83211cf1dfb9161c1047f617e","user":{"login":"luan-cestari","id":1569137,"avatar_url":"https://avatars.githubusercontent.com/u/1569137?v=3","gravatar_id":"","url":"https://api.github.com/users/luan-cestari","html_url":"https://github.com/luan-cestari","followers_url":"https://api.github.com/users/luan-cestari/followers","following_url":"https://api.github.com/users/luan-cestari/following{/other_user}","gists_url":"https://api.github.com/users/luan-cestari/gists{/gist_id}","starred_url":"https://api.github.com/users/luan-cestari/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/luan-cestari/subscriptions","organizations_url":"https://api.github.com/users/luan-cestari/orgs","repos_url":"https://api.github.com/users/luan-cestari/repos","events_url":"https://api.github.com/users/luan-cestari/events{/privacy}","received_events_url":"https://api.github.com/users/luan-cestari/received_events","type":"User","site_admin":false},"repo":{"id":23070899,"name":"lightblue-rest","full_name":"luan-cestari/lightblue-rest","owner":{"login":"luan-cestari","id":1569137,"avatar_url":"https://avatars.githubusercontent.com/u/1569137?v=3","gravatar_id":"","url":"https://api.github.com/users/luan-cestari","html_url":"https://github.com/luan-cestari","followers_url":"https://api.github.com/users/luan-cestari/followers","following_url":"https://api.github.com/users/luan-cestari/following{/other_user}","gists_url":"https://api.github.com/users/luan-cestari/gists{/gist_id}","starred_url":"https://api.github.com/users/luan-cestari/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/luan-cestari/subscriptions","organizations_url":"https://api.github.com/users/luan-cestari/orgs","repos_url":"https://api.github.com/users/luan-cestari/repos","events_url":"https://api.github.com/users/luan-cestari/events{/privacy}","received_events_url":"https://api.github.com/users/luan-cestari/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/luan-cestari/lightblue-rest","description":"","fork":true,"url":"https://api.github.com/repos/luan-cestari/lightblue-rest","forks_url":"https://api.github.com/repos/luan-cestari/lightblue-rest/forks","keys_url":"https://api.github.com/repos/luan-cestari/lightblue-rest/keys{/key_id}","collaborators_url":"https://api.github.com/repos/luan-cestari/lightblue-rest/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/luan-cestari/lightblue-rest/teams","hooks_url":"https://api.github.com/repos/luan-cestari/lightblue-rest/hooks","issue_events_url":"https://api.github.com/repos/luan-cestari/lightblue-rest/issues/events{/number}","events_url":"https://api.github.com/repos/luan-cestari/lightblue-rest/events","assignees_url":"https://api.github.com/repos/luan-cestari/lightblue-rest/assignees{/user}","branches_url":"https://api.github.com/repos/luan-cestari/lightblue-rest/branches{/branch}","tags_url":"https://api.github.com/repos/luan-cestari/lightblue-rest/tags","blobs_url":"https://api.github.com/repos/luan-cestari/lightblue-rest/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/luan-cestari/lightblue-rest/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/luan-cestari/lightblue-rest/git/refs{/sha}","trees_url":"https://api.github.com/repos/luan-cestari/lightblue-rest/git/trees{/sha}","statuses_url":"https://api.github.com/repos/luan-cestari/lightblue-rest/statuses/{sha}","languages_url":"https://api.github.com/repos/luan-cestari/lightblue-rest/languages","stargazers_url":"https://api.github.com/repos/luan-cestari/lightblue-rest/stargazers","contributors_url":"https://api.github.com/repos/luan-cestari/lightblue-rest/contributors","subscribers_url":"https://api.github.com/repos/luan-cestari/lightblue-rest/subscribers","subscription_url":"https://api.github.com/repos/luan-cestari/lightblue-rest/subscription","commits_url":"https://api.github.com/repos/luan-cestari/lightblue-rest/commits{/sha}","git_commits_url":"https://api.github.com/repos/luan-cestari/lightblue-rest/git/commits{/sha}","comments_url":"https://api.github.com/repos/luan-cestari/lightblue-rest/comments{/number}","issue_comment_url":"https://api.github.com/repos/luan-cestari/lightblue-rest/issues/comments{/number}","contents_url":"https://api.github.com/repos/luan-cestari/lightblue-rest/contents/{+path}","compare_url":"https://api.github.com/repos/luan-cestari/lightblue-rest/compare/{base}...{head}","merges_url":"https://api.github.com/repos/luan-cestari/lightblue-rest/merges","archive_url":"https://api.github.com/repos/luan-cestari/lightblue-rest/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/luan-cestari/lightblue-rest/downloads","issues_url":"https://api.github.com/repos/luan-cestari/lightblue-rest/issues{/number}","pulls_url":"https://api.github.com/repos/luan-cestari/lightblue-rest/pulls{/number}","milestones_url":"https://api.github.com/repos/luan-cestari/lightblue-rest/milestones{/number}","notifications_url":"https://api.github.com/repos/luan-cestari/lightblue-rest/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/luan-cestari/lightblue-rest/labels{/name}","releases_url":"https://api.github.com/repos/luan-cestari/lightblue-rest/releases{/id}","created_at":"2014-08-18T12:46:42Z","updated_at":"2015-02-25T14:23:21Z","pushed_at":"2015-04-07T02:23:02Z","git_url":"git://github.com/luan-cestari/lightblue-rest.git","ssh_url":"git@github.com:luan-cestari/lightblue-rest.git","clone_url":"https://github.com/luan-cestari/lightblue-rest.git","svn_url":"https://github.com/luan-cestari/lightblue-rest","homepage":null,"size":12524,"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":"lightblue-platform:master","ref":"master","sha":"9bb5533794bfb7b7fea204a8b47d652ef22be405","user":{"login":"lightblue-platform","id":7061725,"avatar_url":"https://avatars.githubusercontent.com/u/7061725?v=3","gravatar_id":"","url":"https://api.github.com/users/lightblue-platform","html_url":"https://github.com/lightblue-platform","followers_url":"https://api.github.com/users/lightblue-platform/followers","following_url":"https://api.github.com/users/lightblue-platform/following{/other_user}","gists_url":"https://api.github.com/users/lightblue-platform/gists{/gist_id}","starred_url":"https://api.github.com/users/lightblue-platform/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lightblue-platform/subscriptions","organizations_url":"https://api.github.com/users/lightblue-platform/orgs","repos_url":"https://api.github.com/users/lightblue-platform/repos","events_url":"https://api.github.com/users/lightblue-platform/events{/privacy}","received_events_url":"https://api.github.com/users/lightblue-platform/received_events","type":"Organization","site_admin":false},"repo":{"id":23001404,"name":"lightblue-rest","full_name":"lightblue-platform/lightblue-rest","owner":{"login":"lightblue-platform","id":7061725,"avatar_url":"https://avatars.githubusercontent.com/u/7061725?v=3","gravatar_id":"","url":"https://api.github.com/users/lightblue-platform","html_url":"https://github.com/lightblue-platform","followers_url":"https://api.github.com/users/lightblue-platform/followers","following_url":"https://api.github.com/users/lightblue-platform/following{/other_user}","gists_url":"https://api.github.com/users/lightblue-platform/gists{/gist_id}","starred_url":"https://api.github.com/users/lightblue-platform/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lightblue-platform/subscriptions","organizations_url":"https://api.github.com/users/lightblue-platform/orgs","repos_url":"https://api.github.com/users/lightblue-platform/repos","events_url":"https://api.github.com/users/lightblue-platform/events{/privacy}","received_events_url":"https://api.github.com/users/lightblue-platform/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/lightblue-platform/lightblue-rest","description":"","fork":false,"url":"https://api.github.com/repos/lightblue-platform/lightblue-rest","forks_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/forks","keys_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/keys{/key_id}","collaborators_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/teams","hooks_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/hooks","issue_events_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/issues/events{/number}","events_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/events","assignees_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/assignees{/user}","branches_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/branches{/branch}","tags_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/tags","blobs_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/git/refs{/sha}","trees_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/git/trees{/sha}","statuses_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/statuses/{sha}","languages_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/languages","stargazers_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/stargazers","contributors_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/contributors","subscribers_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/subscribers","subscription_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/subscription","commits_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/commits{/sha}","git_commits_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/git/commits{/sha}","comments_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/comments{/number}","issue_comment_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/issues/comments{/number}","contents_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/contents/{+path}","compare_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/compare/{base}...{head}","merges_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/merges","archive_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/downloads","issues_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/issues{/number}","pulls_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/pulls{/number}","milestones_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/milestones{/number}","notifications_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/labels{/name}","releases_url":"https://api.github.com/repos/lightblue-platform/lightblue-rest/releases{/id}","created_at":"2014-08-15T19:59:57Z","updated_at":"2015-04-07T20:38:59Z","pushed_at":"2015-04-07T20:38:58Z","git_url":"git://github.com/lightblue-platform/lightblue-rest.git","ssh_url":"git@github.com:lightblue-platform/lightblue-rest.git","clone_url":"https://github.com/lightblue-platform/lightblue-rest.git","svn_url":"https://github.com/lightblue-platform/lightblue-rest","homepage":null,"size":13244,"stargazers_count":3,"watchers_count":3,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":7,"mirror_url":null,"open_issues_count":26,"forks":7,"open_issues":26,"watchers":3,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/lightblue-platform/lightblue-rest/pulls/128"},"html":{"href":"https://github.com/lightblue-platform/lightblue-rest/pull/128"},"issue":{"href":"https://api.github.com/repos/lightblue-platform/lightblue-rest/issues/128"},"comments":{"href":"https://api.github.com/repos/lightblue-platform/lightblue-rest/issues/128/comments"},"review_comments":{"href":"https://api.github.com/repos/lightblue-platform/lightblue-rest/pulls/128/comments"},"review_comment":{"href":"https://api.github.com/repos/lightblue-platform/lightblue-rest/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/lightblue-platform/lightblue-rest/pulls/128/commits"},"statuses":{"href":"https://api.github.com/repos/lightblue-platform/lightblue-rest/statuses/358c699d1550f8c83211cf1dfb9161c1047f617e"}}}}