001package org.itsallcode.jdbc.statement;
002
003import java.sql.PreparedStatement;
004import java.sql.SQLException;
005
006/**
007 * A {@link PreparedStatement} that delegates calls to
008 * {@link #setObject(int, Object)} to a setter provided by
009 * {@link ParamSetterProvider#findSetter(Object)}.
010 */
011public class ConvertingPreparedStatement extends DelegatingPreparedStatement {
012    private final PreparedStatement originalDelegate;
013    private final ParamSetterProvider paramSetterProvider;
014
015    /**
016     * Create a new instance.
017     * 
018     * @param delegate            delegate
019     * @param paramSetterProvider parameter setter provider
020     */
021    public ConvertingPreparedStatement(final PreparedStatement delegate,
022            final ParamSetterProvider paramSetterProvider) {
023        super(delegate);
024        this.originalDelegate = delegate;
025        this.paramSetterProvider = paramSetterProvider;
026    }
027
028    @Override
029    public void setObject(final int parameterIndex, final Object x) throws SQLException {
030        paramSetterProvider.findSetter(x)
031                .setObject(originalDelegate, parameterIndex, x);
032    }
033}