Package org.drools.template.jdbc

Source Code of org.drools.template.jdbc.ResultSetGenerator

package org.drools.template.jdbc;

import org.drools.template.parser.TemplateContainer;
import org.drools.template.parser.DefaultTemplateContainer;
import org.drools.template.parser.TemplateDataListener;
import org.drools.template.parser.DataListener;

import java.io.InputStream;
import java.util.List;
import java.util.ArrayList;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

/**
* <p> A Drools template compiler which takes a ResultSet and compiles it into
* a template using DefaultTemplateContainer.</p>
*
* To use simply you need a JDBC ResultSet - with the field names mapping to the field names used in the template !
*/
public class ResultSetGenerator {

/**
* Generates DRL from a data provider for the spreadsheet data and templates.
*
* @param rs       the resultset for the table data
* @param template the string containing the template resource name
* @return the generated DRL text as a String
*/
public String compile(final ResultSet rs,
                      final String template) {
    final InputStream templateStream = this.getClass().getResourceAsStream(template);
    return compile(rs,
            templateStream);
}

/**
* Generates DRL from a data provider for the spreadsheet data and templates.
*
* @param rs             the resultset for the table data
* @param templateStream the InputStream for reading the templates
* @return the generated DRL text as a String
*/
public String compile(final ResultSet rs,
                      final InputStream templateStream) {
    TemplateContainer tc = new DefaultTemplateContainer(templateStream);
    closeStream(templateStream);
    return compile(rs,
            new TemplateDataListener(tc));
}

/**
* Generates DRL from a data provider for the spreadsheet data and templates.
*
* @param rs       the resultset for the table data
* @param listener a template data listener
* @return the generated DRL text as a String
*/
public String compile(final ResultSet rs,
                      final TemplateDataListener listener) {
    List<DataListener> listeners = new ArrayList<DataListener>();
    listeners.add(listener);
    processData(rs,
            listeners);
    return listener.renderDRL();
}

/**
* Iterate through the resultset.
* @param rs       the resultset for the table data
* @param listeners list of template data listener
*/
private void processData(final ResultSet rs,
                         List<DataListener> listeners) {

    try {
        ResultSetMetaData rsmd = rs.getMetaData();
        int colCount = rsmd.getColumnCount();

        int i = 0;

        while (rs.next()) {
            newRow(listeners, i, colCount);
            for (int cellNum = 1; cellNum < colCount + 1; cellNum++) {
                String cell;

                int sqlType = rsmd.getColumnType(cellNum);
                switch (sqlType) {
                    case java.sql.Types.DATE:
                        cell = rs.getDate(cellNum).toString();
                        break;
                    case java.sql.Types.INTEGER:
                    case java.sql.Types.DOUBLE:
                        cell = String.valueOf(rs.getInt(cellNum));
                        break;
                    default:
                        cell = rs.getString(cellNum);
                }

                newCell(listeners,
                        i,
                        cellNum -1,
                        cell,
                        DataListener.NON_MERGED);
            }
            i++;
        }

    } catch (SQLException e) {
         //TODO: you need to throw or handle
    }

    finishData(listeners);
}

private void finishData(List<DataListener> listeners) {
    for (DataListener listener : listeners) {
        listener.finishSheet();
    }
}

private void newRow(List<DataListener> listeners,
                    int row,
                    int cols) {
    for (DataListener listener : listeners) {
        listener.newRow(row,
                cols);
    }
}

public void newCell(List<DataListener> listeners,
                    int row,
                    int column,
                    String value,
                    int mergedColStart) {
    for (DataListener listener : listeners) {
        listener.newCell(row,
                column,
                value,
                mergedColStart);
    }
}

protected void closeStream(final InputStream stream) {
    try {
        stream.close();
    } catch (final Exception e) {
        System.err.print("WARNING: Wasn't able to correctly close stream for rule template. " + e.getMessage());
    }
}
}
TOP

Related Classes of org.drools.template.jdbc.ResultSetGenerator

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.