/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2010-2011, Red Hat, Inc. and/or its affiliates or third-party contributors as
* indicated by the @author tags or express copyright attribution
* statements applied by the authors. All third-party contributions are
* distributed under license by Red Hat, Inc.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
* Lesser General Public License, as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution; if not, write to:
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.hibernate.search.util.configuration.impl;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Properties;
import org.hibernate.annotations.common.util.StringHelper;
import org.hibernate.search.SearchException;
/**
* Helper class:
* - to avoid managing NumberFormatException and similar code
* - ensure consistent error messages across Configuration parsing problems
* - locate resources
*
* @author Sanne Grinovero
* @author Steve Ebersole
* @author Emmanuel Bernard <emmanuel@hibernate.org>
*/
public abstract class ConfigurationParseHelper {
/**
* Try to locate a local URL representing the incoming path. The first attempt
* assumes that the incoming path is an actual URL string (file://, etc). If this
* does not work, then the next attempts try to locate this UURL as a java system
* resource.
*
* @param path The path representing the config location.
* @return An appropriate URL or null.
*/
public static URL locateConfig(final String path) {
try {
return new URL(path);
}
catch(MalformedURLException e) {
return findAsResource(path);
}
}
/**
* Try to locate a local URL representing the incoming path.
* This method <b>only</b> attempts to locate this URL as a
* java system resource.
*
* @param path The path representing the config location.
* @return An appropriate URL or null.
*/
public static URL findAsResource(final String path) {
URL url = null;
// First, try to locate this resource through the current
// context classloader.
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
if (contextClassLoader!=null) {
url = contextClassLoader.getResource(path);
}
if (url != null)
return url;
// Next, try to locate this resource through this class's classloader
url = ConfigurationParseHelper.class.getClassLoader().getResource(path);
if (url != null)
return url;
// Next, try to locate this resource through the system classloader
url = ClassLoader.getSystemClassLoader().getResource(path);
// Anywhere else we should look?
return url;
}
/**
* Parses a String to get an int value.
*
* @param value A string containing an int value to parse
* @param errorMsgOnParseFailure message being wrapped in a SearchException if value is null or not correct.
* @return the parsed value
* @throws SearchException both for null values and for Strings not containing a valid int.
*/
public static final int parseInt(String value, String errorMsgOnParseFailure) {
if ( value == null ) {
throw new SearchException( errorMsgOnParseFailure );
}
else {
try {
return Integer.parseInt( value.trim() );
} catch (NumberFormatException nfe) {
throw new SearchException( errorMsgOnParseFailure, nfe );
}
}
}
/**
* In case value is null or an empty string the defValue is returned
* @param value
* @param defValue
* @param errorMsgOnParseFailure
* @return the converted int.
* @throws SearchException if value can't be parsed.
*/
public static final int parseInt(String value, int defValue, String errorMsgOnParseFailure) {
if ( StringHelper.isEmpty( value ) ) {
return defValue;
}
else {
return parseInt( value, errorMsgOnParseFailure );
}
}
/**
* Looks for a numeric value in the Properties, returning
* defValue if not found or if an empty string is found.
* When the key the value is found but not in valid format
* a standard error message is generated.
* @param cfg
* @param key
* @param defValue
* @return the converted int.
* @throws SearchException for invalid format.
*/
public static final int getIntValue(Properties cfg, String key, int defValue) {
String propValue = cfg.getProperty( key );
return parseInt( propValue, defValue, "Unable to parse " + key + ": " + propValue );
}
/**
* Parses a string to recognize exactly either "true" or "false".
*
* @param value the string to be parsed
* @param errorMsgOnParseFailure the message to be put in the exception if thrown
* @return true if value is "true", false if value is "false"
* @throws SearchException for invalid format or values.
*/
public static final boolean parseBoolean(String value, String errorMsgOnParseFailure) {
// avoiding Boolean.valueOf() to have more checks: makes it easy to spot wrong type in cfg.
if ( value == null ) {
throw new SearchException( errorMsgOnParseFailure );
}
else if ( "false".equalsIgnoreCase( value.trim() ) ) {
return false;
}
else if ( "true".equalsIgnoreCase( value.trim() ) ) {
return true;
}
else {
throw new SearchException( errorMsgOnParseFailure );
}
}
/**
* Extracts a boolean value from configuration properties
*
* @param cfg configuration Properties
* @param key the property key
* @param defaultValue a boolean.
* @return the defaultValue if the property was not defined
* @throws SearchException for invalid format or values.
*/
public static final boolean getBooleanValue(Properties cfg, String key, boolean defaultValue) {
String propValue = cfg.getProperty( key );
if ( propValue == null ) {
return defaultValue;
}
else {
return parseBoolean( propValue, "Property '" + key + "' needs to be either literal 'true' or 'false'" );
}
}
/**
* Get the string property or defaults if not present
*/
public static final String getString(Properties cfg, String key, String defaultValue) {
String propValue = cfg.getProperty( key );
return propValue == null ? defaultValue : propValue;
}
}