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.io;
020    import java.io.BufferedInputStream;
021    import java.io.BufferedOutputStream;
022    import java.io.BufferedReader;
023    import java.io.ByteArrayOutputStream;
024    import java.io.File;
025    import java.io.FileInputStream;
026    import java.io.FileOutputStream;
027    import java.io.FileReader;
028    import java.io.IOException;
029    import java.io.InputStream;
030    import java.io.InputStreamReader;
031    import java.io.OutputStream;
032    import java.io.Reader;
033    import java.io.UnsupportedEncodingException;
034    import java.net.HttpURLConnection;
035    import java.net.URL;
036    import java.net.URLConnection;
037    import java.util.ArrayList;
038    import java.util.List;
039    import java.util.Properties;
040    import java.util.regex.Pattern;
041    
042    //import javax.net.ssl.HostnameVerifier;
043    //import javax.net.ssl.HttpsURLConnection;
044    //import javax.net.ssl.SSLSession;
045    
046    import com.ochafik.util.string.RegexUtils;
047    public class ReadText { 
048            public static final String readText(Reader in) throws IOException {
049                    int len;
050                    char ch[]=new char[1024];
051                    StringBuffer b=new StringBuffer();
052                    while ((len=in.read(ch))>0) b.append(ch,0,len);
053                    return b.toString();
054            }
055            public static final String readText(File f) {
056                    if (f == null)
057                            return null;
058    
059                    try {
060                            BufferedReader in=new BufferedReader(new FileReader(f));
061                            String l;
062                            java.lang.StringBuffer buff=new java.lang.StringBuffer((int)f.length());
063                            boolean first = true;
064                            while ((l=in.readLine())!=null) {
065                                    if (first)
066                                            first = false;
067                                    else
068                                            buff.append('\n');
069                                    buff.append(l);
070                            }
071                            return buff.toString();
072                    } catch (Exception except) { 
073                            except.printStackTrace();
074                            return null;
075                    }
076            }
077            public static final void writeProperties(Properties properties, File file) throws IOException {
078                    File parentFile = file.getParentFile();
079                    if (!parentFile.exists()) parentFile.mkdirs();
080                    OutputStream out = new BufferedOutputStream(new FileOutputStream(file));
081                    properties.store(out, file.getName());
082                    out.close();
083            }
084            public static final Properties readProperties(File file, boolean failIfNotExists) throws IOException {
085                    Properties properties = new Properties();
086                    if (!file.exists()) {
087                            if (failIfNotExists) {
088                                    return null;
089                            }
090                    } else {
091                            InputStream in = new BufferedInputStream(new FileInputStream(file));
092                            properties.load(in);
093                            in.close();
094                    }
095                    return properties;
096            }
097            private static final Pattern charsetPattern = Pattern.compile(";\\s*charset\\s*=\\s*([\\w-_]+)", Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
098            public static final String readText(URL u) throws IOException {
099                    if (u == null) return null;
100    
101                    String encoding = null;
102                    URLConnection con = u.openConnection();
103    //              if (con instanceof HttpsURLConnection) {
104    //                      ((HttpsURLConnection)con).setHostnameVerifier(new HostnameVerifier() {
105    //                              public boolean verify(String hostname, SSLSession session) {
106    //                                      return true;
107    //                              }
108    //                      });
109    //              }
110                    if (con instanceof HttpURLConnection) {
111                            String contentType = con.getContentType();
112                            encoding = RegexUtils.findFirst(contentType, charsetPattern, 1);
113                    }
114                    InputStream in = con.getInputStream();
115                    String text = readText(in, encoding);
116                    in.close();
117                    return text;
118            }
119            static Pattern[] embeddedCharsetPatterns = new Pattern[] {
120                    Pattern.compile("CONTENT\\s*=\\s*\"text/\\w+;\\s*charset\\s*=\\s*([^\";\\s]+)\\s*\"", Pattern.CASE_INSENSITIVE | Pattern.DOTALL),
121                    Pattern.compile("<?\\s*xml\\s+[^>]*encoding\\s*=\\s*\"([^\"]+)\"", Pattern.CASE_INSENSITIVE | Pattern.DOTALL),
122            };
123            private static String readText(InputStream in, String encoding) throws IOException {
124                    if (in == null)
125                            return null;
126    
127                    if (encoding == null) {
128                            ByteArrayOutputStream bout = new ByteArrayOutputStream();
129                            IOUtils.readWrite(in, bout);
130                            byte[] bytes = bout.toByteArray();
131                            String ascii = new String(bytes, "ascii");
132                            
133                            for (Pattern charsetPat : embeddedCharsetPatterns) {
134                                    encoding = RegexUtils.findFirst(ascii, charsetPat, 1);
135                                    if (encoding != null)
136                                            break;
137                            }
138                            if (encoding != null) {
139                                    try {
140                                            return new String(bytes, encoding);
141                                    } catch (UnsupportedEncodingException ex) {
142                                            ex.printStackTrace();
143                                    }
144                            }
145                            return new String(bytes);
146                    } else {
147                    
148                            BufferedReader rin = new BufferedReader(encoding == null ? new InputStreamReader(in) : new InputStreamReader(in, encoding));
149                            String l;
150                            StringBuffer buff=new StringBuffer();
151                            boolean first = true;
152                            while ((l = rin.readLine()) != null) {
153                                    if (first)
154                                            first = false;
155                                    else
156                                            buff.append('\n');
157                                    buff.append(l);
158                            }
159                            return buff.toString();
160                    }
161            }
162            public static final String readText(InputStream in) throws IOException {
163                    return readText(in, null);
164            }
165            public static final List<String> readLines(String s) throws IOException {
166                    return readLines(new FileReader(s));
167            }
168            public static final List<String> readLines(URL u) throws IOException {
169                    InputStream in = u.openStream();
170                    List<String> r = readLines(in);
171                    in.close();
172                    return r;
173            }
174            public static final List<String> readLines(InputStream in) throws IOException {
175                    if (in == null)
176                            return null;
177                    List<String> r = readLines(new InputStreamReader(in));
178                    in.close();
179                    return r;
180            }
181            public static final List<String> readLines(Reader r) throws IOException {
182                    List<String> v=new ArrayList<String>();
183                    BufferedReader in=new BufferedReader(r);
184                    String l;
185                    while ((l=in.readLine())!=null) //if (!(l=l.trim()).equals("")) 
186                            v.add(l);
187                    return v;
188            }
189            public static final String[] readLinesArray(String s) throws IOException {
190                    List<String> v=readLines(s);
191                    String ret[]=new String[v.size()];
192                    int i=0;
193                    for (String line : v) {
194                            ret[i++]=line;
195                    }
196                    return ret;
197            }
198    }