KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > finalist > jag > uml > Jag2UMLGenerator


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.jag.uml;
19
20 import com.finalist.jaggenerator.modules.*;
21 import com.finalist.jaggenerator.ConsoleLogger;
22 import com.finalist.jaggenerator.JagGenerator;
23 import com.finalist.uml14.simpleuml.*;
24 import org.w3c.dom.Document JavaDoc;
25 import org.apache.commons.logging.Log;
26 import org.apache.commons.logging.LogFactory;
27
28 import javax.xml.parsers.DocumentBuilder JavaDoc;
29 import javax.xml.parsers.DocumentBuilderFactory JavaDoc;
30 import java.io.File JavaDoc;
31 import java.io.OutputStream JavaDoc;
32 import java.io.FileOutputStream JavaDoc;
33 import java.io.IOException JavaDoc;
34 import java.util.*;
35
36
37 /**
38  * Generate an UML1.4 XMI model based on the Jag skelet configuration file.
39  *
40  * @author Rudie Ekkelenkamp - Finalist IT Group
41  * @version $Revision: 1.23 $, $Date: 2006/03/11 13:44:04 $
42  */

43 public class Jag2UMLGenerator {
44
45    static Log log = LogFactory.getLog(Jag2UMLGenerator.class);
46
47    public final static String JavaDoc stringType = "java.lang.String";
48    public final static String JavaDoc intType = "java.lang.Integer";
49    public final static String JavaDoc sqlDateType = "java.sql.Date";
50    public final static String JavaDoc sqlTimestampType = "java.sql.Timestamp";
51    public final static String JavaDoc sqlUtilType = "java.util.Date";
52    public final static String JavaDoc byteType = "java.lang.Byte";
53    public final static String JavaDoc floatType = "java.lang.Float";
54    public final static String JavaDoc doubleType = "java.lang.Double";
55    public final static String JavaDoc longType = "java.lang.Long";
56    public final static String JavaDoc shortType = "java.lang.Short";
57    public final static String JavaDoc bigDecimalType = "java.math.BigDecimal";
58    public final static String JavaDoc defaultType = "DEFAULT";
59
60    public final static String JavaDoc stringValue = "String";
61    public final static String JavaDoc intValue = "Integer";
62    public final static String JavaDoc sqlDateValue = "Date";
63    public final static String JavaDoc sqlTimestampValue = "Timestamp";
64    public final static String JavaDoc sqlUtilValue = "Date";
65    public final static String JavaDoc byteValue = "Byte";
66    public final static String JavaDoc floatValue = "Float";
67    public final static String JavaDoc doubleValue = "Double";
68    public final static String JavaDoc longValue = "Long";
69    public final static String JavaDoc shortValue = "Short";
70    public final static String JavaDoc bigDecimalValue = "BigDecimal";
71
72    public final static String JavaDoc defaultValue = "String";
73
74    private HashMap typeMappings = null;
75    private SimpleUmlPackage javaLangPackage = null;
76    private SimpleUmlPackage javaUtilPackage = null;
77    private SimpleUmlPackage javaSqlPackage = null;
78    private SimpleUmlPackage javaMathPackage = null;
79    private static ConsoleLogger logger;
80
81    /**
82     * Makes a Jag2UMLGenerator with an external logger.
83     *
84     * @param logger somewhere to redirect output, other than System.out
85     */

86    public Jag2UMLGenerator(ConsoleLogger logger) {
87       this.logger = logger;
88    }
89
90    /**
91     * Makes a Jag2UMLGenerator.
92     */

93    public Jag2UMLGenerator() {
94    }
95
96
97    /**
98     * Converts a JAG application file (XML) to XMI.
99     *
100     * @param skeletFileName the JAG application file to be converted to XMI.
101     */

102    public void generateXMI(String JavaDoc skeletFileName) {
103       generateXMI(skeletFileName, null);
104    }
105
106    /**
107     * Converts a JAG application file (XML) to XMI.
108     *
109     * @param skeletFileName the JAG application file to be converted to XMI.
110     * @param output the file where the XMI will be written to.
111     */

112    public void generateXMI(String JavaDoc skeletFileName, File JavaDoc output) {
113       Root root = null;
114       File JavaDoc skeletFile = null;
115       try {
116          skeletFile = new File JavaDoc(skeletFileName);
117          DocumentBuilderFactory JavaDoc dbf = DocumentBuilderFactory.newInstance();
118          DocumentBuilder JavaDoc builder = null;
119          Document JavaDoc doc = null;
120          builder = dbf.newDocumentBuilder();
121          doc = builder.parse(skeletFile);
122          root = new Root(doc);
123          
124       } catch (Exception JavaDoc e) {
125          e.printStackTrace();
126       }
127
128       if (output == null) {
129          output = skeletFile.getParentFile();
130       }
131
132       generateXMI(root, output);
133    }
134
135    private void generateXMI(Root root, File JavaDoc output) {
136       App app = root.app;
137       Config conf = root.config;
138        // app.setRootPackage();
139
ArrayList sessionEJBs = root.getSessionEjbs();
140
141       String JavaDoc rootPackage = app.rootPackageText.getText();
142       String JavaDoc projectName = app.descriptionText.getText();
143
144       SimpleModel simpleModel = new SimpleModel();
145       simpleModel.setName(projectName);
146       //SimpleDiagram diagram = new SimpleDiagram(projectName);
147
//simpleModel.addSimpleDiagram(diagram);
148

149       // First create the type packages.
150
createBasicTypes(simpleModel);
151       simpleModel.addSimpleUmlPackage(rootPackage);
152       createDataSource(root.datasource, simpleModel);
153       createConfigClass(root.config,root.app,root.paths,simpleModel);
154
155       // Create the entity EJBs.
156
HashMap entityEJBMap = createEntityEJBs(root.getEntityEjbs(), simpleModel);
157
158       // Create the Session EJBs
159
HashMap sessionEJBMap = createSessionEJBs(root.getSessionEjbs(), simpleModel);
160
161       // Create the dependencies for the session EJBs to the Entity EJBS.
162
// Session EJBs
163
for (int i = 0; i < sessionEJBs.size(); i++) {
164          Session s = (Session) sessionEJBs.get(i);
165          String JavaDoc refName = s.getRefName();
166
167          // Session UML class is: sessionEJBMap
168
SimpleUmlClass sessionUMLClass = (SimpleUmlClass) sessionEJBMap.get(refName);
169
170          ArrayList entityRefs = s.getEntityRefs();
171          for (int j = 0; j < entityRefs.size(); j++) {
172             String JavaDoc entityRefName = (String JavaDoc) entityRefs.get(j);
173             SimpleUmlClass entityUMLClass = (SimpleUmlClass) entityEJBMap.get(entityRefName);
174             if (entityUMLClass != null) {
175                // Only add a reference if the entity could be found.
176
SimpleDependency dep = new SimpleDependency();
177                dep.setClient(sessionUMLClass);
178                dep.setSupplier(entityUMLClass);
179                 // Stereotype not required.
180
// simpleModel.setStereoType(JagUMLProfile.STEREOTYPE_DEPENDENCTY_ENTITY_REF, dep);
181
simpleModel.addSimpleDependency(dep);
182             }
183             // Now create a dependendency between sessionUMLClass and entityUMLClass.
184
}
185       }
186       createContainerManagedRelations(root.getEntityEjbs(), entityEJBMap, simpleModel);
187
188       try {
189          if (output.isDirectory()) {
190             output = new File JavaDoc(output, simpleModel.getName() + ".xmi");
191          }
192          OutputStream JavaDoc outputStream = new FileOutputStream JavaDoc(output);
193          simpleModel.writeModel(outputStream);
194       } catch (IOException JavaDoc ioe) {
195          log("Error writing the file.");
196       }
197    }
198
199    /**
200     * Create all entity EJBs in the uml model and put them in a hashmap
201     *
202     * @param entityEJBs list with all entity EJBs.
203     * @param simpleModel the uml model.
204     * @return HashMap with all UML Entity classes.
205     */

206    private HashMap createEntityEJBs(ArrayList entityEJBs, SimpleModel simpleModel) {
207       HashMap map = new HashMap();
208       for (int i = 0; i < entityEJBs.size(); i++) {
209          Entity e = (Entity) entityEJBs.get(i);
210          String JavaDoc documentation = e.getDescription().toString();
211          String JavaDoc name = e.getName().toString();
212          String JavaDoc refName = e.getRefName();
213          String JavaDoc tableName = e.getTableName();
214          String JavaDoc displayName = e.getDisplayName().toString();
215          String JavaDoc entityRootPackage = e.getRootPackage().toString();
216
217          simpleModel.addSimpleUmlPackage(entityRootPackage);
218          String JavaDoc isCompositeKey = e.getIsComposite();
219          String JavaDoc isAssocation = e.getIsAssociationEntity();
220          // "true" or "false"
221
// Use the refName to put all EntityEJBs in a HashMap.
222
// Add the standard definition for the URLS.
223
SimpleUmlClass umlClass = new SimpleUmlClass(name, SimpleModelElement.PUBLIC);
224          // The e should be a UML Class.
225
// Use the stereoType:
226
simpleModel.setStereoType(JagUMLProfile.STEREOTYPE_CLASS_ENTITY, umlClass);
227          simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_DOCUMENTATION, documentation, umlClass);
228          simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_CLASS_TABLE_NAME, tableName, umlClass);
229          if (!"".equals(displayName)) {
230             simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_CLASS_DISPLAY_NAME, displayName, umlClass);
231          }
232          if ("true".equals(isCompositeKey)) {
233             simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_CLASS_COMPOSITE_PRIMARY_KEY, e.getPrimaryKeyType().toString(), umlClass);
234          }
235          if ("true".equals(isAssocation)) {
236             simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_CLASS_IS_ASSOCIATION, isAssocation, umlClass);
237          }
238
239          ArrayList fields = (ArrayList) e.getFields();
240          for (int j = 0; j < fields.size(); j++) {
241             Field field = (Field) fields.get(j);
242             String JavaDoc fieldType = field.getType();
243             String JavaDoc fieldName = field.getName().toString();
244             SimpleUmlClass type = (SimpleUmlClass) typeMappings.get(fieldType);
245             if (type == null) {
246                log("Unknown type: " + type + " for field " + fieldType);
247                type = (SimpleUmlClass) typeMappings.get(this.stringType);
248             }
249
250             SimpleAttribute theAttribute = new SimpleAttribute(fieldName, SimpleModelElement.PUBLIC, type);
251             umlClass.addSimpleAttribute(theAttribute);
252
253             String JavaDoc foreignKey = field.getForeignKey().toString();
254             // "true" or "false" if the current field as a foreign key.
255

256             if (field.isPrimaryKey()) {
257                simpleModel.setStereoType(JagUMLProfile.STEREOTYPE_ATTRIBUTE_PRIMARY_KEY, theAttribute);
258             } else if (field.isNullable() == false) {
259
260                simpleModel.setStereoType(JagUMLProfile.STEREOTYPE_ATTRIBUTE_REQUIRED, theAttribute);
261             }
262
263             if (field.isForeignKey()) {
264                // Niet duidelijk of het plaatsen van 2 stereotypes mogelijk is....
265
String JavaDoc stereoTypeForeignKey = JagUMLProfile.STEREOTYPE_ATTRIBUTE_FOREIGN_KEY;
266             }
267
268             String JavaDoc jdbcType = field.getJdbcType().toString();
269             simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_ATTRIBUTE_JDBC_TYPE, jdbcType, theAttribute);
270
271             String JavaDoc sqlType = field.getSqlType().toString();
272             simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_ATTRIBUTE_SQL_TYPE, sqlType, theAttribute);
273
274             String JavaDoc columnName = field.getColumnName();
275             simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_ATTRIBUTE_COLUMN_NAME, columnName, theAttribute);
276
277              boolean autoGeneratedPrimarykey = field.getHasAutoGenPrimaryKey();
278              simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_ATTRIBUTE_AUTO_PRIMARY_KEY,
279                      "" + autoGeneratedPrimarykey, theAttribute);
280          }
281
282          SimpleUmlPackage pk = simpleModel.addSimpleUmlPackage(entityRootPackage);
283          pk.addSimpleClassifier(umlClass);
284          map.put(refName, umlClass);
285       }
286
287       return map;
288    }
289
290    /** Create the session EJBs on the simpleModel. */
291    private HashMap createSessionEJBs(ArrayList sessionEJBs, SimpleModel simpleModel) {
292       HashMap map = new HashMap();
293       for (int i = 0; i < sessionEJBs.size(); i++) {
294          Session s = (Session) sessionEJBs.get(i);
295
296
297
298          String JavaDoc sessionPackage = s.getRootPackage().toString();
299          String JavaDoc documentation = s.getDescription().toString();
300          String JavaDoc name = s.getName().toString();
301          String JavaDoc refName = s.getRefName();
302
303          simpleModel.addSimpleUmlPackage(sessionPackage);
304          SimpleUmlPackage pk = simpleModel.addSimpleUmlPackage(sessionPackage);
305          // Here the actual UML session should be stored.
306
String JavaDoc sessionStereoType = JagUMLProfile.STEREOTYPE_CLASS_SERVICE;
307
308          SimpleUmlClass sessionClass = new SimpleUmlClass(name, SimpleModelElement.PUBLIC);
309          simpleModel.setStereoType(JagUMLProfile.STEREOTYPE_CLASS_SERVICE, sessionClass);
310          simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_DOCUMENTATION, documentation, sessionClass);
311          pk.addSimpleClassifier(sessionClass);
312
313          ArrayList methods = s.getBusinessMethods();
314          if (methods != null) {
315             for (int j=0; j< methods.size(); j++) {
316                BusinessMethod bm = (BusinessMethod) methods.get(j);
317                SimpleOperation op = new SimpleOperation();
318                op.setName(bm.getMethodName());
319                String JavaDoc desc = bm.getDescription();
320                if (desc == null) {
321                   desc = "";
322                }
323                simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_DOCUMENTATION, desc, op);
324
325                // Now add the arguments.
326
ArrayList arguments = bm.getArgumentList();
327                if (arguments != null) {
328                   for (int k=0; k < arguments.size(); k++) {
329                      BusinessArgument arg = (BusinessArgument) arguments.get(k);
330                      SimpleParameter sp = new SimpleParameter();
331                      sp.setName(arg.getName());
332                      SimpleUmlClass sc = new SimpleUmlClass(arg.getType(), SimpleModelElement.PUBLIC);
333                      simpleModel.addSimpleClassifier(sc);
334                      sp.setKind(SimpleParameter.IN);
335                      sp.setType(sc);
336                      op.addSimpleParameter(sp);
337
338                   }
339                }
340                // And finally add the return type:
341
SimpleParameter sp = new SimpleParameter();
342                sp.setName("");
343                SimpleUmlClass sc = new SimpleUmlClass(bm.getReturnType(), SimpleModelElement.PUBLIC);
344                simpleModel.addSimpleClassifier(sc);
345                sp.setKind(SimpleParameter.RETURN);
346                sp.setType(sc);
347                op.addSimpleParameter(sp);
348                sessionClass.addSimpleOperation(op);
349             }
350          }
351
352          map.put(refName, sessionClass);
353       }
354       return map;
355    }
356
357    /**
358     * Determine the relations that are defined for an entity EJB.
359     *
360     * @param entityEJBs from the jag configuration file.
361     * @param entityEJBMap Current classes in the model.
362     * @param simpleModel The UML model.
363     */

