001    /*
002     * $Id: WritableFile.java,v 1.4 2005/05/27 12:23:44 russel Exp $
003     *
004     * Copyright 2003 (C) John Wilson. All Rights Reserved.
005     *
006     * Redistribution and use of this software and associated documentation
007     * ("Software"), with or without modification, are permitted provided that the
008     * following conditions are met:
009     *  1. Redistributions of source code must retain copyright statements and
010     * notices. Redistributions must also contain a copy of this document.
011     *  2. Redistributions in binary form must reproduce the above copyright
012     * notice, this list of conditions and the following disclaimer in the
013     * documentation and/or other materials provided with the distribution.
014     *  3. The name "groovy" must not be used to endorse or promote products
015     * derived from this Software without prior written permission of The Codehaus.
016     * For written permission, please contact info@codehaus.org.
017     *  4. Products derived from this Software may not be called "groovy" nor may
018     * "groovy" appear in their names without prior written permission of The
019     * Codehaus. "groovy" is a registered trademark of The Codehaus.
020     *  5. Due credit should be given to The Codehaus - http://groovy.codehaus.org/
021     *
022     * THIS SOFTWARE IS PROVIDED BY THE CODEHAUS AND CONTRIBUTORS ``AS IS'' AND ANY
023     * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
024     * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
025     * DISCLAIMED. IN NO EVENT SHALL THE CODEHAUS OR ITS CONTRIBUTORS BE LIABLE FOR
026     * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
027     * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
028     * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
029     * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
030     * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
031     * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
032     * DAMAGE.
033     *
034     */
035    
036    package org.codehaus.groovy.runtime;
037    
038    import groovy.lang.Writable;
039    
040    import java.io.File;
041    import java.io.Writer;
042    import java.io.IOException;
043    import java.io.Reader;
044    import java.io.FilenameFilter;
045    import java.io.FileFilter;
046    import java.net.URI;
047    import java.net.URL;
048    import java.net.MalformedURLException;
049    
050    /**
051     * A Writable File.
052     *
053     * @author John Wilson
054     *
055     */
056    public class WritableFile extends File implements Writable {
057        private final File delegate;
058        private final String encoding;
059    
060        public WritableFile(File delegate) {
061            this(delegate, null);
062        }
063    
064        public WritableFile(File delegate, String encoding) {
065            super("");
066            this.delegate = delegate;
067            this.encoding = encoding;
068        }
069    
070        public Writer writeTo(Writer out) throws IOException {
071            final Reader reader =
072                (this.encoding == null)
073                    ? DefaultGroovyMethods.newReader(this.delegate)
074                    : DefaultGroovyMethods.newReader(this.delegate, this.encoding);
075    
076            try {
077                int c = reader.read();
078    
079                while (c != -1) {
080                    out.write(c);
081                    c = reader.read();
082                }
083            }
084            finally {
085                reader.close();
086            }
087            return out;
088        }
089    
090        public boolean canRead() {
091            return delegate.canRead();
092        }
093    
094        public boolean canWrite() {
095            return delegate.canWrite();
096        }
097    
098        public int compareTo(File arg0) {
099            return delegate.compareTo(arg0);
100        }
101    
102        public int compareTo(Object arg0) {
103            return delegate.compareTo(arg0);
104        }
105    
106        public boolean createNewFile() throws IOException {
107            return delegate.createNewFile();
108        }
109    
110        public boolean delete() {
111            return delegate.delete();
112        }
113    
114        public void deleteOnExit() {
115            delegate.deleteOnExit();
116        }
117    
118        public boolean equals(Object arg0) {
119            return delegate.equals(arg0);
120        }
121    
122        public boolean exists() {
123            return delegate.exists();
124        }
125    
126        public File getAbsoluteFile() {
127            return delegate.getAbsoluteFile();
128        }
129    
130        public String getAbsolutePath() {
131            return delegate.getAbsolutePath();
132        }
133    
134        public File getCanonicalFile() throws IOException {
135            return delegate.getCanonicalFile();
136        }
137    
138        public String getCanonicalPath() throws IOException {
139            return delegate.getCanonicalPath();
140        }
141    
142        public String getName() {
143            return delegate.getName();
144        }
145    
146        public String getParent() {
147            return delegate.getParent();
148        }
149    
150        public File getParentFile() {
151            return delegate.getParentFile();
152        }
153    
154        public String getPath() {
155            return delegate.getPath();
156        }
157    
158        public int hashCode() {
159            return delegate.hashCode();
160        }
161    
162        public boolean isAbsolute() {
163            return delegate.isAbsolute();
164        }
165    
166        public boolean isDirectory() {
167            return delegate.isDirectory();
168        }
169    
170        public boolean isFile() {
171            return delegate.isFile();
172        }
173    
174        /* (non-Javadoc)
175         * @see java.io.File#isHidden()
176         */
177        public boolean isHidden() {
178            return delegate.isHidden();
179        }
180    
181        /* (non-Javadoc)
182         * @see java.io.File#lastModified()
183         */
184        public long lastModified() {
185            return delegate.lastModified();
186        }
187    
188        /* (non-Javadoc)
189         * @see java.io.File#length()
190         */
191        public long length() {
192            return delegate.length();
193        }
194    
195        /* (non-Javadoc)
196         * @see java.io.File#list()
197         */
198        public String[] list() {
199            return delegate.list();
200        }
201    
202        /* (non-Javadoc)
203         * @see java.io.File#list(java.io.FilenameFilter)
204         */
205        public String[] list(FilenameFilter arg0) {
206            return delegate.list(arg0);
207        }
208    
209        /* (non-Javadoc)
210         * @see java.io.File#listFiles()
211         */
212        public File[] listFiles() {
213            return delegate.listFiles();
214        }
215    
216        /* (non-Javadoc)
217         * @see java.io.File#listFiles(java.io.FileFilter)
218         */
219        public File[] listFiles(FileFilter arg0) {
220            return delegate.listFiles(arg0);
221        }
222    
223        /* (non-Javadoc)
224         * @see java.io.File#listFiles(java.io.FilenameFilter)
225         */
226        public File[] listFiles(FilenameFilter arg0) {
227            return delegate.listFiles(arg0);
228        }
229    
230        /* (non-Javadoc)
231         * @see java.io.File#mkdir()
232         */
233        public boolean mkdir() {
234            return delegate.mkdir();
235        }
236    
237        /* (non-Javadoc)
238         * @see java.io.File#mkdirs()
239         */
240        public boolean mkdirs() {
241            return delegate.mkdirs();
242        }
243    
244        /* (non-Javadoc)
245         * @see java.io.File#renameTo(java.io.File)
246         */
247        public boolean renameTo(File arg0) {
248            return delegate.renameTo(arg0);
249        }
250    
251        /* (non-Javadoc)
252         * @see java.io.File#setLastModified(long)
253         */
254        public boolean setLastModified(long arg0) {
255            return delegate.setLastModified(arg0);
256        }
257    
258        /* (non-Javadoc)
259         * @see java.io.File#setReadOnly()
260         */
261        public boolean setReadOnly() {
262            return delegate.setReadOnly();
263        }
264    
265        /* (non-Javadoc)
266         * @see java.io.File#toString()
267         */
268        public String toString() {
269            return delegate.toString();
270        }
271    
272        /* (non-Javadoc)
273         * @see java.io.File#toURI()
274         */
275        public URI toURI() {
276            return delegate.toURI();
277        }
278    
279        /* (non-Javadoc)
280         * @see java.io.File#toURL()
281         */
282        public URL toURL() throws MalformedURLException {
283            return delegate.toURL();
284        }
285    
286    }