{"action":"created","comment":{"url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/pulls/comments/93413676","pull_request_review_id":13939305,"id":93413676,"diff_hunk":"@@ -0,0 +1,182 @@\n+/**\n+ * The MIT License (MIT)\n+ * Copyright (c) 2016 Bezirk http://bezirk.com\n+ *\n+ * Permission is hereby granted, free of charge, to any person obtaining a copy\n+ * of this software and associated documentation files (the \"Software\"), to deal\n+ * in the Software without restriction, including without limitation the rights\n+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n+ * copies of the Software, and to permit persons to whom the Software is\n+ * furnished to do so, subject to the following conditions:\n+ *\n+ * The above copyright notice and this permission notice shall be included in\n+ * all copies or substantial portions of the Software.\n+ *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n+ * THE SOFTWARE.\n+ */\n+package com.bezirk.streaming.receiver;\n+\n+import com.bezirk.middleware.core.comms.Comms;\n+import com.bezirk.middleware.core.control.messages.ControlLedger;\n+import com.bezirk.streaming.FileStreamRequest;\n+import com.bezirk.streaming.StreamBook;\n+import com.bezirk.streaming.StreamRecord;\n+import com.bezirk.streaming.portfactory.FileStreamPortFactory;\n+import com.google.gson.Gson;\n+\n+import org.slf4j.Logger;\n+import org.slf4j.LoggerFactory;\n+\n+import java.net.InetAddress;\n+import java.net.NetworkInterface;\n+import java.util.Collections;\n+import java.util.List;\n+import java.util.Observable;\n+import java.util.Observer;\n+import java.util.concurrent.ExecutorService;\n+import java.util.concurrent.Executors;\n+\n+/**\n+ * StreamAliveObserver is a implementation of <code>StreamEventObserver</code>.\n+ * Update will be called when the subject StreamBook will be updated with a new entry.\n+ */\n+\n+class StreamAliveObserver implements Observer {\n+\n+    //executor which handles the file stream receiving thread.\n+    private ExecutorService fileStreamReceiverExecutor;\n+    //size of thread size\n+    private static final int THREAD_SIZE = 10;\n+    //comms injected.\n+    private Comms comms = null;\n+    private final Gson gson = new Gson();\n+    //streamBook and Portfactory also needs to be dependency injected.\n+    private StreamBook streamBook;\n+    private FileStreamPortFactory portFactory;\n+    private ZirkMessageHandler zirkMessageHandler;\n+\n+    //logger instance\n+    private static final Logger logger = LoggerFactory\n+            .getLogger(StreamAliveObserver.class);\n+\n+\n+    StreamAliveObserver(Comms comms, StreamBook streamBook, FileStreamPortFactory portFactory, ZirkMessageHandler zirkMessageHandler){\n+        this.comms = comms;\n+        this.fileStreamReceiverExecutor = Executors.newFixedThreadPool(THREAD_SIZE);\n+        this.streamBook = streamBook;\n+        this.portFactory = portFactory;\n+        this.zirkMessageHandler = zirkMessageHandler;\n+    }\n+\n+    @Override\n+    public void update(Observable observable, Object streamRequest) {\n+        FileStreamRequest fileStreamRequest = (FileStreamRequest)streamRequest;\n+        StreamRecord streamRecord = fileStreamRequest.getStreamRecord();\n+\n+        if(StreamRecord.StreamRecordStatus.ALIVE == streamRecord.getStreamRecordStatus()){\n+            //when the status is alive\n+            streamRecord.setStreamRecordStatus(StreamRecord.StreamRecordStatus.ADDRESSED);\n+\n+            //add the stream record to stream book.\n+            streamBook.addStreamingRecordToBook(streamRecord);\n+\n+            //assign a port to stream record from the port factory.\n+            Integer assignedPort = portFactory.getActivePort(streamRecord.getStreamId());\n+            logger.debug(\"assigned port {} for stream request of file {}\",assignedPort, streamRecord.getFile().getName());\n+\n+            if(assignedPort != -1){\n+                streamRecord.setRecipientPort(assignedPort);\n+                streamRecord.setRecipientIp(getIPAddress());\n+\n+                //start the receiver thread and send a reply to sender.\n+                FileStreamReceivingThread streamReceivingThread =new FileStreamReceivingThread(assignedPort, streamRecord.getFile(), portFactory);\n+                fileStreamReceiverExecutor.execute(streamReceivingThread);\n+\n+                streamRecord.setStreamRecordStatus(StreamRecord.StreamRecordStatus.ASSIGNED);\n+\n+                //update stream book.\n+                streamBook.updateStreamRecordInBook(streamRecord.getStreamId(), StreamRecord.StreamRecordStatus.ASSIGNED, assignedPort, getIPAddress());\n+                //reply to the sender with status\n+                replyToSender(streamRecord);\n+\n+            }else{\n+                //update the stream record to busy status and send it to .\n+                streamRecord.setRecipientPort(assignedPort);\n+                streamBook.updateStreamRecordInBook(streamRecord.getStreamId(), StreamRecord.StreamRecordStatus.BUSY, null, null);\n+\n+                //reply to the sender with status\n+                replyToSender(streamRecord);\n+            }\n+\n+            //give a callback status to zirk of updated status.\n+            zirkMessageHandler.callBackToZirk(streamRecord);\n+        }\n+\n+    }\n+\n+\n+\n+    /**\n+     * reply to sender with the given stream staus.\n+     * @param streamRecord streamRecord.\n+     */\n+    private void replyToSender(StreamRecord streamRecord) {\n+        //send a ControlMessage(StreamResponse) back to sender with updated information\n+        ControlLedger controlLedger = new ControlLedger();\n+\n+        //sphere will be DEFAULT as of now\n+        controlLedger.setSphereId(\"DEFAULT\");\n+\n+        FileStreamRequest streamResponse = new FileStreamRequest(streamRecord.getSenderSEP(), \"DEFAULT\", streamRecord);\n+        controlLedger.setMessage(streamResponse);\n+        controlLedger.setSerializedMessage(gson.toJson(streamResponse));\n+\n+        logger.debug(\"sending a reply to sender for stream request {}\", streamRecord.getStreamId());\n+        comms.sendControlLedger(controlLedger);\n+    }\n+\n+\n+    /**\n+     * Get IP address from first non-localhost interface, This has to be removed!!!!!!!!!!!!!!\n+     * @return  address or empty string\n+     */\n+    private static String getIPAddress() {\n+        try {\n+            List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());\n+            for (NetworkInterface intf : interfaces) {\n+                String sAddr = getNetworkAddress(intf);\n+                if (sAddr != null){\n+                    return sAddr;\n+                }\n+            }\n+        } catch (Exception ex) {\n+            logger.error(\"Error while getting IP address of device\", ex);\n+        } // for now eat exceptions\n+        return \"\";\n+    }\n+\n+    /**\n+     * returns a network address from NetworkInterface\n+     * @param intf NetworkInterface\n+     * @return IP address of the device.\n+     */\n+    private static String getNetworkAddress(NetworkInterface intf) {\n+        List<InetAddress> addrs = Collections.list(intf.getInetAddresses());\n+        for (InetAddress addr : addrs) {\n+            if (!addr.isLoopbackAddress()) {\n+                String sAddr = addr.getHostAddress();\n+                boolean isIPv4 = sAddr.indexOf(':')<0;\n+                if (isIPv4){\n+                    return sAddr;\n+                }","path":"core/streaming-file/src/main/java/com/bezirk/streaming/receiver/StreamAliveObserver.java","position":177,"original_position":177,"commit_id":"ee4385b15db1cd52af70e61fc194bb115dde2e9f","original_commit_id":"41696c8da6812253f44ba9a5a8742631216cd9db","user":{"login":"punithmailme","id":4214431,"avatar_url":"https://avatars.githubusercontent.com/u/4214431?v=3","gravatar_id":"","url":"https://api.github.com/users/punithmailme","html_url":"https://github.com/punithmailme","followers_url":"https://api.github.com/users/punithmailme/followers","following_url":"https://api.github.com/users/punithmailme/following{/other_user}","gists_url":"https://api.github.com/users/punithmailme/gists{/gist_id}","starred_url":"https://api.github.com/users/punithmailme/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/punithmailme/subscriptions","organizations_url":"https://api.github.com/users/punithmailme/orgs","repos_url":"https://api.github.com/users/punithmailme/repos","events_url":"https://api.github.com/users/punithmailme/events{/privacy}","received_events_url":"https://api.github.com/users/punithmailme/received_events","type":"User","site_admin":false},"body":"added a error logger.\r\nlogger.error(\"could not return a network address from NetworkInterface\");\r\n\r\nthis is a error scenario.","created_at":"2016-12-21T10:33:51Z","updated_at":"2016-12-21T10:33:51Z","html_url":"https://github.com/Bezirk-Bosch/Middleware/pull/168#discussion_r93413676","pull_request_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/pulls/168","_links":{"self":{"href":"https://api.github.com/repos/Bezirk-Bosch/Middleware/pulls/comments/93413676"},"html":{"href":"https://github.com/Bezirk-Bosch/Middleware/pull/168#discussion_r93413676"},"pull_request":{"href":"https://api.github.com/repos/Bezirk-Bosch/Middleware/pulls/168"}}},"pull_request":{"url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/pulls/168","id":98181653,"html_url":"https://github.com/Bezirk-Bosch/Middleware/pull/168","diff_url":"https://github.com/Bezirk-Bosch/Middleware/pull/168.diff","patch_url":"https://github.com/Bezirk-Bosch/Middleware/pull/168.patch","issue_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/issues/168","number":168,"state":"open","locked":false,"title":"Streaming Feature","user":{"login":"punithmailme","id":4214431,"avatar_url":"https://avatars.githubusercontent.com/u/4214431?v=3","gravatar_id":"","url":"https://api.github.com/users/punithmailme","html_url":"https://github.com/punithmailme","followers_url":"https://api.github.com/users/punithmailme/followers","following_url":"https://api.github.com/users/punithmailme/following{/other_user}","gists_url":"https://api.github.com/users/punithmailme/gists{/gist_id}","starred_url":"https://api.github.com/users/punithmailme/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/punithmailme/subscriptions","organizations_url":"https://api.github.com/users/punithmailme/orgs","repos_url":"https://api.github.com/users/punithmailme/repos","events_url":"https://api.github.com/users/punithmailme/events{/privacy}","received_events_url":"https://api.github.com/users/punithmailme/received_events","type":"User","site_admin":false},"body":"Changes related to FileStreaming module","created_at":"2016-12-15T16:17:37Z","updated_at":"2016-12-21T10:33:51Z","closed_at":null,"merged_at":null,"merge_commit_sha":"4ae7d25482f25cd128232afde6f055cc5b23e57b","assignee":{"login":"punithmailme","id":4214431,"avatar_url":"https://avatars.githubusercontent.com/u/4214431?v=3","gravatar_id":"","url":"https://api.github.com/users/punithmailme","html_url":"https://github.com/punithmailme","followers_url":"https://api.github.com/users/punithmailme/followers","following_url":"https://api.github.com/users/punithmailme/following{/other_user}","gists_url":"https://api.github.com/users/punithmailme/gists{/gist_id}","starred_url":"https://api.github.com/users/punithmailme/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/punithmailme/subscriptions","organizations_url":"https://api.github.com/users/punithmailme/orgs","repos_url":"https://api.github.com/users/punithmailme/repos","events_url":"https://api.github.com/users/punithmailme/events{/privacy}","received_events_url":"https://api.github.com/users/punithmailme/received_events","type":"User","site_admin":false},"assignees":[{"login":"punithmailme","id":4214431,"avatar_url":"https://avatars.githubusercontent.com/u/4214431?v=3","gravatar_id":"","url":"https://api.github.com/users/punithmailme","html_url":"https://github.com/punithmailme","followers_url":"https://api.github.com/users/punithmailme/followers","following_url":"https://api.github.com/users/punithmailme/following{/other_user}","gists_url":"https://api.github.com/users/punithmailme/gists{/gist_id}","starred_url":"https://api.github.com/users/punithmailme/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/punithmailme/subscriptions","organizations_url":"https://api.github.com/users/punithmailme/orgs","repos_url":"https://api.github.com/users/punithmailme/repos","events_url":"https://api.github.com/users/punithmailme/events{/privacy}","received_events_url":"https://api.github.com/users/punithmailme/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/pulls/168/commits","review_comments_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/pulls/168/comments","review_comment_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/issues/168/comments","statuses_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/statuses/ee4385b15db1cd52af70e61fc194bb115dde2e9f","head":{"label":"Bezirk-Bosch:feature/clean-stream","ref":"feature/clean-stream","sha":"ee4385b15db1cd52af70e61fc194bb115dde2e9f","user":{"login":"Bezirk-Bosch","id":18355799,"avatar_url":"https://avatars.githubusercontent.com/u/18355799?v=3","gravatar_id":"","url":"https://api.github.com/users/Bezirk-Bosch","html_url":"https://github.com/Bezirk-Bosch","followers_url":"https://api.github.com/users/Bezirk-Bosch/followers","following_url":"https://api.github.com/users/Bezirk-Bosch/following{/other_user}","gists_url":"https://api.github.com/users/Bezirk-Bosch/gists{/gist_id}","starred_url":"https://api.github.com/users/Bezirk-Bosch/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Bezirk-Bosch/subscriptions","organizations_url":"https://api.github.com/users/Bezirk-Bosch/orgs","repos_url":"https://api.github.com/users/Bezirk-Bosch/repos","events_url":"https://api.github.com/users/Bezirk-Bosch/events{/privacy}","received_events_url":"https://api.github.com/users/Bezirk-Bosch/received_events","type":"Organization","site_admin":false},"repo":{"id":55810513,"name":"Middleware","full_name":"Bezirk-Bosch/Middleware","owner":{"login":"Bezirk-Bosch","id":18355799,"avatar_url":"https://avatars.githubusercontent.com/u/18355799?v=3","gravatar_id":"","url":"https://api.github.com/users/Bezirk-Bosch","html_url":"https://github.com/Bezirk-Bosch","followers_url":"https://api.github.com/users/Bezirk-Bosch/followers","following_url":"https://api.github.com/users/Bezirk-Bosch/following{/other_user}","gists_url":"https://api.github.com/users/Bezirk-Bosch/gists{/gist_id}","starred_url":"https://api.github.com/users/Bezirk-Bosch/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Bezirk-Bosch/subscriptions","organizations_url":"https://api.github.com/users/Bezirk-Bosch/orgs","repos_url":"https://api.github.com/users/Bezirk-Bosch/repos","events_url":"https://api.github.com/users/Bezirk-Bosch/events{/privacy}","received_events_url":"https://api.github.com/users/Bezirk-Bosch/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Bezirk-Bosch/Middleware","description":"developer-friendly, user-centric, and privacy-respecting glue for the Internet of Things","fork":false,"url":"https://api.github.com/repos/Bezirk-Bosch/Middleware","forks_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/forks","keys_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/teams","hooks_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/hooks","issue_events_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/issues/events{/number}","events_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/events","assignees_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/assignees{/user}","branches_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/branches{/branch}","tags_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/tags","blobs_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/git/refs{/sha}","trees_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/statuses/{sha}","languages_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/languages","stargazers_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/stargazers","contributors_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/contributors","subscribers_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/subscribers","subscription_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/subscription","commits_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/commits{/sha}","git_commits_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/git/commits{/sha}","comments_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/comments{/number}","issue_comment_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/issues/comments{/number}","contents_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/contents/{+path}","compare_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/merges","archive_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/downloads","issues_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/issues{/number}","pulls_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/pulls{/number}","milestones_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/milestones{/number}","notifications_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/labels{/name}","releases_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/releases{/id}","deployments_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/deployments","created_at":"2016-04-08T21:24:05Z","updated_at":"2016-10-24T18:44:17Z","pushed_at":"2016-12-20T22:50:53Z","git_url":"git://github.com/Bezirk-Bosch/Middleware.git","ssh_url":"git@github.com:Bezirk-Bosch/Middleware.git","clone_url":"https://github.com/Bezirk-Bosch/Middleware.git","svn_url":"https://github.com/Bezirk-Bosch/Middleware","homepage":"http://www.bezirk.com/","size":14418,"stargazers_count":1,"watchers_count":1,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":0,"mirror_url":null,"open_issues_count":16,"forks":0,"open_issues":16,"watchers":1,"default_branch":"master"}},"base":{"label":"Bezirk-Bosch:master","ref":"master","sha":"74c1cd71d726d9d3c5762d92b73768948e5a305b","user":{"login":"Bezirk-Bosch","id":18355799,"avatar_url":"https://avatars.githubusercontent.com/u/18355799?v=3","gravatar_id":"","url":"https://api.github.com/users/Bezirk-Bosch","html_url":"https://github.com/Bezirk-Bosch","followers_url":"https://api.github.com/users/Bezirk-Bosch/followers","following_url":"https://api.github.com/users/Bezirk-Bosch/following{/other_user}","gists_url":"https://api.github.com/users/Bezirk-Bosch/gists{/gist_id}","starred_url":"https://api.github.com/users/Bezirk-Bosch/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Bezirk-Bosch/subscriptions","organizations_url":"https://api.github.com/users/Bezirk-Bosch/orgs","repos_url":"https://api.github.com/users/Bezirk-Bosch/repos","events_url":"https://api.github.com/users/Bezirk-Bosch/events{/privacy}","received_events_url":"https://api.github.com/users/Bezirk-Bosch/received_events","type":"Organization","site_admin":false},"repo":{"id":55810513,"name":"Middleware","full_name":"Bezirk-Bosch/Middleware","owner":{"login":"Bezirk-Bosch","id":18355799,"avatar_url":"https://avatars.githubusercontent.com/u/18355799?v=3","gravatar_id":"","url":"https://api.github.com/users/Bezirk-Bosch","html_url":"https://github.com/Bezirk-Bosch","followers_url":"https://api.github.com/users/Bezirk-Bosch/followers","following_url":"https://api.github.com/users/Bezirk-Bosch/following{/other_user}","gists_url":"https://api.github.com/users/Bezirk-Bosch/gists{/gist_id}","starred_url":"https://api.github.com/users/Bezirk-Bosch/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Bezirk-Bosch/subscriptions","organizations_url":"https://api.github.com/users/Bezirk-Bosch/orgs","repos_url":"https://api.github.com/users/Bezirk-Bosch/repos","events_url":"https://api.github.com/users/Bezirk-Bosch/events{/privacy}","received_events_url":"https://api.github.com/users/Bezirk-Bosch/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Bezirk-Bosch/Middleware","description":"developer-friendly, user-centric, and privacy-respecting glue for the Internet of Things","fork":false,"url":"https://api.github.com/repos/Bezirk-Bosch/Middleware","forks_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/forks","keys_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/teams","hooks_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/hooks","issue_events_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/issues/events{/number}","events_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/events","assignees_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/assignees{/user}","branches_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/branches{/branch}","tags_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/tags","blobs_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/git/refs{/sha}","trees_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/statuses/{sha}","languages_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/languages","stargazers_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/stargazers","contributors_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/contributors","subscribers_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/subscribers","subscription_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/subscription","commits_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/commits{/sha}","git_commits_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/git/commits{/sha}","comments_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/comments{/number}","issue_comment_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/issues/comments{/number}","contents_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/contents/{+path}","compare_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/merges","archive_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/downloads","issues_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/issues{/number}","pulls_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/pulls{/number}","milestones_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/milestones{/number}","notifications_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/labels{/name}","releases_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/releases{/id}","deployments_url":"https://api.github.com/repos/Bezirk-Bosch/Middleware/deployments","created_at":"2016-04-08T21:24:05Z","updated_at":"2016-10-24T18:44:17Z","pushed_at":"2016-12-20T22:50:53Z","git_url":"git://github.com/Bezirk-Bosch/Middleware.git","ssh_url":"git@github.com:Bezirk-Bosch/Middleware.git","clone_url":"https://github.com/Bezirk-Bosch/Middleware.git","svn_url":"https://github.com/Bezirk-Bosch/Middleware","homepage":"http://www.bezirk.com/","size":14418,"stargazers_count":1,"watchers_count":1,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":0,"mirror_url":null,"open_issues_count":16,"forks":0,"open_issues":16,"watchers":1,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/Bezirk-Bosch/Middleware/pulls/168"},"html":{"href":"https://github.com/Bezirk-Bosch/Middleware/pull/168"},"issue":{"href":"https://api.github.com/repos/Bezirk-Bosch/Middleware/issues/168"},"comments":{"href":"https://api.github.com/repos/Bezirk-Bosch/Middleware/issues/168/comments"},"review_comments":{"href":"https://api.github.com/repos/Bezirk-Bosch/Middleware/pulls/168/comments"},"review_comment":{"href":"https://api.github.com/repos/Bezirk-Bosch/Middleware/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Bezirk-Bosch/Middleware/pulls/168/commits"},"statuses":{"href":"https://api.github.com/repos/Bezirk-Bosch/Middleware/statuses/ee4385b15db1cd52af70e61fc194bb115dde2e9f"}}}}
{"actor":{"display_login":"punithmailme"}}