364    private void createContainerManagedRelations(ArrayList entityEJBs, HashMap entityEJBMap, SimpleModel simpleModel) {
365       for (int i = 0; i < entityEJBs.size(); i++) {
366          Entity e = (Entity) entityEJBs.get(i);
367
368          List relationFieldNames = e.getRelations();
369
370          for (int j = 0; j < relationFieldNames.size(); j++) {
371             Relation rel = (Relation) relationFieldNames.get(j);
372             String JavaDoc source = e.getRefName();
373             String JavaDoc destination = rel.getRelatedEntity().getRefName();
374             boolean navigable = rel.isBidirectional();
375
376             int targetCardinality = -1;
377             if (rel.isTargetMultiple()) {
378                // -1 means many.
379
targetCardinality = -1;
380             } else {
381                targetCardinality = 1;
382             }
383
384             SimpleUmlClass sourceClass = (SimpleUmlClass) entityEJBMap.get(source);
385             SimpleUmlClass destinationClass = (SimpleUmlClass) entityEJBMap.get(destination);
386             if (sourceClass != null && destinationClass != null) {
387                SimpleAssociationEnd sourceEnd = new SimpleAssociationEnd(sourceClass.getName(), sourceClass, 0, 1, navigable);
388                SimpleAssociationEnd destinationEnd =
389                      new SimpleAssociationEnd(destinationClass.getName(), destinationClass, 0, targetCardinality, true);
390                SimpleAssociation assoc = new SimpleAssociation(rel.getFieldName().toString(), sourceEnd, destinationEnd);
391                simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_ASSOCIATION_FOREIGN_FIELD,
392                      rel.getForeignPkFieldName().toString(), assoc);
393                simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_ASSOCIATION_MULTIPLICITY,
394                                     rel.isTargetMultiple() ? JagUMLProfile.TAGGED_VALUE_ASSOCIATION_MULTIPLICITY_MANY_TO_ONE: JagUMLProfile.TAGGED_VALUE_ASSOCIATION_MULTIPLICITY_ONE_TO_ONE, assoc);
395                simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_ASSOCIATION_BIDIRECTIONAL,
396                                     rel.isBidirectional() ? "true":"false", assoc);
397                simpleModel.addSimpleAssociation(assoc);
398                // Create a CMR between these Entity EJBs.
399
}
400
401          }
402       }
403
404    }
405
406     /** Create a class with all configuration settings for JAG. */
407     private void createConfigClass(Config config, App app, Paths paths, SimpleModel simpleModel) {
408         String JavaDoc rootPackage = app.rootPackageText.getText();
409         String JavaDoc projectName = app.descriptionText.getText();
410         String JavaDoc logging = app.getLogFramework();
411         SimpleUmlClass dsClass = new SimpleUmlClass("Config" + projectName, SimpleModelElement.PUBLIC);
412         simpleModel.setStereoType(JagUMLProfile.STEREOTYPE_CLASS_JAG_CONFIG, dsClass);
413
414         // Config part.
415
simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_MODEL_AUTHOR, config.getAuthorText(), dsClass);
416         simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_MODEL_VERSION, config.getVersionText(), dsClass);
417         simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_MODEL_COMPANY, config.getCompanyText(), dsClass);
418         simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_MODEL_TEMPLATE,
419                 config.getTemplate().getTemplateDir().toString(), dsClass);
420         if (config.getTemplateSettings().get(JagGenerator.TEMPLATE_APPLICATION_SERVER) != null) {
421             simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_CONFIG_APPSERVER,
422                 (String JavaDoc) config.getTemplateSettings().get(JagGenerator.TEMPLATE_APPLICATION_SERVER), dsClass);
423         }
424         if (config.getTemplateSettings().get(JagGenerator.TEMPLATE_USE_RELATIONS) != null) {
425             simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_CONFIG_USE_RELATIONS,
426                 (String JavaDoc) config.getTemplateSettings().get(JagGenerator.TEMPLATE_USE_RELATIONS), dsClass);
427         }
428        if (config.getTemplateSettings().get(JagGenerator.TEMPLATE_USE_MOCK) != null) {
429            simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_CONFIG_USE_MOCK,
430                (String JavaDoc) config.getTemplateSettings().get(JagGenerator.TEMPLATE_USE_MOCK), dsClass);
431        }
432         if (config.getTemplateSettings().get(JagGenerator.TEMPLATE_USE_JAVA5) != null) {
433             simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_CONFIG_USE_JAVA5,
434                 (String JavaDoc) config.getTemplateSettings().get(JagGenerator.TEMPLATE_USE_JAVA5), dsClass);
435         }
436         if (config.getTemplateSettings().get(JagGenerator.TEMPLATE_WEB_TIER) != null) {
437         simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_CONFIG_WEB_TIER,
438                 (String JavaDoc) config.getTemplateSettings().get(JagGenerator.TEMPLATE_WEB_TIER), dsClass);
439         }
440
441         if (config.getTemplateSettings().get(JagGenerator.TEMPLATE_BUSINESS_TIER) != null) {
442         simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_CONFIG_BUSINESS_TIER,
443                 (String JavaDoc) config.getTemplateSettings().get(JagGenerator.TEMPLATE_BUSINESS_TIER), dsClass);
444         }
445        if (config.getTemplateSettings().get(JagGenerator.TEMPLATE_SERVICE_TIER) != null) {
446           simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_CONFIG_SERVICE_TIER,
447                   (String JavaDoc) config.getTemplateSettings().get(JagGenerator.TEMPLATE_SERVICE_TIER), dsClass);
448        }
449
450         // app part.
451
simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_MODEL_APPLICATION_NAME, app.getName().toString(), dsClass);
452         simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_MODEL_DESCRIPTION, projectName, dsClass);
453         simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_MODEL_APPLICATION_VERSION, app.getVersion().toString(), dsClass);
454         simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_MODEL_ROOT_PACKAGE, rootPackage, dsClass);
455         simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_MODEL_LOGGING, logging, dsClass);
456         simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_MODEL_DATE_FORMAT, app.getDateFormat().toString(), dsClass);
457         simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_MODEL_TIMESTAMP_FORMAT, app.getTimestampFormat().toString(), dsClass);
458
459         // path part.
460
simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_MODEL_SERVICE_PATH, paths.getServiceOutput(), dsClass);
461         simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_MODEL_EJB_PATH, paths.getEjbOutput(), dsClass);
462         simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_MODEL_WEB_PATH, paths.getWebOutput(), dsClass);
463         simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_MODEL_JSP_PATH, paths.getJspOutput(), dsClass);
464         simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_MODEL_TEST_PATH, paths.getTestOutput(), dsClass);
465         simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_MODEL_CONFIG_PATH, paths.getConfigOutput(), dsClass);
466         simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_MODEL_SWING_PATH, paths.getSwingOutput(), dsClass);
467         simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_MODEL_MOCK_PATH, paths.getMockOutput(), dsClass);
468         simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_MODEL_HIBERNATE_PATH, paths.getHibernateOutput(), dsClass);
469
470         simpleModel.addSimpleClassifier(dsClass);
471     }
472
473
474    /** Create a class with the datasource definition */
475    private void createDataSource(Datasource ds, SimpleModel simpleModel) {
476       SimpleUmlClass dsClass = new SimpleUmlClass("DataSource" + simpleModel.getName(), SimpleModelElement.PUBLIC);
477       simpleModel.setStereoType(JagUMLProfile.STEREOTYPE_CLASS_DATA_SOURCE, dsClass);
478       simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_CLASS_DATA_SOURCE_JDBC_URL, ds.getJdbcUrl().toString(), dsClass);
479       simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_CLASS_DATA_SOURCE_MAPPING,
480             ds.getDatabase().getTypeMapping(), dsClass);
481       simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_CLASS_DATA_SOURCE_USER_NAME, ds.getUserName().toString(), dsClass);
482       simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_CLASS_DATA_SOURCE_PASSWORD, ds.getPassword().toString(), dsClass);
483       simpleModel.addTaggedValue(JagUMLProfile.TAGGED_VALUE_CLASS_DATA_SOURCE_JNDI_NAME, ds.getJndiName().toString(), dsClass);
484       simpleModel.addSimpleClassifier(dsClass);
485    }
486
487    /**
488     *
489     * Define the basic types and add them to the model if they don't already exist
490     * We assume the types are in the java.lang subpackage...
491     *
492     * @param simpleModel the uml model to create
493     * @return HashMap with a mapping of the different types.
494     */

