KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > finalist > jaggenerator > JagGenerator


1 /* Copyright (C) 2003 Finalist IT Group
2  *
3  * This file is part of JAG - the Java J2EE Application Generator
4  *
5  * JAG is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  * JAG is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  * You should have received a copy of the GNU General Public License
14  * along with JAG; if not, write to the Free Software
15  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16  */

17
18 package com.finalist.jaggenerator;
19
20 import com.finalist.jag.JApplicationGen;
21 import com.finalist.jag.uml.Jag2UMLGenerator;
22 import com.finalist.jag.uml.UML2JagGenerator;
23 import com.finalist.jag.util.TemplateString;
24 import com.finalist.jaggenerator.modules.*;
25 import com.finalist.jaggenerator.template.Template;
26 import org.apache.commons.logging.Log;
27 import org.apache.commons.logging.LogFactory;
28 import org.apache.log4j.lf5.LogLevel;
29 import org.w3c.dom.Document JavaDoc;
30 import org.w3c.dom.Element JavaDoc;
31
32 import javax.swing.*;
33 import javax.swing.event.TreeSelectionEvent JavaDoc;
34 import javax.swing.tree.*;
35 import javax.xml.parsers.DocumentBuilder JavaDoc;
36 import javax.xml.parsers.DocumentBuilderFactory JavaDoc;
37 import javax.xml.parsers.ParserConfigurationException JavaDoc;
38 import javax.xml.transform.OutputKeys JavaDoc;
39 import javax.xml.transform.Transformer JavaDoc;
40 import javax.xml.transform.TransformerFactory JavaDoc;
41 import javax.xml.transform.dom.DOMSource JavaDoc;
42 import javax.xml.transform.stream.StreamResult JavaDoc;
43 import java.awt.*;
44 import java.awt.event.KeyEvent JavaDoc;
45 import java.io.File JavaDoc;
46 import java.io.FileWriter JavaDoc;
47 import java.io.IOException JavaDoc;
48 import java.io.StringWriter JavaDoc;
49 import java.net.URL JavaDoc;
50 import java.util.*;
51 import java.util.List JavaDoc;
52
53 /**
54  * Main class for the JAG GUI.
55  *
56  * @author Hillebrand Gelderblom, Rudie Ekkelenkamp, Michael O'Connor - Finalist IT Group
57  * @version $Revision: 1.73 $, $Date: 2006/05/24 15:47:03 $
58  */

