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.Reader;
024import java.io.Writer;
025import java.net.URI;
026import java.nio.file.Path;
027import java.nio.file.Paths;
028import java.util.Objects;
029
030import org.apache.commons.io.build.AbstractOrigin.ByteArrayOrigin;
031import org.apache.commons.io.build.AbstractOrigin.FileOrigin;
032import org.apache.commons.io.build.AbstractOrigin.InputStreamOrigin;
033import org.apache.commons.io.build.AbstractOrigin.OutputStreamOrigin;
034import org.apache.commons.io.build.AbstractOrigin.PathOrigin;
035import org.apache.commons.io.build.AbstractOrigin.ReaderOrigin;
036import org.apache.commons.io.build.AbstractOrigin.URIOrigin;
037import org.apache.commons.io.build.AbstractOrigin.WriterOrigin;
038
039/**
040 * Abstracts building a typed instance of {@code T}.
041 *
042 * @param <T> the type of instances to build.
043 * @param <B> the type of builder subclass.
044 * @since 2.12.0
045 */
046public abstract class AbstractOriginSupplier<T, B extends AbstractOriginSupplier<T, B>> extends AbstractSupplier<T, B> {
047
048    /**
049     * Creates a new byte array origin for a byte array.
050     *
051     * @param origin the file.
052     * @return a new file origin
053     */
054    protected static ByteArrayOrigin newByteArrayOrigin(final byte[] origin) {
055        return new ByteArrayOrigin(origin);
056    }
057
058    /**
059     * Creates a new file origin for a file.
060     *
061     * @param origin the file.
062     * @return a new file origin
063     */
064    protected static FileOrigin newFileOrigin(final File origin) {
065        return new FileOrigin(origin);
066    }
067
068    /**
069     * Creates a new file origin for a file path.
070     *
071     * @param origin the file path.
072     * @return a new file origin
073     */
074    protected static FileOrigin newFileOrigin(final String origin) {
075        return new FileOrigin(new File(origin));
076    }
077
078    /**
079     * Creates a new input stream origin for a file.
080     *
081     * @param origin the input stream.
082     * @return a new input stream origin
083     */
084    protected static InputStreamOrigin newInputStreamOrigin(final InputStream origin) {
085        return new InputStreamOrigin(origin);
086    }
087
088    /**
089     * Creates a new output stream origin for a file.
090     *
091     * @param origin the output stream.
092     * @return a new output stream origin
093     */
094    protected static OutputStreamOrigin newOutputStreamOrigin(final OutputStream origin) {
095        return new OutputStreamOrigin(origin);
096    }
097
098    /**
099     * Creates a new path origin for a file.
100     *
101     * @param origin the path.
102     * @return a new path origin
103     */
104    protected static PathOrigin newPathOrigin(final Path origin) {
105        return new PathOrigin(origin);
106    }
107
108    /**
109     * Creates a new path name origin for a path name.
110     *
111     * @param origin the path name.
112     * @return a new path name origin
113     */
114    protected static PathOrigin newPathOrigin(final String origin) {
115        return new PathOrigin(Paths.get(origin));
116    }
117
118    /**
119     * Creates a new reader origin for a reader.
120     *
121     * @param origin the reader.
122     * @return a new reader origin
123     */
124    protected static ReaderOrigin newReaderOrigin(final Reader origin) {
125        return new ReaderOrigin(origin);
126    }
127
128    /**
129     * Creates a new reader origin for a URI.
130     *
131     * @param origin the URI.
132     * @return a new URI origin
133     */
134    protected static URIOrigin newURIOrigin(final URI origin) {
135        return new URIOrigin(origin);
136    }
137
138    /**
139     * Creates a new writer origin for a file.
140     *
141     * @param origin the writer.
142     * @return a new writer origin
143     */
144    protected static WriterOrigin newWriterOrigin(final Writer origin) {
145        return new WriterOrigin(origin);
146    }
147
148    /**
149     * The underlying origin.
150     */
151    private AbstractOrigin<?, ?> origin;
152
153    /**
154     * Checks whether the origin is null.
155     *
156     * @return the origin.
157     * @throws NullPointerException if the {@code origin} is {@code null}
158     */
159    protected AbstractOrigin<?, ?> checkOrigin() {
160        return Objects.requireNonNull(origin, "origin");
161    }
162
163    /**
164     * Gets the origin.
165     *
166     * @return the origin.
167     */
168    protected AbstractOrigin<?, ?> getOrigin() {
169        return origin;
170    }
171
172    /**
173     * Tests whether the origin is null.
174     *
175     * @return whether the origin is null.
176     */
177    protected boolean hasOrigin() {
178        return origin != null;
179    }
180
181    /**
182     * Sets a new origin.
183     *
184     * @param origin the new origin.
185     * @return this
186     */
187    public B setByteArray(final byte[] origin) {
188        return setOrigin(newByteArrayOrigin(origin));
189    }
190
191    /**
192     * Sets a new origin.
193     *
194     * @param origin the new origin.
195     * @return this
196     */
197    public B setFile(final File origin) {
198        return setOrigin(newFileOrigin(origin));
199    }
200
201    /**
202     * Sets a new origin.
203     *
204     * @param origin the new origin.
205     * @return this
206     */
207    public B setFile(final String origin) {
208        return setOrigin(newFileOrigin(origin));
209    }
210
211    /**
212     * Sets a new origin.
213     *
214     * @param origin the new origin.
215     * @return this
216     */
217    public B setInputStream(final InputStream origin) {
218        return setOrigin(newInputStreamOrigin(origin));
219    }
220
221    /**
222     * Sets a new origin.
223     *
224     * @param origin the new origin.
225     * @return this
226     */
227    protected B setOrigin(final AbstractOrigin<?, ?> origin) {
228        this.origin = origin;
229        return asThis();
230    }
231
232    /**
233     * Sets a new origin.
234     *
235     * @param origin the new origin.
236     * @return this
237     */
238    public B setOutputStream(final OutputStream origin) {
239        return setOrigin(newOutputStreamOrigin(origin));
240    }
241
242    /**
243     * Sets a new origin.
244     *
245     * @param origin the new origin.
246     * @return this
247     */
248    public B setPath(final Path origin) {
249        return setOrigin(newPathOrigin(origin));
250    }
251
252    /**
253     * Sets a new origin.
254     *
255     * @param origin the new origin.
256     * @return this
257     */
258    public B setPath(final String origin) {
259        return setOrigin(newPathOrigin(origin));
260    }
261
262    /**
263     * Sets a new origin.
264     *
265     * @param origin the new origin.
266     * @return this
267     */
268    public B setReader(final Reader origin) {
269        return setOrigin(newReaderOrigin(origin));
270    }
271
272    /**
273     * Sets a new origin.
274     *
275     * @param origin the new origin.
276     * @return this
277     */
278    public B setURI(final URI origin) {
279        return setOrigin(newURIOrigin(origin));
280    }
281
282    /**
283     * Sets a new origin.
284     *
285     * @param origin the new origin.
286     * @return this
287     */
288    public B setWriter(final Writer origin) {
289        return setOrigin(newWriterOrigin(origin));
290    }
291}