Merge branch '1.2.x'
This commit is contained in:
commit
49c4710f63
|
|
@ -17,10 +17,6 @@
|
||||||
package org.springframework.boot.actuate.autoconfigure;
|
package org.springframework.boot.actuate.autoconfigure;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.lang.annotation.ElementType;
|
|
||||||
import java.lang.annotation.Retention;
|
|
||||||
import java.lang.annotation.RetentionPolicy;
|
|
||||||
import java.lang.annotation.Target;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import javax.servlet.Filter;
|
import javax.servlet.Filter;
|
||||||
|
|
@ -38,6 +34,7 @@ import org.springframework.beans.factory.NoSuchBeanDefinitionException;
|
||||||
import org.springframework.beans.factory.SmartInitializingSingleton;
|
import org.springframework.beans.factory.SmartInitializingSingleton;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.boot.actuate.autoconfigure.ManagementServerProperties.Security;
|
import org.springframework.boot.actuate.autoconfigure.ManagementServerProperties.Security;
|
||||||
|
import org.springframework.boot.actuate.condition.ConditionalOnEnabledEndpoint;
|
||||||
import org.springframework.boot.actuate.endpoint.Endpoint;
|
import org.springframework.boot.actuate.endpoint.Endpoint;
|
||||||
import org.springframework.boot.actuate.endpoint.EnvironmentEndpoint;
|
import org.springframework.boot.actuate.endpoint.EnvironmentEndpoint;
|
||||||
import org.springframework.boot.actuate.endpoint.HealthEndpoint;
|
import org.springframework.boot.actuate.endpoint.HealthEndpoint;
|
||||||
|
|
@ -53,17 +50,14 @@ import org.springframework.boot.actuate.endpoint.mvc.ShutdownMvcEndpoint;
|
||||||
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
|
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
|
||||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||||
import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration;
|
import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
|
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
|
||||||
import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
|
|
||||||
import org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration;
|
import org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration;
|
||||||
import org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration;
|
import org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration;
|
||||||
import org.springframework.boot.autoconfigure.web.ServerProperties;
|
import org.springframework.boot.autoconfigure.web.ServerProperties;
|
||||||
import org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration;
|
import org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration;
|
||||||
import org.springframework.boot.bind.RelaxedPropertyResolver;
|
|
||||||
import org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext;
|
import org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext;
|
||||||
import org.springframework.boot.context.embedded.EmbeddedServletContainerException;
|
import org.springframework.boot.context.embedded.EmbeddedServletContainerException;
|
||||||
import org.springframework.boot.context.embedded.EmbeddedWebApplicationContext;
|
import org.springframework.boot.context.embedded.EmbeddedWebApplicationContext;
|
||||||
|
|
@ -73,14 +67,10 @@ import org.springframework.context.ApplicationContextAware;
|
||||||
import org.springframework.context.ApplicationListener;
|
import org.springframework.context.ApplicationListener;
|
||||||
import org.springframework.context.ConfigurableApplicationContext;
|
import org.springframework.context.ConfigurableApplicationContext;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.ConditionContext;
|
|
||||||
import org.springframework.context.annotation.Conditional;
|
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.context.event.ContextClosedEvent;
|
import org.springframework.context.event.ContextClosedEvent;
|
||||||
import org.springframework.core.annotation.AnnotationAttributes;
|
|
||||||
import org.springframework.core.env.ConfigurableEnvironment;
|
import org.springframework.core.env.ConfigurableEnvironment;
|
||||||
import org.springframework.core.env.PropertySource;
|
import org.springframework.core.env.PropertySource;
|
||||||
import org.springframework.core.type.AnnotatedTypeMetadata;
|
|
||||||
import org.springframework.web.context.WebApplicationContext;
|
import org.springframework.web.context.WebApplicationContext;
|
||||||
import org.springframework.web.filter.OncePerRequestFilter;
|
import org.springframework.web.filter.OncePerRequestFilter;
|
||||||
import org.springframework.web.servlet.DispatcherServlet;
|
import org.springframework.web.servlet.DispatcherServlet;
|
||||||
|
|
@ -347,78 +337,4 @@ public class EndpointWebMvcAutoConfiguration implements ApplicationContextAware,
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* {@link Conditional} that checks whether or not an endpoint is enabled. Matches if
|
|
||||||
* the value of the {@code endpoints.<name>.enabled} property is {@code true}. Does
|
|
||||||
* not match if the property's value or {@code enabledByDefault} is {@code false}.
|
|
||||||
* Otherwise, matches if the value of the {@code endpoints.enabled} property is
|
|
||||||
* {@code true} or if the property is not configured.
|
|
||||||
*
|
|
||||||
* @since 1.2.4
|
|
||||||
*/
|
|
||||||
@Conditional(OnEnabledEndpointCondition.class)
|
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
|
||||||
@Target(ElementType.METHOD)
|
|
||||||
public static @interface ConditionalOnEnabledEndpoint {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The name of the endpoint.
|
|
||||||
* @return The name of the endpoint
|
|
||||||
*/
|
|
||||||
public String value();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns whether or not the endpoint is enabled by default.
|
|
||||||
* @return {@code true} if the endpoint is enabled by default, otherwise
|
|
||||||
* {@code false}
|
|
||||||
*/
|
|
||||||
public boolean enabledByDefault() default true;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class OnEnabledEndpointCondition extends SpringBootCondition {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ConditionOutcome getMatchOutcome(ConditionContext context,
|
|
||||||
AnnotatedTypeMetadata metadata) {
|
|
||||||
AnnotationAttributes annotationAttributes = AnnotationAttributes
|
|
||||||
.fromMap(metadata
|
|
||||||
.getAnnotationAttributes(ConditionalOnEnabledEndpoint.class
|
|
||||||
.getName()));
|
|
||||||
String endpointName = annotationAttributes.getString("value");
|
|
||||||
boolean enabledByDefault = annotationAttributes
|
|
||||||
.getBoolean("enabledByDefault");
|
|
||||||
ConditionOutcome specificEndpointOutcome = determineSpecificEndpointOutcome(
|
|
||||||
endpointName, enabledByDefault, context);
|
|
||||||
if (specificEndpointOutcome != null) {
|
|
||||||
return specificEndpointOutcome;
|
|
||||||
}
|
|
||||||
return determineAllEndpointsOutcome(context);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private ConditionOutcome determineSpecificEndpointOutcome(String endpointName,
|
|
||||||
boolean enabledByDefault, ConditionContext context) {
|
|
||||||
RelaxedPropertyResolver endpointPropertyResolver = new RelaxedPropertyResolver(
|
|
||||||
context.getEnvironment(), "endpoints." + endpointName + ".");
|
|
||||||
if (endpointPropertyResolver.containsProperty("enabled") || !enabledByDefault) {
|
|
||||||
boolean match = endpointPropertyResolver.getProperty("enabled",
|
|
||||||
Boolean.class, enabledByDefault);
|
|
||||||
return new ConditionOutcome(match, "The " + endpointName + " is "
|
|
||||||
+ (match ? "enabled" : "disabled"));
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private ConditionOutcome determineAllEndpointsOutcome(ConditionContext context) {
|
|
||||||
RelaxedPropertyResolver allEndpointsPropertyResolver = new RelaxedPropertyResolver(
|
|
||||||
context.getEnvironment(), "endpoints.");
|
|
||||||
boolean match = Boolean.valueOf(allEndpointsPropertyResolver.getProperty(
|
|
||||||
"enabled", "true"));
|
|
||||||
return new ConditionOutcome(match, "All endpoints are "
|
|
||||||
+ (match ? "enabled" : "disabled") + " by default");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -135,14 +135,12 @@ public class MetricFilterAutoConfiguration {
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean is4xxClientError(int status) {
|
private boolean is4xxClientError(int status) {
|
||||||
HttpStatus httpStatus = HttpStatus.OK;
|
|
||||||
try {
|
try {
|
||||||
httpStatus = HttpStatus.valueOf(status);
|
return HttpStatus.valueOf(status).is4xxClientError();
|
||||||
}
|
}
|
||||||
catch (Exception ex) {
|
catch (Exception ex) {
|
||||||
// not convertible
|
return false;
|
||||||
}
|
}
|
||||||
return httpStatus.is4xxClientError();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getKey(String string) {
|
private String getKey(String string) {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,53 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2012-2015 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* 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.boot.actuate.condition;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Conditional;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link Conditional} that checks whether or not an endpoint is enabled. Matches if the
|
||||||
|
* value of the {@code endpoints.<name>.enabled} property is {@code true}. Does not match
|
||||||
|
* if the property's value or {@code enabledByDefault} is {@code false}. Otherwise,
|
||||||
|
* matches if the value of the {@code endpoints.enabled} property is {@code true} or if
|
||||||
|
* the property is not configured.
|
||||||
|
*
|
||||||
|
* @author Andy Wilkinson
|
||||||
|
* @since 1.2.4
|
||||||
|
*/
|
||||||
|
@Conditional(OnEnabledEndpointCondition.class)
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
@Target(ElementType.METHOD)
|
||||||
|
public @interface ConditionalOnEnabledEndpoint {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of the endpoint.
|
||||||
|
* @return The name of the endpoint
|
||||||
|
*/
|
||||||
|
public String value();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether or not the endpoint is enabled by default.
|
||||||
|
* @return {@code true} if the endpoint is enabled by default, otherwise {@code false}
|
||||||
|
*/
|
||||||
|
public boolean enabledByDefault() default true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,70 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2012-2015 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* 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.boot.actuate.condition;
|
||||||
|
|
||||||
|
import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
|
||||||
|
import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
|
||||||
|
import org.springframework.boot.bind.RelaxedPropertyResolver;
|
||||||
|
import org.springframework.context.annotation.Condition;
|
||||||
|
import org.springframework.context.annotation.ConditionContext;
|
||||||
|
import org.springframework.core.annotation.AnnotationAttributes;
|
||||||
|
import org.springframework.core.type.AnnotatedTypeMetadata;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link Condition} that checks whether or not an endpoint is enabled.
|
||||||
|
*
|
||||||
|
* @author Andy Wilkinson
|
||||||
|
*/
|
||||||
|
class OnEnabledEndpointCondition extends SpringBootCondition {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ConditionOutcome getMatchOutcome(ConditionContext context,
|
||||||
|
AnnotatedTypeMetadata metadata) {
|
||||||
|
AnnotationAttributes annotationAttributes = AnnotationAttributes.fromMap(metadata
|
||||||
|
.getAnnotationAttributes(ConditionalOnEnabledEndpoint.class.getName()));
|
||||||
|
String endpointName = annotationAttributes.getString("value");
|
||||||
|
boolean enabledByDefault = annotationAttributes.getBoolean("enabledByDefault");
|
||||||
|
ConditionOutcome outcome = determineEndpointOutcome(endpointName,
|
||||||
|
enabledByDefault, context);
|
||||||
|
if (outcome != null) {
|
||||||
|
return outcome;
|
||||||
|
}
|
||||||
|
return determineAllEndpointsOutcome(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
private ConditionOutcome determineEndpointOutcome(String endpointName,
|
||||||
|
boolean enabledByDefault, ConditionContext context) {
|
||||||
|
RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(
|
||||||
|
context.getEnvironment(), "endpoints." + endpointName + ".");
|
||||||
|
if (resolver.containsProperty("enabled") || !enabledByDefault) {
|
||||||
|
boolean match = resolver.getProperty("enabled", Boolean.class,
|
||||||
|
enabledByDefault);
|
||||||
|
return new ConditionOutcome(match, "The " + endpointName + " is "
|
||||||
|
+ (match ? "enabled" : "disabled"));
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ConditionOutcome determineAllEndpointsOutcome(ConditionContext context) {
|
||||||
|
RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(
|
||||||
|
context.getEnvironment(), "endpoints.");
|
||||||
|
boolean match = Boolean.valueOf(resolver.getProperty("enabled", "true"));
|
||||||
|
return new ConditionOutcome(match, "All endpoints are "
|
||||||
|
+ (match ? "enabled" : "disabled") + " by default");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2012-2015 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@code @Condition} annotations and supporting classes.
|
||||||
|
*/
|
||||||
|
package org.springframework.boot.actuate.condition;
|
||||||
|
|
@ -324,9 +324,7 @@ public class ConfigurationPropertiesReportEndpoint extends
|
||||||
private boolean isReadable(BeanDescription beanDesc, BeanPropertyWriter writer) {
|
private boolean isReadable(BeanDescription beanDesc, BeanPropertyWriter writer) {
|
||||||
String parentType = beanDesc.getType().getRawClass().getName();
|
String parentType = beanDesc.getType().getRawClass().getName();
|
||||||
String type = writer.getPropertyType().getName();
|
String type = writer.getPropertyType().getName();
|
||||||
AnnotatedMethod setter = beanDesc.findMethod(
|
AnnotatedMethod setter = findSetter(beanDesc, writer);
|
||||||
"set" + StringUtils.capitalize(writer.getName()),
|
|
||||||
new Class<?>[] { writer.getPropertyType() });
|
|
||||||
// If there's a setter, we assume it's OK to report on the value,
|
// If there's a setter, we assume it's OK to report on the value,
|
||||||
// similarly, if there's no setter but the package names match, we assume
|
// similarly, if there's no setter but the package names match, we assume
|
||||||
// that its a nested class used solely for binding to config props, so it
|
// that its a nested class used solely for binding to config props, so it
|
||||||
|
|
@ -336,6 +334,19 @@ public class ConfigurationPropertiesReportEndpoint extends
|
||||||
|| ClassUtils.getPackageName(parentType).equals(
|
|| ClassUtils.getPackageName(parentType).equals(
|
||||||
ClassUtils.getPackageName(type));
|
ClassUtils.getPackageName(type));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private AnnotatedMethod findSetter(BeanDescription beanDesc,
|
||||||
|
BeanPropertyWriter writer) {
|
||||||
|
String name = "set" + StringUtils.capitalize(writer.getName());
|
||||||
|
Class<?> type = writer.getPropertyType();
|
||||||
|
AnnotatedMethod setter = beanDesc.findMethod(name, new Class<?>[] { type });
|
||||||
|
// The enabled property of endpoints returns a boolean primitive but is set
|
||||||
|
// using a Boolean class
|
||||||
|
if (setter == null && type.equals(Boolean.TYPE)) {
|
||||||
|
setter = beanDesc.findMethod(name, new Class<?>[] { Boolean.class });
|
||||||
|
}
|
||||||
|
return setter;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -44,11 +44,11 @@ import org.springframework.security.core.userdetails.UserDetailsService;
|
||||||
import org.springframework.security.web.FilterChainProxy;
|
import org.springframework.security.web.FilterChainProxy;
|
||||||
import org.springframework.test.util.ReflectionTestUtils;
|
import org.springframework.test.util.ReflectionTestUtils;
|
||||||
import org.springframework.test.web.servlet.MockMvc;
|
import org.springframework.test.web.servlet.MockMvc;
|
||||||
|
import org.springframework.test.web.servlet.ResultMatcher;
|
||||||
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
|
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
|
||||||
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
|
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
|
||||||
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
|
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
|
||||||
import org.springframework.util.StringUtils;
|
import org.springframework.util.StringUtils;
|
||||||
import org.springframework.web.context.WebApplicationContext;
|
|
||||||
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
|
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
|
||||||
|
|
||||||
import static org.hamcrest.Matchers.greaterThan;
|
import static org.hamcrest.Matchers.greaterThan;
|
||||||
|
|
@ -209,44 +209,36 @@ public class ManagementSecurityAutoConfigurationTests {
|
||||||
PropertyPlaceholderAutoConfiguration.class);
|
PropertyPlaceholderAutoConfiguration.class);
|
||||||
this.context.refresh();
|
this.context.refresh();
|
||||||
|
|
||||||
MockMvc mockMvc = MockMvcBuilders
|
Filter filter = this.context.getBean("springSecurityFilterChain", Filter.class);
|
||||||
.webAppContextSetup((WebApplicationContext) this.context)
|
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.context)
|
||||||
.addFilters(
|
.addFilters(filter).build();
|
||||||
this.context.getBean("springSecurityFilterChain", Filter.class))
|
|
||||||
.build();
|
|
||||||
|
|
||||||
|
|
||||||
// no user (Main)
|
// no user (Main)
|
||||||
mockMvc.perform(
|
mockMvc.perform(MockMvcRequestBuilders.get("/"))
|
||||||
MockMvcRequestBuilders.get("/"))
|
|
||||||
.andExpect(MockMvcResultMatchers.status().isUnauthorized())
|
.andExpect(MockMvcResultMatchers.status().isUnauthorized())
|
||||||
.andExpect(
|
.andExpect(springAuthenticateRealmHeader());
|
||||||
MockMvcResultMatchers.header().string("www-authenticate",
|
|
||||||
Matchers.containsString("realm=\"Spring\"")));
|
|
||||||
|
|
||||||
// invalid user (Main)
|
// invalid user (Main)
|
||||||
mockMvc.perform(
|
mockMvc.perform(
|
||||||
MockMvcRequestBuilders.get("/").header("authorization", "Basic xxx"))
|
MockMvcRequestBuilders.get("/").header("authorization", "Basic xxx"))
|
||||||
.andExpect(MockMvcResultMatchers.status().isUnauthorized())
|
.andExpect(MockMvcResultMatchers.status().isUnauthorized())
|
||||||
.andExpect(
|
.andExpect(springAuthenticateRealmHeader());
|
||||||
MockMvcResultMatchers.header().string("www-authenticate",
|
|
||||||
Matchers.containsString("realm=\"Spring\"")));
|
|
||||||
|
|
||||||
// no user (Management)
|
// no user (Management)
|
||||||
mockMvc.perform(
|
mockMvc.perform(MockMvcRequestBuilders.get("/beans"))
|
||||||
MockMvcRequestBuilders.get("/beans"))
|
|
||||||
.andExpect(MockMvcResultMatchers.status().isUnauthorized())
|
.andExpect(MockMvcResultMatchers.status().isUnauthorized())
|
||||||
.andExpect(
|
.andExpect(springAuthenticateRealmHeader());
|
||||||
MockMvcResultMatchers.header().string("www-authenticate",
|
|
||||||
Matchers.containsString("realm=\"Spring\"")));
|
|
||||||
|
|
||||||
// invalid user (Management)
|
// invalid user (Management)
|
||||||
mockMvc.perform(
|
mockMvc.perform(
|
||||||
MockMvcRequestBuilders.get("/beans").header("authorization", "Basic xxx"))
|
MockMvcRequestBuilders.get("/beans").header("authorization", "Basic xxx"))
|
||||||
.andExpect(MockMvcResultMatchers.status().isUnauthorized())
|
.andExpect(MockMvcResultMatchers.status().isUnauthorized())
|
||||||
.andExpect(
|
.andExpect(springAuthenticateRealmHeader());
|
||||||
MockMvcResultMatchers.header().string("www-authenticate",
|
}
|
||||||
Matchers.containsString("realm=\"Spring\"")));
|
|
||||||
|
private ResultMatcher springAuthenticateRealmHeader() {
|
||||||
|
return MockMvcResultMatchers.header().string("www-authenticate",
|
||||||
|
Matchers.containsString("realm=\"Spring\""));
|
||||||
}
|
}
|
||||||
|
|
||||||
@EnableGlobalAuthentication
|
@EnableGlobalAuthentication
|
||||||
|
|
@ -254,9 +246,8 @@ public class ManagementSecurityAutoConfigurationTests {
|
||||||
static class AuthenticationConfig {
|
static class AuthenticationConfig {
|
||||||
@Autowired
|
@Autowired
|
||||||
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
|
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
|
||||||
auth
|
auth.inMemoryAuthentication().withUser("user").password("password")
|
||||||
.inMemoryAuthentication()
|
.roles("USER");
|
||||||
.withUser("user").password("password").roles("USER");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ import org.springframework.context.annotation.AnnotationConfigApplicationContext
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
import static org.hamcrest.Matchers.equalTo;
|
||||||
import static org.hamcrest.Matchers.greaterThan;
|
import static org.hamcrest.Matchers.greaterThan;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertNotNull;
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
|
@ -151,6 +152,17 @@ public class ConfigurationPropertiesReportEndpointTests extends
|
||||||
assertEquals("******", nestedProperties.get("myTestProperty"));
|
assertEquals("******", nestedProperties.get("myTestProperty"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public void mixedBoolean() throws Exception {
|
||||||
|
ConfigurationPropertiesReportEndpoint report = getEndpointBean();
|
||||||
|
Map<String, Object> properties = report.invoke();
|
||||||
|
Map<String, Object> nestedProperties = (Map<String, Object>) ((Map<String, Object>) properties
|
||||||
|
.get("testProperties")).get("properties");
|
||||||
|
System.out.println(nestedProperties);
|
||||||
|
assertThat(nestedProperties.get("mixedBoolean"), equalTo((Object) true));
|
||||||
|
}
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
@EnableConfigurationProperties
|
@EnableConfigurationProperties
|
||||||
public static class Parent {
|
public static class Parent {
|
||||||
|
|
@ -183,6 +195,8 @@ public class ConfigurationPropertiesReportEndpointTests extends
|
||||||
|
|
||||||
private String myTestProperty = "654321";
|
private String myTestProperty = "654321";
|
||||||
|
|
||||||
|
private Boolean mixedBoolean = true;
|
||||||
|
|
||||||
public String getDbPassword() {
|
public String getDbPassword() {
|
||||||
return this.dbPassword;
|
return this.dbPassword;
|
||||||
}
|
}
|
||||||
|
|
@ -199,5 +213,13 @@ public class ConfigurationPropertiesReportEndpointTests extends
|
||||||
this.myTestProperty = myTestProperty;
|
this.myTestProperty = myTestProperty;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isMixedBoolean() {
|
||||||
|
return (this.mixedBoolean == null ? false : this.mixedBoolean);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMixedBoolean(Boolean mixedBoolean) {
|
||||||
|
this.mixedBoolean = mixedBoolean;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -116,26 +116,14 @@ abstract class BeanTypeRegistry {
|
||||||
definition.getFactoryMethodName());
|
definition.getFactoryMethodName());
|
||||||
Class<?> generic = ResolvableType.forMethodReturnType(method)
|
Class<?> generic = ResolvableType.forMethodReturnType(method)
|
||||||
.as(FactoryBean.class).resolveGeneric();
|
.as(FactoryBean.class).resolveGeneric();
|
||||||
if (generic == null || generic.equals(Object.class)) {
|
if ((generic == null || generic.equals(Object.class))
|
||||||
generic = determineTypeFromDefinitionAttribute(factoryDefinition);
|
&& definition.hasAttribute(FACTORY_BEAN_OBJECT_TYPE)) {
|
||||||
|
generic = getTypeFromAttribute(definition
|
||||||
|
.getAttribute(FACTORY_BEAN_OBJECT_TYPE));
|
||||||
}
|
}
|
||||||
return generic;
|
return generic;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Class<?> determineTypeFromDefinitionAttribute(BeanDefinition definition)
|
|
||||||
throws ClassNotFoundException, LinkageError {
|
|
||||||
if (definition.hasAttribute(FACTORY_BEAN_OBJECT_TYPE)) {
|
|
||||||
Object attributeObject = definition.getAttribute(FACTORY_BEAN_OBJECT_TYPE);
|
|
||||||
if (attributeObject instanceof Class<?>) {
|
|
||||||
return (Class<?>) attributeObject;
|
|
||||||
}
|
|
||||||
else if (attributeObject instanceof String) {
|
|
||||||
return ClassUtils.forName((String) attributeObject, null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return Object.class;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Class<?> getDirectFactoryBeanGeneric(
|
private Class<?> getDirectFactoryBeanGeneric(
|
||||||
ConfigurableListableBeanFactory beanFactory, BeanDefinition definition,
|
ConfigurableListableBeanFactory beanFactory, BeanDefinition definition,
|
||||||
String name) throws ClassNotFoundException, LinkageError {
|
String name) throws ClassNotFoundException, LinkageError {
|
||||||
|
|
@ -143,12 +131,25 @@ abstract class BeanTypeRegistry {
|
||||||
beanFactory.getBeanClassLoader());
|
beanFactory.getBeanClassLoader());
|
||||||
Class<?> generic = ResolvableType.forClass(factoryBeanClass)
|
Class<?> generic = ResolvableType.forClass(factoryBeanClass)
|
||||||
.as(FactoryBean.class).resolveGeneric();
|
.as(FactoryBean.class).resolveGeneric();
|
||||||
if (generic == null || generic.equals(Object.class)) {
|
if ((generic == null || generic.equals(Object.class))
|
||||||
generic = determineTypeFromDefinitionAttribute(definition);
|
&& definition.hasAttribute(FACTORY_BEAN_OBJECT_TYPE)) {
|
||||||
|
generic = getTypeFromAttribute(definition
|
||||||
|
.getAttribute(FACTORY_BEAN_OBJECT_TYPE));
|
||||||
}
|
}
|
||||||
return generic;
|
return generic;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Class<?> getTypeFromAttribute(Object attribute)
|
||||||
|
throws ClassNotFoundException, LinkageError {
|
||||||
|
if (attribute instanceof Class<?>) {
|
||||||
|
return (Class<?>) attribute;
|
||||||
|
}
|
||||||
|
if (attribute instanceof String) {
|
||||||
|
return ClassUtils.forName((String) attribute, null);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Factory method to get the {@link BeanTypeRegistry} for a given {@link BeanFactory}.
|
* Factory method to get the {@link BeanTypeRegistry} for a given {@link BeanFactory}.
|
||||||
* @param beanFactory the source bean factory
|
* @param beanFactory the source bean factory
|
||||||
|
|
|
||||||
|
|
@ -163,7 +163,7 @@ public class GzipFilterProperties {
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<MimeType> getExcludedMimeTypes() {
|
public List<MimeType> getExcludedMimeTypes() {
|
||||||
return excludedMimeTypes;
|
return this.excludedMimeTypes;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setExcludedMimeTypes(List<MimeType> excludedMimeTypes) {
|
public void setExcludedMimeTypes(List<MimeType> excludedMimeTypes) {
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2012-2014 the original author or authors.
|
* Copyright 2012-2015 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|
@ -51,9 +51,7 @@ public class ElasticsearchRepositoriesAutoConfigurationTests {
|
||||||
@Test
|
@Test
|
||||||
public void testDefaultRepositoryConfiguration() throws Exception {
|
public void testDefaultRepositoryConfiguration() throws Exception {
|
||||||
this.context = new AnnotationConfigApplicationContext();
|
this.context = new AnnotationConfigApplicationContext();
|
||||||
EnvironmentTestUtils.addEnvironment(this.context,
|
addElasticsearchProperties(this.context);
|
||||||
"spring.data.elasticsearch.properties.path.data:target/data",
|
|
||||||
"spring.data.elasticsearch.properties.path.logs:target/logs");
|
|
||||||
this.context.register(TestConfiguration.class,
|
this.context.register(TestConfiguration.class,
|
||||||
ElasticsearchAutoConfiguration.class,
|
ElasticsearchAutoConfiguration.class,
|
||||||
ElasticsearchRepositoriesAutoConfiguration.class,
|
ElasticsearchRepositoriesAutoConfiguration.class,
|
||||||
|
|
@ -67,9 +65,7 @@ public class ElasticsearchRepositoriesAutoConfigurationTests {
|
||||||
@Test
|
@Test
|
||||||
public void testNoRepositoryConfiguration() throws Exception {
|
public void testNoRepositoryConfiguration() throws Exception {
|
||||||
this.context = new AnnotationConfigApplicationContext();
|
this.context = new AnnotationConfigApplicationContext();
|
||||||
EnvironmentTestUtils.addEnvironment(this.context,
|
addElasticsearchProperties(this.context);
|
||||||
"spring.data.elasticsearch.properties.path.data:target/data",
|
|
||||||
"spring.data.elasticsearch.properties.path.logs:target/logs");
|
|
||||||
this.context.register(EmptyConfiguration.class,
|
this.context.register(EmptyConfiguration.class,
|
||||||
ElasticsearchAutoConfiguration.class,
|
ElasticsearchAutoConfiguration.class,
|
||||||
ElasticsearchRepositoriesAutoConfiguration.class,
|
ElasticsearchRepositoriesAutoConfiguration.class,
|
||||||
|
|
@ -82,9 +78,7 @@ public class ElasticsearchRepositoriesAutoConfigurationTests {
|
||||||
@Test
|
@Test
|
||||||
public void doesNotTriggerDefaultRepositoryDetectionIfCustomized() {
|
public void doesNotTriggerDefaultRepositoryDetectionIfCustomized() {
|
||||||
this.context = new AnnotationConfigApplicationContext();
|
this.context = new AnnotationConfigApplicationContext();
|
||||||
EnvironmentTestUtils.addEnvironment(this.context,
|
addElasticsearchProperties(this.context);
|
||||||
"spring.data.elasticsearch.properties.path.data:target/data",
|
|
||||||
"spring.data.elasticsearch.properties.path.logs:target/logs");
|
|
||||||
this.context.register(CustomizedConfiguration.class,
|
this.context.register(CustomizedConfiguration.class,
|
||||||
ElasticsearchAutoConfiguration.class,
|
ElasticsearchAutoConfiguration.class,
|
||||||
ElasticsearchRepositoriesAutoConfiguration.class,
|
ElasticsearchRepositoriesAutoConfiguration.class,
|
||||||
|
|
@ -94,6 +88,12 @@ public class ElasticsearchRepositoriesAutoConfigurationTests {
|
||||||
assertNotNull(this.context.getBean(CityElasticsearchDbRepository.class));
|
assertNotNull(this.context.getBean(CityElasticsearchDbRepository.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void addElasticsearchProperties(AnnotationConfigApplicationContext context) {
|
||||||
|
EnvironmentTestUtils.addEnvironment(context,
|
||||||
|
"spring.data.elasticsearch.properties.path.data:target/data",
|
||||||
|
"spring.data.elasticsearch.properties.path.logs:target/logs");
|
||||||
|
}
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
@TestAutoConfigurationPackage(City.class)
|
@TestAutoConfigurationPackage(City.class)
|
||||||
protected static class TestConfiguration {
|
protected static class TestConfiguration {
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2012-2014 the original author or authors.
|
* Copyright 2012-2015 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2012-2014 the original author or authors.
|
* Copyright 2012-2015 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|
@ -54,4 +54,5 @@ public class ElasticsearchDataAutoConfigurationTests {
|
||||||
assertEquals(1,
|
assertEquals(1,
|
||||||
this.context.getBeanNamesForType(ElasticsearchTemplate.class).length);
|
this.context.getBeanNamesForType(ElasticsearchTemplate.class).length);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,7 @@ import org.springframework.boot.loader.tools.RunProcess;
|
||||||
class RunProcessCommand extends AbstractCommand {
|
class RunProcessCommand extends AbstractCommand {
|
||||||
|
|
||||||
private final String[] command;
|
private final String[] command;
|
||||||
|
|
||||||
private volatile RunProcess process;
|
private volatile RunProcess process;
|
||||||
|
|
||||||
public RunProcessCommand(String... command) {
|
public RunProcessCommand(String... command) {
|
||||||
|
|
|
||||||
|
|
@ -71,7 +71,7 @@
|
||||||
<gradle.version>1.12</gradle.version>
|
<gradle.version>1.12</gradle.version>
|
||||||
<groovy.version>2.4.3</groovy.version>
|
<groovy.version>2.4.3</groovy.version>
|
||||||
<gson.version>2.3.1</gson.version>
|
<gson.version>2.3.1</gson.version>
|
||||||
<h2.version>1.4.185</h2.version>
|
<h2.version>1.4.187</h2.version>
|
||||||
<hamcrest.version>1.3</hamcrest.version>
|
<hamcrest.version>1.3</hamcrest.version>
|
||||||
<hazelcast.version>3.4.2</hazelcast.version>
|
<hazelcast.version>3.4.2</hazelcast.version>
|
||||||
<hibernate.version>4.3.10.Final</hibernate.version>
|
<hibernate.version>4.3.10.Final</hibernate.version>
|
||||||
|
|
@ -1876,4 +1876,4 @@
|
||||||
<id>integration-test</id>
|
<id>integration-test</id>
|
||||||
</profile>
|
</profile>
|
||||||
</profiles>
|
</profiles>
|
||||||
</project>
|
</project>
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2012-2014 the original author or authors.
|
* Copyright 2012-2015 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|
@ -33,6 +33,10 @@ import static org.junit.Assert.assertTrue;
|
||||||
*/
|
*/
|
||||||
public class SampleElasticsearchApplicationTests {
|
public class SampleElasticsearchApplicationTests {
|
||||||
|
|
||||||
|
private static final String[] PROPERTIES = {
|
||||||
|
"spring.data.elasticsearch.properties.path.data:target/data",
|
||||||
|
"spring.data.elasticsearch.properties.path.logs:target/logs" };
|
||||||
|
|
||||||
@Rule
|
@Rule
|
||||||
public OutputCapture outputCapture = new OutputCapture();
|
public OutputCapture outputCapture = new OutputCapture();
|
||||||
|
|
||||||
|
|
@ -40,10 +44,7 @@ public class SampleElasticsearchApplicationTests {
|
||||||
public void testDefaultSettings() throws Exception {
|
public void testDefaultSettings() throws Exception {
|
||||||
try {
|
try {
|
||||||
new SpringApplicationBuilder(SampleElasticsearchApplication.class)
|
new SpringApplicationBuilder(SampleElasticsearchApplication.class)
|
||||||
.properties(
|
.properties(PROPERTIES).run();
|
||||||
"spring.data.elasticsearch.properties.path.data:target/data",
|
|
||||||
"spring.data.elasticsearch.properties.path.logs:target/logs")
|
|
||||||
.run();
|
|
||||||
}
|
}
|
||||||
catch (IllegalStateException ex) {
|
catch (IllegalStateException ex) {
|
||||||
if (serverNotRunning(ex)) {
|
if (serverNotRunning(ex)) {
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2012-2014 the original author or authors.
|
* Copyright 2012-2015 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|
@ -19,6 +19,7 @@ package org.springframework.boot.loader.jar;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.lang.ref.SoftReference;
|
import java.lang.ref.SoftReference;
|
||||||
|
import java.util.Calendar;
|
||||||
import java.util.GregorianCalendar;
|
import java.util.GregorianCalendar;
|
||||||
import java.util.zip.ZipEntry;
|
import java.util.zip.ZipEntry;
|
||||||
|
|
||||||
|
|
@ -31,6 +32,7 @@ import org.springframework.boot.loader.util.AsciiBytes;
|
||||||
* the entry is actually needed.
|
* the entry is actually needed.
|
||||||
*
|
*
|
||||||
* @author Phillip Webb
|
* @author Phillip Webb
|
||||||
|
* @author Andy Wilkinson
|
||||||
*/
|
*/
|
||||||
public final class JarEntryData {
|
public final class JarEntryData {
|
||||||
|
|
||||||
|
|
@ -146,20 +148,27 @@ public final class JarEntryData {
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getTime() {
|
public long getTime() {
|
||||||
long time = Bytes.littleEndianValue(this.header, 12, 2);
|
|
||||||
|
|
||||||
int seconds = (int) ((time << 1) & 0x3E);
|
|
||||||
int minutes = (int) ((time >> 5) & 0x3F);
|
|
||||||
int hours = (int) ((time >> 11) & 0x1F);
|
|
||||||
|
|
||||||
long date = Bytes.littleEndianValue(this.header, 14, 2);
|
long date = Bytes.littleEndianValue(this.header, 14, 2);
|
||||||
|
long time = Bytes.littleEndianValue(this.header, 12, 2);
|
||||||
|
return decodeMsDosFormatDateTime(date, time).getTimeInMillis();
|
||||||
|
}
|
||||||
|
|
||||||
int day = (int) (date & 0x1F);
|
/**
|
||||||
int month = (int) ((date >> 5) & 0xF) - 1;
|
* Decode MSDOS Date Time details. See <a
|
||||||
|
* href="http://mindprod.com/jgloss/zip.html">mindprod.com/jgloss/zip.html</a> for
|
||||||
|
* more details of the format.
|
||||||
|
* @param date the date part
|
||||||
|
* @param time the time part
|
||||||
|
* @return a {@link Calendar} containing the decoded date.
|
||||||
|
*/
|
||||||
|
private Calendar decodeMsDosFormatDateTime(long date, long time) {
|
||||||
int year = (int) ((date >> 9) & 0x7F) + 1980;
|
int year = (int) ((date >> 9) & 0x7F) + 1980;
|
||||||
|
int month = (int) ((date >> 5) & 0xF) - 1;
|
||||||
return new GregorianCalendar(year, month, day, hours, minutes, seconds)
|
int day = (int) (date & 0x1F);
|
||||||
.getTimeInMillis();
|
int hours = (int) ((time >> 11) & 0x1F);
|
||||||
|
int minutes = (int) ((time >> 5) & 0x3F);
|
||||||
|
int seconds = (int) ((time << 1) & 0x3E);
|
||||||
|
return new GregorianCalendar(year, month, day, hours, minutes, seconds);
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getCrc() {
|
public long getCrc() {
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2012-2014 the original author or authors.
|
* Copyright 2012-2015 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|
|
||||||
|
|
@ -121,16 +121,7 @@ public class PropertySourcesPropertyValues implements PropertyValues {
|
||||||
.contains(source.getName()) && !includes.matches(propertyName)) {
|
.contains(source.getName()) && !includes.matches(propertyName)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
Object value = null;
|
Object value = getEnumerableProperty(source, resolver, propertyName);
|
||||||
try {
|
|
||||||
value = resolver.getProperty(propertyName, Object.class);
|
|
||||||
}
|
|
||||||
catch (RuntimeException ex) {
|
|
||||||
// Probably could not resolve placeholders, ignore it here
|
|
||||||
if (value == null) {
|
|
||||||
value = source.getProperty(propertyName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!this.propertyValues.containsKey(propertyName)) {
|
if (!this.propertyValues.containsKey(propertyName)) {
|
||||||
this.propertyValues.put(propertyName, new PropertyValue(propertyName,
|
this.propertyValues.put(propertyName, new PropertyValue(propertyName,
|
||||||
value));
|
value));
|
||||||
|
|
@ -139,6 +130,17 @@ public class PropertySourcesPropertyValues implements PropertyValues {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Object getEnumerableProperty(EnumerablePropertySource<?> source,
|
||||||
|
PropertySourcesPropertyResolver resolver, String propertyName) {
|
||||||
|
try {
|
||||||
|
return resolver.getProperty(propertyName, Object.class);
|
||||||
|
}
|
||||||
|
catch (RuntimeException ex) {
|
||||||
|
// Probably could not resolve placeholders, ignore it here
|
||||||
|
return source.getProperty(propertyName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void processCompositePropertySource(CompositePropertySource source,
|
private void processCompositePropertySource(CompositePropertySource source,
|
||||||
PropertySourcesPropertyResolver resolver,
|
PropertySourcesPropertyResolver resolver,
|
||||||
PropertyNamePatternsMatcher includes, Collection<String> exacts) {
|
PropertyNamePatternsMatcher includes, Collection<String> exacts) {
|
||||||
|
|
|
||||||
|
|
@ -387,15 +387,17 @@ public class ConfigFileApplicationListener implements
|
||||||
.getProperty(INCLUDE_PROFILES_PROPERTY));
|
.getProperty(INCLUDE_PROFILES_PROPERTY));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
StringBuilder msg = new StringBuilder();
|
StringBuilder msg = new StringBuilder();
|
||||||
msg.append(propertySource == null ? "Skipped " : "Loaded ");
|
msg.append(propertySource == null ? "Skipped " : "Loaded ");
|
||||||
msg.append("config file ");
|
msg.append("config file ");
|
||||||
msg.append("'").append(location).append("' ");
|
msg.append("'").append(location).append("'");
|
||||||
msg.append(StringUtils.hasLength(profile) ? "for profile " + profile : " ");
|
if (StringUtils.hasLength(profile)) {
|
||||||
msg.append(resource == null || !resource.exists() ? "resource not found" : "");
|
msg.append(" for profile" + profile);
|
||||||
|
}
|
||||||
|
if (resource == null || !resource.exists()) {
|
||||||
|
msg.append(" resource not found");
|
||||||
|
}
|
||||||
this.debug.add(msg);
|
this.debug.add(msg);
|
||||||
|
|
||||||
return propertySource;
|
return propertySource;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
@ -44,6 +45,7 @@ public class PropertySourcesPropertyValuesTests {
|
||||||
@Before
|
@Before
|
||||||
public void init() {
|
public void init() {
|
||||||
this.propertySources.addFirst(new PropertySource<String>("static", "foo") {
|
this.propertySources.addFirst(new PropertySource<String>("static", "foo") {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object getProperty(String name) {
|
public Object getProperty(String name) {
|
||||||
if (name.equals(getSource())) {
|
if (name.equals(getSource())) {
|
||||||
|
|
@ -59,10 +61,8 @@ public class PropertySourcesPropertyValuesTests {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testTypesPreserved() {
|
public void testTypesPreserved() {
|
||||||
this.propertySources.replace(
|
Map<String, Object> map = Collections.<String, Object> singletonMap("name", 123);
|
||||||
"map",
|
this.propertySources.replace("map", new MapPropertySource("map", map));
|
||||||
new MapPropertySource("map", Collections.<String, Object> singletonMap(
|
|
||||||
"name", 123)));
|
|
||||||
PropertySourcesPropertyValues propertyValues = new PropertySourcesPropertyValues(
|
PropertySourcesPropertyValues propertyValues = new PropertySourcesPropertyValues(
|
||||||
this.propertySources);
|
this.propertySources);
|
||||||
assertEquals(123, propertyValues.getPropertyValues()[0].getValue());
|
assertEquals(123, propertyValues.getPropertyValues()[0].getValue());
|
||||||
|
|
@ -123,6 +123,7 @@ public class PropertySourcesPropertyValuesTests {
|
||||||
@Test
|
@Test
|
||||||
public void testNonEnumeratedPlaceholder() {
|
public void testNonEnumeratedPlaceholder() {
|
||||||
this.propertySources.addFirst(new PropertySource<String>("another", "baz") {
|
this.propertySources.addFirst(new PropertySource<String>("another", "baz") {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object getProperty(String name) {
|
public Object getProperty(String name) {
|
||||||
if (name.equals(getSource())) {
|
if (name.equals(getSource())) {
|
||||||
|
|
@ -179,10 +180,12 @@ public class PropertySourcesPropertyValuesTests {
|
||||||
TestBean target = new TestBean();
|
TestBean target = new TestBean();
|
||||||
DataBinder binder = new DataBinder(target);
|
DataBinder binder = new DataBinder(target);
|
||||||
this.propertySources.addFirst(new PropertySource<Object>("application", "STUFF") {
|
this.propertySources.addFirst(new PropertySource<Object>("application", "STUFF") {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object getProperty(String name) {
|
public Object getProperty(String name) {
|
||||||
return new Object();
|
return new Object();
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
binder.bind(new PropertySourcesPropertyValues(this.propertySources,
|
binder.bind(new PropertySourcesPropertyValues(this.propertySources,
|
||||||
(Collection<String>) null, Collections.singleton("name")));
|
(Collection<String>) null, Collections.singleton("name")));
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue