X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=source%2Fmircoders%2Flocalizer%2Fbasic%2FMirBasicWriterEngine.java;h=f746623e99f461d82b4b5c3725f68553ca5085eb;hb=ea4e15118c327db7f36a93e1d6e536431cf83d3c;hp=34cac2bbf0bad9c6fec45709dd6c35d46dbade01;hpb=8563841098b6ab3e6233f61519e58b41dcc30266;p=mir.git diff --git a/source/mircoders/localizer/basic/MirBasicWriterEngine.java b/source/mircoders/localizer/basic/MirBasicWriterEngine.java index 34cac2bb..f746623e 100755 --- a/source/mircoders/localizer/basic/MirBasicWriterEngine.java +++ b/source/mircoders/localizer/basic/MirBasicWriterEngine.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2001, 2002 The Mir-coders group + * Copyright (C) 2001, 2002 The Mir-coders group * * This file is part of Mir. * @@ -18,61 +18,119 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * In addition, as a special exception, The Mir-coders gives permission to link - * the code of this program with the com.oreilly.servlet library, any library - * licensed under the Apache Software License, The Sun (tm) Java Advanced - * Imaging library (JAI), The Sun JIMI library (or with modified versions of - * the above that use the same license as the above), and distribute linked - * combinations including the two. You must obey the GNU General Public - * License in all respects for all of the code used other than the above - * mentioned libraries. If you modify this file, you may extend this exception - * to your version of the file, but you are not obligated to do so. If you do - * not wish to do so, delete this exception statement from your version. + * the code of this program with any library licensed under the Apache Software License, + * The Sun (tm) Java Advanced Imaging library (JAI), The Sun JIMI library + * (or with modified versions of the above that use the same license as the above), + * and distribute linked combinations including the two. You must obey the + * GNU General Public License in all respects for all of the code used other than + * the above mentioned libraries. If you modify this file, you may extend this + * exception to your version of the file, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your version. */ - package mircoders.localizer.basic; -import java.util.*; -import java.io.*; -import mir.generator.*; -import mircoders.localizer.*; +import mir.config.MirPropertiesConfiguration; +import mir.generator.WriterEngine; +import mir.log.LoggerWrapper; +import mir.util.FileRoutines; +import mircoders.localizer.MirLocalizerFailure; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.io.Writer; public class MirBasicWriterEngine implements WriterEngine { private String defaultEncoding; + protected static LoggerWrapper logger = new LoggerWrapper("Localizer.WriterEngine"); + protected MirPropertiesConfiguration configuration = MirPropertiesConfiguration.instance(); + + /** + * Directory to store temp files into + */ + private File tempDirectory; + public MirBasicWriterEngine(String aDefaultEncoding) { defaultEncoding = aDefaultEncoding; + tempDirectory = configuration.getFile("TempDir"); } + /** + * {@inheritDoc} + */ public Object openWriter(String anIdentifier, String anEncoding) throws MirLocalizerFailure { String encoding; - File file; - File dir; - if (anEncoding!=null && !anEncoding.equals("")) + if (anEncoding != null && !anEncoding.equals("")) { encoding = anEncoding; - else + } + else { encoding = defaultEncoding; -// MirGlobal.getConfigProperty("Mir.DefaultEncoding"); + } - try { - file = new File( anIdentifier ); - dir = new File(file.getParent()); - if (dir!=null && !dir.exists()){ - dir.mkdirs(); - } + File destinationFile = new File(anIdentifier); + File destinationDirectory = destinationFile.getParentFile(); + + if (destinationDirectory != null && !destinationDirectory.exists()) { + destinationDirectory.mkdirs(); + } + + try { return new PrintWriter( - new OutputStreamWriter( - new FileOutputStream(file), encoding - ) + new TempWriter(destinationFile, encoding) ); } - catch (Throwable t) { - throw new MirLocalizerFailure("Failure while opening a PrintWriter: "+t.getMessage(),t); + catch (IOException t) { + throw new MirLocalizerFailure("Failure while opening a writer", t); } - }; + } public void closeWriter(Object aWriter) { ((PrintWriter) aWriter).close(); - }; + } + + private class TempWriter extends Writer { + TempWriter(File aDestination, String anEncoding) throws IOException { + destinationFile = aDestination; + slaveFile = File.createTempFile("Mir", ".generated", tempDirectory); + slaveFile.deleteOnExit(); + slaveWriter = new BufferedWriter( + new OutputStreamWriter( + new FileOutputStream(slaveFile), anEncoding + ), 8192); + } + + public void close() throws IOException { + slaveWriter.close(); + + try { + FileRoutines.move(slaveFile, destinationFile); + + slaveFile.delete(); + } + catch (Throwable e) { + System.out.println("error: " + e.toString()); + + throw new IOException(e.getMessage()); + } + } + + public void flush() throws IOException { + slaveWriter.flush(); + } + + public void write(char cbuf[], int off, int len) throws IOException { + slaveWriter.write(cbuf, off, len); + } + + private Writer slaveWriter; + private File slaveFile; + private File destinationFile; + } + } \ No newline at end of file