From a4811de1e0e9ab41ed7cdd4a8ca5d84ce874783d Mon Sep 17 00:00:00 2001 From: hns Date: Mon, 20 Oct 2008 14:51:32 +0000 Subject: [PATCH] Partial backport from Helma NG file module: Add optional arguments to open: append to append to existing file instead of opening it for reading, and charset to define the encoding for reading/writing the file. Also fixes a bug where close() does not properly reset all internal variables. Fixes bug 636 --- helma/File.js | 53 ++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 40 insertions(+), 13 deletions(-) diff --git a/helma/File.js b/helma/File.js index 602170d5..c5ad66f6 100644 --- a/helma/File.js +++ b/helma/File.js @@ -41,13 +41,14 @@ if (!global.helma) { helma.File = function(path) { var BufferedReader = java.io.BufferedReader; var File = java.io.File; - var Reader = java.io.Reader; var Writer = java.io.Writer; var FileReader = java.io.FileReader; - var FileWriter = java.io.FileWriter; var PrintWriter = java.io.PrintWriter; + var FileOutputStream = java.io.FileOutputStream; + var OutputStreamWriter = java.io.OutputStreamWriter; + var FileInputStream = java.io.FileInputStream; + var InputStreamReader = java.io.InputStreamReader; var EOFException = java.io.EOFException; - var IOException = java.io.IOException; var IllegalStateException = java.lang.IllegalStateException; var IllegalArgumentException = java.lang.IllegalArgumentException @@ -107,12 +108,19 @@ helma.File = function(path) { }; /** - * Opens the file represented by this File object. - * - * @returns Boolean + * Opens the file represented by this File object. If the file exists, + * it is used for reading, otherwise it is opened for writing. + * If the encoding argument is specified, it is used to read or write + * the file. Otherwise, the platform's default encoding is used. + * + * @param {Object} options an optional argument holder object. + * The following options are supported: + * + * @returns Boolean true if the operation succeeded * @type Boolean */ - this.open = function() { + this.open = function(options) { if (self.isOpened()) { setError(new IllegalStateException("File already open")); return false; @@ -121,12 +129,29 @@ helma.File = function(path) { // cannot fail except if the FileReader/FileWriter fails. // Otherwise we have an open file until the reader/writer // get garbage collected. - try{ - if (file.exists()) { - readerWriter = new BufferedReader(new FileReader(file)); - } else { - readerWriter = new PrintWriter(new FileWriter(file)); - } + var charset = options && options.charset; + var append = options && options.append; + try { + if (file.exists() && !append) { + if (charset) { + readerWriter = new BufferedReader( + new InputStreamReader(new FileInputStream(file), charset)); + } else { + readerWriter = new BufferedReader(new FileReader(file)); + } + } else { + if (append && charset) { + readerWriter = new PrintWriter( + new OutputStreamWriter(new FileOutputStream(file, true), charset)); + } else if (append) { + readerWriter = new PrintWriter( + new OutputStreamWriter(new FileOutputStream(file, true))); + } else if (charset) { + readerWriter = new PrintWriter(file, charset); + } else { + readerWriter = new PrintWriter(file); + } + } return true; } catch (e) { setError(e); @@ -331,6 +356,8 @@ helma.File = function(path) { if (!self.isOpened()) return false; try { + atEOF = false; + lastLine = null; readerWriter.close(); readerWriter = null; return true;