diff --git a/README.adoc b/README.adoc
index f9b4983f..1aa7dfc3 100644
--- a/README.adoc
+++ b/README.adoc
@@ -3,17 +3,22 @@
image::https://circleci.com/gh/spring-cloud/spring-cloud-commons.svg?style=svg[Build Status, link=https://circleci.com/gh/spring-cloud/spring-cloud-commons]
-http://pivotal.io/platform-as-a-service/migrating-to-cloud-native-application-architectures-ebook[Cloud Native] is a style of application development that encourages easy adoption of best practices in the areas of continuous delivery and value-driven development. A related discipline is that of building http://12factor.net/[12-factor Apps] in which development practices are aligned with delivery and operations goals, for instance by using declarative programming and management and monitoring. Spring Cloud facilitates these styles of development in a number of specific ways and the starting point is a set of features that all components in a distributed system either need or need easy access to when required.
+http://pivotal.io/platform-as-a-service/migrating-to-cloud-native-application-architectures-ebook[Cloud Native] is a style of application development that encourages easy adoption of best practices in the areas of continuous delivery and value-driven development.
+A related discipline is that of building http://12factor.net/[12-factor Applications], in which development practices are aligned with delivery and operations goals -- for instance, by using declarative programming and management and monitoring.
+Spring Cloud facilitates these styles of development in a number of specific ways.
+ The starting point is a set of features to which all components in a distributed system need easy access.
-Many of those features are covered by http://projects.spring.io/spring-boot[Spring Boot], which we build on in Spring Cloud. Some more are delivered by Spring Cloud as two libraries: Spring Cloud Context and Spring Cloud Commons. Spring Cloud Context provides utilities and special services for the `ApplicationContext` of a Spring Cloud application (bootstrap context, encryption, refresh scope and environment endpoints). Spring Cloud Commons is a set of abstractions and common classes used in different Spring Cloud implementations (eg. Spring Cloud Netflix vs. Spring Cloud Consul).
+Many of those features are covered by http://projects.spring.io/spring-boot[Spring Boot], on which Spring Cloud builds. Some more features are delivered by Spring Cloud as two libraries: Spring Cloud Context and Spring Cloud Commons.
+Spring Cloud Context provides utilities and special services for the `ApplicationContext` of a Spring Cloud application (bootstrap context, encryption, refresh scope, and environment endpoints). Spring Cloud Commons is a set of abstractions and common classes used in different Spring Cloud implementations (such as Spring Cloud Netflix and Spring Cloud Consul).
-If you are getting an exception due to "Illegal key size" and you are using Sun's JDK, you need to install the Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files. See the following links for more information:
+If you get an exception due to "Illegal key size" and you use Sun's JDK, you need to install the Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files.
+See the following links for more information:
* http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html[Java 6 JCE]
* http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html[Java 7 JCE]
* http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html[Java 8 JCE]
-Extract files into JDK/jre/lib/security folder (whichever version of JRE/JDK x64/x86 you are using).
+Extract the files into the JDK/jre/lib/security folder for whichever version of JRE/JDK x64/x86 you use.
== Building
diff --git a/docs/pom.xml b/docs/pom.xml
index f42e0305..d1eb9961 100644
--- a/docs/pom.xml
+++ b/docs/pom.xml
@@ -1,62 +1,64 @@
-
+4.0.0org.springframework.cloudspring-cloud-commons-docsorg.springframework.cloudspring-cloud-commons-parent
- 2.0.0.BUILD-SNAPSHOT
+ 2.1.0.BUILD-SNAPSHOTpomSpring Cloud Commons DocsSpring Cloud Commons Docs
- spring-cloud-commons
+ spring-cloud-commons${basedir}/..
- 1.1.x,1.2.x,1.3.x
+ 1.2.x,1.3.x,2.0.x
-
+
-
-
- maven-deploy-plugin
-
- true
-
-
+
+
+ maven-deploy-plugin
+
+ true
+
+
-
+ docs
-
-
-
- org.apache.maven.plugins
- maven-dependency-plugin
-
-
- org.asciidoctor
- asciidoctor-maven-plugin
- false
-
-
- com.agilejava.docbkx
- docbkx-maven-plugin
-
-
- org.apache.maven.plugins
- maven-antrun-plugin
- false
-
-
- org.codehaus.mojo
- build-helper-maven-plugin
- false
-
-
-
+
+
+
+ org.apache.maven.plugins
+ maven-dependency-plugin
+
+
+ org.asciidoctor
+ asciidoctor-maven-plugin
+ false
+
+
+ com.agilejava.docbkx
+ docbkx-maven-plugin
+
+
+ org.apache.maven.plugins
+ maven-antrun-plugin
+ false
+
+
+ org.codehaus.mojo
+ build-helper-maven-plugin
+ false
+
+
+
-
+
diff --git a/docs/src/main/asciidoc/spring-cloud-commons.adoc b/docs/src/main/asciidoc/spring-cloud-commons.adoc
index 573278e2..6f6e5dc4 100644
--- a/docs/src/main/asciidoc/spring-cloud-commons.adoc
+++ b/docs/src/main/asciidoc/spring-cloud-commons.adoc
@@ -24,7 +24,7 @@ Spring Cloud builds on top of that and adds a few features that probably all com
A Spring Cloud application operates by creating a "`bootstrap`" context, which is a parent context for the main application.
It is responsible for loading configuration properties from the external sources and for decrypting properties in the local external configuration files.
The two contexts share an `Environment`, which is the source of external properties for any Spring application.
-By default, bootstrap properties are added with high precedence, so they cannot be overridden by local configuration.
+By default, bootstrap properties (not `bootstrap.properties` but properties that are loaded during the bootstrap phase) are added with high precedence, so they cannot be overridden by local configuration.
The bootstrap context uses a different convention for locating external configuration than the main application context.
Instead of `application.yml` (or `.properties`), you can use `bootstrap.yml`, keeping the external configuration for bootstrap and main context
@@ -87,12 +87,12 @@ context you are building), properties in that profile get loaded as well, the sa
=== Overriding the Values of Remote Properties
The property sources that are added to your application by the bootstrap context are often "`remote`" (from example, from Spring Cloud Config Server).
-By default, they cannot be overridden locally, except on the command line.
+By default, they cannot be overridden locally.
If you want to let your applications override the remote properties with their own System properties or config files, the remote property source has to grant it permission by setting `spring.cloud.config.allowOverride=true` (it does not work to set this locally).
Once that flag is set, two finer-grained settings control the location of the remote properties in relation to system properties and the application's local configuration:
* `spring.cloud.config.overrideNone=true`: Override from any local property source.
-* `spring.cloud.config.overrideSystemProperties=false`: Only system properties and environment variables (but not the local config files) should override the remote settings.
+* `spring.cloud.config.overrideSystemProperties=false`: Only system properties, command line arguments, and environment variables (but not the local config files) should override the remote settings.
=== Customizing the Bootstrap Configuration
@@ -140,6 +140,15 @@ If you create a jar with this class in it and then add a `META-INF/spring.factor
org.springframework.cloud.bootstrap.BootstrapConfiguration=sample.custom.CustomPropertySourceLocator
----
+=== Logging Configuration
+
+If you are going to use Spring Boot to configure log settings than
+you should place this configuration in `bootstrap.[yml | properties]
+if you would like it to apply to all events.
+
+NOTE: For Spring Cloud to initialize logging configuration properly you cannot use a custom prefix. For example,
+using `custom.loggin.logpath` will not be recognized by Spring Cloud when initializing the logging system.
+
=== Environment Changes
The application listens for an `EnvironmentChangeEvent` and reacts to the change in a couple of standard ways (additional `ApplicationListeners` can be added as `@Beans` by the user in the normal way).
@@ -160,6 +169,7 @@ For instance, a `DataSource` can have its `maxPoolSize` changed at runtime (the
Re-binding `@ConfigurationProperties` does not cover another large class of use cases, where you need more control over the refresh and where you need a change to be atomic over the whole `ApplicationContext`.
To address those concerns, we have `@RefreshScope`.
+[[refresh-scope]]
=== Refresh Scope
When there is a configuration change, a Spring `@Bean` that is marked as `@RefreshScope` gets special treatment.
@@ -167,6 +177,12 @@ This feature addresses the problem of stateful beans that only get their configu
For instance, if a `DataSource` has open connections when the database URL is changed via the `Environment`, you probably want the holders of those connections to be able to complete what they are doing.
Then, the next time something borrows a connection from the pool, it gets one with the new URL.
+Sometimes, it might even be mandatory to apply the `@RefreshScope`
+annotation on some beans which can be only initialized once. If a bean
+is "immutable", you will have to either annotate the bean with `@RefreshScope`
+or specify the classname under the property key
+`spring.cloud.refresh.extra-refreshable`.
+
Refresh scope beans are lazy proxies that initialize when they are used (that is, when a method is called), and the scope acts as a cache of initialized values.
To force a bean to re-initialize on the next method call, you must invalidate its cache entry.
@@ -208,6 +224,9 @@ For a Spring Boot Actuator application, some additional management endpoints are
* `/actuator/restart` to close the `ApplicationContext` and restart it (disabled by default).
* `/actuator/pause` and `/actuator/resume` for calling the `Lifecycle` methods (`stop()` and `start()` on the `ApplicationContext`).
+NOTE: If you disable the `/actuator/restart` endpoint then the `/actuator/pause` and `/actuator/resume` endpoints
+will also be disabled since they are just a special case of `/actuator/restart`.
+
== Spring Cloud Commons: Common Abstractions
Patterns such as service discovery, load balancing, and circuit breakers lend themselves to a common abstraction layer that can be consumed by all Spring Cloud clients, independent of the implementation (for example, discovery with Eureka or Consul).
@@ -287,6 +306,14 @@ public class MyConfiguration {
Each `ServiceRegistry` implementation has its own `Registry` implementation.
+* `ZookeeperRegistration` used with `ZookeeperServiceRegistry`
+* `EurekaRegistration` used with `EurekaServiceRegistry`
+* `ConsulRegistration` used with `ConsulServiceRegistry`
+
+If you are using the `ServiceRegistry` interface, you are going to need to pass the
+correct `Registry` implementation for the `ServiceRegistry` implementation you
+are using.
+
==== ServiceRegistry Auto-Registration
@@ -527,7 +554,7 @@ spring:
You can also force the use of only specified network addresses by using a list of regular expressions, as shown in the following example:
-.application.yml
+.bootstrap.yml
----
spring:
cloud:
diff --git a/eclipse/eclipse-code-formatter.xml b/eclipse/eclipse-code-formatter.xml
new file mode 100644
index 00000000..2586a2a2
--- /dev/null
+++ b/eclipse/eclipse-code-formatter.xml
@@ -0,0 +1,315 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/eclipse/org.eclipse.jdt.core.prefs b/eclipse/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000..fd349833
--- /dev/null
+++ b/eclipse/org.eclipse.jdt.core.prefs
@@ -0,0 +1,412 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.doc.comment.support=enabled
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=default
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=all_standard_tags
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=default
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.processAnnotations=disabled
+org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0
+org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=false
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=false
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=false
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=do not insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
+org.eclipse.jdt.core.formatter.comment.line_length=90
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=90
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=true
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
diff --git a/eclipse/org.eclipse.jdt.ui.prefs b/eclipse/org.eclipse.jdt.ui.prefs
new file mode 100644
index 00000000..e7f77db5
--- /dev/null
+++ b/eclipse/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,125 @@
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_serial_version_id=false
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=false
+cleanup.always_use_this_for_non_static_field_access=true
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.convert_functional_interfaces=false
+cleanup.convert_to_enhanced_for_loop=false
+cleanup.correct_indentation=false
+cleanup.format_source_code=true
+cleanup.format_source_code_changes_only=false
+cleanup.insert_inferred_type_arguments=false
+cleanup.make_local_variable_final=false
+cleanup.make_parameters_final=false
+cleanup.make_private_fields_final=false
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=false
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=true
+cleanup.organize_imports=true
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+cleanup.qualify_static_member_accesses_with_declaring_class=true
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.remove_private_constructors=true
+cleanup.remove_redundant_type_arguments=true
+cleanup.remove_trailing_whitespaces=true
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=false
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.use_anonymous_class_creation=false
+cleanup.use_blocks=true
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_lambda=true
+cleanup.use_parentheses_in_expressions=false
+cleanup.use_this_for_non_static_field_access=false
+cleanup.use_this_for_non_static_field_access_only_if_necessary=false
+cleanup.use_this_for_non_static_method_access=false
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup.use_type_arguments=false
+cleanup_profile=_Spring Cloud Cleanup Conventions
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Spring Cloud Java Conventions
+formatter_settings_version=13
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=java;javax;;org.springframework;\#;
+org.eclipse.jdt.ui.javadoc=true
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.ondemandthreshold=9999
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.staticondemandthreshold=9999
+org.eclipse.jdt.ui.text.custom_code_templates=/**\n * @return the ${bare_field_name}\n *//**\n * @param ${param} the ${bare_field_name} to set\n *//**\n * ${tags}\n *//*\n * Copyright 2012-2018 the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http\://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *//**\n * @author ${user}\n *//**\n * \n *//**\n * ${tags}\n *//* (non-Javadoc)\n * ${see_to_overridden}\n *//**\n * ${tags}\n * ${see_to_target}\n */${filecomment}\n\n${package_declaration}\n${typecomment}\n${type_declaration}\n\n\n\n// ${todo} Auto-generated catch block\nthrow new UnsupportedOperationException("Auto-generated method stub", ${exception_var});// ${todo} Auto-generated method stub\nthrow new UnsupportedOperationException("Auto-generated method stub");${body_statement}\n// ${todo} Auto-generated constructor stubreturn ${field};${field} \= ${param};
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=true
+sp_cleanup.always_use_this_for_non_static_field_access=true
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=false
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=false
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=false
+sp_cleanup.remove_unused_imports=true
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=true
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=false
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/pom.xml b/pom.xml
index fbb9b247..9dfbf2c7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0org.springframework.cloudspring-cloud-commons-parent
- 2.0.0.BUILD-SNAPSHOT
+ 2.1.0.BUILD-SNAPSHOTpomSpring Cloud Commons ParentSpring Cloud Commons Parent
@@ -11,7 +11,7 @@
org.springframework.cloudspring-cloud-build
- 2.0.1.BUILD-SNAPSHOT
+ 2.1.0.BUILD-SNAPSHOT
@@ -21,7 +21,6 @@
HEAD
- .commons
@@ -34,11 +33,11 @@
.settings/org.eclipse.jdt.ui.prefs
- ${main.basedir}/eclipse/org.eclipse.jdt.ui.prefs
+ ${maven.multiModuleProjectDirectory}/eclipse/org.eclipse.jdt.ui.prefs.settings/org.eclipse.jdt.core.prefs
- ${main.basedir}/eclipse/org.eclipse.jdt.core.prefs
+ ${maven.multiModuleProjectDirectory}/eclipse/org.eclipse.jdt.core.prefs
diff --git a/spring-cloud-commons-dependencies/pom.xml b/spring-cloud-commons-dependencies/pom.xml
index b0e08f98..c7e8642c 100644
--- a/spring-cloud-commons-dependencies/pom.xml
+++ b/spring-cloud-commons-dependencies/pom.xml
@@ -5,16 +5,16 @@
spring-cloud-dependencies-parentorg.springframework.cloud
- 2.0.0.BUILD-SNAPSHOT
+ 2.1.0.BUILD-SNAPSHOTspring-cloud-commons-dependencies
- 2.0.0.BUILD-SNAPSHOT
+ 2.1.0.BUILD-SNAPSHOTpomspring-cloud-commons-dependenciesSpring Cloud Commons Dependencies
- 1.0.5.RELEASE
+ 1.0.7.RELEASE
diff --git a/spring-cloud-commons/pom.xml b/spring-cloud-commons/pom.xml
index 5b2ef897..2a7cc349 100644
--- a/spring-cloud-commons/pom.xml
+++ b/spring-cloud-commons/pom.xml
@@ -6,7 +6,7 @@
org.springframework.cloudspring-cloud-commons-parent
- 2.0.0.BUILD-SNAPSHOT
+ 2.1.0.BUILD-SNAPSHOT..spring-cloud-commons
@@ -113,6 +113,11 @@
spring-boot-starter-aoptrue
+
+ org.springframework.boot
+ spring-boot-autoconfigure-processor
+ true
+ org.springframework.retryspring-retry
diff --git a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/DefaultServiceInstance.java b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/DefaultServiceInstance.java
index d7e710c2..d9498482 100644
--- a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/DefaultServiceInstance.java
+++ b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/DefaultServiceInstance.java
@@ -64,9 +64,9 @@ public class DefaultServiceInstance implements ServiceInstance {
}
/**
- * Create a uri from the given ServiceInstance's host:port
+ * Creates a URI from the given ServiceInstance's host:port.
* @param instance
- * @return URI of the form (secure)?https:http + "host:port"
+ * @return URI of the form (secure)?https:http + "host:port".
*/
public static URI getUri(ServiceInstance instance) {
String scheme = (instance.isSecure()) ? "https" : "http";
diff --git a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/ServiceInstance.java b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/ServiceInstance.java
index 9fe58c48..d380bc02 100644
--- a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/ServiceInstance.java
+++ b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/ServiceInstance.java
@@ -20,43 +20,43 @@ import java.net.URI;
import java.util.Map;
/**
- * Represents an instance of a Service in a Discovery System
+ * Represents an instance of a service in a discovery system.
* @author Spencer Gibb
*/
public interface ServiceInstance {
/**
- * @return the service id as registered.
+ * @return The service ID as registered.
*/
String getServiceId();
/**
- * @return the hostname of the registered ServiceInstance
+ * @return The hostname of the registered service instance.
*/
String getHost();
/**
- * @return the port of the registered ServiceInstance
+ * @return The port of the registered service instance.
*/
int getPort();
/**
- * @return if the port of the registered ServiceInstance is https or not
+ * @return Whether the port of the registered service instance uses HTTPS.
*/
boolean isSecure();
/**
- * @return the service uri address
+ * @return The service URI address.
*/
URI getUri();
/**
- * @return the key value pair metadata associated with the service instance
+ * @return The key / value pair metadata associated with the service instance.
*/
Map getMetadata();
/**
- * @return the scheme of the instance
+ * @return The scheme of the service instance.
*/
default String getScheme() {
return null;
diff --git a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/circuitbreaker/EnableCircuitBreakerImportSelector.java b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/circuitbreaker/EnableCircuitBreakerImportSelector.java
index e56b592b..934ffb74 100644
--- a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/circuitbreaker/EnableCircuitBreakerImportSelector.java
+++ b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/circuitbreaker/EnableCircuitBreakerImportSelector.java
@@ -21,7 +21,7 @@ import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
/**
- * Import a single circuit breaker implementation Configuration
+ * Imports a single circuit breaker implementation configuration.
* @author Spencer Gibb
*/
@Order(Ordered.LOWEST_PRECEDENCE - 100)
diff --git a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/DiscoveryClient.java b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/DiscoveryClient.java
index 28322b2f..cce4044a 100644
--- a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/DiscoveryClient.java
+++ b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/DiscoveryClient.java
@@ -22,28 +22,28 @@ import org.springframework.cloud.client.ServiceInstance;
import org.springframework.core.Ordered;
/**
- * DiscoveryClient represents read operations commonly available to Discovery service such as
- * Netflix Eureka or consul.io
+ * Represents read operations commonly available to discovery services such as Netflix
+ * Eureka or consul.io.
* @author Spencer Gibb
* @author Olga Maciaszek-Sharma
*/
public interface DiscoveryClient extends Ordered {
/**
- * A human readable description of the implementation, used in HealthIndicator
- * @return the description
+ * A human-readable description of the implementation, used in HealthIndicator.
+ * @return The description.
*/
String description();
/**
- * Get all ServiceInstances associated with a particular serviceId
- * @param serviceId the serviceId to query
- * @return a List of ServiceInstance
+ * Gets all ServiceInstances associated with a particular serviceId.
+ * @param serviceId The serviceId to query.
+ * @return A List of ServiceInstance.
*/
List getInstances(String serviceId);
/**
- * @return all known service ids
+ * @return All known service IDs.
*/
List getServices();
diff --git a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/composite/CompositeDiscoveryClient.java b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/composite/CompositeDiscoveryClient.java
index b653890d..e7f6deb5 100644
--- a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/composite/CompositeDiscoveryClient.java
+++ b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/composite/CompositeDiscoveryClient.java
@@ -10,8 +10,8 @@ import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.core.annotation.AnnotationAwareOrderComparator;
/**
- * A {@link DiscoveryClient} composed of other Discovery Clients that will delegate the
- * calls to each of them in order
+ * A {@link DiscoveryClient} that is composed of other discovery clients and delegates
+ * calls to each of them in order.
*
* @author Biju Kunjummen
* @author Olga Maciaszek-Sharma
diff --git a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/composite/CompositeDiscoveryClientAutoConfiguration.java b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/composite/CompositeDiscoveryClientAutoConfiguration.java
index b71d28da..cefc0337 100644
--- a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/composite/CompositeDiscoveryClientAutoConfiguration.java
+++ b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/composite/CompositeDiscoveryClientAutoConfiguration.java
@@ -10,7 +10,7 @@ import org.springframework.context.annotation.Primary;
import java.util.List;
/**
- * Auto-configuration for Composite Discovery Client.
+ * Auto-configuration for composite discovery client.
*
* @author Biju Kunjummen
*/
diff --git a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/event/HeartbeatEvent.java b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/event/HeartbeatEvent.java
index 040c4646..e0e6eac0 100644
--- a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/event/HeartbeatEvent.java
+++ b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/event/HeartbeatEvent.java
@@ -19,9 +19,9 @@ package org.springframework.cloud.client.discovery.event;
import org.springframework.context.ApplicationEvent;
/**
- * Event DiscoveryClient implementation can broadcast if they support heartbeat's from the
- * discovery server. Provides listeners with a basic indication of a state change in the
- * service catalog.
+ * An event that a DiscoveryClient implementation can broadcast if it supports
+ * heartbeats from the discovery server. Provides listeners with a basic indication
+ * of a state change in the service catalog.
*
* @author Spencer Gibb
* @author Dave Syer
@@ -32,11 +32,11 @@ public class HeartbeatEvent extends ApplicationEvent {
private final Object state;
/**
- * Create a new event with a source (for example a discovery client) and a value.
+ * Creates a new event with a source (for example, a discovery client) and a value.
* Neither parameter should be relied on to have specific content or format.
*
- * @param source the source of the event
- * @param state the value indicating state of the catalog
+ * @param source The source of the event.
+ * @param state The value indicating state of the catalog.
*/
public HeartbeatEvent(Object source, Object state) {
super(source);
@@ -45,12 +45,12 @@ public class HeartbeatEvent extends ApplicationEvent {
/**
* A value representing the state of the service catalog. The only requirement is that
- * it changes when the catalog is updated, so it can be as simple as a version
- * conuter, or a hash. Implementations can provide information to help users visualize
+ * it changes when the catalog is updated; it can be as simple as a version counter or
+ * a hash. Implementations can provide information to help users visualize
* what is going on in the catalog, but users should not rely on the content (since
* the implementation of the underlying discovery might change).
*
- * @return A value representing state of the service catalog
+ * @return A value representing state of the service catalog.
*/
public Object getValue() {
return this.state;
diff --git a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/event/HeartbeatMonitor.java b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/event/HeartbeatMonitor.java
index 15d0709b..cfcd0629 100644
--- a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/event/HeartbeatMonitor.java
+++ b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/event/HeartbeatMonitor.java
@@ -19,8 +19,8 @@ package org.springframework.cloud.client.discovery.event;
import java.util.concurrent.atomic.AtomicReference;
/**
- * Helper class for listeners to the {@link HeartbeatEvent} providing a convenient way to
- * determine if there has been a change in state.
+ * Helper class for listeners to the {@link HeartbeatEvent}, providing a convenient way
+ * to determine if there has been a change in state.
*
* @author Dave Syer
*/
@@ -29,8 +29,8 @@ public class HeartbeatMonitor {
private AtomicReference
+
+ org.springframework.boot
+ spring-boot-autoconfigure-processor
+ true
+ org.springframework.bootspring-boot-starter-test
diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/autoconfigure/LifecycleMvcEndpointAutoConfiguration.java b/spring-cloud-context/src/main/java/org/springframework/cloud/autoconfigure/LifecycleMvcEndpointAutoConfiguration.java
index 0db22a8a..66c554cd 100644
--- a/spring-cloud-context/src/main/java/org/springframework/cloud/autoconfigure/LifecycleMvcEndpointAutoConfiguration.java
+++ b/spring-cloud-context/src/main/java/org/springframework/cloud/autoconfigure/LifecycleMvcEndpointAutoConfiguration.java
@@ -24,8 +24,8 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.ConfigurableEnvironment;
/**
- * Autoconfiguration for some MVC endpoints governing the application context lifecycle.
- * Provides restart, pause, resume, refresh (environment) and environment update
+ * Auto-configuration for some MVC endpoints governing the application context lifecycle.
+ * Provides restart, pause, resume, refresh (environment), and environment update
* endpoints.
*
* @author Dave Syer
diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/autoconfigure/RefreshAutoConfiguration.java b/spring-cloud-context/src/main/java/org/springframework/cloud/autoconfigure/RefreshAutoConfiguration.java
index c6e41a6f..78518ef2 100644
--- a/spring-cloud-context/src/main/java/org/springframework/cloud/autoconfigure/RefreshAutoConfiguration.java
+++ b/spring-cloud-context/src/main/java/org/springframework/cloud/autoconfigure/RefreshAutoConfiguration.java
@@ -23,13 +23,14 @@ import java.util.Set;
import javax.annotation.PostConstruct;
-import org.springframework.aop.scope.ScopedProxyUtils;
+import org.springframework.aop.framework.ProxyFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.ListableBeanFactory;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.beans.factory.config.BeanDefinitionHolder;
+import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
@@ -62,10 +63,14 @@ import org.springframework.stereotype.Component;
*/
@Configuration
@ConditionalOnClass(RefreshScope.class)
-@ConditionalOnProperty(name = "spring.cloud.refresh.enabled", matchIfMissing = true)
+@ConditionalOnProperty(name = RefreshAutoConfiguration.REFRESH_SCOPE_ENABLED, matchIfMissing = true)
@AutoConfigureBefore(HibernateJpaAutoConfiguration.class)
public class RefreshAutoConfiguration {
+ public static final String REFRESH_SCOPE_NAME = "refresh";
+ public static final String REFRESH_SCOPE_PREFIX = "spring.cloud.refresh";
+ public static final String REFRESH_SCOPE_ENABLED = REFRESH_SCOPE_PREFIX + ".enabled";
+
@Bean
@ConditionalOnMissingBean(RefreshScope.class)
public static RefreshScope refreshScope() {
@@ -95,7 +100,9 @@ public class RefreshAutoConfiguration {
@Component
protected static class RefreshScopeBeanDefinitionEnhancer
- implements BeanDefinitionRegistryPostProcessor {
+ implements BeanPostProcessor, BeanDefinitionRegistryPostProcessor {
+
+ private BeanDefinitionRegistry registry;
/**
* Class names for beans to post process into refresh scope. Useful when you don't
@@ -104,8 +111,6 @@ public class RefreshAutoConfiguration {
private Set refreshables = new HashSet<>(
Arrays.asList("com.zaxxer.hikari.HikariDataSource"));
- private Environment environment;
-
public Set getRefreshable() {
return this.refreshables;
}
@@ -124,29 +129,42 @@ public class RefreshAutoConfiguration {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
throws BeansException {
+ Environment environment = beanFactory.getBean(Environment.class);
+ if (environment == null) {
+ environment = new StandardEnvironment();
+ }
+ Binder.get(environment).bind(REFRESH_SCOPE_PREFIX, Bindable.ofInstance(this));
}
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)
throws BeansException {
- for (String name : registry.getBeanDefinitionNames()) {
- BeanDefinition definition = registry.getBeanDefinition(name);
- if (isApplicable(registry, name, definition)) {
- BeanDefinitionHolder holder = new BeanDefinitionHolder(definition,
- name);
- BeanDefinitionHolder proxy = ScopedProxyUtils
- .createScopedProxy(holder, registry, true);
- definition.setScope("refresh");
- registry.registerBeanDefinition(proxy.getBeanName(),
- proxy.getBeanDefinition());
- }
+ this.registry = registry;
+ }
+
+ @Override
+ public Object postProcessAfterInitialization(Object bean, String beanName)
+ throws BeansException {
+ BeanDefinition definition = null;
+ try {
+ definition = registry.getBeanDefinition(beanName);
}
+ catch (NoSuchBeanDefinitionException e) {
+ // just ignore and move on
+ return bean;
+ }
+ if (isApplicable(registry, beanName, definition)) {
+ definition.setScope(REFRESH_SCOPE_NAME);
+ ProxyFactory proxyFactory = new ProxyFactory(bean);
+ return proxyFactory.getProxy();
+ }
+ return bean;
}
private boolean isApplicable(BeanDefinitionRegistry registry, String name,
BeanDefinition definition) {
String scope = definition.getScope();
- if ("refresh".equals(scope)) {
+ if (REFRESH_SCOPE_NAME.equals(scope)) {
// Already refresh scoped
return false;
}
@@ -158,15 +176,6 @@ public class RefreshAutoConfiguration {
}
}
if (type != null) {
- if (this.environment == null && registry instanceof BeanFactory) {
- this.environment = ((BeanFactory) registry)
- .getBean(Environment.class);
- }
- if (this.environment == null) {
- this.environment = new StandardEnvironment();
- }
- Binder.get(environment).bind("spring.cloud.refresh",
- Bindable.ofInstance(this));
return this.refreshables.contains(type);
}
return false;
diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/autoconfigure/WritableEnvironmentEndpointAutoConfiguration.java b/spring-cloud-context/src/main/java/org/springframework/cloud/autoconfigure/WritableEnvironmentEndpointAutoConfiguration.java
index f3c7a5d2..dedfb4e2 100644
--- a/spring-cloud-context/src/main/java/org/springframework/cloud/autoconfigure/WritableEnvironmentEndpointAutoConfiguration.java
+++ b/spring-cloud-context/src/main/java/org/springframework/cloud/autoconfigure/WritableEnvironmentEndpointAutoConfiguration.java
@@ -54,7 +54,7 @@ public class WritableEnvironmentEndpointAutoConfiguration {
@Bean
@ConditionalOnEnabledEndpoint
- public WritableEnvironmentEndpointWebExtension environmentWebEndpointExtension(
+ public WritableEnvironmentEndpointWebExtension environmentEndpointWebExtension(
WritableEnvironmentEndpoint endpoint, EnvironmentManager environment) {
return new WritableEnvironmentEndpointWebExtension(endpoint, environment);
}
diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/BootstrapConfiguration.java b/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/BootstrapConfiguration.java
index d8df65d1..5343950d 100644
--- a/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/BootstrapConfiguration.java
+++ b/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/BootstrapConfiguration.java
@@ -31,7 +31,7 @@ import java.lang.annotation.Target;
public @interface BootstrapConfiguration {
/**
- * Exclude specific auto-configuration classes such that they will never be applied.
+ * Excludes specific auto-configuration classes such that they will never be applied.
*/
Class>[] exclude() default {};
diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/config/PropertySourceBootstrapProperties.java b/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/config/PropertySourceBootstrapProperties.java
index 8bf1c4a2..f686cc44 100644
--- a/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/config/PropertySourceBootstrapProperties.java
+++ b/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/config/PropertySourceBootstrapProperties.java
@@ -20,7 +20,7 @@ public class PropertySourceBootstrapProperties {
/**
* Flag to indicate that when {@link #setAllowOverride(boolean) allowOverride} is
- * true, external properties should take lowest priority, and not override any
+ * true, external properties should take lowest priority and should not override any
* existing property sources (including local config files). Default false.
*/
private boolean overrideNone = false;
diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/config/PropertySourceLocator.java b/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/config/PropertySourceLocator.java
index 96fce80d..ea6bcf10 100644
--- a/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/config/PropertySourceLocator.java
+++ b/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/config/PropertySourceLocator.java
@@ -29,10 +29,10 @@ import org.springframework.core.env.PropertySource;
public interface PropertySourceLocator {
/**
- * @param environment the current Environment
- * @return a PropertySource or null if there is none
+ * @param environment The current Environment.
+ * @return A PropertySource, or null if there is none.
*
- * @throws IllegalStateException if there is a fail fast condition
+ * @throws IllegalStateException if there is a fail-fast condition.
*/
PropertySource> locate(Environment environment);
diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/encrypt/EnvironmentDecryptApplicationInitializer.java b/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/encrypt/EnvironmentDecryptApplicationInitializer.java
index af49fdc1..ec67ef5c 100644
--- a/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/encrypt/EnvironmentDecryptApplicationInitializer.java
+++ b/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/encrypt/EnvironmentDecryptApplicationInitializer.java
@@ -42,7 +42,7 @@ import org.springframework.core.env.SystemEnvironmentPropertySource;
import org.springframework.security.crypto.encrypt.TextEncryptor;
/**
- * Decrypt properties from the environment and insert them with high priority so they
+ * Decrypts properties from the environment and inserts them with high priority so they
* override the encrypted values.
*
* @author Dave Syer
@@ -67,7 +67,7 @@ public class EnvironmentDecryptApplicationInitializer implements
/**
* Strategy to determine how to handle exceptions during decryption.
*
- * @param failOnError the flag value (default true)
+ * @param failOnError The flag value (default true).
*/
public void setFailOnError(boolean failOnError) {
this.failOnError = failOnError;
diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/encrypt/KeyProperties.java b/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/encrypt/KeyProperties.java
index 2d212f1d..bb2c773e 100644
--- a/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/encrypt/KeyProperties.java
+++ b/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/encrypt/KeyProperties.java
@@ -22,13 +22,13 @@ import org.springframework.core.io.Resource;
public class KeyProperties {
/**
- * A symmetric key. As a stronger alternative consider using a keystore.
+ * A symmetric key. As a stronger alternative, consider using a keystore.
*/
private String key;
/**
- * A salt for the symmetric key in the form of a hex-encoded byte array. As a stronger
- * alternative consider using a keystore.
+ * A salt for the symmetric key, in the form of a hex-encoded byte array. As a stronger
+ * alternative, consider using a keystore.
*/
private String salt = "deadbeef";
@@ -131,4 +131,4 @@ public class KeyProperties {
}
}
-}
\ No newline at end of file
+}
diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/encrypt/RsaProperties.java b/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/encrypt/RsaProperties.java
index 38b05550..78d5cdef 100644
--- a/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/encrypt/RsaProperties.java
+++ b/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/encrypt/RsaProperties.java
@@ -27,22 +27,22 @@ import org.springframework.security.rsa.crypto.RsaAlgorithm;
public class RsaProperties {
/**
- * The RSA algorithm to use (DEFAULT or OEAP). Once it is set do not change it (or
- * existing ciphers will not a decryptable).
+ * The RSA algorithm to use (DEFAULT or OEAP). Once it is set, do not change it (or
+ * existing ciphers will not be decryptable).
*/
private RsaAlgorithm algorithm = RsaAlgorithm.DEFAULT;
/**
* Flag to indicate that "strong" AES encryption should be used internally. If
- * true then the GCM algorithm is applied to the AES encrypted bytes. Default is
- * false (in which case "standard" CBC is used instead). Once it is set do not
- * change it (or existing ciphers will not a decryptable).
+ * true, then the GCM algorithm is applied to the AES encrypted bytes. Default is
+ * false (in which case "standard" CBC is used instead). Once it is set, do not
+ * change it (or existing ciphers will not be decryptable).
*/
private boolean strong = false;
/**
- * Salt for the random secret used to encrypt cipher text. Once it is set do not
- * change it (or existing ciphers will not a decryptable).
+ * Salt for the random secret used to encrypt cipher text. Once it is set, do not
+ * change it (or existing ciphers will not be decryptable).
*/
private String salt = "deadbeef";
diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/context/environment/EnvironmentChangeEvent.java b/spring-cloud-context/src/main/java/org/springframework/cloud/context/environment/EnvironmentChangeEvent.java
index d58e24d8..e6df1e32 100644
--- a/spring-cloud-context/src/main/java/org/springframework/cloud/context/environment/EnvironmentChangeEvent.java
+++ b/spring-cloud-context/src/main/java/org/springframework/cloud/context/environment/EnvironmentChangeEvent.java
@@ -42,7 +42,7 @@ public class EnvironmentChangeEvent extends ApplicationEvent {
}
/**
- * @return the keys
+ * @return The keys.
*/
public Set getKeys() {
return keys;
diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/context/environment/EnvironmentManager.java b/spring-cloud-context/src/main/java/org/springframework/cloud/context/environment/EnvironmentManager.java
index 12a89dd1..7edfac7f 100644
--- a/spring-cloud-context/src/main/java/org/springframework/cloud/context/environment/EnvironmentManager.java
+++ b/spring-cloud-context/src/main/java/org/springframework/cloud/context/environment/EnvironmentManager.java
@@ -32,7 +32,7 @@ import org.springframework.stereotype.Component;
/**
* Entry point for making local (but volatile) changes to the {@link Environment} of a
* running application. Allows properties to be added and values changed, simply by adding
- * them to a high priority property source in the existing Environment.
+ * them to a high-priority property source in the existing Environment.
*
* @author Dave Syer
*
diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/context/environment/WritableEnvironmentEndpointWebExtension.java b/spring-cloud-context/src/main/java/org/springframework/cloud/context/environment/WritableEnvironmentEndpointWebExtension.java
index 9a99193f..7c8a02e4 100644
--- a/spring-cloud-context/src/main/java/org/springframework/cloud/context/environment/WritableEnvironmentEndpointWebExtension.java
+++ b/spring-cloud-context/src/main/java/org/springframework/cloud/context/environment/WritableEnvironmentEndpointWebExtension.java
@@ -24,7 +24,7 @@ import org.springframework.boot.actuate.endpoint.web.annotation.EndpointWebExten
import org.springframework.boot.actuate.env.EnvironmentEndpointWebExtension;
/**
- * MVC endpoint for the {@link EnvironmentManager} providing a POST to /env as a simple
+ * MVC endpoint for the {@link EnvironmentManager}, providing a POST to /env as a simple
* way to change the Environment.
*
* @author Dave Syer
diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/context/properties/ConfigurationPropertiesBeans.java b/spring-cloud-context/src/main/java/org/springframework/cloud/context/properties/ConfigurationPropertiesBeans.java
index f655e500..d9b9cedd 100644
--- a/spring-cloud-context/src/main/java/org/springframework/cloud/context/properties/ConfigurationPropertiesBeans.java
+++ b/spring-cloud-context/src/main/java/org/springframework/cloud/context/properties/ConfigurationPropertiesBeans.java
@@ -74,7 +74,7 @@ ApplicationContextAware {
}
/**
- * @param beans the bean meta data to set
+ * @param beans The bean meta data to set.
*/
public void setBeanMetaDataStore(ConfigurationBeanFactoryMetadata beans) {
this.metaData = beans;
diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/context/properties/ConfigurationPropertiesRebinder.java b/spring-cloud-context/src/main/java/org/springframework/cloud/context/properties/ConfigurationPropertiesRebinder.java
index 0c66b46c..c393b26d 100644
--- a/spring-cloud-context/src/main/java/org/springframework/cloud/context/properties/ConfigurationPropertiesRebinder.java
+++ b/spring-cloud-context/src/main/java/org/springframework/cloud/context/properties/ConfigurationPropertiesRebinder.java
@@ -20,7 +20,6 @@ import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
-import org.springframework.aop.framework.Advised;
import org.springframework.aop.support.AopUtils;
import org.springframework.beans.BeansException;
import org.springframework.boot.context.properties.ConfigurationProperties;
@@ -34,15 +33,16 @@ import org.springframework.jmx.export.annotation.ManagedAttribute;
import org.springframework.jmx.export.annotation.ManagedOperation;
import org.springframework.jmx.export.annotation.ManagedResource;
import org.springframework.stereotype.Component;
+import org.springframework.cloud.util.ProxyUtils;
/**
* Listens for {@link EnvironmentChangeEvent} and rebinds beans that were bound to the
* {@link Environment} using {@link ConfigurationProperties
* @ConfigurationProperties}. When these beans are re-bound and
- * re-initialized the changes are available immediately to any component that is using the
+ * re-initialized, the changes are available immediately to any component that is using the
* @ConfigurationProperties bean.
*
- * @see RefreshScope for a deeper and optionally more focused refresh of bean components
+ * @see RefreshScope for a deeper and optionally more focused refresh of bean components.
*
* @author Dave Syer
*
@@ -71,7 +71,7 @@ public class ConfigurationPropertiesRebinder
/**
* A map of bean name to errors when instantiating the bean.
*
- * @return the errors accumulated since the latest destroy
+ * @return The errors accumulated since the latest destroy.
*/
public Map getErrors() {
return this.errors;
@@ -94,7 +94,7 @@ public class ConfigurationPropertiesRebinder
try {
Object bean = this.applicationContext.getBean(name);
if (AopUtils.isAopProxy(bean)) {
- bean = getTargetObject(bean);
+ bean = ProxyUtils.getTargetObject(bean);
}
if (bean != null) {
this.applicationContext.getAutowireCapableBeanFactory().destroyBean(bean);
@@ -115,19 +115,6 @@ public class ConfigurationPropertiesRebinder
return false;
}
- @SuppressWarnings("unchecked")
- private static T getTargetObject(Object candidate) {
- try {
- if (AopUtils.isAopProxy(candidate) && (candidate instanceof Advised)) {
- return (T) ((Advised) candidate).getTargetSource().getTarget();
- }
- }
- catch (Exception ex) {
- throw new IllegalStateException("Failed to unwrap proxied object", ex);
- }
- return (T) candidate;
- }
-
@ManagedAttribute
public Set getBeanNames() {
return new HashSet(this.beans.getBeanNames());
diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/context/refresh/ContextRefresher.java b/spring-cloud-context/src/main/java/org/springframework/cloud/context/refresh/ContextRefresher.java
index 8c013556..8bd7bd40 100644
--- a/spring-cloud-context/src/main/java/org/springframework/cloud/context/refresh/ContextRefresher.java
+++ b/spring-cloud-context/src/main/java/org/springframework/cloud/context/refresh/ContextRefresher.java
@@ -56,18 +56,31 @@ public class ContextRefresher {
this.scope = scope;
}
+ protected ConfigurableApplicationContext getContext() {
+ return this.context;
+ }
+
+ protected RefreshScope getScope() {
+ return this.scope;
+ }
+
public synchronized Set refresh() {
+ Set keys = refreshEnvironment();
+ this.scope.refreshAll();
+ return keys;
+ }
+
+ public synchronized Set refreshEnvironment() {
Map before = extract(
this.context.getEnvironment().getPropertySources());
addConfigFilesToEnvironment();
Set keys = changes(before,
extract(this.context.getEnvironment().getPropertySources())).keySet();
this.context.publishEvent(new EnvironmentChangeEvent(context, keys));
- this.scope.refreshAll();
return keys;
}
- /* for testing */ ConfigurableApplicationContext addConfigFilesToEnvironment() {
+ /* For testing. */ ConfigurableApplicationContext addConfigFilesToEnvironment() {
ConfigurableApplicationContext capture = null;
try {
StandardEnvironment environment = copyEnvironment(
diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/context/restart/RestartListener.java b/spring-cloud-context/src/main/java/org/springframework/cloud/context/restart/RestartListener.java
index 5a5a4588..544b703c 100644
--- a/spring-cloud-context/src/main/java/org/springframework/cloud/context/restart/RestartListener.java
+++ b/spring-cloud-context/src/main/java/org/springframework/cloud/context/restart/RestartListener.java
@@ -24,7 +24,7 @@ import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.event.SmartApplicationListener;
/**
- * A listener that stores enough information about an application as it starts, to be able
+ * A listener that stores enough information about an application, as it starts, to be able
* to restart it later if needed.
*
* @author Dave Syer
diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/context/scope/GenericScope.java b/spring-cloud-context/src/main/java/org/springframework/cloud/context/scope/GenericScope.java
index da04d187..724833b9 100644
--- a/spring-cloud-context/src/main/java/org/springframework/cloud/context/scope/GenericScope.java
+++ b/spring-cloud-context/src/main/java/org/springframework/cloud/context/scope/GenericScope.java
@@ -91,10 +91,10 @@ public class GenericScope implements Scope, BeanFactoryPostProcessor,
private ConcurrentMap locks = new ConcurrentHashMap<>();
/**
- * Manual override for the serialization id that will be used to identify the bean
+ * Manual override for the serialization ID that will be used to identify the bean
* factory. The default is a unique key based on the bean names in the bean factory.
*
- * @param id the id to set
+ * @param id The ID to set.
*/
public void setId(String id) {
this.id = id;
@@ -103,7 +103,7 @@ public class GenericScope implements Scope, BeanFactoryPostProcessor,
/**
* The name of this scope. Default "generic".
*
- * @param name the name value to set
+ * @param name The name value to set.
*/
public void setName(String name) {
this.name = name;
@@ -112,7 +112,7 @@ public class GenericScope implements Scope, BeanFactoryPostProcessor,
/**
* The cache implementation to use for bean instances in this scope.
*
- * @param cache the cache to use
+ * @param cache The cache to use.
*/
public void setScopeCache(ScopeCache cache) {
this.cache = new BeanLifecycleWrapperCache(cache);
@@ -121,7 +121,7 @@ public class GenericScope implements Scope, BeanFactoryPostProcessor,
/**
* A map of bean name to errors when instantiating the bean.
*
- * @return the errors accumulated since the latest destroy
+ * @return The errors accumulated since the latest destroy.
*/
public Map getErrors() {
return this.errors;
@@ -153,10 +153,10 @@ public class GenericScope implements Scope, BeanFactoryPostProcessor,
}
/**
- * Destroy the named bean (i.e. flush it from the cache by default).
+ * Destroys the named bean (i.e. flushes it from the cache by default).
*
- * @param name the bean name to flush
- * @return true if the bean was already cached, false otherwise
+ * @param name The bean name to flush.
+ * @return True if the bean was already cached; false otherwise.
*/
protected boolean destroy(String name) {
BeanLifecycleWrapper wrapper = this.cache.remove(name);
@@ -258,6 +258,7 @@ public class GenericScope implements Scope, BeanFactoryPostProcessor,
if (getName().equals(root.getDecoratedDefinition().getBeanDefinition()
.getScope())) {
root.setBeanClass(LockedScopedProxyFactoryBean.class);
+ root.getConstructorArgumentValues().addGenericArgumentValue(this);
// surprising that a scoped proxy bean definition is not already
// marked as synthetic?
root.setSynthetic(true);
@@ -268,13 +269,13 @@ public class GenericScope implements Scope, BeanFactoryPostProcessor,
}
/**
- * If the bean factory is a DefaultListableBeanFactory then it can serialize scoped
+ * If the bean factory is a DefaultListableBeanFactory, then it can serialize scoped
* beans and deserialize them in another context (even in another JVM), as long as the
- * ids of the bean factories match. This method sets up the serialization id to be
- * either the id provided to the scope instance, or if that is null, a hash of all the
+ * IDs of the bean factories match. This method sets up the serialization ID to be
+ * either the ID provided to the scope instance, or if that is null, a hash of all the
* bean names.
*
- * @param beanFactory the bean factory to configure
+ * @param beanFactory The bean factory to configure.
*/
private void setSerializationId(ConfigurableListableBeanFactory beanFactory) {
@@ -316,6 +317,10 @@ public class GenericScope implements Scope, BeanFactoryPostProcessor,
return this.name;
}
+ protected ReadWriteLock getLock(String beanName) {
+ return locks.get(beanName);
+ }
+
private static class BeanLifecycleWrapperCache {
private final ScopeCache cache;
@@ -437,11 +442,16 @@ public class GenericScope implements Scope, BeanFactoryPostProcessor,
}
@SuppressWarnings("serial")
- public class LockedScopedProxyFactoryBean extends ScopedProxyFactoryBean
- implements MethodInterceptor {
+ public static class LockedScopedProxyFactoryBean
+ extends ScopedProxyFactoryBean implements MethodInterceptor {
+ private final S scope;
private String targetBeanName;
+ public LockedScopedProxyFactoryBean(S scope) {
+ this.scope = scope;
+ }
+
@Override
public void setBeanFactory(BeanFactory beanFactory) {
super.setBeanFactory(beanFactory);
@@ -467,10 +477,11 @@ public class GenericScope implements Scope, BeanFactoryPostProcessor,
return invocation.proceed();
}
Object proxy = getObject();
- ReadWriteLock readWriteLock = locks.get(this.targetBeanName);
+ ReadWriteLock readWriteLock = scope.getLock(this.targetBeanName);
if (readWriteLock == null) {
if (logger.isDebugEnabled()) {
- logger.debug("For bean with name [" + this.targetBeanName + "] there is no read write lock. Will create a new one to avoid NPE");
+ logger.debug("For bean with name [" + this.targetBeanName
+ + "] there is no read write lock. Will create a new one to avoid NPE");
}
readWriteLock = new ReentrantReadWriteLock();
}
diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/context/scope/ScopeCache.java b/spring-cloud-context/src/main/java/org/springframework/cloud/context/scope/ScopeCache.java
index 1be557c0..42ac62b9 100644
--- a/spring-cloud-context/src/main/java/org/springframework/cloud/context/scope/ScopeCache.java
+++ b/spring-cloud-context/src/main/java/org/springframework/cloud/context/scope/ScopeCache.java
@@ -19,7 +19,7 @@ package org.springframework.cloud.context.scope;
import java.util.Collection;
/**
- * A special purpose cache interface specifically for the {@link GenericScope} to use to manage cached bean instances.
+ * A special-purpose cache interface specifically for the {@link GenericScope} to use to manage cached bean instances.
* Implementations generally fall into two categories: those that store values "globally" (i.e. one instance per key),
* and those that store potentially multiple instances per key based on context (e.g. via a thread local). All
* implementations should be thread safe.
@@ -30,25 +30,25 @@ import java.util.Collection;
public interface ScopeCache {
/**
- * Remove the object with this name from the cache.
+ * Removes the object with this name from the cache.
*
- * @param name the object name
- * @return the object removed or null if there was none
+ * @param name The object name.
+ * @return The object removed, or null if there was none.
*/
Object remove(String name);
/**
- * Clear the cache and return all objects in an unmodifiable collection.
+ * Clears the cache and returns all objects in an unmodifiable collection.
*
- * @return all objects stored in the cache
+ * @return All objects stored in the cache.
*/
Collection
*
*
* The scoped proxy approach adopted here has a side benefit that bean instances are
* automatically {@link Serializable}, and can be sent across the wire as long as the
* receiver has an identical application context on the other side. To ensure that the two
- * contexts agree that they are identical they have to have the same serialization id. One
- * will be generated automatically by default from the bean names, so two contexts with
- * the same bean names are by default able to exchange beans by name. If you need to
- * override the default id then provide an explicit {@link #setId(String) id} when the
+ * contexts agree that they are identical, they have to have the same serialization ID.
+ * One will be generated automatically by default from the bean names, so two contexts
+ * with the same bean names are by default able to exchange beans by name. If you need to
+ * override the default ID, then provide an explicit {@link #setId(String) id} when the
* Scope is declared.
*
*
@@ -70,7 +70,7 @@ import org.springframework.jmx.export.annotation.ManagedResource;
*/
@ManagedResource
public class RefreshScope extends GenericScope
- implements ApplicationContextAware, Ordered {
+ implements ApplicationContextAware, ApplicationListener, Ordered {
private ApplicationContext context;
private BeanDefinitionRegistry registry;
@@ -78,7 +78,7 @@ public class RefreshScope extends GenericScope
private int order = Ordered.LOWEST_PRECEDENCE - 100;
/**
- * Create a scope instance and give it the default name: "refresh".
+ * Creates a scope instance and gives it the default name: "refresh".
*/
public RefreshScope() {
super.setName("refresh");
@@ -97,7 +97,7 @@ public class RefreshScope extends GenericScope
* Flag to determine whether all beans in refresh scope should be instantiated eagerly
* on startup. Default true.
*
- * @param eager the flag to set
+ * @param eager The flag to set.
*/
public void setEager(boolean eager) {
this.eager = eager;
@@ -110,7 +110,11 @@ public class RefreshScope extends GenericScope
super.postProcessBeanDefinitionRegistry(registry);
}
- @EventListener
+ @Override
+ public void onApplicationEvent(ContextRefreshedEvent event) {
+ start(event);
+ }
+
public void start(ContextRefreshedEvent event) {
if (event.getApplicationContext() == this.context && this.eager
&& this.registry != null) {
diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/context/scope/thread/ThreadScope.java b/spring-cloud-context/src/main/java/org/springframework/cloud/context/scope/thread/ThreadScope.java
index 4b0070be..1db0548d 100644
--- a/spring-cloud-context/src/main/java/org/springframework/cloud/context/scope/thread/ThreadScope.java
+++ b/spring-cloud-context/src/main/java/org/springframework/cloud/context/scope/thread/ThreadScope.java
@@ -25,7 +25,7 @@ import org.springframework.cloud.context.scope.GenericScope;
public class ThreadScope extends GenericScope {
/**
- * Create a scope instance and give it the default name: "thread".
+ * Creates a scope instance and gives it the default name: "thread".
*/
public ThreadScope() {
super();
diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/endpoint/event/RefreshEvent.java b/spring-cloud-context/src/main/java/org/springframework/cloud/endpoint/event/RefreshEvent.java
index 62cde168..fafba6df 100644
--- a/spring-cloud-context/src/main/java/org/springframework/cloud/endpoint/event/RefreshEvent.java
+++ b/spring-cloud-context/src/main/java/org/springframework/cloud/endpoint/event/RefreshEvent.java
@@ -4,7 +4,7 @@ import org.springframework.cloud.endpoint.RefreshEndpoint;
import org.springframework.context.ApplicationEvent;
/**
- * Event that triggers a call to {@link RefreshEndpoint#refresh()}
+ * Event that triggers a call to {@link RefreshEndpoint#refresh()}.
* @author Spencer Gibb
*/
@SuppressWarnings("serial")
diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/endpoint/event/RefreshEventListener.java b/spring-cloud-context/src/main/java/org/springframework/cloud/endpoint/event/RefreshEventListener.java
index 6f55cbb7..4452ce29 100644
--- a/spring-cloud-context/src/main/java/org/springframework/cloud/endpoint/event/RefreshEventListener.java
+++ b/spring-cloud-context/src/main/java/org/springframework/cloud/endpoint/event/RefreshEventListener.java
@@ -8,14 +8,15 @@ import org.apache.commons.logging.LogFactory;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.cloud.context.refresh.ContextRefresher;
-import org.springframework.context.event.EventListener;
+import org.springframework.context.ApplicationEvent;
+import org.springframework.context.event.SmartApplicationListener;
/**
* Calls {@link RefreshEventListener#refresh} when a {@link RefreshEvent} is received.
- * Only responds to {@link RefreshEvent} after receiving an {@link ApplicationReadyEvent} as the RefreshEvent's might come to early in the application lifecycle.
+ * Only responds to {@link RefreshEvent} after receiving an {@link ApplicationReadyEvent}, as the RefreshEvents might come too early in the application lifecycle.
* @author Spencer Gibb
*/
-public class RefreshEventListener {
+public class RefreshEventListener implements SmartApplicationListener {
private static Log log = LogFactory.getLog(RefreshEventListener.class);
private ContextRefresher refresh;
private AtomicBoolean ready = new AtomicBoolean(false);
@@ -24,12 +25,25 @@ public class RefreshEventListener {
this.refresh = refresh;
}
- @EventListener
+ @Override
+ public boolean supportsEventType(Class extends ApplicationEvent> eventType) {
+ return ApplicationReadyEvent.class.isAssignableFrom(eventType)
+ || RefreshEvent.class.isAssignableFrom(eventType);
+ }
+
+ @Override
+ public void onApplicationEvent(ApplicationEvent event) {
+ if (event instanceof ApplicationReadyEvent) {
+ handle((ApplicationReadyEvent) event);
+ } else if (event instanceof RefreshEvent) {
+ handle((RefreshEvent) event);
+ }
+ }
+
public void handle(ApplicationReadyEvent event) {
this.ready.compareAndSet(false, true);
}
- @EventListener
public void handle(RefreshEvent event) {
if (this.ready.get()) { // don't handle events before app is ready
log.debug("Event received " + event.getEventDesc());
diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/health/RefreshScopeHealthIndicator.java b/spring-cloud-context/src/main/java/org/springframework/cloud/health/RefreshScopeHealthIndicator.java
index a8de8b4f..9b1f0b8b 100644
--- a/spring-cloud-context/src/main/java/org/springframework/cloud/health/RefreshScopeHealthIndicator.java
+++ b/spring-cloud-context/src/main/java/org/springframework/cloud/health/RefreshScopeHealthIndicator.java
@@ -27,7 +27,7 @@ import org.springframework.cloud.context.scope.refresh.RefreshScope;
/**
* Health indicator for the refresh scope and configuration properties rebinding. If an
- * environment change causes a bean to fail in instantiate or bind this indicator will
+ * environment change causes a bean to fail in instantiate or bind, this indicator will
* generally say what the problem was and switch to DOWN.
*
* @author Dave Syer
@@ -45,19 +45,22 @@ public class RefreshScopeHealthIndicator extends AbstractHealthIndicator {
@Override
protected void doHealthCheck(Builder builder) throws Exception {
- Map errors = new HashMap<>(this.scope.getIfAvailable().getErrors());
- errors.putAll(this.rebinder.getErrors());
- if (errors.isEmpty()) {
- builder.up();
- }
- else {
- builder.down();
- if (errors.size() == 1) {
- builder.withException(errors.values().iterator().next());
+ RefreshScope refreshScope = this.scope.getIfAvailable();
+ if (refreshScope != null) {
+ Map errors = new HashMap<>(refreshScope.getErrors());
+ errors.putAll(this.rebinder.getErrors());
+ if (errors.isEmpty()) {
+ builder.up();
}
else {
- for (String name : errors.keySet()) {
- builder.withDetail(name, errors.get(name));
+ builder.down();
+ if (errors.size() == 1) {
+ builder.withException(errors.values().iterator().next());
+ }
+ else {
+ for (String name : errors.keySet()) {
+ builder.withDetail(name, errors.get(name));
+ }
}
}
}
diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/util/ProxyUtils.java b/spring-cloud-context/src/main/java/org/springframework/cloud/util/ProxyUtils.java
new file mode 100644
index 00000000..57549c43
--- /dev/null
+++ b/spring-cloud-context/src/main/java/org/springframework/cloud/util/ProxyUtils.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2013-2018 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.cloud.util;
+
+import org.springframework.aop.framework.Advised;
+import org.springframework.aop.support.AopUtils;
+
+/**
+ * @author Ryan Baxter
+ */
+public class ProxyUtils {
+
+ @SuppressWarnings("unchecked")
+ public static T getTargetObject(Object candidate) {
+ try {
+ if (AopUtils.isAopProxy(candidate) && (candidate instanceof Advised)) {
+ return (T) ((Advised) candidate).getTargetSource().getTarget();
+ }
+ }
+ catch (Exception ex) {
+ throw new IllegalStateException("Failed to unwrap proxied object", ex);
+ }
+ return (T) candidate;
+ }
+}
diff --git a/spring-cloud-context/src/test/java/org/springframework/cloud/autoconfigure/LifecycleMvcAutoConfigurationTests.java b/spring-cloud-context/src/test/java/org/springframework/cloud/autoconfigure/LifecycleMvcAutoConfigurationTests.java
index 67d5ea64..440c31ff 100644
--- a/spring-cloud-context/src/test/java/org/springframework/cloud/autoconfigure/LifecycleMvcAutoConfigurationTests.java
+++ b/spring-cloud-context/src/test/java/org/springframework/cloud/autoconfigure/LifecycleMvcAutoConfigurationTests.java
@@ -38,7 +38,7 @@ public class LifecycleMvcAutoConfigurationTests {
@Test
public void environmentWebEndpointExtensionEnabled() {
- beanCreated("environmentWebEndpointExtension",
+ beanCreated("environmentEndpointWebExtension",
"management.endpoint.env.enabled=true");
}
diff --git a/spring-cloud-context/src/test/java/org/springframework/cloud/autoconfigure/RefreshAutoConfigurationTests.java b/spring-cloud-context/src/test/java/org/springframework/cloud/autoconfigure/RefreshAutoConfigurationTests.java
index 7512f2ef..2ec3f28d 100644
--- a/spring-cloud-context/src/test/java/org/springframework/cloud/autoconfigure/RefreshAutoConfigurationTests.java
+++ b/spring-cloud-context/src/test/java/org/springframework/cloud/autoconfigure/RefreshAutoConfigurationTests.java
@@ -69,7 +69,7 @@ public class RefreshAutoConfigurationTests {
@Configuration
@EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class)
- @EnableConfigurationProperties(ConfigProps.class)
+ @EnableConfigurationProperties
static class Config {
}
diff --git a/spring-cloud-context/src/test/java/org/springframework/cloud/context/environment/EnvironmentManagerIntegrationTests.java b/spring-cloud-context/src/test/java/org/springframework/cloud/context/environment/EnvironmentManagerIntegrationTests.java
index d1e08287..497e924f 100644
--- a/spring-cloud-context/src/test/java/org/springframework/cloud/context/environment/EnvironmentManagerIntegrationTests.java
+++ b/spring-cloud-context/src/test/java/org/springframework/cloud/context/environment/EnvironmentManagerIntegrationTests.java
@@ -24,23 +24,26 @@ import javax.servlet.ServletException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
-
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties;
+import org.springframework.boot.actuate.env.EnvironmentEndpoint;
+import org.springframework.boot.actuate.env.EnvironmentEndpointWebExtension;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.cloud.context.environment.EnvironmentManagerIntegrationTests.TestConfiguration;
+import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
+import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
@@ -64,6 +67,9 @@ public class EnvironmentManagerIntegrationTests {
@Autowired
private MockMvc mvc;
+ @Autowired
+ private ApplicationContext context;
+
@Test
public void testRefresh() throws Exception {
assertEquals("Hello scope!", properties.getMessage());
@@ -108,6 +114,21 @@ public class EnvironmentManagerIntegrationTests {
.andExpect(status().isNotFound());
}
+ @Test
+ public void environmentBeansConfiguredCorrectly() {
+ Map envbeans = this.context.getBeansOfType(EnvironmentEndpoint.class);
+ assertThat(envbeans).hasSize(1)
+ .containsKey("environmentEndpoint");
+ assertThat(envbeans.get("environmentEndpoint"))
+ .isInstanceOf(WritableEnvironmentEndpoint.class);
+
+ Map extbeans = this.context.getBeansOfType(EnvironmentEndpointWebExtension.class);
+ assertThat(extbeans).hasSize(1)
+ .containsKey("environmentEndpointWebExtension");
+ assertThat(extbeans.get("environmentEndpointWebExtension"))
+ .isInstanceOf(WritableEnvironmentEndpointWebExtension.class);
+ }
+
@Configuration
@EnableAutoConfiguration
protected static class TestConfiguration {
diff --git a/spring-cloud-context/src/test/java/org/springframework/cloud/context/refresh/ContextRefresherTests.java b/spring-cloud-context/src/test/java/org/springframework/cloud/context/refresh/ContextRefresherTests.java
index e4b7cc9c..d7591d0f 100644
--- a/spring-cloud-context/src/test/java/org/springframework/cloud/context/refresh/ContextRefresherTests.java
+++ b/spring-cloud-context/src/test/java/org/springframework/cloud/context/refresh/ContextRefresherTests.java
@@ -38,7 +38,7 @@ public class ContextRefresherTests {
@Test
public void orderNewPropertiesConsistentWithNewContext() {
try (ConfigurableApplicationContext context = SpringApplication.run(Empty.class,
- "--spring.main.webEnvironment=false", "--debug=false",
+ "--spring.main.web-application-type=none", "--debug=false",
"--spring.main.bannerMode=OFF")) {
context.getEnvironment().setActiveProfiles("refresh");
List names = names(context.getEnvironment().getPropertySources());
@@ -61,7 +61,7 @@ public class ContextRefresherTests {
// Use spring.cloud.bootstrap.name to switch off the defaults (which would pick up
// a bootstrapProperties immediately
try (ConfigurableApplicationContext context = SpringApplication.run(Empty.class,
- "--spring.main.webEnvironment=false", "--debug=false",
+ "--spring.main.web-application-type=none", "--debug=false",
"--spring.main.bannerMode=OFF",
"--spring.cloud.bootstrap.name=refresh")) {
List names = names(context.getEnvironment().getPropertySources());
@@ -82,7 +82,7 @@ public class ContextRefresherTests {
// Use spring.cloud.bootstrap.name to switch off the defaults (which would pick up
// a bootstrapProperties immediately
try (ConfigurableApplicationContext context = SpringApplication.run(
- ContextRefresherTests.class, "--spring.main.webEnvironment=false",
+ ContextRefresherTests.class, "--spring.main.web-application-type=none",
"--debug=false", "--spring.main.bannerMode=OFF",
"--spring.cloud.bootstrap.name=refresh")) {
ContextRefresher refresher = new ContextRefresher(context, scope);
@@ -107,7 +107,7 @@ public class ContextRefresherTests {
.get(getClass().getClassLoader());
assertThat(system.getCount()).isEqualTo(0);
try (ConfigurableApplicationContext context = SpringApplication.run(Empty.class,
- "--spring.main.webEnvironment=false", "--debug=false",
+ "--spring.main.web-application-type=none", "--debug=false",
"--spring.main.bannerMode=OFF",
"--spring.cloud.bootstrap.name=refresh")) {
assertThat(system.getCount()).isEqualTo(4);
@@ -123,7 +123,7 @@ public class ContextRefresherTests {
TestBootstrapConfiguration.fooSightings = new ArrayList<>();
try (ConfigurableApplicationContext context = SpringApplication.run(ContextRefresherTests.class,
- "--spring.main.webEnvironment=false", "--debug=false",
+ "--spring.main.web-application-type=none", "--debug=false",
"--spring.main.bannerMode=OFF",
"--spring.cloud.bootstrap.name=refresh",
"--test.bootstrap.foo=bar")) {
diff --git a/spring-cloud-context/src/test/java/org/springframework/cloud/endpoint/RefreshEndpointTests.java b/spring-cloud-context/src/test/java/org/springframework/cloud/endpoint/RefreshEndpointTests.java
index 5be7da34..1e562431 100644
--- a/spring-cloud-context/src/test/java/org/springframework/cloud/endpoint/RefreshEndpointTests.java
+++ b/spring-cloud-context/src/test/java/org/springframework/cloud/endpoint/RefreshEndpointTests.java
@@ -16,10 +16,6 @@
package org.springframework.cloud.endpoint;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collection;
@@ -29,6 +25,7 @@ import java.util.Map;
import org.junit.After;
import org.junit.Test;
+
import org.springframework.boot.Banner.Mode;
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.builder.SpringApplicationBuilder;
@@ -42,7 +39,7 @@ import org.springframework.cloud.context.scope.refresh.RefreshScopeRefreshedEven
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Configuration;
-import org.springframework.context.event.EventListener;
+import org.springframework.context.event.SmartApplicationListener;
import org.springframework.core.env.Environment;
import org.springframework.core.env.MapPropertySource;
import org.springframework.core.env.PropertySource;
@@ -50,6 +47,10 @@ import org.springframework.stereotype.Component;
import org.springframework.util.ClassUtils;
import org.springframework.util.ReflectionUtils;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
/**
* @author Dave Syer
* @author Venil Noronha
@@ -147,16 +148,17 @@ public class RefreshEndpointTests {
@Test
public void shutdownHooksCleaned() {
- ConfigurableApplicationContext context = new SpringApplicationBuilder(Empty.class)
- .web(WebApplicationType.NONE).bannerMode(Mode.OFF).run();
- RefreshScope scope = new RefreshScope();
- scope.setApplicationContext(context);
- ContextRefresher contextRefresher = new ContextRefresher(context, scope);
- RefreshEndpoint endpoint = new RefreshEndpoint(contextRefresher);
- int count = countShutdownHooks();
- endpoint.refresh();
- int after = countShutdownHooks();
- assertEquals("Shutdown hooks not cleaned on refresh", count, after);
+ try (ConfigurableApplicationContext context = new SpringApplicationBuilder(Empty.class)
+ .web(WebApplicationType.NONE).bannerMode(Mode.OFF).run()) {
+ RefreshScope scope = new RefreshScope();
+ scope.setApplicationContext(context);
+ ContextRefresher contextRefresher = new ContextRefresher(context, scope);
+ RefreshEndpoint endpoint = new RefreshEndpoint(contextRefresher);
+ int count = countShutdownHooks();
+ endpoint.refresh();
+ int after = countShutdownHooks();
+ assertEquals("Shutdown hooks not cleaned on refresh", count, after);
+ }
}
private int countShutdownHooks() {
@@ -170,17 +172,22 @@ public class RefreshEndpointTests {
}
@Configuration
- protected static class Empty {
+ protected static class Empty implements SmartApplicationListener {
private List events = new ArrayList();
- @EventListener(EnvironmentChangeEvent.class)
- public void changed(EnvironmentChangeEvent event) {
- this.events.add(event);
+
+ @Override
+ public boolean supportsEventType(Class extends ApplicationEvent> eventType) {
+ return EnvironmentChangeEvent.class.isAssignableFrom(eventType)
+ || RefreshScopeRefreshedEvent.class.isAssignableFrom(eventType);
}
- @EventListener(RefreshScopeRefreshedEvent.class)
- public void refreshed(RefreshScopeRefreshedEvent event) {
- this.events.add(event);
+ @Override
+ public void onApplicationEvent(ApplicationEvent event) {
+ if (event instanceof EnvironmentChangeEvent ||
+ event instanceof RefreshScopeRefreshedEvent) {
+ this.events.add(event);
+ }
}
}
diff --git a/spring-cloud-context/src/test/java/org/springframework/cloud/health/RefreshScopeHealthIndicatorTests.java b/spring-cloud-context/src/test/java/org/springframework/cloud/health/RefreshScopeHealthIndicatorTests.java
index 4009b8b9..88adea70 100644
--- a/spring-cloud-context/src/test/java/org/springframework/cloud/health/RefreshScopeHealthIndicatorTests.java
+++ b/spring-cloud-context/src/test/java/org/springframework/cloud/health/RefreshScopeHealthIndicatorTests.java
@@ -81,4 +81,11 @@ public class RefreshScopeHealthIndicatorTests {
assertEquals(Status.DOWN, this.indicator.health().getStatus());
}
+ @Test
+ public void nullRefreshScope() {
+ ObjectProvider scopeProvider = mock(ObjectProvider.class);
+ BDDMockito.willReturn(null).given(scopeProvider).getIfAvailable();
+ assertEquals(Status.UP, this.indicator.health().getStatus());
+ }
+
}
diff --git a/spring-cloud-starter/pom.xml b/spring-cloud-starter/pom.xml
index b7770a02..f1ef0553 100644
--- a/spring-cloud-starter/pom.xml
+++ b/spring-cloud-starter/pom.xml
@@ -5,7 +5,7 @@
org.springframework.cloudspring-cloud-commons-parent
- 2.0.0.BUILD-SNAPSHOT
+ 2.1.0.BUILD-SNAPSHOTspring-cloud-starterspring-cloud-starter
@@ -15,9 +15,6 @@
Pivotal Software, Inc.https://www.spring.io
-
- ${basedir}/../..
- org.springframework.boot
diff --git a/spring-cloud-test-support/pom.xml b/spring-cloud-test-support/pom.xml
index 0bfc76dc..28826c2f 100644
--- a/spring-cloud-test-support/pom.xml
+++ b/spring-cloud-test-support/pom.xml
@@ -6,7 +6,7 @@
org.springframework.cloudspring-cloud-commons-parent
- 2.0.0.BUILD-SNAPSHOT
+ 2.1.0.BUILD-SNAPSHOT..spring-cloud-test-support
diff --git a/spring-cloud-test-support/src/main/java/org/springframework/cloud/test/ModifiedClassPathRunner.java b/spring-cloud-test-support/src/main/java/org/springframework/cloud/test/ModifiedClassPathRunner.java
index a17ff56f..b284eefc 100644
--- a/spring-cloud-test-support/src/main/java/org/springframework/cloud/test/ModifiedClassPathRunner.java
+++ b/spring-cloud-test-support/src/main/java/org/springframework/cloud/test/ModifiedClassPathRunner.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2012-2017 the original author or authors.
+ * Copyright 2012-2018 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.
@@ -28,6 +28,7 @@ import java.util.Collections;
import java.util.List;
import java.util.jar.Attributes;
import java.util.jar.JarFile;
+import java.util.regex.Pattern;
import java.util.stream.Stream;
import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
@@ -66,6 +67,9 @@ import org.springframework.util.StringUtils;
*/
public class ModifiedClassPathRunner extends BlockJUnit4ClassRunner {
+ private static final Pattern INTELLIJ_CLASSPATH_JAR_PATTERN = Pattern
+ .compile(".*classpath(\\d+)?\\.jar");
+
public ModifiedClassPathRunner(Class> testClass) throws InitializationError {
super(testClass);
}
@@ -98,14 +102,14 @@ public class ModifiedClassPathRunner extends BlockJUnit4ClassRunner {
private URL[] extractUrls(ClassLoader classLoader) throws Exception {
List extractedUrls = new ArrayList<>();
doExtractUrls(classLoader).forEach((URL url) -> {
- if (isSurefireBooterJar(url)) {
+ if (isManifestOnlyJar(url)) {
extractedUrls.addAll(extractUrlsFromManifestClassPath(url));
}
else {
extractedUrls.add(url);
}
});
- return extractedUrls.toArray(new URL[extractedUrls.size()]);
+ return extractedUrls.toArray(new URL[0]);
}
private Stream doExtractUrls(ClassLoader classLoader) throws Exception {
@@ -125,10 +129,29 @@ public class ModifiedClassPathRunner extends BlockJUnit4ClassRunner {
}
}
+ private boolean isManifestOnlyJar(URL url) {
+ return isSurefireBooterJar(url) || isShortenedIntelliJJar(url);
+ }
+
private boolean isSurefireBooterJar(URL url) {
return url.getPath().contains("surefirebooter");
}
+ private boolean isShortenedIntelliJJar(URL url) {
+ String urlPath = url.getPath();
+ boolean isCandidate = INTELLIJ_CLASSPATH_JAR_PATTERN.matcher(urlPath).matches();
+ if (isCandidate) {
+ try {
+ Attributes attributes = getManifestMainAttributesFromUrl(url);
+ String createdBy = attributes.getValue("Created-By");
+ return createdBy != null && createdBy.contains("IntelliJ");
+ }
+ catch (Exception ex) {
+ }
+ }
+ return false;
+ }
+
private List extractUrlsFromManifestClassPath(URL booterJar) {
List urls = new ArrayList<>();
try {
@@ -143,9 +166,14 @@ public class ModifiedClassPathRunner extends BlockJUnit4ClassRunner {
}
private String[] getClassPath(URL booterJar) throws Exception {
- try (JarFile jarFile = new JarFile(new File(booterJar.toURI()))) {
- return StringUtils.delimitedListToStringArray(jarFile.getManifest()
- .getMainAttributes().getValue(Attributes.Name.CLASS_PATH), " ");
+ Attributes attributes = getManifestMainAttributesFromUrl(booterJar);
+ return StringUtils.delimitedListToStringArray(
+ attributes.getValue(Attributes.Name.CLASS_PATH), " ");
+ }
+
+ private Attributes getManifestMainAttributesFromUrl(URL url) throws Exception {
+ try (JarFile jarFile = new JarFile(new File(url.toURI()))) {
+ return jarFile.getManifest().getMainAttributes();
}
}
@@ -158,7 +186,7 @@ public class ModifiedClassPathRunner extends BlockJUnit4ClassRunner {
processedUrls.add(url);
}
}
- return processedUrls.toArray(new URL[processedUrls.size()]);
+ return processedUrls.toArray(new URL[0]);
}
private List getAdditionalUrls(Class> testClass) throws Exception {
@@ -185,7 +213,7 @@ public class ModifiedClassPathRunner extends BlockJUnit4ClassRunner {
repositorySystem.newLocalRepositoryManager(session, localRepository));
CollectRequest collectRequest = new CollectRequest(null,
Arrays.asList(new RemoteRepository.Builder("central", "default",
- "http://central.maven.org/maven2").build()));
+ "https://repo.maven.apache.org/maven2").build()));
collectRequest.setDependencies(createDependencies(coordinates));
DependencyRequest dependencyRequest = new DependencyRequest(collectRequest, null);
@@ -317,7 +345,7 @@ public class ModifiedClassPathRunner extends BlockJUnit4ClassRunner {
}
@Override
- public Object invokeExplosively(final Object target, final Object... params)
+ public Object invokeExplosively(Object target, Object... params)
throws Throwable {
return doWithModifiedClassPathThreadContextClassLoader(
() -> ModifiedClassPathFrameworkMethod.super.invokeExplosively(
@@ -351,4 +379,4 @@ public class ModifiedClassPathRunner extends BlockJUnit4ClassRunner {
}
-}
+}
\ No newline at end of file