// Path: src/com/njkremer/Sqlite/JoinExecutor.java
// public enum JoinType {
//     INNER("inner "), 
//     LEFT_OUTER("left outer "), 
//     RIGHT_OUTER("right outer ");
//         
//     JoinType(String sql) {
//         this.sql = sql;
//     }
//         
//     public String getSql() {
//         return sql;
//     }
// 
//     private String sql;
// }
// 
// Path: src/com/njkremer/Sqlite/utils/DateUtils.java
// public class DateUtils {
//     
//     public static Date getDateFromDatabaseFormattedString(String iso8601DateString) throws DataConnectionException {
//         try {
//             return DATE_FORMAT.parse(iso8601DateString);
//         }
//         catch (ParseException e) {
//             throw new DataConnectionException(String.format("Error could not parse a date from the supplied string '%s' make sure it's in the form 'yyyy-MM-dd HH:mm:ss'", iso8601DateString));
//         }
//     }
//     
//     public static String getDatabaseFormattedStringFromDate(Date date) {
//         return DATE_FORMAT.format(date);
//     }
// 
//     private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
// }
// 
// Path: src/com/njkremer/Sqlite/utils/SqliteUtils.java
// public class SqliteUtils {
//     public static Class<?> getClass(Object object) {
//         return AopUtils.getTargetClass(object);
//     }
//     
//     public static String capitalize(String word) {
//         return word.substring(0, 1).toUpperCase() + word.substring(1);
//     }
//     
//     public static String lowercase(String word) {
//         return word.substring(0, 1).toLowerCase() + word.substring(1);
//     }
//     
//     public static boolean isEmpty(Object object) {
//         if(object == null) {
//             return true;
//         }
//         if (object instanceof String) {
//             return ((String) object).trim().length() == 0;
//         }
//         else if (object instanceof Float) {
//             return ((Float) object) == 0.0f;
//         }
//         else if (object instanceof Integer) {
//             return ((Integer) object) == 0;
//         }
//         else if (object instanceof Long) {
//             return ((Long) object) == 0l;
//         }
//         else if (object instanceof Double) {
//             return ((Double) object) == 0.0d;
//         }
//         else if (object instanceof Boolean) {
//             return ((Boolean) object) == false;
//         }
//         return false;
//     }
// }


