diff --git a/acl/src/main/java/org/springframework/security/acls/jdbc/AclClassIdUtils.java b/acl/src/main/java/org/springframework/security/acls/jdbc/AclClassIdUtils.java index 677dbb5cb8c..62461b28d4a 100644 --- a/acl/src/main/java/org/springframework/security/acls/jdbc/AclClassIdUtils.java +++ b/acl/src/main/java/org/springframework/security/acls/jdbc/AclClassIdUtils.java @@ -16,6 +16,7 @@ package org.springframework.security.acls.jdbc; import java.io.Serializable; +import java.math.BigInteger; import java.sql.ResultSet; import java.sql.SQLException; import java.util.UUID; @@ -45,6 +46,7 @@ class AclClassIdUtils { GenericConversionService genericConversionService = new GenericConversionService(); genericConversionService.addConverter(String.class, Long.class, new StringToLongConverter()); genericConversionService.addConverter(String.class, UUID.class, new StringToUUIDConverter()); + genericConversionService.addConverter(BigInteger.class, Long.class, new BigIntegerToLongConverter()); this.conversionService = genericConversionService; } @@ -62,8 +64,9 @@ class AclClassIdUtils { * @throws SQLException */ Serializable identifierFrom(Serializable identifier, ResultSet resultSet) throws SQLException { - if (isString(identifier) && hasValidClassIdType(resultSet) - && canConvertFromStringTo(classIdTypeFrom(resultSet))) { + if (isString(identifier) + && hasValidClassIdType(resultSet) + && canConvertFromStringTo(classIdTypeFrom(resultSet))) { identifier = convertFromStringTo((String) identifier, classIdTypeFrom(resultSet)); } else { @@ -100,6 +103,10 @@ private Class classIdTypeFrom(String className) { return targetType; } + private boolean canConvert(Class sourceType, Class targetType) { + return conversionService.canConvert(sourceType, targetType); + } + private boolean canConvertFromStringTo(Class targetType) { return conversionService.canConvert(String.class, targetType); } @@ -118,7 +125,7 @@ private T convertFromStringTo(String identifier, Class< */ private Long convertToLong(Serializable identifier) { Long idAsLong; - if (canConvertFromStringTo(Long.class)) { + if (canConvert(identifier.getClass(), Long.class)) { idAsLong = conversionService.convert(identifier, Long.class); } else { idAsLong = Long.valueOf(identifier.toString()); @@ -158,4 +165,16 @@ public UUID convert(String identifierAsString) { return UUID.fromString(identifierAsString); } } + + private static class BigIntegerToLongConverter implements Converter { + @Override + public Long convert(BigInteger identifierAsStringBigInteger) { + if (identifierAsStringBigInteger == null) { + throw new ConversionFailedException(TypeDescriptor.valueOf(BigInteger.class), + TypeDescriptor.valueOf(Long.class), null, null); + + } + return identifierAsStringBigInteger.longValue(); + } + } } diff --git a/acl/src/test/java/org/springframework/security/acls/jdbc/AclClassIdUtilsTest.java b/acl/src/test/java/org/springframework/security/acls/jdbc/AclClassIdUtilsTest.java index 65e7fd83fc3..55f13d18a0d 100644 --- a/acl/src/test/java/org/springframework/security/acls/jdbc/AclClassIdUtilsTest.java +++ b/acl/src/test/java/org/springframework/security/acls/jdbc/AclClassIdUtilsTest.java @@ -24,6 +24,7 @@ import org.springframework.core.convert.ConversionService; import java.io.Serializable; +import java.math.BigInteger; import java.sql.ResultSet; import java.sql.SQLException; import java.util.UUID; @@ -40,6 +41,7 @@ public class AclClassIdUtilsTest { private static final Long DEFAULT_IDENTIFIER = 999L; private static final String DEFAULT_IDENTIFIER_AS_STRING = DEFAULT_IDENTIFIER.toString(); + private static final BigInteger DEFAULT_IDENTIFIER_AS_BIGINT = BigInteger.valueOf( DEFAULT_IDENTIFIER ); @Mock private ResultSet resultSet; @@ -74,6 +76,15 @@ public void shouldReturnLongIfClassIdTypeIsNull() throws SQLException { assertThat(newIdentifier).isEqualTo(DEFAULT_IDENTIFIER); } + @Test + public void shouldReturnLongIfIdentifierIsBigInteger() throws SQLException { + // when + Serializable newIdentifier = aclClassIdUtils.identifierFrom(DEFAULT_IDENTIFIER_AS_BIGINT, resultSet); + + // then + assertThat(newIdentifier).isEqualTo(DEFAULT_IDENTIFIER); + } + @Test public void shouldReturnLongIfNoClassIdTypeColumn() throws SQLException { // given