/* ================================================================== * ResultSetCsvWriterTests.java - 6/10/2016 12:28:13 PM * * Copyright 2007-2016 SolarNetwork.net Dev Team * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA * ================================================================== */ package net.solarnetwork.node.dao.jdbc.test; import java.io.IOException; import java.io.InputStreamReader; import java.io.StringWriter; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.TimeZone; import javax.annotation.Resource; import javax.sql.DataSource; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.springframework.dao.DataAccessException; import org.springframework.dao.DataAccessResourceFailureException; import org.springframework.jdbc.core.BatchPreparedStatementSetter; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.ResultSetExtractor; import org.springframework.util.FileCopyUtils; import org.supercsv.cellprocessor.ift.CellProcessor; import org.supercsv.prefs.CsvPreference; import net.solarnetwork.node.dao.jdbc.DatabaseSetup; import net.solarnetwork.node.dao.jdbc.JdbcUtils; import net.solarnetwork.node.dao.jdbc.ResultSetCsvWriter; import net.solarnetwork.node.test.AbstractNodeTransactionalTest; /** * Test cases for the {@link ResultSetCsvWriter} class. * * @author matt * @version 1.0 */ public class ResultSetCsvWriterTests extends AbstractNodeTransactionalTest { @Resource(name = "dataSource") private DataSource dataSource; private JdbcTemplate jdbcTemplate; @Before public void setup() { DatabaseSetup setup = new DatabaseSetup(); setup.setDataSource(dataSource); setup.init(); jdbcTemplate = new JdbcTemplate(dataSource); } private void populateTestData() { final Calendar utcCalendar = Calendar.getInstance(TimeZone.getTimeZone("UTC")); final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); sdf.setTimeZone(TimeZone.getTimeZone("UTC")); jdbcTemplate.batchUpdate( "INSERT INTO solarnode.test_csv_io (pk, str, inum, dnum, ts) VALUES (?,?,?,?,?)", new BatchPreparedStatementSetter() { @Override public void setValues(PreparedStatement ps, int i) throws SQLException { int pos = i + 1; ps.setLong(1, pos); if ( pos == 2 ) { ps.setNull(2, Types.VARCHAR); } else { ps.setString(2, "s0" + pos); } if ( pos == 3 ) { ps.setNull(3, Types.INTEGER); } else { ps.setInt(3, pos); } if ( pos == 4 ) { ps.setNull(4, Types.DOUBLE); } else { ps.setDouble(4, pos); } if ( pos == 5 ) { ps.setNull(5, Types.TIMESTAMP); } else { try { Date d = sdf.parse("2016-10-0" + pos + "T12:01:02.345Z"); ps.setTimestamp(5, new java.sql.Timestamp(d.getTime()), utcCalendar); } catch ( ParseException e ) { // should not get here } } } @Override public int getBatchSize() { return 5; } }); } @Test public void exportTable() throws Exception { executeSqlScript("net/solarnetwork/node/dao/jdbc/test/csv-data-01.sql", false); populateTestData(); String result = jdbcTemplate.query("select * from solarnode.test_csv_io order by pk", new ResultSetExtractor<String>() { @Override public String extractData(ResultSet rs) throws SQLException, DataAccessException { CellProcessor[] processors = JdbcUtils .formattingProcessorsForResultSetMetaData(rs.getMetaData()); StringWriter out = new StringWriter(); ResultSetCsvWriter writer = new ResultSetCsvWriter(out, CsvPreference.STANDARD_PREFERENCE); try { try { writer.write(rs, processors); } catch ( IOException e ) { throw new DataAccessResourceFailureException("IO exception", e); } } finally { try { writer.flush(); writer.close(); } catch ( IOException e ) { // ignore } } return out.toString(); } }); Assert.assertNotNull(result); Assert.assertEquals("CSV output", FileCopyUtils.copyToString( new InputStreamReader(getClass().getResourceAsStream("csv-data-01.csv"), "UTF-8")), result); } }