001 /* 002 * CRIMSON 003 * Copyright (c) 2006, Stephen Fisher, Susan Davidson, and Junhyong Kim, 004 * University of Pennsylvania. 005 * 006 * This program is free software; you can redistribute it and/or 007 * modify it under the terms of the GNU General Public License as 008 * published by the Free Software Foundation; either version 2 of the 009 * License, or (at your option) any later version. 010 * 011 * This program is distributed in the hope that it will be useful, but 012 * WITHOUT ANY WARRANTY; without even the implied warranty of 013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 014 * General Public License for more details. 015 * 016 * You should have received a copy of the GNU General Public License 017 * along with this program; if not, write to the Free Software 018 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 019 * 02110-1301 USA. 020 * 021 * @(#)FileIO.java 022 */ 023 024 package edu.upenn.crimson.io; 025 026 import edu.upenn.crimson.*; 027 import java.util.Iterator; 028 import java.util.TreeSet; 029 import java.util.Collection; 030 import java.io.*; 031 032 /** 033 * Import and export utilities. 034 * 035 * @author Stephen Fisher 036 * @version $Id: FileIO.java,v 1.22 2009/07/16 16:19:52 fisher Exp $ 037 */ 038 039 public class FileIO { 040 041 //-------------------------------------------------------------------------- 042 // Miscellaneous Methods 043 044 /* 045 * Load python file containing commands without function 046 * definitions. 047 */ 048 public static void loadPython(String filename) { 049 if (CrimsonUtils.isEmpty(filename)) return; 050 051 File file = new File(filename); 052 // if the file does not exist then exit 053 if (! file.exists()) { 054 CrimsonUtils.printError("File '" + filename + "' does not exists."); 055 return; 056 } 057 058 try { 059 FileReader fReader = new FileReader(file); 060 BufferedReader bReader = new BufferedReader(fReader); 061 062 String line; 063 while ((line = bReader.readLine()) != null) CrimsonMain.console.exec(line); 064 065 bReader.close(); 066 fReader.close(); 067 } catch (FileNotFoundException e) { // problem with FileOutputStream 068 CrimsonUtils.printError("File '" + filename + "' can not be opened."); 069 CrimsonUtils.printError(e.getMessage()); 070 return; 071 } catch (IOException e) { // problem with ObjectOutputStream. 072 // XXX do we need to close bReader()? 073 CrimsonUtils.printError("Error reading input file '" + filename + "'."); 074 CrimsonUtils.printError(e.getMessage()); 075 return; 076 } 077 } 078 079 /** 080 * Write string to file. If append is true then the string will be 081 * appended to the end of the file. Nothing will be done if an 082 * empty string is provided. 083 */ 084 public static void writeString(String filename, boolean append, String out) { 085 // can't use isEmpty() because that will ignore a string "\n" 086 if ((out == null) || (out.length() == 0)) return; 087 088 if (! CrimsonUtils.isEmpty(filename)) { 089 File file = new File(filename); 090 try { 091 FileWriter fWriter = new FileWriter(file, append); 092 BufferedWriter bWriter = new BufferedWriter(fWriter); 093 094 bWriter.write(out); 095 096 bWriter.flush(); 097 bWriter.close(); 098 fWriter.close(); 099 } catch (FileNotFoundException e) { // problem with FileOutputStream 100 CrimsonUtils.printError("File '" + filename + "' can not be opened."); 101 CrimsonUtils.printError(e.getMessage()); 102 return; 103 } catch (IOException e) { // problem with ObjectOutputStream. 104 // XXX do we need to close bWriter()? 105 CrimsonUtils.printError("Error writting output file '" + filename + "'."); 106 CrimsonUtils.printError(e.getMessage()); 107 return; 108 } 109 } 110 } 111 112 /** 113 * Export the Query to a file based on it's ID. This will 114 * overwrite any existing file. 115 */ 116 public static String exportQuery(String id) { 117 return exportQuery(id, id, true); 118 } 119 120 /** 121 * Export the Query to a python file. This will append ".py" to 122 * the filename, if necessary. The python file created can be 123 * imported into jython to re-create the query object. If no 124 * filename is given, then the output will be returned as a 125 * string. 126 */ 127 public static String exportQuery(String id, String filename, boolean overwrite) { 128 if (CrimsonUtils.isEmpty(id)) return ""; 129 130 Query query = ObjectHandles.getQuery(id); 131 if (query == null) { 132 CrimsonUtils.printError("Unable to export unknown query: " + id); 133 return ""; 134 } 135 136 String out = ""; 137 out += "_query = Query('" + query.getTreeID() + "', '" + query.getID() + "')\n"; 138 out += "_query.setNotes('" + query.getNotes() + "')\n"; 139 out += "_query.setLeafSelection(" + query.getLeafSelection() + ")\n"; 140 out += "_query.setNumLeaves(" + query.getNumLeaves() + ")\n"; 141 out += "_query.setTempDepthThresh(" + query.getTempDepthThresh() + ")\n"; 142 out += "_query.setLevelThresh(" + query.getLevelThresh() + ")\n"; 143 out += "_query.setSequenceSelection(" + query.getSequenceSelection() + ")\n"; 144 out += "_query.setNumPositions(" + query.getNumPositions() + ")\n"; 145 out += "_query.setSeed(" + query.getSeed() + ")\n"; 146 for (Iterator i = query.getLeaves().iterator(); i.hasNext();) 147 out += "_query.addLeaf('" + (String) i.next() + "')\n"; 148 for (Iterator i = query.getPartitions().iterator(); i.hasNext();) 149 out += "_query.addPartition('" + (String) i.next() + "')\n"; 150 for (Iterator i = query.getPositions().iterator(); i.hasNext();) 151 out += "_query.addPosition('" + (String) i.next() + "')\n"; 152 153 if (CrimsonUtils.isEmpty(filename)) { 154 return out; 155 } else { 156 if (! filename.endsWith(".py")) filename += ".py"; 157 158 File file = new File(filename); 159 // if the file already exists and not supposed to 160 // overwrite it, then return on error. 161 if (file.exists() && (! overwrite)) { 162 CrimsonUtils.printError("File '" + filename + "' already exists."); 163 return ""; 164 } 165 166 try { 167 FileWriter fWriter = new FileWriter(file); 168 BufferedWriter bWriter = new BufferedWriter(fWriter); 169 170 bWriter.write(out); 171 // bWriter.newLine(); 172 173 bWriter.flush(); 174 bWriter.close(); 175 fWriter.close(); 176 } catch (FileNotFoundException e) { // problem with FileOutputStream 177 CrimsonUtils.printError("File '" + filename + "' can not be opened."); 178 CrimsonUtils.printError(e.getMessage()); 179 return ""; 180 } catch (IOException e) { // problem with ObjectOutputStream. 181 // XXX do we need to close bWriter()? 182 CrimsonUtils.printError("Error writting output file '" + filename + "'."); 183 CrimsonUtils.printError(e.getMessage()); 184 return ""; 185 } 186 187 return ""; 188 } 189 } 190 191 /** 192 * This will print the list of species to the output file 193 * ('species.list'), one species ID per line. If 'onlyLeaves' is 194 * true then the output file will be 'leaf.list' and only leaves 195 * will be included. 196 */ 197 public static void printSpecies(Collection species, boolean onlyLeaves) { 198 if ((species == null) || (species.size() == 0)) return; 199 200 try { 201 FileWriter fWriter; 202 if (onlyLeaves) fWriter = new FileWriter(new File("leaf.list")); 203 else fWriter = new FileWriter(new File("species.list")); 204 BufferedWriter bWriter = new BufferedWriter(fWriter); 205 206 for (Iterator i = species.iterator(); i.hasNext();) { 207 Species curSpecies = (Species) i.next(); 208 if (onlyLeaves) { 209 if (curSpecies.isLeaf()) bWriter.write(curSpecies.getID() + "\n"); 210 } else { 211 bWriter.write(curSpecies.getID() + "\n"); 212 } 213 // bWriter.newLine(); 214 } 215 216 bWriter.flush(); 217 bWriter.close(); 218 fWriter.close(); 219 } catch (FileNotFoundException e) { // problem with FileOutputStream 220 if (onlyLeaves) CrimsonUtils.printError("File 'leaf.list' can not be opened."); 221 else CrimsonUtils.printError("File 'species.list' can not be opened."); 222 CrimsonUtils.printError(e.getMessage()); 223 return; 224 } catch (IOException e) { // problem with ObjectOutputStream. 225 // XXX do we need to close bWriter()? 226 if (onlyLeaves) CrimsonUtils.printError("Error writting output file 'leaf.list'."); 227 else CrimsonUtils.printError("Error writting output file 'species.list'."); 228 CrimsonUtils.printError(e.getMessage()); 229 return; 230 } 231 } 232 233 /** 234 * This will print the list of leaves to the output file 235 * ('leaf.list'), one leaf ID per line. 236 */ 237 /* 238 public static void printLeaves(TreeSet leaves) { 239 if ((leaves == null) || (leaves.size() == 0)) return; 240 241 try { 242 FileWriter fWriter = new FileWriter(new File("leaf.list")); 243 BufferedWriter bWriter = new BufferedWriter(fWriter); 244 245 for (Iterator i = leaves.iterator(); i.hasNext();) { 246 bWriter.write(((Species) i.next()).getID() + "\n"); 247 // bWriter.newLine(); 248 } 249 250 bWriter.flush(); 251 bWriter.close(); 252 fWriter.close(); 253 } catch (FileNotFoundException e) { // problem with FileOutputStream 254 CrimsonUtils.printError("File 'leaf.list' can not be opened."); 255 CrimsonUtils.printError(e.getMessage()); 256 return; 257 } catch (IOException e) { // problem with ObjectOutputStream. 258 // XXX do we need to close bWriter()? 259 CrimsonUtils.printError("Error writting output file 'leaf.list'."); 260 CrimsonUtils.printError(e.getMessage()); 261 return; 262 } 263 } 264 */ 265 266 /** 267 * This will print the list of positions to the output file 268 * ('positions.list'), one position per line. Note that the 269 * position values in the file go from 1 to N, not from 0 to N-1. 270 * This routine requires a TreeSet because we want the positions 271 * sorted for testing. 272 */ 273 public static void printPositions(TreeSet positions) { 274 if ((positions == null) || (positions.size() == 0)) return; 275 276 try { 277 FileWriter fWriter = new FileWriter(new File("position.list")); 278 BufferedWriter bWriter = new BufferedWriter(fWriter); 279 280 for (Iterator i = positions.iterator(); i.hasNext();) { 281 bWriter.write(((Integer) i.next()) + "\n"); 282 } 283 284 bWriter.flush(); 285 bWriter.close(); 286 fWriter.close(); 287 } catch (FileNotFoundException e) { // problem with FileOutputStream 288 CrimsonUtils.printError("File 'position.list' can not be opened."); 289 CrimsonUtils.printError(e.getMessage()); 290 return; 291 } catch (IOException e) { // problem with ObjectOutputStream. 292 // XXX do we need to close bWriter()? 293 CrimsonUtils.printError("Error writting output file 'position.list'."); 294 CrimsonUtils.printError(e.getMessage()); 295 return; 296 } 297 } 298 299 } // FileIO.java