All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.hibernate.jpa.internal.util.PessimisticNumberParser Maven / Gradle / Ivy

There is a newer version: 7.0.0.Alpha1
Show newest version
/*
 * 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;
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy