From 685babc8295d48710b0c93861ca6b1c3e1a90d8d Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Wed, 4 Apr 2018 19:35:41 -0700 Subject: [PATCH] Polish "Use lambdas for map entry iteration where possible" Closes gh-12626 --- .../condition/ConditionsReportEndpoint.java | 28 ++---- ...CompositeHealthIndicatorConfiguration.java | 5 +- ...eReactiveHealthIndicatorConfiguration.java | 5 +- ...ourceHealthIndicatorAutoConfiguration.java | 8 +- .../boot/actuate/env/EnvironmentEndpoint.java | 11 ++- .../AutoConfigurationSorter.java | 12 +-- ...ImportAutoConfigurationImportSelector.java | 7 +- .../cache/CacheConfigurations.java | 11 ++- .../condition/AbstractNestedCondition.java | 5 +- .../condition/BeanTypeRegistry.java | 16 ++-- .../condition/ConditionEvaluationReport.java | 25 ++--- .../condition/OnBeanCondition.java | 3 +- .../NoSuchBeanDefinitionFailureAnalyzer.java | 33 ++++--- .../session/SessionStoreMappings.java | 93 ++++++++++--------- .../WebServicesAutoConfiguration.java | 2 +- .../init/ProjectGenerationRequest.java | 5 +- .../AnnotatedNodeASTTransformation.java | 8 +- .../devtools/settings/DevToolsSettings.java | 2 +- .../AutoConfigureAnnotationProcessor.java | 37 +++++--- ...SimpleConfigurationMetadataRepository.java | 8 +- ...figurationMetadataAnnotationProcessor.java | 4 +- .../TypeElementMembers.java | 6 +- .../configurationprocessor/TypeUtils.java | 3 +- .../loader/tools/BuildPropertiesWriter.java | 7 +- .../PropertiesMergingResourceTransformer.java | 21 ++--- .../springframework/boot/maven/Verify.java | 9 +- .../boot/logging/LoggingSystem.java | 11 ++- 27 files changed, 209 insertions(+), 176 deletions(-) diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/condition/ConditionsReportEndpoint.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/condition/ConditionsReportEndpoint.java index d4d4be0363..76eb49d505 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/condition/ConditionsReportEndpoint.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/condition/ConditionsReportEndpoint.java @@ -123,29 +123,21 @@ public class ConditionsReportEndpoint { this.negativeMatches = new LinkedHashMap<>(); this.exclusions = report.getExclusions(); this.unconditionalClasses = report.getUnconditionalClasses(); - report.getConditionAndOutcomesBySource().forEach((key, value) -> { - if (value.isFullMatch()) { - add(this.positiveMatches, key, value); - } - else { - add(this.negativeMatches, key, value); - } - }); + report.getConditionAndOutcomesBySource().forEach( + (source, conditionAndOutcomes) -> add(source, conditionAndOutcomes)); this.parentId = context.getParent() == null ? null : context.getParent().getId(); } - private void add(Map map, String source, - ConditionAndOutcomes conditionAndOutcomes) { + private void add(String source, ConditionAndOutcomes conditionAndOutcomes) { String name = ClassUtils.getShortName(source); - map.put(name, new MessageAndConditions(conditionAndOutcomes)); - } - - private void add(MultiValueMap map, String source, - ConditionAndOutcomes conditionAndOutcomes) { - String name = ClassUtils.getShortName(source); - for (ConditionAndOutcome conditionAndOutcome : conditionAndOutcomes) { - map.add(name, new MessageAndCondition(conditionAndOutcome)); + if (conditionAndOutcomes.isFullMatch()) { + conditionAndOutcomes.forEach((conditionAndOutcome) -> this.positiveMatches + .add(name, new MessageAndCondition(conditionAndOutcome))); + } + else { + this.negativeMatches.put(name, + new MessageAndConditions(conditionAndOutcomes)); } } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/health/CompositeHealthIndicatorConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/health/CompositeHealthIndicatorConfiguration.java index c197d4a1a1..e232e7007a 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/health/CompositeHealthIndicatorConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/health/CompositeHealthIndicatorConfiguration.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. @@ -44,7 +44,8 @@ public abstract class CompositeHealthIndicatorConfiguration composite.addHealthIndicator(key, createHealthIndicator(value))); + beans.forEach((name, source) -> composite.addHealthIndicator(name, + createHealthIndicator(source))); return composite; } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/health/CompositeReactiveHealthIndicatorConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/health/CompositeReactiveHealthIndicatorConfiguration.java index 00f83d1975..227b2f207a 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/health/CompositeReactiveHealthIndicatorConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/health/CompositeReactiveHealthIndicatorConfiguration.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. @@ -43,7 +43,8 @@ public abstract class CompositeReactiveHealthIndicatorConfiguration composite.addHealthIndicator(key, createHealthIndicator(value))); + beans.forEach((name, source) -> composite.addHealthIndicator(name, + createHealthIndicator(source))); return composite; } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/jdbc/DataSourceHealthIndicatorAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/jdbc/DataSourceHealthIndicatorAutoConfiguration.java index a8112e902c..f09924255b 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/jdbc/DataSourceHealthIndicatorAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/jdbc/DataSourceHealthIndicatorAutoConfiguration.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. @@ -84,9 +84,9 @@ public class DataSourceHealthIndicatorAutoConfiguration extends return null; } Map dataSources = new LinkedHashMap<>(); - candidates.forEach((key, value) -> { - if (!(value instanceof AbstractRoutingDataSource)) { - dataSources.put(key, value); + candidates.forEach((name, dataSource) -> { + if (!(dataSource instanceof AbstractRoutingDataSource)) { + dataSources.put(name, dataSource); } }); return dataSources; diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/env/EnvironmentEndpoint.java b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/env/EnvironmentEndpoint.java index e0183282e0..f380cdbddc 100644 --- a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/env/EnvironmentEndpoint.java +++ b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/env/EnvironmentEndpoint.java @@ -120,10 +120,13 @@ public class EnvironmentEndpoint { private PropertySummaryDescriptor getPropertySummaryDescriptor( Map descriptors) { - return descriptors.entrySet().stream(). - filter((entry) -> entry.getValue() != null). - map((entry) -> new PropertySummaryDescriptor(entry.getKey(), entry.getValue().getValue())). - findFirst().orElse(null); + for (Map.Entry entry : descriptors.entrySet()) { + if (entry.getValue() != null) { + return new PropertySummaryDescriptor(entry.getKey(), + entry.getValue().getValue()); + } + } + return null; } private Map getPropertySourceDescriptors( diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/AutoConfigurationSorter.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/AutoConfigurationSorter.java index f883ad891d..d31fbd8a3c 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/AutoConfigurationSorter.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/AutoConfigurationSorter.java @@ -140,14 +140,14 @@ class AutoConfigurationSorter { } public Set getClassesRequestedAfter(String className) { - Set rtn = new LinkedHashSet<>(); - rtn.addAll(get(className).getAfter()); - this.classes.forEach((key, value) -> { - if (value.getBefore().contains(className)) { - rtn.add(key); + Set classesRequestedAfter = new LinkedHashSet<>(); + classesRequestedAfter.addAll(get(className).getAfter()); + this.classes.forEach((name, autoConfigurationClass) -> { + if (autoConfigurationClass.getBefore().contains(className)) { + classesRequestedAfter.add(name); } }); - return rtn; + return classesRequestedAfter; } } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/ImportAutoConfigurationImportSelector.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/ImportAutoConfigurationImportSelector.java index 7e18f430f5..0def58b5c0 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/ImportAutoConfigurationImportSelector.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/ImportAutoConfigurationImportSelector.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. @@ -74,9 +74,8 @@ class ImportAutoConfigurationImportSelector extends AutoConfigurationImportSelec AnnotationAttributes attributes) { List candidates = new ArrayList<>(); Map, List> annotations = getAnnotations(metadata); - annotations.forEach((key, value) -> { - collectCandidateConfigurations(key, value, candidates); - }); + annotations.forEach((source, sourceAnnotations) -> collectCandidateConfigurations( + source, sourceAnnotations, candidates)); return candidates; } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/CacheConfigurations.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/CacheConfigurations.java index 441dc1170b..22fce136ca 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/CacheConfigurations.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/CacheConfigurations.java @@ -57,10 +57,13 @@ final class CacheConfigurations { } public static CacheType getType(String configurationClassName) { - return MAPPINGS.entrySet().stream().filter((entry) -> - entry.getValue().getName().equals(configurationClassName)). - map(Map.Entry::getKey).findFirst(). - orElseThrow(() -> new IllegalStateException("Unknown configuration class " + configurationClassName)); + for (Map.Entry> entry : MAPPINGS.entrySet()) { + if (entry.getValue().getName().equals(configurationClassName)) { + return entry.getKey(); + } + } + throw new IllegalStateException( + "Unknown configuration class " + configurationClassName); } } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/AbstractNestedCondition.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/AbstractNestedCondition.java index fcd3f06762..98ebcdb266 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/AbstractNestedCondition.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/AbstractNestedCondition.java @@ -159,8 +159,9 @@ public abstract class AbstractNestedCondition extends SpringBootCondition public List getMatchOutcomes() { List outcomes = new ArrayList<>(); - this.memberConditions.forEach((metadata, conditions) -> - outcomes.add(new MemberOutcomes(this.context, metadata, conditions).getUltimateOutcome())); + this.memberConditions.forEach((metadata, conditions) -> outcomes + .add(new MemberOutcomes(this.context, metadata, conditions) + .getUltimateOutcome())); return Collections.unmodifiableList(outcomes); } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/BeanTypeRegistry.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/BeanTypeRegistry.java index 223c12e006..6852f79cf9 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/BeanTypeRegistry.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/BeanTypeRegistry.java @@ -113,9 +113,11 @@ final class BeanTypeRegistry implements SmartInitializingSingleton { */ Set getNamesForType(Class type) { updateTypesIfNecessary(); - return this.beanTypes.entrySet().stream().filter((entry) -> entry.getValue() != null && - type.isAssignableFrom(entry.getValue())). - map(Map.Entry::getKey).collect(Collectors.toCollection(LinkedHashSet::new)); + return this.beanTypes.entrySet().stream() + .filter((entry) -> entry.getValue() != null + && type.isAssignableFrom(entry.getValue())) + .map(Map.Entry::getKey) + .collect(Collectors.toCollection(LinkedHashSet::new)); } /** @@ -129,9 +131,11 @@ final class BeanTypeRegistry implements SmartInitializingSingleton { */ Set getNamesForAnnotation(Class annotation) { updateTypesIfNecessary(); - return this.beanTypes.entrySet().stream().filter((entry) -> entry.getValue() != null && - AnnotationUtils.findAnnotation(entry.getValue(), annotation) != null). - map(Map.Entry::getKey).collect(Collectors.toCollection(LinkedHashSet::new)); + return this.beanTypes.entrySet().stream() + .filter((entry) -> entry.getValue() != null && AnnotationUtils + .findAnnotation(entry.getValue(), annotation) != null) + .map(Map.Entry::getKey) + .collect(Collectors.toCollection(LinkedHashSet::new)); } @Override diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/ConditionEvaluationReport.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/ConditionEvaluationReport.java index 603a2f3ec6..128b7cf399 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/ConditionEvaluationReport.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/ConditionEvaluationReport.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. @@ -111,9 +111,9 @@ public final class ConditionEvaluationReport { */ public Map getConditionAndOutcomesBySource() { if (!this.addedAncestorOutcomes) { - this.outcomes.forEach((key, value) -> { - if (!value.isFullMatch()) { - addNoMatchOutcomeToAncestors(key); + this.outcomes.forEach((source, sourceOutcomes) -> { + if (!sourceOutcomes.isFullMatch()) { + addNoMatchOutcomeToAncestors(source); } }); this.addedAncestorOutcomes = true; @@ -123,11 +123,11 @@ public final class ConditionEvaluationReport { private void addNoMatchOutcomeToAncestors(String source) { String prefix = source + "$"; - this.outcomes.forEach((key, value) -> { - if (key.startsWith(prefix)) { + this.outcomes.forEach((candidateSource, sourceOutcomes) -> { + if (candidateSource.startsWith(prefix)) { ConditionOutcome outcome = ConditionOutcome.noMatch(ConditionMessage .forCondition("Ancestor " + source).because("did not match")); - value.add(ANCESTOR_CONDITION, outcome); + sourceOutcomes.add(ANCESTOR_CONDITION, outcome); } }); } @@ -188,12 +188,13 @@ public final class ConditionEvaluationReport { public ConditionEvaluationReport getDelta(ConditionEvaluationReport previousReport) { ConditionEvaluationReport delta = new ConditionEvaluationReport(); - this.outcomes.forEach((key, value) -> { - ConditionAndOutcomes previous = previousReport.outcomes.get(key); + this.outcomes.forEach((source, sourceOutcomes) -> { + ConditionAndOutcomes previous = previousReport.outcomes.get(source); if (previous == null - || previous.isFullMatch() != value.isFullMatch()) { - value.forEach((conditionAndOutcome) -> delta.recordConditionEvaluation( - key, conditionAndOutcome.getCondition(), + || previous.isFullMatch() != sourceOutcomes.isFullMatch()) { + sourceOutcomes.forEach( + (conditionAndOutcome) -> delta.recordConditionEvaluation(source, + conditionAndOutcome.getCondition(), conditionAndOutcome.getOutcome())); } }); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnBeanCondition.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnBeanCondition.java index 91232033c8..5b0573ae4a 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnBeanCondition.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnBeanCondition.java @@ -175,8 +175,7 @@ class OnBeanCondition extends SpringBootCondition implements ConfigurationCondit reason.append(" '"); reason.append(key); reason.append("' "); - reason.append( - StringUtils.collectionToDelimitedString(value, ", ")); + reason.append(StringUtils.collectionToDelimitedString(value, ", ")); }); } } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/diagnostics/analyzer/NoSuchBeanDefinitionFailureAnalyzer.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/diagnostics/analyzer/NoSuchBeanDefinitionFailureAnalyzer.java index 7b3f2e0d0c..aae26aa7d6 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/diagnostics/analyzer/NoSuchBeanDefinitionFailureAnalyzer.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/diagnostics/analyzer/NoSuchBeanDefinitionFailureAnalyzer.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. @@ -30,6 +30,7 @@ import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.boot.autoconfigure.condition.ConditionEvaluationReport; import org.springframework.boot.autoconfigure.condition.ConditionEvaluationReport.ConditionAndOutcome; +import org.springframework.boot.autoconfigure.condition.ConditionEvaluationReport.ConditionAndOutcomes; import org.springframework.boot.autoconfigure.condition.ConditionOutcome; import org.springframework.boot.diagnostics.FailureAnalysis; import org.springframework.boot.diagnostics.analyzer.AbstractInjectionFailureAnalyzer; @@ -123,20 +124,26 @@ class NoSuchBeanDefinitionFailureAnalyzer private void collectReportedConditionOutcomes(NoSuchBeanDefinitionException cause, List results) { - this.report.getConditionAndOutcomesBySource().forEach((key, conditionAndOutcomes) -> { - Source source = new Source(key); - if (!conditionAndOutcomes.isFullMatch()) { - BeanMethods methods = new BeanMethods(source, cause); - for (ConditionAndOutcome conditionAndOutcome : conditionAndOutcomes) { - if (!conditionAndOutcome.getOutcome().isMatch()) { - for (MethodMetadata method : methods) { - results.add(new AutoConfigurationResult(method, - conditionAndOutcome.getOutcome(), source.isMethod())); - } - } + this.report.getConditionAndOutcomesBySource().forEach( + (source, sourceOutcomes) -> collectReportedConditionOutcomes(cause, + new Source(source), sourceOutcomes, results)); + } + + private void collectReportedConditionOutcomes(NoSuchBeanDefinitionException cause, + Source source, ConditionAndOutcomes sourceOutcomes, + List results) { + if (sourceOutcomes.isFullMatch()) { + return; + } + BeanMethods methods = new BeanMethods(source, cause); + for (ConditionAndOutcome conditionAndOutcome : sourceOutcomes) { + if (!conditionAndOutcome.getOutcome().isMatch()) { + for (MethodMetadata method : methods) { + results.add(new AutoConfigurationResult(method, + conditionAndOutcome.getOutcome(), source.isMethod())); } } - }); + } } private void collectExcludedAutoConfiguration(NoSuchBeanDefinitionException cause, diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionStoreMappings.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionStoreMappings.java index 41b115202c..cc75016040 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionStoreMappings.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionStoreMappings.java @@ -19,10 +19,10 @@ package org.springframework.boot.autoconfigure.session; import java.util.Collections; import java.util.EnumMap; import java.util.Map; -import java.util.Objects; import org.springframework.boot.WebApplicationType; import org.springframework.util.Assert; +import org.springframework.util.ObjectUtils; /** * Mappings between {@link StoreType} and {@code @Configuration}. @@ -32,63 +32,70 @@ import org.springframework.util.Assert; */ final class SessionStoreMappings { - private static final Map>> MAPPINGS; + private static final Map MAPPINGS; static { - Map>> mappings = new EnumMap<>( - StoreType.class); - mappings.put(StoreType.REDIS, createMapping(RedisSessionConfiguration.class, + Map mappings = new EnumMap<>(StoreType.class); + mappings.put(StoreType.REDIS, new Configurations(RedisSessionConfiguration.class, RedisReactiveSessionConfiguration.class)); - mappings.put(StoreType.MONGODB, createMapping(MongoSessionConfiguration.class, - MongoReactiveSessionConfiguration.class)); - mappings.put(StoreType.JDBC, createMapping(JdbcSessionConfiguration.class)); + mappings.put(StoreType.MONGODB, + new Configurations(MongoSessionConfiguration.class, + MongoReactiveSessionConfiguration.class)); + mappings.put(StoreType.JDBC, + new Configurations(JdbcSessionConfiguration.class, null)); mappings.put(StoreType.HAZELCAST, - createMapping(HazelcastSessionConfiguration.class)); - mappings.put(StoreType.NONE, createMapping(NoOpSessionConfiguration.class, + new Configurations(HazelcastSessionConfiguration.class, null)); + mappings.put(StoreType.NONE, new Configurations(NoOpSessionConfiguration.class, NoOpReactiveSessionConfiguration.class)); MAPPINGS = Collections.unmodifiableMap(mappings); } - static Map> createMapping( - Class servletConfiguration) { - return createMapping(servletConfiguration, null); - } - - static Map> createMapping(Class servletConfiguration, - Class reactiveConfiguration) { - Map> mapping = new EnumMap<>( - WebApplicationType.class); - mapping.put(WebApplicationType.SERVLET, servletConfiguration); - if (reactiveConfiguration != null) { - mapping.put(WebApplicationType.REACTIVE, reactiveConfiguration); - } - return mapping; - } - private SessionStoreMappings() { } - static String getConfigurationClass(WebApplicationType webApplicationType, + public static String getConfigurationClass(WebApplicationType webApplicationType, StoreType sessionStoreType) { - Map> configurationClasses = MAPPINGS - .get(sessionStoreType); - Assert.state(configurationClasses != null, + Configurations configurations = MAPPINGS.get(sessionStoreType); + Assert.state(configurations != null, () -> "Unknown session store type " + sessionStoreType); - Class configurationClass = configurationClasses.get(webApplicationType); - if (configurationClass == null) { - return null; - } - return configurationClass.getName(); + return configurations.getConfiguration(webApplicationType); } - static StoreType getType(WebApplicationType webApplicationType, - String configurationClassName) { - return MAPPINGS.entrySet().stream().map(entry -> - entry.getValue().entrySet().stream().filter(webAppEntry -> webAppEntry.getKey() == webApplicationType - && webAppEntry.getValue().getName().equals(configurationClassName)). - map(webAppEntry -> entry.getKey()).findFirst().orElse(null)).filter(Objects::nonNull). - findFirst().orElseThrow(() -> - new IllegalStateException("Unknown configuration class " + configurationClassName)); + public static StoreType getType(WebApplicationType webApplicationType, + String configurationClass) { + return MAPPINGS.entrySet().stream() + .filter((entry) -> ObjectUtils.nullSafeEquals(configurationClass, + entry.getValue().getConfiguration(webApplicationType))) + .map(Map.Entry::getKey).findFirst() + .orElseThrow(() -> new IllegalStateException( + "Unknown configuration class " + configurationClass)); + } + + private static class Configurations { + + private final Class servletConfiguration; + + private final Class reactiveConfiguration; + + Configurations(Class servletConfiguration, Class reactiveConfiguration) { + this.servletConfiguration = servletConfiguration; + this.reactiveConfiguration = reactiveConfiguration; + } + + public String getConfiguration(WebApplicationType webApplicationType) { + switch (webApplicationType) { + case SERVLET: + return getName(this.servletConfiguration); + case REACTIVE: + return getName(this.reactiveConfiguration); + } + return null; + } + + private String getName(Class configuration) { + return (configuration == null ? null : configuration.getName()); + } + } } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/webservices/WebServicesAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/webservices/WebServicesAutoConfiguration.java index a99d6be1f7..3e5e426cc6 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/webservices/WebServicesAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/webservices/WebServicesAutoConfiguration.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. diff --git a/spring-boot-project/spring-boot-cli/src/main/java/org/springframework/boot/cli/command/init/ProjectGenerationRequest.java b/spring-boot-project/spring-boot-cli/src/main/java/org/springframework/boot/cli/command/init/ProjectGenerationRequest.java index 6b3c621abf..aaa394a600 100644 --- a/spring-boot-project/spring-boot-cli/src/main/java/org/springframework/boot/cli/command/init/ProjectGenerationRequest.java +++ b/spring-boot-project/spring-boot-cli/src/main/java/org/springframework/boot/cli/command/init/ProjectGenerationRequest.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. @@ -422,7 +422,8 @@ class ProjectGenerationRequest { private static void filter(Map projects, String tag, String tagValue) { - projects.entrySet().removeIf((entry) -> !tagValue.equals(entry.getValue().getTags().get(tag))); + projects.entrySet().removeIf( + (entry) -> !tagValue.equals(entry.getValue().getTags().get(tag))); } } diff --git a/spring-boot-project/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/AnnotatedNodeASTTransformation.java b/spring-boot-project/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/AnnotatedNodeASTTransformation.java index 69856d326d..1e5b708e68 100644 --- a/spring-boot-project/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/AnnotatedNodeASTTransformation.java +++ b/spring-boot-project/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/AnnotatedNodeASTTransformation.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. @@ -67,8 +67,10 @@ public abstract class AnnotatedNodeASTTransformation implements ASTTransformatio for (ImportNode importNode : module.getStarImports()) { visitAnnotatedNode(importNode, annotationNodes); } - module.getStaticImports().forEach((key, value) -> visitAnnotatedNode(value, annotationNodes)); - module.getStaticStarImports().forEach((key, value) -> visitAnnotatedNode(value, annotationNodes)); + module.getStaticImports().forEach((name, + importNode) -> visitAnnotatedNode(importNode, annotationNodes)); + module.getStaticStarImports().forEach((name, + importNode) -> visitAnnotatedNode(importNode, annotationNodes)); for (ClassNode classNode : module.getClasses()) { visitAnnotatedNode(classNode, annotationNodes); classNode.visitContents(classVisitor); diff --git a/spring-boot-project/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/settings/DevToolsSettings.java b/spring-boot-project/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/settings/DevToolsSettings.java index ee924d8461..e21cacfa16 100644 --- a/spring-boot-project/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/settings/DevToolsSettings.java +++ b/spring-boot-project/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/settings/DevToolsSettings.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. diff --git a/spring-boot-project/spring-boot-tools/spring-boot-autoconfigure-processor/src/main/java/org/springframework/boot/autoconfigureprocessor/AutoConfigureAnnotationProcessor.java b/spring-boot-project/spring-boot-tools/spring-boot-autoconfigure-processor/src/main/java/org/springframework/boot/autoconfigureprocessor/AutoConfigureAnnotationProcessor.java index d508cd1e24..d3d06890f8 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-autoconfigure-processor/src/main/java/org/springframework/boot/autoconfigureprocessor/AutoConfigureAnnotationProcessor.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-autoconfigure-processor/src/main/java/org/springframework/boot/autoconfigureprocessor/AutoConfigureAnnotationProcessor.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. @@ -22,9 +22,11 @@ import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Properties; import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.Stream; import javax.annotation.processing.AbstractProcessor; import javax.annotation.processing.RoundEnvironment; @@ -34,6 +36,7 @@ import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.AnnotationValue; import javax.lang.model.element.Element; import javax.lang.model.element.ElementKind; +import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.TypeElement; import javax.lang.model.type.DeclaredType; import javax.lang.model.type.TypeMirror; @@ -155,21 +158,25 @@ public class AutoConfigureAnnotationProcessor extends AbstractProcessor { return result.toString(); } - @SuppressWarnings("unchecked") private List getValues(AnnotationMirror annotation) { - return annotation .getElementValues().entrySet().stream().filter(entry -> { - String attributeName = entry.getKey().getSimpleName().toString(); - return "name".equals(attributeName) || "value".equals(attributeName); - }).map((entry) -> { - Object value = entry.getValue().getValue(); - if (value instanceof List) { - return ((List) value).stream(). - map(annotationValue -> processValue(annotationValue.getValue())).collect(Collectors.toList()); - } - else { - return Collections.singletonList(processValue(value)); - } - }).flatMap(List::stream).collect(Collectors.toList()); + return annotation.getElementValues().entrySet().stream() + .filter(this::isNameOrValueAttribute).flatMap(this::getValues) + .collect(Collectors.toList()); + } + + private boolean isNameOrValueAttribute(Entry entry) { + String attributeName = entry.getKey().getSimpleName().toString(); + return "name".equals(attributeName) || "value".equals(attributeName); + } + + @SuppressWarnings("unchecked") + private Stream getValues(Entry entry) { + Object value = entry.getValue().getValue(); + if (value instanceof List) { + return ((List) value).stream() + .map((annotation) -> processValue(annotation.getValue())); + } + return Stream.of(processValue(value)); } private Object processValue(Object value) { diff --git a/spring-boot-project/spring-boot-tools/spring-boot-configuration-metadata/src/main/java/org/springframework/boot/configurationmetadata/SimpleConfigurationMetadataRepository.java b/spring-boot-project/spring-boot-tools/spring-boot-configuration-metadata/src/main/java/org/springframework/boot/configurationmetadata/SimpleConfigurationMetadataRepository.java index 376c18f2dc..3126338c8b 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-configuration-metadata/src/main/java/org/springframework/boot/configurationmetadata/SimpleConfigurationMetadataRepository.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-configuration-metadata/src/main/java/org/springframework/boot/configurationmetadata/SimpleConfigurationMetadataRepository.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. @@ -93,9 +93,11 @@ public class SimpleConfigurationMetadataRepository } else { // Merge properties - group.getProperties().forEach((key, value) -> putIfAbsent(existingGroup.getProperties(), key, value)); + group.getProperties().forEach((name, value) -> putIfAbsent( + existingGroup.getProperties(), name, value)); // Merge sources - group.getSources().forEach((key, value) -> putIfAbsent(existingGroup.getSources(), key, value)); + group.getSources().forEach((name, + value) -> putIfAbsent(existingGroup.getSources(), name, value)); } } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/ConfigurationMetadataAnnotationProcessor.java b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/ConfigurationMetadataAnnotationProcessor.java index 36b9c5a498..5335de06a5 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/ConfigurationMetadataAnnotationProcessor.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/ConfigurationMetadataAnnotationProcessor.java @@ -533,8 +533,8 @@ public class ConfigurationMetadataAnnotationProcessor extends AbstractProcessor private Map getAnnotationElementValues(AnnotationMirror annotation) { Map values = new LinkedHashMap<>(); - annotation.getElementValues().forEach((key, value) -> - values.put(key.getSimpleName().toString(), value.getValue())); + annotation.getElementValues().forEach((name, value) -> values + .put(name.getSimpleName().toString(), value.getValue())); return values; } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/TypeElementMembers.java b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/TypeElementMembers.java index b0a4850056..b78fbc1074 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/TypeElementMembers.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/TypeElementMembers.java @@ -78,9 +78,9 @@ class TypeElementMembers { processField(field); } try { - this.fieldValuesParser.getFieldValues(element).forEach((key, value) -> { - if (!this.fieldValues.containsKey(key)) { - this.fieldValues.put(key, value); + this.fieldValuesParser.getFieldValues(element).forEach((name, value) -> { + if (!this.fieldValues.containsKey(name)) { + this.fieldValues.put(name, value); } }); } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/TypeUtils.java b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/TypeUtils.java index aea2ee9f71..45b1d3bfd6 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/TypeUtils.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/TypeUtils.java @@ -62,7 +62,8 @@ class TypeUtils { static { Map primitives = new HashMap<>(); - PRIMITIVE_WRAPPERS.forEach((key, value) -> primitives.put(value.getName(), key)); + PRIMITIVE_WRAPPERS.forEach( + (kind, wrapperClass) -> primitives.put(wrapperClass.getName(), kind)); WRAPPER_TO_PRIMITIVE = primitives; } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/main/java/org/springframework/boot/loader/tools/BuildPropertiesWriter.java b/spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/main/java/org/springframework/boot/loader/tools/BuildPropertiesWriter.java index 5d27ebf910..1d8d97d475 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/main/java/org/springframework/boot/loader/tools/BuildPropertiesWriter.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/main/java/org/springframework/boot/loader/tools/BuildPropertiesWriter.java @@ -78,7 +78,8 @@ public final class BuildPropertiesWriter { DateTimeFormatter.ISO_INSTANT.format(project.getTime())); } if (project.getAdditionalProperties() != null) { - project.getAdditionalProperties().forEach((key, value) -> properties.put("build." + key, value)); + project.getAdditionalProperties() + .forEach((name, value) -> properties.put("build." + name, value)); } return properties; } @@ -114,9 +115,9 @@ public final class BuildPropertiesWriter { private static void validateAdditionalProperties( Map additionalProperties) { if (additionalProperties != null) { - additionalProperties.forEach((key, value) -> { + additionalProperties.forEach((name, value) -> { if (value == null) { - throw new NullAdditionalPropertyValueException(key); + throw new NullAdditionalPropertyValueException(name); } }); } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/PropertiesMergingResourceTransformer.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/PropertiesMergingResourceTransformer.java index 1fed749db9..c617375d64 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/PropertiesMergingResourceTransformer.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/PropertiesMergingResourceTransformer.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. @@ -58,18 +58,17 @@ public class PropertiesMergingResourceTransformer implements ResourceTransformer } @Override - public void processResource(String resource, InputStream is, + public void processResource(String resource, InputStream inputStream, List relocators) throws IOException { Properties properties = new Properties(); - properties.load(is); - is.close(); - properties.forEach((key, valueObject) -> { - String name = (String) key; - String value = (String) valueObject; - String existing = this.data.getProperty(name); - this.data.setProperty(name, - existing == null ? value : existing + "," + value); - }); + properties.load(inputStream); + inputStream.close(); + properties.forEach((name, value) -> process((String) name, (String) value)); + } + + private void process(String name, String value) { + String existing = this.data.getProperty(name); + this.data.setProperty(name, (existing == null ? value : existing + "," + value)); } @Override diff --git a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/test/java/org/springframework/boot/maven/Verify.java b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/test/java/org/springframework/boot/maven/Verify.java index e9b5469eb2..98111f0994 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/test/java/org/springframework/boot/maven/Verify.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-maven-plugin/src/test/java/org/springframework/boot/maven/Verify.java @@ -140,10 +140,11 @@ public final class Verify { } private ZipEntry getEntryStartingWith(String entryName) { - return this.content.entrySet().stream(). - filter(entry -> entry.getKey().startsWith(entryName)). - map(Map.Entry::getValue).findFirst().orElseThrow(() -> - new IllegalStateException("Unable to find entry starting with " + entryName)); + return this.content.entrySet().stream() + .filter(entry -> entry.getKey().startsWith(entryName)) + .map(Map.Entry::getValue).findFirst() + .orElseThrow(() -> new IllegalStateException( + "Unable to find entry starting with " + entryName)); } public boolean hasEntry(String entry) { diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/LoggingSystem.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/LoggingSystem.java index 9e8cfeafba..69bedccc46 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/LoggingSystem.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/LoggingSystem.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. @@ -156,10 +156,11 @@ public abstract class LoggingSystem { } return get(classLoader, loggingSystem); } - return SYSTEMS.entrySet().stream(). - filter((entry) -> ClassUtils.isPresent(entry.getKey(), classLoader)). - map(entry -> get(classLoader, entry.getValue())). - findFirst().orElseThrow(() -> new IllegalStateException("No suitable logging system located")); + return SYSTEMS.entrySet().stream() + .filter((entry) -> ClassUtils.isPresent(entry.getKey(), classLoader)) + .map((entry) -> get(classLoader, entry.getValue())).findFirst() + .orElseThrow(() -> new IllegalStateException( + "No suitable logging system located")); } private static LoggingSystem get(ClassLoader classLoader, String loggingSystemClass) {