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: DirStorer.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:
031: import org.objectweb.jonas_lib.genbase.GenBaseException;
032: import org.objectweb.jonas_lib.genbase.archive.J2EEArchive;
033:
034: /**
035: * Store a J2EEArchive in an unpacked form.
036: *
037: * @author Guillaume Sauthier
038: */
039: public class DirStorer extends ArchiveStorer {
040:
041: /**
042: * directory name containing unpacked archive.
043: */
044: private File base;
045:
046: /**
047: * Creates a new DirStorer object.
048: *
049: * @param archive archive to be stored
050: * @param dir output directory
051: *
052: * @throws GenBaseException if cannot create output directory
053: */
054: public DirStorer(J2EEArchive archive, File dir)
055: throws GenBaseException {
056: super (archive);
057:
058: setOut(dir.getAbsolutePath());
059:
060: // assure base exists
061: if (!dir.exists()) {
062: if (!dir.mkdirs()) {
063: String err = getI18n().getMessage(
064: "DirStorer.constr.create", dir);
065: throw new GenBaseException(err);
066: }
067: }
068:
069: base = dir;
070: }
071:
072: /**
073: * Convert a filename to a local filesystem filename.
074: *
075: * @param name name to be converted
076: *
077: * @return converted filename
078: */
079: protected String convertName(String name) {
080: return name.replace('/', File.separatorChar);
081: }
082:
083: /**
084: * add a given file in the filesystem.
085: *
086: * @param name filename
087: *
088: * @throws IOException When fill fails.
089: */
090: protected void addFile(String name) throws IOException {
091: OutputStream fos = getOutputStream(name);
092: InputStream is = getArchive().getInputStream(name);
093: fill(is, fos);
094: is.close();
095: }
096:
097: /**
098: * returns the OuputStream corresponding to the given filename.
099: *
100: * @param name filename to create
101: *
102: * @return An OutputStream
103: *
104: * @throws IOException When file creation fails.
105: */
106: protected OutputStream getOutputStream(String name)
107: throws IOException {
108: File out = new File(base, convertName(name));
109: File parent = out.getParentFile();
110:
111: if (!parent.exists()) {
112: if (!parent.mkdirs()) {
113: String err = getI18n().getMessage(
114: "DirStorer.getOutputStream.create", out);
115: throw new IOException(err);
116: }
117: }
118:
119: OutputStream os = new FileOutputStream(out);
120:
121: return os;
122: }
123: }
|