Streamline UUIDConverter
* Use `StandardCharsets.UTF_8` as a charset configuration instead of string. Later remove the necessity of handling encoder errors. * Use regular expressions to validate the `UUID` string standard representation. Later obsolete the need for try/catch exceptions. * Deprecate `UUIDConverter.DEFAULT_CHARSET` since it is out of use. **Cherry-pick to `6.1.x` & `6.0.x`**
This commit is contained in:
@@ -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");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -19,8 +19,9 @@ package org.springframework.integration.util;
|
|||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.ObjectOutputStream;
|
import java.io.ObjectOutputStream;
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import org.springframework.core.convert.converter.Converter;
|
import org.springframework.core.convert.converter.Converter;
|
||||||
import org.springframework.util.ClassUtils;
|
import org.springframework.util.ClassUtils;
|
||||||
@@ -30,16 +31,22 @@ import org.springframework.util.ClassUtils;
|
|||||||
*
|
*
|
||||||
* @author Dave Syer
|
* @author Dave Syer
|
||||||
* @author Gary Russell
|
* @author Gary Russell
|
||||||
|
* @author Christian Tzolov
|
||||||
*/
|
*/
|
||||||
public class UUIDConverter implements Converter<Object, UUID> {
|
public class UUIDConverter implements Converter<Object, UUID> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated since 6.0.8 as it is not used internally by the UUIDConverter. The internal implementation relies, now,
|
||||||
|
* on StandardCharsets.UTF_8 instead.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
public static final String DEFAULT_CHARSET = "UTF-8";
|
public static final String DEFAULT_CHARSET = "UTF-8";
|
||||||
|
|
||||||
|
private static final Pattern UUID_REGEX = Pattern
|
||||||
|
.compile("^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert the input to a UUID using the convenience method
|
* Convert the input to a UUID using the convenience method {@link #getUUID(Object)}.
|
||||||
* {@link #getUUID(Object)}.
|
|
||||||
*
|
|
||||||
* @see org.springframework.core.convert.converter.Converter#convert(java.lang.Object)
|
* @see org.springframework.core.convert.converter.Converter#convert(java.lang.Object)
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
@@ -52,17 +59,12 @@ public class UUIDConverter implements Converter<Object, UUID> {
|
|||||||
* <ul>
|
* <ul>
|
||||||
* <li>null: returns null</li>
|
* <li>null: returns null</li>
|
||||||
* <li>a UUID: returns the input unchanged</li>
|
* <li>a UUID: returns the input unchanged</li>
|
||||||
* <li>a String formatted as a UUID: returns the result of
|
* <li>a String formatted as a UUID: returns the result of {@link UUID#fromString(String)}</li>
|
||||||
* {@link UUID#fromString(String)}</li>
|
* <li>any other String: returns {@link UUID#nameUUIDFromBytes(byte[])} with bytes generated from the input</li>
|
||||||
* <li>any other String: returns {@link UUID#nameUUIDFromBytes(byte[])} with
|
* <li>a primitive or primitive wrapper: converts to a String ans then uses the previous conversion method</li>
|
||||||
* bytes generated from the input</li>
|
* <li>Serializable: returns the {@link UUID#nameUUIDFromBytes(byte[])} with the serialized bytes of the input</li>
|
||||||
* <li>a primitive or primitive wrapper: converts to a String ans then uses
|
|
||||||
* the previous conversion method</li>
|
|
||||||
* <li>Serializable: returns the {@link UUID#nameUUIDFromBytes(byte[])} with
|
|
||||||
* the serialized bytes of the input</li>
|
|
||||||
* </ul>
|
* </ul>
|
||||||
* If none of the above applies there will be an exception trying to serialize.
|
* If none of the above applies there will be an exception trying to serialize.
|
||||||
*
|
|
||||||
* @param input an Object
|
* @param input an Object
|
||||||
* @return a UUID constructed from the input
|
* @return a UUID constructed from the input
|
||||||
*/
|
*/
|
||||||
@@ -74,28 +76,16 @@ public class UUIDConverter implements Converter<Object, UUID> {
|
|||||||
return (UUID) input;
|
return (UUID) input;
|
||||||
}
|
}
|
||||||
if (input instanceof String) {
|
if (input instanceof String) {
|
||||||
try {
|
String inputText = (String) input;
|
||||||
return UUID.fromString((String) input);
|
if (isValidUuidStringRepresentation(inputText)) {
|
||||||
|
return UUID.fromString(inputText);
|
||||||
}
|
}
|
||||||
catch (Exception e) {
|
else {
|
||||||
try {
|
return UUID.nameUUIDFromBytes((inputText).getBytes(StandardCharsets.UTF_8));
|
||||||
return UUID.nameUUIDFromBytes(((String) input).getBytes(DEFAULT_CHARSET));
|
|
||||||
}
|
|
||||||
catch (UnsupportedEncodingException ex) {
|
|
||||||
IllegalStateException exception =
|
|
||||||
new IllegalStateException("Cannot convert String using charset=" + DEFAULT_CHARSET, ex);
|
|
||||||
exception.addSuppressed(e);
|
|
||||||
throw exception; // NOSONAR - added to suppressed exceptions
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ClassUtils.isPrimitiveOrWrapper(input.getClass())) {
|
if (ClassUtils.isPrimitiveOrWrapper(input.getClass())) {
|
||||||
try {
|
return UUID.nameUUIDFromBytes(input.toString().getBytes(StandardCharsets.UTF_8));
|
||||||
return UUID.nameUUIDFromBytes(input.toString().getBytes(DEFAULT_CHARSET));
|
|
||||||
}
|
|
||||||
catch (UnsupportedEncodingException e) {
|
|
||||||
throw new IllegalStateException("Cannot convert primitive using charset=" + DEFAULT_CHARSET, e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
byte[] bytes = serialize(input);
|
byte[] bytes = serialize(input);
|
||||||
return UUID.nameUUIDFromBytes(bytes);
|
return UUID.nameUUIDFromBytes(bytes);
|
||||||
@@ -115,4 +105,8 @@ public class UUIDConverter implements Converter<Object, UUID> {
|
|||||||
return stream.toByteArray();
|
return stream.toByteArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static boolean isValidUuidStringRepresentation(String uuid) {
|
||||||
|
return UUID_REGEX.matcher(uuid).matches();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user