View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      https://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  package org.apache.commons.io.build;
19  
20  import java.io.File;
21  import java.io.InputStream;
22  import java.io.OutputStream;
23  import java.io.RandomAccessFile;
24  import java.io.Reader;
25  import java.io.Writer;
26  import java.net.URI;
27  import java.nio.channels.Channel;
28  import java.nio.file.Path;
29  import java.nio.file.Paths;
30  
31  import org.apache.commons.io.IORandomAccessFile;
32  import org.apache.commons.io.build.AbstractOrigin.ByteArrayOrigin;
33  import org.apache.commons.io.build.AbstractOrigin.ChannelOrigin;
34  import org.apache.commons.io.build.AbstractOrigin.CharSequenceOrigin;
35  import org.apache.commons.io.build.AbstractOrigin.FileOrigin;
36  import org.apache.commons.io.build.AbstractOrigin.IORandomAccessFileOrigin;
37  import org.apache.commons.io.build.AbstractOrigin.InputStreamOrigin;
38  import org.apache.commons.io.build.AbstractOrigin.OutputStreamOrigin;
39  import org.apache.commons.io.build.AbstractOrigin.PathOrigin;
40  import org.apache.commons.io.build.AbstractOrigin.RandomAccessFileOrigin;
41  import org.apache.commons.io.build.AbstractOrigin.ReaderOrigin;
42  import org.apache.commons.io.build.AbstractOrigin.URIOrigin;
43  import org.apache.commons.io.build.AbstractOrigin.WriterOrigin;
44  
45  /**
46   * Abstracts <em>building</em> an instance of type {@code T} where {@code T} is unbounded from a wrapped {@linkplain AbstractOrigin origin}.
47   *
48   * @param <T> the type of instances to build.
49   * @param <B> the type of builder subclass.
50   * @since 2.12.0
51   */
52  public abstract class AbstractOriginSupplier<T, B extends AbstractOriginSupplier<T, B>> extends AbstractSupplier<T, B> {
53  
54      /**
55       * Constructs a new byte array origin for a byte array.
56       *
57       * @param origin the byte array.
58       * @return a new byte array origin.
59       */
60      protected static ByteArrayOrigin newByteArrayOrigin(final byte[] origin) {
61          return new ByteArrayOrigin(origin);
62      }
63  
64      /**
65       * Constructs a new channel origin for a channel.
66       *
67       * @param origin the channel.
68       * @return a new channel origin.
69       * @since 2.21.0
70       */
71      protected static ChannelOrigin newChannelOrigin(final Channel origin) {
72          return new ChannelOrigin(origin);
73      }
74  
75      /**
76       * Constructs a new CharSequence origin for a CharSequence.
77       *
78       * @param origin the CharSequence.
79       * @return a new file origin.
80       * @since 2.13.0
81       */
82      protected static CharSequenceOrigin newCharSequenceOrigin(final CharSequence origin) {
83          return new CharSequenceOrigin(origin);
84      }
85  
86      /**
87       * Constructs a new file origin for a file.
88       *
89       * @param origin the file.
90       * @return a new file origin.
91       */
92      protected static FileOrigin newFileOrigin(final File origin) {
93          return new FileOrigin(origin);
94      }
95  
96      /**
97       * Constructs a new file origin for a file path.
98       *
99       * @param origin the file path.
100      * @return a new file origin.
101      */
102     protected static FileOrigin newFileOrigin(final String origin) {
103         return new FileOrigin(new File(origin));
104     }
105 
106     /**
107      * Constructs a new input stream origin for a file.
108      *
109      * @param origin the input stream.
110      * @return a new input stream origin.
111      */
112     protected static InputStreamOrigin newInputStreamOrigin(final InputStream origin) {
113         return new InputStreamOrigin(origin);
114     }
115 
116     /**
117      * Constructs a new output stream origin for a file.
118      *
119      * @param origin the output stream.
120      * @return a new output stream origin.
121      */
122     protected static OutputStreamOrigin newOutputStreamOrigin(final OutputStream origin) {
123         return new OutputStreamOrigin(origin);
124     }
125 
126     /**
127      * Constructs a new path origin for a file.
128      *
129      * @param origin the path.
130      * @return a new path origin.
131      */
132     protected static PathOrigin newPathOrigin(final Path origin) {
133         return new PathOrigin(origin);
134     }
135 
136     /**
137      * Constructs a new path name origin for a path name.
138      *
139      * @param origin the path name.
140      * @return a new path name origin.
141      */
142     protected static PathOrigin newPathOrigin(final String origin) {
143         return new PathOrigin(Paths.get(origin));
144     }
145 
146     /**
147      * Constructs a new RandomAccessFile origin for a RandomAccessFile.
148      *
149      * @param origin the reader.
150      * @return a new reader origin.
151      * @since 2.18.0
152      */
153     protected static IORandomAccessFileOrigin newRandomAccessFileOrigin(final IORandomAccessFile origin) {
154         return new IORandomAccessFileOrigin(origin);
155     }
156 
157     /**
158      * Constructs a new RandomAccessFile origin for a RandomAccessFile.
159      *
160      * @param origin the reader.
161      * @return a new reader origin.
162      * @since 2.18.0
163      */
164     protected static RandomAccessFileOrigin newRandomAccessFileOrigin(final RandomAccessFile origin) {
165         return new RandomAccessFileOrigin(origin);
166     }
167 
168     /**
169      * Constructs a new reader origin for a reader.
170      *
171      * @param origin the reader.
172      * @return a new reader origin.
173      */
174     protected static ReaderOrigin newReaderOrigin(final Reader origin) {
175         return new ReaderOrigin(origin);
176     }
177 
178     /**
179      * Constructs a new reader origin for a URI.
180      *
181      * @param origin the URI.
182      * @return a new URI origin.
183      */
184     protected static URIOrigin newURIOrigin(final URI origin) {
185         return new URIOrigin(origin);
186     }
187 
188     /**
189      * Constructs a new writer origin for a file.
190      *
191      * @param origin the writer.
192      * @return a new writer.
193      */
194     protected static WriterOrigin newWriterOrigin(final Writer origin) {
195         return new WriterOrigin(origin);
196     }
197 
198     /**
199      * The underlying origin.
200      */
201     private AbstractOrigin<?, ?> origin;
202 
203     /**
204      * Constructs a new instance for subclasses.
205      */
206     public AbstractOriginSupplier() {
207         // empty
208     }
209 
210     /**
211      * Checks whether the origin is null.
212      *
213      * @return the origin.
214      * @throws IllegalStateException if the {@code origin} is {@code null}.
215      */
216     protected AbstractOrigin<?, ?> checkOrigin() {
217         if (origin == null) {
218             throw new IllegalStateException("origin == null");
219         }
220         return origin;
221     }
222 
223     /**
224      * Gets the origin.
225      *
226      * @return the origin.
227      */
228     protected AbstractOrigin<?, ?> getOrigin() {
229         return origin;
230     }
231 
232     /**
233      * Tests whether the origin is null.
234      *
235      * @return whether the origin is null.
236      */
237     protected boolean hasOrigin() {
238         return origin != null;
239     }
240 
241     /**
242      * Sets a new origin.
243      *
244      * @param origin the new origin.
245      * @return {@code this} instance.
246      */
247     public B setByteArray(final byte[] origin) {
248         return setOrigin(newByteArrayOrigin(origin));
249     }
250 
251     /**
252      * Sets a new origin.
253      *
254      * @param origin the new origin.
255      * @return {@code this} instance.
256      * @since 2.21.0
257      */
258     public B setChannel(final Channel origin) {
259         return setOrigin(newChannelOrigin(origin));
260     }
261 
262     /**
263      * Sets a new origin.
264      *
265      * @param origin the new origin.
266      * @return {@code this} instance.
267      * @since 2.13.0
268      */
269     public B setCharSequence(final CharSequence origin) {
270         return setOrigin(newCharSequenceOrigin(origin));
271     }
272 
273     /**
274      * Sets a new origin.
275      *
276      * @param origin the new origin.
277      * @return {@code this} instance.
278      */
279     public B setFile(final File origin) {
280         return setOrigin(newFileOrigin(origin));
281     }
282 
283     /**
284      * Sets a new origin.
285      *
286      * @param origin the new origin.
287      * @return {@code this} instance.
288      */
289     public B setFile(final String origin) {
290         return setOrigin(newFileOrigin(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 setInputStream(final InputStream origin) {
300         return setOrigin(newInputStreamOrigin(origin));
301     }
302 
303     /**
304      * Sets a new origin.
305      *
306      * @param origin the new origin.
307      * @return {@code this} instance.
308      */
309     protected B setOrigin(final AbstractOrigin<?, ?> origin) {
310         this.origin = origin;
311         return asThis();
312     }
313 
314     /**
315      * Sets a new origin.
316      *
317      * @param origin the new origin.
318      * @return {@code this} instance.
319      */
320     public B setOutputStream(final OutputStream origin) {
321         return setOrigin(newOutputStreamOrigin(origin));
322     }
323 
324     /**
325      * Sets a new origin.
326      *
327      * @param origin the new origin.
328      * @return {@code this} instance.
329      */
330     public B setPath(final Path origin) {
331         return setOrigin(newPathOrigin(origin));
332     }
333 
334     /**
335      * Sets a new origin.
336      *
337      * @param origin the new origin.
338      * @return {@code this} instance.
339      */
340     public B setPath(final String origin) {
341         return setOrigin(newPathOrigin(origin));
342     }
343 
344     /**
345      * Sets a new origin.
346      *
347      * @param origin the new origin.
348      * @return {@code this} instance.
349      * @since 2.18.0
350      */
351     public B setRandomAccessFile(final IORandomAccessFile origin) {
352         return setOrigin(newRandomAccessFileOrigin(origin));
353     }
354 
355     /**
356      * Sets a new origin.
357      *
358      * @param origin the new origin.
359      * @return {@code this} instance.
360      * @since 2.18.0
361      */
362     public B setRandomAccessFile(final RandomAccessFile origin) {
363         return setOrigin(newRandomAccessFileOrigin(origin));
364     }
365 
366     /**
367      * Sets a new origin.
368      *
369      * @param origin the new origin.
370      * @return {@code this} instance.
371      */
372     public B setReader(final Reader origin) {
373         return setOrigin(newReaderOrigin(origin));
374     }
375 
376     /**
377      * Sets a new origin.
378      *
379      * @param origin the new origin.
380      * @return {@code this} instance.
381      */
382     public B setURI(final URI origin) {
383         return setOrigin(newURIOrigin(origin));
384     }
385 
386     /**
387      * Sets a new origin.
388      *
389      * @param origin the new origin.
390      * @return {@code this} instance.
391      */
392     public B setWriter(final Writer origin) {
393         return setOrigin(newWriterOrigin(origin));
394     }
395 }