Expose metadata from every controlled component.
[sonitus.git] / src / main / java / net / pterodactylus / sonitus / data / sink / FileSink.java
index 61e0a27..92dd59a 100644 (file)
 
 package net.pterodactylus.sonitus.data.sink;
 
-import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
 import java.util.logging.Logger;
 
-import net.pterodactylus.sonitus.data.ConnectException;
-import net.pterodactylus.sonitus.data.Connection;
+import net.pterodactylus.sonitus.data.Controller;
+import net.pterodactylus.sonitus.data.Metadata;
 import net.pterodactylus.sonitus.data.Sink;
-import net.pterodactylus.sonitus.data.Source;
-
-import com.google.common.base.Preconditions;
 
 /**
- * {@link Sink} that writes all received data into a file.
+ * {@link net.pterodactylus.sonitus.data.Sink} that writes all received data
+ * into a file.
  *
  * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
  */
@@ -42,6 +41,11 @@ public class FileSink implements Sink {
        /** The path of the file to write to. */
        private final String path;
 
+       private FileOutputStream fileOutputStream;
+
+       /** The current metadata. */
+       private Metadata metadata;
+
        /**
         * Creates a new file sink that will write to the given path.
         *
@@ -52,38 +56,53 @@ public class FileSink implements Sink {
                this.path = path;
        }
 
+       //
+       // CONTROLLED METHODS
+       //
+
+       @Override
+       public String name() {
+               return path;
+       }
+
        @Override
-       public void connect(Source source) throws ConnectException {
-               Preconditions.checkNotNull(source, "source must not be null");
+       public Metadata metadata() {
+               return metadata;
+       }
 
+       @Override
+       public List<Controller<?>> controllers() {
+               return Collections.emptyList();
+       }
+
+       //
+       // SINK METHODS
+       //
+
+       @Override
+       public void open(Metadata metadata) throws IOException {
+               fileOutputStream = new FileOutputStream(path);
+               metadataUpdated(metadata);
+       }
+
+       @Override
+       public void close() {
                try {
-                       final FileOutputStream fileOutputStream = new FileOutputStream(path);
-                       new Thread(new Connection(source) {
-
-                               @Override
-                               protected int bufferSize() {
-                                       return 65536;
-                               }
-
-                               @Override
-                               protected void feed(byte[] buffer) throws IOException {
-                                       fileOutputStream.write(buffer);
-                                       logger.finest(String.format("FileSink: Wrote %d Bytes.", buffer.length));
-                               }
-
-                               @Override
-                               protected void finish() throws IOException {
-                                       fileOutputStream.close();
-                               }
-                       }).start();
-               } catch (FileNotFoundException fnfe1) {
-                       throw new ConnectException(fnfe1);
+                       fileOutputStream.close();
+               } catch (IOException e) {
+                       /* ignore. */
                }
        }
 
        @Override
-       public void metadataUpdated() {
-               /* ignore. */
+       public void metadataUpdated(Metadata metadata) {
+               this.metadata = metadata;
+       }
+
+       @Override
+       public void process(byte[] buffer) throws IOException {
+               fileOutputStream.write(buffer);
+               logger.finest(String.format("FileSink: Wrote %d Bytes.", buffer.length));
        }
 
 }