/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* 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.
*
* Copyright (c) 2001 - 2013 Object Refinery Ltd, Pentaho Corporation and Contributors.. All rights reserved.
*/
package org.pentaho.reporting.libraries.xmlns.common;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.pentaho.reporting.libraries.xmlns.LibXmlBoot;
import org.pentaho.reporting.libraries.xmlns.parser.ParseException;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
/**
* Basic helper functions to ease up the process of parsing.
*
* @author Thomas Morgner
*/
public class ParserUtil {
private static final Log logger = LogFactory.getLog( ParserUtil.class );
private static boolean strictParsing;
static {
strictParsing = "true".equals( LibXmlBoot.getInstance().getGlobalConfig().getConfigProperty
( "org.pentaho.reporting.libraries.xmlns.StrictParseMode" ) );
}
/**
* Private constructors prevent initializations of utility classes.
*/
private ParserUtil() {
}
/**
* Parses the string <code>text</code> into an int. If text is null or does not contain a parsable value, the message
* given in <code>message</code> is used to throw a SAXException.
*
* @param text the text to parse.
* @param message the error message if parsing fails.
* @param locator the SAX locator to print meaningfull error messages.
* @return the int value.
* @throws SAXException if there is a problem with the parsing.
*/
public static int parseInt( final String text,
final String message,
final Locator locator )
throws SAXException {
if ( text == null ) {
throw new SAXException( message );
}
try {
return Integer.parseInt( text );
} catch ( NumberFormatException nfe ) {
throw new ParseException( "NumberFormatError: " + message, locator );
}
}
/**
* Parses the string <code>text</code> into an int. If text is null or does not contain a parsable value, the message
* given in <code>message</code> is used to throw a SAXException.
*
* @param text the text to parse.
* @param message the error message if parsing fails.
* @return the int value.
* @throws SAXException if there is a problem with the parsing.
*/
public static int parseInt( final String text, final String message )
throws SAXException {
if ( text == null ) {
throw new SAXException( message );
}
try {
return Integer.parseInt( text );
} catch ( NumberFormatException nfe ) {
throw new SAXException( "NumberFormatError: " + message );
}
}
/**
* Parses an integer.
*
* @param text the text to parse.
* @param defaultVal the default value.
* @return the integer.
*/
public static int parseInt( final String text, final int defaultVal ) {
if ( text == null ) {
return defaultVal;
}
try {
return Integer.parseInt( text );
} catch ( NumberFormatException nfe ) {
return defaultVal;
}
}
/**
* Parses the string <code>text</code> into an float. If text is null or does not contain a parsable value, the
* message given in <code>message</code> is used to throw a SAXException.
*
* @param text the text to parse.
* @param message the error message if parsing fails.
* @param locator the SAX locator to print meaningfull error messages.
* @return the float value.
* @throws ParseException if the text is no valid float number.
*/
public static float parseFloat( final String text,
final String message,
final Locator locator )
throws ParseException {
if ( text == null ) {
throw new ParseException( message, locator );
}
try {
return Float.parseFloat( text );
} catch ( NumberFormatException nfe ) {
throw new ParseException( "NumberFormatError: " + message, locator );
}
}
/**
* Parses the string <code>text</code> into an float. If text is null or does not contain a parsable value, the
* message given in <code>message</code> is used to throw a SAXException.
*
* @param text the text to parse.
* @param message the error message if parsing fails.
* @return the float value.
* @throws SAXException if there is a problem with the parsing.
*/
public static float parseFloat( final String text, final String message )
throws SAXException {
if ( text == null ) {
throw new SAXException( message );
}
try {
return Float.parseFloat( text );
} catch ( NumberFormatException nfe ) {
throw new SAXException( "NumberFormatError: " + message );
}
}
/**
* Parses the string <code>text</code> into an float. If text is null or does not contain a parsable value, the
* message given in <code>message</code> is used to throw a SAXException.
*
* @param text the text to parse.
* @param defaultVal the defaultValue returned if parsing fails.
* @return the float value.
*/
public static float parseFloat( final String text, final float defaultVal ) {
if ( text == null ) {
return defaultVal;
}
try {
return Float.parseFloat( text );
} catch ( NumberFormatException nfe ) {
return defaultVal;
}
}
/**
* Parses a boolean. If the string <code>text</code> contains the value of "true", the true value is returned, else
* false is returned.
*
* @param text the text to parse.
* @param defaultVal the default value.
* @return a boolean.
*/
public static boolean parseBoolean( final String text,
final boolean defaultVal ) {
if ( text == null ) {
return defaultVal;
}
if ( strictParsing ) {
return "true".equals( text );
} else {
if ( text.equals( "true" ) ) {
return true;
} else if ( text.equals( "false" ) ) {
return false;
}
logger.warn( "Invalid value encountered: Expected 'true' or 'false', but got '" + text + "'" );
return "true".equalsIgnoreCase( text );
}
}
/**
* Translates an boolean string ("true" or "false") into the corresponding Boolean object.
*
* @param value the string that represents the boolean.
* @param locator the SAX locator to print meaningfull error messages.
* @return Boolean.TRUE or Boolean.FALSE
* @throws ParseException if an parse error occured or the string is not 'true' or 'false'.
*/
public static Boolean parseBoolean( final String value, final Locator locator )
throws ParseException {
if ( value == null ) {
return null;
}
if ( "true".equals( value ) ) {
return Boolean.TRUE;
} else if ( "false".equals( value ) ) {
return Boolean.FALSE;
}
if ( strictParsing ) {
throw new ParseException( "Failed to parse: Expected 'true' or 'false'", locator );
}
if ( locator == null ) {
logger.warn( "Invalid value encountered for boolean attribute." );
} else {
logger.warn( "Invalid value encountered for boolean attribute. [Line: " +
locator.getLineNumber() + " Column: " + locator.getColumnNumber() + "]" );
}
return Boolean.FALSE;
}
/**
* Parses a string. If the <code>text</code> is null, defaultval is returned.
*
* @param text the text to parse.
* @param defaultVal the default value.
* @return a string.
*/
public static String parseString( final String text, final String defaultVal ) {
if ( text == null ) {
return defaultVal;
}
return text;
}
}