Add optional lz4 compression for snapshots
[controller.git] / opendaylight / md-sal / sal-clustering-commons / src / main / java / org / opendaylight / controller / cluster / io / InputOutputStreamFactory.java
diff --git a/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/io/InputOutputStreamFactory.java b/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/io/InputOutputStreamFactory.java
new file mode 100644 (file)
index 0000000..01e1098
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.io;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.annotations.Beta;
+import com.google.common.io.ByteSource;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import net.jpountz.lz4.LZ4FrameOutputStream;
+import org.eclipse.jdt.annotation.NonNull;
+
+@Beta
+public abstract class InputOutputStreamFactory {
+    InputOutputStreamFactory() {
+        // Hidden on purpose
+    }
+
+    public static @NonNull InputOutputStreamFactory simple() {
+        return PlainInputOutputStreamSupport.INSTANCE;
+    }
+
+    public static @NonNull InputOutputStreamFactory lz4(final String blockSize) {
+        return lz4(LZ4FrameOutputStream.BLOCKSIZE.valueOf("SIZE_" + blockSize));
+    }
+
+    public static @NonNull InputOutputStreamFactory lz4(final LZ4FrameOutputStream.BLOCKSIZE blockSize) {
+        return new LZ4InputOutputStreamSupport(requireNonNull(blockSize));
+    }
+
+    public abstract @NonNull InputStream createInputStream(ByteSource input) throws IOException;
+
+    public abstract @NonNull InputStream createInputStream(File file) throws IOException;
+
+    public abstract @NonNull OutputStream createOutputStream(File file) throws IOException;
+
+    public abstract @NonNull OutputStream wrapOutputStream(OutputStream output) throws IOException;
+
+    static @NonNull BufferedInputStream defaultCreateInputStream(final File file) throws FileNotFoundException {
+        return new BufferedInputStream(new FileInputStream(file));
+    }
+
+    static @NonNull BufferedOutputStream defaultCreateOutputStream(final File file) throws FileNotFoundException {
+        return new BufferedOutputStream(new FileOutputStream(file));
+    }
+}