package gov.loc.repository.bagit.examples.serialization;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.StandardOpenOption;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
/**
* Example(s) for creating a zipped bag.
*/
public class CreateZipBagExample extends Assert{
@Rule
public TemporaryFolder folder= new TemporaryFolder();
private Path bagRoot;
private Path zippedBagPath;
private OutputStream outputStream;
@Before
public void setup() throws IOException{
bagRoot = Paths.get(new File("src/test/resources/bags/v0_97/bag").toURI());
zippedBagPath = Paths.get(folder.newFile("bag.zip").toURI());
outputStream = Files.newOutputStream(zippedBagPath, StandardOpenOption.CREATE);
}
/**
* <b> THIS IS JUST AN EXAMPLE. DO NOT USE IN PRODUCTION!</b>
*/
@Test
public void createZipBagWithJavaStandardLibrary(){
try(ZipOutputStream zip = new ZipOutputStream(outputStream)){
ZipVistor visitor = new ZipVistor(bagRoot, zip);
Files.walkFileTree(bagRoot, visitor);
assertTrue(Files.exists(zippedBagPath));
}
catch(Exception e){
e.printStackTrace();
}
}
class ZipVistor extends SimpleFileVisitor<Path>{
private Path rootDir;
private ZipOutputStream zip;
public ZipVistor(Path rootDir, ZipOutputStream zip){
this.rootDir = rootDir;
this.zip = zip;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException
{
try{
Path relative = rootDir.relativize(file);
ZipEntry zipEntry = new ZipEntry(relative.toString());
zip.putNextEntry(zipEntry);
Files.copy(file, zip);
zip.closeEntry();
}
catch(Exception e){
e.printStackTrace();
}
return FileVisitResult.CONTINUE;
}
}
}