59 public class JagGenerator extends JFrame {
60
61     static Log log = LogFactory.getLog(JagGenerator.class);
62     private ConsoleLogger logger;
63     private boolean offlineMode = false;
64
65     private DefaultTreeModel treeModel = null;
66     public Root root = null;
67     private File JavaDoc file = null;
68     private File JavaDoc outputDir = null;
69     private static File JavaDoc applicationFileDir = new File JavaDoc(".");
70     public static JagGenerator jagGenerator;
71     private static GenericJdbcManager conManager;
72     private static final int SPLIT_PANE_WIDTH = 400;
73     private static boolean relationsEnabled = true;
74     private static Thread JavaDoc runningThread;
75     private static final Icon CANCEL_ICON = new ImageIcon("../images/cancel.png");
76     private static final Icon RUN_ICON = new ImageIcon("../images/execute.png");
77     private static final String JavaDoc RUN_ACTION = "run";
78     private static final String JavaDoc STOP_ACTION = "stop";
79     private static final HashMap entities = new HashMap();
80     private static final HashMap entitiesByTableName = new HashMap();
81     private static final String JavaDoc XMI_SUFFIX = ".xmi";
82
83
84     private static final HashMap FILECHOOSER_START_DIR = new HashMap();
85     private static final String JavaDoc FILECHOOSER_UMLEXPORT = "UML export";
86     private static final String JavaDoc FILECHOOSER_UMLIMPORT = "UML import";
87     public static final String JavaDoc FILECHOOSER_APPFILE_OPEN = "AppFile open";
88     private static final String JavaDoc FILECHOOSER_APPFILE_SAVE = "AppFile save";
89
90     public final static String JavaDoc TEMPLATE_USE_RELATIONS = "useRelations";
91     public final static String JavaDoc TEMPLATE_USE_MOCK = "useMock";
92     public final static String JavaDoc TEMPLATE_USE_JAVA5 = "useJava5";
93     public final static String JavaDoc TEMPLATE_USE_WEB_SERVICE = "useWebService";
94     public final static String JavaDoc TEMPLATE_USE_SECURITY = "useSecurity";
95
96     public final static String JavaDoc TEMPLATE_WEB_TIER = "webTier";
97     public final static String JavaDoc TEMPLATE_WEB_TIER_STRUTS1_2 = "Struts 1.2";
98     public final static String JavaDoc TEMPLATE_WEB_TIER_TAPESTRY4 = "Tapestry 4";
99     public final static String JavaDoc TEMPLATE_WEB_TIER_SWING = "Swing";
100
101     public final static String JavaDoc TEMPLATE_BUSINESS_TIER = "businessTier";
102     public final static String JavaDoc TEMPLATE_BUSINESS_TIER_EJB2 = "EJB 2.0";
103     public final static String JavaDoc TEMPLATE_BUSINESS_TIER_EJB3 = "EJB 3.0";
104     public final static String JavaDoc TEMPLATE_BUSINESS_TIER_HIBERNATE2 = "Hibernate 2";
105     public final static String JavaDoc TEMPLATE_BUSINESS_TIER_HIBERNATE3 = "Hibernate 3";
106     public final static String JavaDoc TEMPLATE_BUSINESS_TIER_MOCK = "Mock";
107
108     public final static String JavaDoc TEMPLATE_SERVICE_TIER = "serviceTier";
109     public final static String JavaDoc TEMPLATE_SERVICE_TIER_SERVICE_LOCATOR = "ServiceLocator";
110     public final static String JavaDoc TEMPLATE_SERVICE_TIER_SPRING = "Spring";
111
112     public final static String JavaDoc TEMPLATE_APPLICATION_SERVER = "appserver";
113     public final static String JavaDoc TEMPLATE_APPLICATION_SERVER_JBOSS_4_X = "JBoss 4.x";
114     public final static String JavaDoc TEMPLATE_APPLICATION_SERVER_JBOSS_3_2_2_7 = "JBoss 3.2.2-7";
115     public final static String JavaDoc TEMPLATE_APPLICATION_SERVER_JBOSS_3_2_0_1 = "JBoss 3.2.0-1";
116     public final static String JavaDoc TEMPLATE_APPLICATION_SERVER_JBOSS_3_0 = "JBoss 3.0";
117     public final static String JavaDoc TEMPLATE_APPLICATION_SERVER_TOMCAT_5 = "Tomcat 5";
118     public final static String JavaDoc TEMPLATE_APPLICATION_SERVER_SUN_ONE_7 = "Sun ONE Application Server 7";
119     public final static String JavaDoc TEMPLATE_APPLICATION_SERVER_WEBLOGIC_8_1 = "BEA WebLogic 8.1";
120     public final static String JavaDoc TEMPLATE_APPLICATION_SERVER_WEBLOGIC_EJBGEN_8_1 = "BEA WebLogic 8.1 (Workshop EJBGen)";
121     public final static String JavaDoc TEMPLATE_APPLICATION_SERVER_IBM_WEBSPERE = "IBM WebSphere";
122     public final static String JavaDoc TEMPLATE_APPLICATION_SERVER_ORACLE = "Oracle Application Server";
123
124
125     /**
126      * Runs the JaGGenerator.
127      *
128      * @param args the command line arguments
129      */

130     public static void main(String JavaDoc args[]) {
131         // Initialize commons logging..
132
log.info("Starting jag...");
133         jagGenerator = new JagGenerator();
134         jagGenerator.setVisible(true);
135     }
136
137
138    /**
139     * Get the current logger.
140     * @return the logger.
141     */

142     public ConsoleLogger getLogger() {
143        return logger;
144     }
145
146
147    /**
148     * Set the console logger.
149     * @param logger
150     */

151     public void setLogger(ConsoleLogger logger) {
152        this.logger = logger;
153     }
154     /**
155      * Creates new form jagGenerator
156      */

157     public JagGenerator() {
158         // Read user-prefs
159
Settings.read();
160
161         // Setup main Window
162
try {
163             UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
164         } catch (Exception JavaDoc e) {
165         }
166         // Initialize the Netbeans form components.
167
initComponents();
168         // Initilize our custom components that aren't managed by the form editor.
169
initCustomComponents();
170         logger = new ConsoleLogger(console);
171         consoleScrollPane.setViewportView(console);
172        
173         logger.log("Java Application Generator - console output:\n");
174         initDesktop();
175         fileNameLabel.setToolTipText("No application file selected.");
176         root = new Root();
177         treeModel = new DefaultTreeModel(root);
178         treeModel.addTreeModelListener(new JagTreeModelListener());
179         tree.setCellRenderer(new JagTreeCellRenderer());
180         tree.setModel(treeModel);
181         tree.setSelectionPath(new TreePath(((DefaultMutableTreeNode) root.getFirstChild()).getPath()));
182
183         // Set divider-locations to the place they were when user closed program
184
splitPane.setDividerLocation(Settings.getVerticalDividerPosition());
185         desktopConsoleSplitPane.setDividerLocation(Settings.getHorizontalDividerPosition());
186         // Give the Window the last known position and size again.
187
setBounds(Settings.getUserWindowBounds(this));
188         // If user was previously working in a maximized Window, return to maximized state
189
if (Settings.isMaximized()) {
190             setExtendedState(MAXIMIZED_BOTH);
191         }
192     }
193
194
195     /**
196      * Gets the connection manager, the means by which the database is accessed. If no connection has
197      * yet been set up, a dialogue will be displayed to the user with the DB settings and following this,
198      * a connection is attempted.
199      *
200      * @return Value of property conManager.
201      */

202     public static GenericJdbcManager getConManager() {
203         if (conManager == null) {
204             JDialog dialog = new ConnectDialog(jagGenerator);
205             dialog.setVisible(true); //necessary as of kestrel
206
}
207         if (conManager != null) {
208             jagGenerator.disconnectMenuItem.setEnabled(true);
209         }
210         return conManager;
211     }
212
213     /**
214      * Checks whether the database has been connected yet.
215      *
216      * @return <code>true</code> if connected.
217      */

218     public static boolean isDatabaseConnected() {
219         return conManager != null;
220     }
221
222     /**
223      * Check if JAG is running in offline mode (no database connection).
224      */

225     public boolean isOfflineMode() {
226         return offlineMode;
227     }
228
229     /**
230      * Set JAG in offline mode. This allows for adding Entties without a databse connection.
231      */

232     public void setOfflineMode(boolean offlineMode) {
233         this.offlineMode = offlineMode;
234     }
235
236     /**
237      * Enables the presentation layer to specify that a given field within a given entity is a foreign key field.
238      *
239      * @param tableName the name of the table whose entity contains the field we're interested in.
240      * @param fieldName the foreign key field.
241      */

242     public static void setForeignKeyInField(String JavaDoc tableName, String JavaDoc fieldName) {
243         TreeModel model = jagGenerator.tree.getModel();
244         for (int i = 0; i < model.getChildCount(model.getRoot()); i++) {
245             Object JavaDoc kid = model.getChild(model.getRoot(), i);
246             if (kid instanceof Entity) {
247                 Entity entity = (Entity) kid;
248                 if (entity.getLocalTableName().equals(tableName)) {
249                     for (int j = 0; j < entity.getChildCount(); j++) {
250                         Object JavaDoc kid2 = entity.getChildAt(j);
251                         if (kid2 instanceof Field) {
252                             Field field = (Field) kid2;
253                             if (field.getName().toString().equals(fieldName)) {
254                                 field.setForeignKey(true);
255                             }
256                         }
257                     }
258                 }
259             }
260         }
261     }
262
263     public static boolean isRelationsEnabled() {
264         return relationsEnabled;
265     }
266
267     public static void logToConsole(Object JavaDoc o) {
268         logToConsole(o, LogLevel.INFO);
269     }
270
271     public static void stateChanged(boolean updateTree) {
272         setFileNeedsSavingIndicator(true);
273         if (updateTree) {
274             jagGenerator.tree.updateUI();
275         }
276     }
277
278     public static void finishedGeneration() {
279         jagGenerator.executeButton.setIcon(RUN_ICON);
280         jagGenerator.executeButton.setActionCommand(RUN_ACTION);
281     }
282
283     public static Template getTemplate() {
284         Enumeration children = jagGenerator.root.children();
285         while (children.hasMoreElements()) {
286             DefaultMutableTreeNode child = (DefaultMutableTreeNode) children.nextElement();
287             if (child instanceof Config) {
288                 return ((Config) child).getTemplate();
289             }
290         }
291         return null;
292     }
293
294     public static List JavaDoc getObjectsFromTree(Class JavaDoc clazz) {
295         ArrayList list = new ArrayList();
296         Enumeration children = jagGenerator.root.children();
297         while (children.hasMoreElements()) {
298             DefaultMutableTreeNode child = (DefaultMutableTreeNode) children.nextElement();
299             if (child != null && child.getClass().equals(clazz)) {
300                 list.add(child);
301             }
302         }
303         return list;
304     }
305
306     public static void addEntity(String JavaDoc refName, Entity entity) {
307         entities.put(refName, entity);
308         entitiesByTableName.put(entity.getTableName(), entity);
309     }
310
311     public static Entity getEntityByRefName(String JavaDoc refName) {
312         return (Entity) entities.get(refName);
313     }
314
315     public static Entity getEntityByTableName(String JavaDoc tableName) {
316         return (Entity) entitiesByTableName.get(tableName);
317     }
318
319     /**
320      * When the table name associated with an entity has been updated, calling this method
321      * updates the cache.
322      *
323      * @param entityName
324      * @param newTableName
325      */

326     public static void entityHasupdatedTableName(String JavaDoc entityName, String JavaDoc newTableName) {
327         synchronized (entitiesByTableName) {
328             Iterator i = entitiesByTableName.entrySet().iterator();
329             while (i.hasNext()) {
330                 Map.Entry entry = (Map.Entry) i.next();
331                 Entity entity = (Entity) entry.getValue();
332                 if (entity.getName().equals(entityName)) {
333                     entitiesByTableName.remove(entry.getKey());
334                     entitiesByTableName.put(newTableName, entity);
335                 }
336             }
337         }
338     }
339
340     /**
341      * Makes sure that the SQL types of the fields within this application are compatible with the chosen DB.
342      */

343     public static void normaliseSQLTypesWithChosenDatabase() {
344         //I don't think this functionality is really necessary.
345

346 // if (jagGenerator.root.datasource.getMapping().toString().equals(Datasource.MYSQL)) {
347
// replaceSQLTypeInAllFields("NUMBER(\\([0-9\\s]+,[0-9\\s]+\\))", "FLOAT$1"); //NUMBER with TWO comma-seperated args
348
// replaceSQLTypeInAllFields("NUMBER", "INT"); //all other NUMBER
349
// replaceSQLTypeInAllFields("VARCHAR2", "VARCHAR");
350
// }
351
//
352
// if (jagGenerator.root.datasource.getMapping().toString().equals(Datasource.ORACLE8)) {
353
// replaceSQLTypeInAllFields("INT", "NUMBER");
354
// }
355
}
356
357     /**
358      * A record is kept of the last-accessed directory for every FileChooser, this method gets that record.
359      *
360      * @param filechooserKey A unique key.
361      * @return File
362      */

363     public static File JavaDoc getFileChooserStartDir(String JavaDoc filechooserKey) {
364         File JavaDoc dir = (File JavaDoc) FILECHOOSER_START_DIR.get(filechooserKey);
365         return dir == null ? applicationFileDir : dir;
366     }
367
368     /**
369      * A record is kept of the last-accessed directory for every FileChooser, this method sets that record.
370      *
371      * @param filechooserKey A unique key.
372      * @param dir The new directory.
373      */

374     public static void setFileChooserStartDir(String JavaDoc filechooserKey, File JavaDoc dir) {
375         FILECHOOSER_START_DIR.put(filechooserKey, dir);
376     }
377
378     private static void saveGuiSettings() {
379         // Store divier locations
380
Settings.setVerticalDividerPosition(jagGenerator.splitPane.getDividerLocation());
381         Settings.setHorizontalDividerPosition(jagGenerator.desktopConsoleSplitPane.getDividerLocation());
382         // Store window's maximized state and/or it's size and location
383
int extendedState = jagGenerator.getExtendedState();
384         boolean isMaximized = ((extendedState & MAXIMIZED_BOTH) == MAXIMIZED_BOTH);
385         if (!isMaximized) {
386             // The current Window-dimensions are only valid if not maximized
387
Settings.setUserWindowBounds(jagGenerator.getBounds());
388         }
389         Settings.setMaximized(isMaximized);
390     }
391
392     /**
393      * Causes JAG to die.
394      *
395      * @param error if not <code>null</code>, forces an error dialogue before death.
396      */

397     public static void kickTheBucket(String JavaDoc error) {
398         if (error == null) {
399             // Store GUI-settings in user-preferences
400
saveGuiSettings();
401             Settings.write();
402             // Make sure the current database-settings are stored as well
403
ConfigManager.getInstance().save();
404             //todo: prompt to save application file!
405
//todo: Make sure prompt allows you to check "don't show this again"
406
System.exit(0);
407         } else {
408             //something went horribly wrong..
409
JOptionPane.showMessageDialog(jagGenerator,
410                     error, "JAG - Fatal error!", JOptionPane.ERROR_MESSAGE);
411             System.exit(1);
412         }
413     }
414
415     /**
416      * Setter for property conManager.
417      *
418      * @param conManager New value of property conManager.
419      */

420     public void setConManager(GenericJdbcManager conManager) {
421         JagGenerator.conManager = conManager;
422     }
423
424
425     private void initDesktop() {
426         desktopPane.setLayout(new GridBagLayout());
427         this.setTitle("Java Application Generator - Finalist IT Group");
428         GridBagConstraints gridBagConstraints = new java.awt.GridBagConstraints JavaDoc();
429         gridBagConstraints.gridwidth = java.awt.GridBagConstraints.RELATIVE;
430         gridBagConstraints.gridheight = java.awt.GridBagConstraints.RELATIVE;
431         gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
432         gridBagConstraints.ipadx = 1;
433         gridBagConstraints.ipady = 1;
434         gridBagConstraints.weightx = 1.0;
435         gridBagConstraints.weighty = 1.0;
436         desktopPane.add(splitPane, gridBagConstraints);
437         pack();
438     }
439
440     private void newRelationMenuItemActionPerformed() {
441         DefaultMutableTreeNode selected = (DefaultMutableTreeNode)
442                 tree.getLastSelectedPathComponent();
443         if (!(selected instanceof Entity)) {
444             //see if the parent is an Entity..
445
TreePath selectedPath = tree.getSelectionPath();
446             selected = (DefaultMutableTreeNode) selectedPath.getParentPath().getLastPathComponent();
447             if (!(selected instanceof Entity)) {
448                 JOptionPane.showMessageDialog(this,
449                         "A relation can only be added to an entity bean. Please first select an entity in the application tree.", "Can't add relation!", JOptionPane.ERROR_MESSAGE);
450                 return;
451             }
452         }
453         Entity selectedEntity = (Entity) selected;
454
455         DefaultMutableTreeNode newNode = new Relation(selectedEntity);
456         selectedEntity.addRelation((Relation) newNode);
457         tree.setSelectionPath(new TreePath(newNode.getPath()));
458         tree.updateUI();
459     }
460
461
462     /**
463      * Updates objects concerned with 'local' side CMR relations, namely:
464      * 1: for every foreign key Field object within an entity that takes part in a relation, set its Relation object.
465      * 2: for every Relation object, set the Relation's local-side foreign key Field object.
466      */

467     private void updateLocalSideRelations() {
468         Iterator entities = root.getEntityEjbs().iterator();
469         while (entities.hasNext()) {
470             Entity entity = (Entity) entities.next();
471             //for every entity..
472
for (int i = 0; i < entity.getChildCount(); i++) {
473                 TreeNode child = entity.getChildAt(i);
474                 //for every relation in that entity..
475
if (child instanceof Relation) {
476                     Relation relation = (Relation) child;
477                     String JavaDoc fkFieldName = relation.getFieldName().toString();
478                     for (int j = 0; j < entity.getChildCount(); j++) {
479                         TreeNode child2 = entity.getChildAt(j);
480                         //iterate through all this entity's Fields..
481
if (child2 instanceof Field) {
482                             Field field = (Field) child2;
483                             //until we find the Field that matches the relation's fkFieldName
484
if (field.getName().equals(fkFieldName)) {
485                                 field.setRelation(relation);
486                                 field.setForeignKey(true);
487                                 relation.setFieldName(field.getName().toString());
488                                 relation.setFkField(field);
489                                 if (relation.getLocalColumn() == null) {
490                                     relation.setLocalColumn(relation.getFkField().getColumnName());
491                                 }
492                                 logToConsole("relation " + relation + ": local-side fk field is " + entity.getName() + ":" + field);
493                             }
494                         }
495                     }
496                 }
497             }
498         }
499     }
500
501     /**
502      * Updates objects concerned with the 'foreign' side of CMR relations, namely:
503      * 1: for every Relation, set the foreign-side primary key Field object (the primary key of the entity on the
504      * foreign side of the relation).
505      */

506     private void updateForeignSideRelations() {
507         Iterator entities = root.getEntityEjbs().iterator();
508         while (entities.hasNext()) {
509             Entity entity = (Entity) entities.next();
510             for (int i = 0; i < entity.getChildCount(); i++) {
511                 TreeNode child = entity.getChildAt(i);
512                 if (child instanceof Relation) {
513                     Relation relation = (Relation) child;
514                     Entity relatedEntity = relation.getRelatedEntity();
515                     String JavaDoc column = relation.getForeignColumn();
516                     for (int j = 0; j < relatedEntity.getChildCount(); j++) {
517                         TreeNode child2 = relatedEntity.getChildAt(j);
518                         if (child2 instanceof Field) {
519                             Field field = (Field) child2;
520                             if (field.getColumnName().equals(column)) {
521                                 relation.setForeignPkField(field);
522                                 logToConsole("relation " + relation + ": foreign-side pk is " + relatedEntity + ":" + field);
523                             }
524                         }
525                     }
526                 }
527             }
528         }
529     }
530
531
532     /**
533      * Sometimes a relation specifies an entity that hasn't been added to a session bean (all related entities
534      * must be represented in the session fa?ade). This method adds those entities automatically.
535      *
536      * @return <code>false</code> if a related entity couldn't be imported into the application.
537      */

538     private boolean addRelatedEntitiesToSessionBeans() {
539         boolean somethingAdded = false;
540         //1: create a map of entity name --> set of related foreign tables, and
541
// map of local table --> entity bean name, and
542
// map of entity bean name --> local table
543
HashMap relatedTablesPerEB = new HashMap();
544         HashMap entityPerTable = new HashMap();
545         HashMap tablePerEntity = new HashMap();
546         Iterator entities = root.getEntityEjbs().iterator();
547         while (entities.hasNext()) {
548             Entity entity = (Entity) entities.next();
549             entityPerTable.put(entity.getLocalTableName().toString(), entity.getRefName());
550             tablePerEntity.put(entity.getRefName(), entity.getLocalTableName().toString());
551             for (int i = 0; i < entity.getChildCount(); i++) {
552                 TreeNode child = entity.getChildAt(i);
553                 if (child instanceof Relation) {
554                     Relation relation = (Relation) child;
555                     String JavaDoc relatedTableName = relation.getForeignTable();
556                     Set existing = (Set) relatedTablesPerEB.get(entity.getRefName());
557                     if (existing == null) {
558                         existing = new HashSet();
559                     }
560                     existing.add(relatedTableName);
561                     relatedTablesPerEB.put(entity.getRefName(), existing);
562
563                 }
564             }
565         }
566
567         //2: remove all related foreign tables from the map, where the table is the local table of an entity that already
568
// appears within a session bean.
569
Iterator sessions = root.getSessionEjbs().iterator();
570         while (sessions.hasNext()) {
571             Session session = (Session) sessions.next();
572             Iterator entitiesWithinSession = session.getEntityRefs().iterator();
573             while (entitiesWithinSession.hasNext()) {
574                 String JavaDoc localTable = (String JavaDoc) tablePerEntity.get(entitiesWithinSession.next());
575                 Iterator relatedEntitySets = relatedTablesPerEB.values().iterator();
576                 while (relatedEntitySets.hasNext()) {
577                     Set set = (Set) relatedEntitySets.next();
578                     set.remove(localTable);
579                 }
580             }
581         }
582
583         //3: for each session bean, add any related entities not already contained within a session bean.
584
HashSet addedTables = new HashSet();
585         sessions = root.getSessionEjbs().iterator();
586         while (sessions.hasNext()) {
587             Session session = (Session) sessions.next();
588             Iterator entitiesWithinSession = session.getEntityRefs().iterator();
589             while (entitiesWithinSession.hasNext()) {
590                 String JavaDoc entityName = (String JavaDoc) entitiesWithinSession.next();
591                 Set tablesToBeAdded = (Set) relatedTablesPerEB.get(entityName);
592                 if (tablesToBeAdded != null) {
593                     Iterator i = tablesToBeAdded.iterator();
594                     while (i.hasNext()) {
595                         String JavaDoc table = (String JavaDoc) i.next();
596                         if (!addedTables.contains(table)) {
597                             String JavaDoc entity = (String JavaDoc) entityPerTable.get(table);
598                             if (entity == null) {
599                                 JOptionPane.showMessageDialog(this,
600                                         "Entity '" + entityName + "' contains a relation to a table '" + table + "'\n" +
601                                                 "for which no entity bean exists in the current application.\n" +
602                                                 "Please either create a new entity bean for this table, or delete the relation.",
603                                         "Invalid Container-managed relation!",
604                                         JOptionPane.ERROR_MESSAGE);
605                                 return false;
606                             } else {
607                                 session.addRelationRef(entity);
608                                 addedTables.add(table);
609                                 somethingAdded = true;
610                                 JOptionPane.showMessageDialog(this,
611                                         "Entity '" + entityName + "' added to the service bean '" + session.getRefName() +
612                                                 "' contains a relation to the entity '" + entity + "', which doesn't appear in any service beans.\n" +
613                                                 "The relation requires accessor methods to '" + entity + "', so these were automatically added to the service bean.",
614                                         "Service bean modified",
615                                         JOptionPane.INFORMATION_MESSAGE);
616                             }
617                         }
618                     }
619                 }
620             }
621         }
622
623         //recursively call this method if an entity had to be added, because possible that entity also contains
624
//relation references to other entities that need to be imported into a session bean...
625
if (somethingAdded) {
626             addRelatedEntitiesToSessionBeans();
627         }
628         return true;
629     }
630
631
632     private File JavaDoc selectJagOutDirectory(String JavaDoc startDir) {
633         File JavaDoc directory = null;
634         int fileChooserStatus;
635         JFileChooser fileChooser = new JFileChooser();
636         fileChooser.setDialogTitle("Select an ouput directory for the generated application..");
637         fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
638         fileChooser.setCurrentDirectory(new File JavaDoc(startDir));
639         fileChooserStatus = fileChooser.showOpenDialog(this);
640         if (fileChooserStatus == JFileChooser.APPROVE_OPTION) {
641             directory = fileChooser.getSelectedFile();
642             String JavaDoc projectName = root.app.nameText.getText();
643             directory = new File JavaDoc(directory.getAbsoluteFile(), projectName);
644         }
645         return directory;
646
647     }
648
649     /**
650      * Generates relations for a specified entity by reading foreign key info from the database.
651      *
652      * @param entity the Entity whose relations will be generated.
653      */

654     private boolean generateRelationsFromDB(Entity entity) {
655         if (getConManager() == null) {
656             logger.log("Can't regenerate relations - no database!");
657             return false;
658         }
659         log.debug("Get the foreign keys for table: " + entity.getTableName());
660         List JavaDoc fkeys = DatabaseUtils.getForeignKeys(entity.getTableName());
661         HashMap foreignTablesTally = new HashMap();
662         Set foreignKeyFieldNames = new HashSet(fkeys.size());
663         Iterator i = fkeys.iterator();
664         while (i.hasNext()) {
665             ForeignKey fk = (ForeignKey) i.next();
666             foreignKeyFieldNames.add(Utils.format(fk.getFkColumnName()));
667             Relation relation = new Relation(entity, fk);
668             String JavaDoc foreignTable = fk.getPkTableName();
669
670             // Default to unidirectional:
671
relation.setBidirectional(false);
672             // No support for one-to-one relations yet. So default to many-to-one
673
relation.setTargetMultiple(true);
674             /*
675             if (relation.getFkField() != null && relation.getFkField().isPrimaryKey()) {
676                // In case the local side is a primary key, we have a one to one relation
677                relation.setTargetMultiple(false);
678             } else {
679                // In case the local side isn't a primary key, we asume to have a many to one relation.
680                relation.setTargetMultiple(true);
681             }
682             */

683
684             if (foreignTablesTally.keySet().contains(foreignTable)) {
685                 int tally = ((Integer JavaDoc) foreignTablesTally.get(foreignTable)).intValue() + 1;
686                 relation.setName(relation.getName() + tally);
687                 foreignTablesTally.put(foreignTable, new Integer JavaDoc(tally));
688             } else {
689                 foreignTablesTally.put(foreignTable, new Integer JavaDoc(1));
690             }
691             addObject(entity, relation, false, true);
692         }
693         return true;
694     }
695
696     private ArrayList sortColumns(ArrayList columns, ArrayList pKeys, Entity entity, String JavaDoc pKey) {
697         ArrayList sortedColumns = new ArrayList();
698         // Make sure the primary key will be the first field!
699
ArrayList primaryKeyColumns = new ArrayList();
700         Column primaryKeyColumn = null;
701         for (Iterator colIt = columns.iterator(); colIt.hasNext();) {
702             Column column = (Column) colIt.next();
703             if (pKeys.contains(column.getName())) {
704                 // We found the primary key column!
705
primaryKeyColumn = column;
706                 primaryKeyColumn.setPrimaryKey(true);
707                 primaryKeyColumns.add(primaryKeyColumn);
708             } else {
709                 column.setPrimaryKey(false);
710                 sortedColumns.add(column);
711             }
712         }
713         if (pKeys.size() > 1) {
714             // We have a composite primary key!
715
entity.isCompositeCombo.setSelectedItem("true");
716             String JavaDoc compositePK = entity.rootPackageText.getText() + "." + entity.nameText.getText() + "PK";
717             entity.pKeyTypeText.setText(compositePK);
718             entity.pKeyText.setText("");// name is irrelevant now.
719
} else {
720             entity.isCompositeCombo.setSelectedItem("false");
721             if (pKeys.size() == 1) {
722                 entity.pKeyText.setText(Utils.format(pKey));// name is irrelevant now.
723

724             }
725         }
726         // If a primary key column was found, we put it in front of the list.
727
columns = new ArrayList();
728         if (primaryKeyColumn != null)
729             columns.addAll(primaryKeyColumns);
730         columns.addAll(sortedColumns);
731         return columns;
732     }
733
734     private void addObject(DefaultMutableTreeNode parent, DefaultMutableTreeNode child, boolean forceUpdate, boolean topOfQueue) {
735         if (parent == null) {
736             parent = root;
737         }
738         treeModel.insertNodeInto(child, parent, topOfQueue ? 0 : parent.getChildCount());
739         if (forceUpdate) {
740             tree.setSelectionPath(new TreePath(child.getPath()));
741         }
742     }
743
744     public boolean save() {
745         //the object graph is incomplete at this stage, so finalise it now:
746
updateLocalSideRelations();
747         updateForeignSideRelations();
748
749         if (!addRelatedEntitiesToSessionBeans()) {
750             return false;
751         }
752
753         try {
754             DocumentBuilderFactory JavaDoc dbf = DocumentBuilderFactory.newInstance();
755             DocumentBuilder JavaDoc builder = dbf.newDocumentBuilder();
756             Document JavaDoc doc = builder.newDocument();
757             Element JavaDoc skelet = doc.createElement("skelet");
758             doc.appendChild(skelet);
759             root.getXML(skelet);
760             String JavaDoc XMLDoc = outXML(doc);
761             String JavaDoc fileName = file.getName();
762             if (fileName != null) {
763                 if (fileName.indexOf(".xml") == -1) {
764                     file = new File JavaDoc(file.getAbsolutePath() + ".xml");
765                 }
766             }
767             FileWriter JavaDoc fw = new FileWriter JavaDoc(file);
768             fw.write(XMLDoc);
769             fw.close();
770             fileNameLabel.setText("Application file: " + file.getName());
771             fileNameLabel.setToolTipText(file.getAbsolutePath());
772
773         } catch (ParserConfigurationException JavaDoc e) {
774             e.printStackTrace();
775         } catch (IOException JavaDoc e) {
776             e.printStackTrace();
777         }
778
779         setFileNeedsSavingIndicator(false);
780         return true;
781     }
782
783     /* Use the JAXB JDK1.4 parser to serialize to XML. */
784     public static String JavaDoc outXML(Document JavaDoc doc) {
785         try {
786             DOMSource JavaDoc domSource = new DOMSource JavaDoc(doc);
787             StringWriter JavaDoc sw = new StringWriter JavaDoc();
788             StreamResult JavaDoc streamResult = new StreamResult JavaDoc(sw);
789             TransformerFactory JavaDoc tf = TransformerFactory.newInstance();
790             Transformer JavaDoc serializer = tf.newTransformer();
791             serializer.setOutputProperty(OutputKeys.ENCODING, "utf-8");
792             serializer.setOutputProperty(OutputKeys.INDENT, "yes");
793             serializer.transform(domSource, streamResult);
794             return sw.toString();
795         } catch (Exception JavaDoc e) {
796             e.printStackTrace();
797         }
798         return null;
799     }
800
801     private static void setFileNeedsSavingIndicator(boolean sterretje) {
802         if (jagGenerator != null && jagGenerator.file != null) {
803             String JavaDoc filename = jagGenerator.fileNameLabel.getText();
804             if (sterretje && filename.charAt(filename.length() - 1) != '*') {
805                 jagGenerator.fileNameLabel.setText(filename + '*');
806             } else if (!sterretje && filename.charAt(filename.length() - 1) == '*') {
807                 jagGenerator.fileNameLabel.setText(filename.substring(0, filename.length() - 1));
808             }
809         }
810     }
811
812     private void initCustomComponents() {
813         // Since a custom menu can't be added using Netbeans form editor,
814
// We add it just after the initComponents.
815
recentMenu = new com.finalist.jaggenerator.menu.RecentMenu();
816         recentMenu.setMnemonic(KeyEvent.VK_R);
817         recentMenu.setText("Recent...");
818         recentMenu.setMainApp(this);
819         fileMenu.insert(recentMenu, 2);
820     }
821
822
823
824 //###########################################################################################
825
// All method signatures and "// doc" below here are automatically created
826
// by NetBeans (we used version 5.0). Only change the method BODIES please,
827
// as this will enable later re-use the NetBeans form editor to make changes in the GUI!
828
//###########################################################################################
829

830
831     /**
832      * This method is called from within the constructor to
833      * initialize the form.
834      * WARNING: Do NOT modify this code. The content of this method is
835      * always regenerated by the Form Editor.
836      */

837     // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
838
private void initComponents() {
839         splitPane = new javax.swing.JSplitPane JavaDoc();
840         treeScrollPane = new javax.swing.JScrollPane JavaDoc();
841         tree = new javax.swing.JTree JavaDoc();
842         toolBar = new javax.swing.JToolBar JavaDoc();
843         newButton = new javax.swing.JButton JavaDoc();
844         openButton = new javax.swing.JButton JavaDoc();
845         saveButton = new javax.swing.JButton JavaDoc();
846         entityButton = new javax.swing.JButton JavaDoc();
847         sessionButton = new javax.swing.JButton JavaDoc();
848         relationButton = new javax.swing.JButton JavaDoc();
849         businessMethodButton = new javax.swing.JButton JavaDoc();
850         fieldButton = new javax.swing.JButton JavaDoc();
851         deleteButton = new javax.swing.JButton JavaDoc();
852         executeButton = new javax.swing.JButton JavaDoc();
853         helpButton = new javax.swing.JButton JavaDoc();
854         spacer = new javax.swing.JPanel JavaDoc();
855         applicationFileInfoPanel = new javax.swing.JPanel JavaDoc();
856         fileNameLabel = new javax.swing.JLabel JavaDoc();
857         databaseConnectionInfoPanel = new javax.swing.JPanel JavaDoc();
858         databaseConnectionLabel = new javax.swing.JLabel JavaDoc();
859         desktopConsoleSplitPane = new javax.swing.JSplitPane JavaDoc();
860         desktopPane = new javax.swing.JDesktopPane JavaDoc();
861         consoleScrollPane = new javax.swing.JScrollPane JavaDoc();
862         console = new javax.swing.JTextPane JavaDoc();
863         textConsole = new javax.swing.JTextArea JavaDoc();
864         menuBar = new javax.swing.JMenuBar JavaDoc();
865         fileMenu = new javax.swing.JMenu JavaDoc();
866         newMenuItem = new javax.swing.JMenuItem JavaDoc();
867         openMenuItem = new javax.swing.JMenuItem JavaDoc();
868         importMenuItem = new javax.swing.JMenuItem JavaDoc();
869         jSeparator1 = new javax.swing.JSeparator JavaDoc();
870         saveMenuItem = new javax.swing.JMenuItem JavaDoc();
871         saveAsMenuItem = new javax.swing.JMenuItem JavaDoc();
872         exportMenuItem = new javax.swing.JMenuItem JavaDoc();
873         jSeparator2 = new javax.swing.JSeparator JavaDoc();
874         generateJavaApplicationAsMenuItem = new javax.swing.JMenuItem JavaDoc();
875         jSeparator3 = new javax.swing.JSeparator JavaDoc();
876         exitMenuItem = new javax.swing.JMenuItem JavaDoc();
877         editMenu = new javax.swing.JMenu JavaDoc();
878         addSubMenu = new javax.swing.JMenu JavaDoc();
879         addEntityMenuItem = new javax.swing.JMenuItem JavaDoc();
880         addSessionMenuItem = new javax.swing.JMenuItem JavaDoc();
881         addRelationMenuItem = new javax.swing.JMenuItem JavaDoc();
882         addBusinessMenuItem = new javax.swing.JMenuItem JavaDoc();
883         addFieldMenuItem = new javax.swing.JMenuItem JavaDoc();
884         deleteMenuItem = new javax.swing.JMenuItem JavaDoc();
885         connectionMenu = new javax.swing.JMenu JavaDoc();
886         driverManagerMenuItem = new javax.swing.JMenuItem JavaDoc();
887         jSeparator4 = new javax.swing.JSeparator JavaDoc();
888         connectMenuItem = new javax.swing.JMenuItem JavaDoc();
889         disconnectMenuItem = new javax.swing.JMenuItem JavaDoc();
890         helpMenu = new javax.swing.JMenu JavaDoc();
891         aboutMenuItem = new javax.swing.JMenuItem JavaDoc();
892         contentMenuItem = new javax.swing.JMenuItem JavaDoc();
893
894         splitPane.setBorder(null);
895         splitPane.setDividerLocation(400);
896         splitPane.setDividerSize(3);
897         splitPane.setContinuousLayout(true);
898         splitPane.setOpaque(false);
899         splitPane.setVerifyInputWhenFocusTarget(false);
900         tree.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener JavaDoc() {
901             public void valueChanged(javax.swing.event.TreeSelectionEvent JavaDoc evt) {
902                 treeValueChanged(evt);
903             }
904         });
905
906         treeScrollPane.setViewportView(tree);
907
908         splitPane.setLeftComponent(treeScrollPane);
909
910         addWindowListener(new java.awt.event.WindowAdapter JavaDoc() {
911             public void windowClosing(java.awt.event.WindowEvent JavaDoc evt) {
912                 exitForm(evt);
913             }
914         });
915
916         toolBar.setBorder(javax.swing.BorderFactory.createEtchedBorder());
917         toolBar.setFloatable(false);
918         toolBar.setName("toolBar");
919         newButton.setIcon(new javax.swing.ImageIcon JavaDoc("../images/new.png"));
920         newButton.setText(" ");
921         newButton.setToolTipText("New JAG application");
922         newButton.setBorder(null);
923         newButton.addActionListener(new java.awt.event.ActionListener JavaDoc() {
924             public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
925                 newMenuItemActionPerformed(evt);
926             }
927         });
928
929         toolBar.add(newButton);
930
931         openButton.setIcon(new javax.swing.ImageIcon JavaDoc("../images/open.png"));
932         openButton.setText(" ");
933         openButton.setToolTipText("Open a JAG application file");
934         openButton.setBorder(null);
935         openButton.addActionListener(new java.awt.event.ActionListener JavaDoc() {
936             public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
937                 openMenuItemActionPerformed(evt);
938             }
939         });
940
941         toolBar.add(openButton);
942
943         saveButton.setIcon(new javax.swing.ImageIcon JavaDoc("../images/save.png"));
944         saveButton.setText(" ");
945         saveButton.setToolTipText("Save");
946         saveButton.setBorder(null);
947         saveButton.addActionListener(new java.awt.event.ActionListener JavaDoc() {
948             public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
949                 saveButtonActionPerformed(evt);
950             }
951         });
952
953         toolBar.add(saveButton);
954
955         toolBar.addSeparator();
956         entityButton.setIcon(new javax.swing.ImageIcon JavaDoc("../images/entity.png"));
957         entityButton.setText(" ");
958         entityButton.setToolTipText("New entity bean");
959         entityButton.setBorder(null);
960         entityButton.addActionListener(new java.awt.event.ActionListener JavaDoc() {
961             public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
962                 addEntityMenuItemActionPerformed(evt);
963             }
964         });
965
966         toolBar.add(entityButton);
967
968         sessionButton.setIcon(new javax.swing.ImageIcon JavaDoc("../images/session.png"));
969         sessionButton.setText(" ");
970         sessionButton.setToolTipText("New service bean");
971         sessionButton.setBorder(null);
972         sessionButton.addActionListener(new java.awt.event.ActionListener JavaDoc() {
973             public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
974                 addSessionMenuItemActionPerformed(evt);
975             }
976         });
977
978         toolBar.add(sessionButton);
979
980         relationButton.setIcon(new javax.swing.ImageIcon JavaDoc("../images/relation.png"));
981         relationButton.setText(" ");
982         relationButton.setToolTipText("New relation");
983         relationButton.setBorder(null);
984         relationButton.addActionListener(new java.awt.event.ActionListener JavaDoc() {
985             public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
986                 addRelationPopupMenuItemActionPerformed(evt);
987             }
988         });
989
990         toolBar.add(relationButton);
991
992         businessMethodButton.setIcon(new javax.swing.ImageIcon JavaDoc("../images/business.png"));
993         businessMethodButton.setText(" ");
994         businessMethodButton.setToolTipText("New business method");
995         businessMethodButton.setBorder(null);
996         businessMethodButton.addActionListener(new java.awt.event.ActionListener JavaDoc() {
997             public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
998                 businessMethodButtonActionPerformed(evt);
999             }
1000        });
1001
1002        toolBar.add(businessMethodButton);
1003
1004        fieldButton.setIcon(new javax.swing.ImageIcon JavaDoc("../images/field.png"));
1005        fieldButton.setText(" ");
1006        fieldButton.setToolTipText("New entity field");
1007        fieldButton.setBorder(null);
1008        fieldButton.addActionListener(new java.awt.event.ActionListener JavaDoc() {
1009            public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
1010                fieldButtonActionPerformed(evt);
1011            }
1012        });
1013
1014        toolBar.add(fieldButton);
1015
1016        deleteButton.setIcon(new javax.swing.ImageIcon JavaDoc("../images/delete.png"));
1017        deleteButton.setText(" ");
1018        deleteButton.setToolTipText("Delete");
1019        deleteButton.setBorder(null);
1020        deleteButton.addActionListener(new java.awt.event.ActionListener JavaDoc() {
1021            public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
1022                deleteMenuItemActionPerformed(evt);
1023            }
1024        });
1025
1026        toolBar.add(deleteButton);
1027
1028        toolBar.addSeparator();
1029        executeButton.setIcon(new javax.swing.ImageIcon JavaDoc("../images/execute.png"));
1030        executeButton.setText(" ");
1031        executeButton.setToolTipText("Generate the application");
1032        executeButton.setBorder(null);
1033        executeButton.addActionListener(new java.awt.event.ActionListener JavaDoc() {
1034            public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
1035                generateJavaApplicationAsMenuItemActionPerformed(evt);
1036            }
1037        });
1038
1039        toolBar.add(executeButton);
1040
1041        toolBar.addSeparator();
1042        helpButton.setIcon(new javax.swing.ImageIcon JavaDoc("../images/help.png"));
1043        helpButton.setText(" ");
1044        helpButton.setToolTipText("Help");
1045        helpButton.setBorder(null);
1046        helpButton.addActionListener(new java.awt.event.ActionListener JavaDoc() {
1047            public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
1048                contentMenuItemActionPerformed(evt);
1049            }
1050        });
1051
1052        toolBar.add(helpButton);
1053
1054        spacer.setLayout(null);
1055
1056        toolBar.add(spacer);
1057
1058        applicationFileInfoPanel.setName("fileStatusComponent");
1059        fileNameLabel.setText("Application file:");
1060        fileNameLabel.setToolTipText("File name of the XML skelet");
1061        fileNameLabel.setName("fileNameLabel");
1062        applicationFileInfoPanel.add(fileNameLabel);
1063
1064        toolBar.add(applicationFileInfoPanel);
1065
1066        databaseConnectionInfoPanel.setName("databaseConnectionComponent");
1067        databaseConnectionLabel.setText("Database Connection:");
1068        databaseConnectionLabel.setName("databaseConnectionLabel");
1069        databaseConnectionInfoPanel.add(databaseConnectionLabel);
1070
1071        toolBar.add(databaseConnectionInfoPanel);
1072
1073        getContentPane().add(toolBar, java.awt.BorderLayout.NORTH);
1074
1075        desktopConsoleSplitPane.setDividerLocation(590);
1076        desktopConsoleSplitPane.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
1077        desktopConsoleSplitPane.setTopComponent(desktopPane);
1078
1079        console.setBackground(new java.awt.Color JavaDoc(204, 204, 204));
1080        console.setEditable(false);
1081        console.setFont(new java.awt.Font JavaDoc("Lucida Console", 0, 10));
1082        console.setForeground(new java.awt.Color JavaDoc(0, 0, 1));
1083        consoleScrollPane.setViewportView(console);
1084
1085        textConsole.setColumns(20);
1086        textConsole.setRows(5);
1087        consoleScrollPane.setViewportView(textConsole);
1088
1089        desktopConsoleSplitPane.setBottomComponent(consoleScrollPane);
1090
1091        getContentPane().add(desktopConsoleSplitPane, java.awt.BorderLayout.CENTER);
1092
1093        fileMenu.setMnemonic(KeyEvent.VK_F);
1094        fileMenu.setText("File");
1095        newMenuItem.setMnemonic(KeyEvent.VK_N);
1096        newMenuItem.setAccelerator(
1097            KeyStroke.getKeyStroke(KeyEvent.VK_N, KeyEvent.CTRL_MASK));
1098        newMenuItem.setText("New");
1099        newMenuItem.addActionListener(new java.awt.event.ActionListener JavaDoc() {
1100            public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
1101                newMenuItemActionPerformed(evt);
1102            }
1103        });
1104
1105        fileMenu.add(newMenuItem);
1106
1107        openMenuItem.setMnemonic(KeyEvent.VK_O);
1108        openMenuItem.setAccelerator(
1109            KeyStroke.getKeyStroke(KeyEvent.VK_O, KeyEvent.CTRL_MASK));
1110        openMenuItem.setText("Open");
1111        openMenuItem.addActionListener(new java.awt.event.ActionListener JavaDoc() {
1112            public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
1113                openMenuItemActionPerformed(evt);
1114            }
1115        });
1116
1117        fileMenu.add(openMenuItem);
1118
1119        importMenuItem.setMnemonic(KeyEvent.VK_I);
1120        importMenuItem.setAccelerator(
1121            KeyStroke.getKeyStroke(KeyEvent.VK_I, KeyEvent.CTRL_MASK));
1122        importMenuItem.setText("Import UML model..");
1123        importMenuItem.addActionListener(new java.awt.event.ActionListener JavaDoc() {
1124            public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
1125                importMenuItemActionPerformed(evt);
1126            }
1127        });
1128
1129        fileMenu.add(importMenuItem);
1130
1131        fileMenu.add(jSeparator1);
1132
1133        saveMenuItem.setMnemonic(KeyEvent.VK_S);
1134        saveMenuItem.setAccelerator(
1135            KeyStroke.getKeyStroke(KeyEvent.VK_S, KeyEvent.CTRL_MASK));
1136        saveMenuItem.setText("Save");
1137        saveMenuItem.addActionListener(new java.awt.event.ActionListener JavaDoc() {
1138            public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
1139                saveMenuItemActionPerformed(evt);
1140            }
1141        });
1142
1143        fileMenu.add(saveMenuItem);
1144
1145        saveAsMenuItem.setMnemonic(KeyEvent.VK_A);
1146        saveAsMenuItem.setAccelerator(
1147            KeyStroke.getKeyStroke(KeyEvent.VK_F12, 0));
1148        saveAsMenuItem.setText("Save As ...");
1149        saveAsMenuItem.addActionListener(new java.awt.event.ActionListener JavaDoc() {
1150            public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
1151                saveAsMenuItemActionPerformed(evt);
1152            }
1153        });
1154
1155        fileMenu.add(saveAsMenuItem);
1156
1157        exportMenuItem.setMnemonic(KeyEvent.VK_E);
1158        exportMenuItem.setAccelerator(
1159            KeyStroke.getKeyStroke(KeyEvent.VK_E, KeyEvent.CTRL_MASK));
1160        exportMenuItem.setText("Export UML model..");
1161        exportMenuItem.addActionListener(new java.awt.event.ActionListener JavaDoc() {
1162            public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
1163                exportMenuItemActionPerformed(evt);
1164            }
1165        });
1166
1167        fileMenu.add(exportMenuItem);
1168
1169        fileMenu.add(jSeparator2);
1170
1171        generateJavaApplicationAsMenuItem.setMnemonic(KeyEvent.VK_G);
1172        generateJavaApplicationAsMenuItem.setAccelerator(
1173            KeyStroke.getKeyStroke(KeyEvent.VK_F5, 0));
1174        generateJavaApplicationAsMenuItem.setText("Generate application...");
1175        generateJavaApplicationAsMenuItem.setToolTipText("Generate a J2EE Applicatin");
1176        generateJavaApplicationAsMenuItem.addActionListener(new java.awt.event.ActionListener JavaDoc() {
1177            public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
1178                generateJavaApplicationAsMenuItemActionPerformed(evt);
1179            }
1180        });
1181
1182        fileMenu.add(generateJavaApplicationAsMenuItem);
1183
1184        fileMenu.add(jSeparator3);
1185
1186        exitMenuItem.setMnemonic(KeyEvent.VK_X);
1187        exitMenuItem.setText("Exit");
1188        exitMenuItem.addActionListener(new java.awt.event.ActionListener JavaDoc() {
1189            public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
1190                exitMenuItemActionPerformed(evt);
1191            }
1192        });
1193
1194        fileMenu.add(exitMenuItem);
1195
1196        menuBar.add(fileMenu);
1197
1198        editMenu.setMnemonic(KeyEvent.VK_E);
1199        editMenu.setText("Edit");
1200        editMenu.addActionListener(new java.awt.event.ActionListener JavaDoc() {
1201            public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
1202                editMenuActionPerformed(evt);
1203            }
1204        });
1205
1206        addSubMenu.setText("Add");
1207        addEntityMenuItem.setMnemonic(KeyEvent.VK_1);
1208        addEntityMenuItem.setAccelerator(
1209            KeyStroke.getKeyStroke(KeyEvent.VK_1, KeyEvent.CTRL_MASK));
1210        addEntityMenuItem.setText("entity bean");
1211        addEntityMenuItem.addActionListener(new java.awt.event.ActionListener JavaDoc() {
1212            public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
1213                addEntityMenuItemActionPerformed(evt);
1214            }
1215        });
1216
1217        addSubMenu.add(addEntityMenuItem);
1218
1219        addSessionMenuItem.setMnemonic(KeyEvent.VK_2);
1220        addSessionMenuItem.setAccelerator(
1221            KeyStroke.getKeyStroke(KeyEvent.VK_2, KeyEvent.CTRL_MASK));
1222        addSessionMenuItem.setText("service bean");
1223        addSessionMenuItem.addActionListener(new java.awt.event.ActionListener JavaDoc() {
1224            public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
1225                addSessionMenuItemActionPerformed(evt);
1226            }
1227        });
1228
1229        addSubMenu.add(addSessionMenuItem);
1230
1231        addRelationMenuItem.setMnemonic(KeyEvent.VK_3);
1232        addRelationMenuItem.setAccelerator(
1233            KeyStroke.getKeyStroke(KeyEvent.VK_3, KeyEvent.CTRL_MASK));
1234        addRelationMenuItem.setText("relation");
1235        addRelationMenuItem.addActionListener(new java.awt.event.ActionListener JavaDoc() {
1236            public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
1237                addRelationPopupMenuItemActionPerformed(evt);
1238            }
1239        });
1240
1241        addSubMenu.add(addRelationMenuItem);
1242
1243        addBusinessMenuItem.setMnemonic(KeyEvent.VK_4);
1244        addBusinessMenuItem.setAccelerator(
1245            KeyStroke.getKeyStroke(KeyEvent.VK_4, KeyEvent.CTRL_MASK));
1246        addBusinessMenuItem.setText("business");
1247        addBusinessMenuItem.addActionListener(new java.awt.event.ActionListener JavaDoc() {
1248            public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
1249                addBusinessMenuItemActionPerformed(evt);
1250            }
1251        });
1252
1253        addSubMenu.add(addBusinessMenuItem);
1254
1255        addFieldMenuItem.setMnemonic(KeyEvent.VK_5);
1256        addFieldMenuItem.setAccelerator(
1257            KeyStroke.getKeyStroke(KeyEvent.VK_5, KeyEvent.CTRL_MASK));
1258        addFieldMenuItem.setText("field");
1259        addFieldMenuItem.addActionListener(new java.awt.event.ActionListener JavaDoc() {
1260            public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
1261                addFieldMenuItemActionPerformed(evt);
1262            }
1263        });
1264
1265        addSubMenu.add(addFieldMenuItem);
1266
1267        editMenu.add(addSubMenu);
1268
1269        deleteMenuItem.setMnemonic(KeyEvent.VK_D);
1270        deleteMenuItem.setAccelerator(
1271            KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, KeyEvent.CTRL_MASK));
1272        deleteMenuItem.setText(" Delete");
1273        deleteMenuItem.addActionListener(new java.awt.event.ActionListener JavaDoc() {
1274            public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
1275                deleteMenuItemActionPerformed(evt);
1276            }
1277        });
1278
1279        editMenu.add(deleteMenuItem);
1280
1281        menuBar.add(editMenu);
1282
1283        connectionMenu.setMnemonic(KeyEvent.VK_D);
1284        connectionMenu.setText("Database");
1285        driverManagerMenuItem.setText("Driver Manager..");
1286        driverManagerMenuItem.addActionListener(new java.awt.event.ActionListener JavaDoc() {
1287            public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
1288                driverManagerMenuItemActionPerformed(evt);
1289            }
1290        });
1291
1292        connectionMenu.add(driverManagerMenuItem);
1293
1294        connectionMenu.add(jSeparator4);
1295
1296        connectMenuItem.setText("Create connection...");
1297        connectMenuItem.addActionListener(new java.awt.event.ActionListener JavaDoc() {
1298            public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
1299                connectMenuItemActionPerformed(evt);
1300            }
1301        });
1302
1303        connectionMenu.add(connectMenuItem);
1304
1305        disconnectMenuItem.setText("Disconnect");
1306        disconnectMenuItem.setEnabled(false);
1307        disconnectMenuItem.addActionListener(new java.awt.event.ActionListener JavaDoc() {
1308            public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
1309                disconnectMenuItemActionPerformed(evt);
1310            }
1311        });
1312
1313        connectionMenu.add(disconnectMenuItem);
1314
1315        menuBar.add(connectionMenu);
1316
1317        helpMenu.setMnemonic(KeyEvent.VK_H);
1318        helpMenu.setText("Help");
1319        aboutMenuItem.setText("About");
1320        aboutMenuItem.addActionListener(new java.awt.event.ActionListener JavaDoc() {
1321            public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
1322                aboutMenuItemActionPerformed(evt);
1323            }
1324        });
1325
1326        helpMenu.add(aboutMenuItem);
1327
1328        contentMenuItem.setMnemonic(KeyEvent.VK_C);
1329        contentMenuItem.setAccelerator(
1330            KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0));
1331        contentMenuItem.setText("Content");
1332        contentMenuItem.addActionListener(new java.awt.event.ActionListener JavaDoc() {
1333            public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt) {
1334                contentMenuItemActionPerformed(evt);
1335            }
1336        });
1337
1338        helpMenu.add(contentMenuItem);
1339
1340        menuBar.add(helpMenu);
1341
1342        setJMenuBar(menuBar);
1343
1344        pack();
1345    }// </editor-fold>//GEN-END:initComponents
1346

