/*******************************************************************************
* Copyright (c) 2009 Zhao and others.
* 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:
* Zhao - initial API and implementation
*******************************************************************************/
package org.eclipse.php.internal.core.tar;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.dltk.core.IArchive;
import org.eclipse.dltk.core.IArchiveEntry;
public class TarArchiveFile implements IArchive {
private TarFile tarFile;
private boolean mapInited = false;
private Map<String, TarArchiveEntry> map = new HashMap<String, TarArchiveEntry>();
public TarArchiveFile(String filename) throws TarException, IOException {
tarFile = new TarFile(filename);
}
public TarArchiveFile(File file) throws TarException, IOException {
tarFile = new TarFile(file);
}
public Enumeration<? extends IArchiveEntry> getArchiveEntries() {
final Enumeration e = tarFile.entries();
return new Enumeration<IArchiveEntry>() {
public boolean hasMoreElements() {
return e.hasMoreElements();
}
public IArchiveEntry nextElement() {
TarEntry tarEntry = (TarEntry) e.nextElement();
if (map.containsKey(tarEntry.getName())) {
return map.get(tarEntry.getName());
} else {
TarArchiveEntry tarArchiveEntry = new TarArchiveEntry(tarEntry);
map.put(tarArchiveEntry.getName(), tarArchiveEntry);
return tarArchiveEntry;
}
}
};
}
public IArchiveEntry getArchiveEntry(String name) {
// if (map.containsKey(name)) {
// return map.get(name);
// } else {
initMap();
return map.get(name);
// }
}
private void initMap() {
// TODO Auto-generated method stub
if (mapInited)
return;
Enumeration<? extends IArchiveEntry> e = getArchiveEntries();
while (e.hasMoreElements()) {
TarArchiveEntry tarArchiveEntry = (TarArchiveEntry) e.nextElement();
// e.nextElement();
map.put(tarArchiveEntry.getName(), tarArchiveEntry);
}
mapInited = true;
}
public InputStream getInputStream(IArchiveEntry entry) throws IOException {
if (entry instanceof TarArchiveEntry) {
TarArchiveEntry tarArchiveEntry = (TarArchiveEntry) entry;
try {
return tarFile.getInputStream(tarArchiveEntry.getTarEntry());
} catch (TarException e) {
e.printStackTrace();
}
}
return null;
}
public void close() throws IOException {
tarFile.close();
}
public String getName() {
return tarFile.getName();
}
public int fileSize() {
// TODO Auto-generated method stub
initMap();
return map.size();
}
}