001: /**
002: * JOnAS : Java(TM) OpenSource Application Server
003: * Copyright (C) 1999-2004 Bull S.A.
004: * Contact: jonas-team@objectweb.org
005: *
006: * This library is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU Lesser General Public
008: * License as published by the Free Software Foundation; either
009: * version 2.1 of the License, or any later version.
010: *
011: * This library is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * Lesser General Public License for more details.
015: *
016: * You should have received a copy of the GNU Lesser General Public
017: * License along with this library; if not, write to the Free Software
018: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
019: * USA
020: *
021: * --------------------------------------------------------------------------
022: * $Id: FileArchive.java 5590 2004-10-11 13:16:15Z benoitf $
023: * --------------------------------------------------------------------------
024: */package org.objectweb.jonas_lib.genbase.archive;
025:
026: import java.io.File;
027: import java.io.FileInputStream;
028: import java.io.IOException;
029: import java.io.InputStream;
030: import java.util.List;
031: import java.util.Vector;
032: import java.util.jar.Manifest;
033:
034: import org.objectweb.jonas_lib.genbase.GenBaseException;
035:
036: /**
037: * A <code>FileArchive</code> is a wrapper for directory structured as a jar.
038: *
039: * @author Guillaume Sauthier
040: */
041: public class FileArchive extends AbsArchive {
042:
043: /**
044: * Creates a new FileArchive object.
045: *
046: * @param archive directory structured as a jar
047: *
048: * @throws GenBaseException When manifest cannot be loaded
049: */
050: public FileArchive(File archive) throws GenBaseException {
051: super (archive);
052:
053: try {
054: File mf = new File(archive, "META-INF" + File.separator
055: + "MANIFEST.MF");
056:
057: if (mf.exists()) {
058: setManifest(new Manifest(new FileInputStream(mf)));
059: } else {
060: setManifest(new Manifest());
061: }
062: } catch (Exception e) {
063: String err = getI18n().getMessage(
064: "FileArchive.constr.manifest", getRootFile());
065: throw new GenBaseException(err, e);
066: }
067: }
068:
069: /**
070: * Returns an InputStream corresponding to the given filename.
071: *
072: * @param filename file name source of the InputStream
073: *
074: * @return the InputStream corresponding to the given filename.
075: *
076: * @throws IOException When InputStream corersponding to the given filename
077: * cannot be found.
078: */
079: public InputStream getInputStream(String filename)
080: throws IOException {
081: File file = (File) getFiles().get(filename);
082:
083: if (file == null) {
084: // filename not found in added files
085: // try root search
086: file = new File(getRootFile(), filename);
087:
088: if (!file.exists()) {
089: return null;
090: }
091: }
092:
093: // file exists (in added files or in original archive)
094: return new FileInputStream(file);
095: }
096:
097: /**
098: * Returns a List of all files contained in this archive. Original files in
099: * jar, added Files are all included as String in this Enumeration.
100: *
101: * @return a List of all files contained in this archive.
102: */
103: public List getContainedFiles() {
104: List list = new Vector(getFiles().keySet());
105:
106: // add files of the original archive
107: traverse("", getRootFile(), list);
108:
109: return list;
110: }
111:
112: /**
113: * Add all files contained in the given directory into a list.
114: *
115: * @param dirName current directory name
116: * @param base directory where file are listed
117: * @param map list of filename
118: */
119: private static void traverse(String dirName, File base, List map) {
120: File[] childs = base.listFiles();
121:
122: // directory exists ?
123: if (childs != null) {
124: for (int i = 0; i < childs.length; i++) {
125: if (childs[i].isFile()) {
126: // File
127: map.add(dirName + childs[i].getName());
128: } else {
129: // Directory
130: traverse(dirName + childs[i].getName()
131: + File.separator, childs[i], map);
132: }
133: }
134: }
135: }
136:
137: /**
138: * Returns true if archive is packed or false if archive is unpacked.
139: *
140: * @return true if archive is packed or false if archive is unpacked.
141: */
142: public boolean isPacked() {
143: return false;
144: }
145: }
|