eu.esdihumboldt.hale.io.xls.test.writer.XLSInstanceWriterTest.java Source code

Java tutorial

Introduction

Here is the source code for eu.esdihumboldt.hale.io.xls.test.writer.XLSInstanceWriterTest.java

Source

/*
 * Copyright (c) 2014 Data Harmonisation Panel
 * 
 * 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:
 *     Data Harmonisation Panel <http://www.dhpanel.eu>
 */

package eu.esdihumboldt.hale.io.xls.test.writer;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import java.io.File;
import java.util.Arrays;
import java.util.List;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.content.IContentType;
import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;

import eu.esdihumboldt.cst.test.TransformationExample;
import eu.esdihumboldt.cst.test.TransformationExamples;
import eu.esdihumboldt.hale.common.core.io.Value;
import eu.esdihumboldt.hale.common.core.io.report.IOReport;
import eu.esdihumboldt.hale.common.core.io.supplier.FileIOSupplier;
import eu.esdihumboldt.hale.common.test.TestUtil;
import eu.esdihumboldt.hale.io.csv.InstanceTableIOConstants;
import eu.esdihumboldt.hale.io.xls.writer.XLSInstanceWriter;

/**
 * Test class for {@link XLSInstanceWriter}
 * 
 * @author Yasmina Kammeyer
 */
public class XLSInstanceWriterTest {

    /**
     * a temporary folder to safely store tmp files. Will be deleted after test
     * (successfully or not)
     */
    @Rule
    public TemporaryFolder tmpFolder = new TemporaryFolder();

    /**
     * Wait for needed services to be running
     */
    @BeforeClass
    public static void waitForServices() {
        TestUtil.startConversionService();
    }

    /**
     * Test - write data of complex schema and analyze result
     * 
     * @throws Exception , if an error occurs
     */
    @Test
    public void testWriteComplexSchema() throws Exception {

        TransformationExample example = TransformationExamples.getExample(TransformationExamples.SIMPLE_COMPLEX);
        // alternative the data could be generated by iterating through the
        // exempleproject's sourcedata
        List<String> header = Arrays.asList("id", "name", "details.age", "details.income", "details.address.street",
                "details.address.city");
        List<String> firstDataRow = Arrays.asList("id0", "name0", "age0", "income0", "street0", "city0");

        // set instances to xls instance writer
        XLSInstanceWriter writer = new XLSInstanceWriter();
        IContentType contentType = Platform.getContentTypeManager()
                .getContentType("eu.esdihumboldt.hale.io.xls.xls");
        writer.setParameter(InstanceTableIOConstants.SOLVE_NESTED_PROPERTIES, Value.of(true));

        File tmpFile = tmpFolder.newFile("excelTestWriteComplexSchema.xls");

        writer.setInstances(example.getSourceInstances());
        // write instances to a temporary XLS file
        writer.setTarget(new FileIOSupplier(tmpFile));
        writer.setContentType(contentType);
        IOReport report = writer.execute(null);
        assertTrue(report.isSuccess());

        Workbook wb = WorkbookFactory.create(tmpFile);
        Sheet sheet = wb.getSheetAt(0);

        checkHeader(sheet, header);

        checkSheetName(sheet, "person");

        checkFirstDataRow(sheet, firstDataRow);
    }

    /**
     * Test - write data of complex schema and analyze result The
     * implementation, this test based on, does not work correctly at the
     * moment.
     * 
     * @throws Exception , if an error occurs
     */
    @Test
    public void testWriteNotNestedProperties() throws Exception {

        TransformationExample example = TransformationExamples.getExample(TransformationExamples.SIMPLE_COMPLEX);
        // alternative the data could be generated by iterating through the
        // exempleproject's sourcedata
        List<String> header = Arrays.asList("id", "name");
        List<String> firstDataRow = Arrays.asList("id0", "name0");

        // set instances to xls instance writer
        XLSInstanceWriter writer = new XLSInstanceWriter();
        IContentType contentType = Platform.getContentTypeManager()
                .getContentType("eu.esdihumboldt.hale.io.xls.xls");
        writer.setParameter(InstanceTableIOConstants.SOLVE_NESTED_PROPERTIES, Value.of(false));

        File tmpFile = tmpFolder.newFile("excelNotNestedProperties.xls");

        writer.setInstances(example.getSourceInstances());
        // write instances to a temporary XLS file
        writer.setTarget(new FileIOSupplier(tmpFile));
        writer.setContentType(contentType);
        IOReport report = writer.execute(null);
        assertTrue(report.isSuccess());

        Workbook wb = WorkbookFactory.create(tmpFile);
        Sheet sheet = wb.getSheetAt(0);

        checkHeader(sheet, header);

        checkSheetName(sheet, "person");

        checkFirstDataRow(sheet, firstDataRow);
    }

    /**
     * 
     * @param sheet the excel file sheet
     * @param sheetName The sheet name
     * @throws Exception , if an error occurs
     */
    private void checkSheetName(Sheet sheet, String sheetName) throws Exception {

        assertTrue("There is no sheet in the file named: " + sheet.getSheetName(),
                sheetName.equals(sheet.getSheetName()));

    }

    private void checkHeader(Sheet sheet, List<String> headerNames) throws Exception {

        Row header = sheet.getRow(sheet.getFirstRowNum());

        assertEquals("There are not enough header cells.", headerNames.size(), header.getPhysicalNumberOfCells());

        for (Cell cell : header) {
            assertTrue("Not expecting header cell value.", headerNames.contains(cell.getStringCellValue()));
        }
    }

    private void checkFirstDataRow(Sheet sheet, List<String> firstDataRow) {
        Row datarow = sheet.getRow(sheet.getFirstRowNum() + 1);

        assertEquals("There are not enough data cells.", firstDataRow.size(), datarow.getPhysicalNumberOfCells());

        for (Cell cell : datarow) {
            assertTrue("Not expecting data value.", firstDataRow.contains(cell.getStringCellValue()));
        }
    }

    /**
     * test - if a complex schema with data is present and this schema contains
     * more than one type, the exporter should export all types (one sheet per
     * type) or the selected one XXX not supported under current circumstances
     */
    public void testExportChoosenType() {
        // TODO
    }

    /**
     * test - if a complex schema has a type containing an object attribute with
     * maxOccures > 1, one type can contain more than one instance of that
     * object. If this is the case than... TODO Export special case.
     */
    public void testMultipleInstances() {
        // TransformationExample example =
        // TransformationExamples.getExample(TransformationExamples.CM_NESTED_1);
        // TODO
    }

}