/sitebricks-converter/src/main/java/com/google/sitebricks/conversion/MvelConversionHandlers.java

http://github.com/dhanji/sitebricks · Java · 69 lines · 51 code · 14 blank · 4 comment · 5 complexity · 65a23421f0661a9879768ed3d7eba686 MD5 · raw file

  1. package com.google.sitebricks.conversion;
  2. import java.lang.reflect.ParameterizedType;
  3. import java.lang.reflect.Type;
  4. import java.util.Collection;
  5. import org.mvel2.ConversionHandler;
  6. import org.mvel2.DataConversion;
  7. import com.google.common.primitives.Primitives;
  8. import com.google.inject.Inject;
  9. import com.google.sitebricks.conversion.generics.Generics;
  10. /**
  11. * @author John Patterson (jdpatterson@gmail.com)
  12. */
  13. public class MvelConversionHandlers {
  14. private TypeConverter delegate;
  15. private ConverterRegistry registry;
  16. @Inject
  17. public void prepare(ConverterRegistry registry, TypeConverter delegate) {
  18. this.registry = registry;
  19. this.delegate = delegate;
  20. Collection<Converter<?, ?>> converters = registry.getConvertersBySource().values();
  21. for (Converter<?, ?> converter : converters) {
  22. ParameterizedType converterType = (ParameterizedType) Generics.getExactSuperType(
  23. converter.getClass(), Converter.class);
  24. Type[] converterParameters = converterType.getActualTypeArguments();
  25. registerMvelHandler(converterParameters[0]);
  26. registerMvelHandler(converterParameters[1]);
  27. }
  28. }
  29. private void registerMvelHandler(Type targetType) {
  30. Class<?> targetClass = Generics.erase(targetType);
  31. SitebricksConversionHandler targetHandler = new SitebricksConversionHandler(targetType);
  32. DataConversion.addConversionHandler(targetClass, targetHandler);
  33. if (Primitives.isWrapperType(targetClass)) {
  34. DataConversion.addConversionHandler(Primitives.unwrap(targetClass), targetHandler);
  35. }
  36. }
  37. private class SitebricksConversionHandler implements ConversionHandler {
  38. private final Type targetType;
  39. public SitebricksConversionHandler(Type targetType) {
  40. this.targetType = targetType;
  41. }
  42. @Override
  43. public Object convertFrom(Object in) {
  44. return delegate.convert(in, targetType);
  45. }
  46. @SuppressWarnings("unchecked")
  47. @Override
  48. public boolean canConvertFrom(@SuppressWarnings("rawtypes") Class cls) {
  49. if (cls == targetType)
  50. return true;
  51. // check that there is a converter registered for this source type
  52. return registry.converter(Primitives.wrap(cls), targetType) != null;
  53. }
  54. }
  55. }