001 package escjava.gui; 002 003 import javafe.InputEntry; 004 import junitutils.Utils; 005 006 import java.io.*; 007 import java.util.ArrayList; 008 import java.util.Iterator; 009 import java.lang.reflect.Field; 010 011 import javax.swing.JOptionPane; 012 013 public class Project { 014 015 static String magic = "-EscProjectFileV0"; // See also escjava.Options 016 static File currentProject = null; 017 static final String eol = System.getProperty("line.separator"); 018 019 static public void init() { 020 init(new String[0]); 021 } 022 023 static public void init(String[] args) { 024 currentProject = null; 025 GUI.gui.clear(false); 026 ByteArrayOutputStream ba = Utils.setStreams(); 027 try { 028 GUI.gui.run(args); 029 GUI.gui.escframe.init(); 030 } finally { 031 Utils.restoreStreams(true); 032 } 033 String s = ba.toString(); 034 if (s.length() != 0) JOptionPane.showMessageDialog( 035 GUI.gui.escframe, 036 "Problems reported in reading the project file: " + eol + 037 s); 038 } 039 040 041 static public void read(File file) { 042 BufferedReader r = null; 043 try { 044 r = new BufferedReader(new FileReader(file)); 045 String s = r.readLine(); 046 if (!s.equals(magic)) { 047 JOptionPane.showMessageDialog(GUI.gui.escframe, 048 "The selected file, " + 049 file.getAbsolutePath() + 050 ", does not appear to be a project file"); 051 init(); 052 return; 053 } 054 } catch (IOException e) { 055 JOptionPane.showMessageDialog(GUI.gui.escframe, 056 "The selected file, " + 057 file.getAbsolutePath() + 058 ", could not be successfully read: " + e); 059 init(); 060 return; 061 } finally { 062 try { 063 if (r != null) r.close(); 064 } catch (IOException e) { 065 JOptionPane.showMessageDialog(GUI.gui.escframe, 066 "The selected file, " + 067 file.getAbsolutePath() + 068 ", could not be successfully closed: " + e); 069 init(); 070 return; 071 } 072 } 073 // FIXME need to capture messages about invalid material in the 074 // file. 075 init(new String[]{ "-f", file.getAbsolutePath() }); 076 currentProject = file; 077 } 078 079 static public void write() { 080 write(currentProject); 081 } 082 083 static public void write(File file) { 084 FileWriter fw = null; 085 try { 086 fw = new FileWriter(file); 087 088 // Write a header that marks this as a project file 089 fw.write(magic); 090 fw.write(eol); 091 092 // Write out all the options (that aren't defaults) 093 String s = optionString(); 094 if (s != null) { 095 fw.write(optionString()); 096 fw.write(eol); 097 } 098 099 // Write out the classpath 100 if (GUI.gui.options.userPath != null) { 101 fw.write("-classpath "); 102 fw.write(GUI.gui.options.userPath); 103 fw.write(eol); 104 } 105 fw.write(eol); 106 107 // Write out the specs path 108 if (GUI.gui.options().specspath != null) { 109 fw.write("-specs "); 110 fw.write(GUI.gui.options().specspath); 111 fw.write(eol); 112 } 113 fw.write(eol); 114 115 // Write out the input entries 116 Iterator i = GUI.gui.options.inputEntries.iterator(); 117 while (i.hasNext()) { 118 fw.write(((InputEntry)i.next()).savedString()); 119 fw.write(eol); 120 } 121 122 currentProject = file; 123 } catch (Exception e) { 124 } finally { 125 try { 126 if (fw != null) fw.close(); 127 } catch (java.io.IOException e) { 128 } 129 } 130 } 131 132 // FIXME - should really ahve this come from Options, rather 133 // than being part of the GUI code 134 static public String optionString() { 135 String[][] optionarray = EscOptions.optionsShown; 136 escjava.Options options = escjava.Main.options(); 137 StringBuffer sb = new StringBuffer(200); 138 139 String s = System.getProperty("simplify"); 140 if (s != null && s.trim().length() != 0) 141 sb.append(" -simplify " + System.getProperty("simplify") + eol); 142 for (int i=0; i<optionarray.length; ++i) { 143 String[] opt = optionarray[i]; 144 if (opt[1]==null) continue; 145 try { 146 Field f = EscOptions.escoptions.getField(opt[1]); 147 boolean b = f.getBoolean(options); 148 if (b) { sb.append(" -"); sb.append(opt[0]); } 149 } catch (Exception e) { 150 System.out.println("FAILED TO RECOGNIZE FIELD " + opt[1]); 151 } 152 } 153 return sb.toString() + " " + GUI.gui.options().nowarnOptionString(); 154 } 155 156 }