Pull all interfaces into a single interface: Filter.
[sonitus.git] / src / main / java / net / pterodactylus / sonitus / data / source / FileSource.java
index c967e12..7251f65 100644 (file)
 
 package net.pterodactylus.sonitus.data.source;
 
-import static com.google.common.base.Preconditions.*;
-import static net.pterodactylus.sonitus.data.Format.UNKNOWN_CHANNELS;
-import static net.pterodactylus.sonitus.data.Format.UNKNOWN_ENCODING;
-import static net.pterodactylus.sonitus.data.Format.UNKNOWN_FREQUENCY;
+import static com.google.common.base.Preconditions.checkNotNull;
 
 import java.io.EOFException;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
 
-import net.pterodactylus.sonitus.data.Format;
+import net.pterodactylus.sonitus.data.AbstractFilter;
+import net.pterodactylus.sonitus.data.Controller;
+import net.pterodactylus.sonitus.data.Filter;
 import net.pterodactylus.sonitus.data.Metadata;
-import net.pterodactylus.sonitus.data.Source;
 import net.pterodactylus.sonitus.io.IdentifyingInputStream;
 
 import com.google.common.base.Optional;
-import com.google.common.io.ByteStreams;
 
 /**
- * A {@link Source} that is read from the local file system.
+ * A {@link Filter} that reads a file from the local file system and does not
+ * expect any input.
  *
  * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
  */
-public class FileSource implements Source {
+public class FileSource extends AbstractFilter {
 
        /** The path of the file. */
        private final String path;
 
-       /** The identified format of the file. */
-       private final Format format;
-
        /** The input stream. */
        private InputStream fileInputStream;
 
@@ -57,42 +54,38 @@ public class FileSource implements Source {
         *
         * @param path
         *              The path of the file
-        * @throws IOException
+        * @throws java.io.IOException
         *              if the file can not be found, or an I/O error occurs
         */
        public FileSource(String path) throws IOException {
+               super(path);
                this.path = checkNotNull(path, "path must not be null");
                fileInputStream = new FileInputStream(path);
 
                /* identify file type. */
                Optional<IdentifyingInputStream> identifyingInputStream = IdentifyingInputStream.create(new FileInputStream(path));
                if (identifyingInputStream.isPresent()) {
-                       format = identifyingInputStream.get().format();
+                       metadataUpdated(identifyingInputStream.get().metadata());
                } else {
                        /* fallback. */
-                       format = new Format(UNKNOWN_CHANNELS, UNKNOWN_FREQUENCY, UNKNOWN_ENCODING);
+                       metadataUpdated(new Metadata().name(path));
                }
        }
 
        //
-       // SOURCE METHODS
+       // FILTER METHODS
        //
 
        @Override
-       public Format format() {
-               return format;
-       }
-
-       @Override
-       public Metadata metadata() {
-               return new Metadata().name(path);
+       public List<Controller<?>> controllers() {
+               return Collections.emptyList();
        }
 
        @Override
        public byte[] get(int bufferSize) throws IOException {
                byte[] buffer = new byte[bufferSize];
-               int read = ByteStreams.read(fileInputStream, buffer, 0, bufferSize);
-               if (read == 0) {
+               int read = fileInputStream.read(buffer);
+               if (read == -1) {
                        throw new EOFException();
                }
                return Arrays.copyOf(buffer, read);
@@ -104,7 +97,7 @@ public class FileSource implements Source {
 
        @Override
        public String toString() {
-               return String.format("%s (%s)", path, format);
+               return String.format("%s (%s)", path, metadata());
        }
 
 }