Package com.asakusafw.testdriver.bulkloader

Source Code of com.asakusafw.testdriver.bulkloader.BulkLoadExporterRetriever

/**
* 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.testdriver.bulkloader;

import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.asakusafw.runtime.io.ModelOutput;
import com.asakusafw.testdriver.core.AbstractExporterRetriever;
import com.asakusafw.testdriver.core.DataModelDefinition;
import com.asakusafw.testdriver.core.DataModelSource;
import com.asakusafw.testdriver.core.ExporterRetriever;
import com.asakusafw.vocabulary.bulkloader.BulkLoadExporterDescription;
import com.asakusafw.vocabulary.bulkloader.BulkLoadExporterDescription.DuplicateRecordCheck;

/**
* Implementation of {@link ExporterRetriever} for {@link BulkLoadExporterDescription}s.
* @since 0.2.0
*/
public class BulkLoadExporterRetriever extends AbstractExporterRetriever<BulkLoadExporterDescription> {

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

    @Override
    public void truncate(BulkLoadExporterDescription description) throws IOException {
        Configuration conf = Configuration.load(description.getTargetName());
        truncate(conf, description.getTableName());
        if (description.getDuplicateRecordCheck() != null) {
            truncate(conf, description.getDuplicateRecordCheck().getTableName());
        }
    }

    private void truncate(Configuration conf, String tableName) throws IOException {
        assert conf != null;
        assert tableName != null;
        LOG.info("エクスポート先のテーブル{}の内容を消去します", tableName);
        Util.truncate(conf, tableName);
    }

    @Override
    public <V> ModelOutput<V> createOutput(DataModelDefinition<V> definition,
            BulkLoadExporterDescription description) throws IOException {
        Configuration conf = Configuration.load(description.getTargetName());
        TableInfo<V> info = buildTableInfo(definition, description);
        LOG.info("エクスポート先の初期値を設定します: テーブル{}", info.getTableName());
        LOG.debug("Opening output: {}", info);
        Connection conn = conf.open();
        boolean green = false;
        try {
            ModelOutput<V> output = new TableOutput<V>(info, conn);
            green = true;
            return output;
        } finally {
            if (green == false) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    // ignored.
                }
            }
        }
    }

    @Override
    public <V> DataModelSource createSource(DataModelDefinition<V> definition,
            BulkLoadExporterDescription description) throws IOException {
        Configuration conf = Configuration.load(description.getTargetName());
        TableInfo<V> info = buildTableInfo(definition, description);
        LOG.info("エクスポート結果を取得します: テーブル{}", info.getTableName());
        LOG.debug("Opening results: {}", info);
        Connection conn = conf.open();
        boolean green = false;
        try {
            DataModelSource source = new TableSource<V>(info, conn);
            green = true;
            return source;
        } finally {
            if (green == false) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    // ignored.
                }
            }
        }
    }

    private <V> TableInfo<V> buildTableInfo(
            DataModelDefinition<V> definition,
            BulkLoadExporterDescription description) throws IOException {
        assert definition != null;
        assert description != null;
        if (isNormalTarget(definition, description)) {
            return new TableInfo<V>(
                    definition,
                    description.getTableName(),
                    description.getTargetColumnNames());
        } else {
            DuplicateRecordCheck dup = description.getDuplicateRecordCheck();
            List<String> columns = dup.getColumnNames();
            if (columns.contains(dup.getErrorCodeColumnName()) == false) {
                // restore error code column name
                columns = new ArrayList<String>(columns);
                columns.add(dup.getErrorCodeColumnName());
            }
            return new TableInfo<V>(
                    definition,
                    dup.getTableName(),
                    columns);
        }
    }

    private boolean isNormalTarget(DataModelDefinition<?> definition,
            BulkLoadExporterDescription description) throws IOException {
        assert definition != null;
        assert description != null;
        LOG.debug("Detecting export target");
        Class<?> modelClass = definition.getModelClass();
        DuplicateRecordCheck dupcheck = description.getDuplicateRecordCheck();
        if (dupcheck != null && modelClass == dupcheck.getTableModelClass()) {
            return false;
        } else if (modelClass == description.getTableModelClass()) {
            return true;
        } else {
            throw new IOException(MessageFormat.format(
                    "エクスポート記述{0}はテーブルモデル{1}を対象としません",
                    description.getClass().getName(),
                    modelClass.getName()));
        }
    }
}
TOP

Related Classes of com.asakusafw.testdriver.bulkloader.BulkLoadExporterRetriever

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.