1347    private void addFieldMenuItemActionPerformed(java.awt.event.ActionEvent JavaDoc evt) {//GEN-FIRST:event_addFieldMenuItemActionPerformed
1348
// TODO add your handling code here:
1349
fieldButtonActionPerformed(evt);
1350    }//GEN-LAST:event_addFieldMenuItemActionPerformed
1351

1352    private void fieldButtonActionPerformed(java.awt.event.ActionEvent JavaDoc evt) {//GEN-FIRST:event_fieldButtonActionPerformed
1353
// TODO add your handling code here:
1354
DefaultMutableTreeNode selected = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
1355        if (!(selected instanceof Entity)) {
1356            JOptionPane.showMessageDialog(this,
1357                    "A field can only be added to an entity. Please first select an entity in the application tree.", "Can't add field!", JOptionPane.ERROR_MESSAGE);
1358            return;
1359        }
1360        Entity selectedEntity = (Entity) selected;
1361        Field newField = new Field(selectedEntity, new Column());
1362        selectedEntity.add(newField);
1363        tree.setSelectionPath(new TreePath(newField.getPath()));
1364        tree.updateUI();
1365    }//GEN-LAST:event_fieldButtonActionPerformed
1366

1367    private void addBusinessMenuItemActionPerformed(java.awt.event.ActionEvent JavaDoc evt) {//GEN-FIRST:event_addBusinessMenuItemActionPerformed
1368
// TODO add your handling code here:
1369
businessMethodButtonActionPerformed(evt);
1370    }//GEN-LAST:event_addBusinessMenuItemActionPerformed
1371

