/** * Copyright 2010 the original author or authors. * * This file is part of Zksample2. http://zksample2.sourceforge.net/ * * Zksample2 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 3 of the License, or * (at your option) any later version. * * Zksample2 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 Zksample2. If not, see <http://www.gnu.org/licenses/gpl.html>. */ package de.forsthaus.h2; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.sql.BatchUpdateException; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import java.util.HashMap; import java.util.Map; import javax.sql.DataSource; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.springframework.beans.factory.InitializingBean; /** * This <b>database filler</b> is called on application startup by spring. <br> * The declaration of this bean is in the <br> * file: src/main/resources/customize-applicationContext.xml <br> * file: src/main/resources/createSampleData.sql <br> * This class creates and fills the db with the needed tables, sequences and * sample data records. * * @author bbruhns * @author Stephan Gerth */ public class My_H2_SampleDataFiller implements InitializingBean { private DataSource dataSource; @Override public void afterPropertiesSet() throws Exception { final Logger logger = Logger.getLogger(getClass()); final Map<Integer, String> allSql = new HashMap<Integer, String>(); final Connection conn = this.dataSource.getConnection(); try { // reads the sql-file from the classpath final InputStream inputStream = getClass().getResourceAsStream("/createSampleData.sql"); try { final Statement stat = conn.createStatement(); final BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, "UTF-8")); String str; StringBuilder sb = new StringBuilder(); int count = 0; while ((str = in.readLine()) != null) { sb.append(str); // make a linefeed at each readed line if (StringUtils.endsWith(str.trim(), ";")) { final String sql = sb.toString(); stat.addBatch(sql); sb = new StringBuilder(); allSql.put(Integer.valueOf(count++), sql); } else { sb.append("\n"); } } final int[] ar = stat.executeBatch(); final int i = ar.length; logger.info("Create DemoData"); logger.info("count batch updates : " + i); } finally { try { inputStream.close(); } catch (final IOException e) { logger.warn("", e); } } } catch (final BatchUpdateException e) { final BatchUpdateException be = e; final int[] updateCounts = be.getUpdateCounts(); if (updateCounts != null) { for (int i = 0; i < updateCounts.length; i++) { final int j = updateCounts[i]; if (j < 0) { logger.error("SQL errorcode: " + j + " -> in SQL\n" + allSql.get(Integer.valueOf(i))); } } } throw e; } finally { try { conn.close(); } catch (final SQLException e) { logger.warn("", e); } } } // ++++++++++++++++++++++++++++++++++++++++++++++++++++++// // ++++++++++++++++++ getter / setter +++++++++++++++++++// // ++++++++++++++++++++++++++++++++++++++++++++++++++++++// public DataSource getDataSource() { return this.dataSource; } // injected by spring public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } }