All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.alipay.rdf.file.common.ProtocolFileWriter Maven / Gradle / Ivy

There is a newer version: 2.2.11
Show newest version
package com.alipay.rdf.file.common;

import java.io.InputStream;
import java.util.List;
import java.util.Map;

import com.alipay.rdf.file.codec.BodyCodec;
import com.alipay.rdf.file.codec.HeaderCodec;
import com.alipay.rdf.file.codec.TailCodec;
import com.alipay.rdf.file.exception.RdfErrorEnum;
import com.alipay.rdf.file.exception.RdfFileException;
import com.alipay.rdf.file.interfaces.FileCoreProcessorConstants;
import com.alipay.rdf.file.loader.ProcessorLoader;
import com.alipay.rdf.file.loader.ProtocolLoader;
import com.alipay.rdf.file.loader.SummaryLoader;
import com.alipay.rdf.file.loader.TemplateLoader;
import com.alipay.rdf.file.meta.FileMeta;
import com.alipay.rdf.file.model.FileConfig;
import com.alipay.rdf.file.model.Summary;
import com.alipay.rdf.file.processor.ProcessExecutor;
import com.alipay.rdf.file.processor.ProcessExecutor.BizData;
import com.alipay.rdf.file.processor.ProcessorTypeEnum;
import com.alipay.rdf.file.spi.RdfFileProcessorSpi;
import com.alipay.rdf.file.spi.RdfFileWriterSpi;
import com.alipay.rdf.file.util.RdfFileConstants;
import com.alipay.rdf.file.util.RdfFileLogUtil;
import com.alipay.rdf.file.util.RdfFileUtil;

/**
 * Copyright (C) 2013-2018 Ant Financial Services Group
 * 
 * @author hongwei.quhw
 * @version $Id: CommonFileWriter.java, v 0.1 2017年4月7日 下午2:16:59 hongwei.quhw Exp $
 */
public class ProtocolFileWriter implements RdfFileWriterSpi {
    private FileConfig                                        fileConfig;
    private FileMeta                                          fileMeta;
    private Map> processors;
    private RdfBufferedWriter                                 writer = null;
    private Summary                                           summary;
    // 该writer是否已经写过数据
    private boolean                                           hasWritten = false;

    @Override
    public void init(FileConfig fileConfig) {
        String templatePath = RdfFileUtil.assertTrimNotBlank(fileConfig.getTemplatePath());
        this.fileConfig = fileConfig;
        this.fileMeta = TemplateLoader.load(templatePath, fileConfig.getTemplateEncoding());

        if (fileConfig.isSummaryEnable()) {
            summary = SummaryLoader.getNewSummary(fileMeta);
            fileConfig.addProcessorKey(FileCoreProcessorConstants.SUMMARY);
        }

        ProtocolLoader.loadProtocol(fileMeta.getProtocol());
        processors = ProcessorLoader.loadByType(fileConfig, ProcessorTypeEnum.AFTER_WRITE_HEAD,
            ProcessorTypeEnum.BEFORE_WRITE_ROW, ProcessorTypeEnum.AFTER_WRITE_ROW,
            ProcessorTypeEnum.AFTER_WRITE_TAIL, ProcessorTypeEnum.AFTER_CLOSE_WRITER,
            ProcessorTypeEnum.AFTER_WRITE_BYTES, ProcessorTypeEnum.AFTER_SERIALIZE_ROW,
            ProcessorTypeEnum.BEFORE_SERIALIZE_ROW, ProcessorTypeEnum.BEFORE_CREATE_WRITER);

        if (RdfFileLogUtil.common.isInfo()) {
            RdfFileLogUtil.common.info("rdf-file#ProtocolFileWriter(fileConfig=" + fileConfig
                                       + ")  processors=" + processors);
        }
    }

   @Override
    public void writeHead(Object headBean) {
        ensureOpen();
        HeaderCodec.instance.serialize(headBean, fileConfig, this, processors);

        ProcessExecutor.execute(ProcessorTypeEnum.AFTER_WRITE_HEAD, processors, fileConfig,
            new BizData(RdfFileConstants.SUMMARY, summary),
            new BizData(RdfFileConstants.DATA, headBean));
    }

    @Override
    public void writeRow(Object rowBean) {
        ProcessExecutor.execute(ProcessorTypeEnum.BEFORE_WRITE_ROW, processors, fileConfig);

        ensureOpen();

        BodyCodec.instance.serialize(rowBean, fileConfig, this, processors);

        ProcessExecutor.execute(ProcessorTypeEnum.AFTER_WRITE_ROW, processors, fileConfig,
            new BizData(RdfFileConstants.SUMMARY, summary),
            new BizData(RdfFileConstants.DATA, rowBean));
    }

    @Override
    public void writeTail(Object tailBean) {
        ensureOpen();
        TailCodec.instance.serialize(tailBean, fileConfig, this, processors);

        ProcessExecutor.execute(ProcessorTypeEnum.AFTER_WRITE_TAIL, processors, fileConfig,
            new BizData(RdfFileConstants.SUMMARY, summary),
            new BizData(RdfFileConstants.DATA, tailBean));
    }

    @Override
    public void close() {
        close(true);
    }

    @Override
    public void close(boolean hasError) {
        if (null == writer) {
            if (fileConfig.isCreateEmptyFile()) {
                ensureOpen();
            } else {
                return;
            }
        }

        try {
            writer.close(hasError);
        } finally {
            writer = null;
        }
    }

    @Override
    public void ensureOpen() {
        if (null == writer) {
            writer = IOFactory.createWriter(fileConfig, processors);
        }
    }

    public void writeLine(String line) {
        RdfFileUtil.assertNotNull(line, "ProtocolFileWriter.writeLine(line == null)",
            RdfErrorEnum.ILLEGAL_ARGUMENT);
        ensureOpen();
        String lineWithLB = RdfFileUtil.processLineBreak(line, RdfFileUtil.getLineBreak(fileConfig)
                , fileConfig.isAppendLinebreakAtLast() && fileMeta.isAppendLinebreakAtLast()
                , !hasWritten);
        writer.write(lineWithLB);
        hasWritten = true;
    }

    @Override
    public Summary getSummary() {
        if (fileConfig.isSummaryEnable()) {
            return summary;
        } else {
            throw new RdfFileException(
                "rdf-file#ProtocolFileWriter.geSummary() 请入参指定FileConfig.setSummaryEnable(true)来进行汇总参数收集",
                RdfErrorEnum.SUMMARY_DISNABLE);
        }
    }

    @Override
    public void append(InputStream in) {
        RdfFileUtil.assertNotNull(in, "ProtocolFileWriter.append(inputsream == null) ",
            RdfErrorEnum.ILLEGAL_ARGUMENT);
        ensureOpen();
        writer.append(in);
    }

    @Override
    public FileConfig getFileConfig() {
        return fileConfig;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy