eu.esdihumboldt.hale.io.jdbc.msaccess.test.MsAccessDataReaderTestSuit.java Source code

Java tutorial

Introduction

Here is the source code for eu.esdihumboldt.hale.io.jdbc.msaccess.test.MsAccessDataReaderTestSuit.java

Source

/*
 * Copyright (c) 2016 wetransform GmbH
 * 
 * All rights reserved. This program and the accompanying materials are made
 * available under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation, either version 3 of the License,
 * or (at your option) any later version.
 * 
 * You should have received a copy of the GNU Lesser General Public License
 * along with this distribution. If not, see <http://www.gnu.org/licenses/>.
 * 
 * Contributors:
 *     wetransform GmbH <http://www.wetransform.to>
 */

package eu.esdihumboldt.hale.io.jdbc.msaccess.test;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import java.io.File;
import java.io.IOException;
import java.util.Collection;

import com.google.common.io.ByteSink;
import com.google.common.io.ByteSource;
import com.google.common.io.Files;
import com.google.common.io.Resources;

import eu.esdihumboldt.hale.common.core.io.Value;
import eu.esdihumboldt.hale.common.core.io.impl.LogProgressIndicator;
import eu.esdihumboldt.hale.common.core.io.report.IOReport;
import eu.esdihumboldt.hale.common.core.io.supplier.FileIOSupplier;
import eu.esdihumboldt.hale.common.instance.model.InstanceCollection;
import eu.esdihumboldt.hale.common.schema.model.Schema;
import eu.esdihumboldt.hale.common.schema.model.TypeDefinition;
import eu.esdihumboldt.hale.io.jdbc.JDBCInstanceReader;
import eu.esdihumboldt.hale.io.jdbc.JDBCSchemaReader;
import eu.esdihumboldt.hale.io.jdbc.msaccess.MsAccessInstanceReader;
import eu.esdihumboldt.hale.io.jdbc.msaccess.MsAccessSchemaReader;

/**
 * Abstract suit class to test Access database
 * 
 * @author Arun
 *
 */
public abstract class MsAccessDataReaderTestSuit {

    /**
     * Source Database name
     */
    protected String SOURCE_DB_NAME;

    /**
     * Source Database Extension
     */
    protected String SOURCE_DB_EXT;

    /**
     * Source Database path
     */
    protected String SOURCE_DB_PATH;

    /**
     * User name to connect to database
     */
    protected String USER_NAME;

    /**
     * password to connect to database
     */
    protected String PASSWORD;

    /**
     * Query to execute
     */
    protected String SQL_QUERY;

    private File TEMP_SOURCE_FILE_NAME = null;

    private static String[] tablesShouldNotInSchema = new String[] { "prop", "columns", "columns_view", "tables" };

    /**
     * Copies the source database to a temporary file.
     * 
     * @throws IOException if temp file can't be created
     */
    public void createSourceTempFile() throws IOException {
        ByteSource source = Resources
                .asByteSource(MsAccessDataReaderTestSuit.class.getClassLoader().getResource(SOURCE_DB_PATH));
        ByteSink dest = Files.asByteSink(getSourceTempFilePath());
        source.copyTo(dest);
    }

