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 * http://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.file.Path;
28 import java.nio.file.Paths;
29
30 import org.apache.commons.io.IORandomAccessFile;
31 import org.apache.commons.io.build.AbstractOrigin.ByteArrayOrigin;
32 import org.apache.commons.io.build.AbstractOrigin.CharSequenceOrigin;
33 import org.apache.commons.io.build.AbstractOrigin.FileOrigin;
34 import org.apache.commons.io.build.AbstractOrigin.IORandomAccessFileOrigin;
35 import org.apache.commons.io.build.AbstractOrigin.InputStreamOrigin;
36 import org.apache.commons.io.build.AbstractOrigin.OutputStreamOrigin;
37 import org.apache.commons.io.build.AbstractOrigin.PathOrigin;
38 import org.apache.commons.io.build.AbstractOrigin.RandomAccessFileOrigin;
39 import org.apache.commons.io.build.AbstractOrigin.ReaderOrigin;
40 import org.apache.commons.io.build.AbstractOrigin.URIOrigin;
41 import org.apache.commons.io.build.AbstractOrigin.WriterOrigin;
42
43 /**
44 * Abstracts building an instance of {@code T}.
45 *
46 * @param <T> the type of instances to build.
47 * @param <B> the type of builder subclass.
48 * @since 2.12.0
49 */
50 public abstract class AbstractOriginSupplier<T, B extends AbstractOriginSupplier<T, B>> extends AbstractSupplier<T, B> {
51
52 /**
53 * Constructs a new byte array origin for a byte array.
54 *
55 * @param origin the byte array.
56 * @return a new byte array origin.
57 */
58 protected static ByteArrayOrigin newByteArrayOrigin(final byte[] origin) {
59 return new ByteArrayOrigin(origin);
60 }
61
62 /**
63 * Constructs a new CharSequence origin for a CharSequence.
64 *
65 * @param origin the CharSequence.
66 * @return a new file origin.
67 * @since 2.13.0
68 */
69 protected static CharSequenceOrigin newCharSequenceOrigin(final CharSequence origin) {
70 return new CharSequenceOrigin(origin);
71 }
72
73 /**
74 * Constructs a new file origin for a file.
75 *
76 * @param origin the file.
77 * @return a new file origin.
78 */
79 protected static FileOrigin newFileOrigin(final File origin) {
80 return new FileOrigin(origin);
81 }
82
83 /**
84 * Constructs a new file origin for a file path.
85 *
86 * @param origin the file path.
87 * @return a new file origin.
88 */
89 protected static FileOrigin newFileOrigin(final String origin) {
90 return new FileOrigin(new File(origin));
91 }
92
93 /**
94 * Constructs a new input stream origin for a file.
95 *
96 * @param origin the input stream.
97 * @return a new input stream origin.
98 */
99 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 }