{"action":"created","comment":{"url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/pulls/comments/88758959","pull_request_review_id":9326376,"id":88758959,"diff_hunk":"@@ -0,0 +1,151 @@\n+/*\n+ * Copyright 2016 the original author or authors.\n+ *\n+ * Licensed under the Apache License, Version 2.0 (the \"License\");\n+ * you may not use this file except in compliance with the License.\n+ * You may obtain a copy of the License at\n+ *\n+ *      http://www.apache.org/licenses/LICENSE-2.0\n+ *\n+ * Unless required by applicable law or agreed to in writing, software\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+ * See the License for the specific language governing permissions and\n+ * limitations under the License.\n+ */\n+package org.springframework.cloud.stream.binding;\n+\n+import java.lang.reflect.Method;\n+\n+import org.springframework.cloud.stream.annotation.Input;\n+import org.springframework.cloud.stream.annotation.Output;\n+import org.springframework.cloud.stream.annotation.StreamListener;\n+import org.springframework.core.MethodParameter;\n+import org.springframework.core.annotation.AnnotationUtils;\n+import org.springframework.messaging.handler.annotation.Payload;\n+import org.springframework.messaging.handler.annotation.SendTo;\n+import org.springframework.util.Assert;\n+import org.springframework.util.ObjectUtils;\n+import org.springframework.util.StringUtils;\n+\n+import static org.springframework.cloud.stream.binding.StreamListenerErrorMessages.AMBIGUOUS_MESSAGE_HANDLER_METHOD_ARGUMENTS;\n+import static org.springframework.cloud.stream.binding.StreamListenerErrorMessages.ATLEAST_ONE_OUTPUT;\n+import static org.springframework.cloud.stream.binding.StreamListenerErrorMessages.INVALID_DECLARATIVE_METHOD_PARAMETERS;\n+import static org.springframework.cloud.stream.binding.StreamListenerErrorMessages.INVALID_INBOUND_NAME;\n+import static org.springframework.cloud.stream.binding.StreamListenerErrorMessages.INVALID_INPUT_OUTPUT_METHOD_PARAMETERS;\n+import static org.springframework.cloud.stream.binding.StreamListenerErrorMessages.INVALID_INPUT_VALUES;\n+import static org.springframework.cloud.stream.binding.StreamListenerErrorMessages.INVALID_INPUT_VALUE_WITH_OUTPUT_METHOD_PARAM;\n+import static org.springframework.cloud.stream.binding.StreamListenerErrorMessages.INVALID_MESSAGE_HANDLER_METHOD_PARAMS;\n+import static org.springframework.cloud.stream.binding.StreamListenerErrorMessages.INVALID_OUTBOUND_NAME;\n+import static org.springframework.cloud.stream.binding.StreamListenerErrorMessages.INVALID_OUTPUT_VALUES;\n+import static org.springframework.cloud.stream.binding.StreamListenerErrorMessages.NO_INPUT_DESTINATION;\n+import static org.springframework.cloud.stream.binding.StreamListenerErrorMessages.SEND_TO_EMPTY_DESTINATION;\n+import static org.springframework.cloud.stream.binding.StreamListenerErrorMessages.SEND_TO_MULTIPLE_DESTINATIONS;\n+\n+/**\n+ * This class contains utility methods for handling {@link StreamListener} annotated bean methods.\n+ *\n+ * @author Ilayaperumal Gopinathan\n+ */\n+public class StreamListenerMethodUtils {\n+\n+\tprotected static int inputAnnotationCount(Method method) {\n+\t\tint inputAnnotationCount = 0;\n+\t\tfor (int parameterIndex = 0; parameterIndex < method.getParameterTypes().length; parameterIndex++) {\n+\t\t\tMethodParameter methodParameter = MethodParameter.forMethodOrConstructor(method, parameterIndex);\n+\t\t\tif (methodParameter.hasParameterAnnotation(Input.class)) {\n+\t\t\t\tinputAnnotationCount++;\n+\t\t\t}\n+\t\t}\n+\t\treturn inputAnnotationCount;\n+\t}\n+\n+\tprotected static int outputAnnotationCount(Method method) {\n+\t\tint outputAnnotationCount = 0;\n+\t\tfor (int parameterIndex = 0; parameterIndex < method.getParameterTypes().length; parameterIndex++) {\n+\t\t\tMethodParameter methodParameter = MethodParameter.forMethodOrConstructor(method, parameterIndex);\n+\t\t\tif (methodParameter.hasParameterAnnotation(Output.class)) {\n+\t\t\t\toutputAnnotationCount++;\n+\t\t\t}\n+\t\t}\n+\t\treturn outputAnnotationCount;\n+\t}\n+\n+\tprotected static void assertStreamListenerMethod(Method method, int inputAnnotationCount, int outputAnnotationCount,\n+\t\t\tString methodAnnotatedInboundName, String methodAnnotatedOutboundName, boolean isDeclarative) {\n+\t\tint methodArgumentsLength = method.getParameterTypes().length;\n+\t\tif (!isDeclarative) {\n+\t\t\tAssert.isTrue(inputAnnotationCount == 0 && outputAnnotationCount == 0, INVALID_MESSAGE_HANDLER_METHOD_PARAMS);\n+\t\t}\n+\t\tif (StringUtils.hasText(methodAnnotatedInboundName) && StringUtils.hasText(methodAnnotatedOutboundName)) {\n+\t\t\tAssert.isTrue(inputAnnotationCount == 0 && outputAnnotationCount == 0, INVALID_INPUT_OUTPUT_METHOD_PARAMETERS);\n+\t\t}\n+\t\tif (StringUtils.hasText(methodAnnotatedInboundName)) {\n+\t\t\tAssert.isTrue(inputAnnotationCount == 0, INVALID_INPUT_VALUES);\n+\t\t\tAssert.isTrue(outputAnnotationCount == 0, INVALID_INPUT_VALUE_WITH_OUTPUT_METHOD_PARAM);\n+\t\t}\n+\t\telse {\n+\t\t\tAssert.isTrue(inputAnnotationCount >= 1, NO_INPUT_DESTINATION);\n+\t\t}\n+\t\tif (StringUtils.hasText(methodAnnotatedOutboundName)) {\n+\t\t\tAssert.isTrue(outputAnnotationCount == 0, INVALID_OUTPUT_VALUES);\n+\t\t}\n+\t\tif (isDeclarative) {\n+\t\t\tfor (int parameterIndex = 0; parameterIndex < methodArgumentsLength; parameterIndex++) {\n+\t\t\t\tMethodParameter methodParameter = MethodParameter.forMethodOrConstructor(method, parameterIndex);\n+\t\t\t\tif (methodParameter.hasParameterAnnotation(Input.class)) {\n+\t\t\t\t\tString inboundName = (String) AnnotationUtils.getValue(methodParameter.getParameterAnnotation(Input.class));\n+\t\t\t\t\tAssert.isTrue(StringUtils.hasText(inboundName), INVALID_INBOUND_NAME);\n+\t\t\t\t}\n+\t\t\t\tif (methodParameter.hasParameterAnnotation(Output.class)) {\n+\t\t\t\t\tString outboundName = (String) AnnotationUtils.getValue(methodParameter.getParameterAnnotation(Output.class));\n+\t\t\t\t\tAssert.isTrue(StringUtils.hasText(outboundName), INVALID_OUTBOUND_NAME);\n+\t\t\t\t}\n+\t\t\t}\n+\t\t\tif (methodArgumentsLength > 1){\n+\t\t\t\tAssert.isTrue(inputAnnotationCount + outputAnnotationCount == methodArgumentsLength, INVALID_DECLARATIVE_METHOD_PARAMETERS);\n+\t\t\t}\n+\t\t}\n+\t}\n+\n+\tprotected static void assertStreamListenerMessageHandlerMethod(Method method) {\n+\t\tint methodArgumentsLength = method.getParameterTypes().length;\n+\t\tif (methodArgumentsLength > 1) {\n+\t\t\tint numAnnotatedMethodParameters = 0;\n+\t\t\tint numPayloadAnnotations = 0;\n+\t\t\tfor (int parameterIndex = 0; parameterIndex < methodArgumentsLength; parameterIndex++) {\n+\t\t\t\tMethodParameter methodParameter = MethodParameter.forMethodOrConstructor(method, parameterIndex);\n+\t\t\t\tif (methodParameter.hasParameterAnnotations()) {\n+\t\t\t\t\tnumAnnotatedMethodParameters++;\n+\t\t\t\t}\n+\t\t\t\tif (methodParameter.hasParameterAnnotation(Payload.class)) {\n+\t\t\t\t\tnumPayloadAnnotations++;\n+\t\t\t\t}\n+\t\t\t}\n+\t\t\tif (numPayloadAnnotations > 0) {\n+\t\t\t\tAssert.isTrue(methodArgumentsLength == numAnnotatedMethodParameters && numPayloadAnnotations <= 1,\n+\t\t\t\t\t\tAMBIGUOUS_MESSAGE_HANDLER_METHOD_ARGUMENTS);\n+\t\t\t}\n+\t\t}\n+\t}\n+\n+\tprotected static String getInboundElementNameFromMethod(StreamListener streamListener) {","path":"spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binding/StreamListenerMethodUtils.java","position":132,"original_position":132,"commit_id":"56b3c8dd63665561e635d1d7100e7256a0e9ae7d","original_commit_id":"56b3c8dd63665561e635d1d7100e7256a0e9ae7d","user":{"login":"mbogoevici","id":159684,"avatar_url":"https://avatars.githubusercontent.com/u/159684?v=3","gravatar_id":"","url":"https://api.github.com/users/mbogoevici","html_url":"https://github.com/mbogoevici","followers_url":"https://api.github.com/users/mbogoevici/followers","following_url":"https://api.github.com/users/mbogoevici/following{/other_user}","gists_url":"https://api.github.com/users/mbogoevici/gists{/gist_id}","starred_url":"https://api.github.com/users/mbogoevici/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mbogoevici/subscriptions","organizations_url":"https://api.github.com/users/mbogoevici/orgs","repos_url":"https://api.github.com/users/mbogoevici/repos","events_url":"https://api.github.com/users/mbogoevici/events{/privacy}","received_events_url":"https://api.github.com/users/mbogoevici/received_events","type":"User","site_admin":false},"body":"We can inline this as it is simply getting the value from `StreamListener` - and returning `null` if empty.","created_at":"2016-11-18T23:25:06Z","updated_at":"2016-11-18T23:25:06Z","html_url":"https://github.com/spring-cloud/spring-cloud-stream/pull/681#discussion_r88758959","pull_request_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/pulls/681","_links":{"self":{"href":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/pulls/comments/88758959"},"html":{"href":"https://github.com/spring-cloud/spring-cloud-stream/pull/681#discussion_r88758959"},"pull_request":{"href":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/pulls/681"}}},"pull_request":{"url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/pulls/681","id":88491476,"html_url":"https://github.com/spring-cloud/spring-cloud-stream/pull/681","diff_url":"https://github.com/spring-cloud/spring-cloud-stream/pull/681.diff","patch_url":"https://github.com/spring-cloud/spring-cloud-stream/pull/681.patch","issue_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/issues/681","number":681,"state":"open","locked":false,"title":"Align StreamListener method/parameter mappings","user":{"login":"ilayaperumalg","id":151690,"avatar_url":"https://avatars.githubusercontent.com/u/151690?v=3","gravatar_id":"","url":"https://api.github.com/users/ilayaperumalg","html_url":"https://github.com/ilayaperumalg","followers_url":"https://api.github.com/users/ilayaperumalg/followers","following_url":"https://api.github.com/users/ilayaperumalg/following{/other_user}","gists_url":"https://api.github.com/users/ilayaperumalg/gists{/gist_id}","starred_url":"https://api.github.com/users/ilayaperumalg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ilayaperumalg/subscriptions","organizations_url":"https://api.github.com/users/ilayaperumalg/orgs","repos_url":"https://api.github.com/users/ilayaperumalg/repos","events_url":"https://api.github.com/users/ilayaperumalg/events{/privacy}","received_events_url":"https://api.github.com/users/ilayaperumalg/received_events","type":"User","site_admin":false},"body":"- Use the same mapping of method/parameters for both declarative and message handler Stream Listeners\n  - Declarative mode of the StreamListener method is determined if at least one of the the method parameters is annotated with @Input or @Output with either bound elements (e.g. channels) or conversion targets from bound elements via a registered StreamListenerParameterAdapter\n  - If the method is non-declarative then it is considered to be in message handler mode\n  - Declarative mode now accepts @Output annotation at method level as well along with @SendTo\n  - Declarative mode also accepts @Input annotation value at the method level via @StreamListener valuue.\n  - Message handler mode accepts @Input annotation value at the method parameter level and @Output annotation at the method annotation level\n  - Both @Output and @SendTo annotations are supported to specify the outbound target value while @SendTo is allowed only as a method level annotation\n  - Add assertions on allowable use of method and parameter annotations\n  - Add parameterized tests to cover all possible cases\n    - Message handler tests\n    - Reactor and RxJava tests\n\nResolves #664\n","created_at":"2016-10-07T19:07:51Z","updated_at":"2016-11-18T23:25:06Z","closed_at":null,"merged_at":null,"merge_commit_sha":"3fb64e0f278319e17f02566203cb49e8e4383aa2","assignee":{"login":"markfisher","id":140784,"avatar_url":"https://avatars.githubusercontent.com/u/140784?v=3","gravatar_id":"","url":"https://api.github.com/users/markfisher","html_url":"https://github.com/markfisher","followers_url":"https://api.github.com/users/markfisher/followers","following_url":"https://api.github.com/users/markfisher/following{/other_user}","gists_url":"https://api.github.com/users/markfisher/gists{/gist_id}","starred_url":"https://api.github.com/users/markfisher/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/markfisher/subscriptions","organizations_url":"https://api.github.com/users/markfisher/orgs","repos_url":"https://api.github.com/users/markfisher/repos","events_url":"https://api.github.com/users/markfisher/events{/privacy}","received_events_url":"https://api.github.com/users/markfisher/received_events","type":"User","site_admin":false},"assignees":[{"login":"markfisher","id":140784,"avatar_url":"https://avatars.githubusercontent.com/u/140784?v=3","gravatar_id":"","url":"https://api.github.com/users/markfisher","html_url":"https://github.com/markfisher","followers_url":"https://api.github.com/users/markfisher/followers","following_url":"https://api.github.com/users/markfisher/following{/other_user}","gists_url":"https://api.github.com/users/markfisher/gists{/gist_id}","starred_url":"https://api.github.com/users/markfisher/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/markfisher/subscriptions","organizations_url":"https://api.github.com/users/markfisher/orgs","repos_url":"https://api.github.com/users/markfisher/repos","events_url":"https://api.github.com/users/markfisher/events{/privacy}","received_events_url":"https://api.github.com/users/markfisher/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/pulls/681/commits","review_comments_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/pulls/681/comments","review_comment_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/pulls/comments{/number}","comments_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/issues/681/comments","statuses_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/statuses/56b3c8dd63665561e635d1d7100e7256a0e9ae7d","head":{"label":"ilayaperumalg:align-stream-listener-mapping","ref":"align-stream-listener-mapping","sha":"56b3c8dd63665561e635d1d7100e7256a0e9ae7d","user":{"login":"ilayaperumalg","id":151690,"avatar_url":"https://avatars.githubusercontent.com/u/151690?v=3","gravatar_id":"","url":"https://api.github.com/users/ilayaperumalg","html_url":"https://github.com/ilayaperumalg","followers_url":"https://api.github.com/users/ilayaperumalg/followers","following_url":"https://api.github.com/users/ilayaperumalg/following{/other_user}","gists_url":"https://api.github.com/users/ilayaperumalg/gists{/gist_id}","starred_url":"https://api.github.com/users/ilayaperumalg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ilayaperumalg/subscriptions","organizations_url":"https://api.github.com/users/ilayaperumalg/orgs","repos_url":"https://api.github.com/users/ilayaperumalg/repos","events_url":"https://api.github.com/users/ilayaperumalg/events{/privacy}","received_events_url":"https://api.github.com/users/ilayaperumalg/received_events","type":"User","site_admin":false},"repo":{"id":38768604,"name":"spring-cloud-stream","full_name":"ilayaperumalg/spring-cloud-stream","owner":{"login":"ilayaperumalg","id":151690,"avatar_url":"https://avatars.githubusercontent.com/u/151690?v=3","gravatar_id":"","url":"https://api.github.com/users/ilayaperumalg","html_url":"https://github.com/ilayaperumalg","followers_url":"https://api.github.com/users/ilayaperumalg/followers","following_url":"https://api.github.com/users/ilayaperumalg/following{/other_user}","gists_url":"https://api.github.com/users/ilayaperumalg/gists{/gist_id}","starred_url":"https://api.github.com/users/ilayaperumalg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ilayaperumalg/subscriptions","organizations_url":"https://api.github.com/users/ilayaperumalg/orgs","repos_url":"https://api.github.com/users/ilayaperumalg/repos","events_url":"https://api.github.com/users/ilayaperumalg/events{/privacy}","received_events_url":"https://api.github.com/users/ilayaperumalg/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/ilayaperumalg/spring-cloud-stream","description":"Messaging Microservices with Spring Integration","fork":true,"url":"https://api.github.com/repos/ilayaperumalg/spring-cloud-stream","forks_url":"https://api.github.com/repos/ilayaperumalg/spring-cloud-stream/forks","keys_url":"https://api.github.com/repos/ilayaperumalg/spring-cloud-stream/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ilayaperumalg/spring-cloud-stream/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ilayaperumalg/spring-cloud-stream/teams","hooks_url":"https://api.github.com/repos/ilayaperumalg/spring-cloud-stream/hooks","issue_events_url":"https://api.github.com/repos/ilayaperumalg/spring-cloud-stream/issues/events{/number}","events_url":"https://api.github.com/repos/ilayaperumalg/spring-cloud-stream/events","assignees_url":"https://api.github.com/repos/ilayaperumalg/spring-cloud-stream/assignees{/user}","branches_url":"https://api.github.com/repos/ilayaperumalg/spring-cloud-stream/branches{/branch}","tags_url":"https://api.github.com/repos/ilayaperumalg/spring-cloud-stream/tags","blobs_url":"https://api.github.com/repos/ilayaperumalg/spring-cloud-stream/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ilayaperumalg/spring-cloud-stream/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ilayaperumalg/spring-cloud-stream/git/refs{/sha}","trees_url":"https://api.github.com/repos/ilayaperumalg/spring-cloud-stream/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ilayaperumalg/spring-cloud-stream/statuses/{sha}","languages_url":"https://api.github.com/repos/ilayaperumalg/spring-cloud-stream/languages","stargazers_url":"https://api.github.com/repos/ilayaperumalg/spring-cloud-stream/stargazers","contributors_url":"https://api.github.com/repos/ilayaperumalg/spring-cloud-stream/contributors","subscribers_url":"https://api.github.com/repos/ilayaperumalg/spring-cloud-stream/subscribers","subscription_url":"https://api.github.com/repos/ilayaperumalg/spring-cloud-stream/subscription","commits_url":"https://api.github.com/repos/ilayaperumalg/spring-cloud-stream/commits{/sha}","git_commits_url":"https://api.github.com/repos/ilayaperumalg/spring-cloud-stream/git/commits{/sha}","comments_url":"https://api.github.com/repos/ilayaperumalg/spring-cloud-stream/comments{/number}","issue_comment_url":"https://api.github.com/repos/ilayaperumalg/spring-cloud-stream/issues/comments{/number}","contents_url":"https://api.github.com/repos/ilayaperumalg/spring-cloud-stream/contents/{+path}","compare_url":"https://api.github.com/repos/ilayaperumalg/spring-cloud-stream/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ilayaperumalg/spring-cloud-stream/merges","archive_url":"https://api.github.com/repos/ilayaperumalg/spring-cloud-stream/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ilayaperumalg/spring-cloud-stream/downloads","issues_url":"https://api.github.com/repos/ilayaperumalg/spring-cloud-stream/issues{/number}","pulls_url":"https://api.github.com/repos/ilayaperumalg/spring-cloud-stream/pulls{/number}","milestones_url":"https://api.github.com/repos/ilayaperumalg/spring-cloud-stream/milestones{/number}","notifications_url":"https://api.github.com/repos/ilayaperumalg/spring-cloud-stream/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ilayaperumalg/spring-cloud-stream/labels{/name}","releases_url":"https://api.github.com/repos/ilayaperumalg/spring-cloud-stream/releases{/id}","deployments_url":"https://api.github.com/repos/ilayaperumalg/spring-cloud-stream/deployments","created_at":"2015-07-08T17:17:59Z","updated_at":"2016-02-10T08:46:44Z","pushed_at":"2016-11-17T00:32:43Z","git_url":"git://github.com/ilayaperumalg/spring-cloud-stream.git","ssh_url":"git@github.com:ilayaperumalg/spring-cloud-stream.git","clone_url":"https://github.com/ilayaperumalg/spring-cloud-stream.git","svn_url":"https://github.com/ilayaperumalg/spring-cloud-stream","homepage":null,"size":3226,"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":"spring-cloud:master","ref":"master","sha":"bfad7b81a7ac134439bdf71a8e3d7cbc64b909b5","user":{"login":"spring-cloud","id":7815877,"avatar_url":"https://avatars.githubusercontent.com/u/7815877?v=3","gravatar_id":"","url":"https://api.github.com/users/spring-cloud","html_url":"https://github.com/spring-cloud","followers_url":"https://api.github.com/users/spring-cloud/followers","following_url":"https://api.github.com/users/spring-cloud/following{/other_user}","gists_url":"https://api.github.com/users/spring-cloud/gists{/gist_id}","starred_url":"https://api.github.com/users/spring-cloud/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/spring-cloud/subscriptions","organizations_url":"https://api.github.com/users/spring-cloud/orgs","repos_url":"https://api.github.com/users/spring-cloud/repos","events_url":"https://api.github.com/users/spring-cloud/events{/privacy}","received_events_url":"https://api.github.com/users/spring-cloud/received_events","type":"Organization","site_admin":false},"repo":{"id":38764029,"name":"spring-cloud-stream","full_name":"spring-cloud/spring-cloud-stream","owner":{"login":"spring-cloud","id":7815877,"avatar_url":"https://avatars.githubusercontent.com/u/7815877?v=3","gravatar_id":"","url":"https://api.github.com/users/spring-cloud","html_url":"https://github.com/spring-cloud","followers_url":"https://api.github.com/users/spring-cloud/followers","following_url":"https://api.github.com/users/spring-cloud/following{/other_user}","gists_url":"https://api.github.com/users/spring-cloud/gists{/gist_id}","starred_url":"https://api.github.com/users/spring-cloud/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/spring-cloud/subscriptions","organizations_url":"https://api.github.com/users/spring-cloud/orgs","repos_url":"https://api.github.com/users/spring-cloud/repos","events_url":"https://api.github.com/users/spring-cloud/events{/privacy}","received_events_url":"https://api.github.com/users/spring-cloud/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/spring-cloud/spring-cloud-stream","description":"Messaging Microservices with Spring Integration","fork":false,"url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream","forks_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/forks","keys_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/keys{/key_id}","collaborators_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/teams","hooks_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/hooks","issue_events_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/issues/events{/number}","events_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/events","assignees_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/assignees{/user}","branches_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/branches{/branch}","tags_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/tags","blobs_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/git/refs{/sha}","trees_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/git/trees{/sha}","statuses_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/statuses/{sha}","languages_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/languages","stargazers_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/stargazers","contributors_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/contributors","subscribers_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/subscribers","subscription_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/subscription","commits_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/commits{/sha}","git_commits_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/git/commits{/sha}","comments_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/comments{/number}","issue_comment_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/issues/comments{/number}","contents_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/contents/{+path}","compare_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/compare/{base}...{head}","merges_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/merges","archive_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/downloads","issues_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/issues{/number}","pulls_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/pulls{/number}","milestones_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/milestones{/number}","notifications_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/labels{/name}","releases_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/releases{/id}","deployments_url":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/deployments","created_at":"2015-07-08T15:51:38Z","updated_at":"2016-11-18T18:27:56Z","pushed_at":"2016-11-18T15:59:41Z","git_url":"git://github.com/spring-cloud/spring-cloud-stream.git","ssh_url":"git@github.com:spring-cloud/spring-cloud-stream.git","clone_url":"https://github.com/spring-cloud/spring-cloud-stream.git","svn_url":"https://github.com/spring-cloud/spring-cloud-stream","homepage":"http://cloud.spring.io/spring-cloud-stream","size":5275,"stargazers_count":109,"watchers_count":109,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":77,"mirror_url":null,"open_issues_count":46,"forks":77,"open_issues":46,"watchers":109,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/pulls/681"},"html":{"href":"https://github.com/spring-cloud/spring-cloud-stream/pull/681"},"issue":{"href":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/issues/681"},"comments":{"href":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/issues/681/comments"},"review_comments":{"href":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/pulls/681/comments"},"review_comment":{"href":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/pulls/681/commits"},"statuses":{"href":"https://api.github.com/repos/spring-cloud/spring-cloud-stream/statuses/56b3c8dd63665561e635d1d7100e7256a0e9ae7d"}}}}
{"actor":{"display_login":"mbogoevici"}}