Skip to content

Commit

Permalink
refactor: cleanup public entry points
Browse files Browse the repository at this point in the history
Archive constructors should not expose VolumeManager
Junrar static methods should not expose VolumeManager
removed ExtractDestination which doesn't bring anything
make LocalFolderExtractor package private

BREAKING CHANGE: public API changed
  • Loading branch information
gotson committed Jul 25, 2020
1 parent b4d9768 commit 70499bb
Show file tree
Hide file tree
Showing 8 changed files with 62 additions and 150 deletions.
64 changes: 26 additions & 38 deletions src/main/java/com/github/junrar/Archive.java
Original file line number Diff line number Diff line change
Expand Up @@ -108,35 +108,15 @@ public class Archive implements Closeable, Iterable<FileHeader> {
private FileHeader nextFileHeader;
private String password;

public Archive(final VolumeManager volumeManager) throws RarException, IOException {
this(volumeManager, null);
}


/**
* create a new archive object using the given {@link VolumeManager}
*
* @param volumeManager the the {@link VolumeManager} that will provide volume stream
* data
* @param unrarCallback gets feedback on the extraction progress
* @throws RarException .
* @throws IOException .
*/
public Archive(
final VolumeManager volumeManager,
final UnrarCallback unrarCallback
) throws RarException, IOException {
this(volumeManager, unrarCallback, null);
}
public Archive(
final VolumeManager volumeManager,
final UnrarCallback unrarCallback,
final String paasword
final UnrarCallback unrarCallback,
final String password
) throws RarException, IOException {

this.volumeManager = volumeManager;
this.unrarCallback = unrarCallback;
this.password = paasword;
this.password = password;

try {
setVolume(this.volumeManager.nextArchive(this, null));
Expand All @@ -151,30 +131,38 @@ public Archive(
this.dataIO = new ComprDataIO(this);
}

public Archive(
final File firstVolume,
final UnrarCallback unrarCallback
) throws RarException, IOException {
this(new FileVolumeManager(firstVolume), unrarCallback);
public Archive(final File firstVolume) throws RarException, IOException {
this(new FileVolumeManager(firstVolume), null, null);
}

public Archive(final File firstVolume, final UnrarCallback unrarCallback) throws RarException, IOException {
this(new FileVolumeManager(firstVolume), unrarCallback, null);
}

// public File getFile() {
// return file;
// }
//
// void setFile(File file) throws IOException {
// this.file = file;
// setFile(new ReadOnlyAccessFile(file), file.length());
// }
public Archive(final File firstVolume, final String password) throws RarException, IOException {
this(new FileVolumeManager(firstVolume), null, password);
}

public Archive(final File firstVolume, final UnrarCallback unrarCallback, final String password) throws RarException, IOException {
this(new FileVolumeManager(firstVolume), unrarCallback, password);
}

public Archive(final InputStream rarAsStream) throws RarException, IOException {
this(new InputStreamVolumeManager(rarAsStream), null);
this(new InputStreamVolumeManager(rarAsStream), null, null);
}

public Archive(final InputStream rarAsStream, final UnrarCallback unrarCallback) throws RarException, IOException {
this(new InputStreamVolumeManager(rarAsStream), unrarCallback, null);
}

public Archive(InputStream rarAsStream, String password) throws IOException, RarException {
public Archive(final InputStream rarAsStream, final String password) throws IOException, RarException {
this(new InputStreamVolumeManager(rarAsStream), null, password);
}

public Archive(final InputStream rarAsStream, final UnrarCallback unrarCallback, final String password) throws IOException, RarException {
this(new InputStreamVolumeManager(rarAsStream), unrarCallback, password);
}

private void setChannel(final SeekableReadOnlyByteChannel channel, final long length) throws IOException, RarException {
this.totalPackedSize = 0L;
this.totalPackedRead = 0L;
Expand Down
17 changes: 0 additions & 17 deletions src/main/java/com/github/junrar/ExtractDestination.java

This file was deleted.

49 changes: 16 additions & 33 deletions src/main/java/com/github/junrar/Junrar.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.github.junrar;

import com.github.junrar.exception.RarException;
import com.github.junrar.rarfile.FileHeader;
import com.github.junrar.volume.FileVolumeManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand All @@ -16,25 +16,22 @@ public class Junrar {
private static final Logger logger = LoggerFactory.getLogger(Junrar.class);

public static List<File> extract(final String rarPath, final String destinationPath) throws IOException, RarException {
return extract(rarPath, destinationPath, null);
}

public static List<File> extract(final String rarPath, final String destinationPath, final String password) throws IOException, RarException {
if (rarPath == null || destinationPath == null) {
throw new RuntimeException("archive and destination must be set");
throw new IllegalArgumentException("archive and destination must be set");
}
final File arch = new File(rarPath);
final File dest = new File(destinationPath);
return extract(arch, dest);
return extract(new File(rarPath), new File(destinationPath), password);
}

public static List<File> extract(final File rar, final File destinationFolder) throws RarException, IOException {
validateRarPath(rar);
validateDestinationPath(destinationFolder);

final Archive archive = createArchiveOrThrowException(rar, null);
LocalFolderExtractor lfe = new LocalFolderExtractor(destinationFolder);
return extractArchiveTo(archive, lfe);
return extract(rar, destinationFolder, null);
}

public static List<File> extract(final File rar, final File destinationFolder, final String password)
throws RarException, IOException {
throws RarException, IOException {
validateRarPath(rar);
validateDestinationPath(destinationFolder);

Expand All @@ -44,11 +41,7 @@ public static List<File> extract(final File rar, final File destinationFolder, f
}

public static List<File> extract(final InputStream resourceAsStream, final File destinationFolder) throws RarException, IOException {
validateDestinationPath(destinationFolder);

final Archive arch = createArchiveOrThrowException(resourceAsStream, null);
LocalFolderExtractor lfe = new LocalFolderExtractor(destinationFolder);
return extractArchiveTo(arch, lfe);
return extract(resourceAsStream, destinationFolder, null);
}

public static List<File> extract(final InputStream resourceAsStream, final File destinationFolder, final String password) throws RarException, IOException {
Expand All @@ -59,13 +52,6 @@ public static List<File> extract(final InputStream resourceAsStream, final File
return extractArchiveTo(arch, lfe);
}

public static List<File> extract(
final ExtractDestination destination,
final VolumeManager volumeManager
) throws RarException, IOException {
final Archive archive = new Archive(volumeManager);
return extractArchiveTo(archive, destination);
}

public static List<ContentDescription> getContentsDescription(final File rar) throws RarException, IOException {
validateRarPath(rar);
Expand Down Expand Up @@ -98,7 +84,7 @@ private static Archive createArchiveOrThrowException(final InputStream rarAsStre

private static Archive createArchiveOrThrowException(final File file, final String password) throws RarException, IOException {
try {
return new Archive(new FileVolumeManager(file), null, password);
return new Archive(file, password);
} catch (final RarException | IOException e) {
Junrar.logger.error("Error while creating archive", e);
throw e;
Expand All @@ -107,7 +93,7 @@ private static Archive createArchiveOrThrowException(final File file, final Stri

private static void validateDestinationPath(final File destinationFolder) {
if (destinationFolder == null) {
throw new RuntimeException("archive and destination must me set");
throw new IllegalArgumentException("archive and destination must me set");
}
if (!destinationFolder.exists() || !destinationFolder.isDirectory()) {
throw new IllegalArgumentException("the destination must exist and point to a directory: " + destinationFolder);
Expand All @@ -116,7 +102,7 @@ private static void validateDestinationPath(final File destinationFolder) {

private static void validateRarPath(final File rar) {
if (rar == null) {
throw new RuntimeException("archive and destination must me set");
throw new IllegalArgumentException("archive and destination must me set");
}
if (!rar.exists()) {
throw new IllegalArgumentException("the archive does not exit: " + rar);
Expand All @@ -126,7 +112,7 @@ private static void validateRarPath(final File rar) {
}
}

private static List<File> extractArchiveTo(final Archive arch, final ExtractDestination destination) throws IOException, RarException {
private static List<File> extractArchiveTo(final Archive arch, final LocalFolderExtractor destination) throws IOException, RarException {
if (arch.isEncrypted()) {
logger.warn("archive is encrypted cannot extract");
arch.close();
Expand All @@ -141,12 +127,9 @@ private static List<File> extractArchiveTo(final Archive arch, final ExtractDest
if (file != null) {
extractedFiles.add(file);
}
} catch (final IOException e) {
} catch (final IOException | RarException e) {
logger.error("error extracting the file", e);
throw e;
} catch (final RarException e) {
logger.error("error extraction the file", e);
throw e;
}
}
} finally {
Expand All @@ -156,7 +139,7 @@ private static List<File> extractArchiveTo(final Archive arch, final ExtractDest
}

private static File tryToExtract(
final ExtractDestination destination,
final LocalFolderExtractor destination,
final Archive arch,
final FileHeader fileHeader
) throws IOException, RarException {
Expand Down
14 changes: 6 additions & 8 deletions src/main/java/com/github/junrar/LocalFolderExtractor.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,16 @@
import java.io.IOException;
import java.io.OutputStream;

public class LocalFolderExtractor implements ExtractDestination {
class LocalFolderExtractor {

private final File folderDestination;
private static final Logger logger = LoggerFactory.getLogger(LocalFolderExtractor.class);

public LocalFolderExtractor(final File destination) {
LocalFolderExtractor(final File destination) {
this.folderDestination = destination;
}

@Override
public File createDirectory(final FileHeader fh) {
File createDirectory(final FileHeader fh) {
String fileName = null;
if (fh.isDirectory()) {
if (fh.isUnicode()) {
Expand Down Expand Up @@ -48,10 +47,9 @@ public File createDirectory(final FileHeader fh) {
return f;
}

@Override
public File extract(
final Archive arch,
final FileHeader fileHeader
File extract(
final Archive arch,
final FileHeader fileHeader
) throws RarException, IOException {
final File f = createFile(fileHeader, folderDestination);
try (OutputStream stream = new FileOutputStream(f)) {
Expand Down
3 changes: 1 addition & 2 deletions src/test/java/com/github/junrar/ArchiveTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
import com.github.junrar.exception.UnsupportedRarEncryptedException;
import com.github.junrar.exception.UnsupportedRarV5Exception;
import com.github.junrar.rarfile.FileHeader;
import com.github.junrar.volume.FileVolumeManager;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;

Expand Down Expand Up @@ -49,7 +48,7 @@ public void testTikaDocs() throws Exception {


File f = new File(getClass().getResource("tika-documents.rar").toURI());
try (Archive archive = new Archive(new FileVolumeManager(f))) {
try (Archive archive = new Archive(f)) {
assertThat(archive.isPasswordProtected()).isFalse();
assertThat(archive.isEncrypted()).isFalse();

Expand Down
39 changes: 9 additions & 30 deletions src/test/java/com/github/junrar/JunrarTest.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.github.junrar;

import com.github.junrar.exception.RarException;
import com.github.junrar.volume.FileVolumeManager;
import org.apache.commons.io.FileUtils;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
Expand Down Expand Up @@ -34,52 +33,32 @@ public static void tearDownFunctionalTests() throws IOException {
public void extractionFromFileHappyDay() throws RarException, IOException {
final File rarFileOnTemp = TestCommons.writeTestRarToFolder(tempFolder);

Junrar.extract(rarFileOnTemp, tempFolder);

final File fooDir = new File(tempFolder, "foo");
String barFileContent = FileUtils.readFileToString(new File(fooDir, "bar.txt"), Charset.defaultCharset());

assertThat(fooDir).exists();
assertThat(barFileContent).isEqualTo("baz\n");
}

@Test
public void extractionFromFileHappyDayAndValidateExtractedFiles() throws RarException, IOException {
final File rarFileOnTemp = TestCommons.writeTestRarToFolder(tempFolder);

final List<File> extractedFiles = Junrar.extract(rarFileOnTemp, tempFolder);

final File fooDir = new File(tempFolder, "foo");
File barFile = new File(fooDir, "bar.txt");

assertThat(extractedFiles.get(0)).isEqualTo(barFile);
assertThat(extractedFiles.get(1)).isEqualTo(fooDir);
}


@Test
public void extractionFromFileWithVolumeManagerAndExtractorHappyDay() throws RarException, IOException {
final File rarFileOnTemp = TestCommons.writeTestRarToFolder(tempFolder);

Junrar.extract(new LocalFolderExtractor(tempFolder), new FileVolumeManager(rarFileOnTemp));

final File fooDir = new File(tempFolder, "foo");
String barFileContent = FileUtils.readFileToString(new File(fooDir, "bar.txt"), Charset.defaultCharset());
String barFileContent = FileUtils.readFileToString(barFile, Charset.defaultCharset());

assertThat(fooDir).exists();
assertThat(barFileContent).isEqualTo("baz\n");
assertThat(extractedFiles.get(0)).isEqualTo(barFile);
assertThat(extractedFiles.get(1)).isEqualTo(fooDir);
}

@Test
public void extractionFromStreamHappyDay() throws IOException, RarException {
final InputStream resourceAsStream = JunrarTest.class.getResourceAsStream(TestCommons.SIMPLE_RAR_RESOURCE_PATH);
Junrar.extract(resourceAsStream, tempFolder);

final List<File> extractedFiles = Junrar.extract(resourceAsStream, tempFolder);

final File fooDir = new File(tempFolder, "foo");
String barFileContent = FileUtils.readFileToString(new File(fooDir, "bar.txt"), Charset.defaultCharset());
File barFile = new File(fooDir, "bar.txt");
String barFileContent = FileUtils.readFileToString(barFile, Charset.defaultCharset());

assertThat(fooDir).exists();
assertThat(barFileContent).isEqualTo("baz\n");
assertThat(extractedFiles.get(0)).isEqualTo(barFile);
assertThat(extractedFiles.get(1)).isEqualTo(fooDir);
}

@Test
Expand Down
18 changes: 0 additions & 18 deletions src/test/java/com/github/junrar/ResourceReleasedTest.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.github.junrar;

import com.github.junrar.exception.RarException;
import com.github.junrar.volume.FileVolumeManager;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.junit.jupiter.api.AfterEach;
Expand Down Expand Up @@ -67,16 +66,6 @@ public void extractRar5FromString() {
assertThat(thrown).isInstanceOf(RarException.class);
}

@Test
public void extractRar5FromVolumeManager() {
final ExtractDestination extractDestination = new LocalFolderExtractor(extractDir);
final VolumeManager volumeManager = new FileVolumeManager(rar5TestFile);

Throwable thrown = catchThrowable(() -> Junrar.extract(extractDestination, volumeManager));

assertThat(thrown).isInstanceOf(RarException.class);
}

@Test
public void extractRar4FromFile() throws IOException, RarException {
Junrar.extract(rar4TestFile, extractDir);
Expand All @@ -93,11 +82,4 @@ public void extractRar4FromInputStream() throws IOException, RarException {
public void extractRar4FromString() throws IOException, RarException {
Junrar.extract(rar4TestFile.getAbsolutePath(), extractDir.getAbsolutePath());
}

@Test
public void extractRar4FromVolumeManager() throws IOException, RarException {
final ExtractDestination extractDestination = new LocalFolderExtractor(extractDir);
final VolumeManager volumeManager = new FileVolumeManager(rar4TestFile);
Junrar.extract(extractDestination, volumeManager);
}
}

0 comments on commit 70499bb

Please sign in to comment.