495    public HashMap createBasicTypes(SimpleModel simpleModel) {
496       if (typeMappings != null) {
497          return typeMappings;
498       }
499       typeMappings = new HashMap();
500
501       // First create the required uml packages.
502
javaLangPackage = simpleModel.addSimpleUmlPackage("java.lang");
503       javaUtilPackage = simpleModel.addSimpleUmlPackage("java.util");
504       javaSqlPackage = simpleModel.addSimpleUmlPackage("java.sql");
505       javaMathPackage = simpleModel.addSimpleUmlPackage("java.math");
506
507
508       // Create the default types:
509
HashMap basicTypes = new HashMap();
510
511       basicTypes.put(stringType, stringValue);
512       basicTypes.put(intType, intValue);
513       basicTypes.put(byteType, byteValue);
514       basicTypes.put(shortType, shortValue);
515       basicTypes.put(floatType, floatValue);
516       basicTypes.put(doubleType, doubleValue);
517       basicTypes.put(longType, longValue);
518
519       Set basicTypesSet = basicTypes.keySet();
520       for (Iterator iterator = basicTypesSet.iterator(); iterator.hasNext();) {
521          String JavaDoc key = (String JavaDoc) iterator.next();
522          SimpleUmlClass simpleUmlClass = new SimpleUmlClass((String JavaDoc) basicTypes.get(key), SimpleModelElement.PUBLIC);
523          javaLangPackage.addSimpleClassifier(simpleUmlClass);
524          typeMappings.put(key, simpleUmlClass);
525       }
526       basicTypes.put(bigDecimalType, bigDecimalValue);
527       basicTypes.put(sqlDateType, sqlDateValue);
528       basicTypes.put(sqlTimestampType, sqlTimestampValue);
529       basicTypes.put(sqlUtilType, sqlUtilValue);
530       // Make string the default type.
531
typeMappings.put(defaultType, typeMappings.get(stringType));
532
533       // Add bigdecimals
534
SimpleUmlClass simpleUmlClass = new SimpleUmlClass((String JavaDoc) basicTypes.get(bigDecimalType), SimpleModelElement.PUBLIC);
535       javaMathPackage.addSimpleClassifier(simpleUmlClass);
536       typeMappings.put(bigDecimalType, simpleUmlClass);
537
538       simpleUmlClass = new SimpleUmlClass((String JavaDoc) basicTypes.get(sqlDateType), SimpleModelElement.PUBLIC);
539       javaSqlPackage.addSimpleClassifier(simpleUmlClass);
540       typeMappings.put(sqlDateType, simpleUmlClass);
541
542       simpleUmlClass = new SimpleUmlClass((String JavaDoc) basicTypes.get(sqlTimestampType), SimpleModelElement.PUBLIC);
543       javaSqlPackage.addSimpleClassifier(simpleUmlClass);
544       typeMappings.put(sqlTimestampType, simpleUmlClass);
545
546       simpleUmlClass = new SimpleUmlClass((String JavaDoc) basicTypes.get(sqlUtilType), SimpleModelElement.PUBLIC);
547       javaUtilPackage.addSimpleClassifier(simpleUmlClass);
548       typeMappings.put(sqlUtilType, simpleUmlClass);
549
550       return typeMappings;
551    }
552
553    /**
554     *
555     * @param args
556     */

