org.hibernate.jpa.internal.util.PessimisticNumberParser Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of hibernate-core Show documentation
Show all versions of hibernate-core Show documentation
Hibernate's core ORM functionality
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or .
*/
package org.hibernate.jpa.internal.util;
/**
* An old-style query might pass positional numbers of Query parameters as strings. This implies we always need to
* attempt parsing string parameters to see if this deprecated feature is being used, but parsing leads to catching (and
* ignoring) NumberFormatException at runtime which is a performance problem, especially as the parse would fail
* each time a non-deprecated form is processed.
* This class is meant to avoid the need to allocate these exceptions at runtime.
*
* Use this class to convert String to Integer when it's unlikely to be successful: if you expect it to be a normal number,
* for example when a non successful parsing would be an error, using this utility is just an overhead.
*
* @author Sanne Grinovero
*/
public final class PessimisticNumberParser {
private PessimisticNumberParser() {
//not to be constructed
}
public static Integer toNumberOrNull(final String parameterName) {
if ( isValidNumber( parameterName ) ) {
try {
return Integer.valueOf( parameterName );
}
catch (NumberFormatException e) {
//It wasn't valid after all, so return null
}
}
return null;
}
private static boolean isValidNumber(final String parameterName) {
if ( parameterName.length() == 0 ) {
return false;
}
final char firstDigit = parameterName.charAt( 0 );
if ( Character.isDigit( firstDigit ) || '-' == firstDigit || '+' == firstDigit ) {
//check the remaining characters
for ( int i = 1; i < parameterName.length(); i++ ) {
if ( !Character.isDigit( parameterName.charAt( i ) ) ) {
return false;
}
}
//Some edge cases are left open: just a sign would return true.
//For those cases you'd have a NumberFormatException swallowed.
return true;
}
return false;
}
}