From 5448e81021562b9ecf5719faa6d8abb0fbcb7871 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Tue, 17 Jan 2023 15:26:57 +0100 Subject: [PATCH] Deprecate Base64Utils in favor of Java's Base64 Originally, `Base64Utils` was providing base64 encoding and decoding utilities, bridging to commons-codecs or Java 8, if available. Since then, only the Java 8 variant remains and Spring Framework 6 requires now Java 17. This utility class doesn't provide additional checks or syntactic sugar over what's in Java already. As a result, this commit deprecates this class in favor of `Base64` and schedules the removal of this class completely. Closes gh-28434 --- .../org/springframework/util/Base64Utils.java | 4 +- .../util/Base64UtilsTests.java | 101 ------------------ .../http/converter/json/GsonBuilderUtils.java | 9 +- 3 files changed, 7 insertions(+), 107 deletions(-) delete mode 100644 spring-core/src/test/java/org/springframework/util/Base64UtilsTests.java diff --git a/spring-core/src/main/java/org/springframework/util/Base64Utils.java b/spring-core/src/main/java/org/springframework/util/Base64Utils.java index afcaa826082..6d6985d4eee 100644 --- a/spring-core/src/main/java/org/springframework/util/Base64Utils.java +++ b/spring-core/src/main/java/org/springframework/util/Base64Utils.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2023 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. @@ -27,7 +27,9 @@ import java.util.Base64; * @author Gary Russell * @since 4.1 * @see java.util.Base64 + * @deprecated as of Spring Framework 6.0.5 in favor of {@link Base64}. */ +@Deprecated(since = "6.0.5", forRemoval = true) public abstract class Base64Utils { /** diff --git a/spring-core/src/test/java/org/springframework/util/Base64UtilsTests.java b/spring-core/src/test/java/org/springframework/util/Base64UtilsTests.java deleted file mode 100644 index c79e7a85d29..00000000000 --- a/spring-core/src/test/java/org/springframework/util/Base64UtilsTests.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * 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. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.util; - -import jakarta.xml.bind.DatatypeConverter; -import org.junit.jupiter.api.Test; - -import static java.nio.charset.StandardCharsets.UTF_8; -import static org.assertj.core.api.Assertions.assertThat; - -/** - * @author Juergen Hoeller - * @since 4.2 - */ -class Base64UtilsTests { - - - @Test - void encode() { - byte[] bytes = new byte[] - {-0x4f, 0xa, -0x73, -0x4f, 0x64, -0x20, 0x75, 0x41, 0x5, -0x49, -0x57, -0x65, -0x19, 0x2e, 0x3f, -0x1b}; - assertThat(Base64Utils.decode(Base64Utils.encode(bytes))).isEqualTo(bytes); - - bytes = "Hello World".getBytes(UTF_8); - assertThat(Base64Utils.decode(Base64Utils.encode(bytes))).isEqualTo(bytes); - - bytes = "Hello World\r\nSecond Line".getBytes(UTF_8); - assertThat(Base64Utils.decode(Base64Utils.encode(bytes))).isEqualTo(bytes); - - bytes = "Hello World\r\nSecond Line\r\n".getBytes(UTF_8); - assertThat(Base64Utils.decode(Base64Utils.encode(bytes))).isEqualTo(bytes); - - bytes = new byte[] { (byte) 0xfb, (byte) 0xf0 }; - assertThat(Base64Utils.encode(bytes)).isEqualTo("+/A=".getBytes()); - assertThat(Base64Utils.decode(Base64Utils.encode(bytes))).isEqualTo(bytes); - - assertThat(Base64Utils.encodeUrlSafe(bytes)).isEqualTo("-_A=".getBytes()); - assertThat(Base64Utils.decodeUrlSafe(Base64Utils.encodeUrlSafe(bytes))).isEqualTo(bytes); - } - - @Test - void encodeToStringWithJdk8VsJaxb() { - byte[] bytes = new byte[] - {-0x4f, 0xa, -0x73, -0x4f, 0x64, -0x20, 0x75, 0x41, 0x5, -0x49, -0x57, -0x65, -0x19, 0x2e, 0x3f, -0x1b}; - assertThat(DatatypeConverter.printBase64Binary(bytes)).isEqualTo(Base64Utils.encodeToString(bytes)); - assertThat(Base64Utils.decodeFromString(Base64Utils.encodeToString(bytes))).isEqualTo(bytes); - assertThat(DatatypeConverter.parseBase64Binary(DatatypeConverter.printBase64Binary(bytes))).isEqualTo(bytes); - - bytes = "Hello World".getBytes(UTF_8); - assertThat(DatatypeConverter.printBase64Binary(bytes)).isEqualTo(Base64Utils.encodeToString(bytes)); - assertThat(Base64Utils.decodeFromString(Base64Utils.encodeToString(bytes))).isEqualTo(bytes); - assertThat(DatatypeConverter.parseBase64Binary(DatatypeConverter.printBase64Binary(bytes))).isEqualTo(bytes); - - bytes = "Hello World\r\nSecond Line".getBytes(UTF_8); - assertThat(DatatypeConverter.printBase64Binary(bytes)).isEqualTo(Base64Utils.encodeToString(bytes)); - assertThat(Base64Utils.decodeFromString(Base64Utils.encodeToString(bytes))).isEqualTo(bytes); - assertThat(DatatypeConverter.parseBase64Binary(DatatypeConverter.printBase64Binary(bytes))).isEqualTo(bytes); - - bytes = "Hello World\r\nSecond Line\r\n".getBytes(UTF_8); - assertThat(DatatypeConverter.printBase64Binary(bytes)).isEqualTo(Base64Utils.encodeToString(bytes)); - assertThat(Base64Utils.decodeFromString(Base64Utils.encodeToString(bytes))).isEqualTo(bytes); - assertThat(DatatypeConverter.parseBase64Binary(DatatypeConverter.printBase64Binary(bytes))).isEqualTo(bytes); - } - - @Test - void encodeDecodeUrlSafe() { - byte[] bytes = new byte[] { (byte) 0xfb, (byte) 0xf0 }; - assertThat(Base64Utils.encodeUrlSafe(bytes)).isEqualTo("-_A=".getBytes()); - assertThat(Base64Utils.decodeUrlSafe(Base64Utils.encodeUrlSafe(bytes))).isEqualTo(bytes); - - assertThat(Base64Utils.encodeToUrlSafeString(bytes)).isEqualTo("-_A="); - assertThat(Base64Utils.decodeFromUrlSafeString(Base64Utils.encodeToUrlSafeString(bytes))).isEqualTo(bytes); - } - @Test - void emptyInputs() { - assertThat(Base64Utils.encode(new byte[0])).isEmpty(); - assertThat(Base64Utils.encodeToString(new byte[0])).isEmpty(); - assertThat(Base64Utils.encodeUrlSafe(new byte[0])).isEmpty(); - assertThat(Base64Utils.encodeToUrlSafeString(new byte[0])).isEmpty(); - - assertThat(Base64Utils.decode(new byte[0])).isEmpty(); - assertThat(Base64Utils.decodeFromString("")).isEmpty(); - assertThat(Base64Utils.decodeUrlSafe(new byte[0])).isEmpty(); - assertThat(Base64Utils.decodeFromUrlSafeString("")).isEmpty(); - } - -} diff --git a/spring-web/src/main/java/org/springframework/http/converter/json/GsonBuilderUtils.java b/spring-web/src/main/java/org/springframework/http/converter/json/GsonBuilderUtils.java index 4d098ad5877..5b3dbb23132 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/json/GsonBuilderUtils.java +++ b/spring-web/src/main/java/org/springframework/http/converter/json/GsonBuilderUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2023 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. @@ -17,6 +17,7 @@ package org.springframework.http.converter.json; import java.lang.reflect.Type; +import java.util.Base64; import com.google.gson.GsonBuilder; import com.google.gson.JsonDeserializationContext; @@ -26,7 +27,6 @@ import com.google.gson.JsonPrimitive; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; -import org.springframework.util.Base64Utils; /** * A simple utility class for obtaining a Google Gson 2.x {@link GsonBuilder} @@ -36,7 +36,6 @@ import org.springframework.util.Base64Utils; * @author Roy Clarkson * @since 4.1 * @see GsonFactoryBean#setBase64EncodeByteArrays - * @see org.springframework.util.Base64Utils */ public abstract class GsonBuilderUtils { @@ -59,12 +58,12 @@ public abstract class GsonBuilderUtils { @Override public JsonElement serialize(byte[] src, Type typeOfSrc, JsonSerializationContext context) { - return new JsonPrimitive(Base64Utils.encodeToString(src)); + return new JsonPrimitive(Base64.getEncoder().encodeToString(src)); } @Override public byte[] deserialize(JsonElement json, Type type, JsonDeserializationContext cxt) { - return Base64Utils.decodeFromString(json.getAsString()); + return Base64.getDecoder().decode(json.getAsString()); } }