1372    private void editMenuActionPerformed(java.awt.event.ActionEvent JavaDoc evt) {//GEN-FIRST:event_editMenuActionPerformed
1373
// TODO add your handling code here:
1374
}//GEN-LAST:event_editMenuActionPerformed
1375

1376    private void businessMethodButtonActionPerformed(java.awt.event.ActionEvent JavaDoc evt) {//GEN-FIRST:event_businessMethodButtonActionPerformed
1377
DefaultMutableTreeNode selected = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
1378        if (!(selected instanceof Session)) {
1379            //see if the parent is an Entity..
1380
TreePath selectedPath = tree.getSelectionPath();
1381            selected = (DefaultMutableTreeNode) selectedPath.getParentPath().getLastPathComponent();
1382            if (!(selected instanceof Session)) {
1383                JOptionPane.showMessageDialog(this,
1384                        "A business method can only be added to a service bean. Please first select a session in the application tree.", "Can't add business method!", JOptionPane.ERROR_MESSAGE);
1385                return;
1386            }
1387        }
1388        Session selectedSession = (Session) selected;
1389
1390        BusinessMethod newBusinessMethod = new BusinessMethod(selectedSession);
1391        selectedSession.add(newBusinessMethod);
1392        tree.setSelectionPath(new TreePath(newBusinessMethod.getPath()));
1393        tree.updateUI();
1394    }//GEN-LAST:event_businessMethodButtonActionPerformed
1395

