diff --git a/spring-aop/src/main/java/org/springframework/aop/aspectj/AspectJAdviceParameterNameDiscoverer.java b/spring-aop/src/main/java/org/springframework/aop/aspectj/AspectJAdviceParameterNameDiscoverer.java index 68918ee376b..ae21eb7330d 100644 --- a/spring-aop/src/main/java/org/springframework/aop/aspectj/AspectJAdviceParameterNameDiscoverer.java +++ b/spring-aop/src/main/java/org/springframework/aop/aspectj/AspectJAdviceParameterNameDiscoverer.java @@ -244,31 +244,18 @@ public class AspectJAdviceParameterNameDiscoverer implements ParameterNameDiscov int algorithmicStep = STEP_JOIN_POINT_BINDING; while ((this.numberOfRemainingUnboundArguments > 0) && algorithmicStep < STEP_FINISHED) { switch (algorithmicStep++) { - case STEP_JOIN_POINT_BINDING: + case STEP_JOIN_POINT_BINDING -> { if (!maybeBindThisJoinPoint()) { maybeBindThisJoinPointStaticPart(); } - break; - case STEP_THROWING_BINDING: - maybeBindThrowingVariable(); - break; - case STEP_ANNOTATION_BINDING: - maybeBindAnnotationsFromPointcutExpression(); - break; - case STEP_RETURNING_BINDING: - maybeBindReturningVariable(); - break; - case STEP_PRIMITIVE_ARGS_BINDING: - maybeBindPrimitiveArgsFromPointcutExpression(); - break; - case STEP_THIS_TARGET_ARGS_BINDING: - maybeBindThisOrTargetOrArgsFromPointcutExpression(); - break; - case STEP_REFERENCE_PCUT_BINDING: - maybeBindReferencePointcutParameter(); - break; - default: - throw new IllegalStateException("Unknown algorithmic step: " + (algorithmicStep - 1)); + } + case STEP_THROWING_BINDING -> maybeBindThrowingVariable(); + case STEP_ANNOTATION_BINDING -> maybeBindAnnotationsFromPointcutExpression(); + case STEP_RETURNING_BINDING -> maybeBindReturningVariable(); + case STEP_PRIMITIVE_ARGS_BINDING -> maybeBindPrimitiveArgsFromPointcutExpression(); + case STEP_THIS_TARGET_ARGS_BINDING -> maybeBindThisOrTargetOrArgsFromPointcutExpression(); + case STEP_REFERENCE_PCUT_BINDING -> maybeBindReferencePointcutParameter(); + default -> throw new IllegalStateException("Unknown algorithmic step: " + (algorithmicStep - 1)); } } } diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/AutowireUtils.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/AutowireUtils.java index c91508cb181..577161ce49e 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/AutowireUtils.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/AutowireUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2021 the original author or authors. + * Copyright 2002-2022 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. @@ -128,8 +128,7 @@ abstract class AutowireUtils { * @return the resolved value */ public static Object resolveAutowiringValue(Object autowiringValue, Class requiredType) { - if (autowiringValue instanceof ObjectFactory && !requiredType.isInstance(autowiringValue)) { - ObjectFactory factory = (ObjectFactory) autowiringValue; + if (autowiringValue instanceof ObjectFactory factory && !requiredType.isInstance(autowiringValue)) { if (autowiringValue instanceof Serializable && requiredType.isInterface()) { autowiringValue = Proxy.newProxyInstance(requiredType.getClassLoader(), new Class[] {requiredType}, new ObjectFactoryDelegatingInvocationHandler(factory)); @@ -275,22 +274,19 @@ abstract class AutowireUtils { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - switch (method.getName()) { - case "equals": - // Only consider equal when proxies are identical. - return (proxy == args[0]); - case "hashCode": - // Use hashCode of proxy. - return System.identityHashCode(proxy); - case "toString": - return this.objectFactory.toString(); - } - try { - return method.invoke(this.objectFactory.getObject(), args); - } - catch (InvocationTargetException ex) { - throw ex.getTargetException(); - } + return switch (method.getName()) { + case "equals" -> (proxy == args[0]); // Only consider equal when proxies are identical. + case "hashCode" -> System.identityHashCode(proxy); // Use hashCode of proxy. + case "toString" -> this.objectFactory.toString(); + default -> { + try { + yield method.invoke(this.objectFactory.getObject(), args); + } + catch (InvocationTargetException ex) { + throw ex.getTargetException(); + } + } + }; } } diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/StaticListableBeanFactory.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/StaticListableBeanFactory.java index f3d43d107ed..4795f5dfe64 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/StaticListableBeanFactory.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/StaticListableBeanFactory.java @@ -365,8 +365,7 @@ public class StaticListableBeanFactory implements ListableBeanFactory { for (Map.Entry entry : this.beans.entrySet()) { String beanName = entry.getKey(); Object beanInstance = entry.getValue(); - if (beanInstance instanceof FactoryBean && !isFactoryType) { - FactoryBean factoryBean = (FactoryBean) beanInstance; + if (beanInstance instanceof FactoryBean factoryBean && !isFactoryType) { Class objectType = factoryBean.getObjectType(); if ((includeNonSingletons || factoryBean.isSingleton()) && objectType != null && (type == null || type.isAssignableFrom(objectType))) { @@ -409,9 +408,8 @@ public class StaticListableBeanFactory implements ListableBeanFactory { String beanName = entry.getKey(); Object beanInstance = entry.getValue(); // Is bean a FactoryBean? - if (beanInstance instanceof FactoryBean && !isFactoryType) { + if (beanInstance instanceof FactoryBean factory && !isFactoryType) { // Match object created by FactoryBean. - FactoryBean factory = (FactoryBean) beanInstance; Class objectType = factory.getObjectType(); if ((includeNonSingletons || factory.isSingleton()) && objectType != null && (type == null || type.isAssignableFrom(objectType))) { diff --git a/spring-context-support/src/main/java/org/springframework/ui/freemarker/FreeMarkerConfigurationFactory.java b/spring-context-support/src/main/java/org/springframework/ui/freemarker/FreeMarkerConfigurationFactory.java index 2b29d05986f..d840f2fbaf4 100644 --- a/spring-context-support/src/main/java/org/springframework/ui/freemarker/FreeMarkerConfigurationFactory.java +++ b/spring-context-support/src/main/java/org/springframework/ui/freemarker/FreeMarkerConfigurationFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2022 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. @@ -389,16 +389,17 @@ public class FreeMarkerConfigurationFactory { */ @Nullable protected TemplateLoader getAggregateTemplateLoader(List templateLoaders) { - switch (templateLoaders.size()) { - case 0: + return switch (templateLoaders.size()) { + case 0 -> { logger.debug("No FreeMarker TemplateLoaders specified"); - return null; - case 1: - return templateLoaders.get(0); - default: + yield null; + } + case 1 -> templateLoaders.get(0); + default -> { TemplateLoader[] loaders = templateLoaders.toArray(new TemplateLoader[0]); - return new MultiTemplateLoader(loaders); - } + yield new MultiTemplateLoader(loaders); + } + }; } /** diff --git a/spring-context/src/main/java/org/springframework/jmx/export/MBeanExporter.java b/spring-context/src/main/java/org/springframework/jmx/export/MBeanExporter.java index 25043be4923..da942f37617 100644 --- a/spring-context/src/main/java/org/springframework/jmx/export/MBeanExporter.java +++ b/spring-context/src/main/java/org/springframework/jmx/export/MBeanExporter.java @@ -587,12 +587,11 @@ public class MBeanExporter extends MBeanRegistrationSupport implements MBeanExpo */ protected ObjectName registerBeanNameOrInstance(Object mapValue, String beanKey) throws MBeanExportException { try { - if (mapValue instanceof String) { + if (mapValue instanceof String beanName) { // Bean name pointing to a potentially lazy-init bean in the factory. if (this.beanFactory == null) { throw new MBeanExportException("Cannot resolve bean names if not running in a BeanFactory"); } - String beanName = (String) mapValue; if (isBeanDefinitionLazyInit(this.beanFactory, beanName)) { ObjectName objectName = registerLazyInit(beanName, beanKey); replaceNotificationListenerBeanNameKeysIfNecessary(beanName, objectName); diff --git a/spring-context/src/main/java/org/springframework/scripting/bsh/BshScriptUtils.java b/spring-context/src/main/java/org/springframework/scripting/bsh/BshScriptUtils.java index 47a368a2df9..b5048ac2af2 100644 --- a/spring-context/src/main/java/org/springframework/scripting/bsh/BshScriptUtils.java +++ b/spring-context/src/main/java/org/springframework/scripting/bsh/BshScriptUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2022 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. @@ -90,8 +90,7 @@ public abstract class BshScriptUtils { throws EvalError { Object result = evaluateBshScript(scriptSource, scriptInterfaces, classLoader); - if (result instanceof Class) { - Class clazz = (Class) result; + if (result instanceof Class clazz) { try { return ReflectionUtils.accessibleConstructor(clazz).newInstance(); } diff --git a/spring-context/src/main/java/org/springframework/scripting/support/StandardScriptFactory.java b/spring-context/src/main/java/org/springframework/scripting/support/StandardScriptFactory.java index 3e822cd775a..5dafd47b36c 100644 --- a/spring-context/src/main/java/org/springframework/scripting/support/StandardScriptFactory.java +++ b/spring-context/src/main/java/org/springframework/scripting/support/StandardScriptFactory.java @@ -160,8 +160,7 @@ public class StandardScriptFactory implements ScriptFactory, BeanClassLoaderAwar } } - if (script instanceof Class) { - Class scriptClass = (Class) script; + if (script instanceof Class scriptClass) { try { return ReflectionUtils.accessibleConstructor(scriptClass).newInstance(); } diff --git a/spring-context/src/main/java/org/springframework/ui/context/support/ResourceBundleThemeSource.java b/spring-context/src/main/java/org/springframework/ui/context/support/ResourceBundleThemeSource.java index cdf955bb37f..3d95068c8c9 100644 --- a/spring-context/src/main/java/org/springframework/ui/context/support/ResourceBundleThemeSource.java +++ b/spring-context/src/main/java/org/springframework/ui/context/support/ResourceBundleThemeSource.java @@ -191,8 +191,7 @@ public class ResourceBundleThemeSource implements HierarchicalThemeSource, BeanC * @param theme the Theme to (re-)initialize */ protected void initParent(Theme theme) { - if (theme.getMessageSource() instanceof HierarchicalMessageSource) { - HierarchicalMessageSource messageSource = (HierarchicalMessageSource) theme.getMessageSource(); + if (theme.getMessageSource() instanceof HierarchicalMessageSource messageSource) { if (getParentThemeSource() != null && messageSource.getParentMessageSource() == null) { Theme parentTheme = getParentThemeSource().getTheme(theme.getName()); if (parentTheme != null) { diff --git a/spring-context/src/main/java/org/springframework/validation/DataBinder.java b/spring-context/src/main/java/org/springframework/validation/DataBinder.java index 8cd4b6ef9c7..7363f939869 100644 --- a/spring-context/src/main/java/org/springframework/validation/DataBinder.java +++ b/spring-context/src/main/java/org/springframework/validation/DataBinder.java @@ -852,8 +852,7 @@ public class DataBinder implements PropertyEditorRegistry, TypeConverter { if (pv.getValue() instanceof String) { empty = !StringUtils.hasText((String) pv.getValue()); } - else if (pv.getValue() instanceof String[]) { - String[] values = (String[]) pv.getValue(); + else if (pv.getValue() instanceof String[] values) { empty = (values.length == 0 || !StringUtils.hasText(values[0])); } } diff --git a/spring-context/src/test/java/org/springframework/scripting/support/ScriptFactoryPostProcessorTests.java b/spring-context/src/test/java/org/springframework/scripting/support/ScriptFactoryPostProcessorTests.java index 18a2340c118..372df3d0064 100644 --- a/spring-context/src/test/java/org/springframework/scripting/support/ScriptFactoryPostProcessorTests.java +++ b/spring-context/src/test/java/org/springframework/scripting/support/ScriptFactoryPostProcessorTests.java @@ -49,33 +49,35 @@ class ScriptFactoryPostProcessorTests { private static final String PROCESSOR_BEAN_NAME = "processor"; - private static final String CHANGED_SCRIPT = "package org.springframework.scripting.groovy\n" + - "import org.springframework.scripting.Messenger\n" + - "class GroovyMessenger implements Messenger {\n" + - " private String message = \"Bingo\"\n" + - " public String getMessage() {\n" + - // quote the returned message (this is the change)... - " return \"'\" + this.message + \"'\"\n" + - " }\n" + - " public void setMessage(String message) {\n" + - " this.message = message\n" + - " }\n" + - "}"; + // quote the returned message (this is the change)... + private static final String CHANGED_SCRIPT = """ + package org.springframework.scripting.groovy + import org.springframework.scripting.Messenger + class GroovyMessenger implements Messenger { + private String message = "Bingo" + public String getMessage() { + return "'" + this.message + "'" + } + public void setMessage(String message) { + this.message = message + } + }"""; private static final String EXPECTED_CHANGED_MESSAGE_TEXT = "'" + MESSAGE_TEXT + "'"; private static final int DEFAULT_SECONDS_TO_PAUSE = 1; - private static final String DELEGATING_SCRIPT = "inline:package org.springframework.scripting;\n" + - "class DelegatingMessenger implements Messenger {\n" + - " private Messenger wrappedMessenger;\n" + - " public String getMessage() {\n" + - " return this.wrappedMessenger.getMessage()\n" + - " }\n" + - " public void setMessenger(Messenger wrappedMessenger) {\n" + - " this.wrappedMessenger = wrappedMessenger\n" + - " }\n" + - "}"; + private static final String DELEGATING_SCRIPT = """ + inline:package org.springframework.scripting; + class DelegatingMessenger implements Messenger { + private Messenger wrappedMessenger; + public String getMessage() { + return this.wrappedMessenger.getMessage() + } + public void setMessenger(Messenger wrappedMessenger) { + this.wrappedMessenger = wrappedMessenger + } + }"""; @Test @@ -245,16 +247,17 @@ class ScriptFactoryPostProcessorTests { private static BeanDefinition createScriptedGroovyBean() { BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(GroovyScriptFactory.class); - builder.addConstructorArgValue("inline:package org.springframework.scripting;\n" + - "class GroovyMessenger implements Messenger {\n" + - " private String message = \"Bingo\"\n" + - " public String getMessage() {\n" + - " return this.message\n" + - " }\n" + - " public void setMessage(String message) {\n" + - " this.message = message\n" + - " }\n" + - "}"); + builder.addConstructorArgValue(""" + inline:package org.springframework.scripting; + class GroovyMessenger implements Messenger { + private String message = "Bingo" + public String getMessage() { + return this.message + } + public void setMessage(String message) { + this.message = message + } + }"""); builder.addPropertyValue("message", MESSAGE_TEXT); return builder.getBeanDefinition(); } diff --git a/spring-core/src/jmh/java/org/springframework/core/codec/StringDecoderBenchmark.java b/spring-core/src/jmh/java/org/springframework/core/codec/StringDecoderBenchmark.java index 8badd54f6f8..71cdbc16496 100644 --- a/spring-core/src/jmh/java/org/springframework/core/codec/StringDecoderBenchmark.java +++ b/spring-core/src/jmh/java/org/springframework/core/codec/StringDecoderBenchmark.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2021 the original author or authors. + * Copyright 2002-2022 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. @@ -78,11 +78,14 @@ public class StringDecoderBenchmark { @Setup(Level.Trial) public void setup() { - String eventTemplate = "id:$1\n" + - "event:some-event\n" + - ":some-comment-$1-aa\n" + - ":some-comment-$1-bb\n" + - "data:abcdefg-$1-hijklmnop-$1-qrstuvw-$1-xyz-$1\n\n"; + String eventTemplate = """ + id:$1 + event:some-event + :some-comment-$1-aa + :some-comment-$1-bb + data:abcdefg-$1-hijklmnop-$1-qrstuvw-$1-xyz-$1 + + """; int eventLength = String.format(eventTemplate, String.format("%05d", 1)).length(); int eventCount = this.totalSize / eventLength; diff --git a/spring-core/src/main/java/org/springframework/aot/nativex/BasicJsonWriter.java b/spring-core/src/main/java/org/springframework/aot/nativex/BasicJsonWriter.java index 9f5ebfd4a3a..00732e93b55 100644 --- a/spring-core/src/main/java/org/springframework/aot/nativex/BasicJsonWriter.java +++ b/spring-core/src/main/java/org/springframework/aot/nativex/BasicJsonWriter.java @@ -152,42 +152,27 @@ class BasicJsonWriter { private static String escape(CharSequence input) { StringBuilder builder = new StringBuilder(); - input.chars().forEach(c -> { - switch (c) { - case '"': - builder.append("\\\""); - break; - case '\\': - builder.append("\\\\"); - break; - case '/': - builder.append("\\/"); - break; - case '\b': - builder.append("\\b"); - break; - case '\f': - builder.append("\\f"); - break; - case '\n': - builder.append("\\n"); - break; - case '\r': - builder.append("\\r"); - break; - case '\t': - builder.append("\\t"); - break; - default: - if (c <= 0x1F) { - builder.append(String.format("\\u%04x", c)); - } - else { - builder.append((char) c); - } - break; - } - }); + input.chars().forEach(c -> builder.append( + switch (c) { + case '"' -> "\\\""; + case '\\' -> "\\\\"; + case '/' -> "\\/"; + case '\b' -> "\\b"; + case '\f' -> "\\f"; + case '\n' -> "\\n"; + case '\r' -> "\\r"; + case '\t' -> "\\t"; + default -> { + if (c <= 0x1F) { + yield String.format("\\u%04x", c); + } + else { + yield (char) c; + } + } + } + ) + ); return builder.toString(); } diff --git a/spring-core/src/main/java/org/springframework/util/MimeTypeUtils.java b/spring-core/src/main/java/org/springframework/util/MimeTypeUtils.java index b15948a6a4b..bc2e43b3bbe 100644 --- a/spring-core/src/main/java/org/springframework/util/MimeTypeUtils.java +++ b/spring-core/src/main/java/org/springframework/util/MimeTypeUtils.java @@ -314,18 +314,14 @@ public abstract class MimeTypeUtils { int i = 0; while (i < mimeTypes.length()) { switch (mimeTypes.charAt(i)) { - case '"': - inQuotes = !inQuotes; - break; - case ',': + case '"' -> inQuotes = !inQuotes; + case ',' -> { if (!inQuotes) { tokens.add(mimeTypes.substring(startIndex, i)); startIndex = i + 1; } - break; - case '\\': - i++; - break; + } + case '\\' -> i++; } i++; } diff --git a/spring-core/src/main/java/org/springframework/util/concurrent/FutureAdapter.java b/spring-core/src/main/java/org/springframework/util/concurrent/FutureAdapter.java index 05d80e7c28f..43af3fdc667 100644 --- a/spring-core/src/main/java/org/springframework/util/concurrent/FutureAdapter.java +++ b/spring-core/src/main/java/org/springframework/util/concurrent/FutureAdapter.java @@ -96,18 +96,18 @@ public abstract class FutureAdapter implements Future { @Nullable final T adaptInternal(S adapteeResult) throws ExecutionException { synchronized (this.mutex) { - switch (this.state) { - case SUCCESS: - return (T) this.result; - case FAILURE: + return switch (this.state) { + case SUCCESS -> (T) this.result; + case FAILURE -> { Assert.state(this.result instanceof ExecutionException, "Failure without exception"); throw (ExecutionException) this.result; - case NEW: + } + case NEW -> { try { T adapted = adapt(adapteeResult); this.result = adapted; this.state = State.SUCCESS; - return adapted; + yield adapted; } catch (ExecutionException ex) { this.result = ex; @@ -120,9 +120,8 @@ public abstract class FutureAdapter implements Future { this.state = State.FAILURE; throw execEx; } - default: - throw new IllegalStateException(); - } + } + }; } } diff --git a/spring-core/src/main/java/org/springframework/util/xml/AbstractStaxXMLReader.java b/spring-core/src/main/java/org/springframework/util/xml/AbstractStaxXMLReader.java index aa6e77c7b97..e1fdd08ccaa 100644 --- a/spring-core/src/main/java/org/springframework/util/xml/AbstractStaxXMLReader.java +++ b/spring-core/src/main/java/org/springframework/util/xml/AbstractStaxXMLReader.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2022 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. @@ -65,21 +65,19 @@ abstract class AbstractStaxXMLReader extends AbstractXMLReader { @Override public boolean getFeature(String name) throws SAXNotRecognizedException, SAXNotSupportedException { - switch (name) { - case NAMESPACES_FEATURE_NAME: - return this.namespacesFeature; - case NAMESPACE_PREFIXES_FEATURE_NAME: - return this.namespacePrefixesFeature; - case IS_STANDALONE_FEATURE_NAME: + return switch (name) { + case NAMESPACES_FEATURE_NAME -> this.namespacesFeature; + case NAMESPACE_PREFIXES_FEATURE_NAME -> this.namespacePrefixesFeature; + case IS_STANDALONE_FEATURE_NAME -> { if (this.isStandalone != null) { - return this.isStandalone; + yield this.isStandalone; } else { throw new SAXNotSupportedException("startDocument() callback not completed yet"); } - default: - return super.getFeature(name); - } + } + default -> super.getFeature(name); + }; } @Override diff --git a/spring-expression/src/main/java/org/springframework/expression/spel/ast/MethodReference.java b/spring-expression/src/main/java/org/springframework/expression/spel/ast/MethodReference.java index 8931591e54f..dfe28b9df28 100644 --- a/spring-expression/src/main/java/org/springframework/expression/spel/ast/MethodReference.java +++ b/spring-expression/src/main/java/org/springframework/expression/spel/ast/MethodReference.java @@ -274,7 +274,7 @@ public class MethodReference extends SpelNodeImpl { public boolean isCompilable() { CachedMethodExecutor executorToCheck = this.cachedExecutor; if (executorToCheck == null || executorToCheck.hasProxyTarget() || - !(executorToCheck.get() instanceof ReflectiveMethodExecutor)) { + !(executorToCheck.get() instanceof ReflectiveMethodExecutor executor)) { return false; } @@ -284,26 +284,20 @@ public class MethodReference extends SpelNodeImpl { } } - ReflectiveMethodExecutor executor = (ReflectiveMethodExecutor) executorToCheck.get(); if (executor.didArgumentConversionOccur()) { return false; } Class clazz = executor.getMethod().getDeclaringClass(); - if (!Modifier.isPublic(clazz.getModifiers()) && executor.getPublicDeclaringClass() == null) { - return false; - } - - return true; + return Modifier.isPublic(clazz.getModifiers()) || executor.getPublicDeclaringClass() != null; } @Override public void generateCode(MethodVisitor mv, CodeFlow cf) { CachedMethodExecutor executorToCheck = this.cachedExecutor; - if (executorToCheck == null || !(executorToCheck.get() instanceof ReflectiveMethodExecutor)) { + if (executorToCheck == null || !(executorToCheck.get() instanceof ReflectiveMethodExecutor methodExecutor)) { throw new IllegalStateException("No applicable cached executor found: " + executorToCheck); } - ReflectiveMethodExecutor methodExecutor = (ReflectiveMethodExecutor) executorToCheck.get(); Method method = methodExecutor.getMethod(); boolean isStaticMethod = Modifier.isStatic(method.getModifiers()); String descriptor = cf.lastDescriptor(); diff --git a/spring-jms/src/main/java/org/springframework/jms/connection/CachingConnectionFactory.java b/spring-jms/src/main/java/org/springframework/jms/connection/CachingConnectionFactory.java index 1f6d440c885..f7dd2d2f11d 100644 --- a/spring-jms/src/main/java/org/springframework/jms/connection/CachingConnectionFactory.java +++ b/spring-jms/src/main/java/org/springframework/jms/connection/CachingConnectionFactory.java @@ -365,45 +365,54 @@ public class CachingConnectionFactory extends SingleConnectionFactory { } else if (isCacheConsumers()) { // let raw JMS invocation throw an exception if Destination (i.e. args[0]) is null - if ((methodName.equals("createConsumer") || methodName.equals("createReceiver") || - methodName.equals("createSubscriber"))) { - Destination dest = (Destination) args[0]; - if (dest != null && !(dest instanceof TemporaryQueue || dest instanceof TemporaryTopic)) { - return getCachedConsumer(dest, - (args.length > 1 ? (String) args[1] : null), - (args.length > 2 && (Boolean) args[2]), - null, - false); + switch (methodName) { + case "createConsumer", "createReceiver", "createSubscriber" -> { + Destination dest = (Destination) args[0]; + if (dest != null && !(dest instanceof TemporaryQueue || dest instanceof TemporaryTopic)) { + return getCachedConsumer( + dest, + (args.length > 1 ? (String) args[1] : null), + (args.length > 2 && (Boolean) args[2]), + null, + false + ); + } } - } - else if (methodName.equals("createDurableConsumer") || methodName.equals("createDurableSubscriber")) { - Destination dest = (Destination) args[0]; - if (dest != null) { - return getCachedConsumer(dest, - (args.length > 2 ? (String) args[2] : null), - (args.length > 3 && (Boolean) args[3]), - (String) args[1], - true); + case "createDurableConsumer", "createDurableSubscriber" -> { + Destination dest = (Destination) args[0]; + if (dest != null) { + return getCachedConsumer( + dest, + (args.length > 2 ? (String) args[2] : null), + (args.length > 3 && (Boolean) args[3]), + (String) args[1], + true + ); + } } - } - else if (methodName.equals("createSharedConsumer")) { - Destination dest = (Destination) args[0]; - if (dest != null) { - return getCachedConsumer(dest, - (args.length > 2 ? (String) args[2] : null), - null, - (String) args[1], - false); + case "createSharedConsumer" -> { + Destination dest = (Destination) args[0]; + if (dest != null) { + return getCachedConsumer( + dest, + (args.length > 2 ? (String) args[2] : null), + null, + (String) args[1], + false + ); + } } - } - else if (methodName.equals("createSharedDurableConsumer")) { - Destination dest = (Destination) args[0]; - if (dest != null) { - return getCachedConsumer(dest, - (args.length > 2 ? (String) args[2] : null), - null, - (String) args[1], - true); + case "createSharedDurableConsumer" -> { + Destination dest = (Destination) args[0]; + if (dest != null) { + return getCachedConsumer( + dest, + (args.length > 2 ? (String) args[2] : null), + null, + (String) args[1], + true + ); + } } } } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/AbstractMethodMessageHandler.java b/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/AbstractMethodMessageHandler.java index c71db7fe35d..4a385f99839 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/AbstractMethodMessageHandler.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/AbstractMethodMessageHandler.java @@ -378,10 +378,9 @@ public abstract class AbstractMethodMessageHandler */ protected HandlerMethod createHandlerMethod(Object handler, Method method) { HandlerMethod handlerMethod; - if (handler instanceof String) { + if (handler instanceof String beanName) { ApplicationContext context = getApplicationContext(); Assert.state(context != null, "ApplicationContext is required for resolving handler bean names"); - String beanName = (String) handler; handlerMethod = new HandlerMethod(beanName, context.getAutowireCapableBeanFactory(), method); } else { diff --git a/spring-messaging/src/main/java/org/springframework/messaging/support/GenericMessage.java b/spring-messaging/src/main/java/org/springframework/messaging/support/GenericMessage.java index 1b359e1bd17..02b83b6c49f 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/support/GenericMessage.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/support/GenericMessage.java @@ -93,10 +93,9 @@ public class GenericMessage implements Message, Serializable { if (this == other) { return true; } - if (!(other instanceof GenericMessage)) { + if (!(other instanceof GenericMessage otherMsg)) { return false; } - GenericMessage otherMsg = (GenericMessage) other; // Using nullSafeEquals for proper array equals comparisons return (ObjectUtils.nullSafeEquals(this.payload, otherMsg.payload) && this.headers.equals(otherMsg.headers)); } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/support/MessageHeaderAccessor.java b/spring-messaging/src/main/java/org/springframework/messaging/support/MessageHeaderAccessor.java index dfe6bea5c8e..f6280fa79f3 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/support/MessageHeaderAccessor.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/support/MessageHeaderAccessor.java @@ -617,8 +617,7 @@ public class MessageHeaderAccessor { * @since 4.1 */ public static MessageHeaderAccessor getMutableAccessor(Message message) { - if (message.getHeaders() instanceof MutableMessageHeaders) { - MutableMessageHeaders mutableHeaders = (MutableMessageHeaders) message.getHeaders(); + if (message.getHeaders() instanceof MutableMessageHeaders mutableHeaders) { MessageHeaderAccessor accessor = mutableHeaders.getAccessor(); return (accessor.isMutable() ? accessor : accessor.createAccessor(message)); } diff --git a/spring-messaging/src/test/java/org/springframework/messaging/converter/ProtobufMessageConverterTests.java b/spring-messaging/src/test/java/org/springframework/messaging/converter/ProtobufMessageConverterTests.java index 63fa57513a1..b76222c044f 100644 --- a/spring-messaging/src/test/java/org/springframework/messaging/converter/ProtobufMessageConverterTests.java +++ b/spring-messaging/src/test/java/org/springframework/messaging/converter/ProtobufMessageConverterTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2022 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. @@ -62,13 +62,13 @@ public class ProtobufMessageConverterTests { this.message = MessageBuilder.withPayload(this.testMsg.toByteArray()) .setHeader(CONTENT_TYPE, ProtobufMessageConverter.PROTOBUF).build(); this.messageWithoutContentType = MessageBuilder.withPayload(this.testMsg.toByteArray()).build(); - this.messageJson = MessageBuilder.withPayload( - "{\n" + - " \"foo\": \"Foo\",\n" + - " \"blah\": {\n" + - " \"blah\": 123\n" + - " }\n" + - "}") + this.messageJson = MessageBuilder.withPayload(""" + { + "foo": "Foo", + "blah": { + "blah": 123 + } + }""".replace("\t", " ")) .setHeader(CONTENT_TYPE, APPLICATION_JSON) .build(); } diff --git a/spring-messaging/src/test/java/org/springframework/messaging/support/MessageHeaderAccessorTests.java b/spring-messaging/src/test/java/org/springframework/messaging/support/MessageHeaderAccessorTests.java index 86f08d006af..da704456089 100644 --- a/spring-messaging/src/test/java/org/springframework/messaging/support/MessageHeaderAccessorTests.java +++ b/spring-messaging/src/test/java/org/springframework/messaging/support/MessageHeaderAccessorTests.java @@ -319,9 +319,7 @@ public class MessageHeaderAccessorTests { })).isEqualTo(expected); StringBuilder sb = new StringBuilder(); - for (int i = 0; i < 80; i++) { - sb.append('a'); - } + sb.append("a".repeat(80)); final String payload = sb.toString() + " > 80"; String actual = accessor.getShortLogMessage(payload); @@ -355,10 +353,8 @@ public class MessageHeaderAccessorTests { })).isEqualTo(expected); StringBuilder sb = new StringBuilder(); - for (int i = 0; i < 80; i++) { - sb.append('a'); - } - final String payload = sb.toString() + " > 80"; + sb.append("a".repeat(80)); + final String payload = sb + " > 80"; String actual = accessor.getDetailedLogMessage(payload); assertThat(actual).isEqualTo("headers={contentType=text/plain} payload=" + sb + " > 80"); diff --git a/spring-orm/src/main/java/org/springframework/orm/hibernate5/HibernateTransactionManager.java b/spring-orm/src/main/java/org/springframework/orm/hibernate5/HibernateTransactionManager.java index c064c98160b..5b63cb4d536 100644 --- a/spring-orm/src/main/java/org/springframework/orm/hibernate5/HibernateTransactionManager.java +++ b/spring-orm/src/main/java/org/springframework/orm/hibernate5/HibernateTransactionManager.java @@ -362,11 +362,10 @@ public class HibernateTransactionManager extends AbstractPlatformTransactionMana if (this.entityInterceptor instanceof Interceptor) { return (Interceptor) this.entityInterceptor; } - else if (this.entityInterceptor instanceof String) { + else if (this.entityInterceptor instanceof String beanName) { if (this.beanFactory == null) { throw new IllegalStateException("Cannot get entity interceptor via bean name if no bean factory set"); } - String beanName = (String) this.entityInterceptor; return this.beanFactory.getBean(beanName, Interceptor.class); } else { diff --git a/spring-orm/src/main/java/org/springframework/orm/jpa/JpaTransactionManager.java b/spring-orm/src/main/java/org/springframework/orm/jpa/JpaTransactionManager.java index 4dc4437980f..dc7bba99362 100644 --- a/spring-orm/src/main/java/org/springframework/orm/jpa/JpaTransactionManager.java +++ b/spring-orm/src/main/java/org/springframework/orm/jpa/JpaTransactionManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2021 the original author or authors. + * Copyright 2002-2022 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. @@ -344,8 +344,7 @@ public class JpaTransactionManager extends AbstractPlatformTransactionManager if (getEntityManagerFactory() == null) { throw new IllegalArgumentException("'entityManagerFactory' or 'persistenceUnitName' is required"); } - if (getEntityManagerFactory() instanceof EntityManagerFactoryInfo) { - EntityManagerFactoryInfo emfInfo = (EntityManagerFactoryInfo) getEntityManagerFactory(); + if (getEntityManagerFactory() instanceof EntityManagerFactoryInfo emfInfo) { DataSource dataSource = emfInfo.getDataSource(); if (dataSource != null) { setDataSource(dataSource); diff --git a/spring-test/src/test/java/org/springframework/test/context/jdbc/InfrastructureProxyTransactionalSqlScriptsTests.java b/spring-test/src/test/java/org/springframework/test/context/jdbc/InfrastructureProxyTransactionalSqlScriptsTests.java index bd3d00732c2..2910e7446f4 100644 --- a/spring-test/src/test/java/org/springframework/test/context/jdbc/InfrastructureProxyTransactionalSqlScriptsTests.java +++ b/spring-test/src/test/java/org/springframework/test/context/jdbc/InfrastructureProxyTransactionalSqlScriptsTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2021 the original author or authors. + * Copyright 2002-2022 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. @@ -107,21 +107,19 @@ class InfrastructureProxyTransactionalSqlScriptsTests extends AbstractTransactio @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - switch (method.getName()) { - case "equals": - return (proxy == args[0]); - case "hashCode": - return System.identityHashCode(proxy); - case "getWrappedObject": - return this.dataSource; - default: + return switch (method.getName()) { + case "equals" -> (proxy == args[0]); + case "hashCode" -> System.identityHashCode(proxy); + case "getWrappedObject" -> this.dataSource; + default -> { try { - return method.invoke(this.dataSource, args); + yield method.invoke(this.dataSource, args); } catch (InvocationTargetException ex) { throw ex.getTargetException(); } - } + } + }; } } diff --git a/spring-tx/src/main/java/org/springframework/transaction/annotation/TransactionManagementConfigurationSelector.java b/spring-tx/src/main/java/org/springframework/transaction/annotation/TransactionManagementConfigurationSelector.java index 22551ceed15..9881a00b357 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/annotation/TransactionManagementConfigurationSelector.java +++ b/spring-tx/src/main/java/org/springframework/transaction/annotation/TransactionManagementConfigurationSelector.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2022 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. @@ -45,15 +45,13 @@ public class TransactionManagementConfigurationSelector extends AdviceModeImport */ @Override protected String[] selectImports(AdviceMode adviceMode) { - switch (adviceMode) { - case PROXY: - return new String[] {AutoProxyRegistrar.class.getName(), - ProxyTransactionManagementConfiguration.class.getName()}; - case ASPECTJ: - return new String[] {determineTransactionAspectClass()}; - default: - return null; - } + return switch (adviceMode) { + case PROXY -> new String[]{ + AutoProxyRegistrar.class.getName(), + ProxyTransactionManagementConfiguration.class.getName() + }; + case ASPECTJ -> new String[]{determineTransactionAspectClass()}; + }; } private String determineTransactionAspectClass() { diff --git a/spring-tx/src/test/java/org/springframework/transaction/interceptor/TransactionAttributeSourceEditorTests.java b/spring-tx/src/test/java/org/springframework/transaction/interceptor/TransactionAttributeSourceEditorTests.java index cd7d824e6d4..fde61a3955f 100644 --- a/spring-tx/src/test/java/org/springframework/transaction/interceptor/TransactionAttributeSourceEditorTests.java +++ b/spring-tx/src/test/java/org/springframework/transaction/interceptor/TransactionAttributeSourceEditorTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2022 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. @@ -56,12 +56,12 @@ public class TransactionAttributeSourceEditorTests { @Test public void matchesSpecific() throws Exception { - editor.setAsText( - "java.lang.Object.hashCode=PROPAGATION_REQUIRED\n" + - "java.lang.Object.equals=PROPAGATION_MANDATORY\n" + - "java.lang.Object.*it=PROPAGATION_SUPPORTS\n" + - "java.lang.Object.notify=PROPAGATION_SUPPORTS\n" + - "java.lang.Object.not*=PROPAGATION_REQUIRED"); + editor.setAsText(""" + java.lang.Object.hashCode=PROPAGATION_REQUIRED + java.lang.Object.equals=PROPAGATION_MANDATORY + java.lang.Object.*it=PROPAGATION_SUPPORTS + java.lang.Object.notify=PROPAGATION_SUPPORTS + java.lang.Object.not*=PROPAGATION_REQUIRED"""); TransactionAttributeSource tas = (TransactionAttributeSource) editor.getValue(); checkTransactionProperties(tas, Object.class.getMethod("hashCode"), diff --git a/spring-web/src/main/java/org/springframework/web/client/HttpServerErrorException.java b/spring-web/src/main/java/org/springframework/web/client/HttpServerErrorException.java index 83462ead89c..3bfc11e9621 100644 --- a/spring-web/src/main/java/org/springframework/web/client/HttpServerErrorException.java +++ b/spring-web/src/main/java/org/springframework/web/client/HttpServerErrorException.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2022 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. @@ -97,32 +97,26 @@ public class HttpServerErrorException extends HttpStatusCodeException { String statusText, HttpHeaders headers, byte[] body, @Nullable Charset charset) { if (statusCode instanceof HttpStatus status) { - switch (status) { - case INTERNAL_SERVER_ERROR: - return message != null ? - new HttpServerErrorException.InternalServerError(message, statusText, headers, body, charset) : - new HttpServerErrorException.InternalServerError(statusText, headers, body, charset); - case NOT_IMPLEMENTED: - return message != null ? - new HttpServerErrorException.NotImplemented(message, statusText, headers, body, charset) : - new HttpServerErrorException.NotImplemented(statusText, headers, body, charset); - case BAD_GATEWAY: - return message != null ? - new HttpServerErrorException.BadGateway(message, statusText, headers, body, charset) : - new HttpServerErrorException.BadGateway(statusText, headers, body, charset); - case SERVICE_UNAVAILABLE: - return message != null ? - new HttpServerErrorException.ServiceUnavailable(message, statusText, headers, body, charset) : - new HttpServerErrorException.ServiceUnavailable(statusText, headers, body, charset); - case GATEWAY_TIMEOUT: - return message != null ? - new HttpServerErrorException.GatewayTimeout(message, statusText, headers, body, charset) : - new HttpServerErrorException.GatewayTimeout(statusText, headers, body, charset); - default: - return message != null ? - new HttpServerErrorException(message, statusCode, statusText, headers, body, charset) : - new HttpServerErrorException(statusCode, statusText, headers, body, charset); - } + return switch (status) { + case INTERNAL_SERVER_ERROR -> message != null ? + new InternalServerError(message, statusText, headers, body, charset) : + new InternalServerError(statusText, headers, body, charset); + case NOT_IMPLEMENTED -> message != null ? + new NotImplemented(message, statusText, headers, body, charset) : + new NotImplemented(statusText, headers, body, charset); + case BAD_GATEWAY -> message != null ? + new BadGateway(message, statusText, headers, body, charset) : + new BadGateway(statusText, headers, body, charset); + case SERVICE_UNAVAILABLE -> message != null ? + new ServiceUnavailable(message, statusText, headers, body, charset) : + new ServiceUnavailable(statusText, headers, body, charset); + case GATEWAY_TIMEOUT -> message != null ? + new GatewayTimeout(message, statusText, headers, body, charset) : + new GatewayTimeout(statusText, headers, body, charset); + default -> message != null ? + new HttpServerErrorException(message, statusCode, statusText, headers, body, charset) : + new HttpServerErrorException(statusCode, statusText, headers, body, charset); + }; } if (message != null) { return new HttpServerErrorException(message, statusCode, statusText, headers, body, charset); diff --git a/spring-web/src/main/java/org/springframework/web/cors/CorsConfiguration.java b/spring-web/src/main/java/org/springframework/web/cors/CorsConfiguration.java index 1c9bc49fd01..509a4083a91 100644 --- a/spring-web/src/main/java/org/springframework/web/cors/CorsConfiguration.java +++ b/spring-web/src/main/java/org/springframework/web/cors/CorsConfiguration.java @@ -263,18 +263,14 @@ public class CorsConfiguration { boolean withinPortRange = false; for (int current = 0; current < rawValue.length(); current++) { switch (rawValue.charAt(current)) { - case '[': - withinPortRange = true; - break; - case ']': - withinPortRange = false; - break; - case ',': + case '[' -> withinPortRange = true; + case ']' -> withinPortRange = false; + case ',' -> { if (!withinPortRange) { valueConsumer.accept(rawValue.substring(start, current).trim()); start = current + 1; } - break; + } } } if (start < rawValue.length()) { diff --git a/spring-web/src/test/java/org/springframework/http/codec/ServerSentEventHttpMessageReaderTests.java b/spring-web/src/test/java/org/springframework/http/codec/ServerSentEventHttpMessageReaderTests.java index 9079ea38961..a0bf12d4500 100644 --- a/spring-web/src/test/java/org/springframework/http/codec/ServerSentEventHttpMessageReaderTests.java +++ b/spring-web/src/test/java/org/springframework/http/codec/ServerSentEventHttpMessageReaderTests.java @@ -159,8 +159,12 @@ public class ServerSentEventHttpMessageReaderTests extends AbstractLeakCheckingT public void readPojo() { MockServerHttpRequest request = MockServerHttpRequest.post("/") .body(Mono.just(stringBuffer( - "data:{\"foo\": \"foofoo\", \"bar\": \"barbar\"}\n\n" + - "data:{\"foo\": \"foofoofoo\", \"bar\": \"barbarbar\"}\n\n"))); + """ + data:{"foo": "foofoo", "bar": "barbar"} + + data:{"foo": "foofoofoo", "bar": "barbarbar"} + + """))); Flux data = reader.read(ResolvableType.forClass(Pojo.class), request, Collections.emptyMap()).cast(Pojo.class); diff --git a/spring-web/src/test/java/org/springframework/http/codec/ServerSentEventHttpMessageWriterTests.java b/spring-web/src/test/java/org/springframework/http/codec/ServerSentEventHttpMessageWriterTests.java index da1b820830b..f829437cd36 100644 --- a/spring-web/src/test/java/org/springframework/http/codec/ServerSentEventHttpMessageWriterTests.java +++ b/spring-web/src/test/java/org/springframework/http/codec/ServerSentEventHttpMessageWriterTests.java @@ -173,14 +173,18 @@ class ServerSentEventHttpMessageWriterTests extends AbstractDataBufferAllocating StepVerifier.create(outputMessage.getBody()) .consumeNextWith(stringConsumer("data:")) - .consumeNextWith(stringConsumer("{\n" + - "data: \"foo\" : \"foofoo\",\n" + - "data: \"bar\" : \"barbar\"\n" + "data:}")) + .consumeNextWith(stringConsumer(""" + { + data: "foo" : "foofoo", + data: "bar" : "barbar" + data:}""")) .consumeNextWith(stringConsumer("\n\n")) .consumeNextWith(stringConsumer("data:")) - .consumeNextWith(stringConsumer("{\n" + - "data: \"foo\" : \"foofoofoo\",\n" + - "data: \"bar\" : \"barbarbar\"\n" + "data:}")) + .consumeNextWith(stringConsumer(""" + { + data: "foo" : "foofoofoo", + data: "bar" : "barbarbar" + data:}""")) .consumeNextWith(stringConsumer("\n\n")) .expectComplete() .verify(); diff --git a/spring-web/src/test/java/org/springframework/http/converter/xml/Jaxb2CollectionHttpMessageConverterTests.java b/spring-web/src/test/java/org/springframework/http/converter/xml/Jaxb2CollectionHttpMessageConverterTests.java index 270037767e8..243a14bf2ce 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/xml/Jaxb2CollectionHttpMessageConverterTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/xml/Jaxb2CollectionHttpMessageConverterTests.java @@ -181,21 +181,22 @@ public class Jaxb2CollectionHttpMessageConverterTests { public void testXmlBomb() throws Exception { // https://en.wikipedia.org/wiki/Billion_laughs // https://msdn.microsoft.com/en-us/magazine/ee335713.aspx - String content = "\n" + - "\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "]>\n" + - "&lol9;"; + String content = """ + + + + + + + + + + + + + ]> + &lol9;"""; MockHttpInputMessage inputMessage = new MockHttpInputMessage(content.getBytes(StandardCharsets.UTF_8)); assertThatExceptionOfType(HttpMessageNotReadableException.class) .isThrownBy(() -> this.converter.read(this.rootElementListType, null, inputMessage)) diff --git a/spring-web/src/test/java/org/springframework/http/converter/xml/Jaxb2RootElementHttpMessageConverterTests.java b/spring-web/src/test/java/org/springframework/http/converter/xml/Jaxb2RootElementHttpMessageConverterTests.java index b7c3fbfaf77..28ca0fa89ed 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/xml/Jaxb2RootElementHttpMessageConverterTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/xml/Jaxb2RootElementHttpMessageConverterTests.java @@ -153,21 +153,22 @@ public class Jaxb2RootElementHttpMessageConverterTests { public void testXmlBomb() throws Exception { // https://en.wikipedia.org/wiki/Billion_laughs // https://msdn.microsoft.com/en-us/magazine/ee335713.aspx - String content = "\n" + - "\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "]>\n" + - "&lol9;"; + String content = """ + + + + + + + + + + + + + ]> + &lol9;"""; MockHttpInputMessage inputMessage = new MockHttpInputMessage(content.getBytes(StandardCharsets.UTF_8)); assertThatExceptionOfType(HttpMessageNotReadableException.class).isThrownBy(() -> this.converter.read(RootElement.class, inputMessage)) diff --git a/spring-web/src/test/java/org/springframework/http/converter/xml/MappingJackson2XmlHttpMessageConverterTests.java b/spring-web/src/test/java/org/springframework/http/converter/xml/MappingJackson2XmlHttpMessageConverterTests.java index f78becdb6c8..066278b99dc 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/xml/MappingJackson2XmlHttpMessageConverterTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/xml/MappingJackson2XmlHttpMessageConverterTests.java @@ -168,21 +168,22 @@ public class MappingJackson2XmlHttpMessageConverterTests { public void readWithXmlBomb() throws IOException { // https://en.wikipedia.org/wiki/Billion_laughs // https://msdn.microsoft.com/en-us/magazine/ee335713.aspx - String body = "\n" + - "\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "]>\n" + - "&lol9;"; + String body = """ + + + + + + + + + + + + + ]> + &lol9;"""; MockHttpInputMessage inputMessage = new MockHttpInputMessage(body.getBytes(StandardCharsets.UTF_8)); inputMessage.getHeaders().setContentType(MediaType.APPLICATION_XML); diff --git a/spring-web/src/test/java/org/springframework/http/converter/xml/SourceHttpMessageConverterTests.java b/spring-web/src/test/java/org/springframework/http/converter/xml/SourceHttpMessageConverterTests.java index dccf6e1be8a..310ef85ed07 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/xml/SourceHttpMessageConverterTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/xml/SourceHttpMessageConverterTests.java @@ -112,21 +112,22 @@ public class SourceHttpMessageConverterTests { public void readDomSourceWithXmlBomb() throws Exception { // https://en.wikipedia.org/wiki/Billion_laughs // https://msdn.microsoft.com/en-us/magazine/ee335713.aspx - String content = "\n" + - "\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "]>\n" + - "&lol9;"; + String content = """ + + + + + + + + + + + + + ]> + &lol9;"""; MockHttpInputMessage inputMessage = new MockHttpInputMessage(content.getBytes(StandardCharsets.UTF_8)); assertThatExceptionOfType(HttpMessageNotReadableException.class).isThrownBy(() -> @@ -166,21 +167,22 @@ public class SourceHttpMessageConverterTests { public void readSAXSourceWithXmlBomb() throws Exception { // https://en.wikipedia.org/wiki/Billion_laughs // https://msdn.microsoft.com/en-us/magazine/ee335713.aspx - String content = "\n" + - "\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "]>\n" + - "&lol9;"; + String content = """ + + + + + + + + + + + + + ]> + &lol9;"""; MockHttpInputMessage inputMessage = new MockHttpInputMessage(content.getBytes(StandardCharsets.UTF_8)); SAXSource result = (SAXSource) this.converter.read(SAXSource.class, inputMessage); @@ -232,21 +234,22 @@ public class SourceHttpMessageConverterTests { public void readStAXSourceWithXmlBomb() throws Exception { // https://en.wikipedia.org/wiki/Billion_laughs // https://msdn.microsoft.com/en-us/magazine/ee335713.aspx - String content = "\n" + - "\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "]>\n" + - "&lol9;"; + String content = """ + + + + + + + + + + + + + ]> + &lol9;"""; MockHttpInputMessage inputMessage = new MockHttpInputMessage(content.getBytes(StandardCharsets.UTF_8)); StAXSource result = (StAXSource) this.converter.read(StAXSource.class, inputMessage); diff --git a/spring-web/src/test/java/org/springframework/web/multipart/support/StandardMultipartHttpServletRequestTests.java b/spring-web/src/test/java/org/springframework/web/multipart/support/StandardMultipartHttpServletRequestTests.java index a7590bcf236..2b46802b2d0 100644 --- a/spring-web/src/test/java/org/springframework/web/multipart/support/StandardMultipartHttpServletRequestTests.java +++ b/spring-web/src/test/java/org/springframework/web/multipart/support/StandardMultipartHttpServletRequestTests.java @@ -84,11 +84,13 @@ public class StandardMultipartHttpServletRequestTests { new FormHttpMessageConverter().write(map, null, output); assertThat(output.getBodyAsString(StandardCharsets.UTF_8)).contains( - "Content-Disposition: form-data; name=\"file\"; filename=\"myFile.txt\"\r\n" + - "Content-Type: text/plain\r\n" + - "Content-Length: 6\r\n" + - "\r\n" + - "myBody\r\n"); + """ + Content-Disposition: form-data; name="file"; filename="myFile.txt"\r + Content-Type: text/plain\r + Content-Length: 6\r + \r + myBody\r + """); } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/CloseStatus.java b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/CloseStatus.java index 808d0b290dc..2c9ccfcd350 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/CloseStatus.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/CloseStatus.java @@ -201,34 +201,22 @@ public final class CloseStatus { */ public static CloseStatus create(int code, @Nullable String reason) { if (!StringUtils.hasText(reason)) { - switch (code) { - case 1000: - return NORMAL; - case 1001: - return GOING_AWAY; - case 1002: - return PROTOCOL_ERROR; - case 1003: - return NOT_ACCEPTABLE; - case 1005: - return NO_STATUS_CODE; - case 1006: - return NO_CLOSE_FRAME; - case 1007: - return BAD_DATA; - case 1008: - return POLICY_VIOLATION; - case 1009: - return TOO_BIG_TO_PROCESS; - case 1010: - return REQUIRED_EXTENSION; - case 1011: - return SERVER_ERROR; - case 1012: - return SERVICE_RESTARTED; - case 1013: - return SERVICE_OVERLOAD; - } + return switch (code) { + case 1000 -> NORMAL; + case 1001 -> GOING_AWAY; + case 1002 -> PROTOCOL_ERROR; + case 1003 -> NOT_ACCEPTABLE; + case 1005 -> NO_STATUS_CODE; + case 1006 -> NO_CLOSE_FRAME; + case 1007 -> BAD_DATA; + case 1008 -> POLICY_VIOLATION; + case 1009 -> TOO_BIG_TO_PROCESS; + case 1010 -> REQUIRED_EXTENSION; + case 1011 -> SERVER_ERROR; + case 1012 -> SERVICE_RESTARTED; + case 1013 -> SERVICE_OVERLOAD; + default -> new CloseStatus(code, reason); + }; } return new CloseStatus(code, reason); } diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/FlushingIntegrationTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/FlushingIntegrationTests.java index 6663fa62196..e583c80f81b 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/FlushingIntegrationTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/FlushingIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2021 the original author or authors. + * Copyright 2002-2022 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. @@ -125,26 +125,20 @@ class FlushingIntegrationTests extends AbstractHttpHandlerIntegrationTests { @Override public Mono handle(ServerHttpRequest request, ServerHttpResponse response) { String path = request.getURI().getPath(); - switch (path) { - case "/write-and-flush": - return response.writeAndFlushWith( - testInterval(Duration.ofMillis(50), 2) - .map(longValue -> wrap("data" + longValue + "\n", response)) - .map(Flux::just) - .mergeWith(Flux.never())); - - case "/write-and-complete": - return response.writeWith( - chunks1K().take(64).map(s -> wrap(s, response))); - - case "/write-and-never-complete": + return switch (path) { + case "/write-and-flush" -> response.writeAndFlushWith( + testInterval(Duration.ofMillis(50), 2) + .map(longValue -> wrap("data" + longValue + "\n", response)) + .map(Flux::just) + .mergeWith(Flux.never())); + case "/write-and-complete" -> response.writeWith( + chunks1K().take(64).map(s -> wrap(s, response))); + case "/write-and-never-complete" -> // Reactor requires at least 50 to flush, Tomcat/Undertow 8, Jetty 1 - return response.writeWith( - chunks1K().take(64).map(s -> wrap(s, response)).mergeWith(Flux.never())); - - default: - return response.writeWith(Flux.empty()); - } + response.writeWith( + chunks1K().take(64).map(s -> wrap(s, response)).mergeWith(Flux.never())); + default -> response.writeWith(Flux.empty()); + }; } private Flux chunks1K() { diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/function/BodyExtractorsTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/function/BodyExtractorsTests.java index eea4ef3a8ce..cd4555194fc 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/function/BodyExtractorsTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/function/BodyExtractorsTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2021 the original author or authors. + * Copyright 2002-2022 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. @@ -336,23 +336,25 @@ public class BodyExtractorsTests { public void toParts() { BodyExtractor, ServerHttpRequest> extractor = BodyExtractors.toParts(); - String bodyContents = "-----------------------------9051914041544843365972754266\r\n" + - "Content-Disposition: form-data; name=\"text\"\r\n" + - "\r\n" + - "text default\r\n" + - "-----------------------------9051914041544843365972754266\r\n" + - "Content-Disposition: form-data; name=\"file1\"; filename=\"a.txt\"\r\n" + - "Content-Type: text/plain\r\n" + - "\r\n" + - "Content of a.txt.\r\n" + - "\r\n" + - "-----------------------------9051914041544843365972754266\r\n" + - "Content-Disposition: form-data; name=\"file2\"; filename=\"a.html\"\r\n" + - "Content-Type: text/html\r\n" + - "\r\n" + - "Content of a.html.\r\n" + - "\r\n" + - "-----------------------------9051914041544843365972754266--\r\n"; + String bodyContents = """ + -----------------------------9051914041544843365972754266\r + Content-Disposition: form-data; name="text"\r + \r + text default\r + -----------------------------9051914041544843365972754266\r + Content-Disposition: form-data; name="file1"; filename="a.txt"\r + Content-Type: text/plain\r + \r + Content of a.txt.\r + \r + -----------------------------9051914041544843365972754266\r + Content-Disposition: form-data; name="file2"; filename="a.html"\r + Content-Type: text/html\r + \r + Content of a.html.\r + \r + -----------------------------9051914041544843365972754266--\r + """; byte[] bytes = bodyContents.getBytes(StandardCharsets.UTF_8); DefaultDataBuffer dataBuffer = DefaultDataBufferFactory.sharedInstance.wrap(ByteBuffer.wrap(bytes)); diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/WebClientIntegrationTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/WebClientIntegrationTests.java index 4da55a40390..4cc2b5de7bd 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/WebClientIntegrationTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/WebClientIntegrationTests.java @@ -726,8 +726,8 @@ class WebClientIntegrationTests { ByteArrayOutputStream bos = new ByteArrayOutputStream(); try { request.getBody().copyTo(bos); - String actual = bos.toString("UTF-8"); - String expected = new String(Files.readAllBytes(resource.getFile().toPath()), StandardCharsets.UTF_8); + String actual = bos.toString(StandardCharsets.UTF_8); + String expected = Files.readString(resource.getFile().toPath(), StandardCharsets.UTF_8); assertThat(actual).isEqualTo(expected); } catch (IOException ex) { diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/DefaultServerRequestTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/DefaultServerRequestTests.java index 783b593c3ca..d14ed3a0090 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/DefaultServerRequestTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/DefaultServerRequestTests.java @@ -412,15 +412,17 @@ public class DefaultServerRequestTests { @Test public void multipartData() { - String data = "--12345\r\n" + - "Content-Disposition: form-data; name=\"foo\"\r\n" + - "\r\n" + - "bar\r\n" + - "--12345\r\n" + - "Content-Disposition: form-data; name=\"baz\"\r\n" + - "\r\n" + - "qux\r\n" + - "--12345--\r\n"; + String data = """ + --12345\r + Content-Disposition: form-data; name="foo"\r + \r + bar\r + --12345\r + Content-Disposition: form-data; name="baz"\r + \r + qux\r + --12345--\r + """; byte[] bytes = data.getBytes(StandardCharsets.UTF_8); DefaultDataBuffer dataBuffer = DefaultDataBufferFactory.sharedInstance.wrap(ByteBuffer.wrap(bytes)); Flux body = Flux.just(dataBuffer); diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/resource/CssLinkResourceTransformerTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/resource/CssLinkResourceTransformerTests.java index 1217658507b..bc854cdab94 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/resource/CssLinkResourceTransformerTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/resource/CssLinkResourceTransformerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2022 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. @@ -80,13 +80,17 @@ public class CssLinkResourceTransformerTests { MockServerWebExchange exchange = MockServerWebExchange.from(get("/static/main.css")); Resource css = getResource("main.css"); - String expected = "\n" + - "@import url(\"/static/bar-11e16cf79faee7ac698c805cf28248d2.css?#iefix\");\n" + - "@import url('/static/bar-11e16cf79faee7ac698c805cf28248d2.css#bla-normal');\n" + - "@import url(/static/bar-11e16cf79faee7ac698c805cf28248d2.css);\n\n" + - "@import \"/static/foo-e36d2e05253c6c7085a91522ce43a0b4.css\";\n" + - "@import '/static/foo-e36d2e05253c6c7085a91522ce43a0b4.css';\n\n" + - "body { background: url(\"/static/images/image-f448cd1d5dba82b774f3202c878230b3.png?#iefix\") }\n"; + String expected = """ + + @import url("/static/bar-11e16cf79faee7ac698c805cf28248d2.css?#iefix"); + @import url('/static/bar-11e16cf79faee7ac698c805cf28248d2.css#bla-normal'); + @import url(/static/bar-11e16cf79faee7ac698c805cf28248d2.css); + + @import "/static/foo-e36d2e05253c6c7085a91522ce43a0b4.css"; + @import '/static/foo-e36d2e05253c6c7085a91522ce43a0b4.css'; + + body { background: url("/static/images/image-f448cd1d5dba82b774f3202c878230b3.png?#iefix") } + """; StepVerifier.create(this.transformerChain.transform(exchange, css) .cast(TransformedResource.class)) @@ -118,9 +122,10 @@ public class CssLinkResourceTransformerTests { ResourceTransformerChain chain = new DefaultResourceTransformerChain(mockChain, transformers); Resource resource = getResource("external.css"); - String expected = "@import url(\"https://example.org/fonts/css\");\n" + - "body { background: url(\"file:///home/spring/image.png\") }\n" + - "figure { background: url(\"//example.org/style.css\")}"; + String expected = """ + @import url("https://example.org/fonts/css"); + body { background: url("file:///home/spring/image.png") } + figure { background: url("//example.org/style.css")}"""; StepVerifier.create(chain.transform(exchange, resource) .cast(TransformedResource.class)) @@ -167,10 +172,10 @@ public class CssLinkResourceTransformerTests { public void transformEmptyUrlFunction() throws Exception { MockServerWebExchange exchange = MockServerWebExchange.from(get("/static/empty_url_function.css")); Resource css = getResource("empty_url_function.css"); - String expected = - ".fooStyle {\n" + - "\tbackground: transparent url() no-repeat left top;\n" + - "}"; + String expected = """ + .fooStyle { + \tbackground: transparent url() no-repeat left top; + }"""; StepVerifier.create(this.transformerChain.transform(exchange, css) .cast(TransformedResource.class)) diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/freemarker/FreeMarkerMacroTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/freemarker/FreeMarkerMacroTests.java index b160c631b96..adc0e1a8d62 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/freemarker/FreeMarkerMacroTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/freemarker/FreeMarkerMacroTests.java @@ -45,7 +45,6 @@ import org.springframework.web.server.ServerWebExchange; import org.springframework.web.testfixture.http.server.reactive.MockServerHttpRequest; import org.springframework.web.testfixture.server.MockServerWebExchange; -import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.Collections.singletonMap; import static java.util.stream.Collectors.toList; import static org.assertj.core.api.Assertions.assertThat; @@ -357,8 +356,9 @@ public class FreeMarkerMacroTests { } private void storeTemplateInTempDir(String macro) throws IOException { - Files.write(this.templateLoaderPath.resolve("tmp.ftl"), - ("<#import \"spring.ftl\" as spring />\n" + macro).getBytes(UTF_8)); + Files.writeString(this.templateLoaderPath.resolve("tmp.ftl"), + "<#import \"spring.ftl\" as spring />\n" + macro + ); } private List getOutput() { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ReactiveTypeHandler.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ReactiveTypeHandler.java index 899ed862c81..0dc277b9a53 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ReactiveTypeHandler.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ReactiveTypeHandler.java @@ -381,8 +381,7 @@ class ReactiveTypeHandler { @Override protected void send(Object element) throws IOException { - if (element instanceof ServerSentEvent) { - ServerSentEvent event = (ServerSentEvent) element; + if (element instanceof ServerSentEvent event) { ((SseEmitter) getEmitter()).send(adapt(event)); } else { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/AbstractMultiCheckedElementTag.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/AbstractMultiCheckedElementTag.java index 340fe962f85..87d4f5ac529 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/AbstractMultiCheckedElementTag.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/AbstractMultiCheckedElementTag.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2022 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. @@ -223,16 +223,14 @@ public abstract class AbstractMultiCheckedElementTag extends AbstractCheckedElem writeObjectEntry(tagWriter, valueProperty, labelProperty, item, i); } } - else if (itemsObject instanceof Collection) { - final Collection optionCollection = (Collection) itemsObject; + else if (itemsObject instanceof final Collection optionCollection) { int itemIndex = 0; for (Iterator it = optionCollection.iterator(); it.hasNext(); itemIndex++) { Object item = it.next(); writeObjectEntry(tagWriter, valueProperty, labelProperty, item, itemIndex); } } - else if (itemsObject instanceof Map) { - final Map optionMap = (Map) itemsObject; + else if (itemsObject instanceof final Map optionMap) { int itemIndex = 0; for (Iterator it = optionMap.entrySet().iterator(); it.hasNext(); itemIndex++) { Map.Entry entry = (Map.Entry) it.next(); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/RedirectView.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/RedirectView.java index fd7c2b8c888..17adecf736d 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/RedirectView.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/RedirectView.java @@ -537,8 +537,7 @@ public class RedirectView extends AbstractUrlBasedView implements SmartView { } return true; } - if (value instanceof Collection) { - Collection coll = (Collection) value; + if (value instanceof Collection coll) { if (coll.isEmpty()) { return false; } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/function/SseServerResponseTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/function/SseServerResponseTests.java index 0b9aff9d27d..6280361d812 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/function/SseServerResponseTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/function/SseServerResponseTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2021 the original author or authors. + * Copyright 2002-2022 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. @@ -109,12 +109,15 @@ class SseServerResponseTests { ModelAndView mav = response.writeTo(this.mockRequest, this.mockResponse, context); assertThat(mav).isNull(); - String expected = "id:id\n" + - "event:name\n" + - ":comment line 1\n" + - ":comment line 2\n" + - "retry:1000\n" + - "data:data\n\n"; + String expected = """ + id:id + event:name + :comment line 1 + :comment line 2 + retry:1000 + data:data + + """; assertThat(this.mockResponse.getContentAsString()).isEqualTo(expected); } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/function/ToStringVisitorTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/function/ToStringVisitorTests.java index eaba8b842ac..2b00f2d882f 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/function/ToStringVisitorTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/function/ToStringVisitorTests.java @@ -52,11 +52,12 @@ public class ToStringVisitorTests { routerFunction.accept(visitor); String result = visitor.toString(); - String expected = "/foo => {\n" + - " /bar => {\n" + - " (GET && /baz) -> \n" + - " }\n" + - "}"; + String expected = """ + /foo => { + /bar => { + (GET && /baz) ->\s + } + }""".replace('\t', ' '); assertThat(result).isEqualTo(expected); } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/CssLinkResourceTransformerTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/CssLinkResourceTransformerTests.java index 37790e71590..118ccc467f2 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/CssLinkResourceTransformerTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/CssLinkResourceTransformerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2022 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,13 +84,17 @@ public class CssLinkResourceTransformerTests { public void transform() throws Exception { this.request = new MockHttpServletRequest("GET", "/static/main.css"); Resource css = getResource("main.css"); - String expected = "\n" + - "@import url(\"/static/bar-11e16cf79faee7ac698c805cf28248d2.css?#iefix\");\n" + - "@import url('/static/bar-11e16cf79faee7ac698c805cf28248d2.css#bla-normal');\n" + - "@import url(/static/bar-11e16cf79faee7ac698c805cf28248d2.css);\n\n" + - "@import \"/static/foo-e36d2e05253c6c7085a91522ce43a0b4.css\";\n" + - "@import '/static/foo-e36d2e05253c6c7085a91522ce43a0b4.css';\n\n" + - "body { background: url(\"/static/images/image-f448cd1d5dba82b774f3202c878230b3.png?#iefix\") }\n"; + String expected = """ + + @import url("/static/bar-11e16cf79faee7ac698c805cf28248d2.css?#iefix"); + @import url('/static/bar-11e16cf79faee7ac698c805cf28248d2.css#bla-normal'); + @import url(/static/bar-11e16cf79faee7ac698c805cf28248d2.css); + + @import "/static/foo-e36d2e05253c6c7085a91522ce43a0b4.css"; + @import '/static/foo-e36d2e05253c6c7085a91522ce43a0b4.css'; + + body { background: url("/static/images/image-f448cd1d5dba82b774f3202c878230b3.png?#iefix") } + """; TransformedResource actual = (TransformedResource) this.transformerChain.transform(this.request, css); String result = new String(actual.getByteArray(), StandardCharsets.UTF_8); @@ -115,9 +119,10 @@ public class CssLinkResourceTransformerTests { ResourceTransformerChain chain = new DefaultResourceTransformerChain(mockChain, transformers); Resource resource = getResource("external.css"); - String expected = "@import url(\"https://example.org/fonts/css\");\n" + - "body { background: url(\"file:///home/spring/image.png\") }\n" + - "figure { background: url(\"//example.org/style.css\")}"; + String expected = """ + @import url("https://example.org/fonts/css"); + body { background: url("file:///home/spring/image.png") } + figure { background: url("//example.org/style.css")}"""; TransformedResource transformedResource = (TransformedResource) chain.transform(this.request, resource); String result = new String(transformedResource.getByteArray(), StandardCharsets.UTF_8); @@ -155,10 +160,10 @@ public class CssLinkResourceTransformerTests { public void transformEmptyUrlFunction() throws Exception { this.request = new MockHttpServletRequest("GET", "/static/empty_url_function.css"); Resource css = getResource("empty_url_function.css"); - String expected = - ".fooStyle {\n" + - "\tbackground: transparent url() no-repeat left top;\n" + - "}"; + String expected = """ + .fooStyle { + \tbackground: transparent url() no-repeat left top; + }"""; TransformedResource actual = (TransformedResource) this.transformerChain.transform(this.request, css); String result = new String(actual.getByteArray(), StandardCharsets.UTF_8); diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/freemarker/FreeMarkerMacroTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/view/freemarker/FreeMarkerMacroTests.java index eafb927754d..823533993d6 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/freemarker/FreeMarkerMacroTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/view/freemarker/FreeMarkerMacroTests.java @@ -48,7 +48,6 @@ import org.springframework.web.testfixture.servlet.MockHttpServletRequest; import org.springframework.web.testfixture.servlet.MockHttpServletResponse; import org.springframework.web.testfixture.servlet.MockServletContext; -import static java.nio.charset.StandardCharsets.UTF_8; import static org.assertj.core.api.Assertions.assertThat; /** @@ -346,8 +345,9 @@ public class FreeMarkerMacroTests { } private void storeTemplateInTempDir(String macro) throws IOException { - Files.write(this.templateLoaderPath.resolve("tmp.ftl"), - ("<#import \"spring.ftl\" as spring />\n" + macro).getBytes(UTF_8)); + Files.writeString(this.templateLoaderPath.resolve("tmp.ftl"), + "<#import \"spring.ftl\" as spring />\n" + macro + ); } private String getOutput() throws IOException { diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/messaging/StompSubProtocolHandler.java b/spring-websocket/src/main/java/org/springframework/web/socket/messaging/StompSubProtocolHandler.java index c07db18eca4..1adcd063de6 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/messaging/StompSubProtocolHandler.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/messaging/StompSubProtocolHandler.java @@ -427,7 +427,7 @@ public class StompSubProtocolHandler implements SubProtocolHandler, ApplicationE @Override @SuppressWarnings("unchecked") public void handleMessageToClient(WebSocketSession session, Message message) { - if (!(message.getPayload() instanceof byte[])) { + if (!(message.getPayload() instanceof byte[] payload)) { if (logger.isErrorEnabled()) { logger.error("Expected byte[] payload. Ignoring " + message + "."); } @@ -464,7 +464,6 @@ public class StompSubProtocolHandler implements SubProtocolHandler, ApplicationE } } - byte[] payload = (byte[]) message.getPayload(); if (StompCommand.ERROR.equals(command) && getErrorHandler() != null) { Message errorMessage = getErrorHandler().handleErrorMessageToClient((Message) message); if (errorMessage != null) { diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/AbstractClientSockJsSession.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/AbstractClientSockJsSession.java index 1f78b132d5e..c239ce3bcfe 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/AbstractClientSockJsSession.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/AbstractClientSockJsSession.java @@ -229,19 +229,14 @@ public abstract class AbstractClientSockJsSession implements WebSocketSession { public void handleFrame(String payload) { SockJsFrame frame = new SockJsFrame(payload); switch (frame.getType()) { - case OPEN: - handleOpenFrame(); - break; - case HEARTBEAT: + case OPEN -> handleOpenFrame(); + case HEARTBEAT -> { if (logger.isTraceEnabled()) { logger.trace("Received heartbeat in " + this); } - break; - case MESSAGE: - handleMessageFrame(frame); - break; - case CLOSE: - handleCloseFrame(frame); + } + case MESSAGE -> handleMessageFrame(frame); + case CLOSE -> handleCloseFrame(frame); } } diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/TransportHandlingSockJsService.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/TransportHandlingSockJsService.java index 1f64138c526..77a98464898 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/TransportHandlingSockJsService.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/TransportHandlingSockJsService.java @@ -276,12 +276,11 @@ public class TransportHandlingSockJsService extends AbstractSockJsService implem SockJsSession session = this.sessions.get(sessionId); boolean isNewSession = false; if (session == null) { - if (transportHandler instanceof SockJsSessionFactory) { + if (transportHandler instanceof SockJsSessionFactory sessionFactory) { Map attributes = new HashMap<>(); if (!chain.applyBeforeHandshake(request, response, attributes)) { return; } - SockJsSessionFactory sessionFactory = (SockJsSessionFactory) transportHandler; session = createSockJsSession(sessionId, sessionFactory, handler, attributes); isNewSession = true; }