ontomde-java 2.0.0

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.
Files changed (157) hide show
  1. data/History.txt +10 -0
  2. data/Manifest.txt +156 -0
  3. data/README.txt +98 -0
  4. data/Rakefile +21 -0
  5. data/bin/ontomde-java +5 -0
  6. data/generateRdocFile.sh +16 -0
  7. data/lib/ontomde-java.rb +45 -0
  8. data/lib/ontomde-java/crank.rb +13 -0
  9. data/lib/ontomde-java/crank/context.rb +384 -0
  10. data/lib/ontomde-java/crank/crankJpa.rb +103 -0
  11. data/lib/ontomde-java/crank/equals.rb +83 -0
  12. data/lib/ontomde-java/crank/facelets.rb +243 -0
  13. data/lib/ontomde-java/crank/facesconfig.rb +113 -0
  14. data/lib/ontomde-java/crank/helper.rb +46 -0
  15. data/lib/ontomde-java/crank/main.rb +51 -0
  16. data/lib/ontomde-java/crank/menu.rb +39 -0
  17. data/lib/ontomde-java/crank/menu2.rb +78 -0
  18. data/lib/ontomde-java/crank/validation.rb +34 -0
  19. data/lib/ontomde-java/ejb2.rb +3 -0
  20. data/lib/ontomde-java/ejb2/main-ejb2.rb +194 -0
  21. data/lib/ontomde-java/flex.rb +7 -0
  22. data/lib/ontomde-java/flex/Editor.mxml.as.rb +184 -0
  23. data/lib/ontomde-java/flex/Editor.mxml.rb +701 -0
  24. data/lib/ontomde-java/flex/ImportationAS.rb +40 -0
  25. data/lib/ontomde-java/flex/ValueObjectAS.rb +338 -0
  26. data/lib/ontomde-java/flex/fileTypes.rb +19 -0
  27. data/lib/ontomde-java/flex/main.rb +347 -0
  28. data/lib/ontomde-java/frontend/command.rb +324 -0
  29. data/lib/ontomde-java/frontend/command.rdoc +583 -0
  30. data/lib/ontomde-java/frontend/defaultOptions.rb +124 -0
  31. data/lib/ontomde-java/frontend/options.rb +555 -0
  32. data/lib/ontomde-java/frontend/steps.rb +287 -0
  33. data/lib/ontomde-java/java/accessorCode.rb +528 -0
  34. data/lib/ontomde-java/java/accessorSignature.rb +347 -0
  35. data/lib/ontomde-java/java/annotationOntoMDE.rb +88 -0
  36. data/lib/ontomde-java/java/apache.rb +34 -0
  37. data/lib/ontomde-java/java/build.rb +80 -0
  38. data/lib/ontomde-java/java/collectionMapping.rb +112 -0
  39. data/lib/ontomde-java/java/component.rb +446 -0
  40. data/lib/ontomde-java/java/contextualize.rb +43 -0
  41. data/lib/ontomde-java/java/enumAssignable.rb +75 -0
  42. data/lib/ontomde-java/java/enumCompatibilityLayer.rb +195 -0
  43. data/lib/ontomde-java/java/equals.rb +91 -0
  44. data/lib/ontomde-java/java/groovy.rb +95 -0
  45. data/lib/ontomde-java/java/java.rb +1329 -0
  46. data/lib/ontomde-java/java/java.rdoc +78 -0
  47. data/lib/ontomde-java/java/javaDatatypeMapping.rb +156 -0
  48. data/lib/ontomde-java/java/javaHelper.rb +25 -0
  49. data/lib/ontomde-java/java/java_todo.rdoc +3 -0
  50. data/lib/ontomde-java/java/javadoc.rb +254 -0
  51. data/lib/ontomde-java/java/meta.rb +28 -0
  52. data/lib/ontomde-java/java/operationAsClass.rb +144 -0
  53. data/lib/ontomde-java/java/security.rb +260 -0
  54. data/lib/ontomde-java/java/stateMachine.rb +415 -0
  55. data/lib/ontomde-java/java/tenant.rb +65 -0
  56. data/lib/ontomde-java/java/xsd.rb +1363 -0
  57. data/lib/ontomde-java/java/xsdCollectionMapping.rb +112 -0
  58. data/lib/ontomde-java/java/xsdDatatypeMapping.rb +103 -0
  59. data/lib/ontomde-java/jpa.rb +17 -0
  60. data/lib/ontomde-java/jpa/configuration.rb +176 -0
  61. data/lib/ontomde-java/jpa/finder.rb +102 -0
  62. data/lib/ontomde-java/jpa/jpa.rb +531 -0
  63. data/lib/ontomde-java/jpa/jpa.rdoc +20 -0
  64. data/lib/ontomde-java/jpa/locking.rb +18 -0
  65. data/lib/ontomde-java/jpa/mapping.rb +314 -0
  66. data/lib/ontomde-java/jpa/redefined.rb +77 -0
  67. data/lib/ontomde-java/jpa/simulationAutoImplement.rb +54 -0
  68. data/lib/ontomde-java/jpdl.rb +9 -0
  69. data/lib/ontomde-java/jpdl/bpm.pprj +1745 -0
  70. data/lib/ontomde-java/jpdl/bpm.rdf +140 -0
  71. data/lib/ontomde-java/jpdl/bpm.rdfs +231 -0
  72. data/lib/ontomde-java/jpdl/constant.rb +5 -0
  73. data/lib/ontomde-java/jpdl/graphic.rb +52 -0
  74. data/lib/ontomde-java/jpdl/jpdl.rb +281 -0
  75. data/lib/ontomde-java/jpdl/jpdl_deploy.rb +114 -0
  76. data/lib/ontomde-java/jpdl/main.rb +348 -0
  77. data/lib/ontomde-java/jpdl/main.rdoc +2 -0
  78. data/lib/ontomde-java/jpdl/processOperationToClass.rb +316 -0
  79. data/lib/ontomde-java/kbjava.rb +6 -0
  80. data/lib/ontomde-java/kbjava/rdfToJava.rb +407 -0
  81. data/lib/ontomde-java/struts.rb +27 -0
  82. data/lib/ontomde-java/struts/MessageResources.rb +359 -0
  83. data/lib/ontomde-java/struts/action.rb +883 -0
  84. data/lib/ontomde-java/struts/blob.rb +11 -0
  85. data/lib/ontomde-java/struts/exceptionHandling.rb +167 -0
  86. data/lib/ontomde-java/struts/footer.rb +128 -0
  87. data/lib/ontomde-java/struts/form.rb +450 -0
  88. data/lib/ontomde-java/struts/header.rb +37 -0
  89. data/lib/ontomde-java/struts/header_link.rb +39 -0
  90. data/lib/ontomde-java/struts/jsp_edit.rb +870 -0
  91. data/lib/ontomde-java/struts/jsp_edit_field.rb +1 -0
  92. data/lib/ontomde-java/struts/jsp_edit_js.rb +124 -0
  93. data/lib/ontomde-java/struts/jsp_index.rb +136 -0
  94. data/lib/ontomde-java/struts/localeAction.rb +641 -0
  95. data/lib/ontomde-java/struts/main.rb +41 -0
  96. data/lib/ontomde-java/struts/mappingForBean.rb +132 -0
  97. data/lib/ontomde-java/struts/mappingForJsp.rb +272 -0
  98. data/lib/ontomde-java/struts/mappingToJavaHierarchy.rb +87 -0
  99. data/lib/ontomde-java/struts/reloadAction.rb +33 -0
  100. data/lib/ontomde-java/struts/spring.rb +89 -0
  101. data/lib/ontomde-java/struts/struts-config.rb +232 -0
  102. data/lib/ontomde-java/struts/validation.rb +116 -0
  103. data/lib/ontomde-java/struts/validator.rb +341 -0
  104. data/lib/ontomde-java/struts/webXml.rb +195 -0
  105. data/lib/ontomde-java/struts/xmlForm.rb +308 -0
  106. data/lib/ontomde-java/version.rb +5 -0
  107. data/profiling.xls +0 -0
  108. data/test/.classpath +14 -0
  109. data/test/.project +17 -0
  110. data/test/.settings/org.eclipse.jdt.core.prefs +23 -0
  111. data/test/Rakefile +71 -0
  112. data/test/build.xml +34 -0
  113. data/test/classpath.rb +15 -0
  114. data/test/lib/junit-4.1.jar +0 -0
  115. data/test/load1.rb +3 -0
  116. data/test/load2.rb +3 -0
  117. data/test/log4j.properties +46 -0
  118. data/test/model/.project +11 -0
  119. data/test/model/BigProject.mdzip +0 -0
  120. data/test/model/BigProject.mdzip.nt +102866 -0
  121. data/test/model/ClassDiagram.EntArch.gif +0 -0
  122. data/test/model/ClassDiagram.emx.gif +0 -0
  123. data/test/model/ClassDiagram.mdzip.gif +0 -0
  124. data/test/model/model_ea71.bis.ea.xmi +149 -0
  125. data/test/model/model_ea71.ea.xmi +4470 -0
  126. data/test/model/model_ea71.eap +0 -0
  127. data/test/model/model_ea71_README.txt +8 -0
  128. data/test/model/multipleInheritance.emx +466 -0
  129. data/test/model/multipleInheritance.emx.nt +2428 -0
  130. data/test/model/simple1-530.ofp +0 -0
  131. data/test/model/simple1-includedAsReference.emx +169 -0
  132. data/test/model/simple1.emx +3729 -0
  133. data/test/model/simple1.emx.fragments.nt +81 -0
  134. data/test/model/simple1.emx.nt +5760 -0
  135. data/test/model/simple1.mdzip +0 -0
  136. data/test/model/simple1.mdzip.nt +11500 -0
  137. data/test/model/simple1.oe530.nt +1986 -0
  138. data/test/model/simple1.oe600.nt +1627 -0
  139. data/test/src/RuntimeTest.java +656 -0
  140. data/test/src/testsLevel1.java +174 -0
  141. data/test/src/testsLevel2.java +29 -0
  142. data/test/src/testsLevel3.java +40 -0
  143. data/test/test-ea7.sh +15 -0
  144. data/test/test-magicDraw.sh +10 -0
  145. data/test/test-mi.sh +9 -0
  146. data/test/test-oe530.sh +10 -0
  147. data/test/test-oe600.sh +11 -0
  148. data/test/test-rsm.sh +11 -0
  149. data/test/test_export_ea71.rb +5 -0
  150. data/test/test_export_oe530.rb +4 -0
  151. data/test/test_export_oe600.rb +4 -0
  152. data/test/test_export_rsm60.rb +4 -0
  153. data/test/trace +419 -0
  154. data/test/uml_test.rb +1434 -0
  155. data/test/uml_test.xls +0 -0
  156. data/test/unit_test.rb +6 -0
  157. metadata +224 -0
