{"action":"created","comment":{"url":"https://api.github.com/repos/SpineEventEngine/core-java/pulls/comments/165383337","pull_request_review_id":93311858,"id":165383337,"diff_hunk":"@@ -0,0 +1,192 @@\n+/*\n+ * Copyright 2018, TeamDev Ltd. All rights reserved.\n+ *\n+ * Redistribution and use in source and/or binary forms, with or without\n+ * modification, must retain the above copyright notice and the following\n+ * disclaimer.\n+ *\n+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+ * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+ */\n+\n+package io.spine.server.event;\n+\n+import com.google.protobuf.Message;\n+import io.grpc.stub.StreamObserver;\n+import io.spine.client.TestActorRequestFactory;\n+import io.spine.core.Ack;\n+import io.spine.core.Command;\n+import io.spine.core.Event;\n+import io.spine.grpc.MemoizingObserver;\n+import io.spine.grpc.StreamObservers;\n+import io.spine.server.BoundedContext;\n+import io.spine.server.event.given.EventRootCommandIdTestEnv.ProjectAggregateRepository;\n+import io.spine.server.event.given.EventRootCommandIdTestEnv.TeamAggregateRepository;\n+import io.spine.server.event.given.EventRootCommandIdTestEnv.TeamCreationRepository;\n+import io.spine.server.event.given.EventRootCommandIdTestEnv.UserSignUpRepository;\n+import org.junit.After;\n+import org.junit.Before;\n+import org.junit.Test;\n+\n+import java.util.List;\n+\n+import static io.spine.core.Events.getRootCommandId;\n+import static io.spine.grpc.StreamObservers.noOpObserver;\n+import static io.spine.server.event.given.EventRootCommandIdTestEnv.acceptInvitation;\n+import static io.spine.server.event.given.EventRootCommandIdTestEnv.addTasks;\n+import static io.spine.server.event.given.EventRootCommandIdTestEnv.addTeamMember;\n+import static io.spine.server.event.given.EventRootCommandIdTestEnv.allEventsQuery;\n+import static io.spine.server.event.given.EventRootCommandIdTestEnv.createProject;\n+import static io.spine.server.event.given.EventRootCommandIdTestEnv.inviteTeamMembers;\n+import static io.spine.server.event.given.EventRootCommandIdTestEnv.projectId;\n+import static io.spine.server.event.given.EventRootCommandIdTestEnv.teamId;\n+import static io.spine.test.Verify.assertSize;\n+import static org.junit.Assert.assertEquals;\n+\n+/**\n+ * @author Mykhailo Drachuk\n+ */\n+public class EventRootCommandIdShould {\n+\n+    private static final TestActorRequestFactory requestFactory =\n+            TestActorRequestFactory.newInstance(EventRootCommandIdShould.class);\n+\n+    private BoundedContext boundedContext;\n+\n+    @Before\n+    public void setUp() {\n+        boundedContext = BoundedContext.newBuilder()\n+                                       .build();\n+\n+        final ProjectAggregateRepository projectRepository = new ProjectAggregateRepository();\n+        final TeamAggregateRepository teamRepository = new TeamAggregateRepository();\n+        final TeamCreationRepository teamCreationRepository = new TeamCreationRepository();\n+        final UserSignUpRepository userSignUpRepository = new UserSignUpRepository();\n+\n+        boundedContext.register(projectRepository);\n+        boundedContext.register(teamRepository);\n+        boundedContext.register(teamCreationRepository);\n+        boundedContext.register(userSignUpRepository);\n+    }\n+\n+    @After\n+    public void tearDown() throws Exception {\n+        boundedContext.close();\n+    }\n+\n+    @Test\n+    public void match_the_id_of_a_command_handled_by_an_aggregate() {\n+        final Command command = command(createProject(projectId(), teamId()));\n+\n+        postCommand(command);\n+\n+        final List<Event> events = readEvents();\n+        // Two events should be created: one in the `ProjectAggregate` and one in the `TeamAggregate`.\n+        assertSize(2, events);\n+\n+        final Event event = events.get(0);\n+        assertEquals(command.getId(), getRootCommandId(event));\n+    }\n+\n+    @Test\n+    public void match_the_id_of_a_command_handled_by_an_aggregate_for_multiple_events() {\n+        final Command command = command(addTasks(projectId(), 3));\n+\n+        postCommand(command);\n+\n+        final List<Event> events = readEvents();\n+        assertSize(3, events);\n+        assertEquals(command.getId(), getRootCommandId(events.get(0)));\n+        assertEquals(command.getId(), getRootCommandId(events.get(1)));\n+        assertEquals(command.getId(), getRootCommandId(events.get(2)));\n+    }\n+\n+    @Test\n+    public void match_the_id_of_an_external_event_handled_by_an_aggregate() {\n+        final Command command = command(createProject(projectId(), teamId()));\n+\n+        postCommand(command);\n+\n+        final List<Event> events = readEvents();\n+        // Two events should be created: one in the `ProjectAggregate` and one in the `TeamAggregate`.\n+        assertSize(2, events);\n+\n+        final Event reaction = events.get(1);\n+        assertEquals(command.getId(), getRootCommandId(reaction));\n+    }\n+\n+    @Test\n+    public void match_the_id_of_a_command_handled_by_a_process_manager() {\n+        final Command command = command(addTeamMember(teamId()));\n+\n+        postCommand(command);\n+\n+        final List<Event> events = readEvents();\n+        assertSize(1, events);\n+\n+        final Event event = events.get(0);\n+        assertEquals(command.getId(), getRootCommandId(event));\n+    }\n+\n+    @Test\n+    public void match_the_id_of_a_command_handled_by_a_process_manager_for_multiple_events() {\n+        final Command command = command(inviteTeamMembers(teamId(), 3));\n+\n+        postCommand(command);\n+\n+        final List<Event> events = readEvents();\n+        assertSize(3, events);\n+        assertEquals(command.getId(), getRootCommandId(events.get(0)));\n+        assertEquals(command.getId(), getRootCommandId(events.get(1)));\n+        assertEquals(command.getId(), getRootCommandId(events.get(2)));\n+    }\n+\n+    @Test\n+    public void match_the_id_of_an_external_event_handled_by_a_process_manager() {\n+        final Command command = command(acceptInvitation(teamId()));\n+\n+        postCommand(command);\n+\n+        final List<Event> events = readEvents();\n+        // Two events should be created: the `InvitationAccepted` and the `TeamMemberAdded`.\n+        assertSize(2, events);\n+\n+        final Event reaction = events.get(1);\n+        assertEquals(command.getId(), getRootCommandId(reaction));\n+    }\n+\n+    private static Command command(Message message) {\n+        return requestFactory.createCommand(message);\n+    }\n+\n+    private void postCommand(Command command) {\n+        final StreamObserver<Ack> observer = noOpObserver();\n+        boundedContext.getCommandBus()\n+                      .post(command, observer);\n+    }\n+\n+    /**\n+     * Reads all events from the bounded context event store.\n+     */\n+    private List<Event> readEvents() {\n+        final EventStreamQuery query = allEventsQuery();\n+        final MemoizingObserver<Event> observer = StreamObservers.memoizingObserver();\n+\n+        boundedContext.getEventBus()\n+                      .getEventStore()\n+                      .read(query, observer);\n+\n+        final List<Event> results = observer.responses();\n+        return results;\n+    }\n+","path":"server/src/test/java/io/spine/server/event/EventRootCommandIdShould.java","position":191,"original_position":191,"commit_id":"e8ce2f76266e3531dafe86ee7c46de2602c17d1a","original_commit_id":"e8ce2f76266e3531dafe86ee7c46de2602c17d1a","user":{"login":"armiol","id":82468,"avatar_url":"https://avatars0.githubusercontent.com/u/82468?v=4","gravatar_id":"","url":"https://api.github.com/users/armiol","html_url":"https://github.com/armiol","followers_url":"https://api.github.com/users/armiol/followers","following_url":"https://api.github.com/users/armiol/following{/other_user}","gists_url":"https://api.github.com/users/armiol/gists{/gist_id}","starred_url":"https://api.github.com/users/armiol/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/armiol/subscriptions","organizations_url":"https://api.github.com/users/armiol/orgs","repos_url":"https://api.github.com/users/armiol/repos","events_url":"https://api.github.com/users/armiol/events{/privacy}","received_events_url":"https://api.github.com/users/armiol/received_events","type":"User","site_admin":false},"body":"Please fix all the similar cases. If you look through the codebase, you'll notice we don't allow extra empty lines.","created_at":"2018-02-01T15:07:11Z","updated_at":"2018-02-01T15:13:13Z","html_url":"https://github.com/SpineEventEngine/core-java/pull/660#discussion_r165383337","pull_request_url":"https://api.github.com/repos/SpineEventEngine/core-java/pulls/660","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/SpineEventEngine/core-java/pulls/comments/165383337"},"html":{"href":"https://github.com/SpineEventEngine/core-java/pull/660#discussion_r165383337"},"pull_request":{"href":"https://api.github.com/repos/SpineEventEngine/core-java/pulls/660"}}},"pull_request":{"url":"https://api.github.com/repos/SpineEventEngine/core-java/pulls/660","id":165759359,"html_url":"https://github.com/SpineEventEngine/core-java/pull/660","diff_url":"https://github.com/SpineEventEngine/core-java/pull/660.diff","patch_url":"https://github.com/SpineEventEngine/core-java/pull/660.patch","issue_url":"https://api.github.com/repos/SpineEventEngine/core-java/issues/660","number":660,"state":"open","locked":false,"title":"Add Root Command ID to Event Context","user":{"login":"mdrachuk","id":9073528,"avatar_url":"https://avatars1.githubusercontent.com/u/9073528?v=4","gravatar_id":"","url":"https://api.github.com/users/mdrachuk","html_url":"https://github.com/mdrachuk","followers_url":"https://api.github.com/users/mdrachuk/followers","following_url":"https://api.github.com/users/mdrachuk/following{/other_user}","gists_url":"https://api.github.com/users/mdrachuk/gists{/gist_id}","starred_url":"https://api.github.com/users/mdrachuk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mdrachuk/subscriptions","organizations_url":"https://api.github.com/users/mdrachuk/orgs","repos_url":"https://api.github.com/users/mdrachuk/repos","events_url":"https://api.github.com/users/mdrachuk/events{/privacy}","received_events_url":"https://api.github.com/users/mdrachuk/received_events","type":"User","site_admin":false},"body":"This PR tackles the issue https://github.com/SpineEventEngine/core-java/issues/607 fixing some critical bugs along the way.\r\n\r\n## Root Command ID\r\nThis PR introduces a new `EventContext` attribute — `root_command_id`. \r\n\r\nThis property is aimed to track the root command which caused events in application to be spawned. This information is required to solve an issue where a command can be delivered more than once to the application. Previously to track down the initial command one had to go over all of the events in the event chain which is inefficient.\r\n\r\nIn this context, a **root command** is an initial command handled by the application which spawned some events. All of this events will have their contexts `root_command_id` property set to the root commands identifier. \r\n\r\nThe identifier of the command is propagated through the event chain. This means that when an event occurs as a reaction to another event, its `root_command_id` is duplicated from the previous event.\r\n\r\n## Dead Event Tap\r\n\r\nAdditionally, this PR changes the behavior of the `DeadEventTap`. \r\n\r\nThe `DeadEventTap` is used by the `DeadMessageFilter`. The `DeadMessageFilter` acts in the same way as any `AbstractBusFilter` implementation filtering messages posted to a `Bus`. This means that _events_ filtered by the `DeadMessageFilter` did not get saved in the `EventStore`, which was a bug. \r\n\r\nThe `DeadEventTap` now stores received events to the event store on its own.\r\n\r\n## Storing filtered messages\r\n\r\nAnother critical bug was found as a part of `Bus#post()`. \r\n\r\nThe messages received by a bus were filtered, but if at least one message wasn’t filtered out, all of the received messages were stored. This was changed to store only the messages which passed all the filters.","created_at":"2018-01-29T16:54:10Z","updated_at":"2018-02-01T15:13:13Z","closed_at":null,"merged_at":null,"merge_commit_sha":"78d306a391a5c70bb5aa2a4a6a9fff0e87074858","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"milestone":null,"commits_url":"https://api.github.com/repos/SpineEventEngine/core-java/pulls/660/commits","review_comments_url":"https://api.github.com/repos/SpineEventEngine/core-java/pulls/660/comments","review_comment_url":"https://api.github.com/repos/SpineEventEngine/core-java/pulls/comments{/number}","comments_url":"https://api.github.com/repos/SpineEventEngine/core-java/issues/660/comments","statuses_url":"https://api.github.com/repos/SpineEventEngine/core-java/statuses/e8ce2f76266e3531dafe86ee7c46de2602c17d1a","head":{"label":"SpineEventEngine:event-context-origin-id","ref":"event-context-origin-id","sha":"e8ce2f76266e3531dafe86ee7c46de2602c17d1a","user":{"login":"SpineEventEngine","id":12821626,"avatar_url":"https://avatars3.githubusercontent.com/u/12821626?v=4","gravatar_id":"","url":"https://api.github.com/users/SpineEventEngine","html_url":"https://github.com/SpineEventEngine","followers_url":"https://api.github.com/users/SpineEventEngine/followers","following_url":"https://api.github.com/users/SpineEventEngine/following{/other_user}","gists_url":"https://api.github.com/users/SpineEventEngine/gists{/gist_id}","starred_url":"https://api.github.com/users/SpineEventEngine/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SpineEventEngine/subscriptions","organizations_url":"https://api.github.com/users/SpineEventEngine/orgs","repos_url":"https://api.github.com/users/SpineEventEngine/repos","events_url":"https://api.github.com/users/SpineEventEngine/events{/privacy}","received_events_url":"https://api.github.com/users/SpineEventEngine/received_events","type":"Organization","site_admin":false},"repo":{"id":38311906,"name":"core-java","full_name":"SpineEventEngine/core-java","owner":{"login":"SpineEventEngine","id":12821626,"avatar_url":"https://avatars3.githubusercontent.com/u/12821626?v=4","gravatar_id":"","url":"https://api.github.com/users/SpineEventEngine","html_url":"https://github.com/SpineEventEngine","followers_url":"https://api.github.com/users/SpineEventEngine/followers","following_url":"https://api.github.com/users/SpineEventEngine/following{/other_user}","gists_url":"https://api.github.com/users/SpineEventEngine/gists{/gist_id}","starred_url":"https://api.github.com/users/SpineEventEngine/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SpineEventEngine/subscriptions","organizations_url":"https://api.github.com/users/SpineEventEngine/orgs","repos_url":"https://api.github.com/users/SpineEventEngine/repos","events_url":"https://api.github.com/users/SpineEventEngine/events{/privacy}","received_events_url":"https://api.github.com/users/SpineEventEngine/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/SpineEventEngine/core-java","description":"The Java implementation of the framework core.","fork":false,"url":"https://api.github.com/repos/SpineEventEngine/core-java","forks_url":"https://api.github.com/repos/SpineEventEngine/core-java/forks","keys_url":"https://api.github.com/repos/SpineEventEngine/core-java/keys{/key_id}","collaborators_url":"https://api.github.com/repos/SpineEventEngine/core-java/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/SpineEventEngine/core-java/teams","hooks_url":"https://api.github.com/repos/SpineEventEngine/core-java/hooks","issue_events_url":"https://api.github.com/repos/SpineEventEngine/core-java/issues/events{/number}","events_url":"https://api.github.com/repos/SpineEventEngine/core-java/events","assignees_url":"https://api.github.com/repos/SpineEventEngine/core-java/assignees{/user}","branches_url":"https://api.github.com/repos/SpineEventEngine/core-java/branches{/branch}","tags_url":"https://api.github.com/repos/SpineEventEngine/core-java/tags","blobs_url":"https://api.github.com/repos/SpineEventEngine/core-java/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/SpineEventEngine/core-java/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/SpineEventEngine/core-java/git/refs{/sha}","trees_url":"https://api.github.com/repos/SpineEventEngine/core-java/git/trees{/sha}","statuses_url":"https://api.github.com/repos/SpineEventEngine/core-java/statuses/{sha}","languages_url":"https://api.github.com/repos/SpineEventEngine/core-java/languages","stargazers_url":"https://api.github.com/repos/SpineEventEngine/core-java/stargazers","contributors_url":"https://api.github.com/repos/SpineEventEngine/core-java/contributors","subscribers_url":"https://api.github.com/repos/SpineEventEngine/core-java/subscribers","subscription_url":"https://api.github.com/repos/SpineEventEngine/core-java/subscription","commits_url":"https://api.github.com/repos/SpineEventEngine/core-java/commits{/sha}","git_commits_url":"https://api.github.com/repos/SpineEventEngine/core-java/git/commits{/sha}","comments_url":"https://api.github.com/repos/SpineEventEngine/core-java/comments{/number}","issue_comment_url":"https://api.github.com/repos/SpineEventEngine/core-java/issues/comments{/number}","contents_url":"https://api.github.com/repos/SpineEventEngine/core-java/contents/{+path}","compare_url":"https://api.github.com/repos/SpineEventEngine/core-java/compare/{base}...{head}","merges_url":"https://api.github.com/repos/SpineEventEngine/core-java/merges","archive_url":"https://api.github.com/repos/SpineEventEngine/core-java/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/SpineEventEngine/core-java/downloads","issues_url":"https://api.github.com/repos/SpineEventEngine/core-java/issues{/number}","pulls_url":"https://api.github.com/repos/SpineEventEngine/core-java/pulls{/number}","milestones_url":"https://api.github.com/repos/SpineEventEngine/core-java/milestones{/number}","notifications_url":"https://api.github.com/repos/SpineEventEngine/core-java/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/SpineEventEngine/core-java/labels{/name}","releases_url":"https://api.github.com/repos/SpineEventEngine/core-java/releases{/id}","deployments_url":"https://api.github.com/repos/SpineEventEngine/core-java/deployments","created_at":"2015-06-30T13:50:58Z","updated_at":"2018-01-23T15:40:50Z","pushed_at":"2018-02-01T12:13:05Z","git_url":"git://github.com/SpineEventEngine/core-java.git","ssh_url":"git@github.com:SpineEventEngine/core-java.git","clone_url":"https://github.com/SpineEventEngine/core-java.git","svn_url":"https://github.com/SpineEventEngine/core-java","homepage":null,"size":29988,"stargazers_count":7,"watchers_count":7,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":3,"mirror_url":null,"archived":false,"open_issues_count":60,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":3,"open_issues":60,"watchers":7,"default_branch":"master"}},"base":{"label":"SpineEventEngine:master","ref":"master","sha":"d6d6793dacf5af2540590901548c8a2ee950993e","user":{"login":"SpineEventEngine","id":12821626,"avatar_url":"https://avatars3.githubusercontent.com/u/12821626?v=4","gravatar_id":"","url":"https://api.github.com/users/SpineEventEngine","html_url":"https://github.com/SpineEventEngine","followers_url":"https://api.github.com/users/SpineEventEngine/followers","following_url":"https://api.github.com/users/SpineEventEngine/following{/other_user}","gists_url":"https://api.github.com/users/SpineEventEngine/gists{/gist_id}","starred_url":"https://api.github.com/users/SpineEventEngine/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SpineEventEngine/subscriptions","organizations_url":"https://api.github.com/users/SpineEventEngine/orgs","repos_url":"https://api.github.com/users/SpineEventEngine/repos","events_url":"https://api.github.com/users/SpineEventEngine/events{/privacy}","received_events_url":"https://api.github.com/users/SpineEventEngine/received_events","type":"Organization","site_admin":false},"repo":{"id":38311906,"name":"core-java","full_name":"SpineEventEngine/core-java","owner":{"login":"SpineEventEngine","id":12821626,"avatar_url":"https://avatars3.githubusercontent.com/u/12821626?v=4","gravatar_id":"","url":"https://api.github.com/users/SpineEventEngine","html_url":"https://github.com/SpineEventEngine","followers_url":"https://api.github.com/users/SpineEventEngine/followers","following_url":"https://api.github.com/users/SpineEventEngine/following{/other_user}","gists_url":"https://api.github.com/users/SpineEventEngine/gists{/gist_id}","starred_url":"https://api.github.com/users/SpineEventEngine/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SpineEventEngine/subscriptions","organizations_url":"https://api.github.com/users/SpineEventEngine/orgs","repos_url":"https://api.github.com/users/SpineEventEngine/repos","events_url":"https://api.github.com/users/SpineEventEngine/events{/privacy}","received_events_url":"https://api.github.com/users/SpineEventEngine/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/SpineEventEngine/core-java","description":"The Java implementation of the framework core.","fork":false,"url":"https://api.github.com/repos/SpineEventEngine/core-java","forks_url":"https://api.github.com/repos/SpineEventEngine/core-java/forks","keys_url":"https://api.github.com/repos/SpineEventEngine/core-java/keys{/key_id}","collaborators_url":"https://api.github.com/repos/SpineEventEngine/core-java/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/SpineEventEngine/core-java/teams","hooks_url":"https://api.github.com/repos/SpineEventEngine/core-java/hooks","issue_events_url":"https://api.github.com/repos/SpineEventEngine/core-java/issues/events{/number}","events_url":"https://api.github.com/repos/SpineEventEngine/core-java/events","assignees_url":"https://api.github.com/repos/SpineEventEngine/core-java/assignees{/user}","branches_url":"https://api.github.com/repos/SpineEventEngine/core-java/branches{/branch}","tags_url":"https://api.github.com/repos/SpineEventEngine/core-java/tags","blobs_url":"https://api.github.com/repos/SpineEventEngine/core-java/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/SpineEventEngine/core-java/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/SpineEventEngine/core-java/git/refs{/sha}","trees_url":"https://api.github.com/repos/SpineEventEngine/core-java/git/trees{/sha}","statuses_url":"https://api.github.com/repos/SpineEventEngine/core-java/statuses/{sha}","languages_url":"https://api.github.com/repos/SpineEventEngine/core-java/languages","stargazers_url":"https://api.github.com/repos/SpineEventEngine/core-java/stargazers","contributors_url":"https://api.github.com/repos/SpineEventEngine/core-java/contributors","subscribers_url":"https://api.github.com/repos/SpineEventEngine/core-java/subscribers","subscription_url":"https://api.github.com/repos/SpineEventEngine/core-java/subscription","commits_url":"https://api.github.com/repos/SpineEventEngine/core-java/commits{/sha}","git_commits_url":"https://api.github.com/repos/SpineEventEngine/core-java/git/commits{/sha}","comments_url":"https://api.github.com/repos/SpineEventEngine/core-java/comments{/number}","issue_comment_url":"https://api.github.com/repos/SpineEventEngine/core-java/issues/comments{/number}","contents_url":"https://api.github.com/repos/SpineEventEngine/core-java/contents/{+path}","compare_url":"https://api.github.com/repos/SpineEventEngine/core-java/compare/{base}...{head}","merges_url":"https://api.github.com/repos/SpineEventEngine/core-java/merges","archive_url":"https://api.github.com/repos/SpineEventEngine/core-java/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/SpineEventEngine/core-java/downloads","issues_url":"https://api.github.com/repos/SpineEventEngine/core-java/issues{/number}","pulls_url":"https://api.github.com/repos/SpineEventEngine/core-java/pulls{/number}","milestones_url":"https://api.github.com/repos/SpineEventEngine/core-java/milestones{/number}","notifications_url":"https://api.github.com/repos/SpineEventEngine/core-java/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/SpineEventEngine/core-java/labels{/name}","releases_url":"https://api.github.com/repos/SpineEventEngine/core-java/releases{/id}","deployments_url":"https://api.github.com/repos/SpineEventEngine/core-java/deployments","created_at":"2015-06-30T13:50:58Z","updated_at":"2018-01-23T15:40:50Z","pushed_at":"2018-02-01T12:13:05Z","git_url":"git://github.com/SpineEventEngine/core-java.git","ssh_url":"git@github.com:SpineEventEngine/core-java.git","clone_url":"https://github.com/SpineEventEngine/core-java.git","svn_url":"https://github.com/SpineEventEngine/core-java","homepage":null,"size":29988,"stargazers_count":7,"watchers_count":7,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":3,"mirror_url":null,"archived":false,"open_issues_count":60,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":3,"open_issues":60,"watchers":7,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/SpineEventEngine/core-java/pulls/660"},"html":{"href":"https://github.com/SpineEventEngine/core-java/pull/660"},"issue":{"href":"https://api.github.com/repos/SpineEventEngine/core-java/issues/660"},"comments":{"href":"https://api.github.com/repos/SpineEventEngine/core-java/issues/660/comments"},"review_comments":{"href":"https://api.github.com/repos/SpineEventEngine/core-java/pulls/660/comments"},"review_comment":{"href":"https://api.github.com/repos/SpineEventEngine/core-java/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/SpineEventEngine/core-java/pulls/660/commits"},"statuses":{"href":"https://api.github.com/repos/SpineEventEngine/core-java/statuses/e8ce2f76266e3531dafe86ee7c46de2602c17d1a"}},"author_association":"NONE"}}
{"actor":{"display_login":"armiol"}}