CommonParser.java

package com.ziesemer.utils.classParser;

import java.io.File;
import java.net.URI;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.TimeZone;
import java.util.UUID;
import java.util.regex.Pattern;

/**
 * @author Mark A. Ziesemer
 * 	<a href="http://www.ziesemer.com">&lt;www.ziesemer.com&gt;</a>
 */
public class CommonParser implements IClassParser{
	
	@Override
	@SuppressWarnings({"unchecked", "rawtypes"})
	public Object convert(final Class<?> c, final String str) throws Exception{
		if(c == Boolean.TYPE){
			return isTrue(str, Boolean.TYPE);
		}else if(c == Boolean.class){
			if(str == null){
				return null;
			}
			final String val = str.trim().toUpperCase();
			if("".equals(val)
					|| "NULL".equals(val)){
				return null;
			}
			return isTrue(val, Boolean.class);
		}else if(c == Character.TYPE
				|| c == Character.class){
			if(str.length() != 1){
				throw new ClassParseException(
					"String must be a single character", c, str);
			}
			return Character.valueOf(str.charAt(0));
		}else if(c == String.class
				|| c == CharSequence.class){
			return str;
		}else if(c == File.class){
			return new File(str);
		}else if(c == URL.class){
			return new URL(str);
		}else if(c == URI.class){
			return new URI(str);
		}else if(c == UUID.class){
			return UUID.fromString(str);
		}else if(c == Charset.class){
			return Charset.forName(str);
		}else if(c == TimeZone.class){
			return TimeZone.getTimeZone(str);
		}else if(c.isEnum()){
			return Enum.valueOf((Class<? extends Enum>)c, str);
		}else if(c == Pattern.class){
			return Pattern.compile(str);
		}else if(c == Class.class){
			return Class.forName(str);
		}else if(c == Object.class){
			final Class<?> newClass = Class.forName(str);
			return newClass.newInstance();
		}
		return NO_RESULT;
	}
	
	protected static boolean isTrue(final Object value, final Class<?> c){
		if(value == null){
			throw new ClassParseException("Unrecognized value", c, null);
		}
		final String val = value.toString().trim().toUpperCase();
		if("Y".equals(val)
				|| "YES".equals(val)
				|| "T".equals(val)
				|| "TRUE".equals(val)
				|| "1".equals(val)
				|| "-1".equals(val)
				|| "X".equals(val)){
			return true;
		}
		if("N".equals(val)
				|| "NO".equals(val)
				|| "F".equals(val)
				|| "FALSE".equals(val)
				|| "0".equals(val)){
			return false;
		}
		throw new ClassParseException("Unrecognized value", c, val);
	}
}