GitHub PullRequestReviewCommentEvent at 2014-08-10 19:45:41
Repository: spring-integration
Actor: artembilan
Payload: {"action":"created","comment":{"url":"https://api.github.com/repos/spring-projects/spring-integration/pulls/comments/16032960","id":16032960,"diff_hunk":"@@ -19,152 +19,166 @@\n import java.text.MessageFormat;\n import java.util.ArrayList;\n import java.util.Arrays;\n+import java.util.Collection;\n import java.util.Collections;\n import java.util.HashMap;\n-import java.util.List;\n import java.util.Map;\n \n import org.apache.commons.logging.Log;\n import org.apache.commons.logging.LogFactory;\n \n-import org.springframework.integration.mapping.support.JsonHeaders;\n import org.springframework.messaging.MessageHeaders;\n import org.springframework.util.Assert;\n import org.springframework.util.CollectionUtils;\n-import org.springframework.util.ObjectUtils;\n import org.springframework.util.PatternMatchUtils;\n import org.springframework.util.StringUtils;\n \n /**\n- * Abstract base class for HeaderMapper implementations.\n+ * Abstract base class for {@link RequestReplyHeaderMapper} implementations.\n  *\n  * @author Mark Fisher\n  * @author Oleg Zhurakousky\n+ * @author Stephane Nicoll\n  * @since 2.1\n  */\n public abstract class AbstractHeaderMapper<T> implements RequestReplyHeaderMapper<T> {\n \n+\t/**\n+\t * A special pattern that only matches standard request headers.\n+\t */\n \tpublic static final String STANDARD_REQUEST_HEADER_NAME_PATTERN = \"STANDARD_REQUEST_HEADERS\";\n \n+\t/**\n+\t * A special pattern that only matches standard reply headers.\n+\t */\n \tpublic static final String STANDARD_REPLY_HEADER_NAME_PATTERN = \"STANDARD_REPLY_HEADERS\";\n \n-\tprivate static final String[] TRANSIENT_HEADER_NAMES = new String[] {\n-\t\tMessageHeaders.ID,\n-\t\tMessageHeaders.ERROR_CHANNEL,\n-\t\tMessageHeaders.REPLY_CHANNEL,\n-\t\tMessageHeaders.TIMESTAMP\n-\t};\n+\t/**\n+\t * A special pattern that matches any header that is not a standard header (i.e. any\n+\t * header that does not start with the configured standard header prefix)\n+\t */\n+\tpublic static final String NON_STANDARD_HEADER_NAME_PATTERN = \"NON_STANDARD_HEADERS\";\n \n-\tprotected final Log logger = LogFactory.getLog(this.getClass());\n+\tprivate static final Collection<String> TRANSIENT_HEADER_NAMES = Arrays.asList(\n+\t\t\tMessageHeaders.ID, MessageHeaders.TIMESTAMP);\n+\n+\tprotected final Log logger = LogFactory.getLog(getClass());\n \n \tprivate final String standardHeaderPrefix;\n \n-\tprivate volatile String userDefinedHeaderPrefix = \"\";\n+\tprivate final Collection<String> requestHeaderNames;\n+\n+\tprivate final Collection<String> replyHeaderNames;\n \n-\tprivate volatile List<String> requestHeaderNames = new ArrayList<String>();\n+\tprivate volatile HeaderMatcher requestHeaderMatcher;\n \n-\tprivate volatile List<String> replyHeaderNames = new ArrayList<String>();\n+\tprivate volatile HeaderMatcher replyHeaderMatcher;\n \n-\tprotected AbstractHeaderMapper() {\n-\t\tthis.standardHeaderPrefix = this.getStandardHeaderPrefix();\n-\t\tthis.requestHeaderNames.addAll(this.getStandardRequestHeaderNames());\n-\t\tthis.replyHeaderNames.addAll(this.getStandardReplyHeaderNames());\n+\t/**\n+\t * Create a new instance.\n+\t * @param standardHeaderPrefix the header prefix that identifies standard header. Such prefix helps to\n+\t * differentiate user-defined headers from standard headers. If set, user-defined headers are also\n+\t * mapped by default\n+\t * @param requestHeaderNames the header names that should be mapped from a request to {@link MessageHeaders}\n+\t * @param replyHeaderNames the header names that should be mapped to a response from {@link MessageHeaders}\n+\t */\n+\tprotected AbstractHeaderMapper(String standardHeaderPrefix,\n+\t\t\tCollection<String> requestHeaderNames, Collection<String> replyHeaderNames) {\n+\n+\t\tthis.standardHeaderPrefix = standardHeaderPrefix;\n+\t\tthis.requestHeaderNames = requestHeaderNames;\n+\t\tthis.replyHeaderNames = replyHeaderNames;\n+\t\tthis.requestHeaderMatcher = createDefaultHeaderMatcher(this.standardHeaderPrefix, this.requestHeaderNames);\n+\t\tthis.replyHeaderMatcher = createDefaultHeaderMatcher(this.standardHeaderPrefix, this.replyHeaderNames);\n \t}\n \n \t/**\n-\t * Provide the header names that should be mapped from a request (for inbound/outbound adapters)\n-\t * TO a Spring Integration Message's headers.\n-\t * The values can also contain simple wildcard patterns (e.g. \"foo*\" or \"*foo\") to be matched.\n-\t * <p>\n-\t * This will match the header name directly or, for non-standard headers, it will match\n-\t * the header name prefixed with the value, if specified, by {@link #setUserDefinedHeaderPrefix(String)}.\n+\t * Provide the header names that should be mapped from a request\n+\t * to a {@link MessageHeaders}.\n+\t * <p>The values can also contain simple wildcard patterns (e.g. \"foo*\" or \"*foo\") to be matched.\n \t *\n \t * @param requestHeaderNames The request header names.\n \t */\n-\tpublic void setRequestHeaderNames(String[] requestHeaderNames) {\n+\tpublic void setRequestHeaderNames(String... requestHeaderNames) {\n \t\tAssert.notNull(requestHeaderNames, \"'requestHeaderNames' must not be null\");\n-\t\tthis.requestHeaderNames = Arrays.asList(requestHeaderNames);\n+\t\tthis.requestHeaderMatcher = createHeaderMatcher(Arrays.asList(requestHeaderNames));\n \t}\n \n \t/**\n-\t * Provide the header names that should be mapped to a response (for inbound/outbound adapters)\n-\t * FROM a Spring Integration Message's headers.\n-\t * The values can also contain simple wildcard patterns (e.g. \"foo*\" or \"*foo\") to be matched.\n-\t * <p>\n-\t * Any non-standard headers will be prefixed with the value specified by {@link #setUserDefinedHeaderPrefix(String)}.\n+\t * Provide the header names that should be mapped to a response\n+\t * from a {@link MessageHeaders}.\n+\t * <p>The values can also contain simple wildcard patterns (e.g. \"foo*\" or \"*foo\") to be matched.\n \t *\n \t * @param replyHeaderNames The reply header names.\n \t */\n-\tpublic void setReplyHeaderNames(String[] replyHeaderNames) {\n+\tpublic void setReplyHeaderNames(String... replyHeaderNames) {\n \t\tAssert.notNull(replyHeaderNames, \"'replyHeaderNames' must not be null\");\n-\t\tthis.replyHeaderNames = Arrays.asList(replyHeaderNames);\n+\t\tthis.replyHeaderMatcher = createHeaderMatcher(Arrays.asList(replyHeaderNames));\n \t}\n \n \t/**\n-\t * Specify a prefix to be prepended to the header name for any integration\n-\t * message header that is being mapped to or from a user-defined value.\n-\t * <p>\n-\t * This does not affect the standard properties for the particular protocol, such as\n-\t * contentType for AMQP, etc. The header names used for mapping such properties are\n-\t * defined in a corresponding Headers class as constants (e.g. AmqpHeaders).\n-\t *\n-\t * @param userDefinedHeaderPrefix The user defined header prefix.\n+\t * Create the initial {@link HeaderMatcher} based on the specified headers and\n+\t * standard header prefix.\n \t */\n-\tpublic void setUserDefinedHeaderPrefix(String userDefinedHeaderPrefix) {\n-\t\tthis.userDefinedHeaderPrefix = (userDefinedHeaderPrefix != null) ? userDefinedHeaderPrefix : \"\";\n+\tprotected HeaderMatcher createDefaultHeaderMatcher(String standardHeaderPrefix, Collection<String> headerNames) {\n+\t\treturn new ContentBasedHeaderMatcher(true, headerNames);\n \t}\n \n \t/**\n-\t * Maps headers from a Spring Integration MessageHeaders instance to the target instance\n-\t * matching on the set of REQUEST headers (if different).\n-\t *\n-\t * @param headers The headers.\n-\t * @param target The target.\n+\t * Create a {@link HeaderMatcher} that match if any of the specified {@code patterns}\n+\t * match. The pattern can be a header name, a wildcard pattern such as\n+\t * {@code foo*}, {@code *foo}, or {@code within*foo}.\n+\t * <p>Special patterns are also recognized: {@link #STANDARD_REQUEST_HEADER_NAME_PATTERN},\n+\t * {@link #STANDARD_REQUEST_HEADER_NAME_PATTERN} and {@link #NON_STANDARD_HEADER_NAME_PATTERN}.\n+\t * @param patterns the patterns to apply\n+\t * @return a header mapper that match if any of the specified patters match\n \t */\n+\tprotected CompositeHeaderMatcher createHeaderMatcher(Collection<String> patterns) {","path":"spring-integration-core/src/main/java/org/springframework/integration/mapping/AbstractHeaderMapper.java","position":166,"original_position":166,"commit_id":"7e5b79257f6e09f3147a278bc1da3bf8d798e85f","original_commit_id":"7e5b79257f6e09f3147a278bc1da3bf8d798e85f","user":{"login":"artembilan","id":1071590,"avatar_url":"https://avatars.githubusercontent.com/u/1071590?v=2","gravatar_id":"c3d7e967be8fcc46780cd3dfcdc6cba9","url":"https://api.github.com/users/artembilan","html_url":"https://github.com/artembilan","followers_url":"https://api.github.com/users/artembilan/followers","following_url":"https://api.github.com/users/artembilan/following{/other_user}","gists_url":"https://api.github.com/users/artembilan/gists{/gist_id}","starred_url":"https://api.github.com/users/artembilan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/artembilan/subscriptions","organizations_url":"https://api.github.com/users/artembilan/orgs","repos_url":"https://api.github.com/users/artembilan/repos","events_url":"https://api.github.com/users/artembilan/events{/privacy}","received_events_url":"https://api.github.com/users/artembilan/received_events","type":"User","site_admin":false},"body":"Is it intentional or overdid, that return for the  `CompositeHeaderMatcher`, not `HeaderMatcher` strategy?","created_at":"2014-08-10T19:45:41Z","updated_at":"2014-08-10T19:45:41Z","html_url":"https://github.com/spring-projects/spring-integration/pull/1251#discussion_r16032960","pull_request_url":"https://api.github.com/repos/spring-projects/spring-integration/pulls/1251","_links":{"self":{"href":"https://api.github.com/repos/spring-projects/spring-integration/pulls/comments/16032960"},"html":{"href":"https://github.com/spring-projects/spring-integration/pull/1251#discussion_r16032960"},"pull_request":{"href":"https://api.github.com/repos/spring-projects/spring-integration/pulls/1251"}}},"pull_request":{"url":"https://api.github.com/repos/spring-projects/spring-integration/pulls/1251","id":19530765,"html_url":"https://github.com/spring-projects/spring-integration/pull/1251","diff_url":"https://github.com/spring-projects/spring-integration/pull/1251.diff","patch_url":"https://github.com/spring-projects/spring-integration/pull/1251.patch","issue_url":"https://api.github.com/repos/spring-projects/spring-integration/issues/1251","number":1251,"state":"open","title":"Refactor AbstractHeaderMapper","user":{"login":"snicoll","id":490484,"avatar_url":"https://avatars.githubusercontent.com/u/490484?v=2","gravatar_id":"81249832e79806754a4bd9c915164fbf","url":"https://api.github.com/users/snicoll","html_url":"https://github.com/snicoll","followers_url":"https://api.github.com/users/snicoll/followers","following_url":"https://api.github.com/users/snicoll/following{/other_user}","gists_url":"https://api.github.com/users/snicoll/gists{/gist_id}","starred_url":"https://api.github.com/users/snicoll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/snicoll/subscriptions","organizations_url":"https://api.github.com/users/snicoll/orgs","repos_url":"https://api.github.com/users/snicoll/repos","events_url":"https://api.github.com/users/snicoll/events{/privacy}","received_events_url":"https://api.github.com/users/snicoll/received_events","type":"User","site_admin":false},"body":"This commit updates `AbstractHeaderMapper` in a number of ways:\r\n\r\n* The 'userDefinedHeaderPrefix' property has been removed as some\r\n  advanced tests revealed that the feature is actually broken right\r\n  now and there is no easy way to fix it. A new richer hook point\r\n  that indicates if the property comes from the target object or the\r\n  standard MessageHeaders has been added.\r\n* A HeaderMatcher interface has been introduced to replace the\r\n  lengthy checks in shouldMapHeader. Several implementations\r\n  of that interface are provided\r\n* An additional pattern has been added that maps any header that is\r\n  *not* a standard header. It uses the standardHeaderPrefix property\r\n  for that purpose\r\n* A number of protected method that were only used to create the\r\n  instance have been removed in favour of a non default constructor.\r\n  Subclasses should provide those *static* values in their own default\r\n  constructor.\r\n* The list of transient headers can now be customized. Transient\r\n  headers are headers that should never be mapped. The standard\r\n  ErrorChannel and ReplyChannel headers have also been removed from\r\n  the default transient headers list as they no longer need to be\r\n  transient","created_at":"2014-08-08T14:40:03Z","updated_at":"2014-08-10T19:45:41Z","closed_at":null,"merged_at":null,"merge_commit_sha":"a774fc08b09a9b03b49bd938c7987c44c37c28e2","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/spring-projects/spring-integration/pulls/1251/commits","review_comments_url":"https://api.github.com/repos/spring-projects/spring-integration/pulls/1251/comments","review_comment_url":"https://api.github.com/repos/spring-projects/spring-integration/pulls/comments/{number}","comments_url":"https://api.github.com/repos/spring-projects/spring-integration/issues/1251/comments","statuses_url":"https://api.github.com/repos/spring-projects/spring-integration/statuses/7e5b79257f6e09f3147a278bc1da3bf8d798e85f","head":{"label":"snicoll:header-mapper","ref":"header-mapper","sha":"7e5b79257f6e09f3147a278bc1da3bf8d798e85f","user":{"login":"snicoll","id":490484,"avatar_url":"https://avatars.githubusercontent.com/u/490484?v=2","gravatar_id":"81249832e79806754a4bd9c915164fbf","url":"https://api.github.com/users/snicoll","html_url":"https://github.com/snicoll","followers_url":"https://api.github.com/users/snicoll/followers","following_url":"https://api.github.com/users/snicoll/following{/other_user}","gists_url":"https://api.github.com/users/snicoll/gists{/gist_id}","starred_url":"https://api.github.com/users/snicoll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/snicoll/subscriptions","organizations_url":"https://api.github.com/users/snicoll/orgs","repos_url":"https://api.github.com/users/snicoll/repos","events_url":"https://api.github.com/users/snicoll/events{/privacy}","received_events_url":"https://api.github.com/users/snicoll/received_events","type":"User","site_admin":false},"repo":{"id":17741761,"name":"spring-integration","full_name":"snicoll/spring-integration","owner":{"login":"snicoll","id":490484,"avatar_url":"https://avatars.githubusercontent.com/u/490484?v=2","gravatar_id":"81249832e79806754a4bd9c915164fbf","url":"https://api.github.com/users/snicoll","html_url":"https://github.com/snicoll","followers_url":"https://api.github.com/users/snicoll/followers","following_url":"https://api.github.com/users/snicoll/following{/other_user}","gists_url":"https://api.github.com/users/snicoll/gists{/gist_id}","starred_url":"https://api.github.com/users/snicoll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/snicoll/subscriptions","organizations_url":"https://api.github.com/users/snicoll/orgs","repos_url":"https://api.github.com/users/snicoll/repos","events_url":"https://api.github.com/users/snicoll/events{/privacy}","received_events_url":"https://api.github.com/users/snicoll/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/snicoll/spring-integration","description":"Spring Integration provides an extension of the Spring programming model to support the well-known Enterprise Integration Patterns (EIP)","fork":true,"url":"https://api.github.com/repos/snicoll/spring-integration","forks_url":"https://api.github.com/repos/snicoll/spring-integration/forks","keys_url":"https://api.github.com/repos/snicoll/spring-integration/keys{/key_id}","collaborators_url":"https://api.github.com/repos/snicoll/spring-integration/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/snicoll/spring-integration/teams","hooks_url":"https://api.github.com/repos/snicoll/spring-integration/hooks","issue_events_url":"https://api.github.com/repos/snicoll/spring-integration/issues/events{/number}","events_url":"https://api.github.com/repos/snicoll/spring-integration/events","assignees_url":"https://api.github.com/repos/snicoll/spring-integration/assignees{/user}","branches_url":"https://api.github.com/repos/snicoll/spring-integration/branches{/branch}","tags_url":"https://api.github.com/repos/snicoll/spring-integration/tags","blobs_url":"https://api.github.com/repos/snicoll/spring-integration/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/snicoll/spring-integration/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/snicoll/spring-integration/git/refs{/sha}","trees_url":"https://api.github.com/repos/snicoll/spring-integration/git/trees{/sha}","statuses_url":"https://api.github.com/repos/snicoll/spring-integration/statuses/{sha}","languages_url":"https://api.github.com/repos/snicoll/spring-integration/languages","stargazers_url":"https://api.github.com/repos/snicoll/spring-integration/stargazers","contributors_url":"https://api.github.com/repos/snicoll/spring-integration/contributors","subscribers_url":"https://api.github.com/repos/snicoll/spring-integration/subscribers","subscription_url":"https://api.github.com/repos/snicoll/spring-integration/subscription","commits_url":"https://api.github.com/repos/snicoll/spring-integration/commits{/sha}","git_commits_url":"https://api.github.com/repos/snicoll/spring-integration/git/commits{/sha}","comments_url":"https://api.github.com/repos/snicoll/spring-integration/comments{/number}","issue_comment_url":"https://api.github.com/repos/snicoll/spring-integration/issues/comments/{number}","contents_url":"https://api.github.com/repos/snicoll/spring-integration/contents/{+path}","compare_url":"https://api.github.com/repos/snicoll/spring-integration/compare/{base}...{head}","merges_url":"https://api.github.com/repos/snicoll/spring-integration/merges","archive_url":"https://api.github.com/repos/snicoll/spring-integration/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/snicoll/spring-integration/downloads","issues_url":"https://api.github.com/repos/snicoll/spring-integration/issues{/number}","pulls_url":"https://api.github.com/repos/snicoll/spring-integration/pulls{/number}","milestones_url":"https://api.github.com/repos/snicoll/spring-integration/milestones{/number}","notifications_url":"https://api.github.com/repos/snicoll/spring-integration/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/snicoll/spring-integration/labels{/name}","releases_url":"https://api.github.com/repos/snicoll/spring-integration/releases{/id}","created_at":"2014-03-14T09:44:56Z","updated_at":"2014-03-14T09:44:58Z","pushed_at":"2014-08-08T14:39:43Z","git_url":"git://github.com/snicoll/spring-integration.git","ssh_url":"git@github.com:snicoll/spring-integration.git","clone_url":"https://github.com/snicoll/spring-integration.git","svn_url":"https://github.com/snicoll/spring-integration","homepage":"http://projects.spring.io/spring-integration/","size":26549,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":true,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"spring-projects:master","ref":"master","sha":"0aec26ad4f91421039550f44059969489c680425","user":{"login":"spring-projects","id":317776,"avatar_url":"https://avatars.githubusercontent.com/u/317776?v=2","gravatar_id":"6f8a529bd100f4272a9ff1b8cdfbd26e","url":"https://api.github.com/users/spring-projects","html_url":"https://github.com/spring-projects","followers_url":"https://api.github.com/users/spring-projects/followers","following_url":"https://api.github.com/users/spring-projects/following{/other_user}","gists_url":"https://api.github.com/users/spring-projects/gists{/gist_id}","starred_url":"https://api.github.com/users/spring-projects/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/spring-projects/subscriptions","organizations_url":"https://api.github.com/users/spring-projects/orgs","repos_url":"https://api.github.com/users/spring-projects/repos","events_url":"https://api.github.com/users/spring-projects/events{/privacy}","received_events_url":"https://api.github.com/users/spring-projects/received_events","type":"Organization","site_admin":false},"repo":{"id":2090979,"name":"spring-integration","full_name":"spring-projects/spring-integration","owner":{"login":"spring-projects","id":317776,"avatar_url":"https://avatars.githubusercontent.com/u/317776?v=2","gravatar_id":"6f8a529bd100f4272a9ff1b8cdfbd26e","url":"https://api.github.com/users/spring-projects","html_url":"https://github.com/spring-projects","followers_url":"https://api.github.com/users/spring-projects/followers","following_url":"https://api.github.com/users/spring-projects/following{/other_user}","gists_url":"https://api.github.com/users/spring-projects/gists{/gist_id}","starred_url":"https://api.github.com/users/spring-projects/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/spring-projects/subscriptions","organizations_url":"https://api.github.com/users/spring-projects/orgs","repos_url":"https://api.github.com/users/spring-projects/repos","events_url":"https://api.github.com/users/spring-projects/events{/privacy}","received_events_url":"https://api.github.com/users/spring-projects/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/spring-projects/spring-integration","description":"Spring Integration provides an extension of the Spring programming model to support the well-known Enterprise Integration Patterns (EIP)","fork":false,"url":"https://api.github.com/repos/spring-projects/spring-integration","forks_url":"https://api.github.com/repos/spring-projects/spring-integration/forks","keys_url":"https://api.github.com/repos/spring-projects/spring-integration/keys{/key_id}","collaborators_url":"https://api.github.com/repos/spring-projects/spring-integration/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/spring-projects/spring-integration/teams","hooks_url":"https://api.github.com/repos/spring-projects/spring-integration/hooks","issue_events_url":"https://api.github.com/repos/spring-projects/spring-integration/issues/events{/number}","events_url":"https://api.github.com/repos/spring-projects/spring-integration/events","assignees_url":"https://api.github.com/repos/spring-projects/spring-integration/assignees{/user}","branches_url":"https://api.github.com/repos/spring-projects/spring-integration/branches{/branch}","tags_url":"https://api.github.com/repos/spring-projects/spring-integration/tags","blobs_url":"https://api.github.com/repos/spring-projects/spring-integration/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/spring-projects/spring-integration/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/spring-projects/spring-integration/git/refs{/sha}","trees_url":"https://api.github.com/repos/spring-projects/spring-integration/git/trees{/sha}","statuses_url":"https://api.github.com/repos/spring-projects/spring-integration/statuses/{sha}","languages_url":"https://api.github.com/repos/spring-projects/spring-integration/languages","stargazers_url":"https://api.github.com/repos/spring-projects/spring-integration/stargazers","contributors_url":"https://api.github.com/repos/spring-projects/spring-integration/contributors","subscribers_url":"https://api.github.com/repos/spring-projects/spring-integration/subscribers","subscription_url":"https://api.github.com/repos/spring-projects/spring-integration/subscription","commits_url":"https://api.github.com/repos/spring-projects/spring-integration/commits{/sha}","git_commits_url":"https://api.github.com/repos/spring-projects/spring-integration/git/commits{/sha}","comments_url":"https://api.github.com/repos/spring-projects/spring-integration/comments{/number}","issue_comment_url":"https://api.github.com/repos/spring-projects/spring-integration/issues/comments/{number}","contents_url":"https://api.github.com/repos/spring-projects/spring-integration/contents/{+path}","compare_url":"https://api.github.com/repos/spring-projects/spring-integration/compare/{base}...{head}","merges_url":"https://api.github.com/repos/spring-projects/spring-integration/merges","archive_url":"https://api.github.com/repos/spring-projects/spring-integration/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/spring-projects/spring-integration/downloads","issues_url":"https://api.github.com/repos/spring-projects/spring-integration/issues{/number}","pulls_url":"https://api.github.com/repos/spring-projects/spring-integration/pulls{/number}","milestones_url":"https://api.github.com/repos/spring-projects/spring-integration/milestones{/number}","notifications_url":"https://api.github.com/repos/spring-projects/spring-integration/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/spring-projects/spring-integration/labels{/name}","releases_url":"https://api.github.com/repos/spring-projects/spring-integration/releases{/id}","created_at":"2011-07-22T21:47:27Z","updated_at":"2014-08-07T11:28:31Z","pushed_at":"2014-08-06T10:43:29Z","git_url":"git://github.com/spring-projects/spring-integration.git","ssh_url":"git@github.com:spring-projects/spring-integration.git","clone_url":"https://github.com/spring-projects/spring-integration.git","svn_url":"https://github.com/spring-projects/spring-integration","homepage":"http://projects.spring.io/spring-integration/","size":80523,"stargazers_count":268,"watchers_count":268,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":true,"forks_count":239,"mirror_url":null,"open_issues_count":16,"forks":239,"open_issues":16,"watchers":268,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/spring-projects/spring-integration/pulls/1251"},"html":{"href":"https://github.com/spring-projects/spring-integration/pull/1251"},"issue":{"href":"https://api.github.com/repos/spring-projects/spring-integration/issues/1251"},"comments":{"href":"https://api.github.com/repos/spring-projects/spring-integration/issues/1251/comments"},"review_comments":{"href":"https://api.github.com/repos/spring-projects/spring-integration/pulls/1251/comments"},"review_comment":{"href":"https://api.github.com/repos/spring-projects/spring-integration/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/spring-projects/spring-integration/pulls/1251/commits"},"statuses":{"href":"https://api.github.com/repos/spring-projects/spring-integration/statuses/7e5b79257f6e09f3147a278bc1da3bf8d798e85f"}}}}