Added support of virtual file (in this case textile_status.data).
This commit is contained in:
parent
d871fc14cb
commit
300fe18b10
@ -28,6 +28,7 @@ import java.io.InputStream;
|
|||||||
|
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
public record FileInputStreamSupplier(Path path, String name, FileTreeHashBuilder hashTreeBuilder, BrokenFileHandler brokenFileHandler) implements InputSupplier {
|
public record FileInputStreamSupplier(Path path, String name, FileTreeHashBuilder hashTreeBuilder, BrokenFileHandler brokenFileHandler) implements InputSupplier {
|
||||||
private final static TextileLogger log = new TextileLogger(TextileBackup.MOD_NAME);
|
private final static TextileLogger log = new TextileLogger(TextileBackup.MOD_NAME);
|
||||||
@ -43,8 +44,11 @@ public record FileInputStreamSupplier(Path path, String name, FileTreeHashBuilde
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Path getPath() {
|
public Optional<Path> getPath() { return Optional.of(path); }
|
||||||
return path;
|
|
||||||
|
@Override
|
||||||
|
public long size() throws IOException {
|
||||||
|
return Files.size(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -23,8 +23,14 @@ import org.apache.commons.compress.parallel.InputStreamSupplier;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
|
||||||
public interface InputSupplier extends InputStreamSupplier {
|
public interface InputSupplier extends InputStreamSupplier {
|
||||||
InputStream getInputStream() throws IOException;
|
InputStream getInputStream() throws IOException;
|
||||||
Path getPath();
|
//If an entry is virtual (a.k.a there is no actual file to open, only input stream)
|
||||||
|
Optional<Path> getPath();
|
||||||
String getName();
|
String getName();
|
||||||
|
|
||||||
|
long size() throws IOException;
|
||||||
}
|
}
|
||||||
|
@ -33,6 +33,7 @@ import java.nio.file.Files;
|
|||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
@ -128,10 +129,12 @@ public abstract class AbstractCompressor {
|
|||||||
private record StatusFileInputSupplier(byte[] data) implements InputSupplier {
|
private record StatusFileInputSupplier(byte[] data) implements InputSupplier {
|
||||||
public InputStream getInputStream() { return new ByteArrayInputStream(data); }
|
public InputStream getInputStream() { return new ByteArrayInputStream(data); }
|
||||||
|
|
||||||
public Path getPath() { return Path.of(CompressionStatus.DATA_FILENAME); }
|
public Optional<Path> getPath() { return Optional.empty(); }
|
||||||
|
|
||||||
public String getName() { return CompressionStatus.DATA_FILENAME; }
|
public String getName() { return CompressionStatus.DATA_FILENAME; }
|
||||||
|
|
||||||
|
public long size() { return data.length; }
|
||||||
|
|
||||||
public InputStream get() { return getInputStream(); }
|
public InputStream get() { return getInputStream(); }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -27,6 +27,7 @@ import org.apache.commons.compress.archivers.zip.*;
|
|||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.concurrent.*;
|
import java.util.concurrent.*;
|
||||||
import java.util.zip.ZipEntry;
|
import java.util.zip.ZipEntry;
|
||||||
@ -67,14 +68,21 @@ public class ParallelZipCompressor extends ZipCompressor {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void addEntry(InputSupplier input, OutputStream arc) throws IOException {
|
protected void addEntry(InputSupplier input, OutputStream arc) throws IOException {
|
||||||
ZipArchiveEntry entry = (ZipArchiveEntry)((ZipArchiveOutputStream)arc).createArchiveEntry(input.getPath(), input.getName());
|
ZipArchiveEntry entry;
|
||||||
|
if(input.getPath().isEmpty()) {
|
||||||
if(ZipCompressor.isDotDat(input.getPath().getFileName().toString())) {
|
entry = new ZipArchiveEntry(input.getName());
|
||||||
entry.setMethod(ZipEntry.STORED);
|
entry.setMethod(ZipEntry.STORED);
|
||||||
entry.setSize(Files.size(input.getPath()));
|
entry.setSize(input.size());
|
||||||
entry.setCompressedSize(Files.size(input.getPath()));
|
} else {
|
||||||
entry.setCrc(getCRC(input.getPath()));
|
Path file = input.getPath().get();
|
||||||
} else entry.setMethod(ZipEntry.DEFLATED);
|
entry = (ZipArchiveEntry) ((ZipArchiveOutputStream) arc).createArchiveEntry(file, input.getName());
|
||||||
|
if (ZipCompressor.isDotDat(file.toString())) {
|
||||||
|
entry.setMethod(ZipEntry.STORED);
|
||||||
|
entry.setSize(Files.size(file));
|
||||||
|
entry.setCompressedSize(Files.size(file));
|
||||||
|
entry.setCrc(getCRC(file));
|
||||||
|
} else entry.setMethod(ZipEntry.DEFLATED);
|
||||||
|
}
|
||||||
|
|
||||||
entry.setTime(System.currentTimeMillis());
|
entry.setTime(System.currentTimeMillis());
|
||||||
|
|
||||||
|
@ -57,13 +57,21 @@ public class ZipCompressor extends AbstractCompressor {
|
|||||||
@Override
|
@Override
|
||||||
protected void addEntry(InputSupplier input, OutputStream arc) throws IOException {
|
protected void addEntry(InputSupplier input, OutputStream arc) throws IOException {
|
||||||
try (InputStream fileInputStream = input.getInputStream()) {
|
try (InputStream fileInputStream = input.getInputStream()) {
|
||||||
ZipArchiveEntry entry = (ZipArchiveEntry)((ZipArchiveOutputStream)arc).createArchiveEntry(input.getPath(), input.getName());
|
ZipArchiveEntry entry;
|
||||||
|
|
||||||
if(isDotDat(input.getPath().getFileName().toString())) {
|
if(input.getPath().isEmpty()) {
|
||||||
|
entry = new ZipArchiveEntry(input.getName());
|
||||||
entry.setMethod(ZipEntry.STORED);
|
entry.setMethod(ZipEntry.STORED);
|
||||||
entry.setSize(Files.size(input.getPath()));
|
entry.setSize(input.size());
|
||||||
entry.setCompressedSize(Files.size(input.getPath()));
|
} else {
|
||||||
entry.setCrc(getCRC(input.getPath()));
|
Path file = input.getPath().get();
|
||||||
|
entry = (ZipArchiveEntry) ((ZipArchiveOutputStream) arc).createArchiveEntry(file, input.getName());
|
||||||
|
if (isDotDat(file.toString())) {
|
||||||
|
entry.setMethod(ZipEntry.STORED);
|
||||||
|
entry.setSize(Files.size(file));
|
||||||
|
entry.setCompressedSize(Files.size(file));
|
||||||
|
entry.setCrc(getCRC(file));
|
||||||
|
} else entry.setMethod(ZipEntry.DEFLATED);
|
||||||
}
|
}
|
||||||
|
|
||||||
((ZipArchiveOutputStream)arc).putArchiveEntry(entry);
|
((ZipArchiveOutputStream)arc).putArchiveEntry(entry);
|
||||||
|
@ -42,9 +42,15 @@ public class AbstractTarArchiver extends AbstractCompressor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void addEntry(InputSupplier in, OutputStream arc) throws IOException {
|
protected void addEntry(InputSupplier input, OutputStream arc) throws IOException {
|
||||||
try (InputStream fileInputStream = in.getInputStream()) {
|
try (InputStream fileInputStream = input.getInputStream()) {
|
||||||
TarArchiveEntry entry = (TarArchiveEntry)((TarArchiveOutputStream) arc).createArchiveEntry(in.getPath(), in.getName());
|
TarArchiveEntry entry;
|
||||||
|
if(input.getPath().isEmpty()) {//Virtual entry
|
||||||
|
entry = new TarArchiveEntry(input.getName());
|
||||||
|
entry.setSize(input.size());
|
||||||
|
} else
|
||||||
|
entry = (TarArchiveEntry)((TarArchiveOutputStream) arc).createArchiveEntry(input.getPath().get(), input.getName());
|
||||||
|
|
||||||
((TarArchiveOutputStream)arc).putArchiveEntry(entry);
|
((TarArchiveOutputStream)arc).putArchiveEntry(entry);
|
||||||
|
|
||||||
IOUtils.copy(fileInputStream, arc);
|
IOUtils.copy(fileInputStream, arc);
|
||||||
|
Loading…
Reference in New Issue
Block a user