1396    private void driverManagerMenuItemActionPerformed(java.awt.event.ActionEvent JavaDoc evt) {//GEN-FIRST:event_driverManagerMenuItemActionPerformed
1397
DatabaseManagerFrame.getInstance().show();
1398    }//GEN-LAST:event_driverManagerMenuItemActionPerformed
1399

1400    private void exportMenuItemActionPerformed(java.awt.event.ActionEvent JavaDoc evt) {//GEN-FIRST:event_exportMenuItemActionPerformed
1401
if (file == null) {
1402            logger.log("UML Export: save application file first!");
1403            String JavaDoc message = "Before exporting the current application to UML, please save it to an application file.";
1404            JOptionPane.showMessageDialog(this, message, "No application file!", JOptionPane.ERROR_MESSAGE);
1405            saveButtonActionPerformed(null);
1406            if (file == null) {
1407                logger.log("Aborted UML Export!");
1408                return;
1409            }
1410        } else {
1411            saveButtonActionPerformed(null);
1412        }
1413
1414        int fileChooserStatus;
1415        logToConsole("Exporting application to an XMI file. Please wait...");
1416        final JFileChooser fileChooser = new JFileChooser(getFileChooserStartDir(FILECHOOSER_UMLEXPORT));
1417        fileChooser.setDialogType(JFileChooser.SAVE_DIALOG);
1418        String JavaDoc[] extenstions = {"xmi", "xml"};
1419        ExtensionsFileFilter filter = new ExtensionsFileFilter(extenstions);
1420        fileChooser.setFileFilter(filter);
1421
1422        fileChooser.setDialogTitle("UML Export: Choose a destination XMI file..");
1423        fileChooserStatus = fileChooser.showSaveDialog(this);
1424        if (fileChooserStatus == JFileChooser.APPROVE_OPTION) {
1425            File JavaDoc xmiFile = fileChooser.getSelectedFile();
1426            if (!xmiFile.getAbsolutePath().endsWith(XMI_SUFFIX)) {
1427                xmiFile = new File JavaDoc(xmiFile.getAbsolutePath() + XMI_SUFFIX);
1428            }
1429            //run the export tool
1430
new Jag2UMLGenerator(logger).generateXMI(file.getAbsolutePath(), xmiFile);
1431            logToConsole("...UML export complete.");
1432            setFileChooserStartDir(FILECHOOSER_UMLEXPORT, xmiFile);
1433
1434        } else {
1435            logToConsole("...aborted!");
1436        }
1437    }//GEN-LAST:event_exportMenuItemActionPerformed
1438

