ontomde-uml2-java 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,304 @@
1
+
2
+ module Muml_Property
3
+ #do not generate property accessors if true
4
+ rdf_safe_attr_reader_many :java_noAccessors
5
+ rdf_safe_attr_reader_many :java_isSuggester
6
+ rdf_safe_attr_reader_many :java_createAndAddSuggester
7
+ end
8
+
9
+ module Muml_Classifier
10
+ #
11
+ #Performs a model transformation to add
12
+ #* attribute getter
13
+ #* attribute setter
14
+ #* attribute remover
15
+ #* attribute appender
16
+ #* attribute suggester
17
+ #NOTE:
18
+ #* java_transform! is skipped if context[:java_transform] is false (default=true)
19
+
20
+ def java_transform!
21
+ uml_ownedAttribute.each { |oa|
22
+ java_addAccessorsFor!(oa)
23
+ }
24
+ end
25
+ def java_addAccessors!
26
+ java_transform!
27
+ end
28
+
29
+
30
+ def java_addAccessorsFor!(oa)
31
+ #log.debug { "-------java.transform:Accessor for #{self.uml_name}.#{oa.uml_name}" }
32
+ return unless context[:java_transform,true]
33
+ return if oa.java_noAccessors?
34
+
35
+ oa.uml_visibility=Cuml_VisibilityKind::Private
36
+
37
+ #prevent multiple accessor addition.
38
+ #useful when a transformation has manually launch
39
+ #java_addAccessorFor! (ex: to set a custom getter code)
40
+ return unless oa.java_getter_property_inv.empty?
41
+ java_addGlobalGetter!(oa)
42
+ java_addGlobalSetter!(oa)
43
+ java_addQualifiedPutter!(oa)
44
+ java_addQualifiedGetter!(oa)
45
+ java_addAppender!(oa)
46
+ java_addCreateAndAppender!(oa)
47
+ java_addWithIndexAppender!(oa)
48
+ java_addAppenderQualifier!(oa)
49
+ java_addRemover!(oa)
50
+ java_addSuggester!(oa)
51
+ java_addSuggesterType!(oa)
52
+ java_addCreater!(oa)
53
+ end
54
+ end
55
+
56
+
57
+ module Muml_Classifier
58
+ def java_createAndAddMethodFromProperty(oa,mName,withQualifier,uri_suffix="")
59
+ m=umlx_createAndAddOperation(oa.rdf_uri+"_#{mName}"+uri_suffix)
60
+ m.uml_name="#{mName}#{oa.java_NameBean}"
61
+ m.uml_class=self
62
+ m.uml_visibility=Cuml_VisibilityKind::Public
63
+ m.uml_isStatic=oa.uml_isStatic
64
+ m.java_use_Arrays=oa.java_use_Arrays
65
+ #puts "java_use_Arrays(#{oa})=#{m.java_use_Arrays}"
66
+
67
+
68
+ if withQualifier
69
+ oa.uml_qualifier.each { |qual|
70
+ ip_qual=m.umlx_createAndAddParameter(m.rdf_uri+qual.rdf_uri)
71
+ ip_qual.java_use_Arrays=oa.java_use_Arrays
72
+ qual.umlx_copyToAttributeProperty(ip_qual)
73
+ ip_qual.uml_name=qual.uml_name
74
+ ip_qual.uml_direction=Cuml_ParameterDirectionKind::In
75
+ }
76
+ oe=oa.umlx_otherEnd
77
+ if((!oe.nil?) && oe.umlx_isNavigable?)
78
+ oe.uml_qualifier.each { |qual|
79
+ ip_qual=m.umlx_createAndAddParameter(m.rdf_uri+qual.rdf_uri)
80
+ ip_qual.java_use_Arrays=oa.java_use_Arrays
81
+ qual.umlx_copyToAttributeProperty(ip_qual)
82
+ ip_qual.uml_name=qual.uml_name
83
+ ip_qual.uml_direction=Cuml_ParameterDirectionKind::In
84
+ }
85
+ end
86
+ end
87
+ return m
88
+ end
89
+
90
+
91
+ def getterParameterName(oa)
92
+ return "i#{oa.java_NameProperty}"
93
+
94
+ end
95
+
96
+ #Adds a putter for parameter oa using a model transformation. (manages addition to a hastable):
97
+ #
98
+ #NOTE:
99
+ #* This code is generated when a *qualifier* is defined in model.
100
+ #* Languages do not not handled multiple key Hastable.
101
+ #* A new operation is puttered to the UML model. The operation then generated using standard operation generator.
102
+ #* operation is only generated for multi-valued property
103
+ #*WARNING: bi-directional cannot be handled with qualifier because association key is not known.
104
+ #* a TODO note is added in the code in case model is bi-directional so developper knows something has to be done.
105
+ #
106
+ #EXAMPLE 1: (uml_upperValue==1)
107
+ # Class3 putRoleClass3(String key) {
108
+ # ...
109
+ # }
110
+ #
111
+ #EXAMPLE 2 (uml_upperValue==*):
112
+ # Set<Class3> putRoleClass3(String key) {
113
+ # ...
114
+ # }
115
+ def java_addQualifiedPutter!(oa)
116
+ return unless context[:java_addQualifiedPutter,true]
117
+ return if oa.uml_qualifier.empty?
118
+ return unless !oa.uml_isDerived?
119
+
120
+ putter=java_createAndAddMethodFromProperty(oa,"put",true)
121
+ ip=putter.umlx_createAndAddParameter(putter.rdf_uri+"_in")
122
+ ip.java_use_Arrays=oa.java_use_Arrays
123
+ oa.umlx_copyToAttributeProperty(ip)
124
+ ip.uml_name=getterParameterName(oa)
125
+ ip.uml_direction=Cuml_ParameterDirectionKind::In
126
+ oe=oa.umlx_otherEnd
127
+ putter.java_code= mtk_stss { java_writeQualifiedPutterBody(oa) }
128
+ return putter
129
+ end
130
+
131
+ #Adds a suggester for parameter oa using a model transformation.
132
+ #
133
+ #NOTE:
134
+ #* A new operation is added to the UML model. The operation then generated using standard operation generator.
135
+ #* A suggester returns a set of possible value for the parameter.
136
+ #* Suggester is not generated for datatypes (string, int, ...)
137
+ #* A default suggester is generated for enum that return every enum values
138
+ #* A default non functional suggester is generated for objects.
139
+ def java_addSuggester!(oa)
140
+ return if oa.java_isSuggester?
141
+ return if oa.uml_isReadOnly?
142
+ #log.debug { "add suggester (#{oa}) self=#{self}" }
143
+ return unless context[:java_addSuggester,true]
144
+ return if oa.uml_type_one.kind_of?(Muml_DataType) && !oa.uml_type_one.kind_of?(Muml_Enumeration)
145
+
146
+ #sug=umlx_createAndAddProperty("#{oa.rdf_uri}_sugP","#{oa.uml_name}Sug2")
147
+ #sug2.uml_type=oa.uml_type
148
+ #sug2.uml_upperValue=umlx_literal(-1)
149
+ #sug2.uml_lowerValue=umlx_literal(0)
150
+ #sug2.uml_isOrdered=RDF_TRUE
151
+ #sug2.uml_isDerived=RDF_TRUE
152
+ #sug2.java_isSuggester=RDF_TRUE
153
+
154
+
155
+ sug=java_createAndAddMethodFromProperty(oa,"sug",false)
156
+ #suggester is a defined as a bean property so it can be used with tools such as struts.
157
+ sug.uml_name="get#{oa.java_NameBean}Sug"
158
+ #java_createAndAddMethodParameterFromProperty(oa,true)
159
+
160
+ rp=sug.umlx_createAndAddParameter(sug.rdf_uri+"_p1")
161
+ #rp.java_use_Arrays=oa.java_use_Arrays
162
+ oa.umlx_copyToAttributeProperty(rp)
163
+ rp.uml_name="return"
164
+ rp.uml_direction=Cuml_ParameterDirectionKind::Return
165
+ rp.uml_upperValue=umlx_literal(-1)
166
+ rp.uml_lowerValue=umlx_literal(0)
167
+ rp.uml_isOrdered=RDF_TRUE
168
+
169
+ if(oa.uml_type_one.kind_of?(Muml_Enumeration))
170
+ sug.java_code=mtk_stss{ java_writeSuggesterBodyEnum(oa) }
171
+ else
172
+ sug.java_code=mtk_stss{ java_writeSuggesterBody(oa) }
173
+ end
174
+ return sug
175
+ end
176
+
177
+ #adds a suggester for creator.
178
+ #Returns an enum of possible types.
179
+ def java_addSuggesterType!(oa)
180
+ #log.debug { "add suggester (#{oa}) self=#{self}" }
181
+ return if oa.uml_isReadOnly?
182
+ return unless context[:withEnumAssignable]
183
+ return unless context[:java_addSuggester,true]
184
+ return if oa.uml_type_one.kind_of?(Muml_DataType) && !oa.uml_type_one.kind_of?(Muml_Enumeration)
185
+ return unless oa.umlx_isComposite?
186
+ sug=java_createAndAddMethodFromProperty(oa,"createAndAddSug",false)
187
+ #suggester is a defined as a bean property so it can be used with tools such as struts.
188
+ sug.uml_name="getCreateAndAdd#{oa.java_NameBean}Sug"
189
+ rp=sug.umlx_createAndAddParameter(sug.rdf_uri+"_p1")
190
+ #rp.java_use_Arrays=oa.java_use_Arrays
191
+ oa.umlx_copyToAttributeProperty(rp)
192
+ rp.uml_type=oa.uml_type_one.java_enumAssignableDataType
193
+ rp.uml_name="return"
194
+ rp.uml_direction=Cuml_ParameterDirectionKind::Return
195
+ rp.uml_upperValue=umlx_literal(-1)
196
+ rp.uml_lowerValue=umlx_literal(0)
197
+ rp.uml_isOrdered=RDF_TRUE
198
+
199
+ isCreateAndAdd=true
200
+ sug.java_code=mtk_stss{ java_writeSuggesterTypeBodyEnum(oa,isCreateAndAdd) }
201
+ oa.java_createAndAddSuggester=sug
202
+ return sug
203
+ end
204
+
205
+ #Adds a getter for parameter oa using a model transformation.
206
+ #
207
+ #NOTE:
208
+ #* A new operation is added to the UML model. The operation then generated using standard operation generator.
209
+ #* If property is part of a *bidirectional* association, code is generated to update automaticaly the other side of the association.
210
+ #* If property is multivalued, the operation returns a set.
211
+ def java_addGlobalGetter!(oa)
212
+ return unless context[:java_addGlobalGetter,true]
213
+ #return if oa.uml_isDerived?
214
+ #return unless oa.uml_isReadOnly?
215
+ return unless oa.java_AttributeGlobalGetter.empty?
216
+ get=java_createAndAddMethodFromProperty(oa,"get",false)
217
+ get.java_getter_property=oa
218
+ oa.java_AttributeGlobalGetter=get
219
+
220
+ rp=get.umlx_createAndAddParameter(get.rdf_uri+"_p1")
221
+ rp.java_use_Arrays=oa.java_use_Arrays
222
+ oa.umlx_copyToAttributeProperty(rp)
223
+ rp.uml_name="return"
224
+ rp.uml_direction=Cuml_ParameterDirectionKind::Return
225
+ rp.uml_qualifier=oa.uml_qualifier
226
+ get.java_code=mtk_stss {java_writeGlobalGetterBody(oa) }
227
+ return get
228
+ end
229
+
230
+ #Adds a setter for parameter oa using a model transformation.
231
+ #
232
+ #NOTE:
233
+ #* A new operation is added to the UML model. The operation then generated using standard operation generator.
234
+ #* If property is part of a *bidirectional* association, code is generated to update automaticaly the other side of the association.
235
+ #* If property is multivalued, the operation takes a set as an argument. For single value access use appender and remover.
236
+ def java_addGlobalSetter!(oa)
237
+ return unless context[:java_addGlobalSetter,true]
238
+ return unless oa.java_AttributeGlobalSetter.empty?
239
+ # a setter is generated for derived attribute as it may be implemented.
240
+ #return unless !oa.uml_isDerived?
241
+ set=java_createAndAddMethodFromProperty(oa,"set",false)
242
+ set.java_setter_property=oa
243
+ oa.java_AttributeGlobalSetter=set
244
+
245
+ ip=set.umlx_createAndAddParameter(set.rdf_uri+"_in")
246
+ ip.java_use_Arrays=oa.java_use_Arrays
247
+ oa.umlx_copyToAttributeProperty(ip)
248
+ ip.uml_name=getterParameterName(oa)
249
+ ip.uml_direction=Cuml_ParameterDirectionKind::In
250
+ ip.uml_qualifier=oa.uml_qualifier
251
+ oe=oa.umlx_otherEnd
252
+ set.java_code=mtk_stss{java_writeGlobalSetterBody(oa)}
253
+ return set
254
+ end
255
+
256
+ def java_addQualifiedGetter!(oa)
257
+ return unless context[:java_addQualifiedGetter,true]
258
+ return if oa.uml_qualifier.empty?
259
+ return unless !oa.uml_isDerived?
260
+
261
+ getter=java_createAndAddMethodFromProperty(oa,"get",true)
262
+
263
+ rp=getter.umlx_createAndAddParameter(getter.rdf_uri+"_p1")
264
+ rp.java_use_Arrays=oa.java_use_Arrays
265
+ oa.umlx_copyToAttributeProperty(rp)
266
+ rp.uml_name="return"
267
+ rp.uml_direction=Cuml_ParameterDirectionKind::Return
268
+
269
+ getter.java_code=mtk_stss{java_writeQualifiedGetterBody(oa)}
270
+ return getter
271
+ end
272
+
273
+ def java_addWithIndexAppender!(oa)
274
+ return unless context[:java_addAppender,true]
275
+ return if oa.umlx_upperValueIsOne?
276
+ #return unless oa.uml_qualifier.empty?
277
+ return unless oa.uml_isOrdered?
278
+ return if oa.java_isSuggester?
279
+ return if oa.uml_isReadOnly?
280
+ #return if oa.umlx_isComposite?
281
+ add=java_createAndAddMethodFromProperty(oa,"add",true,"wi")
282
+
283
+ ip2=Cuml_Parameter.new(rdf_model,add.rdf_uri+"_in")
284
+ ip2.uml_name="_index"
285
+ ip2.uml_direction=Cuml_ParameterDirectionKind::In
286
+ ip2.uml_upperValue=umlx_literal(1);
287
+ ip2.uml_lowerValue=umlx_literal(1);
288
+ ip2.uml_type=umlx_dataType_integer
289
+ add.uml_ownedParameter_add(ip2)
290
+ oe=oa.umlx_otherEnd
291
+
292
+ ip=Cuml_Parameter.new(rdf_model,add.rdf_uri+"_in")
293
+ ip.uml_name=getterParameterName(oa)
294
+ ip.uml_direction=Cuml_ParameterDirectionKind::In
295
+ ip.uml_upperValue=umlx_literal(1);
296
+ ip.uml_lowerValue=umlx_literal(1);
297
+ ip.uml_type=oa.uml_type
298
+ add.uml_ownedParameter_add(ip)
299
+
300
+ add.java_code = mtk_stss{java_addWithIndexAppenderBody(oa,oe,ip,ip2)}
301
+ return add
302
+ end
303
+ end
304
+
@@ -0,0 +1,80 @@
1
+
2
+ module Mrdf_Resource
3
+ #returns directory containing compiled
4
+ #java classes and other ressources in classpath.
5
+ def java_ClassRelativeDir
6
+ p="#{context[:javaDir]}"
7
+ p="#{context[:webContentRelativeDir,p]}"
8
+ p="#{p}/WEB-INF/classes"
9
+ p="#{context[:javaClassDir,p]}"
10
+ return p
11
+ end
12
+ end
13
+ module Mrdf_Model
14
+ #returns directory containing compiled
15
+ #java classes and other ressources in classpath.
16
+ def java_ClassRelativeDir
17
+ p="#{context[:javaDir]}"
18
+ p="#{context[:webContentRelativeDir,p]}"
19
+ p="#{p}/WEB-INF/classes"
20
+ p="#{context[:javaClassDir,p]}"
21
+ return p
22
+ end
23
+ end
24
+
25
+ module Mrdf_Model
26
+ def java_generateAntBuildFile
27
+ return unless context[:generateAntBuildFile,false]
28
+
29
+ mtk_writeSession("#{context[:targetDir]}/build.xml") {
30
+ write %{
31
+ <project name="demo" default="all">
32
+
33
+ <target name="all" depends="compile,log4j" />
34
+
35
+ <target name="compile">
36
+ <mkdir dir="#{java_ClassRelativeDir}" />
37
+ <sync todir="#{java_ClassRelativeDir}">
38
+ <fileset dir="#{context[:javaRelativeDir]}">
39
+ <include name="**/*"/>
40
+ <exclude name="**/*.java"/>
41
+ </fileset>
42
+ <!-- only supported if ant >=1.7
43
+ <preserveintarget>
44
+ <include name="**/*.class"/>
45
+ </preserveintarget>
46
+ -->
47
+ </sync>
48
+ <javac srcdir="#{context[:javaRelativeDir]}" destdir="#{java_ClassRelativeDir}" debug="yes">
49
+ <classpath>
50
+ <!-- catch-all -->
51
+ <fileset dir="." includes="**/*.jar" />
52
+ </classpath>
53
+ <compilerarg value="-Xlint:deprecation"/>
54
+ <compilerarg value="-Xlint:unchecked"/>
55
+ </javac>
56
+ </target>
57
+ <target name="log4j">
58
+ <concat destfile="#{java_ClassRelativeDir}/log4j.properties">
59
+ <header filtering="no" trimleading="yes">
60
+ # ---------------------------------------
61
+ # Changes to this file will be deleted
62
+ # on next ant build because
63
+ # this file is the concatenation of
64
+ # file matching log4j*.properties
65
+ # in #{context[:javaRelativeDir]}"
66
+ # ---------------------------------------
67
+ </header>
68
+
69
+ <fileset dir="#{context[:javaRelativeDir]}" includes="log4j*.properties"/>
70
+ </concat>
71
+ </target>
72
+ <target name="clean" />
73
+
74
+ </project>
75
+ }
76
+ }
77
+ end
78
+ end
79
+
80
+
@@ -0,0 +1,98 @@
1
+ # Java collection mapping rules for UML property and UML parameter.
2
+
3
+ module Muml_MultiplicityElement
4
+ #returns a Java_collectionMaping object containing mapping rules to java collection element (Array, List, Set, ...)
5
+ def java_getCollectionMapping
6
+ if self.umlx_upperValueIsOne?
7
+ return Java_collectionMapping_None.instance
8
+ elsif java_use_Arrays?
9
+ return Java_collectionMapping_Array.instance
10
+ elsif uml_isOrdered?
11
+ # this mapping is used wether or not isUnique
12
+ return Java_collectionMapping_List_ArrayList.instance
13
+ elsif uml_isUnique
14
+ return Java_collectionMapping_Set_HashSet.instance
15
+ else
16
+ return Java_collectionMapping_Collection_ArrayList.instance
17
+ end
18
+ end
19
+
20
+ end
21
+ class Java_collectionMapping_None
22
+ include Singleton
23
+ #return type enclosed in collection interface declaration
24
+ def addCollectionInterface(type)
25
+ return type
26
+ end
27
+ #return type enclosed in collection implementation declaration
28
+ def addCollectionImplem(type)
29
+ return type
30
+ end
31
+ end
32
+ class Java_collectionMapping_base
33
+ #return type enclosed in collection interface declaration
34
+ def addCollectionInterface(type)
35
+ return "#{getInterface}<#{type}>"
36
+ end
37
+ #return type enclosed in collection implementation declaration
38
+ def addCollectionImplem(type)
39
+ return "#{getImplem}<#{type}>"
40
+ end
41
+ #return new element type collection creator
42
+ def addNew(type)
43
+ return "new #{getImplem}<#{type}>()"
44
+ end
45
+ end
46
+ class Java_collectionMapping_Collection_ArrayList < Java_collectionMapping_base
47
+ include Singleton
48
+ #returns interface type for this collection
49
+ def getInterface
50
+ return "Collection"
51
+ end
52
+ #returns implementation class for this collection
53
+ def getImplem
54
+ return "java.util.ArrayList"
55
+ end
56
+ end
57
+
58
+ class Java_collectionMapping_List_ArrayList < Java_collectionMapping_base
59
+ include Singleton
60
+ #returns interface type for this collection
61
+ def getInterface
62
+ return "java.util.List"
63
+ end
64
+ #returns implementation class for this collection
65
+ def getImplem
66
+ return "java.util.ArrayList"
67
+ end
68
+ end
69
+ class Java_collectionMapping_Set_HashSet < Java_collectionMapping_base
70
+ include Singleton
71
+ #returns interface type for this collection
72
+ def getInterface
73
+ return "java.util.Set"
74
+ end
75
+ #returns implementation class for this collection
76
+ def getImplem
77
+ return "java.util.HashSet"
78
+ end
79
+ end
80
+ class Java_collectionMapping_Array
81
+ include Singleton
82
+ #return type enclosed in collection interface declaration
83
+ def addCollectionInterface(type)
84
+ return "#{type}[]"
85
+ end
86
+ #return type enclosed in collection implementation declaration
87
+ def addCollectionImplem(type)
88
+ return "#{type}[]"
89
+ end
90
+ #return new element type collection creator
91
+ def addNew(type)
92
+ return "new #{type}[0]"
93
+ end
94
+ end
95
+
96
+
97
+
98
+
@@ -0,0 +1,67 @@
1
+ #For each model class, create an enum containing a list of assignable type.
2
+ #
3
+ module Muml_Element
4
+ JAVA_ENUM_INTERFACE_QNAME="xmda.java.JavaEnumSig"
5
+ end
6
+
7
+
8
+ module Mrdf_Model
9
+ #generates an EnumAssignable for each model element.
10
+ def java_addJavaEnumInterface!
11
+ return unless context[:java_addJavaEnumInterface]
12
+ uml_Class_all.each {|c|
13
+ next unless c.kind_of?(Muml_Enumeration)
14
+ i=c.java_getJavaEnumInterface
15
+ c.umlx_createAndAddImplementation(i)
16
+ }
17
+ end
18
+ def java_addEnumAssignable!
19
+ uml_Class_all.each {|c|
20
+ next if c.kind_of?(Muml_Enumeration)
21
+ next if c.umlx_external?
22
+ c.java_addEnumAssignable!
23
+ }
24
+ end
25
+ end
26
+
27
+ module Muml_Classifier
28
+ #Enum assignbable related to this model Element
29
+ rdf_safe_attr_reader_many :java_enumAssignableDataType
30
+
31
+
32
+ #String used to replace dot in enum literals
33
+ JAVA_MAGIC_DOT_STRING='_dot_'
34
+
35
+ #add an enum assignable to this model element
36
+ def java_addEnumAssignable!
37
+ #log.debug { "java_addEnumAssignable! for #{self}::#{self.class.name}" }
38
+ p=umlx_owner_one
39
+ p=p.umlx_getOrCreatePackage(context[:enumAssignableSubPackage,"enumCreate"],p)
40
+
41
+ ret=p.umlx_createAndAddEnumeration(self.rdf_uri+"_enumAssignable","#{uml_name} Assignable")
42
+ ret.umlx_createAndAddImplementation(java_getJavaEnumInterface)
43
+ self.java_enumAssignableDataType=ret
44
+
45
+ umlx_assignableClassifier.each { |c|
46
+ next if c.uml_isAbstract?
47
+ ret.umlx_createAndAddLiteral(c.java_qualifiedName.to_s.gsub(/\./,JAVA_MAGIC_DOT_STRING));
48
+ }
49
+
50
+ return ret
51
+ end
52
+ def java_getJavaEnumInterface
53
+ ret=umlx_getOrCreateInterface(JAVA_ENUM_INTERFACE_QNAME)
54
+ if ret.uml_ownedOperation.empty?
55
+ ret.umlx_external="false"
56
+ op=ret.umlx_createAndAddOperation("#{ret.rdf_uri}_name}","name")
57
+ r=op.umlx_createAndAddReturnParameter("#{op.rdf_uri}_ret","return")
58
+ r.uml_type=umlx_dataType_string
59
+ op.umlx_businessMethod=RDF_FALSE
60
+ end
61
+ return ret
62
+ end
63
+
64
+
65
+ end
66
+
67
+