/*
* File : FileZip.java
* Created : 25-sep-2001 10:53
* By : fbusquets
*
* JClic - Authoring and playing system for educational activities
*
* Copyright (C) 2000 - 2005 Francesc Busquets & Departament
* d'Educacio de la Generalitat de Catalunya
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details (see the LICENSE file).
*/
package edu.xtec.jclic.fileSystem;
import edu.xtec.util.ResourceBridge;
import edu.xtec.util.StreamIO;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
/**
*
* @author Francesc Busquets (fbusquets@xtec.cat)
* @version 13.09.10
*/
public class FileZip extends ZipFileSystem{
protected ZipFile zip;
/** Creates new ZipFileSystem */
public FileZip(String rootPath, String fName, ResourceBridge rb) throws Exception{
super(rootPath, fName, rb);
open();
}
@Override
protected void open() throws Exception{
if(zip==null){
//zip=new ZipFile(sysFn(root+zipName));
zip=new ZipFile(sysFn(root+zipName));
Enumeration en=zip.entries();
ArrayList<FileZipEntry> v=new ArrayList<FileZipEntry>();
while(en.hasMoreElements())
v.add(new FileZipEntry((ZipEntry)en.nextElement()));
entries=v.toArray(new FileZipEntry[v.size()]);
}
}
protected class FileZipEntry extends ExtendedZipEntry{
FileZipEntry(ZipEntry entry){
super(entry);
}
public byte[] getBytes() throws IOException{
return StreamIO.readInputStream(getInputStream());
}
public InputStream getInputStream() throws IOException{
InputStream is=zip.getInputStream(this);
if(rb!=null)
is=rb.getProgressInputStream(is, (int)getSize(), getName());
return is;
}
}
@Override
public void close(){
if(zip!=null){
try{
zip.close();
}catch(Exception ex){
// eat exception
}
zip=null;
}
super.close();
}
@Override
protected void changeBase(String newRoot, String newFileName) throws Exception{
if(zip!=null)
throw new Exception("Unable to change base fileName: FileSystem is open!");
super.changeBase(newRoot, newFileName);
zipName = getCanonicalNameOf(newFileName);
entries=null;
loaded=false;
}
}