Skip to content

Commit

Permalink
FORGE-2308: Improved support for DirectoryResources in ZipFileResource
Browse files Browse the repository at this point in the history
  • Loading branch information
gastaldi committed Jul 13, 2015
1 parent d445900 commit 2cb37e2
Show file tree
Hide file tree
Showing 3 changed files with 102 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,12 @@ protected List<Resource<?>> doListResources()
return Collections.emptyList();
}

@Override
public String toString()
{
return getName();
}

private ZipFile getZipFile()
{
ZipFileResourceImpl impl = (ZipFileResourceImpl) getParent();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
package org.jboss.forge.addon.resource.zip;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

Expand Down Expand Up @@ -139,14 +141,30 @@ public ZipFileResource add(FileResource<?>... resources)
{
Assert.notNull(resources, "You cannot add null resources to a zip file");
ArrayList<File> files = new ArrayList<>(resources.length);
ArrayList<File> directories = new ArrayList<>(resources.length);

for (FileResource<?> resource : resources)
{
files.add(resource.getUnderlyingResourceObject());
if (resource.isDirectory())
{
directories.add(resource.getUnderlyingResourceObject());
}
else
{
files.add(resource.getUnderlyingResourceObject());
}
}
try
{
ZipParameters parameters = new ZipParameters();
getZipFile().addFiles(files, parameters);
for (File directory : directories)
{
getZipFile().addFolder(directory, parameters);
}
if (files.size() > 0)
{
getZipFile().addFiles(files, parameters);
}
}
catch (ZipException e)
{
Expand All @@ -164,10 +182,23 @@ public ZipFileResource add(String name, Resource<?> resource)
{
ZipParameters parameters = new ZipParameters();
parameters.setFileNameInZip(name);
parameters.setSourceExternalStream(true);
getZipFile().addStream(resource.getResourceInputStream(), parameters);
if (resource instanceof DirectoryResource)
{
for (Resource child : resource.listResources())
{
add(name + '/' + child.getName(), child);
}
}
else
{
parameters.setSourceExternalStream(true);
try (InputStream stream = resource.getResourceInputStream())
{
getZipFile().addStream(stream, parameters);
}
}
}
catch (ZipException e)
catch (IOException | ZipException e)
{
throw new ResourceException("Error while adding files to zip file", e);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.util.List;

import javax.inject.Inject;
Expand Down Expand Up @@ -67,11 +69,7 @@ public void testZipResource() throws Exception
@Test
public void testZipResourceAddFile() throws Exception
{
ZipFileResource resource = resourceFactory.create(File.createTempFile("zipresource", ".zip"))
.reify(ZipFileResource.class);
Assert.assertNotNull(resource);
resource.delete();
resource.deleteOnExit();
ZipFileResource resource = createTempZipFileResource();
FileResource internalResource = resourceFactory.create(FileResource.class, File.createTempFile("tmp", ".txt"));
internalResource.deleteOnExit();
internalResource.setContents("Hello World");
Expand All @@ -85,11 +83,7 @@ public void testZipResourceAddFile() throws Exception
@Test
public void testZipResourceAddResource() throws Exception
{
ZipFileResource resource = resourceFactory.create(File.createTempFile("zipresource", ".zip"))
.reify(ZipFileResource.class);
Assert.assertNotNull(resource);
resource.delete();
resource.deleteOnExit();
ZipFileResource resource = createTempZipFileResource();
FileResource internalResource = resourceFactory.create(FileResource.class, File.createTempFile("tmp", ".txt"));
internalResource.deleteOnExit();
internalResource.setContents("Hello World");
Expand All @@ -103,10 +97,7 @@ public void testZipResourceAddResource() throws Exception
@Test
public void testZipResourceExtract() throws Exception
{
ZipFileResource resource = resourceFactory.create(File.createTempFile("zipresource", ".zip"))
.reify(ZipFileResource.class);
resource.delete();
resource.deleteOnExit();
ZipFileResource resource = createTempZipFileResource();
FileResource internalResource = resourceFactory.create(FileResource.class, File.createTempFile("tmp", ".txt"));
internalResource.deleteOnExit();
internalResource.setContents("Hello World");
Expand Down Expand Up @@ -139,4 +130,59 @@ public void testZipFileResourceReadEncrypted() throws Exception
Assert.assertThat(children.get(0).getContents(), equalTo("Hello World\n"));
}

@Test
public void testZipFileResourceAddDirectory() 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);
ZipFileResource resource = createTempZipFileResource();
resource.add(directoryResource);

List<Resource<?>> children = resource.listResources();
Assert.assertEquals(3, children.size());
Assert.assertEquals(tmpDir.getName() + '/', children.get(0).getName());
Assert.assertEquals(tmpDir.getName() + '/' + child1.getName(), children.get(1).getName());
Assert.assertEquals(tmpDir.getName() + '/' + child2.getName(), children.get(2).getName());
}

@Test
public void testZipFileResourceAddCustomDirectoryName() 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);
ZipFileResource resource = createTempZipFileResource();
resource.add("my-new-directory", directoryResource);

List<Resource<?>> children = resource.listResources();
Assert.assertEquals(2, children.size());
Assert.assertEquals("my-new-directory/" + child1.getName(), children.get(0).getName());
Assert.assertEquals("my-new-directory/" + child2.getName(), children.get(1).getName());

}

private ZipFileResource createTempZipFileResource() throws IOException
{
ZipFileResource resource = resourceFactory.create(File.createTempFile("zipresource", ".zip"))
.reify(ZipFileResource.class);
resource.delete();
resource.deleteOnExit();
return resource;
}

}

0 comments on commit 2cb37e2

Please sign in to comment.