@@ -0,0 +1,65 @@
1
+ # Handle multi-tenant applications
2
+
3
+ module Mrdf_Repository
4
+
5
+ # default qualified name of the class used for tenant
6
+ TENANT_DEFAULT_CLASS_QUALIFIED_NAME='xmda.tenant.Tenant'
7
+
8
+ # stereotype name used to identify a tenant in model
9
+ TENANT_STEREOTYPE_NAME='tenant'
10
+
11
+ def java_getTenantClass
12
+ tenant=nil
13
+ uml_Class_all.each { |c|
14
+ next unless c.umlx_hasStereotype?(TENANT_STEREOTYPE_NAME)
15
+ unless tenant.nil?
16
+ puts 'ERROR: ****************************************************'
17
+ puts 'ERROR: multiple class found in model with stereotype tenant'
18
+ puts 'ERROR: ****************************************************'
19
+ end
20
+ tenant=c
21
+ }
22
+ return tenant
23
+ end
24
+ def java_addTenantClass!
25
+ # look in model for an existing class stereotyped "tenant"
26
+ tenant=java_getTenantClass
27
+
28
+ # fields should be provided by model
29
+ return tenant unless tenant.nil?
30
+
31
+ # no tenant class found in model. we will create one.
32
+ tenant=umlx_reserved_model.umlx_getOrCreateClass(TENANT_DEFAULT_CLASS_QUALIFIED_NAME)
33
+ f=tenant.umlx_createAndAddProperty(tenant.rdf_uri+"_tname","tenant Name")
34
+ f.uml_type=tenant.umlx_owner_one.umlx_dataType_string
35
+ tenant.umlx_external=RDF_FALSE
36
+ tenant.db_isTransient=RDF_FALSE
37
+
38
+ tenant.uml_appliedStereotype_add(tenant.umlx_getOrCreateStereotype(TENANT_STEREOTYPE_NAME))
39
+ return tenant
40
+ end
41
+
42
+ def java_addTenantFields!
43
+ tenant=java_addTenantClass!
44
+ uml_Class_all.each { |c|
45
+ next if c.kind_of?(Muml_Interface)
46
+ next unless c.uml_generalization.empty?
47
+ c.java_addTenantField!(tenant)
48
+ }
49
+ end
50
+ end
51
+
52
+ module Muml_Classifier
53
+ TENANT_FIELD_NAME="tenantOwner"
54
+ def java_addTenantField!(tenantClass=nil)
55
+ return unless context[:multiTenant]
56
+ tenantClass=rdf_Repository.java_getTenantClass if tenantClass.nil?
57
+ # return if tenantClass==self
58
+ #Tenant itself has a tenant field for homogenity
59
+ #
60
+ tf=umlx_createAndAddProperty("#{self.rdf_uri}_tenant",TENANT_FIELD_NAME)
61
+ tf.uml_type=tenantClass
62
+ end
63
+ end
64
+
65
+
@@ -0,0 +1,1363 @@
1
+ #:include: java.rdoc
2
+ #:include: xsd_todo.rdoc
3
+
4
+ require 'pathname'
5
+
6
+ module Mxsd_Schema
7
+ #model elements in file
8
+ rdf_attr :xsd_types,[::Muml_Element ]
9
+
10
+ #model element which will be used to compute file name
11
+ rdf_attr :xsd_baseName, [ ::Muml_Namespace ]
12
+
13
+ #included xsd files
14
+ rdf_attr :xsd_dependencies, [ ::Mxsd_Schema ]
15
+
16
+ #return set of types used by attributes of classes in current xsd file.
17
+ def xsd_getSetOfTypeUsedByAttributes
18
+ types=Set.new
19
+ xsd_types.each { |clazz|
20
+ clazz.uml_ownedAttribute.each { |param|
21
+ types.merge(param.uml_type)
22
+ }
23
+ }
24
+ return types
25
+ end
26
+
27
+ def xsd_writeImports
28
+ xsd_dependencies.each {|dep|
29
+ base=Pathname.new(File.dirname(self.xsd_SchemaName))
30
+ target=Pathname.new(dep.xsd_SchemaName)
31
+ write(%{ <xsd:include schemaLocation="#{target.relative_path_from(base)}"/>\n})
32
+ }
33
+ end
34
+ #compute xsd dependencies from file
35
+ def xsd_computeDependencies!(defaultXSD)
36
+ deps=Set.new
37
+ xsd_getSetOfTypeUsedByAttributes.each { |clazz|
38
+ clazz.xsd_types_inv.each {|i|
39
+ next if i==self
40
+ deps.add(i)
41
+ }
42
+ }
43
+ deps.each {|d|
44
+ xsd_dependencies_add(d)
45
+ }
46
+ return
47
+ end
48
+
49
+
50
+ XSD_HEADER=<<END
51
+ <?xml version="1.0" encoding="UTF-8"?>
52
+ <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
53
+ END
54
+ XSD_FOOTER=<<END
55
+ </xsd:schema>
56
+ END
57
+
58
+ def xsd_generateSchema
59
+ xsd_openOutStream {
60
+ write(XSD_HEADER)
61
+ xsd_writeImports
62
+ xsd_types.each { |clazz|
63
+ # puts "--> #{clazz}"
64
+ clazz.xsd_writeType
65
+ }
66
+ write(XSD_FOOTER)
67
+ }
68
+ end
69
+
70
+ def xsd_SchemaName
71
+ if xsd_baseName.empty?
72
+ return "global.xsd"
73
+ else
74
+ return xsd_baseName_one.xsd_SchemaName
75
+ end
76
+ end
77
+
78
+ #Opens xsd_SchemaName for writing
79
+ #
80
+ #Example usage:
81
+ #xsd_openOutStream {
82
+ # write ("this text goes in java file")
83
+ # }
84
+ def xsd_openOutStream(&block)
85
+ mtk_writeSession(xsd_SchemaName) {
86
+ yield
87
+ }
88
+ end
89
+
90
+ # #opens java file for writing with xsd_openOutStream and calls xsd_write
91
+ # def xsd_generate
92
+ # return if @xsd_already_generated
93
+ # return if xsd_ignoreMe?
94
+ #
95
+ # return unless self.umlx_owner_one.kind_of?(Muml_Package)
96
+ # @xsd_already_generated=true
97
+ #
98
+ # xsd_openOutStream {
99
+ # xsd_write
100
+ # }
101
+ # end
102
+
103
+ # # write java code for class.
104
+ # # (Uses xsd_writeClassHeader, xsd_writeClassBody)
105
+ # # NOTE
106
+ # # * also used for inner classes
107
+ # def xsd_write
108
+ # puts "&&"
109
+ # xsd_writeClassHeader {
110
+ # xsd_writeClassBody
111
+ # xsd_types.each { |clazz|
112
+ # puts "--> #{clazz}"
113
+ # clazz.xsd_write
114
+ # }
115
+ # }
116
+ # end
117
+
118
+ end
119
+
120
+ class Cxsd_Schema < Crdf_Resource
121
+ include Mxsd_Schema
122
+ end
123
+
124
+ module Mrdf_Repository
125
+
126
+ # Example
127
+ # xsd_addJavaFilePathMapping(/\.example/,"src/main/example/" ])
128
+ #TODO: add helping error if jfp.nil?
129
+ def xsd_addContextJavaFilePathMapping(qualifiedNameRegexp,relativePath)
130
+ jfp=context[:javaFilePathRegexp]
131
+ jfp[qualifiedNameRegexp,relativePath]
132
+ end
133
+
134
+ def umlx_processStereotypes!
135
+ return
136
+ each { |k,c|
137
+ next unless c.kind_of?(Muml_Stereotype)
138
+ #log.debug "Registering stereotype #{c.getRubyStereotypeName}"
139
+ eval %{
140
+ module ::Muml_Stereotype_#{c.getRubyStereotypeName}
141
+ end
142
+ }
143
+ }
144
+ each {|k,c|
145
+ next unless c.kind_of?(Muml_Element)
146
+ next if c.appliedStereotype.empty?
147
+ appliedStereotype.each { |s|
148
+ c.class_eval %{
149
+
150
+ }
151
+ }
152
+ }
153
+
154
+ end
155
+
156
+ #trigger Muml_Classifier xsd_transform! for every class element
157
+ def xsd_transform!
158
+ #must copy before transformation (hash modified runtime error)
159
+ a=Array.new
160
+ each { |k,c|
161
+ next if c.kind_of?(Muml_Stereotype)
162
+ next unless c.kind_of?(Muml_Class) || c.kind_of?(Muml_Interface)||c.kind_of?(Muml_Enumeration)
163
+ a << c
164
+ }
165
+ a.each {|c|
166
+ c.xsd_transform! unless c.xsd_ignoreMe?
167
+ }
168
+
169
+ #xsd_addPersistence!
170
+ umlx_processStereotypes!
171
+ end
172
+
173
+ #Main java generator entry point.
174
+ #Triggers the generation of every Java file for the model.
175
+ def xsd_generate_all
176
+ each_value {|m|
177
+ next unless m.kind_of?(Mxsd_Schema)
178
+ # puts "!!"
179
+ m.xsd_generateSchema
180
+ }
181
+ end
182
+
183
+ #parse model and generate file objects for elements
184
+ def xsd_generateSchemaElements!
185
+ packages=Set.new
186
+ uml_Class_all.each { |c|
187
+ packages.add(c.umlx_owner_one)
188
+ }
189
+ global=Cxsd_Schema.new(self,"uri://globalXSD")
190
+ xsdFiles=Set.new
191
+ packages.each { |p|
192
+ f=Cxsd_Schema.new(self,"#{p.rdf_uri}_xsdFile")
193
+ xsdFiles.add(f)
194
+ f.xsd_baseName=p
195
+ p.uml_Class_all.each {|oe|
196
+ f.xsd_types_add(oe)
197
+ }
198
+ }
199
+ d=global.nil? ? Cxsd_Schema.new(self,"defaultXSD") : global
200
+ xsdFiles.each { |xsd|
201
+ xsd.xsd_computeDependencies!(d)
202
+ }
203
+ end
204
+
205
+ def xsd_generateXSDFiles
206
+ each_value { |v|
207
+ next unless v.kind_of?(Mxsd_Schema)
208
+ v.generateXSDFile
209
+ }
210
+ end
211
+
212
+ end
213
+
214
+ module Mxsd_Annotation
215
+ rdf_safe_attr_reader_many :xsd_annotation
216
+ def xsd_writeAnnotation
217
+ mtk_protected(Mrdf_Resource::NOREVERSE,"annotations") {
218
+ xsd_annotation.each {|a|
219
+ write(a)
220
+ write("\n")
221
+ }
222
+ write("@Override\n") if (self.kind_of?(Muml_Operation) && !umlx_redefinesMethod.empty? && !umlx_redefinesMethod_one.umlx_owner_one.kind_of?(Muml_Interface) )
223
+ }
224
+ end
225
+ end
226
+
227
+
228
+
229
+
230
+
231
+ module Muml_EnumerationLiteral
232
+ #List of initialisation parameter for this literal.
233
+ rdf_safe_attr_reader_many :xsd_initParameterValue
234
+ end
235
+
236
+ module Muml_Parameter
237
+ # extension metamodele
238
+ rdf_safe_attr_reader_many :uml_qualifier
239
+ #rdf_safe_attr_reader_many :umlx_qualifier
240
+
241
+ #write java parameter declaration
242
+ # (Uses xsd_propertyRoleType, xsd_Name)
243
+ # parameter is declared final if direction is in (not out, not inOut)
244
+ #Example:
245
+ #* int x
246
+ #* final int x
247
+ #* String z
248
+ def xsd_write
249
+ write("final ") if uml_direction_one.isIn? # the best we can do with java
250
+ write("#{xsd_propertyAssociationType} ")
251
+ #write(" /* #{uml_lowerValue}..#{uml_upperValue}*/ ")
252
+ write(" #{xsd_Name}") unless uml_direction_one.isReturn?
253
+ end
254
+ end
255
+
256
+
257
+ module Muml_Stereotype
258
+ def getRubyStereotypeName
259
+ return uml_name.to_s.tr('^a-zA-Z0-9','_')
260
+ end
261
+
262
+ #return true if java generator should totaly ignore this element.
263
+ #
264
+ #NOTE:
265
+ #* Always returns true
266
+ def xsd_ignoreMe?
267
+ return true;
268
+ end
269
+ end
270
+
271
+
272
+
273
+
274
+ module Muml_Model
275
+ #def xsd_generate_all
276
+ ## mtk_default_context(:xsd_generateSetAttributeInitializer=>true) {
277
+ ## uml_Class_all.each {|c|
278
+ ## #next if c.kind_of?(Muml_Stereotype)
279
+ ## next unless c.kind_of?(Muml_Class) || c.kind_of?(Muml_Interface)||c.kind_of?(Muml_Enumeration)
280
+ ## # only generate if requested to do so
281
+ ## # usefull for generating separtely tests dans model
282
+ ## next if c.xsd_isATestFile? && !context[:includeTestFiles]
283
+ ## next if (!c.xsd_isATestFile?) && context[:excludeNonTestFiles]
284
+ ## c.xsd_generate
285
+ ## }
286
+ ## if context[:generateComponent]
287
+ ## uml_Component_all.each { |c|
288
+ ## c.xsd_generateType
289
+ ## }
290
+ ## end
291
+ ## }
292
+ #end
293
+ end
294
+
295
+ #module Muml_Property
296
+ # def xsd_Name
297
+ # return uml_isStatic? ? super.upcase : super
298
+ # end
299
+ #end
300
+
301
+ module Muml_NamedElement
302
+ # true if name contains a generic.
303
+ rdf_safe_attr_reader_many :xsd_isGeneric
304
+
305
+ #JAVA_RESERVED_WORD=["abstract", "boolean", "break", "byte", "case", "catch", "char", "class", "const", "continue", "default", "do", "double", "else", "enum", "extends", "final", "finally", "float", "for", "goto", "if", "implements", "import", "instanceof", "int", "interface", "long", "native", "new", "package", "private", "protected", "public", "return", "short", "static", "strictfp", "super", "switch", "synchronized", "this", "throw", "throws", "transient", "try", "void", "volatile", "while"]
306
+ #JAVA_NUMBERS=["0","1","2","3","4","5","6","7","8","9"]
307
+ #returns a valid java symbol computed from str
308
+ #
309
+ #NOTE:
310
+ #
311
+ # display a warning an return /*TODO ...*/ if str is empty
312
+ #
313
+ #Examples:
314
+ # xsd_safeName("number") returns number
315
+ # xsd_safeName("8number") returns _number
316
+ def xsd_safeName(str)
317
+ if str.empty?
318
+ log.warn "WARNING: blank name detected for obj type #{self.class.name} identified by uri=#{uri}"
319
+ return "/*TODO: ERROR:blank name found in uml model:*/"
320
+ end
321
+ #TODO A g?rer globalement pour la gestion des g?n?riques
322
+ if xsd_isGeneric?
323
+ # a generic may contain names such as xyz<org.myname>
324
+ ret=str.to_s.tr('^a-zA-Z0-9_<?>.,',"")
325
+ else
326
+ ret=str.to_s.tr('^a-zA-Z0-9_',"")
327
+ end
328
+ ret="_"+ret if JAVA_NUMBERS.include?(ret[0,1])
329
+ ret="_"+ret if JAVA_RESERVED_WORD.include?(ret)
330
+ return ret
331
+ end
332
+
333
+ #java unique name enforcement variable
334
+ #JAVA_UNIQUE_NAME=Hash.new
335
+
336
+ #return a unique name for this element.
337
+ #Logs an error messge is uniqueness is not verified.
338
+ def xsd_uniqueName
339
+ ret=xsd_Name.to_s
340
+ k=JAVA_UNIQUE_NAME[ret]
341
+ if k.nil?
342
+ JAVA_UNIQUE_NAME[ret]=rdf_uri
343
+ elsif k!=rdf_uri
344
+ log_error_unique_name
345
+ end
346
+ return ret
347
+ end
348
+
349
+ def log_error_unique_name
350
+ #return if log_already_displayed?("#{rdf_uri}__uniqueName")
351
+ log.error {
352
+ <<END
353
+ non unique name detected
354
+ ********* INVALID DATA DETECTED **********
355
+ ** This software expects uml names to be globaly unique.
356
+ ** The following item has been detected to be an homonym
357
+ ** of a previously processed model element.
358
+ ** #{mtk_object_message}
359
+ **
360
+ ** Check your model and make sure names are unique.
361
+ **
362
+ ** This model element is related to these other model elements:
363
+ #{mtk_related_message}
364
+ ********* INVALID DATA DETECTED **********
365
+ END
366
+ }
367
+ if context[:xsd_failIfNonUniqueName]
368
+ raise Warning.new(),"unique name assertion failed"
369
+ end
370
+
371
+ end
372
+
373
+ #Returns this element uml_name after applying xsd_safeName on it.
374
+ @xsd_Name_cache=nil
375
+ def xsd_Name
376
+ return @xsd_Name_cache unless @xsd_Name_cache.nil?
377
+ s=xsd_safeName(uml_name.to_s)
378
+ b=context[:xsd_fixNameCase,true]
379
+ if !b
380
+ # do nothing
381
+ elsif kind_of?(Muml_Package) || kind_of?(Muml_Property) || kind_of?(Muml_Parameter) || kind_of?(Muml_Operation)
382
+ if s[0..0].downcase!=s[0..0]
383
+ s="#{s[0..0].downcase}#{s[1,s.length]}"
384
+ display_xsd_Name_case_error(true)
385
+ end
386
+ elsif (kind_of?(Muml_Class) || kind_of?(Muml_Interface) || kind_of?(Muml_Enumeration) ) && ! kind_of?(Muml_PrimitiveType)
387
+ if s[0..0].capitalize!=s[0..0]
388
+ s="#{s[0..0].capitalize}#{s[1,s.length]}"
389
+ display_xsd_Name_case_error(false)
390
+ end
391
+ end
392
+ @xsd_Name_cache=s
393
+ return @xsd_Name_cache
394
+ end
395
+ #DISPLAY_JAVA_NAME_CASE_ERROR=Set.new()
396
+ def display_xsd_Name_case_error(isDowncase)
397
+ return unless context[:xsd_display_case_errors,false]
398
+ #next if DISPLAY_JAVA_NAME_CASE_ERROR.include?(self)
399
+ #DISPLAY_JAVA_NAME_CASE_ERROR<< self
400
+ log.error { %{***** INVALID MODEL DETECTED *****
401
+ ***** INVALID MODEL DETECTED *****
402
+ Model element name:
403
+ uml_class=#{self.class.name}
404
+ rdf_uri=#{rdf_uri}
405
+ uml_name=#{uml_name}
406
+ uml_owner=#{umlx_owner_one}
407
+ should begin with a #{isDowncase ? "downcase": "upcase"} character.
408
+ ***** INVALID MODEL DETECTED *****
409
+ }}
410
+ end
411
+
412
+
413
+ #Returns this element xsd_Name after applying a simplified java bean case convention.
414
+ #http://java.sun.com/products/javabeans/docs/spec.html
415
+ #anIntAttribute --> AnIntAttribute
416
+ #aBooleanAttribute --> aBooleanAttribute
417
+ def xsd_NameBean
418
+ return xsd_toNameBean(xsd_Name.to_s)
419
+ end
420
+ def xsd_toNameBean(name)
421
+ #special case handling introduced for struts
422
+ return name if name[1,1].upcase==name[1,1]
423
+ name=String.new(name)
424
+ name[0] = name[0, 1].upcase
425
+ return name
426
+ end
427
+
428
+ #Returns this element xsd_Name after applying a simplified java bean property case convention.
429
+ def xsd_NameProperty
430
+ return xsd_Name
431
+ #return xsd_toNameProperty(xsd_Name)
432
+ end
433
+
434
+ #Converts string name to a property name and returns its value.
435
+ #
436
+ #Example:
437
+ # xsd_toNameProperty("Xyz") return "xyz"
438
+ # xsd_toNameProperty("XYZ") return "xYZ"
439
+ def xsd_toNameProperty(name)
440
+ result = String.new(name)
441
+ if !result.empty?
442
+ result[0] = result[0, 1].downcase
443
+ end
444
+ return result
445
+ end
446
+ end
447
+
448
+ module Muml_Namespace
449
+ #Returns the full java file name for this element
450
+ # (Uses: Java_FilePath and xsd_Name.)
451
+ #Example:
452
+ #* build/package1/package2/NomDeLaClasse.xsd
453
+ def xsd_SchemaName
454
+ return "#{xsd_SchemaPath}#{xsd_Name}.xsd"
455
+ end
456
+
457
+
458
+ def xsd_getContextJavaFilePath(default=nil)
459
+ n=xsd_qualifiedName.to_s
460
+ jfp=context[:javaFilePathRegexp,nil]
461
+ return default if jfp.nil?
462
+ jfp.each { |mapping|
463
+ if n =~ mapping[0]
464
+ return context[:targetDir]+"/"+mapping[1]
465
+ end
466
+ }
467
+ return default
468
+ end
469
+ # Returns the path where to generate file for this object.
470
+ #
471
+ # NOTE:
472
+ # * Root directory is taken from context[:javaDir] (cf: mtk_context)
473
+ #
474
+ # Examples (with context[:build] equals to "build/":
475
+ # * build/package1/package2
476
+ # * build/package1/package2/UneClasse.xsd
477
+ def xsd_SchemaPath
478
+ return xsd_getContextJavaFilePath(context[:javaDir])+xsd_InternalFilePath
479
+ end
480
+
481
+ # Returns the internal path where to generate file for this object.
482
+ #
483
+ # NOTE:
484
+ #
485
+ # Examples
486
+ # *package1/package2
487
+ # *package1/package2/UneClasse.xsd
488
+ def xsd_InternalFilePath
489
+ r=""
490
+ umlx_sub_hierarchy.each { |n|
491
+ r+=n.xsd_Name
492
+ r+="/"
493
+ }
494
+ return r
495
+ end
496
+
497
+ #Returns this element java qualified name
498
+ #
499
+ #Example:
500
+ # package1.package2.AClassClasse
501
+ # AClassInRootDefaultPackage
502
+ # package1.package2
503
+ def xsd_qualifiedName
504
+ r=sep=""
505
+ umlx_hierarchy.each { |n|
506
+ r+=sep
507
+ r+=n.xsd_Name
508
+ sep="."
509
+ }
510
+ return r
511
+ end
512
+
513
+ #List of namespaces to be ignored by generator.
514
+ #
515
+ #NOTE:
516
+ #* user may add its own item int the list.
517
+ #* list may contain package or class qualified names.
518
+ #
519
+ #EXAMPLE:
520
+ #* "org.xyz" will ignore every item under org.xyz
521
+ #* "org.xyz.ClassZ" will ignore only ClassZ
522
+ # JAVA_IGNORE_NAMESPACE=["java.", "javax.", "xmda.bpm.api", "ontomde.bpm", "xmda.common","org.acegi"]
523
+
524
+ #return true if java generator should totaly ignore this element.
525
+ #
526
+ #NOTE:
527
+ #* returns true if this class name is in JAVA_IGNORE_ROOT_PACKAGE_NAME
528
+ def xsd_ignoreMe?(ignoreExternal=true)
529
+ #puts "ignore=#{self.class} #{self.uml_name}"
530
+ qn=xsd_qualifiedName
531
+ return true if umlx_hasStereotype?("nocode")
532
+ return true if umlx_external? && ignoreExternal
533
+ JAVA_IGNORE_NAMESPACE.each { |ns|
534
+ return true if qn.index(ns)==0
535
+ }
536
+ return false;
537
+ end
538
+ end
539
+
540
+ module Muml_VisibilityKind
541
+ #returns java visibility modifiers (public/protected/private/package)
542
+ def xsd_visibilityModifiers
543
+ return "public " if isPublic?
544
+ return "protected " if isProtected?
545
+ return "private " if isPrivate?
546
+ return "" if isPackage?
547
+ return " !! error : unknown visibility #{uri}!! "
548
+ end
549
+ end
550
+
551
+ module Muml_UML
552
+ #write java class modifiers if needed (abstract, public, ...)
553
+ #Example: public abstract
554
+ def xsd_writeClassModifiers
555
+ #uml_visibility.each { |v|
556
+ # write(v.xsd_visibilityModifiers)
557
+ #}
558
+ write "abstract " if uml_isAbstract?
559
+ end
560
+
561
+ #write java static modifier if needed
562
+ def xsd_writeStaticModifier
563
+ write("static ") if uml_isStatic?
564
+ end
565
+
566
+ end
567
+ #module Muml_EnumerationLiteral
568
+ # def xsd_Name
569
+ # end
570
+ #end
571
+ module Muml_Enumeration
572
+
573
+ #writes java5 enum keyword and enum class name
574
+ #
575
+ #Example:
576
+ #* enum Colors
577
+ def xsd_writeMetaClassName(&block)
578
+ write(%{<xsd:simpleType name="#{xsd_qualifiedName}" >\n})
579
+ yield
580
+ write(%{</xsd:simpleType>\n})
581
+ end
582
+
583
+ #write enum body (list of litterals) using xsd_writeClassComment, xsd_writeClassModifiers, xsd_writeMetaClassName.
584
+ #
585
+ #Example:
586
+ #* { red,blue,green }
587
+ def xsd_writeType
588
+ xsd_writeMetaClassName {
589
+ xsd_writeExtends {
590
+ xsd_writeClassComment
591
+ #xsd_writeJavadoc
592
+ #xsd_writeAnnotation
593
+ xsd_writeClassModifiers
594
+
595
+ write(%{ <xsd:restriction base="xsd:string">\n})
596
+ uml_ownedLiteral.each {|c|
597
+ write(%{ <xsd:enumeration value="#{c.xsd_Name}"/>\n})
598
+ }
599
+ write(%{ </xsd:restriction>\n})
600
+
601
+ #xsd_writeDeclarationSpecificOnBegin
602
+ #skip: xsd_writeAttributes
603
+ #xsd_writeConstructors
604
+ #xsd_writeOperations
605
+ xsd_writeCustomCode
606
+ #xsd_writeDeclarationSpecificOnEnd
607
+ }
608
+ }
609
+ end
610
+
611
+ #write java implements declaration clause if needed.
612
+ #
613
+ #Example:
614
+ #* implements interface1, interface2
615
+ def xsd_writeImplements
616
+ imp=Set.new
617
+ uml_implementation.each { |g|
618
+ imp.add(g.uml_supplier_one.xsd_qualifiedName)
619
+ }
620
+ xsd_implements.each { |g|
621
+ imp.add(g)
622
+ }
623
+
624
+ sep="\n<!-- implements "
625
+ e=""
626
+ imp.sort{ |a,b| a <=> b}.each { |g|
627
+ write(sep)
628
+ write(g)
629
+ sep=","
630
+ e=" -->"
631
+ }
632
+ write(e)
633
+ end
634
+
635
+ end
636
+
637
+ module Muml_Class
638
+
639
+ #Mark this java class as serializable.
640
+ #* adds implements java.io.Serializable
641
+ #* adds serialVersionUID variable
642
+ #Example:
643
+ # private static final long serialVersionUID = 1L;
644
+ def xsd_makeSerializable!
645
+ #xsd_implements_add("java.io.Serializable");
646
+ s=umlx_getOrCreateClass("java.io.Serializable")
647
+ umlx_createAndAddImplementation(s)
648
+
649
+ p=umlx_createAndAddProperty(rdf_uri+"_serialVersionUID","serialVersionUID");
650
+ p.uml_visibility=::Cuml_VisibilityKind::Private
651
+ p.uml_isStatic=RDF_TRUE
652
+ p.xsd_isFinal=RDF_TRUE
653
+ p.xsd_isTransient=RDF_TRUE
654
+ p.uml_type=umlx_dataType_long
655
+ p.xsd_code="1L"
656
+ p.xsd_noAccessors=RDF_TRUE
657
+ end
658
+
659
+
660
+
661
+ #write java implements declaration clause if needed.
662
+ #
663
+ #Example:
664
+ #* implements interface1, interface2
665
+ def xsd_writeImplements
666
+ imp=Set.new
667
+ uml_implementation.each { |g|
668
+ imp.add(g.uml_supplier_one.xsd_qualifiedName)
669
+ }
670
+ xsd_implements.each { |g|
671
+ imp.add(g)
672
+ }
673
+
674
+ # sep=""# \n<!-- implements "
675
+ # e=""
676
+ # imp.sort{ |a,b| a <=> b}.each { |g|
677
+ # write(sep)
678
+ # write(g)
679
+ # sep=","
680
+ # e=" -->"
681
+ # }
682
+ # write(e)
683
+ end
684
+
685
+ #Adds a constructor with paramter
686
+ #
687
+ #NOTE:
688
+ #* EXPERIMENTAL
689
+ #
690
+ #TODO: associations, et filtrer attributs static
691
+ def xsd_writeConstructors
692
+ write(" public #{xsd_Name}() {\n")
693
+ write(" }\n")
694
+ #TODO: associations ??, filtrer static
695
+ if (!uml_ownedAttribute.empty?)
696
+ parameters = ""
697
+ uml_ownedAttribute.each { |o|
698
+ if o.umlx_isAttribute?
699
+ parameters << ", "
700
+ parameters << o.xsd_propertyRoleType.to_s
701
+ parameters << " "
702
+ parameters << o.xsd_NameProperty
703
+ end
704
+ }
705
+ if (!parameters.empty?)
706
+ write("\n")
707
+ parameters = parameters.slice(1, parameters.length)
708
+ write(" public #{xsd_Name}(#{parameters}) {\n")
709
+ uml_ownedAttribute.each { |o|
710
+ if o.umlx_isAttribute?
711
+ write(" set#{o.xsd_NameBean}(#{o.xsd_NameProperty});\n")
712
+ end
713
+ }
714
+ write(" }\n")
715
+ end
716
+ end
717
+ end
718
+ end
719
+
720
+
721
+ module Muml_Classifier
722
+ include Mxsd_Annotation
723
+ rdf_safe_attr_reader_many :xsd_import
724
+ rdf_safe_attr_reader_many :xsd_implements
725
+ rdf_safe_attr_reader_many :xsd_extends
726
+ rdf_safe_attr_reader_many :xsd_isATestFile
727
+
728
+ #true if this classifier is transient
729
+ rdf_safe_attr_reader_many :xsd_isTransient
730
+ rdf_safe_attr_reader_many :db_isTransient
731
+ rdf_safe_attr_reader_many :db_isDAO
732
+
733
+
734
+
735
+
736
+ #write java class keyword and class name
737
+ #
738
+ #Example:
739
+ #* classe Class1
740
+ def xsd_writeMetaClassName(&block)
741
+ write(%{ <xsd:complexType name="#{xsd_qualifiedName}">\n})
742
+ yield
743
+ write(%{ </xsd:complexType>\n})
744
+ end
745
+
746
+
747
+ # write java header.
748
+ # (Uses xsd_writePackageDeclaration, xsd_writeImports)
749
+ #Exemple:
750
+ # package pack1;
751
+ # import xyz;
752
+ def xsd_writeClassHeader(&block)
753
+ return if context[:innerClass]
754
+ #xsd_writePackageDeclaration {
755
+ write(XSD_HEADER)
756
+ xsd_writeImports
757
+ yield
758
+ write(XSD_FOOTER)
759
+ #}
760
+ end
761
+
762
+ #java custom code overide to be
763
+ #inserted in custom code section
764
+ rdf_safe_attr_reader_many :xsd_customCode
765
+
766
+ # write class body.
767
+ # (Uses xsd_writeClassComment, xsd_writeClassModifiers, xsd_writeMetaClassName, xsd_writeExtends, xsd_writeImplements, xsd_writeDeclarationSpecificOnBegin, xsd_writeAttributes, xsd_writeConstructors, xsd_writeOperations, xsd_writeDeclarationSpecificOnEnd)
768
+ def xsd_writeType
769
+ xsd_writeMetaClassName {
770
+ xsd_writeExtends {
771
+ # # xsd_writeClassComment
772
+ # xsd_writeJavadoc
773
+ # xsd_writeAnnotation
774
+ # xsd_writeClassModifiers
775
+ # xsd_writeExtends
776
+ # xsd_writeImplements # class seulement
777
+ # # write("{\n")
778
+ # xsd_writeCustomCode
779
+ #
780
+ # xsd_writeDeclarationSpecificOnBegin
781
+ xsd_writeAttributes
782
+ #write("\n\n")
783
+ #xsd_writeConstructors
784
+ # write("\n\n")
785
+ #xsd_writeOperations
786
+ xsd_writeDeclarationSpecificOnEnd
787
+
788
+ mtk_context(:innerClass=>true) {
789
+ uml_nestedClassifier.each { |c|
790
+ puts "ignored nested classifier #{c} in #{self}"
791
+ #c.xsd_writeType # !!
792
+ }
793
+ }
794
+ }
795
+ }
796
+ end
797
+
798
+ #add add a custom code zone
799
+ #that is usefull for out of model code.
800
+ def xsd_writeCustomCode
801
+ mtk_protected(Mrdf_Resource::NOREVERSE,"custom_code") {
802
+ write !xsd_customCode.empty? ? xsd_customCode : <<END
803
+ <!-- ***********************************************
804
+ This area is provided to insert special code
805
+ that cannot be handled by generator.
806
+ Please, don't use custom method to avoid
807
+ keeping source models up to date.
808
+ *********************************************** -->
809
+ END
810
+ }
811
+ end
812
+
813
+ #Does nothing.
814
+ def xsd_writeClassComment
815
+ end
816
+
817
+ #Does nothing.
818
+ def xsd_writeDeclarationSpecificOnBegin
819
+ end
820
+
821
+ #Does nothing.
822
+ def xsd_writeDeclarationSpecificOnEnd
823
+ end
824
+
825
+ #Does nothing.
826
+ def xsd_writeConstructors
827
+ end
828
+
829
+ #write java package declaration
830
+ # (Uses xsd_qualifiedName)
831
+ #
832
+ #Example:
833
+ #* package aPackage;
834
+ #* package aPackage.aPackage2;
835
+ #* //package --none--
836
+ #def xsd_writePackageDeclaration(&block)
837
+ # p = umlx_package
838
+ # if p.nil? || p.umlx_isARootNamespace?
839
+ # write("//package --none--;\n")
840
+ # else
841
+ # write("package #{p.xsd_qualifiedName};\n")
842
+ # end
843
+ # yield
844
+ #end
845
+
846
+ #write java extends instructions is necessary
847
+ # (Uses xsd_qualifiedName)
848
+ #
849
+ #Example:
850
+ # extends Class2,Class3
851
+ def xsd_writeExtends(&block)
852
+ pre=""
853
+ post=""
854
+ tab=""
855
+ uml_generalization.each { |g|
856
+ pre+=%{#{tab}<xsd:complexContent>\n#{tab} <xsd:extension base="#{g.uml_general_one.xsd_qualifiedName}">\n}
857
+ post+=%{#{tab} </xsd:extension>\n#{tab}</xsd:complexContent>\n}
858
+ tab=tab+" "
859
+ }
860
+ write(pre)
861
+ yield
862
+ write(post)
863
+ end
864
+
865
+ # if true, generator will compute depencies and add imports
866
+ # NOTE !!
867
+ # This feature was added for derived generators.
868
+ # It's use is **not** recommended for **java**.
869
+ # Problems will occur if model manipulate classes
870
+ # such as java.sql.Date and java.lang.Date simultaneously.
871
+ #JAVA_IMPORT_COMPUTED_DEPENDENCIES=false
872
+
873
+ #write import instructions
874
+ #
875
+ #NOTE:
876
+ # The generator always uses qualified names, thus imports are not used by the generator.
877
+ # Using short names leads to name clash. (different Date class, ...)
878
+ #
879
+ # Letting eclipse handle imports is a the best solution.
880
+ #
881
+ # Eclipse offers a highly convenient organize imports feature.
882
+ # Developer should generate java code squeleton and fill it with their code eventually
883
+ # using ECLIPSE organize import features.
884
+ def xsd_writeImports
885
+ xsd_dependencies.each {|dep|
886
+ puts(%{<xsd:include schemaLocation="#{dep}"/>})
887
+
888
+ }
889
+
890
+
891
+
892
+ setOfImport=Set.new
893
+ xsd_import.each { |imp|
894
+ setOfImport<< imp
895
+ }
896
+ JAVA_DEFAULT_IMPORTS.each { |c|
897
+ setOfImport<< c
898
+ }
899
+ if(JAVA_IMPORT_COMPUTED_DEPENDENCIES)
900
+ umlx_computeDirectDepencies().each { |c|
901
+ m=c.xsd_qualifiedName
902
+ #Concrete type may come from a datatype mapping definition and be either a class or a language datatype.
903
+ next unless m.index(".")
904
+ setOfImport<< m
905
+ }
906
+ end
907
+
908
+ if (setOfImport.empty?)
909
+ # adds a useless import so eclipse
910
+ # will place imports in the right area (between ontomde reverse marquers)
911
+ # when using "organize import" eclipse feature.
912
+ if umlx_owner_one.umlx_isARootNamespace?
913
+ #import of class in root package is invalid
914
+ setOfImport<<"java.lang.Object"
915
+ else
916
+ #we import something
917
+ setOfImport<< self.xsd_qualifiedName;
918
+ end
919
+ end
920
+
921
+ mtk_protected(Mrdf_Resource::NOREVERSE,"imports") {
922
+ setOfImport.sort { |a,b| a <=> b}.each {|imp|
923
+ write("<!-- import #{imp}; -->\n");
924
+ }
925
+ }
926
+ end
927
+
928
+ #default java imports
929
+ #JAVA_DEFAULT_IMPORTS=[ ];
930
+
931
+ #iterate xsd_write on operations
932
+ #def xsd_writeOperations
933
+ # #sort has been added because ownedOperation order is random
934
+ # #which is cause false change detection on versionned file
935
+ # uml_ownedOperation.sort { |a,b| a.xsd_Name.to_s <=> b.xsd_Name.to_s }.each { |o| o.xsd_write}
936
+ #end
937
+
938
+ #iterate xsd_write on attributes
939
+ #
940
+ #NOTE
941
+ #* no attribute is generated for an interface
942
+ #* getter/setter// are not handled here (see xsd_transform!).
943
+ def xsd_writeAttributes
944
+ return if kind_of?(Muml_Interface)
945
+ #sort has been added because ownedAttribute order is random
946
+ #which is cause false change detection on versionned file
947
+ write(%{ <xsd:sequence>\n})
948
+ uml_ownedAttribute.sort { |a,b| a.xsd_Name.to_s <=> b.xsd_Name.to_s }.each { |o| o.xsd_writeProperty}
949
+ write(%{ </xsd:sequence>\n})
950
+ end
951
+ end
952
+
953
+ module Muml_Stereotype_Create
954
+ def xsd_write
955
+ write("\n")
956
+ xsd_writeAnnotation
957
+ xsd_writeMethodModifiers
958
+
959
+ #write("#{uml_class_one.xsd_Name}")
960
+ write("#{uml_ownedOperation_inv_one.xsd_Name}")
961
+
962
+ xsd_writeMethodParameters
963
+ xsd_writeMethodThrows
964
+ xsd_writeMethodBody
965
+ end
966
+ end
967
+
968
+ module Muml_Operation
969
+ rdf_safe_attr_reader_many :xsd_getter_property
970
+ rdf_safe_attr_reader_many :xsd_setter_property
971
+ include Mxsd_Annotation
972
+
973
+ #Attribut pouvant contenir le code java de la methode.
974
+ #Utilise lorsque le xsd_code est calcul? automatiquement.
975
+ rdf_safe_attr_reader_many :xsd_code
976
+
977
+ #is operation synchronised
978
+ rdf_safe_attr_reader_many :xsd_isSynchronised
979
+
980
+ #write java operation skeleton.
981
+ # (Uses xsd_writeMethodModifiers, xsd_writeMethodReturnType, xsd_writeMethodParameters, xsd_writeMethodThrows, xsd_writeMethodBody)
982
+ def xsd_write
983
+ write("\n")
984
+ #xsd_writeJavadoc
985
+ xsd_writeAnnotation
986
+ xsd_writeMethodModifiers
987
+
988
+ if(umlx_isConstructor?)
989
+ write("#{umlx_class_one.xsd_Name}")
990
+ else
991
+ xsd_writeMethodReturnType
992
+ write("#{xsd_Name}")
993
+ end
994
+ xsd_writeMethodParameters
995
+ xsd_writeMethodThrows
996
+ xsd_writeMethodBody
997
+ end
998
+
999
+ #write java method modifiers.
1000
+ # (Uses xsd_writeAbstract, xsd_visibilityModifiers, xsd_writeStaticModifiers)
1001
+ # Visibility is not generated for interfaces (to make checkstyle happy)
1002
+ #Example:
1003
+ #* abstract public
1004
+ #* public static
1005
+ def xsd_writeMethodModifiers
1006
+
1007
+
1008
+ if !umlx_class_one.kind_of?(Muml_Interface)
1009
+ uml_visibility.each { |v|
1010
+ write(v.xsd_visibilityModifiers)
1011
+ }
1012
+ end
1013
+ xsd_writeStaticModifier
1014
+ xsd_writeAbstract
1015
+ write "synchronized "if xsd_isSynchronised?
1016
+
1017
+ #xsd_writeModifiers
1018
+ #abstract synchronized ...
1019
+ #TODO uml_classifier_isAbstract
1020
+ end
1021
+
1022
+ #write abstract keyword if necessary.
1023
+ def xsd_writeAbstract
1024
+ write("abstract ") if uml_isAbstract?
1025
+ end
1026
+
1027
+ #write method return type
1028
+ # (Uses xsd_writeParameterType)
1029
+ def xsd_writeMethodReturnType
1030
+ xsd_writeParameterType(umlx_returnResult_one0)
1031
+ end
1032
+
1033
+ #write java type parameter (without the name)
1034
+ #
1035
+ #Example:
1036
+ #* void
1037
+ #* int
1038
+ #* pack1.Class1
1039
+ def xsd_writeParameterType(fp)
1040
+ if (fp.nil?)
1041
+ write("void ")
1042
+ else
1043
+ fp.xsd_write
1044
+ #uml_isException (!! a ne pas confondre avec une exception)
1045
+ #uml_isOrdered
1046
+ #uml_isStream
1047
+ #uml_isUnique
1048
+ end
1049
+ end
1050
+ #Write the body of a java method.
1051
+ #
1052
+ #NOTE:
1053
+ #* The default generated operation throws a RuntimeException
1054
+ #* mtk_protected is used to allow inline java code modification (with Eclipse)
1055
+ def xsd_writeMethodBody
1056
+ if uml_isAbstract? || context[:xsd_interface]
1057
+ write(";\n")
1058
+ else
1059
+ write("{");
1060
+ mtk_protected(Mrdf_Resource::NOREVERSE) {
1061
+ if ! xsd_code_one0.nil?
1062
+ write xsd_code
1063
+ else
1064
+ xsd_writeMethodBodyNotImplemented
1065
+ end
1066
+ }
1067
+ write("}\n");
1068
+ end
1069
+ end
1070
+
1071
+ #writes default code for a method not implemented
1072
+ def xsd_writeMethodBodyNotImplemented
1073
+ write <<END
1074
+ //TODO: implement method body
1075
+ throw new java.lang.RuntimeException("[operation \\"#{xsd_Name}\\"not implemented]");
1076
+ END
1077
+ end
1078
+
1079
+ # write method throw clause.
1080
+ # (Uses xsd_qualifiedName )
1081
+ #
1082
+ # Example:
1083
+ # * throws java.lang.Exception
1084
+ def xsd_writeMethodThrows
1085
+ sep=" throws "
1086
+
1087
+ uml_raisedException.each { |exception|
1088
+ write(sep);
1089
+ write(exception.xsd_qualifiedName)
1090
+ sep=","
1091
+ }
1092
+ end
1093
+
1094
+ #write method parameters
1095
+ #
1096
+ #Example:
1097
+ #* ()
1098
+ #* (int x)
1099
+ #* (pack1.Class1 xyz, String z)
1100
+ def xsd_writeMethodParameters
1101
+ write("(")
1102
+ sep=""
1103
+ uml_ownedParameter.each { |op|
1104
+ next if op.uml_direction_one.isReturn?
1105
+ write(sep)
1106
+ sep=","
1107
+ op.xsd_write
1108
+ }
1109
+ write(")")
1110
+ end
1111
+ end
1112
+
1113
+ module Muml_Property
1114
+ include Mxsd_Annotation
1115
+ rdf_safe_attr_reader_many :xsd_AttributeGlobalSetter
1116
+ rdf_safe_attr_reader_many :xsd_AttributeGlobalGetter
1117
+
1118
+ #Attribut pouvant contenir la valeur initiale.
1119
+ #Utilise lorsque le xsd_code est calcul? automatiquement.
1120
+ rdf_safe_attr_reader_many :xsd_code
1121
+
1122
+ #Transient attribute
1123
+ rdf_safe_attr_reader_many :xsd_isTransient
1124
+
1125
+ #is persistent (in database)
1126
+ rdf_safe_attr_reader_many :db_isTransient
1127
+
1128
+ #property is final
1129
+ rdf_safe_attr_reader_many :xsd_isFinal
1130
+
1131
+ #Methode vide
1132
+ def xsd_writePropertyComment
1133
+ end
1134
+ #Methode vide
1135
+ def xsd_writeGetterComment
1136
+ end
1137
+ #Methode vide
1138
+ def xsd_writeSetterComment
1139
+ end
1140
+
1141
+ def xsd_writeMaxOccurs
1142
+ return if umlx_upperValueIsOne?
1143
+ write(%{ maxOccurs="})
1144
+ u=uml_upperValue.to_s
1145
+ if(u=="-1")
1146
+ write("unbounded")
1147
+ else
1148
+ write(u)
1149
+ end
1150
+ write(%{"})
1151
+ end
1152
+ def xsd_writeMinOccurs
1153
+ return if umlx_lowerValueIsOne?
1154
+ write(%{ minOccurs="})
1155
+ u=uml_lowerValue.to_s
1156
+ if(u=="-1")
1157
+ write("unbounded")
1158
+ else
1159
+ write(u)
1160
+ end
1161
+ write(%{"})
1162
+
1163
+ end
1164
+ #write java attribute variable
1165
+ # (Uses xsd_writePropertyComment, xsd_writePropertyModifiers ,xsd_propertyRoleType,xsd_NameProperty)
1166
+ #
1167
+ #NOTE:
1168
+ #* getter/setter/... methods are handled by model transformation
1169
+ def xsd_writeProperty
1170
+ write(%{ <xsd:element name="#{xsd_Name}" type="#{uml_type_one.xsd_qualifiedName}"})
1171
+ xsd_writeMinOccurs
1172
+ xsd_writeMaxOccurs
1173
+ write(%{/>\n})
1174
+ # return
1175
+ # if !uml_isDerived?
1176
+ # xsd_writePropertyComment
1177
+ # xsd_writeAnnotation
1178
+ # write(" ");
1179
+ # xsd_writePropertyModifiers
1180
+ # write("#{xsd_propertyAssociationType}")
1181
+ # write(" #{xsd_NameProperty}")
1182
+ #
1183
+ # if !xsd_code.empty?
1184
+ # write"= #{xsd_code}"
1185
+ # elsif(context[:xsd_generateSetAttributeInitializer])
1186
+ # if (!umlx_upperValueIsOne?) && uml_qualifier.empty? && xsd_use_Arrays?
1187
+ # write("= new ");
1188
+ # write(uml_type_one.xsd_qualifiedName)
1189
+ # write("[1]")
1190
+ # elsif (!umlx_upperValueIsOne?) && uml_qualifier.empty?
1191
+ # write("= new ");
1192
+ # write(xsd_propertyAssociationConcreteType)
1193
+ # write("()")
1194
+ # elsif umlx_upperValueIsOne? && !uml_qualifier.empty?
1195
+ # write("= new ");
1196
+ # write(xsd_propertyAssociationConcreteType)
1197
+ # write("()")
1198
+ # elsif !umlx_upperValueIsOne? && !uml_qualifier.empty?
1199
+ # #write("= new ");
1200
+ # #write(xsd_propertyAssociationConcreteType)
1201
+ # #write("()")
1202
+ # end
1203
+ # end
1204
+ # write(";\n")
1205
+ # end
1206
+ end
1207
+
1208
+
1209
+
1210
+ #write java modifiers if needed (public, static, ...)
1211
+ # (Uses xsd_visibilityModifiers, xsd_writeStaticModifier)
1212
+ # example: private static final transient long
1213
+ def xsd_writePropertyModifiers
1214
+
1215
+ uml_visibility.each { |v|
1216
+ write(v.xsd_visibilityModifiers)
1217
+ }
1218
+ xsd_writeStaticModifier
1219
+ xsd_writeFinalModifier
1220
+ xsd_writeTransient
1221
+ end
1222
+
1223
+ def xsd_writeFinalModifier
1224
+ return unless xsd_isFinal?
1225
+ write "final "
1226
+ end
1227
+
1228
+ #write java transient modifier if needed.
1229
+ def xsd_writeTransient
1230
+ return unless xsd_isTransient?
1231
+ write("transient ")
1232
+ end
1233
+
1234
+ end
1235
+
1236
+
1237
+
1238
+ module Muml_TypedElement
1239
+ rdf_safe_attr_reader_many :xsd_use_Arrays
1240
+
1241
+ #return java property type.
1242
+ # (Uses xsd_qualifiedName)
1243
+ #
1244
+ #NOTE
1245
+ #* used for UML Parameter and UML Property
1246
+ #* return "int" and a TODO comment if uml_type is undefined.
1247
+ #
1248
+ #Example:
1249
+ #* String
1250
+ #* Set<String>
1251
+ def xsd_propertyRoleConcreteType
1252
+ return xsd_getCollectionMapping.addCollectionImplem(
1253
+ uml_type.empty? ? "Integer /* TODO: FIX:undefined type in uml model */ " : uml_type_one.xsd_qualifiedName )
1254
+ end
1255
+
1256
+ def xsd_propertyRoleType
1257
+ return xsd_getCollectionMapping.addCollectionInterface(
1258
+ uml_type.empty? ? "Integer /* TODO: FIX:undefined type in uml model */ " : uml_type_one.xsd_qualifiedName )
1259
+ end
1260
+
1261
+ def xsd_propertyAssociationConcreteType
1262
+ return xsd_propertyRoleConcreteType if uml_qualifier.empty?
1263
+ j="java.util.Hashtable<"
1264
+ sep_next=""
1265
+ uml_qualifier.each { |key|
1266
+ j=j+sep_next+key.xsd_propertyRoleConcreteType
1267
+ sep_next=","
1268
+ }
1269
+ j=j+","+xsd_propertyRoleConcreteType+">"
1270
+ return j
1271
+ end
1272
+ def xsd_propertyAssociationType
1273
+ return xsd_propertyRoleType if uml_qualifier.empty?
1274
+ j="java.util.Hashtable<"
1275
+ sep_next=""
1276
+ uml_qualifier.each { |key|
1277
+ j=j+sep_next+key.xsd_propertyRoleType
1278
+ sep_next=","
1279
+ }
1280
+ j=j+","+xsd_propertyRoleType+">"
1281
+ return j
1282
+ end
1283
+ end
1284
+
1285
+
1286
+
1287
+ module Muml_DataType
1288
+ #Predefined UML datatype to Java type mapping.
1289
+ #Note: A string is used for Calendar.
1290
+ #UML_TO_JAVA_PRIMITIVE_TYPE_MAPPING={"byte"=>"byte","short"=>"short","long"=>"long","Boolean"=>"boolean","boolean"=>"boolean","int"=>"int","integer"=>"int","Integer"=>"int", "String"=>"String","string"=>"String","date"=>"java.util.Date","double"=>"double","char"=>"char","Calendar"=>"String","TimeStamp"=>"java.util.Date"}
1291
+
1292
+ # returns datatype qualified name.
1293
+ #
1294
+ # NOTE:
1295
+ # * A predefined mapping is defined UML_TO_JAVA_PRIMTIVE_TYPE_MAPPING
1296
+ # * MagicDraw handles primtive types as DataType
1297
+ # * RSM handles primtive types as PrimitiveType
1298
+ def xsd_qualifiedName
1299
+ return super if kind_of?(Muml_Enumeration)
1300
+
1301
+ return DatatypeMapping.instance.getMapping(self).xsd_getType
1302
+
1303
+
1304
+ ot=uml_name_one
1305
+ mt=::Muml_PrimitiveType::UML_TO_JAVA_PRIMITIVE_TYPE_MAPPING[ot]
1306
+ return mt unless mt.nil? || mt.to_s==""
1307
+ #avoid multiple messages
1308
+ ::Muml_PrimitiveType::UML_TO_JAVA_PRIMITIVE_TYPE_MAPPING[ot]="String"
1309
+ log.error %{
1310
+ WARN: A default java mapping has been created for DataType #{ot}
1311
+ HELP:
1312
+ HELP: To declare a new mapping, create a new entry as shown bellow:
1313
+ HELP: module Muml_DataType
1314
+ HELP: UML_TO_JAVA_PRIMITIVE_TYPE_MAPPING["#{ot}"]="your target java type"
1315
+ HELP: end
1316
+ } #(not useful here) unless log_already_displayed?("#{rdf_uri}__datatype")
1317
+ return xsd_qualifiedName # retry
1318
+ end
1319
+ end
1320
+
1321
+ module Mrdf_Resource
1322
+ #return true if java generator should totaly ignore this element.
1323
+ #
1324
+ #NOTE:
1325
+ #* Default implementation returns false
1326
+ def xsd_ignoreMe?
1327
+ return false
1328
+ end
1329
+ end
1330
+
1331
+ #module Muml_ClassifierTemplateParameter
1332
+ # def umlx_hierarchy
1333
+ # return nil
1334
+ # end
1335
+ # def xsd_ignoreMe?
1336
+ # return true
1337
+ # end
1338
+ #end
1339
+
1340
+
1341
+
1342
+
1343
+ module Muml_Interface
1344
+
1345
+ #does nothing
1346
+ def xsd_writeImplements
1347
+ end
1348
+
1349
+ #write java interface keyword and interface name
1350
+ #
1351
+ #Example:
1352
+ #* interface Interface1
1353
+ # def xsd_writeMetaClassName
1354
+ # write("interface #{xsd_Name}")
1355
+ # end
1356
+
1357
+ def xsd_makeSerializable!
1358
+ #xsd_implements_add("java.io.Serializable");
1359
+ s=umlx_getOrCreateClass("java.io.Serializable")
1360
+ umlx_createAndAddGeneralization(s)
1361
+ end
1362
+ end
1363
+