/* * File : ZipFileSystem.java * Created : 24-sep-2001 19:48 * 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 java.awt.Image; import java.awt.Toolkit; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.zip.*; /** * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.09.10 */ public abstract class ZipFileSystem extends FileSystem { String zipName; protected boolean loaded; ExtendedZipEntry[] entries; public ZipFileSystem(ResourceBridge rb) { super("", rb); entries=null; zipName=null; loaded=false; } public ZipFileSystem(String rootPath, String zipFileName, ResourceBridge rb) { super(rootPath, rb); zipName = getCanonicalNameOf(zipFileName); entries=null; loaded=false; } public static ZipFileSystem createZipFileSystem(String rootPath, String zipFileName, ResourceBridge rb) throws Exception { if (isStrUrl(rootPath)) return new UrlZip(rootPath, zipFileName, rb); else return new FileZip(rootPath, zipFileName, rb); } @Override public String getFullRoot(){ return root+zipName; } public String getZipName(){ return zipName; } public abstract class ExtendedZipEntry extends ZipEntry{ public boolean ignore; ExtendedZipEntry(ZipEntry entry){ super(entry); } public abstract byte[] getBytes() throws IOException; public abstract InputStream getInputStream() throws IOException; @Override public String getName(){ return stdFn(super.getName()); } } public ExtendedZipEntry getEntry(String fName){ if(fName==null || fName.length()==0 || entries==null) return null; String name=getCanonicalNameOf(fName); for(ExtendedZipEntry eze : entries) if(!eze.ignore && eze.getName().equals(name)) return eze; return null; } @Override public byte[] getBytes(String fileName) throws IOException { //System.out.println("requesting "+fileName); ExtendedZipEntry entry; if((entry=getEntry(fileName))==null) return super.getBytes(fileName); else return entry.getBytes(); } @Override public boolean fileExists(String fName){ return super.fileExists(fName); } @Override public long getFileLength(String fileName) throws IOException{ ExtendedZipEntry entry; if((entry=getEntry(fileName))==null) return super.getFileLength(fileName); else return entry.getSize(); } @Override public Image getImageFile(String fName) throws Exception { ExtendedZipEntry entry; if((entry=getEntry(fName))==null) return super.getImageFile(fName); return Toolkit.getDefaultToolkit().createImage(entry.getBytes()); } @Override public InputStream getInputStream(String fName) throws IOException{ ExtendedZipEntry entry; if((entry=getEntry(fName))==null) return super.getInputStream(fName); return entry.getInputStream(); } @Override public Object getMediaDataSource(String fName) throws Exception{ ExtendedZipEntry entry; if((entry=getEntry(fName))==null) return super.getMediaDataSource(fName); return new edu.xtec.util.ExtendedByteArrayInputStream(entry.getBytes(), fName); } public String[] getEntries(String ext) throws Exception{ String[] result=null; if(entries!=null && entries.length>0){ ArrayList<String> v=new ArrayList<String>(); for(ExtendedZipEntry eze : entries){ String entryName=eze.getName(); if(ext==null || entryName.endsWith(ext)) v.add(entryName); } if(!v.isEmpty()) result=v.toArray(new String[v.size()]); } return result; } @Override public void close(){ entries=null; super.close(); } }