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

com.documents4j.job.FailureAwareConverter Maven / Gradle / Ivy

There is a newer version: 1.1.12
Show newest version
package com.documents4j.job;

import com.documents4j.api.*;
import com.documents4j.throwables.ConverterAccessException;

import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Map;
import java.util.Set;

class FailureAwareConverter implements IConverter {

    private final IConverter converter;

    private final IConverterFailureCallback failureCallback;

    FailureAwareConverter(IConverter converter, IConverterFailureCallback failureCallback) {
        this.converter = converter;
        this.failureCallback = failureCallback;
    }

    @Override
    public IConversionJobWithSourceUnspecified convert(InputStream source) {
        return new FailureAwareConversionWithSourceUnspecified(converter.convert(source));
    }

    @Override
    public IConversionJobWithSourceUnspecified convert(InputStream source, boolean close) {
        return new FailureAwareConversionWithSourceUnspecified(converter.convert(source, close));
    }

    @Override
    public IConversionJobWithSourceUnspecified convert(IInputStreamSource source) {
        return new FailureAwareConversionWithSourceUnspecified(converter.convert(source));
    }

    @Override
    public IConversionJobWithSourceUnspecified convert(File source) {
        return new FailureAwareConversionWithSourceUnspecified(converter.convert(source));
    }

    @Override
    public IConversionJobWithSourceUnspecified convert(IFileSource source) {
        return new FailureAwareConversionWithSourceUnspecified(converter.convert(source));
    }

    @Override
    public Map> getSupportedConversions() {
        return converter.getSupportedConversions();
    }

    @Override
    public boolean isOperational() {
        return converter.isOperational();
    }

    @Override
    public void shutDown() {
        converter.shutDown();
    }

    private void reportException(Exception e) {
        if (e instanceof ConverterAccessException) {
            failureCallback.onFailure(converter);
        }
    }

    private class FailureAwareConversionWithSourceUnspecified implements IConversionJobWithSourceUnspecified {

        private final IConversionJobWithSourceUnspecified conversionJob;

        private FailureAwareConversionWithSourceUnspecified(IConversionJobWithSourceUnspecified conversionJob) {
            this.conversionJob = conversionJob;
        }

        @Override
        public IConversionJobWithSourceSpecified as(DocumentType sourceFormat) {
            return new FailureAwareConversionWithSourceSpecified(conversionJob.as(sourceFormat));
        }
    }

    private class FailureAwareConversionWithSourceSpecified implements IConversionJobWithSourceSpecified {

        private final IConversionJobWithSourceSpecified conversionJob;

        private FailureAwareConversionWithSourceSpecified(IConversionJobWithSourceSpecified conversionJob) {
            this.conversionJob = conversionJob;
        }

        @Override
        public IConversionJobWithTargetUnspecified to(File target) {
            return to(target, new NoopFileConsumer());
        }

        @Override
        public IConversionJobWithTargetUnspecified to(File target, IFileConsumer callback) {
            return conversionJob.to(target, new FailureAwareFileConsumer(callback));
        }

        @Override
        public IConversionJobWithTargetUnspecified to(OutputStream target) {
            return to(target, ConversionJobWithSourceSpecifiedAdapter.DEFAULT_CLOSE_STREAM);
        }

        @Override
        public IConversionJobWithTargetUnspecified to(OutputStream target, boolean closeStream) {
            return to(new OutputStreamToInputStreamConsumer(target, closeStream));
        }

        @Override
        public IConversionJobWithTargetUnspecified to(IInputStreamConsumer callback) {
            return conversionJob.to(new FailureAwareStreamConsumer(callback));
        }
    }

    private class FailureAwareFileConsumer implements IFileConsumer {

        private IFileConsumer fileConsumer;

        private FailureAwareFileConsumer(IFileConsumer fileConsumer) {
            this.fileConsumer = fileConsumer;
        }

        @Override
        public void onComplete(File file) {
            fileConsumer.onComplete(file);
        }

        @Override
        public void onCancel(File file) {
            fileConsumer.onCancel(file);
        }

        @Override
        public void onException(File file, Exception e) {
            try {
                reportException(e);
            } finally {
                fileConsumer.onException(file, e);
            }
        }
    }

    private class FailureAwareStreamConsumer implements IInputStreamConsumer {

        private final IInputStreamConsumer inputStreamConsumer;

        private FailureAwareStreamConsumer(IInputStreamConsumer inputStreamConsumer) {
            this.inputStreamConsumer = inputStreamConsumer;
        }

        @Override
        public void onComplete(InputStream inputStream) {
            inputStreamConsumer.onComplete(inputStream);
        }

        @Override
        public void onCancel() {
            inputStreamConsumer.onCancel();
        }

        @Override
        public void onException(Exception e) {
            try {
                reportException(e);
            } finally {
                inputStreamConsumer.onException(e);
            }
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy