/*
* Copyright (c) 2010 Mysema Ltd.
* All rights reserved.
*
*/
package com.mysema.rdfbean.xsd;
import java.util.HashMap;
import java.util.Map;
import com.google.common.primitives.Primitives;
import com.mysema.converters.BigDecimalConverter;
import com.mysema.converters.BigIntegerConverter;
import com.mysema.converters.BlobConverter;
import com.mysema.converters.BooleanConverter;
import com.mysema.converters.ByteConverter;
import com.mysema.converters.CalendarConverter;
import com.mysema.converters.CharacterConverter;
import com.mysema.converters.Converter;
import com.mysema.converters.DateConverter;
import com.mysema.converters.DateTimeConverter;
import com.mysema.converters.DoubleConverter;
import com.mysema.converters.FloatConverter;
import com.mysema.converters.IntegerConverter;
import com.mysema.converters.LocalDateConverter;
import com.mysema.converters.LocalTimeConverter;
import com.mysema.converters.LongConverter;
import com.mysema.converters.ShortConverter;
import com.mysema.converters.TimeConverter;
import com.mysema.converters.TimestampConverter;
import com.mysema.converters.URIConverter;
import com.mysema.converters.UtilDateConverter;
import com.mysema.rdfbean.model.UID;
import com.mysema.rdfbean.model.XSD;
/**
* @author tiwe
*/
public class ConverterRegistryImpl implements ConverterRegistry {
public static final ConverterRegistry DEFAULT = new ConverterRegistryImpl();
private final Map<Class<?>, Converter<?>> classToConverter = new HashMap<Class<?>, Converter<?>>();
private final Map<Class<?>, UID> classToType = new HashMap<Class<?>, UID>();
private final Map<UID, Class<?>> typeToClass = new HashMap<UID, Class<?>>();
public ConverterRegistryImpl() {
register(XSD.anyURI, new URIConverter());
register(XSD.booleanType, new BooleanConverter());
register(XSD.hexBinary, new BlobConverter());
register(XSD.byteType, new ByteConverter());
register(XSD.date, new LocalDateConverter());
register(XSD.date, new DateConverter());
register(XSD.dateTime, new DateTimeConverter());
register(XSD.dateTime, new CalendarConverter());
register(XSD.dateTime, new TimestampConverter());
register(XSD.dateTime, new UtilDateConverter());
register(XSD.decimalType, new BigDecimalConverter());
register(XSD.doubleType, new DoubleConverter());
// duration
register(XSD.floatType, new FloatConverter());
// gDay
// gMonth
// gMonthDay
// gYear
register(XSD.gYear, new YearConverter());
// gYearMonth
register(XSD.integerType, new BigIntegerConverter());
register(XSD.intType, new IntegerConverter());
register(XSD.longType, new LongConverter());
register(XSD.shortType, new ShortConverter());
register(XSD.stringType, String.class);
register(XSD.stringType, new CharacterConverter());
register(XSD.time, new LocalTimeConverter());
register(XSD.time, new TimeConverter());
register(XSD.stringType, new LocaleConverter());
}
@Override
@SuppressWarnings("unchecked")
public <T> T fromString(String value, Class<T> requiredType) {
if (requiredType.equals(String.class)) {
return (T) value;
}
Converter<T> converter = (Converter<T>) classToConverter.get(requiredType);
if (converter != null) {
return converter.fromString(value);
} else {
throw new IllegalArgumentException("No conversion for " + requiredType.getName() + " available");
}
}
@Override
public UID getDatatype(Class<?> javaClass) {
return classToType.get(javaClass);
}
private <T> void register(UID type, Class<T> clazz) {
classToType.put(clazz, type);
if (!clazz.isPrimitive()) {
typeToClass.put(type, clazz);
}
}
private <T> void register(UID type, Converter<T> converter) {
register(type, converter.getJavaType());
classToConverter.put(converter.getJavaType(), converter);
Class<?> primitiveType = Primitives.unwrap(converter.getJavaType());
if (!primitiveType.equals(converter.getJavaType())) {
register(type, primitiveType);
classToConverter.put(primitiveType, converter);
}
}
@Override
public boolean supports(Class<?> cl) {
return classToType.containsKey(cl);
}
@Override
@SuppressWarnings("unchecked")
public <T> String toString(T javaValue) {
if (javaValue instanceof String) {
return (String) javaValue;
}
Converter<T> converter = (Converter<T>) classToConverter.get(javaValue.getClass());
if (converter != null) {
return converter.toString(javaValue);
} else {
throw new IllegalArgumentException("No conversion for " + javaValue.getClass().getName() + " available");
}
}
@Override
public Class<?> getClass(UID datatype) {
return typeToClass.get(datatype);
}
}