1439    private void importMenuItemActionPerformed(java.awt.event.ActionEvent JavaDoc evt) {//GEN-FIRST:event_importMenuItemActionPerformed
1440
int fileChooserStatus;
1441        logToConsole("Importing UML model from XMI file. Please wait...");
1442        final JFileChooser fileChooser = new JFileChooser(getFileChooserStartDir(FILECHOOSER_UMLIMPORT));
1443        String JavaDoc[] extenstions = {"xmi", "xml"};
1444        ExtensionsFileFilter filter = new ExtensionsFileFilter(extenstions);
1445        fileChooser.setDialogTitle("UML Import: Choose an XMI file..");
1446        fileChooser.setFileFilter(filter);
1447        fileChooserStatus = fileChooser.showOpenDialog(this);
1448        if (fileChooserStatus == JFileChooser.APPROVE_OPTION) {
1449            String JavaDoc xmiFile = fileChooser.getSelectedFile().getAbsolutePath();
1450            String JavaDoc outputDir = ".";
1451            //run the import tool - creates an XML application file in the output directory
1452
File JavaDoc xmi = new UML2JagGenerator(logger).generateXML(xmiFile, outputDir);
1453            log.info("Generated the jag project file from the UML Model. Now load the file to JAG.");
1454            loadApplicationFile(xmi);
1455            log.info("JAG project file was loaded.");
1456            xmi.delete(); // delete the generated XML file: give the user the choice of where to store it later.
1457
logToConsole("...UML import complete.");
1458            setFileChooserStartDir(FILECHOOSER_UMLIMPORT, fileChooser.getSelectedFile());
1459
1460
1461        } else {
1462            logToConsole("...aborted!");
1463        }
1464
1465    }//GEN-LAST:event_importMenuItemActionPerformed
1466

1467    private void saveButtonActionPerformed(java.awt.event.ActionEvent JavaDoc evt) {//GEN-FIRST:event_saveButtonActionPerformed
1468
if (file == null) {
1469            saveAsMenuItemActionPerformed(evt);
1470        } else {
1471            save();
1472        }
1473    }//GEN-LAST:event_saveButtonActionPerformed
1474

1475    private void disconnectMenuItemActionPerformed(java.awt.event.ActionEvent JavaDoc evt) {//GEN-FIRST:event_disconnectMenuItemActionPerformed
1476
conManager = null;
1477        databaseConnectionLabel.setText("Database Connection: not connected");
1478        disconnectMenuItem.setEnabled(false);
1479        DatabaseUtils.clearCache();
1480    }//GEN-LAST:event_disconnectMenuItemActionPerformed
1481

