001: /*******************************************************************************
002: * Copyright (c) 2004, 2006 IBM Corporation and others.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * IBM Corporation - initial API and implementation
010: *******************************************************************************/package org.eclipse.ui.internal.wizards.datatransfer;
011:
012: import java.io.File;
013: import java.io.FileInputStream;
014: import java.io.IOException;
015: import java.io.InputStream;
016: import java.util.Enumeration;
017: import java.util.zip.GZIPInputStream;
018:
019: /**
020: * Reads a .tar or .tar.gz archive file, providing an index enumeration
021: * and allows for accessing an InputStream for arbitrary files in the
022: * archive.
023: *
024: * @since 3.1
025: */
026: public class TarFile {
027: private File file;
028: private TarInputStream entryEnumerationStream;
029: private TarEntry curEntry;
030: private TarInputStream entryStream;
031:
032: /**
033: * Create a new TarFile for the given file.
034: *
035: * @param file
036: * @throws TarException
037: * @throws IOException
038: */
039: public TarFile(File file) throws TarException, IOException {
040: this .file = file;
041:
042: InputStream in = new FileInputStream(file);
043: // First, check if it's a GZIPInputStream.
044: try {
045: in = new GZIPInputStream(in);
046: } catch (IOException e) {
047: //If it is not compressed we close
048: //the old one and recreate
049: in.close();
050: in = new FileInputStream(file);
051: }
052: entryEnumerationStream = new TarInputStream(in);
053: curEntry = entryEnumerationStream.getNextEntry();
054: }
055:
056: /**
057: * Close the tar file input stream.
058: *
059: * @throws IOException if the file cannot be successfully closed
060: */
061: public void close() throws IOException {
062: entryEnumerationStream.close();
063: }
064:
065: /**
066: * Create a new TarFile for the given path name.
067: *
068: * @param filename
069: * @throws TarException
070: * @throws IOException
071: */
072: public TarFile(String filename) throws TarException, IOException {
073: this (new File(filename));
074: }
075:
076: /**
077: * Returns an enumeration cataloguing the tar archive.
078: *
079: * @return enumeration of all files in the archive
080: */
081: public Enumeration entries() {
082: return new Enumeration() {
083: public boolean hasMoreElements() {
084: return (curEntry != null);
085: }
086:
087: public Object nextElement() {
088: TarEntry oldEntry = curEntry;
089: try {
090: curEntry = entryEnumerationStream.getNextEntry();
091: } catch (TarException e) {
092: curEntry = null;
093: } catch (IOException e) {
094: curEntry = null;
095: }
096: return oldEntry;
097: }
098: };
099: }
100:
101: /**
102: * Returns a new InputStream for the given file in the tar archive.
103: *
104: * @param entry
105: * @return an input stream for the given file
106: * @throws TarException
107: * @throws IOException
108: */
109: public InputStream getInputStream(TarEntry entry)
110: throws TarException, IOException {
111: if (entryStream == null || !entryStream.skipToEntry(entry)) {
112: InputStream in = new FileInputStream(file);
113: // First, check if it's a GZIPInputStream.
114: try {
115: in = new GZIPInputStream(in);
116: } catch (IOException e) {
117: in = new FileInputStream(file);
118: }
119: entryStream = new TarInputStream(in, entry) {
120: public void close() {
121: // Ignore close() since we want to reuse the stream.
122: }
123: };
124: }
125: if (entryStream == null) {
126: System.out.println("huh?"); //$NON-NLS-1$
127: }
128: return entryStream;
129: }
130:
131: /**
132: * Returns the path name of the file this archive represents.
133: *
134: * @return path
135: */
136: public String getName() {
137: return file.getPath();
138: }
139: }
|