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    }