Package com.asakusafw.testdata.generator.excel

Source Code of com.asakusafw.testdata.generator.excel.WorkbookGenerator

/**
* Copyright 2011-2014 Asakusa Framework Team.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.asakusafw.testdata.generator.excel;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.MessageFormat;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.SpreadsheetVersion;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.asakusafw.dmdl.semantics.ModelDeclaration;
import com.asakusafw.testdata.generator.TemplateGenerator;

/**
* Generates Excel workbooks for testing each data model.
* @since 0.2.0
* @version 0.5.3
*/
public class WorkbookGenerator implements TemplateGenerator {

    static final Logger LOG = LoggerFactory.getLogger(WorkbookGenerator.class);

    private final File output;

    private final WorkbookFormat format;

    /**
     * Creates a new instance.
     * @param output output directory
     * @param format workbook format to be generated
     * @throws IllegalArgumentException if some parameters were {@code null}
     */
    public WorkbookGenerator(File output, WorkbookFormat format) {
        if (output == null) {
            throw new IllegalArgumentException("output must not be null"); //$NON-NLS-1$
        }
        if (format == null) {
            throw new IllegalArgumentException("format must not be null"); //$NON-NLS-1$
        }
        this.output = output;
        this.format = format;
    }

    /**
     * Generates a workbook for the specified model.
     * @param model the target model
     * @throws IOException if failed to generate a workbook
     * @throws IllegalArgumentException if some parameters were {@code null}
     */
    @Override
    public void generate(ModelDeclaration model) throws IOException {
        if (model == null) {
            throw new IllegalArgumentException("model must not be null"); //$NON-NLS-1$
        }
        if (output.isDirectory() == false && output.mkdirs() == false) {
            throw new IOException(MessageFormat.format(
                    "出力先のディレクトリを生成できませんでした: {0}",
                    output));
        }
        Workbook workbook = createWorkbook();
        SheetBuilder builder = new SheetBuilder(workbook, format.getVersion(), model);
        for (SheetFormat sheet : format.getSheets()) {
            switch (sheet.getKind()) {
            case DATA:
                LOG.debug("Building data sheet: {}.{}", model.getName(), sheet.getName());
                builder.addData(sheet.getName());
                break;
            case RULE:
                LOG.debug("Building rule sheet: {}.{}", model.getName(), sheet.getName());
                builder.addRule(sheet.getName());
                break;
            default:
                throw new AssertionError(MessageFormat.format(
                        "Unknown sheet format: {0}",
                        sheet));
            }
        }

        File file = new File(output, format.getFileName(model));
        LOG.debug("Emitting workbook: {}", file);

        OutputStream out = new FileOutputStream(file);
        try {
            workbook.write(out);
        } finally {
            out.close();
        }
        LOG.info(MessageFormat.format(
                "Excelワークブックを生成しました: {0}",
                file.getAbsolutePath()));
    }

    private Workbook createWorkbook() throws IOException {
        return createEmptyWorkbook(format.getVersion());
    }

    /**
     * Returns spreadsheet version for the target workbook.
     * @param fileName the target workbook path
     * @return the target version
     * @since 0.7.0
     */
    public static SpreadsheetVersion getSpreadsheetVersion(String fileName) {
        if (fileName == null) {
            throw new IllegalArgumentException("fileName must not be null"); //$NON-NLS-1$
        }
        if (fileName.endsWith(".xls")) {
            return SpreadsheetVersion.EXCEL97;
        } else if (fileName.endsWith("xlsx")) {
            return SpreadsheetVersion.EXCEL2007;
        } else {
            throw new IllegalArgumentException(MessageFormat.format(
                    "サポートしていないExcelワークブックの形式です: {0}",
                    fileName));
        }
    }

    /**
     * Returns spreadsheet version for the target workbook.
     * @param workbook the target workbook
     * @return the target version
     * @since 0.7.0
     */
    public static SpreadsheetVersion getSpreadsheetVersion(Workbook workbook) {
        if (workbook == null) {
            throw new IllegalArgumentException("workbook must not be null"); //$NON-NLS-1$
        }
        if (workbook instanceof HSSFWorkbook) {
            return SpreadsheetVersion.EXCEL97;
        } else if (workbook instanceof XSSFWorkbook) {
            return SpreadsheetVersion.EXCEL2007;
        } else {
            throw new IllegalArgumentException(MessageFormat.format(
                    "サポートしていないExcelワークブックの形式です: {0}",
                    workbook.getClass().getName()));
        }
    }

    /**
     * Creates a new empty workbook for the target version.
     * @param version the target version
     * @return the created workbook
     * @throws IOException if failed to create the workbook
     * @since 0.5.3
     */
    public static Workbook createEmptyWorkbook(SpreadsheetVersion version) throws IOException {
        if (version == null) {
            throw new IllegalArgumentException("version must not be null"); //$NON-NLS-1$
        }
        switch (version) {
        case EXCEL97:
            return new HSSFWorkbook();
        case EXCEL2007:
            return new XSSFWorkbook();
        default:
            throw new IOException(MessageFormat.format(
                    "サポートしていないExcelワークブックの形式です: {0}",
                    version));
        }
    }

    @Override
    public String getTitle() {
        return MessageFormat.format(
                "Excelワークブックの生成 ({0})",
                format);
    }
}
TOP

Related Classes of com.asakusafw.testdata.generator.excel.WorkbookGenerator

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.