Skip to content

Commit

Permalink
#119 Separate factory for CustomizeCharset
Browse files Browse the repository at this point in the history
  • Loading branch information
oleg-cherednik committed Feb 17, 2025
1 parent 7bcd086 commit ecb6a27
Show file tree
Hide file tree
Showing 55 changed files with 263 additions and 159 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ private Decompose getCentralDirectoryDecompose(BlockModel blockModel) {
@Override
public CentralDirectory.FileHeader getFileHeader(String entryName) {
ZipModelReader reader = new ZipModelReader(srcZip,
settings.getCustomizeCharset(),
settings.getCharsetProvider(),
settings.getPasswordProvider());
reader.readCentralData();
return reader.getCentralDirectory().getFileHeaders().stream()
Expand All @@ -95,7 +95,7 @@ public CentralDirectory.FileHeader getFileHeader(String entryName) {
public BlockModel createModel() {
return Quietly.doRuntime(() -> {
BlockZipModelReader reader = new BlockZipModelReader(srcZip,
settings.getCustomizeCharset(),
settings.getCharsetProvider(),
settings.getPasswordProvider());
return settings.isReadEntries() ? reader.readWithEntries() : reader.read();
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ public final class UnzipEngine implements ZipFile.Reader {

public UnzipEngine(SrcZip srcZip, UnzipSettings settings) {
PasswordProvider passwordProvider = settings.getPasswordProvider();
zipModel = ZipModelBuilder.read(srcZip, settings.getCharsetCustomizer(), passwordProvider);
zipModel = ZipModelBuilder.read(srcZip, settings.getCharsetProvider(), passwordProvider);
unzipExtractEngine = createUnzipExtractEngine(settings, zipModel);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@
import ru.olegcherednik.zip4jvm.io.in.file.consecutive.ConsecutiveAccessDataInput;
import ru.olegcherednik.zip4jvm.io.in.file.consecutive.SolidConsecutiveAccessDataInput;
import ru.olegcherednik.zip4jvm.io.in.file.consecutive.SplitConsecutiveAccessDataInput;
import ru.olegcherednik.zip4jvm.model.Charsets;
import ru.olegcherednik.zip4jvm.model.ZipModel;
import ru.olegcherednik.zip4jvm.model.charset.Charsets;
import ru.olegcherednik.zip4jvm.model.entry.ZipEntry;
import ru.olegcherednik.zip4jvm.model.password.PasswordProvider;
import ru.olegcherednik.zip4jvm.model.src.SrcZip;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
import ru.olegcherednik.zip4jvm.exception.Zip4jvmException;
import ru.olegcherednik.zip4jvm.io.in.BitInputStream;
import ru.olegcherednik.zip4jvm.io.in.DataInput;
import ru.olegcherednik.zip4jvm.model.Charsets;
import ru.olegcherednik.zip4jvm.model.charset.Charsets;

import org.apache.commons.io.IOUtils;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import ru.olegcherednik.zip4jvm.model.Zip64;
import ru.olegcherednik.zip4jvm.model.ZipModel;
import ru.olegcherednik.zip4jvm.model.builders.ZipModelBuilder;
import ru.olegcherednik.zip4jvm.model.charset.CharsetProvider;
import ru.olegcherednik.zip4jvm.model.password.PasswordProvider;
import ru.olegcherednik.zip4jvm.model.src.SrcZip;

Expand All @@ -35,8 +36,6 @@
import lombok.RequiredArgsConstructor;

import java.io.IOException;
import java.nio.charset.Charset;
import java.util.function.Function;

/**
* Start reading from the end of the file.
Expand All @@ -59,7 +58,7 @@ public abstract class BaseZipModelReader {
private static final String MARKER_END_CENTRAL_DIRECTORY = "end_central_directory";

protected final SrcZip srcZip;
protected final Function<Charset, Charset> customizeCharset;
protected final CharsetProvider charsetProvider;
protected final PasswordProvider passwordProvider;

protected EndCentralDirectory endCentralDirectory;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,12 @@

import ru.olegcherednik.zip4jvm.io.in.DataInput;
import ru.olegcherednik.zip4jvm.model.CentralDirectory;
import ru.olegcherednik.zip4jvm.model.charset.CharsetProvider;
import ru.olegcherednik.zip4jvm.utils.function.Reader;

import lombok.RequiredArgsConstructor;

import java.io.IOException;
import java.nio.charset.Charset;
import java.util.function.Function;

/**
* @author Oleg Cherednik
Expand All @@ -36,7 +35,7 @@
public class CentralDirectoryReader implements Reader<CentralDirectory> {

protected final long totalEntries;
protected final Function<Charset, Charset> customizeCharset;
protected final CharsetProvider charsetProvider;

@Override
public CentralDirectory read(DataInput in) throws IOException {
Expand All @@ -47,7 +46,7 @@ public CentralDirectory read(DataInput in) throws IOException {
}

protected FileHeaderReader getFileHeaderReader() {
return new FileHeaderReader(totalEntries, customizeCharset);
return new FileHeaderReader(totalEntries, charsetProvider);
}

protected DigitalSignatureReader getDigitalSignatureReader() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,12 @@
import ru.olegcherednik.zip4jvm.model.CentralDirectory;
import ru.olegcherednik.zip4jvm.model.Compression;
import ru.olegcherednik.zip4jvm.model.Zip64;
import ru.olegcherednik.zip4jvm.model.charset.CharsetProvider;
import ru.olegcherednik.zip4jvm.model.password.PasswordProvider;
import ru.olegcherednik.zip4jvm.utils.ValidationUtils;

import java.io.IOException;
import java.nio.charset.Charset;
import java.util.Objects;
import java.util.function.Function;

/**
* see 7.3.4
Expand All @@ -50,10 +49,10 @@ public class EncryptedCentralDirectoryReader extends CentralDirectoryReader {
private final PasswordProvider passwordProvider;

public EncryptedCentralDirectoryReader(long totalEntries,
Function<Charset, Charset> customizeCharset,
CharsetProvider charsetProvider,
Zip64.ExtensibleDataSector extensibleDataSector,
PasswordProvider passwordProvider) {
super(totalEntries, customizeCharset);
super(totalEntries, charsetProvider);
this.extensibleDataSector = Objects.requireNonNull(extensibleDataSector);
this.passwordProvider = passwordProvider;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,14 @@

import ru.olegcherednik.zip4jvm.exception.SignatureNotFoundException;
import ru.olegcherednik.zip4jvm.io.in.DataInput;
import ru.olegcherednik.zip4jvm.model.Charsets;
import ru.olegcherednik.zip4jvm.model.EndCentralDirectory;
import ru.olegcherednik.zip4jvm.model.charset.CharsetProvider;
import ru.olegcherednik.zip4jvm.model.charset.Charsets;
import ru.olegcherednik.zip4jvm.utils.function.Reader;

import lombok.RequiredArgsConstructor;

import java.io.IOException;
import java.nio.charset.Charset;
import java.util.function.Function;

/**
* @author Oleg Cherednik
Expand All @@ -37,7 +36,7 @@
@RequiredArgsConstructor
public class EndCentralDirectoryReader implements Reader<EndCentralDirectory> {

private final Function<Charset, Charset> customizeCharset;
private final CharsetProvider charsetProvider;

@Override
public EndCentralDirectory read(DataInput in) throws IOException {
Expand All @@ -57,7 +56,7 @@ public EndCentralDirectory read(DataInput in) throws IOException {

private String readComment(DataInput in) throws IOException {
int commentLength = in.readWord();
return in.readString(commentLength, customizeCharset.apply(Charsets.IBM437));
return in.readString(commentLength, charsetProvider.apply(Charsets.IBM437));
}

private static void checkSignature(DataInput in) throws IOException {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import ru.olegcherednik.zip4jvm.model.GeneralPurposeFlag;
import ru.olegcherednik.zip4jvm.model.InternalFileAttributes;
import ru.olegcherednik.zip4jvm.model.Version;
import ru.olegcherednik.zip4jvm.model.charset.CharsetProvider;
import ru.olegcherednik.zip4jvm.model.extrafield.PkwareExtraField;
import ru.olegcherednik.zip4jvm.utils.function.Reader;

Expand All @@ -36,7 +37,6 @@
import java.nio.charset.Charset;
import java.util.LinkedList;
import java.util.List;
import java.util.function.Function;

/**
* @author Oleg Cherednik
Expand All @@ -46,7 +46,7 @@
public class FileHeaderReader implements Reader<List<CentralDirectory.FileHeader>> {

private final long totalEntries;
private final Function<Charset, Charset> customizeCharset;
private final CharsetProvider charsetProvider;

@Override
public final List<CentralDirectory.FileHeader> read(DataInput in) throws IOException {
Expand Down Expand Up @@ -74,7 +74,7 @@ protected CentralDirectory.FileHeader readFileHeader(DataInput in) throws IOExce

int fileNameLength = in.readWord();
int extraFieldLength = in.readWord();
Charset charset = customizeCharset.apply(fileHeader.getGeneralPurposeFlag().getCharset());
Charset charset = charsetProvider.apply(fileHeader.getGeneralPurposeFlag().getCharset());

fileHeader.setCommentLength(in.readWord());
fileHeader.setDiskNo(in.readWord());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,14 @@
import ru.olegcherednik.zip4jvm.model.GeneralPurposeFlag;
import ru.olegcherednik.zip4jvm.model.LocalFileHeader;
import ru.olegcherednik.zip4jvm.model.Version;
import ru.olegcherednik.zip4jvm.model.charset.CharsetProvider;
import ru.olegcherednik.zip4jvm.model.extrafield.ExtraField;
import ru.olegcherednik.zip4jvm.utils.function.Reader;

import lombok.RequiredArgsConstructor;

import java.io.IOException;
import java.nio.charset.Charset;
import java.util.function.Function;

/**
* @author Oleg Cherednik
Expand All @@ -41,7 +41,7 @@
@RequiredArgsConstructor
public class LocalFileHeaderReader implements Reader<LocalFileHeader> {

private final Function<Charset, Charset> customizeCharset;
private final CharsetProvider charsetProvider;

@Override
public LocalFileHeader read(DataInput in) throws IOException {
Expand All @@ -61,7 +61,7 @@ public LocalFileHeader read(DataInput in) throws IOException {
int extraFieldLength = in.readWord();
Charset charset = localFileHeader.getGeneralPurposeFlag().getCharset();

localFileHeader.setFileName(in.readString(fileNameLength, customizeCharset.apply(charset)));
localFileHeader.setFileName(in.readString(fileNameLength, charsetProvider.apply(charset)));
localFileHeader.setExtraField(readExtraFiled(extraFieldLength, localFileHeader, in));

return localFileHeader;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,31 +21,29 @@
import ru.olegcherednik.zip4jvm.engine.unzip.UnzipEngine;
import ru.olegcherednik.zip4jvm.io.in.file.random.RandomAccessDataInput;
import ru.olegcherednik.zip4jvm.io.readers.zip64.Zip64Reader;
import ru.olegcherednik.zip4jvm.model.Charsets;
import ru.olegcherednik.zip4jvm.model.Zip64;
import ru.olegcherednik.zip4jvm.model.ZipModel;
import ru.olegcherednik.zip4jvm.model.builders.ZipModelBuilder;
import ru.olegcherednik.zip4jvm.model.charset.CharsetProvider;
import ru.olegcherednik.zip4jvm.model.charset.UnmodifiedCharsetProvider;
import ru.olegcherednik.zip4jvm.model.password.PasswordProvider;
import ru.olegcherednik.zip4jvm.model.src.SrcZip;
import ru.olegcherednik.zip4jvm.utils.ValidationUtils;

import java.nio.charset.Charset;
import java.util.function.Function;

/**
* @author Oleg Cherednik
* @since 06.03.2019
*/
public final class ZipModelReader extends BaseZipModelReader {

public ZipModelReader(SrcZip srcZip) {
this(srcZip, Charsets.UNMODIFIED, null);
this(srcZip, UnmodifiedCharsetProvider.INSTANCE, null);
}

public ZipModelReader(SrcZip srcZip,
Function<Charset, Charset> customizeCharset,
CharsetProvider charsetProvider,
PasswordProvider passwordProvider) {
super(srcZip, customizeCharset, passwordProvider);
super(srcZip, charsetProvider, passwordProvider);
}

public ZipModel read() {
Expand All @@ -54,7 +52,7 @@ public ZipModel read() {
endCentralDirectory,
zip64,
centralDirectory,
customizeCharset).build();
charsetProvider).build();
}

/**
Expand Down Expand Up @@ -88,7 +86,7 @@ protected RandomAccessDataInput createDataInput() {

@Override
protected EndCentralDirectoryReader getEndCentralDirectoryReader() {
return new EndCentralDirectoryReader(customizeCharset);
return new EndCentralDirectoryReader(charsetProvider);
}

@Override
Expand All @@ -100,11 +98,11 @@ protected Zip64Reader getZip64Reader() {
protected CentralDirectoryReader getCentralDirectoryReader(long totalEntries) {
if (zip64.isCentralDirectoryEncrypted())
return new EncryptedCentralDirectoryReader(totalEntries,
customizeCharset,
charsetProvider,
zip64.getExtensibleDataSector(),
passwordProvider);

return new CentralDirectoryReader(totalEntries, customizeCharset);
return new CentralDirectoryReader(totalEntries, charsetProvider);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,9 @@
import ru.olegcherednik.zip4jvm.io.readers.FileHeaderReader;
import ru.olegcherednik.zip4jvm.model.CentralDirectory;
import ru.olegcherednik.zip4jvm.model.block.BaseCentralDirectoryBlock;
import ru.olegcherednik.zip4jvm.model.charset.CharsetProvider;

import java.io.IOException;
import java.nio.charset.Charset;
import java.util.function.Function;

/**
* @author Oleg Cherednik
Expand All @@ -39,9 +38,9 @@ public class BlockCentralDirectoryReader extends CentralDirectoryReader {
private final BaseCentralDirectoryBlock block;

public BlockCentralDirectoryReader(long totalEntries,
Function<Charset, Charset> customizeCharset,
CharsetProvider charsetProvider,
BaseCentralDirectoryBlock block) {
super(totalEntries, customizeCharset);
super(totalEntries, charsetProvider);
this.block = block;
}

Expand All @@ -52,7 +51,7 @@ public CentralDirectory read(DataInput in) throws IOException {

@Override
protected FileHeaderReader getFileHeaderReader() {
return new BlockFileHeaderReader(totalEntries, customizeCharset, block);
return new BlockFileHeaderReader(totalEntries, charsetProvider, block);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,10 @@
import ru.olegcherednik.zip4jvm.model.CentralDirectory;
import ru.olegcherednik.zip4jvm.model.Zip64;
import ru.olegcherednik.zip4jvm.model.block.crypto.EncryptedCentralDirectoryBlock;
import ru.olegcherednik.zip4jvm.model.charset.CharsetProvider;
import ru.olegcherednik.zip4jvm.model.password.PasswordProvider;

import java.io.IOException;
import java.nio.charset.Charset;
import java.util.function.Function;

/**
* @author Oleg Cherednik
Expand All @@ -43,11 +42,11 @@ public class BlockEncryptedCentralDirectoryReader extends EncryptedCentralDirect
private final EncryptedCentralDirectoryBlock block;

public BlockEncryptedCentralDirectoryReader(long totalEntries,
Function<Charset, Charset> customizeCharset,
CharsetProvider charsetProvider,
Zip64.ExtensibleDataSector extensibleDataSector,
PasswordProvider passwordProvider,
EncryptedCentralDirectoryBlock block) {
super(totalEntries, customizeCharset, extensibleDataSector, passwordProvider);
super(totalEntries, charsetProvider, extensibleDataSector, passwordProvider);
this.block = block;
}

Expand All @@ -63,7 +62,7 @@ public CentralDirectory read(DataInput in) throws IOException {

@Override
protected FileHeaderReader getFileHeaderReader() {
return new BlockFileHeaderReader(totalEntries, customizeCharset, block);
return new BlockFileHeaderReader(totalEntries, charsetProvider, block);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,9 @@
import ru.olegcherednik.zip4jvm.io.readers.EndCentralDirectoryReader;
import ru.olegcherednik.zip4jvm.model.EndCentralDirectory;
import ru.olegcherednik.zip4jvm.model.block.Block;
import ru.olegcherednik.zip4jvm.model.charset.CharsetProvider;

import java.io.IOException;
import java.nio.charset.Charset;
import java.util.function.Function;

/**
* @author Oleg Cherednik
Expand All @@ -36,8 +35,8 @@ public class BlockEndCentralDirectoryReader extends EndCentralDirectoryReader {

private final Block block;

public BlockEndCentralDirectoryReader(Function<Charset, Charset> customizeCharset, Block block) {
super(customizeCharset);
public BlockEndCentralDirectoryReader(CharsetProvider charsetProvider, Block block) {
super(charsetProvider);
this.block = block;
}

Expand Down
Loading

0 comments on commit ecb6a27

Please sign in to comment.