001    /*
002            Copyright (c) 2009 Olivier Chafik, All Rights Reserved
003            
004            This file is part of JNAerator (http://jnaerator.googlecode.com/).
005            
006            JNAerator is free software: you can redistribute it and/or modify
007            it under the terms of the GNU General Public License as published by
008            the Free Software Foundation, either version 3 of the License, or
009            (at your option) any later version.
010            
011            JNAerator is distributed in the hope that it will be useful,
012            but WITHOUT ANY WARRANTY; without even the implied warranty of
013            MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
014            GNU General Public License for more details.
015            
016            You should have received a copy of the GNU General Public License
017            along with JNAerator.  If not, see <http://www.gnu.org/licenses/>.
018    */
019    package com.ochafik.lang.compiler;
020    
021    import java.io.ByteArrayInputStream;
022    import java.io.ByteArrayOutputStream;
023    import java.io.IOException;
024    import java.io.InputStream;
025    import java.io.InputStreamReader;
026    import java.io.OutputStream;
027    import java.io.OutputStreamWriter;
028    import java.io.Reader;
029    import java.io.Writer;
030    import java.net.URI;
031    import java.net.URISyntaxException;
032    
033    import javax.tools.FileObject;
034    
035    public class MemoryFileObject implements FileObject {
036            String path;
037            byte[] content;
038    
039            public MemoryFileObject(String path, String content) {
040                    this.path = path;
041                    this.content = content == null ? null : content.getBytes();
042            }
043            public MemoryFileObject(String path, byte[] content) {
044                    this.path = path;
045                    this.content = content;
046            }
047            public String getPath() {
048                    return path;
049            }
050            public byte[] getContent() {
051                    return content;
052            }
053            public boolean delete() {
054                    content = null;
055                    return true;
056            }
057            public String getCharContent(boolean ignoreEncodingErrors) {
058                    return new String(content);
059            }
060            public long getLastModified() {
061                    return System.currentTimeMillis();
062            }
063            public String getName() {
064                    return getPath();
065            }
066            public InputStream      openInputStream() {
067                    if (content == null)
068                            return null;
069    
070                    return new ByteArrayInputStream(content);
071            }
072            public OutputStream     openOutputStream() {
073                    return new ByteArrayOutputStream() {
074                            public void close() throws IOException {
075                                    super.close();
076                                    content = toByteArray();
077                            }
078                    };
079            }
080            public Reader openReader(boolean ignoreEncodingErrors) {
081                    InputStream in = openInputStream();
082                    return in == null ? null : new InputStreamReader(in);
083            }
084            public Writer openWriter() {
085                    OutputStream out = openOutputStream();
086                    return out == null ? null : new OutputStreamWriter(out);
087            }
088            public URI      toUri() {
089                    try {
090                            return new URI(//"file:" + 
091                                            getPath());
092                    } catch (URISyntaxException ex) {
093                            ex.printStackTrace();
094                            return null;
095                    }
096            }
097            @Override
098            public String toString() {
099                    return getPath() + ":\n" + getCharContent(true);
100            }
101    }