AbstractOriginSupplier.java

  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. package org.apache.commons.io.build;

  18. import java.io.File;
  19. import java.io.InputStream;
  20. import java.io.OutputStream;
  21. import java.io.RandomAccessFile;
  22. import java.io.Reader;
  23. import java.io.Writer;
  24. import java.net.URI;
  25. import java.nio.file.Path;
  26. import java.nio.file.Paths;

  27. import org.apache.commons.io.IORandomAccessFile;
  28. import org.apache.commons.io.build.AbstractOrigin.ByteArrayOrigin;
  29. import org.apache.commons.io.build.AbstractOrigin.CharSequenceOrigin;
  30. import org.apache.commons.io.build.AbstractOrigin.FileOrigin;
  31. import org.apache.commons.io.build.AbstractOrigin.IORandomAccessFileOrigin;
  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.RandomAccessFileOrigin;
  36. import org.apache.commons.io.build.AbstractOrigin.ReaderOrigin;
  37. import org.apache.commons.io.build.AbstractOrigin.URIOrigin;
  38. import org.apache.commons.io.build.AbstractOrigin.WriterOrigin;

  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.      * Constructs a new byte array origin for a byte array.
  49.      *
  50.      * @param origin the byte array.
  51.      * @return a new byte array origin.
  52.      */
  53.     protected static ByteArrayOrigin newByteArrayOrigin(final byte[] origin) {
  54.         return new ByteArrayOrigin(origin);
  55.     }

  56.     /**
  57.      * Constructs a new CharSequence origin for a CharSequence.
  58.      *
  59.      * @param origin the CharSequence.
  60.      * @return a new file origin.
  61.      * @since 2.13.0
  62.      */
  63.     protected static CharSequenceOrigin newCharSequenceOrigin(final CharSequence origin) {
  64.         return new CharSequenceOrigin(origin);
  65.     }

  66.     /**
  67.      * Constructs a new file origin for a file.
  68.      *
  69.      * @param origin the file.
  70.      * @return a new file origin.
  71.      */
  72.     protected static FileOrigin newFileOrigin(final File origin) {
  73.         return new FileOrigin(origin);
  74.     }

  75.     /**
  76.      * Constructs a new file origin for a file path.
  77.      *
  78.      * @param origin the file path.
  79.      * @return a new file origin.
  80.      */
  81.     protected static FileOrigin newFileOrigin(final String origin) {
  82.         return new FileOrigin(new File(origin));
  83.     }

  84.     /**
  85.      * Constructs a new input stream origin for a file.
  86.      *
  87.      * @param origin the input stream.
  88.      * @return a new input stream origin.
  89.      */
  90.     protected static InputStreamOrigin newInputStreamOrigin(final InputStream origin) {
  91.         return new InputStreamOrigin(origin);
  92.     }

  93.     /**
  94.      * Constructs a new output stream origin for a file.
  95.      *
  96.      * @param origin the output stream.
  97.      * @return a new output stream origin.
  98.      */
  99.     protected static OutputStreamOrigin newOutputStreamOrigin(final OutputStream origin) {
  100.         return new OutputStreamOrigin(origin);
  101.     }

  102.     /**
  103.      * Constructs a new path origin for a file.
  104.      *
  105.      * @param origin the path.
  106.      * @return a new path origin.
  107.      */
  108.     protected static PathOrigin newPathOrigin(final Path origin) {
  109.         return new PathOrigin(origin);
  110.     }

  111.     /**
  112.      * Constructs a new path name origin for a path name.
  113.      *
  114.      * @param origin the path name.
  115.      * @return a new path name origin.
  116.      */
  117.     protected static PathOrigin newPathOrigin(final String origin) {
  118.         return new PathOrigin(Paths.get(origin));
  119.     }

  120.     /**
  121.      * Constructs a new RandomAccessFile origin for a RandomAccessFile.
  122.      *
  123.      * @param origin the reader.
  124.      * @return a new reader origin.
  125.      * @since 2.18.0
  126.      */
  127.     protected static IORandomAccessFileOrigin newRandomAccessFileOrigin(final IORandomAccessFile origin) {
  128.         return new IORandomAccessFileOrigin(origin);
  129.     }

  130.     /**
  131.      * Constructs a new RandomAccessFile origin for a RandomAccessFile.
  132.      *
  133.      * @param origin the reader.
  134.      * @return a new reader origin.
  135.      * @since 2.18.0
  136.      */
  137.     protected static RandomAccessFileOrigin newRandomAccessFileOrigin(final RandomAccessFile origin) {
  138.         return new RandomAccessFileOrigin(origin);
  139.     }

  140.     /**
  141.      * Constructs a new reader origin for a reader.
  142.      *
  143.      * @param origin the reader.
  144.      * @return a new reader origin.
  145.      */
  146.     protected static ReaderOrigin newReaderOrigin(final Reader origin) {
  147.         return new ReaderOrigin(origin);
  148.     }

  149.     /**
  150.      * Constructs a new reader origin for a URI.
  151.      *
  152.      * @param origin the URI.
  153.      * @return a new URI origin.
  154.      */
  155.     protected static URIOrigin newURIOrigin(final URI origin) {
  156.         return new URIOrigin(origin);
  157.     }

  158.     /**
  159.      * Constructs a new writer origin for a file.
  160.      *
  161.      * @param origin the writer.
  162.      * @return a new writer.
  163.      */
  164.     protected static WriterOrigin newWriterOrigin(final Writer origin) {
  165.         return new WriterOrigin(origin);
  166.     }

  167.     /**
  168.      * The underlying origin.
  169.      */
  170.     private AbstractOrigin<?, ?> origin;

  171.     /**
  172.      * Constructs a new instance for subclasses.
  173.      */
  174.     public AbstractOriginSupplier() {
  175.         // empty
  176.     }

  177.     /**
  178.      * Checks whether the origin is null.
  179.      *
  180.      * @return the origin.
  181.      * @throws IllegalStateException if the {@code origin} is {@code null}.
  182.      */
  183.     protected AbstractOrigin<?, ?> checkOrigin() {
  184.         if (origin == null) {
  185.             throw new IllegalStateException("origin == null");
  186.         }
  187.         return origin;
  188.     }

  189.     /**
  190.      * Gets the origin.
  191.      *
  192.      * @return the origin.
  193.      */
  194.     protected AbstractOrigin<?, ?> getOrigin() {
  195.         return origin;
  196.     }

  197.     /**
  198.      * Tests whether the origin is null.
  199.      *
  200.      * @return whether the origin is null.
  201.      */
  202.     protected boolean hasOrigin() {
  203.         return origin != null;
  204.     }

  205.     /**
  206.      * Sets a new origin.
  207.      *
  208.      * @param origin the new origin.
  209.      * @return {@code this} instance.
  210.      */
  211.     public B setByteArray(final byte[] origin) {
  212.         return setOrigin(newByteArrayOrigin(origin));
  213.     }

  214.     /**
  215.      * Sets a new origin.
  216.      *
  217.      * @param origin the new origin.
  218.      * @return {@code this} instance.
  219.      * @since 2.13.0
  220.      */
  221.     public B setCharSequence(final CharSequence origin) {
  222.         return setOrigin(newCharSequenceOrigin(origin));
  223.     }

  224.     /**
  225.      * Sets a new origin.
  226.      *
  227.      * @param origin the new origin.
  228.      * @return {@code this} instance.
  229.      */
  230.     public B setFile(final File origin) {
  231.         return setOrigin(newFileOrigin(origin));
  232.     }

  233.     /**
  234.      * Sets a new origin.
  235.      *
  236.      * @param origin the new origin.
  237.      * @return {@code this} instance.
  238.      */
  239.     public B setFile(final String origin) {
  240.         return setOrigin(newFileOrigin(origin));
  241.     }

  242.     /**
  243.      * Sets a new origin.
  244.      *
  245.      * @param origin the new origin.
  246.      * @return {@code this} instance.
  247.      */
  248.     public B setInputStream(final InputStream origin) {
  249.         return setOrigin(newInputStreamOrigin(origin));
  250.     }

  251.     /**
  252.      * Sets a new origin.
  253.      *
  254.      * @param origin the new origin.
  255.      * @return {@code this} instance.
  256.      */
  257.     protected B setOrigin(final AbstractOrigin<?, ?> origin) {
  258.         this.origin = origin;
  259.         return asThis();
  260.     }

  261.     /**
  262.      * Sets a new origin.
  263.      *
  264.      * @param origin the new origin.
  265.      * @return {@code this} instance.
  266.      */
  267.     public B setOutputStream(final OutputStream origin) {
  268.         return setOrigin(newOutputStreamOrigin(origin));
  269.     }

  270.     /**
  271.      * Sets a new origin.
  272.      *
  273.      * @param origin the new origin.
  274.      * @return {@code this} instance.
  275.      */
  276.     public B setPath(final Path origin) {
  277.         return setOrigin(newPathOrigin(origin));
  278.     }

  279.     /**
  280.      * Sets a new origin.
  281.      *
  282.      * @param origin the new origin.
  283.      * @return {@code this} instance.
  284.      */
  285.     public B setPath(final String origin) {
  286.         return setOrigin(newPathOrigin(origin));
  287.     }

  288.     /**
  289.      * Sets a new origin.
  290.      *
  291.      * @param origin the new origin.
  292.      * @return {@code this} instance.
  293.      * @since 2.18.0
  294.      */
  295.     public B setRandomAccessFile(final IORandomAccessFile origin) {
  296.         return setOrigin(newRandomAccessFileOrigin(origin));
  297.     }

  298.     /**
  299.      * Sets a new origin.
  300.      *
  301.      * @param origin the new origin.
  302.      * @return {@code this} instance.
  303.      * @since 2.18.0
  304.      */
  305.     public B setRandomAccessFile(final RandomAccessFile origin) {
  306.         return setOrigin(newRandomAccessFileOrigin(origin));
  307.     }

  308.     /**
  309.      * Sets a new origin.
  310.      *
  311.      * @param origin the new origin.
  312.      * @return {@code this} instance.
  313.      */
  314.     public B setReader(final Reader origin) {
  315.         return setOrigin(newReaderOrigin(origin));
  316.     }

  317.     /**
  318.      * Sets a new origin.
  319.      *
  320.      * @param origin the new origin.
  321.      * @return {@code this} instance.
  322.      */
  323.     public B setURI(final URI origin) {
  324.         return setOrigin(newURIOrigin(origin));
  325.     }

  326.     /**
  327.      * Sets a new origin.
  328.      *
  329.      * @param origin the new origin.
  330.      * @return {@code this} instance.
  331.      */
  332.     public B setWriter(final Writer origin) {
  333.         return setOrigin(newWriterOrigin(origin));
  334.     }
  335. }