1482    private void addEntityMenuItemActionPerformed(java.awt.event.ActionEvent JavaDoc evt) {//GEN-FIRST:event_addEntityMenuItemActionPerformed
1483
if (!isOfflineMode()) {
1484         getConManager();
1485       }
1486       if (isOfflineMode()) {
1487          Entity entity = new Entity(root.getRootPackage(), "entity", null);
1488          DefaultMutableTreeNode parent = (DefaultMutableTreeNode) treeModel.getRoot();
1489          addObject(parent, entity, true, false);
1490          tree.updateUI();
1491          return;
1492       }
1493        if (conManager == null) {
1494            logger.log("Can't add entity - no database connection!");
1495            return;
1496        }
1497        new SelectTablesDialog(this).show();
1498
1499        new Thread JavaDoc(new Runnable JavaDoc() {
1500            public void run() {
1501                DefaultMutableTreeNode parent = (DefaultMutableTreeNode) treeModel.getRoot();
1502                Object JavaDoc referencingModule = tree.getLastSelectedPathComponent();
1503                String JavaDoc templateValue = (String JavaDoc) root.config.getTemplateSettings().get(JagGenerator.TEMPLATE_USE_RELATIONS);
1504                if ("true".equalsIgnoreCase(templateValue)) {
1505                    relationsEnabled = true;
1506                } else if ("false".equalsIgnoreCase(templateValue)) {
1507                    relationsEnabled = false;
1508                } else {
1509                    relationsEnabled = false;
1510                }
1511                ArrayList createdEntities = new ArrayList();
1512                for (Iterator tabIt = SelectTablesDialog.getTablelist().iterator(); tabIt.hasNext();) {
1513                    String JavaDoc table = (String JavaDoc) tabIt.next();
1514                    logger.log("Creating entity for table '" + table + "'...");
1515                    ArrayList pKeys = DatabaseUtils.getPrimaryKeys(table);
1516                    String JavaDoc pKey = "";
1517                    if (pKeys.size() == 1) {
1518                        pKey = (String JavaDoc) pKeys.get(0);
1519                    } else if (pKeys.size() > 1) {
1520                        String JavaDoc tableClassName = Utils.toClassName(table);
1521                        pKey = root.getRootPackage() + ".entity" + tableClassName + "PK";
1522                    }
1523
1524                    Entity entity = new Entity(root.getRootPackage(), table, pKey);
1525                    entity.setTableName(table);
1526                    addObject(parent, entity, true, false);
1527                    if (referencingModule instanceof Session) {
1528                        Session session = (Session) referencingModule;
1529                        session.addRef(entity.getRefName());
1530                    }
1531
1532                    ArrayList columns = sortColumns(DatabaseUtils.getColumns(table), pKeys, entity, pKey);
1533                    if (relationsEnabled) {
1534                        generateRelationsFromDB(entity);
1535                    }
1536
1537                    // Now build the fields.
1538
for (Iterator colIt = columns.iterator(); colIt.hasNext();) {
1539                        Column column = (Column) colIt.next();
1540                        Field field = new Field(entity, column);
1541                        addObject(entity, field, false, false);
1542                        if (column.getName().equalsIgnoreCase(pKey)) {
1543                            entity.setPKeyType(field.getType(column));
1544                        }
1545                    }
1546                    createdEntities.add(entity);
1547                }
1548                if (relationsEnabled) {
1549                    checkForAssociationEntities(createdEntities);
1550                }
1551                // This will make sure the relations are updated correctly in the gui.
1552
for (Iterator iterator = createdEntities.iterator(); iterator.hasNext();) {
1553                    Entity entity = (Entity) iterator.next();
1554                    entity.notifyRelationsThatConstructionIsFinished();
1555                }
1556                logger.log("...finished!");
1557                tree.updateUI();
1558            }
1559
1560        }).start();
1561    }//GEN-LAST:event_addEntityMenuItemActionPerformed
1562

1563
1564    /**
1565     * Check all entities and determine if there is a possible many-to-many relation
1566     * This is the case if an entity has EXACLTY 2 many-to-one relations.
1567     * The entity will be marked as "Association entity" and the related entities,
1568     * that were marked as one-to-many, will be marked as many-to-many.
1569     */

1570    private void checkForAssociationEntities(ArrayList createdEntities) {
1571        for (Iterator iterator = createdEntities.iterator(); iterator.hasNext();) {
1572            Entity entity = (Entity) iterator.next();
1573            if (entity.getRelations() != null && entity.getRelations().size() == 2 && entity.getFields().size() == 2) {
1574                // It's an entity with exaclty 2 foreign keys (targetMultiple is false).
1575
if (((Relation) entity.getRelations().get(0)).isTargetMultiple() &&
1576                        ((Relation) entity.getRelations().get(1)).isTargetMultiple()
1577                        ) {
1578                    // Mark the entity as an assocation entity.
1579
entity.setIsAssociationEntity("true");
1580                }
1581            }
1582        }
1583    }
1584
1585    private void addRelationPopupMenuItemActionPerformed
1586            (java.awt.event.ActionEvent JavaDoc
1587                    evt) {//GEN-FIRST:event_addRelationPopupMenuItemActionPerformed
1588
newRelationMenuItemActionPerformed();
1589    }//GEN-LAST:event_addRelationPopupMenuItemActionPerformed
1590

1591    private void contentMenuItemActionPerformed
1592            (java.awt.event.ActionEvent JavaDoc
1593                    evt) {//GEN-FIRST:event_contentMenuItemActionPerformed
1594
URL JavaDoc helpURL = null;
1595        String JavaDoc s = null;
1596        try {
1597            s = "file:"
1598                    + System.getProperty("user.dir")
1599                    + System.getProperty("file.separator")
1600                    + "../doc/help/help.html";
1601            helpURL = new URL JavaDoc(s);
1602        } catch (IOException JavaDoc e) {
1603            JagGenerator.logToConsole("Missing help file: " + s, LogLevel.ERROR);
1604        }
1605        new HtmlContentPopUp(null, "JAG Help", false, helpURL).show();
1606    }//GEN-LAST:event_contentMenuItemActionPerformed
1607

1608    private void aboutMenuItemActionPerformed
1609            (java.awt.event.ActionEvent JavaDoc
1610                    evt) {//GEN-FIRST:event_aboutMenuItemActionPerformed
1611
URL JavaDoc helpURL = null;
1612        String JavaDoc s = null;
1613        try {
1614            s = "file:"
1615                    + System.getProperty("user.dir")
1616                    + System.getProperty("file.separator")
1617                    + "../doc/help/about.html";
1618            helpURL = new URL JavaDoc(s);
1619        } catch (IOException JavaDoc e) {
1620            JagGenerator.logToConsole("Missing help file: " + s, LogLevel.ERROR);
1621        }
1622        new HtmlContentPopUp(null, "JAG About", false, helpURL).show();
1623    }//GEN-LAST:event_aboutMenuItemActionPerformed
1624

1625    private void generateJavaApplicationAsMenuItemActionPerformed
1626            (java.awt.event.ActionEvent JavaDoc
1627                    evt) {//GEN-FIRST:event_generateJavaApplicationAsMenuItemActionPerformed
1628
if (evt.getActionCommand() == STOP_ACTION) {
1629            runningThread.interrupt();
1630            return;
1631        }
1632
1633        if (file == null) {
1634            logger.log("No file specified! Save file first.");
1635            String JavaDoc message = "No application file (XML skelet) has been selected.\n" +
1636                    "Please save the current application to a file or open an existing application file.";
1637            JOptionPane.showMessageDialog(this, message, "No application file!", JOptionPane.ERROR_MESSAGE);
1638        } else {
1639            SkeletValidator validator = new SkeletValidator(root, tree, entitiesByTableName, logger);
1640            String JavaDoc message = validator.validateSkelet();
1641            if (message != null) {
1642                logger.log("Not a valid application file!");
1643                message += "\r\nSelect 'Yes' if you want to generate anyway. This will very probably lead to incorrect code!";
1644                //JOptionPane.showMessageDialog(this, message, "Invalid configuration", JOptionPane.YES_NO_OPTION);
1645
int rc = JOptionPane.showConfirmDialog(this, message, "Invalid configuration", JOptionPane.YES_NO_OPTION);
1646                if (rc != 0) {
1647                    // 0 is the yes option, which means we want to generate anyway.
1648
return;
1649                }
1650                logger.log("Warning! Code is generated in spite of an invalid project file!");
1651            }
1652            // Make sure the lates skelet has been saved:
1653
if (!save()) {
1654                logger.log("Can't generate application - Invalid relation(s).");
1655                return;
1656            }
1657
1658            String JavaDoc outDir = Settings.getLastSelectedOutputDir();
1659            // Now select an output directory for the generated java application.
1660

1661            if (outputDir != null) {
1662                outDir = outputDir.getParentFile().getAbsolutePath();
1663            }
1664            outputDir = selectJagOutDirectory(outDir);
1665            if (outputDir == null) {
1666                return;
1667            }
1668
1669            Settings.setLastSelectedOutputDir(outputDir.getParentFile().getAbsolutePath());
1670
1671            final String JavaDoc[] args = new String JavaDoc[3];
1672            args[0] = outputDir.getAbsolutePath();
1673            args[1] = file.getAbsolutePath();
1674            runningThread = new Thread JavaDoc() {
1675                public void run() {
1676
1677                    logger.log("Running jag in the " + args[0] + " directory for application file: " + args[1]);
1678                    JApplicationGen.setLogger(logger);
1679                    JApplicationGen.main(args);
1680                }
1681            };
1682            runningThread.start();
1683            executeButton.setIcon(CANCEL_ICON);
1684            executeButton.setActionCommand(STOP_ACTION);
1685        }
1686        setFileNeedsSavingIndicator(false);
1687    }//GEN-LAST:event_generateJavaApplicationAsMenuItemActionPerformed
1688

1689    private void deleteMenuItemActionPerformed
1690            (java.awt.event.ActionEvent JavaDoc
1691                    evt) {//GEN-FIRST:event_deleteMenuItemActionPerformed
1692
TreePath[] sel = tree.getSelectionPaths();
1693        for (int i = 0; i < sel.length; i++) {
1694            Object JavaDoc selectedObject = sel[i].getLastPathComponent();
1695            if (!(selectedObject instanceof Config ||
1696                    selectedObject instanceof App ||
1697                    selectedObject instanceof Paths ||
1698                    selectedObject instanceof Datasource)) {
1699
1700                treeModel.removeNodeFromParent((DefaultMutableTreeNode) selectedObject);
1701            }
1702            if (selectedObject instanceof Entity) {
1703                TemplateString table = ((Entity) selectedObject).getLocalTableName();
1704                SelectTablesDialog.getAlreadyselected().remove(table);
1705                DatabaseUtils.clearColumnsCacheForTable(table.toString());
1706            }
1707        }
1708        setFileNeedsSavingIndicator(true);
1709    }//GEN-LAST:event_deleteMenuItemActionPerformed
1710

