View Javadoc

1   /*
2   * The contents of this file are subject to the BT "ZEUS" Open Source 
3   * Licence (L77741), Version 1.0 (the "Licence"); you may not use this file 
4   * except in compliance with the Licence. You may obtain a copy of the Licence
5   * from $ZEUS_INSTALL/licence.html or alternatively from
6   * http://www.labs.bt.com/projects/agents/zeus/licence.htm
7   * 
8   * Except as stated in Clause 7 of the Licence, software distributed under the
9   * Licence is distributed WITHOUT WARRANTY OF ANY KIND, either express or 
10  * implied. See the Licence for the specific language governing rights and 
11  * limitations under the Licence.
12  * 
13  * The Original Code is within the package zeus.*.
14  * The Initial Developer of the Original Code is British Telecommunications
15  * public limited company, whose registered office is at 81 Newgate Street, 
16  * London, EC1A 7AJ, England. Portions created by British Telecommunications 
17  * public limited company are Copyright 1996-9. All Rights Reserved.
18  * 
19  * THIS NOTICE MUST BE INCLUDED ON ANY COPY OF THIS FILE
20  */
21  
22  
23  
24  /******************************************************************************
25  * CodeGenerator.java
26  *
27  * Sub-window that facilitates the code generation process
28  *****************************************************************************/
29  
30  package zeus.generator.code;
31  
32  import java.util.*;
33  import java.awt.*;
34  import java.awt.event.*;
35  import java.io.*;
36  import javax.swing.*;
37  import javax.swing.border.*;
38  
39  import zeus.gui.help.*;
40  import zeus.generator.*;
41  import zeus.util.*;
42  import zeus.concepts.*;
43  
44  public class CodeGenerator extends JFrame 
45  {
46    static final String CODE_GENERATOR = "Code Generator";
47  
48    protected JTabbedPane     tabbedPane;
49    protected GenerationPanel generationPanel;
50    protected UtilityPanel    utilityPanel;
51    protected AgentPanel      agentPanel;
52    protected TaskPanel       taskPanel;
53    protected GeneratorModel  genmodel;
54    protected GenerationPlan  genplan;
55    protected boolean         isSubFrame = false;
56    protected AgentWriter     agentWriter = null;
57    protected TaskWriter      taskWriter = null;
58    protected ScriptWriter    scriptWriter = null;
59  
60    public CodeGenerator(GeneratorModel genmodel, GenerationPlan genplan,
61                         boolean isSubFrame) {
62       this(genmodel,genplan);
63       this.isSubFrame = isSubFrame;
64    }
65  
66    public CodeGenerator(GeneratorModel genmodel, GenerationPlan genplan) 
67    {
68      this.genmodel = genmodel;
69      this.genplan = genplan;
70  
71      setTitle(CODE_GENERATOR);
72      JPanel panel = (JPanel)getContentPane();
73      panel.setBackground(Color.gray);
74  
75      String path = SystemProps.getProperty("gif.dir") + "generator" +
76                    System.getProperty("file.separator");
77      ImageIcon icon = new ImageIcon(path + "stripe.gif");
78      setIconImage(icon.getImage());
79  
80      panel.setLayout(new BorderLayout());
81      tabbedPane = new JTabbedPane();
82  
83      generationPanel = new GenerationPanel(genplan);
84      utilityPanel    = new UtilityPanel(genplan);
85      agentPanel      = new AgentPanel(genplan);
86      taskPanel       = new TaskPanel(genplan);
87  
88      tabbedPane.addTab("Generation Plan", generationPanel);
89      tabbedPane.addTab("Utility Agents", utilityPanel);
90      tabbedPane.addTab("Task Agents", agentPanel);
91      tabbedPane.addTab("Tasks", taskPanel);
92      tabbedPane.setSelectedIndex(0);
93  
94      tabbedPane.setTabPlacement(JTabbedPane.BOTTOM);
95      panel.add(tabbedPane,BorderLayout.CENTER);
96      panel.add(new ControlPanel(),BorderLayout.NORTH);
97      panel.setPreferredSize(new Dimension(800,640));
98      this.addWindowListener(
99         new WindowAdapter() {
100           public void windowClosing(WindowEvent e) {
101              cancel();
102           }
103        }
104     );
105 
106     pack();
107   }
108 
109   protected class ControlPanel extends JToolBar implements ActionListener {
110      protected JButton       generateBtn;
111      protected JButton       clearBtn;
112      protected JButton       cancelBtn;
113      protected JToggleButton helpBtn;
114      protected HelpWindow    helpWin;
115 
116      public ControlPanel() {
117         setBackground(Color.lightGray);
118         setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
119         setVisible(true);
120 
121         String sep = System.getProperty("file.separator");
122         String path = SystemProps.getProperty("gif.dir") + "generator" + sep;
123 
124         generateBtn = new JButton(new ImageIcon(path + "generate.gif"));
125         generateBtn.addActionListener(this);
126         generateBtn.setMargin(new Insets(0,0,0,0));
127         generateBtn.setToolTipText("Generate source code");
128         add(generateBtn);
129 
130         addSeparator();
131 
132         clearBtn = new JButton(new ImageIcon(path + "clear-big.gif"));
133         clearBtn.addActionListener(this);
134         clearBtn.setMargin(new Insets(0,0,0,0));
135         clearBtn.setToolTipText("Clear code generation plan");
136         add(clearBtn);
137 
138         addSeparator();
139 
140         cancelBtn = new JButton(new ImageIcon(path + "cancel.gif"));
141         cancelBtn.addActionListener(this);
142         cancelBtn.setMargin(new Insets(0,0,0,0));
143         cancelBtn.setToolTipText("Dismiss window");
144         add(cancelBtn);
145 
146         addSeparator();
147 
148         helpBtn = new JToggleButton(new ImageIcon(path + "info.gif"));
149         helpBtn.addActionListener(this);
150         helpBtn.setMargin(new Insets(0,0,0,0));
151         helpBtn.setToolTipText("Help about code generator");
152         add(helpBtn);
153 
154         validate();
155      }
156 
157      public void actionPerformed(ActionEvent e) {
158         Object src = e.getSource();
159 
160         if ( src == generateBtn )
161            generateCode();
162         else if ( src == clearBtn )
163            genplan.reset();
164         else if ( src == cancelBtn )
165            cancel();
166         else if ( src == helpBtn ) {
167            if ( helpBtn.isSelected() ) {
168               helpWin = new HelpWindow(SwingUtilities.getRoot(this),
169                 getLocation(), "generator", "Code Generator");
170               helpWin.setSource(helpBtn);
171            }
172            else
173               helpWin.dispose();
174         }
175      }
176   }
177 
178   protected void cancel() {
179       this.setVisible(false);
180       if ( !isSubFrame ) {
181          System.exit(0);
182       }
183   }
184 
185   protected String createTargetDirectory()  {
186     String directory = genplan.getDirectory();
187     if ( directory != null )
188        directory = directory.trim();
189     if ( directory == null || directory.equals("") )
190        directory = System.getProperty("user.dir");
191 
192     File f = new File(directory);
193     if ( f.exists() ) {
194        if (f.isFile())
195 	  directory = f.getPath();
196        else
197 	  directory = f.getAbsolutePath();
198     }
199     else if (!f.mkdirs()) {
200        JOptionPane.showMessageDialog(this,"Cannot create directory\nCheck path name",
201           "Error", JOptionPane.ERROR_MESSAGE);
202        return null;
203     }
204     directory += File.separator;
205     return directory;
206   }
207 
208   protected void generateCode()
209   {
210     JTextArea textArea = generationPanel.getTextArea();
211     textArea.setText("");
212 
213     // added by Jaron 1/11/00
214     // to prevent problems where users have not saved their ontology
215     String file = genmodel.ontology.getFilename();
216     if (file == null) {
217       textArea.append("You can not generate code until you have saved your ontology");
218       return;
219     }
220 
221     String directory = createTargetDirectory();
222     if (directory == null || directory.equals("")) {
223       textArea.append("You can not generate code until you have specified a target directory");
224       return;
225     }
226 
227     textArea.append("###### Code Generation Started ######\n\n");
228     if ( agentWriter == null ) 
229     {
230       agentWriter = new AgentWriter(genplan,genmodel,directory,textArea);
231       taskWriter = new TaskWriter(genplan,genmodel,directory,textArea);
232       scriptWriter = new ScriptWriter(genplan,genmodel,directory,textArea);
233     }
234     scriptWriter.write();
235     agentWriter.write();
236     taskWriter.write();
237     textArea.append("\n###### Code Generation Completed ######\n");
238   }
239 
240   protected static void usage() {
241     System.err.println("Usage: java CodeGenerator -f <file> [-h] [-v]");
242     System.exit(0);
243   }
244 
245   protected static void version() {
246     System.err.println("Zeus Code Generator version: " +
247                        SystemProps.getProperty("version.id"));
248     System.exit(0);
249   }
250 
251   public static void main(String[] arg) {
252      String filename = null;
253 
254      for( int i = 0; i < arg.length; i++ ) {
255         if ( arg[i].equals("-f") && ++i < arg.length )
256            filename = arg[i];
257         else if ( arg[i].equals("-h") )
258            usage();
259         else if ( arg[i].equals("-v") )
260            version();
261         else
262            usage();
263      }
264 
265      if ( filename == null ) {
266         System.err.println("Error: No filename specified");
267         usage();
268      }
269 
270      GenSym genSym = new GenSym("AgentGenerator");
271      OntologyDb ontology = new OntologyDb(genSym);
272      GeneratorModel genmodel = new GeneratorModel(ontology);
273      GenerationPlan genplan = new GenerationPlan(genmodel,ontology);
274      FileHandler filer = new FileHandler(ontology,genmodel,genplan);
275 
276      CodeGenerator generator = new CodeGenerator(genmodel,genplan);
277      generator.setVisible(true);
278 
279      String dir = System.getProperty("user.dir") +
280                   System.getProperty("file.separator");
281      File f = new File(dir + filename);
282 
283      Frame frame = (Frame)SwingUtilities.getRoot(generator);
284      Cursor lastCursor = frame.getCursor();
285      frame.setCursor(new Cursor(Cursor.WAIT_CURSOR));
286      int status = filer.openFile(f);
287      frame.setCursor(lastCursor);
288      if ( (status & FileHandler.ERROR_MASK) != 0 ) {
289         JOptionPane.showMessageDialog(generator,filer.getError(),
290            "Error",JOptionPane.ERROR_MESSAGE);
291         System.exit(0);
292      }
293      else if ( (status & FileHandler.WARNING_MASK) != 0 ) {
294         JOptionPane.showMessageDialog(generator,filer.getWarning(),
295            "Warning",JOptionPane.WARNING_MESSAGE);
296      }
297   }
298 }