Compare commits

...

2073 Commits

Author SHA1 Message Date
Spring Buildmaster 0ddc62e87f Release version 5.2.3.RELEASE 2020-01-14 08:00:35 +00:00
Rossen Stoyanchev 8740c2dc18 Warning against split URL handling in docs
Closes gh-24304
2020-01-13 21:33:11 +00:00
Stephane Nicoll 5debd866d4 Upgrade to Reactor Dysprosium SR3
Closes gh-24349
2020-01-13 20:22:47 +01:00
Sam Brannen 1c270d8d06 Fix Checkstyle violation 2020-01-13 18:21:36 +01:00
Rossen Stoyanchev 29fe65d23c Upgrade to Dysprosium snapshots
See gh-24349
2020-01-13 16:49:42 +00:00
Sam Brannen 8a6086774f Polishing regarding AJDT versions 2020-01-13 17:15:27 +01:00
Sam Brannen 33ffdd865d Update copyright date 2020-01-13 16:29:23 +01:00
Qimiao Chen c84dd55863 Fix typo in ReflectionUtilsTests
Closes gh-24344
2020-01-13 16:27:05 +01:00
Rossen Stoyanchev cbc57460b7 Support for maxInMemorySize in SSE reader
Closes gh-24312
2020-01-13 14:57:14 +00:00
Rossen Stoyanchev a741ae422b Improve limit handling in StringDecoder
The case of one data buffer containing multiple lines can could cause
a buffer leak due to a suspected issue in concatMapIterable. This
commit adds workarounds for that until the underlying issue is
addressed.

Closes gh-24339
2020-01-13 14:57:14 +00:00
Sam Brannen 850cbf032b Document Objenesis license in license.txt
Closes gh-24340
2020-01-13 14:42:04 +01:00
Sam Brannen a566083a07 Update ASM and CBLIB versions in license.txt 2020-01-13 13:16:50 +01:00
Sam Brannen 798744838c Revise exception handling in AbstractEmbeddedDatabaseConfigurer
See gh-24337
2020-01-13 12:51:31 +01:00
Sébastien Deleuze 3f1882c4eb Support noarg callable references in Kotlin beans DSL
Closes gh-23395
2020-01-13 10:53:23 +01:00
Juergen Hoeller 0801a7d7e4 Upgrade to RxJava 2.2.17, OkHttp 3.14.6, Jetty Reactive HttpClient 1.1.1 2020-01-13 10:40:01 +01:00
Sébastien Deleuze 6747cc1353 Make WebTestClientExtensions.expectBody generics compliant
Closes gh-24142
2020-01-13 10:06:03 +01:00
Sébastien Deleuze bc7d010485 Update CORS support
This commit updates CORS support in order to check Origin header
in CorsUtils#isPreFlightRequest which does not change how Spring
MVC or WebFlux process CORS request but is more correct in term
of behavior since it is a public API potentially used in another
contexts.

It also removes an unnecessary check in
AbstractHandlerMethodMapping#hasCorsConfigurationSource and processes
every preflight request with PreFlightHandler.

Closes gh-24327
2020-01-13 08:33:14 +01:00
Sam Brannen 8396e6bdd1 Link to ADJT in the Eclipse Marketplace 2020-01-11 13:11:17 +01:00
Sam Brannen cb8db1e6df Polish Javadoc 2020-01-10 16:05:33 +01:00
Brian Clozel a31a4f8148 Copy strategiesConfigurers when cloning WebClient.Builder
This commit fixes the missing `strategiesConfigurers` copy when the
`WebClient.Builder` is cloned.

Fixes gh-24329
2020-01-10 15:59:59 +01:00
Stephane Nicoll bdb9f9570e Polish 2020-01-09 17:08:48 +01:00
Juergen Hoeller f6ca21f6a4 Upgrade to SLF4J 1.7.30 and Checkstyle 8.28 2020-01-09 17:03:30 +01:00
Juergen Hoeller 4936a637fe Polishing 2020-01-09 17:03:17 +01:00
Sam Brannen e8ef93c508 Polish contribution
See gh-24321
2020-01-09 15:56:25 +01:00
lixiaolong11000 047eefd2e2 Improve exception message in AopContext.currentProxy()
Closes gh-24321
2020-01-09 15:56:09 +01:00
Juergen Hoeller b0e4b7e29c Re-calculate SimpleKey's hashCode field on deserialization
Closes gh-24320
2020-01-09 15:39:04 +01:00
Rossen Stoyanchev 08e9372ded Restore response after beforeCommit action errors
See gh-24186
2020-01-09 11:10:44 +00:00
Rossen Stoyanchev 34d32402d3 Return 500 if producible attribute present
When a request is mapped through a producible condition on an
@RequestMapping, then a failure to find a converter/decoder should be
a 500 because the return type + media type pair were declared by the
controller and that should be possible to render.

Closes gh-23287
2020-01-09 11:10:44 +00:00
Andy Wilkinson 1ec15ba9c2 Always configure PDF backend as task will only run on cache miss
Previously, the Asciidoctor task was not cacheable and generating the
PDF documentation was very slow. To improve build times, the PDF
documentation was not generated for snapshot builds.

The upgrade to 2.4.0 of the Asciidoctor Gradle pluging means that the
Asciidoctor task is now cacheable. As such, its tasks will only run
when the documentation has changed. This should allow PDF
documentation to be published for every build without slowing things
down too much and the cost of generating the documentation will only
be incurred when there is a change to the documentation.

See gh-24216
2020-01-09 10:17:44 +01:00
Andy Wilkinson 2ac5744323 Upgrade to Asciidoctor Gradle Plugin 2.4
This commit updates the build to use the latest version of the
Asciidoctor Gradle Plugin. One significant new feature is that the
plugin's tasks are now cacheable.

Closes gh-24216
2020-01-09 10:17:27 +01:00
Juergen Hoeller c39ed52f97 Add since tag to hasMethod(Class, Method)
See gh-24282
2020-01-08 19:05:03 +01:00
stsypanov 8e5cad2af3 Add fast path for ClassUtils.hasMethod() 2020-01-08 18:52:15 +01:00
Juergen Hoeller c562c3a0b3 Upgrade to Netty 4.1.44, Jetty 9.4.25, Undertow 2.0.29, OkHttp 3.14.5, Jackson 2.10.2 2020-01-08 18:38:55 +01:00
Juergen Hoeller 259ffe9b3b Thread-safe compiled expression evaluation in SpelExpression
Closes gh-24265
2020-01-08 18:37:07 +01:00
Rossen Stoyanchev 9d6e40fb1e Merge pull request #24143 from yoshikawaa/patch-1
Closes gh-24143
2020-01-08 16:48:54 +00:00
Rossen Stoyanchev d509d5ae6f Polishing contribution
See gh-24143
2020-01-08 16:47:33 +00:00
Astushi Yoshikawa 53b39eb753 MvcUriComponentsBuilder prepends slash
See gh-24143
2020-01-08 16:47:33 +00:00
Rossen Stoyanchev 1dd5db42ab Merge pull request #24292 from ofaizulin/rd-httpmsgconv-fix-isr-contentlength
Closes gh-24292
2020-01-08 16:19:42 +00:00
Rossen Stoyanchev 01827389ef Polishing contribution
See gh-24292
2020-01-08 16:19:25 +00:00
Oleh Faizulin e96b71acf3 contentLength support for Resource decoding
Expose the known content length, if known, in the InputStreamResource returned by ResourceHttpMessageConverter or
ResourceDecoder.

See gh-24292
2020-01-08 16:19:11 +00:00
Sam Brannen e3e7d90415 Improve documentation for FullyQualifiedAnnotationBeanNameGenerator
See gh-24114
2020-01-08 16:47:39 +01:00
Sam Brannen b4c91e7dac Introduce BeanNameGenerator based on fully qualified class name
Prior to this commit, Spring offered two top-level implementations of
the BeanNameGenerator strategy: DefaultBeanNameGenerator and
AnnotationBeanNameGenerator. The latter is used as the default bean
name generator for beans picked up via component scanning. In a typical
application, this strategy works well; however, if multiple component
scanned beans have the same simple class name (i.e., identical names
ignoring the package), a BeanDefinitionStoreException is thrown.

To address such naming conflicts, users of Spring have had to implement
a custom BeanNameGenerator based on the fully qualified class name of
such components.

Similar conflicts can arise with components registered via
configuration class imports (i.e., via @Import), and
ConfigurationClassPostProcessor addresses this via an anonymous inner
class that extends AnnotationBeanNameGenerator but falls back to using
the fully qualified class name if an explicit bean name is not provided
via an annotation.

This commit extracts the implementation of
ConfigurationClassPostProcessor's internal BeanNameGenerator into a new
top-level FullyQualifiedAnnotationBeanNameGenerator class that can be
used to disambiguate between same-named components residing in
different packages that are picked up via component scanning. This bean
name generator can be configured via @ComponentScan's nameGenerator
attribute.

Closes gh-24114
2020-01-07 19:39:28 +01:00
Sam Brannen e1fb4a1966 Polishing 2020-01-07 18:47:54 +01:00
Sam Brannen ef6b1ba034 Update copyright date 2020-01-07 17:15:23 +01:00
Rossen Stoyanchev 9d963abb7d Concrete MediaType check in StringHttpMessageConverter
Closes gh-23287
2020-01-07 15:02:39 +00:00
stsypanov c480a99a77 Trim line from LineInfo only once 2020-01-07 14:44:09 +01:00
Sam Brannen 55e0ff11ca Add note regarding ADJT development builds for Eclipse 4.10 2020-01-07 13:59:31 +01:00
Sam Brannen 12a78d1af2 Update copyright date
See gh-24305
2020-01-07 11:36:53 +01:00
GungnirLaevatain 4692f20aac Remove code duplication in AnnotationDrivenBeanDefinitionParser
This commit merges the implementations of getCallableInterceptors()
and getDeferredResultInterceptors() in order to remove code duplication.

Closes gh-24305
2020-01-07 11:35:38 +01:00
Sam Brannen 141dae6437 Polish contribution
See gh-24293
2020-01-07 11:07:03 +01:00
lixiaolong11000 132805133d Improve ExposeInvocationInterceptor exception message
Closes gh-24293
2020-01-07 11:03:11 +01:00
Brian Clozel ffc1f960f9 Polish
See gh-24238
2020-01-07 09:05:49 +01:00
Rossen Stoyanchev ea6d2ea1ce Multi-value headers in ResponseStatusException
Closes gh-24261
2020-01-06 22:13:55 +00:00
Brian Clozel f9c1565f4e Remove Content-* response headers for error handling
Prior to this commit, when WebFlux handlers added `"Content-*"` response
headers and an error happened while handling the request, all those
headers would not be cleared from the response before error handling.

This commit clears those headers from the response in two places:
* when invoking the handler and adapting the response
* when writing the response body

Not removing those headers might break HTTP clients since they're given
wrong information about how to interpret the HTTP response body: the
error response body might be very different from the original one.

Fixes gh-24238
2020-01-06 16:55:08 +01:00
Sam Brannen 59ade91694 Use HTTPS in link
See gh-24268
2020-01-06 14:45:17 +01:00
Sam Brannen c1d0060a6f Recommend third-party alternatives in BeanUtils Javadoc
See gh-24268
2020-01-06 14:41:00 +01:00
Sam Brannen 3299793c8a Polish [Simple]AliasRegistry[Tests] 2020-01-06 11:30:05 +01:00
Qimiao Chen d0c2812dad Optimize SimpleAliasRegistry hasAlias implementation
This commit reduces the number of loops and recursions in
the implementation of SimpleAliasRegistry#hasAlias().

Closes gh-24295
2020-01-06 11:28:24 +01:00
Sam Brannen 328e88d204 Document minimum Buildship and Eclipse requirements 2020-01-06 10:53:20 +01:00
Sam Brannen 22a888b53d Polish test fixture publication skipping config
Thanks to @jjohannes for the tip.

See gh-23550
2020-01-03 14:56:13 +01:00
Sam Brannen 081b3d304d Move JavaUtilLoggingConfigurer to spring-core test fixtures
See gh-23550
2020-01-03 14:34:29 +01:00
Rossen Stoyanchev 92a28392db Merge pull request #24287 from KangZhiDong/master
Closes gh-24287
2020-01-03 11:22:00 +00:00
Rossen Stoyanchev 510ef1ab2e Polishing contribution
See gh-24287
2020-01-03 11:21:07 +00:00
KangZhiDong f585eb0b79 Fix Javadoc typos
See gh-24287
2020-01-03 11:21:07 +00:00
Rossen Stoyanchev 03ea92df99 Improve RestClientException Javadoc
Closes gh-24288
2020-01-03 11:12:01 +00:00
Rossen Stoyanchev 68f9f8116c Fix typo in RSocket reference
See gh-24245
2020-01-03 08:11:14 +00:00
Sam Brannen 3aa2605fda Replace TestSourcesPlugin with Gradle test fixture support
Prior to this series of commits, the Spring Framework build used a
custom TestSourcesPlugin to share test utilities and fixtures between
projects. This plugin served its purpose; however, it also had its
drawbacks:

- All test code was visible in all other (downstream) projects, and that
  made it too easy to introduce unnecessary coupling. For example,
  this made it more difficult to migrate to JUnit Jupiter.

This commit addresses such issues by migrating to Gradle's first-class
support for "Java test fixtures".

- Having test fixture code in a dedicated source folder makes it
  readily apparent that the code is reused across the test suite.
- The build is now much cleaner since projects explicitly declare that
  they rely on specific test fixtures of upstream projects.
- Incremental builds are now much faster on average since downstream
  projects no longer have to be recompiled due to changes in tests in
  upstream projects.
- Prior to these commits we effectively had around 20 test fixture
  dependencies. With these commits we effectively now have only 7 test
  fixture dependencies (i.e., projects that share test fixtures).

Closes gh-23550
2020-01-02 16:01:56 +01:00
Sam Brannen d5f0bb23ae Disable publication of test fixture artifacts
Thanks to @melix for providing the code snippet necessary to achieve
this with Gradle 5.6.x.

See gh-23550
2020-01-02 16:01:35 +01:00
Sam Brannen c91dd02905 Delete obsolete TestSourcesPlugin
Since we have migrated to Gradle's built-in test fixture support, the
custom TestSourcesPlugin Gradle plugin is now obsolete.

See gh-23550
2020-01-02 16:01:35 +01:00
Sam Brannen 7b6d83a106 Use Gradle test fixture support for spring-web
See gh-23550
2020-01-02 16:01:35 +01:00
Sam Brannen 8a371c7669 Use Gradle test fixture support for spring-aop
See gh-23550
2020-01-02 16:01:35 +01:00
Sam Brannen 5581f3b77b Use Gradle test fixture support for spring-tx
See gh-23550
2020-01-02 16:01:35 +01:00
Sam Brannen 57b771ba92 Move common FactoryMethods to spring-beans test fixtures
See gh-23550
2020-01-02 16:01:35 +01:00
Sam Brannen 94f8ef08e2 Move common TestPrincipal to spring-core test fixtures
See gh-23550
2020-01-02 16:01:35 +01:00
Sam Brannen 726b1bb1d0 Rename test fixture package in spring-context
See gh-23550
2020-01-02 16:01:35 +01:00
Sam Brannen 7cd4ddf5fc Rename test fixture package in spring-beans
See gh-23550
2020-01-02 16:01:35 +01:00
Sam Brannen 4260c34b47 Rename test fixture package in spring-core
See gh-23550
2020-01-02 16:01:34 +01:00
Sam Brannen 0335db23c9 Use Gradle test fixture support for spring-context-support
See gh-23550
2020-01-02 16:01:34 +01:00
Sam Brannen 61d4ee594d Use Gradle test fixture support for spring-beans and spring-context
See gh-23550
2020-01-02 16:01:34 +01:00
Sam Brannen 5718bf424b Use Gradle test fixture support for spring-core
See gh-23550
2020-01-02 16:01:34 +01:00
Brian Clozel 75fd391fc7 Remove quality parameter from selected media type
Prior to this commit, WebFlux application would keep the quality
parameter from the "Accept" request header when selecting a media type
for the response. It would then echo it back to the client.

While strictly not wrong, this is unnecessary and can confuse HTTP
clients. This commit aligns WebFlux's behavior with Spring MVC.

Fixes gh-24239
2020-01-02 11:29:04 +01:00
Honnix 8082b338e2 Document that SpEL supports symbolic logical operators
Make it clear that symbolic logical operators are supported.

Closes gh-24276
2019-12-31 18:58:48 +01:00
Rossen Stoyanchev 956ffe6858 ContentDisposition refactoring
See gh-24220
2019-12-26 17:30:15 +00:00
Stephane Nicoll 3cf806a668 Merge pull request #24266 from PascalSchumacher
* pr/24266:
  Add missing space in AopConfigException message

Closes gh-24266
2019-12-26 09:55:41 +01:00
Pascal Schumacher e7d489667c Add missing space in AopConfigException message
See gh-24266
2019-12-26 09:52:54 +01:00
Stephane Nicoll 9c17eb59a4 Merge pull request #24252 from ghale
* pr/24252:
  Upgrade to Gradle build scan plugin 3.1.1

Closes gh-24252
2019-12-23 17:16:58 +01:00
Gary Hale 2d779857aa Upgrade to Gradle build scan plugin 3.1.1
See gh-24252
2019-12-23 17:09:48 +01:00
Stephane Nicoll 9c2d146a51 Merge pull request #24251 from ghale
* pr/24251:
  Upgrade to nohttp plugin 0.0.4.RELEASE

Closes gh-24251
2019-12-23 16:47:45 +01:00
Gary Hale b6b7162d61 Upgrade to nohttp plugin 0.0.4.RELEASE
See gh-24251
2019-12-23 16:46:35 +01:00
Ferdinand Jacobs 0b5ad09394 Fix example in RSocket docs
Closes gh-24245
2019-12-22 16:48:58 +01:00
Sam Brannen 1b4fd1cba1 Polishing 2019-12-22 16:00:45 +01:00
Rossen Stoyanchev 261956fd08 Improve UriBuilder Javadoc on query params
Add a note on encoding for query parameters specifically mentioning the
"+" sign and a link to the reference docs.

Also remove duplicate Javadoc in UriComponentsBuilder which is already
inherited from UriBuilder.
2019-12-20 11:03:08 +00:00
Rossen Stoyanchev a1b8b18282 Polishing logPrefix Javadoc in ClientRequest|Response
Closes gh-23791
2019-12-20 09:27:40 +00:00
Rossen Stoyanchev 7456fb9c65 Add failing test to be fixed
See gh-23791
2019-12-20 09:15:44 +00:00
Rossen Stoyanchev ea4f1ca5d5 Update ContentDisposition to RFC 6266
Close gh-24231
2019-12-19 16:27:40 +00:00
Rossen Stoyanchev 15321a3163 Fix checkstyle violations 2019-12-19 13:06:53 +00:00
Rossen Stoyanchev 41f40c6c22 Escape quotes in filename
Closes gh-24220
2019-12-19 12:23:12 +00:00
Rossen Stoyanchev 44da775134 CorsInterceptor skips async dispatch
Closes gh-24223
2019-12-18 16:48:49 +00:00
Rossen Stoyanchev 0eacb443b0 Reuse InputStream in ResourceRegionHttpMessageConverter
The converter now tries to keep reading from the same InputStream which
should be possible with ordered and non-overlapping regions. When
necessary the InputStream is re-opened.

Closes gh-24214
2019-12-18 16:22:53 +00:00
Juergen Hoeller 7474ee7041 Polishing 2019-12-16 16:50:30 +01:00
Juergen Hoeller 0711e58a5f Un-deprecate PathResource (for NIO Path resolution in createRelative)
Includes aligned createRelative signature and dedicated java.io.File test.

Closes gh-24211
2019-12-16 16:50:04 +01:00
Juergen Hoeller f353bc0c25 ConcurrentReferenceHashMap cache for getInterfaceMethodIfPossible results
Closes gh-24206
2019-12-16 16:49:39 +01:00
Juergen Hoeller 5836680490 Upgrade to Log4J 2.13 and RxJava 2.2.16 2019-12-15 23:28:04 +01:00
Rossen Stoyanchev 5f9178034c Merge pull request #2079
Closes gh-2079
2019-12-13 16:55:38 +00:00
Rossen Stoyanchev 542297b30d Polishing of contribution
See gh-2079
2019-12-13 16:54:53 +00:00
Dzmitry Kabysh f4509d6e3a Allow any Accept and Content-Type raw values
See gh-2079
2019-12-13 16:20:55 +00:00
wonwoo f8d6896e40 Replace context object with "it" argument
Closes gh-23482
2019-12-13 16:19:06 +00:00
Sam Brannen 6fdf5ef6ee Polish contribution
See gh-24205
2019-12-13 17:14:26 +01:00
Сергей Цыпанов d9cae339d6 Simplify AdvisedSupport.removeAdvisor()
Closes gh-24205
2019-12-13 17:12:18 +01:00
Sam Brannen 17edbec035 Polishing 2019-12-13 16:30:03 +01:00
Sam Brannen 47b18e5ea9 Polishing 2019-12-13 16:12:39 +01:00
lixiaolong11000 bee2b7cd73 Add missing test cases in XmlBeanFactoryTests
Closes gh-24189
2019-12-13 15:56:06 +01:00
Sam Brannen 49ddf798e0 Polish ClassUtils.resolvePrimitiveClassName()
See gh-24192
2019-12-13 15:47:05 +01:00
Arjen Poutsma 09b6730f3d Expose logPrefix in ClientResponse
This commit exposes the logPrefix field in the ClientResponse interface.

Closes gh-24146
2019-12-13 10:59:53 +01:00
Gary Russell 63844c6d74 MappingJackson2MessageConverter: fix javadoc typo
`getJavaTypeForMessage()` - wrong parameter description.
2019-12-13 09:58:46 +01:00
Rossen Stoyanchev 1dd0a0f009 Fix since tags from prior commit 2019-12-12 22:03:38 +00:00
Rossen Stoyanchev b23617637d Fix cloning issue in CodecConfigurer for multipart writers
Closes gh-24194
2019-12-12 21:58:14 +00:00
Rossen Stoyanchev dd9b6287b4 Expose ClientCodecConfigurer in WebClient.Builder
Using Consumer<ClientCodecConfigurer> instead of
Consumer<ExchangeStrategies> eliminates one level of nesting that is
also unnecessary since codecs are the only strategy at present.

Closes gh-24124
2019-12-12 21:58:14 +00:00
Rossen Stoyanchev 11e321b8e7 Add register methods to CodecConfigurer.CustomCodecs
The new register methods replace the now deprecated
encoder, decoder, reader, and writer methods, and also offer a choice
to opt into default properties such maxInMemorySize, if configured.

See gh-24124
2019-12-12 21:58:14 +00:00
Rossen Stoyanchev 9d65830133 CodecConfigurer implementation refactoring
See gh-24124
2019-12-12 21:57:45 +00:00
Juergen Hoeller fa8f08391f Consistent use of annotation-api dependency instead of tomcat-embed-core 2019-12-12 17:21:41 +01:00
Juergen Hoeller b679c3b6ec Upgrade to Tomcat 9.0.30 2019-12-12 16:44:21 +01:00
Juergen Hoeller 02b40223e5 Polishing 2019-12-12 16:43:00 +01:00
perceptron8 dafe57fc6e Add BeanPropertyRowMapper.newInstance(mappedClass, conversionService)
Similar to SingleColumnRowMapper.newInstance(requiredType,
conversionService) which was added in #1678.
2019-12-12 15:40:55 +01:00
Sam Brannen d757f73902 Handle exceptions in annotation searches again
Prior to Spring Framework 5.2, most annotation search algorithms made
use of AnnotationUtils.handleIntrospectionFailure() to handle exceptions
thrown while attempting to introspect annotation metadata. With the
introduction of the new MergedAnnotation API in Spring Framework 5.2,
this exception handling was accidentally removed.

This commit introduces the use of handleIntrospectionFailure() within
the new MergedAnnotation internals in order to (hopefully) align with
the previous behavior.

Closes gh-24188
2019-12-12 11:29:06 +01:00
Juergen Hoeller 9af8dc0980 Polishing 2019-12-11 17:04:49 +01:00
Johnny Lim 8ac222467b Short-circuit boolean logic in AbstractBeanDefinition.equals()
Closes gh-24185
2019-12-11 16:46:47 +01:00
Sam Brannen 6e21b19999 Make TYPE_HIERARCHY_AND_ENCLOSING_CLASSES annotation search strategy defensive
Prior to this commit, when searching for annotations using the
TYPE_HIERARCHY_AND_ENCLOSING_CLASSES strategy an exception could be
thrown while attempting to load the enclosing class (e.g., a
NoClassDefFoundError), thereby halting the entire annotation scanning
process.

This commit makes this search strategy defensive by logging exceptions
encountered while processing the enclosing class hierarchy instead of
allowing the exception to halt the entire annotation scanning process.

The exception handling is performed by
AnnotationUtils.handleIntrospectionFailure() which only allows an
AnnotationConfigurationException to propagate.

See gh-24136
2019-12-10 22:38:55 +01:00
Sam Brannen 16ed7e2a19 Only load enclosing class for TYPE_HIERARCHY_AND_ENCLOSING_CLASSES strategy
Prior to this commit, the enclosing class was always eagerly loaded
even if the annotation search strategy was not explicitly
TYPE_HIERARCHY_AND_ENCLOSING_CLASSES.

See gh-24136
2019-12-10 22:08:26 +01:00
Sam Brannen 76bc581528 Polishing 2019-12-10 22:06:22 +01:00
Rossen Stoyanchev 9b30d46ff4 JSON charset handling in StringHttpMessageConverter
This commit restores the interpretation of JSON as UTF-8 by default that
was removed in #bc205e0 and also ensures a charset is not appended
automatically to "application/json".

Closes gh-24123
2019-12-10 16:52:23 +00:00
Rossen Stoyanchev 70a0c93d69 Correct WebFlux docs on BindingResult with @RequestBody
Closes gh-22997
2019-12-10 16:01:33 +00:00
Rossen Stoyanchev c8bce9686f ContentDisposition trims charset in filename
Closes gh-24112
2019-12-10 15:38:28 +00:00
Rossen Stoyanchev f180bf7652 Add "application/*+xml" to XML decoders
Closes gh-24164
2019-12-10 15:18:04 +00:00
Rossen Stoyanchev 1b172c1d20 Expose localAddress in WebFlux server
Closes gh-24174
2019-12-10 15:10:13 +00:00
Sam Brannen 2bd821c909 Improve exception for mixed explicit/implicit aliases with @AliasFor
Given the following improperly configured composed @RequestMapping
annotation:

@Retention(RetentionPolicy.RUNTIME)
@RequestMapping
@interface PostApi {

	@AliasFor("value")
	String[] path() default {};

	@AliasFor(annotation = RequestMapping.class, attribute = "path")
	String[] value() default {};
}

Prior to this commit, an attempt to process the above annotation
resulted in an exception similar to the following, which is not
especially helpful to discern the problem.

> Attribute 'value' in annotation [PostApi] must be declared as an
> @AliasFor 'path', not 'path'.

This commit improves the exception message for such scenarios,
resulting in an exception message similar to the following.

> Attribute 'value' in annotation [PostApi] must be declared as an
> @AliasFor attribute 'path' in annotation [PostApi], not attribute
> 'path' in annotation [RequestMapping].

Closes gh-24168
2019-12-10 14:36:11 +01:00
Sam Brannen 4466114cfa Polishing 2019-12-10 14:26:48 +01:00
Stephane Nicoll 8d846500ef Merge pull request #24172 from izeye
* pr/24172:
  Use hasSize() where possible

Closes gh-24172
2019-12-10 07:59:17 +01:00
Johnny Lim 1e83e889aa Use hasSize() where possible
See gh-24172
2019-12-10 07:58:53 +01:00
Juergen Hoeller 0a2046e81c Upgrade to Hibernate ORM 5.4.10, Protobuf 3.11.1, Joda-Time 2.10.5, Commons Pool 2.7 2019-12-10 00:24:26 +01:00
Juergen Hoeller 2c03246f00 Polishing 2019-12-09 15:58:21 +01:00
Juergen Hoeller 2d2993dffb Cleanup of "varaible" typos in ResolvableTypeTests 2019-12-09 14:03:56 +01:00
Juergen Hoeller a4f75e9c6a Polishing 2019-12-09 13:29:00 +01:00
Juergen Hoeller 119dd04ae5 Avoid ByteArrayOutputStream for source values without the need to be encoded
Closes gh-24152
2019-12-09 13:28:39 +01:00
stsypanov ebbb562cb9 Hoist constant result of SerializableTypeWrapper.unwrap() out of loop 2019-12-09 13:14:10 +01:00
Sébastien Deleuze 0f41536820 Fix RSocketRequester Coroutines extensions
After gh-24073, some Coroutines extensions should be applied on
RetrieveSpec instead of RequestSpec.

Closes gh-24166
2019-12-09 11:50:06 +01:00
Stephane Nicoll b1e59961fb Merge pull request #24160 from PyvesB
* pr/24160:
  Polish DataBufferUtils javadoc

Closes gh-24160
2019-12-08 14:02:32 +01:00
PyvesB e15ccdb35d Polish DataBufferUtils javadoc
See gh-24160
2019-12-08 14:01:55 +01:00
Sam Brannen 2108bdf876 Introduce regression test for prototype @ControllerAdvice beans
See gh-24157
2019-12-07 18:30:56 +01:00
Sam Brannen fc42ca2866 Polish contribution
See gh-24157
2019-12-07 13:41:43 +01:00
yokotaso d7d474f658 Do not cache prototype @ControllerAdvice beans
Spring Framework 5.2 introduced support for caching @ControllerAdvice
beans; however, this caching was also applied incorrectly to
non-singleton beans.

This commit addresses this regression by only caching singleton
@ControllerAdvice beans.

Closes gh-24157
2019-12-07 13:39:30 +01:00
Sam Brannen 55ae3c5e87 Polishing 2019-12-07 12:59:03 +01:00
Sam Brannen de8a6c8c57 Polishing 2019-12-06 19:08:54 +01:00
Eric Helgeson d4d940e6e3 Add missing backtick in WebSocket documentation
Closes gh-24155
2019-12-06 19:02:22 +01:00
stsypanov 484006ce90 Hoist Class.getName() from String concatenation to dodge an issue related to profile pollution 2019-12-06 17:36:07 +01:00
Phillip Webb 7c84695333 Support variable resolution of wildcard types
Update `ResolvableType` so that variable referenced can be resolved
against wildcard types. Prior to this commit, given a type:

	Map<String, ? extends List<? extends CharSequence>>

Calling `type.getGeneric(1).asCollection().resolveGeneric()` would
return `null`. This was because the `List` variable `E` referenced a
wildcard type which `resolveVariable` did not support.

Closes gh-24145
2019-12-06 13:38:46 +01:00
Sam Brannen a4fa6a7a31 Test status quo for @Inherited annotation support in AnnotationMetadata 2019-12-05 23:30:14 +01:00
Sam Brannen 3b9d1a00b0 Polishing 2019-12-05 22:37:00 +01:00
Juergen Hoeller c2141e2e93 Add @since tags to firstElement methods 2019-12-05 16:36:55 +01:00
Vitalii Rastvorov d503bc2804 Add firstElement to CollectionUtils 2019-12-05 16:26:25 +01:00
Johnny Lim 14ce84cebb Fix status code in webflux.adoc 2019-12-05 12:25:04 +00:00
Rossen Stoyanchev 828fe39523 Consistently use releaseBody in DefaultWebClient
See gh-24125
2019-12-04 18:19:52 +00:00
Rossen Stoyanchev 3a48682226 Replace ReadCancellationException with takeWhile
Closes gh-24125
2019-12-04 18:19:52 +00:00
Rossen Stoyanchev b866d4209c Add UriUtils.encodeQueryParams
Closes gh-24043
2019-12-04 17:33:31 +00:00
Rossen Stoyanchev 797f618f2b Remove mismatched marker in core-beans.adoc
Closes gh-24132
2019-12-04 16:14:14 +00:00
Sam Brannen fb13f6f0bc Add integration test for gh-24110 2019-12-03 16:48:30 +01:00
wanxiangming1994 6f15f32be3 Honor default values for implicit aliases in composed annotations
Spring Framework 5.2 introduced a regression for implicit aliases
declared via @AliasFor. Specifically, Spring's merged annotation
algorithms stopped honoring default values for implicit alias pairs if
the composed annotation was used without specifying the aliased
attributes.

This commit fixes this regression.

Closes gh-24110
2019-12-03 16:14:49 +01:00
Spring Buildmaster 1bff7ce141 Next Development Version 2019-12-03 08:59:24 +00:00
Brian Clozel 21053780ef Polish 2019-12-02 23:13:44 +01:00
Brian Clozel decbb9ccf9 Provide default codecs config callback to custom codecs
As a follow-up of gh-23961, this change provides a way for custom codecs
to align with the default codecs' behavior on common features like
buffer size limits and logging request details.

Closes gh-24118
Co-authored-by: Rossen Stoyanchev <rstoyanchev@pivotal.io>
2019-12-02 22:52:55 +01:00
Wang Xuesong d1ab81587c [*.*] is displayed as [bold .] and needs to be escaped
execution(* com.xyz.service.*.*(..))  ->  execution(* com.xyz.service.\*.*(..))

Closes gh-24108
2019-12-02 19:14:18 +01:00
Rossen Stoyanchev fcbc437825 Polishing (follow-up on acfeb7) 2019-12-02 17:14:13 +00:00
Brian Clozel 35b7f3bf34 Unpublish Gradle metadata
See gh-23503
2019-12-02 16:43:02 +01:00
Sam Brannen 279777b2f3 Polishing 2019-12-02 16:22:40 +01:00
Rossen Stoyanchev 50ac8ad8b7 Fix checkstyle violation 2019-12-02 14:25:00 +00:00
Rossen Stoyanchev acfeb77d41 Polishing
See gh-23961
2019-12-02 14:12:59 +00:00
Brian Clozel d4209392d2 Allow ExchangeStrategies customizations in WebClient
Prior to this commit, developers could configure their WebClient to use
their custom `ExchangeStrategies`, by providing it in the
`WebClient.Builder` chain.
Once created, an `ExchangeStrategies` instance is not mutable, which
makes it hard for further customizations by other components. In the
case of the reported issue, other components would override the default
configuration for the codecs maxInMemorySize.

This commit makes the `ExchangeStrategies` mutable and uses that fact to
further customize them with a new `WebClient.Builder#exchangeStrategies`
`Consumer` variant. This commit is also deprecating those mutating
variants in favor of a new `WebClient.Builder#exchangeStrategies` that
takes a `ExchangeStrategies#Builder` directly and avoids mutation issues
altogether.

Closes gh-23961
2019-12-02 14:12:59 +00:00
Juergen Hoeller 17e2a0c7ea Upgrade to AspectJ 1.9.5 and Checkstyle 8.27 2019-12-02 12:59:02 +01:00
Brian Clozel 1560bbd81e Revert "Allow ExchangeStrategies customizations in WebClient"
This reverts commit b3020bc484.
2019-12-02 10:39:53 +01:00
Juergen Hoeller 1548a0c9a0 Upgrade to Mockito 3.2 2019-12-02 00:28:08 +01:00
Juergen Hoeller 32e7adfa32 Polishing 2019-12-01 02:00:40 +01:00
Juergen Hoeller 91b557eb4b Polishing 2019-12-01 01:21:53 +01:00
Juergen Hoeller 567c7695dd Polishing 2019-12-01 00:20:00 +01:00
Juergen Hoeller 2267080ff4 Upgrade to Protobuf 3.11 and Apache Johnzon 1.2.2 2019-12-01 00:14:16 +01:00
Brian Clozel b3020bc484 Allow ExchangeStrategies customizations in WebClient
Prior to this commit, developers could configure their WebClient to use
their custom `ExchangeStrategies`, by providing it in the
`WebClient.Builder` chain.
Once created, an `ExchangeStrategies` instance is not mutable, which
makes it hard for further customizations by other components. In the
case of the reported issue, other components would override the default
configuration for the codecs maxInMemorySize.

This commit makes the `ExchangeStrategies` mutable and uses that fact to
further customize them with a new `WebClient.Builder#exchangeStrategies`
`Consumer` variant. This commit is also deprecating those mutating
variants in favor of a new `WebClient.Builder#exchangeStrategies` that
takes a `ExchangeStrategies#Builder` directly and avoids mutation issues
altogether.

Closes gh-23961
2019-11-29 22:26:52 +01:00
Sam Brannen d7023fd02b Delete unused JdbcTemplate fields in examples
Closes gh-24085
2019-11-29 19:01:42 +01:00
Sam Brannen 52a1fc4329 Polish BatchPreparedStatementSetter example in reference manual
Closes gh-24084
2019-11-29 18:50:42 +01:00
Sam Brannen 5648ef3276 Fix examples for <tx:method/> settings in reference manual
Closes gh-24080
2019-11-29 18:41:59 +01:00
Andy Wilkinson 7f61f3852c Enable reading from the remote build cache for all
Previously, the remote build cache was only enabled if the
GRADLE_ENTERPRISE_URL environment variable was configured. This meant
that contributors would not benefit from the build time improvements
of the caching without some additional setup.

This commit updates the buildCache configuration so that reading from
the remote build cache at https://ge.spring.io is enabled for all.
Pushing to the cache continues to be disabled unless the required
credentials are provided. Build scan configuration has also been
updated in line with this change. While the server URL is now
hardcoded, publishing is still opt-in via an environment variable.
The exact mechanism by which someone can opt in will change in the
future once some server-side changes have been made. At this point,
only a change to publishAlwaysIf should be necessary.

Closes gh-24105
2019-11-29 17:58:09 +01:00
Sam Brannen 093323beeb Introduce Checkstyle rule to prohibit class names ending with "Test" 2019-11-29 17:30:29 +01:00
Rossen Stoyanchev c18d1ce7ca Merge pull request #24074
Closes gh-24074
2019-11-29 15:55:14 +00:00
Rossen Stoyanchev 395c1e415c Polishing contribution
See gh-24074
2019-11-29 15:54:58 +00:00
Frederik Boster a15a726fef Improve getMultipartContentType in mock request.
See gh-24074
2019-11-29 15:54:58 +00:00
Rossen Stoyanchev 47779df896 Merge pull request #24087
Closes gh-24087
2019-11-29 15:54:15 +00:00
Rossen Stoyanchev 25f3465f1f Polishing contribution
See gh-24087
2019-11-29 15:53:37 +00:00
Parviz ROzikov e858b21c60 #24022 - added protobuf MessageConverter 2019-11-29 14:20:05 +00:00
Sam Brannen d9ebc3bbc4 Polish StringArrayPropertyEditor[Tests] 2019-11-29 14:55:18 +01:00
Sam Brannen 7cedffc707 Support @Inherited again in reflection-based AnnotationMetadata
Spring Framework 5.2 introduced a regression in reflection-based
AnnotationMetadata. Specifically, as of 5.2, StandardAnnotationMetadata
no longer found @Inherited annotations from superclasses.

This commit fixes this regression by switching to the INHERITED_ANNOTATIONS
SearchStrategy when creating the MergedAnnotations used within
StandardAnnotationMetadata,

Note, however, that the discrepancy between StandardAnnotationMetadata
and SimpleAnnotationMetadata (i.e., reflection-based vs. ASM-based)
regarding @Inherited support still remains as it was prior to Spring
Framework 5.2.

Closes gh-24077
2019-11-29 00:07:44 +01:00
Sam Brannen 85016aef30 Test status quo for @Inherited annotations in AnnotationMetadata
This commit introduces failing assertions that are currently disabled
via a boolean reproduceGh24077 flag.

Setting that flag to true demonstrates the regression for
StandardAnnotationMetadata and inconsistencies for SimpleAnnotationMetadata.

See gh-24077
2019-11-28 18:45:58 +01:00
Sam Brannen d1f544209e Test status quo for AnnotatedTypeMetadata.getAnnotationAttributes()
See gh-24077
2019-11-28 13:50:35 +01:00
Rossen Stoyanchev b44daa8b71 Remove the few remaining usages of UriTemplate
Also update Javadoc of UriTemplate to point to UriComponentsBuilder and
UriBuilderFactory as more flexible options.

See gh-24094
2019-11-28 11:28:49 +00:00
Rossen Stoyanchev df2ed75df0 MultipartBodyBuilder Javadoc update
Closes gh-24031
2019-11-28 10:40:28 +00:00
Brian Clozel d8f7ed133f Puslish Gradle metadata
Closes gh-23503
2019-11-28 10:48:13 +01:00
Sébastien Deleuze 6f3909f2f0 Upgrade to Kotlin 1.3.61
Closes gh-24006
2019-11-28 09:44:50 +01:00
Johnny Lim 4aa013c508 Remove duplicate checks in ResponseCookieTests 2019-11-28 07:15:15 +00:00
stsypanov 62ca7c4e8f Hoist constant byte[] out of loop 2019-11-27 19:19:36 +01:00
Stephane Nicoll 52630b06f5 Upgrade to Reactor Dysprosium-SR2
Closes gh-24037
2019-11-27 11:52:43 +01:00
Stephane Nicoll c394bdbbc3 Merge pull request #24089 from ryenus
* pr/24089:
  Fix consecutive-word duplications in documentation

Closes gh-24089
2019-11-27 09:43:34 +01:00
ryenus 40331eaca3 Fix consecutive-word duplications in documentation
See gh-24089
2019-11-27 09:42:44 +01:00
Rossen Stoyanchev 26d800cc93 Fix empty payload handling in RSocketRequester
Closes gh-24088
2019-11-27 07:35:45 +00:00
Rossen Stoyanchev 5a552f1670 Update links between WebFlux and Web MVC 2019-11-26 21:50:01 +00:00
Rossen Stoyanchev 30d68f2de7 Reject user names with "%2F" in STOMP
Closes gh-23836
2019-11-26 16:21:48 +00:00
Rossen Stoyanchev 08669cc7c3 Updates to CONTRIBUTING.md
Closes gh-22892
2019-11-26 15:59:57 +00:00
jasdeepgill db97dac86d Improve readability of CONTRIBUTING.md
Closes gh-24068
2019-11-26 15:59:57 +00:00
Rossen Stoyanchev f57f337104 Protected method to decorate WebSocketHandler
See gh-24075
2019-11-26 12:08:22 +00:00
Rossen Stoyanchev 526d89e1e6 Refine Throwable handling in spring-websocket
This commit lowers the level of Throwable handling in parts of
spring-websocket which now handle Exception instead and allow any Error
to propagate.

Closes gh-24075
2019-11-26 12:04:00 +00:00
Rossen Stoyanchev 70a3dbff24 WebSession creation does not block
Closes gh-24027
2019-11-26 10:48:39 +00:00
Arjen Poutsma ddb38eefee Expose method to determine form content type
This commit exposes the method that returns the media type used to write
forms. By default, it includes the charset in the content type, which
can cause issues with certain consumers. This commit changes the method
from a private to a protected method, so that users can override the
default behavior.

Closes: gh-22971
2019-11-26 10:50:08 +01:00
Arjen Poutsma 2d86f221ce Remove println 2019-11-25 18:27:34 +01:00
Arjen Poutsma 5f3c7ca559 Fix NullPointerException in Jackson2SmileDecoder
Fix uncommon case in Jackson2SmileDecoder, where a null token,
incicating a document separator in streaming mode, is followed by
NOT_AVAILABLE.

Closes gh-24009
2019-11-25 16:23:27 +01:00
Arjen Poutsma a79eaded5d Javadoc 2019-11-25 16:23:27 +01:00
Rossen Stoyanchev 6ed1b5835b Separate step for retrieve in RSocketRequester
Closes gh-24073
2019-11-25 11:47:41 +00:00
Christoph Dreis b234c77b67 Add missing verify() in EncoderHttpMessageWriterTests
Closes gh-24062
2019-11-25 10:51:00 +00:00
Juergen Hoeller 88fd90c357 Upgrade to Tomcat 9.0.29, Jetty 9.4.24, RxJava 2.2.15 2019-11-24 19:58:19 +01:00
Sam Brannen 59e250c93c Consistent use of SCOPE_PROTOTYPE and SCOPE_SINGLETON constants
Closes gh-19905
2019-11-24 13:49:43 +01:00
Rossen Stoyanchev 7bed4f36da Add missing verify() in Jackson2TokenizerTests
Closes gh-24056
2019-11-22 16:38:43 +00:00
Rossen Stoyanchev 51b35e64cf Extra isReady-onWritePossible after last write
Closes gh-24050
2019-11-22 15:57:21 +00:00
Sébastien Deleuze 6c7250b0ae Make Kotlin DSL class constructors internal
Closes gh-24059
2019-11-22 16:10:42 +01:00
Sébastien Deleuze dc0ebefc56 Add support for asyncDispatch to MockMvc Kotlin DSL
Closes gh-23758
2019-11-22 15:03:17 +01:00
Sébastien Deleuze 712eac2915 Refine Coroutines annotated controller support
This commit refines Coroutines annotated controller support
by considering Kotlin Unit as Java void and using the right
ReactiveAdapter to support all use cases, including suspending
functions that return Flow (usual when using APIs like WebClient).

It also fixes RSocket fire and forget handling and adds related tests
for that use case.

Closes gh-24057
Closes gh-23866
2019-11-22 14:13:17 +01:00
Rossen Stoyanchev 21b2fc1f01 Improve HttpHandlerConnection completion
Before this commit the connector waited for a completed response (via
ServerHttpResponse#setComplete or ServerHttpResponse#writeWith) or an
error signal in handling, but it didn't deal explicitly with the case
where both can occur.

This commit explicitly waits for the completion of handling (success
or error) before passing the response downstream. If an error occurs
after response completion, it is wrapped in a dedicated exception that
also provides access to the completed response.

Close gh-24051
2019-11-22 10:28:05 +00:00
Juergen Hoeller b5529f3f2b Restore short-circuiting in equals implementation
Closes gh-24048
2019-11-21 18:20:17 +01:00
stsypanov 1f3b595a03 Use String.isEmpty() instead of String.equals("") 2019-11-21 16:42:01 +01:00
Qimiao Chen bb2e3ce6d1 Polish AbstractBeanDefinition
Closes gh-24048
2019-11-21 15:26:42 +01:00
Juergen Hoeller 336e0595c5 Upgrade to Jetty 9.4.23 and Woodstox 6.0.2 2019-11-21 13:22:30 +01:00
Rossen Stoyanchev 996f7290cf Allow async metadata in RSocketRequester
This commit allows single-value async producers for the values of
metadata entries in both the SETUP and for requests. The same is also
enabled for data in the SETUP frame.

Close gh-23640
2019-11-20 19:41:16 +00:00
Juergen Hoeller 82f4e933e0 Upgrade to Hibernate ORM 5.4.9, Hibernate Validator 6.1, Undertow 2.0.28 2019-11-20 17:37:58 +01:00
Juergen Hoeller a5f2d8c222 Mark SqlRowSet accessor methods as nullable (for alignment with JDBC)
Closes gh-24042
2019-11-20 17:37:40 +01:00
Arjen Poutsma e8b81ffc16 Improve documentation of WebClient.Builder::filter
Closes gh-23342
2019-11-20 11:55:25 +01:00
Stephane Nicoll 6fdeb10ee0 Start building against Reactor Dysprosium-SR2 snapshots
See gh-24037
2019-11-20 10:56:44 +01:00
Rossen Stoyanchev f4e0288357 Remove mentions of Tomcat async request timeout value
Close gh-24030
2019-11-19 17:08:43 +00:00
Sam Brannen 2728f10a07 Test instance behavior for request-scoped @ControllerAdvice beans
The test introduced in this commit is intended to serve as a regression
test for the status quo.

See gh-23985
2019-11-19 17:10:18 +01:00
Rossen Stoyanchev f08cf0e864 Add RSocketFrameTypeMessageCondition constants
See gh-23999
2019-11-19 16:03:56 +00:00
Sam Brannen cd619a2f09 Update @since tag 2019-11-19 16:07:12 +01:00
Sam Brannen fd6efb9a65 Polishing 2019-11-19 15:53:20 +01:00
Juergen Hoeller 06b1f31cdd SynthesizedMergedAnnotationInvocationHandler does not pre-load values
Closes gh-24029
2019-11-19 14:54:12 +01:00
Juergen Hoeller 4af6039359 Avoid substring allocation in StringUtils.replace
Closes gh-24023
2019-11-19 14:53:30 +01:00
Sam Brannen b4e1d48322 Ignore scoped proxy targets for @ControllerAdvice beans
Prior to this commit, methods in a @ControllerAdvice bean were
registered and invoked twice if the advice was a scoped bean (e.g.,
request or session scoped). In other words, both the proxy bean and the
target bean were wrapped in ControllerAdviceBean instances.

This commit fixes this bug by modifying the findAnnotatedBeans() method
in ControllerAdviceBean so that it filters out targets of scoped
proxies.

Closes gh-24017
2019-11-19 14:20:25 +01:00
Sébastien Deleuze 4c17314d0e Upgrade to Kotlin 1.3.60
Closes gh-24006
2019-11-19 10:50:05 +01:00
Arjen Poutsma 9f7dd9f352 Add test for usage of bodyToMono in WebClient.ResponseSpec::onStatus
See gh-23365
2019-11-19 10:22:54 +01:00
Sam Brannen 3a39b7fe82 Support scoped @ControllerAdvice beans again
Spring Framework 5.2 introduced support for implementing the Ordered
interface in a @ControllerAdvice bean. This support requires that
@ControllerAdvice beans be eagerly resolved from the BeanFactory in
order to invoke the getOrder() method defined in the Ordered interface.
Unfortunately doing so resulted in a regression in that an attempt to
eagerly resolve a scoped @ControllerAdvice bean throws a
BeanCreationException due to the lack of an active scope (e.g., request
or session scope).

This commit fixes this regression by avoiding eager resolution of scoped
@ControllerAdvice beans. As a direct consequence, the Ordered interface
is not supported for scoped @ControllerAdvice beans.

Closes gh-23985
2019-11-18 22:29:00 +01:00
Sam Brannen f0b2f7186a Polishing 2019-11-18 22:29:00 +01:00
Rossen Stoyanchev 842b424acd Use method signature to refine RSocket @MessageMapping
Before this change an @MessageMapping could be matched to any RSocket
interaction type, which is arguably too flexible, makes it difficult to
reason what would happen in case of a significant mismatch of
cardinality, e.g. request for Fire-And-Forget (1-to-0) mapped to a
method that returns Flux, and could result in payloads being ignored,
or not seen unintentionally.

This commit checks @ConnectMapping method on startup and rejects them
if they return any values (sync or async). It also refines each
@MessageMapping to match only the RSocket interaction type it fits
based on the input and output cardinality of the handler method.
Subsequently if a request is not matched, we'll do a second search to
identify partial matches (by route only) and raise a helpful error that
explains which interaction type is actually supported.

The reference docs has been updated to explain the options.

Closes gh-23999
2019-11-18 17:27:41 +00:00
Sam Brannen 769a15cb82 Polishing 2019-11-18 13:01:26 +01:00
denisgalaybo 9526e39f88 Fix errors in reference manual
Closes gh-24008
2019-11-17 13:50:50 +01:00
Sam Brannen d397baa559 Polish Javadoc for AutowiredAnnotationBeanPostProcessor 2019-11-15 12:43:55 +01:00
Juergen Hoeller 1607f1db0b Fix Checkstyle nohttp violation 2019-11-15 10:50:28 +01:00
Juergen Hoeller a43ae63f17 Upgrade to SLF4J 1.7.29, Jackson 2.10.1, WebJars Locator 0.43 2019-11-15 10:21:58 +01:00
Rossen Stoyanchev 9ec67bac82 Merge pull request #1885
Closes gh-1885
2019-11-14 17:38:15 +00:00
Rossen Stoyanchev c33cb26a73 Polishing contribution
See gh-1885
2019-11-14 17:38:01 +00:00
Mark Hobson 46fe74d2f9 Preserve media type parameters when setting charset
Issue: SPR-17040
2019-11-14 17:38:01 +00:00
Rossen Stoyanchev 905e3c1f9f Avoid indefinite wait in JettyWebSocketClient
Closes gh-23994
2019-11-14 17:37:10 +00:00
Juergen Hoeller 830f81210f Revise getElementTypeDescriptor javadoc (no IllegalStateException)
Closes gh-23996
2019-11-14 18:31:32 +01:00
Sam Brannen d38b07b450 Move JavaUtilLoggingConfigurer to web.reactive.fixtures package 2019-11-14 15:50:04 +01:00
Sébastien Deleuze 029e61f54a Refine MethodParameter#isOptional Kotlin implementation
This commit adds support for Continuation parameter that is now
considered as an optional parameter since it is never provided by
the user.

It also simplifies and optimizes the implementation.

Closes gh-23991
2019-11-14 15:28:06 +01:00
Sam Brannen 7991066345 Fix classpath 2019-11-14 15:25:26 +01:00
Sam Brannen 89b3a9cef2 Introduce JavaUtilLoggingConfigurer to configure JUL for tests 2019-11-14 14:30:21 +01:00
Stephane Nicoll 1b7ef7fce5 Merge pull request #23995 from izeye
* pr/23995:
  Polish CorsAbstractHandlerMappingTests

Closes gh-23995
2019-11-14 14:13:23 +01:00
Johnny Lim 56670ebec8 Polish CorsAbstractHandlerMappingTests
See gh-23995
2019-11-14 14:13:05 +01:00
Sam Brannen 8df3afd0b6 Polish contribution
See gh-23895
2019-11-14 13:26:38 +01:00
SchutzeHades 834ebc44f8 Fix inappropriate eager init. 2019-11-14 10:13:55 +01:00
Sam Brannen 8186b77b58 Polish contribution
See gh-23895
2019-11-14 09:59:42 +01:00
monosoul a0e4ac39bf Inverse condition to fix ISO-formatted Instant parsing
Prior to this commit, InstantFormatter was able to properly serialize
an Instant that is far in the future (or in the past), but it could not
properly deserialize it, because in such scenarios an ISO-formatted
Instant starts with a +/- sign.

This commit fixes this issue, while maintaining the previous contract,
and also introduces tests for InstantFormatter.

Closes gh-23895
2019-11-14 09:59:42 +01:00
Juergen Hoeller 3dc5e7b1d5 Avoid String concatenation for lookup in StaticMessageSource
Closes gh-22451
2019-11-13 23:41:26 +01:00
Sébastien Deleuze 6fa9871a70 Provide orNull extensions for WebFlux ServerRequest
Closes gh-23761
2019-11-13 17:59:51 +01:00
Juergen Hoeller 22211a01ce Polishing 2019-11-13 17:23:23 +01:00
Juergen Hoeller 32532a88c1 Polishing 2019-11-13 16:17:08 +01:00
Juergen Hoeller 55011e7a0f Note on injecting results from local @Bean methods (self references)
Closes gh-23934
2019-11-13 16:17:01 +01:00
Rossen Stoyanchev 2c1afca9c5 Reject null form data names
...or skip if there are no values either.

Closes gh-22372
2019-11-13 15:03:22 +00:00
Rossen Stoyanchev f2b9264674 Remove Jetbrains annotations 2019-11-13 14:42:32 +00:00
Rossen Stoyanchev e6a65804f5 Merge pull request #1956
Closes gh-1956
2019-11-13 14:24:23 +00:00
Rossen Stoyanchev 04aa3d05da Refactor solution for respones error details
See gh-1956
2019-11-13 14:24:12 +00:00
jerzykrlk 91ec274b10 SPR-17130 http error details in the exception message 2019-11-13 14:24:12 +00:00
JohnGrib 8bb165e55c Fix typo in EventSourceTransportHandler
Closes gh-23984

* https://github.com/spring-projects/spring-framework/blob/3a0f309e2c9fdbbf7fb2d348be861528177f8555/spring-web/src/main/java/org/springframework/http/codec/ServerSentEvent.java#L24
* https://github.com/spring-projects/spring-framework/blob/3a0f309e2c9fdbbf7fb2d348be861528177f8555/spring-web/src/main/java/org/springframework/http/codec/ClientCodecConfigurer.java#L88
* https://github.com/spring-projects/spring-framework/blob/ef14d76d3637abeb31edd8a22031c21f9445efef/spring-web/src/main/java/org/springframework/http/codec/ServerCodecConfigurer.java#L94
* https://github.com/spring-projects/spring-framework/blob/3a0f309e2c9fdbbf7fb2d348be861528177f8555/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/EventSourceTransportHandler.java#L33
2019-11-13 14:23:58 +00:00
YuDongYing 4e5ae54417 Fix schemaZip Gradle task on MS Windows
Prior to this commit, the schemaZip Gradle task failed to find Spring
schema files on MS Windows due to path separators hard coded to forward
slashes that are not compatible with the Windows operating system.

Consequently, a full build failed on Windows since the distZip task was
not able to locate the zipped schema archive that the schemaZip task
failed to create.

This commit fixes this by updating the schemaZip task to search for
schema files using backslashes as well as forward slashes.

Closes gh-23933
2019-11-13 14:49:25 +01:00
Sébastien Deleuze 7646895fd4 Support Kotlin synthetic classes in MethodParameter and SpEL
Closes gh-23812
2019-11-13 14:22:53 +01:00
stsypanov f2b3953d76 Use array.clone() instead of manual array creation 2019-11-13 13:53:42 +01:00
Juergen Hoeller f61d728db9 Fallback Locale other than the system Locale through setDefaultLocale
Closes gh-23977
2019-11-13 13:48:08 +01:00
Rossen Stoyanchev f4c847b723 MockHttpServletRequestBuilder sets content-length
Closes gh-23978
2019-11-12 17:33:14 +00:00
GungnirLaevatain 4bbf2d5785 polish 2019-11-12 17:40:28 +01:00
Rossen Stoyanchev a0cdbf5153 Merge pull request #23980
Closes gh-23980
2019-11-12 16:14:46 +00:00
Rossen Stoyanchev 16c7a40c53 Minor refactoring
See gh-23296
2019-11-12 16:14:02 +00:00
Johannes Teklote 879b2df052 queryParam options for MockMVC requeusts
See gh-23296
2019-11-12 16:13:51 +00:00
Sam Brannen a26d37b407 Polishing 2019-11-12 14:01:13 +01:00
Sam Brannen a276c667d1 Polishing 2019-11-12 13:48:48 +01:00
Juergen Hoeller 9cc06454aa Restore findAnnotation superclass traversal for java.lang annotations
Closes gh-23929
2019-11-12 11:51:44 +01:00
Rossen Stoyanchev fac9ca891a Fix copy-and-paste error in docs 2019-11-11 17:31:51 +00:00
Juergen Hoeller c4ec6aea68 Fix Checkstyle violations
See gh-23784
2019-11-11 17:18:52 +01:00
Arjen Poutsma a7a88371e7 Allow for decode method to return null in AbstractJackson2Decoder
Prior to this commit, the decoder did not allow for a null value
returned from the Jackson object reader.

Closes: gh-23935
2019-11-11 16:48:30 +01:00
Arjen Poutsma 789f6fc188 Add @Nullable annotation to decode method taking DataBuffer
Javadoc indicates the returned value can be null.
2019-11-11 16:48:30 +01:00
Rossen Stoyanchev 23ec6d243c Merge pull request #2023
Closes gh-2023
2019-11-11 15:04:50 +00:00
Rossen Stoyanchev 347f16c8ac Polishing
See gh-2023
2019-11-11 15:04:36 +00:00
Pat Turner 6db8306e46 XpathResultMatcher supports Hamcrest Matcher NodeList
Use when xpath result is XPathConstants.NODESET
2019-11-11 15:04:36 +00:00
Biju Kunjummen 5ee990e045 Use Function.identity
Closes gh-2024
2019-11-11 15:04:29 +00:00
Juergen Hoeller 990bfd8772 Support for new MySQL 8 error code 3572
Closes gh-23972
2019-11-11 15:55:26 +01:00
Juergen Hoeller 6d47e1e0a1 Fix getHeaderPredicate visibility to be declared as protected
Closes gh-23976
2019-11-11 15:55:06 +01:00
Steven Schlansker fc55e66d50 ApplicationListenerMethodAdapter: gracefully handle beans which are actually NullBean
Currently, if you have an optional event listener (via a @Bean method returning `null`)
this causes the event multicaster to explode violently.  Now, we just safely skip it.
2019-11-11 15:43:29 +01:00
GungnirLaevatain d494621ee3 avoid store all bean name 2019-11-11 15:43:05 +01:00
stsypanov 92efe95069 Simplify ConstructorResolver: do not sort intermediate array 2019-11-11 15:42:35 +01:00
Rossen Stoyanchev 51b43496f4 Update docs for ASYNC dispatch config
Closes gh-23958
2019-11-11 14:31:53 +00:00
Sam Brannen d03ab79531 Polish contribution
See gh-23970
2019-11-11 15:16:07 +01:00
Andy Wilkinson f7bc8c8268 Tidy up classpath pollution caused by resource creation in the tests
Previously, spring-webmvc and spring-webflux both contained tests
that would create gzipped files, write them to the filesystem
alongside the project's compiled test classes, and configure them to
be deleted on JVM exit. The output location placed the files on the
classpath, polluting it for every subsequent test that used the same
ClassLoader. The test-sources plugin combined with Gradle's use of
worker JVMs, broadens the scope of this pollution to other, downstream
projects in the same build. For example, the tests for
spring-websocket will have a different classpath depending on whether
or not the tests for spring-webmvc have already been run on the same
worker as part of the current build.

This commit updates the spring-webmvc and spring-webflux modules to
introduce a new JUnit Jupiter extension, GzipSupport. This extension
allows gzipped files to be created via an injectable GzippedFiles
class and automatically deletes each created file in an after-each
callback. This ensures that a gzipped file only exists on the
classpath for the duration of the test that needs it, avoiding the
pollution of the classpath of any subsequent tests.

Closes gh-23970
2019-11-11 15:11:10 +01:00
Andy Wilkinson b5fb28284e Upgrade to Shadow Plugin 5.2.0
Closes gh-23971
2019-11-11 14:56:40 +01:00
Rossen Stoyanchev ffe69a51e1 Javadoc update for content negotiation
Closes gh-23409
2019-11-11 12:04:28 +00:00
Rossen Stoyanchev 1403603b05 Doc update for ForwardedHeaderFilter
Closes gh-23954
2019-11-11 11:44:44 +00:00
Sam Brannen 64dfa462a6 Fix Javadoc for SmartLifecycle.DEFAULT_PHASE regarding ordering
Closes gh-23956
2019-11-09 18:03:07 +01:00
Sam Brannen 29185505b1 Polishing 2019-11-09 13:51:28 +01:00
Sam Brannen cb9d27b9b8 Polish contribution and fix build
See gh-1954
2019-11-09 12:45:02 +01:00
Rob Tompkins cfb7777a07 Exception response for MockRestServiceServer
Closes gh-1954
2019-11-08 18:09:49 +00:00
Muhammad Hewedy f638bfc6a9 Fix status code in webmvc.adoc
Closes gh-22396
2019-11-08 17:50:48 +00:00
Rossen Stoyanchev b98d8ef06f Merge pull request #22715
Closes gh-22715
2019-11-08 17:48:20 +00:00
Rossen Stoyanchev 32f82c0ed0 Polishing 2019-11-08 17:47:59 +00:00
Ilja 08f1cb454a Allow sending headers with the disconnect frame 2019-11-08 17:41:39 +00:00
denisgalaybo b0b6423714 Fixed error in webflux.adoc
Closes gh-23957
2019-11-08 17:19:53 +00:00
Rossen Stoyanchev fd453a0753 Merge branch 'pr/23417'
Closes gh-23417
2019-11-08 15:04:15 +00:00
Rossen Stoyanchev b2b02ad7a1 Polishing 2019-11-08 15:03:53 +00:00
Ilya Lukyanovich 801cca8cf8 Preserve ErrorMessage#getOriginalMessage()
See gh-23417
2019-11-08 15:03:53 +00:00
Tomo Suzuki 21d390a018 Replacing netty-all with specific dependencies 2019-11-08 13:00:37 +00:00
Qimiao Chen 9b8da04e64 Delete unnecessary variable assignment
Closes gh-23955
2019-11-08 13:39:02 +01:00
Rossen Stoyanchev a6dd63f9ca Merge pull request #23938 2019-11-08 09:18:06 +00:00
Rossen Stoyanchev 0e1a237139 Polishing 2019-11-08 09:17:25 +00:00
Johnny Lim 91f5f42d13 Add tests for PrincipalMethodArgumentResolver 2019-11-08 08:48:56 +00:00
Rossen Stoyanchev c7b9988033 Merge pull request #23855 2019-11-08 08:45:03 +00:00
Rossen Stoyanchev 1261e64465 Minor refactoring
Apply default Accept header for HttpUrlConnection only.

See gh-23855
2019-11-08 08:44:04 +00:00
Lorenzo Torracchi afae8c3045 Avoid default "Accept" from HttpUrlConnection
Closes gh-23740
2019-11-08 08:43:25 +00:00
Juergen Hoeller d394c7a5c0 Upgrade to RxJava 2.2.14, OkHttp 3.14.4, JRuby 9.2.9, Rhino 1.7.11, Awaitility 3.1.6 2019-11-07 22:08:52 +01:00
Juergen Hoeller 6a48bb7b4d Polishing 2019-11-07 22:08:29 +01:00
stsypanov f5ae3c77c6 Use Method::getParameterCount where possible 2019-11-07 18:00:15 +01:00
Arjen Poutsma 55f3f128c9 Polishing 2019-11-07 14:29:47 +01:00
Arjen Poutsma bf36f49dc5 Corrupt multipart should not hang SynchronossPartHttpMessageReader
This commit notifies the Synchronoss listener that the buffer stream
has ended.

Closes gh-23768
2019-11-07 09:10:07 +01:00
Rossen Stoyanchev 5d2fc2fc32 HttpHandlerConnector uses non-blocking thread
Closes gh-23936
2019-11-06 21:58:02 +00:00
Rossen Stoyanchev 627a9be654 Update WebMvcConfigurer#addInterceptors Javadoc
Closes gh-23908
2019-11-06 21:40:53 +00:00
Rossen Stoyanchev 203977972b Fix issue with path matching options
Closes gh-23907
2019-11-06 17:54:39 +00:00
Rossen Stoyanchev 3a241b546f Relax domain name checks in ResponseCookie
Closes gh-23924
2019-11-06 17:54:39 +00:00
Sam Brannen 29599a93a4 Re-enable support for invalid Expires attributes in MockCookie
Changes introduced in commit 9b2087618b
caused a regression for Cookie support in MockHttpServletResponse.
Specifically, an Expires attribute that cannot be parsed using
`ZonedDateTime.parse()` now results in an exception; whereas,
previously an entry such as `Expires=0` was allowed.

This commit fixes this issue in MockCookie by catching and ignoring any
DateTimeException thrown while attempting to parse an Expires attribute.

Closes gh-23911
2019-11-06 18:28:28 +01:00
Rossen Stoyanchev 9960ed55aa Fix condition in ServletInvocableHandlerMethod
Closes gh-23775
2019-11-06 15:39:37 +00:00
Sam Brannen 29b31cad48 Align implementations of StringToUUIDConverter and UUIDEditor
Closes gh-23940
2019-11-06 14:21:52 +01:00
Sam Brannen 92228f0fc0 Test status quo for @RequestHeader UUID conversion support
See gh-23939
2019-11-06 13:49:44 +01:00
Sam Brannen 1a13700f8b Polish contribution
See gh-23923
2019-11-06 12:57:01 +01:00
stsypanov 9da15ee23a Improve usage of String.substring()
Closes gh-23923
2019-11-06 12:57:01 +01:00
Sam Brannen f9c1f136c3 Polishing 2019-11-05 15:27:46 +01:00
Sam Brannen fc1dcddb75 Fix grammar 2019-11-05 15:20:18 +01:00
Arjen Poutsma 6e3deb86f1 Javadoc
Describe source of parameters for ServerRequest (i.e. query string or
form data)
2019-11-05 14:30:31 +01:00
Sam Brannen d6002092c4 Clean up build warnings for ApplicationContextExpressionTests 2019-11-04 15:44:53 +01:00
Sam Brannen 01fb35bd2d Remove TestGroup.CI enum constant
Prior to this commit, the TestGroup.CI enum constant was only used in a
single test method in spring-core. In order to enable that test, the
`testGroups` JVM system property was configured for the
Publication-master CI build plan; however, the `testGroups` system
property is not set when executing local builds. Consequently, there
has been a Gradle cache miss for every `test` task when building
something locally that's already been built on the CI server.

This commit addresses this issue by removing the `TestGroup.CI` enum
constant. The `-PtestGroups=ci` command line configuration for the
Publication-master CI build plan has also been removed on the CI server.

Closes gh-23918
2019-11-04 15:44:53 +01:00
wonwoo 8855056395 Polish 2019-11-04 10:10:49 +00:00
Stephane Nicoll 87d4ad39da Merge pull request #23729 from facewindu
* pr/23729:
  Fix spring-core jar task 'up-to-date'-ness

Closes gh-23729
2019-11-04 10:44:53 +01:00
François Guillot 2411b657ae Fix spring-core jar task 'up-to-date'-ness
See gh-23729
2019-11-04 10:29:58 +01:00
Sam Brannen f746e9df82 Upgrade to Gradle 5.6.4 2019-11-03 15:04:58 +01:00
Spring Buildmaster c28cc0bc74 Next Development Version 2019-11-02 08:19:35 +00:00
방성범 (Bang Seongbeom) 89fc0f2713 Fix typo in docs
Closes gh-23788
2019-11-01 11:57:03 +00:00
AlexeyAnufriev 2d208de145 Clear connection pool for OkHttpClient
Closes gh-23628
2019-11-01 11:44:16 +00:00
Arjen Poutsma 3858a69c42 Path RequestPredicate should honor servlet path
Closes gh-23841
2019-10-31 16:06:42 +01:00
Sam Brannen 95af079906 Document unidirectional @AliasFor attribute mapping support
See gh-23834
2019-10-31 15:27:27 +01:00
Rossen Stoyanchev 005d2018d4 Refine changes for PR
Closes gh-23882
2019-10-31 14:14:44 +00:00
Dekel Pilli 64f2beb9bf Fixing NPE in AbstractNamedValueMethodArgumentResolver
See gh-23882
2019-10-31 14:13:44 +00:00
Rossen Stoyanchev fd9678833f Use int for maxParts instead of long 2019-10-31 14:13:44 +00:00
Rossen Stoyanchev 3691c187ef Preserve order of onStatus handlers
Closes gh-23880
2019-10-31 14:13:44 +00:00
Sam Brannen 74b7b550f6 Make MBeanServer tests more robust
This commit refactors several tests to use SocketUtils to find an
available port, compose a custom JMX service URL using that port, and
start an MBeanServer for the particular test using that port.

This commit also makes other changes to MBeanServer related tests in an
effort to make them more robust when executed concurrently.

Closes gh-23699
2019-10-31 14:34:57 +01:00
Sam Brannen 57b4b74e7d Polish Javadoc for JMX factory beans 2019-10-31 13:55:13 +01:00
Brian Clozel 3b724c72b6 Polish
See gh-23884
2019-10-30 19:57:17 +01:00
Sam Brannen 9f00eb68e9 Clean up warnings 2019-10-30 19:14:58 +01:00
Christoph Dreis 3c17178b16 Fix Mockito deprecations 2019-10-30 18:30:05 +01:00
Brian Clozel 4beb25b318 Reorder date formatting converter in registrar
Prior to this commit, the `DateFormatterRegistrar` would register the
annotation-based formatter before the pattern-based formatter. This
would create an issue when an application tries to convert a `String` to
an annotated `@DateTimeFormat Date`: since the converters are considered
in reversed order of registration in
`GenericConversionServicei#ConvertersForPair`, the pattern-based variant
would always be considered before the annotation-based variant,
overriding the developer's opinion.

This commit aligns the `DateFormatterRegistrar` with the
`DateTimeFormatterRegistrar` and registers the annotation-based variant
last.

Closes gh-23893
2019-10-30 17:15:59 +01:00
Juergen Hoeller 43a86565ca Consider target transaction manager for reactive transaction decision
Closes gh-23832
2019-10-30 16:23:37 +01:00
Sam Brannen cef4478b7b Treat InvalidPathException like an IOException in MockServletContext
Prior to this commit, if MockServletContext was configured with a
FileSystemResourceLoader, invocations of the following methods on a
Microsoft Windows operating system resulted in an InvalidPathException
if the supplied path contained a colon (such as "C:\\temp"). This is
inconsistent with the behavior on non-Windows operating systems. In
addition, for comparable errors resulting in an IOException, those
methods (except getRealPath()) return null instead of throwing the
exception.

- getResourcePaths()
- getResource()
- getResourceAsStream()
- getRealPath()

This commit makes handling of InvalidPathException and IOException
consistent for these methods: both exceptions now result in null be
returned by these methods.

Closes gh-23717
2019-10-30 15:59:44 +01:00
Stephane Nicoll 8d88e29173 Add qualified injection points for MVC and WebFlux infrastructure
Previously, the infrastructure provided by WebMvcConfigurationSupport
and WebFluxConfigurationSupport can lead to unexpected results due to
the lack of qualifier for certain dependencies. Those configuration
classes refer to very specific beans, yet their injection points do not
define such qualifiers. As a result, if a candidate exists for the
requested type, the context will inject the existing bean and will
ignore a most specific one as such constraint it not defined. This can
be easily reproduced by having a primary Validator whereas a dedicated
"mvcValidator" is expected. Note that a parameter name is in no way a
constraint as the name is only used as a fallback when a single
candidate cannot be determined.

This commit provides explicit @Qualifier metadata for such injection
points, renaming the parameter name in the process to clarify that it
isn't relevant for the proper bean to be resolved by the context.

Closes gh-23887
2019-10-30 15:07:23 +01:00
Juergen Hoeller 19ff7d84ab Polishing 2019-10-30 14:31:46 +01:00
Juergen Hoeller 19107649d2 Revise concurrent JAXBContext creation towards computeIfAbsent
Closes gh-23879
2019-10-30 14:31:34 +01:00
Juergen Hoeller 42e7ade110 Tolerate unidirectional alias declaration for annotation attribute pair
Closes gh-23834
2019-10-30 14:31:09 +01:00
Juergen Hoeller dba7bf7ec1 Avoid unnecessary setAccessible call in AttributeMethods
Closes gh-23829
2019-10-30 14:30:26 +01:00
Rossen Stoyanchev 422c26832b Minor follow-up to previous commit
See gh-23741
2019-10-30 12:38:26 +00:00
Rossen Stoyanchev 34cfbe5d26 ResponseStatusException associated headers
A ResponseStatus exception now exposes extra method to return headers
for the response. This is used in ResponseStatusExceptionHandler to
apply the headers to the response.

Closes gh-23741
2019-10-30 12:10:45 +00:00
Rossen Stoyanchev 0e08e19070 Merge pull request #23793 from alexandrumm/ws-stomp-client-add-log 2019-10-30 07:05:18 +00:00
Rossen Stoyanchev 3895d21b7d Fix failing test after previous commit
See gh-23793
2019-10-30 07:03:51 +00:00
Rossen Stoyanchev 03ac8e6b42 Logging decorator for WebSocketStompClient handler
Closes gh-23793
2019-10-30 06:55:04 +00:00
Juergen Hoeller 248ad0fa79 Expose primary flag on BeanDefinitionBuilder
Closes gh-23794
2019-10-30 01:04:41 +01:00
Juergen Hoeller dc59e50561 Avoid unnecessary use of ResolvableType within MethodParameter
Closes gh-23792
2019-10-30 01:04:26 +01:00
Juergen Hoeller d51ab24a1b Latest dependency updates (Tomcat 9.0.27, Undertow 2.0.27, RxJava 2.2.13, Gson 2.8.6, Apache Johnzon 1.2.1, Hibernate ORM 5.4.8, EclipseLink 2.7.5, H2 1.4.200, POI 4.1.1, Quartz 2.3.2, WebJars Locator 0.42, HtmlUnit 2.36, Checkstyle 8.26, Mockito 3.1, Objenesis 3.1) 2019-10-30 00:26:45 +01:00
Juergen Hoeller 046380988b Nullability refinements 2019-10-30 00:26:11 +01:00
Juergen Hoeller 773b2f06a1 Avoid Connection.isReadOnly() call in resetConnectionAfterTransaction
Closes gh-23747
2019-10-30 00:25:17 +01:00
Brian Clozel 7d02ba0694 Add missing CORS headers defined in SockJS CORS config
Prior to this commit and following changes done in d27b5d0, the CORS
response headers would not be added for SockJS-related requests, even
though a CORS configuration had been applied to SockJS/WebSocket.
This was due to a missing case in our implementation: calling
`AbstractHandlerMapping#getHandlerInternal` can return a Handler
directly, but also a `HandlerExecutionChain` in some cases, as explained
in the Javadoc.

This commit ensures that, when checking for existing CORS configuration,
the `AbstractHandlerMapping` class also considers the
`HandlerExecutionChain` case and unwraps it to get the CORS
configuration from the actual Handler.

Fixes gh-23843
2019-10-29 15:01:18 +01:00
Rossen Stoyanchev ef14d76d36 Merge limits on input in codecs 2019-10-29 12:34:04 +00:00
Rossen Stoyanchev 5abf24e7d7 Expose maxInMemorySize via CodecConfigurer
Centralized maxInMemorySize exposed via CodecConfigurer along with
ability to plug in an instance of MultipartHttpMessageWrite.

Closes gh-23884
2019-10-29 12:33:16 +00:00
Rossen Stoyanchev 00ead7a756 Refine multipart parsing limits
See gh-23884
2019-10-29 12:33:16 +00:00
Brian Clozel ea6f51e9e3 Configurable limits with Synchronoss
See gh-23884
2019-10-29 12:33:16 +00:00
Brian Clozel 69bcdfc17f Polishing 2019-10-29 12:33:16 +00:00
Rossen Stoyanchev 89d053d7f4 Limits on input stream in codecs
- Add maxInMemorySize property to Decoder and HttpMessageReader
  implementations that aggregate input to trigger
  DataBufferLimitException when reached.

- For codecs that call DataBufferUtils#join, there is now an overloaded
  variant with a maxInMemorySize extra argument. Internally, a custom
  LimitedDataBufferList is used to count and enforce the limit.

- Jackson2Tokenizer and XmlEventDecoder support those limits per
  streamed JSON object.

See gh-23884
2019-10-29 12:33:16 +00:00
Sam Brannen ce0b012f43 Polish contribution
See gh-23769
2019-10-29 13:27:39 +01:00
Vedran Pavic 9b2087618b Preserve expires attribute in MockCookie
At present, MockCookie doesn't preserve expires attribute. This has a
consequence that a cookie value set using
MockHttpServletResponse#addHeader containing an expires attribute will
not match the cookie value obtained from
MockHttpServletResponse#getHeader, since the expires attribute will get
calculated based on current time.

This commit enhances MockCookie to preserve the expires attribute.

Closes gh-23769
2019-10-29 12:56:24 +01:00
Sam Brannen 2482209437 Polish Javadoc @param order 2019-10-29 12:49:05 +01:00
Andy Wilkinson 1a54b83ae1 Add opt-in support for remote build cache and pushing to it from CI
This commit provides opt-in enablement of Gradle's remote build
cache. When the GRADLE_ENTERPRISE_URL environment variable is set, its
build cache node will be used as a source of cached output. If both
GRADLE_ENTERPRISE_CACHE_USERNAME and GRADLE_ENTERPRISE_CACHE_PASSWORD
are also set, task output produced by the build will be pushed to the
build cache node for use by subsequent builds.

Closes gh-23883
2019-10-29 12:46:33 +01:00
Stephane Nicoll 0cea49fdc0 Upgrade to Reactor Dysprosium-SR1
Closes gh-23871
2019-10-28 14:31:38 +01:00
Stephane Nicoll dd140c6ff9 Merge branch '5.1.x' 2019-10-28 14:31:08 +01:00
Sam Brannen 46329d0b97 Polish Javadoc for HeaderAssertions and StatusAssertions
See gh-23878
2019-10-28 13:33:30 +01:00
Sam Brannen d159ec89a3 Upgrade to AssertJ 3.14.0 2019-10-27 21:22:26 +01:00
Sebastien Deleuze 9f242fac66 Add RSocketRequester retrieveAndAwaitOrNull extension
Closes gh-23874
2019-10-27 20:11:08 +01:00
Mark Paluch 0d8aa854e8 Add tests for cancellation of transactional streams
See gh-23864

Closes gh-23873
2019-10-25 17:16:33 +02:00
Sam Brannen 5bd1af2a7f Away with the "manger"; time to fix that typo 2019-10-25 17:04:21 +02:00
Sam Brannen fd95646a04 Polish contribution
See gh-23869
2019-10-25 15:26:20 +02:00
Johnny Lim 46a31bc656 Extract build cache settings to a dedicated file
Closes gh-23869
2019-10-25 15:08:11 +02:00
Andreas Killaitis f838590300 Commit on cancelled subscription in TransactionalOperator::transactional
Prior to this commit, TransactionalOperator::transactional did not close
the transaction when cancelled.

Closes gh-23864
2019-10-25 14:48:46 +02:00
Andy Wilkinson cba91ab28e Stop Created-By manifest header from causing a test task cache miss
Previously, when a project's jar was an input into a test task, a
cache hit required the current build to be using the same JDK as the
one that created the cache entry. This was due to the Created-By
entry in the jar's manifest which will vary if JDKs with different
values for the java.version and java.specification.vendor version are
used.

This commit configures normalization of the runtime classpath to ignore
META-INF/MANIFEST.MF, thereby allowing a cache hit when the tests were
previously run on a different JDK than the one being used now. Typically
this is a different update release being used on a CI agent and a
developer's machine. This change will therefore improve the likelihood
of a cache hit once remote caching has been enabled.

Closes gh-23872
2019-10-25 13:52:48 +02:00
Stephane Nicoll a51334f079 Upgrade to Netty 4.1.43.Final 2019-10-25 09:24:15 +02:00
Stephane Nicoll fecb681339 Start building against Reactor Dysprosium-SR1 snapshots
See gh-23871
2019-10-25 09:23:13 +02:00
Stephane Nicoll 22192fcaab Merge branch '5.1.x' 2019-10-25 09:09:10 +02:00
Phillip Webb 013ec6abdb Support customer repeatable containers in type map
Update `AnnotationTypeMappings` so that a custom `RepeatableContainers`
instances can be used. Prior to this commit, only standard repeatables
were used when reading the annotations. This works in most situations,
but causes regressions for some `AnnotationUtils` methods.

Fixed gh-23856
2019-10-24 13:20:11 -07:00
Sam Brannen f8b875d2d8 Introduce failing @Disabled test for gh-23856 2019-10-24 16:15:59 +02:00
Sam Brannen 5b6337b6a9 Clean up warning in spring-test 2019-10-24 13:55:26 +02:00
Sam Brannen 13cdb70f64 Reinstate protected XpathRequestMatchers constructor
This commit makes the XpathRequestMatchers constructor protected again
in case users have extended this class.
2019-10-24 13:49:35 +02:00
Sam Brannen f3cad9f685 Polish XpathRequestMatchers Javadoc and implementation 2019-10-24 13:37:56 +02:00
Sam Brannen db4d51ba32 Remove unused type parameter declarations in XpathRequestMatchers
Prior to this commit, several of the methods in XpathRequestMatchers
declared unused type parameters (e.g., <T>). This was obviously the
result of copying an existing method that actually needs the type
parameter for proper casting.

For example, the following ...

public <T> RequestMatcher exists() {
    // ...
}

... should actually be declared without <T>, since T is not used in the
implementation or in the return type:

public RequestMatcher exists() {
    // ...
}

This commit removes all unused type parameter declarations in
XpathRequestMatchers.

Side Effects:

Now that we have removed the unused type parameter declarations, users
will see the following side effects if they had previously declared a
type argument when invoking such methods.

- Java: an "Unused type arguments for the non generic method ..."
  warning will be generated by the compiler, but the code will continue
  to work unmodified.

- Kotlin: a "Type inference failed: Not enough information to infer
  parameter T in fun ..." compiler error will be raised, causing the
  code to no longer compile (see
  https://youtrack.jetbrains.com/issue/KT-5464). Removal of the type
  argument declaration will allow the code to work correctly again.

Closes gh-23860
2019-10-24 13:12:02 +02:00
Sam Brannen 693101ded8 Remove unused type parameter declarations in MockMvc result matchers
Prior to this commit, several of the ResultMatcher methods used in
MockMvc declared unused type parameters (e.g., <T>). This was obviously
the result of copying an existing method that actually needs the type
parameter for proper casting.

For example, the following in RequestResultMatchers ...

public <T> ResultMatcher attribute(String name, Object expectedValue) {
    // ...
}

... should actually be declared without <T>, since T is not used in the
implementation or in the return type:

public ResultMatcher attribute(String name, Object expectedValue) {
    // ...
}

This commit removes all unused type parameter declarations in MockMvc
result matchers.

Side Effects:

Now that we have removed the unused type parameter declarations, users
will see the following side effects if they had previously declared a
type argument when invoking such methods.

- Java: an "Unused type arguments for the non generic method ..."
  warning will be generated by the compiler, but the code will continue
  to work unmodified.

- Kotlin: a "Type inference failed: Not enough information to infer
  parameter T in fun ..." compiler error will be raised, causing the
  code to no longer compile (see
  https://youtrack.jetbrains.com/issue/KT-5464). Removal of the type
  argument declaration will allow the code to work correctly again.

Closes gh-23858
2019-10-24 10:41:37 +02:00
Rossen Stoyanchev 5c0212e678 Merge pull request #23780 from izeye/polish-20191011 2019-10-23 17:32:42 +01:00
Rossen Stoyanchev 780eef8d36 Update comment in HttpWebHandlerAdapter
See gh-23780
2019-10-23 17:31:59 +01:00
Johnny Lim 33bf09d513 Polish HttpWebHandlerAdapter.handleUnresolvedError() 2019-10-23 16:57:20 +01:00
Tomasz Letachowicz 9bbf22a1c9 Typos in WebSocket section
Closes gh-23777
2019-10-23 16:55:00 +01:00
Rossen Stoyanchev b343e733df Upgrade Jetty to 9.4.21
Make use of the new getAvailableExtensionNames() method.

Closes gh-23565
2019-10-23 16:51:04 +01:00
Rossen Stoyanchev 88ec452dee Merge pull request #23764 from ask4gilles/23738 2019-10-23 16:50:42 +01:00
Rossen Stoyanchev 2733511ea2 Charset argument in RestClientResponseException
See gh-23764
2019-10-23 16:49:32 +01:00
Rossen Stoyanchev 4932196b87 RestClientResponseException defaults to UTF-8
Closes gh-23764
2019-10-23 16:26:57 +01:00
Rossen Stoyanchev 1b43b09e55 Merge pull request #23612 from KateVasovski/add-principal-method-argument-resolver 2019-10-23 14:58:48 +01:00
Rossen Stoyanchev 739d2881fa Polishing 2019-10-23 14:55:55 +01:00
KateVasovski f77d23de94 @MessgeMapping support for Optional<Principal> 2019-10-23 14:51:07 +01:00
Sam Brannen 6c4ac8f9c9 Remove unused type parameter declaration in RequestResultMatchers
The new sessionAttributeDoesNotExist() method introduced in commit
e73344fc71 declares an unused type
parameter <T>.

This commit removes that unused type parameter from the method
signature.

See gh-23756
2019-10-23 14:27:00 +02:00
Sam Brannen eabf357640 Polish MockMvc result matchers and tests 2019-10-23 14:03:50 +02:00
Sam Brannen 82f64f6a8d Polish contribution
See gh-23756
2019-10-23 12:34:51 +02:00
Drummond Dawson e73344fc71 Introduce sessionAttributeDoesNotExist in RequestResultMatchers
Analogous to the attributeDoesNotExist() method in ModelResultMatchers,
this commit introduces a new sessionAttributeDoesNotExist() method in
RequestResultMatchers which asserts that the given attributes are null
in the HttpSession.

Closes gh-23756
2019-10-23 12:28:08 +02:00
Stephane Nicoll e6f92ae2af Merge pull request #23848 from pdeneve
* pr/23848:
  Update Spring Boot references in testing documentation

Closes gh-23848
2019-10-23 09:54:08 +02:00
Philippe De Neve ca77342407 Update Spring Boot references in testing documentation
See gh-23848
2019-10-23 09:53:41 +02:00
Sam Brannen 112bbe859c Fix grammar in Javadoc 2019-10-22 18:07:41 +02:00
Sam Brannen 71400ea604 Polish MergedAnnotation internals 2019-10-22 13:58:13 +02:00
Sam Brannen 2146bc816a Fix Checkstyle violations
See gh-23767
2019-10-22 12:40:38 +02:00
Phillip Webb ad543dbee3 Use mapped annotation values when resolving mirrors
Update `TypeMappedAnnotation` mirror resolution logic so that mapped
annotation values are also considered. Prior to this commit, mirrors
in more complex meta-annotation scenarios would not resolve correctly.

Specifically, given the following:

 @interface TestAliased {

 	@AliasFor(attribute = "qualifier")
 	String value() default "";

 	@AliasFor(attribute = "value")
 	String qualifier() default "";
 }

 @TestAliased
 @interface TestMetaAliased {

 	@AliasFor(annotation = Aliased.class, attribute = "value")
 	String value() default "";
 }

 @TestMetaAliased("test")
 @interface TestComposed {
 }

A merged `@TestAliased` annotation obtained from a `@TestComposed`
root annotation would return a `value` and `qualifier` of "".

This was because the "value" and "qualifier" mirrors needed to be
resolved against the `@TestMetaAliased` meta-annotation. They cannot be
resolved against the declared `@TestComposed` annotation because it
does not have any attributes. Our previous tests only covered a single
depth scenario where `@TestMetaAliased` was used directly on the
annotated element.

Closes gh-23767
Co-authored-by: Sam Brannen <sbrannen@pivotal.io>
2019-10-21 21:57:30 -07:00
Sam Brannen b1a938fa24 Polishing 2019-10-21 13:51:37 -07:00
Sam Brannen 243f2890ee Upgrade to Gradle 5.6.3 2019-10-18 11:59:30 +02:00
Sam Brannen c087697fde Ensure line endings for binary files are not modified in Git
This commit is necessary in order to upgrade the Gradle wrapper, since
the recent attempt to do so ended up in a corrupted JAR file for the
Gradle wrapper.
2019-10-18 11:56:18 +02:00
Sam Brannen 9e066e5272 Revert "Upgrade to Gradle 5.6.3"
This reverts commit 8e72722d7f.
2019-10-18 10:38:40 +02:00
Sam Brannen 8e72722d7f Upgrade to Gradle 5.6.3 2019-10-18 09:52:13 +02:00
Brian Clozel a65c6f6884 Fix APPLICATION_PROBLEM_JSON_UTF8 media type value
This commit adds the missing "+json" suffix to the "application/problem"
media type for its deprecated UTF-8 variant.

Fixes gh-23825
2019-10-17 09:36:05 +02:00
Minho Hwang d1aee0e869 Fix typo in RSocket reference documentation
This commit fixes a typo in a Java code snippet of
the RSocket reference documentation.

Closes gh-23762
2019-10-06 16:34:27 +02:00
Sam Brannen 3f9359aa83 Polish docs.gradle 2019-10-05 17:44:40 +02:00
Sam Brannen 972337e8f9 Introduce common .gitattributes file
Closes gh-23376
2019-10-02 15:22:39 +02:00
Sam Brannen 6fd50d7d17 Register EventPublishingTEL in JUnit 4 & TestNG base classes
Spring Framework 5.2 introduced an EventPublishingTestExecutionListener
in the Spring TestContext Framework. This listener is automatically
registered via the spring.factories mechanism; however, this listener is
not registered in the abstract JUnit 4 and TestNG base classes.

This commit addresses this oversight by explicitly registering the
EventPublishingTestExecutionListener in the following classes.

- AbstractJUnit4SpringContextTests
- AbstractTransactionalJUnit4SpringContextTests
- AbstractTestNGSpringContextTests
- AbstractTransactionalTestNGSpringContextTests

Closes gh-23748
2019-10-02 15:04:03 +02:00
Sam Brannen fc74c43718 Polishing 2019-10-02 14:49:23 +02:00
Sam Brannen 3a59b01be8 Polish Javadoc for abstract JUnit 4 and TestNG base classes 2019-10-02 14:26:50 +02:00
Sam Brannen f16e29892e Add note regarding proxyTargetClass for Java config and web controllers
See gh-23744
2019-10-02 13:11:06 +02:00
Martin Macko 96930924b2 Fixes broken links to dev.java.net
Closes gh-23746
2019-10-02 12:48:34 +02:00
Brian Clozel a4257f84e7 Fix base directory in distribution zip
Fixes gh-23745
2019-10-02 10:00:33 +02:00
Drummond Dawson b7f819c9e1 Fix URI typo in Java code snippet of web-uris.adoc
Closes gh-23739
2019-10-01 15:10:44 +02:00
Sam Brannen d9bb9b55ee Fix Checkstyle violation
See gh-23706
2019-09-30 18:31:13 +02:00
Sam Brannen 60cd73e97c Update documentation for importing projects into Eclipse
Closes gh-23706
2019-09-30 18:21:29 +02:00
Andy Wilkinson 3b0b173353 Enable local build cache for buildSrc and main project 2019-09-30 15:04:14 +02:00
Spring Buildmaster fef09e3522 Next Development Version 2019-09-30 08:57:48 +00:00
Brian Clozel e435f642bc Temporarily disable Gradle metadata publication
See gh-23503
2019-09-30 10:23:30 +02:00
Brian Clozel a446f572a6 Fix missing project information in generated POMS
This commit ensures that the project name and description are published
with the generated POMs.
2019-09-30 10:22:44 +02:00
Stephane Nicoll 545a4faa2d Revert "Next Development Version"
This reverts commit f3ba263fcc.
2019-09-30 10:14:57 +02:00
Spring Buildmaster f3ba263fcc Next Development Version 2019-09-30 07:20:43 +00:00
Brian Clozel 77bc1b05a6 Use RSocket BOM
See gh-23698
2019-09-30 08:50:03 +02:00
Stephane Nicoll 29f0d1b25e Remove TODO in AnnotationUtils
Closes gh-23727
2019-09-30 07:57:12 +02:00
Stephane Nicoll f9424c889b Upgrade to RSocket 1.0.0-RC5
Closes gh-23698
2019-09-30 07:57:12 +02:00
Sebastien Deleuze b24ac74106 Restore TransactionOperations Kotlin API compatibilty
This commit renames the Runnable variant to executeWithoutResult
and uses a Consumer<TransactionStatus> parameter for better
consistency with TransactionCallbackWithoutResult.

Closes gh-23724
2019-09-29 19:31:12 +02:00
康智冬 1e0bdc0337 Fix typo in DispatcherServlet Javadoc
Closes gh-23726
2019-09-29 16:22:48 +02:00
Stephane Nicoll d7711e6365 Merge branch '5.1.x' 2019-09-28 14:36:03 +02:00
Sebastien Deleuze ae2218741e Upgrade to Jackson 2.10.0
Closes gh-23662
2019-09-27 22:38:27 +02:00
Sebastien Deleuze 6080449d03 Polishing 2019-09-27 18:17:23 +02:00
Sam Brannen 06563d8b4b Add headerDoesNotExist() to MockRestRequestMatchers
Prior to this commit, one could not test for the absence of a specific
HTTP header in a request.

This commit adds a headerDoesNotExist() method in MockRestRequestMatchers.

Closes gh-23721
2019-09-27 17:38:11 +02:00
Sam Brannen 4dc966b04b Include @Inject TCK tests in the build again
Commit 979508a7f3 removed the JUnit 4
dependency from all modules except spring-test. Unfortunately, the
@Inject TCK tests (SpringAtInjectTckTests) are still based on JUnit 3.
Thus, that commit accidentally excluded those tests from the build.

This commit includes SpringAtInjectTckTests in the build again by
introducing a test runtime dependency on the JUnit Vintage TestEngine
in spring-context.

See gh-23451
2019-09-27 13:57:31 +02:00
Juergen Hoeller 2861fc65bd Polishing 2019-09-27 10:17:56 +02:00
Sam Brannen 6a207d0012 Polish AnnotationConfigApplicationContextTests 2019-09-26 16:45:49 +02:00
Johnny Lim 2a4dbcc623 Fix an assertion in AnnotationConfigApplicationContextTests
Closes gh-23719
2019-09-26 16:34:27 +02:00
Sam Brannen 2526553ecd Document terms and units in DataSize and DataUnit
Prior to this commit, it was not readily apparent what terms and units
such as kilobyte/KB and megabyte/MB represented numerically in DataSize
and DataUnit.

This commit clarifies that such terms and units are based on binary
prefixes for data (i.e., powers of 2 instead of powers of 10).

Closes gh-23697
2019-09-26 16:05:12 +02:00
Sam Brannen 6186239287 Remove obsolete references to specific release versions in testing docs 2019-09-26 15:02:30 +02:00
Brian Clozel fbe05f0369 Upgrade to Spring Doc Resources 0.1.3
Closes gh-23679
2019-09-26 14:27:07 +02:00
Sam Brannen 26ee9c68eb Document [Priority]Ordered support for Bean[Factory]PostProcessor
Prior to this commit, it was not clear from the Javadoc for
BeanPostProcess and BeanFactoryPostProcessor that such components can
be ordered by implementing Ordered or PriorityOrdered.

This commit improves the documentation for BPP and BFPP to make this
support explicit.

Closes gh-23636
2019-09-26 14:24:33 +02:00
Sam Brannen 77b896ca28 Polishing 2019-09-26 11:58:45 +02:00
Sam Brannen f05b4625de Merge branch '5.1.x' 2019-09-26 10:55:55 +02:00
Rossen Stoyanchev e93ac7ac75 Merge branch '5.1.x' 2019-09-26 09:07:29 +01:00
Juergen Hoeller 47a24ac378 Upgrade to Aalto 1.2.2, Protobuf 3.10, Apache Johnzon 1.2, SnakeYAML 1.25, OpenPDF 1.3.11, FreeMarker 2.3.29 2019-09-25 23:49:15 +02:00
Juergen Hoeller d00690f43f Merge branch '5.1.x'
# Conflicts:
#	build.gradle
#	spring-context/spring-context.gradle
#	spring-test/spring-test.gradle
#	spring-web/spring-web.gradle
#	spring-webflux/spring-webflux.gradle
#	spring-webmvc/spring-webmvc.gradle
2019-09-25 23:13:49 +02:00
Sebastien Deleuze 091c512f0d Upgrade to Coroutines 1.3.2
Closes gh-23663
2019-09-25 21:51:04 +02:00
Sebastien Deleuze c10dcec9ed Polishing 2019-09-25 21:48:47 +02:00
Rossen Stoyanchev 2995b6f224 Merge branch '5.1.x' 2019-09-25 17:28:24 +01:00
Sam Brannen a541aa13a5 Link build status badge to build overview page 2019-09-25 17:21:21 +02:00
Sam Brannen 8b73d76204 Link from build status badge to CI build plan 2019-09-25 17:15:55 +02:00
Sam Brannen 667636de66 Add Bamboo build status badge 2019-09-25 17:12:56 +02:00
Sebastien Deleuze f79cebd53d Add Kotlin samples to RSocket documentation
See gh-23147
2019-09-25 17:04:40 +02:00
Sebastien Deleuze a4b278a269 Polishing 2019-09-25 17:02:05 +02:00
Sebastien Deleuze 5866693ece Add MetadataExtractorRegistry.metadataToExtract Kotlin extensions
Closes gh-23705
2019-09-25 17:02:05 +02:00
Andy Wilkinson 00bad3dce0 Allow genJaxb's output to be cached when checkout locations differ
Previously, the genJaxb task's input files were compared using
absolute paths. This would result in a cache miss for two builds
with identical files contents and different root directories.

This commit updates the path sensitivity of the input to be relative
to the build's root directory, thereby allowing caching to work
irrespective of the source checkout location.

Closes gh-23704
2019-09-25 16:44:01 +02:00
Andy Wilkinson 69a0730b01 Upgrade to io.freefair.aspectj 4.1.1
Closes gh-23703
2019-09-25 16:09:51 +02:00
Andy Wilkinson 02decfd864 Improve exclusions of checkstyleNoHttp task
This commit adds the following exclusions to the source of the
checkstyleNoHttp tasks for each project in the build and for buildSrc:

- bin/ directory (created by Eclipse Buildship)
- .settings directory (created by Eclipse)
- .classpath file (created by Eclipse)
- .project file (created by Eclipse)

An exclusion for the build/ directory is also configured as the
NoHttp plugin does not exclude it by default for buildSrc.

Closes gh-23702
2019-09-25 15:29:19 +02:00
Juergen Hoeller 1aa0ea0281 Fix nullability declarations on internal ParserStrategyUtils methods 2019-09-25 13:51:20 +02:00
Andy Wilkinson 853d4c38ae Run webflux's tests in parallel to shorten long tail of builds (#23701)
When built in an environment where many Gradle build workers are
available, :spring-webflux:test is regularly the only task running at
the end of the build. Therefore, the build's overall execution time
can be reduced by running its tests in parallel, spreading the tests'
execution across the available workers. The configured number of forks
is a maximum with Gradle reducing this as necessary for environments
with low numbers of cores where multiple workers will not improve
build performance.

Closes gh-23701
2019-09-25 13:44:14 +02:00
Juergen Hoeller bf55252366 Upgrade to Hibernate ORM 5.4.5 2019-09-25 13:08:07 +02:00
Juergen Hoeller 07df1ce7d2 Update genericBeanDefinitionEquality test to AssertJ usage on master
See gh-23593
2019-09-25 13:07:27 +02:00
Juergen Hoeller bd70f10d2b Merge branch '5.1.x'
# Conflicts:
#	build.gradle
#	spring-aop/src/main/java/org/springframework/aop/framework/CglibAopProxy.java
#	spring-aspects/spring-aspects.gradle
#	spring-beans/src/main/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessor.java
#	spring-beans/src/main/java/org/springframework/beans/factory/support/GenericBeanDefinition.java
#	spring-beans/src/test/java/org/springframework/beans/factory/DefaultListableBeanFactoryTests.java
#	spring-orm/spring-orm.gradle
#	spring-test/spring-test.gradle
2019-09-25 12:43:24 +02:00
Brian Clozel 9034391b6c Temporarily add milestone repository for RSocket
RSocket is still in its RC phase, but those artifacts are published on
maven central. This dependency is currently still depending on a
milestone dependency for Reactor adn this is causing issues with our
build.

This commits adds back the milestone repository until the RSocket POMs
and BOMs are fixed. Once fixed, the Framework build should use the
RSocket BOM for managing RSocket dependencies.

See gh-23698
2019-09-25 12:20:07 +02:00
Stephane Nicoll 27481e4211 Upgrade to Reactor Dysprosium-RELEASE
Closes gh-23695
2019-09-25 08:50:06 +02:00
Stephane Nicoll 4a588a359d Merge branch '5.1.x' 2019-09-25 08:49:38 +02:00
Sam Brannen b9013ada9f Abort MBeanServer tests if BindException encountered
This commit builds on the previous commit but covers exceptions thrown
by @BeforeEach and @AfterEach methods as well as @Test methods.
2019-09-24 19:20:39 +02:00
Sam Brannen 435cc67026 Abort MBeanServer tests if BindException encountered 2019-09-24 18:57:30 +02:00
Andy Wilkinson d0adadf3ca Capture maxParallelForks of Test tasks in build scans
The parallel forks configuration of Test tasks can have a big impact
on their execution time. This commit updates the build can
configuration to capture each Test task's maxParallelForks
configuration as custom values in the build scan. This will make this
data available when comparing scans which will be useful as we
experiment with different parallel fork settings to reduce the
build's overall execution time.

Closes gh-23691
2019-09-24 18:25:24 +02:00
Andy Wilkinson 2570379824 Obfuscate IP addresses in build scans
Closes gh-23690
2019-09-24 18:18:52 +02:00
Sam Brannen e6678f40e8 Make DataSize constants final 2019-09-24 15:32:26 +02:00
Rossen Stoyanchev 30e1257dda Merge branch '5.1.x' 2019-09-24 13:39:42 +01:00
Sam Brannen 402046f3c7 Polish data buffer allocation tests 2019-09-24 14:24:36 +02:00
Sam Brannen 48c8d3a551 Polishing 2019-09-24 13:57:14 +02:00
Sam Brannen 38052e77b7 Fix bug in WebClientDataBufferAllocatingTests
Prior to this commit, the parameterized DataBufferFactory was never
actually used when setting up the WebClient for each test. This was due
to an oversight when migrating from JUnit 4 to JUnit Jupiter.

See: https://github.com/reactor/reactor-netty/issues/860

This commit fixes this by converting the existing @BeforeEach method to
a local setup method that is invoked from each
@ParameterizedDataBufferAllocatingTest method.

In addition, in order to avoid the 2 second "quiet period" that is
incurred when destroying the ReactorResourceFactory, this commit moves
the setup and destruction of the ReactorResourceFactory to new
@BeforeAll and @AfterAll methods.

The test instance lifecycle has also been switched to PER_CLASS to avoid
static state in the test class.
2019-09-24 13:45:50 +02:00
Sam Brannen bba3553dfb Polish SpringVersion 2019-09-24 12:43:10 +02:00
Johnny Lim d6d3a9e232 Polish ImportOrderCheck Checkstyle rule
Closes gh-23685
2019-09-24 12:36:51 +02:00
Sebastien Deleuze 840249778a Polish Kotlin reference documentation for WebMvc.fn
See gh-23657
2019-09-24 10:14:16 +02:00
Sebastien Deleuze 97026f1ec3 Fix ServerRequestExtensionsTests on Java 13
Closes gh-23677
2019-09-24 09:47:57 +02:00
Rossen Stoyanchev 2888b032a1 Polish rsocket.adoc 2019-09-24 06:08:06 +01:00
Rossen Stoyanchev 93371cc2ac Polish 2019-09-23 16:35:08 +01:00
Brian Clozel 72be38cf2c Fix API Diff Gradle task
Prior to this change, the Gradle API Diff task was failing due to a
missing class (a Guava class) during processing. This might be a
dependency that was previously brought by some other dependency.

This commit adds that dependency as a workaround, and improves the
Gradle API Diff task to only select relevant projects when running the
task (projects using the Java Plugin and the Maven Publish Plugin).
2019-09-23 17:13:49 +02:00
Brian Clozel 716f928e79 Upgrade to Spring Doc Resources 0.1.3.BUILD-SNAPSHOT
See gh-23679
2019-09-23 16:53:39 +02:00
Arjen Poutsma 9ffecc5059 Polish reference documentation for WebMvc.fn 2019-09-23 16:08:50 +02:00
Arjen Poutsma 652bbdad2a Add reference documentation for WebMvc.fn
This commit introduces reference documentation for WebMvc.fn, the
functional web framework.

Closes gh-23657
2019-09-23 15:27:49 +02:00
Rossen Stoyanchev e2baf7277b Use metadata slice
Take a slice of the metadata if not using composite metadata to allow
reading it multiple times. For composite metadata this is not an isuse
as it is ensured by the underlying RSocket Java API.
2019-09-23 13:32:28 +01:00
Rossen Stoyanchev 0ae7154518 Fix checkstyle violation 2019-09-23 13:09:06 +01:00
Rossen Stoyanchev 88bb2aabbf RSocket reference documentation
Closes: gh-23147
2019-09-23 12:18:03 +01:00
Sam Brannen 2572cd0503 Make PathPatternParserTests compatible with JDK 13
Closes gh-23669
2019-09-21 17:33:28 +02:00
Sam Brannen 4acd180fa3 Document that setting static final fields is unsupported
This commit updates the documentation for ReflectionUtils and
ReflectionTestUtils to point out that setting static final fields is
not supported.
2019-09-21 15:42:09 +02:00
Sam Brannen fccdb8cf60 Polish ReflectionUtils
This commit removes dead code in ReflectionUtils and improves the
exception message for field access errors.
2019-09-21 15:29:03 +02:00
Juergen Hoeller 4882dfcc0d Consistent relative path treatment (no accidental URL fragment symbol)
Closes gh-23532
2019-09-20 21:55:27 +02:00
Juergen Hoeller 957924ace2 Avoid early log provider initialization (and LogAccessor dependency)
Closes gh-23655
2019-09-20 21:54:53 +02:00
Juergen Hoeller e68132686d Restore lenient target type handling for FactoryBean definitions
Closes gh-23561
2019-09-20 21:54:32 +02:00
Juergen Hoeller a48c13ae73 Avoid deprecated usingWhen method in Reactor 3.3
Closes gh-23562
2019-09-20 21:54:18 +02:00
Mark Paluch 393a81d4a9 Omit cancellation of transactional Monos in TransactionOperator
TransactionOperator.as(Mono) now no longer short-cuts via a Flux.next() but provides an implementation via Mono.usingWhen(…).
The short-cut previously issued a cancellation signal to the transactional Mono causing the transaction cleanup to happen without a handle for synchronization.

Using Mono.usingWhen(…) initiates transaction cleanup when the Mono completes eliminating the need for cancellation of the transactional Publisher.

This change does not fully fix gh-23304 but it softens its impact because TransactionalOperator.transactional(Mono) avoids cancellation.
2019-09-20 20:48:39 +02:00
Sam Brannen f0e160fc67 Execute WebClientDataBufferAllocatingTests during all builds
This commit reverts b2704e1db6 and
configures the ReactorResourceFactory not to use global resources,
thereby allowing all tests in WebClientDataBufferAllocatingTests to
execute within approximately 2 seconds again on Mac OS.
2019-09-20 14:09:00 +02:00
Sam Brannen 3603e0c448 Set Spring-specific name for shutdown hook thread
Prior to this commit, the name of the Thread registered via
ConfigurableApplicationContext#registerShutdownHook() was the generic,
default thread name ("Thread-#"). That made it difficult to discern
which executing thread was the Spring ApplicationContext shutdown hook.

This commit improves diagnostics by setting the thread name of the
ApplicationContext shutdown hook to "SpringContextShutdownHook".

Closes gh-23670
2019-09-20 13:16:59 +02:00
Sam Brannen 734ceed301 Polish contribution
See gh-23658
2019-09-19 22:02:19 +02:00
i321222 fde7b1e545 Avoid ArrayIndexOutOfBoundsException in SpEL's Indexer
When index == arrayLength, the array index is also out of bounds.

For this scenario, a SpelEvaluationException should be thrown instead
of ArrayIndexOutOfBoundsException.

Closes gh-23658
2019-09-19 22:01:10 +02:00
Sam Brannen b2704e1db6 Execute WebClientDataBufferAllocatingTests only during PERFORMANCE build 2019-09-19 18:35:35 +02:00
Sam Brannen c256af4ef7 Polishing 2019-09-19 16:31:07 +02:00
Sam Brannen d611c7484f Fix Checkstyle violation 2019-09-19 16:21:44 +02:00
Sam Brannen 9811e21432 Merge branch '5.1.x' 2019-09-19 15:57:33 +02:00
Brian Clozel 809009e6c4 Rename RSocketStrategies.Builder.metadataExtractors
This commit renames the `metadataExtractors` method to something that is
closer to the actual intent: addming new metadata extractors against the
registry given as a parameter of the `Consumer`.

The method is renamed to `metadataExtractorRegistry`.
2019-09-19 14:54:36 +02:00
Stephane Nicoll e06d2a9c57 Stop using libs-release
This commit makes sure we narrow down dependencies of the Spring
Framework to only Maven central. Optional dependencies that are not
available on Maven Central are now served from a more specific
repository (`libs-spring-framework-build`).

Closes gh-23124
2019-09-19 13:27:49 +02:00
Sebastien Deleuze 02d70424ad Mention Kotlin code samples in the Kotlin refdoc 2019-09-19 10:44:50 +02:00
Brian Clozel 74897bc52a Use Reactor's new Schedulers.boundedElastic()
Prior to this commit, Spring Framework would use `Schedulers.elastic()`
in places where we needed to process blocking tasks in a reactive
environment.

With reactor/reactor-core#1804, a new `Schedulers.boundedElastic()`
scheduler is available and achieves the same goal with added security;
it guarantees that resources are bounded.

This commit uses that new scheduler in the standard websocket client,
since the underlying API is blocking for the connection phase and we
need to schedule that off a web server thread.

Closes gh-23661
See gh-23665
2019-09-18 21:39:45 +02:00
Sebastien Deleuze 90b5e6ab48 Polishing
See gh-23649
2019-09-18 19:29:15 +02:00
Sebastien Deleuze 5adc3d6666 Fix RSocketRequester API for requests without payload
This commit makes it possible to send requests without
requiring to call data(Mono.empty()). It introduces a
dedicated MetadataSpec interface and merge ResponseSpec
into RequestSpec for more flexibility.

Closes gh-23649
2019-09-18 16:00:16 +02:00
Brian Clozel ab58e29397 Remove scope information from published BOM
It seems that publishing a Gradle platform as a Maven POM writes all
dependencies with their scope information by default.

We don't want that when publishing the Spring Framework BOM, as it
forces the scope on projects depending on the BOM, unless they've
specified the scope when they added the dependency to their build.

Typically, developers could get spring-test as a compile dependency
without this change.

This commit removes the scope information from the published BOM.

Fixes gh-23660
2019-09-18 15:27:59 +02:00
Sam Brannen e1e072b75c Fix memory leak regression involving @Async methods
Spring Framework 5.2 M1 introduced a memory leak for applications using
@Async methods. Specifically, in a large test suite with multiple
ApplicationContexts that were closed (e.g., via @DirtiesContext,
@MockBean, or context cache eviction), the JVM process could run out of
memory.

Underlying cause: Due to a missing equals() implementation in Spring's
new AnnotationCandidateClassFilter, CGLIB's static cache of generated
classes indirectly retained references to BeanFactory instances for the
closed ApplicationContexts for the duration of the test suite.

This commit fixes this regression by introducing a proper equals()
implementation in AnnotationCandidateClassFilter. This commit also
introduces corresponding hashCode() and toString() implementations.

Closes gh-23571
2019-09-18 14:28:54 +02:00
Sam Brannen 2e7d344930 Polish ClassFiltersTests 2019-09-18 10:25:54 +02:00
Sam Brannen a51dc84cb1 Fix Checkstyle violation 2019-09-17 13:29:22 +02:00
Sam Brannen 9517372e5f Re-enable DLBFTests.prototypeCreationWithConstructorArgumentsIsFastEnough() 2019-09-17 13:24:53 +02:00
Sam Brannen a93f3ddfe4 Polish DefaultListableBeanFactoryTests 2019-09-17 13:17:22 +02:00
Sam Brannen c8e47f578f Merge branch '5.1.x' 2019-09-17 13:13:02 +02:00
Sebastien Deleuze 1dfe304da4 Improve parity between Java and Kotlin router DSL
This commit adds following functions to the Kotlin DSL:
add, filter, before, after and onError.

Closes gh-23524
2019-09-17 12:42:48 +02:00
Sam Brannen 7a1a8e1623 Polish DefaultListableBeanFactoryTests 2019-09-17 10:44:45 +02:00
Brian Clozel 4cfcc108fe Merge branch '5.1.x' 2019-09-17 09:49:47 +02:00
Sebastien Deleuze 5a0216d657 Improve parity between Java and Kotlin router DSL
This commit adds variants with pattern + predicate to
Kotlin router DSLs, and vararg where necessary.

Closes gh-23524
2019-09-16 22:14:55 +02:00
Brian Clozel 848804a227 Allow registration of RSocket metadata extractors
Prior to this commit, customizing the extraction of RSocket metadata
from frames would require developers to override the default
`MetadataExtractor` while configuring `RSocketStrategies`.
This touches on many infrastructure parts, whereas the goal is just to
configure an extra metadata entry extractor using already configured
codecs.

This commit adds a way to register metadata entry extractors on the
`RSocketStrategies` builder with a `Consumer`-based API.

Closes gh-23645
2019-09-16 19:01:14 +02:00
Sam Brannen a676059699 Declare CRON_DISABLED constant value only once
This commit removes the duplicated CRON_DISABLED constant value from
@Scheuled and simply refers to the ScheduledTaskRegistrar.CRON_DISABLED
constant.

This avoids a potential package cycle by ensuring that the `annotation`
package depends on the `config` package but not the other way around.

See gh-23568
2019-09-16 15:17:58 +02:00
Stephane Nicoll 37d950c5d6 Merge branch '5.1.x' 2019-09-16 14:37:15 +02:00
Andy Wilkinson 20e6ca3601 Fix race condition in sendBlockingMessage
Previously, tests in ConcurrentWebSocketSessionDecoratorTests that use
the BlockingSession would fail intermittently. This appears to have
been due to a race condition in sendBlockingMessage where the call
to getSentMessageLatch() that stores a latch in nextMessageLatch on
the main thread may happen after the call to sendMessage that counts
down the latch if it is non-null occurs on the executor's thread.

This commit updates sendBlockingMessage to call getSentMessageLatch()
(and therefore store the latch) before it sumbmits the task to the
executor. This ensures that the latch will be available when the
exeuctor's thread attempts to retrieve and decrement it.
BlockingSession's AtomicReference fields have also been made final to
eliminate the possibility of any visibility problems across threads.

Closes gh-23642
2019-09-16 14:14:06 +02:00
Kwon Young Jae 6063c00e4e Delete obsolete comment in RowMapperTests
Closes gh-23643
2019-09-16 14:10:33 +02:00
Sam Brannen e7b2c93ede Delete dead code 2019-09-16 13:56:01 +02:00
Sam Brannen 53565c825f Merge branch '5.1.x' 2019-09-16 13:48:49 +02:00
Sam Brannen 1deaedc2b9 Merge branch '5.1.x' 2019-09-16 12:49:35 +02:00
Sam Brannen 52128fe863 Polish RequestLoggingFilterTests 2019-09-16 11:35:26 +02:00
Napster 33cee066e5 Log HTTP method in logging filters and revise log message format
Closes gh-23567
2019-09-16 11:35:26 +02:00
Arjen Poutsma a65fd34801 Change raw status code range check in MockClientHttpResponse
This commit changes the raw status code check to allow for all three
digit numbers, not just those between 100 and 600.

See gh-23599
2019-09-16 09:52:03 +02:00
Sam Brannen cf5cb9484a Add additional tests for HttpHeaders.keySet() operations
See gh-22821
2019-09-15 15:48:37 +02:00
Phillip Webb 077754b8e0 Support constructor injection for @Import classes
Allow `ImportBeanDefinitionRegistrar`, `ImportSelector`,
`DeferredImportSelector.Group` and `TypeFilter` to use constructor
parameters as an alternative to `*Aware` callbacks.

In order to remain backwards compatible, injection only occurs
when there is a single constructor with one or more parameters.

The following parameter types are supported:

* `Environment`
* `BeanFactory`
* `ClassLoader`
* `ResourceLoader`

In order to keep the algorithm simple, subclass parameter types are
not supported. For example, you cannot use `ConfigurableEnvironment`
instead of `Environment`.

Closes gh-23637
2019-09-13 15:20:57 -07:00
Sam Brannen 957f0fac7a Polishing 2019-09-13 12:55:59 +02:00
Sebastien Deleuze 7b4b64b8fb Fix UTF-8 handling in ContentResultMatchers
Closes gh-23622
2019-09-13 11:44:10 +02:00
Phillip Webb 5d785390eb Add ClientHttpRequestInitializer support
Add `ClientHttpRequestInitializer` interface that can be used with any
`HttpAccessor` to initialize each `ClientHttpRequest` before it's used.

This provides a useful alternative to `ClientHttpRequestInterceptor`
when users need to configure things like `HttpHeaders`.

Closes gh-22002
2019-09-12 16:01:46 -07:00
Rossen Stoyanchev b587003d8d Merge branch '5.1.x' 2019-09-12 21:52:41 +01:00
Rossen Stoyanchev 7194261961 Merge branch '5.1.x' 2019-09-12 21:17:00 +01:00
Sam Brannen 455ad71863 Polish contribution
See gh-23629
2019-09-12 17:02:35 +02:00
douddle 93ddfb9cae Add SVG mapping to mime.types file for JavaMail support
Closes gh-23629
2019-09-12 16:52:59 +02:00
Sam Brannen d689ef8891 Support disabling cron jobs registered via SchedulingConfigurer
Prior to this commit, support was provided for disabling cron jobs
configured with an explicit "-" cron expression. However, the "-"
expression was only supported when supplied via the @Scheduled
annotation.

This commit adds support for disabling cron jobs configured with the
"-" cron expression when a cron job is registered via the
addCronTask(Runnable, String) method in the ScheduledTaskRegistrar
supplied to a SchedulingConfigurer.

Closes gh-23568
2019-09-12 16:08:26 +02:00
Sebastien Deleuze fc6480631e Improve Coroutines transaction API
As a follow-up of gh-22915, the purpose of this commit is to improve
Coroutines programmatic transaction API to make it more consistent with
the Java one and more idiomatic.

For suspending functions, this commit changes the
TransactionalOperator.transactional extension with a suspending lambda
parameter to a TransactionalOperator.executeAndAwait one which is
conceptually closer to TransactionalOperator.execute Java API so more
consistent.

For Flow, the TransactionalOperator.transactional extension is correct
but would be more idiomatic as a Flow extension.

This commit also adds code samples to the reference documentation.

Closes gh-23627
2019-09-12 14:45:03 +02:00
Sam Brannen e62cb6bc56 Merge branch '5.1.x' 2019-09-12 14:03:12 +02:00
Sam Brannen 2b460854ce Polishing 2019-09-12 13:16:48 +02:00
Sam Brannen e124cbb310 Fix Checkstyle violation 2019-09-12 13:15:58 +02:00
OLPMO 40fcf876ce Optimize test code with lambdas where feasible
This commit optimizes test code with lambda expressions
and method references where feasible.

Closes gh-23626
2019-09-12 13:09:31 +02:00
Sam Brannen 00c07e3a50 Indent with tabs 2019-09-12 11:51:44 +02:00
Andy Wilkinson 508b6798ff Move jmx.log beneath build/ to avoid UP-TO-DATE pollution
Previously, some tests in spring-context wrote a file named jmx.log
into spring-context/. This led to the file being included in the
sources of the Checkstyle NoHTTP Gradle task, breaking that task's
UP-TO-DATE checks and causing it to execute unnecessarily.

This commit updates the tests to write the jmx.log file beneath
spring-context/build/ so that it is not included in the sources of the
Checkstyle NoHTTP task.

Closes gh-23623
2019-09-12 11:39:43 +02:00
Sam Brannen 8f38f5c17a Polishing 2019-09-12 11:35:30 +02:00
Sam Brannen 30cff46e7f Prevent improper use of testing framework APIs
Prior to this commit, a lot of work had been done to prevent improper
use of testing Framework APIs throughout the codebase; however, there
were still some loopholes.

This commit addresses these loopholes by introducing additional
Checkstyle rules (and modifying existing rules) to prevent improper use
of testing framework APIs in production code as well as in test code.

- Checkstyle rules for banned imports have been refactored into
  multiple rules specific to JUnit 3, JUnit 4, JUnit Jupiter, and
  TestNG.
- Accidental usage of org.junit.Assume has been switched to
  org.junit.jupiter.api.Assumptions.
- All test classes now reside under org.springframework packages.
- All test classes (including abstract test classes) now conform to the
  `*Tests` naming convention.
  - As an added bonus, tests in the renamed
    ScenariosForSpringSecurityExpressionTests are now included in the
    build.
- Dead JUnit 4 parameterized code has been removed from
  DefaultServerWebExchangeCheckNotModifiedTests.

Closes gh-22962
2019-09-12 11:20:56 +02:00
Stephane Nicoll 92d3f7e7d7 Merge pull request #23620 from wilkinsona
* pr/23620:
  Enable parallel builds by default

Closes gh-23620
2019-09-12 09:48:50 +02:00
Andy Wilkinson 9de4c4aefb Enable parallel builds by default
Previously, all tasks in the build were run sequentially. This
commit updates Gradle's properties to build them in parallel where
possible. When using the daemon (recommended) its default max heap is
not sufficient for the demands on a parallel build, therefore this
commit also increases the daemon's max heap.

See gh-23620
2019-09-12 09:48:45 +02:00
Rossen Stoyanchev cfae20f97d Update advice on creating issue vs pull request
Closes gh-23427
2019-09-11 16:16:41 +01:00
Andy Wilkinson 2b4316cf24 Upgrade to com.gradle.build-scan 2.4.2
Closes gh-23619
2019-09-11 15:36:19 +02:00
Sam Brannen d759ae772b Rename Spr3896SuiteTests to Spr3896TestSuite
This commit renames Spr3896SuiteTests to comply with our naming
convention for test classes that should be executed via the Gradle
build.

The effect of this commit is that test classes included in that "suite"
are no longer executed twice in the build. Consequently, Gradle and
Bamboo will now report the same number of executed tests for the
spring-test project.
2019-09-11 13:21:19 +02:00
Arjen Poutsma 13ba7ef701 Merge branch '5.1.x' 2019-09-11 10:43:43 +02:00
Andy Wilkinson b730597c87 Disable caching of changing modules and dynamic versions
Previously, changing modules (snapshots) and dynamic versions were
cached for Gradle's default period of 24 hours and
--refresh-dependencies was used to pick up the latest artifacts. This
approach has a notable downside. --refresh-dependencies causes all
dependencies to be refreshed, irrespective of whether they are
expected to change. At a minimum, this results in a HEAD request for
every dependency in the build. Running an up-to-date build without
--refresh-dependencies takes in the region of 6 seconds:

$ ./gradlew build

BUILD SUCCESSFUL in 6s
203 actionable tasks: 203 up-to-date

The same build with --refresh-dependencies takes almost ten times as
long:

$ ./gradlew build --refresh-dependencies

BUILD SUCCESSFUL in 58s
203 actionable tasks: 203 up-to-date

This commit replaces the manual usage of --refresh-dependencies on
the command line with a 0 second caching period for changing modules
and dynamic versions. This should remove the need to use
--refresh-dependencies both locally and on CI, saving almost 1 minute
per full build.
2019-09-11 10:00:01 +02:00
Sam Brannen 333711fd36 Convert XmlValidationModeDetectorTests to JUnit Jupiter and AssertJ
See gh-23605
2019-09-09 16:29:00 +02:00
Sam Brannen 22c88d7126 Merge branch '5.1.x' 2019-09-09 16:25:20 +02:00
Sam Brannen 604eecaf67 Upgrade to JUnit 5.5.2
This commit also removes the testRuntime dependency on Hamcrest which
was a workaround for https://github.com/junit-team/junit5/issues/2004.

Closes gh-23604
2019-09-09 14:20:56 +02:00
Sebastien Deleuze 5bb8c47b14 Rename fromObject to fromValue in BodyInserters
Closes gh-23587
2019-09-09 00:08:55 +02:00
Sam Brannen 665e8aa51c Downgrade to JUnit 4.12
Since it does not appear that JUnit 4.13 will be released before Spring
Framework 5.2 GA, I am reverting back to JUnit 4.12 for the time being.

See gh-22894
2019-09-08 15:22:21 +02:00
Sam Brannen 683fe9ed70 Update comment
See gh-23604
2019-09-08 15:15:30 +02:00
康智冬 0d742cf3d0 Fix typos related to indefinite articles for SQL acronym
Closes gh-23603
2019-09-07 16:04:47 +02:00
Andy Wilkinson df7e4ad023 Tweak detection of Bamboo
When exposed as an environment variable Bamboo's bamboo.resultsUrl
is mapped to bamboo_resultsUrl. This commit updates the build scan
user data script to look for the latter rather than the former.

Closes gh-23597
2019-09-06 19:18:46 +02:00
Sam Brannen d817b591e5 Revert "Tweak detection of Bamboo (#23597)"
This reverts commit 35567678ef, reversing
changes made to 807e1d3367.
2019-09-06 19:16:59 +02:00
Sam Brannen 35567678ef Tweak detection of Bamboo (#23597)
When exposed as an environment variable Bamboo's bamboo.resultsUrl
is mapped to bamboo_resultsUrl. This commit updates the build scan
user data script to look for the latter rather than the former.
2019-09-06 17:18:10 +02:00
Sam Brannen 807e1d3367 Upgrade to Gradle 5.6.2
See gh-23479
2019-09-06 16:09:01 +02:00
Sam Brannen 5d5f9aceca Avoid accidental usage of JUnit 4 assumptions
This commit also avoids starting a server if an assumption fails.
2019-09-06 16:03:36 +02:00
Sam Brannen 591995ecc8 Polish and revive disabled tests
This commit revives some previously disabled tests and converts
some usage of @Disabled to @EnabledForTestGroups(...).
2019-09-06 15:57:27 +02:00
Andy Wilkinson fcda0fb8d9 Tweak detection of Bamboo
When exposed as an environment variable Bamboo's bamboo.resultsUrl
is mapped to bamboo_resultsUrl. This commit updates the build scan
user data script to look for the latter rather than the former.
2019-09-06 10:08:35 +01:00
Andy Wilkinson 35b967a801 Add opt-in build scan integration with Gradle Enterprise
This commit adds opt-in build scan integration with Gradle Enterprise.
When the GRADLE_ENTERPRISE_URL environment variable is set on a
developer's machine or on CI, a build scan will be automatically
uploaded to Gradle Enterprise at the end of the build.

This initial integration will establish a baseline for Spring
Framework builds. Once that baseline has been established we can use
the build scans to identify ways in which the build can be optimized
and updated to make use of Gradle's build caching which should reduce
build times, significantly so for changes that only affect tasks near
the leaf nodes of the task graph.
2019-09-05 15:16:59 +01:00
Sam Brannen 2b1ae4af60 Remove obsolete Checkstyle suppression entries 2019-09-05 15:54:55 +02:00
Sam Brannen 760f7bed03 Merge branch '5.1.x' 2019-09-05 15:18:43 +02:00
Sebastien Deleuze aa81fdc66f Upgrade to Kotlin Coroutines 1.3.1 2019-09-05 15:09:17 +02:00
Stephane Nicoll 9afe17a29b Fix static imports handling in IntelliJ IDEA configuration
Closes gh-23588
2019-09-05 14:35:54 +02:00
Sam Brannen 99d88ba14e Document minimum JDK 8 update version
Closes gh-23563
2019-09-05 14:04:43 +02:00
Sam Brannen ef50777535 Polishing 2019-09-05 13:45:38 +02:00
Sam Brannen d9e3b8b9a5 Introduce default constructor in TomcatHttpServer 2019-09-05 13:45:38 +02:00
Sebastien Deleuze 40a55b412d Rename BodyBuilder#bodyAndAwait to bodyValueAndAwait 2019-09-05 13:34:11 +02:00
Sam Brannen 73f5d05fd9 Avoid deprecation warning in RandomHandlerIntegrationTests 2019-09-05 13:29:01 +02:00
Sam Brannen c80705a708 Polishing 2019-09-05 13:20:20 +02:00
Sam Brannen ce178f76eb Add missing Temporal tests in BeanUtilsTests
This change will help to serve as a regression test.
2019-09-05 13:14:39 +02:00
Stephane Nicoll facdbdb7b6 Fix checkstyle violation 2019-09-05 09:18:43 +02:00
Phillip Webb 6fbd4841ec Update checkstyle import rule
Update the checkstyle rule to enforce the blank line between `java`
and `javax`.

Closes gh-23539
2019-09-04 22:06:46 -07:00
Phillip Webb deba2ed1b3 Add blank line between java and javax imports
See gh-23539
2019-09-04 22:05:46 -07:00
Phillip Webb 2f106fbb32 Polishing web socket test to use BDD Mockito 2019-09-04 22:05:13 -07:00
Rossen Stoyanchev bc81fa520e Reject range starting above resource length
Closes: gh-23576
2019-09-04 18:05:59 +01:00
Sebastien Deleuze 70bbe71235 Polishing
See gh-22915
2019-09-04 18:24:35 +02:00
Sebastien Deleuze ff271894fe Detect unsupported suspending handler methods in Spring MVC
closes gh-23585
2019-09-04 18:24:35 +02:00
Sam Brannen f54395b261 Polish BeanUtilsTests 2019-09-04 16:53:29 +02:00
Sam Brannen 803643559a Merge branch '5.1.x' 2019-09-04 16:24:44 +02:00
Brian Clozel 0c7359911a Re-enable StreamingSimpleClientHttpRequestFactoryTests
Since the okhttp3 3.14 downgrade, we don't need to ignore this test
anymore.
2019-09-04 16:02:43 +02:00
Brian Clozel cccd9c8bb0 Fix okhttp3 downgrade 2019-09-04 15:07:17 +02:00
Brian Clozel e83fec4ec3 Downgrade to okhttp3 3.14.2
The upgrade to 4.x was breaking some behavior in our tests.
We need to reconsider this upgrade and check our mockrestserver usage in
our tests.
2019-09-04 14:51:52 +02:00
Sam Brannen 00983a1141 Update @Disabled for StreamingSimpleClientHttpRequestFactoryTests.interceptor() 2019-09-04 14:37:37 +02:00
Sam Brannen 4d819128db Fix Javadoc 2019-09-04 14:33:02 +02:00
Sam Brannen 07d4104f2f Polishing 2019-09-04 14:12:44 +02:00
Rossen Stoyanchev 310f0bfb6c Remove unnecessary code from prior commit 2019-09-04 12:59:19 +01:00
Rossen Stoyanchev dfc7540106 Add generic type bounds to DataBufferUtils methods
Closes gh-23459
2019-09-04 12:14:32 +01:00
Juergen Hoeller 48934cba1b Polishing 2019-09-04 12:19:08 +02:00
Juergen Hoeller 3bc27e8d14 Streamline AnnotationFilter usage with the MergedAnnotations API
MergedAnnotations provides 'from' variants with RepeatableContainers but without AnnotationFilter argument now, avoiding the need to refer to AnnotationFilter.PLAIN as a default at call sites.
2019-09-04 12:18:49 +02:00
Rossen Stoyanchev c8f430ee91 Change package used to test path matching
The org.reactivestreams has 13 instead of 4 classes in 1.0.3 with the
addition of Java 9 Flow adapters. This commit switches to using a
different package reactor.util.annotation, also with a small number of
classes, for this test.
2019-09-04 10:37:57 +01:00
Rossen Stoyanchev 57d9b92b94 Upgrade Reactor to Dysprosium RC1
Closes: gh-23579
2019-09-04 08:55:45 +01:00
Juergen Hoeller f26866e4d4 Introduce getType variant with allowFactoryBeanInit flag
Closes gh-23374
2019-09-04 00:06:23 +02:00
Juergen Hoeller eb6577755d Stackless variant of NoTransactionException for reactive flows
Closes gh-23360
2019-09-04 00:02:24 +02:00
Sebastien Deleuze d587a660fc Fix a warning in Kotlin tests 2019-09-03 23:48:39 +02:00
Sebastien Deleuze 9b33b0ad58 Rename CoroutinesUtils#invokeHandlerMethod to invokeSuspendingFunction 2019-09-03 23:41:53 +02:00
Sebastien Deleuze 2b4eb610a7 Add support for Coroutines transactions
This commit adds Coroutines extensions for
TransactionalOperator.transactional that accept suspending lambda or
Kotlin Flow parameters.

@Transactional on suspending functions is not supported yet, gh-23575
has been created for that purpose.

Closes gh-22915
2019-09-03 23:41:42 +02:00
Sam Brannen aeb857c3ba Polish ClassUtilsTests
See gh-23572
2019-09-03 17:58:54 +02:00
Sam Brannen 4575f82c72 Simplify Gradle test task configuration 2019-09-03 17:08:45 +02:00
Sam Brannen 3c4cd99237 Reintroduce Hamcrest as a global test runtime dependency
Prior to this commit, tests in spring-web and spring-webflux were no
longer executed due to the removal of the Hamcrest dependency in
commit bb03cdf5d0.
2019-09-03 17:00:26 +02:00
Sam Brannen 1c5b949df0 Fix ViewResolutionResultHandlerTests
See gh-23572
2019-09-03 16:56:50 +02:00
Sam Brannen 513ce7824f Disable StreamingSimpleClientHttpRequestFactoryTests.interceptor() test 2019-09-03 16:43:48 +02:00
Brian Clozel 1b6814402c Publish Gradle metadata
This commit enables the publishing of Gradle metadata with Spring
Framework artifacts. This feature will be enabled by default with Gradle
6.0, so Spring Framework will consistently push this information in the
5.2.x generation.

Fixes gh-23503
2019-09-03 16:17:06 +02:00
Sebastien Deleuze f8516c69bf Add Kotlin code snippets to data access refdoc
See gh-21778
2019-09-03 16:03:41 +02:00
Sam Brannen 652db21d3e Ensure Hamcrest imports are properly banned 2019-09-03 16:01:30 +02:00
Arjen Poutsma 4c863f3f83 Revise documentation on using WebClient::exchange
This commit revised the paragraph regarding the need to consume or
release the ClientResponse body when using WebClient::exchange.

Closes gh-23498
2019-09-03 15:44:02 +02:00
Arjen Poutsma 37398c669c Add toBodilessEntity to ClientResponse and WebClient.ResponseSpec
See gh-23498
2019-09-03 15:44:02 +02:00
Arjen Poutsma f5640cbfe0 Add ClientResponse::releaseBody
See gh-23498
2019-09-03 15:44:02 +02:00
Sam Brannen bc869657c8 Partially revert 670cbb9aed
... but continue to execute `Abstract*Tests` classes.
2019-09-03 15:17:34 +02:00
Sam Brannen 23d5c6e3dc Do not scan for test classes in default test task 2019-09-03 14:36:32 +02:00
Sam Brannen c78960a1ba Merge branch '5.1.x' 2019-09-03 14:21:39 +02:00
Rossen Stoyanchev 32a585d100 Merge pull request #23485 2019-09-03 12:31:36 +01:00
Rossen Stoyanchev d927d31e13 Remove reflection from ContentDispositionTests
Also minor refactoring in decoding in order to tolerate the absence of
a charset and treat as US_ASCII.

See gh-23485
2019-09-03 12:31:13 +01:00
Rossen Stoyanchev c97580035e Polish ContentDispositionTests
Closes gh-23485
2019-09-03 12:31:13 +01:00
Jonathan Bluett-Duncan f084b63286 Fix "array index out of bounds" problem reported by LGTM.com 2019-09-03 12:31:13 +01:00
Sam Brannen 670cbb9aed Simplify Gradle test task configuration
As an added bonus, AbstractViewTests is now executed in the build.
2019-09-03 12:40:59 +02:00
Sam Brannen 280a1b8880 Make AbstractWebRequestMatcherTests abstract 2019-09-03 12:13:56 +02:00
Sam Brannen 2c44eabe41 Remove unnecessary dependency declarations in spring-test 2019-09-03 12:13:56 +02:00
Sam Brannen bb03cdf5d0 Remove global test dependency on Hamcrest
Hamcrest is now only used within spring-test for MockMvc support.
2019-09-03 12:13:56 +02:00
Sam Brannen bf758eab33 Fix assertion in HandlerMethodMappingTests.unregisterMapping() 2019-09-03 12:13:56 +02:00
Sam Brannen e79bda164e Polish build.gradle 2019-09-03 12:13:10 +02:00
Sam Brannen 5fd81d2a26 Avoid deprecation warning in AbstractMockWebServerTests
MockResponse.setHeaders(Headers) is now deprecated.
2019-09-03 12:13:09 +02:00
Brian Clozel 926c385800 Upgrade to AssertJ 3.13.2 2019-09-02 20:09:14 +02:00
Brian Clozel 47f39965bf Upgrade to Tomcat 9.0.24 2019-09-02 20:09:14 +02:00
Brian Clozel 78c5c7aa9c Upgrade to Log4J 2.12.1 2019-09-02 20:09:14 +02:00
Brian Clozel 859450cf68 Upgrade to Joda time 2.10.3 2019-09-02 20:09:14 +02:00
Brian Clozel a986be3e32 Upgrade to ehcache 2.10.6 2019-09-02 20:09:14 +02:00
Brian Clozel 1b6440c2c1 Upgrade to Caffeine 2.8.0 2019-09-02 20:09:14 +02:00
Brian Clozel e60d48daae Upgrade to hessian 4.0.62 2019-09-02 20:09:14 +02:00
Brian Clozel 829e9f5d92 Upgrade to okhttp3 4.1.0 2019-09-02 20:09:14 +02:00
Brian Clozel 3ec2a222ad Upgrade to Aalto 1.2.1 2019-09-02 20:09:13 +02:00
Brian Clozel b5f933a21b Upgrade to Undertow 2.0.26.Final 2019-09-02 20:09:13 +02:00
Brian Clozel b9089d2a90 Upgrade to RxJava2 2.2.12 2019-09-02 20:09:13 +02:00
Brian Clozel d56ffd1a61 Upgrade to Netty 4.1.39.Final 2019-09-02 20:09:13 +02:00
Brian Clozel be93d37330 Fix missing findbugs dependency for Dokka task 2019-09-02 20:09:13 +02:00
Brian Clozel d4089747b8 Use dependency management in Framework build
Prior to this commit, the Spring Framework build would partially use the
dependency management plugin to import and enforce BOMs.

This commit applies the dependency management plugin to all Java
projects and regroups all version management declaration in the root
`build.gradle` file (versions and exclusions).

Some versions are overridden in specific modules for
backwards-compatibility reasons or extended support.

This commit also adds the Gradle versions plugin that checks for
dependency upgrades in artifact repositories and produces a report; you
can use the following:

    ./gradlew dependencyUpdates
2019-09-02 18:01:09 +02:00
Sebastien Deleuze c13941821a Treat Kotlin warnings as errors
Closes gh-23566
2019-09-02 16:49:31 +02:00
Sebastien Deleuze a2e740c896 Polishing 2019-09-02 16:37:42 +02:00
Sebastien Deleuze ca02cc1194 Migrate to AssertJ in Kotlin tests
Closes gh-23475
2019-09-02 15:59:26 +02:00
Arjen Poutsma 3fcf4233a2 Merge branch '5.1.x' 2019-09-02 15:19:30 +02:00
Rossen Stoyanchev 58e9266e99 Add Consumer methods to RSocketRequester
Closes gh-23513
2019-09-02 13:31:28 +01:00
Rossen Stoyanchev b144c72937 Support ByteBuf as a metadata value
This allows encoding of metadata values externally via some
existing API for encoding RSocket metadata, rather than relying on
registered Encoders.

Also remove explicit checks for DataBuffer since those are supported
through the DataBufferEncoder (registered by default).

See gh-23513
2019-09-02 13:31:28 +01:00
Rossen Stoyanchev 71f3498a26 Switch to using RoutingMetadata API
Closes gh-23137
2019-09-02 13:31:28 +01:00
Arjen Poutsma 702dad6cec Fix ConcurrentModificationException 2019-09-02 12:42:21 +02:00
Sam Brannen 0f4dcb52ca Polishing 2019-09-02 12:34:06 +02:00
Rossen Stoyanchev 2c20b2b663 Upgrade to RSocket 1.0.0-RC3
Closes gh-23543
2019-09-02 09:46:08 +01:00
康智冬 a6f4862f13 Fix typos related to indefinite articles
Closes gh-23555
2019-09-01 15:45:49 +02:00
Sam Brannen f05f993cc6 Fix formatting in Testing chapter in Reference Manual 2019-08-31 15:07:12 +02:00
Sam Brannen 794e2e328d Polish Testing chapter in Reference Manual 2019-08-31 14:47:49 +02:00
Sam Brannen 0103fec5de Convert assertions to AssertJ
See gh-23551
2019-08-31 13:13:44 +02:00
Sam Brannen 5a22eafcb4 Merge branch '5.1.x' 2019-08-31 13:10:58 +02:00
Sebastien Deleuze 57f0c2b7df Remove bodyWithType extension from WebTestClient
Since there is no more clash with the new bodyValue
method name.

See gh-23523
2019-08-31 11:40:44 +02:00
Sebastien Deleuze 3dfd0a24dc Add Kotlin code snippets to WebTestClient testing refdoc
Closes gh-21778
2019-08-31 11:36:57 +02:00
Udo Kohlmeyer b20a8c9d98 Add Kotlin code snippets to testing refdoc
See gh-21778
2019-08-31 11:31:03 +02:00
Sam Brannen ab779eb431 Preserve placeholders in @TestPropertySource locations
Prior to this commit, it was impossible to include a placeholder (i.e.,
${placeholder.name}) in a Properties file location configured via
@TestPropertySource if the placeholder was immediately followed by a
relative path (i.e., "../"). This was due to the fact that the location
was always cleaned using StringUtils.cleanPath(), which removed the
placeholder and the relative path syntax.

This commit fixes this by preserving all placeholders in
@TestPropertySource locations by simply not cleaning the locations if
they contain placeholders.

Closes gh-23544
2019-08-30 18:57:20 +02:00
Sam Brannen 9fa9a09007 Polishing 2019-08-30 18:56:03 +02:00
Sam Brannen 22494ba231 Ensure @ContextConfiguration & @TestPropertySource locations are cleaned
This commit ensures that locations to resources configured via
@ContextConfiguration & @TestPropertySource are consistently cleaned
using StringUtils.clean().

See gh-23544
2019-08-30 17:55:13 +02:00
Sam Brannen ff1f8aa5a8 Add missing parentheses in Testing chapter 2019-08-30 17:19:46 +02:00
Sam Brannen 489193dfa6 Add missing parentheses in Testing chapter 2019-08-30 17:12:23 +02:00
Sam Brannen 793f9e3d29 Ensure SpringExtensionContextCacheTests are robust
... by explicitly ordering the test methods.
2019-08-30 16:22:54 +02:00
Sam Brannen 1ea6ce72bb Test status quo for relative paths & placeholders in @TestPropertySource
This commit introduces a collection of @Nested integration tests that
verify proper support for @TestPropertySource with explicit properties
files declared with absolute paths, relative paths, and placeholders in
the classpath and in the file system.

See gh-23544
2019-08-30 15:51:45 +02:00
Sam Brannen 7738e778fa Polishing 2019-08-30 15:51:44 +02:00
Arjen Poutsma 67d48ed821 Merge branch '5.1.x' 2019-08-29 17:18:22 +02:00
Rossen Stoyanchev 8d86a861a1 Merge branch '5.1.x' 2019-08-29 15:53:17 +03:00
Rossen Stoyanchev 48233317b8 Minor polish in DispatcherServlet
See gh-23541
2019-08-29 15:38:38 +03:00
Rossen Stoyanchev 117119a88d Merge branch '5.1.x' 2019-08-29 15:13:36 +03:00
OLPMO ed64a10c38 Use Collections.addAll where feasible
Closes gh-23478
2019-08-29 13:59:14 +02:00
Sebastien Deleuze 72e92da2ad Make SpEL rootObject parameter nullable
Closes gh-23442
2019-08-29 11:02:31 +02:00
Sebastien Deleuze f65cc9a438 Remove explicit disabling of buffer recycling in Jackson codec
Since now https://github.com/FasterXML/jackson-core/issues/476
and https://github.com/FasterXML/jackson-core/issues/479 are fixed.

This commit also raises the minimum version of Jackson to 2.9.7.

Closes gh-23522
2019-08-28 18:47:21 +02:00
Sam Brannen c004ef888c Configure index in @ParameterizedTest display names
This commit prepends "[{index}] " to all custom display names
configured via @ParameterizedTest.

This provides better diagnostics between the "technical names" reported
on the CI server vs. the "display names" reported within a developer's
IDE.

See gh-23451
2019-08-28 17:06:23 +02:00
Sam Brannen b173a93e72 Verify PathMatchingResourcePatternResolver finds local files with # in name
This commit introduces a test that verifies that
PathMatchingResourcePatternResolver can find files in the filesystem
that contain hashtags (#) in their names.

See gh-23532
2019-08-28 16:21:07 +02:00
Sam Brannen 5af4d22044 Upgrade to Gradle 5.6.1
See gh-23479
2019-08-28 14:53:44 +02:00
Stephane Nicoll 5a28fdc540 Revert "Stop using libs-release"
This reverts commit e5b957167a.

See gh-23124
2019-08-28 14:52:29 +02:00
Stephane Nicoll 46b3a8335f Stop using mavenLocal()
This commit makes sure the content of the local maven repository has no
impact on the build

See gh-23124
2019-08-28 14:18:06 +02:00
Stephane Nicoll e5b957167a Stop using libs-release
This commit makes sure we narrow down dependencies of the Spring
Framework to only Maven central. Optional dependencies that are not
available on Maven Central are now served from a more specific
repository (`ext-release-local`).

Closes gh-23124
2019-08-28 14:17:57 +02:00
Sebastien Deleuze d53cbb6de4 Upgrade to Kotlin 1.3.50
Closes gh-23536
2019-08-28 13:33:50 +02:00
Sebastien Deleuze 77da40f006 Upgrade to Coroutines 1.3.0
Closes gh-23535
2019-08-28 13:30:40 +02:00
Sebastien Deleuze 52976246ac Remove bodyWithType extension from WebFlux
Since there is no more clash with the new bodyValue
method name.

Closes gh-23523
2019-08-28 13:30:16 +02:00
Sebastien Deleuze 14558844bc Add Kotlin code snippets to WebFlux refdoc
See gh-21778
2019-08-28 11:18:43 +02:00
Brian Clozel 5b4ad8bf36 Merge branch '5.1.x' 2019-08-27 22:30:07 +02:00
Rossen Stoyanchev 4e39450dbe Merge branch '5.1.x' 2019-08-27 21:49:51 +03:00
Sam Brannen 46a37b447c Fix copyright dates
See gh-23393
2019-08-27 19:30:05 +02:00
stsypanov 78d56dc61b Use Arrays.copyOf and Arrays.copyOfRange where possible
Closes gh-23393
2019-08-27 19:18:39 +02:00
Sam Brannen 216ffcfe62 Fix copyright dates 2019-08-27 18:28:31 +02:00
Сергей Цыпанов 6ef75d76cd Simplify String concatenation
Closes gh-23470
2019-08-27 18:22:44 +02:00
Sam Brannen aef67ea6bd Polishing 2019-08-27 17:42:00 +02:00
Sam Brannen b2ad16aaa7 Merge branch '5.1.x' 2019-08-27 17:37:25 +02:00
Sam Brannen 1ec9721617 Fix @since tags in ScopedProxyUtils[Tests]
See gh-23514
2019-08-27 16:01:50 +02:00
Sam Brannen 686f30a378 Merge branch '5.1.x' 2019-08-27 15:49:20 +02:00
Sam Brannen f8f3067419 Polishing 2019-08-27 12:27:18 +02:00
Sam Brannen d357ef706f Delete unused imports
See gh-23458
2019-08-27 12:24:44 +02:00
Rossen Stoyanchev 29a58ab045 Remove RSocket metadata MimeType constants
For public use, these constants aren't ideally exposed through an SPI
like MetadataExtractor, and there isn't any other obvious place either.
In practice the only public API where these can be passed in is
RSocketRequester and RSocketMessageHandler both of which already
default to composite metadata anyway, leaving only the routing MimeType
to be used potentially but much less likely.
Due to existence of similar constants in the RSocket itself, i.e.
WellKnownMimeType, we can get by internally too without declaring
MimeType constants from a central place.
2019-08-27 13:04:58 +03:00
Rossen Stoyanchev 45d0405624 Upgrade to RSocket 1.0 RC3 snapshots and...
take advantage of the symmetrical SocketAcceptor methods now available
on RSocketFactory for both client and server side.
2019-08-27 13:04:58 +03:00
lijuny a0d50a546b Polish tests in spring-aop
This commit polishes tests in spring-aop by using
OrderComparator.sort() and lambda expressions instead of anonymous
classes where feasible.

Closes gh-23458
2019-08-27 12:01:30 +02:00
Sam Brannen c6a4898ac5 Add "Participate in Reviews" section 2019-08-26 17:45:01 +02:00
Johnny Lim 6c2ef481ec Add @since tags for getCacheFilter and setCacheFilter
Closes gh-23519
2019-08-26 15:26:32 +02:00
Sam Brannen 4cd635e9c8 Avoid repeated instantiation of AutowiredArgumentMarker
Prior to this commit, the AutowiredArgumentMarker type was repeatedly
instantiated in ConstructorResolver.

This commit replaces the AutowiredArgumentMarker type with a simple
Object instance.

Closes gh-23469
2019-08-25 22:42:41 +02:00
Sam Brannen 5105b74f6e Add missing @Nullable declaration
See gh-23514
2019-08-25 15:15:48 +02:00
Sam Brannen 9be6aa64ef Introduce getOriginalBeanName(String) in ScopedProxyUtils
This commit introduces a utility method for retrieving the original
bean name for the target of a scoped proxy.

Closes gh-23514
2019-08-25 15:13:53 +02:00
Brian Clozel dda047623d Fix "missing aspectjrt.jar" warnings in spring-aspects
See gh-23506
2019-08-23 17:05:31 +02:00
Brian Clozel 84f9c150de Move Gradle plugin repos declaration to settings
See gh-23282
2019-08-23 17:05:31 +02:00
Sam Brannen bfbe84d1c6 Apply fudge factor on both ends of the spectrum in StopWatchTests
This is an attempt to solve a build issue on Microsoft Windows.

See gh-23507
2019-08-23 16:50:27 +02:00
Sam Brannen ac760c8d4b Polish Javadoc for ReflectionTestUtils
Closes gh-23504
2019-08-23 16:38:35 +02:00
Sam Brannen 5ce75f3d08 Support static methods with ReflectionTestUtils.invokeMethod()
Prior to this commit, the invokeMethod() utility method in
ReflectionTestUtils only supported instance methods.

This commit brings the invokeMethod() support on par with the getField()
support by supporting the invocation of static methods via two new
invokeMethod() variants.

Closes gh-23504
2019-08-23 16:27:27 +02:00
Sam Brannen d4360db497 Polish ReflectionTestUtilsTests 2019-08-23 15:03:41 +02:00
Brian Clozel 50decc43ce Fix aspectj dependency in spring-aspects
See gh-23506
2019-08-23 14:47:39 +02:00
Sam Brannen ad6231ad29 Add missing @Override annotations 2019-08-23 13:50:58 +02:00
Sam Brannen 0b63db26b7 Reinstate AbstractBeanFactoryTests.typeMismatch() test 2019-08-23 13:50:57 +02:00
Sam Brannen a07ce8eb82 Polishing 2019-08-23 13:50:57 +02:00
Sam Brannen 3e2b977d5d Re-enable shadowed, overridden @Test and lifecycle methods
Due to a bug (or "unintentional feature") in JUnit 4, overridden test
and lifecycle methods not annotated with @Test, @Before, @After, etc.
are still executed as test methods and lifecycle methods; however,
JUnit Jupiter does not support that. Thus, prior to this commit, some
overridden test and lifecycle methods were no longer executed after the
migration from JUnit 4 to JUnit Jupiter.

This commit addresses this issue for such known use cases, but there
are likely other such use cases within Spring's test suite.

See gh-23451
2019-08-23 13:50:57 +02:00
Sam Brannen 05c270d916 Ensure TransactionalSqlScriptsSpringRuleTests is purely JUnit 4 2019-08-23 13:50:33 +02:00
Sam Brannen 742cb90d34 Delete obsolete abstract test classes 2019-08-23 13:49:35 +02:00
Brian Clozel b96cbb4e65 Close streams in tests
This commit ensures that file streams are properly closed in tests.
This seems to cause issues on Windows as the OS cannot delete temp
folders.

This is similar to spring-io/initializr#862

See gh-23507
2019-08-23 12:56:47 +02:00
Arjen Poutsma 8e4f2c89ff Add headers(Consumer<HttpHeaders>) to RequestEntity and ResponseEntity
Closes gh-23404
2019-08-23 11:23:26 +02:00
Lars Grefer fbee3ed889 Use the 'io.freefair.aspectj' Gradle plugin
See gh-23282
See spring-projects/spring-security#7183
Closes gh-23506
2019-08-23 10:57:10 +02:00
Sebastien Deleuze 0d3fb0ee0f Add Kotlin code snippets to WebMvc refdoc
See gh-21778
2019-08-22 16:58:00 +02:00
Brian Clozel 7cfae94d70 Use resolved dependency versions for published POMs
This commit ensures that Gradle publications are using resolved
dependency versions for Maven publications (i.e. POMs). This is useful
since we're using the Spring dependency management plugin and we can't
rely on declared dependency versions only.

See gh-23282
2019-08-22 16:11:09 +02:00
Rossen Stoyanchev 1d2ebdeb8c More optimal RequestMethod condition lookup
See gh-22644
2019-08-22 13:39:20 +03:00
Brian Clozel 86c734785d Apply Artifactory Gradle plugin
Instead of relying on the CI server to apply and configure this plugin,
this commit does it directly in the Spring Framework build.
This allows us to take full control over which projects are published
and how.

See gh-23282
2019-08-21 20:15:35 +02:00
Brian Clozel 7902ae4c1f Change Gradle publication name for artifactory
This commit switches to the default publication name considered by the
artifactory plugin when it comes to publishing artifacts to the
artifactory repository.

See gh-23282
2019-08-21 18:42:17 +02:00
Sam Brannen 53f523001e Focus examples in Testing chapter on JUnit Jupiter 2019-08-21 15:56:15 +02:00
Sam Brannen 3dc4d01b53 Fix heading for Streaming Responses section of Testing chapter 2019-08-21 15:56:15 +02:00
Brian Clozel 7ce1f5e652 Configure Maven publications with Gradle
Prior to this commit, the build would use a custom task to create a BOM
and manually include/exclude/customize dependencies. It would also use
the "maven" plugin to customize the POM before publication.

This commit now uses a Gradle Java Platform for publishing the Spring
Framework BOM. We're also now using the "maven-publish" plugin to
prepare and customize publications.

This commit also tells the artifactory plugin (which is currently
applied only on the CI) not to publish internal modules.

See gh-23282
2019-08-21 15:39:51 +02:00
Brian Clozel 03701018c6 Cache "spring-doc-resources" archive between builds
This commit configures the Gradle Download plugin that's used a build
step when generating the reference documentation. Here we're making sure
that the task is caching and reusing the resource if it's been
downloaded already.

See gh-23282
2019-08-21 15:38:16 +02:00
Brian Clozel e45a3f4738 Rename non-Framework project modules
Prior to this commit, the Spring Framework build would mix proper
framework modules (spring-* modules published to maven central) and
internal modules such as:
* "spring-framework-bom" (which publishes the Framework BOM with all
modules)
* "spring-core-coroutines" which is an internal modules for Kotlin
compilation only

This commit renames these modules so that they don't start with
"spring-*"; we're also moving the "kotlin-coroutines" module under
"spring-core", since it's merged in the resulting JAR.

See gh-23282
2019-08-21 14:32:25 +02:00
Sam Brannen 6ce5f9da06 Fix unmatched parentheses in @ContextHierarchy example in reference manual
See gh-23487
2019-08-21 14:18:21 +02:00
John Lin 74de495574 Fix unmatched parentheses in @ContextHierarchy Javadoc
Closes gh-23487
2019-08-21 13:53:32 +02:00
Rossen Stoyanchev 274eab7c5d Merge branch '5.1.x' 2019-08-21 13:36:11 +03:00
Rossen Stoyanchev 78abc27432 Remove statusCode state tracking
Closes gh-23490
2019-08-21 11:45:56 +03:00
Rossen Stoyanchev e1158ad5cb Merge pull request #23493 2019-08-21 11:21:36 +03:00
Rossen Stoyanchev aa220a9a02 Polish 2019-08-21 11:20:37 +03:00
Rob Winch ca3a0b19d6 DefaultWebClientBuilder defaults using classpath
Previously DefaultWebClientBuilder always defaulted the ClientHttpConnector
with ReactorClientHttpConnector. This worked fine if reactor was used.
However, it would break if the user was trying to leverage Jetty.

This commit defaults to use Reactory Netty HttpClient if it is present. If
it is not present it then Jetty's HttpClient  is used if present.

Closes gh-23491
2019-08-21 11:04:14 +03:00
Rossen Stoyanchev 0a7fdb380f Fix checkstyle error 2019-08-21 11:02:10 +03:00
Rossen Stoyanchev ff6ccd0d04 Adapt tests changed in 5.1.x to master 2019-08-21 10:24:46 +03:00
Rossen Stoyanchev 364c7c459d Merge branch '5.1.x' 2019-08-21 10:21:32 +03:00
Brian Clozel b3aebf9e9b Download docs resources as zip file in asciidoc build
Prior to this commit, the reference documentation build with asciidoctor
would get the common "spring-docs-resources" as a dependency and then
use it when generating the docs.

As seen in #23124, this can cause problems since we'd like to
consistently resolve our dependencies. In this case, the
"spring-doc-resources" archive is not published on maven central since
it's not officially supported by the Spring team as an open source
project.

This commit updates the reference documentation build to get this
archive as a simple download task and avoid resolving it as a
dependency.

See gh-23282
2019-08-20 23:36:59 +02:00
Sam Brannen 5053df55b6 Add LICENSE.txt file
Closes gh-23492
2019-08-20 22:01:12 +02:00
Brian Clozel 4a3e2484ac Ignore spring-framework-bom project in global config
This commit ensures that the spring-framework-bom project is ignored
from the global configuration block. If not, many conventions and
dependencies are added to it and add noise to the published BOM.

See gh-23282
2019-08-20 20:33:10 +02:00
Brian Clozel e9523161f0 Revert "Revert "Refactor Gradle tasks in Spring Framework build""
This reverts commit fb0d618751.
2019-08-20 20:26:43 +02:00
Stephane Nicoll fb0d618751 Revert "Refactor Gradle tasks in Spring Framework build"
This reverts commit 1539ba8991.
2019-08-20 20:07:11 +02:00
Brian Clozel 1539ba8991 Refactor Gradle tasks in Spring Framework build
This commit reorganizes tasks and scripts in the build to only apply
them where they're needed. We're considering here 3 "types" of projects
in our build:
* the root project, handling documentation, publishing, etc
* framework modules (a project that's published as a spring artifact)
* internal modules, such as the BOM, our coroutines support and our
integration-tests

With this change, we're strealining the project configuration for all
spring modules and only applying plugins when needed (typically our
kotlin support).

See gh-23282
2019-08-20 18:17:02 +02:00
Sam Brannen aa6e762dcf Re-enable shadowed, overridden @Test methods
Due to a bug (or "unintentional feature") in JUnit 4, overridden test
methods not annotated with @Test are still executed as test methods;
however, JUnit Jupiter does not support that. Thus, prior to this
commit, some overridden test methods in spring-core were no longer
executed after the migration from JUnit 4 to JUnit Jupiter.

This commit addresses this issue for such known use cases, but there
are likely other such use cases within Spring's test suite.

See gh-23451
2019-08-20 15:30:32 +02:00
Sam Brannen fab96cad67 Use default visibility for test classes and methods in spring-core
See gh-23451
2019-08-20 15:30:24 +02:00
Sam Brannen cf1bf3d98c Polish parameterized tests 2019-08-20 12:43:31 +02:00
Sam Brannen 617863ae4b Polish WebSocket integration tests 2019-08-20 12:43:31 +02:00
Sam Brannen 91560d51ac Polish AbstractWebSocketIntegrationTests 2019-08-20 12:43:30 +02:00
Rossen Stoyanchev 26dc93d0f6 Polish body methods
WebClient, WebTestClient, and ServerResponse
2019-08-20 10:27:06 +03:00
Rossen Stoyanchev b75674f5e9 Polish method order 2019-08-20 10:27:05 +03:00
Rossen Stoyanchev 008687d5ae Rename body(Object) to bodyValue
The recently added body(Object) variant can be confused easily with
body(Publisher, Class) forgetting to provide the element type and
only running into the IllegalArgumentException at runtime.

See gh-23212
2019-08-20 10:27:05 +03:00
Rossen Stoyanchev 5cfe491602 Polish AbstractWebSocketIntegrationTests 2019-08-20 03:03:58 +03:00
Sam Brannen 4386bf05de Delete obsolete interface 2019-08-19 15:35:02 +02:00
Sam Brannen 74ccfe3533 Polish Spring's internal TestGroup support 2019-08-19 15:21:16 +02:00
Sam Brannen 3fa4d63807 Polish tests in integration-tests 2019-08-19 14:37:27 +02:00
Brian Clozel 998f6af290 Move integration tests to dedicated module
This commit moves the dependency management and test source files
related to integration tests to a dedicated module.
This allows us to focus the root project on building the Spring
Framework.

See gh-23282
2019-08-19 10:55:44 +02:00
Brian Clozel 6008c61680 Use JApiCmp Gradle plugin for API diffs
This commit removes JDiff from the Spring Framework build and instead,
adds a Gradle plugin that configure JApiCmp tasks on the framework
modules.

Fixes gh-22942
See gh-23282
2019-08-19 10:21:55 +02:00
Sebastien Deleuze 4d10249b70 Update to Coroutine 1.3.0-RC2
This updates brings full interoperability between Reactor and
Coroutines contexts.

Closes gh-22986
2019-08-19 10:03:01 +02:00
Sam Brannen 19ed439e4b Avoid Hamcrest 2.x deprecation warnings
See gh-23467
2019-08-18 09:30:50 +02:00
Stephane Nicoll dce8036757 Merge pull request #23480 from boojongmin
* pr/23480:
  Fix typo

Closes gh-23480
2019-08-18 08:10:18 +02:00
부종민 18eed79d73 Fix typo
See gh-23480
2019-08-18 08:09:56 +02:00
Sam Brannen 063233afb5 Upgrade to Gradle 5.6
Closes gh-23479
2019-08-17 19:20:36 +02:00
Sam Brannen ceaf6f46ac Remove test dependencies from spring-build-src
The spring-build-src module does not contain any tests. Thus, we do not
need any test dependencies.
2019-08-17 18:56:11 +02:00
Sam Brannen 303fc3211c Upgrade to Hamcrest 2.1
Closes gh-23467
2019-08-17 18:44:54 +02:00
Phillip Webb f8a93ee4a7 Add SpringJUnit5 checkstyle rule
Add `SpringJUnit5` checkstyle rule to ensure that JUnit 4 annotations
aren't accidentally used in new tests.

The "must not be public" rule has been suppressed since there are
quite a few tests that extend base tests from other packages.
2019-08-17 08:31:23 -07:00
Phillip Webb 0db2f8fbcf Upgrade to spring-javaformat-checkstyle v0.0.15 2019-08-17 07:27:22 -07:00
Andrey Kolchanov 6937d95e69 Remove unnecessary semicolon in AnnotatedElementUtils
Closes gh-23477
2019-08-17 15:07:39 +02:00
Sam Brannen 31cde12540 Fix off-by-one error in AbstractWebSocketIntegrationTests.arguments()
Prior to this commit, the "reactive matrix" contained a duplicate
argument set per parameterized client.
2019-08-17 14:47:25 +02:00
Sam Brannen 288461a541 Introduce @EnabledForTestGroups in Spring's test suite
Closes gh-23476
2019-08-17 14:47:24 +02:00
Sam Brannen bbe33832cf Clean up warnings in Javadoc 2019-08-17 13:21:28 +02:00
Sam Brannen 504d2a41f1 Polish ScheduledAndTransactionalAnnotationIntegrationTests 2019-08-17 13:12:17 +02:00
Sam Brannen 163b97f1ff Polish MockMvcWebClientBuilderTests
Inspired by the fact that example.com is currently not reachable from
my network.
2019-08-17 12:36:45 +02:00
Sam Brannen 3877087f5a Migrate test suite from JUnit 4 to JUnit Jupiter
Closes gh-23451
2019-08-17 12:07:17 +02:00
Sam Brannen 5c1f93d9a6 Migrate spring-test test suite from JUnit 4 to JUnit Jupiter
This commit migrates the spring-test test suite from JUnit 4 to JUnit
Jupiter where applicable.

Tests specific to our JUnit 4 and TestNG support remain written using
those frameworks. In addition, some tests are still written in JUnit 4
if they extend a test class that should not be migrated to JUnit
Jupiter.

See gh-23451
2019-08-17 11:37:33 +02:00
Sam Brannen 979508a7f3 Remove JUnit 4 dependency from all modules except spring-test
This commit removes the JUnit 4 dependency from all modules except
spring-test which provides explicit JUnit 4 support.

This commit also includes the following.

- migration from JUnit 4 assertions to JUnit Jupiter assertions in all
  Kotlin tests
- migration from JUnit 4 assumptions in Spring's TestGroup support to
  JUnit Jupiter assumptions, based on org.opentest4j.TestAbortedException
- introduction of a new TestGroups utility class than can be used from
  existing JUnit 4 tests in the spring-test module in order to perform
  assumptions using JUnit 4's Assume class

See gh-23451
2019-08-17 11:37:21 +02:00
Sam Brannen 3f3e41923f Migrate rest of test suite from JUnit 4 to JUnit Jupiter
This commit migrates the rest of Spring's test suite to JUnit Jupiter,
except spring-test which will be migrated in a separate commit.

See gh-23451
2019-08-17 11:36:58 +02:00
Sam Brannen 3df85c783f Migrate parameterized tests in spring-core
This commit migrates parameterized tests in spring-core using the
"composed @ParameterizedTest" approach. This approach is reused in
follow-up commits for the migration of the remaining modules.

For a concrete example, see AbstractDataBufferAllocatingTests and its
subclasses (e.g., DataBufferTests).

Specifically, AbstractDataBufferAllocatingTests declares a custom
@ParameterizedDataBufferAllocatingTest annotation that is
meta-annotated with @ParameterizedTest and
@MethodSource("org.springframework.core.io.buffer.AbstractDataBufferAllocatingTests#dataBufferFactories()").

Individual methods in concrete subclasses are then annotated with
@ParameterizedDataBufferAllocatingTest instead of @ParameterizedTest or
@Test.

The approach makes the migration from JUnit 4 to JUnit Jupiter rather
straightforward; however, there is one major downside. The arguments
for a @ParameterizedTest test method can only be accessed by the test
method itself. It is not possible to access them in an @BeforeEach
method (see https://github.com/junit-team/junit5/issues/944).
Consequently, we are forced to declare the parameters in each such
method and delegate to a custom "setup" method. Although this is a bit
cumbersome, I feel it is currently the best way to achieve fine grained
parameterized tests within our test suite without implementing a custom
TestTemplateInvocationContextProvider for each specific use case.

Once https://github.com/junit-team/junit5/issues/878 is resolved, we
should consider migrating to parameterized test classes.

See gh-23451
2019-08-17 11:36:47 +02:00
Sam Brannen 32cc32f9a7 Migrate test suite from JUnit 4 to JUnit Jupiter
This first commit for this issue:

- allows JUnit Jupiter to be used for all tests
- adds a dependency on mockito-junit-jupiter
- migrates tests in spring-core to JUnit Jupiter, except parameterized
  tests

The following script was developed in order to semi-automate the
migration process.

https://github.com/sbrannen/junit-converters/blob/master/junit4ToJUnitJupiter.zsh

See gh-23451
2019-08-17 11:36:25 +02:00
Brian Clozel bb8fd1c6bd Fix javax.jms Gradle configuration in spring-jms
See gh-23282
2019-08-16 16:30:45 +02:00
Brian Clozel b4c0537fa5 Remove unused Gradle configuration
This commit removes unused parts of the Gradle build:
* Gradle wrapper customization which should not be needed in recent
versions of Gradle (or can be replaced with options in the
gradle.properties file)
* the branch strategy configuration

See gh-23282
2019-08-16 08:27:23 +02:00
Brian Clozel 2f61c89f09 Polish Gradle compile convention
See gh-23282
2019-08-16 08:25:52 +02:00
Brian Clozel 71ddb861bd Move compile config to a Gradle convention
This commit moves the compile configuration from the Gradle DSL to a
convention. This configuration is not changing often, and we're using
that opportunity to make the Java source compatibility a project
property so as to easily recent JDKs this on the command line.

See gh-23282
2019-08-15 13:31:06 +02:00
Sebastien Deleuze 76645644b1 Polishing
See gh-21778
2019-08-14 10:06:04 +02:00
Sebastien Deleuze db02d38c89 Restore annotated code samples
See gh-21778
2019-08-14 10:00:16 +02:00
Sebastien Deleuze ec740559ed Store refdoc preferred language
See gh-21778
2019-08-14 10:00:16 +02:00
Juergen Hoeller 9bd3a535cd Avoid UndeclaredThrowableStrategy with 1.8 bytecode level (CGLIB 3.3)
ClassLoaderAwareUndeclaredThrowableStrategy fails with a VerifyError on recent JDKs after the CGLIB 3.3 upgrade. The alternative is to replace it with a plain ClassLoaderAwareGeneratorStrategy (extracted from CglibSubclassingInstantiationStrategy) and custom UndeclaredThrowableException handling in CglibMethodInvocation.

See gh-23453
2019-08-14 00:14:14 +02:00
Brian Clozel 561af5f8f9 Replace propdeps plugin with custom plugin
Prior to this commit, the Spring Framework build would be using the
propdeps Gradle plugin to introduce two new configurations to the build:
"optional" and "provided". This would also configure related conventions
for IDEs, adding those configurations to published POMs.

This commit removes the need for this plugin and creates instead a
custom plugin for an "optional" configuration. While the Eclipse IDE
support is still supported, there is no need for specific conventions
for IntelliJ IDEA anymore.
This new plugin does not introduce the "provided" scope, as
"compileOnly" and "testCompileOnly" are here for that.

Also as of this commit, optional/provided dependencies are not published
with the Spring Framework modules POMs annymore.
Generally, these dependencies do not provide actionable information to
the developers reading / tools consuming the published POMs.

Optional/Provided dependencies are **not**:
* dependencies you can add to enable some supported feature
* dependencies versions that you can use to figure out CVEs or bugs
* dependencies that might be missing in existing Spring applications

In the context of Spring Framework, optional dependencies are just
libraries are Spring is compiling against for various technical reasons.
With that in mind, we are not publishing that information anymore.

See gh-23282
2019-08-13 18:19:37 +02:00
Sebastien Deleuze eff9cae314 Add global language switch capabilities to the refdoc
See gh-21778
2019-08-13 16:29:47 +02:00
Sebastien Deleuze 32a942fda9 Polishing 2019-08-13 16:29:47 +02:00
Sebastien Deleuze a2b8ea5173 Remove the black border from code samples
See gh-21778
2019-08-13 16:29:47 +02:00
Brian Clozel 4e5c780b99 Move TestSourcesPlugin to a Java Gradle plugin
This commit moves the existing "test sources" Gradle plugin from Groovy
to Java and updates the "buildSrc" build file to prepare for additional
plugins in the Spring Framework build.

The plugin itself looks, for a given Spring Framework module, at all the
project dependencies for the following scopes: "compile", "testCompile",
"api", "implementation" and "optional" (to be supported by a different
plugin).

See gh-23282
2019-08-13 16:23:59 +02:00
Sam Brannen e7e5cce735 Polish contribution
See gh-23457
2019-08-13 10:36:46 +02:00
Sauhard Sharma 91c0fbaadb Use valid example in Javadoc for @EnableWebFlux
This commit modifies the class-level Javadoc for the @EnableWebFlux
annotation to reference an actual method in WebFluxConfigurer.

Closes gh-23457
2019-08-13 10:27:29 +02:00
Lars Grefer c863b8994a Improve language-switch CSS
Closes gh-23454
2019-08-13 09:42:08 +02:00
Sebastien Deleuze b52a50a7e0 Use Kotlin extensions for ClassPathXmlApplicationContext refdoc
Closes gh-23456
2019-08-13 09:42:08 +02:00
Juergen Hoeller 4123910d3d Upgrade to CGLIB 3.3
Closes gh-23453
2019-08-12 19:36:06 +02:00
Sebastien Deleuze f3c7879831 Add missing css file
See gh-21778
2019-08-12 16:23:49 +02:00
Sebastien Deleuze 96658235c8 Add Kotlin code snippets to core refdoc
This commit introduces Kotlin code snippets, for now
in the core reference documentation. Other sections
will follow, as well as improvements like global
language switch.

See gh-21778
2019-08-12 15:45:18 +02:00
Sam Brannen fcbca7d569 Remove obsolete references to JUnit 4's ArrayComparisonFailure
See gh-23451
2019-08-12 12:45:14 +02:00
Michał Rowicki ee47bc3a25 Fix typo in data access reference documentation
Closes gh-23450
2019-08-12 11:21:54 +02:00
Sam Brannen 7538561a7a Polish ApplicationContextAwareProcessor
Due to recent changes, the (bean instanceof Aware) check is now
superfluous.
2019-08-10 14:24:10 +02:00
Sam Brannen 6c0e550b86 Polish contribution
See gh-23445
2019-08-10 14:07:15 +02:00
zhuzhuman978 849bbf00b5 Simplify if statements and replace try-finally with try-with-resources
Closes gh-23445
2019-08-10 14:03:18 +02:00
Sam Brannen fabdb07e53 Redeclare default methods in AbstractTestExecutionListener
This commit redeclares default methods in AbstractTestExecutionListener
in order to make them inlinable.
2019-08-09 16:39:35 +02:00
Sam Brannen 8b023b17c9 Polish contribution
See gh-23435
2019-08-09 15:04:07 +02:00
GungnirLaevatain 1dc2177a4a Avoid unnecessary processing in ApplicationContextAwareProcessor
This commit avoids unnecessary processing in the implementation of
postProcessBeforeInitialization() in ApplicationContextAwareProcessor
by immediately returning the supplied bean if it does not meet the
requirements for further processing.

Closes gh-23435
2019-08-09 14:54:05 +02:00
Sam Brannen 1925526df5 Improve reference documentation for ContextClosedEvent
Closes gh-23436
2019-08-09 13:58:31 +02:00
Daniel Le 60ec736264 Fix */* in Javadoc
This commit changes {@code &#42;&#47;&#42;} to <code>&#42;&#47;&#42;</code>
so that "*/*" is rendered correctly.

Closes gh-23439
2019-08-09 13:32:18 +02:00
Sam Brannen 0cdf992433 Fix grammar in Integration chapter regarding MDPs 2019-08-09 13:14:46 +02:00
Sam Brannen e4fec9364c Improve reference documentation for @Autowired's required attribute
Prior to this commit, the corresponding documentation was misleading.

Closes gh-23428
2019-08-09 11:37:46 +02:00
Sam Brannen 56c1e8ffd2 Polishing 2019-08-09 11:08:30 +02:00
Stephane Nicoll 977451064a Merge branch '5.1.x' 2019-08-09 09:37:36 +02:00
Sam Brannen a532afb15d Use System.nanoTime() in StopWatch
Prior to this commit, StopWatch used System.currentTimeMillis() to
track and report running time in milliseconds.

This commit updates the internals of StopWatch to use System.nanoTime()
instead of System.currentTimeMillis(). Consequently, running time is
now tracked and reported in nanoseconds; however, users still have the
option to retrieve running time in milliseconds or seconds.

Closes gh-23235
2019-08-07 17:39:42 +02:00
Sam Brannen 50e5334378 Simplify assertions within MockMvc internals 2019-08-07 17:32:19 +02:00
Sam Brannen d32cb7dac3 Avoid use of GenericTypeResolver.resolveParameterType() in tests
This commit avoids the use of the deprecated
GenericTypeResolver.resolveParameterType() method in tests in order to
avoid warnings in the Gradle build.
2019-08-07 14:23:15 +02:00
Sam Brannen 24f8d30935 Remove deprecated MergedAnnotations.SearchStrategy.EXHAUSTIVE constant
Closes gh-23391
2019-08-07 12:34:17 +02:00
Sam Brannen a43ba052e9 Remove unnecessary loop in SerializableTypeWrapper
Since arbitrary levels of proxies do not occur, this commit replaces
the `while` loop in SerializableTypeWrapper.unwrap() with a simple
`if` statement.

Closes gh-23415
2019-08-07 12:24:48 +02:00
Sam Brannen 83956f8e8b Overhaul StopWatchTests 2019-08-07 12:13:18 +02:00
Sam Brannen 03dd45fbd6 Use AssertJ in AnnotationAttributesTests 2019-08-06 18:18:16 +02:00
Sam Brannen 34767b14da Merge branch '5.1.x' 2019-08-06 18:11:47 +02:00
Sebastien Deleuze 23cd261b6b Deprecate AnnotationConfigApplicationContext { } Kotlin extension
Closes gh-23420
2019-08-06 11:28:32 +02:00
Sam Brannen 4d6e359e25 Add missing @deprecated tags for ASM-based annotation search classes 2019-08-05 15:30:06 +02:00
Sam Brannen 82f301f42f Polishing 2019-08-05 15:29:04 +02:00
Sam Brannen e6ab6c9fe9 Add missing @deprecated tag for AnnotationMetadataReadingVisitor 2019-08-05 14:39:20 +02:00
Sam Brannen c2f5dabeee Polishing 2019-08-03 00:13:30 +02:00
Rossen Stoyanchev 63bf1bff23 Merge branch '5.1.x' 2019-08-02 16:33:02 +01:00
康智冬 5bb5b2b24d Fix grammar in package-info.java
Closes gh-23401
2019-08-02 13:40:25 +02:00
Stephane Nicoll d7a6ee5962 Merge branch '5.1.x' 2019-08-02 11:21:57 +02:00
Juergen Hoeller 53d067399d Merge branch '5.1.x' 2019-08-02 01:46:26 +02:00
Sam Brannen 9be327985b Polishing 2019-08-01 23:15:40 +02:00
Sam Brannen ee2041388b Fix typo in Javadoc for MergedAnnotations 2019-08-01 23:15:39 +02:00
Juergen Hoeller 7ac665b18e Polishing 2019-08-01 22:42:33 +02:00
Rossen Stoyanchev 765d43b34f Upgrade rsocket-core to 1.0.0-RC2
Closes gh-23359
2019-08-01 20:15:16 +01:00
Juergen Hoeller 9929d75260 Adapt to Spring Framework convention for static cache field names
See gh-23345
2019-08-01 18:55:17 +02:00
Sam Brannen 5e61e33c66 Introduce SpringTestContextFrameworkTestSuite as a convenience in IDE 2019-08-01 18:49:55 +02:00
Mark Paluch 1890e04df1 Introduce interface cache for EntityManager and Query types
We now reuse interfaces for EntityManager and Query classes that
are proxied through ExtendedEntityManagerCreator and SharedEntityManagerCreator.

These caches prevent excessive object allocations through
ClassUtils.getAllInterfacesForClass(…) and
ClassUtils.getAllInterfacesForClassAsSet(…).
2019-08-01 18:48:09 +02:00
Juergen Hoeller 96ea3a8924 Upgrade to Hibernate ORM 5.4.4 2019-08-01 16:23:21 +02:00
Juergen Hoeller fd86f34057 Merge branch '5.1.x' 2019-08-01 15:27:06 +02:00
Juergen Hoeller 49593f5399 Revise DependencyDescriptor etc to avoid MethodParameter deprecations
See gh-23385
2019-08-01 14:25:33 +02:00
Juergen Hoeller b67dbe66ef Revise use of ResolvableType in MethodParameter
Includes consistent use of getContainingClass()
2019-08-01 14:25:26 +02:00
Arjen Poutsma 8b1a2a70e1 Merge pull request #22606 from fred84/22391_conditional_view_caching
* 22391_conditional_view_caching:
  Polish contribution
  Add filter to AbstractCachingViewResolver
2019-08-01 13:54:00 +02:00
Arjen Poutsma 132fa702b7 Polish contribution
See gh-22606
2019-08-01 13:37:14 +02:00
Sergey Galkin 59aee923e4 Add filter to AbstractCachingViewResolver
This commit introduces a filter that specifies whether a View should be
cached by the AbstractCachingViewResolver or not.

Closes gh-22391
2019-08-01 13:37:14 +02:00
Juergen Hoeller 4612544505 Nullability refinements and related polishing 2019-08-01 13:04:46 +02:00
Stephane Nicoll 223074295d Merge pull request #23394 from ijliym
* pr/23394:
  Polish getTypeForFactoryBean comment

Closes gh-23394
2019-08-01 10:17:27 +02:00
liym@com fde651a606 Polish getTypeForFactoryBean comment
See gh-23394
2019-08-01 10:17:11 +02:00
Phillip Webb 1e830f725c Polish firstRunOf javadoc 2019-08-01 08:29:02 +01:00
Phillip Webb 62a3e41473 Deprecate mutable methods of MethodParameter
Deprecate all mutation methods in `MethodParameter` in favor of factory
methods that return a new instance. Existing code that previously relied
on mutation has been updated to use the replacement methods.

Closes gh-23385
2019-08-01 08:05:14 +01:00
Phillip Webb 89d150d398 Resolve factoryBeanClass if necessary
Update `AbstractAutowireCapableBeanFactory.getTypeForFactoryBean` to
use fallback to `determineTargetType` if the factory bean definition
does not have a resolved class.

This is required for the case where a `@Configuration` class is picked
up via component scanning and has a bean type that has not yet been
resolved.

Closes gh-23338
2019-08-01 07:48:12 +01:00
Juergen Hoeller 6eca9e7cc9 Drop logger field in HandlerMethodArgumentResolverComposite 2019-07-31 23:58:02 +02:00
Juergen Hoeller dea9ad6cb2 Merge branch '5.1.x' 2019-07-31 23:53:32 +02:00
Sam Brannen de3c115614 Fix bug in TYPE_HIERARCHY_AND_ENCLOSING_CLASSES strategy
Prior to this commit, the new `TYPE_HIERARCHY_AND_ENCLOSING_CLASSES`
annotation search strategy failed to find annotations on enclosing
classes if the source class was a nested class that itself had no
annotations present.

This commit fixes this by adding special logic to AnnotationsScanner's
isWithoutHierarchy() method to properly support nested classes.

Closes gh-23378
2019-07-31 22:05:46 +02:00
Sam Brannen b03dd47598 Remove duplicate assertion 2019-07-31 22:01:18 +02:00
Phillip Webb 17518ecbbe Add TYPE_HIERARCHY_AND_ENCLOSING_CLASSES strategy
Add a `TYPE_HIERARCHY_AND_ENCLOSING_CLASSES` annotation search strategy
that can be used to search the full type hierarchy as well as any
enclosing classes.

Closes gh-23378
2019-07-31 14:40:40 +01:00
Phillip Webb a6021cc968 Rename SearchStrategy.EXHAUSTIVE to TYPE_HIERARCHY
Rename `SearchStrategy.EXHAUSTIVE` from `MergedAnnotations` to
`SearchStrategy.TYPE_HIERARCHY`

See gh-23378
2019-07-31 13:52:53 +01:00
Juergen Hoeller e6f86c5c75 Nullability refinements and related polishing 2019-07-31 13:45:48 +02:00
Phillip Webb cca32a56a4 Use shared zero length array constants
Update code that's often called so that zero length array results use
a single shared static constant, rather than a new instance for each
call.

Closes gh-23340
2019-07-31 12:22:03 +02:00
Phillip Webb 71a5308c78 Support FactoryBean bean definition attributes
Update `getTypeForFactoryBean` detection so that a bean definition
attribute can be used to supply the result. This commit allows projects
such as Spring Data to provide the result that would be supplied by
`getObjectType` early so that we don't need to initialize the
`FactoryBean` unnecessarily.

Closes gh-23338
2019-07-31 12:22:03 +02:00
Phillip Webb a0e462581f Consider generics for predicting FactoryBean types
Update the `FactoryBean` type prediction logic (primarily in the
`DefaultListableBeanFactory`) so that generic type information is
considered when calling `getBeanNamesForType` on a non-frozen
configuration.

Calling `getBeanNamesForType` with `allowEagerInit` disabled will now
detect `FactoryBean` variants as long as generic type information is
available in either the class or the factory method return type.

Closes gh-23338
2019-07-31 12:22:03 +02:00
Phillip Webb 527876d9a0 Cache AbstractBeanFactory.isFactoryBean results
Add an additional cache to the `RootBeanDefinition` to save
recalculating the result of `isFactoryBean`.

Closes gh-23337
2019-07-31 12:22:03 +02:00
Phillip Webb 95edcb81b5 Retain merged bean definition caches when possible
Update the logic in `AbstractBeanFactory` so that caches from merged
bean definitions remain whenever possible.

Prior to this commit, all merged bean definitions would be completely
removed after bean post processing in case a processor changed the bean
type. It's fairly unlikely these days that the bean type will actually
change, so instead we now compare a subset of the old cached properties
against the newly created definition. Only if key properties have
changed do we now discard the older cached values.

Closes gh-23336
2019-07-31 12:22:03 +02:00
Phillip Webb 2ee1ce61c0 Add missing variants of getBeanNamesForType
Update `ListableBeanFactory` and `BeanFactoryUtils` to add the missing
`getBeanNamesForType` methods that accept a `ResolvableType` rather
than a `Class`.

This completes the work started in 778a01943b.

Closes gh-23335
2019-07-31 12:22:03 +02:00
Juergen Hoeller 30132b42c6 Consistent assertion messages in DefaultWebClient 2019-07-30 22:53:27 +02:00
Juergen Hoeller 3b235a098f Merge branch '5.1.x' 2019-07-30 22:52:20 +02:00
Arjen Poutsma ac9a11a581 Merge branch '5.1.x' 2019-07-30 18:03:01 +02:00
Juergen Hoeller 27aaad5a89 Add isTooEarly() method to StatusResultMatchers
See gh-23384
2019-07-30 17:37:26 +02:00
Juergen Hoeller 4f3b89e907 Adapt MethodParameterTests to AssertJ usage on master
See gh-23352
2019-07-30 17:36:02 +02:00
Juergen Hoeller 8ef557df2f Merge branch '5.1.x' 2019-07-30 17:34:29 +02:00
Rossen Stoyanchev 5e15bbfbf1 Change order of argument for createPayload
Expecting data first and metadata second aligns better with the single
arg variant that accepts data. This is also consistent with the
RSocket API in the create methods of ByteBufPayload and DefaultPayload.
2019-07-30 16:16:30 +01:00
Rossen Stoyanchev a1a8781279 PayloadUtils improvements and tests 2019-07-30 16:16:30 +01:00
Juergen Hoeller 22e87ac143 Polishing 2019-07-30 16:05:18 +02:00
Juergen Hoeller cc57506474 Add status code 425 ("Too Early") to HttpStatus enum
Closes gh-23384
2019-07-30 16:05:00 +02:00
Arjen Poutsma 571f6adb35 Merge branch '5.1.x' 2019-07-30 15:46:27 +02:00
Rossen Stoyanchev 9648b1c2c6 Merge branch '5.1.x' 2019-07-30 12:06:39 +01:00
Rossen Stoyanchev d972911d51 Merge branch '5.1.x' 2019-07-30 11:02:33 +01:00
Stephane Nicoll ee03a18e61 Merge branch '5.1.x' 2019-07-30 10:55:12 +02:00
Stephane Nicoll 5c860afa55 Upgrade to Reactor Dysprosium-M3 2019-07-30 09:54:20 +02:00
Stephane Nicoll c9340ecabc Merge branch '5.1.x' 2019-07-30 09:52:19 +02:00
Stephane Nicoll 535bb16c28 Merge pull request #23382 from izeye
* pr/23382:
  Remove duplicate assertion in matchWithNullPath()

Closes gh-23382
2019-07-30 09:38:04 +02:00
Johnny Lim bccc7a62f4 Remove duplicate assertion in matchWithNullPath()
See gh-23382
2019-07-30 09:37:50 +02:00
Rossen Stoyanchev 2c878e9331 Support for setupPayload in RSocketRequester
Closes gh-23368
2019-07-29 22:09:06 +01:00
Rossen Stoyanchev 55946bf319 Factor out MetadataEncoder from RSocketRequester
To be re-used also for creating metadata for the setup payload.

See: gh-23368
2019-07-29 22:09:06 +01:00
Rossen Stoyanchev c76370d7d8 Polish 2019-07-29 22:09:02 +01:00
Rossen Stoyanchev dc0c730ee8 DefaultMetadataExtractor refactoring 2019-07-29 22:08:26 +01:00
Rossen Stoyanchev 2aa3363ba2 ClientRSocketFactoryConfigurer refactoring 2019-07-29 22:08:07 +01:00
Sam Brannen 027fd78306 Further refine @TestPropertySource merged annotation calls
See gh-23320
2019-07-29 22:53:15 +02:00
Phillip Webb c9479ff20f Refine @TestPropertySource merged annotation calls
See gh-23320
2019-07-29 22:53:00 +02:00
Sam Brannen 1f8abef2ce Upgrade to AssertJ 3.13.1 2019-07-29 14:22:40 +02:00
Sam Brannen 0ac1a3754e Upgrade to AssertJ 3.13.0 2019-07-29 10:10:12 +02:00
Sam Brannen c72bf10eb9 Polish MergedSqlConfig 2019-07-28 18:41:26 +02:00
Sam Brannen f53cdb8bd2 Introduce common SimpleUrlHandlerMapping constructors
Prior to this commit, the SimpleUrlHandlerMapping classes in Spring MVC
and Spring Webflux only had default constructors. This lead to the fact
that users often had to explicitly invoke setUrlMap() and setOrder() on
the newly instantiated SimpleUrlHandlerMapping.

In order to simplify the programmatic setup of a SimpleUrlHandlerMapping
in common scenarios, this commit introduces the following constructors.

- SimpleUrlHandlerMapping()
- SimpleUrlHandlerMapping(Map<String, ?> urlMap)
- SimpleUrlHandlerMapping(Map<String, ?> urlMap, int order)

Closes gh-23362
2019-07-28 17:59:19 +02:00
Sam Brannen 0a822ddf2d Fix typo in reference manual 2019-07-28 16:36:12 +02:00
Sam Brannen bfbe8f8780 Polish MergedTestPropertySources 2019-07-28 15:40:39 +02:00
Sam Brannen a37eaf75c4 Verify meta @TestPropertySource overrides meta-meta declaration
This commit introduces tests which verify that properties configured via
@TestPropertySource used as a meta-annotation override those configured
via @TestPropertySource used as a meta-meta-annotation.

See gh-23320
2019-07-28 12:35:57 +02:00
Sam Brannen 1954861844 Update @TestPropertySource Javadoc regarding "local" semantics
See gh-23320
2019-07-28 12:12:28 +02:00
Sam Brannen 690694df33 Merge branch 'sbrannen/issues/gh-23320-repeatable-TestPropertySource' 2019-07-27 23:08:50 +02:00
Sam Brannen 1075bae280 Document repeatable @TestPropertySource support in reference manual
See gh-23320
2019-07-27 23:02:43 +02:00
Sam Brannen 136af0b164 Overhaul repeatable @TestPropertySource support
Prior to this commit, if multiple, directly present
`@TestPropertySource` annotations declared the same property, the
precedence ordering was top-down instead of bottom-up, in contrast to
the semantics for class hierarchies. In other words, a subsequent
`@TestPropertySource` annotation could not override a property in a
previous `@TestPropertySource` annotation.

This commit overhauls the internals of `TestPropertySourceUtils` in
order to provide proper support for property overrides within local,
directly present `@TestPropertySource` declarations.

Specifically, the `locations` and `properties` attributes from all
`@TestPropertySource` declarations that are directly present or
meta-present on a given class are now merged into a single instance of
`TestPropertySourceAttributes` internally, with assertions in place to
ensure that such "same level" `@TestPropertySource` declarations do not
configure different values for the `inheritLocations` and
`inheritProperties` flags. Effectively, all "same level"
`@TestPropertySource` declarations are treated internally as if there
were only one such annotation declared by the user.

See gh-23320
2019-07-27 22:30:34 +02:00
Anatoliy Korovin 2e476ca14f Support @TestPropertySource as a repeatable annotation
Prior to this commit, @TestPropertySource could not be declared as a
repeatable annotation. In addition, a local declaration of
@TestPropertySource would silently override a meta-present
@TestPropertySource.

This commit addresses this issue by introducing @TestPropertySources as
a container for @TestPropertySource. This commit also updates the
search and algorithms within TestPropertySourceUtils.

Closes gh-23320
2019-07-27 22:27:30 +02:00
Rossen Stoyanchev 8574f977a2 Mutate RSocketStrategies in RSocketMessageHandler
Use rsocketStrategies field with mutate() to ensure consistency
with internal state.

Remove transparent initialization of decoders in MetadataExtractor
and expect them to be set to avoid unintended side effects.
2019-07-26 16:12:02 +01:00
Rossen Stoyanchev fab0a5d504 MetadataExtractor refactoring
Remove RSocketStrategies argument from the contract to avoid having to
pass them every time especially by application components, like an
implementation of a Spring Security matcher.

Decouple DefaultMetadataExtractor from RSocketStrategies in favor of
a decoders property and an internal DataBufferFactory, which does not
need to be the shared one as we're only wrapping ByteBufs.
2019-07-26 16:12:02 +01:00
Johnny Lim 7c45381600 Add since tag for ClientResponse.Builder.request()
Closes gh-23364
2019-07-26 11:07:48 +02:00
Rossen Stoyanchev 1676b981e2 Upgrade to Reactor Dysprosium snapshots
Run with snapshots in preparation for next week's releases.
2019-07-25 16:40:02 +01:00
Sam Brannen 9655fc5007 Introduce ServerHttpRequest.Builder.header() variant for setting headers
Prior to this commit, the `header(String, String)` method in the
ServerHttpRequest.Builder API actually added a header value instead of
setting or overriding a header value. Since this conflicted with the
stated behavior in the Javadoc as well as the original intention of the
method, we have decided to introduce an overloaded variant
`header(String, String...)` which accepts a var-args list of header
values to set or override.

In addition, this commit deprecates the existing `header(String, String)`
method for removal in Spring Framework 5.2.

In order not to be a breaking change for custom implementations of the
builder API, this commit implements the new `header(String, String...)`
method as an interface `default` method, with the intent to remove the
default implementation in Spring Framework 5.2

closes gh-23333
2019-07-25 13:45:39 +02:00
Sam Brannen db3990d031 Merge branch '5.1.x' 2019-07-25 13:44:31 +02:00
Stephane Nicoll f95372d757 Merge branch '5.1.x' 2019-07-25 08:39:31 +02:00
Rossen Stoyanchev be4facef1b Relax check on default data MimeType
If there is more than one non-basic codec (e.g. CBOR and JSON)
RSocketRequester.Builder takes the mime type of the first one rather
than giving up. It is a valid scenario (JSON for server responding to
browser, and CBOR for client talking to server) and it is the default
situation in Boot, and after all the point here is to pick some default
as best as we can with the worst possible outcome being a server
refusing the connection if it doesn't support the mime type. Beyond
that applications can set the dataMimeType on the builder explicitly.

To match that change this commit also ensures RSocketMessageHandler
rejects proactively data mime types it does not support at the point
of accepting a connection.
2019-07-24 18:44:04 +01:00
Rossen Stoyanchev 88016d47d0 Fix issues in RSocketMessageHandler initialization
This commit ensures getRSocketStrategies() now reflects the state of
corresponding RSocketMessageHandler properties even if those change
after a call to setRSocketStrategies.

RSocketMessageHandler has default Encoder/Decoder initializations
consistent with the recent changes to RSocketStrategies.
2019-07-24 17:39:31 +01:00
Rossen Stoyanchev 2bb510588d Merge branch 'rs' 2019-07-24 11:18:15 +01:00
Rossen Stoyanchev e19e36ae4c Simplify RSocket client responder config
Now that responder RSocketStrategies also exposes responder strategies,
AnnotationClientResponderConfigurer is reduced and no longer needs to
be public. This commit folds it into RSocketMessageHandler as a nested
class and exposes it as a ClientRSocketFactoryConfigurer through a
static method that accepts the handlers to use.

Effectively a shortcut for creating RSocketMessageHandler, giving it
RSocketStrategies, calling afterPropertiesSet, and then the instance
createResponder.

See gh-23314
2019-07-24 11:17:56 +01:00
Rossen Stoyanchev c456950bc3 Add create shortcut to RSocketStrategies
Now that RSocketStrategies has default settings it makes sense to have
a create() shortcut vs builder().build().

This commit also updates tests to take advantage of improvements in this
and the previous two commits.

See gh-23314
2019-07-24 11:16:27 +01:00
Rossen Stoyanchev 91b040d0bf Add responder strategies to RSocketStrategies
RouteMatcher and MetadataExtractor can now be configured on and
accessed through RSocketStrategies. This simplifies configuration for
client and server responders.

See gh-23314
2019-07-24 11:16:27 +01:00
Rossen Stoyanchev a780cad12e Updates to RSocket[Strategies|Requester] defaults
1. RSocketStrategies hooks in the basic codecs from spring-core by
default. Now that we have support for composite metadata, it makes
sense to have multiple codecs available.

2. RSocketStrategies is pre-configured with NettyDataBufferFactory.

3. DefaultRSocketRequesterBuilder configures RSocket with a frame
decoder that matches the DataBufferFactory choice, i.e. ensuring
consistency of zero copy vs default (copy) choice.

4. DefaultRSocketRequesterBuilder now tries to find a single non-basic
decoder to select a default data MimeType (e.g. CBOR), or otherwise
fall back on the first default decoder (e.g. String).

See gh-23314
2019-07-24 11:16:27 +01:00
Sam Brannen c3c152f806 Add multi-prefix comment support for @SqlConfig
gh-23289 introduced support for multiple single-line comment prefixes
for ScriptUtils, ResourceDatabasePopulator, and EmbeddedDatabaseBuilder.

This commit adds the same support for @SqlConfig in the TestContext
Framework. Specifically, @SqlConfig has a new `commentPrefixes`
attribute for setting multiple single-line comment prefixes.

Closes gh-23331
2019-07-24 12:01:14 +02:00
Sam Brannen a3c7ae2c58 Polish contribution
See gh-23300
2019-07-24 10:13:29 +02:00
stsypanov 1d6e44ab04 Use StringJoiner where possible to simplify String joining
Closes gh-23300
2019-07-24 10:05:38 +02:00
Sam Brannen 5190eaf503 Merge branch '5.1.x' 2019-07-22 18:37:02 +02:00
Sam Brannen d633cb3ad5 Polish @Sql tests 2019-07-22 18:28:52 +02:00
Sam Brannen d1570fd05b Fix copy-n-paste error in WebTestClient Javadoc 2019-07-22 18:16:46 +02:00
Rossen Stoyanchev acb3d1cf88 Fix typo in test from previous commit
See gh-23310
2019-07-22 14:59:52 +01:00
Arjen Poutsma 7b73418418 Add rawStatusCode() to ServerResponse in both WebFlux and Servlet
Closes gh-22872
2019-07-22 15:34:42 +02:00
Rossen Stoyanchev 56c2987273 RSocketRequester support for route vars
Closes gh-23310
2019-07-22 14:02:22 +01:00
Rossen Stoyanchev 358a6d6f10 Improve separator support in PathContainer
To make the switching of separators complete, it is also important to
know whether the decoding of path segment values and the parsing of
path param should be done as those are applied transparently.

This commit replaces the recently added separator argument to
PathContainer.parsePath with an Options type with two predefined
constants. One for HTTP URLs with automatic decoding and parsing of
path params, and another for "." separated message routes without
decoding except for encoded sequences of the separator itself.

See gh-23310
2019-07-22 11:28:38 +01:00
Sam Brannen fbe697061c Remove duplicate junit-bom configuration from spring-test.gradle
The junit-bom is already configured in build.gradle via "allprojects".
2019-07-21 20:40:53 +02:00
Sam Brannen 0f773515e4 Remove unnecessary test results directory configuration
Commit eec183ef28 configured the
Artifactory Gradle task in the Default Job of the Bamboo build plan for
the Spring Framework (SPR-PUB) to use the following Gradle-friendly test
results directory pattern: `**/build/test-results/**/*.xml`.

That change made the existing custom configuration of the test results
directory in the common Gradle `test` task obsolete.
2019-07-21 20:29:40 +02:00
Sam Brannen 8ccf4a9072 Set testGroups system property for spring-test Gradle test tasks 2019-07-21 20:21:58 +02:00
Sam Brannen 69214429df Ensure aggregateTestReports task is UP-TO-DATE
Prior to this commit, the standard Gradle `test` task was configured to
execute all JUnit tests and had a dependency on the `testNG` task. In
addition, the `aggregateTestReports` task depended on the results of
the `test` and `testNG` tasks as input. Consequently, a subsequent
execution of the `aggregateTestReports` task would not be considered
UP-TO-DATE since the JUnit and TestNG results were both written to the
same "test" reports folder.

This commit introduces a new `junit` test task that allows JUnit and
TestNG test output to be completely independent. The standard `test`
task now depends on `junit` and `testNG` but does not execute any tests
itself, and the `aggregateTestReports` task now depends on the
individual `junit` and `testNG` results instead of on the mixed `test`
results.

See also: eec183ef28
2019-07-21 17:21:24 +02:00
Sam Brannen 9cb15ba602 Merge class-level and method-level @Sql declarations
Prior to these commits method-level @Sql declarations always overrode
class-level @Sql declarations, which required developers to redeclare
class-level @Sql declarations on test methods (e.g., via
copy-and-paste) in order to combine them with method-level @Sql
declarations.

These commits provide developers the ability to optionally merge
class-level and method-level @Sql declarations via a new @SqlMergeMode
annotation that can be applied at the class level or method level, with
method-level declarations of @SqlMergeMode overriding class-level
declarations. For example, @SqlMergeMode(MERGE) switches from the
default OVERRIDE behavior to merging behavior, with class-level SQL
scripts and statements executed before method-level SQL scripts and
statements.

Closes gh-1835
2019-07-21 16:20:29 +02:00
Sam Brannen ccdf04e925 Document @SqlMergeMode support in reference manual
See gh-1835
2019-07-21 15:37:51 +02:00
Sam Brannen 89571ea236 Introduce @SqlMergeMode for configuring @Sql annotation merging
Closes gh-1835
2019-07-21 14:34:35 +02:00
Sam Brannen ab8876219f Polish contribution
See gh-1835
2019-07-21 13:26:55 +02:00
asympro d77b715d38 Merge class-level and method-level @Sql declarations
See gh-1835
2019-07-21 13:26:48 +02:00
Sam Brannen b0939a8af0 Suppress deprecation warnings in Gradle build 2019-07-21 13:12:02 +02:00
Sebastien Deleuze c006a83584 Upgrade to Coroutines 1.3.0-RC
This commit upgrades Coroutines support to kotlinx.coroutines
1.3.0-RC, leverages the new Coroutines BOM and refine Coroutines
detection to avoid false positives.

Only Coroutines to Mono context interoperability is supported
for now.

CLoses gh-23326
2019-07-21 11:27:43 +02:00
Juergen Hoeller 45136aabd4 Upgrade to Protobuf 3.9 (plus consistent XMLUnit declarations) 2019-07-20 19:06:54 +02:00
Juergen Hoeller cdeb1fef5f Merge branch '5.1.x' 2019-07-20 18:23:00 +02:00
Sam Brannen 33979b2de9 Upgrade to JUnit Jupiter 5.5.1
See gh-23076
2019-07-20 17:07:14 +02:00
Juergen Hoeller 8ea3aa512f Merge branch '5.1.x' 2019-07-20 16:35:05 +02:00
Juergen Hoeller 69d3e89814 Polishing 2019-07-20 15:05:49 +02:00
Juergen Hoeller daf29118a6 Resolve ApplicationListener against BeanDefinition.getResolvableType()
This covers ApplicationListener generics in factory method return types in particular but also allows for programmatic setTargetType hints.

Closes gh-23178
2019-07-20 15:05:38 +02:00
Juergen Hoeller 8aa0b07768 Consistent early eviction tests in regular and transactional scenarios
See gh-23192
2019-07-20 15:05:07 +02:00
Phillip Webb be65bef91b Merge branch '5.1.x' 2019-07-20 13:23:37 +01:00
Sam Brannen 9110a56e11 Merge branch '5.1.x' 2019-07-20 13:33:43 +02:00
Arjen Poutsma 090bfa63a1 Add DataBuffer::toString(Charset)
Closes gh-23317
2019-07-19 12:45:24 +02:00
Arjen Poutsma c8704ce473 Introduce DataBufferWrapper
This commit introduces the DataBufferWrapper, a wrapper for DataBuffers,
and uses it in applicable use cases.
2019-07-19 12:45:24 +02:00
Rossen Stoyanchev 24e96b6c79 Merge branch '5.1.x' 2019-07-19 10:52:30 +01:00
Sebastien Deleuze 095fd5bcb3 Use Kotlin BOM
Close gh-23316
2019-07-19 10:43:54 +02:00
Sam Brannen 8db73c80e2 Polish MockRestServiceServer internals regarding "effectively final" 2019-07-18 15:45:44 +02:00
Sam Brannen 42f033e439 Polish MockMvc internals regarding "effectively final" 2019-07-18 15:45:44 +02:00
Arjen Poutsma 8b7ed5f45e Added since tag 2019-07-18 15:37:33 +02:00
Arjen Poutsma d8838152b3 Copy ClientResponseEntity::toEntity* methods to ResponseSpec
This commit copies the toEntity and toEntityList methods from
ClientResponse to ResponseSpec, so that it is possible to retrieve
a ResponseEntity when using retrieve().

Closes gh-22368
2019-07-18 12:28:22 +02:00
Sam Brannen 38f6d270f8 Delete dead code in tests 2019-07-18 12:20:26 +02:00
Sam Brannen b774147db4 Polish Javadoc for @Autowired
See gh-23263
2019-07-18 12:07:39 +02:00
Sam Brannen 817f689584 Improve Javadoc for AutowiredAnnotationBeanPostProcessor
See gh-23263
2019-07-18 11:55:18 +02:00
Rossen Stoyanchev d2a7d9fa88 Introduce RSocketClientFactoryConfigurer
The new interface supersedes ClientResponderFactory and is more general,
for any RSocketFactory customization.

DefaultClientResponderFactory implements the new interface and is
renamed to AnnotationClientResponderConfigurer.

See gh-23170
2019-07-18 10:21:51 +01:00
Rossen Stoyanchev 1e9ccdd8b8 Pass RSocketStrategies to MetadataExtractor
Simplify the creation of MetadataExtractor by not requiring
RSocketStrategies up front. The strategies are already configured in higher
level places like RSocketMessageHandler that invoke the MetadataExtractor.
The strategies are now passed in as an argument to the extract method.
2019-07-18 10:21:51 +01:00
Rossen Stoyanchev d33e4878a0 Move MetadataExtractor to the rsocket package
The move up the hierarchy reflects the fact that MetadataExtractor
is more generally useful and not tied to annotations.
2019-07-18 10:18:28 +01:00
Juergen Hoeller aa9f840938 Merge branch '5.1.x' 2019-07-17 23:35:48 +02:00
Juergen Hoeller ffc1f242ca Introduce evictIfPresent/invalidate operations on Cache abstraction
@CacheEvict.beforeInvocation suggests immediate execution even in case of transactional caches. The cache interceptor delegates to the new evictIfPresent/invalidate operations now which imply immediate execution semantics (and also provide an indication for whether any corresponding entries where present when programmatically called).

Closes gh-23192
2019-07-17 22:37:55 +02:00
Juergen Hoeller 2c33c11d4c Introduce TransactionOperations.execute(Runnable) convenience method
Closes gh-23250
2019-07-17 22:35:26 +02:00
Juergen Hoeller 7f33344784 Tracking ASM master
See gh-23156
2019-07-17 22:34:39 +02:00
Juergen Hoeller 94e3210ae7 Fix nullability warnings and javadoc-triggered package cycles 2019-07-17 22:34:07 +02:00
Sam Brannen 56eadff34f Merge branch '5.1.x' 2019-07-17 18:58:08 +02:00
Sam Brannen e92cbe1938 Improve failure messages for redirect/forward in MockMvc 2019-07-17 16:53:47 +02:00
Sam Brannen 7779aa3487 Polish contribution
See gh-23297
2019-07-17 16:53:47 +02:00
Scheidter,Ryan 84200f3141 Treat null path as non-matching pattern in AntPathMatcher
Prior to this commit, a null path supplied to the isPattern(), match(),
and matchStart() methods in AntPathMatcher resulted in a
NullPointerException.

This commit addresses this by treating a `null` path as a non-matching
pattern.

Closes gh-23297
2019-07-17 16:53:47 +02:00
Sebastien Deleuze 639a254e0d Polishing 2019-07-17 16:44:34 +02:00
Sebastien Deleuze 4e2b51bedb Improve Kotlin integration testing documentation
Closes gh-22875
2019-07-17 16:37:27 +02:00
Brian Clozel e7ecb83449 Add client responder configuration
Prior to this commit, the `RSocketRequester.Builder` would allow to
configure directly annotated handlers for processing server requests.
This lead to a package tangle where the `o.s.messaging.rsocket` would
use classes from `o.s.messaging.rsocket.annotation.support` package.

This commit introduces the `ClientResponderFactory` interface for
configuring a responder on the client RSocket factory. Its goal is
to be compatible with future changes with a functional variant for
RSocket handlers.

Closes gh-23170
2019-07-17 12:09:09 +02:00
Sebastien Deleuze d6e3394b81 Polishing
See gh-23219
2019-07-16 19:23:21 +02:00
Sebastien Deleuze b4a0e71ccc Polishing
See gh-23219
2019-07-16 18:46:36 +02:00
Arjen Poutsma 7fe0116599 Added since tag 2019-07-16 16:18:31 +02:00
Arjen Poutsma a9b3d95a14 Interpret empty mono from status handler as normal response
Prior to this commit, returning an empty mono from an exception handler
registered through ResponseSpec::onStatus would result in memory leaks
(since the response was not read) and in an empty response from bodyTo*
methods of the webclient.

As of this commit, that same empty mono is now interpreted to return
the body (and not an exception), offering a way to override the default
status handlers and return a normal response for 4xx and 5xx status
codes.
2019-07-16 15:53:21 +02:00
Sam Brannen b2b79ae1e6 Polish contribution
See gh-23219
2019-07-16 14:57:32 +02:00
Sebastien Deleuze adadffe0e1 Improve charset handling in MockHttpServletResponse
This commit adds a getContentAsString(Charset fallbackCharset) method
to MockHttpServletResponse in order to make it easier to get the content
in a specific charset like UTF-8 when the response charset has not been
explicitly set (by default ISO-8859-1 is used).

JsonPathResultMatchers leverages this new feature to support UTF-8
content out of the box.

Closes gh-23219
2019-07-16 11:44:16 +02:00
Sam Brannen 60a7092977 Fix dataMimeType and metadataMimeType mixup in precondition check
Closes gh-23292
2019-07-16 11:13:21 +02:00
Sam Brannen c788be30fe Polish contribution
See gh-23289
2019-07-15 19:08:20 +02:00
Phillip Webb b5e4e02337 Polish ScriptUtilsUnitTests 2019-07-15 14:43:03 +02:00
Phillip Webb 17914fc44b Add multi-prefix comment support for SQL scripts
Update `ResourceDatabasePopulator` and `ScriptUtils` so that more than
one comment prefix can be used when processing SQL scripts. This
feature is particularly useful when dealing with scripts provided by
Quartz since they often use a mix `--` and `#`.

Closes gh-23289
2019-07-15 14:43:03 +02:00
Rossen Stoyanchev 1ff29b0f6b Merge branch '5.1.x' 2019-07-15 11:34:35 +01:00
Arjen Poutsma dae4509152 Make sure built ClientResponses have HttpRequest 2019-07-15 09:40:02 +02:00
Sam Brannen 0aa5533dea Execute test suite in Gradle using JUnit Platform
Closes gh-23286
2019-07-13 19:13:33 +02:00
Sam Brannen 480b1e0a0d Run JUnit 4 tests in spring-test on the JUnit Platform
This commit simplifies the build for spring-test by running JUnit 4
tests and JUnit Jupiter tests together in the standard Gradle `test`
task.

As an added bonus, the ignored tests in SpringJUnit4ConcurrencyTests
and ClassLevelDisabledSpringRuleTests are now reported in the test
results.

See gh-23286
2019-07-13 18:24:37 +02:00
Sebastien Deleuze a3222476ad Use proxyBeanMethods in ProxyTransactionManagementConfiguration
Closes gh-23166
2019-07-13 12:19:33 +02:00
Rossen Stoyanchev 2eba010c1b Merge branch '5.1.x' 2019-07-13 11:00:57 +01:00
Rossen Stoyanchev c32299f734 Use HttpMessageNotWritableException instead of ISE
As a follow-up to the recent commit #37f9ce, this change replaces the
raised IllegalStateException with HttpMessageNotWritableException.

See gh-23205
2019-07-13 10:56:12 +01:00
Rossen Stoyanchev 68c99dafcf Rename {client|server}Acceptor to Responder
See gh-23170
2019-07-13 10:23:46 +01:00
Sam Brannen 3cf5db6317 Exclude ParallelExecutionSpringExtensionTests.TestCase from build
Prior to this commit, ParallelExecutionSpringExtensionTests.TestCase
was accidentally included in the build which skewed the number of tests
in spring-test by 1000.
2019-07-12 18:21:45 +02:00
Stephane Nicoll 9a71a8d357 Fix checkstyle violation
Closes gh-23276
2019-07-12 15:57:16 +02:00
Stephane Nicoll 4f8b347aa0 Do not trigger transactional event listener if no transaction is active
This commit fixes the behaviour of not triggering a transactional event
listener if no transaction is active. Previously, a transaction boundary
was all that was necessary to trigger the listener regardless of the fact
there was an active transaction.

This commit now prevents `Propagation.NOT_SUPPORTED` and
`Propagation.SUPPORTS` without an active transaction to trigger the
listener.

Closes gh-23276
2019-07-12 15:39:14 +02:00
Arjen Poutsma b4207823af Add ClientResponse::createException
This commit adds the createException() method to ClientResponse,
returning a delayed WebClientResponseException based on the status code,
headers, and body as well as the corresponding request.

Closes gh-22825
2019-07-12 14:51:54 +02:00
Rob Winch 5e9a22d118 Add nohttp to build
See gh-22839
2019-07-12 13:21:22 +02:00
Sam Brannen 09c10232a4 Polishing
See gh-23224
2019-07-12 13:08:33 +02:00
Sam Brannen 699d3f15e8 Simplify LocalVariableTableParameterNameDiscoverer implementation
This commit refactors the internals of
LocalVariableTableParameterNameDiscoverer to use
java.lang.reflect.Executable in order to simplify the implementation.
2019-07-12 12:02:49 +02:00
mfeng-ya 309b328719 Use computeIfAbsent in LocalVariableTableParameterNameDiscoverer
Closes gh-23281
2019-07-12 11:44:10 +02:00
Stephane Nicoll 5b341f620a Merge pull request #22839 from rwinch
* pr/22839:
  Polish "Add nohttp to build"
  Add nohttp to build
  BeanDefinitionParserDelegate uses http://www.springframework.org/schema/
  Fix http URLs

Closes gh-22839
2019-07-11 18:14:35 +02:00
Stephane Nicoll d6fdd8e874 Polish "Add nohttp to build"
See gh-22839
2019-07-11 18:14:20 +02:00
Rob Winch 4fa11a5061 Add nohttp to build
See gh-22839
2019-07-11 18:14:20 +02:00
Rob Winch 8c605dd082 BeanDefinitionParserDelegate uses http://www.springframework.org/schema/
See gh-22839
2019-07-11 18:14:20 +02:00
Rob Winch fde92793b5 Fix http URLs
See gh-22839
2019-07-11 18:14:20 +02:00
Sam Brannen b5fba14ab8 Fix Checkstyle violation
Eclipse apparently sorts static imports differently.
2019-07-11 18:13:59 +02:00
Sam Brannen fc38bb4fc6 Change @TestConstructor.autowire attribute into an enum
Prior to this commit, @TestConstructor supported a boolean `autowire`
attribute which naturally limited the configuration to two states: on
or off. Since we may need to support additional autowiring modes in the
future, the use of a boolean is limiting.

This commit address this issue by introducing a new AutowireMode enum
in @TestConstructor with ALL and ANNOTATED constants. In addition, the
attribute has been renamed to `autowireMode`, and the system property
has been renamed to `spring.test.constructor.autowire.mode` for greater
clarity of purpose.

Closes gh-23224
2019-07-11 18:00:52 +02:00
Sebastien Deleuze c8f8dfa39e Add engineSupplier property to ScriptTemplateConfigurer
This commit adds an engineSupplier property to ScriptTemplateConfigurer
and ScriptTemplateView in order to be able to customize the ScriptEngine
when sharedEngine is set to false.

This can be useful with Graal.js for example.

Closes gh-23258
2019-07-11 15:58:10 +02:00
Sam Brannen 01125a571c Upgrade to Gradle 5.5.1
See gh-23214
2019-07-11 14:11:36 +02:00
Sebastien Deleuze c08035b674 Remove unused Coroutines extension parameter 2019-07-11 10:11:34 +02:00
Stephane Nicoll 4a5063f4c0 Merge branch '5.1.x' 2019-07-11 09:55:13 +02:00
Sam Brannen af18d71bc2 Clean up warnings in Gradle build 2019-07-10 16:59:08 +02:00
Сергей Цыпанов 1728bf17fc Avoid unnecessary boxing where primitives can be used
Closes gh-23267
2019-07-10 16:51:18 +02:00
Arjen Poutsma 2909de8829 Remove ServerWebExchange::getParts and ServerRequest::parts
Revert to state before DefaultMultipartMessageReader
2019-07-10 16:20:20 +02:00
Arjen Poutsma 09572e7b60 Removed DataBufferUtils::split
DataBuffers::split (and underlying algorithm) should not be returning
a Flux<DataBuffer>, but rather a Flux<Flux<DataBuffer>>. In other words,
it should not join all data buffers that come before a delimiter.

Providing an implementation of a such a fully reactive split method
proved to be beyond the scope of this release, so this commit removes
the method altogether.
2019-07-10 16:00:11 +02:00
Arjen Poutsma fdcf09dc2f Copied buffering split from DataBufferUtils to StringDecoder
Due to the imminent removal of DataBufferUtils.split, this commit copies
over the buffering split algortihm from DataBufferUtils, as it is still
sutable for the StringDecoder
2019-07-10 16:00:11 +02:00
Arjen Poutsma ef19a6bf8e Various DataBufferUtils improvements
- Made sure that takeUntilByteCount is usable in multiple subscriptions.
- Added composite Matcher
2019-07-10 16:00:11 +02:00
Arjen Poutsma 77c24aac2f Remove DefaultMultipartMessageReader
The DefaultMultipartMessageReader has been removed for 5.2 and will be
part of a future release. This commit switches back to the
SynchronossPartHttpMessageReader.

gh-21659
2019-07-10 16:00:11 +02:00
Sam Brannen b8f77e53b5 Polish contribution
See gh-23251
2019-07-10 15:52:41 +02:00
Eric Hettiaratchi 827ec5d5a2 Add unit tests for PropertyAccessorUtils
Closes gh-23251
2019-07-10 15:40:21 +02:00
Sam Brannen 8ca834b868 Merge branch '5.1.x' 2019-07-09 18:24:03 +02:00
Sam Brannen f0d599493e Cache encoded BASIC credentials in ExchangeFilterFunctions
Prior to this commit, the Basic Authentication credentials were encoded for
each request in ExchangeFilterFunctions.basicAuthentication(String, String).

This commit addresses this minor performance issue by encoding the
credentials prior to the creation of the lambda expression returned by
ExchangeFilterFunctions.basicAuthentication(String, String).

Closes gh-23256
2019-07-09 18:01:27 +02:00
Sam Brannen 140e1e6532 Polish PropertyAccessorUtilsTests 2019-07-09 17:39:32 +02:00
Sam Brannen 39de64bafc Log at WARN level in case of contradicting PersistenceUnitManager setup
Closes gh-23257
2019-07-09 17:24:41 +02:00
Sam Brannen e8fe4493b9 Upgrade Mockito to 3.0.0 2019-07-09 12:59:00 +02:00
Sam Brannen 43447a8ee9 Polishing 2019-07-09 12:33:55 +02:00
Sebastien Deleuze ca75c2843a Upgrade to Coroutines 1.3.0-M2 2019-07-09 11:36:26 +02:00
Rossen Stoyanchev 47d60b34f8 Fix checkstyle violation 2019-07-08 21:35:00 +01:00
Rossen Stoyanchev 7b1a6eb50a Add getters to RSocketMessageHandler 2019-07-08 19:39:54 +01:00
Rossen Stoyanchev 2f77541f9c Update @MessageMapping Javadoc 2019-07-08 18:02:45 +01:00
Rossen Stoyanchev c199cb9054 @ConnectMapping for RSocket handling
The new annotation helps to differentiate the handling of connection
level frames (SETUP and METADATA_PUSH) from the 4 stream requests.

Closes gh-23177
2019-07-08 17:04:23 +01:00
Brian Clozel 507d128e1d Fix RSocket API warning 2019-07-08 14:47:41 +02:00
Sebastien Deleuze 08a5196c3a Use elementClass and elementTypeRef consistently 2019-07-08 12:08:40 +02:00
Sebastien Deleuze 88d7fede36 Avoid shadowed RSocketRequester extensions
This commit renames RSocketRequester.RequestSpec data extension to
dataWithType to avoid shadowing issues and adds Publisher<T> and Flow<T>
variants to provide automatic reified type parameter resolution for
those types. It also makes RSocketRequester consistent with the
changes introduced via 2b4d6ce354 in WebFlux.
2019-07-08 12:08:26 +02:00
slawluc 4bced4682a Make RSocketRequester extensions reified
Extension functions need to use reified types to create
ParameterizedTypeReference.

Closes gh-23185
2019-07-08 10:49:44 +02:00
Sebastien Deleuze 2b4d6ce354 Add body methods with Object parameter to WebFlux
The commit deprecates syncBody(Object) in favor of body(Object)
which has the same behavior in ServerResponse, WebClient and
WebTestClient. It also adds body(Object, Class) and
body(Object, ParameterizedTypeReference) methods in order to support
any reactive type that can be adapted to a Publisher via
ReactiveAdapterRegistry. Related BodyInserters#fromProducer
methods are provided as well.

Shadowed Kotlin body<T>() extensions are deprecated in favor of
bodyWithType<T>() ones, including dedicated Publisher<T> and
Flow<T> variants. Coroutines extensions are adapted as well, and
body(Object) can now be used with suspending functions.

Closes gh-23212
2019-07-07 22:27:57 +02:00
Sam Brannen 0fbc9bf461 Fix broken Javadoc links 2019-07-07 19:50:34 +02:00
Lonre Wang 8bfc920ac5 Fix typo in data-access.adoc
Closes gh-23247
2019-07-07 19:11:50 +02:00
Sam Brannen a3161dc533 Merge branch '5.1.x' 2019-07-07 18:43:27 +02:00
Sam Brannen 575027af24 Polishing 2019-07-07 16:34:15 +02:00
Sam Brannen fae75cb238 Polish contribution
See gh-23237
2019-07-07 16:29:03 +02:00
Johnny Lim 6dcf390fa2 Rename PathPatternRouteMatcherTest to PathPatternRouteMatcherTests
Closes gh-23239
2019-07-07 16:28:09 +02:00
Сергей Цыпанов 9f81ffa5ae Use StringJoiner where possible to simplify String joining
Closes gh-23237
2019-07-07 16:19:01 +02:00
Sam Brannen 8f5b2b2231 Merge branch '5.1.x' 2019-07-07 14:49:34 +02:00
Sam Brannen e57845a50f Polishing 2019-07-06 15:32:54 +02:00
Juergen Hoeller a5cb8799fa Merge branch '5.1.x' 2019-07-05 18:22:02 +02:00
Juergen Hoeller 944b943ea7 Upgrade to Kotlin 1.3.41, Netty 4.1.37, Log4J 2.12, HSQLDB 2.5 2019-07-05 16:26:10 +02:00
Juergen Hoeller d903b9acf5 Compatibility with RxJava 3.0
Closes gh-23208
2019-07-05 16:25:52 +02:00
Juergen Hoeller 6990504d17 Upgrade to ASM 7.2
Closes gh-23156
2019-07-05 16:24:45 +02:00
Juergen Hoeller 2abff1a5b0 Introduce withoutTransaction factory method on TransactionOperations
Closes gh-23198
2019-07-05 16:24:37 +02:00
Juergen Hoeller 7bfe01a028 Support for reactive result values from event listener methods
Closes gh-21831
2019-07-05 16:19:23 +02:00
Rossen Stoyanchev 97d020c509 Merge branch '5.1.x' 2019-07-05 10:55:49 +01:00
Rossen Stoyanchev 1f5f22213c Merge branch 'pr/23119'
Closes gh-23119
2019-07-05 09:03:15 +01:00
Rossen Stoyanchev fbb72eff2e Polish 2019-07-05 09:02:24 +01:00
Dmytro Nosan ea10ee5265 queryParam and replaceParam with List
See gh-23114
2019-07-05 09:02:24 +01:00
Rossen Stoyanchev 0d3e5db3ff Compare suffix patterns by length
Closes gh-23125
2019-07-05 07:36:35 +01:00
Rossen Stoyanchev 157df861f9 Do not warn also if cause is re-thrown
Closes gh-23233
2019-07-05 07:07:59 +01:00
Rossen Stoyanchev 37f9ce5cc9 Return 500 (not 406) if content-type was preset
If content-type is preset in the returned ResponseEntity, then any
failure to find a matching converter is a server error.

Closes gh-23205
2019-07-05 07:07:58 +01:00
Rossen Stoyanchev 3d913b8134 Merge branch '5.1.x' 2019-07-03 17:25:12 +01:00
Rossen Stoyanchev 03a342378a Merge branch '5.1.x' 2019-07-02 09:43:58 +01:00
Sam Brannen 64d13c471f Upgrade to JUnit Jupiter 5.5
Closes gh-23076
2019-07-01 00:00:09 +03:00
Phillip Webb 932f771380 Improve performance of FormContentFilter
Improve the performance of `FormContentFilter` by checking directly if
`contentType` is empty. This saves the need for an exception to thrown
then immediately caught.

Closes gh-23216
2019-06-29 22:31:11 -07:00
Phillip Webb b3d56ebf3b Restore StringUtils.hasLength check
Update `MimeTypeUtils` so that the  StringUtils.hasLength check is
performed immediately on the incoming argument, rather than in
`parseMimeTypeInternal`. This restores the `IllegalArgumentException`
rather than the `NullPointerException` which is thrown by the
`ConcurrentHashMap`.

Closes gh-23215
See gh-23211
2019-06-29 22:31:11 -07:00
Thomas Girard 87c15ba9ad Use the accepted profiles in BeanDefinitionDsl
Closes gh-22393
2019-06-29 17:25:45 +02:00
Sam Brannen ba95818b1d Upgrade to Gradle 5.5
Closes gh-23214
2019-06-29 11:54:19 +03:00
Sam Brannen 896496341a Add explicit support for multipart/mixed in FormHttpMessageConverter
Commit 5008423408 added support for
multipart/* media types in FormHttpMessageConverter, but users still had
to manually register multipart/mixed as a supported media type in order
to POST multipart data with that content type.

This commit removes the need to manually register multipart/mixed as a
supported media type by registering it automatically in
FormHttpMessageConverter. In addition, this commit introduces
MULTIPART_MIXED and MULTIPART_MIXED_VALUE constants in MediaType.

Closes gh-23209
2019-06-29 11:41:15 +03:00
Sam Brannen 75d1428e24 Polishing 2019-06-29 11:41:15 +03:00
Brian Clozel 5a308ad5bd Polish MimeTypeUtils LRU cache
This commit improves the cache implementation by skipping the ordering
of most recently used cached keys when the cache is at least half empty.

See gh-23211
2019-06-29 00:17:40 +02:00
Rossen Stoyanchev 511a430906 Polish 2019-06-28 23:13:31 +01:00
Brian Clozel 1b93ea97ac Fix concurrent reads issue in MimeTypeUtils cache
As of gh-22340, `MimeTypeUtils` has a built-in LRU cache implementation
for caching parsed MIME types and avoiding excessive garbage creation at
runtime.
This implementation, when hit with highly concurrent reads on the same
media type (the cache key), can create multiple keys for the same MIME
type string. This duplication leads to the cache filling up and evicting
entries. When the cache fetches a duplicate key, it is then not
associated with a value and the cache can return a `null` value, which
is forbidden by the API contract.

This commit adds another cache check within the write lock: this avoids
creating duplicate entries in the cache and `null` return values.

Fixes gh-23211
2019-06-28 23:43:38 +02:00
Rossen Stoyanchev 5bf070a857 More flexible RSocket metadata support
The responding side now relies on a new MetadataExtractor which decodes
metadata entries of interest, and adds them to an output map whose
values are then added as Message headers, and are hence accessible to
controller methods.

Decoded metadata entry values can be added to the output map one for
one, or translated to any number of values (e.g. JSON properties),
as long as one of the resulting pairs has a key called "route".

On the requesting side, now any metadata can be sent, and a String
route for example is not required to be provided explicitly. Instead
an application could create any metadata (e.g. JSON properties) as long
as the server can work out the route from it.

The commit contains further refinements on the requesting side so that
any mime type can be used, not only composite or routing metadata, e.g.
a route in an "text/plain" entry.

Closes gh-23157
2019-06-28 22:00:44 +01:00
Sam Brannen 3e41f5e6b6 Cache the encoded credentials in BasicAuthenticationInterceptor
Prior to this commit, the Basic Authentication credentials were encoded
for each request.

This commit addresses this minor performance issue by caching the
encoded credentials in BasicAuthenticationInterceptor.

In addition, this commit introduces new encodeBasicAuth() and
setBasicAuth(String encodedCredentials) methods in HttpHeaders to
support this feature.

Closes gh-23204
2019-06-28 18:48:59 +03:00
Sam Brannen 5008423408 Support multipart/* MediaTypes in RestTemplate
Prior to this commit, RestTemplate posted multipart with Content-Type
"multipart/form-data" even if the FormHttpMessageConverter configured
in the RestTemplate had been configured to support additional multipart
subtypes. This made it impossible to POST form data using a content
type such as "multipart/mixed" or "multipart/related".

This commit addresses this issue by updating FormHttpMessageConverter
to support custom multipart subtypes for writing form data.

For example, the following use case is now supported.

MediaType multipartMixed = new MediaType("multipart", "mixed");

restTemplate.getMessageConverters().stream()
    .filter(FormHttpMessageConverter.class::isInstance)
    .map(FormHttpMessageConverter.class::cast)
    .findFirst()
    .orElseThrow(() ->
        new IllegalStateException("Failed to find FormHttpMessageConverter"))
    .addSupportedMediaTypes(multipartMixed);

MultiValueMap<String, Object> parts = new LinkedMultiValueMap<>();
parts.add("field 1", "value 1");
parts.add("file", new ClassPathResource("myFile.jpg"));

HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setContentType(multipartMixed);
HttpEntity<MultiValueMap<String, Object>> requestEntity =
    new HttpEntity<>(parts, requestHeaders);

restTemplate.postForLocation("https://example.com/myFileUpload", requestEntity);

Closes gh-23159
2019-06-28 17:13:18 +03:00
Sam Brannen 7bc727c895 Convert addSupportedMediaType() to var-args in FormHttpMessageConverter
This commit changes the new addSupportedMediaType(MediaType) method
to addSupportedMediaTypes(MediaType...), in order to allow registration
of multiple supported media types simultaneously.

See gh-23203
2019-06-27 16:55:03 +03:00
Sam Brannen 1ef60f2d3b Polishing 2019-06-27 16:05:38 +03:00
Sam Brannen 91ae711a54 Fix Javadoc for MediaType 2019-06-27 16:05:38 +03:00
Sam Brannen 4e7d8a8873 Introduce addSupportedMediaType() in FormHttpMessageConverter
Closes gh-23203
2019-06-27 16:05:38 +03:00
Sam Brannen 8e1cb9a059 Improve diagnostics for all server failures in RestTemplateIntegrationTests 2019-06-27 14:16:19 +03:00
Sam Brannen d522e9835f Polish AbstractMockWebServerTestCase 2019-06-27 13:45:32 +03:00
Sam Brannen 0b6239cecc Improve diagnostics for failures in RestTemplateIntegrationTests 2019-06-26 15:16:54 +03:00
Sam Brannen 7d6be2e26e Polishing 2019-06-26 15:12:32 +03:00
Stephane Maldini 14afdb2bbc Remove unnecessary import 2019-06-25 17:42:01 -07:00
Stephane Maldini 339ee01233 Remove unnecessary flushOnEach (since reactor-netty 0.9) 2019-06-25 16:05:30 -07:00
Sam Brannen e947e08638 Merge branch '5.1.x' 2019-06-25 13:14:21 +03:00
Sam Brannen 33fa55e658 Update OrderComparatorTests based on clarified PriorityOrdered semantics
See gh-23187
2019-06-25 11:04:19 +03:00
Sam Brannen b2dc4debde Merge branch '5.1.x' 2019-06-25 10:42:14 +03:00
Johnny Lim 1afc2be5aa Remove duplicate assertion in AnnotatedElementUtilsTests
Closes gh-23191
2019-06-25 10:00:12 +03:00
Sam Brannen 0f1d16bb05 Fix Checkstyle violation 2019-06-24 17:54:04 +03:00
Sam Brannen d0231cb29a Presort beans in ControllerAdviceBean.findAnnotatedBeans()
Prior to this commit, all clients of
ControllerAdviceBean.findAnnotatedBeans() sorted the returned list
manually. In addition, clients within the core Spring Framework
unnecessarily used AnnotationAwareOrderComparator instead of
OrderComparator to sort the list.

This commit presorts the ControllerAdviceBean list using OrderComparator
directly within ControllerAdviceBean.findAnnotatedBeans().

Closes gh-23188
2019-06-24 16:26:11 +03:00
Brian Clozel dd15ff79d7 Register annotated handlers in RSocketRequester
Prior to this commit, there would be no easy way to register client
RSocket handlers against an `RSocketRequester` instance. The only
solution was to gather all handlers and wrap them in a
`RSocketMessageHandler` and configure it as an acceptor on the client
RSocket.

This commit adds a convenience method on the `RSocketRequester` builder
to tkae care of this part of the infrastructure.

Closes gh-23170
2019-06-24 15:11:18 +02:00
Sam Brannen d5a2bdee8d Improve Javadoc for @ControllerAdvice regarding ordering
Closes gh-23163
2019-06-24 14:36:04 +03:00
Sam Brannen 6cc6abd405 Test status quo for OrderComparator's PriorityOrdered support
See gh-23187
2019-06-24 14:13:46 +03:00
Sam Brannen 4357749a63 Document that OrderComparator honors PriorityOrdered
Prior to this commit, it was not clear that OrderComparator sorts
PriorityOrdered objects with higher priority than plain Ordered objects.
2019-06-24 13:32:54 +03:00
Sam Brannen e3b3481c19 Fix typo in Javadoc 2019-06-24 12:32:41 +03:00
Sam Brannen 9239ab1891 Support Ordered interface for @ControllerAdvice beans
Closes gh-23163
2019-06-23 19:31:35 +03:00
Sam Brannen 978adbdae7 Avoid duplicate lookups of @ControllerAdvice annotations
See gh-23163
2019-06-23 18:31:04 +03:00
Gaurav Deshpande ed6fbdddaa Fix typo in CONTRIBUTING.md
Closes gh-23180
2019-06-22 22:34:05 +03:00
Sam Brannen 7576d0d40c Polishing
See gh-23163
2019-06-22 19:06:58 +03:00
Sam Brannen 4568edf6c4 Simplify ControllerAdviceBean constructors
See gh-23163
2019-06-22 19:02:49 +03:00
Sam Brannen 8f30639a0a Test status quo for Ordered support for @ControllerAdvice beans
See gh-23163
2019-06-22 18:18:57 +03:00
Juergen Hoeller e2d01bb783 Merge branch '5.1.x' 2019-06-22 17:11:31 +02:00
Sam Brannen 21267e56b7 Cache resolved bean instance in ControllerAdviceBean
Prior to this commit, the resolveBean() method in ControllerAdviceBean
looked up the @ControllerAdvice bean instance in the ApplicationContext
by name for every web request that involved lookups for global methods
annotated with @ExceptionHandler, @InitBinder, and @ModelAttribute.

This commit avoids the need for such repeated lookups in the
ApplicationContext by caching the resolved @ControllerAdvice bean
instance within ControllerAdviceBean once it has been resolved.
2019-06-21 18:27:33 +03:00
Sam Brannen 59901592d2 Introduce regression tests for ControllerAdviceBean
This commit introduces unit tests for the status quo in
ControllerAdviceBeanTests to serve as regression tests for future
changes to ControllerAdviceBean.
2019-06-21 17:21:50 +03:00
Sam Brannen 52f1a3aef9 Polish ControllerAdviceBean 2019-06-21 17:11:12 +03:00
Sam Brannen beb454a299 Use HTTPS links in documentation where possible 2019-06-21 16:51:44 +03:00
Sebastien Deleuze eaecf0c006 Improve RSocketRequester.ResponseSpec Kotlin extensions
This commit adds retrieveMono and retrieveFlux reified variants, and
turns dataFlow(flow: Flow) extension into a general purpose reified
data(producer: Any) one.

Closes gh-23164
2019-06-21 15:26:12 +02:00
Rossen Stoyanchev 003247dc40 Equalize copy of ChannelSendOperator
See gh-23175
2019-06-21 14:16:44 +01:00
Rossen Stoyanchev 030caea9cf Merge branch '5.1.x' 2019-06-21 14:15:26 +01:00
Sam Brannen 0e5a38591f Cache beanType in ControllerAdviceBean 2019-06-21 14:09:05 +03:00
Sam Brannen 2759b4b909 Avoid use of Stream API in ControllerAdviceBean 2019-06-21 13:49:49 +03:00
Sam Brannen d5554d5d8d Polish @ControllerAdvice and @RestControllerAdvice 2019-06-21 13:26:30 +03:00
Sam Brannen 2f4c97cbdb Merge branch '5.1.x' 2019-06-21 12:46:21 +03:00
Sam Brannen 1d2f8e5cc2 Merge branch '5.1.x' 2019-06-21 12:41:59 +03:00
Arjen Poutsma 92981ac9de Add Flux<Part> ServerRequest.parts()
This commit introduces Flux<Part> ServerRequest.parts() that delegates
to ServerWebExchange.getParts() and offers an alternative,
streaming way of accessing multipart data.

Closes gh-23131
2019-06-21 10:59:13 +02:00
Arjen Poutsma 11c7907a59 Add Flux<Part> ServerWebExchange.getParts()
This commit introduces ServerWebExchange.getParts(), as an alternative,
streaming way of accessing multipart data.
2019-06-21 10:59:12 +02:00
Arjen Poutsma edd86e5dd5 Move RouterFunction WebHandler to inner class 2019-06-21 10:59:12 +02:00
Rossen Stoyanchev 7f1d5d790e Polish 2019-06-21 06:51:59 +01:00
Rossen Stoyanchev c6a2c89408 Package refactoring in rsocket support
Create annotation.support sub-package and move handler code there. This
prepares for a future, functional handler (responder) variant and is
consistent with the package structure under simp.
2019-06-21 06:49:59 +01:00
Brian Clozel cc05608ae9 PathPattern does not use custom separator
Prior to this commit, `PathPattern::extractPathWithinMapping`
would always use the default path pattern separator `/` when extracting
the path within the pattern of a matched route.

This commit ensures that `PathPattern` uses the configured separator
when extracting the path within the matched mapping.

Fixes gh-23168
2019-06-20 20:27:22 +02:00
Brian Clozel 5787fc16fb PathPatternRouteMatcher should use custom separator
Prior to this commit, the `PathPatternRouteMatcher` would always use the
default path pattern separator when parsing incoming route strings to
`RouteMatcher.Route` instances.
When the `PathPatternRouteMatcher` is configured with a
`PathPatternParser` that has a custom separator (e.g., `.`), then the
matching algorithm can't match routes against parsed patterns.

This commit ensures that the route matcher uses the configured separator
at all times.

Fixes gh-23167
2019-06-20 20:23:04 +02:00
Sam Brannen f56c54dfc8 Polishing 2019-06-20 18:09:22 +03:00
Sebastien Deleuze da582dad7c Add documentation for Coroutines dependencies 2019-06-20 16:11:20 +02:00
Rossen Stoyanchev 772087fe18 Refactor RSocket handler selection
1. Consolidate config options for handler detection in the base class
AbstractMethodMessageHandler with sub-classes like RSocketMessageHandler
now only setting the handler predicate by default (e.g. @Controller).

2. Remove autoDetection flag in favor of just having the mutually
exclusive handler Predicate<Object> vs manually registered List<Object>.
Or if both are desired for some reason, then manually register first,
and set the predicate second.
2019-06-20 12:16:08 +01:00
Rossen Stoyanchev 7d68a65dc0 Replace deprecated methods in RSocket tests 2019-06-20 12:16:08 +01:00
Rossen Stoyanchev d6b5c20058 Generalize RSocketRequester data methods
Replace the Publisher argument in RequestSpec's
data(Publisher, Class<T>) and
data(Publisher, ParameterizedTypeReference<T>) methods with Object thus
allowing any reactive type known to the ReactiveAdapterRegistry to be
passed in directly rather than adapted to Publisher first.
2019-06-20 12:16:08 +01:00
Sam Brannen b3d40b3fac Upgrade to JUnit Jupiter 5.5 RC2
See gh-23076
2019-06-20 13:20:25 +03:00
Sam Brannen d2e6d0269b Preliminary tests for multipart/related & multipart/mixed in RestTemplate
See gh-23159
2019-06-20 11:35:18 +03:00
Sebastien Deleuze e86b937f8c Leverage new Kotlin script templating support
As of 1.3.40, Kotlin now provides a kotlin-scripting-jsr223-embeddable
dependency which:
 - Fixes classloading related issues
 - Provides out of the box JSR 223 support
 - Is compatible with Spring Boot Fat Jar mechanism

This commit updates Spring Framework tests and documentation accordingly.

Closes gh-23165
2019-06-20 10:17:02 +02:00
Sebastien Deleuze cfb4148982 Upgrade to Kotlin 1.3.40 2019-06-20 09:44:14 +02:00
Stephane Nicoll 521539b68e Merge pull request #23162 from izeye
* pr/23162:
  Polish FormattingConversionServiceTests

Closes gh-23162
2019-06-20 08:46:56 +02:00
Johnny Lim ef704aa531 Polish FormattingConversionServiceTests
See gh-23162
2019-06-20 08:40:47 +02:00
Stephane Nicoll 8e1612c68a Merge pull request #23158 from izeye
* pr/23158:
  Polish YamlProcessorTests.flattenedMapIsSameAsPropertiesButOrdered()

Closes gh-23158
2019-06-20 08:35:42 +02:00
Johnny Lim 77aa17fe75 Polish YamlProcessorTests.flattenedMapIsSameAsPropertiesButOrdered()
See gh-23158
2019-06-20 08:34:44 +02:00
Rossen Stoyanchev 22fd521e0a Remove MessageHandlerAcceptor sub-class
This commit removes the MessageHandlerAcceptor sub-class of
RSocketMessageHandler, and rather than implementing directly the
contracts for RSocket client and server acceptors, RSocketMessageHandler
now exposes clientAcceptor() and serverAcceptor() methods that return
the required adapter instances.

This provides better separation between the RSocketMessageHandler and
the RSocket adapter code, and also avoids implementing generic
interfaces like the BiFunction required for the client acceptor.
2019-06-19 22:19:19 +01:00
Sebastien Deleuze 341385acfc Merge branch '5.1.x' 2019-06-19 13:59:59 +02:00
Rossen Stoyanchev 73c2eb1b77 Fix minor Assert-related issues 2019-06-18 21:31:44 +01:00
Sam Brannen ef6471fcbf Polish contribution
See gh-23141
2019-06-18 18:59:18 +03:00
RustyTheClone 72adc3d37e Support target type in MockMvcResultMatchers.jsonPath()
This commit introduces an overloaded jsonPath() method to specify a
target type to coerce into for MockMvcResultMatchers.

 - jsonPath(String, Matcher<T>, Class<T>)

Closes gh-23141
2019-06-18 18:57:27 +03:00
Sam Brannen 89ebdc766c Polishing 2019-06-18 18:53:47 +03:00
Sebastien Deleuze ea97fefa98 Merge branch '5.1.x' 2019-06-18 16:52:29 +02:00
Sam Brannen 4000b244ff Forbid null converters in RestTemplate & HttpMessageConverterExtractor
Prior to this commit, RestTemplate and HttpMessageConverterExtractor did
not validate that the supplied HttpMessageConverter list contained no
null elements, which can lead to a NullPointerException when the
converters are accessed.

This commit improves the user experience by failing immediately if the
supplied HttpMessageConverter list contains a null element. This applies
to constructors for RestTemplate and HttpMessageConverterExtractor as
well as to RestTemplate#setMessageConverters().

Note, however, that RestTemplate#getMessageConverters() returns a mutable
list. Thus, if a user modifies that list so that it contains null values,
that will still lead to a NullPointerException when the converters are
accessed.

This commit also introduces noNullElements() variants for collections in
org.springframework.util.Assert.

Closes gh-23151
2019-06-18 16:13:20 +03:00
Sam Brannen 8ceac9c015 Document supported @Transactional attributes in the TCF
This commit documents which attributes in @Transactional are supported
for test-managed transactions in the Spring TestContext Framework (TCF).

Closes gh-23149
2019-06-18 14:34:28 +03:00
Sam Brannen da903904c9 Fix Javadoc reference to MediaType#APPLICATION_CBOR_VALUE
{@value ...} cannot be used outside of the current type.
2019-06-18 13:00:00 +03:00
Sam Brannen aa0a8d66a8 Polishing 2019-06-18 10:19:03 +03:00
Johnny Lim 7f67cecd10 Polish MappingMediaTypeFileExtensionResolver.addFileExtension()
Closes gh-23145
2019-06-18 10:10:30 +03:00
Sam Brannen f6a4595cef Polishing 2019-06-17 17:06:37 +03:00
Stephane Nicoll 80c7f7f6ba Merge pull request #23142 from ielatif
* pr/23142:
  Fix typo

Closes gh-23142
2019-06-17 11:41:01 +02:00
Issam El-atif 57fa09b80d Fix typo
See gh-23142
2019-06-17 11:40:45 +02:00
Arjen Poutsma 30af01fd4e Use DataBufferUtils.write in DefaultFilePart.transferTo
This commit makes sure that in DefaultMultipartMessageReader's
DefaultFilePart, the file is not closed before all bytes are written,
by using DataBufferUtils.write (see c1b6885191d6a50347aeaa14da994f0db88f26fe).

The commit also improves on the logging of the
DefaultMultipartMessageReader.

Closes gh-23130
2019-06-14 14:13:18 +02:00
Arjen Poutsma f08656c6cb Add methods to read/write from Path to DataBufferUtils
This commit adds two methods to DataBufferUtils:
- one that reads a Flux<DataBuffer> from a Path
- one that writes a Flux<DataBuffer> to a Path
2019-06-14 14:13:18 +02:00
Sam Brannen 99d10a671c Merge branch '5.1.x' 2019-06-14 14:51:08 +03:00
Johnny Lim 293506013d Add since declarations for JettyClientHttpConnector constructor change
Closes gh-23128
2019-06-14 14:31:37 +03:00
Stephane Nicoll 296220f374 Merge branch '5.1.x' 2019-06-13 16:47:50 +02:00
Sam Brannen 451cce4fe8 Do not override requestContextAttribute with null in UrlBasedViewResolvers
Prior to this commit, if a subclass of
org.springframework.web.servlet.view.AbstractView or
org.springframework.web.reactive.result.view.AbstractUrlBasedView
configured a custom value for the requestContextAttribute, that value
was overwritten with null whenever the View was dynamically
instantiated by a UrlBasedViewResolver, and this could lead to
confusing behavior for users of the View.

This commit addresses this issue by ensuring that the
UrlBasedViewResolvers in spring-webmvc and spring-webflux do not
override the requestContextAttribute in a View if the
UrlBasedViewResolver has not been explicitly configured with a custom
requestContextAttribute value.

Closes gh-23129
2019-06-13 17:42:14 +03:00
Sam Brannen c4075cf216 Document WebFlux FreeMarker macro support in Reference Manual
Closes gh-23133
2019-06-13 17:40:18 +03:00
Sam Brannen eef9bc899f Avoid NPE in FreeMarkerView.getModelAttributes() in spring-webflux
This commit declares the model method parameter as @Nullable and adds
defensive guards against a null model argument.

Closes gh-23105
2019-06-13 01:40:22 +03:00
Rossen Stoyanchev 4690f745ce Upgrade to RSocket 0.2.12-RC4 2019-06-12 17:19:17 -04:00
Rossen Stoyanchev 14e2c6803e Support for RSocket composite metadata
Closes gh-22798
2019-06-12 17:11:30 -04:00
Sam Brannen 9fb973d4f3 Polish JavaDoc for FreeMarkerView in spring-webflux
See gh-23105
2019-06-12 22:42:29 +03:00
Sam Brannen a4f4ef9011 Update documentation for spring.ftl in spring-webflux
See gh-23105
2019-06-12 22:40:13 +03:00
Juergen Hoeller 0a77477d32 Merge branch '5.1.x' 2019-06-12 18:16:30 +02:00
stsypanov 49873a30c5 Simplify String concatenation 2019-06-12 17:32:35 +02:00
Sam Brannen cc4593fda8 Improve FreeMarker macro support in spring-webflux
This commit improves the FreeMarker macro support in spring-webflux by
automatically exposing a RequestContext under the name
"springMacroRequestContext" for use with Spring's FreeMarker macros in
spring.ftl.

This aligns with the user experience for FreeMarkerView in spring-webmvc.

Closes gh-23105
2019-06-12 17:00:21 +03:00
Sam Brannen c99b7c1c90 Polishing 2019-06-12 16:33:39 +03:00
Sam Brannen 8b68400bbe Remove use of @Nullable from copy of SortedProperties
Rationale: @Nullable is not visible in the spring-context-indexer
project.
2019-06-12 15:31:54 +03:00
Juergen Hoeller 42c0d8ec7f Merge branch '5.1.x' 2019-06-12 14:14:40 +02:00
Sam Brannen 259dd3d731 Polishing 2019-06-12 14:43:23 +03:00
Juergen Hoeller 918ffacdf8 Polishing 2019-06-12 13:29:35 +02:00
Juergen Hoeller 98a49b46b7 NamedParameterJdbcTemplate only treats Iterables like Collections
Closes gh-22981
2019-06-12 13:29:07 +02:00
Sam Brannen bee4fb0615 Polishing 2019-06-12 14:07:04 +03:00
Sam Brannen 049437e111 Log exception when closing InputStream in AbstractResource
Prior to this commit, exceptions thrown while closing an InputStream in
AbstractResource were silently ignored.

This commit improves diagnostics for such failure scenarios by logging
the exception at DEBUG level.

Closes gh-23116
2019-06-12 14:07:04 +03:00
Sam Brannen 5cbc0cd8a3 Merge branch '5.1.x' 2019-06-12 09:32:22 +03:00
Juergen Hoeller bd76a160bb Merge branch '5.1.x' 2019-06-12 00:58:51 +02:00
Juergen Hoeller 707c720441 Polishing 2019-06-12 00:05:37 +02:00
Juergen Hoeller 7e02358166 Merge branch '5.1.x' 2019-06-12 00:05:01 +02:00
Phillip Webb 5e505ce3a9 Add FormatterRegistry addPrinter/addParser methods
Update `FormatterRegistry` with `addPrinter` and `addParser` methods
that can be used to register Printer or Parser implementations in a
similar way to the existing `addFormatter` method.

Closes gh-23110
2019-06-11 14:47:42 -07:00
Juergen Hoeller a89bfffd8c Merge branch '5.1.x' 2019-06-11 23:16:03 +02:00
Sam Brannen 74d520fbfa Polish @Value documentation in the Reference Manual
See gh-23052
2019-06-11 23:07:23 +03:00
Phillip Webb 6ac68391c1 Polishing 2019-06-11 12:03:05 -07:00
Phillip Webb b21b27c5ac Add MultiValueMap.addIfAbsent method
Closes gh-23111
2019-06-11 12:03:05 -07:00
Rossen Stoyanchev 0757eaee9d Clear ProducesRequestCondition attribute
Closes gh-23091
2019-06-11 13:55:20 -04:00
Juergen Hoeller 859923b732 Support for fine-grained by-type references and autowired properties
Closes gh-23032
2019-06-11 18:27:46 +02:00
Juergen Hoeller eeb79c8dde NamedParameterJdbcTemplate treats arrays/Iterables like Collections
Closes gh-22981
2019-06-11 18:26:40 +02:00
Juergen Hoeller 9f92b42d69 Upgrade to Tomcat 9.0.21, Undertow 2.0.21, RxJava 2.2.9, Checkstyle 8.21, Mockito 2.28.2, Hibernate ORM 5.4.3
Centralizes rsocketVersion declaration in build.gradle; also includes upgrade to Reactor Dysprosium M2 proper.
2019-06-11 18:26:13 +02:00
Sebastien Deleuze 1af43d7164 Rework @Value documentation
See gh-23052
2019-06-11 17:54:43 +02:00
Sam Brannen 44a00b58c8 Polish contribution
See gh-22383
2019-06-11 17:46:29 +03:00
Vedran Pavic b51e553f55 Ensure indexer output is deterministic and repeatable
Closes gh-22383
2019-06-11 17:46:12 +03:00
Sam Brannen a5828ca14e Polish JavaDoc for AbstractView in spring-webflux 2019-06-11 16:28:25 +03:00
Sam Brannen dfbf742547 Polishing 2019-06-11 13:54:11 +03:00
Sylvain Lemoine 74fcb0c5e8 Add proper @Value documentation
Closes gh-23052
2019-06-11 12:06:42 +02:00
Sam Brannen 59d070e12a Test JUnit Jupiter 5.5 @Timeout support with Spring transactions
See gh-23076
2019-06-10 17:57:56 +03:00
Sam Brannen 809fc50036 Upgrade to JUnit Jupiter 5.5 RC1
See gh-23076
2019-06-10 16:51:47 +03:00
Sam Brannen 7a87d86b80 Fix documentation for FreeMarker bind macro in spring-webflux
See gh-23002
2019-06-10 16:39:54 +03:00
Sam Brannen 2f640fe205 Polish FreeMarker macro support in spring-webflux
See gh-23002
2019-06-10 16:13:20 +03:00
Sam Brannen ac28de0dc1 Polish Javadoc for FreeMarker support 2019-06-10 16:03:16 +03:00
Issam EL-ATIF b58f34d802 Add FreeMarker macro support in spring-webflux
Closes gh-23002
2019-06-09 16:30:05 +03:00
Sam Brannen 9b084bb3ea Polish contribution
See gh-23073
2019-06-08 22:22:27 +03:00
Issam El-atif ab36a0a82f Improve FreeMarker tests in spring-webmvc and spring-context-support
This commit improves FreeMarkerConfigurerTests in spring-webmvc by
testing against FreeMarkerConfigurer instead of
FreeMarkerConfigurationFactoryBean and moves the original
FreeMarkerConfigurationFactoryBeanTests to spring-context-support in
the org.springframework.ui.freemarker package.

Closes gh-23073
2019-06-08 22:21:09 +03:00
Juergen Hoeller 662541a48e Fix formatting
See gh-23068
2019-06-08 14:26:39 +02:00
陈其苗 ab8e388412 Fix duplicate invoke method of transformedBeanName 2019-06-07 22:48:19 +02:00
Rossen Stoyanchev b296545af8 Handler StreamingHttpOutputMessage in XHR transport
Closes gh-23030
2019-06-07 16:40:58 -04:00
Rossen Stoyanchev 331463739d Merge branch '5.1.x' 2019-06-07 16:26:00 -04:00
Rossen Stoyanchev 1f05bd4ef3 Merge branch '5.1.x' 2019-06-07 16:08:29 -04:00
Sam Brannen 08afe5d22b Polishing 2019-06-07 19:45:51 +03:00
Сергей Цыпанов e352e9ddaa Simplify comparison of primitives
Closes gh-23098
2019-06-07 18:14:04 +02:00
Sam Brannen e903bf440b Polishing 2019-06-06 17:57:14 +03:00
Sam Brannen 61bf45c86f Merge branch '5.1.x' 2019-06-06 17:40:51 +03:00
Sebastien Deleuze 098ac0bbb8 Annotate Object#equals parameter with @Nullable
Closes gh-23093
2019-06-06 14:18:30 +02:00
Brian Clozel 33becd8258 Allow separator configuration in PathPatternParser
This commit allows to configure a custom path separator when parsing and
matching path patterns with `PathPatternParser`, but also when parsing
incoming paths as `PathContainer` instances.

Closes gh-23092
2019-06-06 11:39:53 +02:00
Rossen Stoyanchev ec91934730 Use correct file options for transferTo
Similar to fix applied to Synchronoss implementation in #cef98e.
2019-06-05 10:54:56 -04:00
Sam Brannen 1259b7cb49 Polishing 2019-06-05 14:41:14 +03:00
Sam Brannen 2ed9a61ba0 Rename TransactionSynchronizationManager#currentTransaction()
This commit renames currentTransaction() to forCurrentTransaction() for
greater clarity.

Closes gh-23086
2019-06-05 14:15:07 +03:00
Sebastien Deleuze 044ea17bf9 Polishing 2019-06-05 12:13:36 +02:00
Sebastien Deleuze 23e617160f Use a timeout != 0 in InvocableHandlerMethodTests 2019-06-05 11:52:08 +02:00
Sebastien Deleuze 2a19b8f7a5 Refine Coroutines adapter registration activation
Closes gh-23087
2019-06-05 11:52:00 +02:00
Sam Brannen 3b37989774 Apply De Morgan's law for greater clarity of purpose 2019-06-05 10:29:24 +03:00
Rossen Stoyanchev 1f35bb609b Fix checkstyle warning 2019-06-04 17:38:30 -04:00
Rossen Stoyanchev 69eba32284 Improved Part support in MultipartBodyBuilder
1. Add contentType and filename options to PartBuilder.

2. Revert recently committed #44659f since asyncPart can't properly
support Publisher of Part (only Mono, can't support filename), and
replace that with support for Part in the regular part method.

Closes gh-23083
2019-06-04 17:21:39 -04:00
Rossen Stoyanchev 8781c01edf Merge branch '5.1.x' 2019-06-04 16:42:13 -04:00
Sam Brannen 2074afc87f Polish Javadoc
See gh-23075
2019-06-04 16:55:51 +03:00
Arjen Poutsma 145610129b Javadoc
Closes gh-23075
2019-06-04 15:31:27 +02:00
Sam Brannen e92ace7301 Merge branch '5.1.x' 2019-06-04 16:22:08 +03:00
Sam Brannen 410f204168 Support consistent ordering of string adapting properties
This commit introduces support for consistent ordering of Properties
created by CollectionFactory.createStringAdaptingProperties().

Specifically, the created Properties instance sorts properties
alphanumerically based on their keys.

Closes gh-23081
2019-06-04 14:47:43 +03:00
Sam Brannen 3a8388ec8d Merge branch '5.1.x' 2019-06-04 12:01:58 +03:00
Rossen Stoyanchev e89fd5c3be Merge branch '5.1.x' 2019-06-03 16:34:58 -04:00
Stephane Nicoll cb97a1b371 Merge pull request #23071 from ielatif
* pr/23071:
  Polish "Replace with 'Integer.compare()'"
  Replace with 'Integer.compare()'

Closes gh-23071
2019-06-03 08:34:43 +02:00
Stephane Nicoll 0ef4349c4d Polish "Replace with 'Integer.compare()'"
See gh-23071
2019-06-03 08:31:57 +02:00
Issam El-atif 7ce3792672 Replace with 'Integer.compare()'
See gh-23071
2019-06-03 08:31:19 +02:00
Sebastien Deleuze e0bb712bfc Update Kotlin documentation 2019-05-31 14:15:44 +02:00
Sam Brannen 3794a57651 Improve AnnotationProcessorPerformanceTests with Awaitility 2019-05-30 12:07:30 +02:00
Sam Brannen f66eef1f88 Fix SortedPropertiesTests on JDK 9+ 2019-05-30 10:41:49 +02:00
Rossen Stoyanchev eacc531cf7 Add dataMimeType to RSocketRequestBuilder
Closes gh-23012
2019-05-29 17:08:46 -04:00
Rossen Stoyanchev 64f3dbbee8 Polish in rsocket package 2019-05-29 17:08:46 -04:00
Сергей Цыпанов aaeabc3c85 Simplify iteration over maps
Closes gh-23053
2019-05-29 18:00:34 +02:00
Sebastien Deleuze 5b04b04b69 Merge branch '5.1.x' 2019-05-29 11:54:40 +02:00
Brian Clozel 4b8ce04bdc Mark Spring web config classes as proxyBeanMethods=false
Closes gh-23004
2019-05-28 19:11:35 +02:00
Johnny Lim 83078eb6fd Add constants for application/cbor to MediaType
Closes gh-23042
2019-05-28 18:51:25 +02:00
Sam Brannen 53597f90e9 Remove dependency on StringUtils in SortedProperties
See gh-23018, gh-22383
2019-05-28 18:31:54 +02:00
Brian Clozel 1cfedb20b8 Add new constructor to JettyClientHttpConnector
This commit adds a new constructor to `JettyClientHttpConnector` and
deprecates another one. Jetty is not creating `HttpClient` instances
using a builder API, but rather setting immutable configuration at
constructor time and using setters for the rest.

This commit addresses that by deprecating the constructor variant
accepting a `Consumer` and just delegating to Spring's implementation
for setting the client resources as needed.

Closes gh-22977
2019-05-28 16:59:51 +02:00
Сергей Цыпанов 7ef8cc9faf Tiny improvements regarding ArrayList creation
Closes gh-23047
2019-05-28 16:08:58 +02:00
zyan f492e37370 Fix typo
provices -> provides

See gh-23046
2019-05-28 16:00:35 +02:00
Sam Brannen 7c9c8220d8 Polish YAML tests 2019-05-28 15:27:11 +02:00
Sam Brannen c6818fe15b Polishing
See gh-23018
2019-05-28 14:53:24 +02:00
Sam Brannen 141ef9082f Clean up Mockito usage
This commit migrates to the MockitoJUnitRunner where sensible, which
will later allow for an easier migration to Mockito's extension for
JUnit Jupiter.

In addition, this commit deletes unnecessary stubbing for various mocks
and polishes test fixture setup in various test classes.
2019-05-28 13:59:43 +02:00
Sam Brannen d495902a9c Polish Javadoc 2019-05-28 12:37:50 +02:00
Sam Brannen c39c4211df Introduce support for sorted Properties
This commit introduces an internal SortedProperties class that is a
specialization of java.util.Properties which sorts properties
alphanumerically based on their keys.

This can be useful when storing a java.util.Properties instance in a
properties file, since it allows such files to be generated in a
repeatable manner with consistent ordering of properties.

Comments in generated properties files can also be optionally omitted.

An instance of SortedProperties can be created via two new
createSortedProperties() factory methods in
org.springframework.core.CollectionFactory.

Closes gh-23018
2019-05-28 12:23:56 +02:00
Brian Clozel 98079a364d Revert asciidoctorj-pdf upgrade
See gh-23006
2019-05-28 11:47:30 +02:00
Sebastien Deleuze 9905200f69 Merge branch '5.1.x' 2019-05-28 08:01:23 +02:00
Christoph Dreis 4e4145ac27 Avoid unnecessary call to get message type
Closes gh-23040
2019-05-28 07:21:08 +02:00
Sebastien Deleuze bc205e0dbf Remove charset parameter from Spring MVC JSON content type
This change is a follow-up to the ones done as part of gh-22788.

Closes gh-22954
2019-05-27 18:14:19 +02:00
Sam Brannen 30944ed2e2 Attempt to make AbstractSchedulingTaskExecutorTests more robust 2019-05-27 13:02:30 +02:00
Sam Brannen bdf3960283 Suppress warnings in Gradle build 2019-05-27 12:15:50 +02:00
Sam Brannen 32277b74db Attempt to make AbstractSchedulingTaskExecutorTests more robust 2019-05-27 12:01:34 +02:00
Sam Brannen 4b9f5a35a6 Polish contribution 2019-05-27 11:22:11 +02:00
Сергей Цыпанов 6964ed33bf Allocate objects only when it's necessary
Closes gh-23036
2019-05-27 11:14:25 +02:00
Phillip Webb 6f2f5bb8c1 Fix annotation exceptions in tight memory
Update `AnnotationTypeMapping` so that instance comparisons are no
longer used when checking attribute methods. Prior to this commit,
in an environment with tightly constrained memory, the method cache
could be cleared and different method instances would be returned.

Closes gh-23010
2019-05-26 14:59:33 -07:00
Phillip Webb e386e53f92 Use less confusing MergedAnnotation method names
Rename some `MergedAnnotation` methods to prevent using parent/child
terminology, specifically:

	`getDepth()` has been renamed `getDistance()`
	`getParent()` has been renamed `getMetaSource()`
	`getTypeHierarchy()` has been renamed `getMetaTypes()`

The parent child naming was particularly confusing given that the
parent/child relationships were inverted from the way that a lot of
users think about meta-annotations. For example, a `@RequestMapping`
having a parent of `@GetMapping` feels odd given that `@GetMapping`
is the thing declaring the meta-annotation relationship.

The new method names are designed to align more closely with existing
terms. For example, `getMetaSource` hints at the relationship with
`isMetaAnnotated` and `getSource`.

Closes gh-22946
2019-05-26 13:15:59 -07:00
Sam Brannen 4f4427f550 Migrate TestNG assertions to AssertJ
Migrate all existing TestNG based assertions to AssertJ and add
Checkstyle rules to ensure they don't return.

See gh-23022
2019-05-26 18:29:39 +02:00
Sam Brannen 50cc23ca55 Use the JUnit Platform Test Kit in spring-test 2019-05-26 14:28:09 +02:00
Sam Brannen 43119deb08 Polishing 2019-05-26 14:28:09 +02:00
Sam Brannen 09db8881bb Fix Checkstyle violation 2019-05-26 14:28:09 +02:00
stsypanov 4cc7b9b9fc tiny simplifications regarding usage of Iterator 2019-05-25 20:32:43 +02:00
Juergen Hoeller 8f972a5a60 Merge branch '5.1.x' 2019-05-24 23:46:25 +02:00
Juergen Hoeller 3c3d828e6c Actually test LiteConfiguration arrangement
Closes gh-23013
2019-05-24 23:18:10 +02:00
Phillip Webb 6b9160b3ae Restore transaction specific assertions
Revert 82d0e49d and instead create a `TransactionAssert` class.

Closes gh-23022
2019-05-24 11:09:44 -07:00
Sam Brannen 5a1217cafe Migrate JUnit Jupiter assertions to AssertJ
Migrate all existing JUnit Jupiter based assertions to AssertJ and add
Checkstyle rules to ensure they don't return.

See gh-23022
2019-05-24 18:50:01 +02:00
Sam Brannen f47481749b Fix Checkstyle violation 2019-05-24 18:33:29 +02:00
Sam Brannen ecf45edfb6 Upgrade to reactor Dysprosium snapshots 2019-05-24 18:19:35 +02:00
Sam Brannen 0aaf5785dd Merge branch '5.1.x' 2019-05-24 18:18:21 +02:00
Stephane Nicoll d106ae0d80 Upgrade to reactor Dysprosium snapshots 2019-05-24 14:22:55 +02:00
Stephane Nicoll 40c82d8871 Merge branch '5.1.x' 2019-05-24 14:22:19 +02:00
Sam Brannen a4cd547b7e Fix ScriptUtilsUnitTests 2019-05-24 10:46:50 +02:00
Sam Brannen 303216f4eb Merge branch '5.1.x' 2019-05-24 10:18:25 +02:00
Diego Castro 2f8aa368fe Fix code example for validation on functional endpoints
Closes gh-23020
2019-05-24 09:41:17 +02:00
Phillip Webb 82d0e49de9 Inline methods from TransactionTestUtils
Delete `TransactionTestUtils` and inline AssertJ assertions
instead.

Closes gh-23022
2019-05-23 16:38:39 -07:00
Phillip Webb 9d74da006c Migrate JUnit 4 assertions to AssertJ
Migrate all existing JUnit 4 `assert...` based assertions to AssertJ
and add a checkstyle rule to ensure they don't return.

See gh-23022
2019-05-23 15:52:49 -07:00
Phillip Webb 95a9d46a87 Migrate Hamcrest assertions to AssertJ
Migrate all existing `assertThat(..., Matcher)` assertions to AssertJ
and add checkstyle rules to ensure they don't return.

See gh-23022
2019-05-23 15:49:59 -07:00
Rossen Stoyanchev 2294625cf0 Exposes STOMP frame stats
Closes gh-23015
2019-05-23 18:32:11 -04:00
Rossen Stoyanchev e09c5fd9e5 Use TaskExecutor instead of ThreadPoolTaskExecutor
Closes gh-22943
2019-05-23 14:26:51 -04:00
Rossen Stoyanchev 0b2fcbfe8a Use TaskScheduler instead of ThreadPoolTaskScheduler
Closes gh-22943
2019-05-23 14:01:05 -04:00
Rossen Stoyanchev d30778458a Create SECURITY.md 2019-05-23 11:36:52 -04:00
Rossen Stoyanchev 31135cc2c4 Merge branch '5.1.x' 2019-05-23 10:41:33 -04:00
Rossen Stoyanchev 3a5fb1fdf3 Fix test failing after #99302f 2019-05-23 10:38:08 -04:00
Rossen Stoyanchev 71396121a7 Merge branch '5.1.x' 2019-05-23 09:57:29 -04:00
D瓜哥 f39fde7460 Upgrade to asciidoctorj-pdf version 1.5.0-alpha.17
Closes gh-23006
2019-05-23 15:22:11 +02:00
Sam Brannen f806594e60 Introduce getOrEmpty(String) convenience method in HttpHeaders
This commit introduces a getOrEmpty(String) method in HttpHeaders that
returns an immutable, empty list if no values are present for the
specified header name. This is provided as a convenience over the
existing get(String) method which returns null in such cases.

Closes gh-22949
2019-05-22 15:26:45 +02:00
Sam Brannen 9ca7354146 Polishing 2019-05-22 15:22:29 +02:00
Sam Brannen 819097a07a Clean up warning in Gradle build 2019-05-22 14:48:40 +02:00
Juergen Hoeller 8a33ef2d14 Merge branch '5.1.x' 2019-05-21 21:06:38 +02:00
Rossen Stoyanchev 438d3710d3 Detect MimeType via ConnectionSetupPayload
Closes gh-23012
2019-05-21 14:07:59 -04:00
Juergen Hoeller 3645281c35 Polishing 2019-05-21 19:26:39 +02:00
Juergen Hoeller ff838fd011 Consistently support CompletionStage in ReactiveAdapterRegistry
Aligns ReactiveAdapterRegistry with MVC/messaging handler methods in terms of recognizing CompletionStage as well as CompletableFuture. Includes consistent use of ReactiveAdapter for reactive transactions.

Closes gh-23011
2019-05-21 19:26:12 +02:00
Arjen Poutsma 9b3c92e8d2 Add leading slash for path predicate if not present
This commit adds a leading slash for path predicates in both
WebFlux.fn and WebMvc.fn.

Closes gh-22795
2019-05-21 12:09:36 +02:00
Juergen Hoeller c329bad42a Merge branch '5.1.x' 2019-05-21 00:16:35 +02:00
Juergen Hoeller 171e8f56a3 Merge branch '5.1.x' 2019-05-20 22:27:37 +02:00
stsypanov 6f07a504b8 A couple of trivial simplifications 2019-05-20 21:41:15 +02:00
Phillip Webb 02850f357f Migrate exception checking tests to use AssertJ
Migrate tests that use `@Test(expectedException=...)` or
`try...fail...catch` to use AssertJ's `assertThatException`
instead.
2019-05-20 10:47:53 -07:00
Phillip Webb fb26fc3f94 Polishing 2019-05-20 10:46:20 -07:00
Juergen Hoeller a363fed209 Merge branch '5.1.x' 2019-05-20 17:21:07 +02:00
Johnny Lim 21e163e5da Fix typo 2019-05-20 16:41:05 +02:00
Rossen Stoyanchev bd910fc62b Fix checkstyle errors 2019-05-16 20:49:49 -04:00
Rossen Stoyanchev 60e4649ff3 Merge branch '5.1.x' 2019-05-16 20:42:09 -04:00
Rossen Stoyanchev ed2a3bd451 Take advantage of Encoder#encodeValue
EncoderHttpMessageWriter takes advantage of the Encoder#encodeValue
that's new in 5.2 in order to produce a Mono<DataBuffer> instead of
producing a Flux<DataBuffer> and then using flux.singleOrEmpty().

Closes gh-22952
2019-05-15 17:31:59 -04:00
Rossen Stoyanchev 013249757a Merge branch '5.1.x' 2019-05-15 16:44:05 -04:00
Arjen Poutsma a30a134c23 Make StringDecoder use DataBufferUtils.split
* Added DataBufferUtils.split variant that takes multiple delimiters
  as argument (instead of 1).
* Use this new split() variant from within StringDecoder, replacing
  its inefficient algorithm with the Knuth-Morris-Pratt algorithm.
2019-05-15 16:07:28 +02:00
Rossen Stoyanchev b1912f6acc Fix checkstyle error 2019-05-15 08:29:41 -04:00
Rossen Stoyanchev 97c2de915a Add RouteMatcher
Closes gh-22642
2019-05-14 21:44:39 -04:00
Rossen Stoyanchev afc0ae3752 Add hasPatternSyntax method to PathPattern 2019-05-14 15:36:47 -04:00
Rossen Stoyanchev ac6c96a391 Polish 2019-05-13 13:45:25 -04:00
Juergen Hoeller e0654a5b3d Merge branch '5.1.x' 2019-05-13 19:22:07 +02:00
Juergen Hoeller 9755b59197 Merge branch '5.1.x' 2019-05-13 18:05:07 +02:00
stsypanov 9ca8681f79 Iteration over a map using EntrySet 2019-05-13 15:38:13 +02:00
Sam Brannen 785e8d8116 Polish MergedAnnotation support 2019-05-13 14:11:29 +02:00
Juergen Hoeller cfc4a59135 Merge branch '5.1.x' 2019-05-13 13:40:07 +02:00
Johnny Lim 9a6ce66bd9 Add a missing single quote in assertion message 2019-05-13 12:04:22 +02:00
Sam Brannen 73dbd06361 Enforces static imports for JUnit 4 assertions and assumptions
This commit configures Checkstyle to enforces static imports for JUnit 4
assertions and assumptions.

See gh-22932
2019-05-12 15:13:07 +02:00
Sam Brannen deecab6311 Use assertThat from Hamcrest instead of JUnit 4
org.junit.Assert.assertThat() is deprecated as of JUnit 4.13.

See gh-22894
2019-05-12 14:46:55 +02:00
Sam Brannen 724c805211 Discontinue use of JUnit 3 APIs
This commit also ensures that the JSR-330 TCK is executed with the
normal build by adhering to naming conventions for test classes.

See gh-22894
2019-05-12 14:46:55 +02:00
Sam Brannen 5685e9dfa3 Add Checkstyle rules for deprecated JUnit APIs
This commit adds Checkstyle rules to disallow imports of the following.

- junit.framework.*
- org.junit.Assert.assertThat
- org.junit.Assume.assumeThat

See gh-22894
2019-05-12 14:46:55 +02:00
Sam Brannen 9e1ed6c771 Fix build on JDK 9+ 2019-05-12 13:46:14 +02:00
Sam Brannen da1b004254 Merge branch '5.1.x' 2019-05-11 18:21:44 +02:00
Sam Brannen 33fcde4c3e Merge branch '5.1.x' 2019-05-11 18:04:48 +02:00
Sam Brannen 6ef7d7124e Clean up warnings 2019-05-11 15:51:06 +02:00
Sam Brannen 64819bbc1d Clean up warnings 2019-05-10 18:00:29 +02:00
Sam Brannen 0cff7eb32c Fix Javadoc links 2019-05-10 17:40:03 +02:00
Sam Brannen 9b61316c2e Clean up warnings in spring-web 2019-05-10 17:31:23 +02:00
Stephane Nicoll f188aab5f2 Merge branch '5.1.x' 2019-05-10 10:49:59 +02:00
Stephane Nicoll 6d69a4e03a Merge branch '5.1.x' 2019-05-10 09:57:25 +02:00
Stephane Nicoll 4606209ad4 Merge branch '5.1.x' 2019-05-09 17:09:54 +02:00
Sam Brannen d8f1d56100 Fix broken test 2019-05-09 16:21:54 +02:00
Sam Brannen 1be29d5933 Document automatic constructor injection in JUnit Jupiter
Closes gh-22928
2019-05-09 16:16:32 +02:00
Sebastien Deleuze c601ecf169 Merge branch '5.1.x' 2019-05-09 15:00:53 +02:00
Juergen Hoeller 0b50d1eff3 Merge branch '5.1.x' 2019-05-09 14:29:37 +02:00
Denis Zavedeev c80028b71e Fix trivial errors in integration.adoc 2019-05-09 13:50:26 +02:00
Sam Brannen 8e29eca1eb Merge branch '5.1.x' 2019-05-09 13:25:21 +02:00
Sam Brannen e465f51d56 Suppress deprecation warnings 2019-05-09 13:21:42 +02:00
Sam Brannen dc1c110288 Delete dead code 2019-05-09 13:21:27 +02:00
Rossen Stoyanchev fd48bf1dbe Merge branch '5.1.x' 2019-05-08 21:05:42 -04:00
Rossen Stoyanchev ed61f44545 Upgrade to Disprosium-M1
Closes gh-22930
2019-05-08 20:55:31 -04:00
Rossen Stoyanchev 06c3a058f4 Use most recent RSocket RC for M2 release 2019-05-08 20:34:22 -04:00
Juergen Hoeller 8b08b6812a Merge branch '5.1.x' 2019-05-09 02:26:23 +02:00
Phillip Webb 798b51f4a3 Migrate to BDD Mockito
Migrate all tests to consistently use BDD Mockito. Also add
checksyle rule to enforce going forwards.
2019-05-08 13:46:13 -07:00
Phillip Webb 816bbee8de Remove '.*' imports from tests
Organize test imports to expand all '.*' static imports into
fully qualified imports.

This update will allow us to use additional checkstyle rules in
the future, and will also help if we migrate fully to AssertJ.
2019-05-08 09:55:09 -07:00
Phillip Webb 1b985fb3da Update static import limit in eclipse prefs
Update eclipse preferences so that static imports no longer use
`.*`.
2019-05-08 09:53:01 -07:00
Phillip Webb 66eb86f055 Delete unused Matchers class
Delete the `Matches` class since it's no longer being used.
2019-05-08 09:52:39 -07:00
Juergen Hoeller d3b713d5f0 Upgrade to Protobuf 3.7.1 and HtmlUnit 2.35 2019-05-08 17:52:56 +02:00
Juergen Hoeller fb29088670 Revise LinkedCaseInsensitiveMap's lazy key/value/entry collections
Closes gh-22926
2019-05-08 17:52:28 +02:00
Juergen Hoeller 82d32f0875 Remove unused import 2019-05-08 17:51:54 +02:00
Sam Brannen 4038d590a1 Suppress deprecation warning in Gradle build 2019-05-08 17:18:41 +02:00
Rossen Stoyanchev 44659f4945 Unwrap Part content in asyncPart builder method
Closes gh-22876
2019-05-08 10:59:58 -04:00
Sam Brannen 6a05b97df3 Log identity hash for ApplicationContext for context cache hits/misses
DefaultCacheAwareContextLoaderDelegate now logs the identity hash code
for an application context instance that was stored in or retrieved from
the context cache in the Spring TestContext Framework.

Closes gh-22925
2019-05-08 16:39:23 +02:00
Sam Brannen 4d1637a9b7 Avoid warnings in RequestMappingHandlerMappingTests 2019-05-08 16:29:31 +02:00
Phil Webb d7320de871 Migrate away from ExpectedException (#22922)
* Add limited checkstyles to test code

Add a limited set of checkstyle rules to the test codebase to improve
code consistency.

* Fix checksyle violations in test code

* Organize imports to fix checkstyle for test code

* Migrate to assertThatExceptionOfType

Migrate aware from ExpectedException rules to AssertJ exception
assertions. Also include a checkstyle rules to ensure that the
the ExpectedException is not accidentally used in the future.

See gh-22894
2019-05-08 16:25:52 +02:00
Rossen Stoyanchev 7e6e3d7027 Switch writeAcceptCharset to false by default
Closes gh-22506
2019-05-08 09:56:52 -04:00
Rossen Stoyanchev a9f0eae4ab Merge branch '5.1.x' 2019-05-08 09:41:10 -04:00
Sam Brannen 77eef47483 Support automatic constructor injection in JUnit Jupiter
Prior to this commit, dependency injection of all arguments in a test
class constructor invoked by JUnit Jupiter was only possible if the
constructor was explicitly annotated with @Autowired.

This commit introduces support for a configurable "test constructor
autowire" mode which defaults to false in order to remain backwards
compatible.

Specifically, this mode can be configured globally for an entire test
suite via a new "spring.test.constructor.autowire" JVM system property
that can alternatively be configured via the SpringProperties
mechanism. In addition, the global "test constructor autowire" mode can
be overridden locally on a per-class basis via the new @TestConstructor
annotation.

Closes gh-22286
2019-05-08 14:51:43 +02:00
Juergen Hoeller eb16e853b1 Fix JDK 9+ generics compilation problem in TransactionAspectSupport
Includes consistent mentioning of ReactiveTransactionManager in javadoc.

Closes gh-22923
2019-05-08 14:01:12 +02:00
Arjen Poutsma dc01917dae Javadoc 2019-05-08 12:21:00 +02:00
Arjen Poutsma 2352688ccb MultipartIntegrationTests should not bind to same part multiple times
DefaultMultipartMessageReader does not cache the part contents, so
binding to the same part multiple times does not work.
Rewrote this test to use separate HTTP request instead.
2019-05-08 12:10:20 +02:00
Arjen Poutsma e7cca7792d Add way to override default multipartReader
This commit introduces a way to override the default multipart reader,
for instance to the SynchronossPartHttpMessageReader.
2019-05-08 12:10:20 +02:00
Arjen Poutsma 32915d8bf5 Add logging to DefaultMultipartMessageReader 2019-05-08 12:10:20 +02:00
Arjen Poutsma e625ace8c8 Add reference counting for UndertowDataBuffer
This commit adds proper reference counting to the UndertowDataBuffer.
2019-05-08 12:09:16 +02:00
Rossen Stoyanchev 45147c23c1 Empty body checks in ConsumesRequestCondition
Normally consumes matches the "Content-Type" header but what should be done if
there is no content? This commit adds checks for method parameters with
@RequestBody(required=false) and if "false" then also match requests with no content.

Closes gh-22010
2019-05-07 22:03:36 -04:00
Juergen Hoeller cdf51c3d51 Nullability refinements and related polishing 2019-05-08 00:27:56 +02:00
Juergen Hoeller c5b3848357 Nullability refinements and related polishing
Includes fix for typo in visitor class names.

See gh-22909
2019-05-08 00:27:47 +02:00
Phillip Webb 7031964e49 Deprecate StandardMetadata constructors
Deprecate the public `StandardMetadata` constructors to make it clearer
that these classes should not be instantiated directly. A new
`AnnotationMetadata.introspect` factory method has been added which
can now be used to obtain instances.

This change will allow use to make the constructors package private
and drop the `nestedAnnotationsAsMap` parameter in a future release.

Closes gh-22906
2019-05-07 23:12:42 +02:00
Phillip Webb 7fbf3f97cd Add SimpleAnnotationMeta classes and readers
Replace the existing ASM based readers with new implementations that
also support MergedAnnotations. The meta-data classes themselves are
now immutable, and constructed via separate reader classes.

The `SimpleMetadataReader` class has been updated to return the new
classes, however the old ones remain since some of them are public
and might be being used directly.

Closes gh-22884
2019-05-07 23:12:42 +02:00
Phillip Webb 8c2ccfe6a3 Add MergedAnnotations support to meta-data classes
Add `AnnotatedTypeMetaData.getAnnotations()` that can be used to access
annotation details using the `MergedAnnotations` interface.

Where possible, the existing annotation methods have been migrated to
call `getAnnotation()`, rather than needing their own implementation.

The existing ASM based meta-data implementations have not been updated
since they will be deprecated and replaced in a subsequent commit.

See gh-22884
2019-05-07 23:12:42 +02:00
Phillip Webb 30ba80a3c3 Reduce meta-data code duplicate with default methods
Extract and pull-up some common method implementations and make them
default methods of the interface.

See gh-22884
2019-05-07 23:12:42 +02:00
Phillip Webb f592c1f211 Add additional class/method meta-data tests
Add some additional tests to provide more coverage of class and method
meta-data support.

See gh-22884
2019-05-07 23:12:42 +02:00
Phillip Webb 9738e4886c Use ReflectionUtils to get declared methods
Update `StandardAnnotationMetadata` to use `ReflectionUtils` when
obtaining declared methods. This update is primarily so that the common
method cache can be used.

Closes gh-22907
2019-05-07 23:12:42 +02:00
Phillip Webb 1fa5937834 Skip java.lang.annotations when reading metadata
Update `StandardAnnotationMetadata` and `AnnotationMetadataReadingVisitor`
so that `java.lang.annotation` annotations are consistently skipped.

Closes gh-22885
2019-05-07 23:12:42 +02:00
Phillip Webb 8a293f51a4 Don't expose RetentionPolicy.CLASS annotations
Update ASM based metadata readers so that only RetentionPolicy.RUNTIME
annotations are exposed. This aligned behavior with the reflection based
implementation.

Closes gh-22886
2019-05-07 23:12:42 +02:00
Phillip Webb 9d6cf57cb7 Add MergedAnnotations.of method
Add a factory method to `MergedAnnotation` that allows an instance to
be created for an explicit collection of root annotations. This method
will allow ASM based readers to expose a `MergedAnnotation` instance
that has root annotations loaded from bytecode, and meta-annotations
loaded using reflection.

See gh-22884
2019-05-07 23:12:42 +02:00
Phillip Webb daec3531b3 Support String->Class adaptation in MergedAnnotation
Update TypeMappedAnnotation so that Strings can be used to represent
Class attribute values. This will allow ASM annotation readers to
present a `MergedAnnotation` instance without necessarily having the
actual class values on the classpath.

When the underlying value is a String, any calls to
`getValue(name, String.class)` or `asMap(Adapt.CLASS_TO_STRING)` will
simply return the original String. Calls that need the actual Class
result (such as `getClass`) will use `Class.forName` and may throw
a `ClassNotFoundException` at that point.

This commit also allows an empty Object[] to be used to represent
any empty primitive array.

See gh-22884
2019-05-07 23:12:42 +02:00
Phillip Webb e11990e63d Polishing MergedAnnotation code 2019-05-07 23:12:42 +02:00
Phillip Webb d4a761abea Rename some MergedAnnotation from methods to of
Rename `from` to `of` for the `MergedAnnotation` factory methods that
work with Maps. The previous name was a little confusing, especially
when an annotation source parameter was specified. The new method name
helps to make it clearer when the user is explicitly defining the
attributes of the annotation, as opposed to picking them up from the
source.
2019-05-07 23:12:42 +02:00
Phillip Webb 3b145a5a73 Add MergedAnnotation.getTypeHierarchy method
Add a `getTypeHierarchy()` method to `MergedAnnotation` that can be used
to return the full type hierarchy information. This method is
specifically designed to be used in combination with
`MergedAnnotationPredicates.unique`.

This update also allows us to delete the `parentAndType` method
from `AnnotatedElementUtils`.

Closes gh-22908
2019-05-07 23:12:42 +02:00
Phillip Webb f86affe404 Extract integration test classes from package-info
Extract the inner classes from package-info into their own files to
prevent local build problems and to make them easier to find.
2019-05-07 23:12:42 +02:00
Juergen Hoeller fff3813d75 Properly detect importing class metadata for lite configuration class
Closes gh-22920
2019-05-07 21:23:47 +02:00
Arjen Poutsma 00a5106bfa Add route(RequestPredicate, HandlerFunction) to RouterFunctions builder
Closes gh-22701
2019-05-07 16:49:02 +02:00
Mark Paluch bb002af8af Fix suspend/resume in AbstractReactiveTransactionManager
We now correctly unwrap suspended resources instead capturing
the Mono emitting suspended resources.

We also properly continue resume by chaining resume Mono's
instead of terminating eagerly.
2019-05-07 15:51:27 +02:00
Arjen Poutsma 55b56b8c5c Javadoc
Closes gh-22893
2019-05-07 15:24:33 +02:00
Arjen Poutsma 59f6044c09 Add route(RequestPredicate, HandlerFunction) to RouterFunctions builder
Closes gh-22701
2019-05-07 15:06:59 +02:00
Johnny Lim 49570ae2f3 Fix typo 2019-05-07 14:25:22 +02:00
Juergen Hoeller e3fa4e1350 Merge branch '5.1.x' 2019-05-07 14:24:28 +02:00
Nicofisi 0e980324e6 Add a space in the documentation index file 2019-05-07 13:29:59 +02:00
Juergen Hoeller ba1c7192c9 Merge branch '5.1.x' 2019-05-07 13:09:44 +02:00
Sam Brannen ccb01e663a Merge branch '5.1.x' 2019-05-07 13:03:45 +02:00
Juergen Hoeller 7e5aacf8a2 Merge pull request #22421 from olszewskimichal/LinkedMultiValueMap-OutOfBoundException-When-EmptyList
LinkedMultiValueMap.getFirst - check that values is not empty
2019-05-07 12:44:05 +02:00
Juergen Hoeller 8eb9782ca2 Polishing 2019-05-07 12:43:36 +02:00
Arjen Poutsma fb642ce723 Introduce DefaultMultipartMessageReader
This commit introduces the DefaultMultipartMessageReader, a fully
reactive multipart parser that does have any third party dependencies.

Closes gh-21659
2019-05-07 12:14:45 +02:00
Arjen Poutsma f747ba282a Add DataBufferUtils.matcher and split
Added two methods to DataBufferUtils:

* matcher(byte[]), which returns a Matcher object that can be used to
  find a delimiter in a data buffer.
* split(Publisher<DataBuffer>, byte[] delimiter), which splits a given
  stream of data buffers around a given delimiter.
2019-05-07 12:14:45 +02:00
Arjen Poutsma b74c09d12e Add DataBuffer.retainedSlice
Add method retainedSlice to the DataBuffer, defaulting to using
DataBufferUtils for retain, but allowing for ByteBuf specific override.
2019-05-07 12:14:45 +02:00
Mark Paluch 1d80cbea35 Replace signal materialization in TransactionAspectSupport with usingWhen
We now use Flux.usingWhen() instead materialize/dematerialize operators
to reuse Reactor's resource closure.

Until usingWhen() accepts a BiFunction to consume error signals,
we need to map error signals outside of usingWhen which requires
re-wrapping of the ReactiveTransaction object.

Also, reuse the current TransactionContext to leave Transaction
creation/propagation entirely to ReactiveTransactionManager instead
of creating new TransactionContexts.
2019-05-07 11:23:20 +02:00
Juergen Hoeller 28c5d7b586 Merge branch '5.1.x' 2019-05-07 02:12:11 +02:00
Stephane Maldini d45f7c4828 Use explicit onErrorMap(class.java) instead of reactor kotlin extension 2019-05-06 16:45:01 -07:00
Juergen Hoeller 85cecb66e5 Consistent parameter retrieval across InvocableHandlerMethod variants
See gh-22900
2019-05-07 01:33:07 +02:00
Juergen Hoeller f56c70d2f0 Merge branch '5.1.x' 2019-05-07 01:23:16 +02:00
Stephane Maldini fd36d1efe6 Use explicit expectError(class.java) instead of reactor kotlin extension 2019-05-06 16:22:25 -07:00
Stephane Maldini 3f8be3416e Use explicit cast to avoid dependency on reactor-core kotlin extension 2019-05-06 16:13:05 -07:00
Juergen Hoeller 30a1f6fed5 Consistent exception naming across InvocableHandlerMethod variants
See gh-22900
2019-05-07 01:00:45 +02:00
Juergen Hoeller 4b06d8e511 Merge branch '5.1.x' 2019-05-07 00:59:56 +02:00
Ippei Nawate 47ff92873b Add null check 2019-05-07 00:23:48 +02:00
Sebastien Deleuze 2b3df1fa30 Merge branch '5.1.x' 2019-05-06 22:11:11 +02:00
Rossen Stoyanchev 53cadf15e7 Deferred handling of Flux error in Spring MVC
This commit defers flushing of the response until the first item is
emitted that needs to be written (and flushed) to the response.

This makes Spring MVC consistent with WebFlux in this regard.

Closes gh-21972
2019-05-06 12:26:25 -04:00
Rossen Stoyanchev 15e1af2281 Protected methods to determine payload target type
Closes gh-22035
2019-05-06 09:34:21 -04:00
Sebastien Deleuze e16a134075 Refine WebFlux Kotlin extensions
ServerRequest:
 - awaitPrincipalOrNull is renamed to awaitPrincipal since
 there is no non-nullable variant

ServerResponse:
 - new BodyBuilder.sse() extension
 - BodyBuilder.bodyToServerSentEvents is deprecated in favor
   of sse().body()
 - BodyBuilder.bodyAndAwait(flow: Flow<T>) is renamed to
   bodyFlowAndAwait to avoid shadowing of
   BodyBuilder.bodyAndAwait(body: Any)
 - BodyBuilder.bodyToServerSentEventsAndAwait is removed,
   sse().bodyAndAwait() should be used instead

Closes gh-22899
2019-05-06 11:00:58 +02:00
Sam Brannen d616e10dca Use assertThat from Hamcrest instead of JUnit 4
org.junit.Assert.assertThat() is deprecated as of JUnit 4.13.

See gh-22894
2019-05-05 19:26:04 +02:00
Sam Brannen 47c39304af Use assertThat from Hamcrest instead of JUnit 4
org.junit.Assert.assertThat() is deprecated as of JUnit 4.13.

See gh-22894
2019-05-05 18:27:38 +02:00
Sam Brannen c79fdfb668 Use assertThat from Hamcrest instead of JUnit 4
org.junit.Assert.assertThat() is deprecated as of JUnit 4.13.

See gh-22894
2019-05-05 18:09:11 +02:00
Sam Brannen d4379630e2 Use assertThat from Hamcrest instead of JUnit 4
org.junit.Assert.assertThat() is deprecated as of JUnit 4.13.

See gh-22894
2019-05-05 17:31:31 +02:00
Sam Brannen 0aeb7d1e02 Delete dead code in TransactionSynchronizationManager 2019-05-05 17:29:54 +02:00
Sam Brannen 1928167d5d Delete dead code in ReactiveTransactionInterceptorTests 2019-05-05 17:21:15 +02:00
Sam Brannen 772ef40920 Upgrade to JUnit 4.13-beta-3
See gh-22894
2019-05-05 16:56:48 +02:00
Sam Brannen 7ed4df20a8 Ensure AbstractReactiveTransactionManager compiles in Eclipse IDE 2019-05-05 16:46:11 +02:00
Sam Brannen 3dc38a08c8 Add missing return in AbstractReactiveTransactionManager.processCommit() 2019-05-05 16:30:26 +02:00
Sam Brannen 21864c80d7 Suppress warning 2019-05-05 16:28:45 +02:00
Stephane Nicoll 0b97cc9ebd Polish 2019-05-05 09:13:09 +02:00
Stephane Nicoll 7d0a49474e Merge pull request #22891 from rewolf
* pr/22891:
  Polish contribution
  Polish CONTRIBUTING.md
2019-05-05 09:08:58 +02:00
Stephane Nicoll 1542d97dab Polish contribution
Closes gh-22891
2019-05-05 09:08:21 +02:00
Andrew Flower 6eb4ac60ab Polish CONTRIBUTING.md
See gh-22891
2019-05-05 09:08:06 +02:00
Juergen Hoeller 28039057fd Consistent naming of HandlerMethodArgumentResolver implementations
Includes combined imports of assertion methods and related polishing.

Closes #22889
2019-05-04 18:30:56 +02:00
Juergen Hoeller 30bbf91dba Rename PayloadArgumentResolver to PayloadMethodArgumentResolver
Closes gh-22888
2019-05-04 17:35:34 +02:00
Juergen Hoeller 57984c5705 Move package annotation.support.reactive to annotation.reactive
Aligned with invocation.reactive and transaction.reactive packages.

Closes gh-22887
2019-05-04 17:34:32 +02:00
Juergen Hoeller 9eb095d921 Merge branch '5.1.x' 2019-05-04 12:04:48 +02:00
Johnny Lim d489227874 Use HttpHeaders constants where possible 2019-05-04 11:14:08 +02:00
Juergen Hoeller ffbecf1427 Fix Checkstyle violation 2019-05-03 18:24:30 +02:00
Juergen Hoeller f0f6af2926 Merge branch '5.1.x' 2019-05-03 18:13:12 +02:00
Mark Paluch 83046531da Replace signal materialization in TransactionalOperator with usingWhen
We now use Flux.usingWhen() instead materialize/dematerialize operators
to reuse Reactor's resource closure.

Until usingWhen() accepts a BiFunction to consume error signals,
we need to map error signals outside of usingWhen which requires
re-wrapping of the ReactiveTransaction object.
2019-05-03 16:13:37 +02:00
Mark Paluch 9cff07ce35 Fix doCleanupAfterCompletion invocation
doCleanupAfterCompletion gets now subscribed to when processing
cleanup after a new transaction.
2019-05-03 16:13:37 +02:00
Juergen Hoeller ec8689d1fc Merge branch '5.1.x' 2019-05-03 14:23:59 +02:00
Sebastien Deleuze fc8d5c068c Support final @Configuration(proxyBeanMethods = false) classes
Closes gh-22869
2019-05-03 13:45:14 +02:00
Juergen Hoeller a2a6bc3d47 Introduce TransactionDefinition.withDefaults() shortcut
Such a static unmodifiable TransactionDefinition with defaults can be used for getTransaction(null) calls, now also possible for getReactiveTransaction. Furthermore, it can be used for a simple TransactionalOperator.create(ReactiveTransactionManager) method without an internal dependency on the transaction.support package.

See gh-22646
2019-05-03 12:28:41 +02:00
Juergen Hoeller eaa9a78d5d Merge branch '5.1.x' 2019-05-03 00:23:57 +02:00
Juergen Hoeller ce9162065c Merge branch '5.1.x' 2019-05-02 17:52:12 +02:00
Juergen Hoeller 8a57997d21 Avoid use of Objects.requireNonNull plus related polishing 2019-05-02 16:32:47 +02:00
Juergen Hoeller 0be610b0ee Support for reactive transactions in TransactionInterceptor
Introduces TransactionManager marker interface for PlatformTransactionManager as well as ReactiveTransactionManager, allowing for a common configuration type in TransactionAspectSupport and TransactionManagementConfigurer.

Closes gh-22590
2019-05-02 16:23:48 +02:00
Juergen Hoeller 8dabb3e626 Shorter class names for common reactive transaction API types
Introduces TransactionExecution base interface for TransactionStatus as well as ReactiveTransaction. Renames getTransaction method to getReactiveTransaction, allowing for combined implementations of PlatformTransactionManager and ReactiveTransactionManager.

See gh-22646
2019-05-02 16:23:37 +02:00
Juergen Hoeller b5e5e33078 Remove legacy config options from AbstractReactiveTransactionManager
Includes general revision of reactive transaction sources.

See gh-22646
2019-05-02 12:04:25 +02:00
Mark Paluch beea83b9d2 Add reactive transaction support SPI
This commit adds SPI interfaces to support reactive transactions
through spring-tx with optional dependencies to Project Reactor and
supportive implementations for TransactionalOperator and
AbstractReactiveTransactionManager.
2019-05-02 11:59:09 +02:00
Juergen Hoeller cee7d09e40 Add is*Enabled methods for log level checks to LogAccessor
Closes gh-22862
2019-05-02 11:57:48 +02:00
Andy Clement 0f553661a6 Allow null operands in compiled SpEL numeric operator expressions
Prior to this when SpEL compiled an expression using the numeric
operators <, >, <= or >= then it would not create code that handled
nulls. Nulls can occur if a boxed numeric operand is used prior
to compilation, then it is nulled out. SpEL now creates null
handling bytecode.

Closes gh-22358
2019-05-01 15:36:19 -07:00
Rossen Stoyanchev bd8d71be0e canWrite uses actual return value type if known
Closes gh-22803
2019-05-01 16:52:23 -04:00
Rossen Stoyanchev 07c9a0e1f5 Merge branch '5.1.x' 2019-05-01 04:03:21 -04:00
Juergen Hoeller 52657b68ea Merge branch '5.1.x' 2019-04-30 18:55:34 +02:00
Sebastien Deleuze 2259ab7ff3 Polishing 2019-04-30 16:21:32 +02:00
Sebastien Deleuze 89454e69c3 Deprecate MediaType.APPLICATION_JSON_UTF8
This commit deprecates MediaType.APPLICATION_JSON_UTF8 and
MediaType.APPLICATION_PROBLEM_JSON_UTF8 in favor of
MediaType.APPLICATION_JSON and MediaType.APPLICATION_PROBLEM_JSON since
UTF-8 encoding is now handled correctly by most browsers
(related bug has been fixed in Chrome since September 2017).

MediaType.APPLICATION_JSON is now used as the default JSON content type.

Closes gh-22788
2019-04-30 16:11:50 +02:00
Sebastien Deleuze 2e6059f6b0 Add coroutines support to RSocket @MessageMapping
Closes gh-22780
2019-04-30 15:48:18 +02:00
Sebastien Deleuze 842e7e5ef7 Add RSocketRequester coroutines extensions
See gh-22780
2019-04-30 09:36:35 +02:00
Rossen Stoyanchev 089fb5737d Replace create with wrap in RSocketRequester 2019-04-29 17:12:28 -04:00
Rossen Stoyanchev a1ad0285ca Default MimeType selection for RSocketRequester
Remove the dataMimeType argument on connect methods. Applications can
still configure it through the ClientRSocketFactory but it shouldn't
be necessary as we now choose a default MimeType from the supported
encoders and decoders.

Add an option to provide the RSocketStrategies instance (vs customizing
it) which is expected in Spring config where an RSocketStrategies
instance may be shared between client and server setups.
2019-04-29 15:22:01 -04:00
Rossen Stoyanchev 8888a65079 Polish RSocketRequester 2019-04-29 12:03:49 -04:00
Sebastien Deleuze 5cd6763193 Add CBOR codec (single value only)
This commit adds CBOR reactive support for single value only in
order to allow CBOR usage in RSocket. Notice that no CBOR support
is configured on WebFlux, this will require gh-20513 to be resolved.

Closes gh-22767
2019-04-29 13:13:37 +02:00
Juergen Hoeller 3d502d90e2 Add missing nullable declarations
See gh-22821
2019-04-26 23:10:18 +02:00
Juergen Hoeller f8dc8523da Merge branch '5.1.x' 2019-04-26 23:00:40 +02:00
Phillip Webb 87dba5a4df Fix MergedAnnotations javadoc 2019-04-26 13:59:16 -07:00
Phillip Webb 55ac110f7b Fix LinkedCaseInsensitiveMap collection methods
Ensure that results returned from keySet, entrySet & values are tracked
to remove case insensitive keys from the source map.

Closes gh-22821
2019-04-26 11:17:51 -07:00
Juergen Hoeller c4bd5abc3b Nullability refinements and related polishing 2019-04-26 17:41:43 +02:00
Juergen Hoeller 55418b256d Merge branch '5.1.x' 2019-04-26 16:56:04 +02:00
Sebastien Deleuze 0016f58a80 Upgrade dependency management plugin to 1.0.7 2019-04-26 13:34:47 +02:00
Sebastien Deleuze f5816c9219 Upgrade Gradle to 5.4.1 2019-04-26 13:33:51 +02:00
Sebastien Deleuze c59acde34e Upgrade Kotlin plugin to 1.3.31 2019-04-26 13:32:25 +02:00
Sebastien Deleuze 5221c3000e Upgrade to Coroutines 1.2.1 2019-04-26 11:44:57 +02:00
Sebastien Deleuze 92c190fabf Upgrade to Kotlin 1.3.31 2019-04-26 11:44:39 +02:00
Phillip Webb 83cb51aec6 Add MergedAnnotation.getRoot() method
Update `MergedAnnotation` with a `getRoot()` method that allows the
root direct annotation to be retrieved easily.

Closes gh-22818
2019-04-25 14:14:03 -07:00
Stephane Nicoll 7cc132b2a9 Merge pull request #22836 from izeye
* pr/22836:
  Add missing fail() calls in MockRestServiceServerTests
2019-04-25 17:35:19 +03:00
Johnny Lim 33ac14f099 Add missing fail() calls in MockRestServiceServerTests
Closes gh-22836
2019-04-25 17:34:50 +03:00
Juergen Hoeller ad497c259a Merge branch '5.1.x' 2019-04-25 14:55:04 +02:00
Christoph Dreis 29d021ae3c Avoid possible memory leak in ResolvableType 2019-04-23 21:07:35 +02:00
Sebastien Deleuze cd5dc84832 Improve WebFlux suspending handler method support
This commit leverages Flux instead of Flow to support suspending
handler methods returning Flow in order to avoid multiple invocations
of the suspending function on every collect().

See gh-22820
2019-04-23 17:20:40 +02:00
Brian Clozel b33d2f4634 Fix checkstyle errors 2019-04-23 15:10:11 +02:00
Brian Clozel 02904121a3 Add RSocketRequest.Builder in Spring Messaging
Prior to this commit, `RSocketRequester` would have a single
`RSocketRequester.create` static method taking a fully built
`RSocket` as an argument. Developers need to build an `RSocket`
instance using the `RSocketFactory` and then use it to create
a requester.

To help developers set up a requester, this commit adds a new
`RSocketRequester.Builder` interface and implementation. The
`RSocket` building phase and codecs configuration are part of a
single call chain. Subscribing to the returned
`Mono<RSocketRequester>` will configure and connect to the remote
RSocket server.

This design should be improved in gh-22798, since we will need to
support metadata in a broader fashion.

Closes gh-22806
2019-04-23 14:06:15 +02:00
Yanming Zhou 900abfce47 Temporal should be simple value type like Date 2019-04-23 12:55:18 +02:00
水木今山 574dffb60b Some trivial optimization in method populateBean() (#22792)
Optimize the number of getResolvedAutowireMode() method calls
2019-04-23 12:48:21 +02:00
Sebastien Deleuze aee2df8919 Improve WebFlux suspending handler method support
Support for suspending handler methods introduced in Spring
Framework 5.2 M1 does not detect types correctly and does not
support suspending handler methods returning Flow which is a
common use case with WebClient.

This commit fixes these issues and adds Coroutines integration
tests.

Closes gh-22820
Closes gh-22827
2019-04-23 11:32:32 +02:00
Sam Brannen dab90cb7cc Test status quo for MergedAnnotation.getParent()
See gh-22818
2019-04-21 16:32:09 +02:00
Sam Brannen e5d64e6680 Remove dead code in HttpHeadersTests 2019-04-21 15:33:53 +02:00
Sam Brannen 4a090922d7 Polish Javadoc 2019-04-21 15:33:53 +02:00
Sam Brannen e187a42bfc Introduce failing tests for HttpHeaders
See gh-22821
2019-04-21 15:20:24 +02:00
Rossen Stoyanchev fe92486cca Expose status in SubProtocolWebSocketHandler
Closes gh-22807
2019-04-18 23:11:08 -04:00
Rossen Stoyanchev 87dd62a4a3 Merge branch '5.1.x' 2019-04-18 22:49:35 -04:00
Rossen Stoyanchev c09e711eb2 Unwrap Optional for @RequestParam reverse resolution
Closes gh-22656
2019-04-18 22:40:12 -04:00
Rossen Stoyanchev 4e63153886 Upgrade RSocket snapshot version 2019-04-18 12:49:36 -04:00
Rossen Stoyanchev dbc45319b3 Merge branch '5.1.x' 2019-04-18 11:51:34 -04:00
Rossen Stoyanchev 86835e8e5a Merge branch '5.1.x' 2019-04-17 14:23:44 -04:00
Rossen Stoyanchev 60d6b5a922 Add mutate method to RSocketStrategies
Closes gh-22799
2019-04-17 13:11:34 -04:00
Сергей Цыпанов 18af3892dd Make inner classes static where possible
Closes gh-22804
2019-04-17 19:05:24 +02:00
Rossen Stoyanchev 261dcab8ce Merge branch '5.1.x' 2019-04-17 12:34:22 -04:00
Rossen Stoyanchev 30dbff340a Upgrade to Reactor Dysprosium snapshots 2019-04-17 12:30:02 -04:00
Stephane Nicoll 2cfd2a33c8 Merge branch '5.1.x' 2019-04-17 11:49:51 +02:00
Rossen Stoyanchev de3238dbea Merge branch '5.1.x' 2019-04-16 21:08:54 -04:00
Rossen Stoyanchev ed650891ca Add filter to add exchange to Reactor Context
Closes gh-21746
2019-04-16 10:08:20 -04:00
Sam Brannen c99d904665 Upgrade to Gradle 5.4
Closes gh-22805
2019-04-16 14:46:02 +02:00
Rossen Stoyanchev e4da7cb47f Merge branch '5.1.x' 2019-04-15 08:41:27 -04:00
Sebastien Deleuze e131815bab Upgrade to Coroutines 1.2.0 2019-04-13 13:15:51 +02:00
Juergen Hoeller 44df98c82d Merge branch '5.1.x' 2019-04-12 11:37:07 +02:00
Sebastien Deleuze e84347554e Ignore Kotlin script templating tests
Ignore these tests for the time being since they trigger
a NoClassDefFoundError exception with Kotlin 1.3.30.
2019-04-12 11:17:19 +02:00
Juergen Hoeller f9903bbf69 Upgrade to Kotlin 1.3.30, Mockito 2.27, MockK 1.9.3, AssertJ 3.12.2
This commit removes quartzVersion since it is only used once.
2019-04-12 10:28:15 +02:00
Juergen Hoeller 07738b9529 Recent fine-tuning from ASM master
See gh-22503
2019-04-12 10:26:42 +02:00
Rossen Stoyanchev e27e54317f Merge messaging related codec updates 2019-04-11 19:02:48 -04:00
Rossen Stoyanchev 5fc18064f2 Use encode with an Object value where feasible
Closes gh-22782
2019-04-11 19:00:28 -04:00
Rossen Stoyanchev 181482fa15 Add option to encode with an Object value
See gh-22782
2019-04-11 19:00:28 -04:00
Rossen Stoyanchev f89d2ac148 Use decode from a DataBuffer where feasible
See gh-22782
2019-04-11 19:00:28 -04:00
Rossen Stoyanchev a912d8de1e Add option to decode from a DataBuffer
See gh-22782
2019-04-11 19:00:28 -04:00
Rossen Stoyanchev 2aae81ef0c Join buffers in decodeToMono for Jackson and Jaxb2
Closes gh-22783
2019-04-11 19:00:28 -04:00
Sam Brannen 3d0ec509ab Document mock JNDI support deprecation in the Reference Manual
See gh-22779
2019-04-11 16:46:50 +02:00
Sam Brannen 7f58e395d3 Remove @Deprecated from org.springframework.mock.jndi package
This commit removes the @Deprecated declaration on the
org.springframework.mock.jndi package, since such usage results in a
compiler warning on JDK 9+ which breaks Spring's JDK 9 and JDK 11 CI
builds.

https://bugs.openjdk.java.net/browse/JDK-6481080

See gh-22779
2019-04-11 16:17:58 +02:00
Rossen Stoyanchev 6e7da62085 Switch to Reactor snapshots and remove workaround
Following the 5.2 M1 release we can switch back to Reactor snapshots
and remove the workaround for a fix coming in Reactor Core 3.2.9.
2019-04-10 16:09:28 -04:00
Rossen Stoyanchev bb28477587 Merge branch '5.1.x' 2019-04-10 15:37:02 -04:00
Sam Brannen 88e3b84164 Deprecate mock JNDI support in the spring-test module
Closes gh-22779
2019-04-10 16:00:05 +02:00
Sam Brannen 6d7bf8050f Polishing 2019-04-10 13:15:16 +02:00
Brian Clozel 0f76acc945 Update project page URL 2019-04-10 10:04:29 +02:00
Rossen Stoyanchev d707d382b4 Merge branch '5.1.x' 2019-04-09 22:38:15 -04:00
Sebastien Deleuze 849a848f23 Polishing 2019-04-10 00:32:20 +02:00
Sebastien Deleuze 66c95dc241 Clear spring-core-coroutines artifacts 2019-04-09 23:54:22 +02:00
Sebastien Deleuze ff1f368751 Improve Kotlin documentation 2019-04-09 23:54:22 +02:00
Brian Clozel cd69a4a03b Support DestinationVariable on RSocket handlers
Prior to this commit, the pattern destination variables were not set in
the message headers prior to calling the handler. In this case, the
`DestinationVariableMethodArgumentResolver` could not get the
destination variables from the message headers and resolve those as
handler arguments.

This commit mutates the message headers if the message destination
contains patterns.

Fixes gh-22776
2019-04-09 22:56:08 +02:00
Rossen Stoyanchev a0826a20c3 CorsInterceptor at the front of the chain
Closes gh-22459
2019-04-09 15:43:43 -04:00
Rossen Stoyanchev d1f888a7a9 Empty path mapping behaves consistently
An empty path mapping in an @RequestMapping now consistently matches to
empty paths regardless of whether there are both type and method level,
annotations, or method-level only.

Closes gh-22543
2019-04-09 15:03:43 -04:00
Rossen Stoyanchev f839c1f9cd Remove warning about empty @RequestMapping path
See gh-22543
2019-04-09 15:03:43 -04:00
Sam Brannen 5b17bb2e14 Polish Javadoc for @Scheduled 2019-04-09 19:12:06 +02:00
P. Ottlinger 85597f29f2 Improve @Scheduled Javadoc regarding cron element order
Closes gh-22777
2019-04-09 19:03:30 +02:00
Juergen Hoeller eb971690d2 Merge branch '5.1.x' 2019-04-09 18:09:20 +02:00
stsypanov 604361ee1f Use concatenation instead of torn StringBuilder::append chain 2019-04-09 13:23:22 +02:00
Sebastien Deleuze cd0b517abf Improve Kotlin documentation 2019-04-09 12:28:00 +02:00
Sam Brannen 80ad60e91b Fix Javadoc for @Value 2019-04-09 11:30:59 +02:00
Sam Brannen 85f05023c6 Pull WebFlux getMappingPathPatterns() implementation up in the hierarchy
This commit moves the WebFlux getMappingPathPatterns() implementation
from RequestMappingHandlerMapping to
RequestMappingInfoHandlerMapping so that subclasses of the latter no
longer need to re-implement the method.

See gh-22543
2019-04-09 10:58:04 +02:00
Juergen Hoeller dc14ea86eb Fix regression for nested AnnotationAttributes.annotationType() result
See gh-22738
2019-04-09 09:40:53 +02:00
Rossen Stoyanchev 0a03d8e248 Upgrade to RSocket 0.12.1-RC3 and update tests
1) Tests use a timeout to avoid hanging issues
2) Some tests adjusted to work around potential rsocket-java issue
https://github.com/rsocket/rsocket-java/issues/613
2019-04-08 23:52:04 -04:00
Juergen Hoeller c8609b83b6 Merge branch '5.1.x' 2019-04-08 20:19:03 +02:00
ladislav-bozek 4d17eb4f0e Fix typo in JavaDoc for UrlPathHelper.setUrlDecode()
Closes gh22768
2019-04-08 17:37:59 +02:00
Sam Brannen b115789fd3 Polishing 2019-04-08 17:28:44 +02:00
Sam Brannen 9a93615ec4 Configure Kotlin plugin support for Eclipse in Gradle build
This commit configures the Kotlin plugin for Eclipse in the
spring-core-coroutines Gradle project so that users no longer have to
manually "Configure Kotlin / Add Kotlin Nature" within the Eclipse IDE
after importing projects.

This change is currently limited to the spring-core-coroutines project
since it is the only project in which Java code depends on compiled
Kotlin code; however, this change may later be applied to additional
projects if desirable.
2019-04-08 17:20:24 +02:00
Sam Brannen bd414df944 Remove JMXMP from TestGroup
Due to the changes in a7425c81c0, we no
longer need to execute tests using the JMXMP protocol in PERFORMANCE
builds.

This commit removes the JMXMP constant from the TestGroup enum and
updates affected tests, thereby effectively including such tests in
the standard build from now on.

See gh-22757
2019-04-08 17:05:16 +02:00
Juergen Hoeller fd8fa301a6 Consistent non-exposure of inherited annotations in AnnotationMetadata
Closes gh-22766
2019-04-08 15:59:06 +02:00
Sebastien Deleuze 2e7ed915cd Merge branch '5.1.x' 2019-04-08 15:46:47 +02:00
Sam Brannen cf5d0e6aa9 Introduce publishEvent() convenience method in TestContext
This commit introduces a publishEvent() method in the TestContext API
as a convenience for publishing an ApplicationEvent to the test's
ApplicationContext but only if the ApplicationContext is currently
available and with lazy creation of the ApplicationEvent.

For example, the beforeTestClass() method in
EventPublishingTestExecutionListener is now implemented as follows.

  public void beforeTestClass(TestContext testContext) {
      testContext.publishEvent(BeforeTestClassEvent::new);
  }

Closes gh-22765
2019-04-08 15:14:39 +02:00
Sam Brannen a7425c81c0 Add dependency on opendmk_jmxremote_optional_jar for performance builds
Although the jmxremote_optional JAR has been added to the build agents
on the Bamboo CI server for the latest JDK 8 installation, that
solution is brittle since it has to be manually installed in every new
JDK installation. In addition, this approach will not work with JDK 9+
since the "Extension Mechanism" has been removed beginning with JDK 9.

https://docs.oracle.com/javase/10/migrate/toc.htm#JSMIG-GUID-2C896CA8-927C-4381-A737-B1D81D964B7B

This commit addresses this issue by adding the following dependency to
spring-context.

// Substitute for "javax.management:jmxremote_optional:1.0.1_04" which
// is not available on Maven Central
testRuntime("org.glassfish.external:opendmk_jmxremote_optional_jar:1.0-b01-ea")

With this change, the Spring PERFORMANCE builds now execute on JDK 8,
9, and 11.

See gh-22757
2019-04-08 13:22:30 +02:00
Sam Brannen 8f5d2d65a1 Upgrade to JUnit Jupiter 5.4.2
See gh-22308
2019-04-07 22:05:33 +02:00
Sam Brannen 353e092bf6 Register EventPublishingTestExecutionListener by default (round 2)
This commit registers the EventPublishingTestExecutionListener as a
default TestExecutionListener with an order of 10,000. This registers
the EventPublishingTestExecutionListener as the last listener provided
by the Spring Framework.

With EventPublishingTestExecutionListener registered with an order of
10,000, it is effectively wrapped by all other Spring listeners,
including support for @DirtiesContext and test-managed transactions.

Furthermore, this commit revises the implementation of
EventPublishingTestExecutionListener to take advantage of the new
TestContext#hasApplicationContext() support which allows the
EventPublishingTestExecutionListener to publish events only if the
test's ApplicationContext is currently available. This avoids
undesirable side-effects such as eager loading of the
ApplicationContext before it is needed or re-loading of the
ApplicationContext after it has been intentionally closed.

Closes gh-18490
2019-04-06 16:39:26 +02:00
Sam Brannen c3d0459a4e Add support to query if ApplicationContext is available in the TCF
This commit introduces support in the Spring TestContext Framework
(TCF) to query whether the test's ApplicationContext is available.

Specifically, this commit introduces the following two `default`
methods along with corresponding implementations in DefaultTestContext
and DefaultCacheAwareContextLoaderDelegate.

- `boolean hasApplicationContext()` in the TestContext API

- `boolean isContextLoaded(MergedContextConfiguration)` in the
  CacheAwareContextLoaderDelegate API

Closes gh-22756
2019-04-06 16:00:33 +02:00
Sam Brannen ab1b8dee58 Ensure XmlEventDecoder compiles on JDK 9 and 11 2019-04-06 16:00:33 +02:00
Sam Brannen 55b764bac3 Remove unused import
See gh-22543
2019-04-06 12:14:46 +02:00
Sam Brannen 164ee2a4e1 Polishing
See gh-22543
2019-04-06 11:25:44 +02:00
Sam Brannen 021909dac2 Merge branch '5.1.x' 2019-04-06 11:22:15 +02:00
Sam Brannen 510c0c5ef7 Return Set<PathPattern> from AbstractHandlerMethodMapping.getMappingPathPatterns
This commit revises the signature of getMappingPathPatterns() in
AbstractHandlerMethodMapping to return a set of PathPatterns instead of
a set of Strings.

See gh-22543
2019-04-06 11:18:25 +02:00
Tadaya Tsuyukubo dacda5859a Fix broken asciidoc heading 2019-04-06 11:02:45 +02:00
Rossen Stoyanchev 02da8486a3 Merge branch '5.1.x' 2019-04-05 21:53:55 -04:00
Phillip Webb e905f1712e Refine MergedAnnotation.asMap
Add a convenience method that allows a `MergedAnnotation` to be
converted into an `AnnotationAttributes` instance. Also rename
the `MapValues` enum to `Adapt` which generally seems to read
better.

Closes gh-22738
2019-04-05 13:22:18 -07:00
Phillip Webb ef151f578d Polishing 2019-04-05 13:22:18 -07:00
Phillip Webb 1221b0650b Add MissingMergedAnnotation Tests
Add tests for `MissingMergedAnnotation`

See gh-21697
2019-04-05 13:21:46 -07:00
Phillip Webb 8bc74ad18d Delete AnnotationAttributeExtractor
Delete `AnnotationAttributeExtractor` which is package private and
no longer used.

Closes gh-22753
2019-04-05 13:20:47 -07:00
Sam Brannen 72027b1746 Log warning if @RequestMapping method has no explicit mapping
Commit c0b52d09f5 introduced support for
throwing an exception if a @RequestMapping handler method in a Spring
MVC controller was mapped to an empty path. This had negative side
effects for applications that intentionally mapped to an empty path,
potentially alongside a mapping to an explicit path for the same
handler method.

This commit addresses this by logging a warning (instead of throwing an
exception) if a @RequestMapping method is mapped only to empty paths.

This commit also introduces the same support for WebFlux-based
@RequestMapping handler methods.

Closes gh-22543
2019-04-05 19:55:22 +02:00
Sam Brannen e4525cf4c1 Modify ByteArrayEncoder so that it works in Eclipse IDE 2019-04-05 19:55:22 +02:00
Sam Brannen 898494a538 Polish AbstractHandlerMethodMapping
See gh-22543
2019-04-05 14:03:10 +02:00
Sam Brannen d04a640baf Polish Javadoc for @RequestMapping 2019-04-05 14:03:10 +02:00
Juergen Hoeller 9de83674cd Complete set of registerBean methods on AnnotatedBeanDefinitionReader
Includes bringing registerBean constructor-vararg variants up to GenericApplicationContext, making AnnotationConfigApplicationContext a straightforward subclass with a single template method to override.

See gh-22457
2019-04-05 13:56:33 +02:00
Juergen Hoeller b90e6ef8a0 Merge branch '5.1.x' 2019-04-05 12:48:34 +02:00
Rossen Stoyanchev 279508a0f0 Merge pull request #22705 from jhaeyaert/22371 2019-04-04 17:15:18 -04:00
Rossen Stoyanchev e0c2a1c59d Polish
Closes gh-22705
2019-04-04 17:13:57 -04:00
Jeoffrey Haeyaert 9976783639 WebClient uri method with uriTemplate and UriBuilder
See gh-22705
2019-04-04 17:13:57 -04:00
Rossen Stoyanchev ed70978071 verify() fails if there are failed requests
Normally failed requests fail the test but they're suppressed for some
reason (e.g. in async callback) then verify should still correctly
report the failures.

Closes gh-21799
2019-04-04 16:49:46 -04:00
Sam Brannen 4be605eb1e Revert "Fix tests"
This reverts commit 07e9f802f2.
2019-04-04 19:10:58 +02:00
Sam Brannen d6ba5259d8 Revert "Register EventPublishingTestExecutionListener by default"
This reverts commit 86fb7362b1.
2019-04-04 19:10:58 +02:00
Sam Brannen a66e6d3231 Revert "Fix tests"
This reverts commit 65365d91c8.
2019-04-04 19:10:58 +02:00
Sam Brannen f7a5b3013e Revert "Register EventPublishingTestExecutionListener by default"
This reverts commit 13543f5e0f.
2019-04-04 19:10:58 +02:00
Sebastien Deleuze a8d6ba9965 Add support for Coroutines Flow
Flow is a Kotlin Coroutines related cold asynchronous
stream of the data, that emits from zero to N (where N
can be unbounded) values and completes normally or with
an exception.

It is conceptually the Coroutines equivalent of Flux with
an extension oriented API design, easy custom operator
capabilities and some suspending methods.

This commit leverages Flow <-> Flux interoperability
to support Flow on controller handler method parameters
or return values, and also adds Flow based extensions to
WebFlux.fn. It allows to reach a point when we can consider
Spring Framework officially supports Coroutines even if some
additional work remains to be done like adding
interoperability between Reactor and Coroutines contexts.

Flow is currently an experimental API that is expected to
become final before Spring Framework 5.2 GA.

Close gh-19975
2019-04-04 19:06:32 +02:00
Sam Brannen a5e297a161 Polishing 2019-04-04 18:41:57 +02:00
Sam Brannen df15b64e86 Document @Autowired support on parameters
Closes gh-21118
2019-04-04 18:31:04 +02:00
Sam Brannen e1080f8b5f Polish Javadoc for @Autowired 2019-04-04 18:18:35 +02:00
Sam Brannen 3a9262ca1e Fix Javadoc warnings in Gradle build 2019-04-04 17:49:33 +02:00
Sam Brannen c0b52d09f5 Require explicit path mappings for @RequestMapping methods
Prior to this commit, handler methods in Spring MVC controllers were
not required to provide explicit path mappings via @RequestMapping (or
any of its specializations such as @GetMapping). Such handler methods
were effectively mapped to all paths. Consequently, developers may have
unwittingly mapped all requests to a single handler method.

This commit addresses this by enforcing that @RequestMapping methods
are mapped to an explicit path. Note, however, that this is enforced
after type-level and method-level @RequestMapping information has been
merged.

Developers wishing to map to all paths should now add an explicit path
mapping to "/**" or "**".

Closes gh-22543
2019-04-04 17:33:59 +02:00
Sam Brannen de69871354 Removed unused import 2019-04-04 17:13:08 +02:00
Sam Brannen 1a2e372186 Removed unused import 2019-04-04 16:56:03 +02:00
Juergen Hoeller 23b8f471dc Upgrade to Quartz 2.3.1 2019-04-04 16:43:40 +02:00
Juergen Hoeller 1741b6dcd9 Merge branch '5.1.x' 2019-04-04 16:12:07 +02:00
stsypanov 383f18e214 Use StringJoiner where possible to simplify String joining 2019-04-04 16:11:32 +02:00
Sam Brannen 07e9f802f2 Fix tests
See gh-18490
2019-04-04 12:55:55 +02:00
Sam Brannen 86fb7362b1 Register EventPublishingTestExecutionListener by default
See gh-18490
2019-04-04 12:55:06 +02:00
Sebastien Deleuze 40e4c8068d Polishing 2019-04-04 12:16:18 +02:00
Sebastien Deleuze 9217f0b63e Convert CoRouterFunctionDsl indents to tabs 2019-04-04 12:14:27 +02:00
Sebastien Deleuze 2eb631aaad Avoid exposing (Co)RouterFunctionDsl#invoke
WebFlux.fn RouterFunctionDsl#invoke and CoRouterFunctionDsl#invoke
were wrongly exposed on public API and have never been designed to
be used by end users, but rather only invoked from router { } or
coRouter { } builders.

To fix that, avoiding this method being accessible from the DSL and
for the sake of consistency with WebMvc.fn RouterFunctionDsl,
Spring Framework 5.2 turns public fun invoke() method to
an internal fun build() one.

As a consequence RouterFunctionDsl and CoRouterFunctionDsl are not
open anymore, they are expected to be extended via Kotlin
extensions if needed.

Closes gh-22736
2019-04-04 12:14:27 +02:00
Sebastien Deleuze e6171fb47d Add Kotlin router DSL and extensions for WebMvc.fn
Closes gh-22697
2019-04-04 12:14:27 +02:00
Sebastien Deleuze 92d5f6395e Rename awaitPrincipal to awaitPrincipalOrNull
See gh-19975
2019-04-04 12:14:27 +02:00
Arjen Poutsma b3d3778269 Do not resolve DTDs in Stax Tests 2019-04-04 12:10:10 +02:00
Brian Clozel 65365d91c8 Fix tests
See gh-18490
2019-04-04 11:19:31 +02:00
Juergen Hoeller 52f90c303e Rename LogMessage.lazy(Supplier) to LogMessage.of(Supplier)
See gh-22726
2019-04-04 10:39:42 +02:00
Juergen Hoeller 9080ae24f9 First-class support for printf-style format strings in LogMessage
LogMessage is an abstract class now: with internal subclasses for Supplier bindings as well as printf-style format strings with a variable number of arguments (some fixed for efficiency, varargs array as fallback), created through corresponding static factory methods.

Closes gh-22726
2019-04-04 01:52:51 +02:00
Rossen Stoyanchev 5616eb2e8e Merge branch '5.1.x' 2019-04-03 19:38:21 -04:00
Rossen Stoyanchev 88a7a68a71 Revert to Californium-SR6 for M1 release 2019-04-03 19:25:34 -04:00
Rossen Stoyanchev 2c28e4e972 Merge branch '5.1.x' 2019-04-03 16:29:28 -04:00
Rossen Stoyanchev 1c5aa6a8d3 Merge changes for 22644 2019-04-03 14:56:39 -04:00
Rossen Stoyanchev 72119ac076 ProducesRequestCondition caches accepted media types
Closes gh-22644
2019-04-03 14:56:30 -04:00
Rossen Stoyanchev 254f06e1a1 Request attribute cache for resolved lookupPath
See gh-22644
2019-04-03 14:56:30 -04:00
Rossen Stoyanchev bb9fcad58a RequestCondition implementations minor refactoring
Reduce object creation by pre-computing instances that can be re-used,
and eliminating collection copying and sorting where not needed.

See gh-22644
2019-04-03 14:56:30 -04:00
Juergen Hoeller 8f967129b9 Merge branch '5.1.x' 2019-04-03 19:05:42 +02:00
Sam Brannen 13543f5e0f Register EventPublishingTestExecutionListener by default
Closes gh-18490
2019-04-03 18:31:16 +02:00
Sam Brannen d6173512fe Document test execution event support in the Reference Manual
Closes gh-18490
2019-04-03 18:18:39 +02:00
Sebastien Deleuze a63d23492a Optimize Jackson2Tokenizer
See gh-22727
2019-04-03 18:02:27 +02:00
Sam Brannen 807828b2b7 Polish Javadoc for MergedAnnotation support
See gh-21697
2019-04-03 16:55:34 +02:00
Sam Brannen a4279c5d00 Rename MergedAnnotations.SearchStrategy.SUPER_CLASS to SUPERCLASS
For consistency within the framework, this commit renames the SUPER_CLASS enum constant
to SUPERCLASS.

See gh-21697
2019-04-03 16:44:36 +02:00
Juergen Hoeller d39e3cc0ba Merge branch '5.1.x' 2019-04-03 14:43:22 +02:00
Juergen Hoeller e0fe32af05 Detect factory method annotations in getBeanNamesForAnnotation and co
As of 5.2, ListableBeanFactory.findAnnotationOnBean and its retrieval companions getBeanNamesForAnnotation and getBeansWithAnnotation detect annotations on @Bean methods as well.

Closes gh-22541
2019-04-03 13:07:47 +02:00
Juergen Hoeller dee88d931a Common constant for DefaultBeanNameGenerator as well
Closes gh-22591
2019-04-03 12:58:13 +02:00
Brian Clozel 47c8d1de7b Avoid calling other bean methods in web config
This commit changes the main configuration classes for Spring MVC and
Spring WebFlux to not call other bean methods when setting up the web
infrastructure. This allows configuration classes extending
`DelegatingWebFluxConfiguration` and `DelegatingWebMvcConfiguration`
to opt-in the lite-mode, as introduced in gh-22461.
2019-04-03 10:16:41 +02:00
Brian Clozel 83ce8ad79a Fix checkstyle 2019-04-03 10:16:11 +02:00
Juergen Hoeller e2e91e2196 Switch LogAccessor argument order to have message supplier last
Closes gh-22726
2019-04-02 21:01:56 +02:00
Sam Brannen 5922642333 Document exception handling and async support for test events
This commit updates the class-level Javadoc for
EventPublishingTestExecutionListener in order to provide explicit
documentation for exception handling and async support.

See gh-18490
2019-04-02 20:31:58 +02:00
Juergen Hoeller 2e63c66b0d Merge branch '5.1.x' 2019-04-02 20:13:29 +02:00
Juergen Hoeller 3ac88bed23 Introduce LogAccessor and LogMessage as convenient logging utilities
Closes gh-22726
2019-04-02 19:13:05 +02:00
Rossen Stoyanchev 208a1ae0ea Sync ChannelSendOperator copy in spring-messaging
See gh-22720
2019-04-02 11:06:11 -04:00
Rossen Stoyanchev 89a29598d5 Merge branch '5.1.x' 2019-04-02 11:05:30 -04:00
Juergen Hoeller c366e205e5 Common constants for default AnnotationBeanNameGenerator instances
Closes gh-22591
2019-04-02 16:52:36 +02:00
Sebastien Deleuze b2dbefcfc5 Prevent spring-core-coroutines deployment
See gh-19975
2019-04-02 16:05:18 +02:00
Sebastien Deleuze d2fa5536db Use more efficient Reactor operators
Use handle/flatMapIterable instead of flatMap/flatMapMany
when possible.

Closes gh-22727
2019-04-02 15:49:59 +02:00
Juergen Hoeller b1231de062 Fix formatting
See gh-21855
2019-04-02 15:17:34 +02:00
Matthias Kurz 6899624155 Correctly parse property name in path "map[key[foo]]" 2019-04-02 15:09:13 +02:00
liguoxiong 7b11c3b599 Transform the beanName in method isPrimary
Transform the beanName in method DefaultListableBeanFactory.isPrimary.
Add the corresponding test cases.
Fixes #22675.
2019-04-02 15:06:12 +02:00
Juergen Hoeller a11a592734 AbstractSqlParameterSource enumerates parameter values in toString()
Closes gh-2080
2019-04-02 14:56:38 +02:00
Juergen Hoeller 4a5b9d39d4 Consistent java.time setters on HttpHeaders and CorsConfiguration
Closes gh-22546
2019-04-02 14:56:20 +02:00
Juergen Hoeller d6c1a65737 JtaTransactionManagerFactoryBean fully initializes its JTM instance
Closes gh-22605
2019-04-02 14:55:56 +02:00
Juergen Hoeller 271445b89e Public createMarshaller/Unmarshaller methods on Jaxb2Marshaller
Closes gh-22708
2019-04-02 14:55:39 +02:00
Juergen Hoeller c1a74de48d Boolean getLazyInit accessor indicating no explicit flag set
Closes gh-22694
2019-04-02 14:55:27 +02:00
Juergen Hoeller 03bda29032 Revert "AnnotationConfigRegistry exposes registerBean with supplier/qualifiers"
This reverts commit 18f2e6a1
2019-04-02 14:55:13 +02:00
Rossen Stoyanchev a94868158e Sync ChannelSendOperator copy in spring-messaging
See gh-22720
2019-04-01 17:22:54 -04:00
Rossen Stoyanchev 20742c74dc Merge branch '5.1.x' 2019-04-01 17:16:17 -04:00
Sebastien Deleuze eb75367934 Remove deprecated AbstractHandlerMapping#getCorsConfigurations
Closes gh-22719
2019-04-01 17:43:20 +02:00
Sebastien Deleuze d27b5d0ab6 Improve CORS handling
This commit improves CORS support by:
 - Using CORS processing only for CORS-enabled endpoints
 - Skipping CORS processing for same-origin requests
 - Adding Vary headers for non-CORS requests

It introduces an AbstractHandlerMapping#hasCorsConfigurationSource
method in order to be able to check CORS endpoints efficiently.

Closes gh-22273
Closes gh-22496
2019-04-01 17:42:51 +02:00
Stephane Nicoll 8714710170 Merge branch '5.1.x' 2019-04-01 14:02:23 +02:00
Stephane Nicoll 4b5c370701 Merge branch '5.1.x' 2019-04-01 13:55:44 +02:00
Sam Brannen 085cb1dd92 Clean up warnings 2019-03-31 14:36:35 +02:00
Sam Brannen e8cfc4df45 Disable verbose JiBX logging in Gradle build 2019-03-31 13:26:38 +02:00
Stephane Nicoll 7625fc0262 Merge branch '5.1.x' 2019-03-31 10:59:30 +02:00
Sebastien Deleuze beb491b840 Use Dispatchers.Unconfined for Coroutines
As of Coroutines 1.2.0-alpha, Dispatchers.Unconfined
is a stable API so we can leverage it in order to get
better performances in our Reactive to Coroutines
bridge.

See gh-19975
2019-03-31 10:56:05 +02:00
Sebastien Deleuze 3387d3ec89 Upgrade to Coroutines 1.2.0-alpha
This commit also switches on kotlin-compiler-embeddable to
improve isolation of its dependencies

See gh-19975
2019-03-31 10:55:13 +02:00
Juergen Hoeller 76e5a2a53b Remove superfluous empty lines 2019-03-30 00:26:58 +01:00
Juergen Hoeller 2e832c03ae Merge branch '5.1.x' 2019-03-30 00:25:10 +01:00
Stephane Nicoll 43004328c8 Merge pull request #22709 from armansimonyan13
* pr/22709:
  Polish contribution
  Polish
2019-03-29 22:42:05 +01:00
Stephane Nicoll 2156a1bbd5 Polish contribution
Closes gh-22709
2019-03-29 22:40:40 +01:00
arman simonyan 257772c61e Polish
See gh-22709
2019-03-29 22:40:04 +01:00
Rossen Stoyanchev 8dc535c15c Match declared parameters on produces condition
Closes gh-21670
2019-03-29 17:03:40 -04:00
Rossen Stoyanchev c0be1c5100 Polish 2019-03-29 16:01:22 -04:00
Rossen Stoyanchev 6c33af0a1c Merge branch '5.1.x' 2019-03-29 15:56:07 -04:00
Juergen Hoeller 57de2e0900 Deprecate ClassUtils.isCglibProxy methods in favor of AOP-level checks
Closes gh-22706
2019-03-29 11:12:49 +01:00
Phillip Webb f273fa990c Use RepeatableContainers.none() in AnnotationUtils
Update `AnnotationUtils` so that `RepeatableContainers.none()` is used
when performing an exhaustive search for merged annotations. These
parameters were accidentally removed in commit 210b1789 and weren't
caught earlier because we were missing a test.

Closes gh-22702
2019-03-28 14:39:29 -07:00
Phillip Webb 800cbf2524 Ignore 'value' attribute in AnnotationTypeMapping
Update `addConventionAnnotationValues` so that `value` attributes
do not override existing annotation values. The aligns the new
`MergedAnnotations` API with the previous `AnnotatedElementUtils`
logic.

Closes gh-22703
2019-03-28 14:39:29 -07:00
Rossen Stoyanchev 45e42214b2 Merge branch '5.1.x' 2019-03-28 17:37:21 -04:00
Rossen Stoyanchev 52b109ae68 Merge branch '5.1.x' 2019-03-28 17:19:51 -04:00
Sam Brannen 3f85530efd URL Cleanup - polishing 2019-03-28 17:23:13 +01:00
Sam Brannen faa3bde991 Merge branch '5.1.x' 2019-03-28 17:05:35 +01:00
Arjen Poutsma e09d6e2efd Javadoc 2019-03-28 16:47:25 +01:00
Arjen Poutsma 2950958f35 Fix ConcurrentModificationException on Undertow
This commit fixes a ConcurrentModificationException that occurs when
requesting a nonexistant route.

Closes gh-22698
2019-03-28 16:19:57 +01:00
Juergen Hoeller 49fccfb158 Consistent retrieval of javax annotation types (e.g. JSR-305)
Closes gh-22696
2019-03-28 14:38:55 +01:00
Sam Brannen f9d59570de URL Cleanup - polishing 2019-03-28 14:05:21 +01:00
Sam Brannen eec183ef28 Ensure spring-test test tasks are UP-TO-DATE
Prior to this commit, the three `test` tasks in the spring-test module
shared the same output directory for test reports. This had the
negative side effect of causing Gradle to believe that the tasks were
not UP-TO-DATE. Consequently, all three `test` tasks in the spring-test
module were executed for every build even if there were zero changes in
the spring-test module.

This commit fixes this issue by allowing Gradle to use the default test
results output directory for each `test` task. Thanks to @marcphilipp
for providing the tip.

In addition, the Artifactory Gradle task in the Default Job of the
Bamboo build plan for the Spring Framework (SPR-PUB) has been updated
to use the following custom test results directory pattern:
`**/build/test-results/**/*.xml`.

See: https://guides.gradle.org/using-build-cache/#concepts_overlapping_outputs
2019-03-28 13:47:33 +01:00
Sam Brannen 7e6a5f5875 URL Cleanup - license.txt 2019-03-28 13:04:33 +01:00
Sam Brannen 025eaf688f Clean up warnings in Gradle build output 2019-03-28 12:32:58 +01:00
Sam Brannen 09690f2750 Upgrade to Gradle 5.3.1
See gh-22347
2019-03-28 12:02:35 +01:00
Sebastien Deleuze c5c4ac164b Refine WebFlux Coroutines API
This commit provides both nullable and non-nullable variants for
awaitBody, makes awaitPrincipal return type nullable and rename
awaitResponse to awaitExchange for better consistency with Java API.

See gh-19975
2019-03-28 10:22:50 +01:00
Sebastien Deleuze 811f315440 Refine PropertyResolver extensions null-safety
See gh-22687
2019-03-28 09:01:20 +01:00
Phillip Webb bf9dea4254 Defensively copy array returned from TypeDescriptor
Update the internal proxy used in `TypeDescriptor` so that it returns a
cloned array for calls to `getDeclaredAnnotations` or `getAnnotations`.

Closes gh-22695
2019-03-27 13:50:30 -07:00
Rossen Stoyanchev 0589989eb4 Merge branch '5.1.x' 2019-03-27 16:19:31 -04:00
Juergen Hoeller ac0ffda311 Merge branch '5.1.x' 2019-03-27 19:39:28 +01:00
Sebastien Deleuze 864dddee7a Merge branch '5.1.x' 2019-03-27 17:13:06 +01:00
Juergen Hoeller 673be7fb0d Merge branch '5.1.x' 2019-03-27 16:02:07 +01:00
Sebastien Deleuze 8003aa4f26 Deprecate GenericApplicationContext { } Kotlin extension
Closes gh-22692
2019-03-27 15:12:16 +01:00
Sebastien Deleuze fb1da01410 Support creating beans from Kotlin callable references
This commit updates Kotlin beans DSL in order to support
creating beans using callable references with autowired
parameters. Type resolution is implemented using Kotlin
reified type parameters without requiring reflection.

Closes gh-21845
2019-03-27 14:47:42 +01:00
Juergen Hoeller c9857702e4 Refined retrieval of plain annotations through direct presence checks
Shortcut checks apply for hasPlainJavaAnnotationsOnly types as well now.

Closes gh-22685
2019-03-27 12:56:11 +01:00
Juergen Hoeller cb84c56f19 Revert "Migrate CommonAnnotationBeanPostProcessor to MergedAnnotations"
This reverts commit 75b52309
2019-03-27 12:54:34 +01:00
Sebastien Deleuze cbb5a78aa0 Infer Kotlin null-safety from type variables
This commit removes the constraint from type variables in
PropertyResolver, JdbcOperations and RestOperations
Kotlin extensions in order to get null-safety inferred
from the type declared by the user.

Closes gh-22687
2019-03-27 09:03:32 +01:00
Rossen Stoyanchev 68a529b915 Merge branch '5.1.x' 2019-03-26 21:14:51 -04:00
Juergen Hoeller b646943350 Upgrade to Hibernate ORM 5.4.2 2019-03-26 23:59:16 +01:00
Juergen Hoeller ea51270895 Merge branch '5.1.x' 2019-03-26 23:48:09 +01:00
Sam Brannen 49b6c5800a Merge branch '5.1.x' 2019-03-26 18:29:17 +01:00
Juergen Hoeller e3b6174b6d Merge branch '5.1.x' 2019-03-26 18:02:20 +01:00
Arjen Poutsma 4ca27db0cc Copy cookies to ServerResponse builders
See gh-22351
2019-03-26 16:32:54 +01:00
Arjen Poutsma 771d436680 Merge branch '5.1.x' 2019-03-26 16:19:57 +01:00
Juergen Hoeller 635305647c Polishing 2019-03-26 16:13:51 +01:00
Juergen Hoeller 210b178922 Restore retrieval of plain annotations through direct presence checks
Includes deprecation of several AnnotationUtils methods and nullability refinements for passed-in function arguments at the MergedAnnotation API level... also, MergedAnnotation.getType() returns a Class now.

Closes gh-22663
Closes gh-22685
2019-03-26 16:13:41 +01:00
Juergen Hoeller f7a4850675 AnnotationJmxAttributeSource uses MergedAnnotation API directly
Includes deprecation of AnnotationBeanUtils class (now unused).

Closes gh-22657
2019-03-26 16:13:23 +01:00
Arjen Poutsma 0db317575b Copy cookies in built ServerResponse
Closes gh-22481
2019-03-26 15:47:58 +01:00
Arjen Poutsma dba04a7338 Merge branch '5.1.x' 2019-03-26 15:34:48 +01:00
Arjen Poutsma d8215e7c79 Copy cookies and hints in built ServerResponse
Closes gh-22481
2019-03-26 15:31:15 +01:00
Sebastien Deleuze 6bf52ff8b9 Merge branch '5.1.x' 2019-03-26 14:30:49 +01:00
Sam Brannen 2a94cb2fe9 Merge branch '5.1.x' 2019-03-26 14:06:28 +01:00
Phillip Webb 0ace0be29b Fix annotation value mapping regression
Refine `TypeMappedAnnotation.getValueFromMetaAnnotation` to correctly
account for aliases when finding values from meta-annotations. Prior
to this commit, only convention based mappings were considered when
searching for values on meta-annotations. This meant that declared
meta-annotations that used aliases could return the "default value"
rather than the merged value.

Closes gh-22654
2019-03-25 17:19:12 -07:00
Sebastien Deleuze 88a2729fba Introduce spring-core-coroutines module
This commit introduces the spring-core-coroutines module
in order to avoid referencing Kotlin code from Java one,
which is currently not supported by Eclipse.

During the build, spring-core-coroutines is merged into
spring-core, so this change is expected to have no impact
for end users.

This module contains functions accessible from Java via
the CoroutinesUtils class to adapt Coroutines and Deferred
instances to and from Mono.

See gh-19975
2019-03-25 21:57:53 +01:00
Sam Brannen 837be3eaa0 Merge branch '5.1.x' 2019-03-25 18:17:23 +01:00
Arjen Poutsma 94c14c469e Fix checkstyle issue 2019-03-25 17:18:47 +01:00
Arjen Poutsma 1c46a9a6ff Remove direct Reactive Streams dependencies in Servlet.fn
Isolated direct dependencies to Reactive Streams types.
2019-03-25 16:16:20 +01:00
Phillip Webb cb7f997962 Defensively copy array returned from forAnnotations
Update the proxy used in `AnnotatedElementUtils.forAnnotations` so
that it returns a cloned array for calls to `getDeclaredAnnotations`
or `getAnnotations`. This matches the behavior of standard JDK
`AnnotatedElement` implementations.

Closes gh-22655
2019-03-25 07:53:42 -07:00
Juergen Hoeller 78fd882141 Remove superfluous empty lines after code blocks 2019-03-25 14:21:49 +01:00
Juergen Hoeller 3c02331983 Merge branch '5.1.x' 2019-03-25 13:59:24 +01:00
Sebastien Deleuze 8494c7a75a Add missing KDoc comments 2019-03-25 09:34:55 +01:00
Sebastien Deleuze 67c8d3753b Upgrade to Dokka 0.9.18 2019-03-25 09:34:55 +01:00
www 4517f40f57 Remove redundant 'String.substring()' call 2019-03-25 09:34:29 +01:00
Stephane Nicoll 80c48648d7 Merge pull request #22649 from ttddyy
* pr/22649:
  Fix typo on MergedAnnotations
2019-03-25 09:25:32 +01:00
Tadaya Tsuyukubo 860ec44c50 Fix typo on MergedAnnotations
Closes gh-22649
2019-03-25 09:25:16 +01:00
Sam Brannen 3a0f309e2c Update readme.txt in distributed artifacts 2019-03-23 19:43:34 +01:00
Sam Brannen d41c4522da Remove italics from XML examples in Reference Manual 2019-03-23 19:32:01 +01:00
Sam Brannen 4f619787ad Revert change from URL Cleanup 2019-03-23 19:20:40 +01:00
Sam Brannen 57ab877f0d Upgrade to Gradle 5.3
Closes gh-22347
2019-03-23 18:04:44 +01:00
Sam Brannen cd19170ffb Polish BeanUtilsTests 2019-03-23 16:19:42 +01:00
Min-soo 670aa4b7ef Use JUnit 4's expected exception support in BeanUtilsTests
This commit uses JUnit 4's built-in expected exception support in
BeanUtilsTests,

Closes gh-22354
2019-03-23 16:15:07 +01:00
Sam Brannen 9ac2e034e7 Polishing 2019-03-23 16:09:47 +01:00
Johnny Lim 14b1a6fdcb Polish docs (#22645) 2019-03-23 15:48:47 +01:00
Sam Brannen 7bb66c4f49 Replace bit.ly links with real links 2019-03-23 13:54:40 +01:00
Sam Brannen 0c8b473cac Wikipedia -> Wiki 2019-03-23 13:44:59 +01:00
Sam Brannen 9b7215e640 URL Cleanup - update remaining license headers
See gh-22617 gh-22622 gh-22635
2019-03-23 13:11:10 +01:00
Sam Brannen 20764685ec Merge URL Cleanup PRs
This merges the URL Cleanup PRs along with fixes.

Closes gh-22617 gh-22622 gh-22635
2019-03-23 13:01:57 +01:00
Sam Brannen 8a61c56154 URL Cleanup - upgrade to more modern Xalan namespace
See gh-22617 gh-22622 gh-22635
2019-03-23 12:21:21 +01:00
Juergen Hoeller bddba68549 Polishing 2019-03-23 12:14:35 +01:00
Juergen Hoeller 32b46866c7 Make MultipartResolutionDelegate final (aligned with other delegates) 2019-03-23 12:14:21 +01:00
Juergen Hoeller 62e5585c2e Avoid package cycle between beans.factory.annotation and b.f.support
See gh-2060
2019-03-23 12:14:03 +01:00
Juergen Hoeller 5e15338a09 Nullability refinements (no IntelliJ warnings, fewer null checks)
Includes consistent ignoring of all java.lang (meta-)annotations.

Closes gh-22586
2019-03-23 12:13:38 +01:00
Sam Brannen 68837ebb57 URL Cleanup - fix undesirable code change
Namespace handlers are mapped based on the canonical names for XML
namespaces which in Spring do not use "https" as the scheme.

See gh-22617 gh-22622 gh-22635
2019-03-23 11:56:31 +01:00
Sam Brannen 307a74835d URL Cleanup - remove obsolete ATOM schema location
See gh-22617 gh-22622 gh-22635
2019-03-23 11:54:49 +01:00
Sam Brannen 2db36c00e7 URL Cleanup - use HTTPS where possible in links in Testing Chapter
See gh-22617 gh-22622 gh-22635
2019-03-23 11:54:11 +01:00
Sam Brannen 6164664f65 URL Cleanup - fix XSD imports
See gh-22617 gh-22622 gh-22635
2019-03-23 11:53:24 +01:00
Sam Brannen cedcd2fddd URL Cleanup - fix links
See gh-22617 gh-22622 gh-22635
2019-03-23 11:52:49 +01:00
Phillip Webb 75b52309a7 Migrate CommonAnnotationBeanPostProcessor to MergedAnnotations
Closes gh-22585
2019-03-22 20:40:05 +01:00
Phillip Webb 50c257794f Migrate DefaultListableBeanFactory to MergedAnnotations
Closes gh-22584
2019-03-22 20:40:05 +01:00
Phillip Webb 857371ba67 Migrate AutowiredAnnotationBeanPostProcessor to MergedAnnotations
Closes gh-22582
2019-03-22 20:40:05 +01:00
Phillip Webb f065abac93 Migrate AnnotationAwareOrderComparator to MergedAnnotations
Closes gh-22581
2019-03-22 20:40:05 +01:00
Phillip Webb 7244c9aea1 Add more aggressive annotation element filtering
Refine the element filtering performed by `AnnotationsScanner` to also
cover `org.springframework.util` and most `com.sun` classes which turn
out to be referenced quite frequently and which we know contain no
useful annotations.

See gh-21697
2019-03-22 20:40:05 +01:00
Phillip Webb db8eaec131 Cache BridgeMethodResolver results
Add a cache to `BridgeMethodResolver` to help with repeated calls to
resolve the same methods. Since bridge method resolution can be somewhat
expensive (especially when resolving generics), and the number of bridge
methods is quite small, a cache generally helps.

This commit also simplifies the code a little by calling `doWithMethods`
directly rather than relying on `ReflectionUtils.getAllDeclaredMethods`
to do so. The methods list is now always created, but we save the list
creation that `getAllDeclaredMethods` used to do.

Closes gh-22579
2019-03-22 20:40:05 +01:00
Phillip Webb a57d6ba5f3 Optimize StringUtils.cleanPath
Add an early exit to `StringUtils.cleanPath` to save array creating and
string concatenation. With a typical Spring application, the `cleanPath`
method can be called over 600 times, often with a path constructed by
a `ClassPathResource` that is likely to already be clean.

Closes gh-22568
2019-03-22 20:40:05 +01:00
Phillip Webb 19fb697d03 Add more empty array constants in ReflectionUtils
Add some additional empty array constants to `ReflectionUtils` to save
us creating new arrays for zero length results.

See gh-22567
2019-03-22 20:40:05 +01:00
Phillip Webb e3a86be122 Make ConcurrentReferenceHashMap more JIT friendly
Update `ConcurrentReferenceHashMap` to make some methods more inline
friendly, and to manually inline a few others. These minor optimizations
don't make a great deal of difference for most applications, but seem
worthwhile since we use `ConcurrentReferenceHashMap` for many internal
caches.

Closes gh-22566
2019-03-22 20:40:05 +01:00
Phillip Webb aa4e56b251 Optimize @Configuration class parsing a little
Update `ConfigurationClassParser` to skip `java.lang.annotation` types
which were often processed but would never provide useful results. Also
use a single shared immutable `SourceClass` instance to represent
`Object.class`.

Closes gh-22563
2019-03-22 20:40:05 +01:00
Phillip Webb 37255afca4 Complete migration of annotation utility methods
Delete `InternalAnnotationUtils` and `InternalAnnotatedElementUtils` and
migrate exclusively to the new `MergedAnnotations` API.

Closes gh-22562
2019-03-22 20:40:05 +01:00
Phillip Webb a14bfe9a21 Migrate and verify annotation utility methods
Migrate all possible `AnnotationUtils` and `AnnotatedElementUtils`
method to the `MergedAnnotation` API, verify results against the old
implementations.

All migrated methods now call both the new API and the old version and
ensure that the same results or exceptions are raised. A full build of
both Spring Framework and Spring Boot has been executed to ensure, as
much as possible, that the migration does not cause unexpected
regressions.

See gh-22562
2019-03-22 20:40:05 +01:00
Phillip Webb b91ccf038f Start migration annotation utility methods
Create internal variants of the existing `AnnotationUtils` and
`AnnotatedElementUtils` classes and migrate the existing classes to
use them.

The internal variants will be used to check that the same results are
given as we migrate the utils methods to use the new `MergedAnnotations`
API.

See gh-22562
2019-03-22 20:40:05 +01:00
Phillip Webb 4972d85ae0 Create a new API for handling merged annotations
Add new `MergedAnnotations` and `MergedAnnotation` interfaces that
attempt to provide a uniform way for dealing with merged annotations.

Specifically, the new API provides alternatives for the static methods
in `AnnotationUtils` and `AnnotatedElementUtils` and supports Spring's
comprehensive annotation attribute `@AliasFor` features. The interfaces
also open the possibility of the same API being exposed from the
`AnnotationMetadata` interface.

Additional utility classes for collecting, filtering and selecting
annotations have also been added.

Typical usage for the new API would be something like:

	MergedAnnotations.from(Example.class)
		.stream(MyAnnotation.class)
		.map(a -> a.getString("value"))
		.forEach(System.out::println);

Closes gh-21697
2019-03-22 20:40:05 +01:00
Phillip Webb fdacda8b01 Add AnnotationIntrospectionFailureTests
Add a new test class to help cover annotation introspection failure
handling. These tests were previously missing and are important to
ensure that annotation util code changes don't introduce regressions.

See gh-21697
2019-03-22 20:40:05 +01:00
Phillip Webb 8ef609a1b7 Add public variant getDeclaredMethods method
Add a public variant of `getDeclaredMethods` that defensively copies the
cached methods array. This is often more faster and more convenient
for users than calling `doWithLocalMethods`. We still retain most of the
benefits of the cache, namely fewer security manager calls and not as
many `Method` instances being created.

Closes gh-22580
2019-03-22 20:40:05 +01:00
Phillip Webb 5044ee8fe6 Add AssertJ dependency for tests usage
Add AssertJ as a test scope dependency for all sub-projects.

Closes gh-22561
2019-03-22 20:40:05 +01:00
Phillip Webb ecbad874bf Refine eclipse settings 2019-03-22 20:40:05 +01:00
Phillip Webb 9c92b21af8 Polishing 2019-03-22 20:40:05 +01:00
Rossen Stoyanchev f8121515bf Merge branch '5.1.x' 2019-03-22 14:50:51 -04:00
Sam Brannen 7fe12cc23e URL Cleanup
This merges the URL Cleanup PRs along with fixes.

Closes gh-22617 gh-22622 gh-22635
2019-03-22 16:37:36 +01:00
Sam Brannen 14902e1744 Polish Javadoc 2019-03-22 13:32:24 +01:00
arman simonyan 517812d30a Fix grammar issue 2019-03-22 09:25:21 +01:00
Rob Winch bff3d2f2be Update to spring-javaformat-checkstyle 0.0.7
Remove unnecessary lambdas to fix updated checkstyle
2019-03-22 00:35:32 -05:00
Rob Winch 62ea7382d7 Polish URL Cleanup
Update Apache Headers
2019-03-22 00:24:06 -05:00
Spring Operator dc6f63f610 URL Cleanup
This commit updates URLs to prefer the https protocol. Redirects are not followed to avoid accidentally expanding intentionally shortened URLs (i.e. if using a URL shortener).

# Fixed URLs

## Fixed Success
These URLs were switched to an https URL with a 2xx status. While the status was successful, your review is still recommended.

* [ ] http://www.apache.org/licenses/ with 1 occurrences migrated to:
  https://www.apache.org/licenses/ ([https](https://www.apache.org/licenses/) result 200).
* [ ] http://www.apache.org/licenses/LICENSE-2.0 with 6625 occurrences migrated to:
  https://www.apache.org/licenses/LICENSE-2.0 ([https](https://www.apache.org/licenses/LICENSE-2.0) result 200).
2019-03-21 23:49:28 -05:00
Rob Winch 263868f018 Polish URL Cleanup 2019-03-21 23:47:38 -05:00
Rossen Stoyanchev 2f95859715 Upgrade to RSocket 0.12.1-RC3-SNAPSHOT
Closes gh-22629
2019-03-21 19:31:06 -04:00
Spring Operator d99edd154f URL Cleanup
This commit updates URLs to prefer the https protocol. Redirects are not followed to avoid accidentally expanding intentionally shortened URLs (i.e. if using a URL shortener).

These URLs were unable to be fixed. Please review them to see if they can be manually resolved.

* [ ] http://aopalliance.sourceforge.net (200) with 1 occurrences could not be migrated:
   ([https](https://aopalliance.sourceforge.net) result AnnotatedConnectException).
* [ ] http://cglib.sourceforge.net (200) with 2 occurrences could not be migrated:
   ([https](https://cglib.sourceforge.net) result AnnotatedConnectException).
* [ ] http://classdoc.sourceforge.net (200) with 1 occurrences could not be migrated:
   ([https](https://classdoc.sourceforge.net) result AnnotatedConnectException).
* [ ] http://code.jquery.com:80/jquery.js (200) with 1 occurrences could not be migrated:
   ([https](https://code.jquery.com:80/jquery.js) result ClosedChannelException).
* [ ] http://dbunit.sourceforge.net/ (200) with 1 occurrences could not be migrated:
   ([https](https://dbunit.sourceforge.net/) result AnnotatedConnectException).
* [ ] http://docs.groovy-lang.org/docs/next/html/documentation/template-engines.html (200) with 1 occurrences could not be migrated:
   ([https](https://docs.groovy-lang.org/docs/next/html/documentation/template-engines.html) result SSLProtocolException).
* [ ] http://domain3.com (200) with 6 occurrences could not be migrated:
   ([https](https://domain3.com) result ConnectTimeoutException).
* [ ] http://forum.thymeleaf.org/Thymeleaf-3-0-8-JUST-PUBLISHED-td4030687.html (200) with 1 occurrences could not be migrated:
   ([https](https://forum.thymeleaf.org/Thymeleaf-3-0-8-JUST-PUBLISHED-td4030687.html) result SSLHandshakeException).
* [ ] http://grinder.sourceforge.net/ (200) with 1 occurrences could not be migrated:
   ([https](https://grinder.sourceforge.net/) result AnnotatedConnectException).
* [ ] http://groovy-lang.org/templating.html (200) with 3 occurrences could not be migrated:
   ([https](https://groovy-lang.org/templating.html) result SSLProtocolException).
* [ ] http://hsqldb.org (200) with 1 occurrences could not be migrated:
   ([https](https://hsqldb.org) result SSLHandshakeException).
* [ ] http://htmlunit.sourceforge.net/ (200) with 3 occurrences could not be migrated:
   ([https](https://htmlunit.sourceforge.net/) result AnnotatedConnectException).
* [ ] http://htmlunit.sourceforge.net/gettingStarted.html (200) with 1 occurrences could not be migrated:
   ([https](https://htmlunit.sourceforge.net/gettingStarted.html) result AnnotatedConnectException).
* [ ] http://htmlunit.sourceforge.net/javascript.html (200) with 1 occurrences could not be migrated:
   ([https](https://htmlunit.sourceforge.net/javascript.html) result AnnotatedConnectException).
* [ ] http://javadiff.cvs.sourceforge.net/ (200) with 3 occurrences could not be migrated:
   ([https](https://javadiff.cvs.sourceforge.net/) result SSLHandshakeException).
* [ ] http://jibx.sourceforge.net/ (200) with 2 occurrences could not be migrated:
   ([https](https://jibx.sourceforge.net/) result AnnotatedConnectException).
* [ ] http://joda-time.sourceforge.net (200) with 1 occurrences could not be migrated:
   ([https](https://joda-time.sourceforge.net) result AnnotatedConnectException).
* [ ] http://jotm.objectweb.org/ (200) with 1 occurrences could not be migrated:
   ([https](https://jotm.objectweb.org/) result NotSslRecordException).
* [ ] http://json-b.net/ (200) with 1 occurrences could not be migrated:
   ([https](https://json-b.net/) result SSLHandshakeException).
* [ ] http://mx4j.sourceforge.net (200) with 1 occurrences could not be migrated:
   ([https](https://mx4j.sourceforge.net) result AnnotatedConnectException).
* [ ] http://mx4j.sourceforge.net/ (200) with 1 occurrences could not be migrated:
   ([https](https://mx4j.sourceforge.net/) result AnnotatedConnectException).
* [ ] http://mydomain3.com (200) with 9 occurrences could not be migrated:
   ([https](https://mydomain3.com) result ConnectTimeoutException).
* [ ] http://objenesis.org (200) with 1 occurrences could not be migrated:
   ([https](https://objenesis.org) result SSLHandshakeException).
* [ ] http://objenesis.org/tutorial.html (200) with 1 occurrences could not be migrated:
   ([https](https://objenesis.org/tutorial.html) result SSLHandshakeException).
* [ ] http://other.com/ (200) with 2 occurrences could not be migrated:
   ([https](https://other.com/) result SSLHandshakeException).
* [ ] http://reactivex.io/ (200) with 1 occurrences could not be migrated:
   ([https](https://reactivex.io/) result SSLHandshakeException).
* [ ] http://reactivex.io/documentation/operators.html (200) with 1 occurrences could not be migrated:
   ([https](https://reactivex.io/documentation/operators.html) result SSLHandshakeException).
* [ ] http://url.somewhereelse.com (200) with 4 occurrences could not be migrated:
   ([https](https://url.somewhereelse.com) result SSLHandshakeException).
* [ ] http://www.beanshell.org (200) with 1 occurrences could not be migrated:
   ([https](https://www.beanshell.org) result SSLHandshakeException).
* [ ] http://www.beanshell.org/ (200) with 1 occurrences could not be migrated:
   ([https](https://www.beanshell.org/) result SSLHandshakeException).
* [ ] http://www.doclet.com (200) with 1 occurrences could not be migrated:
   ([https](https://www.doclet.com) result AnnotatedConnectException).
* [ ] http://www.gebish.org/ (200) with 1 occurrences could not be migrated:
   ([https](https://www.gebish.org/) result SSLHandshakeException).
* [ ] http://www.gebish.org/manual/current/ (200) with 3 occurrences could not be migrated:
   ([https](https://www.gebish.org/manual/current/) result SSLHandshakeException).
* [ ] http://www.groovy-lang.org/ (200) with 2 occurrences could not be migrated:
   ([https](https://www.groovy-lang.org/) result SSLProtocolException).
* [ ] http://www.groovy-lang.org/operators.html (200) with 2 occurrences could not be migrated:
   ([https](https://www.groovy-lang.org/operators.html) result SSLProtocolException).
* [ ] http://www.hsqldb.org (200) with 1 occurrences could not be migrated:
   ([https](https://www.hsqldb.org) result SSLHandshakeException).
* [ ] http://www.jensgulden.de (200) with 1 occurrences could not be migrated:
   ([https](https://www.jensgulden.de) result AnnotatedConnectException).
* [ ] http://www.mockobjects.com (200) with 1 occurrences could not be migrated:
   ([https](https://www.mockobjects.com) result ClosedChannelException).
* [ ] http://www.mockobjects.com/ (200) with 1 occurrences could not be migrated:
   ([https](https://www.mockobjects.com/) result ClosedChannelException).
* [ ] http://www.w3.org/TR/cors/ (200) with 19 occurrences could not be migrated:
   ([https](https://www.w3.org/TR/cors/) result SSLException).
* [ ] http://xmlunit.sourceforge.net/ (200) with 2 occurrences could not be migrated:
   ([https](https://xmlunit.sourceforge.net/) result AnnotatedConnectException).
* [ ] http://www.easymock.org (301) with 1 occurrences could not be migrated:
   ([https](https://www.easymock.org) result SSLHandshakeException).
* [ ] http://www.easymock.org/ (301) with 1 occurrences could not be migrated:
   ([https](https://www.easymock.org/) result SSLHandshakeException).
* [ ] http://www.jmock.org/ (301) with 1 occurrences could not be migrated:
   ([https](https://www.jmock.org/) result SSLHandshakeException).
* [ ] http://foo.com (301) with 4 occurrences could not be migrated:
   ([https](https://foo.com) result SSLHandshakeException).
* [ ] http://foo.com/ (301) with 1 occurrences could not be migrated:
   ([https](https://foo.com/) result SSLHandshakeException).
* [ ] http://foo.com/a (301) with 1 occurrences could not be migrated:
   ([https](https://foo.com/a) result SSLHandshakeException).
* [ ] http://foo.com/a?foo=bar&foo=baz (301) with 4 occurrences could not be migrated:
   ([https](https://foo.com/a?foo=bar&foo=baz) result SSLHandshakeException).
* [ ] http://foo.com/bar (301) with 5 occurrences could not be migrated:
   ([https](https://foo.com/bar) result SSLHandshakeException).
* [ ] http://foo.com/baz (301) with 1 occurrences could not be migrated:
   ([https](https://foo.com/baz) result SSLHandshakeException).
* [ ] http://foo.com/rest/books/6.json (301) with 1 occurrences could not be migrated:
   ([https](https://foo.com/rest/books/6.json) result SSLHandshakeException).
* [ ] http://foo.com/rest/books/6/pages/1.json (301) with 1 occurrences could not be migrated:
   ([https](https://foo.com/rest/books/6/pages/1.json) result SSLHandshakeException).
* [ ] http://foo.com/v1 (301) with 1 occurrences could not be migrated:
   ([https](https://foo.com/v1) result SSLHandshakeException).
* [ ] http://foo.com/v1/123 (301) with 1 occurrences could not be migrated:
   ([https](https://foo.com/v1/123) result SSLHandshakeException).
* [ ] http://foo.com/v1/bar (301) with 1 occurrences could not be migrated:
   ([https](https://foo.com/v1/bar) result SSLHandshakeException).
* [ ] http://foo.com/v1?id=123 (301) with 2 occurrences could not be migrated:
   ([https](https://foo.com/v1?id=123) result SSLHandshakeException).
* [ ] http://foo.com/wrong (301) with 1 occurrences could not be migrated:
   ([https](https://foo.com/wrong) result SSLHandshakeException).
* [ ] http://mydomain4.com (301) with 3 occurrences could not be migrated:
   ([https](https://mydomain4.com) result SSLHandshakeException).
* [ ] http://xml.org/sax/features/ (301) with 4 occurrences could not be migrated:
   ([https](https://xml.org/sax/features/) result SSLHandshakeException).
* [ ] http://xml.org/sax/features/external-general-entities (301) with 10 occurrences could not be migrated:
   ([https](https://xml.org/sax/features/external-general-entities) result SSLHandshakeException).
* [ ] http://xml.org/sax/features/is-standalone (301) with 1 occurrences could not be migrated:
   ([https](https://xml.org/sax/features/is-standalone) result SSLHandshakeException).
* [ ] http://xml.org/sax/features/namespace-prefixes (301) with 13 occurrences could not be migrated:
   ([https](https://xml.org/sax/features/namespace-prefixes) result SSLHandshakeException).
* [ ] http://xml.org/sax/features/namespaces (301) with 12 occurrences could not be migrated:
   ([https](https://xml.org/sax/features/namespaces) result SSLHandshakeException).
* [ ] http://xml.org/sax/features/namespaces-prefixes (301) with 1 occurrences could not be migrated:
   ([https](https://xml.org/sax/features/namespaces-prefixes) result SSLHandshakeException).
* [ ] http://xml.org/sax/properties/lexical-handler (301) with 12 occurrences could not be migrated:
   ([https](https://xml.org/sax/properties/lexical-handler) result SSLHandshakeException).
* [ ] http://www.caucho.com/hessian (302) with 6 occurrences could not be migrated:
   ([https](https://www.caucho.com/hessian) result SSLHandshakeException).
* [ ] http://example.com:80/test/this/here (404) with 3 occurrences could not be migrated:
   ([https](https://example.com:80/test/this/here) result NotSslRecordException).
* [ ] http://www.foo.com/schema/component/component.xsd (404) with 1 occurrences could not be migrated:
   ([https](https://www.foo.com/schema/component/component.xsd) result SSLHandshakeException).
* [ ] http://www.foo.com/schema/jcache (404) with 2 occurrences could not be migrated:
   ([https](https://www.foo.com/schema/jcache) result SSLHandshakeException).
* [ ] http://www.mycompany.com/schema/myns/myns.xsd (404) with 1 occurrences could not be migrated:
   ([https](https://www.mycompany.com/schema/myns/myns.xsd) result ConnectTimeoutException).
* [ ] http://xunitpatterns.com/Test%20Spy.html (404) with 1 occurrences could not be migrated:
   ([https](https://xunitpatterns.com/Test%20Spy.html) result AnnotatedConnectException).

These URLs were fixed, but the https status was not OK. However, the https status was the same as the http request or http redirected to an https URL, so they were migrated. Your review is recommended.

* [ ] http://mydomain2.com (302) with 22 occurrences migrated to:
  /QTifZ/ ([https](https://mydomain2.com) result IllegalArgumentException).
* [ ] http://www.jdiff.org (302) with 1 occurrences migrated to:
  /VQYNZ/ ([https](https://www.jdiff.org) result IllegalArgumentException).
* [ ] http://192.168.0.1/mvc-showcase (301) with 1 occurrences migrated to:
  /admin/ ([https](https://192.168.0.1/mvc-showcase) result IllegalArgumentException).
* [ ] http://bugs.sun.com/view_bug.do?bug_id=6342411 (302) with 1 occurrences migrated to:
  https://bugs.java.com/view_bug.do?bug_id=6342411 ([https](https://bugs.sun.com/view_bug.do?bug_id=6342411) result SSLHandshakeException).
* [ ] http://bugs.sun.com/view_bug.do?bug_id=7023180 (302) with 2 occurrences migrated to:
  https://bugs.java.com/view_bug.do?bug_id=7023180 ([https](https://bugs.sun.com/view_bug.do?bug_id=7023180) result SSLHandshakeException).
* [ ] http://www.freemarker.org (301) with 5 occurrences migrated to:
  https://freemarker.apache.org/ ([https](https://www.freemarker.org) result ConnectTimeoutException).
* [ ] http://sockjs.org (303) with 2 occurrences migrated to:
  https://github.com/sockjs/sockjs-client ([https](https://sockjs.org) result AnnotatedConnectException).
* [ ] http://projects.eclipse.org/projects/tools.buildship (301) with 1 occurrences migrated to:
  https://projects.eclipse.org/projects/tools.buildship ([https](https://projects.eclipse.org/projects/tools.buildship) result SSLException).
* [ ] http://tools.ietf.org/html/rfc6202 (301) with 1 occurrences migrated to:
  https://tools.ietf.org/html/rfc6202 ([https](https://tools.ietf.org/html/rfc6202) result ReadTimeoutException).
* [ ] http://tools.ietf.org/html/rfc7239 (301) with 7 occurrences migrated to:
  https://tools.ietf.org/html/rfc7239 ([https](https://tools.ietf.org/html/rfc7239) result ReadTimeoutException).
* [ ] http://aaa.org:8080/a (301) with 1 occurrences migrated to:
  https://www.aaa.org/articles/ ([https](https://aaa.org:8080/a) result NotSslRecordException).
* [ ] http://www.caucho.com (302) with 1 occurrences migrated to:
  https://www.caucho.com/ ([https](https://www.caucho.com) result SSLHandshakeException).
* [ ] http://jruby.org (301) with 4 occurrences migrated to:
  https://www.jruby.org ([https](https://jruby.org) result SSLHandshakeException).
* [ ] http://jruby.org/ (301) with 1 occurrences migrated to:
  https://www.jruby.org ([https](https://jruby.org/) result SSLHandshakeException).
* [ ] http://bbb.org:9090/b (AnnotatedConnectException) with 2 occurrences migrated to:
  https://bbb.org:9090/b ([https](https://bbb.org:9090/b) result AnnotatedConnectException).
* [ ] http://192.168.28.42/1.jsp (ConnectTimeoutException) with 3 occurrences migrated to:
  https://192.168.28.42/1.jsp ([https](https://192.168.28.42/1.jsp) result ConnectTimeoutException).
* [ ] http://abc.com/v2/accounts?q=12 (ConnectTimeoutException) with 1 occurrences migrated to:
  https://abc.com/v2/accounts?q=12 ([https](https://abc.com/v2/accounts?q=12) result ConnectTimeoutException).
* [ ] http://example.com:8080/ (ConnectTimeoutException) with 1 occurrences migrated to:
  https://example.com:8080/ ([https](https://example.com:8080/) result ConnectTimeoutException).
* [ ] http://example.com:8080/bar (ConnectTimeoutException) with 5 occurrences migrated to:
  https://example.com:8080/bar ([https](https://example.com:8080/bar) result ConnectTimeoutException).
* [ ] http://example.org:9090 (ConnectTimeoutException) with 2 occurrences migrated to:
  https://example.org:9090 ([https](https://example.org:9090) result ConnectTimeoutException).
* [ ] http://example.org:9090/base (ConnectTimeoutException) with 12 occurrences migrated to:
  https://example.org:9090/base ([https](https://example.org:9090/base) result ConnectTimeoutException).
* [ ] http://example.org:9090/base/people (ConnectTimeoutException) with 2 occurrences migrated to:
  https://example.org:9090/base/people ([https](https://example.org:9090/base/people) result ConnectTimeoutException).
* [ ] http://example.org:9090/base/something/1/foo (ConnectTimeoutException) with 2 occurrences migrated to:
  https://example.org:9090/base/something/1/foo ([https](https://example.org:9090/base/something/1/foo) result ConnectTimeoutException).
* [ ] http://example.org:9090/base/something/else (ConnectTimeoutException) with 2 occurrences migrated to:
  https://example.org:9090/base/something/else ([https](https://example.org:9090/base/something/else) result ConnectTimeoutException).
* [ ] http://example.org:9999/base (ConnectTimeoutException) with 1 occurrences migrated to:
  https://example.org:9999/base ([https](https://example.org:9999/base) result ConnectTimeoutException).
* [ ] http://example.org:9999/base/api/people/123/addresses (ConnectTimeoutException) with 1 occurrences migrated to:
  https://example.org:9999/base/api/people/123/addresses ([https](https://example.org:9999/base/api/people/123/addresses) result ConnectTimeoutException).
* [ ] http://example.org:9999/base/api/people/123/addresses/DE (ConnectTimeoutException) with 1 occurrences migrated to:
  https://example.org:9999/base/api/people/123/addresses/DE ([https](https://example.org:9999/base/api/people/123/addresses/DE) result ConnectTimeoutException).
* [ ] http://example.org:9999/base/people/123/addresses/DE (ConnectTimeoutException) with 1 occurrences migrated to:
  https://example.org:9999/base/people/123/addresses/DE ([https](https://example.org:9999/base/people/123/addresses/DE) result ConnectTimeoutException).
* [ ] http://example.org:9999/next (ConnectTimeoutException) with 1 occurrences migrated to:
  https://example.org:9999/next ([https](https://example.org:9999/next) result ConnectTimeoutException).
* [ ] http://example.org:9999/path?q=foo (ConnectTimeoutException) with 1 occurrences migrated to:
  https://example.org:9999/path?q=foo ([https](https://example.org:9999/path?q=foo) result ConnectTimeoutException).
* [ ] http://foo.com:8080/v1/bar?id=123 (ConnectTimeoutException) with 1 occurrences migrated to:
  https://foo.com:8080/v1/bar?id=123 ([https](https://foo.com:8080/v1/bar?id=123) result ConnectTimeoutException).
* [ ] http://mydomain1.com:123 (ConnectTimeoutException) with 1 occurrences migrated to:
  https://mydomain1.com:123 ([https](https://mydomain1.com:123) result ConnectTimeoutException).
* [ ] http://site1.com (ConnectTimeoutException) with 13 occurrences migrated to:
  https://site1.com ([https](https://site1.com) result ConnectTimeoutException).
* [ ] http://wwws.sun.com/software/xml/developers/diffmk/ (ConnectTimeoutException) with 1 occurrences migrated to:
  https://wwws.sun.com/software/xml/developers/diffmk/ ([https](https://wwws.sun.com/software/xml/developers/diffmk/) result ConnectTimeoutException).
* [ ] http://aaa.org:8080/app/b/c/d (ReadTimeoutException) with 1 occurrences migrated to:
  https://aaa.org:8080/app/b/c/d ([https](https://aaa.org:8080/app/b/c/d) result NotSslRecordException).
* [ ] http://aaa.org:8080/b/c/d (ReadTimeoutException) with 1 occurrences migrated to:
  https://aaa.org:8080/b/c/d ([https](https://aaa.org:8080/b/c/d) result NotSslRecordException).
* [ ] http://www.w3.org/2000/xmlns/ (ReadTimeoutException) with 5 occurrences migrated to:
  https://www.w3.org/2000/xmlns/ ([https](https://www.w3.org/2000/xmlns/) result SSLException).
* [ ] http://www.w3.org/2004/08/xop/include (ReadTimeoutException) with 2 occurrences migrated to:
  https://www.w3.org/2004/08/xop/include ([https](https://www.w3.org/2004/08/xop/include) result SSLException).
* [ ] http://www.w3.org/DesignIssues/MatrixURIs.html (ReadTimeoutException) with 2 occurrences migrated to:
  https://www.w3.org/DesignIssues/MatrixURIs.html ([https](https://www.w3.org/DesignIssues/MatrixURIs.html) result SSLException).
* [ ] http://www.w3.org/TR/2004/WD-soap12-mtom-20040608/ (ReadTimeoutException) with 2 occurrences migrated to:
  https://www.w3.org/TR/2004/WD-soap12-mtom-20040608/ ([https](https://www.w3.org/TR/2004/WD-soap12-mtom-20040608/) result SSLException).
* [ ] http://www.w3.org/TR/2005/REC-xop10-20050125/ (ReadTimeoutException) with 6 occurrences migrated to:
  https://www.w3.org/TR/2005/REC-xop10-20050125/ ([https](https://www.w3.org/TR/2005/REC-xop10-20050125/) result SSLException).
* [ ] http://www.w3.org/TR/eventsource/ (ReadTimeoutException) with 2 occurrences migrated to:
  https://www.w3.org/TR/eventsource/ ([https](https://www.w3.org/TR/eventsource/) result SSLException).
* [ ] http://www.w3.org/TR/html4/loose.dtd (ReadTimeoutException) with 5 occurrences migrated to:
  https://www.w3.org/TR/html4/loose.dtd ([https](https://www.w3.org/TR/html4/loose.dtd) result SSLException).
* [ ] http://www.w3.org/TR/xhtml1/ (ReadTimeoutException) with 1 occurrences migrated to:
  https://www.w3.org/TR/xhtml1/ ([https](https://www.w3.org/TR/xhtml1/) result SSLException).
* [ ] http://www.w3.org/TR/xhtml1/diffs.html (ReadTimeoutException) with 1 occurrences migrated to:
  https://www.w3.org/TR/xhtml1/diffs.html ([https](https://www.w3.org/TR/xhtml1/diffs.html) result SSLException).
* [ ] http://www.w3.org/TR/xhtml1/dtds.html (ReadTimeoutException) with 1 occurrences migrated to:
  https://www.w3.org/TR/xhtml1/dtds.html ([https](https://www.w3.org/TR/xhtml1/dtds.html) result SSLException).
* [ ] http://www.w3.org/XML/1998/namespace (ReadTimeoutException) with 5 occurrences migrated to:
  https://www.w3.org/XML/1998/namespace ([https](https://www.w3.org/XML/1998/namespace) result SSLException).
* [ ] http://Additional-namespace-name-URI (UnknownHostException) with 1 occurrences migrated to:
  https://Additional-namespace-name-URI ([https](https://Additional-namespace-name-URI) result UnknownHostException).
* [ ] http://DOMAIN2.com (UnknownHostException) with 2 occurrences migrated to:
  https://DOMAIN2.com ([https](https://DOMAIN2.com) result UnknownHostException).
* [ ] http://Default-namespace-name-URI (UnknownHostException) with 1 occurrences migrated to:
  https://Default-namespace-name-URI ([https](https://Default-namespace-name-URI) result UnknownHostException).
* [ ] http://HOST:8080/remoting/AccountService (UnknownHostException) with 1 occurrences migrated to:
  https://HOST:8080/remoting/AccountService ([https](https://HOST:8080/remoting/AccountService) result UnknownHostException).
* [ ] http://Namespace-name-URI (UnknownHostException) with 1 occurrences migrated to:
  https://Namespace-name-URI ([https](https://Namespace-name-URI) result UnknownHostException).
* [ ] http://Unbound-namespace-name-URI (UnknownHostException) with 1 occurrences migrated to:
  https://Unbound-namespace-name-URI ([https](https://Unbound-namespace-name-URI) result UnknownHostException).
* [ ] http://a.example.org/mvc-showcase (UnknownHostException) with 1 occurrences migrated to:
  https://a.example.org/mvc-showcase ([https](https://a.example.org/mvc-showcase) result UnknownHostException).
* [ ] http://anotherHost/mvc-showcase (UnknownHostException) with 1 occurrences migrated to:
  https://anotherHost/mvc-showcase ([https](https://anotherHost/mvc-showcase) result UnknownHostException).
* [ ] http://arjen:foobar@java.sun.com:80 (UnknownHostException) with 1 occurrences migrated to:
  https://arjen:foobar@java.sun.com:80 ([https](https://arjen:foobar@java.sun.com:80) result UnknownHostException).
* [ ] http://barfoo:8888 (UnknownHostException) with 1 occurrences migrated to:
  https://barfoo:8888 ([https](https://barfoo:8888) result UnknownHostException).
* [ ] http://dev.bar.com (UnknownHostException) with 3 occurrences migrated to:
  https://dev.bar.com ([https](https://dev.bar.com) result UnknownHostException).
* [ ] http://domain1.com (UnknownHostException) with 25 occurrences migrated to:
  https://domain1.com ([https](https://domain1.com) result UnknownHostException).
* [ ] http://domain1.com/test.html (UnknownHostException) with 4 occurrences migrated to:
  https://domain1.com/test.html ([https](https://domain1.com/test.html) result UnknownHostException).
* [ ] http://domain2.com (UnknownHostException) with 98 occurrences migrated to:
  https://domain2.com ([https](https://domain2.com) result UnknownHostException).
* [ ] http://example.com&quot;,HttpMethod.GET (UnknownHostException) with 6 occurrences migrated to:
  https://example.com&quot;,HttpMethod.GET ([https](https://example.com&quot;,HttpMethod.GET) result UnknownHostException).
* [ ] http://example/ (UnknownHostException) with 1 occurrences migrated to:
  https://example/ ([https](https://example/) result UnknownHostException).
* [ ] http://fake-service (UnknownHostException) with 7 occurrences migrated to:
  https://fake-service ([https](https://fake-service) result UnknownHostException).
* [ ] http://foo (UnknownHostException) with 3 occurrences migrated to:
  https://foo ([https](https://foo) result UnknownHostException).
* [ ] http://foo.bar.com (UnknownHostException) with 4 occurrences migrated to:
  https://foo.bar.com ([https](https://foo.bar.com) result UnknownHostException).
* [ ] http://foobar:8088 (UnknownHostException) with 1 occurrences migrated to:
  https://foobar:8088 ([https](https://foobar:8088) result UnknownHostException).
* [ ] http://host:port/myApp/myEndpoint/ (UnknownHostException) with 1 occurrences migrated to:
  https://host:port/myApp/myEndpoint/ ([https](https://host:port/myApp/myEndpoint/) result UnknownHostException).
* [ ] http://jaxws.remoting.springframework.org/ (UnknownHostException) with 4 occurrences migrated to:
  https://jaxws.remoting.springframework.org/ ([https](https://jaxws.remoting.springframework.org/) result UnknownHostException).
* [ ] http://joe.openid.example.org/ (UnknownHostException) with 2 occurrences migrated to:
  https://joe.openid.example.org/ ([https](https://joe.openid.example.org/) result UnknownHostException).
* [ ] http://myserver (UnknownHostException) with 1 occurrences migrated to:
  https://myserver ([https](https://myserver) result UnknownHostException).
* [ ] http://myserver/logo.png (UnknownHostException) with 1 occurrences migrated to:
  https://myserver/logo.png ([https](https://myserver/logo.png) result UnknownHostException).
* [ ] http://myurl (UnknownHostException) with 12 occurrences migrated to:
  https://myurl ([https](https://myurl) result UnknownHostException).
* [ ] http://remotehost:8080/remoting/AccountService (UnknownHostException) with 2 occurrences migrated to:
  https://remotehost:8080/remoting/AccountService ([https](https://remotehost:8080/remoting/AccountService) result UnknownHostException).
* [ ] http://samples.springframework.org/order (UnknownHostException) with 2 occurrences migrated to:
  https://samples.springframework.org/order ([https](https://samples.springframework.org/order) result UnknownHostException).
* [ ] http://somethingDifferent (UnknownHostException) with 1 occurrences migrated to:
  https://somethingDifferent ([https](https://somethingDifferent) result UnknownHostException).
* [ ] http://url.somewhere.com (UnknownHostException) with 25 occurrences migrated to:
  https://url.somewhere.com ([https](https://url.somewhere.com) result UnknownHostException).
* [ ] http://url.somewhere.com/path (UnknownHostException) with 1 occurrences migrated to:
  https://url.somewhere.com/path ([https](https://url.somewhere.com/path) result UnknownHostException).
* [ ] http://url.somewhere.com/path?id=1 (UnknownHostException) with 1 occurrences migrated to:
  https://url.somewhere.com/path?id=1 ([https](https://url.somewhere.com/path?id=1) result UnknownHostException).
* [ ] http://url.somewhere.com/test.htm (UnknownHostException) with 2 occurrences migrated to:
  https://url.somewhere.com/test.htm ([https](https://url.somewhere.com/test.htm) result UnknownHostException).
* [ ] http://url.somewhere.com?a=b&c=d (UnknownHostException) with 1 occurrences migrated to:
  https://url.somewhere.com?a=b&c=d ([https](https://url.somewhere.com?a=b&c=d) result UnknownHostException).
* [ ] http://url.somewhere.com?foo= (UnknownHostException) with 2 occurrences migrated to:
  https://url.somewhere.com?foo= ([https](https://url.somewhere.com?foo=) result UnknownHostException).
* [ ] http://url.somewhere.com?foo=bar (UnknownHostException) with 4 occurrences migrated to:
  https://url.somewhere.com?foo=bar ([https](https://url.somewhere.com?foo=bar) result UnknownHostException).
* [ ] http://url.somewhere.com?foo=bar&a=b&c=d (UnknownHostException) with 2 occurrences migrated to:
  https://url.somewhere.com?foo=bar&a=b&c=d ([https](https://url.somewhere.com?foo=bar&a=b&c=d) result UnknownHostException).
* [ ] http://wiki.fasterxml.com/JacksonHome (UnknownHostException) with 3 occurrences migrated to:
  https://wiki.fasterxml.com/JacksonHome ([https](https://wiki.fasterxml.com/JacksonHome) result UnknownHostException).
* [ ] http://wiki.fasterxml.com/JacksonJsonViews (UnknownHostException) with 4 occurrences migrated to:
  https://wiki.fasterxml.com/JacksonJsonViews ([https](https://wiki.fasterxml.com/JacksonJsonViews) result UnknownHostException).
* [ ] http://www (UnknownHostException) with 1 occurrences migrated to:
  https://www ([https](https://www) result UnknownHostException).
* [ ] http://x.y.z (UnknownHostException) with 2 occurrences migrated to:
  https://x.y.z ([https](https://x.y.z) result UnknownHostException).
* [ ] http://abc.com/v1 (301) with 1 occurrences migrated to:
  https://abc.go.com/v1 ([https](https://abc.com/v1) result 404).
* [ ] http://abc.com/v1/accounts/43 (301) with 1 occurrences migrated to:
  https://abc.go.com/v1/accounts/43 ([https](https://abc.com/v1/accounts/43) result 404).
* [ ] http://abc.com/v1/accounts?q=12 (301) with 1 occurrences migrated to:
  https://abc.go.com/v1/accounts?q=12 ([https](https://abc.com/v1/accounts?q=12) result 404).
* [ ] http://apache.org/xml/features/disallow-doctype-decl (404) with 10 occurrences migrated to:
  https://apache.org/xml/features/disallow-doctype-decl ([https](https://apache.org/xml/features/disallow-doctype-decl) result 404).
* [ ] http://docs.spring.io/v1/bar (301) with 1 occurrences migrated to:
  https://docs.spring.io/v1/bar ([https](https://docs.spring.io/v1/bar) result 404).
* [ ] http://example.com/-foo (404) with 2 occurrences migrated to:
  https://example.com/-foo ([https](https://example.com/-foo) result 404).
* [ ] http://example.com/1 (404) with 1 occurrences migrated to:
  https://example.com/1 ([https](https://example.com/1) result 404).
* [ ] http://example.com/1/2 (404) with 2 occurrences migrated to:
  https://example.com/1/2 ([https](https://example.com/1/2) result 404).
* [ ] http://example.com/2 (404) with 1 occurrences migrated to:
  https://example.com/2 ([https](https://example.com/2) result 404).
* [ ] http://example.com/a%20b?q=a%2Bb (404) with 1 occurrences migrated to:
  https://example.com/a%20b?q=a%2Bb ([https](https://example.com/a%20b?q=a%2Bb) result 404).
* [ ] http://example.com/abc/ (404) with 1 occurrences migrated to:
  https://example.com/abc/ ([https](https://example.com/abc/) result 404).
* [ ] http://example.com/abc/x/y (404) with 1 occurrences migrated to:
  https://example.com/abc/x/y ([https](https://example.com/abc/x/y) result 404).
* [ ] http://example.com/abc/x/y/z (404) with 3 occurrences migrated to:
  https://example.com/abc/x/y/z ([https](https://example.com/abc/x/y/z) result 404).
* [ ] http://example.com/app/login/authenticate (404) with 1 occurrences migrated to:
  https://example.com/app/login/authenticate ([https](https://example.com/app/login/authenticate) result 404).
* [ ] http://example.com/arbitrary/path (404) with 1 occurrences migrated to:
  https://example.com/arbitrary/path ([https](https://example.com/arbitrary/path) result 404).
* [ ] http://example.com/bar (404) with 6 occurrences migrated to:
  https://example.com/bar ([https](https://example.com/bar) result 404).
* [ ] http://example.com/context.xml (404) with 4 occurrences migrated to:
  https://example.com/context.xml ([https](https://example.com/context.xml) result 404).
* [ ] http://example.com/example (404) with 6 occurrences migrated to:
  https://example.com/example ([https](https://example.com/example) result 404).
* [ ] http://example.com/example/?name (404) with 1 occurrences migrated to:
  https://example.com/example/?name ([https](https://example.com/example/?name) result 404).
* [ ] http://example.com/example/?name= (404) with 1 occurrences migrated to:
  https://example.com/example/?name= ([https](https://example.com/example/?name=) result 404).
* [ ] http://example.com/example/?name=%20 (404) with 1 occurrences migrated to:
  https://example.com/example/?name=%20 ([https](https://example.com/example/?name=%20) result 404).
* [ ] http://example.com/example/?name=row%5B0%5D (404) with 1 occurrences migrated to:
  https://example.com/example/?name=row%5B0%5D ([https](https://example.com/example/?name=row%5B0%5D) result 404).
* [ ] http://example.com/example/?name=value (404) with 1 occurrences migrated to:
  https://example.com/example/?name=value ([https](https://example.com/example/?name=value) result 404).
* [ ] http://example.com/example/?name=value&param2=value+2 (404) with 1 occurrences migrated to:
  https://example.com/example/?name=value&param2=value+2 ([https](https://example.com/example/?name=value&param2=value+2) result 404).
* [ ] http://example.com/example/?row%5B0%5D=value (404) with 1 occurrences migrated to:
  https://example.com/example/?row%5B0%5D=value ([https](https://example.com/example/?row%5B0%5D=value) result 404).
* [ ] http://example.com/foo (404) with 7 occurrences migrated to:
  https://example.com/foo ([https](https://example.com/foo) result 404).
* [ ] http://example.com/foo/../bar (404) with 1 occurrences migrated to:
  https://example.com/foo/../bar ([https](https://example.com/foo/../bar) result 404).
* [ ] http://example.com/foo/foo2?bar (404) with 1 occurrences migrated to:
  https://example.com/foo/foo2?bar ([https](https://example.com/foo/foo2?bar) result 404).
* [ ] http://example.com/foo?bar (404) with 4 occurrences migrated to:
  https://example.com/foo?bar ([https](https://example.com/foo?bar) result 404).
* [ ] http://example.com/foo?bar= (404) with 2 occurrences migrated to:
  https://example.com/foo?bar= ([https](https://example.com/foo?bar=) result 404).
* [ ] http://example.com/foo?bar=baz (404) with 2 occurrences migrated to:
  https://example.com/foo?bar=baz ([https](https://example.com/foo?bar=baz) result 404).
* [ ] http://example.com/foo?baz=42 (404) with 1 occurrences migrated to:
  https://example.com/foo?baz=42 ([https](https://example.com/foo?baz=42) result 404).
* [ ] http://example.com/foo?foo=bar&baz=qux (404) with 2 occurrences migrated to:
  https://example.com/foo?foo=bar&baz=qux ([https](https://example.com/foo?foo=bar&baz=qux) result 404).
* [ ] http://example.com/hotel (404) with 3 occurrences migrated to:
  https://example.com/hotel ([https](https://example.com/hotel) result 404).
* [ ] http://example.com/hotel%20list (404) with 1 occurrences migrated to:
  https://example.com/hotel%20list ([https](https://example.com/hotel%20list) result 404).
* [ ] http://example.com/hotel%20list/Z (404) with 1 occurrences migrated to:
  https://example.com/hotel%20list/Z ([https](https://example.com/hotel%20list/Z) result 404).
* [ ] http://example.com/hotel%20list/Z%C3%BCrich (404) with 3 occurrences migrated to:
  https://example.com/hotel%20list/Z%C3%BCrich ([https](https://example.com/hotel%20list/Z%C3%BCrich) result 404).
* [ ] http://example.com/hotels (404) with 3 occurrences migrated to:
  https://example.com/hotels ([https](https://example.com/hotels) result 404).
* [ ] http://example.com/hotels/ (404) with 15 occurrences migrated to:
  https://example.com/hotels/ ([https](https://example.com/hotels/) result 404).
* [ ] http://example.com/hotels/1/bookings/42 (404) with 1 occurrences migrated to:
  https://example.com/hotels/1/bookings/42 ([https](https://example.com/hotels/1/bookings/42) result 404).
* [ ] http://example.com/hotels/1/pic/pics%2Flogo.png/size/150x150 (404) with 2 occurrences migrated to:
  https://example.com/hotels/1/pic/pics%2Flogo.png/size/150x150 ([https](https://example.com/hotels/1/pic/pics%2Flogo.png/size/150x150) result 404).
* [ ] http://example.com/hotels/1/pic/pics/logo.png (404) with 1 occurrences migrated to:
  https://example.com/hotels/1/pic/pics/logo.png ([https](https://example.com/hotels/1/pic/pics/logo.png) result 404).
* [ ] http://example.com/hotels/42/bookings/21 (404) with 1 occurrences migrated to:
  https://example.com/hotels/42/bookings/21 ([https](https://example.com/hotels/42/bookings/21) result 404).
* [ ] http://example.com/hotels/42/bookings/42 (404) with 1 occurrences migrated to:
  https://example.com/hotels/42/bookings/42 ([https](https://example.com/hotels/42/bookings/42) result 404).
* [ ] http://example.com/hotels/Rest%20%26%20Relax/bookings/42 (404) with 2 occurrences migrated to:
  https://example.com/hotels/Rest%20%26%20Relax/bookings/42 ([https](https://example.com/hotels/Rest%20%26%20Relax/bookings/42) result 404).
* [ ] http://example.com/info (404) with 2 occurrences migrated to:
  https://example.com/info ([https](https://example.com/info) result 404).
* [ ] http://example.com/invalid (404) with 1 occurrences migrated to:
  https://example.com/invalid ([https](https://example.com/invalid) result 404).
* [ ] http://example.com/jquery-1.11.0.min.js (404) with 2 occurrences migrated to:
  https://example.com/jquery-1.11.0.min.js ([https](https://example.com/jquery-1.11.0.min.js) result 404).
* [ ] http://example.com/match (404) with 1 occurrences migrated to:
  https://example.com/match ([https](https://example.com/match) result 404).
* [ ] http://example.com/myFileUpload (404) with 1 occurrences migrated to:
  https://example.com/myFileUpload ([https](https://example.com/myFileUpload) result 404).
* [ ] http://example.com/myForm (404) with 1 occurrences migrated to:
  https://example.com/myForm ([https](https://example.com/myForm) result 404).
* [ ] http://example.com/path (404) with 4 occurrences migrated to:
  https://example.com/path ([https](https://example.com/path) result 404).
* [ ] http://example.com/path?query (404) with 2 occurrences migrated to:
  https://example.com/path?query ([https](https://example.com/path?query) result 404).
* [ ] http://example.com/path?query=foo (404) with 1 occurrences migrated to:
  https://example.com/path?query=foo ([https](https://example.com/path?query=foo) result 404).
* [ ] http://example.com/people (404) with 1 occurrences migrated to:
  https://example.com/people ([https](https://example.com/people) result 404).
* [ ] http://example.com/people/ (404) with 1 occurrences migrated to:
  https://example.com/people/ ([https](https://example.com/people/) result 404).
* [ ] http://example.com/prefix/path (404) with 2 occurrences migrated to:
  https://example.com/prefix/path ([https](https://example.com/prefix/path) result 404).
* [ ] http://example.com/resource (404) with 5 occurrences migrated to:
  https://example.com/resource ([https](https://example.com/resource) result 404).
* [ ] http://example.com/resource?access_token=123 (404) with 1 occurrences migrated to:
  https://example.com/resource?access_token=123 ([https](https://example.com/resource?access_token=123) result 404).
* [ ] http://example.com/spaces (404) with 1 occurrences migrated to:
  https://example.com/spaces ([https](https://example.com/spaces) result 404).
* [ ] http://example.com/spaces%20and%20%E2%82%AC (404) with 3 occurrences migrated to:
  https://example.com/spaces%20and%20%E2%82%AC ([https](https://example.com/spaces%20and%20%E2%82%AC) result 404).
* [ ] http://example.com/spring/ (404) with 1 occurrences migrated to:
  https://example.com/spring/ ([https](https://example.com/spring/) result 404).
* [ ] http://example.com/test/this/here (404) with 1 occurrences migrated to:
  https://example.com/test/this/here ([https](https://example.com/test/this/here) result 404).
* [ ] http://example.com/upload (404) with 1 occurrences migrated to:
  https://example.com/upload ([https](https://example.com/upload) result 404).
* [ ] http://example.com/user (404) with 1 occurrences migrated to:
  https://example.com/user ([https](https://example.com/user) result 404).
* [ ] http://example.org/fonts/css (404) with 6 occurrences migrated to:
  https://example.org/fonts/css ([https](https://example.org/fonts/css) result 404).
* [ ] http://example.org/foo/page.html (404) with 1 occurrences migrated to:
  https://example.org/foo/page.html ([https](https://example.org/foo/page.html) result 404).
* [ ] http://example.org/image.png (404) with 4 occurrences migrated to:
  https://example.org/image.png ([https](https://example.org/image.png) result 404).
* [ ] http://example.org/music/people (404) with 4 occurrences migrated to:
  https://example.org/music/people ([https](https://example.org/music/people) result 404).
* [ ] http://example.org/page.cache.html (404) with 1 occurrences migrated to:
  https://example.org/page.cache.html ([https](https://example.org/page.cache.html) result 404).
* [ ] http://example.org/path (404) with 3 occurrences migrated to:
  https://example.org/path ([https](https://example.org/path) result 404).
* [ ] http://springframework.org/oxm-test (404) with 2 occurrences migrated to:
  https://springframework.org/oxm-test ([https](https://springframework.org/oxm-test) result 404).
* [ ] http://www.example.com/favicon.ico (404) with 2 occurrences migrated to:
  https://www.example.com/favicon.ico ([https](https://www.example.com/favicon.ico) result 404).
* [ ] http://www.example.com/foo/bar (404) with 1 occurrences migrated to:
  https://www.example.com/foo/bar ([https](https://www.example.com/foo/bar) result 404).
* [ ] http://www.example.com/hotels (404) with 2 occurrences migrated to:
  https://www.example.com/hotels ([https](https://www.example.com/hotels) result 404).
* [ ] http://www.example.com/user/ (404) with 4 occurrences migrated to:
  https://www.example.com/user/ ([https](https://www.example.com/user/) result 404).
* [ ] http://www.example.com/user/john%3Bdoe/dashboard (404) with 4 occurrences migrated to:
  https://www.example.com/user/john%3Bdoe/dashboard ([https](https://www.example.com/user/john%3Bdoe/dashboard) result 404).
* [ ] http://www.example.com/user/john;doe/dashboard (404) with 2 occurrences migrated to:
  https://www.example.com/user/john;doe/dashboard ([https](https://www.example.com/user/john;doe/dashboard) result 404).
* [ ] http://www.ibm.com/developerworks/websphere/library/techarticles/0404_tang/0404_tang.html (301) with 1 occurrences migrated to:
  https://www.ibm.com/developerworks/websphere/library/techarticles/0404_tang/0404_tang.html ([https](https://www.ibm.com/developerworks/websphere/library/techarticles/0404_tang/0404_tang.html) result 404).
* [ ] http://mydomain1.com:80/path (301) with 2 occurrences migrated to:
  https://www.mydomain1.com/path ([https](https://mydomain1.com:80/path) result 404).
* [ ] http://www.quartz-scheduler.org/documentation/quartz-2.1.x/tutorials/tutorial-lesson-03 (404) with 1 occurrences migrated to:
  https://www.quartz-scheduler.org/documentation/quartz-2.1.x/tutorials/tutorial-lesson-03 ([https](https://www.quartz-scheduler.org/documentation/quartz-2.1.x/tutorials/tutorial-lesson-03) result 404).
* [ ] http://www.utoronto.ca/webdocs/HTMLdocs/Book/Book-3ed/appb/mimetype.html (301) with 1 occurrences migrated to:
  https://www.utoronto.ca/webdocs/HTMLdocs/Book/Book-3ed/appb/mimetype.html ([https](https://www.utoronto.ca/webdocs/HTMLdocs/Book/Book-3ed/appb/mimetype.html) result 404).
* [ ] http://xml.apache.org/xslt (404) with 3 occurrences migrated to:
  https://xml.apache.org/xslt ([https](https://xml.apache.org/xslt) result 404).
* [ ] http://myhost.com/resource/path/myTemplate.txt (500) with 1 occurrences migrated to:
  https://myhost.com/resource/path/myTemplate.txt ([https](https://myhost.com/resource/path/myTemplate.txt) result 500).
* [ ] http://myhost.com/some/arbitrary/path (500) with 1 occurrences migrated to:
  https://myhost.com/some/arbitrary/path ([https](https://myhost.com/some/arbitrary/path) result 500).

These URLs were switched to an https URL with a 2xx status. While the status was successful, your review is still recommended.

* [ ] http://activemq.apache.org/delete-inactive-destinations.html with 1 occurrences migrated to:
  https://activemq.apache.org/delete-inactive-destinations.html ([https](https://activemq.apache.org/delete-inactive-destinations.html) result 200).
* [ ] http://activemq.apache.org/stomp.html with 1 occurrences migrated to:
  https://activemq.apache.org/stomp.html ([https](https://activemq.apache.org/stomp.html) result 200).
* [ ] http://ant.apache.org with 1 occurrences migrated to:
  https://ant.apache.org ([https](https://ant.apache.org) result 200).
* [ ] http://asciidoctor.org/ with 1 occurrences migrated to:
  https://asciidoctor.org/ ([https](https://asciidoctor.org/) result 200).
* [ ] http://asciidoctor.org/docs/editing-asciidoc-with-live-preview/ with 2 occurrences migrated to:
  https://asciidoctor.org/docs/editing-asciidoc-with-live-preview/ ([https](https://asciidoctor.org/docs/editing-asciidoc-with-live-preview/) result 200).
* [ ] http://beanvalidation.org/ with 1 occurrences migrated to:
  https://beanvalidation.org/ ([https](https://beanvalidation.org/) result 200).
* [ ] http://caniuse.com/ with 2 occurrences migrated to:
  https://caniuse.com/ ([https](https://caniuse.com/) result 200).
* [ ] http://cbor.io/ with 1 occurrences migrated to:
  https://cbor.io/ ([https](https://cbor.io/) result 200).
* [ ] http://code.jquery.com/jquery-1.11.0.min.js with 2 occurrences migrated to:
  https://code.jquery.com/jquery-1.11.0.min.js ([https](https://code.jquery.com/jquery-1.11.0.min.js) result 200).
* [ ] http://code.jquery.com/jquery.js with 1 occurrences migrated to:
  https://code.jquery.com/jquery.js ([https](https://code.jquery.com/jquery.js) result 200).
* [ ] http://commons.apache.org/proper/commons-lang/ with 2 occurrences migrated to:
  https://commons.apache.org/proper/commons-lang/ ([https](https://commons.apache.org/proper/commons-lang/) result 200).
* [ ] http://docs.oracle.com/javase/6/docs/api/java/lang/instrument/package-summary.html with 1 occurrences migrated to:
  https://docs.oracle.com/javase/6/docs/api/java/lang/instrument/package-summary.html ([https](https://docs.oracle.com/javase/6/docs/api/java/lang/instrument/package-summary.html) result 200).
* [ ] http://docs.oracle.com/javase/8/docs/api/java/beans/package-summary.html with 1 occurrences migrated to:
  https://docs.oracle.com/javase/8/docs/api/java/beans/package-summary.html ([https](https://docs.oracle.com/javase/8/docs/api/java/beans/package-summary.html) result 200).
* [ ] http://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html with 1 occurrences migrated to:
  https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html ([https](https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html) result 200).
* [ ] http://docs.oracle.com/javase/8/docs/api/java/lang/instrument/package-summary.html with 1 occurrences migrated to:
  https://docs.oracle.com/javase/8/docs/api/java/lang/instrument/package-summary.html ([https](https://docs.oracle.com/javase/8/docs/api/java/lang/instrument/package-summary.html) result 200).
* [ ] http://docs.oracle.com/javase/8/docs/api/javax/script/ScriptEngineFactory.html with 2 occurrences migrated to:
  https://docs.oracle.com/javase/8/docs/api/javax/script/ScriptEngineFactory.html ([https](https://docs.oracle.com/javase/8/docs/api/javax/script/ScriptEngineFactory.html) result 200).
* [ ] http://docs.oracle.com/javase/tutorial/javabeans/advanced/customization.html with 1 occurrences migrated to:
  https://docs.oracle.com/javase/tutorial/javabeans/advanced/customization.html ([https](https://docs.oracle.com/javase/tutorial/javabeans/advanced/customization.html) result 200).
* [ ] http://docs.oracle.com/javase/tutorial/javabeans/writing/properties.html with 1 occurrences migrated to:
  https://docs.oracle.com/javase/tutorial/javabeans/writing/properties.html ([https](https://docs.oracle.com/javase/tutorial/javabeans/writing/properties.html) result 200).
* [ ] http://docs.seleniumhq.org/ with 1 occurrences migrated to:
  https://docs.seleniumhq.org/ ([https](https://docs.seleniumhq.org/) result 200).
* [ ] http://docs.seleniumhq.org/projects/webdriver/ with 1 occurrences migrated to:
  https://docs.seleniumhq.org/projects/webdriver/ ([https](https://docs.seleniumhq.org/projects/webdriver/) result 200).
* [ ] http://docs.spring.io/spring-framework/docs/current/javadoc-api/ with 1 occurrences migrated to:
  https://docs.spring.io/spring-framework/docs/current/javadoc-api/ ([https](https://docs.spring.io/spring-framework/docs/current/javadoc-api/) result 200).
* [ ] http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/view/script/ScriptTemplateView.html with 1 occurrences migrated to:
  https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/view/script/ScriptTemplateView.html ([https](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/view/script/ScriptTemplateView.html) result 200).
* [ ] http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/ with 1 occurrences migrated to:
  https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/ ([https](https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/) result 200).
* [ ] http://docs.spring.io/spring-session/docs/current/reference/html5/ with 1 occurrences migrated to:
  https://docs.spring.io/spring-session/docs/current/reference/html5/ ([https](https://docs.spring.io/spring-session/docs/current/reference/html5/) result 200).
* [ ] http://en.wikipedia.org/wiki/Adapter_pattern with 1 occurrences migrated to:
  https://en.wikipedia.org/wiki/Adapter_pattern ([https](https://en.wikipedia.org/wiki/Adapter_pattern) result 200).
* [ ] http://en.wikipedia.org/wiki/Halting_Problem with 1 occurrences migrated to:
  https://en.wikipedia.org/wiki/Halting_Problem ([https](https://en.wikipedia.org/wiki/Halting_Problem) result 200).
* [ ] http://en.wikipedia.org/wiki/List_of_HTTP_status_codes with 1 occurrences migrated to:
  https://en.wikipedia.org/wiki/List_of_HTTP_status_codes ([https](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes) result 200).
* [ ] http://en.wikipedia.org/wiki/MIME with 1 occurrences migrated to:
  https://en.wikipedia.org/wiki/MIME ([https](https://en.wikipedia.org/wiki/MIME) result 200).
* [ ] http://en.wikipedia.org/wiki/Mock_Object with 1 occurrences migrated to:
  https://en.wikipedia.org/wiki/Mock_Object ([https](https://en.wikipedia.org/wiki/Mock_Object) result 200).
* [ ] http://en.wikipedia.org/wiki/Polyfill with 2 occurrences migrated to:
  https://en.wikipedia.org/wiki/Polyfill ([https](https://en.wikipedia.org/wiki/Polyfill) result 200).
* [ ] http://example.com with 150 occurrences migrated to:
  https://example.com ([https](https://example.com) result 200).
* [ ] http://example.com/ with 16 occurrences migrated to:
  https://example.com/ ([https](https://example.com/) result 200).
* [ ] http://example.com?foo with 2 occurrences migrated to:
  https://example.com?foo ([https](https://example.com?foo) result 200).
* [ ] http://example.com?foo=bar with 8 occurrences migrated to:
  https://example.com?foo=bar ([https](https://example.com?foo=bar) result 200).
* [ ] http://example.com?foo=bar@baz with 1 occurrences migrated to:
  https://example.com?foo=bar@baz ([https](https://example.com?foo=bar@baz) result 200).
* [ ] http://example.org with 18 occurrences migrated to:
  https://example.org ([https](https://example.org) result 200).
* [ ] http://example.org/ with 1 occurrences migrated to:
  https://example.org/ ([https](https://example.org/) result 200).
* [ ] http://fasterxml.github.io/jackson-databind/javadoc/2.6/com/fasterxml/jackson/databind/DeserializationFeature.html with 2 occurrences migrated to:
  https://fasterxml.github.io/jackson-databind/javadoc/2.6/com/fasterxml/jackson/databind/DeserializationFeature.html ([https](https://fasterxml.github.io/jackson-databind/javadoc/2.6/com/fasterxml/jackson/databind/DeserializationFeature.html) result 200).
* [ ] http://fasterxml.github.io/jackson-databind/javadoc/2.6/com/fasterxml/jackson/databind/MapperFeature.html with 2 occurrences migrated to:
  https://fasterxml.github.io/jackson-databind/javadoc/2.6/com/fasterxml/jackson/databind/MapperFeature.html ([https](https://fasterxml.github.io/jackson-databind/javadoc/2.6/com/fasterxml/jackson/databind/MapperFeature.html) result 200).
* [ ] http://h2database.com with 1 occurrences migrated to:
  https://h2database.com ([https](https://h2database.com) result 200).
* [ ] http://handlebarsjs.com with 2 occurrences migrated to:
  https://handlebarsjs.com ([https](https://handlebarsjs.com) result 200).
* [ ] http://handlebarsjs.com/ with 2 occurrences migrated to:
  https://handlebarsjs.com/ ([https](https://handlebarsjs.com/) result 200).
* [ ] http://hc.apache.org/httpcomponents-asyncclient-dev/ with 1 occurrences migrated to:
  https://hc.apache.org/httpcomponents-asyncclient-dev/ ([https](https://hc.apache.org/httpcomponents-asyncclient-dev/) result 200).
* [ ] http://hc.apache.org/httpcomponents-client-ga/ with 2 occurrences migrated to:
  https://hc.apache.org/httpcomponents-client-ga/ ([https](https://hc.apache.org/httpcomponents-client-ga/) result 200).
* [ ] http://hc.apache.org/httpcomponents-client-ga/httpclient/ with 1 occurrences migrated to:
  https://hc.apache.org/httpcomponents-client-ga/httpclient/ ([https](https://hc.apache.org/httpcomponents-client-ga/httpclient/) result 200).
* [ ] http://www.hibernate.org/ (301) with 1 occurrences migrated to:
  https://hibernate.org/ ([https](https://www.hibernate.org/) result 200).
* [ ] http://www.hibernate.org (301) with 1 occurrences migrated to:
  https://hibernate.org/ ([https](https://www.hibernate.org) result 200).
* [ ] http://jcp.org/aboutJava/communityprocess/final/jsr003/index3.html with 1 occurrences migrated to:
  https://jcp.org/aboutJava/communityprocess/final/jsr003/index3.html ([https](https://jcp.org/aboutJava/communityprocess/final/jsr003/index3.html) result 200).
* [ ] http://jcp.org/aboutJava/communityprocess/final/jsr160/index.html with 1 occurrences migrated to:
  https://jcp.org/aboutJava/communityprocess/final/jsr160/index.html ([https](https://jcp.org/aboutJava/communityprocess/final/jsr160/index.html) result 200).
* [ ] http://jcp.org/en/jsr/detail?id=107 with 1 occurrences migrated to:
  https://jcp.org/en/jsr/detail?id=107 ([https](https://jcp.org/en/jsr/detail?id=107) result 200).
* [ ] http://joel-costigliola.github.io/assertj/ with 3 occurrences migrated to:
  https://joel-costigliola.github.io/assertj/ ([https](https://joel-costigliola.github.io/assertj/) result 200).
* [ ] http://jsonassert.skyscreamer.org with 1 occurrences migrated to:
  https://jsonassert.skyscreamer.org ([https](https://jsonassert.skyscreamer.org) result 200).
* [ ] http://jsonassert.skyscreamer.org/ with 5 occurrences migrated to:
  https://jsonassert.skyscreamer.org/ ([https](https://jsonassert.skyscreamer.org/) result 200).
* [ ] http://junit.org/junit5/docs/current/user-guide/ with 2 occurrences migrated to:
  https://junit.org/junit5/docs/current/user-guide/ ([https](https://junit.org/junit5/docs/current/user-guide/) result 200).
* [ ] http://kotlinlang.org/ with 2 occurrences migrated to:
  https://kotlinlang.org/ ([https](https://kotlinlang.org/) result 200).
* [ ] http://kotlinlang.org/docs/reference/ with 1 occurrences migrated to:
  https://kotlinlang.org/docs/reference/ ([https](https://kotlinlang.org/docs/reference/) result 200).
* [ ] http://kotlinlang.org/docs/reference/classes.html with 3 occurrences migrated to:
  https://kotlinlang.org/docs/reference/classes.html ([https](https://kotlinlang.org/docs/reference/classes.html) result 200).
* [ ] http://mydomain.com with 5 occurrences migrated to:
  https://mydomain.com ([https](https://mydomain.com) result 200).
* [ ] http://netty.io/ with 1 occurrences migrated to:
  https://netty.io/ ([https](https://netty.io/) result 200).
* [ ] http://openjdk.java.net/jeps/290 with 1 occurrences migrated to:
  https://openjdk.java.net/jeps/290 ([https](https://openjdk.java.net/jeps/290) result 200).
* [ ] http://openjdk.java.net/projects/nashorn/ with 10 occurrences migrated to:
  https://openjdk.java.net/projects/nashorn/ ([https](https://openjdk.java.net/projects/nashorn/) result 200).
* [ ] http://pivotal.io/security/cve-2015-5211 with 1 occurrences migrated to:
  https://pivotal.io/security/cve-2015-5211 ([https](https://pivotal.io/security/cve-2015-5211) result 200).
* [ ] http://poi.apache.org with 3 occurrences migrated to:
  https://poi.apache.org ([https](https://poi.apache.org) result 200).
* [ ] http://projects.spring.io/spring-boot/ with 1 occurrences migrated to:
  https://projects.spring.io/spring-boot/ ([https](https://projects.spring.io/spring-boot/) result 200).
* [ ] http://projects.spring.io/spring-data/ with 1 occurrences migrated to:
  https://projects.spring.io/spring-data/ ([https](https://projects.spring.io/spring-data/) result 200).
* [ ] http://projects.spring.io/spring-framework/ with 1 occurrences migrated to:
  https://projects.spring.io/spring-framework/ ([https](https://projects.spring.io/spring-framework/) result 200).
* [ ] http://projects.spring.io/spring-integration/ with 1 occurrences migrated to:
  https://projects.spring.io/spring-integration/ ([https](https://projects.spring.io/spring-integration/) result 200).
* [ ] http://projects.spring.io/spring-security/ with 3 occurrences migrated to:
  https://projects.spring.io/spring-security/ ([https](https://projects.spring.io/spring-security/) result 200).
* [ ] http://repo1.maven.org/maven2/javax/inject/javax.inject/1/ with 2 occurrences migrated to:
  https://repo1.maven.org/maven2/javax/inject/javax.inject/1/ ([https](https://repo1.maven.org/maven2/javax/inject/javax.inject/1/) result 200).
* [ ] http://schema.spring.io/mvc/spring-mvc.xsd with 1 occurrences migrated to:
  https://schema.spring.io/mvc/spring-mvc.xsd ([https](https://schema.spring.io/mvc/spring-mvc.xsd) result 200).
* [ ] http://search.maven.org/ with 2 occurrences migrated to:
  https://search.maven.org/ ([https](https://search.maven.org/) result 200).
* [ ] http://sockjs.github.io/sockjs-protocol/sockjs-protocol-0.3.3.html with 3 occurrences migrated to:
  https://sockjs.github.io/sockjs-protocol/sockjs-protocol-0.3.3.html ([https](https://sockjs.github.io/sockjs-protocol/sockjs-protocol-0.3.3.html) result 200).
* [ ] http://sourceforge.net with 1 occurrences migrated to:
  https://sourceforge.net ([https](https://sourceforge.net) result 200).
* [ ] http://sourceforge.net/projects/javadiff/ with 1 occurrences migrated to:
  https://sourceforge.net/projects/javadiff/ ([https](https://sourceforge.net/projects/javadiff/) result 200).
* [ ] http://sourceforge.net/sflogo.php?group_id=37160 with 1 occurrences migrated to:
  https://sourceforge.net/sflogo.php?group_id=37160 ([https](https://sourceforge.net/sflogo.php?group_id=37160) result 200).
* [ ] http://spring.io/blog/ with 1 occurrences migrated to:
  https://spring.io/blog/ ([https](https://spring.io/blog/) result 200).
* [ ] http://spring.io/blog/category/news with 1 occurrences migrated to:
  https://spring.io/blog/category/news ([https](https://spring.io/blog/category/news) result 200).
* [ ] http://square.github.io/okhttp/ with 1 occurrences migrated to:
  https://square.github.io/okhttp/ ([https](https://square.github.io/okhttp/) result 200).
* [ ] http://stackoverflow.com/questions/1481251/what-does-document-domain-document-domain-do with 1 occurrences migrated to:
  https://stackoverflow.com/questions/1481251/what-does-document-domain-document-domain-do ([https](https://stackoverflow.com/questions/1481251/what-does-document-domain-document-domain-do) result 200).
* [ ] http://stackoverflow.com/questions/19394570/java-jre-7u45-breaks-classloader-getresources with 2 occurrences migrated to:
  https://stackoverflow.com/questions/19394570/java-jre-7u45-breaks-classloader-getresources ([https](https://stackoverflow.com/questions/19394570/java-jre-7u45-breaks-classloader-getresources) result 200).
* [ ] http://stackoverflow.com/questions/22986109/testing-spring-managed-servlet with 1 occurrences migrated to:
  https://stackoverflow.com/questions/22986109/testing-spring-managed-servlet ([https](https://stackoverflow.com/questions/22986109/testing-spring-managed-servlet) result 200).
* [ ] http://stackoverflow.com/questions/24725438/what-could-cause-a-class-implementing-applicationlistenercontextrefreshedevent with 1 occurrences migrated to:
  https://stackoverflow.com/questions/24725438/what-could-cause-a-class-implementing-applicationlistenercontextrefreshedevent ([https](https://stackoverflow.com/questions/24725438/what-could-cause-a-class-implementing-applicationlistenercontextrefreshedevent) result 200).
* [ ] http://stackoverflow.com/questions/35733344/can-contextconfiguration-in-a-custom-annotation-be-merged with 1 occurrences migrated to:
  https://stackoverflow.com/questions/35733344/can-contextconfiguration-in-a-custom-annotation-be-merged ([https](https://stackoverflow.com/questions/35733344/can-contextconfiguration-in-a-custom-annotation-be-merged) result 200).
* [ ] http://start.spring.io/ with 2 occurrences migrated to:
  https://start.spring.io/ ([https](https://start.spring.io/) result 200).
* [ ] http://stas-blogspot.blogspot.com/2010/03/java-bridge-methods-explained.html with 1 occurrences migrated to:
  https://stas-blogspot.blogspot.com/2010/03/java-bridge-methods-explained.html ([https](https://stas-blogspot.blogspot.com/2010/03/java-bridge-methods-explained.html) result 200).
* [ ] http://stomp.github.io/stomp-specification-1.2.html with 9 occurrences migrated to:
  https://stomp.github.io/stomp-specification-1.2.html ([https](https://stomp.github.io/stomp-specification-1.2.html) result 200).
* [ ] http://struts.apache.org with 1 occurrences migrated to:
  https://struts.apache.org ([https](https://struts.apache.org) result 200).
* [ ] http://struts.apache.org/ with 1 occurrences migrated to:
  https://struts.apache.org/ ([https](https://struts.apache.org/) result 200).
* [ ] http://tapestry.apache.org/ with 2 occurrences migrated to:
  https://tapestry.apache.org/ ([https](https://tapestry.apache.org/) result 200).
* [ ] http://tiles.apache.org with 4 occurrences migrated to:
  https://tiles.apache.org ([https](https://tiles.apache.org) result 200).
* [ ] http://tiles.apache.org/framework/dependency-management.html with 1 occurrences migrated to:
  https://tiles.apache.org/framework/dependency-management.html ([https](https://tiles.apache.org/framework/dependency-management.html) result 200).
* [ ] http://tomcat.apache.org/ with 1 occurrences migrated to:
  https://tomcat.apache.org/ ([https](https://tomcat.apache.org/) result 200).
* [ ] http://tools.ietf.org/html/rfc1945 with 1 occurrences migrated to:
  https://tools.ietf.org/html/rfc1945 ([https](https://tools.ietf.org/html/rfc1945) result 200).
* [ ] http://tools.ietf.org/html/rfc2109 with 2 occurrences migrated to:
  https://tools.ietf.org/html/rfc2109 ([https](https://tools.ietf.org/html/rfc2109) result 200).
* [ ] http://tools.ietf.org/html/rfc2295 with 1 occurrences migrated to:
  https://tools.ietf.org/html/rfc2295 ([https](https://tools.ietf.org/html/rfc2295) result 200).
* [ ] http://tools.ietf.org/html/rfc2324 with 1 occurrences migrated to:
  https://tools.ietf.org/html/rfc2324 ([https](https://tools.ietf.org/html/rfc2324) result 200).
* [ ] http://tools.ietf.org/html/rfc2518 with 1 occurrences migrated to:
  https://tools.ietf.org/html/rfc2518 ([https](https://tools.ietf.org/html/rfc2518) result 200).
* [ ] http://tools.ietf.org/html/rfc2616 with 3 occurrences migrated to:
  https://tools.ietf.org/html/rfc2616 ([https](https://tools.ietf.org/html/rfc2616) result 200).
* [ ] http://tools.ietf.org/html/rfc2774 with 1 occurrences migrated to:
  https://tools.ietf.org/html/rfc2774 ([https](https://tools.ietf.org/html/rfc2774) result 200).
* [ ] http://tools.ietf.org/html/rfc2817 with 1 occurrences migrated to:
  https://tools.ietf.org/html/rfc2817 ([https](https://tools.ietf.org/html/rfc2817) result 200).
* [ ] http://tools.ietf.org/html/rfc2965 with 1 occurrences migrated to:
  https://tools.ietf.org/html/rfc2965 ([https](https://tools.ietf.org/html/rfc2965) result 200).
* [ ] http://tools.ietf.org/html/rfc3229 with 1 occurrences migrated to:
  https://tools.ietf.org/html/rfc3229 ([https](https://tools.ietf.org/html/rfc3229) result 200).
* [ ] http://tools.ietf.org/html/rfc3986 with 4 occurrences migrated to:
  https://tools.ietf.org/html/rfc3986 ([https](https://tools.ietf.org/html/rfc3986) result 200).
* [ ] http://tools.ietf.org/html/rfc4918 with 5 occurrences migrated to:
  https://tools.ietf.org/html/rfc4918 ([https](https://tools.ietf.org/html/rfc4918) result 200).
* [ ] http://tools.ietf.org/html/rfc5842 with 2 occurrences migrated to:
  https://tools.ietf.org/html/rfc5842 ([https](https://tools.ietf.org/html/rfc5842) result 200).
* [ ] http://tools.ietf.org/html/rfc5988 with 1 occurrences migrated to:
  https://tools.ietf.org/html/rfc5988 ([https](https://tools.ietf.org/html/rfc5988) result 200).
* [ ] http://tools.ietf.org/html/rfc6266 with 1 occurrences migrated to:
  https://tools.ietf.org/html/rfc6266 ([https](https://tools.ietf.org/html/rfc6266) result 200).
* [ ] http://tools.ietf.org/html/rfc6454 with 1 occurrences migrated to:
  https://tools.ietf.org/html/rfc6454 ([https](https://tools.ietf.org/html/rfc6454) result 200).
* [ ] http://tools.ietf.org/html/rfc6455 with 2 occurrences migrated to:
  https://tools.ietf.org/html/rfc6455 ([https](https://tools.ietf.org/html/rfc6455) result 200).
* [ ] http://tools.ietf.org/html/rfc6585 with 4 occurrences migrated to:
  https://tools.ietf.org/html/rfc6585 ([https](https://tools.ietf.org/html/rfc6585) result 200).
* [ ] http://tools.ietf.org/html/rfc7230 with 10 occurrences migrated to:
  https://tools.ietf.org/html/rfc7230 ([https](https://tools.ietf.org/html/rfc7230) result 200).
* [ ] http://tools.ietf.org/html/rfc7231 with 56 occurrences migrated to:
  https://tools.ietf.org/html/rfc7231 ([https](https://tools.ietf.org/html/rfc7231) result 200).
* [ ] http://tools.ietf.org/html/rfc7232 with 8 occurrences migrated to:
  https://tools.ietf.org/html/rfc7232 ([https](https://tools.ietf.org/html/rfc7232) result 200).
* [ ] http://tools.ietf.org/html/rfc7233 with 12 occurrences migrated to:
  https://tools.ietf.org/html/rfc7233 ([https](https://tools.ietf.org/html/rfc7233) result 200).
* [ ] http://tools.ietf.org/html/rfc7234 with 5 occurrences migrated to:
  https://tools.ietf.org/html/rfc7234 ([https](https://tools.ietf.org/html/rfc7234) result 200).
* [ ] http://tools.ietf.org/html/rfc7235 with 6 occurrences migrated to:
  https://tools.ietf.org/html/rfc7235 ([https](https://tools.ietf.org/html/rfc7235) result 200).
* [ ] http://tools.ietf.org/html/rfc7238 with 1 occurrences migrated to:
  https://tools.ietf.org/html/rfc7238 ([https](https://tools.ietf.org/html/rfc7238) result 200).
* [ ] http://tools.ietf.org/rfcdiff?difftype=--hwdiff&url2=draft-ietf-webdav-protocol-06.txt with 3 occurrences migrated to:
  https://tools.ietf.org/rfcdiff?difftype=--hwdiff&url2=draft-ietf-webdav-protocol-06.txt ([https](https://tools.ietf.org/rfcdiff?difftype=--hwdiff&url2=draft-ietf-webdav-protocol-06.txt) result 200).
* [ ] http://www.amazon.com/exec/obidos/tg/detail/-/0764543857/ with 10 occurrences migrated to:
  https://www.amazon.com/exec/obidos/tg/detail/-/0764543857/ ([https](https://www.amazon.com/exec/obidos/tg/detail/-/0764543857/) result 200).
* [ ] http://www.apache.org with 1 occurrences migrated to:
  https://www.apache.org ([https](https://www.apache.org) result 200).
* [ ] http://www.apple.com/DTDs/PropertyList-1.0.dtd with 6 occurrences migrated to:
  https://www.apple.com/DTDs/PropertyList-1.0.dtd ([https](https://www.apple.com/DTDs/PropertyList-1.0.dtd) result 200).
* [ ] http://www.atomikos.com/ with 1 occurrences migrated to:
  https://www.atomikos.com/ ([https](https://www.atomikos.com/) result 200).
* [ ] http://www.baeldung.com/kotlin-null-safety with 1 occurrences migrated to:
  https://www.baeldung.com/kotlin-null-safety ([https](https://www.baeldung.com/kotlin-null-safety) result 200).
* [ ] http://www.eclipse.org/ajdt/ with 1 occurrences migrated to:
  https://www.eclipse.org/ajdt/ ([https](https://www.eclipse.org/ajdt/) result 200).
* [ ] http://www.eclipse.org/aspectj/doc/next/progguide/index.html with 1 occurrences migrated to:
  https://www.eclipse.org/aspectj/doc/next/progguide/index.html ([https](https://www.eclipse.org/aspectj/doc/next/progguide/index.html) result 200).
* [ ] http://www.eclipse.org/aspectj/doc/next/progguide/semantics-joinPoints.html with 1 occurrences migrated to:
  https://www.eclipse.org/aspectj/doc/next/progguide/semantics-joinPoints.html ([https](https://www.eclipse.org/aspectj/doc/next/progguide/semantics-joinPoints.html) result 200).
* [ ] http://www.eclipse.org/aspectj/doc/released/adk15notebook/index.html with 1 occurrences migrated to:
  https://www.eclipse.org/aspectj/doc/released/adk15notebook/index.html ([https](https://www.eclipse.org/aspectj/doc/released/adk15notebook/index.html) result 200).
* [ ] http://www.eclipse.org/aspectj/doc/released/devguide/antTasks.html with 1 occurrences migrated to:
  https://www.eclipse.org/aspectj/doc/released/devguide/antTasks.html ([https](https://www.eclipse.org/aspectj/doc/released/devguide/antTasks.html) result 200).
* [ ] http://www.eclipse.org/aspectj/doc/released/devguide/index.html with 1 occurrences migrated to:
  https://www.eclipse.org/aspectj/doc/released/devguide/index.html ([https](https://www.eclipse.org/aspectj/doc/released/devguide/index.html) result 200).
* [ ] http://www.eclipse.org/aspectj/doc/released/devguide/ltw-configuration.html with 1 occurrences migrated to:
  https://www.eclipse.org/aspectj/doc/released/devguide/ltw-configuration.html ([https](https://www.eclipse.org/aspectj/doc/released/devguide/ltw-configuration.html) result 200).
* [ ] http://www.eclipse.org/aspectj/doc/released/devguide/ltw.html with 1 occurrences migrated to:
  https://www.eclipse.org/aspectj/doc/released/devguide/ltw.html ([https](https://www.eclipse.org/aspectj/doc/released/devguide/ltw.html) result 200).
* [ ] http://www.eclipse.org/aspectj/doc/released/progguide/index.html with 1 occurrences migrated to:
  https://www.eclipse.org/aspectj/doc/released/progguide/index.html ([https](https://www.eclipse.org/aspectj/doc/released/progguide/index.html) result 200).
* [ ] http://www.eclipse.org/aspectj/doc/released/progguide/semantics-pointcuts.html with 1 occurrences migrated to:
  https://www.eclipse.org/aspectj/doc/released/progguide/semantics-pointcuts.html ([https](https://www.eclipse.org/aspectj/doc/released/progguide/semantics-pointcuts.html) result 200).
* [ ] http://www.eclipse.org/aspectj/dtd/aspectj.dtd with 1 occurrences migrated to:
  https://www.eclipse.org/aspectj/dtd/aspectj.dtd ([https](https://www.eclipse.org/aspectj/dtd/aspectj.dtd) result 200).
* [ ] http://ehcache.sourceforge.net (301) with 1 occurrences migrated to:
  https://www.ehcache.org/ ([https](https://ehcache.sourceforge.net) result 200).
* [ ] http://ehcache.org/ (301) with 1 occurrences migrated to:
  https://www.ehcache.org/ ([https](https://ehcache.org/) result 200).
* [ ] http://www.embeddedjs.com/ with 2 occurrences migrated to:
  https://www.embeddedjs.com/ ([https](https://www.embeddedjs.com/) result 200).
* [ ] http://www.enterpriseintegrationpatterns.com with 1 occurrences migrated to:
  https://www.enterpriseintegrationpatterns.com ([https](https://www.enterpriseintegrationpatterns.com) result 200).
* [ ] http://www.example.org/?param=aGVsbG9Xb3JsZA%3D%3D with 1 occurrences migrated to:
  https://www.example.org/?param=aGVsbG9Xb3JsZA%3D%3D ([https](https://www.example.org/?param=aGVsbG9Xb3JsZA%3D%3D) result 200).
* [ ] http://www.google.com with 2 occurrences migrated to:
  https://www.google.com ([https](https://www.google.com) result 200).
* [ ] http://www.h2database.com with 1 occurrences migrated to:
  https://www.h2database.com ([https](https://www.h2database.com) result 200).
* [ ] http://www.h2database.com/html/grammar.html with 1 occurrences migrated to:
  https://www.h2database.com/html/grammar.html ([https](https://www.h2database.com/html/grammar.html) result 200).
* [ ] http://www.ietf.org with 1 occurrences migrated to:
  https://www.ietf.org ([https](https://www.ietf.org) result 200).
* [ ] http://www.ietf.org/rfc/rfc1867.txt with 1 occurrences migrated to:
  https://www.ietf.org/rfc/rfc1867.txt ([https](https://www.ietf.org/rfc/rfc1867.txt) result 200).
* [ ] http://www.ietf.org/rfc/rfc2396.txt with 2 occurrences migrated to:
  https://www.ietf.org/rfc/rfc2396.txt ([https](https://www.ietf.org/rfc/rfc2396.txt) result 200).
* [ ] http://www.ietf.org/rfc/rfc3986.txt with 11 occurrences migrated to:
  https://www.ietf.org/rfc/rfc3986.txt ([https](https://www.ietf.org/rfc/rfc3986.txt) result 200).
* [ ] http://www.infoq.com/ with 1 occurrences migrated to:
  https://www.infoq.com/ ([https](https://www.infoq.com/) result 200).
* [ ] http://www.infoq.com/minibooks/JTDS with 1 occurrences migrated to:
  https://www.infoq.com/minibooks/JTDS ([https](https://www.infoq.com/minibooks/JTDS) result 200).
* [ ] http://www.jetbrains.com/idea/ with 1 occurrences migrated to:
  https://www.jetbrains.com/idea/ ([https](https://www.jetbrains.com/idea/) result 200).
* [ ] http://www.json.org/ with 1 occurrences migrated to:
  https://www.json.org/ ([https](https://www.json.org/) result 200).
* [ ] http://www.jython.org with 2 occurrences migrated to:
  https://www.jython.org ([https](https://www.jython.org) result 200).
* [ ] http://www.jython.org/ with 2 occurrences migrated to:
  https://www.jython.org/ ([https](https://www.jython.org/) result 200).
* [ ] http://www.lowagie.com/iText with 2 occurrences migrated to:
  https://www.lowagie.com/iText ([https](https://www.lowagie.com/iText) result 200).
* [ ] http://www.manpagez.com/man/5/crontab/ with 1 occurrences migrated to:
  https://www.manpagez.com/man/5/crontab/ ([https](https://www.manpagez.com/man/5/crontab/) result 200).
* [ ] http://mydomain1.com:80/ (301) with 2 occurrences migrated to:
  https://www.mydomain1.com/ ([https](https://mydomain1.com:80/) result 200).
* [ ] http://mydomain1.com:80 (301) with 1 occurrences migrated to:
  https://www.mydomain1.com/ ([https](https://mydomain1.com:80) result 200).
* [ ] http://www.oracle.com/technetwork/articles/javaee/jpa-137156.html with 1 occurrences migrated to:
  https://www.oracle.com/technetwork/articles/javaee/jpa-137156.html ([https](https://www.oracle.com/technetwork/articles/javaee/jpa-137156.html) result 200).
* [ ] http://www.oracle.com/technetwork/java/javaee/javaserverfaces-139869.html with 1 occurrences migrated to:
  https://www.oracle.com/technetwork/java/javaee/javaserverfaces-139869.html ([https](https://www.oracle.com/technetwork/java/javaee/javaserverfaces-139869.html) result 200).
* [ ] http://www.oracle.com/technetwork/java/javase/documentation/spec-136004.html with 1 occurrences migrated to:
  https://www.oracle.com/technetwork/java/javase/documentation/spec-136004.html ([https](https://www.oracle.com/technetwork/java/javase/documentation/spec-136004.html) result 200).
* [ ] http://www.oracle.com/technetwork/java/javase/tech/download-jsp-141676.html with 1 occurrences migrated to:
  https://www.oracle.com/technetwork/java/javase/tech/download-jsp-141676.html ([https](https://www.oracle.com/technetwork/java/javase/tech/download-jsp-141676.html) result 200).
* [ ] http://www.oracle.com/technetwork/java/javase/tech/javamanagement-140525.html with 1 occurrences migrated to:
  https://www.oracle.com/technetwork/java/javase/tech/javamanagement-140525.html ([https](https://www.oracle.com/technetwork/java/javase/tech/javamanagement-140525.html) result 200).
* [ ] http://www.oracle.com/technetwork/middleware/weblogic/overview/index-085209.html with 1 occurrences migrated to:
  https://www.oracle.com/technetwork/middleware/weblogic/overview/index-085209.html ([https](https://www.oracle.com/technetwork/middleware/weblogic/overview/index-085209.html) result 200).
* [ ] http://www.ow2.org/ with 1 occurrences migrated to:
  https://www.ow2.org/ ([https](https://www.ow2.org/) result 200).
* [ ] http://www.owasp.org/index.php/HTTPOnly with 4 occurrences migrated to:
  https://www.owasp.org/index.php/HTTPOnly ([https](https://www.owasp.org/index.php/HTTPOnly) result 200).
* [ ] http://quartz-scheduler.org (301) with 3 occurrences migrated to:
  https://www.quartz-scheduler.org/ ([https](https://quartz-scheduler.org) result 200).
* [ ] http://www.rabbitmq.com/stomp.html with 1 occurrences migrated to:
  https://www.rabbitmq.com/stomp.html ([https](https://www.rabbitmq.com/stomp.html) result 200).
* [ ] http://www.reactive-streams.org with 1 occurrences migrated to:
  https://www.reactive-streams.org ([https](https://www.reactive-streams.org) result 200).
* [ ] http://www.reactive-streams.org/ with 2 occurrences migrated to:
  https://www.reactive-streams.org/ ([https](https://www.reactive-streams.org/) result 200).
* [ ] http://www.reactive-streams.org/reactive-streams-1.0.1-javadoc/org/reactivestreams/Publisher.html with 1 occurrences migrated to:
  https://www.reactive-streams.org/reactive-streams-1.0.1-javadoc/org/reactivestreams/Publisher.html ([https](https://www.reactive-streams.org/reactive-streams-1.0.1-javadoc/org/reactivestreams/Publisher.html) result 200).
* [ ] http://www.reactive-streams.org/reactive-streams-1.0.1-javadoc/org/reactivestreams/Subscriber.html with 1 occurrences migrated to:
  https://www.reactive-streams.org/reactive-streams-1.0.1-javadoc/org/reactivestreams/Subscriber.html ([https](https://www.reactive-streams.org/reactive-streams-1.0.1-javadoc/org/reactivestreams/Subscriber.html) result 200).
* [ ] http://seleniumhq.org/projects/webdriver/ (301) with 1 occurrences migrated to:
  https://www.seleniumhq.org ([https](https://seleniumhq.org/projects/webdriver/) result 200).
* [ ] http://www.springbyexample.org/examples/custom-thread-scope-module.html with 1 occurrences migrated to:
  https://www.springbyexample.org/examples/custom-thread-scope-module.html ([https](https://www.springbyexample.org/examples/custom-thread-scope-module.html) result 200).
* [ ] http://www.springframework.org/dtd/spring-beans-2.0.dtd with 3 occurrences migrated to:
  https://www.springframework.org/dtd/spring-beans-2.0.dtd ([https](https://www.springframework.org/dtd/spring-beans-2.0.dtd) result 200).
* [ ] http://www.springframework.org/schema/aop/spring-aop.xsd with 12 occurrences migrated to:
  https://www.springframework.org/schema/aop/spring-aop.xsd ([https](https://www.springframework.org/schema/aop/spring-aop.xsd) result 200).
* [ ] http://www.springframework.org/schema/beans/spring-beans.xsd with 80 occurrences migrated to:
  https://www.springframework.org/schema/beans/spring-beans.xsd ([https](https://www.springframework.org/schema/beans/spring-beans.xsd) result 200).
* [ ] http://www.springframework.org/schema/cache/spring-cache.xsd with 2 occurrences migrated to:
  https://www.springframework.org/schema/cache/spring-cache.xsd ([https](https://www.springframework.org/schema/cache/spring-cache.xsd) result 200).
* [ ] http://www.springframework.org/schema/context/spring-context.xsd with 13 occurrences migrated to:
  https://www.springframework.org/schema/context/spring-context.xsd ([https](https://www.springframework.org/schema/context/spring-context.xsd) result 200).
* [ ] http://www.springframework.org/schema/jdbc/spring-jdbc.xsd with 1 occurrences migrated to:
  https://www.springframework.org/schema/jdbc/spring-jdbc.xsd ([https](https://www.springframework.org/schema/jdbc/spring-jdbc.xsd) result 200).
* [ ] http://www.springframework.org/schema/jee/spring-jee.xsd with 2 occurrences migrated to:
  https://www.springframework.org/schema/jee/spring-jee.xsd ([https](https://www.springframework.org/schema/jee/spring-jee.xsd) result 200).
* [ ] http://www.springframework.org/schema/jms/spring-jms.xsd with 2 occurrences migrated to:
  https://www.springframework.org/schema/jms/spring-jms.xsd ([https](https://www.springframework.org/schema/jms/spring-jms.xsd) result 200).
* [ ] http://www.springframework.org/schema/lang/spring-lang.xsd with 4 occurrences migrated to:
  https://www.springframework.org/schema/lang/spring-lang.xsd ([https](https://www.springframework.org/schema/lang/spring-lang.xsd) result 200).
* [ ] http://www.springframework.org/schema/mvc/spring-mvc.xsd with 3 occurrences migrated to:
  https://www.springframework.org/schema/mvc/spring-mvc.xsd ([https](https://www.springframework.org/schema/mvc/spring-mvc.xsd) result 200).
* [ ] http://www.springframework.org/schema/oxm/spring-oxm.xsd with 1 occurrences migrated to:
  https://www.springframework.org/schema/oxm/spring-oxm.xsd ([https](https://www.springframework.org/schema/oxm/spring-oxm.xsd) result 200).
* [ ] http://www.springframework.org/schema/tool/spring-tool.xsd with 13 occurrences migrated to:
  https://www.springframework.org/schema/tool/spring-tool.xsd ([https](https://www.springframework.org/schema/tool/spring-tool.xsd) result 200).
* [ ] http://www.springframework.org/schema/tx/spring-tx.xsd with 8 occurrences migrated to:
  https://www.springframework.org/schema/tx/spring-tx.xsd ([https](https://www.springframework.org/schema/tx/spring-tx.xsd) result 200).
* [ ] http://www.springframework.org/schema/util/spring-util.xsd with 1 occurrences migrated to:
  https://www.springframework.org/schema/util/spring-util.xsd ([https](https://www.springframework.org/schema/util/spring-util.xsd) result 200).
* [ ] http://www.springframework.org/schema/websocket/spring-websocket.xsd with 12 occurrences migrated to:
  https://www.springframework.org/schema/websocket/spring-websocket.xsd ([https](https://www.springframework.org/schema/websocket/spring-websocket.xsd) result 200).
* [ ] http://www.stuartellis.eu/articles/erb/ (301) with 2 occurrences migrated to:
  https://www.stuartellis.name/articles/erb/ ([https](https://www.stuartellis.eu/articles/erb/) result 200).
* [ ] http://www.thymeleaf.org/ with 2 occurrences migrated to:
  https://www.thymeleaf.org/ ([https](https://www.thymeleaf.org/) result 200).
* [ ] http://www.thymeleaf.org/documentation.html with 2 occurrences migrated to:
  https://www.thymeleaf.org/documentation.html ([https](https://www.thymeleaf.org/documentation.html) result 200).
* [ ] http://www.webjars.org with 4 occurrences migrated to:
  https://www.webjars.org ([https](https://www.webjars.org) result 200).
* [ ] http://www.webjars.org/ with 2 occurrences migrated to:
  https://www.webjars.org/ ([https](https://www.webjars.org/) result 200).
* [ ] http://www.webjars.org/documentation with 2 occurrences migrated to:
  https://www.webjars.org/documentation ([https](https://www.webjars.org/documentation) result 200).
* [ ] http://www.wildfly.org/ with 1 occurrences migrated to:
  https://www.wildfly.org/ ([https](https://www.wildfly.org/) result 200).
* [ ] http://x-stream.github.io/ with 2 occurrences migrated to:
  https://x-stream.github.io/ ([https](https://x-stream.github.io/) result 200).
* [ ] http://youtrack.jetbrains.com/issue/IDEA-53476 with 1 occurrences migrated to:
  https://youtrack.jetbrains.com/issue/IDEA-53476 ([https](https://youtrack.jetbrains.com/issue/IDEA-53476) result 200).
* [ ] http://youtrack.jetbrains.com/issue/IDEA-64446 with 1 occurrences migrated to:
  https://youtrack.jetbrains.com/issue/IDEA-64446 ([https](https://youtrack.jetbrains.com/issue/IDEA-64446) result 200).
* [ ] http://bit.ly/TRlX2r with 1 occurrences migrated to:
  https://bit.ly/TRlX2r ([https](https://bit.ly/TRlX2r) result 301).
* [ ] http://bit.ly/UzccDt with 1 occurrences migrated to:
  https://bit.ly/UzccDt ([https](https://bit.ly/UzccDt) result 301).
* [ ] http://bit.ly/p9rIvx with 1 occurrences migrated to:
  https://bit.ly/p9rIvx ([https](https://bit.ly/p9rIvx) result 301).
* [ ] http://bit.ly/qUwvwz with 1 occurrences migrated to:
  https://bit.ly/qUwvwz ([https](https://bit.ly/qUwvwz) result 301).
* [ ] http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx with 1 occurrences migrated to:
  https://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx ([https](https://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx) result 301).
* [ ] http://code.google.com/p/beanshell2/ with 1 occurrences migrated to:
  https://code.google.com/p/beanshell2/ ([https](https://code.google.com/p/beanshell2/) result 301).
* [ ] http://code.google.com/p/browsersec/wiki/Part2 with 1 occurrences migrated to:
  https://code.google.com/p/browsersec/wiki/Part2 ([https](https://code.google.com/p/browsersec/wiki/Part2) result 301).
* [ ] http://code.google.com/p/gears/wiki/ResumableHttpRequestsProposal with 1 occurrences migrated to:
  https://code.google.com/p/gears/wiki/ResumableHttpRequestsProposal ([https](https://code.google.com/p/gears/wiki/ResumableHttpRequestsProposal) result 301).
* [ ] http://code.google.com/p/xml-matchers/ with 3 occurrences migrated to:
  https://code.google.com/p/xml-matchers/ ([https](https://code.google.com/p/xml-matchers/) result 301).
* [ ] http://commons.apache.org/proper/commons-dbcp with 2 occurrences migrated to:
  https://commons.apache.org/proper/commons-dbcp ([https](https://commons.apache.org/proper/commons-dbcp) result 301).
* [ ] http://commons.apache.org/proper/commons-fileupload with 2 occurrences migrated to:
  https://commons.apache.org/proper/commons-fileupload ([https](https://commons.apache.org/proper/commons-fileupload) result 301).
* [ ] http://confluence.jetbrains.net/display/IDEADEV/Gradle+integration with 1 occurrences migrated to:
  https://confluence.jetbrains.net/display/IDEADEV/Gradle+integration ([https](https://confluence.jetbrains.net/display/IDEADEV/Gradle+integration) result 301).
* [ ] http://contributor-covenant.org with 1 occurrences migrated to:
  https://contributor-covenant.org ([https](https://contributor-covenant.org) result 301).
* [ ] http://contributor-covenant.org/version/1/3/0/ with 1 occurrences migrated to:
  https://contributor-covenant.org/version/1/3/0/ ([https](https://contributor-covenant.org/version/1/3/0/) result 301).
* [ ] http://db.apache.org/derby with 2 occurrences migrated to:
  https://db.apache.org/derby ([https](https://db.apache.org/derby) result 301).
* [ ] http://dev.w3.org/html5/eventsource/ with 2 occurrences migrated to:
  https://dev.w3.org/html5/eventsource/ ([https](https://dev.w3.org/html5/eventsource/) result 301).
* [ ] http://domain.com with 24 occurrences migrated to:
  https://domain.com ([https](https://domain.com) result 301).
* [ ] http://domain.com/ with 1 occurrences migrated to:
  https://domain.com/ ([https](https://domain.com/) result 301).
* [ ] http://en.wikipedia.org/wiki/Cache_ with 1 occurrences migrated to:
  https://en.wikipedia.org/wiki/Cache_ ([https](https://en.wikipedia.org/wiki/Cache_) result 301).
* [ ] http://facebook.github.io/react/ with 2 occurrences migrated to:
  https://facebook.github.io/react/ ([https](https://facebook.github.io/react/) result 301).
* [ ] http://forum.springframework.org/showthread.php?t=41350 with 1 occurrences migrated to:
  https://forum.springframework.org/showthread.php?t=41350 ([https](https://forum.springframework.org/showthread.php?t=41350) result 301).
* [ ] http://github.com/SpringSource/spring-framework with 1 occurrences migrated to:
  https://github.com/SpringSource/spring-framework ([https](https://github.com/SpringSource/spring-framework) result 301).
* [ ] http://hdiv.org/ with 1 occurrences migrated to:
  https://hdiv.org/ ([https](https://hdiv.org/) result 301).
* [ ] http://jakarta.apache.org/commons/fileupload with 1 occurrences migrated to:
  https://jakarta.apache.org/commons/fileupload ([https](https://jakarta.apache.org/commons/fileupload) result 301).
* [ ] http://jira.springframework.org/browse/SPR-5708 with 1 occurrences migrated to:
  https://jira.springframework.org/browse/SPR-5708 ([https](https://jira.springframework.org/browse/SPR-5708) result 301).
* [ ] http://jira.springframework.org/browse/SPR-6124 with 1 occurrences migrated to:
  https://jira.springframework.org/browse/SPR-6124 ([https](https://jira.springframework.org/browse/SPR-6124) result 301).
* [ ] http://jira.springframework.org/browse/SPR-6128 with 1 occurrences migrated to:
  https://jira.springframework.org/browse/SPR-6128 ([https](https://jira.springframework.org/browse/SPR-6128) result 301).
* [ ] http://jira.springframework.org/browse/SPR-7064 with 1 occurrences migrated to:
  https://jira.springframework.org/browse/SPR-7064 ([https](https://jira.springframework.org/browse/SPR-7064) result 301).
* [ ] http://maven.apache.org/plugins/maven-surefire-plugin/test-mojo.html with 1 occurrences migrated to:
  https://maven.apache.org/plugins/maven-surefire-plugin/test-mojo.html ([https](https://maven.apache.org/plugins/maven-surefire-plugin/test-mojo.html) result 301).
* [ ] http://mockito.org/ (301) with 1 occurrences migrated to:
  https://mockito.github.io ([https](https://mockito.org/) result 301).
* [ ] http://mydomain1.com with 37 occurrences migrated to:
  https://mydomain1.com ([https](https://mydomain1.com) result 301).
* [ ] http://mydomain1.com/ with 2 occurrences migrated to:
  https://mydomain1.com/ ([https](https://mydomain1.com/) result 301).
* [ ] http://mydomain1.com/path with 2 occurrences migrated to:
  https://mydomain1.com/path ([https](https://mydomain1.com/path) result 301).
* [ ] http://opensource.atlassian.com/projects/spring/browse/SPR-2660 with 1 occurrences migrated to:
  https://opensource.atlassian.com/projects/spring/browse/SPR-2660 ([https](https://opensource.atlassian.com/projects/spring/browse/SPR-2660) result 301).
* [ ] http://opensource.atlassian.com/projects/spring/browse/SPR-2754 with 1 occurrences migrated to:
  https://opensource.atlassian.com/projects/spring/browse/SPR-2754 ([https](https://opensource.atlassian.com/projects/spring/browse/SPR-2754) result 301).
* [ ] http://opensource.atlassian.com/projects/spring/browse/SPR-2789 with 1 occurrences migrated to:
  https://opensource.atlassian.com/projects/spring/browse/SPR-2789 ([https](https://opensource.atlassian.com/projects/spring/browse/SPR-2789) result 301).
* [ ] http://opensource.atlassian.com/projects/spring/browse/SPR-3127 with 1 occurrences migrated to:
  https://opensource.atlassian.com/projects/spring/browse/SPR-3127 ([https](https://opensource.atlassian.com/projects/spring/browse/SPR-3127) result 301).
* [ ] http://opensource.atlassian.com/projects/spring/browse/SPR-3775 with 1 occurrences migrated to:
  https://opensource.atlassian.com/projects/spring/browse/SPR-3775 ([https](https://opensource.atlassian.com/projects/spring/browse/SPR-3775) result 301).
* [ ] http://opensource.atlassian.com/projects/spring/browse/SPR-3880 with 1 occurrences migrated to:
  https://opensource.atlassian.com/projects/spring/browse/SPR-3880 ([https](https://opensource.atlassian.com/projects/spring/browse/SPR-3880) result 301).
* [ ] http://opensource.atlassian.com/projects/spring/browse/SPR-3896 with 7 occurrences migrated to:
  https://opensource.atlassian.com/projects/spring/browse/SPR-3896 ([https](https://opensource.atlassian.com/projects/spring/browse/SPR-3896) result 301).
* [ ] http://opensource.atlassian.com/projects/spring/browse/SPR-3949 with 1 occurrences migrated to:
  https://opensource.atlassian.com/projects/spring/browse/SPR-3949 ([https](https://opensource.atlassian.com/projects/spring/browse/SPR-3949) result 301).
* [ ] http://opensource.atlassian.com/projects/spring/browse/SPR-4008 with 2 occurrences migrated to:
  https://opensource.atlassian.com/projects/spring/browse/SPR-4008 ([https](https://opensource.atlassian.com/projects/spring/browse/SPR-4008) result 301).
* [ ] http://opensource.atlassian.com/projects/spring/browse/SPR-4040 with 2 occurrences migrated to:
  https://opensource.atlassian.com/projects/spring/browse/SPR-4040 ([https](https://opensource.atlassian.com/projects/spring/browse/SPR-4040) result 301).
* [ ] http://publib.boulder.ibm.com/infocenter/wasinfo/v5r1//topic/com.ibm.websphere.base.doc/info/aes/ae/rdat_extiapi.html with 1 occurrences migrated to:
  https://publib.boulder.ibm.com/infocenter/wasinfo/v5r1//topic/com.ibm.websphere.base.doc/info/aes/ae/rdat_extiapi.html ([https](https://publib.boulder.ibm.com/infocenter/wasinfo/v5r1//topic/com.ibm.websphere.base.doc/info/aes/ae/rdat_extiapi.html) result 301).
* [ ] http://publib.boulder.ibm.com/infocenter/wasinfo/v6r0/topic/com.ibm.websphere.javadoc.doc/public_html/api/com/ibm/websphere/rsadapter/JDBCConnectionSpec.html with 1 occurrences migrated to:
  https://publib.boulder.ibm.com/infocenter/wasinfo/v6r0/topic/com.ibm.websphere.javadoc.doc/public_html/api/com/ibm/websphere/rsadapter/JDBCConnectionSpec.html ([https](https://publib.boulder.ibm.com/infocenter/wasinfo/v6r0/topic/com.ibm.websphere.javadoc.doc/public_html/api/com/ibm/websphere/rsadapter/JDBCConnectionSpec.html) result 301).
* [ ] http://site2.com with 3 occurrences migrated to:
  https://site2.com ([https](https://site2.com) result 301).
* [ ] http://slack.kotlinlang.org/ with 2 occurrences migrated to:
  https://slack.kotlinlang.org/ ([https](https://slack.kotlinlang.org/) result 301).
* [ ] http://sourceforge.net/projects/c3p0 with 2 occurrences migrated to:
  https://sourceforge.net/projects/c3p0 ([https](https://sourceforge.net/projects/c3p0) result 301).
* [ ] http://sourceforge.net/projects/javadiff with 1 occurrences migrated to:
  https://sourceforge.net/projects/javadiff ([https](https://sourceforge.net/projects/javadiff) result 301).
* [ ] http://springframework.org with 2 occurrences migrated to:
  https://springframework.org ([https](https://springframework.org) result 301).
* [ ] http://www-01.ibm.com/software/webservers/appserv/was/ with 1 occurrences migrated to:
  https://www-01.ibm.com/software/webservers/appserv/was/ ([https](https://www-01.ibm.com/software/webservers/appserv/was/) result 301).
* [ ] http://www.atomenabled.org/developers/syndication/ with 1 occurrences migrated to:
  https://www.atomenabled.org/developers/syndication/ ([https](https://www.atomenabled.org/developers/syndication/) result 301).
* [ ] http://www.eclipse.org/aspectj with 2 occurrences migrated to:
  https://www.eclipse.org/aspectj ([https](https://www.eclipse.org/aspectj) result 301).
* [ ] http://www.google.com/ig/calculator?q=1USD=?EUR with 1 occurrences migrated to:
  https://www.google.com/ig/calculator?q=1USD=?EUR ([https](https://www.google.com/ig/calculator?q=1USD=?EUR) result 301).
* [ ] http://www.javaworld.com/javaworld/jw-01-2009/jw-01-spring-transactions.html with 1 occurrences migrated to:
  https://www.javaworld.com/javaworld/jw-01-2009/jw-01-spring-transactions.html ([https](https://www.javaworld.com/javaworld/jw-01-2009/jw-01-spring-transactions.html) result 301).
* [ ] http://www.jboss.org/jbossas/ with 1 occurrences migrated to:
  https://www.jboss.org/jbossas/ ([https](https://www.jboss.org/jbossas/) result 301).
* [ ] http://www.junit.org/ with 1 occurrences migrated to:
  https://www.junit.org/ ([https](https://www.junit.org/) result 301).
* [ ] http://www.mnot.net/cache_docs with 1 occurrences migrated to:
  https://www.mnot.net/cache_docs ([https](https://www.mnot.net/cache_docs) result 301).
* [ ] http://www.sf.net/home.view?siteLanguage=nl with 1 occurrences migrated to:
  https://www.sf.net/home.view?siteLanguage=nl ([https](https://www.sf.net/home.view?siteLanguage=nl) result 301).
* [ ] http://www.springframework.org with 7 occurrences migrated to:
  https://www.springframework.org ([https](https://www.springframework.org) result 301).
* [ ] http://www.springframework.org/ with 3 occurrences migrated to:
  https://www.springframework.org/ ([https](https://www.springframework.org/) result 301).
* [ ] http://xyz.com/path with 2 occurrences migrated to:
  https://xyz.com/path ([https](https://xyz.com/path) result 301).
* [ ] http://commons.apache.org/codec/ with 1 occurrences migrated to:
  https://commons.apache.org/codec/ ([https](https://commons.apache.org/codec/) result 302).
* [ ] http://commons.apache.org/logging with 2 occurrences migrated to:
  https://commons.apache.org/logging ([https](https://commons.apache.org/logging) result 302).
* [ ] http://download.oracle.com/javaee/6/api/javax/inject/Scope.html with 1 occurrences migrated to:
  https://download.oracle.com/javaee/6/api/javax/inject/Scope.html ([https](https://download.oracle.com/javaee/6/api/javax/inject/Scope.html) result 302).
* [ ] http://download.oracle.com/javase/1.5.0/docs/api/java/lang/System.html with 4 occurrences migrated to:
  https://download.oracle.com/javase/1.5.0/docs/api/java/lang/System.html ([https](https://download.oracle.com/javase/1.5.0/docs/api/java/lang/System.html) result 302).
* [ ] http://download.oracle.com/javase/6/docs/technotes/guides/jar/jar.html with 1 occurrences migrated to:
  https://download.oracle.com/javase/6/docs/technotes/guides/jar/jar.html ([https](https://download.oracle.com/javase/6/docs/technotes/guides/jar/jar.html) result 302).
* [ ] http://download.oracle.com/javase/8/docs/api/java/beans/ConstructorProperties.html with 1 occurrences migrated to:
  https://download.oracle.com/javase/8/docs/api/java/beans/ConstructorProperties.html ([https](https://download.oracle.com/javase/8/docs/api/java/beans/ConstructorProperties.html) result 302).
* [ ] http://download.oracle.com/javase/jndi/tutorial/beyond/misc/policy.html with 1 occurrences migrated to:
  https://download.oracle.com/javase/jndi/tutorial/beyond/misc/policy.html ([https](https://download.oracle.com/javase/jndi/tutorial/beyond/misc/policy.html) result 302).
* [ ] http://gafter.blogspot.nl/2006/12/super-type-tokens.html with 1 occurrences migrated to:
  https://gafter.blogspot.nl/2006/12/super-type-tokens.html ([https](https://gafter.blogspot.nl/2006/12/super-type-tokens.html) result 302).
* [ ] http://git-scm.com/book/en/Distributed-Git-Contributing-to-a-Project with 1 occurrences migrated to:
  https://git-scm.com/book/en/Distributed-Git-Contributing-to-a-Project ([https](https://git-scm.com/book/en/Distributed-Git-Contributing-to-a-Project) result 302).
* [ ] http://git-scm.com/book/en/Git-Tools-Rewriting-History with 1 occurrences migrated to:
  https://git-scm.com/book/en/Git-Tools-Rewriting-History ([https](https://git-scm.com/book/en/Git-Tools-Rewriting-History) result 302).
* [ ] http://glassfish.dev.java.net/ with 1 occurrences migrated to:
  https://glassfish.dev.java.net/ ([https](https://glassfish.dev.java.net/) result 302).
* [ ] http://java.sun.com/docs/books/jls/third_edition/html/conversions.html with 1 occurrences migrated to:
  https://java.sun.com/docs/books/jls/third_edition/html/conversions.html ([https](https://java.sun.com/docs/books/jls/third_edition/html/conversions.html) result 302).
* [ ] http://java.sun.com/docs/books/jls/third_edition/html/expressions.html with 1 occurrences migrated to:
  https://java.sun.com/docs/books/jls/third_edition/html/expressions.html ([https](https://java.sun.com/docs/books/jls/third_edition/html/expressions.html) result 302).
* [ ] http://java.sun.com/j2se/ with 2 occurrences migrated to:
  https://java.sun.com/j2se/ ([https](https://java.sun.com/j2se/) result 302).
* [ ] http://java.sun.com/j2se/1.4.1/docs/tooldocs/solaris/javadoc.html with 1 occurrences migrated to:
  https://java.sun.com/j2se/1.4.1/docs/tooldocs/solaris/javadoc.html ([https](https://java.sun.com/j2se/1.4.1/docs/tooldocs/solaris/javadoc.html) result 302).
* [ ] http://java.sun.com/j2se/1.4.2/docs/api/java/text/SimpleDateFormat.html with 1 occurrences migrated to:
  https://java.sun.com/j2se/1.4.2/docs/api/java/text/SimpleDateFormat.html ([https](https://java.sun.com/j2se/1.4.2/docs/api/java/text/SimpleDateFormat.html) result 302).
* [ ] http://java.sun.com/j2se/javadoc with 1 occurrences migrated to:
  https://java.sun.com/j2se/javadoc ([https](https://java.sun.com/j2se/javadoc) result 302).
* [ ] http://java.sun.com/j2se/javadoc/ with 1 occurrences migrated to:
  https://java.sun.com/j2se/javadoc/ ([https](https://java.sun.com/j2se/javadoc/) result 302).
* [ ] http://java.sun.com/j2se/javadoc/faq.html with 1 occurrences migrated to:
  https://java.sun.com/j2se/javadoc/faq.html ([https](https://java.sun.com/j2se/javadoc/faq.html) result 302).
* [ ] http://java.sun.com/webservices/jaxb/ with 1 occurrences migrated to:
  https://java.sun.com/webservices/jaxb/ ([https](https://java.sun.com/webservices/jaxb/) result 302).
* [ ] http://java.sun.com/xml/jaxp/properties/schemaLanguage with 1 occurrences migrated to:
  https://java.sun.com/xml/jaxp/properties/schemaLanguage ([https](https://java.sun.com/xml/jaxp/properties/schemaLanguage) result 302).
* [ ] http://java.sun.com/xml/ns/j2ee/connector_1_5.xsd with 1 occurrences migrated to:
  https://java.sun.com/xml/ns/j2ee/connector_1_5.xsd ([https](https://java.sun.com/xml/ns/j2ee/connector_1_5.xsd) result 302).
* [ ] http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd with 2 occurrences migrated to:
  https://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd ([https](https://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd) result 302).
* [ ] http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd with 2 occurrences migrated to:
  https://java.sun.com/xml/ns/javaee/web-app_3_0.xsd ([https](https://java.sun.com/xml/ns/javaee/web-app_3_0.xsd) result 302).
* [ ] http://java.sun.com/xml/stream/properties/report-cdata-event with 1 occurrences migrated to:
  https://java.sun.com/xml/stream/properties/report-cdata-event ([https](https://java.sun.com/xml/stream/properties/report-cdata-event) result 302).
* [ ] http://sourceforge.net/projects/cglib/files/cglib3/3.0/cglib-3.0.jar/download with 1 occurrences migrated to:
  https://sourceforge.net/projects/cglib/files/cglib3/3.0/cglib-3.0.jar/download ([https](https://sourceforge.net/projects/cglib/files/cglib3/3.0/cglib-3.0.jar/download) result 302).
* [ ] http://other.info/foo/bar (301) with 1 occurrences migrated to:
  https://weibo.com/otherinfo/foo/bar ([https](https://other.info/foo/bar) result 302).
* [ ] http://www.iana.org/assignments/http-status-codes with 1 occurrences migrated to:
  https://www.iana.org/assignments/http-status-codes ([https](https://www.iana.org/assignments/http-status-codes) result 302).
* [ ] http://www.iana.org/assignments/media-types/ with 1 occurrences migrated to:
  https://www.iana.org/assignments/media-types/ ([https](https://www.iana.org/assignments/media-types/) result 302).
* [ ] http://www.springsource.org/download with 1 occurrences migrated to:
  https://www.springsource.org/download ([https](https://www.springsource.org/download) result 302).
* [ ] http://www.sys-con.com/java with 1 occurrences migrated to:
  https://www.sys-con.com/java ([https](https://www.sys-con.com/java) result 302).

These URLs were intentionally ignored.

* http://java.sun.com/jsp/jstl/core with 1 occurrences
* http://java.sun.com/xml/ns/j2ee with 6 occurrences
* http://java.sun.com/xml/ns/javaee with 4 occurrences
* http://java.sun.com/xml/ns/persistence with 1 occurrences
* http://localhost with 86 occurrences
* http://localhost/ with 16 occurrences
* http://localhost/42 with 1 occurrences
* http://localhost/?cookie=foo with 1 occurrences
* http://localhost/FILE.TXT with 1 occurrences
* http://localhost/abc with 1 occurrences
* http://localhost/abc/def with 1 occurrences
* http://localhost/app%20/path/ with 1 occurrences
* http://localhost/app/path%20with%20spaces/ with 1 occurrences
* http://localhost/bar with 2 occurrences
* http://localhost/context/a with 3 occurrences
* http://localhost/contextPath/main/path with 2 occurrences
* http://localhost/file.foo with 1 occurrences
* http://localhost/file.txt with 1 occurrences
* http://localhost/foo with 2 occurrences
* http://localhost/foo%20bar with 1 occurrences
* http://localhost/foo/bar with 1 occurrences
* http://localhost/foo/bar/baz with 1 occurrences
* http://localhost/forward with 1 occurrences
* http://localhost/hotels/42/bookings/21 with 4 occurrences
* http://localhost/input with 1 occurrences
* http://localhost/jquery-1.11.0.min.js with 5 occurrences
* http://localhost/messages/form with 1 occurrences
* http://localhost/mvc-showcase with 2 occurrences
* http://localhost/mvc-showcase/app with 1 occurrences
* http://localhost/mvc-showcase/data/foo%20bar with 1 occurrences
* http://localhost/mvc-showcase/data/param with 1 occurrences
* http://localhost/mvc-showcase/data/param?foo=123 with 2 occurrences
* http://localhost/myapp/main with 1 occurrences
* http://localhost/myapp/people/1/addresses/DE with 1 occurrences
* http://localhost/path with 3 occurrences
* http://localhost/path;a=b/with/semicolon with 1 occurrences
* http://localhost/persons with 1 occurrences
* http://localhost/prefix with 1 occurrences
* http://localhost/prefix/app with 1 occurrences
* http://localhost/prefix/bar with 1 occurrences
* http://localhost/prefix/mvc-showcase with 3 occurrences
* http://localhost/query= with 1 occurrences
* http://localhost/query=foo@bar with 1 occurrences
* http://localhost/resources/child/response.txt with 1 occurrences
* http://localhost/resources/foo with 2 occurrences
* http://localhost/resources/foo.txt with 1 occurrences
* http://localhost/resources/response.txt with 2 occurrences
* http://localhost/rest/books/6/pages/1.json with 1 occurrences
* http://localhost/something/1/foo with 1 occurrences
* http://localhost/something/optional-param with 1 occurrences
* http://localhost/test with 4 occurrences
* http://localhost/test.html with 1 occurrences
* http://localhost/test/this with 2 occurrences
* http://localhost:7070/example/adminhandle.vm with 1 occurrences
* http://localhost:7070/example/bingo.html with 1 occurrences
* http://localhost:80/jquery-1.11.0.min.js with 1 occurrences
* http://localhost:8080 with 34 occurrences
* http://localhost:8080/ with 4 occurrences
* http://localhost:8080/OrderService with 3 occurrences
* http://localhost:8080/aA/bB/cC with 1 occurrences
* http://localhost:8080/context with 1 occurrences
* http://localhost:8080/context/myapiresource with 1 occurrences
* http://localhost:8080/gamecast/admin/index.html with 1 occurrences
* http://localhost:8080/gamecast/display.html with 1 occurrences
* http://localhost:8080/gamecast/displayShoppingCart.html with 1 occurrences
* http://localhost:8080/jquery-1.11.0.min.js with 1 occurrences
* http://localhost:8080/mvc-showcase with 1 occurrences
* http://localhost:8080/myapiresource with 1 occurrences
* http://localhost:8080/myapp/js/sockjs-client.js with 1 occurrences
* http://localhost:8080/path with 3 occurrences
* http://localhost:8080/people with 2 occurrences
* http://localhost:8080/portfolio with 1 occurrences
* http://localhost:8080/spring/ with 2 occurrences
* http://localhost:8080/test/ with 2 occurrences
* http://localhost:8080/test/print?value=%EA%B0%80+%EB%82%98 with 1 occurrences
* http://localhost:8081 with 1 occurrences
* http://localhost:8081/ with 1 occurrences
* http://localhost:8181 with 1 occurrences
* http://localhost:8888/AccountServiceEndpoint?WSDL with 1 occurrences
* http://localhost:9000 with 7 occurrences
* http://localhost:9090 with 18 occurrences
* http://localhost:9090/jquery-1.11.0.min.js with 2 occurrences
* http://localhost:9990/mail/messages/form with 1 occurrences
* http://localhost:9999/ with 1 occurrences
* http://localhost:9999/OrderService?wsdl with 4 occurrences
* http://localhosta/testbean with 3 occurrences
* http://samples.springframework.org/flight with 27 occurrences
* http://springframework.org/spring-ws with 17 occurrences
* http://test.com with 1 occurrences
* http://test.com/ with 1 occurrences
* http://testng.org/ with 1 occurrences
* http://tiles.apache.org/tags-tiles with 1 occurrences
* http://www.foo.com/schema/component with 6 occurrences
* http://www.mycompany.com/schema/myns with 4 occurrences
* http://www.springframework.org/schema/aop with 30 occurrences
* http://www.springframework.org/schema/beans with 169 occurrences
* http://www.springframework.org/schema/beans/test with 2 occurrences
* http://www.springframework.org/schema/c with 1 occurrences
* http://www.springframework.org/schema/cache with 5 occurrences
* http://www.springframework.org/schema/context with 28 occurrences
* http://www.springframework.org/schema/jdbc with 8 occurrences
* http://www.springframework.org/schema/jee with 9 occurrences
* http://www.springframework.org/schema/jms with 5 occurrences
* http://www.springframework.org/schema/lang with 10 occurrences
* http://www.springframework.org/schema/mvc with 8 occurrences
* http://www.springframework.org/schema/oxm with 4 occurrences
* http://www.springframework.org/schema/p with 4 occurrences
* http://www.springframework.org/schema/task with 2 occurrences
* http://www.springframework.org/schema/tool with 27 occurrences
* http://www.springframework.org/schema/tx with 18 occurrences
* http://www.springframework.org/schema/util with 8 occurrences
* http://www.springframework.org/schema/websocket with 26 occurrences
* http://www.springframework.org/spring-ws with 1 occurrences
* http://www.springframework.org/tags with 4 occurrences
* http://www.springframework.org/tags/form with 2 occurrences
* http://www.w3.org/1999/XSL/Transform with 8 occurrences
* http://www.w3.org/2001/XMLSchema with 24 occurrences
* http://www.w3.org/2001/XMLSchema-instance with 79 occurrences
* http://www.w3.org/2005/Atom with 4 occurrences
* http://www.w3.org/TR/html4/charset.html with 5 occurrences
* http://www.w3.org/TR/html4/sgml/entities.html with 14 occurrences
2019-03-21 15:08:55 -05:00
Rob Winch c8732d0258 Polish URL Cleanup
Closes gh-22617
2019-03-21 15:07:40 -05:00
Spring Operator 6a0ef1aa64 URL Cleanup
This commit updates URLs to prefer the https protocol. Redirects are not followed to avoid accidentally expanding intentionally shortened URLs (i.e. if using a URL shortener).

# HTTP URLs that Could Not Be Fixed
These URLs were unable to be fixed. Please review them to see if they can be manually resolved.

* http://www.foo.com/schema/component/component.xsd (404) with 1 occurrences could not be migrated:
   ([https](https://www.foo.com/schema/component/component.xsd) result SSLHandshakeException).

# Fixed URLs

## Fixed But Review Recommended
These URLs were fixed, but the https status was not OK. However, the https status was the same as the http request or http redirected to an https URL, so they were migrated. Your review is recommended.

* http://www.kbcafe.com/rss/atom.xsd.xml (ConnectTimeoutException) with 1 occurrences migrated to:
  https://www.kbcafe.com/rss/atom.xsd.xml ([https](https://www.kbcafe.com/rss/atom.xsd.xml) result ConnectTimeoutException).
* http://domain1.com (UnknownHostException) with 2 occurrences migrated to:
  https://domain1.com ([https](https://domain1.com) result UnknownHostException).
* http://domain2.com (UnknownHostException) with 1 occurrences migrated to:
  https://domain2.com ([https](https://domain2.com) result UnknownHostException).
* http://mydomain1.com,http://mydomain2.com (UnknownHostException) with 1 occurrences migrated to:
  https://mydomain1.com,http://mydomain2.com ([https](https://mydomain1.com,https://mydomain2.com) result UnknownHostException).
* http://mydomain2.com (UnknownHostException) with 2 occurrences migrated to:
  https://mydomain2.com ([https](https://mydomain2.com) result UnknownHostException).
* http://mydomain3.com,http://mydomain4.com (UnknownHostException) with 1 occurrences migrated to:
  https://mydomain3.com,http://mydomain4.com ([https](https://mydomain3.com,https://mydomain4.com) result UnknownHostException).
* http://www.springframework.org/schema/beans/factory/xml/support/CustomNamespaceHandlerTests.xsd (404) with 1 occurrences migrated to:
  https://www.springframework.org/schema/beans/factory/xml/support/CustomNamespaceHandlerTests.xsd ([https](https://www.springframework.org/schema/beans/factory/xml/support/CustomNamespaceHandlerTests.xsd) result 404).

## Fixed Success
These URLs were switched to an https URL with a 2xx status. While the status was successful, your review is still recommended.

* http://example.com with 1 occurrences migrated to:
  https://example.com ([https](https://example.com) result 200).
* http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd (301) with 2 occurrences migrated to:
  https://hibernate.org/dtd/hibernate-mapping-3.0.dtd ([https](https://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd) result 200).
* http://testng.org/testng-1.0.dtd with 3 occurrences migrated to:
  https://testng.org/testng-1.0.dtd ([https](https://testng.org/testng-1.0.dtd) result 200).
* http://tiles.apache.org/dtds/tiles-config_2_0.dtd with 2 occurrences migrated to:
  https://tiles.apache.org/dtds/tiles-config_2_0.dtd ([https](https://tiles.apache.org/dtds/tiles-config_2_0.dtd) result 200).
* http://tiles.apache.org/dtds/tiles-config_2_1.dtd with 2 occurrences migrated to:
  https://tiles.apache.org/dtds/tiles-config_2_1.dtd ([https](https://tiles.apache.org/dtds/tiles-config_2_1.dtd) result 200).
* http://tiles.apache.org/dtds/tiles-config_3_0.dtd with 4 occurrences migrated to:
  https://tiles.apache.org/dtds/tiles-config_3_0.dtd ([https](https://tiles.apache.org/dtds/tiles-config_3_0.dtd) result 200).
* http://www.quartz-scheduler.org/xml/job_scheduling_data_1_8.xsd with 1 occurrences migrated to:
  https://www.quartz-scheduler.org/xml/job_scheduling_data_1_8.xsd ([https](https://www.quartz-scheduler.org/xml/job_scheduling_data_1_8.xsd) result 200).
* http://www.springframework.org/dtd/spring-beans-2.0.dtd with 168 occurrences migrated to:
  https://www.springframework.org/dtd/spring-beans-2.0.dtd ([https](https://www.springframework.org/dtd/spring-beans-2.0.dtd) result 200).
* http://www.springframework.org/schema/aop/spring-aop-2.0.xsd with 68 occurrences migrated to:
  https://www.springframework.org/schema/aop/spring-aop-2.0.xsd ([https](https://www.springframework.org/schema/aop/spring-aop-2.0.xsd) result 200).
* http://www.springframework.org/schema/aop/spring-aop-2.5.xsd with 11 occurrences migrated to:
  https://www.springframework.org/schema/aop/spring-aop-2.5.xsd ([https](https://www.springframework.org/schema/aop/spring-aop-2.5.xsd) result 200).
* http://www.springframework.org/schema/aop/spring-aop-3.0.xsd with 2 occurrences migrated to:
  https://www.springframework.org/schema/aop/spring-aop-3.0.xsd ([https](https://www.springframework.org/schema/aop/spring-aop-3.0.xsd) result 200).
* http://www.springframework.org/schema/aop/spring-aop.xsd with 7 occurrences migrated to:
  https://www.springframework.org/schema/aop/spring-aop.xsd ([https](https://www.springframework.org/schema/aop/spring-aop.xsd) result 200).
* http://www.springframework.org/schema/beans/spring-beans-2.0.xsd with 112 occurrences migrated to:
  https://www.springframework.org/schema/beans/spring-beans-2.0.xsd ([https](https://www.springframework.org/schema/beans/spring-beans-2.0.xsd) result 200).
* http://www.springframework.org/schema/beans/spring-beans-2.5.xsd with 46 occurrences migrated to:
  https://www.springframework.org/schema/beans/spring-beans-2.5.xsd ([https](https://www.springframework.org/schema/beans/spring-beans-2.5.xsd) result 200).
* http://www.springframework.org/schema/beans/spring-beans-3.0.xsd with 10 occurrences migrated to:
  https://www.springframework.org/schema/beans/spring-beans-3.0.xsd ([https](https://www.springframework.org/schema/beans/spring-beans-3.0.xsd) result 200).
* http://www.springframework.org/schema/beans/spring-beans-3.1.xsd with 33 occurrences migrated to:
  https://www.springframework.org/schema/beans/spring-beans-3.1.xsd ([https](https://www.springframework.org/schema/beans/spring-beans-3.1.xsd) result 200).
* http://www.springframework.org/schema/beans/spring-beans-3.2.xsd with 1 occurrences migrated to:
  https://www.springframework.org/schema/beans/spring-beans-3.2.xsd ([https](https://www.springframework.org/schema/beans/spring-beans-3.2.xsd) result 200).
* http://www.springframework.org/schema/beans/spring-beans-4.0.xsd with 1 occurrences migrated to:
  https://www.springframework.org/schema/beans/spring-beans-4.0.xsd ([https](https://www.springframework.org/schema/beans/spring-beans-4.0.xsd) result 200).
* http://www.springframework.org/schema/beans/spring-beans-4.1.xsd with 3 occurrences migrated to:
  https://www.springframework.org/schema/beans/spring-beans-4.1.xsd ([https](https://www.springframework.org/schema/beans/spring-beans-4.1.xsd) result 200).
* http://www.springframework.org/schema/beans/spring-beans-4.2.xsd with 4 occurrences migrated to:
  https://www.springframework.org/schema/beans/spring-beans-4.2.xsd ([https](https://www.springframework.org/schema/beans/spring-beans-4.2.xsd) result 200).
* http://www.springframework.org/schema/beans/spring-beans-4.3.xsd with 4 occurrences migrated to:
  https://www.springframework.org/schema/beans/spring-beans-4.3.xsd ([https](https://www.springframework.org/schema/beans/spring-beans-4.3.xsd) result 200).
* http://www.springframework.org/schema/beans/spring-beans.xsd with 142 occurrences migrated to:
  https://www.springframework.org/schema/beans/spring-beans.xsd ([https](https://www.springframework.org/schema/beans/spring-beans.xsd) result 200).
* http://www.springframework.org/schema/cache/spring-cache.xsd with 10 occurrences migrated to:
  https://www.springframework.org/schema/cache/spring-cache.xsd ([https](https://www.springframework.org/schema/cache/spring-cache.xsd) result 200).
* http://www.springframework.org/schema/context/spring-context-2.5.xsd with 41 occurrences migrated to:
  https://www.springframework.org/schema/context/spring-context-2.5.xsd ([https](https://www.springframework.org/schema/context/spring-context-2.5.xsd) result 200).
* http://www.springframework.org/schema/context/spring-context-3.0.xsd with 2 occurrences migrated to:
  https://www.springframework.org/schema/context/spring-context-3.0.xsd ([https](https://www.springframework.org/schema/context/spring-context-3.0.xsd) result 200).
* http://www.springframework.org/schema/context/spring-context-3.1.xsd with 1 occurrences migrated to:
  https://www.springframework.org/schema/context/spring-context-3.1.xsd ([https](https://www.springframework.org/schema/context/spring-context-3.1.xsd) result 200).
* http://www.springframework.org/schema/context/spring-context-3.2.xsd with 1 occurrences migrated to:
  https://www.springframework.org/schema/context/spring-context-3.2.xsd ([https](https://www.springframework.org/schema/context/spring-context-3.2.xsd) result 200).
* http://www.springframework.org/schema/context/spring-context-4.0.xsd with 1 occurrences migrated to:
  https://www.springframework.org/schema/context/spring-context-4.0.xsd ([https](https://www.springframework.org/schema/context/spring-context-4.0.xsd) result 200).
* http://www.springframework.org/schema/context/spring-context-4.2.xsd with 4 occurrences migrated to:
  https://www.springframework.org/schema/context/spring-context-4.2.xsd ([https](https://www.springframework.org/schema/context/spring-context-4.2.xsd) result 200).
* http://www.springframework.org/schema/context/spring-context-4.3.xsd with 2 occurrences migrated to:
  https://www.springframework.org/schema/context/spring-context-4.3.xsd ([https](https://www.springframework.org/schema/context/spring-context-4.3.xsd) result 200).
* http://www.springframework.org/schema/context/spring-context.xsd with 10 occurrences migrated to:
  https://www.springframework.org/schema/context/spring-context.xsd ([https](https://www.springframework.org/schema/context/spring-context.xsd) result 200).
* http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd with 9 occurrences migrated to:
  https://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd ([https](https://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd) result 200).
* http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd with 5 occurrences migrated to:
  https://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd ([https](https://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd) result 200).
* http://www.springframework.org/schema/jdbc/spring-jdbc-4.2.xsd with 9 occurrences migrated to:
  https://www.springframework.org/schema/jdbc/spring-jdbc-4.2.xsd ([https](https://www.springframework.org/schema/jdbc/spring-jdbc-4.2.xsd) result 200).
* http://www.springframework.org/schema/jdbc/spring-jdbc-4.3.xsd with 2 occurrences migrated to:
  https://www.springframework.org/schema/jdbc/spring-jdbc-4.3.xsd ([https](https://www.springframework.org/schema/jdbc/spring-jdbc-4.3.xsd) result 200).
* http://www.springframework.org/schema/jdbc/spring-jdbc.xsd with 8 occurrences migrated to:
  https://www.springframework.org/schema/jdbc/spring-jdbc.xsd ([https](https://www.springframework.org/schema/jdbc/spring-jdbc.xsd) result 200).
* http://www.springframework.org/schema/jee/spring-jee-3.1.xsd with 1 occurrences migrated to:
  https://www.springframework.org/schema/jee/spring-jee-3.1.xsd ([https](https://www.springframework.org/schema/jee/spring-jee-3.1.xsd) result 200).
* http://www.springframework.org/schema/jms/spring-jms-4.1.xsd with 9 occurrences migrated to:
  https://www.springframework.org/schema/jms/spring-jms-4.1.xsd ([https](https://www.springframework.org/schema/jms/spring-jms-4.1.xsd) result 200).
* http://www.springframework.org/schema/jms/spring-jms-4.2.xsd with 1 occurrences migrated to:
  https://www.springframework.org/schema/jms/spring-jms-4.2.xsd ([https](https://www.springframework.org/schema/jms/spring-jms-4.2.xsd) result 200).
* http://www.springframework.org/schema/lang/spring-lang-2.0.xsd with 1 occurrences migrated to:
  https://www.springframework.org/schema/lang/spring-lang-2.0.xsd ([https](https://www.springframework.org/schema/lang/spring-lang-2.0.xsd) result 200).
* http://www.springframework.org/schema/lang/spring-lang-2.5.xsd with 3 occurrences migrated to:
  https://www.springframework.org/schema/lang/spring-lang-2.5.xsd ([https](https://www.springframework.org/schema/lang/spring-lang-2.5.xsd) result 200).
* http://www.springframework.org/schema/lang/spring-lang-3.0.xsd with 1 occurrences migrated to:
  https://www.springframework.org/schema/lang/spring-lang-3.0.xsd ([https](https://www.springframework.org/schema/lang/spring-lang-3.0.xsd) result 200).
* http://www.springframework.org/schema/lang/spring-lang-3.1.xsd with 5 occurrences migrated to:
  https://www.springframework.org/schema/lang/spring-lang-3.1.xsd ([https](https://www.springframework.org/schema/lang/spring-lang-3.1.xsd) result 200).
* http://www.springframework.org/schema/lang/spring-lang-4.2.xsd with 2 occurrences migrated to:
  https://www.springframework.org/schema/lang/spring-lang-4.2.xsd ([https](https://www.springframework.org/schema/lang/spring-lang-4.2.xsd) result 200).
* http://www.springframework.org/schema/lang/spring-lang.xsd with 1 occurrences migrated to:
  https://www.springframework.org/schema/lang/spring-lang.xsd ([https](https://www.springframework.org/schema/lang/spring-lang.xsd) result 200).
* http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd with 1 occurrences migrated to:
  https://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd ([https](https://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd) result 200).
* http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd with 2 occurrences migrated to:
  https://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd ([https](https://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd) result 200).
* http://www.springframework.org/schema/mvc/spring-mvc.xsd with 26 occurrences migrated to:
  https://www.springframework.org/schema/mvc/spring-mvc.xsd ([https](https://www.springframework.org/schema/mvc/spring-mvc.xsd) result 200).
* http://www.springframework.org/schema/oxm/spring-oxm.xsd with 1 occurrences migrated to:
  https://www.springframework.org/schema/oxm/spring-oxm.xsd ([https](https://www.springframework.org/schema/oxm/spring-oxm.xsd) result 200).
* http://www.springframework.org/schema/task/spring-task-4.1.xsd with 1 occurrences migrated to:
  https://www.springframework.org/schema/task/spring-task-4.1.xsd ([https](https://www.springframework.org/schema/task/spring-task-4.1.xsd) result 200).
* http://www.springframework.org/schema/task/spring-task.xsd with 6 occurrences migrated to:
  https://www.springframework.org/schema/task/spring-task.xsd ([https](https://www.springframework.org/schema/task/spring-task.xsd) result 200).
* http://www.springframework.org/schema/tx/spring-tx-2.5.xsd with 3 occurrences migrated to:
  https://www.springframework.org/schema/tx/spring-tx-2.5.xsd ([https](https://www.springframework.org/schema/tx/spring-tx-2.5.xsd) result 200).
* http://www.springframework.org/schema/tx/spring-tx-4.0.xsd with 1 occurrences migrated to:
  https://www.springframework.org/schema/tx/spring-tx-4.0.xsd ([https](https://www.springframework.org/schema/tx/spring-tx-4.0.xsd) result 200).
* http://www.springframework.org/schema/tx/spring-tx.xsd with 2 occurrences migrated to:
  https://www.springframework.org/schema/tx/spring-tx.xsd ([https](https://www.springframework.org/schema/tx/spring-tx.xsd) result 200).
* http://www.springframework.org/schema/util/spring-util-2.0.xsd with 2 occurrences migrated to:
  https://www.springframework.org/schema/util/spring-util-2.0.xsd ([https](https://www.springframework.org/schema/util/spring-util-2.0.xsd) result 200).
* http://www.springframework.org/schema/util/spring-util-2.5.xsd with 2 occurrences migrated to:
  https://www.springframework.org/schema/util/spring-util-2.5.xsd ([https](https://www.springframework.org/schema/util/spring-util-2.5.xsd) result 200).
* http://www.springframework.org/schema/util/spring-util-3.0.xsd with 1 occurrences migrated to:
  https://www.springframework.org/schema/util/spring-util-3.0.xsd ([https](https://www.springframework.org/schema/util/spring-util-3.0.xsd) result 200).
* http://www.springframework.org/schema/util/spring-util-3.1.xsd with 2 occurrences migrated to:
  https://www.springframework.org/schema/util/spring-util-3.1.xsd ([https](https://www.springframework.org/schema/util/spring-util-3.1.xsd) result 200).
* http://www.springframework.org/schema/util/spring-util-4.1.xsd with 1 occurrences migrated to:
  https://www.springframework.org/schema/util/spring-util-4.1.xsd ([https](https://www.springframework.org/schema/util/spring-util-4.1.xsd) result 200).
* http://www.springframework.org/schema/util/spring-util-4.2.xsd with 4 occurrences migrated to:
  https://www.springframework.org/schema/util/spring-util-4.2.xsd ([https](https://www.springframework.org/schema/util/spring-util-4.2.xsd) result 200).
* http://www.springframework.org/schema/util/spring-util.xsd with 2 occurrences migrated to:
  https://www.springframework.org/schema/util/spring-util.xsd ([https](https://www.springframework.org/schema/util/spring-util.xsd) result 200).
* http://www.springframework.org/schema/websocket/spring-websocket.xsd with 11 occurrences migrated to:
  https://www.springframework.org/schema/websocket/spring-websocket.xsd ([https](https://www.springframework.org/schema/websocket/spring-websocket.xsd) result 200).
* http://mydomain1.com with 2 occurrences migrated to:
  https://mydomain1.com ([https](https://mydomain1.com) result 301).
* http://www.springframework.org with 1 occurrences migrated to:
  https://www.springframework.org ([https](https://www.springframework.org) result 301).
* http://help.sap.com/saphelp_hanaplatform/helpdata/en/20/a78d3275191014b41bae7c4a46d835/content.htm with 1 occurrences migrated to:
  https://help.sap.com/saphelp_hanaplatform/helpdata/en/20/a78d3275191014b41bae7c4a46d835/content.htm ([https](https://help.sap.com/saphelp_hanaplatform/helpdata/en/20/a78d3275191014b41bae7c4a46d835/content.htm) result 302).
* http://java.sun.com/dtd/properties.dtd with 4 occurrences migrated to:
  https://java.sun.com/dtd/properties.dtd ([https](https://java.sun.com/dtd/properties.dtd) result 302).
* http://java.sun.com/xml/ns/j2ee/connector_1_5.xsd with 1 occurrences migrated to:
  https://java.sun.com/xml/ns/j2ee/connector_1_5.xsd ([https](https://java.sun.com/xml/ns/j2ee/connector_1_5.xsd) result 302).
* http://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd with 1 occurrences migrated to:
  https://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd ([https](https://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd) result 302).
* http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd with 12 occurrences migrated to:
  https://java.sun.com/xml/ns/persistence/persistence_1_0.xsd ([https](https://java.sun.com/xml/ns/persistence/persistence_1_0.xsd) result 302).
* http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd with 1 occurrences migrated to:
  https://java.sun.com/xml/ns/persistence/persistence_2_0.xsd ([https](https://java.sun.com/xml/ns/persistence/persistence_2_0.xsd) result 302).

# Ignored
These URLs were intentionally ignored.

* http://java.sun.com/xml/ns/j2ee with 2 occurrences
* http://java.sun.com/xml/ns/javaee with 2 occurrences
* http://java.sun.com/xml/ns/persistence with 27 occurrences
* http://localhost:8080 with 3 occurrences
* http://samples.springframework.org/flight with 3 occurrences
* http://www.foo.com/schema/component with 2 occurrences
* http://www.greeting.com/goodbye/ with 1 occurrences
* http://www.greeting.com/hello/ with 1 occurrences
* http://www.quartz-scheduler.org/xml/JobSchedulingData with 2 occurrences
* http://www.springframework.org/schema/aop with 176 occurrences
* http://www.springframework.org/schema/beans with 715 occurrences
* http://www.springframework.org/schema/beans/test with 2 occurrences
* http://www.springframework.org/schema/c with 9 occurrences
* http://www.springframework.org/schema/cache with 20 occurrences
* http://www.springframework.org/schema/context with 126 occurrences
* http://www.springframework.org/schema/jdbc with 66 occurrences
* http://www.springframework.org/schema/jee with 2 occurrences
* http://www.springframework.org/schema/jms with 20 occurrences
* http://www.springframework.org/schema/lang with 27 occurrences
* http://www.springframework.org/schema/mvc with 58 occurrences
* http://www.springframework.org/schema/oxm with 2 occurrences
* http://www.springframework.org/schema/p with 16 occurrences
* http://www.springframework.org/schema/task with 14 occurrences
* http://www.springframework.org/schema/tx with 12 occurrences
* http://www.springframework.org/schema/util with 28 occurrences
* http://www.springframework.org/schema/websocket with 22 occurrences
* http://www.w3.org/2001/XMLSchema-instance with 375 occurrences
* http://www.w3.org/2005/Atom with 2 occurrences
2019-03-21 15:07:40 -05:00
armansimonyan13 3e4f8905a7 Fix grammar issue (#22628) 2019-03-21 19:32:10 +01:00
Sebastien Deleuze 5a0ac42b85 Merge branch '5.1.x' 2019-03-21 19:17:22 +01:00
Sebastien Deleuze 0d8fbb4c65 Merge branch '5.1.x' 2019-03-21 11:34:10 +01:00
arman simonyan b7f5d1f031 Fix grammar issues 2019-03-21 10:05:31 +01:00
Rossen Stoyanchev 4938831575 Register custom before default codecs
Closes gh-22612
2019-03-20 20:52:57 -04:00
Rossen Stoyanchev e9819b7535 Raise ISE if @RequestBody is used for form data
Closes gh-22486
2019-03-20 20:30:36 -04:00
Arjen Poutsma b67039d19a Fix checkstyle issue 2019-03-20 20:29:43 +01:00
Rossen Stoyanchev 2e7f98d7f6 Merge branch '5.1.x' 2019-03-20 14:47:02 -04:00
Rossen Stoyanchev c6a655275d Allow overriding of FormHttpMessageWriter#getMediaType
Closes gh-22588
2019-03-20 14:46:38 -04:00
Arjen Poutsma 0e9ea2c94d Fix review remarks on Servlet.fn
This commit incoporates the remarks made during the Servlet.fn review.

See gh-21490
2019-03-20 16:47:50 +01:00
Arjen Poutsma 2f682e1035 Polishing 2019-03-20 16:47:27 +01:00
Arjen Poutsma e638fef508 Add Servlet.fn integration with DispatcherServlet
This commit adds support for HandlerFunctions and RouterFunctions to
DispatcherServlet, in the form of a HandlerAdapter and HandlerMapping.

See gh-21490
2019-03-20 16:47:27 +01:00
Arjen Poutsma 85082fc10c Add Tests for Servlet.fn
This commit adds tests for Servlet.fn, the servlet-based version of
HandlerFunctions and RouterFunctions.

See gh-21490
2019-03-20 16:47:27 +01:00
Arjen Poutsma 5d2fd75cf9 Introduce Servlet.fn
This commit introduces Servlet.fn, a servlet-based version of
WebFlux.fn, i.e. HandlerFunctions and RouterFunctions.

This commit contains the web framework only, further commits provide
tests and DispatcherServlet integration.

See gh-21490
2019-03-20 16:47:27 +01:00
Sam Brannen 7d498ba681 Fix Checkstyle error and polish Javadoc for ResourceHttpMessageReader 2019-03-20 11:03:54 +01:00
Rossen Stoyanchev 4a397f108a ResourceDecoder supports filename hint
Closes gh-22267
2019-03-19 17:50:06 -04:00
Rossen Stoyanchev 5a3ff35215 Map arg resolver backs out if annotations present
Closes gh-21874
2019-03-19 16:41:26 -04:00
Rossen Stoyanchev a2fcf0a821 ReactorNettyWebSocketSession uses correct frame size
See gh-22367
2019-03-19 15:42:06 -04:00
Rossen Stoyanchev 48ec875a7f Merge branch '5.1.x' 2019-03-19 14:41:00 -04:00
Rossen Stoyanchev 581e77c0fb Merge branch '5.1.x' 2019-03-19 14:18:52 -04:00
Sam Brannen 3e2dbd03b9 Merge branch '5.1.x' 2019-03-19 19:00:12 +01:00
Sam Brannen 2bbd52c9f3 Polishing 2019-03-19 18:46:05 +01:00
Arjen Poutsma 228cae216e Merge branch '5.1.x' 2019-03-19 11:30:43 +01:00
Sam Brannen 0fc0849c0a Upgrade to JUnit Jupiter 5.4.1
Closes gh-22308
2019-03-17 23:01:44 +01:00
Sam Brannen 2b88c47477 Polish Javadoc for application event infrastructure 2019-03-17 20:21:47 +01:00
Rossen Stoyanchev e6d206b45a Extra information in WebFlux stacktraces
Use the checkpoint operator at various places in WebFlux to insert
information that Reactor then uses to enrich exceptions, via suppressed
exceptions, when error signals flow through the operator.

Closes gh-22105
2019-03-15 16:25:43 -04:00
Sebastien Deleuze 495ba2f58c Remove static import from InvocableHandlerMethod
See gh-19975
2019-03-15 19:38:14 +01:00
Sebastien Deleuze 9a81d0276e Fix checkstyle issue 2019-03-15 19:02:33 +01:00
Sebastien Deleuze 1382220021 Add support for Deferred to ReactiveAdapterRegistry
See gh-19975
2019-03-15 18:22:19 +01:00
Sebastien Deleuze 1c9cbaf399 Introduce coroutinesVersion
See gh-19975
2019-03-15 18:22:06 +01:00
Sebastien Deleuze 22cf83edba Add support for suspending handler methods in WebFlux
This commit turns Coroutines suspending methods to `Mono` which can be
handled natively by WebFlux.

See gh-19975
2019-03-15 18:21:50 +01:00
Sam Brannen 3cce85b402 Upgrade to latest Checkstyle Suppressions DTD
See https://github.com/checkstyle/checkstyle/blob/master/config/suppressions.xml
2019-03-15 16:49:41 +01:00
Sam Brannen 3967082c77 Upgrade to latest Checkstyle DTD
See http://checkstyle.sourceforge.net/config.html#Configuration_XML_Structure
2019-03-15 16:32:20 +01:00
Stephane Nicoll a46a6e843b Merge branch '5.1.x' 2019-03-15 10:51:59 +01:00
Sam Brannen fef43048b2 Polish annotation-driven event listener support 2019-03-14 23:13:41 +01:00
Juergen Hoeller 0b53dbf38f Allow usage of BeanNameGenerator in ImportBeanDefinitionRegistrars
Closes gh-22591
2019-03-14 17:35:04 +01:00
stsypanov e94af52510 Use Arrays::fill instead of hand-written loop 2019-03-14 17:24:51 +01:00
stsypanov 29f382b04e Simplify String concatenation 2019-03-14 17:24:33 +01:00
Sam Brannen 9d2e7ced89 Favor Math.[min|max]() over handcrafted code
In line with the general trend toward favoring core JDK APIs for common
tasks in Spring Framework 5.2, this commit replaces handcrafted
statements with Math.min() and Math.max() were applicable.
2019-03-14 16:48:44 +01:00
valery1707 9cf9d0fa21 Fix copy-n-paste error in Javadoc in ResponseEntityExceptionHandler
Closes gh-22589
2019-03-13 17:22:33 +01:00
Juergen Hoeller 840d80b994 Merge branch '5.1.x' 2019-03-13 16:24:01 +01:00
Sam Brannen 1e417146c9 Merge branch '5.1.x' 2019-03-13 15:28:58 +01:00
Sam Brannen f9e22a0f02 Merge branch '5.1.x' 2019-03-13 15:16:24 +01:00
Juergen Hoeller 4bee5073a0 Proper exception for non-matching argument on unique factory method
See gh-22420
2019-03-13 14:04:17 +01:00
Arjen Poutsma 88ca255c95 Fix checkstyle issue 2019-03-13 11:00:07 +01:00
Juergen Hoeller c0ddaae5c0 Shared empty InjectionMetadata/LifecycleMetadata instance
Closes gh-22570
2019-03-12 22:45:24 +01:00
Juergen Hoeller 62c923711d Consistent use of empty array constants in ReflectionUtils
Closes gh-22567
2019-03-12 22:44:15 +01:00
Juergen Hoeller a7adafdb6a Larger initial size for ASM type descriptor StringBuilder
Closes gh-22565
2019-03-12 22:44:00 +01:00
Rossen Stoyanchev 57a67a3c06 Header predicate option in AbstractRequestLoggingFilter
Closes gh-22244
2019-03-12 17:05:40 -04:00
Rossen Stoyanchev 19c024f91f Improved logging for @MessageMapping methods
Closes gh-20564
2019-03-12 16:39:26 -04:00
Rossen Stoyanchev b88aad6b39 Avoid payload conversion if unnecessary
Closes gh-22386
2019-03-12 16:17:39 -04:00
Rossen Stoyanchev baa7e2e228 Merge pull request #22367 from envious/adding-maxframebuffersize 2019-03-12 15:59:19 -04:00
Rossen Stoyanchev 2d4247b2da Polish 2019-03-12 15:58:25 -04:00
Usman 9f617be909 maxFramePayloadLength property in ReactorNettyWebSocketClient
Closes gh-22367
2019-03-12 15:41:45 -04:00
Rossen Stoyanchev 2b4cd5cf56 Fragment should be expanded last
Closes gh-22447
2019-03-12 15:10:35 -04:00
Sam Brannen 7dc522f0d6 Clean up warnings in Gradle build 2019-03-12 19:36:14 +01:00
Sam Brannen 79f416ddb8 Manual URL Cleanup
See gh-22515
2019-03-12 18:39:27 +01:00
Juergen Hoeller 40c62139ae Early resolution of unique factory methods in configuration classes
Includes consistent bean class resolution in the enhancement step as well as general reflection optimizations for user-declared methods.

Closes gh-22420
2019-03-12 17:17:24 +01:00
Сергей Цыпанов a35adc6ea6 Add missing break statements to stop looping when result is known
Closes gh-22573
2019-03-12 13:15:59 +01:00
Stephane Nicoll 96cd4411e5 Merge branch '5.1.x' 2019-03-12 09:10:49 +01:00
Juergen Hoeller e3a9826e56 Bypass method traversal for annotation introspection if possible
The isCandidateClass mechanism is consistently used for a bypass check before method traversal attempts. While by default this is only bypassing standard java types, the same mechanism can be used with index metadata which indicates non-presence of certain annotations.

See gh-22420
2019-03-12 00:12:22 +01:00
Sebastien Deleuze 6266370a7a Polishing 2019-03-11 15:34:46 +01:00
Sebastien Deleuze aabfc5f0a1 Support primitive types in BeanUtils.instantiateClass args
This commit adds support for primitive default values for
BeanUtils.instantiateClass arguments in Java in order to provide
a consistent behavior in both Java and Kotlin languages.

Closes gh-22531
2019-03-11 15:34:46 +01:00
Rossen Stoyanchev 256f8549d0 Merge branch '5.1.x' 2019-03-11 09:23:23 -04:00
Sam Brannen b09e6c8aaf Polishing 2019-03-09 16:53:09 +01:00
Tomasz Linkowski 8ddb1e7201 Fix a typo in @NonNullFields
Prior to this commit, `@NonNullFields` had a redundant `@see NonNullFields`
declaration instead of `@see NonNullApi` in its JavaDoc.

Closes gh-22553
2019-03-09 16:46:15 +01:00
Sam Brannen b109f140a7 Improve documentation for annotation filters with component scanning
Prior to this commit the documentation for annotation-based include and
exclude filters used with component scanning did not explicitly mention
the fact that annotations are considered a match if they are either
present or meta-present on candidate classes.

This commit improves the documentation in this regard.

See gh-22551
2019-03-09 16:30:30 +01:00
Juergen Hoeller c04eaf6b84 Merge branch '5.1.x' 2019-03-08 23:06:37 +01:00
Juergen Hoeller 1a8b3fba94 Configuration classes can opt into lite mode (proxyBeanMethods=false)
Closes gh-22461
2019-03-08 15:59:11 +01:00
Juergen Hoeller f5248ff13f Upgrade to ASM 7.1
Closes gh-22503
2019-03-08 09:58:16 +01:00
Juergen Hoeller a06ab6d0ad Polishing 2019-03-08 09:54:44 +01:00
Lars Grefer a98e3f0481 Migrate CacheControl to use java.time.Duration for durations 2019-03-08 09:12:19 +01:00
Sam Brannen 238286caaf Update @since tag in Eclipse code template 2019-03-07 19:25:44 +01:00
Sam Brannen 45ae47d5cb Polishing 2019-03-07 18:13:17 +01:00
Juergen Hoeller ac4c37d8e2 Merge branch '5.1.x' 2019-03-07 18:05:46 +01:00
Juergen Hoeller 17930d6c27 Consistent formatting and related polishing 2019-03-07 17:25:48 +01:00
stsypanov 60b72d721d Polish: do simple clean-up 2019-03-07 16:51:44 +01:00
stsypanov cb4d6f097c Use StringJoiner where possible to simplify String joining 2019-03-07 16:51:18 +01:00
Sam Brannen f087fd5a93 Report offending class in SpringFactoriesLoader in exception message
Prior to this commit, the exception message generated by
instantiateFactory() in SpringFactoriesLoader did not report the
offending class in the top-level exception message. The offending class
was in fact included in the message of the nested exception, but the
top-level exception message on its own was a bit misleading.

This commit improves the diagnostics for such failures by including the
offending class and the target factory type in the top-level exception
message.

Closes gh-22453
2019-03-06 16:44:41 +01:00
Juergen Hoeller 0b8733747c Upgrade to SnakeYAML 1.24 and HtmlUnit 2.34.1 2019-03-06 16:40:06 +01:00
Juergen Hoeller 5c1776ae8f Merge branch '5.1.x' 2019-03-06 16:26:00 +01:00
Sam Brannen 7abe9c6a08 Polishing 2019-03-06 14:22:16 +01:00
Juergen Hoeller 777b4c809d Merge branch '5.1.x' 2019-03-06 14:06:06 +01:00
www fd5a7c2dcc Fix Javadoc for AbstractApplicationContext.registerBeanPostProcessors()
Closes gh-22513
2019-03-06 12:12:17 +01:00
Konrad Kamiński 9302cb2f85 Support Kotlin suspending functions in MethodParameter
Before this commit, the return type for Kotlin suspending functions
(as returned by MethodParameter#getParameterType and
MethodParameter#getGenericReturnType methods) was incorrect.

This change leverages Kotlin reflection instead of Java one
to return the correct type.

Closes gh-21058
2019-03-06 10:14:34 +01:00
Spring Operator 5938742afd URL Cleanup (#22515)
This commit updates URLs to prefer the https protocol. Redirects are not followed to avoid accidentally expanding intentionally shortened URLs (i.e. if using a URL shortener).

# Fixed URLs

## Fixed Success
These URLs were fixed successfully.

* http://docs.jboss.org/jbossas/javadoc/4.0.5/connector/ migrated to:
  https://docs.jboss.org/jbossas/javadoc/4.0.5/connector/ ([https](https://docs.jboss.org/jbossas/javadoc/4.0.5/connector/) result 200).
* http://docs.jboss.org/jbossas/javadoc/7.1.2.Final/ migrated to:
  https://docs.jboss.org/jbossas/javadoc/7.1.2.Final/ ([https](https://docs.jboss.org/jbossas/javadoc/7.1.2.Final/) result 200).
* http://docs.oracle.com/javaee/7/api/ migrated to:
  https://docs.oracle.com/javaee/7/api/ ([https](https://docs.oracle.com/javaee/7/api/) result 200).
* http://docs.oracle.com/javase/8/docs/api/ migrated to:
  https://docs.oracle.com/javase/8/docs/api/ ([https](https://docs.oracle.com/javase/8/docs/api/) result 200).
* http://fasterxml.github.io/jackson-core/javadoc/2.9/ migrated to:
  https://fasterxml.github.io/jackson-core/javadoc/2.9/ ([https](https://fasterxml.github.io/jackson-core/javadoc/2.9/) result 200).
* http://fasterxml.github.io/jackson-databind/javadoc/2.9/ migrated to:
  https://fasterxml.github.io/jackson-databind/javadoc/2.9/ ([https](https://fasterxml.github.io/jackson-databind/javadoc/2.9/) result 200).
* http://fasterxml.github.io/jackson-dataformat-xml/javadoc/2.9/ migrated to:
  https://fasterxml.github.io/jackson-dataformat-xml/javadoc/2.9/ ([https](https://fasterxml.github.io/jackson-dataformat-xml/javadoc/2.9/) result 200).
* http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/ migrated to:
  https://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/ ([https](https://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/) result 200).
* http://issues.gradle.org/browse/GRADLE-1116 migrated to:
  https://issues.gradle.org/browse/GRADLE-1116 ([https](https://issues.gradle.org/browse/GRADLE-1116) result 200).
* http://projectreactor.io/docs/core/release/api/ migrated to:
  https://projectreactor.io/docs/core/release/api/ ([https](https://projectreactor.io/docs/core/release/api/) result 200).
* http://tiles.apache.org/framework/apidocs/ migrated to:
  https://tiles.apache.org/framework/apidocs/ ([https](https://tiles.apache.org/framework/apidocs/) result 200).
* http://tiles.apache.org/tiles-request/apidocs/ migrated to:
  https://tiles.apache.org/tiles-request/apidocs/ ([https](https://tiles.apache.org/tiles-request/apidocs/) result 200).
* http://www.apache.org/licenses/LICENSE-2.0 migrated to:
  https://www.apache.org/licenses/LICENSE-2.0 ([https](https://www.apache.org/licenses/LICENSE-2.0) result 200).
* http://www.eclipse.org/aspectj/doc/released/aspectj5rt-api/ migrated to:
  https://www.eclipse.org/aspectj/doc/released/aspectj5rt-api/ ([https](https://www.eclipse.org/aspectj/doc/released/aspectj5rt-api/) result 200).
* http://www.reactive-streams.org/reactive-streams-1.0.1-javadoc/ migrated to:
  https://www.reactive-streams.org/reactive-streams-1.0.1-javadoc/ ([https](https://www.reactive-streams.org/reactive-streams-1.0.1-javadoc/) result 200).
* http://docs.spring.io/spring-framework/docs migrated to:
  https://docs.spring.io/spring-framework/docs ([https](https://docs.spring.io/spring-framework/docs) result 301).
* http://glassfish.java.net/nonav/docs/v3/api/ migrated to:
  https://glassfish.java.net/nonav/docs/v3/api/ ([https](https://glassfish.java.net/nonav/docs/v3/api/) result 301).
* http://projects.spring.io/spring-framework migrated to:
  https://projects.spring.io/spring-framework ([https](https://projects.spring.io/spring-framework) result 301).
* http://springframework.org/schema migrated to:
  https://springframework.org/schema ([https](https://springframework.org/schema) result 301).
* http://ehcache.org/apidocs/2.10.4 (301) migrated to:
  https://www.ehcache.org/apidocs/2.10.4 ([https](https://ehcache.org/apidocs/2.10.4) result 301).
2019-03-05 23:21:36 +01:00
Juergen Hoeller 18f2e6a12d AnnotationConfigRegistry exposes registerBean with supplier/qualifiers
Closes gh-22457
2019-03-05 18:26:04 +01:00
Juergen Hoeller eeed20d8d9 Polishing 2019-03-05 18:25:36 +01:00
Sam Brannen c0b6488ed5 Fix typo 2019-03-05 16:47:26 +01:00
www ef91313342 Use String::isEmpty instead of "".equals(arg) when arg is not null 2019-03-05 14:32:56 +01:00
Juergen Hoeller b2b0df893a Merge branch '5.1.x' 2019-03-05 14:20:02 +01:00
Sebastien Deleuze 412c673db2 Add missing MockMvc.head Kotlin extension
See gh-1951
2019-03-05 09:35:39 +01:00
Rossen Stoyanchev 1ec3261062 Initial support for RSocket in spring-messaging 2019-03-04 23:36:27 -05:00
Rossen Stoyanchev 9e7f557b4a Updates for buffer management in RSocket
- Integration tests run with zero copy configuration.
- RSocketBufferLeakTests has been added.
- Updates in MessagingRSocket to ensure proper release

See gh-21987
2019-03-04 23:35:43 -05:00
Rossen Stoyanchev 23b39ad27b Explicit handling of void return values
Do give HandlerMethodReturnValueHandler's a chance to handle return
values so the RSocket reply header is always set.

See gh-21987
2019-03-04 23:35:43 -05:00
Rossen Stoyanchev fa95b010cb Direct delegation to RSocketMessageHandler
Simplify handling by eliminating the use of a message channel. Instead
MessageHandlerAcceptor now extends from RSocketMessageHandler and
delegates directly to it.

See gh-21987
2019-03-04 23:35:43 -05:00
Rossen Stoyanchev 555dca9aff Refactoring in AbstractMethodMessageHandler
Split out the mechanics of invoking a HandlerMethod and handling the
result into a separate helper class.

See gh-21987
2019-03-04 23:35:43 -05:00
Rossen Stoyanchev 4e1c0c6826 @MessageExceptionHandler supports error signal
Before this change if a controller method returned a Publisher whose
first signal was an error, the error signal would not be delegated to
a @MessageExceptionHandler method as expected.

To make this work for now we use a package private local copy of the
ChannelSendOperator from spring-web.

See gh-21987
2019-03-04 23:35:43 -05:00
Rossen Stoyanchev d6f4ec8c33 MessagingAcceptor/RSocket refinements + upgrade to 0.11.17
See gh-21987
2019-03-04 23:35:43 -05:00
Rossen Stoyanchev 8bdd709683 RSocketRequester, RSocketStrategies, PayloadUtils
See gh-21987
2019-03-04 23:35:43 -05:00
Rossen Stoyanchev 4e78b5df2f RSocket @MessageMapping handling
See gh-21987
2019-03-04 23:35:43 -05:00
Rossen Stoyanchev f2bb95ba7b Payload encoding/decoding and handling refinements
See gh-21987
2019-03-04 23:35:43 -05:00
Rossen Stoyanchev 33682d74c2 ReactiveMessageChannel and ReactiveSubscribableChannel
See gh-21987
2019-03-04 23:35:43 -05:00
Rossen Stoyanchev ceccd9fbee Polish
Updates to synchronize with newly created reactive equivalents.
2019-03-04 23:35:43 -05:00
Rossen Stoyanchev 5b3b0b1a7b Polish
The package o.s.messaging.handler.annotation.support was missing
@NonnullApi and @NonNullFields. This commit corrects that and also
adds @Nullable to methods and arguments as needed to address
warnings.
2019-03-04 23:35:43 -05:00
Rossen Stoyanchev 567c559da8 Resolvers for destination vars and headers
See gh-21987
2019-03-04 23:35:43 -05:00
Rossen Stoyanchev dda40c1516 Reactive @MessageMapping
See gh-21987
2019-03-04 23:35:43 -05:00
Rossen Stoyanchev 421090ca35 Reactive AbstractMessageMethodHandler
See gh-21987
2019-03-04 23:35:43 -05:00
Rossen Stoyanchev e3e1ffc986 Encoder/Decoder based payload serialization
See gh-21987
2019-03-04 23:35:43 -05:00
Rossen Stoyanchev bcf4f3911b Reactive InvocableHandlerMethod in spring-messaging
See gh-21987
2019-03-04 23:35:43 -05:00
Sebastien Deleuze 9e873af6ab Remove infix qualifier from ResultActionsDsl methods
The infix form limits the extensibility of the API and
prevents calling `andReturn()`.

See gh-1951
2019-03-04 19:17:21 +01:00
Sebastien Deleuze 0c332286f1 Add MockMvc Kotlin DSL
This commit introduces a `MockMvc` Kotlin DSL via a set of
extensions like `MockMvc.get` or `MockMvc.request`
that provide a Kotlin idiomatic and easily discoverable
API while staying close to the original Java API design.

Closes gh-1951
2019-03-04 18:00:49 +01:00
Sam Brannen b7d60b9b89 Improve @EventListener documentation 2019-03-04 14:44:44 +01:00
Sam Brannen 70cf597484 Remove obsolete overview.html files 2019-03-04 14:07:48 +01:00
Brian Clozel 3ac1dddb9d Merge branch '5.1.x' 2019-03-04 13:58:41 +01:00
Stephane Nicoll 45b6c0fcb5 Merge branch '5.1.x' 2019-03-04 09:42:10 +01:00
Sam Brannen 0ca5afd8e4 Fix broken test 2019-03-03 23:08:44 +01:00
Sam Brannen e7bd305e87 Suppress warnings in tests 2019-03-03 22:17:52 +01:00
Sam Brannen 4112ca7da8 Separate async/sync TestContext event listeners in tests
See gh-18490
2019-03-03 21:30:49 +01:00
Sam Brannen 6daf33deff Document that @Async is not supported in @Configuration classes 2019-03-03 18:29:45 +01:00
Sam Brannen a9f251db42 Fix broken Javadoc links 2019-03-03 17:18:18 +01:00
Sam Brannen 8e2b14a2b6 Fix Javadoc links to Quartz
See https://github.com/quartz-scheduler/quartz-scheduler.org-site/issues/42
2019-03-03 17:04:34 +01:00
Sam Brannen b5fb7437c9 Test exception handling for TestContext event annotations
This commit introduces tests for both synchronous and asynchronous
exception handling for TestContext event annotations.

See gh-18490
2019-03-03 16:36:00 +01:00
Sam Brannen 6853d50ddb Polishing 2019-03-03 16:29:49 +01:00
Sam Brannen e272e2e151 Support conditional processing in TestContext event annotations
This commit introduces support for SpEL expressions for conditional
event processing in annotations such as @BeforeTestClass,
@BeforeTestMethod, etc.

This commit also introduces a new getTestContext() method in
TestContextEvent in order to improve the readability of such SpEL
expressions.

See gh-18490
2019-03-02 17:26:57 +01:00
Sam Brannen f6d62eda8b Add missing @Nullable declarations to TestContext return values 2019-03-02 16:36:23 +01:00
Sam Brannen 8649061acc Polish Javadoc for TestContext 2019-03-02 16:25:23 +01:00
Sam Brannen abda6a6c66 Polishing 2019-03-02 16:17:58 +01:00
Sam Brannen d4f544d42f Add missing precondition check to AutowireUtils.resolveDependency
See gh-2060
2019-03-02 14:39:43 +01:00
Sam Brannen 02be21d0dc Polishing 2019-03-02 14:22:28 +01:00
Sam Brannen 7d926a847d Polish tests for TestContext lifecycle events
See gh-18490
2019-03-01 21:26:37 +01:00
Sam Brannen a16dd95ab7 Polishing 2019-03-01 20:39:25 +01:00
Sam Brannen 74e9825a65 Fix CheckStyle violation 2019-03-01 20:18:04 +01:00
Sam Brannen 416346200f Polishing 2019-03-01 20:07:09 +01:00
Sam Brannen 297fd7629a Polishing 2019-03-01 19:34:13 +01:00
Sam Brannen dd1330d05e Fix CheckStyle violations
See gh-18490
2019-03-01 17:40:32 +01:00
Sam Brannen 2d6624de71 Polish support for publishing TestContext lifecycle events
See gh-18490
2019-03-01 15:25:35 +01:00
Frank Scheffler 34fee867d2 Provide support for publishing TestContext lifecycle events
This commit introduces a new EventPublishingTestExecutionListener for
publishing events to the test ApplicationContext. These may be consumed
by @EventListener annotated methods to react to the TestContext
lifecycle. The listener is not registered by default.

Closes gh-18490
2019-03-01 15:22:54 +01:00
Juergen Hoeller a7db395d9b Merge branch '5.1.x' 2019-02-28 19:29:04 +01:00
Juergen Hoeller c41616e82d Merge branch '5.1.x' 2019-02-28 11:14:49 +01:00
Juergen Hoeller fc7948c96b Merge branch '5.1.x' 2019-02-27 17:34:46 +01:00
pelladigabor a07245caf8 Exclude jdk package in ShadowingClassLoader
Many Java 11 internal classes are located in the jdk package. ShadowingClassLoader should not load them, because it can cause errors, e.g. java.lang.IllegalAccessError: class jdk.internal.reflect.ConstructorAccessorImpl loaded by org.springframework.instrument.classloading.ShadowingClassLoader @2bea5ab4 cannot access jdk/internal/reflect superclass jdk.internal.reflect.MagicAccessorImpl
2019-02-27 16:57:08 +01:00
Sam Brannen f2a5415111 Fix CheckStyle violations
See gh-2060
2019-02-27 16:41:00 +01:00
Sam Brannen 40da78e9df Polishing 2019-02-27 16:30:05 +01:00
Sam Brannen 6f6be27aae Polish AutowireUtils[Tests]
See gh-2060
2019-02-27 16:25:34 +01:00
Loïc Ledoyen d77b36bf3b Open parameter autowiring utility for external use (#2060)
* Make AutowireUtils public and protect its current API
* Move ParameterAutowireUtils features to AutowireUtils

Closes gh-2060
2019-02-27 15:15:45 +01:00
Sam Brannen 3a42f1154d Polishing 2019-02-27 14:03:11 +01:00
Stephane Nicoll 846ec31dfe Merge branch '5.1.x' 2019-02-27 13:57:40 +01:00
Juergen Hoeller 3a641d9297 Merge branch '5.1.x' 2019-02-26 17:50:35 +01:00
Sam Brannen a7770e7448 Remove ApplicationContext dependency from ParameterAutowireUtils
This commit is a prerequisite for gh-2060.
2019-02-26 15:22:25 +01:00
Stephane Nicoll 49bbbb060d Merge pull request #22472 from izeye
* pr/22472:
  Polish
2019-02-26 08:57:16 +01:00
Johnny Lim e21d94f91b Polish
Closes gh-22472
2019-02-26 08:57:03 +01:00
Juergen Hoeller 7158acb8df Merge branch '5.1.x' 2019-02-25 23:20:42 +01:00
Juergen Hoeller 6a7a4a2145 Upgrade to Caffeine 2.7 2019-02-25 23:15:01 +01:00
Juergen Hoeller 5c2f3079fd Sync between MockHttpServletResponse copies
See gh-22466
2019-02-25 23:14:37 +01:00
www c31613dc74 Instantiate ArrayList class with a exact initial capacity 2019-02-25 23:13:35 +01:00
Juergen Hoeller bc0317af3b Merge branch '5.1.x' 2019-02-25 17:57:49 +01:00
Sam Brannen d61c3d429c Improve Javadoc and exception message for LTW classes 2019-02-25 14:21:23 +01:00
Sam Brannen 8dc82b9689 Re-enable @Ignore'd TxMgt integration test
See: gh-12857
2019-02-25 14:21:23 +01:00
Johnny Lim 625e210676 Polish 2019-02-25 12:17:53 +01:00
stsypanov 1c24dc1f27 Simplify String concatenation 2019-02-25 12:13:35 +01:00
Sebastien Deleuze dc8fb8bc5e Use StringJoiner where possible to simplify String joining 2019-02-25 12:11:57 +01:00
Stephane Nicoll 766a23bd93 Merge pull request #22463 from rupertw
* pr/22463:
  Polish
2019-02-25 08:42:56 +01:00
www f2aa374b73 Polish
Closes gh-22463
2019-02-25 08:41:00 +01:00
Sam Brannen 9093b870dd Move mavenLocal() to bottom of repositories list
This commit moves mavenLocal() to the bottom of the repositories list
so that Gradle's Eclipse IDE support will properly link binary JARs to
their source JARS in generated Eclipse .classpath files.

According to Gradle experts, "`mavenLocal` should basically never be
the first repo in the list."

https://github.com/eclipse/buildship/issues/655#issuecomment-366227296
2019-02-23 00:50:57 +01:00
Sam Brannen 9f751ef914 Polish contribution
See: gh-456
2019-02-22 19:19:59 +01:00
Adib Saikali b4fc7b410b Document that @Transactional is not supported on test lifecycle methods
This commit adds a tip clarifying that TestNG's @BeforeClass and
@BeforeSuite methods can not be annotated with Spring's @Transactional
annotation.

Closes: gh-456
2019-02-22 17:56:19 +01:00
Juergen Hoeller 0652e4b485 Merge branch '5.1.x' 2019-02-22 14:51:00 +01:00
Sebastien Deleuze e5a595e77d Merge branch '5.1.x' 2019-02-22 09:50:28 +01:00
Brian Clozel fb66619187 Merge branch '5.1.x' 2019-02-21 17:52:17 +01:00
Sebastien Deleuze 25d7f09f8d Polishing 2019-02-18 14:50:27 +01:00
Sebastien Deleuze caa1730169 Polishing 2019-02-18 14:13:51 +01:00
Sebastien Deleuze 19f792db66 Add Coroutines support for WebClient and WebFlux.fn
This commit is the first part of a more complete Coroutines
support coming in Spring Framework 5.2. It introduces suspendable
Kotlin extensions for Mono based methods in WebFlux classes like
WebClient, ServerRequest, ServerResponse as well as a Coroutines
router usable via `coRouter { }`.

Coroutines extensions use `await` prefix or `AndAwait` suffix,
and most are using names close to their Reactive counterparts,
except `exchange` in `WebClient.RequestHeadersSpec`
which translates to `awaitResponse`.

Upcoming expected changes are:
 - Leverage `Dispatchers.Unconfined` (Kotlin/kotlinx.coroutines#972)
 - Expose extensions for `Flux` based API (Kotlin/kotlinx.coroutines#254)
 - Introduce interop with `CoroutineContext` (Kotlin/kotlinx.coroutines#284)
 - Support Coroutines in `ReactiveAdapterRegistry`
 - Support Coroutines for WebFlux annotated controllers
 - Fix return type of Kotlin suspending functions (gh-21058)

See gh-19975
2019-02-18 09:23:31 +01:00
Sebastien Deleuze 04bb114f05 Set Kotlin minimum version to 1.3 for Coroutines
See gh-20945
2019-02-18 09:11:52 +01:00
Sam Brannen c95ffe3db2 Merge branch '5.1.x' 2019-02-17 17:25:47 +01:00
Sebastien Deleuze 1d866053ed Leverage RouterFunctions.Builder in RouterFunctionDsl
Closes gh-22423
2019-02-17 17:20:11 +01:00
Sebastien Deleuze 175c27657e Merge branch '5.1.x' 2019-02-17 10:39:15 +01:00
olszewskimichal 60a7909fca getFirst - check that values is not empty 2019-02-16 11:55:23 +01:00
Juergen Hoeller c515de138a Correct import order 2019-02-15 17:19:21 +01:00
Juergen Hoeller 6db75956b9 Merge branch '5.1.x' 2019-02-15 17:16:28 +01:00
stsypanov 5e29ea30a3 Use StringJoiner where possible to simplify String joining 2019-02-15 14:55:35 +01:00
stsypanov e44d3dabc4 use Method in fixedInterceptorMap instead of String returned from Method::toString 2019-02-15 14:53:26 +01:00
stsypanov e7dc439f90 Simplify ConcurrentReferenceHashMap 2019-02-15 14:27:43 +01:00
stsypanov d2bfca7900 Extract duplicated code into a separate method 2019-02-15 14:26:44 +01:00
stsypanov 92053bb84e Some very simple improvements regarding ArrayList 2019-02-15 14:25:13 +01:00
Juergen Hoeller 5e0cd9fb60 Merge branch '5.1.x' 2019-02-14 13:39:58 +01:00
Stephane Nicoll 9967ece49c Merge branch '5.1.x' 2019-02-14 10:18:46 +01:00
Stephane Nicoll 77e815135b Merge branch '5.1.x' 2019-02-12 21:30:32 +01:00
Brian Clozel d463598c09 Defer ExchangeFilterFunction to subscription time
Prior to this commit, the `ExchangeFilterFunction` instances configured
on a `WebClient` instance would be executed as soon as the `exchange`
method would be called. This behavior is not consistent with the server
side and can confuse filter developers as they'd need to manually
`Mono.defer()` their implementations if they want to record metrics.

This commit defers all `ExchangeFilterFunction` processing at
subscription time.

Fixes gh-22375
2019-02-12 10:52:49 +01:00
Juergen Hoeller 4e47006a17 Merge branch '5.1.x' 2019-02-12 09:09:19 +01:00
Sebastien Deleuze 0bdacddc53 Remove SqlXmlObjectMappingHandler
This class is only known to be used in spring-data-jdbc-ext project
which was never upgraded to Spring Framework 5.x and is no longer
actively developed.

Closes gh-22402
2019-02-11 14:20:51 +01:00
Sebastien Deleuze 9d0f97fa00 Merge branch '5.1.x' 2019-02-11 13:09:35 +01:00
Juergen Hoeller 4ca376ef31 Merge branch '5.1.x' 2019-02-11 11:55:59 +01:00
Juergen Hoeller b5e9fa5f1e TransactionActionSupport evaluates Vavr Try failure as rollback-only
Closes gh-20361
2019-02-11 11:45:43 +01:00
Brian Clozel afbe7b31bb Polish
See gh-22341
2019-02-11 10:46:27 +01:00
Brian Clozel fb4a28f904 Polish
See gh-22340
2019-02-11 10:45:50 +01:00
Sam Brannen f7e53a071b Polishing 2019-02-08 19:41:10 +01:00
Juergen Hoeller 783a7ca46b Merge branch '5.1.x' 2019-02-08 18:16:27 +01:00
Sam Brannen 4f57d717ba Upgrade to JUnit Jupiter 5.4
Closes gh-22308
2019-02-08 13:22:34 +01:00
Stephane Nicoll f5ae288990 Merge branch '5.1.x' 2019-02-08 08:54:18 +01:00
Stephane Nicoll aff9e37b8d Merge pull request #22373 from izeye
* pr/22373:
  Fix casing for GitHub in the contributing guide
2019-02-08 08:41:21 +01:00
Johnny Lim 64c86623ee Fix casing for GitHub in the contributing guide
Closes gh-22373
2019-02-08 08:41:03 +01:00
Juergen Hoeller 7cde283066 Merge branch '5.1.x' 2019-02-07 23:07:22 +01:00
Rossen Stoyanchev b4de3845c0 Merge branch '5.1.x' 2019-02-07 14:35:53 -05:00
Rossen Stoyanchev cb9db70857 Merge branch '5.1.x' 2019-02-07 12:00:44 -05:00
Juergen Hoeller 0b617a8c93 Deprecate PreferencesPlaceholderConfigurer along with its base class
Also removing common PropertyPlaceholderConfigurer doc references.

See gh-22181
2019-02-07 16:53:05 +01:00
Juergen Hoeller d25783329a Merge branch '5.1.x' 2019-02-07 16:01:14 +01:00
Juergen Hoeller bb05ee7bff Upgrade to Kotlin 1.3.21
See #20945
2019-02-07 15:28:43 +01:00
Brian Clozel 05d7ab4328 Merge branch '5.1.x' 2019-02-06 20:00:02 +01:00
Sebastien Deleuze 72ed274c6f Merge branch '5.1.x' 2019-02-06 19:35:20 +01:00
Sam Brannen 9bc2c99ce5 Suppress deprecation warning in Gradle build
See gh-22181
2019-02-06 16:37:23 +01:00
Sebastien Deleuze 3787b23a98 Deprecate PropertyPlaceholderConfigurer
This commit deprecates PropertyPlaceholderConfigurer in favor of
PropertySourcesPlaceholderConfigurer.

Closes gh-22181
2019-02-06 16:00:24 +01:00
Sebastien Deleuze 0ad9349d84 Limit ref() and provider() visibility in Kotlin DSL
This commit makes ref() and provider() only available from
inside the bean lambda and not from the root level of the beans DSL.

Closes gh-22177
2019-02-05 16:59:56 +01:00
Juergen Hoeller 34ddb1e3cd Merge branch '5.1.x' 2019-02-05 16:32:58 +01:00
Sebastien Deleuze 0b9522c84e Migrate Kotlin Mockito tests to Mockk
Closes gh-22345
2019-02-05 15:47:08 +01:00
Yoann Rodière 00855c4f5f Add tests for SpringBeanContainer (Hibernate ORM integration) and fix the behavior when requesting named beans (#22260)
* Add integration tests for SpringBeanContainer (Hibernate ORM integration)
* Autowire bean properties of beans retrieved by name in SpringBeanContainer
* Add integration tests for fallback cases in SpringBeanContainer (Hibernate ORM integration)
* Fix SpringBeanContainer incorrectly losing the bean name when calling the fallback producer
2019-02-05 15:39:46 +01:00
Juergen Hoeller 4c9ae6494f Concurrency/nullability fine-tuning in MimeType(Utils)
See gh-22340
2019-02-05 15:38:41 +01:00
Brian Clozel 1bf3b36ce8 Polish
See gh-22340
2019-02-05 15:06:33 +01:00
Brian Clozel ba8849dda3 Avoid MimeType garbage creation
Prior to this commit, calls to `MimeType` and `MediaType` would create a
significant amount of garbage:

* during startup time, in the static sections of `MimeType` and
`MediaType` when creating well-known types
* at runtime, when parsing media types for content negotiation or
writing known media types as strings in HTTP response headers

This commit does the following:

* Avoid parsing the well-known types and use regular constructors
instead
* Cache types in a simple LRU cache once they've been parsed, since an
application is likely to deal with a limited set of types
* Avoid using `java.util.stream.Stream` in hot code paths

Benchmarks show that a complete revision of the `MimeTypeUtils` parser
is not required, since the LRU cache is enough there.

Closes gh-22340
2019-02-05 14:33:43 +01:00
Brian Clozel 862fa557bd Avoid java.util.stream.Stream usage in hot paths
Prior to this commit, profiling sessions would show that using
`java.util.stream.Stream` in some hot code paths creates significant
garbage.

Where streams aren't really required, this commit turns those snippets
into imperative logic  because those are likely to be called once or
multiple times per request.

Closes gh-22341
2019-02-05 12:14:51 +01:00
Juergen Hoeller 4ec2f3cd17 Merge branch '5.1.x' 2019-02-05 00:55:20 +01:00
Juergen Hoeller c700ccbc00 Upgrade to Apache HttpClient 4.5.7
Includes Hibernate ORM 5.4.1 for integration tests.
2019-02-05 00:10:40 +01:00
Juergen Hoeller a27a6470f7 Polishing 2019-02-05 00:10:22 +01:00
kudrevatykh 85474297be Load-time weaving support for WildFly 13+ (#22297)
Load-time weaving support for WildFly 13+ (JBoss Modules 1.8+)
2019-02-04 23:31:21 +01:00
stsypanov 248d3f8e8b Use AtomicInteger instead of unsafe increment on volatile fields 2019-02-04 23:22:20 +01:00
Stephane Nicoll e402a93e41 Merge branch '5.1.x' 2019-02-04 10:34:40 +01:00
Sam Brannen 0742986e0e Suppress warnings from tests in Gradle build 2019-02-01 11:13:53 +01:00
Sam Brannen 5e7065d829 Upgrade to JUnit Jupiter 5.4 RC2
Issue: #22308
2019-02-01 10:59:20 +01:00
stsypanov af13580fd5 Remove unnecessary array initialization 2019-01-31 09:00:22 -05:00
Juergen Hoeller 7a77e83e10 SpelNodeImpl manages start/end position in separate integer values
Fixes gh-22157
2019-01-28 22:50:56 +01:00
Juergen Hoeller 5aed117b68 Model interface exposes getAttribute method (next to add/contains)
Fixes gh-22145
2019-01-28 22:50:29 +01:00
Juergen Hoeller 80385ced4c Remove java.sql dependency from ReflectionUtils/TransactionDefinition
Fixes gh-21996
2019-01-28 22:50:11 +01:00
Arjen Poutsma d3b5ba7a36 Add test case for HttpRequest with relative URIs
Test case for #19890
2019-01-28 16:43:46 +01:00
Rossen Stoyanchev b8f7c37cc4 Merge branch '5.1.x' 2019-01-25 17:01:51 -05:00
Sam Brannen 439bc65b0e Upgrade to JUnit Jupiter 5.4 RC1
Issue: #22308
2019-01-25 15:56:16 +01:00
Juergen Hoeller 05f1ea8515 Merge branch '5.1.x' 2019-01-25 15:46:01 +01:00
Marten Deinum 6bdf2c2685 Upgrade to Commons-Fileupload 1.4 2019-01-24 17:53:22 +01:00
Arjen Poutsma 6004be9d31 Merge branch '5.1.x' 2019-01-24 15:55:46 +01:00
Juergen Hoeller 160ecdf956 Merge branch '5.1.x' 2019-01-24 15:35:28 +01:00
Juergen Hoeller 8bed7d9bb0 Upgrade to Hibernate ORM 5.4.1
Includes EclipseLink 2.7.4.

Fixes #22049
2019-01-24 15:02:30 +01:00
Juergen Hoeller b07b10de8c Upgrade to Kotlin 1.3.20
Includes RxJava 2.2.6, Netty 4.1.33, Undertow 2.0.17.

Fixes #20945
2019-01-24 15:02:13 +01:00
Sam Brannen 83d06b8f4e Merge branch '5.1.x' 2019-01-23 16:45:10 +01:00
Arjen Poutsma a5cef3845c Improve message for HttpStatusCodeException with empty status text
This commit improves the message for HttpStatusCodeException so that it
defaults to the HttpStatus reason phrase if a status text is not
provided.

This commit also fixes SimpleClientHttpResponse so that it does not
return null for getStatusText().

Fixed #22162
2019-01-23 11:44:00 +01:00
Rossen Stoyanchev 155ef5fd77 Merge branch '5.1.x' 2019-01-22 12:04:09 -05:00
Brian Clozel 46c0366594 Merge branch '5.1.x' 2019-01-22 14:56:02 +01:00
Sebastien Deleuze 81ec1d8284 Merge branch '5.1.x' 2019-01-22 10:55:06 +01:00
Rossen Stoyanchev f6c16815b4 Merge branch '5.1.x' 2019-01-21 10:00:15 -05:00
Stephane Nicoll bd3d7dbc0c Merge pull request #22283 from izeye
* pr/22283:
  Polish AutowireUtils.EXECUTABLE_COMPARATOR
2019-01-20 17:38:06 +01:00
Johnny Lim 963cc09c2e Polish AutowireUtils.EXECUTABLE_COMPARATOR
Closes gh-22283
2019-01-20 17:37:46 +01:00
Rossen Stoyanchev b0a3a6f79f Merge branch '5.1.x' 2019-01-18 18:29:39 -05:00
Rossen Stoyanchev f9ba069b9d Add "Affects" field to issue template 2019-01-18 15:27:43 -05:00
Rossen Stoyanchev 4fdfa4246f Merge branch '5.1.x' 2019-01-17 18:01:41 -05:00
Rossen Stoyanchev 2a57b40515 Merge branch '5.1.x' 2019-01-17 17:13:30 -05:00
Rossen Stoyanchev ffe888ca18 Merge branch '5.1.x' 2019-01-17 12:56:46 -05:00
Rossen Stoyanchev 2043793899 Merge branch '5.1.x' 2019-01-17 12:31:46 -05:00
Brian Clozel 0450b07c21 Merge branch '5.1.x' 2019-01-17 11:26:35 -05:00
Stephane Nicoll 0db4c22656 Merge pull request #22256 from KyleRogers
* pr/22256:
  Fix typo in cache abstraction chapter
2019-01-15 06:24:59 -05:00
Stefan Penndorf 04ce61968d Fix typo in cache abstraction chapter
Closes gh-22256
2019-01-15 06:23:34 -05:00
Rossen Stoyanchev 7a9e2f5edc Update issue template
Closes #22253
2019-01-14 19:26:23 -05:00
Rossen Stoyanchev f557f313c2 Update issue template 2019-01-14 13:48:59 -05:00
Rossen Stoyanchev 2b530bac39 Update issue template 2019-01-14 12:26:38 -05:00
Rossen Stoyanchev 66359e2e9e Update issue templates 2019-01-14 09:40:51 -05:00
Arjen Poutsma 5938ca9a7c Deprecate JiBX marshaller
Resolves #22249
2019-01-14 11:57:15 +01:00
Arjen Poutsma 89a7e752ef Remove Castor marshaller
Resolves #22250
2019-01-14 11:28:16 +01:00
Arjen Poutsma bfff9ca0ce Fix typo
Resolves #22241
2019-01-14 10:49:11 +01:00
Brian Clozel 33cbe2e77a Remove admonitions surrounding code snippets 2019-01-09 18:38:31 +01:00
Brian Clozel 8c768e48fa Use Spring Doc Resources for reference docs
This commit removes the custom static resources for the reference
documentation and instead uses the new Spring Doc Resources project
https://github.com/spring-io/spring-doc-resources

The asciidoctor theme is now shared between Spring projects and
integrated in the project build.
2019-01-09 18:38:31 +01:00
Sam Brannen df13e4dd5e Document effect of preemptive timeouts on transactional tests
Issue: SPR-17647
2019-01-09 16:37:56 +01:00
Sam Brannen bd9d3334a2 Document effect of @DirtiesContext when used with constructor injection
Issue: SPR-17654
2019-01-09 15:39:56 +01:00
Sam Brannen 9ea618ede9 Improve documentation for DI options in the TestContext framework 2019-01-09 14:54:14 +01:00
Stephane Nicoll 2a76a65708 Switch master to 5.2.0.BUILD-SNAPSHOT 2019-01-09 14:12:05 +01:00
4011 changed files with 180129 additions and 104153 deletions
+16
View File
@@ -0,0 +1,16 @@
# Normalize line endings to LF.
* text eol=lf
# Ensure that line endings for multipart files in spring-web are not modified.
*.multipart -text
# Ensure that line endings for DOS batch files are not modified.
*.bat -text
# Ensure the following are treated as binary.
*.gif binary
*.jar binary
*.jpeg binary
*.jpg binary
*.png binary
*.vsd binary
+17
View File
@@ -0,0 +1,17 @@
<!--
!!! For Security Vulnerabilities, please go to https://pivotal.io/security !!!
-->
**Affects:** \<Spring Framework version>
---
<!--
Thanks for taking the time to create an issue. Please read the following:
- Questions should be asked on Stack Overflow.
- For bugs, specify affected versions and explain what you are trying to do.
- For enhancements, provide context and describe the problem.
Issue or Pull Request? Create only one, not both. GitHub treats them as the same.
If unsure, start with an issue, and if you submit a pull request later, the
issue will be closed as superseded.
-->
+3
View File
@@ -21,6 +21,9 @@ classes/
/build
buildSrc/build
/spring-*/build
/spring-core/kotlin-coroutines/build
/framework-bom/build
/integration-tests/build
/src/asciidoc/build
target/
+50 -44
View File
@@ -7,8 +7,8 @@ First off, thank you for taking the time to contribute! :+1: :tada:
* [Code of Conduct](#code-of-conduct)
* [How to Contribute](#how-to-contribute)
* [Discuss](#discuss)
* [Create a Ticket](#create-a-ticket)
* [Ticket Lifecycle](#ticket-lifecycle)
* [Create an Issue](#create-an-issue)
* [Issue Lifecycle](#issue-lifecycle)
* [Submit a Pull Request](#submit-a-pull-request)
* [Build from Source](#build-from-source)
* [Source Code Style](#source-code-style)
@@ -24,72 +24,71 @@ Please report unacceptable behavior to spring-code-of-conduct@pivotal.io.
#### Discuss
If you have a question, check StackOverflow using
If you have a question, check Stack Overflow using
[this list of tags](https://spring.io/questions), organized by Spring project.
Find an existing discussion or start a new one if necessary.
Find an existing discussion, or start a new one if necessary.
If you suspect an issue, perform a search in the
[Github issue tracker](https://github.com/spring-projects/spring-framework/issues), using a few different keywords.
When you find related issues and discussions, prior or current, it helps you to learn and
it helps us to make a decision.
If you believe there is an issue, search through
[existing issues](https://github.com/spring-projects/spring-framework/issues) trying a
few different ways to find discussions, past or current, that are related to the issue.
Reading those discussions helps you to learn about the issue, and helps us to make a
decision.
#### Create a Ticket
#### Create an Issue
Reporting an issue or making a feature request is a great way to contribute. Your feedback
and the conversations that result from it provide a continuous flow of ideas.
and the conversations that result from it provide a continuous flow of ideas. However,
before creating a ticket, please take the time to [discuss and research](#discuss) first.
Before you create a ticket, please take the time to [research first](#discuss).
If creating an issue after a discussion on Stack Overflow, please provide a description
in the issue instead of simply referring to Stack Overflow. The issue tracker is an
important place of record for design discussions and should be self-sufficient.
If creating a ticket after a discussion on StackOverflow, please provide a self-sufficient description in the ticket, independent of the details on StackOverview. We understand this is extra work but the issue tracker is an important place of record for design discussions and decisions that can often be referenced long after the fix version, for example to revisit decisions, to understand the origin of a feature, and so on.
Once you're ready, create an issue on
[GitHub](https://github.com/spring-projects/spring-framework/issues).
When ready create a ticket in the [Github issue tracker](https://github.com/spring-projects/spring-framework/issues).
#### Issue Lifecycle
#### Ticket Lifecycle
When an issue is first created, it is flagged `waiting-for-triage` waiting for a team
member to triage it. Once the issue has been reviewed, the team may ask for further
information if needed, and based on the findings, the issue is either assigned a target
milestone or is closed with a specific status.
When an issue is first created, it may not be assigned and will not have a fix version.
Within a day or two, the issue is assigned to a specific committer and the target
version is set to "Waiting for Triage". The committer will then review the issue, ask for
further information if needed, and based on the findings, the issue is either assigned a fix
version or rejected.
When a fix is ready, the issue is marked "Resolved" and may still be re-opened. Once a fix
is released, the issue is permanently "Closed". If necessary, you will need to create a new,
related ticket with a fresh description.
When a fix is ready, the issue is closed and may still be re-opened until the fix is
released. After that the issue will typically no longer be reopened. In rare cases if the
issue was not at all fixed, the issue may be re-opened. In most cases however any
follow-up reports will need to be created as new issues with a fresh description.
#### Submit a Pull Request
You can contribute a source code change by submitting a pull request.
1. If you have not previously done so, please sign the
[Contributor License Agreement](https://cla.pivotal.io/sign/spring). You will also be reminded
automatically when you submit a pull request.
[Contributor License Agreement](https://cla.pivotal.io/sign/spring). You will be reminded
automatically when you submit the PR.
1. For all but the most trivial of contributions, please [create a ticket](#create-a-ticket).
The purpose of the ticket is to understand and discuss the underlying issue or feature.
We use the GitHub issue tracker as the preferred place of record for conversations and
conclusions. In that sense discussions directly under a PR are more implementation detail
oriented and transient in nature.
1. Should you create an issue first? No, just create the pull request and use the
description to provide context and motivation, as you would for an issue. If you want
to start a discussion first or have already created an issue, once a pull request is
created, we will close the issue as superseded by the pull request, and the discussion
about the issue will continue under the pull request.
1. Always check out the `master` branch and submit pull requests against it
(for target version see [settings.gradle](settings.gradle)).
Backports to prior versions will be considered on a case-by-case basis and reflected as
the fix version in the issue tracker.
1. Use short branch names, preferably based on the GitHub issue (e.g. `22276`), or
otherwise using succinct, lower-case, dash (-) delimited names, such as `fix-warnings`.
1. Choose the granularity of your commits consciously and squash commits that represent
multiple edits or corrections of the same logical change. See
[Rewriting History section of Pro Git](https://git-scm.com/book/en/Git-Tools-Rewriting-History)
for an overview of streamlining commit history.
for an overview of streamlining the commit history.
1. Format commit messages using 55 characters for the subject line, 72 lines for the
description, followed by the issue fixed, e.g. `Fixes #22276`.
See the
1. Format commit messages using 55 characters for the subject line, 72 characters per line
for the description, followed by the issue fixed, e.g. `Closes gh-22276`. See the
[Commit Guidelines section of Pro Git](https://git-scm.com/book/en/Distributed-Git-Contributing-to-a-Project#Commit-Guidelines)
for best practices around commit messages and use `git log` to see some examples.
for best practices around commit messages, and use `git log` to see some examples.
1. List the GitHub issue number in the PR description.
1. If there is a prior issue, reference the GitHub issue number in the description of the
pull request.
If accepted, your contribution may be heavily modified as needed prior to merging.
You will likely retain author attribution for your Git commits granted that the bulk of
@@ -99,6 +98,13 @@ If asked to make corrections, simply push the changes against the same branch, a
pull request will be updated. In other words, you do not need to create a new pull request
when asked to make changes.
#### Participate in Reviews
Helping to review pull requests is another great way to contribute. Your feedback
can help to shape the implementation of new features. When reviewing pull requests,
however, please refrain from approving or rejecting a PR unless you are a core
committer for the Spring Framework.
### Build from Source
See the [Build from Source](https://github.com/spring-projects/spring-framework/wiki/Build-from-Source)
@@ -110,15 +116,15 @@ source code into your IDE.
The wiki pages
[Code Style](https://github.com/spring-projects/spring-framework/wiki/Code-Style) and
[IntelliJ IDEA Editor Settings](https://github.com/spring-projects/spring-framework/wiki/IntelliJ-IDEA-Editor-Settings)
defines the source file coding standards we use along with some IDEA editor settings we customize.
define the source file coding standards we use along with some IDEA editor settings we customize.
### Reference Docs
The reference documentation is in the [src/docs/asciidoc](src/docs/asciidoc) directory and, in
The reference documentation is in the [src/docs/asciidoc](src/docs/asciidoc) directory, in
[Asciidoctor](https://asciidoctor.org/) format. For trivial changes, you may be able to browse,
edit source files, and submit directly from GitHub.
When making changes locally, use `./gradlew asciidoctor` and then browse the result under
When making changes locally, execute `./gradlew asciidoctor` and then browse the result under
`build/asciidoc/html5/index.html`.
Asciidoctor also supports live editing. For more details read
+202
View File
@@ -0,0 +1,202 @@
Apache License
Version 2.0, January 2004
https://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "{}"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright {yyyy} {name of copyright owner}
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
+3 -3
View File
@@ -1,6 +1,6 @@
# <img src="src/docs/asciidoc/images/spring-framework.png" width="80" height="80"> Spring Framework
# <img src="src/docs/asciidoc/images/spring-framework.png" width="80" height="80"> Spring Framework [![Build Status](https://build.spring.io/plugins/servlet/wittified/build-status/SPR-PUBM)](https://build.spring.io/browse/SPR)
This is the home of the Spring Framework: the foundation for all [Spring projects](https://spring.io/projects). Collectively the Spring Framework and the family of Spring projects is often referred to simply as "Spring".
This is the home of the Spring Framework: the foundation for all [Spring projects](https://spring.io/projects). Collectively the Spring Framework and the family of Spring projects are often referred to simply as "Spring".
Spring provides everything required beyond the Java programming language for creating enterprise applications for a wide range of scenarios and architectures. Please read the [Overview](https://docs.spring.io/spring/docs/current/spring-framework-reference/overview.html#spring-introduction) section as reference for a more complete introduction.
@@ -19,7 +19,7 @@ The Spring Framework maintains reference documentation ([published](https://docs
## Build from Source
See the [Build from Source](https://github.com/spring-projects/spring-framework/wiki/Build-from-Source) Wikipedia page and the [CONTRIBUTING.md](CONTRIBUTING.md) file.
See the [Build from Source](https://github.com/spring-projects/spring-framework/wiki/Build-from-Source) Wiki page and the [CONTRIBUTING.md](CONTRIBUTING.md) file.
## Stay in Touch
+11
View File
@@ -0,0 +1,11 @@
# Security Policy
## Supported Versions
Please see the
[Spring Framework Versions](https://github.com/spring-projects/spring-framework/wiki/Spring-Framework-Versions)
wiki page.
## Reporting a Vulnerability
Please see https://pivotal.io/security.
+363 -266
View File
@@ -1,321 +1,418 @@
buildscript {
repositories {
maven { url "https://repo.spring.io/plugins-release" }
}
dependencies {
classpath("io.spring.gradle:propdeps-plugin:0.0.9.RELEASE")
classpath("org.asciidoctor:asciidoctorj-pdf:1.5.0-alpha.16")
}
plugins {
id 'io.spring.dependency-management' version '1.0.8.RELEASE' apply false
id 'org.jetbrains.kotlin.jvm' version '1.3.61' apply false
id 'org.jetbrains.dokka' version '0.9.18' apply false
id 'org.asciidoctor.jvm.convert' version '2.4.0'
id 'io.spring.nohttp' version '0.0.4.RELEASE'
id 'de.undercouch.download' version '4.0.0'
id 'com.gradle.build-scan' version '3.1.1'
id "com.jfrog.artifactory" version '4.11.0' apply false
id "io.freefair.aspectj" version "4.1.1" apply false
id "com.github.ben-manes.versions" version "0.24.0"
}
// 3rd party plugin repositories can be configured in settings.gradle
plugins {
id "io.spring.dependency-management" version "1.0.7.RELEASE" apply false
id "org.jetbrains.kotlin.jvm" version "1.2.71" apply false
id "org.jetbrains.dokka" version "0.9.18"
id "org.asciidoctor.convert" version "1.5.8"
apply from: "$rootDir/gradle/build-scan-user-data.gradle"
buildScan {
captureTaskInputFiles = true
obfuscation {
ipAddresses { addresses -> addresses.collect { address -> '0.0.0.0'} }
}
publishAlwaysIf(System.getenv('GRADLE_ENTERPRISE_URL') != null)
server = 'https://ge.spring.io'
}
ext {
linkHomepage = "https://spring.io/projects/spring-framework"
linkCi = "https://build.spring.io/browse/SPR"
linkIssue = "https://github.com/spring-projects/spring-framework/issues"
linkScmUrl = "https://github.com/spring-projects/spring-framework"
linkScmConnection = "scm:git:git://github.com/spring-projects/spring-framework.git"
linkScmDevConnection = "scm:git:ssh://git@github.com:spring-projects/spring-framework.git"
moduleProjects = subprojects.findAll {
!it.name.equals("spring-build-src") && !it.name.equals("spring-framework-bom")
}
aspectjVersion = "1.9.4"
freemarkerVersion = "2.3.28"
groovyVersion = "2.5.8"
hsqldbVersion = "2.4.1"
jackson2Version = "2.9.9"
jettyVersion = "9.4.21.v20190926"
junit5Version = "5.3.2"
kotlinVersion = "1.2.71"
log4jVersion = "2.11.2"
nettyVersion = "4.1.43.Final"
reactorVersion = "Californium-SR13"
rxjavaVersion = "1.3.8"
rxjavaAdapterVersion = "1.2.1"
rxjava2Version = "2.2.12"
slf4jVersion = "1.7.28" // spring-jcl + consistent 3rd party deps
tiles3Version = "3.0.8"
tomcatVersion = "9.0.26"
undertowVersion = "2.0.26.Final"
gradleScriptDir = "${rootProject.projectDir}/gradle"
moduleProjects = subprojects.findAll { it.name.startsWith("spring-") }
javaProjects = subprojects - project(":framework-bom")
withoutJclOverSlf4j = {
exclude group: "org.slf4j", module: "jcl-over-slf4j"
exclude group: "org.slf4j", name: "jcl-over-slf4j"
}
}
configure(allprojects) { project ->
group = "org.springframework"
version = qualifyVersionIfNecessary(version)
apply plugin: "java"
apply plugin: "kotlin"
apply plugin: "checkstyle"
apply plugin: "propdeps"
apply plugin: "test-source-set-dependencies"
apply plugin: "io.spring.dependency-management"
apply from: "${gradleScriptDir}/ide.gradle"
dependencyManagement {
resolutionStrategy {
cacheChangingModulesFor 0, "seconds"
imports {
mavenBom "com.fasterxml.jackson:jackson-bom:2.10.2"
mavenBom "io.netty:netty-bom:4.1.44.Final"
mavenBom "io.projectreactor:reactor-bom:Dysprosium-SR3"
mavenBom "io.rsocket:rsocket-bom:1.0.0-RC5"
mavenBom "org.eclipse.jetty:jetty-bom:9.4.25.v20191220"
mavenBom "org.jetbrains.kotlin:kotlin-bom:1.3.61"
mavenBom "org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.3.2"
mavenBom "org.junit:junit-bom:5.5.2"
}
dependencies {
dependencySet(group: 'org.apache.logging.log4j', version: '2.13.0') {
entry 'log4j-api'
entry 'log4j-core'
entry 'log4j-slf4j-impl'
entry 'log4j-jul'
}
dependency "org.slf4j:slf4j-api:1.7.30"
dependency "com.google.code.findbugs:jsr305:3.0.2"
dependencySet(group: 'org.aspectj', version: '1.9.5') {
entry 'aspectjrt'
entry 'aspectjtools'
entry 'aspectjweaver'
}
dependencySet(group: 'org.codehaus.groovy', version: '2.5.8') {
entry 'groovy'
entry 'groovy-jsr223'
entry 'groovy-templates'
entry 'groovy-test'
entry 'groovy-xml'
}
dependency "io.reactivex:rxjava:1.3.8"
dependency "io.reactivex:rxjava-reactive-streams:1.2.1"
dependency "io.reactivex.rxjava2:rxjava:2.2.17"
dependency "com.caucho:hessian:4.0.62"
dependency "com.fasterxml:aalto-xml:1.2.2"
dependency("com.fasterxml.woodstox:woodstox-core:6.0.2") {
exclude group: "stax", name: "stax-api"
}
dependency "com.google.code.gson:gson:2.8.6"
dependency "com.google.protobuf:protobuf-java-util:3.11.1"
dependency "com.googlecode.protobuf-java-format:protobuf-java-format:1.4"
dependency("com.thoughtworks.xstream:xstream:1.4.11.1") {
exclude group: "xpp3", name: "xpp3_min"
exclude group: "xmlpull", name: "xmlpull"
}
dependency "org.apache.johnzon:johnzon-jsonb:1.2.2"
dependency("org.codehaus.jettison:jettison:1.3.8") {
exclude group: "stax", name: "stax-api"
}
dependencySet(group: 'org.jibx', version: '1.3.1') {
entry 'jibx-bind'
entry 'jibx-run'
}
dependency "org.ogce:xpp3:1.1.6"
dependency "org.yaml:snakeyaml:1.25"
dependency "com.h2database:h2:1.4.200"
dependency "com.github.ben-manes.caffeine:caffeine:2.8.0"
dependency "com.github.librepdf:openpdf:1.3.11"
dependency "com.rometools:rome:1.12.2"
dependency "commons-io:commons-io:2.5"
dependency "io.vavr:vavr:0.10.0"
dependency "net.sf.jopt-simple:jopt-simple:5.0.4"
dependencySet(group: 'org.apache.activemq', version: '5.8.0') {
entry 'activemq-broker'
entry('activemq-kahadb-store') {
exclude group: "org.springframework", name: "spring-context"
}
entry 'activemq-stomp'
}
dependency "org.apache.bcel:bcel:6.0"
dependency "org.apache.commons:commons-pool2:2.7.0"
dependencySet(group: 'org.apache.derby', version: '10.14.2.0') {
entry 'derby'
entry 'derbyclient'
}
dependency "org.apache.poi:poi-ooxml:4.1.1"
dependency "org.beanshell:bsh:2.0b5"
dependency "org.freemarker:freemarker:2.3.29"
dependency "org.hsqldb:hsqldb:2.5.0"
dependency "org.quartz-scheduler:quartz:2.3.2"
dependency "org.codehaus.fabric3.api:commonj:1.1.0"
dependency "net.sf.ehcache:ehcache:2.10.6"
dependency "org.ehcache:jcache:1.0.1"
dependency "org.ehcache:ehcache:3.4.0"
dependency "org.hibernate:hibernate-core:5.4.10.Final"
dependency "org.hibernate:hibernate-validator:6.1.0.Final"
dependency "org.webjars:webjars-locator-core:0.43"
dependency "org.webjars:underscorejs:1.8.3"
dependencySet(group: 'org.apache.tomcat', version: '9.0.30') {
entry 'tomcat-util'
entry('tomcat-websocket') {
exclude group: "org.apache.tomcat", name: "tomcat-websocket-api"
exclude group: "org.apache.tomcat", name: "tomcat-servlet-api"
}
}
dependencySet(group: 'org.apache.tomcat.embed', version: '9.0.30') {
entry 'tomcat-embed-core'
entry 'tomcat-embed-websocket'
}
dependencySet(group: 'io.undertow', version: '2.0.29.Final') {
entry 'undertow-core'
entry('undertow-websockets-jsr') {
exclude group: "org.jboss.spec.javax.websocket", name: "jboss-websocket-api_1.1_spec"
}
entry('undertow-servlet') {
exclude group: "org.jboss.spec.javax.servlet", name: "jboss-servlet-api_3.1_spec"
exclude group: "org.jboss.spec.javax.annotation", name: "jboss-annotations-api_1.2_spec"
}
}
dependencySet(group: 'com.squareup.okhttp3', version: '3.14.6') {
entry 'okhttp'
entry 'mockwebserver'
}
dependency("org.apache.httpcomponents:httpclient:4.5.10") {
exclude group: "commons-logging", name: "commons-logging"
}
dependency("org.apache.httpcomponents:httpasyncclient:4.1.4") {
exclude group: "commons-logging", name: "commons-logging"
}
dependency "org.eclipse.jetty:jetty-reactive-httpclient:1.1.1"
dependency "org.jruby:jruby:9.2.9.0"
dependency "org.python:jython-standalone:2.7.1"
dependency "org.mozilla:rhino:1.7.11"
dependency "commons-fileupload:commons-fileupload:1.4"
dependency "org.synchronoss.cloud:nio-multipart-parser:1.1.0"
dependency("dom4j:dom4j:1.6.1") {
exclude group: "xml-apis", name: "xml-apis"
}
dependency("jaxen:jaxen:1.1.1") {
exclude group: "xml-apis", name: "xml-apis"
exclude group: "xom", name: "xom"
exclude group: "xerces", name: "xercesImpl"
}
dependency("junit:junit:4.12") {
exclude group: "org.hamcrest", name: "hamcrest-core"
}
dependency("de.bechte.junit:junit-hierarchicalcontextrunner:4.12.1") {
exclude group: "junit", name: "junit"
}
dependency "org.testng:testng:6.14.3"
dependency "org.hamcrest:hamcrest:2.1"
dependency "org.awaitility:awaitility:3.1.6"
dependency "org.assertj:assertj-core:3.14.0"
dependencySet(group: 'org.xmlunit', version: '2.6.2') {
entry 'xmlunit-assertj'
entry('xmlunit-matchers') {
exclude group: "org.hamcrest", name: "hamcrest-core"
}
}
dependencySet(group: 'org.mockito', version: '3.2.0') {
entry('mockito-core') {
exclude group: "org.hamcrest", name: "hamcrest-core"
}
entry 'mockito-junit-jupiter'
}
dependency "io.mockk:mockk:1.9.3"
dependency("net.sourceforge.htmlunit:htmlunit:2.36.0") {
exclude group: "commons-logging", name: "commons-logging"
}
dependency("org.seleniumhq.selenium:htmlunit-driver:2.36.0") {
exclude group: "commons-logging", name: "commons-logging"
}
dependency("org.seleniumhq.selenium:selenium-java:3.141.59") {
exclude group: "commons-logging", name: "commons-logging"
exclude group: "io.netty", name: "netty"
}
dependency "org.skyscreamer:jsonassert:1.5.0"
dependency "com.jayway.jsonpath:json-path:2.4.0"
dependencySet(group: 'org.apache.tiles', version: '3.0.8') {
entry 'tiles-api'
entry('tiles-core', withoutJclOverSlf4j)
entry('tiles-servlet', withoutJclOverSlf4j)
entry('tiles-jsp', withoutJclOverSlf4j)
entry('tiles-el', withoutJclOverSlf4j)
entry('tiles-extras') {
exclude group: "org.springframework", name: "spring-web"
exclude group: "org.slf4j", name: "jcl-over-slf4j"
}
}
dependency("org.apache.taglibs:taglibs-standard-jstlel:1.2.5") {
exclude group: "org.apache.taglibs", name: "taglibs-standard-spec"
}
dependency "com.ibm.websphere:uow:6.0.2.17"
dependency "com.jamonapi:jamon:2.81"
dependency "joda-time:joda-time:2.10.5"
dependency "org.eclipse.persistence:org.eclipse.persistence.jpa:2.7.5"
dependency "org.javamoney:moneta:1.3"
dependency "com.sun.activation:javax.activation:1.2.0"
dependency "com.sun.mail:javax.mail:1.6.2"
dependencySet(group: 'com.sun.xml.bind', version: '2.3.0.1') {
entry 'jaxb-core'
entry 'jaxb-impl'
entry 'jaxb-xjc'
}
dependency "javax.activation:javax.activation-api:1.2.0"
dependency "javax.annotation:javax.annotation-api:1.3.2"
dependency "javax.cache:cache-api:1.1.0"
dependency "javax.ejb:javax.ejb-api:3.2"
dependency "javax.el:javax.el-api:3.0.1-b04"
dependency "javax.enterprise.concurrent:javax.enterprise.concurrent-api:1.0"
dependency "javax.faces:javax.faces-api:2.2"
dependency "javax.inject:javax.inject:1"
dependency "javax.inject:javax.inject-tck:1"
dependency "javax.interceptor:javax.interceptor-api:1.2.2"
dependency "javax.jms:javax.jms-api:2.0.1"
dependency "javax.json:javax.json-api:1.1.4"
dependency "javax.json.bind:javax.json.bind-api:1.0"
dependency "javax.mail:javax.mail-api:1.6.2"
dependency "javax.money:money-api:1.0.3"
dependency "javax.resource:javax.resource-api:1.7.1"
dependency "javax.servlet:javax.servlet-api:4.0.1"
dependency "javax.servlet.jsp:javax.servlet.jsp-api:2.3.2-b02"
dependency "javax.servlet.jsp.jstl:javax.servlet.jsp.jstl-api:1.2.1"
dependency "javax.transaction:javax.transaction-api:1.3"
dependency "javax.validation:validation-api:2.0.1.Final"
dependency "javax.websocket:javax.websocket-api:1.1"
dependency "javax.xml.bind:jaxb-api:2.3.1"
dependency "javax.xml.ws:jaxws-api:2.3.1"
dependency "org.eclipse.persistence:javax.persistence:2.2.0"
// Substitute for "javax.management:jmxremote_optional:1.0.1_04" which
// is not available on Maven Central
dependency "org.glassfish.external:opendmk_jmxremote_optional_jar:1.0-b01-ea"
dependency "org.glassfish:javax.el:3.0.1-b08"
dependency "org.glassfish.main:javax.jws:4.0-b33"
dependency "org.glassfish.tyrus:tyrus-container-servlet:1.13.1"
}
applyMavenExclusions = false
generatedPomCustomization {
enabled = false
}
resolutionStrategy {
cacheChangingModulesFor 0, "seconds"
}
repositories {
mavenCentral()
maven { url "https://repo.spring.io/libs-spring-framework-build" }
}
}
configurations.all {
// Check for updates every build
resolutionStrategy.cacheChangingModulesFor 0, "seconds"
resolutionStrategy {
cacheChangingModulesFor 0, "seconds"
cacheDynamicVersionsFor 0, "seconds"
}
}
}
// Consistent slf4j version (e.g. clashes between slf4j versions)
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
if (details.requested.group == "org.slf4j") {
details.useVersion slf4jVersion
configure([rootProject] + javaProjects) { project ->
group = "org.springframework"
apply plugin: "java"
apply plugin: "java-test-fixtures"
apply plugin: "checkstyle"
apply plugin: 'org.springframework.build.compile'
apply from: "${rootDir}/gradle/ide.gradle"
pluginManager.withPlugin("kotlin") {
apply plugin: "org.jetbrains.dokka"
compileKotlin {
kotlinOptions {
jvmTarget = "1.8"
freeCompilerArgs = ["-Xjsr305=strict"]
allWarningsAsErrors = true
}
}
compileTestKotlin {
kotlinOptions {
jvmTarget = "1.8"
freeCompilerArgs = ["-Xjsr305=strict"]
}
}
}
def commonCompilerArgs =
["-Xlint:serial", "-Xlint:cast", "-Xlint:classfile", "-Xlint:dep-ann",
"-Xlint:divzero", "-Xlint:empty", "-Xlint:finally", "-Xlint:overrides",
"-Xlint:path", "-Xlint:processing", "-Xlint:static", "-Xlint:try", "-Xlint:-options"]
compileJava.options*.compilerArgs = commonCompilerArgs +
["-Xlint:varargs", "-Xlint:fallthrough", "-Xlint:rawtypes",
"-Xlint:deprecation", "-Xlint:unchecked", "-Werror"]
compileTestJava.options*.compilerArgs = commonCompilerArgs +
["-Xlint:-varargs", "-Xlint:-fallthrough", "-Xlint:-rawtypes",
"-Xlint:-deprecation", "-Xlint:-unchecked"]
compileJava {
sourceCompatibility = 1.8 // can be switched to 11 for testing
targetCompatibility = 1.8
options.encoding = "UTF-8"
}
compileTestJava {
sourceCompatibility = 1.8 // can be switched to 11 for testing
targetCompatibility = 1.8
options.encoding = "UTF-8"
options.compilerArgs += "-parameters"
}
compileKotlin {
kotlinOptions {
jvmTarget = "1.8"
freeCompilerArgs = ["-Xjsr305=strict"]
apiVersion = "1.1"
languageVersion = "1.1"
}
}
compileTestKotlin {
kotlinOptions {
jvmTarget = "1.8"
freeCompilerArgs = ["-Xjsr305=strict"]
}
}
test {
useJUnitPlatform()
include(["**/*Tests.class", "**/*Test.class"])
systemProperty("java.awt.headless", "true")
systemProperty("testGroups", project.properties.get("testGroups"))
systemProperty("io.netty.leakDetection.level", "paranoid")
scanForTestClasses = false
include(["**/*Tests.class", "**/*Test.class"])
// Since we set scanForTestClasses to false, we need to filter out inner
// classes with the "$" pattern; otherwise, using -Dtest.single=MyTests to
// run MyTests by itself will fail if MyTests contains any inner classes.
exclude(["**/Abstract*.class", '**/*$*'])
}
checkstyle {
toolVersion = "8.24"
toolVersion = "8.28"
configDir = rootProject.file("src/checkstyle")
}
repositories {
maven { url "https://repo.spring.io/libs-release" }
mavenLocal()
}
dependencies {
testCompile("junit:junit:4.12") {
exclude group: "org.hamcrest", module: "hamcrest-core"
}
testCompile("org.mockito:mockito-core:2.28.2") {
exclude group: "org.hamcrest", module: "hamcrest-core"
}
testCompile("com.nhaarman:mockito-kotlin:1.6.0") {
exclude module: "kotlin-stdlib"
exclude module: "kotlin-reflect"
exclude module: "mockito-core"
}
testCompile("org.hamcrest:hamcrest-all:1.3")
testRuntime("org.apache.logging.log4j:log4j-core:${log4jVersion}")
testRuntime("org.apache.logging.log4j:log4j-slf4j-impl:${log4jVersion}")
testRuntime("org.apache.logging.log4j:log4j-jul:${log4jVersion}")
testCompile("org.junit.jupiter:junit-jupiter-api")
testCompile("org.junit.jupiter:junit-jupiter-params")
testCompile("org.mockito:mockito-core")
testCompile("org.mockito:mockito-junit-jupiter")
testCompile("io.mockk:mockk")
testCompile("org.assertj:assertj-core")
// Pull in the latest JUnit 5 Launcher API to ensure proper support in IDEs.
testRuntime("org.junit.platform:junit-platform-launcher")
testRuntime("org.junit.jupiter:junit-jupiter-engine")
testRuntime("org.apache.logging.log4j:log4j-core")
testRuntime("org.apache.logging.log4j:log4j-slf4j-impl")
testRuntime("org.apache.logging.log4j:log4j-jul")
// JSR-305 only used for non-required meta-annotations
compileOnly("com.google.code.findbugs:jsr305:3.0.2")
testCompileOnly("com.google.code.findbugs:jsr305:3.0.2")
checkstyle("io.spring.javaformat:spring-javaformat-checkstyle:0.0.7")
compileOnly("com.google.code.findbugs:jsr305")
testCompileOnly("com.google.code.findbugs:jsr305")
checkstyle("io.spring.javaformat:spring-javaformat-checkstyle:0.0.15")
}
ext.javadocLinks = [
"https://docs.oracle.com/javase/8/docs/api/",
"https://docs.oracle.com/javaee/7/api/",
"https://docs.oracle.com/cd/E13222_01/wls/docs90/javadocs/", // CommonJ
"https://www.ibm.com/support/knowledgecenter/SS7JFU_8.5.5/com.ibm.websphere.javadoc.doc/web/apidocs/",
"https://glassfish.java.net/nonav/docs/v3/api/",
"https://docs.jboss.org/jbossas/javadoc/4.0.5/connector/",
"https://docs.jboss.org/jbossas/javadoc/7.1.2.Final/",
"https://tiles.apache.org/tiles-request/apidocs/",
"https://tiles.apache.org/framework/apidocs/",
"https://www.eclipse.org/aspectj/doc/released/aspectj5rt-api/",
"https://www.ehcache.org/apidocs/2.10.4",
"https://www.quartz-scheduler.org/api/2.3.0/",
"https://fasterxml.github.io/jackson-core/javadoc/2.9/",
"https://fasterxml.github.io/jackson-databind/javadoc/2.9/",
"https://fasterxml.github.io/jackson-dataformat-xml/javadoc/2.9/",
"https://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/",
"https://junit.org/junit4/javadoc/4.12/",
"https://junit.org/junit5/docs/${junit5Version}/api/"
"https://docs.oracle.com/javase/8/docs/api/",
"https://docs.oracle.com/javaee/7/api/",
"https://docs.oracle.com/cd/E13222_01/wls/docs90/javadocs/", // CommonJ
"https://www.ibm.com/support/knowledgecenter/SS7JFU_8.5.5/com.ibm.websphere.javadoc.doc/web/apidocs/",
"https://glassfish.java.net/nonav/docs/v3/api/",
"https://docs.jboss.org/jbossas/javadoc/4.0.5/connector/",
"https://docs.jboss.org/jbossas/javadoc/7.1.2.Final/",
"https://tiles.apache.org/tiles-request/apidocs/",
"https://tiles.apache.org/framework/apidocs/",
"https://www.eclipse.org/aspectj/doc/released/aspectj5rt-api/",
"https://www.ehcache.org/apidocs/2.10.4/",
"https://www.quartz-scheduler.org/api/2.3.0/",
"https://fasterxml.github.io/jackson-core/javadoc/2.10/",
"https://fasterxml.github.io/jackson-databind/javadoc/2.10/",
"https://fasterxml.github.io/jackson-dataformat-xml/javadoc/2.10/",
"https://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/",
"https://junit.org/junit4/javadoc/4.12/",
"https://junit.org/junit5/docs/5.5.2/api/"
] as String[]
}
configure(subprojects - project(":spring-build-src")) { subproject ->
apply from: "${gradleScriptDir}/publish-maven.gradle"
jar {
manifest.attributes["Implementation-Title"] = subproject.name
manifest.attributes["Implementation-Version"] = subproject.version
manifest.attributes["Automatic-Module-Name"] = subproject.name.replace('-', '.') // for Jigsaw
manifest.attributes["Created-By"] =
"${System.getProperty("java.version")} (${System.getProperty("java.specification.vendor")})"
from("${rootProject.projectDir}/src/docs/dist") {
include "license.txt"
include "notice.txt"
into "META-INF"
expand(copyright: new Date().format("yyyy"), version: project.version)
}
}
javadoc {
description = "Generates project-level javadoc for use in -javadoc jar"
options.encoding = "UTF-8"
options.memberLevel = org.gradle.external.javadoc.JavadocMemberLevel.PROTECTED
options.author = true
options.header = project.name
options.use = true
options.links(project.ext.javadocLinks)
options.addStringOption("Xdoclint:none", "-quiet")
// Suppress warnings due to cross-module @see and @link references.
// Note that global 'api' task does display all warnings.
logging.captureStandardError LogLevel.INFO
logging.captureStandardOutput LogLevel.INFO // suppress "## warnings" message
}
task sourcesJar(type: Jar, dependsOn: classes) {
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
classifier = "sources"
from sourceSets.main.allSource
// Don't include or exclude anything explicitly by default. See SPR-12085.
}
task javadocJar(type: Jar) {
classifier = "javadoc"
from javadoc
}
artifacts {
archives sourcesJar
archives javadocJar
}
configure(moduleProjects) { project ->
apply from: "${rootDir}/gradle/spring-module.gradle"
}
configure(rootProject) {
description = "Spring Framework"
apply plugin: "groovy"
apply from: "${gradleScriptDir}/jdiff.gradle"
apply from: "${gradleScriptDir}/docs.gradle"
apply plugin: "kotlin"
apply plugin: "io.spring.nohttp"
apply plugin: 'org.springframework.build.api-diff'
apply from: "${rootDir}/gradle/publications.gradle"
apply from: "${rootDir}/gradle/docs.gradle"
dependencyManagement {
imports {
mavenBom "io.projectreactor:reactor-bom:${reactorVersion}"
nohttp {
source.exclude "**/test-output/**"
whitelistFile = project.file("src/nohttp/whitelist.lines")
def rootPath = file(rootDir).toPath()
def projectDirs = allprojects.collect { it.projectDir } + "${rootDir}/buildSrc"
projectDirs.forEach { dir ->
[ 'bin', 'build', 'out', '.settings' ]
.collect { rootPath.relativize(new File(dir, it).toPath()) }
.forEach { source.exclude "$it/**" }
[ '.classpath', '.project' ]
.collect { rootPath.relativize(new File(dir, it).toPath()) }
.forEach { source.exclude "$it" }
}
}
// Don't publish the default jar for the root project
configurations.archives.artifacts.clear()
dependencies { // for integration tests
testCompile(project(":spring-aop"))
testCompile(project(":spring-beans"))
testCompile(project(":spring-context"))
testCompile(project(":spring-core"))
testCompile(project(":spring-expression"))
testCompile(project(":spring-jdbc"))
testCompile(project(":spring-orm"))
testCompile(project(":spring-test"))
testCompile(project(":spring-tx"))
testCompile(project(":spring-web"))
testCompile("javax.inject:javax.inject:1")
testCompile("javax.resource:javax.resource-api:1.7.1")
testCompile("javax.servlet:javax.servlet-api:3.1.0")
testCompile("org.aspectj:aspectjweaver:${aspectjVersion}")
testCompile("org.hsqldb:hsqldb:${hsqldbVersion}")
testCompile("org.hibernate:hibernate-core:5.1.17.Final")
}
artifacts {
archives docsZip
archives schemaZip
archives distZip
}
wrapper {
doLast() {
def gradleOpts = "-XX:MaxMetaspaceSize=1024m -Xmx1024m"
def gradleBatOpts = "$gradleOpts -XX:MaxHeapSize=256m"
File wrapperFile = file("gradlew")
wrapperFile.text = wrapperFile.text.replace("DEFAULT_JVM_OPTS=",
"GRADLE_OPTS=\"$gradleOpts \$GRADLE_OPTS\"\nDEFAULT_JVM_OPTS=")
File wrapperBatFile = file("gradlew.bat")
wrapperBatFile.text = wrapperBatFile.text.replace("set DEFAULT_JVM_OPTS=",
"set GRADLE_OPTS=$gradleBatOpts %GRADLE_OPTS%\nset DEFAULT_JVM_OPTS=")
publishing {
publications {
mavenJava(MavenPublication) {
artifact docsZip
artifact schemaZip
artifact distZip
}
}
}
}
/*
* Support publication of artifacts versioned by topic branch.
* CI builds supply `-P BRANCH_NAME=<TOPIC>` to gradle at build time.
* If <TOPIC> starts with 'SPR-', change version
* from BUILD-SNAPSHOT => <TOPIC>-SNAPSHOT
* e.g. 3.2.1.BUILD-SNAPSHOT => 3.2.1.SPR-1234-SNAPSHOT
*/
def qualifyVersionIfNecessary(version) {
if (rootProject.hasProperty("BRANCH_NAME")) {
def qualifier = rootProject.getProperty("BRANCH_NAME")
if (qualifier.startsWith("SPR-")) {
return version.replace("BUILD", qualifier)
}
}
return version
}
+41
View File
@@ -0,0 +1,41 @@
# Spring Framework Build
This folder contains the custom plugins and conventions for the Spring Framework build.
They are declared in the `build.gradle` file in this folder.
## Build Conventions
### Compiler conventions
The `org.springframework.build.compile` plubin applies the Java compiler conventions to the build.
By default, the build compiles sources with Java `1.8` source and target compatibility.
You can test a different source compatibility version on the CLI with a project property like:
```
./gradlew test -PjavaSourceVersion=11
```
## Build Plugins
## Optional dependencies
The `org.springframework.build.optional-dependencies` plugin creates a new `optional`
Gradle configuration - it adds the dependencies to the project's compile and runtime classpath
but doesn't affect the classpath of dependent projects.
This plugin does not provide a `provided` configuration, as the native `compileOnly` and `testCompileOnly`
configurations are preferred.
## API Diff
This plugin uses the [Gradle JApiCmp](https://github.com/melix/japicmp-gradle-plugin) plugin
to generate API Diff reports for each Spring Framework module. This plugin is applied once on the root
project and creates tasks in each framework module. Unlike previous versions of this part of the build,
there is no need for checking out a specific tag. The plugin will fetch the JARs we want to compare the
current working version with. You can generate the reports for all modules or a single module:
```
./gradlew apiDiff -PbaselineVersion=5.1.0.RELEASE
./gradlew :spring-core:apiDiff -PbaselineVersion=5.1.0.RELEASE
```
The reports are located under `build/reports/api-diff/$OLDVERSION_to_$NEWVERSION/`.
+30
View File
@@ -0,0 +1,30 @@
plugins {
id 'java-gradle-plugin'
}
repositories {
mavenCentral()
gradlePluginPortal()
}
dependencies {
implementation "me.champeau.gradle:japicmp-gradle-plugin:0.2.8"
implementation "com.google.guava:guava:18.0" // required by japicmp-gradle-plugin
}
gradlePlugin {
plugins {
apiDiffPlugin {
id = "org.springframework.build.api-diff"
implementationClass = "org.springframework.build.api.ApiDiffPlugin"
}
compileConventionsPlugin {
id = "org.springframework.build.compile"
implementationClass = "org.springframework.build.compile.CompilerConventionsPlugin"
}
optionalDependenciesPlugin {
id = "org.springframework.build.optional-dependencies"
implementationClass = "org.springframework.build.optional.OptionalDependenciesPlugin"
}
}
}
+1
View File
@@ -0,0 +1 @@
org.gradle.caching=true
+1
View File
@@ -0,0 +1 @@
apply from: "../gradle/build-cache-settings.gradle"
-10
View File
@@ -1,10 +0,0 @@
description = "Exposes gradle buildSrc for IDE support"
apply plugin: "groovy"
dependencies {
compile gradleApi()
compile localGroovy()
}
configurations.archives.artifacts.clear()
@@ -1,55 +0,0 @@
/*
* Copyright 2002-2014 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.build.gradle
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.artifacts.Configuration;
import org.gradle.api.artifacts.ProjectDependency;
/**
* Gradle plugin that automatically updates testCompile dependencies to include
* the test source sets of project dependencies.
*
* @author Phillip Webb
*/
class TestSourceSetDependenciesPlugin implements Plugin<Project> {
@Override
public void apply(Project project) {
project.afterEvaluate {
Set<ProjectDependency> projectDependencies = new LinkedHashSet<ProjectDependency>()
collectProjectDependencies(projectDependencies, project)
projectDependencies.each {
project.dependencies.add("testCompile", it.dependencyProject.sourceSets.test.output)
}
}
}
private void collectProjectDependencies(Set<ProjectDependency> projectDependencies, Project project) {
for (def configurationName in ["compile", "optional", "provided", "testCompile"]) {
Configuration configuration = project.getConfigurations().findByName(configurationName)
if (configuration) {
configuration.dependencies.findAll { it instanceof ProjectDependency }.each {
projectDependencies.add(it)
collectProjectDependencies(projectDependencies, it.dependencyProject)
}
}
}
}
}
@@ -0,0 +1,115 @@
/*
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.build.api;
import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Collections;
import java.util.List;
import me.champeau.gradle.japicmp.JapicmpPlugin;
import me.champeau.gradle.japicmp.JapicmpTask;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.artifacts.Configuration;
import org.gradle.api.artifacts.Dependency;
import org.gradle.api.plugins.JavaBasePlugin;
import org.gradle.api.plugins.JavaPlugin;
import org.gradle.api.publish.maven.plugins.MavenPublishPlugin;
import org.gradle.api.tasks.TaskProvider;
import org.gradle.jvm.tasks.Jar;
/**
* {@link Plugin} that applies the {@code "japicmp-gradle-plugin"}
* and create tasks for all subprojects, diffing the public API one by one
* and creating the reports in {@code "build/reports/api-diff/$OLDVERSION_to_$NEWVERSION/"}.
* <p>{@code "./gradlew apiDiff -PbaselineVersion=5.1.0.RELEASE"} will output the
* reports for the API diff between the baseline version and the current one for all modules.
* You can limit the report to a single module with
* {@code "./gradlew :spring-core:apiDiff -PbaselineVersion=5.1.0.RELEASE"}.
*
* @author Brian Clozel
*/
public class ApiDiffPlugin implements Plugin<Project> {
public static final String TASK_NAME = "apiDiff";
private static final String BASELINE_VERSION_PROPERTY = "baselineVersion";
private static final List<String> PACKAGE_INCLUDES = Collections.singletonList("org.springframework.*");
@Override
public void apply(Project project) {
if (project.hasProperty(BASELINE_VERSION_PROPERTY) && project.equals(project.getRootProject())) {
project.getPluginManager().apply(JapicmpPlugin.class);
project.getPlugins().withType(JapicmpPlugin.class,
plugin -> applyApiDiffConventions(project));
}
}
private void applyApiDiffConventions(Project project) {
String baselineVersion = project.property(BASELINE_VERSION_PROPERTY).toString();
project.subprojects(subProject -> createApiDiffTask(baselineVersion, subProject));
}
private void createApiDiffTask(String baselineVersion, Project project) {
if (isProjectEligible(project)) {
JapicmpTask apiDiff = project.getTasks().create(TASK_NAME, JapicmpTask.class);
apiDiff.setDescription("Generates an API diff report with japicmp");
apiDiff.setGroup(JavaBasePlugin.DOCUMENTATION_GROUP);
apiDiff.setOldClasspath(project.files(createBaselineConfiguration(baselineVersion, project)));
TaskProvider<Jar> jar = project.getTasks().withType(Jar.class).named("jar");
apiDiff.setNewArchives(project.getLayout().files(jar.get().getArchiveFile().get().getAsFile()));
apiDiff.setNewClasspath(getRuntimeClassPath(project));
apiDiff.setPackageIncludes(PACKAGE_INCLUDES);
apiDiff.setOnlyModified(true);
apiDiff.setIgnoreMissingClasses(true);
// Ignore Kotlin metadata annotations since they contain
// illegal HTML characters and fail the report generation
apiDiff.setAnnotationExcludes(Collections.singletonList("@kotlin.Metadata"));
apiDiff.setHtmlOutputFile(getOutputFile(baselineVersion, project));
apiDiff.dependsOn(project.getTasks().getByName("jar"));
}
}
private boolean isProjectEligible(Project project) {
return project.getPlugins().hasPlugin(JavaPlugin.class)
&& project.getPlugins().hasPlugin(MavenPublishPlugin.class);
}
private Configuration createBaselineConfiguration(String baselineVersion, Project project) {
String baseline = String.join(":",
project.getGroup().toString(), project.getName(), baselineVersion);
Dependency baselineDependency = project.getDependencies().create(baseline + "@jar");
return project.getRootProject().getConfigurations().detachedConfiguration(baselineDependency);
}
private Configuration getRuntimeClassPath(Project project) {
return project.getConfigurations().getByName(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME);
}
private File getOutputFile(String baseLineVersion, Project project) {
Path outDir = Paths.get(project.getRootProject().getBuildDir().getAbsolutePath(),
"reports", "api-diff",
baseLineVersion + "_to_" + project.getRootProject().getVersion());
return project.file(outDir.resolve(project.getName() + ".html").toString());
}
}
@@ -0,0 +1,102 @@
/*
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.build.compile;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.gradle.api.JavaVersion;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.plugins.JavaPlugin;
import org.gradle.api.plugins.JavaPluginConvention;
import org.gradle.api.tasks.compile.JavaCompile;
/**
* {@link Plugin} that applies conventions for compiling Java sources in Spring Framework.
* <p>One can override the default Java source compatibility version
* with a dedicated property on the CLI: {@code "./gradlew test -PjavaSourceVersion=11"}.
*
* @author Brian Clozel
*/
public class CompilerConventionsPlugin implements Plugin<Project> {
/**
* The project property that can be used to switch the Java source
* compatibility version for building source and test classes.
*/
public static String JAVA_SOURCE_VERSION_PROPERTY = "javaSourceVersion";
public static JavaVersion DEFAULT_COMPILER_VERSION = JavaVersion.VERSION_1_8;
private static List<String> COMPILER_ARGS;
private static List<String> TEST_COMPILER_ARGS;
static {
List<String> commonCompilerArgs = Arrays.asList(
"-Xlint:serial", "-Xlint:cast", "-Xlint:classfile", "-Xlint:dep-ann",
"-Xlint:divzero", "-Xlint:empty", "-Xlint:finally", "-Xlint:overrides",
"-Xlint:path", "-Xlint:processing", "-Xlint:static", "-Xlint:try", "-Xlint:-options"
);
COMPILER_ARGS = new ArrayList<>();
COMPILER_ARGS.addAll(commonCompilerArgs);
COMPILER_ARGS.addAll(Arrays.asList(
"-Xlint:varargs", "-Xlint:fallthrough", "-Xlint:rawtypes", "-Xlint:deprecation",
"-Xlint:unchecked", "-Werror"
));
TEST_COMPILER_ARGS = new ArrayList<>();
TEST_COMPILER_ARGS.addAll(commonCompilerArgs);
TEST_COMPILER_ARGS.addAll(Arrays.asList("-Xlint:-varargs", "-Xlint:-fallthrough", "-Xlint:-rawtypes",
"-Xlint:-deprecation", "-Xlint:-unchecked", "-parameters"));
}
@Override
public void apply(Project project) {
project.getPlugins().withType(JavaPlugin.class, javaPlugin -> applyJavaCompileConventions(project));
}
/**
* Applies the common Java compiler options for sources and test sources.
* @param project the current project
*/
private void applyJavaCompileConventions(Project project) {
JavaPluginConvention java = project.getConvention().getPlugin(JavaPluginConvention.class);
if (project.hasProperty(JAVA_SOURCE_VERSION_PROPERTY)) {
JavaVersion javaSourceVersion = JavaVersion.toVersion(project.property(JAVA_SOURCE_VERSION_PROPERTY));
java.setSourceCompatibility(javaSourceVersion);
}
else {
java.setSourceCompatibility(DEFAULT_COMPILER_VERSION);
}
java.setTargetCompatibility(DEFAULT_COMPILER_VERSION);
project.getTasks().withType(JavaCompile.class)
.matching(javaCompile -> javaCompile.getName().equals(JavaPlugin.COMPILE_JAVA_TASK_NAME))
.forEach(compileTask -> {
compileTask.getOptions().setCompilerArgs(COMPILER_ARGS);
compileTask.getOptions().setEncoding("UTF-8");
});
project.getTasks().withType(JavaCompile.class)
.matching(javaCompile -> javaCompile.getName().equals(JavaPlugin.COMPILE_TEST_JAVA_TASK_NAME))
.forEach(compileTask -> {
compileTask.getOptions().setCompilerArgs(TEST_COMPILER_ARGS);
compileTask.getOptions().setEncoding("UTF-8");
});
}
}
@@ -0,0 +1,64 @@
/*
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.build.optional;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.artifacts.Configuration;
import org.gradle.api.plugins.JavaPlugin;
import org.gradle.api.plugins.JavaPluginConvention;
import org.gradle.api.tasks.SourceSetContainer;
import org.gradle.plugins.ide.eclipse.EclipsePlugin;
import org.gradle.plugins.ide.eclipse.model.EclipseModel;
/**
* A {@code Plugin} that adds support for Maven-style optional dependencies. Creates a new
* {@code optional} configuration. The {@code optional} configuration is part of the
* project's compile and runtime classpath's but does not affect the classpath of
* dependent projects.
*
* @author Andy Wilkinson
*/
public class OptionalDependenciesPlugin implements Plugin<Project> {
/**
* Name of the {@code optional} configuration.
*/
public static final String OPTIONAL_CONFIGURATION_NAME = "optional";
@Override
public void apply(Project project) {
Configuration optional = project.getConfigurations().create("optional");
project.getPlugins().withType(JavaPlugin.class, (javaPlugin) -> {
SourceSetContainer sourceSets = project.getConvention()
.getPlugin(JavaPluginConvention.class).getSourceSets();
sourceSets.all((sourceSet) -> {
sourceSet.setCompileClasspath(
sourceSet.getCompileClasspath().plus(optional));
sourceSet.setRuntimeClasspath(
sourceSet.getRuntimeClasspath().plus(optional));
});
});
project.getPlugins().withType(EclipsePlugin.class, (eclipePlugin) -> {
project.getExtensions().getByType(EclipseModel.class)
.classpath((classpath) -> {
classpath.getPlusConfigurations().add(optional);
});
});
}
}
@@ -1 +0,0 @@
implementation-class=org.springframework.build.gradle.TestSourceSetDependenciesPlugin
+29
View File
@@ -0,0 +1,29 @@
description = "Spring Framework (Bill of Materials)"
apply plugin: 'java-platform'
apply from: "$rootDir/gradle/publications.gradle"
group = "org.springframework"
dependencies {
constraints {
parent.moduleProjects.sort { "$it.name" }.each {
api it
}
}
}
publishing {
publications {
mavenJava(MavenPublication) {
artifactId = 'spring-framework-bom'
from components.javaPlatform
// remove scope information from published BOM
pom.withXml {
asNode().dependencyManagement.first().dependencies.first().each {
it.remove(it.scope.first())
}
}
}
}
}
+4 -1
View File
@@ -1 +1,4 @@
version=5.1.11.BUILD-SNAPSHOT
version=5.2.3.RELEASE
org.gradle.jvmargs=-Xmx1536M
org.gradle.caching=true
org.gradle.parallel=true
+18
View File
@@ -0,0 +1,18 @@
buildCache {
local {
enabled = true
}
remote(HttpBuildCache) {
enabled = true
url = 'https://ge.spring.io/cache/'
def cacheUsername = System.getenv('GRADLE_ENTERPRISE_CACHE_USERNAME')
def cachePassword = System.getenv('GRADLE_ENTERPRISE_CACHE_PASSWORD')
if (cacheUsername && cachePassword) {
push = true
credentials {
username = cacheUsername
password = cachePassword
}
}
}
}
+90
View File
@@ -0,0 +1,90 @@
tagOs()
tagIde()
tagCiOrLocal()
addCiMetadata()
addGitMetadata()
addTestTaskMetadata()
void tagOs() {
buildScan.tag System.getProperty('os.name')
}
void tagIde() {
if (System.getProperty('idea.version')) {
buildScan.tag 'IntelliJ IDEA'
} else if (System.getProperty('eclipse.buildId')) {
buildScan.tag 'Eclipse'
}
}
void tagCiOrLocal() {
buildScan.tag(isCi() ? 'CI' : 'LOCAL')
}
void addGitMetadata() {
buildScan.background {
def gitCommitId = execAndGetStdout('git', 'rev-parse', '--short=8', '--verify', 'HEAD')
def gitBranchName = execAndGetStdout('git', 'rev-parse', '--abbrev-ref', 'HEAD')
def gitStatus = execAndGetStdout('git', 'status', '--porcelain')
if(gitCommitId) {
def commitIdLabel = 'Git Commit ID'
value commitIdLabel, gitCommitId
link 'Git commit build scans', customValueSearchUrl([(commitIdLabel): gitCommitId])
}
if (gitBranchName) {
tag gitBranchName
value 'Git branch', gitBranchName
}
if (gitStatus) {
tag 'dirty'
value 'Git status', gitStatus
}
}
}
void addCiMetadata() {
def ciBuild = 'CI BUILD'
if (isBamboo()) {
buildScan.link ciBuild, System.getenv('bamboo_resultsUrl')
}
}
void addTestTaskMetadata() {
allprojects {
tasks.withType(Test) { test ->
doFirst {
buildScan.value "Test#maxParallelForks[${test.path}]", test.maxParallelForks.toString()
}
}
}
}
boolean isCi() {
isBamboo()
}
boolean isBamboo() {
System.getenv('bamboo_resultsUrl')
}
String execAndGetStdout(String... args) {
def stdout = new ByteArrayOutputStream()
exec {
commandLine(args)
standardOutput = stdout
}
return stdout.toString().trim()
}
String customValueSearchUrl(Map<String, String> search) {
def query = search.collect { name, value ->
"search.names=${encodeURL(name)}&search.values=${encodeURL(value)}"
}.join('&')
"$buildScan.server/scans?$query"
}
String encodeURL(String url) {
URLEncoder.encode(url, 'UTF-8')
}
+127 -116
View File
@@ -1,76 +1,80 @@
/*
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
configurations {
asciidoctorExt
}
dependencies {
asciidoctorExt("io.spring.asciidoctor:spring-asciidoctor-extensions:0.2.0.RELEASE")
}
/**
* Produce Javadoc for all Spring Framework modules in "build/docs/javadoc"
*/
task api(type: Javadoc) {
group = "Documentation"
description = "Generates aggregated Javadoc API documentation."
title = "${rootProject.description} ${version} API"
dependsOn {
subprojects.collect {
moduleProjects.collect {
it.tasks.getByName("jar")
}
}
options.encoding = "UTF-8"
options.memberLevel = org.gradle.external.javadoc.JavadocMemberLevel.PROTECTED
options.author = true
options.header = rootProject.description
options.use = true
options.overview = "src/docs/api/overview.html"
options.stylesheetFile = file("src/docs/api/stylesheet.css")
options.splitIndex = true
options.links(project.ext.javadocLinks)
options.addStringOption('Xdoclint:none', '-quiet')
source subprojects.collect { project ->
project.sourceSets.main.allJava
}
maxMemory = "1024m"
destinationDir = new File(buildDir, "api")
doFirst {
classpath = files(
// ensure the javadoc process can resolve types compiled from .aj sources
project(":spring-aspects").sourceSets.main.output
)
classpath += files(subprojects.collect { it.sourceSets.main.compileClasspath })
classpath += files(moduleProjects.collect { it.sourceSets.main.compileClasspath })
}
options {
encoding = "UTF-8"
memberLevel = JavadocMemberLevel.PROTECTED
author = true
header = rootProject.description
use = true
overview = "src/docs/api/overview.html"
stylesheetFile = file("src/docs/api/stylesheet.css")
splitIndex = true
links(project.ext.javadocLinks)
addStringOption('Xdoclint:none', '-quiet')
if(JavaVersion.current().isJava9Compatible()) {
addBooleanOption('html5', true)
}
}
source moduleProjects.collect { project ->
project.sourceSets.main.allJava
}
maxMemory = "1024m"
destinationDir = file("$buildDir/docs/javadoc")
}
/**
* Produce KDoc for all Spring Framework modules in "build/docs/kdoc"
*/
dokka {
dependsOn {
tasks.getByName("api")
}
doFirst {
classpath = subprojects.collect { project -> project.jar.outputs.files.getFiles() }.flatten()
classpath += files(subprojects.collect { it.sourceSets.main.compileClasspath })
classpath = moduleProjects.collect { project -> project.jar.outputs.files.getFiles() }.flatten()
classpath += files(moduleProjects.collect { it.sourceSets.main.compileClasspath })
sourceDirs = files(moduleProjects
.findAll {
it.pluginManager.hasPlugin("kotlin")
}
.collect { project ->
def kotlinDirs = project.sourceSets.main.kotlin.srcDirs.collect()
kotlinDirs -= project.sourceSets.main.java.srcDirs
})
}
moduleName = "spring-framework"
outputFormat = "html"
outputDirectory = "$buildDir/docs/kdoc"
sourceDirs = files(subprojects.collect { project ->
def kotlinDirs = project.sourceSets.main.kotlin.srcDirs.collect()
kotlinDirs -= project.sourceSets.main.java.srcDirs
})
externalDocumentationLink {
url = new URL("https://docs.spring.io/spring-framework/docs/$version/javadoc-api/")
packageListUrl = new File(buildDir, "api/package-list").toURI().toURL()
packageListUrl = new File(buildDir, "docs/javadoc/package-list").toURI().toURL()
}
externalDocumentationLink {
url = new URL("https://projectreactor.io/docs/core/release/api/")
@@ -78,85 +82,121 @@ dokka {
externalDocumentationLink {
url = new URL("https://www.reactive-streams.org/reactive-streams-1.0.1-javadoc/")
}
externalDocumentationLink {
url = new URL("https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/")
}
}
task downloadResources(type: Download) {
def version = "0.1.3.RELEASE"
src "https://repo.spring.io/release/io/spring/docresources/" +
"spring-doc-resources/$version/spring-doc-resources-${version}.zip"
dest project.file("$buildDir/docs/spring-doc-resources.zip")
onlyIfModified true
useETag "all"
}
task extractDocResources(type: Copy, dependsOn: downloadResources) {
from project.zipTree(downloadResources.dest);
into "$buildDir/docs/spring-docs-resources/"
}
asciidoctorj {
modules {
pdf {
version '1.5.0-beta.8'
}
}
}
/**
* Produce the Spring Framework Reference documentation
* from "src/docs/asciidoc" into "build/asciidoc/html5"
*/
asciidoctor {
baseDirFollowsSourceDir()
configurations 'asciidoctorExt'
sources {
include '*.adoc'
}
outputDir "$buildDir/docs/ref-docs/"
resources {
from(sourceDir) {
include 'images/*', 'stylesheets/*', 'tocbot-3.0.2/*'
include 'images/*', 'css/**', 'js/**'
}
from extractDocResources
}
logDocuments = true
backends = ["html5"]
// only ouput PDF documentation for non-SNAPSHOT builds
if(!project.getVersion().toString().contains("BUILD-SNAPSHOT")) {
backends += "pdf"
outputOptions {
backends = ["html5", "pdf"]
}
options doctype: 'book', eruby: 'erubis'
attributes 'icons': 'font',
'idprefix': '',
'idseparator': '-',
docinfo: '',
attributes([
icons: 'font',
idprefix: '',
idseparator: '-',
docinfo: 'shared',
revnumber: project.version,
sectanchors: '',
sectnums: '',
'source-highlighter': 'coderay@', // TODO switch to 'rouge' once supported by the html5 backend
stylesdir: 'stylesheets/',
stylesheet: 'main.css',
'source-highlighter': 'highlight.js',
highlightjsdir: 'js/highlight',
'highlightjs-theme': 'github',
stylesdir: 'css/',
stylesheet: 'stylesheet.css',
'spring-version': project.version
])
}
/**
* Zip all docs (API and reference) into a single archive
*/
task docsZip(type: Zip, dependsOn: ['api', 'asciidoctor', 'dokka']) {
group = "Distribution"
baseName = "spring-framework"
classifier = "docs"
description = "Builds -${classifier} archive containing api and reference " +
description = "Builds -${archiveClassifier} archive containing api and reference " +
"for deployment at https://docs.spring.io/spring-framework/docs."
archiveBaseName.set("spring-framework")
archiveClassifier.set("docs")
from("src/dist") {
include "changelog.txt"
}
from (api) {
into "javadoc-api"
}
from ("$asciidoctor.outputDir/html5") {
into "spring-framework-reference"
}
from ("$asciidoctor.outputDir/pdf") {
into "spring-framework-reference/pdf"
}
from (dokka) {
into "kdoc-api"
}
}
/**
* Zip all Spring Framework schemas into a single archive
*/
task schemaZip(type: Zip) {
group = "Distribution"
baseName = "spring-framework"
classifier = "schema"
description = "Builds -${classifier} archive containing all " +
archiveBaseName.set("spring-framework")
archiveClassifier.set("schema")
description = "Builds -${archiveClassifier} archive containing all " +
"XSDs for deployment at https://springframework.org/schema."
duplicatesStrategy 'exclude'
moduleProjects.each { subproject ->
duplicatesStrategy DuplicatesStrategy.EXCLUDE
moduleProjects.each { module ->
def Properties schemas = new Properties();
subproject.sourceSets.main.resources.find {
it.path.endsWith("META-INF/spring.schemas")
module.sourceSets.main.resources.find {
(it.path.endsWith("META-INF/spring.schemas") || it.path.endsWith("META-INF\\spring.schemas"))
}?.withInputStream { schemas.load(it) }
for (def key : schemas.keySet()) {
def shortName = key.replaceAll(/http.*schema.(.*).spring-.*/, '$1')
assert shortName != key
File xsdFile = subproject.sourceSets.main.resources.find {
it.path.endsWith(schemas.get(key))
File xsdFile = module.sourceSets.main.resources.find {
(it.path.endsWith(schemas.get(key)) || it.path.endsWith(schemas.get(key).replaceAll('\\/','\\\\')))
}
assert xsdFile != null
into (shortName) {
@@ -166,15 +206,18 @@ task schemaZip(type: Zip) {
}
}
/**
* Create a distribution zip with everything:
* docs, schemas, jars, source jars, javadoc jars
*/
task distZip(type: Zip, dependsOn: [docsZip, schemaZip]) {
group = "Distribution"
baseName = "spring-framework"
classifier = "dist"
description = "Builds -${classifier} archive, containing all jars and docs, " +
archiveBaseName.set("spring-framework")
archiveClassifier.set("dist")
description = "Builds -${archiveClassifier} archive, containing all jars and docs, " +
"suitable for community download page."
ext.baseDir = "${baseName}-${project.version}";
ext.baseDir = "spring-framework-${project.version}";
from("src/docs/dist") {
include "readme.txt"
@@ -192,49 +235,17 @@ task distZip(type: Zip, dependsOn: [docsZip, schemaZip]) {
into "${baseDir}/schema"
}
moduleProjects.each { subproject ->
moduleProjects.each { module ->
into ("${baseDir}/libs") {
from subproject.jar
if (subproject.tasks.findByPath("sourcesJar")) {
from subproject.sourcesJar
from module.jar
if (module.tasks.findByPath("sourcesJar")) {
from module.sourcesJar
}
if (subproject.tasks.findByPath("javadocJar")) {
from subproject.javadocJar
if (module.tasks.findByPath("javadocJar")) {
from module.javadocJar
}
}
}
}
distZip.mustRunAfter subprojects.test
// Create a distribution that contains all dependencies (required and optional).
// Not published by default; only for use when building from source.
task depsZip(type: Zip, dependsOn: distZip) { zipTask ->
group = "Distribution"
baseName = "spring-framework"
classifier = "dist-with-deps"
description = "Builds -${classifier} archive, containing everything " +
"in the -${distZip.classifier} archive plus all runtime dependencies."
from zipTree(distZip.archivePath)
gradle.taskGraph.whenReady { taskGraph ->
if (taskGraph.hasTask(":${zipTask.name}")) {
def projectNames = rootProject.subprojects*.name
def artifacts = new HashSet()
subprojects.each { subproject ->
(subproject.configurations.runtime.resolvedConfiguration.resolvedArtifacts +
subproject.configurations.optional.resolvedConfiguration.resolvedArtifacts).each { artifact ->
def dependency = artifact.moduleVersion.id
if (!projectNames.contains(dependency.name)) {
artifacts << artifact.file
}
}
}
zipTask.from(artifacts) {
into "${distZip.baseDir}/deps"
}
}
}
}
distZip.mustRunAfter moduleProjects.check
+1 -3
View File
@@ -1,9 +1,7 @@
import org.gradle.plugins.ide.eclipse.model.ProjectDependency
import org.gradle.plugins.ide.eclipse.model.SourceFolder
apply plugin: "propdeps-eclipse"
apply plugin: "propdeps-idea"
apply plugin: "eclipse"
eclipse.jdt {
sourceCompatibility = 1.8
-76
View File
@@ -1,76 +0,0 @@
/**
* Generate a JDiff report between the current version and an older version.
*
* Usage:
* gradle jdiff -D OLD_VERSION=3.1.3.RELEASE -D OLD_VERSION_ROOT=/path/to/3.1.3.RELEASE
*
* View generated report at:
* build/reports/jdiff/changes.html
*
* @param OLD_VERSION required
* @param OLD_VERSION_ROOT required, typically pointing to a separate git clone dir
*/
task jdiff {
description = "Generates a JDiff report"
group = "Documentation"
def jdiffHome = "${rootProject.rootDir}/gradle/jdiff"
ant.taskdef(
name: "jdiff",
classname: "jdiff.JDiffAntTask",
classpath: "${jdiffHome}/antjdiff.jar")
def currentVersion = rootProject.version
def currentVersionRoot = rootProject.rootDir
def oldVersion = System.getProperty("OLD_VERSION")
def oldVersionRoot = System.getProperty("OLD_VERSION_ROOT")
def outputDir = "${rootProject.buildDir}/reports/jdiff/${oldVersion}_to_${currentVersion}"
doLast {
if (oldVersion == null)
throw new IllegalArgumentException(
"Set OLD_VERSION property to indicate older of the two versions being compared")
if (oldVersionRoot == null)
throw new IllegalArgumentException(
"Set OLD_VERSION_ROOT property to indicate the root directory for ${oldVersion}")
oldVersionRoot = new File(oldVersionRoot)
ant.property(name: "JDIFF_HOME", value: jdiffHome)
ant.mkdir(dir: outputDir)
ant.jdiff(
destdir: outputDir,
source: "1.8",
verbose: "off",
stats: "on",
docchanges: "off") {
old(name: "Spring Framework ${oldVersion}") {
oldVersionRoot.eachDirMatch( {
def candidate = new File(it)
candidate.name.matches("org.springframework.*") ||
candidate.name.matches("spring-.*") }) { match ->
match.eachDirRecurse { subdir ->
if (subdir.path ==~ '.*/src/main/java$') {
dirset(dir: subdir.path, includes: "org/**")
}
}
}
}
"new"(name: "Spring Framework ${currentVersion}") {
currentVersionRoot.eachDirMatch( {
def candidate = new File(it)
candidate.name.matches("org.springframework.*") ||
candidate.name.matches("spring-.*") }) { match ->
match.eachDirRecurse { subdir ->
if (subdir.path ==~ '.*/src/main/java$') {
dirset(dir: subdir.path, includes: "org/**")
}
}
}
}
}
}
}
-506
View File
@@ -1,506 +0,0 @@
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some
specially designated software packages--typically libraries--of the
Free Software Foundation and other authors who decide to use it. You
can use it too, but we suggest you first think carefully about whether
this license or the ordinary General Public License is the better
strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use,
not price. Our General Public Licenses are designed to make sure that
you have the freedom to distribute copies of free software (and charge
for this service if you wish); that you receive source code or can get
it if you want it; that you can change the software and use pieces of
it in new free programs; and that you are informed that you can do
these things.
To protect your rights, we need to make restrictions that forbid
distributors to deny you these rights or to ask you to surrender these
rights. These restrictions translate to certain responsibilities for
you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you. You must make sure that they, too, receive or can get the source
code. If you link other code with the library, you must provide
complete object files to the recipients, so that they can relink them
with the library after making changes to the library and recompiling
it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the
library, and (2) we offer you this license, which gives you legal
permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that
there is no warranty for the free library. Also, if the library is
modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.
Finally, software patents pose a constant threat to the existence of
any free program. We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
restrictive license from a patent holder. Therefore, we insist that
any patent license obtained for a version of the library must be
consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the
ordinary GNU General Public License. This license, the GNU Lesser
General Public License, applies to certain designated libraries, and
is quite different from the ordinary General Public License. We use
this license for certain libraries in order to permit linking those
libraries into non-free programs.
When a program is linked with a library, whether statically or using
a shared library, the combination of the two is legally speaking a
combined work, a derivative of the original library. The ordinary
General Public License therefore permits such linking only if the
entire combination fits its criteria of freedom. The Lesser General
Public License permits more lax criteria for linking other code with
the library.
We call this license the "Lesser" General Public License because it
does Less to protect the user's freedom than the ordinary General
Public License. It also provides other free software developers Less
of an advantage over competing non-free programs. These disadvantages
are the reason we use the ordinary General Public License for many
libraries. However, the Lesser license provides advantages in certain
special circumstances.
For example, on rare occasions, there may be a special need to
encourage the widest possible use of a certain library, so that it becomes
a de-facto standard. To achieve this, non-free programs must be
allowed to use the library. A more frequent case is that a free
library does the same job as widely used non-free libraries. In this
case, there is little to gain by limiting the free library to free
software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free
programs enables a greater number of people to use a large body of
free software. For example, permission to use the GNU C Library in
non-free programs enables many more people to use the whole GNU
operating system, as well as its variant, the GNU/Linux operating
system.
Although the Lesser General Public License is Less protective of the
users' freedom, it does ensure that the user of a program that is
linked with the Library has the freedom and the wherewithal to run
that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and
modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.
GNU LESSER GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other
program which contains a notice placed by the copyright holder or
other authorized party saying it may be distributed under the terms of
this Lesser General Public License (also called "this License").
Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work
which has been distributed under these terms. A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language. (Hereinafter, translation is
included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for
making modifications to it. For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control compilation
and installation of the library.
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it). Whether that is true depends on what the Library does
and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.
You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.
2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices
stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no
charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a
table of data to be supplied by an application program that uses
the facility, other than as an argument passed when the facility
is invoked, then you must make a good faith effort to ensure that,
in the event an application does not supply such function or
table, the facility still operates, and performs whatever part of
its purpose remains meaningful.
(For example, a function in a library to compute square roots has
a purpose that is entirely well-defined independent of the
application. Therefore, Subsection 2d requires that any
application-supplied function or table used by this function must
be optional: if the application does not supply it, the square
root function must still compute square roots.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.
In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library. To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License. (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.) Do not make any other change in
these notices.
Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.
If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library". Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library". The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library. The
threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work. (Executables containing this object code plus portions of the
Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License. You must supply a copy of this License. If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License. Also, you must do one
of these things:
a) Accompany the work with the complete corresponding
machine-readable source code for the Library including whatever
changes were used in the work (which must be distributed under
Sections 1 and 2 above); and, if the work is an executable linked
with the Library, with the complete machine-readable "work that
uses the Library", as object code and/or source code, so that the
user can modify the Library and then relink to produce a modified
executable containing the modified Library. (It is understood
that the user who changes the contents of definitions files in the
Library will not necessarily be able to recompile the application
to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (1) uses at run time a
copy of the library already present on the user's computer system,
rather than copying library functions into the executable, and (2)
will operate properly with a modified version of the library, if
the user installs one, as long as the modified version is
interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at
least three years, to give the same user the materials
specified in Subsection 6a, above, for a charge no more
than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy
from a designated place, offer equivalent access to copy the above
specified materials from the same place.
e) Verify that the user has already received a copy of these
materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it. However, as a special exception,
the materials to be distributed need not include anything that is
normally distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.
It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system. Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.
7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work
based on the Library, uncombined with any other library
facilities. This must be distributed under the terms of the
Sections above.
b) Give prominent notice with the combined library of the fact
that part of it is a work based on the Library, and explaining
where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License. Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License. However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Library or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with
this License.
11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all. For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply,
and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License may add
an explicit geographical distribution limitation excluding those countries,
so that distribution is permitted only in or among countries not thus
excluded. In such case, this License incorporates the limitation as if
written in the body of this License.
13. The Free Software Foundation may publish revised and/or new
versions of the Lesser General Public License from time to time.
Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation. If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission. For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this. Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest
possible use to the public, we recommend making it free software that
everyone can redistribute and change. You can do so by permitting
redistribution under these terms (or, alternatively, under the terms of the
ordinary General Public License).
To apply these terms, attach the following notices to the library. It is
safest to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.
<one line to give the library's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the library, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
<signature of Ty Coon>, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!
-9
View File
@@ -1,9 +0,0 @@
/**
* This class is used only as a "null" argument for Javadoc when comparing
* two API files. Javadoc has to have a package, .java or .class file as an
* argument, even though JDiff doesn't use it.
*/
public class Null {
public Null() {
}
}
-6
View File
@@ -1,6 +0,0 @@
This distribution of JDiff 1.1.1 is included in the Spring Framework build
because JDiff has a hard requirement on a JDIFF_HOME directory containing
jdiff.jar and xerces.jar as well as other presentation resources.
The actual generation of JDiff reports is driven by the `jdiff` task declared
in build.gradle in the project root.
-59
View File
@@ -1,59 +0,0 @@
JDiff Doclet
------------
Matthew Doar
mdoar@pobox.com
The JDiff doclet is used to generate a report describing the
difference between two public Java APIs.
The file jdiff.html contains the reference page for JDiff. The latest
version of JDiff can be downloaded at:
https://sourceforge.net/projects/javadiff
To use the Ant task on your own project, see example.xml. More examples
of using JDiff to compare the public APIs of J2SE1.3 and J2SE1.4 can
be seen at http://www.jdiff.org
For an example with the source distribution, run "ant" and
look at the HTML output in ./build/reports/example/changes.html
The page at ./build/reports/example/changes/com.acme.sp.SPImpl.html
shows what a typical page of changes looks like.
System Requirements
-------------------
JDiff has been tested with all releases of Java since J2SE1.2 but
releases of JDiff after 1.10.0 focus on JDK1.5.
License
-------
JDiff is licensed under the Lesser GNU General Public License (LGPL).
See the file LICENSE.txt.
Acknowledgements
----------------
JDiff uses Stuart D. Gathman's Java translation of Gene Myers' O(ND)
difference algorithm.
JDiff uses Xerces 1.4.2 from https://www.apache.org.
JDiff also includes a script to use the classdoc application from
http://classdoc.sourceforge.net or http://www.jensgulden.de, by Jens
Gulden, (mail@jensgulden.de), to call a doclet such as jdiff on a .jar
file rather than on source.
Many thanks to the reviewers at Sun and Vitria who gave feedback on early
versions of JDiff output, and also to the distillers of Laphroaig, and to
Arturo Fuente for his consistently fine cigars which helped inspire
much of this work.
Footnote:
If you are looking for a generalized diff tool for XML, try diffmk from
https://wwws.sun.com/software/xml/developers/diffmk/
Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 559 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 799 B

File diff suppressed because it is too large Load Diff
Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 B

Binary file not shown.
+55
View File
@@ -0,0 +1,55 @@
apply plugin: "maven-publish"
apply plugin: 'com.jfrog.artifactory'
publishing {
publications {
mavenJava(MavenPublication) {
pom {
afterEvaluate {
name = project.description
description = project.description
}
url = "https://github.com/spring-projects/spring-framework"
organization {
name = "Spring IO"
url = "https://spring.io/projects/spring-framework"
}
licenses {
license {
name = "Apache License, Version 2.0"
url = "https://www.apache.org/licenses/LICENSE-2.0"
distribution = "repo"
}
}
scm {
url = "https://github.com/spring-projects/spring-framework"
connection = "scm:git:git://github.com/spring-projects/spring-framework"
developerConnection = "scm:git:git://github.com/spring-projects/spring-framework"
}
developers {
developer {
id = "jhoeller"
name = "Juergen Hoeller"
email = "jhoeller@pivotal.io"
}
}
issueManagement {
system = "GitHub"
url = "https://github.com/spring-projects/spring-framework/issues"
}
}
versionMapping {
usage('java-api') {
fromResolutionResult()
}
usage('java-runtime') {
fromResolutionResult()
}
}
}
}
}
artifactoryPublish {
publications(publishing.publications.mavenJava)
}
-60
View File
@@ -1,60 +0,0 @@
apply plugin: "propdeps-maven"
install {
repositories.mavenInstaller {
customizePom(pom, project)
}
}
def customizePom(pom, gradleProject) {
pom.whenConfigured { generatedPom ->
// eliminate test-scoped dependencies (no need in maven central poms)
generatedPom.dependencies.removeAll { dep ->
dep.scope == "test"
}
// sort to make pom dependencies order consistent to ease comparison of older poms
generatedPom.dependencies = generatedPom.dependencies.sort { dep ->
"$dep.scope:$dep.groupId:$dep.artifactId"
}
def managedVersions = dependencyManagement.managedVersions
generatedPom.dependencies.findAll{dep -> !dep.version }.each { dep ->
dep.version = managedVersions["${dep.groupId}:${dep.artifactId}"]
}
// add all items necessary for maven central publication
generatedPom.project {
name = gradleProject.description
description = gradleProject.description
url = "https://github.com/spring-projects/spring-framework"
organization {
name = "Spring IO"
url = "https://projects.spring.io/spring-framework"
}
licenses {
license {
name "Apache License, Version 2.0"
url "https://www.apache.org/licenses/LICENSE-2.0"
distribution "repo"
}
}
scm {
url = "https://github.com/spring-projects/spring-framework"
connection = "scm:git:git://github.com/spring-projects/spring-framework"
developerConnection = "scm:git:git://github.com/spring-projects/spring-framework"
}
developers {
developer {
id = "jhoeller"
name = "Juergen Hoeller"
email = "jhoeller@pivotal.io"
}
}
issueManagement {
system = "GitHub"
url = "https://github.com/spring-projects/spring-framework/issues"
}
}
}
}
+71
View File
@@ -0,0 +1,71 @@
apply plugin: 'org.springframework.build.compile'
apply plugin: 'org.springframework.build.optional-dependencies'
apply from: "$rootDir/gradle/publications.gradle"
jar {
manifest.attributes["Implementation-Title"] = project.name
manifest.attributes["Implementation-Version"] = project.version
manifest.attributes["Automatic-Module-Name"] = project.name.replace('-', '.') // for Jigsaw
manifest.attributes["Created-By"] =
"${System.getProperty("java.version")} (${System.getProperty("java.specification.vendor")})"
from("${rootDir}/src/docs/dist") {
include "license.txt"
include "notice.txt"
into "META-INF"
expand(copyright: new Date().format("yyyy"), version: project.version)
}
}
normalization {
runtimeClasspath {
ignore "META-INF/MANIFEST.MF"
}
}
javadoc {
description = "Generates project-level javadoc for use in -javadoc jar"
options.encoding = "UTF-8"
options.memberLevel = JavadocMemberLevel.PROTECTED
options.author = true
options.header = project.name
options.use = true
options.links(project.ext.javadocLinks)
options.addStringOption("Xdoclint:none", "-quiet")
// Suppress warnings due to cross-module @see and @link references.
// Note that global 'api' task does display all warnings.
logging.captureStandardError LogLevel.INFO
logging.captureStandardOutput LogLevel.INFO // suppress "## warnings" message
}
task sourcesJar(type: Jar, dependsOn: classes) {
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
archiveClassifier.set("sources")
from sourceSets.main.allSource
// Don't include or exclude anything explicitly by default. See SPR-12085.
}
task javadocJar(type: Jar) {
archiveClassifier.set("javadoc")
from javadoc
}
publishing {
publications {
mavenJava(MavenPublication) {
from components.java
artifact sourcesJar
artifact javadocJar
}
}
}
// Disable publication of test fixture artifacts.
//
// Once we upgrade to Gradle 6.x, we will need to delete the following line ...
components.java.variants.removeAll { it.outgoingConfiguration.name.startsWith("testFixtures") }
// ... and uncomment the following two lines.
// components.java.withVariantsFromConfiguration(configurations.testFixturesApiElements) { skip() }
// components.java.withVariantsFromConfiguration(configurations.testFixturesRuntimeElements) { skip() }
Binary file not shown.
+1 -1
View File
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.3-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Vendored
+19 -4
View File
@@ -1,5 +1,21 @@
#!/usr/bin/env sh
#
# Copyright 2015 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
##############################################################################
##
## Gradle start up script for UN*X
@@ -28,8 +44,7 @@ APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
GRADLE_OPTS="-XX:MaxMetaspaceSize=1024m -Xmx1024m $GRADLE_OPTS"
DEFAULT_JVM_OPTS=""
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
@@ -110,8 +125,8 @@ if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
# For Cygwin or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
Vendored
+17 -2
View File
@@ -1,3 +1,19 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@@ -14,8 +30,7 @@ set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set GRADLE_OPTS=-XX:MaxMetaspaceSize=1024m -Xmx1024m -XX:MaxHeapSize=256m %GRADLE_OPTS%
set DEFAULT_JVM_OPTS=
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
+31 -28
View File
@@ -1,46 +1,49 @@
# Spring Framework - Eclipse/STS Project Import Guide
This document will guide you through the process of importing the Spring Framework
projects into Eclipse or the Spring Tool Suite (STS). It is recommended that you have a
recent version of Eclipse or STS. As a bare minimum you will need Eclipse with full Java
8 support, the AspectJ Development Tools (AJDT), and the Groovy Compiler.
projects into Eclipse or the Spring Tool Suite (_STS_). It is recommended that you
have a recent version of Eclipse. As a bare minimum you will need Eclipse with full Java
8 support, Eclipse Buildship, the Kotlin plugin, and the Groovy plugin.
The following instructions have been tested against
[Spring Tool Suite](https://spring.io/tools) (_STS_) 3.9.4 and 4.0.0.M11 with
[Eclipse Buildship](https://projects.eclipse.org/projects/tools.buildship) (Eclipse
Plug-ins for Gradle). The instructions should work with the latest Eclipse distribution
as long as you install
The following instructions have been tested against [STS](https://spring.io/tools) 4.3.2
([download](https://github.com/spring-projects/sts4/wiki/Previous-Versions#spring-tools-432-changelog))
(based on Eclipse 4.12) with [Eclipse Buildship](https://projects.eclipse.org/projects/tools.buildship).
The instructions should work with the latest Eclipse distribution as long as you install
[Buildship](https://marketplace.eclipse.org/content/buildship-gradle-integration). Note
that STS 4 comes with Buildship preinstalled.
## Steps
_Within your locally cloned `spring-framework` working directory:_
_When instructed to execute `./gradlew` from the command line, be sure to execute it within your locally cloned `spring-framework` working directory._
1. Precompile `spring-oxm` with `./gradlew :spring-oxm:compileTestJava`
2. Import into Eclipse (File -> Import -> Gradle -> Existing Gradle Project -> Navigate
to directory -> Select Finish)
3. If prompted, exclude the `spring-aspects` module (or after the import by closing or
deleting the project)
4. In the `spring-oxm` project, add the two folders (`castor` and `jaxb`) in
`build/generated-sources` to the build path (right click on them and select
`Build Path -> Use as Source Folder`)
5. To apply project specific settings run `./gradlew eclipseBuildship`
7. Code away
1. Ensure that Eclipse launches with JDK 8.
- For example, on Mac OS this can be configured in the `Info.plist` file located in the `Contents` folder of the installed Eclipse or STS application (e.g., the `Eclipse.app` file).
1. Install the [Kotlin Plugin for Eclipse](https://marketplace.eclipse.org/content/kotlin-plugin-eclipse) in Eclipse.
1. Install the [Eclipse Groovy Development Tools](https://github.com/groovy/groovy-eclipse/wiki) in Eclipse.
1. Switch to Groovy 2.5 (Preferences -> Groovy -> Compiler -> Switch to 2.5...) in Eclipse.
1. Change the _Forbidden reference (access rule)_ in Eclipse from Error to Warning
(Preferences -> Java -> Compiler -> Errors/Warnings -> Deprecated and restricted API -> Forbidden reference (access rule)).
1. Optionally install the [AspectJ Development Tools](https://marketplace.eclipse.org/content/aspectj-development-tools) (_AJDT_) if you need to work with the `spring-aspects` project. The AspectJ Development Tools available in the Eclipse Marketplace have been tested with these instructions using STS 4.5 (Eclipse 4.14).
1. Optionally install the [TestNG plugin](https://testng.org/doc/eclipse.html) in Eclipse if you need to execute TestNG tests in the `spring-test` module.
1. Build `spring-oxm` from the command line with `./gradlew :spring-oxm:check`.
1. To apply project specific settings, run `./gradlew eclipseBuildship` from the command line.
1. Import into Eclipse (File -> Import -> Gradle -> Existing Gradle Project -> Navigate to the locally cloned `spring-framework` directory -> Select Finish).
- If you have not installed AJDT, exclude the `spring-aspects` project from the import, if prompted, or close it after the import.
- If you run into errors during the import, you may need to set the _Java home_ for Gradle Buildship to the location of your JDK 8 installation in Eclipse (Preferences -> Gradle -> Java home).
1. If you need to execute JAXB-related tests in the `spring-oxm` project and wish to have the generated sources available, add the `build/generated-sources/jaxb` folder to the build path (right click on the `jaxb` folder and select `Build Path -> Use as Source Folder`).
- If you do not see the `build` folder in the `spring-oxm` project, ensure that the "Gradle build folder" is not filtered out from the view. This setting is available under "Filters" in the configuration of the Package Explorer (available by clicking on the small downward facing arrow in the upper right corner of the Package Explorer).
1. Code away!
## Known Issues
1. `spring-core` and `spring-oxm` should be pre-compiled due to repackaged dependencies.
- See `*RepackJar` tasks in the build.
2. `spring-aspects` does not compile due to references to aspect types unknown to Eclipse.
- If you install [AJDT](https://www.eclipse.org/ajdt/downloads/) into Eclipse it should
work.
3. While JUnit tests pass from the command line with Gradle, some may fail when run from
- See `*RepackJar` tasks in the build.
1. `spring-aspects` does not compile due to references to aspect types unknown to Eclipse.
- If you installed _AJDT_ into Eclipse it should work.
1. While JUnit tests pass from the command line with Gradle, some may fail when run from
the IDE.
- Resolving this is a work in progress.
- If attempting to run all JUnit tests from within the IDE, you will likely need to set
the following VM options to avoid out of memory errors:
`-XX:MaxPermSize=2048m -Xmx2048m -XX:MaxHeapSize=2048m`
- Resolving this is a work in progress.
- If attempting to run all JUnit tests from within the IDE, you may need to set the following VM options to avoid out of memory errors: `-XX:MaxPermSize=2048m -Xmx2048m -XX:MaxHeapSize=2048m`
## Tips
@@ -0,0 +1,30 @@
description = "Spring Integration Tests"
dependencies {
testCompile(project(":spring-aop"))
testCompile(project(":spring-beans"))
testCompile(project(":spring-context"))
testCompile(project(":spring-core"))
testCompile(testFixtures(project(":spring-aop")))
testCompile(testFixtures(project(":spring-beans")))
testCompile(testFixtures(project(":spring-core")))
testCompile(testFixtures(project(":spring-tx")))
testCompile(project(":spring-expression"))
testCompile(project(":spring-jdbc"))
testCompile(project(":spring-orm"))
testCompile(project(":spring-test"))
testCompile(project(":spring-tx"))
testCompile(project(":spring-web"))
testCompile("javax.inject:javax.inject")
testCompile("javax.resource:javax.resource-api")
testCompile("javax.servlet:javax.servlet-api")
testCompile("org.aspectj:aspectjweaver")
testCompile("org.hsqldb:hsqldb")
testCompile("org.hibernate:hibernate-core")
}
normalization {
runtimeClasspath {
ignore "META-INF/MANIFEST.MF"
}
}
@@ -0,0 +1,137 @@
/*
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.aop.config;
import org.junit.jupiter.api.Test;
import org.springframework.aop.framework.Advised;
import org.springframework.aop.support.AopUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.testfixture.beans.ITestBean;
import org.springframework.beans.testfixture.beans.TestBean;
import org.springframework.core.testfixture.io.SerializationTestUtils;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpSession;
import org.springframework.test.context.junit.jupiter.web.SpringJUnitWebConfig;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Integration tests for scoped proxy use in conjunction with aop: namespace.
* Deemed an integration test because .web mocks and application contexts are required.
*
* @author Rob Harrop
* @author Juergen Hoeller
* @author Chris Beams
* @see org.springframework.aop.config.AopNamespaceHandlerTests
*/
@SpringJUnitWebConfig
class AopNamespaceHandlerScopeIntegrationTests {
@Autowired
ITestBean singletonScoped;
@Autowired
ITestBean requestScoped;
@Autowired
ITestBean sessionScoped;
@Autowired
ITestBean sessionScopedAlias;
@Autowired
ITestBean testBean;
@Test
void testSingletonScoping() throws Exception {
assertThat(AopUtils.isAopProxy(singletonScoped)).as("Should be AOP proxy").isTrue();
boolean condition = singletonScoped instanceof TestBean;
assertThat(condition).as("Should be target class proxy").isTrue();
String rob = "Rob Harrop";
String bram = "Bram Smeets";
assertThat(singletonScoped.getName()).isEqualTo(rob);
singletonScoped.setName(bram);
assertThat(singletonScoped.getName()).isEqualTo(bram);
ITestBean deserialized = (ITestBean) SerializationTestUtils.serializeAndDeserialize(singletonScoped);
assertThat(deserialized.getName()).isEqualTo(bram);
}
@Test
void testRequestScoping() throws Exception {
MockHttpServletRequest oldRequest = new MockHttpServletRequest();
MockHttpServletRequest newRequest = new MockHttpServletRequest();
RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(oldRequest));
assertThat(AopUtils.isAopProxy(requestScoped)).as("Should be AOP proxy").isTrue();
boolean condition = requestScoped instanceof TestBean;
assertThat(condition).as("Should be target class proxy").isTrue();
assertThat(AopUtils.isAopProxy(testBean)).as("Should be AOP proxy").isTrue();
boolean condition1 = testBean instanceof TestBean;
assertThat(condition1).as("Regular bean should be JDK proxy").isFalse();
String rob = "Rob Harrop";
String bram = "Bram Smeets";
assertThat(requestScoped.getName()).isEqualTo(rob);
requestScoped.setName(bram);
RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(newRequest));
assertThat(requestScoped.getName()).isEqualTo(rob);
RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(oldRequest));
assertThat(requestScoped.getName()).isEqualTo(bram);
assertThat(((Advised) requestScoped).getAdvisors().length > 0).as("Should have advisors").isTrue();
}
@Test
void testSessionScoping() throws Exception {
MockHttpSession oldSession = new MockHttpSession();
MockHttpSession newSession = new MockHttpSession();
MockHttpServletRequest request = new MockHttpServletRequest();
request.setSession(oldSession);
RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request));
assertThat(AopUtils.isAopProxy(sessionScoped)).as("Should be AOP proxy").isTrue();
boolean condition1 = sessionScoped instanceof TestBean;
assertThat(condition1).as("Should not be target class proxy").isFalse();
assertThat(sessionScopedAlias).isSameAs(sessionScoped);
assertThat(AopUtils.isAopProxy(testBean)).as("Should be AOP proxy").isTrue();
boolean condition = testBean instanceof TestBean;
assertThat(condition).as("Regular bean should be JDK proxy").isFalse();
String rob = "Rob Harrop";
String bram = "Bram Smeets";
assertThat(sessionScoped.getName()).isEqualTo(rob);
sessionScoped.setName(bram);
request.setSession(newSession);
assertThat(sessionScoped.getName()).isEqualTo(rob);
request.setSession(oldSession);
assertThat(sessionScoped.getName()).isEqualTo(bram);
assertThat(((Advised) sessionScoped).getAdvisors().length > 0).as("Should have advisors").isTrue();
}
}
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2013 the original author or authors.
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -22,23 +22,23 @@ import java.util.List;
import javax.servlet.ServletException;
import org.junit.Test;
import org.junit.jupiter.api.Test;
import org.springframework.aop.support.AopUtils;
import org.springframework.aop.support.StaticMethodMatcherPointcutAdvisor;
import org.springframework.aop.testfixture.advice.CountingBeforeAdvice;
import org.springframework.aop.testfixture.advice.MethodCounter;
import org.springframework.aop.testfixture.interceptor.NopInterceptor;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.testfixture.beans.ITestBean;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.lang.Nullable;
import org.springframework.tests.aop.advice.CountingBeforeAdvice;
import org.springframework.tests.aop.advice.MethodCounter;
import org.springframework.tests.aop.interceptor.NopInterceptor;
import org.springframework.tests.sample.beans.ITestBean;
import org.springframework.tests.transaction.CallCountingTransactionManager;
import org.springframework.transaction.NoTransactionException;
import org.springframework.transaction.interceptor.TransactionInterceptor;
import org.springframework.transaction.testfixture.CallCountingTransactionManager;
import static org.junit.Assert.*;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Integration tests for auto proxy creation by advisor recognition working in
@@ -49,7 +49,7 @@ import static org.junit.Assert.*;
* @author Rod Johnson
* @author Chris Beams
*/
public class AdvisorAutoProxyCreatorIntegrationTests {
class AdvisorAutoProxyCreatorIntegrationTests {
private static final Class<?> CLASS = AdvisorAutoProxyCreatorIntegrationTests.class;
private static final String CLASSNAME = CLASS.getSimpleName();
@@ -67,95 +67,95 @@ public class AdvisorAutoProxyCreatorIntegrationTests {
}
@Test
public void testDefaultExclusionPrefix() throws Exception {
void testDefaultExclusionPrefix() throws Exception {
DefaultAdvisorAutoProxyCreator aapc = (DefaultAdvisorAutoProxyCreator) getBeanFactory().getBean(ADVISOR_APC_BEAN_NAME);
assertEquals(ADVISOR_APC_BEAN_NAME + DefaultAdvisorAutoProxyCreator.SEPARATOR, aapc.getAdvisorBeanNamePrefix());
assertFalse(aapc.isUsePrefix());
assertThat(aapc.getAdvisorBeanNamePrefix()).isEqualTo((ADVISOR_APC_BEAN_NAME + DefaultAdvisorAutoProxyCreator.SEPARATOR));
assertThat(aapc.isUsePrefix()).isFalse();
}
/**
* If no pointcuts match (no attrs) there should be proxying.
*/
@Test
public void testNoProxy() throws Exception {
void testNoProxy() throws Exception {
BeanFactory bf = getBeanFactory();
Object o = bf.getBean("noSetters");
assertFalse(AopUtils.isAopProxy(o));
assertThat(AopUtils.isAopProxy(o)).isFalse();
}
@Test
public void testTxIsProxied() throws Exception {
void testTxIsProxied() throws Exception {
BeanFactory bf = getBeanFactory();
ITestBean test = (ITestBean) bf.getBean("test");
assertTrue(AopUtils.isAopProxy(test));
assertThat(AopUtils.isAopProxy(test)).isTrue();
}
@Test
public void testRegexpApplied() throws Exception {
void testRegexpApplied() throws Exception {
BeanFactory bf = getBeanFactory();
ITestBean test = (ITestBean) bf.getBean("test");
MethodCounter counter = (MethodCounter) bf.getBean("countingAdvice");
assertEquals(0, counter.getCalls());
assertThat(counter.getCalls()).isEqualTo(0);
test.getName();
assertEquals(1, counter.getCalls());
assertThat(counter.getCalls()).isEqualTo(1);
}
@Test
public void testTransactionAttributeOnMethod() throws Exception {
void testTransactionAttributeOnMethod() throws Exception {
BeanFactory bf = getBeanFactory();
ITestBean test = (ITestBean) bf.getBean("test");
CallCountingTransactionManager txMan = (CallCountingTransactionManager) bf.getBean(TXMANAGER_BEAN_NAME);
OrderedTxCheckAdvisor txc = (OrderedTxCheckAdvisor) bf.getBean("orderedBeforeTransaction");
assertEquals(0, txc.getCountingBeforeAdvice().getCalls());
assertThat(txc.getCountingBeforeAdvice().getCalls()).isEqualTo(0);
assertEquals(0, txMan.commits);
assertEquals("Initial value was correct", 4, test.getAge());
assertThat(txMan.commits).isEqualTo(0);
assertThat(test.getAge()).as("Initial value was correct").isEqualTo(4);
int newAge = 5;
test.setAge(newAge);
assertEquals(1, txc.getCountingBeforeAdvice().getCalls());
assertThat(txc.getCountingBeforeAdvice().getCalls()).isEqualTo(1);
assertEquals("New value set correctly", newAge, test.getAge());
assertEquals("Transaction counts match", 1, txMan.commits);
assertThat(test.getAge()).as("New value set correctly").isEqualTo(newAge);
assertThat(txMan.commits).as("Transaction counts match").isEqualTo(1);
}
/**
* Should not roll back on servlet exception.
*/
@Test
public void testRollbackRulesOnMethodCauseRollback() throws Exception {
void testRollbackRulesOnMethodCauseRollback() throws Exception {
BeanFactory bf = getBeanFactory();
Rollback rb = (Rollback) bf.getBean("rollback");
CallCountingTransactionManager txMan = (CallCountingTransactionManager) bf.getBean(TXMANAGER_BEAN_NAME);
OrderedTxCheckAdvisor txc = (OrderedTxCheckAdvisor) bf.getBean("orderedBeforeTransaction");
assertEquals(0, txc.getCountingBeforeAdvice().getCalls());
assertThat(txc.getCountingBeforeAdvice().getCalls()).isEqualTo(0);
assertEquals(0, txMan.commits);
assertThat(txMan.commits).isEqualTo(0);
rb.echoException(null);
// Fires only on setters
assertEquals(0, txc.getCountingBeforeAdvice().getCalls());
assertEquals("Transaction counts match", 1, txMan.commits);
assertThat(txc.getCountingBeforeAdvice().getCalls()).isEqualTo(0);
assertThat(txMan.commits).as("Transaction counts match").isEqualTo(1);
assertEquals(0, txMan.rollbacks);
assertThat(txMan.rollbacks).isEqualTo(0);
Exception ex = new Exception();
try {
rb.echoException(ex);
}
catch (Exception actual) {
assertEquals(ex, actual);
assertThat(actual).isEqualTo(ex);
}
assertEquals("Transaction counts match", 1, txMan.rollbacks);
assertThat(txMan.rollbacks).as("Transaction counts match").isEqualTo(1);
}
@Test
public void testRollbackRulesOnMethodPreventRollback() throws Exception {
void testRollbackRulesOnMethodPreventRollback() throws Exception {
BeanFactory bf = getBeanFactory();
Rollback rb = (Rollback) bf.getBean("rollback");
CallCountingTransactionManager txMan = (CallCountingTransactionManager) bf.getBean(TXMANAGER_BEAN_NAME);
assertEquals(0, txMan.commits);
assertThat(txMan.commits).isEqualTo(0);
// Should NOT roll back on ServletException
try {
rb.echoException(new ServletException());
@@ -163,25 +163,26 @@ public class AdvisorAutoProxyCreatorIntegrationTests {
catch (ServletException ex) {
}
assertEquals("Transaction counts match", 1, txMan.commits);
assertThat(txMan.commits).as("Transaction counts match").isEqualTo(1);
}
@Test
public void testProgrammaticRollback() throws Exception {
void testProgrammaticRollback() throws Exception {
BeanFactory bf = getBeanFactory();
Object bean = bf.getBean(TXMANAGER_BEAN_NAME);
assertTrue(bean instanceof CallCountingTransactionManager);
boolean condition = bean instanceof CallCountingTransactionManager;
assertThat(condition).isTrue();
CallCountingTransactionManager txMan = (CallCountingTransactionManager) bf.getBean(TXMANAGER_BEAN_NAME);
Rollback rb = (Rollback) bf.getBean("rollback");
assertEquals(0, txMan.commits);
assertThat(txMan.commits).isEqualTo(0);
rb.rollbackOnly(false);
assertEquals("Transaction counts match", 1, txMan.commits);
assertEquals(0, txMan.rollbacks);
assertThat(txMan.commits).as("Transaction counts match").isEqualTo(1);
assertThat(txMan.rollbacks).isEqualTo(0);
// Will cause rollback only
rb.rollbackOnly(true);
assertEquals(1, txMan.rollbacks);
assertThat(txMan.rollbacks).isEqualTo(1);
}
}
@@ -289,7 +290,6 @@ class Rollback {
/**
* Inherits transaction attribute.
* Illustrates programmatic rollback.
* @param rollbackOnly
*/
public void rollbackOnly(boolean rollbackOnly) {
if (rollbackOnly) {
@@ -310,8 +310,9 @@ class Rollback {
* @org.springframework.transaction.interceptor.NoRollbackRule ( "ServletException" )
*/
public void echoException(Exception ex) throws Exception {
if (ex != null)
if (ex != null) {
throw ex;
}
}
}
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2016 the original author or authors.
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,12 +14,13 @@
* limitations under the License.
*/
package com.foo;
package org.springframework.beans.factory.xml;
import java.util.ArrayList;
import java.util.List;
public class Component {
private String name;
private List<Component> components = new ArrayList<>();
@@ -39,4 +40,5 @@ public class Component {
public void setName(String name) {
this.name = name;
}
}
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2017 the original author or authors.
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
* limitations under the License.
*/
package com.foo;
package org.springframework.beans.factory.xml;
import java.util.List;
@@ -24,8 +24,6 @@ import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.ManagedList;
import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.util.CollectionUtils;
import org.springframework.util.xml.DomUtils;
@@ -0,0 +1,81 @@
/*
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.beans.factory.xml;
import java.util.List;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.TestInstance.Lifecycle;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.core.io.ClassPathResource;
import static org.assertj.core.api.Assertions.assertThat;
/**
* @author Costin Leau
*/
@TestInstance(Lifecycle.PER_CLASS)
class ComponentBeanDefinitionParserTests {
private final DefaultListableBeanFactory bf = new DefaultListableBeanFactory();
@BeforeAll
void setUp() throws Exception {
new XmlBeanDefinitionReader(bf).loadBeanDefinitions(
new ClassPathResource("component-config.xml", ComponentBeanDefinitionParserTests.class));
}
@AfterAll
void tearDown() {
bf.destroySingletons();
}
@Test
void testBionicBasic() {
Component cp = getBionicFamily();
assertThat("Bionic-1").isEqualTo(cp.getName());
}
@Test
void testBionicFirstLevelChildren() {
Component cp = getBionicFamily();
List<Component> components = cp.getComponents();
assertThat(2).isEqualTo(components.size());
assertThat("Mother-1").isEqualTo(components.get(0).getName());
assertThat("Rock-1").isEqualTo(components.get(1).getName());
}
@Test
void testBionicSecondLevelChildren() {
Component cp = getBionicFamily();
List<Component> components = cp.getComponents().get(0).getComponents();
assertThat(2).isEqualTo(components.size());
assertThat("Karate-1").isEqualTo(components.get(0).getName());
assertThat("Sport-1").isEqualTo(components.get(1).getName());
}
private Component getBionicFamily() {
return bf.getBean("bionic-family", Component.class);
}
}
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2013 the original author or authors.
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,13 +14,14 @@
* limitations under the License.
*/
package com.foo;
package org.springframework.beans.factory.xml;
import java.util.List;
import org.springframework.beans.factory.FactoryBean;
public class ComponentFactoryBean implements FactoryBean<Component> {
private Component parent;
private List<Component> children;
@@ -51,4 +52,5 @@ public class ComponentFactoryBean implements FactoryBean<Component> {
public boolean isSingleton() {
return true;
}
}
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2013 the original author or authors.
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,14 +14,12 @@
* limitations under the License.
*/
package com.foo;
import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
package org.springframework.beans.factory.xml;
public class ComponentNamespaceHandler extends NamespaceHandlerSupport {
@Override
public void init() {
registerBeanDefinitionParser("component",
new ComponentBeanDefinitionParser());
registerBeanDefinitionParser("component", new ComponentBeanDefinitionParser());
}
}
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2018 the original author or authors.
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,7 +19,7 @@ package org.springframework.cache.annotation;
import java.util.Collections;
import java.util.List;
import org.junit.Test;
import org.junit.jupiter.api.Test;
import org.springframework.aop.Advisor;
import org.springframework.aop.framework.Advised;
@@ -33,8 +33,8 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Repository;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
/**
* Integration tests for the @EnableCaching annotation.
@@ -43,47 +43,45 @@ import static org.junit.Assert.*;
* @since 3.1
*/
@SuppressWarnings("resource")
public class EnableCachingIntegrationTests {
class EnableCachingIntegrationTests {
@Test
public void repositoryIsClassBasedCacheProxy() {
void repositoryIsClassBasedCacheProxy() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(Config.class, ProxyTargetClassCachingConfig.class);
ctx.refresh();
assertCacheProxying(ctx);
assertThat(AopUtils.isCglibProxy(ctx.getBean(FooRepository.class)), is(true));
assertThat(AopUtils.isCglibProxy(ctx.getBean(FooRepository.class))).isTrue();
}
@Test
public void repositoryUsesAspectJAdviceMode() {
void repositoryUsesAspectJAdviceMode() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(Config.class, AspectJCacheConfig.class);
try {
ctx.refresh();
}
catch (Exception ex) {
// this test is a bit fragile, but gets the job done, proving that an
// attempt was made to look up the AJ aspect. It's due to classpath issues
// in .integration-tests that it's not found.
assertTrue(ex.getMessage().contains("AspectJCachingConfiguration"));
}
// this test is a bit fragile, but gets the job done, proving that an
// attempt was made to look up the AJ aspect. It's due to classpath issues
// in .integration-tests that it's not found.
assertThatExceptionOfType(Exception.class).isThrownBy(
ctx::refresh)
.withMessageContaining("AspectJCachingConfiguration");
}
private void assertCacheProxying(AnnotationConfigApplicationContext ctx) {
FooRepository repo = ctx.getBean(FooRepository.class);
assertThat(isCacheProxy(repo)).isTrue();
}
boolean isCacheProxy = false;
private boolean isCacheProxy(FooRepository repo) {
if (AopUtils.isAopProxy(repo)) {
for (Advisor advisor : ((Advised)repo).getAdvisors()) {
if (advisor instanceof BeanFactoryCacheOperationSourceAdvisor) {
isCacheProxy = true;
break;
return true;
}
}
}
assertTrue("FooRepository is not a cache proxy", isCacheProxy);
return false;
}
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2018 the original author or authors.
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -24,10 +24,9 @@ import java.lang.annotation.Target;
import javax.inject.Named;
import javax.inject.Singleton;
import org.junit.After;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.aop.support.AopUtils;
import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition;
@@ -43,12 +42,14 @@ import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.context.support.GenericWebApplicationContext;
import static org.assertj.core.api.Assertions.assertThat;
/**
* @author Mark Fisher
* @author Juergen Hoeller
* @author Chris Beams
*/
public class ClassPathBeanDefinitionScannerJsr330ScopeIntegrationTests {
class ClassPathBeanDefinitionScannerJsr330ScopeIntegrationTests {
private static final String DEFAULT_NAME = "default";
@@ -63,8 +64,8 @@ public class ClassPathBeanDefinitionScannerJsr330ScopeIntegrationTests {
private ServletRequestAttributes newRequestAttributesWithSession;
@Before
public void setUp() {
@BeforeEach
void setup() {
this.oldRequestAttributes = new ServletRequestAttributes(new MockHttpServletRequest());
this.newRequestAttributes = new ServletRequestAttributes(new MockHttpServletRequest());
@@ -77,223 +78,228 @@ public class ClassPathBeanDefinitionScannerJsr330ScopeIntegrationTests {
this.newRequestAttributesWithSession = new ServletRequestAttributes(newRequestWithSession);
}
@After
public void tearDown() throws Exception {
@AfterEach
void reset() {
RequestContextHolder.setRequestAttributes(null);
}
@Test
public void testPrototype() {
void testPrototype() {
ApplicationContext context = createContext(ScopedProxyMode.NO);
ScopedTestBean bean = (ScopedTestBean) context.getBean("prototype");
assertNotNull(bean);
assertTrue(context.isPrototype("prototype"));
assertFalse(context.isSingleton("prototype"));
assertThat(bean).isNotNull();
assertThat(context.isPrototype("prototype")).isTrue();
assertThat(context.isSingleton("prototype")).isFalse();
}
@Test
public void testSingletonScopeWithNoProxy() {
void testSingletonScopeWithNoProxy() {
RequestContextHolder.setRequestAttributes(oldRequestAttributes);
ApplicationContext context = createContext(ScopedProxyMode.NO);
ScopedTestBean bean = (ScopedTestBean) context.getBean("singleton");
assertTrue(context.isSingleton("singleton"));
assertFalse(context.isPrototype("singleton"));
assertThat(context.isSingleton("singleton")).isTrue();
assertThat(context.isPrototype("singleton")).isFalse();
// should not be a proxy
assertFalse(AopUtils.isAopProxy(bean));
assertThat(AopUtils.isAopProxy(bean)).isFalse();
assertEquals(DEFAULT_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(DEFAULT_NAME);
bean.setName(MODIFIED_NAME);
RequestContextHolder.setRequestAttributes(newRequestAttributes);
// not a proxy so this should not have changed
assertEquals(MODIFIED_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(MODIFIED_NAME);
// singleton bean, so name should be modified even after lookup
ScopedTestBean bean2 = (ScopedTestBean) context.getBean("singleton");
assertEquals(MODIFIED_NAME, bean2.getName());
assertThat(bean2.getName()).isEqualTo(MODIFIED_NAME);
}
@Test
public void testSingletonScopeIgnoresProxyInterfaces() {
void testSingletonScopeIgnoresProxyInterfaces() {
RequestContextHolder.setRequestAttributes(oldRequestAttributes);
ApplicationContext context = createContext(ScopedProxyMode.INTERFACES);
ScopedTestBean bean = (ScopedTestBean) context.getBean("singleton");
// should not be a proxy
assertFalse(AopUtils.isAopProxy(bean));
assertThat(AopUtils.isAopProxy(bean)).isFalse();
assertEquals(DEFAULT_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(DEFAULT_NAME);
bean.setName(MODIFIED_NAME);
RequestContextHolder.setRequestAttributes(newRequestAttributes);
// not a proxy so this should not have changed
assertEquals(MODIFIED_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(MODIFIED_NAME);
// singleton bean, so name should be modified even after lookup
ScopedTestBean bean2 = (ScopedTestBean) context.getBean("singleton");
assertEquals(MODIFIED_NAME, bean2.getName());
assertThat(bean2.getName()).isEqualTo(MODIFIED_NAME);
}
@Test
public void testSingletonScopeIgnoresProxyTargetClass() {
void testSingletonScopeIgnoresProxyTargetClass() {
RequestContextHolder.setRequestAttributes(oldRequestAttributes);
ApplicationContext context = createContext(ScopedProxyMode.TARGET_CLASS);
ScopedTestBean bean = (ScopedTestBean) context.getBean("singleton");
// should not be a proxy
assertFalse(AopUtils.isAopProxy(bean));
assertThat(AopUtils.isAopProxy(bean)).isFalse();
assertEquals(DEFAULT_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(DEFAULT_NAME);
bean.setName(MODIFIED_NAME);
RequestContextHolder.setRequestAttributes(newRequestAttributes);
// not a proxy so this should not have changed
assertEquals(MODIFIED_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(MODIFIED_NAME);
// singleton bean, so name should be modified even after lookup
ScopedTestBean bean2 = (ScopedTestBean) context.getBean("singleton");
assertEquals(MODIFIED_NAME, bean2.getName());
assertThat(bean2.getName()).isEqualTo(MODIFIED_NAME);
}
@Test
public void testRequestScopeWithNoProxy() {
void testRequestScopeWithNoProxy() {
RequestContextHolder.setRequestAttributes(oldRequestAttributes);
ApplicationContext context = createContext(ScopedProxyMode.NO);
ScopedTestBean bean = (ScopedTestBean) context.getBean("request");
// should not be a proxy
assertFalse(AopUtils.isAopProxy(bean));
assertThat(AopUtils.isAopProxy(bean)).isFalse();
assertEquals(DEFAULT_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(DEFAULT_NAME);
bean.setName(MODIFIED_NAME);
RequestContextHolder.setRequestAttributes(newRequestAttributes);
// not a proxy so this should not have changed
assertEquals(MODIFIED_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(MODIFIED_NAME);
// but a newly retrieved bean should have the default name
ScopedTestBean bean2 = (ScopedTestBean) context.getBean("request");
assertEquals(DEFAULT_NAME, bean2.getName());
assertThat(bean2.getName()).isEqualTo(DEFAULT_NAME);
}
@Test
public void testRequestScopeWithProxiedInterfaces() {
void testRequestScopeWithProxiedInterfaces() {
RequestContextHolder.setRequestAttributes(oldRequestAttributes);
ApplicationContext context = createContext(ScopedProxyMode.INTERFACES);
IScopedTestBean bean = (IScopedTestBean) context.getBean("request");
// should be dynamic proxy, implementing both interfaces
assertTrue(AopUtils.isJdkDynamicProxy(bean));
assertTrue(bean instanceof AnotherScopeTestInterface);
assertThat(AopUtils.isJdkDynamicProxy(bean)).isTrue();
boolean condition = bean instanceof AnotherScopeTestInterface;
assertThat(condition).isTrue();
assertEquals(DEFAULT_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(DEFAULT_NAME);
bean.setName(MODIFIED_NAME);
RequestContextHolder.setRequestAttributes(newRequestAttributes);
// this is a proxy so it should be reset to default
assertEquals(DEFAULT_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(DEFAULT_NAME);
RequestContextHolder.setRequestAttributes(oldRequestAttributes);
assertEquals(MODIFIED_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(MODIFIED_NAME);
}
@Test
public void testRequestScopeWithProxiedTargetClass() {
void testRequestScopeWithProxiedTargetClass() {
RequestContextHolder.setRequestAttributes(oldRequestAttributes);
ApplicationContext context = createContext(ScopedProxyMode.TARGET_CLASS);
IScopedTestBean bean = (IScopedTestBean) context.getBean("request");
// should be a class-based proxy
assertTrue(AopUtils.isCglibProxy(bean));
assertTrue(bean instanceof RequestScopedTestBean);
assertThat(AopUtils.isCglibProxy(bean)).isTrue();
boolean condition = bean instanceof RequestScopedTestBean;
assertThat(condition).isTrue();
assertEquals(DEFAULT_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(DEFAULT_NAME);
bean.setName(MODIFIED_NAME);
RequestContextHolder.setRequestAttributes(newRequestAttributes);
// this is a proxy so it should be reset to default
assertEquals(DEFAULT_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(DEFAULT_NAME);
RequestContextHolder.setRequestAttributes(oldRequestAttributes);
assertEquals(MODIFIED_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(MODIFIED_NAME);
}
@Test
public void testSessionScopeWithNoProxy() {
void testSessionScopeWithNoProxy() {
RequestContextHolder.setRequestAttributes(oldRequestAttributesWithSession);
ApplicationContext context = createContext(ScopedProxyMode.NO);
ScopedTestBean bean = (ScopedTestBean) context.getBean("session");
// should not be a proxy
assertFalse(AopUtils.isAopProxy(bean));
assertThat(AopUtils.isAopProxy(bean)).isFalse();
assertEquals(DEFAULT_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(DEFAULT_NAME);
bean.setName(MODIFIED_NAME);
RequestContextHolder.setRequestAttributes(newRequestAttributesWithSession);
// not a proxy so this should not have changed
assertEquals(MODIFIED_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(MODIFIED_NAME);
// but a newly retrieved bean should have the default name
ScopedTestBean bean2 = (ScopedTestBean) context.getBean("session");
assertEquals(DEFAULT_NAME, bean2.getName());
assertThat(bean2.getName()).isEqualTo(DEFAULT_NAME);
}
@Test
public void testSessionScopeWithProxiedInterfaces() {
void testSessionScopeWithProxiedInterfaces() {
RequestContextHolder.setRequestAttributes(oldRequestAttributesWithSession);
ApplicationContext context = createContext(ScopedProxyMode.INTERFACES);
IScopedTestBean bean = (IScopedTestBean) context.getBean("session");
// should be dynamic proxy, implementing both interfaces
assertTrue(AopUtils.isJdkDynamicProxy(bean));
assertTrue(bean instanceof AnotherScopeTestInterface);
assertThat(AopUtils.isJdkDynamicProxy(bean)).isTrue();
boolean condition = bean instanceof AnotherScopeTestInterface;
assertThat(condition).isTrue();
assertEquals(DEFAULT_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(DEFAULT_NAME);
bean.setName(MODIFIED_NAME);
RequestContextHolder.setRequestAttributes(newRequestAttributesWithSession);
// this is a proxy so it should be reset to default
assertEquals(DEFAULT_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(DEFAULT_NAME);
bean.setName(MODIFIED_NAME);
IScopedTestBean bean2 = (IScopedTestBean) context.getBean("session");
assertEquals(MODIFIED_NAME, bean2.getName());
assertThat(bean2.getName()).isEqualTo(MODIFIED_NAME);
bean2.setName(DEFAULT_NAME);
assertEquals(DEFAULT_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(DEFAULT_NAME);
RequestContextHolder.setRequestAttributes(oldRequestAttributesWithSession);
assertEquals(MODIFIED_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(MODIFIED_NAME);
}
@Test
public void testSessionScopeWithProxiedTargetClass() {
void testSessionScopeWithProxiedTargetClass() {
RequestContextHolder.setRequestAttributes(oldRequestAttributesWithSession);
ApplicationContext context = createContext(ScopedProxyMode.TARGET_CLASS);
IScopedTestBean bean = (IScopedTestBean) context.getBean("session");
// should be a class-based proxy
assertTrue(AopUtils.isCglibProxy(bean));
assertTrue(bean instanceof ScopedTestBean);
assertTrue(bean instanceof SessionScopedTestBean);
assertThat(AopUtils.isCglibProxy(bean)).isTrue();
boolean condition1 = bean instanceof ScopedTestBean;
assertThat(condition1).isTrue();
boolean condition = bean instanceof SessionScopedTestBean;
assertThat(condition).isTrue();
assertEquals(DEFAULT_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(DEFAULT_NAME);
bean.setName(MODIFIED_NAME);
RequestContextHolder.setRequestAttributes(newRequestAttributesWithSession);
// this is a proxy so it should be reset to default
assertEquals(DEFAULT_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(DEFAULT_NAME);
bean.setName(MODIFIED_NAME);
IScopedTestBean bean2 = (IScopedTestBean) context.getBean("session");
assertEquals(MODIFIED_NAME, bean2.getName());
assertThat(bean2.getName()).isEqualTo(MODIFIED_NAME);
bean2.setName(DEFAULT_NAME);
assertEquals(DEFAULT_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(DEFAULT_NAME);
RequestContextHolder.setRequestAttributes(oldRequestAttributesWithSession);
assertEquals(MODIFIED_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(MODIFIED_NAME);
}
@@ -336,7 +342,7 @@ public class ClassPathBeanDefinitionScannerJsr330ScopeIntegrationTests {
}
public static interface IScopedTestBean {
public interface IScopedTestBean {
String getName();
@@ -367,7 +373,7 @@ public class ClassPathBeanDefinitionScannerJsr330ScopeIntegrationTests {
}
public static interface AnotherScopeTestInterface {
public interface AnotherScopeTestInterface {
}
@@ -386,14 +392,14 @@ public class ClassPathBeanDefinitionScannerJsr330ScopeIntegrationTests {
@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@javax.inject.Scope
public static @interface RequestScoped {
public @interface RequestScoped {
}
@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@javax.inject.Scope
public static @interface SessionScoped {
public @interface SessionScoped {
}
}
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2018 the original author or authors.
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,9 +16,9 @@
package org.springframework.context.annotation.scope;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.aop.support.AopUtils;
import org.springframework.context.ApplicationContext;
@@ -33,9 +33,7 @@ import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.context.support.GenericWebApplicationContext;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.context.annotation.ScopedProxyMode.DEFAULT;
import static org.springframework.context.annotation.ScopedProxyMode.INTERFACES;
import static org.springframework.context.annotation.ScopedProxyMode.NO;
@@ -47,7 +45,7 @@ import static org.springframework.context.annotation.ScopedProxyMode.TARGET_CLAS
* @author Chris Beams
* @author Sam Brannen
*/
public class ClassPathBeanDefinitionScannerScopeIntegrationTests {
class ClassPathBeanDefinitionScannerScopeIntegrationTests {
private static final String DEFAULT_NAME = "default";
private static final String MODIFIED_NAME = "modified";
@@ -59,8 +57,8 @@ public class ClassPathBeanDefinitionScannerScopeIntegrationTests {
private ServletRequestAttributes newRequestAttributesWithSession;
@Before
public void setUp() {
@BeforeEach
void setup() {
MockHttpServletRequest oldRequestWithSession = new MockHttpServletRequest();
oldRequestWithSession.setSession(new MockHttpSession());
this.oldRequestAttributesWithSession = new ServletRequestAttributes(oldRequestWithSession);
@@ -70,212 +68,217 @@ public class ClassPathBeanDefinitionScannerScopeIntegrationTests {
this.newRequestAttributesWithSession = new ServletRequestAttributes(newRequestWithSession);
}
@After
public void tearDown() throws Exception {
@AfterEach
void reset() {
RequestContextHolder.resetRequestAttributes();
}
@Test
public void singletonScopeWithNoProxy() {
void singletonScopeWithNoProxy() {
RequestContextHolder.setRequestAttributes(oldRequestAttributes);
ApplicationContext context = createContext(NO);
ScopedTestBean bean = (ScopedTestBean) context.getBean("singleton");
// should not be a proxy
assertFalse(AopUtils.isAopProxy(bean));
assertThat(AopUtils.isAopProxy(bean)).isFalse();
assertEquals(DEFAULT_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(DEFAULT_NAME);
bean.setName(MODIFIED_NAME);
RequestContextHolder.setRequestAttributes(newRequestAttributes);
// not a proxy so this should not have changed
assertEquals(MODIFIED_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(MODIFIED_NAME);
// singleton bean, so name should be modified even after lookup
ScopedTestBean bean2 = (ScopedTestBean) context.getBean("singleton");
assertEquals(MODIFIED_NAME, bean2.getName());
assertThat(bean2.getName()).isEqualTo(MODIFIED_NAME);
}
@Test
public void singletonScopeIgnoresProxyInterfaces() {
void singletonScopeIgnoresProxyInterfaces() {
RequestContextHolder.setRequestAttributes(oldRequestAttributes);
ApplicationContext context = createContext(INTERFACES);
ScopedTestBean bean = (ScopedTestBean) context.getBean("singleton");
// should not be a proxy
assertFalse(AopUtils.isAopProxy(bean));
assertThat(AopUtils.isAopProxy(bean)).isFalse();
assertEquals(DEFAULT_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(DEFAULT_NAME);
bean.setName(MODIFIED_NAME);
RequestContextHolder.setRequestAttributes(newRequestAttributes);
// not a proxy so this should not have changed
assertEquals(MODIFIED_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(MODIFIED_NAME);
// singleton bean, so name should be modified even after lookup
ScopedTestBean bean2 = (ScopedTestBean) context.getBean("singleton");
assertEquals(MODIFIED_NAME, bean2.getName());
assertThat(bean2.getName()).isEqualTo(MODIFIED_NAME);
}
@Test
public void singletonScopeIgnoresProxyTargetClass() {
void singletonScopeIgnoresProxyTargetClass() {
RequestContextHolder.setRequestAttributes(oldRequestAttributes);
ApplicationContext context = createContext(TARGET_CLASS);
ScopedTestBean bean = (ScopedTestBean) context.getBean("singleton");
// should not be a proxy
assertFalse(AopUtils.isAopProxy(bean));
assertThat(AopUtils.isAopProxy(bean)).isFalse();
assertEquals(DEFAULT_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(DEFAULT_NAME);
bean.setName(MODIFIED_NAME);
RequestContextHolder.setRequestAttributes(newRequestAttributes);
// not a proxy so this should not have changed
assertEquals(MODIFIED_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(MODIFIED_NAME);
// singleton bean, so name should be modified even after lookup
ScopedTestBean bean2 = (ScopedTestBean) context.getBean("singleton");
assertEquals(MODIFIED_NAME, bean2.getName());
assertThat(bean2.getName()).isEqualTo(MODIFIED_NAME);
}
@Test
public void requestScopeWithNoProxy() {
void requestScopeWithNoProxy() {
RequestContextHolder.setRequestAttributes(oldRequestAttributes);
ApplicationContext context = createContext(NO);
ScopedTestBean bean = (ScopedTestBean) context.getBean("request");
// should not be a proxy
assertFalse(AopUtils.isAopProxy(bean));
assertThat(AopUtils.isAopProxy(bean)).isFalse();
assertEquals(DEFAULT_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(DEFAULT_NAME);
bean.setName(MODIFIED_NAME);
RequestContextHolder.setRequestAttributes(newRequestAttributes);
// not a proxy so this should not have changed
assertEquals(MODIFIED_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(MODIFIED_NAME);
// but a newly retrieved bean should have the default name
ScopedTestBean bean2 = (ScopedTestBean) context.getBean("request");
assertEquals(DEFAULT_NAME, bean2.getName());
assertThat(bean2.getName()).isEqualTo(DEFAULT_NAME);
}
@Test
public void requestScopeWithProxiedInterfaces() {
void requestScopeWithProxiedInterfaces() {
RequestContextHolder.setRequestAttributes(oldRequestAttributes);
ApplicationContext context = createContext(INTERFACES);
IScopedTestBean bean = (IScopedTestBean) context.getBean("request");
// should be dynamic proxy, implementing both interfaces
assertTrue(AopUtils.isJdkDynamicProxy(bean));
assertTrue(bean instanceof AnotherScopeTestInterface);
assertThat(AopUtils.isJdkDynamicProxy(bean)).isTrue();
boolean condition = bean instanceof AnotherScopeTestInterface;
assertThat(condition).isTrue();
assertEquals(DEFAULT_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(DEFAULT_NAME);
bean.setName(MODIFIED_NAME);
RequestContextHolder.setRequestAttributes(newRequestAttributes);
// this is a proxy so it should be reset to default
assertEquals(DEFAULT_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(DEFAULT_NAME);
RequestContextHolder.setRequestAttributes(oldRequestAttributes);
assertEquals(MODIFIED_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(MODIFIED_NAME);
}
@Test
public void requestScopeWithProxiedTargetClass() {
void requestScopeWithProxiedTargetClass() {
RequestContextHolder.setRequestAttributes(oldRequestAttributes);
ApplicationContext context = createContext(TARGET_CLASS);
IScopedTestBean bean = (IScopedTestBean) context.getBean("request");
// should be a class-based proxy
assertTrue(AopUtils.isCglibProxy(bean));
assertTrue(bean instanceof RequestScopedTestBean);
assertThat(AopUtils.isCglibProxy(bean)).isTrue();
boolean condition = bean instanceof RequestScopedTestBean;
assertThat(condition).isTrue();
assertEquals(DEFAULT_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(DEFAULT_NAME);
bean.setName(MODIFIED_NAME);
RequestContextHolder.setRequestAttributes(newRequestAttributes);
// this is a proxy so it should be reset to default
assertEquals(DEFAULT_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(DEFAULT_NAME);
RequestContextHolder.setRequestAttributes(oldRequestAttributes);
assertEquals(MODIFIED_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(MODIFIED_NAME);
}
@Test
public void sessionScopeWithNoProxy() {
void sessionScopeWithNoProxy() {
RequestContextHolder.setRequestAttributes(oldRequestAttributesWithSession);
ApplicationContext context = createContext(NO);
ScopedTestBean bean = (ScopedTestBean) context.getBean("session");
// should not be a proxy
assertFalse(AopUtils.isAopProxy(bean));
assertThat(AopUtils.isAopProxy(bean)).isFalse();
assertEquals(DEFAULT_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(DEFAULT_NAME);
bean.setName(MODIFIED_NAME);
RequestContextHolder.setRequestAttributes(newRequestAttributesWithSession);
// not a proxy so this should not have changed
assertEquals(MODIFIED_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(MODIFIED_NAME);
// but a newly retrieved bean should have the default name
ScopedTestBean bean2 = (ScopedTestBean) context.getBean("session");
assertEquals(DEFAULT_NAME, bean2.getName());
assertThat(bean2.getName()).isEqualTo(DEFAULT_NAME);
}
@Test
public void sessionScopeWithProxiedInterfaces() {
void sessionScopeWithProxiedInterfaces() {
RequestContextHolder.setRequestAttributes(oldRequestAttributesWithSession);
ApplicationContext context = createContext(INTERFACES);
IScopedTestBean bean = (IScopedTestBean) context.getBean("session");
// should be dynamic proxy, implementing both interfaces
assertTrue(AopUtils.isJdkDynamicProxy(bean));
assertTrue(bean instanceof AnotherScopeTestInterface);
assertThat(AopUtils.isJdkDynamicProxy(bean)).isTrue();
boolean condition = bean instanceof AnotherScopeTestInterface;
assertThat(condition).isTrue();
assertEquals(DEFAULT_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(DEFAULT_NAME);
bean.setName(MODIFIED_NAME);
RequestContextHolder.setRequestAttributes(newRequestAttributesWithSession);
// this is a proxy so it should be reset to default
assertEquals(DEFAULT_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(DEFAULT_NAME);
bean.setName(MODIFIED_NAME);
IScopedTestBean bean2 = (IScopedTestBean) context.getBean("session");
assertEquals(MODIFIED_NAME, bean2.getName());
assertThat(bean2.getName()).isEqualTo(MODIFIED_NAME);
bean2.setName(DEFAULT_NAME);
assertEquals(DEFAULT_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(DEFAULT_NAME);
RequestContextHolder.setRequestAttributes(oldRequestAttributesWithSession);
assertEquals(MODIFIED_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(MODIFIED_NAME);
}
@Test
public void sessionScopeWithProxiedTargetClass() {
void sessionScopeWithProxiedTargetClass() {
RequestContextHolder.setRequestAttributes(oldRequestAttributesWithSession);
ApplicationContext context = createContext(TARGET_CLASS);
IScopedTestBean bean = (IScopedTestBean) context.getBean("session");
// should be a class-based proxy
assertTrue(AopUtils.isCglibProxy(bean));
assertTrue(bean instanceof ScopedTestBean);
assertTrue(bean instanceof SessionScopedTestBean);
assertThat(AopUtils.isCglibProxy(bean)).isTrue();
boolean condition1 = bean instanceof ScopedTestBean;
assertThat(condition1).isTrue();
boolean condition = bean instanceof SessionScopedTestBean;
assertThat(condition).isTrue();
assertEquals(DEFAULT_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(DEFAULT_NAME);
bean.setName(MODIFIED_NAME);
RequestContextHolder.setRequestAttributes(newRequestAttributesWithSession);
// this is a proxy so it should be reset to default
assertEquals(DEFAULT_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(DEFAULT_NAME);
bean.setName(MODIFIED_NAME);
IScopedTestBean bean2 = (IScopedTestBean) context.getBean("session");
assertEquals(MODIFIED_NAME, bean2.getName());
assertThat(bean2.getName()).isEqualTo(MODIFIED_NAME);
bean2.setName(DEFAULT_NAME);
assertEquals(DEFAULT_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(DEFAULT_NAME);
RequestContextHolder.setRequestAttributes(oldRequestAttributesWithSession);
assertEquals(MODIFIED_NAME, bean.getName());
assertThat(bean.getName()).isEqualTo(MODIFIED_NAME);
}
@@ -295,7 +298,7 @@ public class ClassPathBeanDefinitionScannerScopeIntegrationTests {
}
static interface IScopedTestBean {
interface IScopedTestBean {
String getName();
@@ -320,7 +323,7 @@ public class ClassPathBeanDefinitionScannerScopeIntegrationTests {
}
static interface AnotherScopeTestInterface {
interface AnotherScopeTestInterface {
}
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2018 the original author or authors.
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,8 +19,8 @@ package org.springframework.core.env;
import java.io.File;
import java.io.IOException;
import org.junit.Before;
import org.junit.Test;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
@@ -57,11 +57,19 @@ import org.springframework.web.context.support.StandardServletEnvironment;
import org.springframework.web.context.support.StaticWebApplicationContext;
import org.springframework.web.context.support.XmlWebApplicationContext;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import static org.springframework.beans.factory.support.BeanDefinitionBuilder.*;
import static org.springframework.context.ConfigurableApplicationContext.*;
import static org.springframework.core.env.EnvironmentSystemIntegrationTests.Constants.*;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
import static org.springframework.beans.factory.support.BeanDefinitionBuilder.rootBeanDefinition;
import static org.springframework.context.ConfigurableApplicationContext.ENVIRONMENT_BEAN_NAME;
import static org.springframework.core.env.EnvironmentSystemIntegrationTests.Constants.DERIVED_DEV_BEAN_NAME;
import static org.springframework.core.env.EnvironmentSystemIntegrationTests.Constants.DERIVED_DEV_ENV_NAME;
import static org.springframework.core.env.EnvironmentSystemIntegrationTests.Constants.DEV_BEAN_NAME;
import static org.springframework.core.env.EnvironmentSystemIntegrationTests.Constants.DEV_ENV_NAME;
import static org.springframework.core.env.EnvironmentSystemIntegrationTests.Constants.ENVIRONMENT_AWARE_BEAN_NAME;
import static org.springframework.core.env.EnvironmentSystemIntegrationTests.Constants.PROD_BEAN_NAME;
import static org.springframework.core.env.EnvironmentSystemIntegrationTests.Constants.PROD_ENV_NAME;
import static org.springframework.core.env.EnvironmentSystemIntegrationTests.Constants.TRANSITIVE_BEAN_NAME;
import static org.springframework.core.env.EnvironmentSystemIntegrationTests.Constants.XML_PATH;
/**
* System integration tests for container support of the {@link Environment} API.
@@ -91,15 +99,15 @@ public class EnvironmentSystemIntegrationTests {
private final ConfigurableEnvironment prodWebEnv = new StandardServletEnvironment();
@Before
public void setUp() {
@BeforeEach
void setUp() {
prodEnv.setActiveProfiles(PROD_ENV_NAME);
devEnv.setActiveProfiles(DEV_ENV_NAME);
prodWebEnv.setActiveProfiles(PROD_ENV_NAME);
}
@Test
public void genericApplicationContext_standardEnv() {
void genericApplicationContext_standardEnv() {
ConfigurableApplicationContext ctx = new GenericApplicationContext(newBeanFactoryWithEnvironmentAwareBean());
ctx.refresh();
@@ -109,7 +117,7 @@ public class EnvironmentSystemIntegrationTests {
}
@Test
public void genericApplicationContext_customEnv() {
void genericApplicationContext_customEnv() {
GenericApplicationContext ctx = new GenericApplicationContext(newBeanFactoryWithEnvironmentAwareBean());
ctx.setEnvironment(prodEnv);
ctx.refresh();
@@ -120,51 +128,51 @@ public class EnvironmentSystemIntegrationTests {
}
@Test
public void xmlBeanDefinitionReader_inheritsEnvironmentFromEnvironmentCapableBDR() {
void xmlBeanDefinitionReader_inheritsEnvironmentFromEnvironmentCapableBDR() {
GenericApplicationContext ctx = new GenericApplicationContext();
ctx.setEnvironment(prodEnv);
new XmlBeanDefinitionReader(ctx).loadBeanDefinitions(XML_PATH);
ctx.refresh();
assertThat(ctx.containsBean(DEV_BEAN_NAME), is(false));
assertThat(ctx.containsBean(PROD_BEAN_NAME), is(true));
assertThat(ctx.containsBean(DEV_BEAN_NAME)).isFalse();
assertThat(ctx.containsBean(PROD_BEAN_NAME)).isTrue();
}
@Test
public void annotatedBeanDefinitionReader_inheritsEnvironmentFromEnvironmentCapableBDR() {
void annotatedBeanDefinitionReader_inheritsEnvironmentFromEnvironmentCapableBDR() {
GenericApplicationContext ctx = new GenericApplicationContext();
ctx.setEnvironment(prodEnv);
new AnnotatedBeanDefinitionReader(ctx).register(Config.class);
ctx.refresh();
assertThat(ctx.containsBean(DEV_BEAN_NAME), is(false));
assertThat(ctx.containsBean(PROD_BEAN_NAME), is(true));
assertThat(ctx.containsBean(DEV_BEAN_NAME)).isFalse();
assertThat(ctx.containsBean(PROD_BEAN_NAME)).isTrue();
}
@Test
public void classPathBeanDefinitionScanner_inheritsEnvironmentFromEnvironmentCapableBDR_scanProfileAnnotatedConfigClasses() {
void classPathBeanDefinitionScanner_inheritsEnvironmentFromEnvironmentCapableBDR_scanProfileAnnotatedConfigClasses() {
// it's actually ConfigurationClassPostProcessor's Environment that gets the job done here.
GenericApplicationContext ctx = new GenericApplicationContext();
ctx.setEnvironment(prodEnv);
ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(ctx);
scanner.scan("org.springframework.core.env.scan1");
ctx.refresh();
assertThat(ctx.containsBean(DEV_BEAN_NAME), is(false));
assertThat(ctx.containsBean(PROD_BEAN_NAME), is(true));
assertThat(ctx.containsBean(DEV_BEAN_NAME)).isFalse();
assertThat(ctx.containsBean(PROD_BEAN_NAME)).isTrue();
}
@Test
public void classPathBeanDefinitionScanner_inheritsEnvironmentFromEnvironmentCapableBDR_scanProfileAnnotatedComponents() {
void classPathBeanDefinitionScanner_inheritsEnvironmentFromEnvironmentCapableBDR_scanProfileAnnotatedComponents() {
GenericApplicationContext ctx = new GenericApplicationContext();
ctx.setEnvironment(prodEnv);
ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(ctx);
scanner.scan("org.springframework.core.env.scan2");
ctx.refresh();
assertThat(scanner.getEnvironment(), is((Environment)ctx.getEnvironment()));
assertThat(ctx.containsBean(DEV_BEAN_NAME), is(false));
assertThat(ctx.containsBean(PROD_BEAN_NAME), is(true));
assertThat(scanner.getEnvironment()).isEqualTo(ctx.getEnvironment());
assertThat(ctx.containsBean(DEV_BEAN_NAME)).isFalse();
assertThat(ctx.containsBean(PROD_BEAN_NAME)).isTrue();
}
@Test
public void genericXmlApplicationContext() {
void genericXmlApplicationContext() {
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();
assertHasStandardEnvironment(ctx);
ctx.setEnvironment(prodEnv);
@@ -174,12 +182,12 @@ public class EnvironmentSystemIntegrationTests {
assertHasEnvironment(ctx, prodEnv);
assertEnvironmentBeanRegistered(ctx);
assertEnvironmentAwareInvoked(ctx, prodEnv);
assertThat(ctx.containsBean(DEV_BEAN_NAME), is(false));
assertThat(ctx.containsBean(PROD_BEAN_NAME), is(true));
assertThat(ctx.containsBean(DEV_BEAN_NAME)).isFalse();
assertThat(ctx.containsBean(PROD_BEAN_NAME)).isTrue();
}
@Test
public void classPathXmlApplicationContext() {
void classPathXmlApplicationContext() {
ConfigurableApplicationContext ctx = new ClassPathXmlApplicationContext(XML_PATH);
ctx.setEnvironment(prodEnv);
ctx.refresh();
@@ -187,12 +195,12 @@ public class EnvironmentSystemIntegrationTests {
assertEnvironmentBeanRegistered(ctx);
assertHasEnvironment(ctx, prodEnv);
assertEnvironmentAwareInvoked(ctx, ctx.getEnvironment());
assertThat(ctx.containsBean(DEV_BEAN_NAME), is(false));
assertThat(ctx.containsBean(PROD_BEAN_NAME), is(true));
assertThat(ctx.containsBean(DEV_BEAN_NAME)).isFalse();
assertThat(ctx.containsBean(PROD_BEAN_NAME)).isTrue();
}
@Test
public void fileSystemXmlApplicationContext() throws IOException {
void fileSystemXmlApplicationContext() throws IOException {
ClassPathResource xml = new ClassPathResource(XML_PATH);
File tmpFile = File.createTempFile("test", "xml");
FileCopyUtils.copy(xml.getFile(), tmpFile);
@@ -205,12 +213,12 @@ public class EnvironmentSystemIntegrationTests {
assertEnvironmentBeanRegistered(ctx);
assertHasEnvironment(ctx, prodEnv);
assertEnvironmentAwareInvoked(ctx, ctx.getEnvironment());
assertThat(ctx.containsBean(DEV_BEAN_NAME), is(false));
assertThat(ctx.containsBean(PROD_BEAN_NAME), is(true));
assertThat(ctx.containsBean(DEV_BEAN_NAME)).isFalse();
assertThat(ctx.containsBean(PROD_BEAN_NAME)).isTrue();
}
@Test
public void annotationConfigApplicationContext_withPojos() {
void annotationConfigApplicationContext_withPojos() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
assertHasStandardEnvironment(ctx);
@@ -223,7 +231,7 @@ public class EnvironmentSystemIntegrationTests {
}
@Test
public void annotationConfigApplicationContext_withProdEnvAndProdConfigClass() {
void annotationConfigApplicationContext_withProdEnvAndProdConfigClass() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
assertHasStandardEnvironment(ctx);
@@ -232,11 +240,11 @@ public class EnvironmentSystemIntegrationTests {
ctx.register(ProdConfig.class);
ctx.refresh();
assertThat("should have prod bean", ctx.containsBean(PROD_BEAN_NAME), is(true));
assertThat(ctx.containsBean(PROD_BEAN_NAME)).isTrue();
}
@Test
public void annotationConfigApplicationContext_withProdEnvAndDevConfigClass() {
void annotationConfigApplicationContext_withProdEnvAndDevConfigClass() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
assertHasStandardEnvironment(ctx);
@@ -245,12 +253,12 @@ public class EnvironmentSystemIntegrationTests {
ctx.register(DevConfig.class);
ctx.refresh();
assertThat("should not have dev bean", ctx.containsBean(DEV_BEAN_NAME), is(false));
assertThat("should not have transitive bean", ctx.containsBean(TRANSITIVE_BEAN_NAME), is(false));
assertThat(ctx.containsBean(DEV_BEAN_NAME)).isFalse();
assertThat(ctx.containsBean(TRANSITIVE_BEAN_NAME)).isFalse();
}
@Test
public void annotationConfigApplicationContext_withDevEnvAndDevConfigClass() {
void annotationConfigApplicationContext_withDevEnvAndDevConfigClass() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
assertHasStandardEnvironment(ctx);
@@ -259,12 +267,12 @@ public class EnvironmentSystemIntegrationTests {
ctx.register(DevConfig.class);
ctx.refresh();
assertThat("should have dev bean", ctx.containsBean(DEV_BEAN_NAME), is(true));
assertThat("should have transitive bean", ctx.containsBean(TRANSITIVE_BEAN_NAME), is(true));
assertThat(ctx.containsBean(DEV_BEAN_NAME)).isTrue();
assertThat(ctx.containsBean(TRANSITIVE_BEAN_NAME)).isTrue();
}
@Test
public void annotationConfigApplicationContext_withImportedConfigClasses() {
void annotationConfigApplicationContext_withImportedConfigClasses() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
assertHasStandardEnvironment(ctx);
@@ -274,13 +282,13 @@ public class EnvironmentSystemIntegrationTests {
ctx.refresh();
assertEnvironmentAwareInvoked(ctx, prodEnv);
assertThat("should have prod bean", ctx.containsBean(PROD_BEAN_NAME), is(true));
assertThat("should not have dev bean", ctx.containsBean(DEV_BEAN_NAME), is(false));
assertThat("should not have transitive bean", ctx.containsBean(TRANSITIVE_BEAN_NAME), is(false));
assertThat(ctx.containsBean(PROD_BEAN_NAME)).isTrue();
assertThat(ctx.containsBean(DEV_BEAN_NAME)).isFalse();
assertThat(ctx.containsBean(TRANSITIVE_BEAN_NAME)).isFalse();
}
@Test
public void mostSpecificDerivedClassDrivesEnvironment_withDerivedDevEnvAndDerivedDevConfigClass() {
void mostSpecificDerivedClassDrivesEnvironment_withDerivedDevEnvAndDerivedDevConfigClass() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
StandardEnvironment derivedDevEnv = new StandardEnvironment();
derivedDevEnv.setActiveProfiles(DERIVED_DEV_ENV_NAME);
@@ -288,40 +296,40 @@ public class EnvironmentSystemIntegrationTests {
ctx.register(DerivedDevConfig.class);
ctx.refresh();
assertThat("should have dev bean", ctx.containsBean(DEV_BEAN_NAME), is(true));
assertThat("should have derived dev bean", ctx.containsBean(DERIVED_DEV_BEAN_NAME), is(true));
assertThat("should have transitive bean", ctx.containsBean(TRANSITIVE_BEAN_NAME), is(true));
assertThat(ctx.containsBean(DEV_BEAN_NAME)).isTrue();
assertThat(ctx.containsBean(DERIVED_DEV_BEAN_NAME)).isTrue();
assertThat(ctx.containsBean(TRANSITIVE_BEAN_NAME)).isTrue();
}
@Test
public void mostSpecificDerivedClassDrivesEnvironment_withDevEnvAndDerivedDevConfigClass() {
void mostSpecificDerivedClassDrivesEnvironment_withDevEnvAndDerivedDevConfigClass() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.setEnvironment(devEnv);
ctx.register(DerivedDevConfig.class);
ctx.refresh();
assertThat("should not have dev bean", ctx.containsBean(DEV_BEAN_NAME), is(false));
assertThat("should not have derived dev bean", ctx.containsBean(DERIVED_DEV_BEAN_NAME), is(false));
assertThat("should not have transitive bean", ctx.containsBean(TRANSITIVE_BEAN_NAME), is(false));
assertThat(ctx.containsBean(DEV_BEAN_NAME)).isFalse();
assertThat(ctx.containsBean(DERIVED_DEV_BEAN_NAME)).isFalse();
assertThat(ctx.containsBean(TRANSITIVE_BEAN_NAME)).isFalse();
}
@Test
public void annotationConfigApplicationContext_withProfileExpressionMatchOr() {
void annotationConfigApplicationContext_withProfileExpressionMatchOr() {
testProfileExpression(true, "p3");
}
@Test
public void annotationConfigApplicationContext_withProfileExpressionMatchAnd() {
void annotationConfigApplicationContext_withProfileExpressionMatchAnd() {
testProfileExpression(true, "p1", "p2");
}
@Test
public void annotationConfigApplicationContext_withProfileExpressionNoMatchAnd() {
void annotationConfigApplicationContext_withProfileExpressionNoMatchAnd() {
testProfileExpression(false, "p1");
}
@Test
public void annotationConfigApplicationContext_withProfileExpressionNoMatchNone() {
void annotationConfigApplicationContext_withProfileExpressionNoMatchNone() {
testProfileExpression(false, "p4");
}
@@ -332,12 +340,11 @@ public class EnvironmentSystemIntegrationTests {
ctx.setEnvironment(environment);
ctx.register(ProfileExpressionConfig.class);
ctx.refresh();
assertThat("wrong presence of expression bean",
ctx.containsBean("expressionBean"), is(expected));
assertThat(ctx.containsBean("expressionBean")).isEqualTo(expected);
}
@Test
public void webApplicationContext() {
void webApplicationContext() {
GenericWebApplicationContext ctx = new GenericWebApplicationContext(newBeanFactoryWithEnvironmentAwareBean());
assertHasStandardServletEnvironment(ctx);
ctx.setEnvironment(prodWebEnv);
@@ -349,7 +356,7 @@ public class EnvironmentSystemIntegrationTests {
}
@Test
public void xmlWebApplicationContext() {
void xmlWebApplicationContext() {
AbstractRefreshableWebApplicationContext ctx = new XmlWebApplicationContext();
ctx.setConfigLocation("classpath:" + XML_PATH);
ctx.setEnvironment(prodWebEnv);
@@ -358,12 +365,12 @@ public class EnvironmentSystemIntegrationTests {
assertHasEnvironment(ctx, prodWebEnv);
assertEnvironmentBeanRegistered(ctx);
assertEnvironmentAwareInvoked(ctx, prodWebEnv);
assertThat(ctx.containsBean(DEV_BEAN_NAME), is(false));
assertThat(ctx.containsBean(PROD_BEAN_NAME), is(true));
assertThat(ctx.containsBean(DEV_BEAN_NAME)).isFalse();
assertThat(ctx.containsBean(PROD_BEAN_NAME)).isTrue();
}
@Test
public void staticApplicationContext() {
void staticApplicationContext() {
StaticApplicationContext ctx = new StaticApplicationContext();
assertHasStandardEnvironment(ctx);
@@ -379,7 +386,7 @@ public class EnvironmentSystemIntegrationTests {
}
@Test
public void staticWebApplicationContext() {
void staticWebApplicationContext() {
StaticWebApplicationContext ctx = new StaticWebApplicationContext();
assertHasStandardServletEnvironment(ctx);
@@ -395,7 +402,7 @@ public class EnvironmentSystemIntegrationTests {
}
@Test
public void annotationConfigWebApplicationContext() {
void annotationConfigWebApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.setEnvironment(prodWebEnv);
ctx.setConfigLocation(EnvironmentAwareBean.class.getName());
@@ -407,7 +414,7 @@ public class EnvironmentSystemIntegrationTests {
}
@Test
public void registerServletParamPropertySources_AbstractRefreshableWebApplicationContext() {
void registerServletParamPropertySources_AbstractRefreshableWebApplicationContext() {
MockServletContext servletContext = new MockServletContext();
servletContext.addInitParameter("pCommon", "pCommonContextValue");
servletContext.addInitParameter("pContext1", "pContext1Value");
@@ -422,23 +429,23 @@ public class EnvironmentSystemIntegrationTests {
ctx.refresh();
ConfigurableEnvironment environment = ctx.getEnvironment();
assertThat(environment, instanceOf(StandardServletEnvironment.class));
assertThat(environment).isInstanceOf(StandardServletEnvironment.class);
MutablePropertySources propertySources = environment.getPropertySources();
assertThat(propertySources.contains(StandardServletEnvironment.SERVLET_CONTEXT_PROPERTY_SOURCE_NAME), is(true));
assertThat(propertySources.contains(StandardServletEnvironment.SERVLET_CONFIG_PROPERTY_SOURCE_NAME), is(true));
assertThat(propertySources.contains(StandardServletEnvironment.SERVLET_CONTEXT_PROPERTY_SOURCE_NAME)).isTrue();
assertThat(propertySources.contains(StandardServletEnvironment.SERVLET_CONFIG_PROPERTY_SOURCE_NAME)).isTrue();
// ServletConfig gets precedence
assertThat(environment.getProperty("pCommon"), is("pCommonConfigValue"));
assertThat(propertySources.precedenceOf(PropertySource.named(StandardServletEnvironment.SERVLET_CONFIG_PROPERTY_SOURCE_NAME)),
lessThan(propertySources.precedenceOf(PropertySource.named(StandardServletEnvironment.SERVLET_CONTEXT_PROPERTY_SOURCE_NAME))));
assertThat(environment.getProperty("pCommon")).isEqualTo("pCommonConfigValue");
assertThat(propertySources.precedenceOf(PropertySource.named(StandardServletEnvironment.SERVLET_CONFIG_PROPERTY_SOURCE_NAME)))
.isLessThan(propertySources.precedenceOf(PropertySource.named(StandardServletEnvironment.SERVLET_CONTEXT_PROPERTY_SOURCE_NAME)));
// but all params are available
assertThat(environment.getProperty("pContext1"), is("pContext1Value"));
assertThat(environment.getProperty("pConfig1"), is("pConfig1Value"));
assertThat(environment.getProperty("pContext1")).isEqualTo("pContext1Value");
assertThat(environment.getProperty("pConfig1")).isEqualTo("pConfig1Value");
// Servlet* PropertySources have precedence over System* PropertySources
assertThat(propertySources.precedenceOf(PropertySource.named(StandardServletEnvironment.SERVLET_CONFIG_PROPERTY_SOURCE_NAME)),
lessThan(propertySources.precedenceOf(PropertySource.named(StandardEnvironment.SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME))));
assertThat(propertySources.precedenceOf(PropertySource.named(StandardServletEnvironment.SERVLET_CONFIG_PROPERTY_SOURCE_NAME)))
.isLessThan(propertySources.precedenceOf(PropertySource.named(StandardEnvironment.SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME)));
// Replace system properties with a mock property source for convenience
MockPropertySource mockSystemProperties = new MockPropertySource(StandardEnvironment.SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME);
@@ -447,12 +454,12 @@ public class EnvironmentSystemIntegrationTests {
propertySources.replace(StandardEnvironment.SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME, mockSystemProperties);
// assert that servletconfig params resolve with higher precedence than sysprops
assertThat(environment.getProperty("pCommon"), is("pCommonConfigValue"));
assertThat(environment.getProperty("pSysProps1"), is("pSysProps1Value"));
assertThat(environment.getProperty("pCommon")).isEqualTo("pCommonConfigValue");
assertThat(environment.getProperty("pSysProps1")).isEqualTo("pSysProps1Value");
}
@Test
public void registerServletParamPropertySources_GenericWebApplicationContext() {
void registerServletParamPropertySources_GenericWebApplicationContext() {
MockServletContext servletContext = new MockServletContext();
servletContext.addInitParameter("pCommon", "pCommonContextValue");
servletContext.addInitParameter("pContext1", "pContext1Value");
@@ -462,17 +469,17 @@ public class EnvironmentSystemIntegrationTests {
ctx.refresh();
ConfigurableEnvironment environment = ctx.getEnvironment();
assertThat(environment, instanceOf(StandardServletEnvironment.class));
assertThat(environment).isInstanceOf(StandardServletEnvironment.class);
MutablePropertySources propertySources = environment.getPropertySources();
assertThat(propertySources.contains(StandardServletEnvironment.SERVLET_CONTEXT_PROPERTY_SOURCE_NAME), is(true));
assertThat(propertySources.contains(StandardServletEnvironment.SERVLET_CONTEXT_PROPERTY_SOURCE_NAME)).isTrue();
// ServletContext params are available
assertThat(environment.getProperty("pCommon"), is("pCommonContextValue"));
assertThat(environment.getProperty("pContext1"), is("pContext1Value"));
assertThat(environment.getProperty("pCommon")).isEqualTo("pCommonContextValue");
assertThat(environment.getProperty("pContext1")).isEqualTo("pContext1Value");
// Servlet* PropertySources have precedence over System* PropertySources
assertThat(propertySources.precedenceOf(PropertySource.named(StandardServletEnvironment.SERVLET_CONTEXT_PROPERTY_SOURCE_NAME)),
lessThan(propertySources.precedenceOf(PropertySource.named(StandardEnvironment.SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME))));
assertThat(propertySources.precedenceOf(PropertySource.named(StandardServletEnvironment.SERVLET_CONTEXT_PROPERTY_SOURCE_NAME)))
.isLessThan(propertySources.precedenceOf(PropertySource.named(StandardEnvironment.SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME)));
// Replace system properties with a mock property source for convenience
MockPropertySource mockSystemProperties = new MockPropertySource(StandardEnvironment.SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME);
@@ -481,12 +488,12 @@ public class EnvironmentSystemIntegrationTests {
propertySources.replace(StandardEnvironment.SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME, mockSystemProperties);
// assert that servletcontext init params resolve with higher precedence than sysprops
assertThat(environment.getProperty("pCommon"), is("pCommonContextValue"));
assertThat(environment.getProperty("pSysProps1"), is("pSysProps1Value"));
assertThat(environment.getProperty("pCommon")).isEqualTo("pCommonContextValue");
assertThat(environment.getProperty("pSysProps1")).isEqualTo("pSysProps1Value");
}
@Test
public void registerServletParamPropertySources_StaticWebApplicationContext() {
void registerServletParamPropertySources_StaticWebApplicationContext() {
MockServletContext servletContext = new MockServletContext();
servletContext.addInitParameter("pCommon", "pCommonContextValue");
servletContext.addInitParameter("pContext1", "pContext1Value");
@@ -501,21 +508,21 @@ public class EnvironmentSystemIntegrationTests {
ConfigurableEnvironment environment = ctx.getEnvironment();
MutablePropertySources propertySources = environment.getPropertySources();
assertThat(propertySources.contains(StandardServletEnvironment.SERVLET_CONTEXT_PROPERTY_SOURCE_NAME), is(true));
assertThat(propertySources.contains(StandardServletEnvironment.SERVLET_CONFIG_PROPERTY_SOURCE_NAME), is(true));
assertThat(propertySources.contains(StandardServletEnvironment.SERVLET_CONTEXT_PROPERTY_SOURCE_NAME)).isTrue();
assertThat(propertySources.contains(StandardServletEnvironment.SERVLET_CONFIG_PROPERTY_SOURCE_NAME)).isTrue();
// ServletConfig gets precedence
assertThat(environment.getProperty("pCommon"), is("pCommonConfigValue"));
assertThat(propertySources.precedenceOf(PropertySource.named(StandardServletEnvironment.SERVLET_CONFIG_PROPERTY_SOURCE_NAME)),
lessThan(propertySources.precedenceOf(PropertySource.named(StandardServletEnvironment.SERVLET_CONTEXT_PROPERTY_SOURCE_NAME))));
assertThat(environment.getProperty("pCommon")).isEqualTo("pCommonConfigValue");
assertThat(propertySources.precedenceOf(PropertySource.named(StandardServletEnvironment.SERVLET_CONFIG_PROPERTY_SOURCE_NAME)))
.isLessThan(propertySources.precedenceOf(PropertySource.named(StandardServletEnvironment.SERVLET_CONTEXT_PROPERTY_SOURCE_NAME)));
// but all params are available
assertThat(environment.getProperty("pContext1"), is("pContext1Value"));
assertThat(environment.getProperty("pConfig1"), is("pConfig1Value"));
assertThat(environment.getProperty("pContext1")).isEqualTo("pContext1Value");
assertThat(environment.getProperty("pConfig1")).isEqualTo("pConfig1Value");
// Servlet* PropertySources have precedence over System* PropertySources
assertThat(propertySources.precedenceOf(PropertySource.named(StandardServletEnvironment.SERVLET_CONFIG_PROPERTY_SOURCE_NAME)),
lessThan(propertySources.precedenceOf(PropertySource.named(StandardEnvironment.SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME))));
assertThat(propertySources.precedenceOf(PropertySource.named(StandardServletEnvironment.SERVLET_CONFIG_PROPERTY_SOURCE_NAME)))
.isLessThan(propertySources.precedenceOf(PropertySource.named(StandardEnvironment.SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME)));
// Replace system properties with a mock property source for convenience
MockPropertySource mockSystemProperties = new MockPropertySource(StandardEnvironment.SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME);
@@ -524,12 +531,12 @@ public class EnvironmentSystemIntegrationTests {
propertySources.replace(StandardEnvironment.SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME, mockSystemProperties);
// assert that servletconfig params resolve with higher precedence than sysprops
assertThat(environment.getProperty("pCommon"), is("pCommonConfigValue"));
assertThat(environment.getProperty("pSysProps1"), is("pSysProps1Value"));
assertThat(environment.getProperty("pCommon")).isEqualTo("pCommonConfigValue");
assertThat(environment.getProperty("pSysProps1")).isEqualTo("pSysProps1Value");
}
@Test
public void resourceAdapterApplicationContext() {
void resourceAdapterApplicationContext() {
ResourceAdapterApplicationContext ctx = new ResourceAdapterApplicationContext(new SimpleBootstrapContext(new SimpleTaskWorkManager()));
assertHasStandardEnvironment(ctx);
@@ -545,7 +552,7 @@ public class EnvironmentSystemIntegrationTests {
}
@Test
public void abstractApplicationContextValidatesRequiredPropertiesOnRefresh() {
void abstractApplicationContextValidatesRequiredPropertiesOnRefresh() {
{
ConfigurableApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.refresh();
@@ -554,12 +561,8 @@ public class EnvironmentSystemIntegrationTests {
{
ConfigurableApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.getEnvironment().setRequiredProperties("foo", "bar");
try {
ctx.refresh();
fail("expected missing property exception");
}
catch (MissingRequiredPropertiesException ex) {
}
assertThatExceptionOfType(MissingRequiredPropertiesException.class).isThrownBy(
ctx::refresh);
}
{
@@ -585,33 +588,33 @@ public class EnvironmentSystemIntegrationTests {
private void assertEnvironmentBeanRegistered(
ConfigurableApplicationContext ctx) {
// ensure environment is registered as a bean
assertThat(ctx.containsBean(ENVIRONMENT_BEAN_NAME), is(true));
assertThat(ctx.containsBean(ENVIRONMENT_BEAN_NAME)).isTrue();
}
private void assertHasStandardEnvironment(ApplicationContext ctx) {
Environment defaultEnv = ctx.getEnvironment();
assertThat(defaultEnv, notNullValue());
assertThat(defaultEnv, instanceOf(StandardEnvironment.class));
assertThat(defaultEnv).isNotNull();
assertThat(defaultEnv).isInstanceOf(StandardEnvironment.class);
}
private void assertHasStandardServletEnvironment(WebApplicationContext ctx) {
// ensure a default servlet environment exists
Environment defaultEnv = ctx.getEnvironment();
assertThat(defaultEnv, notNullValue());
assertThat(defaultEnv, instanceOf(StandardServletEnvironment.class));
assertThat(defaultEnv).isNotNull();
assertThat(defaultEnv).isInstanceOf(StandardServletEnvironment.class);
}
private void assertHasEnvironment(ApplicationContext ctx, Environment expectedEnv) {
// ensure the custom environment took
Environment actualEnv = ctx.getEnvironment();
assertThat(actualEnv, notNullValue());
assertThat(actualEnv, is(expectedEnv));
assertThat(actualEnv).isNotNull();
assertThat(actualEnv).isEqualTo(expectedEnv);
// ensure environment is registered as a bean
assertThat(ctx.containsBean(ENVIRONMENT_BEAN_NAME), is(true));
assertThat(ctx.containsBean(ENVIRONMENT_BEAN_NAME)).isTrue();
}
private void assertEnvironmentAwareInvoked(ConfigurableApplicationContext ctx, Environment expectedEnv) {
assertThat(ctx.getBean(EnvironmentAwareBean.class).environment, is(expectedEnv));
assertThat(ctx.getBean(EnvironmentAwareBean.class).environment).isEqualTo(expectedEnv);
}
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2014 the original author or authors.
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,22 +16,25 @@
package org.springframework.core.env;
import static org.springframework.beans.factory.support.BeanDefinitionBuilder.rootBeanDefinition;
import org.junit.jupiter.api.Test;
import org.junit.Test;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
import org.springframework.context.support.GenericApplicationContext;
@SuppressWarnings("resource")
public class PropertyPlaceholderConfigurerEnvironmentIntegrationTests {
import static org.springframework.beans.factory.support.BeanDefinitionBuilder.rootBeanDefinition;
class PropertyPlaceholderConfigurerEnvironmentIntegrationTests {
@Test
public void test() {
@SuppressWarnings("deprecation")
void test() {
GenericApplicationContext ctx = new GenericApplicationContext();
ctx.registerBeanDefinition("ppc",
rootBeanDefinition(PropertyPlaceholderConfigurer.class)
rootBeanDefinition(org.springframework.beans.factory.config.PropertyPlaceholderConfigurer.class)
.addPropertyValue("searchSystemEnvironment", false)
.getBeanDefinition());
ctx.refresh();
ctx.getBean("ppc");
ctx.close();
}
}
@@ -0,0 +1,26 @@
/*
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.core.env.scan1;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@Import({ DevConfig.class, ProdConfig.class })
class Config {
}
@@ -0,0 +1,32 @@
/*
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.core.env.scan1;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
@Profile(org.springframework.core.env.EnvironmentSystemIntegrationTests.Constants.DEV_ENV_NAME)
@Configuration
class DevConfig {
@Bean
public Object devBean() {
return new Object();
}
}
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2010 the original author or authors.
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,39 +14,19 @@
* limitations under the License.
*/
/**
* Mirrors the structure of beans and environment-specific config files
* in EnvironmentIntegrationTests-context.xml
*/
package org.springframework.core.env.scan1;
import static org.springframework.core.env.EnvironmentSystemIntegrationTests.Constants.DEV_ENV_NAME;
import static org.springframework.core.env.EnvironmentSystemIntegrationTests.Constants.PROD_ENV_NAME;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.Profile;
@Configuration
@Import({DevConfig.class, ProdConfig.class})
class Config {
}
@Profile(DEV_ENV_NAME)
@Configuration
class DevConfig {
@Bean
public Object devBean() {
return new Object();
}
}
@Profile(PROD_ENV_NAME)
@Profile(org.springframework.core.env.EnvironmentSystemIntegrationTests.Constants.PROD_ENV_NAME)
@Configuration
class ProdConfig {
@Bean
public Object prodBean() {
return new Object();
}
}
@@ -0,0 +1,25 @@
/*
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.core.env.scan2;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;
@Profile(org.springframework.core.env.EnvironmentSystemIntegrationTests.Constants.DEV_ENV_NAME)
@Component(org.springframework.core.env.EnvironmentSystemIntegrationTests.Constants.DEV_BEAN_NAME)
class DevBean {
}
@@ -0,0 +1,26 @@
/*
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.core.env.scan2;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;
@Profile(org.springframework.core.env.EnvironmentSystemIntegrationTests.Constants.PROD_ENV_NAME)
@Component(org.springframework.core.env.EnvironmentSystemIntegrationTests.Constants.PROD_BEAN_NAME)
class ProdBean {
}
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2018 the original author or authors.
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,28 +18,26 @@ package org.springframework.expression.spel.support;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.jupiter.api.Test;
import org.springframework.core.MethodParameter;
import org.springframework.core.convert.TypeDescriptor;
import org.springframework.expression.MethodExecutor;
public class Spr7538Tests {
class Spr7538Tests {
@Ignore @Test
public void repro() throws Exception {
@Test
void repro() throws Exception {
AlwaysTrueReleaseStrategy target = new AlwaysTrueReleaseStrategy();
BeanFactoryTypeConverter converter = new BeanFactoryTypeConverter();
StandardEvaluationContext context = new StandardEvaluationContext();
context.setTypeConverter(converter);
List<Foo> arguments = new ArrayList<>();
// !!!! With the below line commented you'll get NPE. Uncomment and everything is OK!
//arguments.add(new Foo());
List<Foo> arguments = Collections.emptyList();
List<TypeDescriptor> paramDescriptors = new ArrayList<>();
Method method = AlwaysTrueReleaseStrategy.class.getMethod("checkCompleteness", List.class);
@@ -55,11 +53,11 @@ public class Spr7538Tests {
System.out.println("Result: " + result);
}
public static class AlwaysTrueReleaseStrategy {
static class AlwaysTrueReleaseStrategy {
public boolean checkCompleteness(List<Foo> messages) {
return true;
}
}
public static class Foo{}
static class Foo{}
}
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2018 the original author or authors.
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,8 +19,7 @@ package org.springframework.scheduling.annotation;
import java.util.concurrent.atomic.AtomicInteger;
import org.aspectj.lang.annotation.Aspect;
import org.junit.Before;
import org.junit.Test;
import org.junit.jupiter.api.Test;
import org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator;
import org.springframework.aop.support.AopUtils;
@@ -29,19 +28,19 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.testfixture.EnabledForTestGroups;
import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
import org.springframework.dao.support.PersistenceExceptionTranslator;
import org.springframework.stereotype.Repository;
import org.springframework.tests.Assume;
import org.springframework.tests.TestGroup;
import org.springframework.tests.transaction.CallCountingTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.testfixture.CallCountingTransactionManager;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import static org.mockito.BDDMockito.*;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
import static org.mockito.Mockito.mock;
import static org.springframework.core.testfixture.TestGroup.PERFORMANCE;
/**
* Integration tests cornering bug SPR-8651, which revealed that @Scheduled methods may
@@ -53,29 +52,20 @@ import static org.mockito.BDDMockito.*;
* @since 3.1
*/
@SuppressWarnings("resource")
public class ScheduledAndTransactionalAnnotationIntegrationTests {
@Before
public void assumePerformanceTests() {
Assume.group(TestGroup.PERFORMANCE);
}
@EnabledForTestGroups(PERFORMANCE)
class ScheduledAndTransactionalAnnotationIntegrationTests {
@Test
public void failsWhenJdkProxyAndScheduledMethodNotPresentOnInterface() {
void failsWhenJdkProxyAndScheduledMethodNotPresentOnInterface() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(Config.class, JdkProxyTxConfig.class, RepoConfigA.class);
try {
ctx.refresh();
fail("Should have thrown BeanCreationException");
}
catch (BeanCreationException ex) {
assertTrue(ex.getRootCause() instanceof IllegalStateException);
}
assertThatExceptionOfType(BeanCreationException.class)
.isThrownBy(ctx::refresh)
.satisfies(ex -> assertThat(ex.getRootCause()).isInstanceOf(IllegalStateException.class));
}
@Test
public void succeedsWhenSubclassProxyAndScheduledMethodNotPresentOnInterface() throws InterruptedException {
void succeedsWhenSubclassProxyAndScheduledMethodNotPresentOnInterface() throws InterruptedException {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(Config.class, SubclassProxyTxConfig.class, RepoConfigA.class);
ctx.refresh();
@@ -84,13 +74,13 @@ public class ScheduledAndTransactionalAnnotationIntegrationTests {
MyRepository repository = ctx.getBean(MyRepository.class);
CallCountingTransactionManager txManager = ctx.getBean(CallCountingTransactionManager.class);
assertThat("repository is not a proxy", AopUtils.isCglibProxy(repository), equalTo(true));
assertThat("@Scheduled method never called", repository.getInvocationCount(), greaterThan(0));
assertThat("no transactions were committed", txManager.commits, greaterThan(0));
assertThat(AopUtils.isCglibProxy(repository)).isEqualTo(true);
assertThat(repository.getInvocationCount()).isGreaterThan(0);
assertThat(txManager.commits).isGreaterThan(0);
}
@Test
public void succeedsWhenJdkProxyAndScheduledMethodIsPresentOnInterface() throws InterruptedException {
void succeedsWhenJdkProxyAndScheduledMethodIsPresentOnInterface() throws InterruptedException {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(Config.class, JdkProxyTxConfig.class, RepoConfigB.class);
ctx.refresh();
@@ -99,13 +89,13 @@ public class ScheduledAndTransactionalAnnotationIntegrationTests {
MyRepositoryWithScheduledMethod repository = ctx.getBean(MyRepositoryWithScheduledMethod.class);
CallCountingTransactionManager txManager = ctx.getBean(CallCountingTransactionManager.class);
assertThat("repository is not a proxy", AopUtils.isJdkDynamicProxy(repository), is(true));
assertThat("@Scheduled method never called", repository.getInvocationCount(), greaterThan(0));
assertThat("no transactions were committed", txManager.commits, greaterThan(0));
assertThat(AopUtils.isJdkDynamicProxy(repository)).isTrue();
assertThat(repository.getInvocationCount()).isGreaterThan(0);
assertThat(txManager.commits).isGreaterThan(0);
}
@Test
public void withAspectConfig() throws InterruptedException {
void withAspectConfig() throws InterruptedException {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(AspectConfig.class, MyRepositoryWithScheduledMethodImpl.class);
ctx.refresh();
@@ -113,8 +103,8 @@ public class ScheduledAndTransactionalAnnotationIntegrationTests {
Thread.sleep(100); // allow @Scheduled method to be called several times
MyRepositoryWithScheduledMethod repository = ctx.getBean(MyRepositoryWithScheduledMethod.class);
assertThat("repository is not a proxy", AopUtils.isCglibProxy(repository), is(true));
assertThat("@Scheduled method never called", repository.getInvocationCount(), greaterThan(0));
assertThat(AopUtils.isCglibProxy(repository)).isTrue();
assertThat(repository.getInvocationCount()).isGreaterThan(0);
}
@@ -134,7 +124,7 @@ public class ScheduledAndTransactionalAnnotationIntegrationTests {
static class RepoConfigA {
@Bean
public MyRepository repository() {
MyRepository repository() {
return new MyRepositoryImpl();
}
}
@@ -144,7 +134,7 @@ public class ScheduledAndTransactionalAnnotationIntegrationTests {
static class RepoConfigB {
@Bean
public MyRepositoryWithScheduledMethod repository() {
MyRepositoryWithScheduledMethod repository() {
return new MyRepositoryWithScheduledMethodImpl();
}
}
@@ -155,17 +145,17 @@ public class ScheduledAndTransactionalAnnotationIntegrationTests {
static class Config {
@Bean
public PlatformTransactionManager txManager() {
PlatformTransactionManager txManager() {
return new CallCountingTransactionManager();
}
@Bean
public PersistenceExceptionTranslator peTranslator() {
PersistenceExceptionTranslator peTranslator() {
return mock(PersistenceExceptionTranslator.class);
}
@Bean
public static PersistenceExceptionTranslationPostProcessor peTranslationPostProcessor() {
static PersistenceExceptionTranslationPostProcessor peTranslationPostProcessor() {
return new PersistenceExceptionTranslationPostProcessor();
}
}
@@ -176,14 +166,14 @@ public class ScheduledAndTransactionalAnnotationIntegrationTests {
static class AspectConfig {
@Bean
public static AnnotationAwareAspectJAutoProxyCreator autoProxyCreator() {
static AnnotationAwareAspectJAutoProxyCreator autoProxyCreator() {
AnnotationAwareAspectJAutoProxyCreator apc = new AnnotationAwareAspectJAutoProxyCreator();
apc.setProxyTargetClass(true);
return apc;
}
@Bean
public static MyAspect myAspect() {
static MyAspect myAspect() {
return new MyAspect();
}
}
@@ -251,7 +241,7 @@ public class ScheduledAndTransactionalAnnotationIntegrationTests {
@Override
public int getInvocationCount() {
if (this.myAspect != null) {
assertEquals(this.count.get(), this.myAspect.count.get());
assertThat(this.myAspect.count.get()).isEqualTo(this.count.get());
}
return this.count.get();
}
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2018 the original author or authors.
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,15 +17,14 @@
package org.springframework.transaction.annotation;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import javax.sql.DataSource;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.jupiter.api.Test;
import org.springframework.aop.Advisor;
import org.springframework.aop.framework.Advised;
import org.springframework.aop.support.AopUtils;
import org.springframework.cache.Cache;
@@ -41,150 +40,121 @@ import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
import org.springframework.stereotype.Repository;
import org.springframework.tests.transaction.CallCountingTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.interceptor.BeanFactoryTransactionAttributeSourceAdvisor;
import org.springframework.transaction.testfixture.CallCountingTransactionManager;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
/**
* Integration tests for the @EnableTransactionManagement annotation.
*
* @author Chris Beams
* @author Sam Brannen
* @since 3.1
*/
@SuppressWarnings("resource")
public class EnableTransactionManagementIntegrationTests {
class EnableTransactionManagementIntegrationTests {
@Test
public void repositoryIsNotTxProxy() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(Config.class);
ctx.refresh();
void repositoryIsNotTxProxy() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class);
try {
assertTxProxying(ctx);
fail("expected exception");
}
catch (AssertionError ex) {
assertThat(ex.getMessage(), equalTo("FooRepository is not a TX proxy"));
}
assertThat(isTxProxy(ctx.getBean(FooRepository.class))).isFalse();
}
@Test
public void repositoryIsTxProxy_withDefaultTxManagerName() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(Config.class, DefaultTxManagerNameConfig.class);
ctx.refresh();
void repositoryIsTxProxy_withDefaultTxManagerName() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class, DefaultTxManagerNameConfig.class);
assertTxProxying(ctx);
}
@Test
public void repositoryIsTxProxy_withCustomTxManagerName() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(Config.class, CustomTxManagerNameConfig.class);
ctx.refresh();
assertTxProxying(ctx);
}
@Ignore @Test // TODO SPR-8207
public void repositoryIsTxProxy_withNonConventionalTxManagerName_fallsBackToByTypeLookup() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(Config.class, NonConventionalTxManagerNameConfig.class);
ctx.refresh();
void repositoryIsTxProxy_withCustomTxManagerName() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class, CustomTxManagerNameConfig.class);
assertTxProxying(ctx);
}
@Test
public void repositoryIsClassBasedTxProxy() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(Config.class, ProxyTargetClassTxConfig.class);
ctx.refresh();
assertTxProxying(ctx);
assertThat(AopUtils.isCglibProxy(ctx.getBean(FooRepository.class)), is(true));
void repositoryIsTxProxy_withNonConventionalTxManagerName_fallsBackToByTypeLookup() {
assertTxProxying(new AnnotationConfigApplicationContext(Config.class, NonConventionalTxManagerNameConfig.class));
}
@Test
public void repositoryUsesAspectJAdviceMode() {
void repositoryIsClassBasedTxProxy() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class, ProxyTargetClassTxConfig.class);
assertTxProxying(ctx);
assertThat(AopUtils.isCglibProxy(ctx.getBean(FooRepository.class))).isTrue();
}
@Test
void repositoryUsesAspectJAdviceMode() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(Config.class, AspectJTxConfig.class);
try {
ctx.refresh();
}
catch (Exception ex) {
// this test is a bit fragile, but gets the job done, proving that an
// attempt was made to look up the AJ aspect. It's due to classpath issues
// in .integration-tests that it's not found.
assertTrue(ex.getMessage().contains("AspectJJtaTransactionManagementConfiguration"));
}
// this test is a bit fragile, but gets the job done, proving that an
// attempt was made to look up the AJ aspect. It's due to classpath issues
// in .integration-tests that it's not found.
assertThatExceptionOfType(Exception.class)
.isThrownBy(ctx::refresh)
.withMessageContaining("AspectJJtaTransactionManagementConfiguration");
}
@Test
public void implicitTxManager() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(ImplicitTxManagerConfig.class);
ctx.refresh();
void implicitTxManager() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ImplicitTxManagerConfig.class);
FooRepository fooRepository = ctx.getBean(FooRepository.class);
fooRepository.findAll();
CallCountingTransactionManager txManager = ctx.getBean(CallCountingTransactionManager.class);
assertThat(txManager.begun, equalTo(1));
assertThat(txManager.commits, equalTo(1));
assertThat(txManager.rollbacks, equalTo(0));
assertThat(txManager.begun).isEqualTo(1);
assertThat(txManager.commits).isEqualTo(1);
assertThat(txManager.rollbacks).isEqualTo(0);
}
@Test
public void explicitTxManager() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(ExplicitTxManagerConfig.class);
ctx.refresh();
void explicitTxManager() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ExplicitTxManagerConfig.class);
FooRepository fooRepository = ctx.getBean(FooRepository.class);
fooRepository.findAll();
CallCountingTransactionManager txManager1 = ctx.getBean("txManager1", CallCountingTransactionManager.class);
assertThat(txManager1.begun, equalTo(1));
assertThat(txManager1.commits, equalTo(1));
assertThat(txManager1.rollbacks, equalTo(0));
assertThat(txManager1.begun).isEqualTo(1);
assertThat(txManager1.commits).isEqualTo(1);
assertThat(txManager1.rollbacks).isEqualTo(0);
CallCountingTransactionManager txManager2 = ctx.getBean("txManager2", CallCountingTransactionManager.class);
assertThat(txManager2.begun, equalTo(0));
assertThat(txManager2.commits, equalTo(0));
assertThat(txManager2.rollbacks, equalTo(0));
assertThat(txManager2.begun).isEqualTo(0);
assertThat(txManager2.commits).isEqualTo(0);
assertThat(txManager2.rollbacks).isEqualTo(0);
}
@Test
public void apcEscalation() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(EnableTxAndCachingConfig.class);
ctx.refresh();
void apcEscalation() {
new AnnotationConfigApplicationContext(EnableTxAndCachingConfig.class);
}
private void assertTxProxying(AnnotationConfigApplicationContext ctx) {
FooRepository repo = ctx.getBean(FooRepository.class);
boolean isTxProxy = false;
if (AopUtils.isAopProxy(repo)) {
for (Advisor advisor : ((Advised)repo).getAdvisors()) {
if (advisor instanceof BeanFactoryTransactionAttributeSourceAdvisor) {
isTxProxy = true;
break;
}
}
}
assertTrue("FooRepository is not a TX proxy", isTxProxy);
assertThat(isTxProxy(repo)).isTrue();
// trigger a transaction
repo.findAll();
}
private boolean isTxProxy(FooRepository repo) {
if (!AopUtils.isAopProxy(repo)) {
return false;
}
return Arrays.stream(((Advised) repo).getAdvisors())
.anyMatch(BeanFactoryTransactionAttributeSourceAdvisor.class::isInstance);
}
@Configuration
@EnableTransactionManagement
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2014 the original author or authors.
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,16 +16,14 @@
package org.springframework.transaction.annotation;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.not;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import org.junit.jupiter.api.Test;
import org.junit.Test;
import org.springframework.aop.support.AopUtils;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Configuration;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests proving that regardless the proxy strategy used (JDK interface-based vs. CGLIB
* subclass-based), discovery of advice-oriented annotations is consistent.
@@ -37,66 +35,66 @@ import org.springframework.context.annotation.Configuration;
* @author Chris Beams
*/
@SuppressWarnings("resource")
public class ProxyAnnotationDiscoveryTests {
class ProxyAnnotationDiscoveryTests {
@Test
public void annotatedServiceWithoutInterface_PTC_true() {
void annotatedServiceWithoutInterface_PTC_true() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(PTCTrue.class, AnnotatedServiceWithoutInterface.class);
ctx.refresh();
AnnotatedServiceWithoutInterface s = ctx.getBean(AnnotatedServiceWithoutInterface.class);
assertTrue("expected a subclass proxy", AopUtils.isCglibProxy(s));
assertThat(s, instanceOf(AnnotatedServiceWithoutInterface.class));
assertThat(AopUtils.isCglibProxy(s)).isTrue();
assertThat(s).isInstanceOf(AnnotatedServiceWithoutInterface.class);
}
@Test
public void annotatedServiceWithoutInterface_PTC_false() {
void annotatedServiceWithoutInterface_PTC_false() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(PTCFalse.class, AnnotatedServiceWithoutInterface.class);
ctx.refresh();
AnnotatedServiceWithoutInterface s = ctx.getBean(AnnotatedServiceWithoutInterface.class);
assertTrue("expected a subclass proxy", AopUtils.isCglibProxy(s));
assertThat(s, instanceOf(AnnotatedServiceWithoutInterface.class));
assertThat(AopUtils.isCglibProxy(s)).isTrue();
assertThat(s).isInstanceOf(AnnotatedServiceWithoutInterface.class);
}
@Test
public void nonAnnotatedService_PTC_true() {
void nonAnnotatedService_PTC_true() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(PTCTrue.class, AnnotatedServiceImpl.class);
ctx.refresh();
NonAnnotatedService s = ctx.getBean(NonAnnotatedService.class);
assertTrue("expected a subclass proxy", AopUtils.isCglibProxy(s));
assertThat(s, instanceOf(AnnotatedServiceImpl.class));
assertThat(AopUtils.isCglibProxy(s)).isTrue();
assertThat(s).isInstanceOf(AnnotatedServiceImpl.class);
}
@Test
public void nonAnnotatedService_PTC_false() {
void nonAnnotatedService_PTC_false() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(PTCFalse.class, AnnotatedServiceImpl.class);
ctx.refresh();
NonAnnotatedService s = ctx.getBean(NonAnnotatedService.class);
assertTrue("expected a jdk proxy", AopUtils.isJdkDynamicProxy(s));
assertThat(s, not(instanceOf(AnnotatedServiceImpl.class)));
assertThat(AopUtils.isJdkDynamicProxy(s)).isTrue();
assertThat(s).isNotInstanceOf(AnnotatedServiceImpl.class);
}
@Test
public void annotatedService_PTC_true() {
void annotatedService_PTC_true() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(PTCTrue.class, NonAnnotatedServiceImpl.class);
ctx.refresh();
AnnotatedService s = ctx.getBean(AnnotatedService.class);
assertTrue("expected a subclass proxy", AopUtils.isCglibProxy(s));
assertThat(s, instanceOf(NonAnnotatedServiceImpl.class));
assertThat(AopUtils.isCglibProxy(s)).isTrue();
assertThat(s).isInstanceOf(NonAnnotatedServiceImpl.class);
}
@Test
public void annotatedService_PTC_false() {
void annotatedService_PTC_false() {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(PTCFalse.class, NonAnnotatedServiceImpl.class);
ctx.refresh();
AnnotatedService s = ctx.getBean(AnnotatedService.class);
assertTrue("expected a jdk proxy", AopUtils.isJdkDynamicProxy(s));
assertThat(s, not(instanceOf(NonAnnotatedServiceImpl.class)));
assertThat(AopUtils.isJdkDynamicProxy(s)).isTrue();
assertThat(s).isNotInstanceOf(NonAnnotatedServiceImpl.class);
}
}
@@ -0,0 +1 @@
http\://www.foo.example/schema/component=org.springframework.beans.factory.xml.ComponentNamespaceHandler
@@ -0,0 +1 @@
http\://www.foo.example/schema/component/component.xsd=org/springframework/beans/factory/xml/component.xsd
@@ -11,19 +11,19 @@
<bean id="advice" class="org.springframework.aop.interceptor.DebugInterceptor"/>
<bean id="testBean" class="org.springframework.tests.sample.beans.TestBean"/>
<bean id="testBean" class="org.springframework.beans.testfixture.beans.TestBean"/>
<bean id="singletonScoped" class="org.springframework.tests.sample.beans.TestBean">
<bean id="singletonScoped" class="org.springframework.beans.testfixture.beans.TestBean">
<aop:scoped-proxy/>
<property name="name" value="Rob Harrop"/>
</bean>
<bean id="requestScoped" class="org.springframework.tests.sample.beans.TestBean" scope="request">
<bean id="requestScoped" class="org.springframework.beans.testfixture.beans.TestBean" scope="request">
<aop:scoped-proxy/>
<property name="name" value="Rob Harrop"/>
</bean>
<bean id="sessionScoped" name="sessionScopedAlias" class="org.springframework.tests.sample.beans.TestBean" scope="session">
<bean id="sessionScoped" name="sessionScopedAlias" class="org.springframework.beans.testfixture.beans.TestBean" scope="session">
<aop:scoped-proxy proxy-target-class="false"/>
<property name="name" value="Rob Harrop"/>
</bean>
@@ -34,7 +34,7 @@
</bean>
<!-- Often we can leave the definition of such infrastructural beans to child factories -->
<bean id="txManager" class="org.springframework.tests.transaction.CallCountingTransactionManager"/>
<bean id="txManager" class="org.springframework.transaction.testfixture.CallCountingTransactionManager"/>
<bean id="tas" class="org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource">
<property name="properties">
@@ -74,20 +74,20 @@
<!-- These two beans would otherwise be eligible for autoproxying -->
<bean id="singletonDependency" class="org.springframework.tests.sample.beans.TestBean" scope="singleton"/>
<bean id="singletonDependency" class="org.springframework.beans.testfixture.beans.TestBean" scope="singleton"/>
<bean id="prototypeDependency" class="org.springframework.tests.sample.beans.TestBean" scope="prototype"/>
<bean id="prototypeDependency" class="org.springframework.beans.testfixture.beans.TestBean" scope="prototype"/>
<!-- ====== End test for prototype definitions to try to provoke circular references ========================= -->
<bean class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice"><ref bean="countingAdvice"/></property>
<property name="pattern"><value>org.springframework.tests.sample.beans.ITestBean.getName</value></property>
<property name="pattern"><value>org.springframework.beans.testfixture.beans.ITestBean.getName</value></property>
</bean>
<bean id="countingAdvice" class="org.springframework.tests.aop.advice.CountingAfterReturningAdvice"/>
<bean id="countingAdvice" class="org.springframework.aop.testfixture.advice.CountingAfterReturningAdvice"/>
<bean id="test" class="org.springframework.tests.sample.beans.TestBean">
<bean id="test" class="org.springframework.beans.testfixture.beans.TestBean">
<property name="age"><value>4</value></property>
</bean>
@@ -97,7 +97,7 @@
<!-- The following beans test whether auto-proxying falls over for a null value -->
<bean id="tb" class="org.springframework.tests.sample.beans.TestBean"/>
<bean id="tb" class="org.springframework.beans.testfixture.beans.TestBean"/>
<bean id="nullValueReturned" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject" ref="tb"/>
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:foo="http://www.foo.com/schema/component"
xmlns:foo="http://www.foo.example/schema/component"
xsi:schemaLocation="
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.foo.com/schema/component http://www.foo.com/schema/component/component.xsd">
http://www.foo.example/schema/component http://www.foo.example/schema/component/component.xsd">
<foo:component id="bionic-family" name="Bionic-1">
<foo:component name="Mother-1">
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xsd:schema xmlns="http://www.foo.com/schema/component"
<xsd:schema xmlns="http://www.foo.example/schema/component"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.foo.com/schema/component"
targetNamespace="http://www.foo.example/schema/component"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
+12 -5
View File
@@ -1,3 +1,11 @@
pluginManagement {
repositories {
gradlePluginPortal()
maven { url 'https://repo.spring.io/plugins-release' }
}
}
apply from: "$rootDir/gradle/build-cache-settings.gradle"
include "spring-aop"
include "spring-aspects"
include "spring-beans"
@@ -5,6 +13,8 @@ include "spring-context"
include "spring-context-support"
include "spring-context-indexer"
include "spring-core"
include "kotlin-coroutines"
project(':kotlin-coroutines').projectDir = file('spring-core/kotlin-coroutines')
include "spring-expression"
include "spring-instrument"
include "spring-jcl"
@@ -19,11 +29,8 @@ include "spring-web"
include "spring-webmvc"
include "spring-webflux"
include "spring-websocket"
include "spring-framework-bom"
// Exposes gradle buildSrc for IDE support
include "buildSrc"
rootProject.children.find{ it.name == "buildSrc" }.name = "spring-build-src"
include "framework-bom"
include "integration-tests"
rootProject.name = "spring"
rootProject.children.each {project ->
+6 -3
View File
@@ -3,7 +3,10 @@ description = "Spring AOP"
dependencies {
compile(project(":spring-beans"))
compile(project(":spring-core"))
optional("org.aspectj:aspectjweaver:${aspectjVersion}")
optional("org.apache.commons:commons-pool2:2.6.0")
optional("com.jamonapi:jamon:2.81")
optional("org.aspectj:aspectjweaver")
optional("org.apache.commons:commons-pool2")
optional("com.jamonapi:jamon")
testCompile(testFixtures(project(":spring-beans")))
testCompile(testFixtures(project(":spring-core")))
testFixturesImplementation(testFixtures(project(":spring-core")))
}
@@ -720,7 +720,7 @@ public abstract class AbstractAspectJAdvice implements Advice, AspectJPrecedence
}
@Override
public boolean equals(Object other) {
public boolean equals(@Nullable Object other) {
if (this == other) {
return true;
}
@@ -519,7 +519,7 @@ public class AspectJExpressionPointcut extends AbstractExpressionPointcut
@Override
public boolean equals(Object other) {
public boolean equals(@Nullable Object other) {
if (this == other) {
return true;
}
@@ -544,9 +544,7 @@ public class AspectJExpressionPointcut extends AbstractExpressionPointcut
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("AspectJExpressionPointcut: ");
sb.append("(");
StringBuilder sb = new StringBuilder("AspectJExpressionPointcut: (");
for (int i = 0; i < this.pointcutParameterTypes.length; i++) {
sb.append(this.pointcutParameterTypes[i].getName());
sb.append(" ");
@@ -555,8 +553,7 @@ public class AspectJExpressionPointcut extends AbstractExpressionPointcut
sb.append(", ");
}
}
sb.append(")");
sb.append(" ");
sb.append(") ");
if (getExpression() != null) {
sb.append(getExpression());
}
@@ -93,7 +93,7 @@ public class AspectJPointcutAdvisor implements PointcutAdvisor, Ordered {
@Override
public boolean equals(Object other) {
public boolean equals(@Nullable Object other) {
if (this == other) {
return true;
}
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2016 the original author or authors.
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -95,7 +95,7 @@ public class AspectMetadata implements Serializable {
throw new IllegalArgumentException("Class '" + aspectClass.getName() + "' is not an @AspectJ aspect");
}
if (ajType.getDeclarePrecedence().length > 0) {
throw new IllegalArgumentException("DeclarePrecendence not presently supported in Spring AOP");
throw new IllegalArgumentException("DeclarePrecedence not presently supported in Spring AOP");
}
this.aspectClass = ajType.getJavaClass();
this.ajType = ajType;
@@ -127,9 +127,9 @@ public class AspectMetadata implements Serializable {
*/
private String findPerClause(Class<?> aspectClass) {
String str = aspectClass.getAnnotation(Aspect.class).value();
str = str.substring(str.indexOf('(') + 1);
str = str.substring(0, str.length() - 1);
return str;
int beginIndex = str.indexOf('(') + 1;
int endIndex = str.length() - 1;
return str.substring(beginIndex, endIndex);
}
@@ -263,7 +263,7 @@ final class InstantiationModelAwarePointcutAdvisorImpl
* Note that this is a <i>dynamic</i> pointcut; otherwise it might be optimized out
* if it does not at first match statically.
*/
private final class PerTargetInstantiationModelPointcut extends DynamicMethodMatcherPointcut {
private static final class PerTargetInstantiationModelPointcut extends DynamicMethodMatcherPointcut {
private final AspectJExpressionPointcut declaredPointcut;
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2018 the original author or authors.
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -153,7 +153,7 @@ public class ReflectiveAspectJAdvisorFactory extends AbstractAspectJAdvisorFacto
if (AnnotationUtils.getAnnotation(method, Pointcut.class) == null) {
methods.add(method);
}
});
}, ReflectionUtils.USER_DECLARED_METHODS);
methods.sort(METHOD_COMPARATOR);
return methods;
}
@@ -45,7 +45,7 @@ class ScopedProxyBeanDefinitionDecorator implements BeanDefinitionDecorator {
if (node instanceof Element) {
Element ele = (Element) node;
if (ele.hasAttribute(PROXY_TARGET_CLASS)) {
proxyTargetClass = Boolean.valueOf(ele.getAttribute(PROXY_TARGET_CLASS));
proxyTargetClass = Boolean.parseBoolean(ele.getAttribute(PROXY_TARGET_CLASS));
}
}
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2018 the original author or authors.
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -283,16 +283,15 @@ public class AdvisedSupport extends ProxyConfig implements Advised {
"This configuration only has " + this.advisors.size() + " advisors.");
}
Advisor advisor = this.advisors.get(index);
Advisor advisor = this.advisors.remove(index);
if (advisor instanceof IntroductionAdvisor) {
IntroductionAdvisor ia = (IntroductionAdvisor) advisor;
// We need to remove introduction interfaces.
for (int j = 0; j < ia.getInterfaces().length; j++) {
removeInterface(ia.getInterfaces()[j]);
for (Class<?> ifc : ia.getInterfaces()) {
removeInterface(ifc);
}
}
this.advisors.remove(index);
updateAdvisorArray();
adviceChanged();
}
@@ -592,7 +591,7 @@ public class AdvisedSupport extends ProxyConfig implements Advised {
}
@Override
public boolean equals(Object other) {
public boolean equals(@Nullable Object other) {
return (this == other || (other instanceof MethodCacheKey &&
this.method == ((MethodCacheKey) other).method));
}
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2018 the original author or authors.
* Copyright 2002-2020 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -67,7 +67,8 @@ public final class AopContext {
Object proxy = currentProxy.get();
if (proxy == null) {
throw new IllegalStateException(
"Cannot find current proxy: Set 'exposeProxy' property on Advised to 'true' to make it available.");
"Cannot find current proxy: Set 'exposeProxy' property on Advised to 'true' to make it available, and " +
"ensure that AopContext.currentProxy() is invoked in the same thread as the AOP invocation context.");
}
return proxy;
}
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2017 the original author or authors.
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -180,8 +180,7 @@ public abstract class AopProxyUtils {
if (proxy instanceof DecoratingProxy) {
nonUserIfcCount++;
}
Class<?>[] userInterfaces = new Class<?>[proxyInterfaces.length - nonUserIfcCount];
System.arraycopy(proxyInterfaces, 0, userInterfaces, 0, userInterfaces.length);
Class<?>[] userInterfaces = Arrays.copyOf(proxyInterfaces, proxyInterfaces.length - nonUserIfcCount);
Assert.notEmpty(userInterfaces, "JDK proxy must implement one or more interfaces");
return userInterfaces;
}
@@ -225,8 +224,8 @@ public abstract class AopProxyUtils {
return new Object[0];
}
if (method.isVarArgs()) {
Class<?>[] paramTypes = method.getParameterTypes();
if (paramTypes.length == arguments.length) {
if (method.getParameterCount() == arguments.length) {
Class<?>[] paramTypes = method.getParameterTypes();
int varargIndex = paramTypes.length - 1;
Class<?> varargType = paramTypes[varargIndex];
if (varargType.isArray()) {
@@ -38,7 +38,7 @@ import org.springframework.aop.PointcutAdvisor;
import org.springframework.aop.RawTargetAccess;
import org.springframework.aop.TargetSource;
import org.springframework.aop.support.AopUtils;
import org.springframework.cglib.core.ClassGenerator;
import org.springframework.cglib.core.ClassLoaderAwareGeneratorStrategy;
import org.springframework.cglib.core.CodeGenerationException;
import org.springframework.cglib.core.SpringNamingPolicy;
import org.springframework.cglib.proxy.Callback;
@@ -49,12 +49,12 @@ import org.springframework.cglib.proxy.Factory;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import org.springframework.cglib.proxy.NoOp;
import org.springframework.cglib.transform.impl.UndeclaredThrowableStrategy;
import org.springframework.core.SmartClassLoader;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
import org.springframework.util.ObjectUtils;
import org.springframework.util.ReflectionUtils;
/**
* CGLIB-based {@link AopProxy} implementation for the Spring AOP framework.
@@ -112,7 +112,7 @@ class CglibAopProxy implements AopProxy, Serializable {
/** Dispatcher used for methods on Advised. */
private final transient AdvisedDispatcher advisedDispatcher;
private transient Map<String, Integer> fixedInterceptorMap = Collections.emptyMap();
private transient Map<Method, Integer> fixedInterceptorMap = Collections.emptyMap();
private transient int fixedInterceptorOffset;
@@ -166,7 +166,7 @@ class CglibAopProxy implements AopProxy, Serializable {
Assert.state(rootClass != null, "Target class must be available for creating a CGLIB proxy");
Class<?> proxySuperClass = rootClass;
if (ClassUtils.isCglibProxyClass(rootClass)) {
if (rootClass.getName().contains(ClassUtils.CGLIB_CLASS_SEPARATOR)) {
proxySuperClass = rootClass.getSuperclass();
Class<?>[] additionalInterfaces = rootClass.getInterfaces();
for (Class<?> additionalInterface : additionalInterfaces) {
@@ -189,7 +189,7 @@ class CglibAopProxy implements AopProxy, Serializable {
enhancer.setSuperclass(proxySuperClass);
enhancer.setInterfaces(AopProxyUtils.completeProxiedInterfaces(this.advised));
enhancer.setNamingPolicy(SpringNamingPolicy.INSTANCE);
enhancer.setStrategy(new ClassLoaderAwareUndeclaredThrowableStrategy(classLoader));
enhancer.setStrategy(new ClassLoaderAwareGeneratorStrategy(classLoader));
Callback[] callbacks = getCallbacks(rootClass);
Class<?>[] types = new Class<?>[callbacks.length];
@@ -331,7 +331,7 @@ class CglibAopProxy implements AopProxy, Serializable {
List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, rootClass);
fixedCallbacks[x] = new FixedChainStaticTargetInterceptor(
chain, this.advised.getTargetSource().getTarget(), this.advised.getTargetClass());
this.fixedInterceptorMap.put(methods.toString(), x);
this.fixedInterceptorMap.put(method, x);
}
// Now copy both the callbacks from mainCallbacks
@@ -349,7 +349,7 @@ class CglibAopProxy implements AopProxy, Serializable {
@Override
public boolean equals(Object other) {
public boolean equals(@Nullable Object other) {
return (this == other || (other instanceof CglibAopProxy &&
AopProxyUtils.equalsInProxy(this.advised, ((CglibAopProxy) other).advised)));
}
@@ -365,7 +365,7 @@ class CglibAopProxy implements AopProxy, Serializable {
*/
private static boolean implementsInterface(Method method, Set<Class<?>> ifcs) {
for (Class<?> ifc : ifcs) {
if (ClassUtils.hasMethod(ifc, method.getName(), method.getParameterTypes())) {
if (ClassUtils.hasMethod(ifc, method)) {
return true;
}
}
@@ -703,7 +703,7 @@ class CglibAopProxy implements AopProxy, Serializable {
}
@Override
public boolean equals(Object other) {
public boolean equals(@Nullable Object other) {
return (this == other ||
(other instanceof DynamicAdvisedInterceptor &&
this.advised.equals(((DynamicAdvisedInterceptor) other).advised)));
@@ -740,6 +740,25 @@ class CglibAopProxy implements AopProxy, Serializable {
methodProxy : null);
}
@Override
@Nullable
public Object proceed() throws Throwable {
try {
return super.proceed();
}
catch (RuntimeException ex) {
throw ex;
}
catch (Exception ex) {
if (ReflectionUtils.declaresException(getMethod(), ex.getClass())) {
throw ex;
}
else {
throw new UndeclaredThrowableException(ex);
}
}
}
/**
* Gives a marginal performance improvement versus using reflection to
* invoke the target when invoking public methods.
@@ -763,12 +782,12 @@ class CglibAopProxy implements AopProxy, Serializable {
private final AdvisedSupport advised;
private final Map<String, Integer> fixedInterceptorMap;
private final Map<Method, Integer> fixedInterceptorMap;
private final int fixedInterceptorOffset;
public ProxyCallbackFilter(
AdvisedSupport advised, Map<String, Integer> fixedInterceptorMap, int fixedInterceptorOffset) {
AdvisedSupport advised, Map<Method, Integer> fixedInterceptorMap, int fixedInterceptorOffset) {
this.advised = advised;
this.fixedInterceptorMap = fixedInterceptorMap;
@@ -853,7 +872,7 @@ class CglibAopProxy implements AopProxy, Serializable {
}
return AOP_PROXY;
}
String key = method.toString();
Method key = method;
// Check to see if we have fixed interceptor to serve this method.
// Else use the AOP_PROXY.
if (isStatic && isFrozen && this.fixedInterceptorMap.containsKey(key)) {
@@ -899,7 +918,7 @@ class CglibAopProxy implements AopProxy, Serializable {
}
@Override
public boolean equals(Object other) {
public boolean equals(@Nullable Object other) {
if (this == other) {
return true;
}
@@ -968,52 +987,4 @@ class CglibAopProxy implements AopProxy, Serializable {
}
}
/**
* CGLIB GeneratorStrategy variant which exposes the application ClassLoader
* as thread context ClassLoader for the time of class generation
* (in order for ASM to pick it up when doing common superclass resolution).
*/
private static class ClassLoaderAwareUndeclaredThrowableStrategy extends UndeclaredThrowableStrategy {
@Nullable
private final ClassLoader classLoader;
public ClassLoaderAwareUndeclaredThrowableStrategy(@Nullable ClassLoader classLoader) {
super(UndeclaredThrowableException.class);
this.classLoader = classLoader;
}
@Override
public byte[] generate(ClassGenerator cg) throws Exception {
if (this.classLoader == null) {
return super.generate(cg);
}
Thread currentThread = Thread.currentThread();
ClassLoader threadContextClassLoader;
try {
threadContextClassLoader = currentThread.getContextClassLoader();
}
catch (Throwable ex) {
// Cannot access thread context ClassLoader - falling back...
return super.generate(cg);
}
boolean overrideClassLoader = !this.classLoader.equals(threadContextClassLoader);
if (overrideClassLoader) {
currentThread.setContextClassLoader(this.classLoader);
}
try {
return super.generate(cg);
}
finally {
if (overrideClassLoader) {
// Reset original thread context ClassLoader.
currentThread.setContextClassLoader(threadContextClassLoader);
}
}
}
}
}
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2018 the original author or authors.
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -395,9 +395,7 @@ public class ProxyFactoryBean extends ProxyCreatorSupport
logger.debug("Bean with name '" + finalName + "' concluding interceptor chain " +
"is not an advisor class: treating it as a target or TargetSource");
}
String[] newNames = new String[this.interceptorNames.length - 1];
System.arraycopy(this.interceptorNames, 0, newNames, 0, newNames.length);
this.interceptorNames = newNames;
this.interceptorNames = Arrays.copyOf(this.interceptorNames, this.interceptorNames.length - 1);
}
}
}
@@ -602,7 +600,7 @@ public class ProxyFactoryBean extends ProxyCreatorSupport
// We expected this to be an Advisor or Advice,
// but it wasn't. This is a configuration error.
throw new AopConfigException("Unknown advisor type " + next.getClass() +
"; Can only include Advisor or Advice type beans in interceptorNames chain except for last entry," +
"; Can only include Advisor or Advice type beans in interceptorNames chain except for last entry, " +
"which may also be target or TargetSource", ex);
}
}
@@ -212,8 +212,7 @@ public class ReflectiveMethodInvocation implements ProxyMethodInvocation, Clonea
Object[] cloneArguments = this.arguments;
if (this.arguments.length > 0) {
// Build an independent copy of the arguments array.
cloneArguments = new Object[this.arguments.length];
System.arraycopy(this.arguments, 0, cloneArguments, 0, this.arguments.length);
cloneArguments = this.arguments.clone();
}
return invocableClone(cloneArguments);
}
@@ -98,16 +98,12 @@ public abstract class AbstractMonitoringInterceptor extends AbstractTraceInterce
* @see #setSuffix
*/
protected String createInvocationTraceName(MethodInvocation invocation) {
StringBuilder sb = new StringBuilder(getPrefix());
Method method = invocation.getMethod();
Class<?> clazz = method.getDeclaringClass();
if (this.logTargetClassInvocation && clazz.isInstance(invocation.getThis())) {
clazz = invocation.getThis().getClass();
}
sb.append(clazz.getName());
sb.append('.').append(method.getName());
sb.append(getSuffix());
return sb.toString();
return getPrefix() + clazz.getName() + '.' + method.getName() + getSuffix();
}
}
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2016 the original author or authors.
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -23,7 +23,7 @@ import java.lang.reflect.Method;
*
* <p>An asynchronous method usually returns a {@link java.util.concurrent.Future}
* instance that gives access to the underlying exception. When the method does
* not provide that return type, this handler can be used to managed such
* not provide that return type, this handler can be used to manage such
* uncaught exceptions.
*
* @author Stephane Nicoll

Some files were not shown because too many files have changed in this diff Show More