1711    private void newMenuItemActionPerformed
1712            (java.awt.event.ActionEvent JavaDoc
1713                    evt) {//GEN-FIRST:event_newMenuItemActionPerformed
1714
root = new Root();
1715        file = null;
1716        fileNameLabel.setText("Application file:");
1717        fileNameLabel.setToolTipText("No application file selected");
1718        disconnectMenuItemActionPerformed(null);
1719
1720        treeModel.setRoot(root);
1721    }//GEN-LAST:event_newMenuItemActionPerformed
1722

1723    private void openMenuItemActionPerformed
1724            (java.awt.event.ActionEvent JavaDoc
1725                    evt) {//GEN-FIRST:event_openMenuItemActionPerformed
1726
int fileChooserStatus;
1727        JFileChooser fileChooser = new JFileChooser(getFileChooserStartDir(FILECHOOSER_APPFILE_OPEN));
1728        ExtensionsFileFilter filter = new ExtensionsFileFilter("xml");
1729        logToConsole("Opening application file..");
1730
1731        fileChooser.setDialogTitle("Open an existing application file..");
1732        fileChooser.setFileFilter(filter);
1733        fileChooserStatus = fileChooser.showOpenDialog(this);
1734        if (fileChooserStatus == JFileChooser.APPROVE_OPTION) {
1735            file = fileChooser.getSelectedFile();
1736            loadApplicationFile(file);
1737
1738        } else {
1739            logToConsole("..aborted application file load!");
1740        }
1741
1742        if (file != null) {
1743            fileNameLabel.setText("Application file: " + file.getName());
1744            fileNameLabel.setToolTipText(file.getAbsolutePath());
1745            setFileChooserStartDir(FILECHOOSER_APPFILE_OPEN, file);
1746        }
1747    }//GEN-LAST:event_openMenuItemActionPerformed
1748

1749    public void loadApplicationFile
1750            (File JavaDoc
1751                    file) {
1752        this.file = file;
1753        DocumentBuilderFactory JavaDoc dbf = DocumentBuilderFactory.newInstance();
1754        DocumentBuilder JavaDoc builder = null;
1755        Document JavaDoc doc = null;
1756        try {
1757            builder = dbf.newDocumentBuilder();
1758            doc = builder.parse(file);
1759            root = new Root(doc);
1760            logToConsole("..application file " + file + " loaded!");
1761            treeModel.setRoot(root);
1762            tree.setSelectionPath(new TreePath(((DefaultMutableTreeNode) root.getFirstChild()).getPath()));
1763            setFileNeedsSavingIndicator(false);
1764            SelectTablesDialog.clear();
1765            disconnectMenuItemActionPerformed(null);
1766            getRecentMenu().addToRecentList(file.getAbsolutePath());
1767        } catch (Exception JavaDoc e) {
1768            e.printStackTrace();
1769            logToConsole("Failed to load application file! (" + e + ")", LogLevel.ERROR);
1770            getRecentMenu().removeFromRecentList(file.getAbsolutePath());
1771        }
1772    }
1773
1774    private static void logToConsole(Object JavaDoc o, LogLevel error) {
1775        if (jagGenerator == null) {
1776            System.out.println(o);
1777        } else {
1778            jagGenerator.logger.log(o.toString(), error);
1779        }
1780    }
1781
1782    private void saveMenuItemActionPerformed
1783            (java.awt.event.ActionEvent JavaDoc
1784                    evt) {//GEN-FIRST:event_saveMenuItemActionPerformed
1785
saveButtonActionPerformed(evt);
1786    }//GEN-LAST:event_saveMenuItemActionPerformed
1787

1788    private void saveAsMenuItemActionPerformed
1789            (java.awt.event.ActionEvent JavaDoc
1790                    evt) {//GEN-FIRST:event_saveAsMenuItemActionPerformed
1791
int fileChooserStatus;
1792        JFileChooser fileChooser = new JFileChooser(getFileChooserStartDir(FILECHOOSER_APPFILE_SAVE));
1793        fileChooser.setDialogTitle("Save application file..");
1794        ExtensionsFileFilter filter = new ExtensionsFileFilter("xml");
1795        fileChooser.setFileFilter(filter);
1796        fileChooserStatus = fileChooser.showSaveDialog(this);
1797        if (fileChooserStatus == JFileChooser.APPROVE_OPTION) {
1798            file = fileChooser.getSelectedFile();
1799            setFileChooserStartDir(FILECHOOSER_APPFILE_SAVE, file);
1800            save();
1801        }
1802    }//GEN-LAST:event_saveAsMenuItemActionPerformed
1803

1804    private void connectMenuItemActionPerformed
1805            (java.awt.event.ActionEvent JavaDoc
1806                    evt) {//GEN-FIRST:event_connectMenuItemActionPerformed
1807
GenericJdbcManager previous = conManager;
1808        conManager = null;
1809        getConManager();
1810        if (conManager == null) {
1811            conManager = previous;
1812
1813        } else {
1814            //we're connected!
1815
DatabaseUtils.clearCache();
1816
1817            Iterator entities = root.getEntityEjbs().iterator();
1818            while (entities.hasNext()) {
1819                Entity entity = (Entity) entities.next();
1820                for (int i = 0; i < entity.getChildCount(); i++) {
1821                    TreeNode child = entity.getChildAt(i);
1822                    if (child instanceof Relation) {
1823                        ((RelationPanel) ((Relation) child).getPanel()).initValues(false);
1824                    }
1825                }
1826            }
1827        }
1828    }//GEN-LAST:event_connectMenuItemActionPerformed
1829

1830    private void addSessionMenuItemActionPerformed
1831            (java.awt.event.ActionEvent JavaDoc
1832                    evt) {//GEN-FIRST:event_addSessionMenuItemActionPerformed
1833
addObject(root, new Session(root.getRootPackage()), true, false);
1834        setFileNeedsSavingIndicator(true);
1835    }//GEN-LAST:event_addSessionMenuItemActionPerformed
1836

1837    private void treeValueChanged
1838            (TreeSelectionEvent JavaDoc
1839                    evt) {//GEN-FIRST:event_treeValueChanged
1840
TreePath path = evt.getNewLeadSelectionPath();
1841        JagBean jagBean;
1842        if (path != null) {
1843            jagBean = (JagBean) path.getLastPathComponent();
1844        } else {
1845            jagBean = (JagBean) treeModel.getRoot();
1846        }
1847        splitPane.setRightComponent(jagBean.getPanel());
1848        splitPane.setDividerLocation(SPLIT_PANE_WIDTH);
1849    }//GEN-LAST:event_treeValueChanged
1850

1851    private void exitMenuItemActionPerformed
1852            (java.awt.event.ActionEvent JavaDoc
1853                    evt) {//GEN-FIRST:event_exitMenuItemActionPerformed
1854
exitForm(null);
1855    }//GEN-LAST:event_exitMenuItemActionPerformed
1856

1857    private void exitForm
1858            (java.awt.event.WindowEvent JavaDoc
1859                    evt) {//GEN-FIRST:event_exitForm
1860
kickTheBucket(null);
1861    }//GEN-LAST:event_exitForm
1862

1863    // Variables declaration - do not modify//GEN-BEGIN:variables
1864
private javax.swing.JMenuItem JavaDoc aboutMenuItem;
1865    private javax.swing.JMenuItem JavaDoc addBusinessMenuItem;
1866    private javax.swing.JMenuItem JavaDoc addEntityMenuItem;
1867    private javax.swing.JMenuItem JavaDoc addFieldMenuItem;
1868    private javax.swing.JMenuItem JavaDoc addRelationMenuItem;
1869    private javax.swing.JMenuItem JavaDoc addSessionMenuItem;
1870    private javax.swing.JMenu JavaDoc addSubMenu;
1871    public javax.swing.JPanel JavaDoc applicationFileInfoPanel;
1872    private javax.swing.JButton JavaDoc businessMethodButton;
1873    private javax.swing.JMenuItem JavaDoc connectMenuItem;
1874    private javax.swing.JMenu JavaDoc connectionMenu;
1875    private javax.swing.JTextPane JavaDoc console;
1876    private javax.swing.JScrollPane JavaDoc consoleScrollPane;
1877    private javax.swing.JMenuItem JavaDoc contentMenuItem;
1878    public javax.swing.JPanel JavaDoc databaseConnectionInfoPanel;
1879    public javax.swing.JLabel JavaDoc databaseConnectionLabel;
1880    private javax.swing.JButton JavaDoc deleteButton;
1881    private javax.swing.JMenuItem JavaDoc deleteMenuItem;
1882    private javax.swing.JSplitPane JavaDoc desktopConsoleSplitPane;
1883    private javax.swing.JDesktopPane JavaDoc desktopPane;
1884    private javax.swing.JMenuItem JavaDoc disconnectMenuItem;
1885    private javax.swing.JMenuItem JavaDoc driverManagerMenuItem;
1886    private javax.swing.JMenu JavaDoc editMenu;
1887    private javax.swing.JButton JavaDoc entityButton;
1888    private javax.swing.JButton JavaDoc executeButton;
1889    private javax.swing.JMenuItem JavaDoc exitMenuItem;
1890    private javax.swing.JMenuItem JavaDoc exportMenuItem;
1891    private javax.swing.JButton JavaDoc fieldButton;
1892    private javax.swing.JMenu JavaDoc fileMenu;
1893    public javax.swing.JLabel JavaDoc fileNameLabel;
1894    private javax.swing.JMenuItem JavaDoc generateJavaApplicationAsMenuItem;
1895    private javax.swing.JButton JavaDoc helpButton;
1896    private javax.swing.JMenu JavaDoc helpMenu;
1897    private javax.swing.JMenuItem JavaDoc importMenuItem;
1898    private javax.swing.JSeparator JavaDoc jSeparator1;
1899    private javax.swing.JSeparator JavaDoc jSeparator2;
1900    private javax.swing.JSeparator JavaDoc jSeparator3;
1901    private javax.swing.JSeparator JavaDoc jSeparator4;
1902    private javax.swing.JMenuBar JavaDoc menuBar;
1903    private javax.swing.JButton JavaDoc newButton;
1904    private javax.swing.JMenuItem JavaDoc newMenuItem;
1905    private javax.swing.JButton JavaDoc openButton;
1906    private javax.swing.JMenuItem JavaDoc openMenuItem;
1907    private javax.swing.JButton JavaDoc relationButton;
1908    private javax.swing.JMenuItem JavaDoc saveAsMenuItem;
1909    private javax.swing.JButton JavaDoc saveButton;
1910    private javax.swing.JMenuItem JavaDoc saveMenuItem;
1911    private javax.swing.JButton JavaDoc sessionButton;
1912    private javax.swing.JPanel JavaDoc spacer;
1913    private javax.swing.JSplitPane JavaDoc splitPane;
1914    public javax.swing.JTextArea JavaDoc textConsole;
1915    public javax.swing.JToolBar JavaDoc toolBar;
1916    private javax.swing.JTree JavaDoc tree;
1917    private javax.swing.JScrollPane JavaDoc treeScrollPane;
1918    // End of variables declaration//GEN-END:variables
1919
private com.finalist.jaggenerator.menu.RecentMenu recentMenu;
1920
1921    public com.finalist.jaggenerator.menu.RecentMenu getRecentMenu() {
1922        return recentMenu;
1923    }
1924
1925}
1926
Popular Tags