001: /*
002: * JOnAS : Java(TM) OpenSource Application Server
003: *
004: * This library is free software; you can redistribute it and/or modify it under
005: * the terms of the GNU Lesser General Public License as published by the Free
006: * Software Foundation; either version 2.1 of the License, or any later version.
007: *
008: * This library is distributed in the hope that it will be useful, but WITHOUT
009: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
010: * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
011: * details.
012: *
013: * You should have received a copy of the GNU Lesser General Public License
014: * along with this library; if not, write to the Free Software Foundation, Inc.,
015: * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
016: *
017: * Initial Developer : Guillaume Sauthier
018: * --------------------------------------------------------------------------
019: * $Id: JarStorer.java 5590 2004-10-11 13:16:15Z benoitf $
020: * --------------------------------------------------------------------------
021: */
022:
023: package org.objectweb.jonas_lib.genbase.utils;
024:
025: import java.io.File;
026: import java.io.FileOutputStream;
027: import java.io.IOException;
028: import java.io.InputStream;
029: import java.io.OutputStream;
030: import java.util.jar.JarOutputStream;
031: import java.util.zip.ZipEntry;
032:
033: import org.objectweb.jonas_lib.genbase.GenBaseException;
034: import org.objectweb.jonas_lib.genbase.archive.J2EEArchive;
035:
036: /**
037: * Store a J2EEArchive in a Jar file.
038: *
039: * @author Guillaume Sauthier
040: */
041: public class JarStorer extends ArchiveStorer {
042:
043: /**
044: * Jar file filled as OutputStream
045: */
046: private JarOutputStream jos;
047:
048: /**
049: * Creates a new JarStorer object.
050: *
051: * @param archive archive to be stored
052: * @param jar outout jar file
053: *
054: * @throws GenBaseException When cannot create output jar
055: */
056: public JarStorer(J2EEArchive archive, File jar)
057: throws GenBaseException {
058: super (archive);
059:
060: setOut(jar.getAbsolutePath());
061:
062: try {
063: if (!jar.getParentFile().exists()) {
064: if (!jar.getParentFile().mkdirs()) {
065: String err = getI18n().getMessage(
066: "JarStorer.constr.create",
067: jar.getParentFile());
068: throw new GenBaseException(err);
069: }
070: }
071:
072: jos = new JarOutputStream(new FileOutputStream(jar),
073: archive.getManifest());
074: } catch (IOException ioe) {
075: String err = getI18n().getMessage("JarStorer.constr.ioe",
076: jar);
077: throw new GenBaseException(err, ioe);
078: }
079: }
080:
081: /**
082: * Convert a name from any format in Jar filename format
083: *
084: * @param name filename to be converted
085: *
086: * @return converted filename
087: */
088: protected String convertName(String name) {
089: return name.replace('\\', '/');
090: }
091:
092: /**
093: * Add a file in Jar
094: *
095: * @param name file name to be added
096: *
097: * @throws IOException when filling fails.
098: */
099: protected void addFile(String name) throws IOException {
100: ZipEntry ze = new ZipEntry(convertName(name));
101: jos.putNextEntry(ze);
102:
103: InputStream is = getArchive().getInputStream(name);
104: fill(is, jos);
105: is.close();
106: }
107:
108: /**
109: * Store the archive and close the streams.
110: *
111: * @throws GenBaseException When Output Jar cannot be closed
112: */
113: public void store() throws GenBaseException {
114: super .store();
115:
116: try {
117: jos.close();
118: } catch (IOException ioe) {
119: String err = getI18n().getMessage("JarStorer.store.close");
120: throw new GenBaseException(err, ioe);
121: }
122: }
123:
124: /**
125: * returns the OuputStream corresponding to the given filename.
126: *
127: * @param name filename to create
128: *
129: * @return An OutputStream
130: *
131: * @throws IOException When file creation fails.
132: */
133: protected OutputStream getOutputStream(String name)
134: throws IOException {
135: ZipEntry ze = new ZipEntry(convertName(name));
136: jos.putNextEntry(ze);
137:
138: return jos;
139: }
140: }
|