    001/*
    002 * Licensed to the Apache Software Foundation (ASF) under one or more
    003 * contributor license agreements.  See the NOTICE file distributed with
    004 * this work for additional information regarding copyright ownership.
    005 * The ASF licenses this file to You under the Apache License, Version 2.0
    006 * (the "License"); you may not use this file except in compliance with
    007 * the License.  You may obtain a copy of the License at
    008 *
    009 *      http://www.apache.org/licenses/LICENSE-2.0
    010 *
    011 * Unless required by applicable law or agreed to in writing, software
    012 * distributed under the License is distributed on an "AS IS" BASIS,
    013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    014 * See the License for the specific language governing permissions and
    015 * limitations under the License.
    016 */
    017
    018package org.apache.commons.io.build;
    019
    020import java.io.File;
    021import java.io.InputStream;
    022import java.io.OutputStream;
    023import java.io.RandomAccessFile;
    024import java.io.Reader;
    025import java.io.Writer;
    026import java.net.URI;
    027import java.nio.file.Path;
    028import java.nio.file.Paths;
    029
    030import org.apache.commons.io.IORandomAccessFile;
    031import org.apache.commons.io.build.AbstractOrigin.ByteArrayOrigin;
    032import org.apache.commons.io.build.AbstractOrigin.CharSequenceOrigin;
    033import org.apache.commons.io.build.AbstractOrigin.FileOrigin;
    034import org.apache.commons.io.build.AbstractOrigin.IORandomAccessFileOrigin;
    035import org.apache.commons.io.build.AbstractOrigin.InputStreamOrigin;
    036import org.apache.commons.io.build.AbstractOrigin.OutputStreamOrigin;
    037import org.apache.commons.io.build.AbstractOrigin.PathOrigin;
    038import org.apache.commons.io.build.AbstractOrigin.RandomAccessFileOrigin;
    039import org.apache.commons.io.build.AbstractOrigin.ReaderOrigin;
    040import org.apache.commons.io.build.AbstractOrigin.URIOrigin;
    041import org.apache.commons.io.build.AbstractOrigin.WriterOrigin;
    042
    043/**
    044 * Abstracts building an instance of {@code T}.
    045 *
    046 * @param <T> the type of instances to build.
    047 * @param <B> the type of builder subclass.
    048 * @since 2.12.0
    049 */
    050public abstract class AbstractOriginSupplier<T, B extends AbstractOriginSupplier<T, B>> extends AbstractSupplier<T, B> {
    051
    052    /**
    053     * Constructs a new byte array origin for a byte array.
    054     *
    055     * @param origin the byte array.
    056     * @return a new byte array origin.
    057     */
    058    protected static ByteArrayOrigin newByteArrayOrigin(final byte[] origin) {
    059        return new ByteArrayOrigin(origin);
    060    }
    061
    062    /**
    063     * Constructs a new CharSequence origin for a CharSequence.
    064     *
    065     * @param origin the CharSequence.
    066     * @return a new file origin.
    067     * @since 2.13.0
    068     */
    069    protected static CharSequenceOrigin newCharSequenceOrigin(final CharSequence origin) {
    070        return new CharSequenceOrigin(origin);
    071    }
    072
    073    /**
    074     * Constructs a new file origin for a file.
    075     *
    076     * @param origin the file.
    077     * @return a new file origin.
    078     */
    079    protected static FileOrigin newFileOrigin(final File origin) {
    080        return new FileOrigin(origin);
    081    }
    082
    083    /**
    084     * Constructs a new file origin for a file path.
    085     *
    086     * @param origin the file path.
    087     * @return a new file origin.
    088     */
    089    protected static FileOrigin newFileOrigin(final String origin) {
    090        return new FileOrigin(new File(origin));
    091    }
    092
    093    /**
    094     * Constructs a new input stream origin for a file.
    095     *
    096     * @param origin the input stream.
    097     * @return a new input stream origin.
    098     */
    099    protected static InputStreamOrigin newInputStreamOrigin(final InputStream origin) {
    100        return new InputStreamOrigin(origin);
    101    }
    102
    103    /**
    104     * Constructs a new output stream origin for a file.
    105     *
    106     * @param origin the output stream.
    107     * @return a new output stream origin.
    108     */
    109    protected static OutputStreamOrigin newOutputStreamOrigin(final OutputStream origin) {
    110        return new OutputStreamOrigin(origin);
    111    }
    112
    113    /**
    114     * Constructs a new path origin for a file.
    115     *
    116     * @param origin the path.
    117     * @return a new path origin.
    118     */
    119    protected static PathOrigin newPathOrigin(final Path origin) {
    120        return new PathOrigin(origin);
    121    }
    122
    123    /**
    124     * Constructs a new path name origin for a path name.
    125     *
    126     * @param origin the path name.
    127     * @return a new path name origin.
    128     */
    129    protected static PathOrigin newPathOrigin(final String origin) {
    130        return new PathOrigin(Paths.get(origin));
    131    }
    132
    133    /**
    134     * Constructs a new RandomAccessFile origin for a RandomAccessFile.
    135     *
    136     * @param origin the reader.
    137     * @return a new reader origin.
    138     * @since 2.18.0
    139     */
    140    protected static IORandomAccessFileOrigin newRandomAccessFileOrigin(final IORandomAccessFile origin) {
    141        return new IORandomAccessFileOrigin(origin);
    142    }
    143
    144    /**
    145     * Constructs a new RandomAccessFile origin for a RandomAccessFile.
    146     *
    147     * @param origin the reader.
    148     * @return a new reader origin.
    149     * @since 2.18.0
    150     */
    151    protected static RandomAccessFileOrigin newRandomAccessFileOrigin(final RandomAccessFile origin) {
    152        return new RandomAccessFileOrigin(origin);
    153    }
    154
    155    /**
    156     * Constructs a new reader origin for a reader.
    157     *
    158     * @param origin the reader.
    159     * @return a new reader origin.
    160     */
    161    protected static ReaderOrigin newReaderOrigin(final Reader origin) {
    162        return new ReaderOrigin(origin);
    163    }
    164
    165    /**
    166     * Constructs a new reader origin for a URI.
    167     *
    168     * @param origin the URI.
    169     * @return a new URI origin.
    170     */
    171    protected static URIOrigin newURIOrigin(final URI origin) {
    172        return new URIOrigin(origin);
    173    }
    174
    175    /**
    176     * Constructs a new writer origin for a file.
    177     *
    178     * @param origin the writer.
    179     * @return a new writer .
    180     */
    181    protected static WriterOrigin newWriterOrigin(final Writer origin) {
    182        return new WriterOrigin(origin);
    183    }
    184
    185    /**
    186     * The underlying origin.
    187     */
    188    private AbstractOrigin<?, ?> origin;
    189
    190    /**
    191     * Checks whether the origin is null.
    192     *
    193     * @return the origin.
    194     * @throws IllegalStateException if the {@code origin} is {@code null}.
    195     */
    196    protected AbstractOrigin<?, ?> checkOrigin() {
    197        if (origin == null) {
    198            throw new IllegalStateException("origin == null");
    199        }
    200        return origin;
    201    }
    202
    203    /**
    204     * Gets the origin.
    205     *
    206     * @return the origin.
    207     */
    208    protected AbstractOrigin<?, ?> getOrigin() {
    209        return origin;
    210    }
    211
    212    /**
    213     * Tests whether the origin is null.
    214     *
    215     * @return whether the origin is null.
    216     */
    217    protected boolean hasOrigin() {
    218        return origin != null;
    219    }
    220
    221    /**
    222     * Sets a new origin.
    223     *
    224     * @param origin the new origin.
    225     * @return {@code this} instance.
    226     */
    227    public B setByteArray(final byte[] origin) {
    228        return setOrigin(newByteArrayOrigin(origin));
    229    }
    230
    231    /**
    232     * Sets a new origin.
    233     *
    234     * @param origin the new origin.
    235     * @return {@code this} instance.
    236     * @since 2.13.0
    237     */
    238    public B setCharSequence(final CharSequence origin) {
    239        return setOrigin(newCharSequenceOrigin(origin));
    240    }
    241
    242    /**
    243     * Sets a new origin.
    244     *
    245     * @param origin the new origin.
    246     * @return {@code this} instance.
    247     */
    248    public B setFile(final File origin) {
    249        return setOrigin(newFileOrigin(origin));
    250    }
    251
    252    /**
    253     * Sets a new origin.
    254     *
    255     * @param origin the new origin.
    256     * @return {@code this} instance.
    257     */
    258    public B setFile(final String origin) {
    259        return setOrigin(newFileOrigin(origin));
    260    }
    261
    262    /**
    263     * Sets a new origin.
    264     *
    265     * @param origin the new origin.
    266     * @return {@code this} instance.
    267     */
    268    public B setInputStream(final InputStream origin) {
    269        return setOrigin(newInputStreamOrigin(origin));
    270    }
    271
    272    /**
    273     * Sets a new origin.
    274     *
    275     * @param origin the new origin.
    276     * @return {@code this} instance.
    277     */
    278    protected B setOrigin(final AbstractOrigin<?, ?> origin) {
    279        this.origin = origin;
    280        return asThis();
    281    }
    282
    283    /**
    284     * Sets a new origin.
    285     *
    286     * @param origin the new origin.
    287     * @return {@code this} instance.
    288     */
    289    public B setOutputStream(final OutputStream origin) {
    290        return setOrigin(newOutputStreamOrigin(origin));
    291    }
    292
    293    /**
    294     * Sets a new origin.
    295     *
    296     * @param origin the new origin.
    297     * @return {@code this} instance.
    298     */
    299    public B setPath(final Path origin) {
    300        return setOrigin(newPathOrigin(origin));
    301    }
    302
    303    /**
    304     * Sets a new origin.
    305     *
    306     * @param origin the new origin.
    307     * @return {@code this} instance.
    308     */
    309    public B setPath(final String origin) {
    310        return setOrigin(newPathOrigin(origin));
    311    }
    312
    313    /**
    314     * Sets a new origin.
    315     *
    316     * @param origin the new origin.
    317     * @return {@code this} instance.
    318     * @since 2.18.0
    319     */
    320    public B setRandomAccessFile(final IORandomAccessFile origin) {
    321        return setOrigin(newRandomAccessFileOrigin(origin));
    322    }
    323
    324    /**
    325     * Sets a new origin.
    326     *
    327     * @param origin the new origin.
    328     * @return {@code this} instance.
    329     * @since 2.18.0
    330     */
    331    public B setRandomAccessFile(final RandomAccessFile origin) {
    332        return setOrigin(newRandomAccessFileOrigin(origin));
    333    }
    334
    335    /**
    336     * Sets a new origin.
    337     *
    338     * @param origin the new origin.
    339     * @return {@code this} instance.
    340     */
    341    public B setReader(final Reader origin) {
    342        return setOrigin(newReaderOrigin(origin));
    343    }
    344
    345    /**
    346     * Sets a new origin.
    347     *
    348     * @param origin the new origin.
    349     * @return {@code this} instance.
    350     */
    351    public B setURI(final URI origin) {
    352        return setOrigin(newURIOrigin(origin));
    353    }
    354
    355    /**
    356     * Sets a new origin.
    357     *
    358     * @param origin the new origin.
    359     * @return {@code this} instance.
    360     */
    361    public B setWriter(final Writer origin) {
    362        return setOrigin(newWriterOrigin(origin));
    363    }
    364}