From 31c3b8a291ee79b1f6735955d5a457d41d976ac5 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Fri, 3 May 2019 00:10:56 +0200 Subject: [PATCH 1/3] Avoid unguarded String concatenation for debug/trace logging Closes gh-22874 --- .../AbstractTypeHierarchyTraversingFilter.java | 14 +++++++++----- .../CustomSQLExceptionTranslatorRegistry.java | 18 ++++++++++-------- .../DefaultJmsActivationSpecFactory.java | 18 +++++++++++++----- .../AbstractWebArgumentResolverAdapter.java | 6 ++++-- .../resource/CachingResourceTransformer.java | 6 ++++-- .../servlet/i18n/LocaleChangeInterceptor.java | 6 ++++-- .../resource/CachingResourceTransformer.java | 6 ++---- 7 files changed, 46 insertions(+), 28 deletions(-) diff --git a/spring-core/src/main/java/org/springframework/core/type/filter/AbstractTypeHierarchyTraversingFilter.java b/spring-core/src/main/java/org/springframework/core/type/filter/AbstractTypeHierarchyTraversingFilter.java index 4d93f8005b..cfa9ba2b93 100644 --- a/spring-core/src/main/java/org/springframework/core/type/filter/AbstractTypeHierarchyTraversingFilter.java +++ b/spring-core/src/main/java/org/springframework/core/type/filter/AbstractTypeHierarchyTraversingFilter.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -85,8 +85,10 @@ public abstract class AbstractTypeHierarchyTraversingFilter implements TypeFilte } } catch (IOException ex) { - logger.debug("Could not read super class [" + metadata.getSuperClassName() + - "] of type-filtered class [" + metadata.getClassName() + "]"); + if (logger.isDebugEnabled()) { + logger.debug("Could not read super class [" + metadata.getSuperClassName() + + "] of type-filtered class [" + metadata.getClassName() + "]"); + } } } } @@ -109,8 +111,10 @@ public abstract class AbstractTypeHierarchyTraversingFilter implements TypeFilte } } catch (IOException ex) { - logger.debug("Could not read interface [" + ifc + "] for type-filtered class [" + - metadata.getClassName() + "]"); + if (logger.isDebugEnabled()) { + logger.debug("Could not read interface [" + ifc + "] for type-filtered class [" + + metadata.getClassName() + "]"); + } } } } diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/support/CustomSQLExceptionTranslatorRegistry.java b/spring-jdbc/src/main/java/org/springframework/jdbc/support/CustomSQLExceptionTranslatorRegistry.java index c5f471bb22..2908e65bac 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/support/CustomSQLExceptionTranslatorRegistry.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/support/CustomSQLExceptionTranslatorRegistry.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -74,13 +74,15 @@ public final class CustomSQLExceptionTranslatorRegistry { */ public void registerTranslator(String dbName, SQLExceptionTranslator translator) { SQLExceptionTranslator replaced = this.translatorMap.put(dbName, translator); - if (replaced != null) { - logger.debug("Replacing custom translator [" + replaced + "] for database '" + dbName + - "' with [" + translator + "]"); - } - else { - logger.debug("Adding custom translator of type [" + translator.getClass().getName() + - "] for database '" + dbName + "'"); + if (logger.isDebugEnabled()) { + if (replaced != null) { + logger.debug("Replacing custom translator [" + replaced + "] for database '" + dbName + + "' with [" + translator + "]"); + } + else { + logger.debug("Adding custom translator of type [" + translator.getClass().getName() + + "] for database '" + dbName + "'"); + } } } diff --git a/spring-jms/src/main/java/org/springframework/jms/listener/endpoint/DefaultJmsActivationSpecFactory.java b/spring-jms/src/main/java/org/springframework/jms/listener/endpoint/DefaultJmsActivationSpecFactory.java index 21aeca6dbd..1702070063 100644 --- a/spring-jms/src/main/java/org/springframework/jms/listener/endpoint/DefaultJmsActivationSpecFactory.java +++ b/spring-jms/src/main/java/org/springframework/jms/listener/endpoint/DefaultJmsActivationSpecFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -85,7 +85,9 @@ public class DefaultJmsActivationSpecFactory extends StandardJmsActivationSpecFa return adapter.getClass().getClassLoader().loadClass(specClassName); } catch (ClassNotFoundException ex) { - logger.debug("No default ActivationSpec class found: " + specClassName); + if (logger.isDebugEnabled()) { + logger.debug("No default ActivationSpec class found: " + specClassName); + } } } @@ -98,7 +100,9 @@ public class DefaultJmsActivationSpecFactory extends StandardJmsActivationSpecFa return adapter.getClass().getClassLoader().loadClass(specClassName); } catch (ClassNotFoundException ex) { - logger.debug("No default ActivationSpecImpl class found: " + specClassName); + if (logger.isDebugEnabled()) { + logger.debug("No default ActivationSpecImpl class found: " + specClassName); + } } } @@ -109,7 +113,9 @@ public class DefaultJmsActivationSpecFactory extends StandardJmsActivationSpecFa return adapter.getClass().getClassLoader().loadClass(specClassName); } catch (ClassNotFoundException ex) { - logger.debug("No default ActivationSpecImpl class found in provider package: " + specClassName); + if (logger.isDebugEnabled()) { + logger.debug("No default ActivationSpecImpl class found in provider package: " + specClassName); + } } // ActivationSpecImpl class in "inbound" subpackage (WebSphere MQ 6.0.2.1) @@ -118,7 +124,9 @@ public class DefaultJmsActivationSpecFactory extends StandardJmsActivationSpecFa return adapter.getClass().getClassLoader().loadClass(specClassName); } catch (ClassNotFoundException ex) { - logger.debug("No default ActivationSpecImpl class found in inbound subpackage: " + specClassName); + if (logger.isDebugEnabled()) { + logger.debug("No default ActivationSpecImpl class found in inbound subpackage: " + specClassName); + } } throw new IllegalStateException("No ActivationSpec class defined - " + diff --git a/spring-web/src/main/java/org/springframework/web/method/annotation/AbstractWebArgumentResolverAdapter.java b/spring-web/src/main/java/org/springframework/web/method/annotation/AbstractWebArgumentResolverAdapter.java index c57e66df6a..0d0272a373 100644 --- a/spring-web/src/main/java/org/springframework/web/method/annotation/AbstractWebArgumentResolverAdapter.java +++ b/spring-web/src/main/java/org/springframework/web/method/annotation/AbstractWebArgumentResolverAdapter.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -81,7 +81,9 @@ public abstract class AbstractWebArgumentResolverAdapter implements HandlerMetho } catch (Exception ex) { // ignore (see class-level doc) - logger.debug("Error in checking support for parameter [" + parameter + "], message: " + ex.getMessage()); + if (logger.isDebugEnabled()) { + logger.debug("Error in checking support for parameter [" + parameter + "]: " + ex.getMessage()); + } return false; } } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/CachingResourceTransformer.java b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/CachingResourceTransformer.java index 456d0ef059..29492a0e23 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/CachingResourceTransformer.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/CachingResourceTransformer.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -69,7 +69,9 @@ public class CachingResourceTransformer implements ResourceTransformer { Resource cachedResource = this.cache.get(resource, Resource.class); if (cachedResource != null) { - logger.trace(exchange.getLogPrefix() + "Resource resolved from cache"); + if (logger.isTraceEnabled()) { + logger.trace(exchange.getLogPrefix() + "Resource resolved from cache"); + } return Mono.just(cachedResource); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/LocaleChangeInterceptor.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/LocaleChangeInterceptor.java index 9b0c15bb8e..1fb9ef29ed 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/LocaleChangeInterceptor.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/i18n/LocaleChangeInterceptor.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -154,7 +154,9 @@ public class LocaleChangeInterceptor extends HandlerInterceptorAdapter { } catch (IllegalArgumentException ex) { if (isIgnoreInvalidLocale()) { - logger.debug("Ignoring invalid locale value [" + newLocale + "]: " + ex.getMessage()); + if (logger.isDebugEnabled()) { + logger.debug("Ignoring invalid locale value [" + newLocale + "]: " + ex.getMessage()); + } } else { throw ex; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/CachingResourceTransformer.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/CachingResourceTransformer.java index d2431f6de0..25c0aee859 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/CachingResourceTransformer.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/CachingResourceTransformer.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -71,9 +71,7 @@ public class CachingResourceTransformer implements ResourceTransformer { Resource transformed = this.cache.get(resource, Resource.class); if (transformed != null) { - if (logger.isTraceEnabled()) { - logger.trace("Resource resolved from cache"); - } + logger.trace("Resource resolved from cache"); return transformed; } From 5b1b1bae37318a917c7a27a88ab5870393ded1d2 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Fri, 3 May 2019 00:11:47 +0200 Subject: [PATCH 2/3] Consistent use of try-with-resources for local resource closing --- .../util/SerializationUtils.java | 8 +++----- .../util/SerializationTestUtils.java | 20 ++++++++++--------- .../AbstractEmbeddedDatabaseConfigurer.java | 7 +++++-- .../http/MediaTypeFactory.java | 6 +++--- 4 files changed, 22 insertions(+), 19 deletions(-) diff --git a/spring-core/src/main/java/org/springframework/util/SerializationUtils.java b/spring-core/src/main/java/org/springframework/util/SerializationUtils.java index 65d65be0ff..1f15a163f0 100644 --- a/spring-core/src/main/java/org/springframework/util/SerializationUtils.java +++ b/spring-core/src/main/java/org/springframework/util/SerializationUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -43,8 +43,7 @@ public abstract class SerializationUtils { return null; } ByteArrayOutputStream baos = new ByteArrayOutputStream(1024); - try { - ObjectOutputStream oos = new ObjectOutputStream(baos); + try (ObjectOutputStream oos = new ObjectOutputStream(baos)) { oos.writeObject(object); oos.flush(); } @@ -64,8 +63,7 @@ public abstract class SerializationUtils { if (bytes == null) { return null; } - try { - ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes)); + try (ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes))) { return ois.readObject(); } catch (IOException ex) { diff --git a/spring-core/src/test/java/org/springframework/util/SerializationTestUtils.java b/spring-core/src/test/java/org/springframework/util/SerializationTestUtils.java index ce4eed1558..38c48dea34 100644 --- a/spring-core/src/test/java/org/springframework/util/SerializationTestUtils.java +++ b/spring-core/src/test/java/org/springframework/util/SerializationTestUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * Copyright 2002-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -34,8 +34,9 @@ public class SerializationTestUtils { public static void testSerialization(Object o) throws IOException { OutputStream baos = new ByteArrayOutputStream(); - ObjectOutputStream oos = new ObjectOutputStream(baos); - oos.writeObject(o); + try (ObjectOutputStream oos = new ObjectOutputStream(baos)) { + oos.writeObject(o); + } } public static boolean isSerializable(Object o) throws IOException { @@ -50,16 +51,17 @@ public class SerializationTestUtils { public static Object serializeAndDeserialize(Object o) throws IOException, ClassNotFoundException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); - ObjectOutputStream oos = new ObjectOutputStream(baos); - oos.writeObject(o); - oos.flush(); + try (ObjectOutputStream oos = new ObjectOutputStream(baos)) { + oos.writeObject(o); + oos.flush(); + } baos.flush(); byte[] bytes = baos.toByteArray(); ByteArrayInputStream is = new ByteArrayInputStream(bytes); - ObjectInputStream ois = new ObjectInputStream(is); - Object o2 = ois.readObject(); - return o2; + try (ObjectInputStream ois = new ObjectInputStream(is)) { + return ois.readObject(); + } } } diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/embedded/AbstractEmbeddedDatabaseConfigurer.java b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/embedded/AbstractEmbeddedDatabaseConfigurer.java index cecc0a9186..15aba492e0 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/embedded/AbstractEmbeddedDatabaseConfigurer.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/embedded/AbstractEmbeddedDatabaseConfigurer.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +18,7 @@ package org.springframework.jdbc.datasource.embedded; import java.sql.Connection; import java.sql.SQLException; +import java.sql.Statement; import javax.sql.DataSource; import org.apache.commons.logging.Log; @@ -42,7 +43,9 @@ abstract class AbstractEmbeddedDatabaseConfigurer implements EmbeddedDatabaseCon try { con = dataSource.getConnection(); if (con != null) { - con.createStatement().execute("SHUTDOWN"); + try (Statement stmt = con.createStatement()) { + stmt.execute("SHUTDOWN"); + } } } catch (SQLException ex) { diff --git a/spring-web/src/main/java/org/springframework/http/MediaTypeFactory.java b/spring-web/src/main/java/org/springframework/http/MediaTypeFactory.java index 0a05e8ea83..7ad0969f2b 100644 --- a/spring-web/src/main/java/org/springframework/http/MediaTypeFactory.java +++ b/spring-web/src/main/java/org/springframework/http/MediaTypeFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -64,8 +64,8 @@ public final class MediaTypeFactory { * @return a multi-value map, mapping media types to file extensions. */ private static MultiValueMap parseMimeTypes() { - try (InputStream is = MediaTypeFactory.class.getResourceAsStream(MIME_TYPES_FILE_NAME)) { - BufferedReader reader = new BufferedReader(new InputStreamReader(is, StandardCharsets.US_ASCII)); + InputStream is = MediaTypeFactory.class.getResourceAsStream(MIME_TYPES_FILE_NAME); + try (BufferedReader reader = new BufferedReader(new InputStreamReader(is, StandardCharsets.US_ASCII))) { MultiValueMap result = new LinkedMultiValueMap<>(); String line; while ((line = reader.readLine()) != null) { From 7aa61d9ee0f90c9240ba63b0cfda5d3a96338a9b Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Fri, 3 May 2019 00:12:03 +0200 Subject: [PATCH 3/3] Upgrade to Jetty 9.4.18 and Netty 4.1.36 --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index e1e045d732..0ab8c2d6df 100644 --- a/build.gradle +++ b/build.gradle @@ -33,11 +33,11 @@ ext { groovyVersion = "2.5.6" hsqldbVersion = "2.4.1" jackson2Version = "2.9.8" - jettyVersion = "9.4.17.v20190418" + jettyVersion = "9.4.18.v20190429" junit5Version = "5.3.2" kotlinVersion = "1.2.71" log4jVersion = "2.11.2" - nettyVersion = "4.1.35.Final" + nettyVersion = "4.1.36.Final" reactorVersion = "Californium-BUILD-SNAPSHOT" rxjavaVersion = "1.3.8" rxjavaAdapterVersion = "1.2.1"