package com.github.culmat.easyjdbc.beans;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.dbutils.BeanProcessor;

public class XBeanProcessor extends BeanProcessor {

  public static interface PostProcessor<T> {
    public T postProcess(T value);
    public Class<T> registerTo();
  }

  Map<Class<?>, PostProcessor<?>> postProcessors = new HashMap<Class<?>, XBeanProcessor.PostProcessor<?>>();

  public XBeanProcessor() {
    super();
  }

  public XBeanProcessor(Map<String, String> columnToPropertyOverrides) {
    super(columnToPropertyOverrides);
  }

  public XBeanProcessor addPostProcessor(PostProcessor<?> processor) {
    postProcessors.put(processor.registerTo(), processor);
    return this;
  }

  @SuppressWarnings("unchecked")
  protected Object processColumn(ResultSet rs, int index, Class<?> propType) throws SQLException {
    final Object ret = super.processColumn(rs, index, propType);
    @SuppressWarnings("rawtypes")
    PostProcessor postProc = postProcessors.get(propType);
    return postProc == null ? ret : postProc.postProcess(ret);
  }

}

@@ -34,19 +34,17 @@
 c.beans;
-%0D%0A%0D
+%0A
 %0Aimport 
@@ -62,17 +62,16 @@
 sultSet;
-%0D
 %0Aimport 
@@ -92,17 +92,16 @@
 ception;
-%0D
 %0Aimport 
@@ -118,17 +118,16 @@
 HashMap;
-%0D
 %0Aimport 
@@ -140,19 +140,17 @@
 til.Map;
-%0D%0A%0D
+%0A
 %0Aimport 
@@ -190,19 +190,17 @@
 ocessor;
-%0D%0A%0D
+%0A
 %0Apublic 
@@ -243,19 +243,17 @@
 cessor %7B
-%0D%0A%0D
+%0A
 %0A  publi
@@ -289,17 +289,16 @@
 sor%3CT%3E %7B
-%0D
 %0A    pub
@@ -324,17 +324,16 @@
  value);
-%0D
 %0A    pub
@@ -342,17 +342,17 @@
 c Class%3C
-T
+?
 %3E regist
@@ -358,24 +358,21 @@
 terTo();
-%0D
 %0A  %7D
-%0D%0A%0D
+%0A
 %0A  Map%3CC
@@ -472,19 +472,17 @@
 r%3C?%3E%3E();
-%0D%0A%0D
+%0A
 %0A  publi
@@ -501,17 +501,16 @@
 ssor() %7B
-%0D
 %0A    sup
@@ -514,24 +514,21 @@
 super();
-%0D
 %0A  %7D
-%0D%0A%0D
+%0A
 %0A  publi
@@ -592,17 +592,16 @@
 rides) %7B
-%0D
 %0A    sup
@@ -630,24 +630,21 @@
 rrides);
-%0D
 %0A  %7D
-%0D%0A%0D
+%0A
 %0A  publi
@@ -706,17 +706,16 @@
 essor) %7B
-%0D
 %0A    pos
@@ -765,17 +765,16 @@
 cessor);
-%0D
 %0A    ret
@@ -782,24 +782,21 @@
 rn this;
-%0D
 %0A  %7D
-%0D%0A%0D
+%0A
 %0A  @Supp
@@ -820,17 +820,16 @@
 hecked%22)
-%0D
 %0A  prote
@@ -919,17 +919,16 @@
 eption %7B
-%0D
 %0A    fin
@@ -980,25 +980,24 @@
 , propType);
-%0D
 %0A    @Suppre
@@ -1018,17 +1018,16 @@
 wtypes%22)
-%0D
 %0A    Pos
@@ -1077,17 +1077,16 @@
 opType);
-%0D
 %0A    ret
@@ -1144,16 +1144,12 @@
 et);
-%0D
 %0A  %7D
-%0D%0A%0D
+%0A
 %0A%7D
-%0D
 %0A

Allow registered and processed classes to differ as BeanProcessor does internal conversation. Useful i.e. for enum types.