aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/mammoth/internal/archives
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-11-13 20:11:50 +0000
committerMichael Williamson <mike@zwobble.org>2016-11-13 20:11:50 +0000
commit6f87042576150fd65db52144417d8a788f2441f4 (patch)
tree87282928b2f0047363df867bc73a66d7929f662d /src/main/java/org/zwobble/mammoth/internal/archives
parent38e6e7e0a0c214a17b251cea8c767655dfaecc67 (diff)
Move archive classes into their own package
Diffstat (limited to 'src/main/java/org/zwobble/mammoth/internal/archives')
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/archives/Archive.java10
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/archives/Archives.java11
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/archives/InMemoryArchive.java69
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/archives/MutableArchive.java8
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/archives/ZippedArchive.java37
5 files changed, 135 insertions, 0 deletions
diff --git a/src/main/java/org/zwobble/mammoth/internal/archives/Archive.java b/src/main/java/org/zwobble/mammoth/internal/archives/Archive.java
new file mode 100644
index 0000000..4440234
--- /dev/null
+++ b/src/main/java/org/zwobble/mammoth/internal/archives/Archive.java
@@ -0,0 +1,10 @@
+package org.zwobble.mammoth.internal.archives;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Optional;
+
+public interface Archive extends Closeable {
+ Optional<InputStream> tryGetInputStream(String name) throws IOException;
+}
diff --git a/src/main/java/org/zwobble/mammoth/internal/archives/Archives.java b/src/main/java/org/zwobble/mammoth/internal/archives/Archives.java
new file mode 100644
index 0000000..e0322fb
--- /dev/null
+++ b/src/main/java/org/zwobble/mammoth/internal/archives/Archives.java
@@ -0,0 +1,11 @@
+package org.zwobble.mammoth.internal.archives;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+public class Archives {
+ public static InputStream getInputStream(Archive file, String name) throws IOException {
+ return file.tryGetInputStream(name)
+ .orElseThrow(() -> new IOException("Missing entry in file: " + name));
+ }
+}
diff --git a/src/main/java/org/zwobble/mammoth/internal/archives/InMemoryArchive.java b/src/main/java/org/zwobble/mammoth/internal/archives/InMemoryArchive.java
new file mode 100644
index 0000000..9ad7134
--- /dev/null
+++ b/src/main/java/org/zwobble/mammoth/internal/archives/InMemoryArchive.java
@@ -0,0 +1,69 @@
+package org.zwobble.mammoth.internal.archives;
+
+import org.zwobble.mammoth.internal.util.PassThroughException;
+import org.zwobble.mammoth.internal.util.Streams;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+import java.util.zip.ZipOutputStream;
+
+import static org.zwobble.mammoth.internal.util.Maps.eagerMapValues;
+import static org.zwobble.mammoth.internal.util.Maps.lookup;
+
+public class InMemoryArchive implements MutableArchive {
+ public static InMemoryArchive fromStream(InputStream stream) throws IOException {
+ ZipInputStream zipStream = new ZipInputStream(stream);
+ Map<String, byte[]> entries = new HashMap<>();
+ ZipEntry entry;
+ while ((entry = zipStream.getNextEntry()) != null) {
+ entries.put(entry.getName(), Streams.toByteArray(zipStream));
+ }
+ return new InMemoryArchive(entries);
+ }
+
+ public static InMemoryArchive fromStrings(Map<String, String> entries) {
+ return new InMemoryArchive(eagerMapValues(entries, value -> value.getBytes(StandardCharsets.UTF_8)));
+ }
+
+ private final Map<String, byte[]> entries;
+
+ public InMemoryArchive(Map<String, byte[]> entries) {
+ this.entries = entries;
+ }
+
+ @Override
+ public Optional<InputStream> tryGetInputStream(String name) throws IOException {
+ return lookup(entries, name)
+ .map(ByteArrayInputStream::new);
+ }
+
+ @Override
+ public void writeEntry(String path, String content) {
+ entries.put(path, content.getBytes(StandardCharsets.UTF_8));
+ }
+
+ @Override
+ public void close() throws IOException {
+ }
+
+ public byte[] toByteArray() {
+ return PassThroughException.wrap(() -> {
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ try (ZipOutputStream zipStream = new ZipOutputStream(outputStream)) {
+ for (Map.Entry<String, byte[]> entry : entries.entrySet()) {
+ zipStream.putNextEntry(new ZipEntry(entry.getKey()));
+ zipStream.write(entry.getValue());
+ }
+ }
+ return outputStream.toByteArray();
+ });
+ }
+}
diff --git a/src/main/java/org/zwobble/mammoth/internal/archives/MutableArchive.java b/src/main/java/org/zwobble/mammoth/internal/archives/MutableArchive.java
new file mode 100644
index 0000000..d32da20
--- /dev/null
+++ b/src/main/java/org/zwobble/mammoth/internal/archives/MutableArchive.java
@@ -0,0 +1,8 @@
+package org.zwobble.mammoth.internal.archives;
+
+import org.zwobble.mammoth.internal.archives.Archive;
+
+public interface MutableArchive extends Archive {
+
+ void writeEntry(String path, String content);
+}
diff --git a/src/main/java/org/zwobble/mammoth/internal/archives/ZippedArchive.java b/src/main/java/org/zwobble/mammoth/internal/archives/ZippedArchive.java
new file mode 100644
index 0000000..32b8894
--- /dev/null
+++ b/src/main/java/org/zwobble/mammoth/internal/archives/ZippedArchive.java
@@ -0,0 +1,37 @@
+package org.zwobble.mammoth.internal.archives;
+
+import org.zwobble.mammoth.internal.archives.Archive;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Optional;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+public class ZippedArchive implements Archive {
+ private final ZipFile zipFile;
+
+ public ZippedArchive(ZipFile zipFile) {
+ this.zipFile = zipFile;
+ }
+
+ public ZippedArchive(File file) throws IOException {
+ this(new ZipFile(file));
+ }
+
+ @Override
+ public Optional<InputStream> tryGetInputStream(String name) throws IOException {
+ ZipEntry entry = zipFile.getEntry(name);
+ if (entry == null) {
+ return Optional.empty();
+ } else {
+ return Optional.of(zipFile.getInputStream(entry));
+ }
+ }
+
+ @Override
+ public void close() throws IOException {
+ zipFile.close();
+ }
+}