Skip to content

Commit

Permalink
FORGE-2308: Introduced ZipFileResourceEntry and extractTo method
Browse files Browse the repository at this point in the history
  • Loading branch information
gastaldi committed Jul 13, 2015
1 parent 4bbf7e6 commit 6d5f51a
Show file tree
Hide file tree
Showing 4 changed files with 165 additions and 6 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/**
* Copyright 2015 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Eclipse Public License version 1.0, available at
* http://www.eclipse.org/legal/epl-v10.html
*/

package org.jboss.forge.addon.resource.zip;

import org.jboss.forge.addon.resource.DirectoryResource;
import org.jboss.forge.addon.resource.Resource;

/**
* A {@link Resource} that represents a ZipFileEntry
*
* @author <a href="mailto:ggastald@redhat.com">George Gastaldi</a>
*/
public interface ZipFileResourceEntry extends Resource<String>
{
/**
* Unzip this {@link ZipFileResourceEntry} to the specified {@link DirectoryResource}.
*
* This method will extract the full path, including root folders from this {@link ZipFileResourceEntry}
*
* @param directoryResource the target directory
*/
void extractTo(DirectoryResource directoryResource);

/**
* Unzip this {@link ZipFileResourceEntry} to the specified {@link DirectoryResource}.
*
* @param directoryResource the target directory
* @param newName the new file name
*/
void extractTo(DirectoryResource directoryResource, String newName);
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import java.util.Collections;
import java.util.List;

import org.jboss.forge.addon.resource.DirectoryResource;
import org.jboss.forge.addon.resource.Resource;
import org.jboss.forge.addon.resource.ResourceException;
import org.jboss.forge.addon.resource.ResourceFactory;
Expand All @@ -20,17 +21,18 @@
import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.FileHeader;
import net.lingala.zip4j.model.UnzipParameters;

/**
* Entries for a {@link ZipFileResource}
*
* @author <a href="mailto:ggastald@redhat.com">George Gastaldi</a>
*/
public class ZipFileResourceEntry extends VirtualResource<ZipFileResource>
public class ZipFileResourceEntryImpl extends VirtualResource<String>implements ZipFileResourceEntry
{
private final FileHeader fileHeader;

public ZipFileResourceEntry(ResourceFactory factory, ZipFileResource parent, FileHeader fileHeader)
public ZipFileResourceEntryImpl(ResourceFactory factory, ZipFileResource parent, FileHeader fileHeader)
{
super(factory, parent);
Assert.notNull(fileHeader, "File header should not be null");
Expand Down Expand Up @@ -77,9 +79,9 @@ public String getName()
}

@Override
public ZipFileResource getUnderlyingResourceObject()
public String getUnderlyingResourceObject()
{
return (ZipFileResource) getParent();
return getName();
}

@Override
Expand All @@ -94,6 +96,34 @@ public String toString()
return getName();
}

@Override
public void extractTo(DirectoryResource directoryResource, String newName)
{
try
{
UnzipParameters parameters = new UnzipParameters();
getZipFile().extractFile(fileHeader, directoryResource.getFullyQualifiedName(), parameters, newName);
}
catch (ZipException e)
{
throw new ResourceException("Error while fetching zip contents", e);
}
}

@Override
public void extractTo(DirectoryResource directoryResource)
{
try
{
UnzipParameters parameters = new UnzipParameters();
getZipFile().extractFile(fileHeader, directoryResource.getFullyQualifiedName(), parameters);
}
catch (ZipException e)
{
throw new ResourceException("Error while fetching zip contents", e);
}
}

private ZipFile getZipFile()
{
ZipFileResourceImpl impl = (ZipFileResourceImpl) getParent();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ public Resource<?> getChild(String name)
{
throw new ResourceException("Error while fetching file header", e);
}
return (fileHeader == null) ? null : new ZipFileResourceEntry(getResourceFactory(), this, fileHeader);
return (fileHeader == null) ? null : new ZipFileResourceEntryImpl(getResourceFactory(), this, fileHeader);
}

@Override
Expand All @@ -86,7 +86,7 @@ protected List<Resource<?>> doListResources()
List<FileHeader> fileHeaders = zipFile.getFileHeaders();
for (FileHeader fileHeader : fileHeaders)
{
entries.add(new ZipFileResourceEntry(getResourceFactory(), this, fileHeader));
entries.add(new ZipFileResourceEntryImpl(getResourceFactory(), this, fileHeader));
}
}
catch (ZipException e)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.not;

