The dependencies of some of the beans in the application context form a cycle:
┌─────┐
| encode defined in class path resource [com/extenso/bi/backend/crm/config/BaseConversion.class]
↑ ↓
| decode defined in class path resource [com/extenso/bi/backend/crm/config/BaseConversion.class]
└─────┘
@Configuration
public class BaseConversion {
private static final String allowedString "bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ0123456789";
private final char[] allowedCharacters = allowedString.toCharArray();
private final int base = allowedCharacters.length;
@Bean
@Primary
@Qualifier("encode")
public String encode( long id) {
var encodedString = new StringBuilder();
if (id == 0) {
return String.valueOf(allowedCharacters[0]);
}
while (id > 0) {
encodedString.append(allowedCharacters[(int) (id % base)]);
id = id / base;
}
return encodedString.reverse().toString();
}
@Bean
@Qualifier("getCheckSum")
public String getCheckSum(long num) {
int checksumNum = (int) ((num + 5) % (base * base));
String checksum = encode(checksumNum);
if (checksum.length() == 1) {
checksum = encode((checksumNum + 5) % base) + checksum;
}
return checksum;
}
@Bean
@Qualifier("checkShortUrl")
public boolean isShortUrlValid( String shortUrl) {
String checkSum = shortUrl.substring(0, 2);
long decodedBaseUrl = decode(shortUrl.substring(2));
return (checkSum.equals(getCheckSum(decodedBaseUrl)));
}
@Bean
@Qualifier("decode")
public long decode( String baseInput) {
var characters = baseInput.toCharArray();
var length = characters.length;
var decoded = 0;
var counter = 1;
for (char character : characters) {
decoded += allowedString.indexOf(character) * Math.pow(base, length - counter);
counter++;
}
return decoded;
}
}