ontomde-uml2-java 1.0.4

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