import java.io.File;
import java.io.FileOutputStream;
Expand Down Expand Up @@ -173,7 +174,99 @@ public void testZipFileResourceAddCustomDirectoryName() throws Exception
Assert.assertEquals(2, children.size());
Assert.assertEquals("my-new-directory" + File.separatorChar + child1.getName(), children.get(0).getName());
Assert.assertEquals("my-new-directory" + File.separatorChar + child2.getName(), children.get(1).getName());
}

@Test
public void testExtractZipFileResourceEntry() throws Exception
{
File tmpDir = OperatingSystemUtils.createTempDir();
tmpDir.deleteOnExit();
File child1 = new File(tmpDir, "child1.txt");
child1.deleteOnExit();
Files.write(child1.toPath(), "Child 1".getBytes());
File child2 = new File(tmpDir, "child2.txt");
child2.deleteOnExit();
Files.write(child2.toPath(), "Child 2".getBytes());

DirectoryResource directoryResource = resourceFactory.create(DirectoryResource.class, tmpDir);
DirectoryResource newDirectoryResource = resourceFactory.create(DirectoryResource.class,
OperatingSystemUtils.createTempDir());
ZipFileResource resource = createTempZipFileResource();
resource.add("my-new-directory", directoryResource);

List<Resource<?>> children = resource.listResources();
Assert.assertEquals(2, children.size());

ZipFileResourceEntry entry = (ZipFileResourceEntry) children.get(1);
entry.extractTo(newDirectoryResource);

List<Resource<?>> newChildren = newDirectoryResource.listResources();
Assert.assertEquals(1, newChildren.size());
Assert.assertThat(newChildren.get(0), is(instanceOf(DirectoryResource.class)));
Assert.assertEquals("my-new-directory", newChildren.get(0).getName());
}

@Test
public void testExtractZipFileResourceEntryCustomName() throws Exception
{
File tmpDir = OperatingSystemUtils.createTempDir();
tmpDir.deleteOnExit();
File child1 = new File(tmpDir, "child1.txt");
child1.deleteOnExit();
Files.write(child1.toPath(), "Child 1".getBytes());
File child2 = new File(tmpDir, "child2.txt");
child2.deleteOnExit();
Files.write(child2.toPath(), "Child 2".getBytes());

DirectoryResource directoryResource = resourceFactory.create(DirectoryResource.class, tmpDir);
DirectoryResource newDirectoryResource = resourceFactory.create(DirectoryResource.class,
OperatingSystemUtils.createTempDir());
ZipFileResource resource = createTempZipFileResource();
resource.add("my-new-directory", directoryResource);

List<Resource<?>> children = resource.listResources();
Assert.assertEquals(2, children.size());

ZipFileResourceEntry entry = (ZipFileResourceEntry) children.get(1);
entry.extractTo(newDirectoryResource, "new-file.txt");

List<Resource<?>> newChildren = newDirectoryResource.listResources();
Assert.assertEquals(1, newChildren.size());
Assert.assertThat(newChildren.get(0), is(instanceOf(FileResource.class)));
Assert.assertThat(newChildren.get(0), is(not(instanceOf(DirectoryResource.class))));
Assert.assertEquals("new-file.txt", newChildren.get(0).getName());
}

@Test
public void testExtractZipFileResourceEntryCustomDirectoryName() throws Exception
{
File tmpDir = OperatingSystemUtils.createTempDir();
tmpDir.deleteOnExit();
File child = new File(tmpDir, "child");
child.mkdir();
child.deleteOnExit();
File child2 = new File(child, "grandchild.txt");
child2.deleteOnExit();
Files.write(child2.toPath(), "Child 2".getBytes());

DirectoryResource directoryResource = resourceFactory.create(DirectoryResource.class, tmpDir);

DirectoryResource newDirectoryResource = resourceFactory.create(DirectoryResource.class,
OperatingSystemUtils.createTempDir());
ZipFileResource resource = createTempZipFileResource();
resource.add("my-new-directory", directoryResource);

List<Resource<?>> children = resource.listResources();
Assert.assertEquals(1, children.size());

ZipFileResourceEntry entry = (ZipFileResourceEntry) children.get(0);
entry.extractTo(newDirectoryResource, "new-file.txt");

List<Resource<?>> newChildren = newDirectoryResource.listResources();
Assert.assertEquals(1, newChildren.size());
Assert.assertThat(newChildren.get(0), is(instanceOf(FileResource.class)));
Assert.assertThat(newChildren.get(0), is(not(instanceOf(DirectoryResource.class))));
Assert.assertEquals("new-file.txt", newChildren.get(0).getName());
}

private ZipFileResource createTempZipFileResource() throws IOException
Expand Down

0 comments on commit 6d5f51a

Please sign in to comment.