ontomde-java 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
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
+