    /**
     * Generates a random path (within the system's temporary folder) for the
     * source database.
     * 
     * @return the absolute path of the source temp file
     */
    public File getSourceTempFilePath() {

        if (TEMP_SOURCE_FILE_NAME == null) {
            try {
                TEMP_SOURCE_FILE_NAME = File.createTempFile(SOURCE_DB_NAME, SOURCE_DB_EXT);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return TEMP_SOURCE_FILE_NAME;

    }

    /**
     * Deletes the source temp file.
     */
    public void deleteSourceTempFile() {
        deleteTempFile(getSourceTempFilePath());
    }

    private void deleteTempFile(File tempFile) {
        if (tempFile.exists()) {
            tempFile.delete();
        }
    }

    /**
     * Test - reads a sample MsAccess Database schema. UCanAccess lib should not
     * throw any error.
     * 
     * @throws Exception if an error occurs
     */
    public void schemaReaderTest() throws Exception {
        MsAccessSchemaReader schemaReader = new MsAccessSchemaReader();
        schemaReader.setSource(new FileIOSupplier(getSourceTempFilePath()));
        schemaReader.setParameter(JDBCSchemaReader.PARAM_USER, Value.of(USER_NAME));
        schemaReader.setParameter(JDBCSchemaReader.PARAM_PASSWORD, Value.of(PASSWORD));

        IOReport report = schemaReader.execute(new LogProgressIndicator());
        assertTrue(report.isSuccess());

        TEMP_SOURCE_FILE_NAME = null;
        Schema schema = schemaReader.getSchema();
        assertTrue(schema != null);
        Collection<? extends TypeDefinition> k = schema.getMappingRelevantTypes();

        for (TypeDefinition def : k)
            System.out.println(def.getDisplayName());

        checkTables(k);
    }

    /**
     * Test - reads a sample MsAccess schema and data.
     * 
     * @throws Exception if an error occurs
     */
    public void instanceRaderTest() throws Exception {

        // ****** read Schema ******//

        Schema schema = readSchema(getSourceTempFilePath());
        assertNotNull(schema);
        System.out.println("MappingRelevantTypes:" + schema.getMappingRelevantTypes().size());
        // assertEquals(1, schema.getMappingRelevantTypes().size());

        // Test properties
        // TypeDefinition schemaType =
        // schema.getMappingRelevantTypes().iterator().next();
        // Check every property for their existence

        // ****** read Instances ******//
        InstanceCollection instances = readInstances(schema, getSourceTempFilePath());
        assertTrue(instances.hasSize());
        System.out.println("instances size:" + instances.size());
        // assertEquals(SOURCE_INSTANCES_COUNT, instances.size());

    }

    /**
     * Reads a schema from a MsAccess database file.
     * 
     * @param sourceFile the file of the source database.
     * @return the schema
     * @throws Exception any exception thrown by {@link MsAccessSchemaReader}
     */

    public Schema readSchema(File sourceFile) throws Exception {

        MsAccessSchemaReader schemaReader = new MsAccessSchemaReader();
        schemaReader.setSource(new FileIOSupplier(sourceFile));
        schemaReader.setParameter(JDBCSchemaReader.PARAM_USER, Value.of(USER_NAME));
        schemaReader.setParameter(JDBCSchemaReader.PARAM_PASSWORD, Value.of(PASSWORD));

        IOReport report = schemaReader.execute(new LogProgressIndicator());
        assertTrue(report.isSuccess());

        return schemaReader.getSchema();
    }

    /**
     * Reads instances from from a MsAccess database file with the provided
     * schema.
     * 
     * @param sourceSchema the schema of the source database
     * @param sourceFile the file of the source database.
     * @return the read instances
     * @throws Exception any exception thrown by {@link MsAccessInstanceReader}
     */
    public InstanceCollection readInstances(Schema sourceSchema, File sourceFile) throws Exception {

        MsAccessInstanceReader instanceReader = new MsAccessInstanceReader();
        instanceReader.setSource(new FileIOSupplier(sourceFile));
        instanceReader.setSourceSchema(sourceSchema);
        instanceReader.setParameter(JDBCInstanceReader.PARAM_USER, Value.of(USER_NAME));
        instanceReader.setParameter(JDBCInstanceReader.PARAM_PASSWORD, Value.of(PASSWORD));

        // Test instances
        IOReport report = instanceReader.execute(new LogProgressIndicator());
        assertTrue("Data import was not successfull.", report.isSuccess());

        return instanceReader.getInstances();

    }

    /**
     * Check table names should not be in excluded table list (UCA_METADATA
     * table list)
     * 
     * @param tableNames table names collection return from Schema
     */
    public void checkTables(Collection<? extends TypeDefinition> tableNames) {

        for (TypeDefinition def : tableNames) {
            for (String table : tablesShouldNotInSchema)
                assertFalse(def.getDisplayName().equalsIgnoreCase(table));
        }
    }

}