org.jdesktop.beansbinding.Converter Maven / Gradle / Ivy
Show all versions of swixml Show documentation
/*
* Copyright (C) 2006-2007 Sun Microsystems, Inc. All rights reserved. Use is
* subject to license terms.
*/
package org.jdesktop.beansbinding;
import java.math.BigInteger;
import java.math.BigDecimal;
/**
* {@code Converter} is responsible for converting a value from one type
* to another.
*
* The conversion methods can throw {@code RuntimeExceptions} in response
* to a problem in conversion. For example, a {@code String} to {@code Integer}
* converter might throw a {@code NumberFormatException} if the {@code String}
* can't be parsed properly into an {@code Integer}.
*
* @param the {@code Converter's} source type
* @param the {@code Converter's} target type
*
* @author Shannon Hickey
* @author Jan Stola
* @author Scott Violet
*/
public abstract class Converter {
/**
* Converts a value from the source type to the target type.
* Can throw a {@code RuntimeException} to indicate a problem
* with the conversion.
*
* @param value the source value to convert
* @return the value, converted to the target type
*/
public abstract T convertForward(S value);
/**
* Converts a value from the target type to the source type.
* Can throw a {@code RuntimeException} to indicate a problem
* with the conversion.
*
* @param value the target value to convert
* @return the value, converted to the source type
*/
public abstract S convertReverse(T value);
static final Converter BYTE_TO_STRING_CONVERTER = new Converter() {
public Object convertForward(Object value) {
return Byte.toString((Byte)value);
}
public Object convertReverse(Object value) {
return Byte.parseByte((String)value);
}
};
static final Converter SHORT_TO_STRING_CONVERTER = new Converter() {
public Object convertForward(Object value) {
return Short.toString((Short)value);
}
public Object convertReverse(Object value) {
return Short.parseShort((String)value);
}
};
static final Converter INT_TO_STRING_CONVERTER = new Converter() {
public Object convertForward(Object value) {
return Integer.toString((Integer)value);
}
public Object convertReverse(Object value) {
return Integer.parseInt((String)value);
}
};
static final Converter LONG_TO_STRING_CONVERTER = new Converter() {
public Object convertForward(Object value) {
return Long.toString((Long)value);
}
public Object convertReverse(Object value) {
return Long.parseLong((String)value);
}
};
static final Converter FLOAT_TO_STRING_CONVERTER = new Converter() {
public Object convertForward(Object value) {
return Float.toString((Float)value);
}
public Object convertReverse(Object value) {
return Float.parseFloat((String)value);
}
};
static final Converter DOUBLE_TO_STRING_CONVERTER = new Converter() {
public Object convertForward(Object value) {
return Double.toString((Double)value);
}
public Object convertReverse(Object value) {
return Double.parseDouble((String)value);
}
};
static final Converter CHAR_TO_STRING_CONVERTER = new Converter() {
public Object convertForward(Object value) {
return ((Character)value).toString();
}
public Object convertReverse(Object value) {
String strVal = (String)value;
if (strVal.length() != 1) {
throw new IllegalArgumentException("String doesn't represent a char");
}
return strVal.charAt(0);
}
};
static final Converter BOOLEAN_TO_STRING_CONVERTER = new Converter() {
public Object convertForward(Object value) {
return ((Boolean)value).toString();
}
public Object convertReverse(Object value) {
return new Boolean((String)value);
}
};
static final Converter INT_TO_BOOLEAN_CONVERTER = new Converter() {
public Object convertForward(Object value) {
if (((Integer)value).intValue() == 0) {
return Boolean.FALSE;
}
return Boolean.TRUE;
}
public Object convertReverse(Object value) {
if (((Boolean)value).booleanValue()) {
return 1;
}
return 0;
}
};
static final Converter BIGINTEGER_TO_STRING_CONVERTER = new Converter() {
public Object convertForward(Object value) {
return ((BigInteger)value).toString();
}
public Object convertReverse(Object value) {
return new BigInteger((String)value);
}
};
static final Converter BIGDECIMAL_TO_STRING_CONVERTER = new Converter() {
public Object convertForward(Object value) {
return ((BigDecimal)value).toString();
}
public Object convertReverse(Object value) {
return new BigDecimal((String)value);
}
};
static final Object defaultConvert(Object source, Class> targetType) {
Class sourceType = source.getClass();
if (sourceType == targetType) {
return source;
}
if (targetType == String.class) {
if (sourceType == Byte.class) {
return BYTE_TO_STRING_CONVERTER.convertForward(source);
} else if (sourceType == Short.class) {
return SHORT_TO_STRING_CONVERTER.convertForward(source);
} else if (sourceType == Integer.class) {
return INT_TO_STRING_CONVERTER.convertForward(source);
} else if (sourceType == Long.class) {
return LONG_TO_STRING_CONVERTER.convertForward(source);
} else if (sourceType == Float.class) {
return FLOAT_TO_STRING_CONVERTER.convertForward(source);
} else if (sourceType == Double.class) {
return DOUBLE_TO_STRING_CONVERTER.convertForward(source);
} else if (sourceType == Boolean.class) {
return BOOLEAN_TO_STRING_CONVERTER.convertForward(source);
} else if (sourceType == Character.class) {
return CHAR_TO_STRING_CONVERTER.convertForward(source);
} else if (sourceType == BigInteger.class) {
return BIGINTEGER_TO_STRING_CONVERTER.convertForward(source);
} else if (sourceType == BigDecimal.class) {
return BIGDECIMAL_TO_STRING_CONVERTER.convertForward(source);
}
} else if (sourceType == String.class) {
if (targetType == Byte.class) {
return BYTE_TO_STRING_CONVERTER.convertReverse(source);
} else if (targetType == Short.class) {
return SHORT_TO_STRING_CONVERTER.convertReverse(source);
} else if (targetType == Integer.class) {
return INT_TO_STRING_CONVERTER.convertReverse(source);
} else if (targetType == Long.class) {
return LONG_TO_STRING_CONVERTER.convertReverse(source);
} else if (targetType == Float.class) {
return FLOAT_TO_STRING_CONVERTER.convertReverse(source);
} else if (targetType == Double.class) {
return DOUBLE_TO_STRING_CONVERTER.convertReverse(source);
} else if (targetType == Boolean.class) {
return BOOLEAN_TO_STRING_CONVERTER.convertReverse(source);
} else if (targetType == Character.class) {
return CHAR_TO_STRING_CONVERTER.convertReverse(source);
} else if (targetType == BigInteger.class) {
return BIGINTEGER_TO_STRING_CONVERTER.convertReverse(source);
} else if (targetType == BigDecimal.class) {
return BIGDECIMAL_TO_STRING_CONVERTER.convertReverse(source);
}
} else if (sourceType == Integer.class && targetType == Boolean.class) {
return INT_TO_BOOLEAN_CONVERTER.convertForward(source);
} else if (sourceType == Boolean.class && targetType == Integer.class) {
return INT_TO_BOOLEAN_CONVERTER.convertReverse(source);
}
return source;
}
}