557    public static void main(String JavaDoc[] args) {
558       if (args.length == 1) {
559          (new Jag2UMLGenerator()).generateXMI(args[0]);
560       } else {
561          log("Pass a JAG xml file as argument!");
562       }
563
564
565    }
566
567    private static void log(String JavaDoc message) {
568       log.info(message);
569       if (logger == null) {
570          log.info(message);
571       }
572    }
573 }
574
575 /*
576         $Log: Jag2UMLGenerator.java,v $
577         Revision 1.23 2006/03/11 13:44:04 ekkelenkamp
578         Don't write the Diagram information, it's not very compatible.
579
580         Revision 1.22 2006/02/17 12:49:15 ekkelenkamp
581         Added sql timestamp
582
583         Revision 1.21 2005/12/24 13:35:48 ekkelenkamp
584         added new tagged values.
585
586         Revision 1.20 2005/09/23 07:23:58 ekkelenkamp
587         export service tier selection
588
589         Revision 1.19 2005/07/29 07:47:05 ekkelenkamp
590         Don't use EntityRef
591
592         Revision 1.18 2005/07/15 21:27:50 ekkelenkamp
593         no spring path
594
595         Revision 1.17 2005/06/09 19:09:54 ekkelenkamp
596         java5 support.
597
598         Revision 1.16 2005/03/04 21:07:22 ekkelenkamp
599         Business method support for UML
600
601         Revision 1.15 2005/03/04 15:17:52 ekkelenkamp
602         business methods are in progress now.
603
604         Revision 1.14 2005/02/04 09:35:05 ekkelenkamp
605         Use constants where possible
606
607         Revision 1.13 2005/02/04 08:20:42 ekkelenkamp
608         UML synchronize up-to-date.
609
610         Revision 1.12 2005/01/19 21:44:58 ekkelenkamp
611         uml support for many-to-one relations and bidirectionality.
612
613         Revision 1.11 2004/12/27 12:55:16 ekkelenkamp
614         Support for business methods.
615
616         Revision 1.10 2004/12/23 12:25:52 ekkelenkamp
617         Support for business methods.
618
619         Revision 1.9 2004/11/27 23:50:54 ekkelenkamp
620         Improved UML/JAG synchronization.
621
622         Revision 1.8 2004/11/27 19:30:07 ekkelenkamp
623         Improved UML/JAG synchronization.
624
625         Revision 1.7 2004/11/27 07:50:03 ekkelenkamp
626         Improved UML/JAG synchronization.
627
628         Revision 1.6 2004/11/26 22:36:13 ekkelenkamp
629         export all project settings to a Config class.
630
631         Revision 1.5 2004/03/28 11:55:34 ekkelenkamp
632         tagged values on model
633
634         Revision 1.4 2003/12/09 10:21:44 oconnor_m
635         3.1 release - generic DB support and jag-config XML
636
637         Revision 1.3 2003/11/25 15:10:30 oconnor_m
638         support for importing/exporting from/to UML model via XMI
639
640         Revision 1.2 2003/11/14 09:44:17 ekkelenkamp
641         First functional version
642
643         Revision 1.1 2003/11/02 14:01:31 ekkelenkamp
644         Initial version of UML support in Jag
645
646 */
Popular Tags