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.Reader; 24 import java.io.Writer; 25 import java.net.URI; 26 import java.nio.file.Path; 27 import java.nio.file.Paths; 28 29 import org.apache.commons.io.build.AbstractOrigin.ByteArrayOrigin; 30 import org.apache.commons.io.build.AbstractOrigin.CharSequenceOrigin; 31 import org.apache.commons.io.build.AbstractOrigin.FileOrigin; 32 import org.apache.commons.io.build.AbstractOrigin.InputStreamOrigin; 33 import org.apache.commons.io.build.AbstractOrigin.OutputStreamOrigin; 34 import org.apache.commons.io.build.AbstractOrigin.PathOrigin; 35 import org.apache.commons.io.build.AbstractOrigin.ReaderOrigin; 36 import org.apache.commons.io.build.AbstractOrigin.URIOrigin; 37 import org.apache.commons.io.build.AbstractOrigin.WriterOrigin; 38 39 /** 40 * Abstracts building an instance of {@code T}. 41 * 42 * @param <T> the type of instances to build. 43 * @param <B> the type of builder subclass. 44 * @since 2.12.0 45 */ 46 public abstract class AbstractOriginSupplier<T, B extends AbstractOriginSupplier<T, B>> extends AbstractSupplier<T, B> { 47 48 /** 49 * Constructs a new byte array origin for a byte array. 50 * 51 * @param origin the byte array. 52 * @return a new byte array origin. 53 */ newByteArrayOrigin(final byte[] origin)54 protected static ByteArrayOrigin newByteArrayOrigin(final byte[] origin) { 55 return new ByteArrayOrigin(origin); 56 } 57 58 /** 59 * Constructs a new CharSequence origin for a CharSequence. 60 * 61 * @param origin the CharSequence. 62 * @return a new file origin. 63 * @since 2.13.0 64 */ newCharSequenceOrigin(final CharSequence origin)65 protected static CharSequenceOrigin newCharSequenceOrigin(final CharSequence origin) { 66 return new CharSequenceOrigin(origin); 67 } 68 69 /** 70 * Constructs a new file origin for a file. 71 * 72 * @param origin the file. 73 * @return a new file origin. 74 */ newFileOrigin(final File origin)75 protected static FileOrigin newFileOrigin(final File origin) { 76 return new FileOrigin(origin); 77 } 78 79 /** 80 * Constructs a new file origin for a file path. 81 * 82 * @param origin the file path. 83 * @return a new file origin. 84 */ newFileOrigin(final String origin)85 protected static FileOrigin newFileOrigin(final String origin) { 86 return new FileOrigin(new File(origin)); 87 } 88 89 /** 90 * Constructs a new input stream origin for a file. 91 * 92 * @param origin the input stream. 93 * @return a new input stream origin. 94 */ newInputStreamOrigin(final InputStream origin)95 protected static InputStreamOrigin newInputStreamOrigin(final InputStream origin) { 96 return new InputStreamOrigin(origin); 97 } 98 99 /** 100 * Constructs a new output stream origin for a file. 101 * 102 * @param origin the output stream. 103 * @return a new output stream origin. 104 */ newOutputStreamOrigin(final OutputStream origin)105 protected static OutputStreamOrigin newOutputStreamOrigin(final OutputStream origin) { 106 return new OutputStreamOrigin(origin); 107 } 108 109 /** 110 * Constructs a new path origin for a file. 111 * 112 * @param origin the path. 113 * @return a new path origin. 114 */ newPathOrigin(final Path origin)115 protected static PathOrigin newPathOrigin(final Path origin) { 116 return new PathOrigin(origin); 117 } 118 119 /** 120 * Constructs a new path name origin for a path name. 121 * 122 * @param origin the path name. 123 * @return a new path name origin. 124 */ newPathOrigin(final String origin)125 protected static PathOrigin newPathOrigin(final String origin) { 126 return new PathOrigin(Paths.get(origin)); 127 } 128 129 /** 130 * Constructs a new reader origin for a reader. 131 * 132 * @param origin the reader. 133 * @return a new reader origin. 134 */ newReaderOrigin(final Reader origin)135 protected static ReaderOrigin newReaderOrigin(final Reader origin) { 136 return new ReaderOrigin(origin); 137 } 138 139 /** 140 * Constructs a new reader origin for a URI. 141 * 142 * @param origin the URI. 143 * @return a new URI origin. 144 */ newURIOrigin(final URI origin)145 protected static URIOrigin newURIOrigin(final URI origin) { 146 return new URIOrigin(origin); 147 } 148 149 /** 150 * Constructs a new writer origin for a file. 151 * 152 * @param origin the writer. 153 * @return a new writer . 154 */ newWriterOrigin(final Writer origin)155 protected static WriterOrigin newWriterOrigin(final Writer origin) { 156 return new WriterOrigin(origin); 157 } 158 159 /** 160 * The underlying origin. 161 */ 162 private AbstractOrigin<?, ?> origin; 163 164 /** 165 * Checks whether the origin is null. 166 * 167 * @return the origin. 168 * @throws IllegalStateException if the {@code origin} is {@code null}. 169 */ checkOrigin()170 protected AbstractOrigin<?, ?> checkOrigin() { 171 if (origin == null) { 172 throw new IllegalStateException("origin == null"); 173 } 174 return origin; 175 } 176 177 /** 178 * Gets the origin. 179 * 180 * @return the origin. 181 */ getOrigin()182 protected AbstractOrigin<?, ?> getOrigin() { 183 return origin; 184 } 185 186 /** 187 * Tests whether the origin is null. 188 * 189 * @return whether the origin is null. 190 */ hasOrigin()191 protected boolean hasOrigin() { 192 return origin != null; 193 } 194 195 /** 196 * Sets a new origin. 197 * 198 * @param origin the new origin. 199 * @return this 200 */ setByteArray(final byte[] origin)201 public B setByteArray(final byte[] origin) { 202 return setOrigin(newByteArrayOrigin(origin)); 203 } 204 205 /** 206 * Sets a new origin. 207 * 208 * @param origin the new origin. 209 * @return this 210 * @since 2.13.0 211 */ setCharSequence(final CharSequence origin)212 public B setCharSequence(final CharSequence origin) { 213 return setOrigin(newCharSequenceOrigin(origin)); 214 } 215 216 /** 217 * Sets a new origin. 218 * 219 * @param origin the new origin. 220 * @return this 221 */ setFile(final File origin)222 public B setFile(final File origin) { 223 return setOrigin(newFileOrigin(origin)); 224 } 225 226 /** 227 * Sets a new origin. 228 * 229 * @param origin the new origin. 230 * @return this 231 */ setFile(final String origin)232 public B setFile(final String origin) { 233 return setOrigin(newFileOrigin(origin)); 234 } 235 236 /** 237 * Sets a new origin. 238 * 239 * @param origin the new origin. 240 * @return this 241 */ setInputStream(final InputStream origin)242 public B setInputStream(final InputStream origin) { 243 return setOrigin(newInputStreamOrigin(origin)); 244 } 245 246 /** 247 * Sets a new origin. 248 * 249 * @param origin the new origin. 250 * @return this 251 */ setOrigin(final AbstractOrigin<?, ?> origin)252 protected B setOrigin(final AbstractOrigin<?, ?> origin) { 253 this.origin = origin; 254 return asThis(); 255 } 256 257 /** 258 * Sets a new origin. 259 * 260 * @param origin the new origin. 261 * @return this 262 */ setOutputStream(final OutputStream origin)263 public B setOutputStream(final OutputStream origin) { 264 return setOrigin(newOutputStreamOrigin(origin)); 265 } 266 267 /** 268 * Sets a new origin. 269 * 270 * @param origin the new origin. 271 * @return this 272 */ setPath(final Path origin)273 public B setPath(final Path origin) { 274 return setOrigin(newPathOrigin(origin)); 275 } 276 277 /** 278 * Sets a new origin. 279 * 280 * @param origin the new origin. 281 * @return this 282 */ setPath(final String origin)283 public B setPath(final String origin) { 284 return setOrigin(newPathOrigin(origin)); 285 } 286 287 /** 288 * Sets a new origin. 289 * 290 * @param origin the new origin. 291 * @return this 292 */ setReader(final Reader origin)293 public B setReader(final Reader origin) { 294 return setOrigin(newReaderOrigin(origin)); 295 } 296 297 /** 298 * Sets a new origin. 299 * 300 * @param origin the new origin. 301 * @return this 302 */ setURI(final URI origin)303 public B setURI(final URI origin) { 304 return setOrigin(newURIOrigin(origin)); 305 } 306 307 /** 308 * Sets a new origin. 309 * 310 * @param origin the new origin. 311 * @return this 312 */ setWriter(final Writer origin)313 public B setWriter(final Writer origin) { 314 return setOrigin(newWriterOrigin(origin)); 315 } 316 } 317