    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     * Constructs a new instance for subclasses.
    192     */
    193    public AbstractOriginSupplier() {
    194        // empty
    195    }
    196
    197    /**
    198     * Checks whether the origin is null.
    199     *
    200     * @return the origin.
    201     * @throws IllegalStateException if the {@code origin} is {@code null}.
    202     */
    203    protected AbstractOrigin<?, ?> checkOrigin() {
    204        if (origin == null) {
    205            throw new IllegalStateException("origin == null");
    206        }
    207        return origin;
    208    }
    209
    210    /**
    211     * Gets the origin.
    212     *
    213     * @return the origin.
    214     */
    215    protected AbstractOrigin<?, ?> getOrigin() {
    216        return origin;
    217    }
    218
    219    /**
    220     * Tests whether the origin is null.
    221     *
    222     * @return whether the origin is null.
    223     */
    224    protected boolean hasOrigin() {
    225        return origin != null;
    226    }
    227
    228    /**
    229     * Sets a new origin.
    230     *
    231     * @param origin the new origin.
    232     * @return {@code this} instance.
    233     */
    234    public B setByteArray(final byte[] origin) {
    235        return setOrigin(newByteArrayOrigin(origin));
    236    }
    237
    238    /**
    239     * Sets a new origin.
    240     *
    241     * @param origin the new origin.
    242     * @return {@code this} instance.
    243     * @since 2.13.0
    244     */
    245    public B setCharSequence(final CharSequence origin) {
    246        return setOrigin(newCharSequenceOrigin(origin));
    247    }
    248
    249    /**
    250     * Sets a new origin.
    251     *
    252     * @param origin the new origin.
    253     * @return {@code this} instance.
    254     */
    255    public B setFile(final File origin) {
    256        return setOrigin(newFileOrigin(origin));
    257    }
    258
    259    /**
    260     * Sets a new origin.
    261     *
    262     * @param origin the new origin.
    263     * @return {@code this} instance.
    264     */
    265    public B setFile(final String origin) {
    266        return setOrigin(newFileOrigin(origin));
    267    }
    268
    269    /**
    270     * Sets a new origin.
    271     *
    272     * @param origin the new origin.
    273     * @return {@code this} instance.
    274     */
    275    public B setInputStream(final InputStream origin) {
    276        return setOrigin(newInputStreamOrigin(origin));
    277    }
    278
    279    /**
    280     * Sets a new origin.
    281     *
    282     * @param origin the new origin.
    283     * @return {@code this} instance.
    284     */
    285    protected B setOrigin(final AbstractOrigin<?, ?> origin) {
    286        this.origin = origin;
    287        return asThis();
    288    }
    289
    290    /**
    291     * Sets a new origin.
    292     *
    293     * @param origin the new origin.
    294     * @return {@code this} instance.
    295     */
    296    public B setOutputStream(final OutputStream origin) {
    297        return setOrigin(newOutputStreamOrigin(origin));
    298    }
    299
    300    /**
    301     * Sets a new origin.
    302     *
    303     * @param origin the new origin.
    304     * @return {@code this} instance.
    305     */
    306    public B setPath(final Path origin) {
    307        return setOrigin(newPathOrigin(origin));
    308    }
    309
    310    /**
    311     * Sets a new origin.
    312     *
    313     * @param origin the new origin.
    314     * @return {@code this} instance.
    315     */
    316    public B setPath(final String origin) {
    317        return setOrigin(newPathOrigin(origin));
    318    }
    319
    320    /**
    321     * Sets a new origin.
    322     *
    323     * @param origin the new origin.
    324     * @return {@code this} instance.
    325     * @since 2.18.0
    326     */
    327    public B setRandomAccessFile(final IORandomAccessFile origin) {
    328        return setOrigin(newRandomAccessFileOrigin(origin));
    329    }
    330
    331    /**
    332     * Sets a new origin.
    333     *
    334     * @param origin the new origin.
    335     * @return {@code this} instance.
    336     * @since 2.18.0
    337     */
    338    public B setRandomAccessFile(final RandomAccessFile origin) {
    339        return setOrigin(newRandomAccessFileOrigin(origin));
    340    }
    341
    342    /**
    343     * Sets a new origin.
    344     *
    345     * @param origin the new origin.
    346     * @return {@code this} instance.
    347     */
    348    public B setReader(final Reader origin) {
    349        return setOrigin(newReaderOrigin(origin));
    350    }
    351
    352    /**
    353     * Sets a new origin.
    354     *
    355     * @param origin the new origin.
    356     * @return {@code this} instance.
    357     */
    358    public B setURI(final URI origin) {
    359        return setOrigin(newURIOrigin(origin));
    360    }
    361
    362    /**
    363     * Sets a new origin.
    364     *
    365     * @param origin the new origin.
    366     * @return {@code this} instance.
    367     */
    368    public B setWriter(final Writer origin) {
    369        return setOrigin(newWriterOrigin(origin));
    370    }
    371}