/*******************************************************************************
* Copyright (c) 2014 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.windup.ui.internal.archiver;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import org.apache.commons.compress.archivers.ArchiveEntry;
import org.apache.commons.compress.archivers.ArchiveOutputStream;
import org.apache.commons.io.IOUtils;
/**
* <p>
* Defines an abstract {@link IFileExporter} which uses the Apache commons archivers API to perform archive export operations.
* </p>
*/
public abstract class AbstractArchiveFileExporter implements IFileExporter
{
private ArchiveOutputStream outputStream;
/**
* Create an instance of this class.
*
* @param archiveName Name of the archive to create and add {@link File}s too
* @param compress <code>true</code> to use compression when creating the ZIP archive, <code>false</code> otherwise
*
* @exception java.io.IOException can happen when doing file IO
*/
public AbstractArchiveFileExporter(String archiveName, boolean compress) throws IOException
{
this.outputStream = this.createOutputStream(archiveName, compress);
}
/**
* @see org.jboss.tools.windup.ui.internal.archiver.IFileExporter#write(java.io.File, java.lang.String)
*/
@Override
public final void write(File fileToArchive, String destinationPath)
throws IOException
{
// create and add a new zip entry
ArchiveEntry newEntry = this.getNewArchiveEntry(fileToArchive, destinationPath);
this.outputStream.putArchiveEntry(newEntry);
/*
* if file, add it's contents to the archive else if directory close the new entry
*/
if (fileToArchive.isFile())
{
FileInputStream fInputStream = null;
try
{
fInputStream = new FileInputStream(fileToArchive);
IOUtils.copy(fInputStream, this.outputStream);
this.outputStream.closeArchiveEntry();
}
finally
{
IOUtils.closeQuietly(fInputStream);
}
}
else
{
// close the directory entry
this.outputStream.closeArchiveEntry();
}
}
/**
* <p>
* Closes the output stream returned by {@link #createOutputStream(String, boolean)}.
* </p>
*
* <p>
* If subclasses overrides this method then it needs to be sure to call the super implimentation.
* </p>
*
* @see org.jboss.tools.windup.ui.internal.archiver.IFileExporter#finished()
*/
@Override
public void finished() throws IOException
{
this.outputStream.close();
}
/**
* <p>
* Creates a new output stream for this file exporter to use.
* </p>
*
* @param archiveName Name of the archive to create and add {@link File}s too
* @param compress <code>true</code> to use compression when creating the ZIP archive, <code>false</code> otherwise
*
* @return creates the {@link ArchiveOutputStream} to use for this exporter.
*
* @throws IOException this can happen during file IO
*/
protected abstract ArchiveOutputStream createOutputStream(
String archiveName, boolean compress) throws IOException;
/**
* <p>
* Creates and returns a new {@link ArchiveEntry} based on the given information.
* </p>
*
* @param fileToArchive {@link File} to archive to the given destination in the archive
* @param destinationPath destination to archive the given {@link File} in the archive
*
* @return a new {@link ArchiveEntry} for the given file to archive to the given destination
*/
protected abstract ArchiveEntry getNewArchiveEntry(
File fileToArchive, String destinationPath);
}