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

xyz.cofe.text.UnionWriter Maven / Gradle / Ivy

/* 
 * The MIT License
 *
 * Copyright 2014 Kamnev Georgiy ([email protected]).
 *
 * Данная лицензия разрешает, безвозмездно, лицам, получившим копию данного программного 
 * обеспечения и сопутствующей документации (в дальнейшем именуемыми "Программное Обеспечение"), 
 * использовать Программное Обеспечение без ограничений, включая неограниченное право на 
 * использование, копирование, изменение, объединение, публикацию, распространение, сублицензирование 
 * и/или продажу копий Программного Обеспечения, также как и лицам, которым предоставляется 
 * данное Программное Обеспечение, при соблюдении следующих условий:
 *
 * Вышеупомянутый копирайт и данные условия должны быть включены во все копии 
 * или значимые части данного Программного Обеспечения.
 *
 * ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ ЛЮБОГО ВИДА ГАРАНТИЙ, 
 * ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ГАРАНТИЯМИ ТОВАРНОЙ ПРИГОДНОСТИ, 
 * СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И НЕНАРУШЕНИЯ ПРАВ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ 
 * ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ПО ИСКАМ О ВОЗМЕЩЕНИИ УЩЕРБА, УБЫТКОВ 
 * ИЛИ ДРУГИХ ТРЕБОВАНИЙ ПО ДЕЙСТВУЮЩИМ КОНТРАКТАМ, ДЕЛИКТАМ ИЛИ ИНОМУ, ВОЗНИКШИМ ИЗ, ИМЕЮЩИМ 
 * ПРИЧИНОЙ ИЛИ СВЯЗАННЫМ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ 
 * ИЛИ ИНЫМИ ДЕЙСТВИЯМИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.
 */
package xyz.cofe.text;

import java.beans.ExceptionListener;
import java.io.IOException;
import java.io.Writer;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.Set;

/**
 * Делает прозрачную запись сразу во внесколько потоков
 * @author gocha
 */
public class UnionWriter extends java.io.Writer
{
    /**
     * Куда записывать
     */
    protected Set writers = new LinkedHashSet();
    
    /**
     * Приемник сообщений о ошибке
     */
    protected ExceptionListener exListener = null;

    /**
     * Конструктор по умолчанию
     */
    public UnionWriter()
    {
    }

    /**
     * Конструктор
     * @param writers куда записывать
     */
    public UnionWriter(Writer ... writers)
    {
        if( writers==null )return;

        Iterable ww = getWriters();
        if( ww==null )return;
        if( !(ww instanceof Collection) )return;
        Collection _w = (Collection)ww;

        for( Writer w : writers )
        {
            if( w==null )continue;
            _w.add(w);
        }
    }

    /**
     * Конструктор
     * @param writers куда записывать
     */
    public UnionWriter(Iterable writers)
    {
        if( writers==null )return;

        Iterable ww = getWriters();
        if( ww==null )return;
        if( !(ww instanceof Collection) )return;
        Collection _w = (Collection)ww;

        for( Writer w : writers )
        {
            if( w==null )continue;
            _w.add(w);
        }
    }

    /**
     * Конструктор
     * @param exceptionListener Приемник ошибок
     * @param writers куда записывать
     */
    public UnionWriter(ExceptionListener exceptionListener, Writer ... writers)
    {
        setExceptionListener(exceptionListener);
        if( writers==null )return;

        Iterable ww = getWriters();
        if( ww==null )return;
        if( !(ww instanceof Collection) )return;
        Collection _w = (Collection)ww;

        for( Writer w : writers )
        {
            if( w==null )continue;
            _w.add(w);
        }
    }

    /**
     * Конструктор
     * @param exceptionListener Приемник ошибок
     * @param writers куда записывать
     */
    public UnionWriter(ExceptionListener exceptionListener, Iterable writers)
    {
        setExceptionListener(exceptionListener);
        if( writers==null )return;

        Iterable ww = getWriters();
        if( ww==null )return;
        if( !(ww instanceof Collection) )return;
        Collection _w = (Collection)ww;

        for( Writer w : writers )
        {
            if( w==null )continue;
            _w.add(w);
        }
    }

    /**
     * Указывает куда производиться запись
     * @return куда производиться запись
     */
    public Set getWriters() {
        if( writers==null )writers = new LinkedHashSet();
        return writers;
    }

    /**
     * Указывает куда производиться запись
     * @param writers куда производиться запись
     */
    public void setWriters(Iterable writers) {
        if( this.writers!=null ){
            this.writers.clear();
        }else{
            this.writers = new LinkedHashSet();
        }
        if( writers!=null ){
            for( Writer w : writers ){
                if( w!=null )this.writers.add( w );
            }
        }
    }

    /**
     * Указывает приемник ошибок
     * @return приемник ошибок
     */
    public ExceptionListener getExceptionListener() {
        return exListener;
    }

    /**
     * Указывает приемник ошибок
     * @param exListener приемник ошибок
     */
    public void setExceptionListener(ExceptionListener exListener) {
        this.exListener = exListener;
    }

    /**
     * Перехватывать ошибки и перенаправлять в приемник.
     * По умолчанию true
     * @return true - перехватывать
     */
    protected boolean isCatchException()
    {
        return true;
    }

    @Override
    public void write(char[] cbuf, int off, int len) throws IOException {
        Iterable _writers = getWriters();
        if( _writers==null )return;

        for( Writer w : _writers )
        {
            if( w==null )continue;
            if( isCatchException() )
            {
                try
                {
                    w.write(cbuf, off, len);
                }
                catch(Exception e)
                {
                    ExceptionListener el = getExceptionListener();
                    if( el!=null )el.exceptionThrown(e);
                }
            }else{
                w.write(cbuf, off, len);
            }
        }
    }

    @Override
    public void flush() throws IOException {
        Iterable _writers = getWriters();
        if( _writers==null )return;

        for( Writer w : _writers )
        {
            if( w==null )continue;
            if( isCatchException() )
            {
                try
                {
                    w.flush();
                }
                catch(Exception e)
                {
                    ExceptionListener el = getExceptionListener();
                    if( el!=null )el.exceptionThrown(e);
                }
            }else{
                w.flush();
            }
        }
    }

    @Override
    public void close() throws IOException {
        Iterable _writers = getWriters();
        if( _writers==null )return;

        for( Writer w : _writers )
        {
            if( w==null )continue;
            if( isCatchException() )
            {
                try
                {
                    w.close();
                }
                catch(Exception e)
                {
                    ExceptionListener el = getExceptionListener();
                    if( el!=null )el.exceptionThrown(e);
                }
            }else{
                w.close();
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy