ontomde-uml2-jpa 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,277 @@
1
+ #
2
+ #
3
+
4
+ module Muml_Operation
5
+ #true puts annotation on getter
6
+ #false puts annotation on attribute
7
+ JPA_ANNOTATE_GETTER=false
8
+
9
+
10
+ def jpa_addPersistence!
11
+ # java_AttributeGlobalSetter
12
+ # java_getter_property
13
+ if java_getter_property.empty?
14
+ return if(umlx_hasStereotype?("Create"))
15
+ #java_annotation_add("@Transient")
16
+ return
17
+ end
18
+
19
+ p=java_getter_property_one
20
+ return unless p.jpa_isPersistent?
21
+
22
+ if p.uml_type_one.kind_of?(Cuml_Class) && !p.uml_type_one.jpa_isPersistent?
23
+ p.java_annotation_add("/* not persistent */")
24
+ return
25
+ end
26
+
27
+ if(JPA_ANNOTATE_GETTER)
28
+ p.jpa_addPersistenceTo!(self)
29
+ # HACK
30
+ p.jpa_addPersistenceTo!(p) #TODO: remove
31
+ #p.java_annotation_add("@Transient")
32
+ else
33
+ p.jpa_addPersistenceTo!(p)
34
+ end
35
+ end
36
+ end
37
+
38
+ module Muml_Property
39
+ def jpa_isPersistent?
40
+ return true
41
+ end
42
+ def jpa_addPersistenceUnidirOneToOne!(ah)
43
+ #TODO: unicity constraint
44
+ ah.java_annotation_add("@OneToOne(cascade=CascadeType.ALL) /*TPL: 101*/")
45
+ #TODO: affiner cascadeType pour les delete
46
+ end
47
+
48
+ def jpa_addPersistenceUnidirOneToMany!(ah)
49
+ ah.java_annotation_add(%{@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER) /*TPL:102*/})
50
+ jpa_addJoinTable(ah)
51
+ end
52
+ DEFAULT_CASCADE="(cascade=CascadeType.ALL)"
53
+ DEFAULT_CASCADE_I=",cascade=CascadeType.ALL"
54
+ def jpa_addPersistenceUnidirManyToOne!(ah)
55
+ ah.java_annotation_add("@ManyToOne #{DEFAULT_CASCADE} /*TPL:104*/")
56
+ jpa_addJoinColumn!(ah)
57
+ end
58
+
59
+ def jpa_addPersistenceUnidirManyToMany!(ah)
60
+ ah.java_annotation_add("@ManyToMany #{DEFAULT_CASCADE} /*TPL:105*/")
61
+ jpa_addJoinTable(ah)
62
+ jpa_addJoinColumn!(ah)
63
+ end
64
+ def jpa_addPersistenceBidirManyToManyMaster!(ah)
65
+ ah.java_annotation_add("@ManyToMany #{DEFAULT_CASCADE}/*TPL:106*/")
66
+ jpa_addJoinColumn!(ah)
67
+ jpa_addJoinTable(ah)
68
+ end
69
+ def jpa_addPersistenceBidirManyToManySlave!(ah)
70
+ ah.java_annotation_add("@ManyToMany #{DEFAULT_CASCADE}/*TPL:107*/")
71
+ jpa_addJoinColumn!(ah)
72
+ #Do not add join column !
73
+ #(or you will get 2 join tables)
74
+ #jpa_addJoinTable(ah)
75
+ end
76
+
77
+ def jpa_addPersistenceBidirOneToOneMaster!(ah)
78
+ ah.java_annotation_add(%{@OneToOne #{DEFAULT_CASCADE}/*TPL:108*/})
79
+ jpa_addJoinColumn!(ah)
80
+ end
81
+ def jpa_addPersistenceBidirOneToOneSlave!(ah)
82
+ ah.java_annotation_add(%{@OneToOne(mappedBy="#{umlx_otherEnd.java_NameProperty}" #{DEFAULT_CASCADE_I}) /*TPL:109*/})
83
+ end
84
+
85
+ def jpa_addPersistenceBidirOneToManyMaster!(ah)
86
+ ah.java_annotation_add(%{@OneToMany (mappedBy="#{umlx_otherEnd.java_NameProperty}"#{DEFAULT_CASCADE_I}) /*TPL:110*/})
87
+ end
88
+ def jpa_addPersistenceBidirOneToManySlave!(ah)
89
+ ah.java_annotation_add(%{@OneToMany (mappedBy="#{umlx_otherEnd.java_NameProperty}"#{DEFAULT_CASCADE_I}) /*TPL:111*/})
90
+ #jpa_addJoinColumn!(ah)
91
+ end
92
+
93
+ def jpa_addPersistenceBidirManyToOneMaster!(ah)
94
+ #ah.java_annotation_add(%{@ManyToOne(mappedBy="#{umlx_otherEnd.java_NameProperty}") /*TPL:112*/})
95
+ ah.java_annotation_add(%{@ManyToOne #{DEFAULT_CASCADE} /*TPL:112*/})
96
+ #ah.java_annotation_add(%{@JoinColumn(name="#{java_NameProperty}_fk"})
97
+ jpa_addJoinColumn!(ah)
98
+ end
99
+ def jpa_addPersistenceBidirManyToOneSlave!(ah)
100
+ #ah.java_annotation_add(%{@ManyToOne(mappedBy="#{umlx_otherEnd.java_NameProperty}") /*TPL:113*/})
101
+ ah.java_annotation_add(%{@ManyToOne #{DEFAULT_CASCADE} /*TPL:113*/})
102
+ #ah.java_annotation_add(%{@JoinColumn(name="#{java_NameProperty}_fk"})
103
+ jpa_addJoinColumn!(ah)
104
+ end
105
+
106
+ # adds a java annotation to specify the name of the join table.
107
+ #
108
+ #Note:
109
+ # Explicitely naming join colums and join table is required whenever multiple associations exists between two classes and also with reflexive associations.
110
+ #
111
+ #Examples:
112
+ # Object A (rolea)-->(roleb) Object B
113
+ # Table A_roleb
114
+ # field : A_id
115
+ # field : B_id
116
+ #
117
+ # Object A (rolea)-->(roleb) Object A
118
+ # Table A_roleb
119
+ # field : A_id
120
+ # field : A_self_id
121
+ #
122
+ def jpa_addJoinTable(ah)
123
+ postfix=(uml_ownedAttribute_inv_one==uml_type_one) ? "_self" : ""
124
+ ah.java_annotation_add %{ @JoinTable(
125
+ name="#{uml_ownedAttribute_inv_one.java_Name}_#{java_NameProperty}",
126
+ joinColumns={@JoinColumn( name="#{uml_ownedAttribute_inv_one.java_Name}_id")},
127
+ inverseJoinColumns={@JoinColumn(name="#{uml_type_one.java_Name}#{postfix}_id")}
128
+ ) /*TPL:116*/}
129
+ end
130
+
131
+ # adds JPA annotation for an attribute with a cardinality 0..1 or 1
132
+ def jpa_addPersistenceOneAttribute!(ah)
133
+ ml=JavaMapping.instance.getTemplate(self.uml_type_one).maxStringLength
134
+ if ml.nil?
135
+ ah.java_annotation_add(%{@Basic /*TPL:114*/})
136
+ else
137
+ ah.java_annotation_add(%{@Column(length=#{ml}) /*TPL:114b*/})
138
+ end
139
+ end
140
+
141
+ # adds JPA annotation for an attribute with a cardinality *
142
+ def jpa_addPersistenceManyAttribute!(ah)
143
+ ah.java_annotation_add(%{@Transient //TODO: standard JPA cannot handle this case. Hibernate extension @CollectionOfElements is required/*TPL:115*/})
144
+ end
145
+
146
+ def jpa_addJoinColumn!(ah)
147
+ ah.java_annotation_add(%{@JoinColumn(name="#{java_NameProperty}_fk") /*TPL:103*/})
148
+ end
149
+
150
+ #adds property persistence annotation to annotationHolder.
151
+ #
152
+ #annotationHolder may be depending on annotation style:
153
+ #* property itself self
154
+ #* getter for the property
155
+ def jpa_addPersistenceTo!(ah)
156
+ if umlx_isAttribute?
157
+ jpa_addPersistenceToAttribute!(ah)
158
+ else
159
+ jpa_addPersistenceToAssociation!(ah)
160
+ end
161
+ end
162
+
163
+ def jpa_addPersistenceToAttribute!(ah)
164
+ jpa_addPersistenceToAttribute_TypeModificator!(ah)
165
+ if umlx_upperValueIsOne?
166
+ jpa_addPersistenceOneAttribute!(ah)
167
+ else
168
+ jpa_addPersistenceManyAttribute!(ah)
169
+ end
170
+ return
171
+ end
172
+
173
+ def jpa_addPersistenceToAttribute_TypeModificator!(ah)
174
+ tpl=JavaMapping.instance.getTemplate(self.uml_type_one)
175
+ tpl.jpa_addTypeModificator(ah)
176
+ end
177
+
178
+ def jpa_addPersistenceToAssociation!(ah)
179
+ oe=umlx_otherEnd
180
+ binav=(!oe.nil?) && oe.umlx_isNavigable?
181
+ if binav
182
+ jpa_addPersistenceToAssociationBidir!(ah)
183
+ else
184
+ jpa_addPersistenceToAssociationUnidir!(ah)
185
+ end
186
+ end
187
+
188
+ def jpa_addPersistenceToAssociationUnidir!(ah)
189
+ toOne=umlx_upperValueIsOne?
190
+ fromOne=umlx_otherEnd.nil? ? true : umlx_otherEnd.umlx_upperValueIsOne?
191
+ if fromOne && toOne
192
+ jpa_addPersistenceUnidirOneToOne!(ah)
193
+ elsif fromOne && !toOne
194
+ jpa_addPersistenceUnidirOneToMany!(ah)
195
+ elsif !fromOne && toOne
196
+ jpa_addPersistenceUnidirManyToOne!(ah)
197
+ elsif !fromOne && !toOne
198
+ jpa_addPersistenceUnidirManyToMany!(ah)
199
+ else
200
+ raise Warning.new("Internal error")
201
+ end
202
+ end
203
+ def jpa_addPersistenceToAssociationBidir!(ah)
204
+ toOne=umlx_upperValueIsOne?
205
+ fromOne=umlx_otherEnd.nil? ? true : umlx_otherEnd.umlx_upperValueIsOne?
206
+ master=umlx_masterEnd?
207
+
208
+ if fromOne && toOne && (master)
209
+ jpa_addPersistenceBidirOneToOneMaster!(ah)
210
+ elsif fromOne && toOne && (!master)
211
+ jpa_addPersistenceBidirOneToOneSlave!(ah)
212
+ elsif fromOne && !toOne && (master)
213
+ jpa_addPersistenceBidirOneToManyMaster!(ah)
214
+ elsif fromOne && !toOne && (!master)
215
+ jpa_addPersistenceBidirOneToManySlave!(ah)
216
+ elsif !fromOne && toOne && (master)
217
+ jpa_addPersistenceBidirManyToOneMaster!(ah)
218
+ elsif !fromOne && toOne && (!master)
219
+ jpa_addPersistenceBidirManyToOneSlave!(ah)
220
+ elsif !fromOne && !toOne && (master)
221
+ jpa_addPersistenceBidirManyToManyMaster!(ah)
222
+ elsif !fromOne && !toOne && (!master)
223
+ jpa_addPersistenceBidirManyToManySlave!(ah)
224
+ else
225
+ raise Warning.new("Internal error")
226
+ end
227
+
228
+ return
229
+
230
+ # if umlx_oneToOne?
231
+ # if umlx_otherEnd.nil? || !umlx_otherEnd.umlx_isNavigable?
232
+ # jpa_addPersistenceUnidirOneToOne!(ah)
233
+ # #ah.java_annotation_add("@OneToOne")
234
+ #
235
+ # elsif umlx_masterEnd?
236
+ # ah.java_annotation_add("@OneToOne(cascade = {CascadeType.MERGE, CascadeType.REFRESH, CascadeType.PERSIST, CascadeType.REMOVE})")
237
+ # ah.java_annotation_add("@JoinColumn(name=\"#{umlx_otherEnd.java_NameBean}_fk\")")
238
+ # elsif
239
+ # ah.java_annotation_add("@OneToOne(mappedBy=\"#{umlx_otherEnd.java_NameProperty}\")")
240
+ # end
241
+ # end
242
+ # if umlx_manyToOne?
243
+ # if umlx_unidirectionnel?
244
+ # ah.java_annotation_add("//TOFIX MANY TO ONE Unideirectionnel NOT IMPLEMENTED")
245
+ # elsif
246
+ # ah.java_annotation_add("@ManyToOne")
247
+ # ah.java_annotation_add("@JoinColumn(name=\"#{umlx_otherEnd.java_NameBean}_fk\")")
248
+ # end
249
+ # end
250
+
251
+ end
252
+ end
253
+
254
+ class JavaMapping
255
+ def jpa_addTypeModificator(ah)
256
+ #nop
257
+ end
258
+ end
259
+ class JavaMappingCalendar < JavaMapping
260
+ def jpa_addTypeModificator(ah)
261
+ ah.java_annotation_add("@Temporal(TemporalType.DATE)")
262
+ end
263
+ end
264
+
265
+ class JavaMappingBLOB < JavaMapping
266
+ def jpa_addTypeModificator(ah)
267
+ ah.java_annotation_add("@Lob")
268
+ #mysql: MEDIUMBLOB LONGBLOB TINYBLOB BLOB
269
+ ah.java_annotation_add(%{@Column(columnDefinition="LONGBLOB")}) if ah.context[:mysql]
270
+ #cf: http://db.apache.org/derby/docs/10.1/ref/rrefblob.html
271
+ ah.java_annotation_add(%{@Column(columnDefinition="BLOB(4M)")}) if ah.context[:derby]
272
+ end
273
+ end
274
+ #class JavaMappingIMG < JavaMappingBLOB
275
+ #end
276
+
277
+
@@ -0,0 +1,75 @@
1
+ # This file includes methods redefinitions
2
+ #
3
+ module Muml_Interface
4
+ #returns implementing class dao name (if only one exists)
5
+ #def db_daoClassName
6
+ # jpa_daoClassName
7
+ #end
8
+ def jpa_daoClass
9
+ #log.debug { "Muml_Interface::jpa_daoClassName #{self}" }
10
+ found=nil
11
+ ext_isReferencedBy.each { |i|
12
+ next unless i.kind_of?(Muml_Implementation)
13
+ s=i.uml_supplier_one
14
+ next if s!=self
15
+ c=i.uml_client_one
16
+ raise Warning.new,"Too many jpa_daoClassName found for interface #{self}" unless found.nil? || found==c
17
+ found=c
18
+ }
19
+ raise Warning.new,"No jpa_daoClassName found for interface #{self}" if found.nil?
20
+ return found #.jpa_daoClassName
21
+ end
22
+ end
23
+
24
+ module Muml_Class
25
+ #def db_daoClassName
26
+ #jpa_daoClassName
27
+ #end
28
+ #def jpa_daoClassName
29
+ # return "#{java_qualifiedName}Dao"
30
+ #end
31
+
32
+ def db_getFindAllCall
33
+ param=context[:db_useExtraTypeParameterForFindAll] ? "(#{self.java_qualifiedName})null" : ""
34
+ return "#{java_DAOClass_one.java_qualifiedName}.findAll(#{param})"
35
+ end
36
+
37
+ #Method redefined from ontomde-uml2-java
38
+ #alias :original_java_writeSuggesterBody :java_writeSuggesterBody
39
+ def java_writeSuggesterBody(oa)
40
+ #log.debug {"adding suggester to #{self} for #{oa}"}
41
+ if oa.uml_type_one.jpa_isPersistent?
42
+ #TODO: recherche du composite commun
43
+ #TODO: transient object do not have a valid uniq id
44
+
45
+ #if oa.umlx_oneSide?
46
+ if !oa.umlx_manySide?
47
+ write( %{
48
+ /* TPL:0001jpa_one #{oa.umlx_oneSide?} */
49
+ java.util.List<#{oa.uml_type_one.java_qualifiedName}> ret=#{oa.uml_type_one.db_getFindAllCall};
50
+ #{oa.uml_type_one.java_qualifiedName} elt=get#{oa.java_NameBean}();
51
+ if(elt!=null && !ret.contains(elt)) {
52
+ ret.add(elt);
53
+ }
54
+ return ret;\n})
55
+ else
56
+ write( %{
57
+ /* TPL:0001jpa_many #{oa.umlx_oneSide?} */
58
+ java.util.List<#{oa.uml_type_one.java_qualifiedName}> ret=#{oa.uml_type_one.db_getFindAllCall};
59
+
60
+ #{oa.uml_type_one.java_qualifiedName} item=null;
61
+ java.util.Iterator<?> iter=get#{oa.java_NameBean}().iterator();
62
+ while(iter.hasNext()){
63
+ item=(#{oa.uml_type_one.java_qualifiedName}) iter.next();
64
+ if(!ret.contains(item)) {
65
+ ret.add(item);
66
+ }
67
+ }
68
+ return ret;\n})
69
+
70
+ end
71
+ else
72
+ super(oa)#original_java_writeSuggesterBody(oa)
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,54 @@
1
+
2
+
3
+ #automatically populate methods with simulated code.
4
+ #Methods will return an element or a liste of element
5
+ #of the specified type.
6
+ module Mrdf_Model
7
+ def db_addTestImplementations!
8
+ jpa_addTestImplementations!
9
+ end
10
+ def jpa_addTestImplementations!
11
+ each { |k,m|
12
+ next unless m.kind_of?(Muml_Operation)
13
+ m.jpa_addTestImplementation!
14
+ }
15
+ end
16
+ end
17
+
18
+ module Muml_Operation
19
+ JPA_TEST_CODE_TOP=%{
20
+ //TODO: replace this test code by real implementation
21
+ //log.error("test method called");\n}
22
+ def jpa_addTestImplementation!
23
+ return unless java_code.empty?
24
+ owner=umlx_owner_one
25
+ return if owner.kind_of?(Muml_Interface)
26
+ return if owner.uml_isAbstract?
27
+ #log.debug { "adding test implementation for #{self.umlx_owner_one}.#{self}" }
28
+ fp=nil
29
+ (uml_returnResult+uml_ownedParameter).each { |p|
30
+ next unless p.uml_direction_one.isReturn?
31
+ fp=p
32
+ }
33
+ if fp.nil?
34
+ self.java_code=JPA_TEST_CODE_TOP
35
+ return
36
+ elsif fp.uml_type_one.kind_of?(Muml_DataType)
37
+ #TODO: create test code
38
+ return
39
+ elsif (!fp.uml_type_one.jpa_isPersistent?) || (fp.uml_type_one.db_isTransient?) || (fp.uml_type_one.java_ignoreMe?)
40
+ #not a persistent class
41
+ return
42
+ elsif fp.umlx_oneSide?
43
+ self.java_code=%{#{JPA_TEST_CODE_TOP}\nreturn #{fp.uml_type_one.db_getFindAllCall}.get(0);}
44
+ elsif fp.uml_isOrdered?
45
+ self.java_code=%{#{JPA_TEST_CODE_TOP}\nreturn #{fp.uml_type_one.db_getFindAllCall};}
46
+ else
47
+ self.java_code=%{
48
+ #{JPA_TEST_CODE_TOP}
49
+ #{fp.java_propertyAssociationConcreteType} ret=new #{fp.java_propertyAssociationConcreteType}();
50
+ ret.addAll(#{fp.uml_type_one.db_getFindAllCall});
51
+ return ret;}
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,8 @@
1
+ module Ontomde
2
+ module Uml2
3
+ module Jpa
4
+ VERSION = '1.0.4'
5
+ end
6
+ end
7
+ end
8
+
@@ -0,0 +1,21 @@
1
+
2
+ #:include: ontomde-uml2-jpa/jpa.rdoc
3
+
4
+ # this constant is defined in every db module
5
+ # multiple db module inclusion will trigger a warning
6
+ DB_PERSISTENCE_MODULE="ontomde-uml2_jpa"
7
+
8
+ require 'ontomde-uml2-java'
9
+ require 'ontomde-uml2-apaCom'
10
+
11
+ h="#{File.dirname(__FILE__)}/ontomde-uml2-jpa"
12
+
13
+ require "#{h}/version.rb"
14
+ require "#{h}/jpa.rb"
15
+ require "#{h}/finder.rb"
16
+ require "#{h}/configuration.rb"
17
+ require "#{h}/mapping.rb"
18
+ require "#{h}/redefined.rb"
19
+ require "#{h}/simulationAutoImplement.rb"
20
+ require "#{h}/locking.rb"
21
+
File without changes
metadata ADDED
@@ -0,0 +1,87 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ontomde-uml2-jpa
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.4
5
+ platform: ruby
6
+ authors:
7
+ - Stephane (Pierre) Carrie
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-03-03 00:00:00 +01:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: ontomde-uml2-java
17
+ version_requirement:
18
+ version_requirements: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - "="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.0.4
23
+ version:
24
+ - !ruby/object:Gem::Dependency
25
+ name: hoe
26
+ version_requirement:
27
+ version_requirements: !ruby/object:Gem::Requirement
28
+ requirements:
29
+ - - ">="
30
+ - !ruby/object:Gem::Version
31
+ version: 1.5.0
32
+ version:
33
+ description: "JPA annotation generator library. Most users will used this library trough ontomde-java-frontend command line utility options. == FEATURES/PROBLEMS: == SYNOPSIS: == REQUIREMENTS:"
34
+ email: stephanepierre.carrie@orange-ftgroup.com
35
+ executables: []
36
+
37
+ extensions: []
38
+
39
+ extra_rdoc_files:
40
+ - History.txt
41
+ - Manifest.txt
42
+ - README.txt
43
+ files:
44
+ - History.txt
45
+ - Manifest.txt
46
+ - README.txt
47
+ - Rakefile
48
+ - lib/ontomde-uml2-jpa.rb
49
+ - lib/ontomde-uml2-jpa/version.rb
50
+ - lib/ontomde-uml2-jpa/configuration.rb
51
+ - lib/ontomde-uml2-jpa/redefined.rb
52
+ - lib/ontomde-uml2-jpa/locking.rb
53
+ - lib/ontomde-uml2-jpa/mapping.rb
54
+ - lib/ontomde-uml2-jpa/finder.rb
55
+ - lib/ontomde-uml2-jpa/simulationAutoImplement.rb
56
+ - lib/ontomde-uml2-jpa/jpa.rb
57
+ - lib/ontomde-uml2-jpa/jpa.rdoc
58
+ - test/test_ontomde-uml2-jpa.rb
59
+ has_rdoc: true
60
+ homepage: http://ontomde.rubyforge.org
61
+ post_install_message:
62
+ rdoc_options:
63
+ - --main
64
+ - README.txt
65
+ require_paths:
66
+ - lib
67
+ required_ruby_version: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: 1.8.6
72
+ version:
73
+ required_rubygems_version: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: 1.0.0
78
+ version:
79
+ requirements: []
80
+
81
+ rubyforge_project: ontomde
82
+ rubygems_version: 1.0.1
83
+ signing_key:
84
+ specification_version: 2
85
+ summary: OntoMDE JPA cartridge
86
+ test_files:
87
+ - test/test_ontomde-uml2-jpa.rb