blob: a505ac6a996bff53ba8f2edd681ebce6ad6ff257 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* 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:
* Marc-Andre Laperle - Initial API and implementation.
*******************************************************************************/
package org.eclipse.tracecompass.internal.tmf.ui.project.wizards.importtrace;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.zip.GZIPInputStream;
/**
* Wrapper for a Gzipped file
*/
public class GzipFile implements AutoCloseable {
private static final String GZIP_EXTENSION = ".gz"; //$NON-NLS-1$
private final File fFile;
private final GzipEntry fEntry;
private GzipEntry fCurEntry;
private boolean fIsClosed = false;
private final InputStream fInternalEntryStream;
/**
* Create a new GzipFile for the given file.
*
* @param source the source file
* @throws IOException
* File not found and such
*/
public GzipFile(File source) throws IOException {
fFile = source;
InputStream in = new FileInputStream(source);
try {
// Check if it's a GZIPInputStream.
fInternalEntryStream = new GZIPInputStream(in);
} catch (IOException e) {
in.close();
throw e;
}
String name = source.getName();
fEntry = new GzipEntry(name.substring(0, name.lastIndexOf(GZIP_EXTENSION)));
fCurEntry = fEntry;
}
/**
* Close the tar file input stream.
*
* @throws IOException if the file cannot be successfully closed
*/
@Override
public void close() throws IOException {
if (fInternalEntryStream != null && !fIsClosed) {
fInternalEntryStream.close();
fIsClosed = true;
}
}
/**
* Create a new GzipFile for the given path name.
*
* @param filename
* the filename of the gzip file
* @throws IOException
* if the file cannot be opened
*/
public GzipFile(String filename) throws IOException {
this(new File(filename));
}
/**
* Returns an enumeration cataloguing the tar archive.
*
* @return enumeration of all files in the archive
*/
public Enumeration<GzipEntry> entries() {
return new Enumeration<GzipEntry>() {
@Override
public boolean hasMoreElements() {
return (fCurEntry != null);
}
@Override
public GzipEntry nextElement() {
GzipEntry oldEntry = fCurEntry;
fCurEntry = null;
return oldEntry;
}
};
}
/**
* Returns a new InputStream for the given file in the tar archive.
*
* @param entry
* the GzipEntry
* @return an input stream for the given file
*/
public InputStream getInputStream(GzipEntry entry) {
if (entry != fEntry) {
throw new IllegalArgumentException();
}
return fInternalEntryStream;
}
/**
* Returns the path name of the file this archive represents.
*
* @return path
*/
public String getName() {
return fFile.getPath();
}
@Override
protected void finalize() throws Throwable {
close();
super.finalize();
}
}