package org.apache.commons.digester3.examples.api.dbinsert;

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import java.sql.Connection;

import org.apache.commons.digester3.Rule;
import org.apache.commons.digester3.examples.api.dbinsert.Row.Column;

/**
 * See Main.java.
 */
public class RowInserterRule
    extends Rule
{

    private final Connection conn;

    public RowInserterRule( final Connection conn )
    {
        this.conn = conn;
    }

    /**
     * This method is invoked when the start tag for an xml element representing
     * a database row is encountered. It pushes a new Row instance onto the
     * digester stack (rather like an ObjectCreateRule) so that column data
     * can be stored on it.
     */
    @Override
    public void begin( final String namespace, final String name, final org.xml.sax.Attributes attrs )
    {
        getDigester().push( new Row() );
    }

    /**
     * This method is invoked when the end tag for an xml element representing
     * a database row is encountered. It pops a fully-configured Row instance
     * off the digester stack, accesses the object below it on the stack (a
     * Table object) to get the tablename, then does an SQL insert). Actually,
     * here we just print out text rather than do the sql insert, but the
     * real implementation should be fairly simple.
     * <p>
     * Note that after this rule completes, the row/column information is
     * <i>discarded</i>, ie this rule performs actions <i>as the input is
     * parsed</i>. This contrasts with the more usual way digester is used,
     * which is to build trees of objects for later use. But it's a perfectly
     * valid use of Digester.
     */
    @Override
    public void end( final String namespace, final String name )
    {
        final Row row = getDigester().pop();
        final Table table = getDigester().peek();

        // Obviously, all this would be replaced by code like:
        // stmt = conn.prepareStatement();
        // stmt.setString(n, value);
        //
        // Many improvements can then be implemented, such as using the
        // PreparedStatement.getParameterMetaData method to retrieve
        // retrieve parameter types, etc.

        final StringBuilder colnames = new StringBuilder();
        final StringBuilder colvalues = new StringBuilder();

        for (final Column column : row.getColumns()) {
            if ( colnames.length() > 0 )
            {
                colnames.append( ", " );
                colvalues.append( ", " );
            }

            colnames.append( "'" );
            colnames.append( column.getName() );
            colnames.append( "'" );

            colvalues.append( "'" );
            colvalues.append( column.getValue() );
            colvalues.append( "'" );
        }

        final StringBuilder buf = new StringBuilder();
        buf.append( "insert into " );
        buf.append( table.getName() );
        buf.append( " (" );
        buf.append( colnames.toString() );
        buf.append( ") values (" );
        buf.append( colvalues.toString() );
        buf.append( ")" );

        // here the prepared statement would be executed....
        System.out.println( buf.toString() );
    }

}
