/** * DataCleaner (community edition) * Copyright (C) 2014 Neopost - Customer Information Management * * This copyrighted material is made available to anyone wishing to use, modify, * copy, or redistribute it subject to the terms and conditions of the GNU * Lesser General Public License, as published by the Free Software Foundation. * * 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 Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution; if not, write to: * Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ package org.datacleaner.output.datastore; import java.io.File; import java.util.Arrays; import java.util.concurrent.atomic.AtomicInteger; import org.apache.metamodel.DataContext; import org.apache.metamodel.data.DataSet; import org.apache.metamodel.query.Query; import org.apache.metamodel.schema.Table; import org.datacleaner.api.InputColumn; import org.datacleaner.connection.Datastore; import org.datacleaner.connection.DatastoreConnection; import org.datacleaner.output.OutputWriter; import org.datacleaner.output.OutputWriterScenarioHelper; import junit.framework.TestCase; public class DatastoreOutputWriterFactoryTest extends TestCase { private static final File OUTPUT_DIR = new File("target/test-output"); private boolean _datastoreCreated = false; private volatile Exception _exception; private Datastore _datastore; @Override protected void setUp() throws Exception { super.setUp(); if (OUTPUT_DIR.exists()) { final File[] files = OUTPUT_DIR.listFiles(); for (final File file : files) { file.delete(); } } _exception = null; } public void testMultiThreadedWriting() throws Exception { final AtomicInteger datastoreCount = new AtomicInteger(); final OutputWriterScenarioHelper scenarioHelper = new OutputWriterScenarioHelper(); final DatastoreCreationDelegate creationDelegate = new DatastoreCreationDelegate() { @Override public synchronized void createDatastore(final Datastore datastore) { if (_datastore != null) { assertEquals(_datastore, datastore); } _datastore = datastore; datastoreCount.incrementAndGet(); } }; final InputColumn<?>[] columns = scenarioHelper.getColumns().toArray(new InputColumn[0]); // creating 9 similar writers that all write at the same time final Thread[] threads = new Thread[9]; for (int i = 0; i < threads.length; i++) { threads[i] = new Thread() { @Override public void run() { try { final OutputWriter writer = DatastoreOutputWriterFactory .getWriter(OUTPUT_DIR, creationDelegate, "ds", "tab", false, columns); scenarioHelper.writeExampleData(writer); } catch (final RuntimeException e) { _exception = e; } } }; } for (int i = 0; i < threads.length; i++) { threads[i].start(); } for (int i = 0; i < threads.length; i++) { threads[i].join(); } if (_exception != null) { throw _exception; } assertEquals(9, datastoreCount.get()); assertNotNull(_datastore); try (DatastoreConnection connection = _datastore.openConnection()) { final DataContext dc = connection.getDataContext(); dc.refreshSchemas(); final String[] tableNames = dc.getDefaultSchema().getTableNames(); Arrays.sort(tableNames); assertEquals("[TAB_1, TAB_2, TAB_3, TAB_4, TAB_5, TAB_6, TAB_7, TAB_8, TAB_9]", Arrays.toString(tableNames)); } } public void testFullScenario() throws Exception { final OutputWriterScenarioHelper scenarioHelper = new OutputWriterScenarioHelper(); final DatastoreCreationDelegate creationDelegate = datastore -> { _datastoreCreated = true; assertEquals("my datastore", datastore.getName()); try (DatastoreConnection con = datastore.openConnection()) { final DataContext dc = con.getDataContext(); final Table table = dc.getDefaultSchema().getTables()[0]; final Query q = dc.query().from(table).select(table.getColumns()).toQuery(); final DataSet dataSet = dc.executeQuery(q); scenarioHelper.performAssertions(dataSet, true); } }; final OutputWriter writer = DatastoreOutputWriterFactory .getWriter(OUTPUT_DIR, creationDelegate, "my datastore", "my dataset", scenarioHelper.getColumns().toArray(new InputColumn[0])); scenarioHelper.writeExampleData(writer); assertEquals("my_dataset", DatastoreOutputWriterFactory.getActualTableName(writer)); assertTrue(_datastoreCreated); } }