ontomde-java-frontend 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,920 @@
1
+ #:include: ../../README.txt
2
+ #:include: command.rdoc
3
+ #
4
+ #
5
+ #Command line front end for ontomde-uml2-java generator.
6
+
7
+ require 'optparse'
8
+ require 'ontomde-core'
9
+ require 'ontomde-uml2'
10
+ require 'ontomde-uml2-java'
11
+ require 'ontomde-java-frontend'
12
+
13
+ # Flush output automatically
14
+ # Added to solve a bug where
15
+ # after an external program is executed,
16
+ # stdout was no longer updated.
17
+ STDOUT.sync = true
18
+
19
+ OR_MAPPING= %w[jpox,jpa]
20
+ OR_MAPPING_ALIASES = { "jdo" => "jpox", "jpa" => "hibernate" ,"none" => "none"}
21
+ DB_TYPE_DISCRIMINATOR=%w[:default,:int]
22
+ DB_TYPE_DISCRIMINATOR_ALIASES={"int"=>:int,"default"=>:default}
23
+
24
+ module Kernel
25
+ DEPS= ['ontomde-uml2-jpdl', 'ontomde-uml2-struts', 'ontomde-uml2-ejb2', 'ontomde-uml2-jdo', 'ontomde-uml2-jpa', 'ontomde-uml2-kb', 'ontomde-uml2-kbjava','ontomde-uml2-flex','ontomde-inspector']
26
+ def require_deps(f)
27
+ # make sure DEPS lists every libs
28
+ if !DEPS.include?(f)
29
+ raise Exception.new("Internal error: require '#{f}' not declared in DEPS}")
30
+ end
31
+
32
+ begin
33
+ require f
34
+ rescue Exception => e
35
+ puts "*"*47
36
+ puts "** READ THIS ** "*3
37
+ puts "** An error occured while loading module #{f}"
38
+ puts "** This is most likely because this module is not installed on this system."
39
+ puts "** Please use the following command for installing #{f} module :"
40
+ puts "$ set HTTP_PROXY=http://yourProxy:yourPort"
41
+ puts "$ gem install #{f}"
42
+ puts "*"*47
43
+ raise e
44
+ end
45
+ end
46
+ end
47
+
48
+ # run java generator command line front end
49
+ # startupFile is the name of the calling script.
50
+ def runJavaFrontEnd(startupFile)
51
+ puts "Starting ontomde v. #{Ontomde::Java::Frontend::VERSION}"
52
+
53
+ h3="## "
54
+ options = {}
55
+ options[:testRelativeDir]="src/test/java"
56
+ options[:jspUseXmdaTaglib]=true
57
+ options[:backTrace] = false
58
+ options[:selfTestAndExit] = false
59
+ options[:verbose]=false
60
+ options[:targetDir]="."
61
+ options[:javaRelativeDir]="./src/java/"
62
+ options[:webResourcesDir]=options[:javaRelativeDir]
63
+ options[:flex]=false
64
+ options[:mysql]=false
65
+ options[:nt]=[]
66
+ options[:load]=[]
67
+ options[:dryRun]=false
68
+ options[:withAutoImplementProperty]=false
69
+ options[:withEnumAsString]=false
70
+ options[:withAutoImplementOperation]=false
71
+ options[:withMultipleInheritance]=true
72
+ options[:strutsActionFormPackage]="struts"
73
+ options[:enumAssignableSubPackage]="assignable"
74
+ options[:withEnumAssignable]=true
75
+ options[:withGenerateMethodForm]=false
76
+ options[:makeCompositionBiNavigable]=false
77
+ options[:salvage]=false
78
+ options[:useUnzip]=false
79
+ options[:messageCheck]=true
80
+ options[:struts]=false
81
+ options[:ejb2]=false
82
+ options[:security]=false
83
+ options[:javadoc]=true
84
+ options[:installRessources]=true
85
+ options[:target_ejbconf] = nil
86
+ options[:autoNewFileCreation]=true
87
+ options[:webContentRelativeDir]="./WebContent/"
88
+ options[:javaClassRelDir]=nil
89
+ options[:generateAntBuildFile]=false
90
+ options[:silentlyForceUnknownDatatypeToString]=false
91
+ options[:allowAutomaticCodeDeletion]=false
92
+ options[:generateCompositionDiagram] = false
93
+ options[:checkForAbstractAndInheritance]=false
94
+ options[:generateXMLStrutsForm]=false
95
+ options[:java_addJavaEnumInterface]=false
96
+ options[:silentlyTruncateTableName]=false
97
+ options[:benchmark]=false
98
+ options[:profile]=false
99
+ options[:logFileWrite]=false
100
+ options[:javaFilePathRegexp]=[]
101
+ options[:bpm_javaSubPackage]="bpm"
102
+ options[:struts_useSpring]=true
103
+ options[:db_useExtraTypeParameterForFindAll]=true
104
+ options[:bpm_addPingNode]=false
105
+ options[:jpaConfigDir] = nil
106
+
107
+ options[:rel_mapping] = "none"
108
+ options[:groovyExperimental]=false
109
+ options[:daemon] = false
110
+
111
+ options[:dbTypeDiscriminator]=DB_TYPE_DISCRIMINATOR[0]
112
+ options[:dbDiscriminatorCacheRelFile]="dbDiscriminatorCache.rb"
113
+ options[:ddl_mode]="create"
114
+ options[:simulateNotImplementedMethods]=false
115
+ options[:db_useStereotypeMarker]=false
116
+ options[:versionSignature]=nil
117
+ #options[:db_stereotypeMarkerName]=false
118
+ options[:enableTestData] = false
119
+ options[:testDataRDF] = nil
120
+ options[:testDataRDFS] = nil
121
+
122
+
123
+ options[:updateKB]=false
124
+ options[:kbTargetfile]="defaultKbTargetFile"
125
+
126
+ options[:excludeNonTestFiles]=false
127
+ options[:includeTestFiles]=true
128
+
129
+ options[:java_failIfNonUniqueName]=true
130
+
131
+ options[:rsm6WebDocURI]=""
132
+ options[:jpdl]=[]
133
+ options[:ntbpm]=[]
134
+ options[:bpm]=false
135
+ options[:skipNoReverseMarker]=false
136
+
137
+ options[:derby]=false
138
+
139
+ # options[:hib_dialect]="org.hibernate.dialect.MySQL5InnoDBDialect"
140
+ #
141
+ #
142
+ # options[:hib_dialect]="org.hibernate.dialect.MySQL5InnoDBDialect"
143
+ # options[:hib_connection_driver_class]="com.mysql.jdbc.Driver"
144
+ # options[:hib_connection_url]=nil
145
+ # options[:hib_connection_username]="testuser"
146
+ # options[:hib_connection_password]="testpwd"
147
+ #
148
+ # options[:hib_dialect]="org.hibernate.dialect.DerbyDialect"
149
+ # options[:hib_connection_driver_class]="org.apache.derby.jdbc.EmbeddedDriver"
150
+ # options[:hib_connection_url]="jdbc:derby:realty;create=true"
151
+ # options[:hib_connection_username]="testuser"
152
+ # options[:hib_connection_password]="testpwd"
153
+
154
+
155
+ #cf: http://www.ruby-doc.org/core/classes/OptionParser.html
156
+ OptionParser.new do |opts|
157
+ opts.banner =<<ENDHELP
158
+ #{File.basename(startupFile)} is a command line utility to generate Java Code from a UML2 model stored in a UML2/RDF model file.
159
+
160
+ This command line is a front end to OntoMDE generator offering a set of pre-packaged, yet powerfull generation rules.
161
+
162
+ This Java code generator is full featured and covers many UML features (incremental generation, loading of additional MDA transformation rules, ...)
163
+
164
+ #{h3}Example: generate java code from one model file
165
+ $ #{File.basename(startupFile)} --nt myUmlModel.emx.nt
166
+
167
+ #{h3}Example: generate java code in a custom directory
168
+ $ #{File.basename(startupFile)} --nt myUmlModel.emx.nt --target ./src
169
+
170
+ #{h3}Usage:
171
+ #{File.basename(startupFile)} [options]
172
+ ENDHELP
173
+
174
+ opts.separator "#{h3}Source and Target options :"
175
+ opts.separator ""
176
+
177
+ opts.on("--nt FILE1.nt,FILE2.nt, ...",Array,": Source UML2 model(s) (exported from a UML case tool)","default: --nt #{options[:nt]}") do |v|
178
+ options[:nt].concat(v)
179
+ end
180
+ opts.separator ""
181
+
182
+ opts.on("--ntList FILE1,FILE2,...",Array,": File containing a list of nt file to be loaded") do |v|
183
+ v.each { |fn| File.open(fn) { |f| f.each_line { |line|
184
+ next if line.empty? || line[0]=='#'[0]
185
+ options[:nt]<<( "#{File.dirname(fn)}/#{line.chomp}" )
186
+ }}}
187
+ end
188
+
189
+ opts.on("-l","--load FILE1.rb,File2.rb",Array,": Optionnal ruby extension or setup file (used as well new datatype declaration mappings, as for any generation customisation)","default: --load #{options[:load]}" ) do |v|
190
+ options[:load].concat(v)
191
+ end
192
+
193
+ opts.on("-l","--loadDir DIRECTORY1,..",Array,": Optionnal ruby extension or setup file","(used as well new datatype declaration mappings, as for any generation customisation)","default: --loadDir " ) do |v|
194
+ v.each { |d|
195
+ Dir.foreach(d) { |f|
196
+ next unless f =~ /\.rb$/
197
+ puts "f=#{f}"
198
+ options[:load]<<("#{d}/#{f}")
199
+ }
200
+ }
201
+ end
202
+
203
+ opts.on("--loadList FILE_list1,FILE_list2, ...",Array,": File containing a list of ruby file to be loaded","(same as --load on each item)") do |v|
204
+ v.each { |fn| File.open(fn) { |f| f.each_line { |line|
205
+ next if line.empty? || line[0]=='#'[0]
206
+ options[:load]<<( "#{File.dirname(fn)}/#{line.chomp}" )
207
+ }}}
208
+ end
209
+
210
+ opts.on("--javaRelativeDir DIRECTORY",": Relative destination directory for generated java files, properties, ...","relative to --targetDir","default: --javaRelativeDir #{options[:javaRelativeDir]}") do |v|
211
+ options[:javaRelativeDir] = v
212
+ end
213
+
214
+ opts.on("--webResourcesDir DIRECTORY",": Relative destination directory for generated Web Resources properties, ...","relative to --targetDir","default: --webResourcesDir #{options[:webResourcesDir]}") do |v|
215
+ options[:webResourcesDir] = v
216
+ end
217
+
218
+ opts.on("--javaFilePathRegexp REGEXP@DIRECTORY",": Relative destination directory for generated java files, properties, ...","relative to --targetDir","default: --javaFilePathRegexp #{options[:javaFilePathRegexp]}") do |v|
219
+ re=Regexp.new(v.split('@')[0])
220
+ p=v.split('@')[1]
221
+ options[:javaFilePathRegexp]<<([re,p])
222
+ end
223
+
224
+ opts.on("--targetDir DIRECTORY",": Target generation root directory","default: --targetDir #{options[:targetDir]}") do |v|
225
+ options[:targetDir] = v
226
+ end
227
+
228
+ opts.separator "#{h3}Model pre-processors options :"
229
+ opts.separator ""
230
+
231
+ opts.on("--[no-]withMultipleInheritance",": Apply pattern to map UML model with multiple inheritance to Java compliant model."," (Class inheritance is mapped to interface implementation)",%{default: --#{options[:withMultipleInheritance]?"":"no-"}withMultipleInheritance}) do |v|
232
+ options[:withMultipleInheritance] = v
233
+ end
234
+
235
+ opts.on("-p","--[no-]withAutoImplementProperty",": Generate automatically missing property in concrete class implementing an interface uml properties"," (feature introduced for model redondancy reduction)","default: --#{options[:withAutoImplementProperty]?'':'no-'}withAutoImplementProperty") do |v|
236
+ options[:withAutoImplementProperty] = v
237
+ end
238
+
239
+ opts.on("-o","--[no-]withAutoImplementOperation",": Generate automatically missing operations in concrete class implementing an interface"," (feature introduced for model redondancy reduction)","default: --#{options[:withAutoImplementOperation]?'':'no-'}withAutoImplementOperation") do |v|
240
+ options[:withAutoImplementOperation] = v
241
+ end
242
+
243
+ opts.on("--[no-]makeCompositionBiNavigable",": Force compositions to be bi-navigable","(Feature introduced for web persistence handling)",%{default: --#{options[:makeCompositionBiNavigable]?"":"no-"}makeCompositionBiNavigable}) do |v|
244
+ options[:makeCompositionBiNavigable] = v
245
+ end
246
+
247
+
248
+ opts.separator "#{h3}Model enhancement options:"
249
+ opts.separator ""
250
+
251
+ opts.on("-a","--[no-]withEnumAssignable",": Generates for each class and interfaces an enum containing assignable class","(required for creators)","NOTE: also disable generation of createAndAdd methods",%{default: --#{options[:withEnumAssignable]?"":"no-"}withEnumAssignable}) do |v|
252
+ options[:withEnumAssignable] = v
253
+ end
254
+
255
+ opts.on("--enumAssignableSubPackage SUBDIR",": Directory where enumAssignable artefacts wil be generated",%{default: --enumAssignableSubPackage #{options[:enumAssignableSubPackage]} }) do |v|
256
+ options[:enumAssignableSubPackage] = v
257
+ end
258
+
259
+
260
+ opts.on("-f","--[no-]withGenerateMethodForm",": Apply a pattern to generate a form (as a class) for every method of the model.","(Feature introduced for web form handling)",%{default: --#{options[:withGenerateMethodForm]?"":"no-"}withGenerateMethodForm}) do |v|
261
+ options[:withGenerateMethodForm] = v
262
+ end
263
+
264
+
265
+ opts.separator "#{h3}Pre-Java 5 compatibility options:"
266
+ opts.on("-e","--[no-]withEnumAsString",": Generate additional string getter and setter","for properties with an enum type, so enums property can be manipulated as if it was a string"," (feature introduced"," for Flex interoperability)","default: --#{options[:withEnumAsString]?'':'no-'}withEnumAsString") do |v|
267
+ options[:withEnumAsString] = v
268
+ end
269
+
270
+ opts.separator ""
271
+ opts.separator "#{h3} Tests Data options:"
272
+ opts.separator ""
273
+
274
+ opts.on("--updateKB",": Create or update protege 2000 knowledge base project (for creating tests data and junit tests bases on use cases.)","default: --#{options[:updateKB]?'':'no-'}updateKB") do |v|
275
+ options[:updateKB] = v
276
+ end
277
+
278
+ opts.on("--kbTargetfile FILENAME _WITHOUT_EXTENSION",": Protege data test file to be generated or update.","This generates a protege/2000 project file to be used for editing tests data attached to test instances.","default: --kbTargetfile #{options[:kbTargetfile]}") do |v|
279
+ options[:kbTargetfile] = v
280
+ end
281
+
282
+
283
+ opts.on("--[no-]excludeNonTestFiles",": Do not generate files which are not test files","junit,data,...","default: --#{options[:excludeNonTestFiles]?'':'no-'}excludeNonTestFiles") do |v|
284
+ options[:excludeNonTestFiles] = v
285
+ end
286
+
287
+ opts.on("--[no-]includeTestFiles",": Include test files in generation","junit,data,...","default: --#{options[:includeTestFiles]?'':'no-'}includeTestFiles") do |v|
288
+ options[:includeTestFiles] = v
289
+ end
290
+
291
+ # opts.on("--[no-]enableTestData","enable data tests options",%{default: --#{options[:enableTestData]?"":"no-"}enableTestData}) do |v|
292
+ # options[:enableData] = v
293
+ # end
294
+
295
+ opts.on("--testDataRDF RDFFILE",": Data file in RDF format") do |v|
296
+ options[:enableTestData] = true
297
+ options[:testDataRDF] = v
298
+ end
299
+ opts.on("--jpaConfigDir JPA_CONFIG_DIR",": Directory for the persistence.xml") do |v|
300
+ options[:jpaConfigDir] = v
301
+ end
302
+ opts.on("--testDataRDFS RDFSFILE",": Data file format in RDFS format","If absent, this RDFSFILE will be guessed from --dataRDF") do |v|
303
+ options[:enableTestData] = true
304
+ options[:testDataRDFS] = v
305
+ end
306
+
307
+ opts.separator "#{h3}Access control enhancement options:"
308
+ opts.separator ""
309
+
310
+ opts.on("--[no-]security",": Activate authentification and access control",%{default: --#{options[:security]?"":"no-"}security}) do |v|
311
+ options[:security] = v
312
+ end
313
+
314
+
315
+ opts.separator "#{h3}BPM enhancement options:"
316
+ opts.separator ""
317
+
318
+ opts.on("--[no-]bpm",": Activate bpm processing",%{default: --#{options[:bpm]?"":"no-"}bpm}) do |v|
319
+ options[:bpm] = v
320
+
321
+ # if bpm is set, J2EE is mandatory (spring use is deactivated)
322
+ options[:struts_useSpring]=!v
323
+ end
324
+
325
+ # opts.on("--ntBPM FILE1.nt,FILE2.nt, ...",Array,"Source BPM model(s) (exported from a BPM modeling tool in nt format)","default: --ntBPM #{options[:ntBPM]}") do |v|
326
+ # options[:ntBPM].concat(v)
327
+ # end
328
+
329
+ opts.on("--jpdl FILE1.nt,FILE2.nt, ...",Array,": Source jpdl xml BPM model(s)","default: --jpdl #{options[:jpdl]}") do |v|
330
+ options[:bpm]=true
331
+ options[:jpdl].concat(v)
332
+ end
333
+
334
+ opts.on("--jpdlList FILE_list1,FILE_list2, ...",Array,": File containing a list of jpdl file to be loaded") do |v|
335
+ options[:bpm]=true
336
+ v.each { |fn| File.open(fn) { |f| f.each_line { |line|
337
+ next if line.empty? || line[0]=='#'[0]
338
+ options[:jpdl]<<( "#{File.dirname(fn)}/#{line.chomp}" )
339
+ }}}
340
+ end
341
+
342
+ opts.on("--bpm_javaSubPackage [SUBPACKAGE]",": Relative sub package where will be generated service class","(enums for transitions,...)",%{default: --bpm_javaSubPackage #{options[:bpm_javaSubPackage]}}) do |v|
343
+ options[:bpm_javaSubPackage] = v
344
+ end
345
+
346
+ opts.separator ""
347
+ opts.separator "#{h3}Flex integration options:"
348
+ opts.separator ""
349
+
350
+ opts.on("--[no-]generateXMLStrutsForm",": Add XML form serializer.","feature introduced for FLEX",%{default: --#{options[:generateXMLStrutsForm]?"":"no-"}generateXMLStrutsForm}) do |v|
351
+ options[:generateXMLStrutsForm] = v
352
+ end
353
+
354
+ opts.on("--[no-]flex",": Generate flex code",%{default: --#{options[:flex]?"":"no-"}flex}) do |v|
355
+ options[:flex] = v
356
+ # force generateXMLStrutsForm if flex is activated
357
+ options[:generateXMLStrutsForm] = v if v
358
+ end
359
+
360
+ opts.separator ""
361
+ opts.separator "#{h3}Database persistence options:"
362
+ opts.separator ""
363
+
364
+ code_list = (OR_MAPPING_ALIASES.keys + OR_MAPPING).join(',')
365
+ opts.on("-m","--relational_mapping objr", OR_MAPPING, OR_MAPPING_ALIASES, ": Select object/relation library", " (#{code_list})","default: --relation_mapping #{options[:rel_mapping]}") do |encoding|
366
+ options[:rel_mapping] = encoding
367
+ end
368
+
369
+ opts.on("--[no-]db_useStereotypeMarker",": Are persistent capable classes marked with a stereotype",%{default: --#{options[:db_useStereotypeMarker]?"":"no-"}db_useStereotypeMarker}) do |v|
370
+ options[:db_useStereotypeMarker] = v
371
+ end
372
+
373
+ opts.on("--[no-]silentlyTruncateTableName",": Silently truncate generated table name to maximum sgbd allowed length.",%{default: --#{options[:silentlyTruncateTableName]?"":"no-"}silentlyTruncateTableName}) do |v|
374
+ options[:silentlyTruncateTableName] = v
375
+ end
376
+
377
+ opts.on("-d","--ddl_mode [MODE]",": SGBD schema creation mode","(create/update/...)",%{default: --ddl_mode #{options[:ddl_mode]}}) do |v|
378
+ options[:ddl_mode] = v
379
+ end
380
+
381
+ opts.on("-s","--[no-]simulateNotImplementedMethods",": Replace unimplemeted method with a simulation method.",%{default: --#{options[:simulateNotImplementedMethods]?"":"no-"}simulateNotImplementedMethods}) do |v|
382
+ options[:simulateNotImplementedMethods] = v
383
+ end
384
+
385
+ opts.on("-s","--[no-]java_addSuggester",": Add or remove the suggester method.",%{default: --#{options[:java_addSuggester]?"":"no-"}java_addSuggester}) do |v|
386
+ options[:java_addSuggester] = v
387
+ end
388
+
389
+
390
+ code_list2 = (DB_TYPE_DISCRIMINATOR_ALIASES.keys + DB_TYPE_DISCRIMINATOR).join(',')
391
+ opts.on("--dbTypeDiscriminator [objr]", DB_TYPE_DISCRIMINATOR, DB_TYPE_DISCRIMINATOR_ALIASES, ": Column type used to store an object type in database.", " (#{code_list2})","default: --dbTypeDiscriminator #{options[:dbTypeDiscriminator]}") do |encoding|
392
+ options[:dbTypeDiscriminator] = encoding
393
+ end
394
+
395
+ opts.on("--dbDiscriminatorCacheRelFile [RBFILE]",": File where db discriminator will be saved","to allow subsquent generation to use the same ids","NOTE: generated file will not be used, unless specified using --load option",%{default: --dbDiscriminatorCacheRelFile #{options[:dbDiscriminatorCacheRelFile]}}) do |v|
396
+ options[:dbDiscriminatorCacheRelFile] = v
397
+ end
398
+
399
+ opts.on("--[no-]mysql",": Optimize for mysql.",%{default: --#{options[:mysql]?"":"no-"}mysql}) do |v|
400
+ options[:mysql] = v
401
+ end
402
+ opts.on("--[no-]derby",": Optimize for derby.",%{default: --#{options[:derby]?"":"no-"}derby}) do |v|
403
+ options[:derby] = v
404
+ end
405
+
406
+ opts.separator ""
407
+ opts.separator "#{h3}Webapp options:"
408
+
409
+ opts.on("--[no-]struts",": Enable struts generation.","default: --#{options[:struts]?'':'no-'}struts") do |v|
410
+ options[:struts] = v
411
+ options[:java_addJavaEnumInterface]=true
412
+ end
413
+
414
+ opts.on("--[no-]java_addJavaEnumInterface",": Add Enum Interface.","default: --#{options[:java_addJavaEnumInterface]?'':'no-'}java_addJavaEnumInterface") do |v|
415
+ options[:java_addJavaEnumInterface] = v
416
+ end
417
+ opts.on("-u","--[no-]useUnzip",": Use unzip to install resources.","default: --#{options[:useUnzip]?'':'no-'}useUnzip") do |v|
418
+ options[:useUnzip] = v
419
+ end
420
+
421
+ opts.on("-c","--[no-]message-check",": Check message ressources consistency.","default: --#{options[:messageCheck]?'':'no-'}message-check") do |v|
422
+ options[:messageCheck] = v
423
+ end
424
+
425
+ opts.on("--webContentRelativeDir [DIRECTORY]",": Directory where webapp artefacts wil be generated (WEB-INF, META-INF, JSP, ...)",%{default: --webContentRelativeDir #{options[:webContentRelativeDir]}}) do |v|
426
+ options[:webContentRelativeDir] = v
427
+ end
428
+
429
+ opts.on("--strutsActionFormPackage [SUBPACKAGE]",": SubPackage where to generate struts related classes",%{default: --strutsActionFormPackage #{options[:strutsActionFormPackage]}}) do |v|
430
+ options[:strutsActionFormPackage] = v
431
+ end
432
+
433
+
434
+
435
+
436
+ opts.separator ""
437
+ opts.separator "#{h3}EJB options:"
438
+ opts.on("--[no-]ejb2",": Enable ejb2 experimental processing","default: --#{options[:ejb2]?'':'no-'}ejb2") do |v|
439
+ options[:ejb2] = v
440
+ end
441
+
442
+ opts.on("-t","--target_ejbconf DIRECTORY",": Destination directory for generated files","default: --target_ejbconf #{options[:target_ejbconf]}") do |v|
443
+ options[:target_ejbconf] = v
444
+ end
445
+
446
+ opts.separator ""
447
+ opts.separator "#{h3}Misc. options:"
448
+ opts.on("--[no-]generateAntBuildFile",": Generates a default ant build file",%{default: --#{options[:generateAntBuildFile]?"":"no-"}generateAntBuildFile}) do |v|
449
+ options[:generateAntBuildFile] = v
450
+ end
451
+ opts.on("--versionSignature version",": Adds a version signature to generated code, so old cold will not compile.","(an implemented interface is added to class and interfaces)","default: --versionSignature #{options[:versionSignature]}") do |v|
452
+ options[:versionSignature] = v
453
+ end
454
+
455
+ opts.on("--[no-]skipNoReverseMarker",": Only write markers when reverse is already set to yes. Usefull to get rid of unused reverse zone and get a better code browsing experience.","default: --#{options[:skipNoReverseMarker]?'':'no-'}skipNoReverseMarker") do |v|
456
+ options[:skipNoReverseMarker] = v
457
+ end
458
+
459
+ opts.on("--[no-]silentlyForceUnknownDatatypeToString",": Silently map an unknown datatype to String. This feature should only be used for testing.",%{default: --#{options[:silentlyForceUnknownDatatypeToString]?"":"no-"}silentlyForceUnknownDatatypeToString}) do |v|
460
+ options[:silentlyForceUnknownDatatypeToString] = v
461
+ end
462
+
463
+ opts.on("--[no-]java_failIfNonUniqueName",": Stop generation immediately when a name unicitiy constraint failure is detected.",%{default: --#{options[:java_failIfNonUniqueName]?"":"no-"}java_failIfNonUniqueName}) do |v|
464
+ options[:java_failIfNonUniqueName] = v
465
+ end
466
+ opts.on("--[no-]groovyExperimental",": Add experimental groovy features (alpha).",%{default: --#{options[:groovyExperimental]?"":"no-"}groovyExperimental}) do |v|
467
+ options[:groovyExperimental] = v
468
+ end
469
+
470
+ opts.on("--[no-]daemon",": Run this script as daemon.",%{default: --#{options[:daemon]?"":"no-"}daemon}) do |v|
471
+ options[:daemon] = v
472
+ end
473
+
474
+ opts.separator "#{h3}Report generator:"
475
+
476
+ opts.on("--rsm6WebDocURI URL",": Base URL of RSM6 model html export","default: -- #{options[:rsm6WebDocURI]}") do |v|
477
+ options[:rsm6WebDocURI] = v
478
+ end
479
+
480
+
481
+ opts.on("--[no-]generateCompositionDiagram",": Generate a composition diagram (in graphviz dot file format)",%{default: --#{options[:generateCompositionDiagram]?"":"no-"}generateCompositionDiagram}) do |v|
482
+ options[:generateCompositionDiagram] = v
483
+ end
484
+
485
+ opts.on("--[no-]checkForAbstractAndInheritance",": Check model for abstract class with inheriting classes. Stop generation if an invalid class is encountered.",%{default: --#{options[:checkForAbstractAndInheritance]?"":"no-"}checkForAbstractAndInheritance}) do |v|
486
+ options[:checkForAbstractAndInheritance] = v
487
+ end
488
+
489
+ opts.separator "#{h3}Debug options:"
490
+
491
+ opts.on("--[no-]salvage",": Tries to handle highly defective model using best guess.","This feature is only intended for **quick demo** purposes.","Do not use for serious work!",%{default: --#{options[:salvage]?"":"no-"}salvage}) do |v|
492
+ options[:salvage] = v
493
+ end
494
+
495
+ opts.separator "#{h3}File creation options:"
496
+
497
+ opts.on("--[no-]autoNewFileCreation",": Allows generator to create new file on its own","This feature should be deactivated for project under version control so no new file can be added to a project without a developper approval.","This feature should also be deactivated to help keep track of file rename and allow project refactoring",%{default: --#{options[:autoNewFileCreation]?"":"no-"}autoNewFileCreation}) do |v|
498
+ options[:autoNewFileCreation] = v
499
+ end
500
+
501
+ opts.on("--[no-]allowAutomaticCodeDeletion",": Automatically ignore deleted protected code.","If disabled, generator will halt when reversed code is not reused in file newly created",%{default: --#{options[:allowAutomaticCodeDeletion]?"":"no-"}allowAutomaticCodeDeletion}) do |v|
502
+ options[:allowAutomaticCodeDeletion] = v
503
+ end
504
+
505
+ opts.on("-s","--[no-]dry-run",": Do a dry run without executing actions..","No file will be changed neither created on disk",%{default: --#{options[:dryRun]?"":"no-"}dry-run}) do |v|
506
+ options[:dryRun] = v
507
+ end
508
+
509
+ opts.on("-v", "--[no-]verbose", ":Run in verbose mode",%{default: --#{options[:verbose]?"":"no-"}verbose}) do |v|
510
+ options[:verbose] = v
511
+ end
512
+
513
+ opts.on("-v", "--[no-]benchmark", ": Run in benchmark mode","Feature usefull for optimizing generation time",%{default: --#{options[:benchmark]?"":"no-"}benchmark}) do |v|
514
+ options[:benchmark] = v
515
+ end
516
+
517
+ opts.on("-v", "--[no-]profile", ": Run in profile mode","Feature usefull for optimizing generation time",%{default: --#{options[:profile]?"":"no-"}profile}) do |v|
518
+ options[:profile] = v
519
+ require 'unprof' if options[:profile]
520
+ end
521
+
522
+ opts.on("-v", "--[no-]logFileWrite", ": Log file write access to screen",%{default: --#{options[:logFileWrite]?"":"no-"}logFileWrite}) do |v|
523
+ options[:logFileWrite] = v
524
+ end
525
+
526
+ opts.on("--[no-]selfTestAndExit", ": Self test and exit.","(loads every dependencies)","(Note: used by binary generator)",%{default: --#{options[:selfTestAndExit]?"":"no-"}selfTestAndExit}) do |v|
527
+ options[:selfTestAndExit] = v
528
+ end
529
+
530
+ opts.on("--[no-]backTrace", ": Display back trace on error.",%{default: --#{options[:backTrace]?"":"no-"}backTrace}) do |v|
531
+ options[:backTrace] = v
532
+ end
533
+
534
+
535
+
536
+ # No argument, shows at tail. This will print an options summary.
537
+ # Try it and see!
538
+ opts.on_tail("-h", "--help", ": Show this message") do
539
+ puts opts
540
+ exit 1
541
+ end
542
+
543
+ opts.on_tail("--help-rdoc", ": Show help in rdoc format") do
544
+ #x=opts.to_s.
545
+ #Set very wide columns to disable column wrapping
546
+ opts.summary_indent="~"*300
547
+ opts.summary_width=999
548
+ puts opts.to_s.
549
+ gsub(/^##/,'==').
550
+ gsub(/(default:)/,"\n\n<i>\\1</i>").
551
+ gsub(/^[^a-zA-Z\n]*(-[^:\n]*:)/,"===\\1\n\n").
552
+ gsub(/ */," ").
553
+ gsub(/ */," ").
554
+ gsub(/~~*/,"").
555
+ to_s
556
+
557
+
558
+ #gsub(/^[ \t]*-([a-zA-Z])[ \t]*\n/,'-\1 ,').
559
+ #gsub(/^[ \t]*/,'').
560
+
561
+ #gsub(/(^[^:\n]*--*[^\t\n ]*)/,"<b>\\1</b>").
562
+
563
+
564
+ exit 1
565
+ end
566
+
567
+ end.parse!
568
+
569
+ if (ARGV.length > 0) && options[:nt].nil?
570
+ log.warn("**********************")
571
+ log.warn("DEPRECATED SYNTAX USED")
572
+ log.warn("For help:")
573
+ log.warn("#{File.basename(startupFile)} --help")
574
+ log.warn("**********************")
575
+ options[:nt]=[]
576
+ ARGV.each { |f| options[:nt]<< f }
577
+ ARGV.clear
578
+ end
579
+
580
+ if ARGV.length > 0
581
+ raise Exception.new("An error occured while processing command line arguments. Unparseable paramater : '#{ARGV}'")
582
+ end
583
+
584
+ begin # of the rescue section
585
+
586
+
587
+
588
+ if options[:selfTestAndExit ]
589
+ # load every depencies
590
+ # used by rubyscript2exe to automatically populate
591
+ # en inventory of used dependencies
592
+ Kernel::DEPS.each { |deps|
593
+ require deps
594
+ }
595
+ exit 0
596
+ end
597
+
598
+ if options[:bpm]
599
+ require_deps 'ontomde-uml2-jpdl'
600
+ end
601
+
602
+ if options[:daemon]
603
+ puts "dameon"
604
+ require_deps 'ontomde-inspector'
605
+ end
606
+
607
+ if options[:struts] #||options[:useUnzip] || options[:messageCheck]
608
+ options[:withGenerateMethodForm]=true
609
+ require_deps 'ontomde-uml2-struts'
610
+ else
611
+ options[:installRessources]=false
612
+ options[:messageCheck]=false
613
+ options[:useUnzip]=false
614
+ end
615
+
616
+ if options[:testDataRDFS].nil? && options[:testDataRDF]=~/\.rdf$/
617
+ #guess rdfs file name
618
+ options[:testDataRDFS]=options[:testDataRDF].gsub(/\.rdf$/,'.rdfs')
619
+ end
620
+
621
+ if options[:ejb2]
622
+ require_deps 'ontomde-uml2-ejb2'
623
+ end
624
+
625
+ if options[:rel_mapping]=='jpox'
626
+ require_deps 'ontomde-uml2-jdo'
627
+ elsif options[:rel_mapping]=='hibernate'
628
+ require_deps 'ontomde-uml2-jpa'
629
+ elsif options[:rel_mapping]=='none'
630
+ # nop
631
+ else
632
+ m="unknown object/relational mapping library (#{options[:rel_mapping]})"
633
+ log.error(m)
634
+ raise Exception.new(m)
635
+ end
636
+
637
+ if options[:flex]
638
+ require_deps 'ontomde-uml2-flex'
639
+ end
640
+
641
+ if options[:enableTestData]
642
+ puts "ENABLED testDATA" if options[:verbose]
643
+ require_deps 'ontomde-uml2-kb'
644
+ require_deps 'ontomde-uml2-kbjava'
645
+ end
646
+ options[:db]=(options[:rel_mapping] != "none")
647
+ options[:javaDir]=options[:targetDir]+"/"+options[:javaRelativeDir]
648
+ if !options[:jpaConfigDir].nil?
649
+ options[:jpaConfigDir]=options[:targetDir]+"/"+options[:jpaConfigDir]
650
+ end
651
+ options[:webResourcesDir]=options[:targetDir]+"/"+options[:webResourcesDir]
652
+ options[:webContentDir]=options[:targetDir]+"/"+options[:webContentRelativeDir]
653
+ options[:load].each { |f|
654
+ puts "INFO : Loading custom transformation from #{f} in #{FileUtils.pwd}" if options[:verbose]
655
+ begin
656
+ # if require is used add "./" to avoid
657
+ # file not found from binary generated with rubyscript2exe
658
+ require "./#{f}"
659
+ rescue Exception => e
660
+ log.error %{
661
+ *************** ERROR ***************
662
+ ** Error processing
663
+ ** --load #{f}
664
+ ** (pwd=#{FileUtils.pwd})
665
+ ** Exception:
666
+ ** #{e}
667
+ *************** ERROR ***************
668
+
669
+ }
670
+ raise e
671
+
672
+ end
673
+ }
674
+
675
+
676
+
677
+
678
+ model=Crdf_Model.new
679
+ model.mtk_context(options) {
680
+ if model.context[:benchmark]
681
+ require 'benchmark'
682
+ include Benchmark
683
+ Benchmark.benchmark(" " + CAPTION, 12, FMTSTR, "load", "bpm","tests","mda1","mda2","mda3","mda4",".java",".jsp","misc","flex",">total",">avg") do |x|
684
+ t1=x.report("load") { step_load(model) }
685
+ t1a=x.report("kb") { step_generateKb(model) }
686
+ t2=x.report("bpm") { step_bpm(model) }
687
+ t5=x.report("tests") { step_generate_tests(model) }
688
+ t3a=x.report("mda1") { step_transform10(model) }
689
+ t3b=x.report("mda2") { step_transform20(model) }
690
+ t3c=x.report("mda3") { step_transform30(model) }
691
+ t3d=x.report("mda4") { step_transform40(model) }
692
+ t4=x.report(".java") { step_generate_java(model) }
693
+ t6=x.report("jsp") { step_generate_struts(model) }
694
+ t7=x.report("misc") { step_generate_misc(model) }
695
+ t8=x.report("flex") { step_generate_flex(model) }
696
+
697
+
698
+ puts "***************************************************"
699
+ puts " user system total real"
700
+ [t1 ,t1a,t2 ,t3a,t3b,t3c,t3d,t4 ,t5 ,t6 ,t7,t8,t1+t1a+t2+t3a+t3b+t3c+t3d+t4+t5+t6+t7+t8,(t1+t1a+t2+t3a+t3b+t3c+t3d+t4+t5+t6+t7+t8)/12]
701
+ end
702
+ else
703
+ step_load(model)
704
+ step_generateKb(model)
705
+ step_bpm(model)
706
+ step_generate_tests(model)
707
+ step_transform10(model)
708
+ step_transform20(model)
709
+ step_transform30(model)
710
+ step_transform40(model)
711
+ step_generate_java(model)
712
+ step_generate_struts(model)
713
+ step_generate_misc(model)
714
+ step_generate_flex(model)
715
+ end
716
+
717
+ model.inspector_start_daemon(startupFile) if options[:daemon]
718
+
719
+ }
720
+ rescue Exception => e
721
+ if options[:backTrace]
722
+ raise e
723
+ else
724
+ puts "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
725
+ puts e
726
+ puts "use --backTrace to display full backtrace"
727
+ puts "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
728
+ exit(1)
729
+ end
730
+ rescue => e
731
+ if options[:backTrace]
732
+ raise e
733
+ else
734
+ puts "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
735
+ puts e
736
+ puts "use --backTrace to display full backtrace"
737
+ puts "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
738
+ exit(1)
739
+ end
740
+ rescue RuntimeError => e
741
+ if options[:backTrace]
742
+ raise e
743
+ else
744
+ puts "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
745
+ puts e
746
+ puts "use --backTrace to display full backtrace"
747
+ puts "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
748
+ exit(1)
749
+ end
750
+ end
751
+
752
+ end
753
+
754
+
755
+ def say(x)
756
+ #puts("# #{File.basename(startupFile)}: #{x}")
757
+ puts " :#{x}"
758
+ end
759
+
760
+
761
+
762
+ # load meta-model(s) and model(s)
763
+ def step_load(model)
764
+
765
+ if model.context[:bpm]
766
+ say "loading bpm meta-model"
767
+ model.bpm_loadBPM
768
+ end
769
+ say "loading UML2 meta-model"
770
+ model.loadUml2
771
+ i=0
772
+ model.context[:nt].each { |f|
773
+ i=i+1
774
+ say "loading uml data from '#{f}'" if model.context[:verbose]
775
+ model.loadModelFromFile(f)
776
+ }
777
+
778
+ model.umlx_processShortcuts!
779
+
780
+ model.context[:jpdl].each { |f|
781
+ i=i+1
782
+ say "loading bpm data from'#{f}'" if model.context[:verbose]
783
+ model.bpm_loadJPDL(f)
784
+ }
785
+ say "# Loaded #{i} models." if model.context[:verbose]
786
+ end
787
+
788
+ #Generate protege 2000 knowlege base
789
+ def step_generateKb(model)
790
+ return unless model.context[:updateKB]
791
+ say "generating KB project"
792
+ model.generateRDFS(model.context[:kbTargetfile])
793
+ end
794
+
795
+ #Process bpm enhancement.
796
+ def step_bpm(model)
797
+ return unless model.context[:bpm]
798
+ say "processing bpm"
799
+ model.bpm_addPingNode!
800
+ model.bpm_handleProcessMethods!
801
+ model.bpm_transform!
802
+ #model.bpm_graphGen_dot
803
+ end
804
+
805
+ #Enhance UML model
806
+ def step_transform10(model)
807
+ say "processing UML model structure"
808
+ model.umlx_tryToSalvageErrors!
809
+ model.struts_createDataTypeHelpers! if model.context[:struts]
810
+
811
+ model.java_addJavaEnumInterface!
812
+ model.umlx_makeCompositionNavigable!
813
+ model.umlx_mapMultipleInheritanceToInterface! if model.context[:withMultipleInheritance]
814
+
815
+ model.umlx_checkAbstractAndInheritance
816
+
817
+ model.umlx_generateCompositonDotDiagram
818
+ if model.context[:ejb2]
819
+ model.ejb2_transform!
820
+ end
821
+ #Should be placed before autoImplementoperation: otherwise autoImplementedMethod are not considered as business method
822
+ model.umlx_MarkAllAsbusinessMethod!
823
+
824
+
825
+ model.java_addEnumAssignable! if model.context[:withEnumAssignable]
826
+ model.umlx_autoImplementProperty! if model.context[:withAutoImplementProperty]
827
+ model.umlx_autoImplementOperation! if model.context[:withAutoImplementOperation]
828
+
829
+ model.java_addGroovyImplementations! if model.context[:groovyExperimental]
830
+
831
+ model.struts_addAllOperationAggregateParameterClass!
832
+ model.java_addEnumCompatibilityLayerProperties! if model.context[:withEnumAsString]
833
+ model.db_addDAO! if model.context[:db]
834
+ model.java_transform!
835
+ end
836
+ def step_transform20(model)
837
+
838
+
839
+
840
+ model.db_addPersistence! if model.context[:db]
841
+
842
+ model.struts_addActionLocaleForm! if model.context[:struts]
843
+ model.struts_addPerClassElement! if model.context[:struts]
844
+
845
+ model.db_addTestImplementations! if model.context[:simulateNotImplementedMethods]
846
+ model.struts_installRessources if model.context[:installRessources ]
847
+ model.struts_getFunctionalException if model.context[:struts]
848
+ end
849
+ def step_transform30(model)
850
+ model.struts_getExceptionHandlerClass if model.context[:struts]
851
+ model.uml_addVersionSignature
852
+
853
+ model.umlx_populateSecuredMethodEnumeration if model.context[:security]
854
+ end
855
+ def step_transform40(model)
856
+ model.umlx_populateSecuredPropertyEnumeration if model.context[:security]
857
+ model.umlx_processSecuredElements if model.context[:security]
858
+ end
859
+
860
+ #process tests loaded from protege/2000 and generate test artefacts.
861
+ def step_generate_tests(model)
862
+ if(model.context[:enableTestData])
863
+ say "processing tests"
864
+ ignoreHeader=true
865
+ data_model=Crdf_ProtegeDataModel.new
866
+ data_model.loadMetaModelFromFile(model.context[:testDataRDFS],ignoreHeader)
867
+ data_model.loadModelFromFile(model.context[:testDataRDF],ignoreHeader)
868
+ data_model.kbjava_umlSourceModel = model
869
+
870
+ data_model.kbjava_generateJavaJunit!
871
+ data_model.mtk_context(:build=>%{#{model.context[:testRelativeDir]}}) {
872
+ data_model.kbjava_generate
873
+ }
874
+ end
875
+ end
876
+
877
+ #write java files to disk
878
+ def step_generate_java(model)
879
+ say "processing java"
880
+ model.java_generate
881
+ end
882
+
883
+ #write struts files to disk
884
+ def step_generate_struts(model)
885
+ return if model.context[:excludeNonTestFiles]
886
+ if(model.context[:struts])
887
+ say "processing struts"
888
+ model.struts_generate_webxml
889
+ model.struts_struts_config_generate
890
+ model.struts_validator_generate
891
+ model.struts_validation_generate
892
+ model.struts_copyReloadDefinitionsActionClass
893
+
894
+ model.struts_index_generate
895
+ model.struts_edit_generate
896
+ model.struts_messageResources_generate
897
+ model.struts_generateSpringApplicationContext
898
+ end
899
+ end
900
+
901
+ #generate misc. artefacts
902
+ def step_generate_misc(model)
903
+ return if model.context[:excludeNonTestFiles]
904
+ say "processing misc."
905
+ model.db_saveDB_DISCRIMINATOR if model.context[:db]
906
+ model.db_generateConfiguration if model.context[:db]
907
+ model.java_generateAntBuildFile
908
+ model.java_generatePackageDoc
909
+
910
+ end
911
+
912
+ #generate flex artefacts
913
+ def step_generate_flex(model)
914
+ return unless model.context[:flex]
915
+ say "processing flex"
916
+ model.flex_generateVO
917
+ model.flex_generateMXML
918
+ model.flex_generateImportationAS
919
+ end
920
+