package com.srbenoit.filter.filters;

import com.srbenoit.filter.AbstractFilter;
import com.srbenoit.filter.FilterException;
import com.srbenoit.filter.FilterInput;
import com.srbenoit.filter.FilterOutput;
import com.srbenoit.filter.FilterTreeExecutor;
import com.srbenoit.filter.Pipe;
import com.srbenoit.filter.items.ByteArrayPipeItem;
import com.srbenoit.filter.items.StringPipeItem;
import org.bouncycastle.util.encoders.Base64;

/**
 * A filter that converts a byte array into a Base-64 representation of the data.
 */
public class ToBase64 extends AbstractFilter {

    /** version number for serialization */
    private static final long serialVersionUID = 1418293103288603213L;

    /**
     * Constructs a new <code>ToBase64</code>.
     */
    public ToBase64() {

        super("ToBase64", ToBase64.class.getName());

        this.inputs.add(new FilterInput(ByteArrayPipeItem.class, "Binary data"));
        this.outputs.add(new FilterOutput(StringPipeItem.class, "Base-64 encoded string",
                "base-64"));
    }

    /**
     * Duplicates the filter including all of its settings, but returns an independent object.
     *
     * @return  the duplicated object
     */
    @Override public AbstractFilter duplicate() {

        return new ToBase64();
    }

    /**
     * Performs the filter operation.
     *
     * @param   executor  the <code>FilterTreeExecutor</code> that is executing the filter
     * @param   pipe      a pipe containing the input data items
     * @throws  FilterException  if the filter cannot complete
     */
    @Override public void filter(final FilterTreeExecutor executor, final Pipe pipe)
        throws FilterException {

        ByteArrayPipeItem in0;
        StringPipeItem out0;

        validateInputs(pipe);

        in0 = (ByteArrayPipeItem) pipe.get("Binary");

        out0 = new StringPipeItem("encoded", "Base64", pipe);
        out0.setData(new String(Base64.encode(in0.getData())));

        pipe.add(out0);
    }
}