import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.log4j.Logger;
import org.springframework.aop.framework.ProxyFactory;
import com.njkremer.Sqlite.Annotations.AutoIncrement;
import com.njkremer.Sqlite.Annotations.OneToMany;
import com.njkremer.Sqlite.Annotations.PrimaryKey;
import com.njkremer.Sqlite.JoinExecutor.JoinType;
import com.njkremer.Sqlite.utils.DateUtils;
import com.njkremer.Sqlite.utils.SqliteUtils;
            logger.error(e.getErrorCode());
            if (e.getMessage().contains("PRIMARY KEY must be unique")) {
                throw new DataConnectionException("A @PrimaryKey needs to be defined on the class '" + this.clazz.getSimpleName() + "' , since there is a primary key in the database.", e);
            }
            throw new DataConnectionException("Error executing sql statement", e);
        }
        catch (Exception e) {
            throw new DataConnectionException("Error executing sql statement", e);
        }
    }

    private void processColumn(Object object, String columnName, ResultSet resultSet) throws SQLException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, NoSuchFieldException, DataConnectionException {
        Object value = null;
        Class<?> type = clazz.getDeclaredField(columnName).getType();
        if (type == String.class) {
            value = resultSet.getString(columnName);
        }
        else if (type == Float.class || type == Float.TYPE) {
            value = resultSet.getFloat(columnName);
        }
        else if (type == Integer.class || type == Integer.TYPE) {
            value = resultSet.getInt(columnName);
        }
        else if (type == Double.class || type == Double.TYPE) {
            value = resultSet.getDouble(columnName);
        }
        else if (type == Boolean.class || type == Boolean.TYPE) {
            value = resultSet.getBoolean(columnName);
        }
        else if (type == Date.class) {
// Path: src/com/njkremer/Sqlite/JoinExecutor.java
// public enum JoinType {
//     INNER("inner "), 
//     LEFT_OUTER("left outer "), 
//     RIGHT_OUTER("right outer ");
//         
//     JoinType(String sql) {
//         this.sql = sql;
//     }
//         
//     public String getSql() {
//         return sql;
//     }
// 
//     private String sql;
// }
// 
// Path: src/com/njkremer/Sqlite/utils/DateUtils.java
// public class DateUtils {
//     
//     public static Date getDateFromDatabaseFormattedString(String iso8601DateString) throws DataConnectionException {
//         try {
//             return DATE_FORMAT.parse(iso8601DateString);
//         }
//         catch (ParseException e) {
//             throw new DataConnectionException(String.format("Error could not parse a date from the supplied string '%s' make sure it's in the form 'yyyy-MM-dd HH:mm:ss'", iso8601DateString));
//         }
//     }
//     
//     public static String getDatabaseFormattedStringFromDate(Date date) {
//         return DATE_FORMAT.format(date);
//     }
// 
//     private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
// }
// 
// Path: src/com/njkremer/Sqlite/utils/SqliteUtils.java
// public class SqliteUtils {
//     public static Class<?> getClass(Object object) {
//         return AopUtils.getTargetClass(object);
//     }
//     
//     public static String capitalize(String word) {
//         return word.substring(0, 1).toUpperCase() + word.substring(1);
//     }
//     
//     public static String lowercase(String word) {
//         return word.substring(0, 1).toLowerCase() + word.substring(1);
//     }
//     
//     public static boolean isEmpty(Object object) {
//         if(object == null) {
//             return true;
//         }
//         if (object instanceof String) {
//             return ((String) object).trim().length() == 0;
//         }
//         else if (object instanceof Float) {
//             return ((Float) object) == 0.0f;
//         }
//         else if (object instanceof Integer) {
//             return ((Integer) object) == 0;
//         }
//         else if (object instanceof Long) {
//             return ((Long) object) == 0l;
//         }
//         else if (object instanceof Double) {
//             return ((Double) object) == 0.0d;
//         }
//         else if (object instanceof Boolean) {
//             return ((Boolean) object) == false;
//         }
//         return false;
//     }
// }


// Path: src/com/njkremer/Sqlite/SqlExecutor.java
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.log4j.Logger;
import org.springframework.aop.framework.ProxyFactory;
import com.njkremer.Sqlite.Annotations.AutoIncrement;
import com.njkremer.Sqlite.Annotations.OneToMany;
import com.njkremer.Sqlite.Annotations.PrimaryKey;
import com.njkremer.Sqlite.JoinExecutor.JoinType;
import com.njkremer.Sqlite.utils.DateUtils;
import com.njkremer.Sqlite.utils.SqliteUtils;

            logger.error(e.getErrorCode());
            if (e.getMessage().contains("PRIMARY KEY must be unique")) {
                throw new DataConnectionException("A @PrimaryKey needs to be defined on the class '" + this.clazz.getSimpleName() + "' , since there is a primary key in the database.", e);
            }
            throw new DataConnectionException("Error executing sql statement", e);
        }
        catch (Exception e) {
            throw new DataConnectionException("Error executing sql statement", e);
        }
    }

    private void processColumn(Object object, String columnName, ResultSet resultSet) throws SQLException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, NoSuchFieldException, DataConnectionException {
        Object value = null;
        Class<?> type = clazz.getDeclaredField(columnName).getType();
        if (type == String.class) {
            value = resultSet.getString(columnName);
        }
        else if (type == Float.class || type == Float.TYPE) {
            value = resultSet.getFloat(columnName);
        }
        else if (type == Integer.class || type == Integer.TYPE) {
            value = resultSet.getInt(columnName);
        }
        else if (type == Double.class || type == Double.TYPE) {
            value = resultSet.getDouble(columnName);
        }
        else if (type == Boolean.class || type == Boolean.TYPE) {
            value = resultSet.getBoolean(columnName);
        }
        else if (type == Date.class) {
            value = DateUtils.getDateFromDatabaseFormattedString(resultSet.getString(columnName));