ontomde-uml2-jpa 1.0.4

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