ontomde-java 2.0.0 → 2.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.
Files changed (100) hide show
  1. data/History.txt +11 -0
  2. data/Manifest.txt +1 -51
  3. data/lib/ontomde-java.rb +2 -0
  4. data/lib/ontomde-java/crank.rb +8 -8
  5. data/lib/ontomde-java/crank/crankJpa.rb +58 -8
  6. data/lib/ontomde-java/crank/main.rb +38 -21
  7. data/lib/ontomde-java/frontend/command.rb +7 -7
  8. data/lib/ontomde-java/frontend/command.rdoc +0 -583
  9. data/lib/ontomde-java/frontend/defaultOptions.rb +12 -7
  10. data/lib/ontomde-java/frontend/options.rb +19 -2
  11. data/lib/ontomde-java/frontend/steps.rb +36 -5
  12. data/lib/ontomde-java/java/accessorCode.rb +250 -94
  13. data/lib/ontomde-java/java/accessorSignature.rb +50 -4
  14. data/lib/ontomde-java/java/annotationOntoMDE.rb +38 -27
  15. data/lib/ontomde-java/java/component.rb +141 -68
  16. data/lib/ontomde-java/java/enumAssignable.rb +46 -5
  17. data/lib/ontomde-java/java/java.rb +111 -40
  18. data/lib/ontomde-java/java/javaDatatypeMapping.rb +35 -1
  19. data/lib/ontomde-java/java/javadoc.rb +35 -22
  20. data/lib/ontomde-java/java/operationAsClass.rb +13 -0
  21. data/lib/ontomde-java/java/security.rb +10 -2
  22. data/lib/ontomde-java/java/stateMachine.rb +137 -74
  23. data/lib/ontomde-java/java/tenant.rb +1 -0
  24. data/lib/ontomde-java/java/xsd.rb +1 -1
  25. data/lib/ontomde-java/jpa/configuration.rb +25 -1
  26. data/lib/ontomde-java/jpa/finder.rb +48 -13
  27. data/lib/ontomde-java/jpa/jpa.rb +30 -14
  28. data/lib/ontomde-java/jpa/mapping.rb +114 -60
  29. data/lib/ontomde-java/jpa/redefined.rb +21 -5
  30. data/lib/ontomde-java/jpa/simulationAutoImplement.rb +1 -1
  31. data/lib/ontomde-java/jpdl/processOperationToClass.rb +1 -2
  32. data/lib/ontomde-java/kbjava/rdfToJava.rb +25 -16
  33. data/lib/ontomde-java/struts.rb +1 -1
  34. data/lib/ontomde-java/struts/MessageResources.rb +15 -6
  35. data/lib/ontomde-java/struts/action.rb +37 -13
  36. data/lib/ontomde-java/struts/form.rb +97 -7
  37. data/lib/ontomde-java/struts/header.rb +7 -3
  38. data/lib/ontomde-java/struts/jsp_edit.rb +54 -24
  39. data/lib/ontomde-java/struts/jsp_edit_js.rb +1 -1
  40. data/lib/ontomde-java/struts/jsp_index.rb +6 -4
  41. data/lib/ontomde-java/struts/mappingForJsp.rb +11 -7
  42. data/lib/ontomde-java/struts/mappingToJavaHierarchy.rb +16 -2
  43. data/lib/ontomde-java/version.rb +1 -1
  44. data/lib/ontomde-java/vmware/vso.rb +329 -0
  45. data/test/test_export_ea7_1_829.rb +5 -0
  46. data/test/test_export_ea7_1_833.rb +5 -0
  47. data/test/test_export_ea7_5_843.rb +5 -0
  48. data/test/test_export_magicDraw.rb +4 -0
  49. data/test/test_export_oe530.rb +1 -1
  50. data/test/test_export_oe600.rb +1 -1
  51. data/test/test_export_rsm60.rb +1 -1
  52. data/test/{uml_test.rb → test_export_unitTests.rb} +6 -1
  53. metadata +9 -56
  54. data/generateRdocFile.sh +0 -16
  55. data/profiling.xls +0 -0
  56. data/test/.classpath +0 -14
  57. data/test/.project +0 -17
  58. data/test/.settings/org.eclipse.jdt.core.prefs +0 -23
  59. data/test/Rakefile +0 -71
  60. data/test/build.xml +0 -34
  61. data/test/classpath.rb +0 -15
  62. data/test/lib/junit-4.1.jar +0 -0
  63. data/test/load1.rb +0 -3
  64. data/test/load2.rb +0 -3
  65. data/test/log4j.properties +0 -46
  66. data/test/model/.project +0 -11
  67. data/test/model/BigProject.mdzip +0 -0
  68. data/test/model/BigProject.mdzip.nt +0 -102866
  69. data/test/model/ClassDiagram.EntArch.gif +0 -0
  70. data/test/model/ClassDiagram.emx.gif +0 -0
  71. data/test/model/ClassDiagram.mdzip.gif +0 -0
  72. data/test/model/model_ea71.bis.ea.xmi +0 -149
  73. data/test/model/model_ea71.ea.xmi +0 -4470
  74. data/test/model/model_ea71.eap +0 -0
  75. data/test/model/model_ea71_README.txt +0 -8
  76. data/test/model/multipleInheritance.emx +0 -466
  77. data/test/model/multipleInheritance.emx.nt +0 -2428
  78. data/test/model/simple1-530.ofp +0 -0
  79. data/test/model/simple1-includedAsReference.emx +0 -169
  80. data/test/model/simple1.emx +0 -3729
  81. data/test/model/simple1.emx.fragments.nt +0 -81
  82. data/test/model/simple1.emx.nt +0 -5760
  83. data/test/model/simple1.mdzip +0 -0
  84. data/test/model/simple1.mdzip.nt +0 -11500
  85. data/test/model/simple1.oe530.nt +0 -1986
  86. data/test/model/simple1.oe600.nt +0 -1627
  87. data/test/src/RuntimeTest.java +0 -656
  88. data/test/src/testsLevel1.java +0 -174
  89. data/test/src/testsLevel2.java +0 -29
  90. data/test/src/testsLevel3.java +0 -40
  91. data/test/test-ea7.sh +0 -15
  92. data/test/test-magicDraw.sh +0 -10
  93. data/test/test-mi.sh +0 -9
  94. data/test/test-oe530.sh +0 -10
  95. data/test/test-oe600.sh +0 -11
  96. data/test/test-rsm.sh +0 -11
  97. data/test/test_export_ea71.rb +0 -5
  98. data/test/trace +0 -419
  99. data/test/uml_test.xls +0 -0
  100. data/test/unit_test.rb +0 -6
@@ -51,6 +51,7 @@ end
51
51
 
52
52
  module Muml_Classifier
53
53
  TENANT_FIELD_NAME="tenantOwner"
54
+ TENANT_FIELD_BEAN_NAME="TenantOwner"
54
55
  def java_addTenantField!(tenantClass=nil)
55
56
  return unless context[:multiTenant]
56
57
  tenantClass=rdf_Repository.java_getTenantClass if tenantClass.nil?
@@ -364,7 +364,7 @@ non unique name detected
364
364
  ********* INVALID DATA DETECTED **********
365
365
  END
366
366
  }
367
- if context[:xsd_failIfNonUniqueName]
367
+ if context[:xsd_failIfNonUniqueName,true]
368
368
  raise Warning.new(),"unique name assertion failed"
369
369
  end
370
370
 
@@ -1,5 +1,24 @@
1
1
  module Mrdf_Repository
2
2
 
3
+
4
+ def jpa_generateSpringConfigDerby
5
+
6
+ mtk_writeSession("#{context[:webResourcesDir]}/contextConfigDerby.properties") {
7
+ write <<END
8
+
9
+ #This file will hold environnement properties that are needed in the application.
10
+
11
+ jpa.dialect=org.springframework.orm.jpa.vendor.HibernateJpaDialect
12
+ persistence.unit.name=persistence-unit-test
13
+ database.platform=org.hibernate.dialect.DerbyDialect
14
+ driverClassName=org.apache.derby.jdbc.EmbeddedDriver
15
+ url=jdbc:derby:#{context[:dbSchemaName,'testschema-derby']};create=true
16
+ username=root
17
+ password=root
18
+ END
19
+ }
20
+ end
21
+
3
22
  #Generates persistence configuration file
4
23
  def db_generateConfiguration
5
24
  jpa_generateConfiguration
@@ -8,8 +27,9 @@ module Mrdf_Repository
8
27
  #Generates hibernate configuration file
9
28
  def jpa_generateConfiguration
10
29
  if context[:struts_useSpring]
11
- mtk_writeSession("#{context[:jpaConfigDir,context[:javaDir]]}/META-INF/persistence.xml") {
30
+ mtk_writeSession("#{context[:jpaConfigDir]}/META-INF/persistence.xml") {
12
31
  jpa_writeConfigurationForSpring
32
+ jpa_generateSpringConfigDerby
13
33
  }
14
34
  else
15
35
  # empty
@@ -148,8 +168,12 @@ module Mrdf_Repository
148
168
  #writes jpa configuration list of persistent class
149
169
  def jpa_writeConfigurationPersistentClasses
150
170
  write %{<!-- begin Persistent classes declaration -->\n}
171
+ s=Set.new
151
172
  uml_Class_all.each {|c|
152
173
  next unless c.kind_of?(Muml_Class) && c.umlx_isReallyAClass?
174
+ s.add(c)
175
+ }
176
+ s.sort { |a,b| a.java_qualifiedName.to_s <=>b.java_qualifiedName.to_s }.each { |c|
153
177
  c.jpa_writeConfiguration
154
178
  }
155
179
  #TODO: remove hack
@@ -1,9 +1,19 @@
1
1
  module Muml_Class
2
+
3
+
4
+ JPA_PAGINATION_QUERY=<<END
5
+ if(pageSize>0) {
6
+ q.setFirstResult(pageNumber*pageSize);
7
+ q.setMaxResults(pageSize);
8
+ }
9
+ END
10
+
2
11
  #adds a finder to eao
3
12
  #self is supposed to be the bean and eao the "dao".
4
13
  def jpa_addFindAll!(eao)
14
+ [false,true].each { |paginated|
5
15
  # java_NameBean is added to avoid name clash with inheritance
6
- m=eao.umlx_createAndAddOperation(rdf_uri+"_findAll","findAll")#+self.java_NameBean)
16
+ m=eao.umlx_createAndAddOperation(rdf_uri+"_findAll"+(paginated ? '_pag':''),"findAll")#+self.java_NameBean)
7
17
  m.uml_isStatic=RDF_TRUE
8
18
  #m.uml_class=self
9
19
  m.uml_visibility=Cuml_VisibilityKind::Public
@@ -24,25 +34,25 @@ module Muml_Class
24
34
 
25
35
  #m.java_code="return (#{self.java_qualifiedName})entityManager.find( #{self.java_qualifiedName}.class, #{ip.uml_name});"
26
36
 
37
+ if !context[:crank]
27
38
  basicQuery=<<END
28
- javax.persistence.Query q=getEntityManager().createQuery( "select Object(c) from #{java_Name} as c");
29
- return (java.util.List<#{self.java_qualifiedName}>) q.getResultList();
39
+ javax.persistence.Query q=getEntityManager().createQuery( "select Object(c) from #{java_Name} as c");
40
+ #{JPA_PAGINATION_QUERY if paginated}
41
+ return (java.util.List<#{self.java_qualifiedName}>) q.getResultList();
30
42
  END
31
-
32
-
33
43
  if !context[:multiTenant]
34
44
  m.java_code=basicQuery
35
45
  else
36
-
37
46
  ip=m.umlx_createAndAddParameter(m.rdf_uri+"_tenant","tenant")
38
47
  ip.uml_type=rdf_Repository.java_getTenantClass
39
48
  ip.umlx_createAndAddComment(ip.rdf_uri+"comment","Restrict query to this tenant")
40
49
 
41
50
  m.java_code=<<END
42
51
  if(#{ip.java_Name}!=null) {
43
- javax.persistence.Query q=getEntityManager().createQuery( "select Object(c) from #{java_Name} as c where c.#{TENANT_FIELD_NAME}= :tenantQP");
44
- q.setParameter("tenantQP",#{ip.java_Name});
45
- return (java.util.List<#{self.java_qualifiedName}>) q.getResultList();
52
+ javax.persistence.Query q=getEntityManager().createQuery( "select Object(c) from #{java_Name} as c where c.#{TENANT_FIELD_NAME}= :tenantQP");
53
+ q.setParameter("tenantQP",#{ip.java_Name});
54
+ #{JPA_PAGINATION_QUERY if paginated}
55
+ return (java.util.List<#{self.java_qualifiedName}>) q.getResultList();
46
56
  } else {
47
57
  //TODO: disable in production code
48
58
  System.out.println("DEBUG MODE");
@@ -50,10 +60,22 @@ if(#{ip.java_Name}!=null) {
50
60
  }
51
61
 
52
62
  END
53
-
63
+
64
+ end
65
+
66
+ else
67
+ paginatedParams=""
68
+ if paginated
69
+ paginatedParams="pageNumber * pageSize, pageSize"
70
+ end
71
+ basicQuery=<<END
72
+ return get#{self.java_Name}DAO().find(#{paginatedParams});
73
+ END
74
+ m.java_code=basicQuery
54
75
  end
55
76
 
56
77
 
78
+
57
79
  m.java_annotation_add(%{@SuppressWarnings("unchecked")})
58
80
 
59
81
  # because A<-B is not Set<A> <- Set<B>
@@ -65,8 +87,17 @@ END
65
87
  t=m.umlx_createAndAddParameter(m.rdf_uri+"_class","nullCast")
66
88
  t.uml_type=self
67
89
  end
68
-
69
- return m
90
+
91
+ if paginated
92
+ pageN=m.umlx_createAndAddParameter(m.rdf_uri+"_pageN","pageNumber")
93
+ pageN.uml_type=umlx_dataType_integer
94
+
95
+ pageS=m.umlx_createAndAddParameter(m.rdf_uri+"_pageS","pageSize")
96
+ pageS.uml_type=umlx_dataType_integer
97
+ pageS.umlx_createAndAddComment(pageS.rdf_uri+"comment","use -1 to retreive all results ")
98
+ end
99
+ }
100
+ return nil # m
70
101
  end
71
102
  def jpa_addFindByPrimaryKey!(eao)
72
103
  m=eao.umlx_createAndAddOperation(rdf_uri+"_finderop","find")
@@ -95,7 +126,11 @@ END
95
126
  rp.uml_type=self
96
127
  #rp.uml_isOrdered=RDF_FALSE
97
128
 
98
- m.java_code="return (#{self.java_qualifiedName})getEntityManager().find( #{self.java_qualifiedName}.class, #{ip.uml_name});"
129
+ if !context[:crank]
130
+ m.java_code="\t\treturn (#{self.java_qualifiedName})getEntityManager().find( #{self.java_qualifiedName}.class, #{ip.uml_name});"
131
+ else
132
+ m.java_code="\t\treturn get#{self.java_Name}DAO().read(#{ip.uml_name});"
133
+ end
99
134
 
100
135
  return m
101
136
  end
@@ -12,7 +12,8 @@ module DB
12
12
  EntityManager="javax.persistence.EntityManager"
13
13
  EntityManagerFactory="javax.persistence.EntityManagerFactory"
14
14
  EntityGenericInterface="xmda.jpa.XmdaEntity"
15
- EntityInterface="#{EntityGenericInterface}<Long>"
15
+ # EntityInterface="#{EntityGenericInterface}<Long>"
16
+ EntityGenericParameter="Long"
16
17
  end
17
18
 
18
19
 
@@ -118,17 +119,15 @@ module DAO
118
119
  return if db_isDAO?
119
120
  return if java_ignoreMe?
120
121
 
122
+
121
123
  if !context[:db_autonomousDAO,false]
122
124
  self.java_DAOClass=self
123
125
  self.java_persistentClass=self
124
126
  else
125
-
126
- #log.debug { "adding dao for #{self}" }
127
+
128
+ log.debug { "adding dao for #{self}" }
127
129
  p=umlx_package
128
130
 
129
-
130
-
131
-
132
131
  #p=self
133
132
  p=p.umlx_getOrCreatePackage(context[:dbDAOsubPackage,"dao"],p)
134
133
  c=p.umlx_createAndAddClass(rdf_uri+"_dao")
@@ -141,7 +140,7 @@ module DAO
141
140
  #log.debug { "DAO added: #{c.uml_name} in #{c.umlx_package.uml_name}"}
142
141
  java_DAOClass_one.jpa_addEntityManager!()
143
142
  java_DAOClass_one.jpa_addStdImports!
144
- #jpa_addGetDao!()
143
+ # jpa_addGetDao!()
145
144
  end
146
145
  jpa_addPersist!
147
146
  jpa_addMerge!
@@ -218,13 +217,21 @@ END
218
217
  def db_disc(k,v)
219
218
  ::Muml_Class::DB_DISCRIMINATOR[::Muml_Class::DB_URI_ALIAS[k]]=v
220
219
  end
220
+ END
221
+
222
+ [false,true].each { |exists|
223
+ write(!exists ? "# Saved Element From History\n" : "# Current elements\n")
224
+
225
+ write <<END
221
226
  ::Muml_Class::DB_URI_ALIAS.merge!({
222
227
  END
223
228
  ::Muml_Class::DB_DISCRIMINATOR.sort{|a,b| a[0]<=>b[0]}.each { |k|
224
229
  n=db_findNameUsingDB_URI_ALIAS(k[0])
225
- write(" %{#{n}} => %{#{k[0]}} ,\n")
230
+ write(" %{#{n}} => %{#{k[0]}} ,\n") if self[k[0]].nil?!=exists
226
231
  }
227
232
  write("})\n")
233
+ }
234
+
228
235
  write <<END
229
236
  declarePredefinedDiscrimators();
230
237
  #free ressources
@@ -266,6 +273,7 @@ module Muml_Class
266
273
  ret.uml_upperValue=umlx_literal(1)
267
274
  ret.uml_lowerValue=umlx_literal(0)
268
275
  ret.uml_type=umlx_getOrCreateClass(DB::EntityManager)
276
+
269
277
  gem.java_code="return #{DB_Context}.getEntityManager();"
270
278
 
271
279
  end
@@ -362,12 +370,14 @@ END
362
370
 
363
371
  DB_URI_ALIAS=Hash.new
364
372
  DB_DISCRIMINATOR=Hash.new
373
+
374
+ def doOnJPAAddPersistence!
375
+
376
+ end
365
377
  def jpa_addPersistence!
366
- #jpa_addDAO!
367
-
378
+ #jpa_addDAO!
368
379
  #Ajout l'interface XmdaEntity
369
- ent=umlx_getOrCreateInterface(DB::EntityInterface)
370
- ent.java_isGeneric=RDF_TRUE
380
+ ent=umlx_getOrCreateGeneric(DB::EntityGenericInterface,DB::EntityGenericParameter)
371
381
  umlx_createAndAddImplementation(ent)
372
382
 
373
383
  jpa_addEntityManager! # required for query, persist,...
@@ -401,6 +411,8 @@ END
401
411
  java_import_add("javax.persistence.DiscriminatorValue")
402
412
  end
403
413
  jpa_addStdImports!
414
+
415
+ doOnJPAAddPersistence!()
404
416
  end
405
417
 
406
418
  def jpa_addStdImports!
@@ -451,7 +463,11 @@ module Muml_Classifier
451
463
  return unless self.umlx_hasStereotype?('DTO')
452
464
 
453
465
  puts "DTO Found : #{java_Name}"
454
-
466
+
467
+ self.java_import_add("java.io.Serializable")
468
+ io=umlx_getOrCreateClass("java.io.Serializable")
469
+ self.umlx_createAndAddImplementation(io)
470
+
455
471
  # Add a method to<UML_Name> to the main class linked to the DTO by a dependency
456
472
  self.uml_clientDependency.each{|dep|
457
473
  next unless dep.kind_of?(Cuml_Dependency)
@@ -493,7 +509,7 @@ CODE
493
509
  #TODO Surcharge le getter : A enlever une fois avoir corrig� incompatibilit� avec couche Struts
494
510
  gettter = p.java_AttributeGlobalGetter
495
511
  #removed ? : operator to make checkstyle happy.
496
- gettter[0].java_code = %{if(#{p.java_Name} == null) { return Long.valueOf(0);} else {return #{p.java_Name};}}
512
+ gettter[0].java_code = %{\t\treturn xmda.crud.Helper.longObjZeroForNull (#{p.java_Name});}
497
513
 
498
514
  stereo = umlx_package.umlx_createAndAddStereotype(rdf_uri+"Equals", "EqualsValue")
499
515
  p.uml_appliedStereotype = stereo
@@ -1,6 +1,26 @@
1
1
  #
2
2
  #
3
+ module Muml_NamedElement
4
+ # jpa/hibernates breaks at runtime if a name
5
+ # begining with an underscore (_) is encountered.
6
+ # We prepend jpa when a name starts with underscore.
7
+ def jpa_Name
8
+ n=java_Name.to_s.upcase
9
+ ret=n[0,1]=='_' ? 'JPA'+n : n
10
+ return ret
11
+ end
12
+
13
+ #add name annotation when name
14
+ #is different from default.
15
+ def jpa_addNameAnnotation
16
+ d=jpa_Name.to_s.upcase
17
+ j=java_Name.to_s.upcase
18
+ return d==j ? nil : %{ name = "#{d}"}
19
+ end
3
20
 
21
+
22
+
23
+ end
4
24
  module Muml_Operation
5
25
  #true puts annotation on getter
6
26
  #false puts annotation on attribute
@@ -11,8 +31,8 @@ module Muml_Operation
11
31
  # java_AttributeGlobalSetter
12
32
  # java_getter_property
13
33
  if java_getter_property.empty?
14
- return if(umlx_hasStereotype?("Create"))
15
- #java_annotation_add("@Transient")
34
+ return if(umlx_hasStereotype?('Create'))
35
+ #java_annotation_add('@Transient')
16
36
  return
17
37
  end
18
38
 
@@ -20,7 +40,7 @@ module Muml_Operation
20
40
  return unless p.jpa_isPersistent?
21
41
 
22
42
  if p.uml_type_one.kind_of?(Cuml_Class) && !p.uml_type_one.jpa_isPersistent?
23
- p.java_annotation_add("/* not persistent */")
43
+ p.java_annotation_add('/* not persistent */')
24
44
  return
25
45
  end
26
46
 
@@ -28,7 +48,7 @@ module Muml_Operation
28
48
  p.jpa_addPersistenceTo!(self)
29
49
  # HACK
30
50
  p.jpa_addPersistenceTo!(p) #TODO: remove
31
- #p.java_annotation_add("@Transient")
51
+ #p.java_annotation_add('@Transient')
32
52
  else
33
53
  p.jpa_addPersistenceTo!(p)
34
54
  end
@@ -39,8 +59,14 @@ module Muml_Property
39
59
  def jpa_isPersistent?
40
60
  return true
41
61
  end
62
+
63
+ def jpa_addFetchType(ah)
64
+ ah.umlx_owner_one.java_import_add('javax.persistence.FetchType')
65
+ return "fetch=FetchType.LAZY"
66
+ end
67
+
42
68
  def jpa_addRelationCascadeType(isIncludeType=true)
43
- umlx_owner_one.java_import_add("javax.persistence.CascadeType")
69
+ umlx_owner_one.java_import_add('javax.persistence.CascadeType')
44
70
  if (isIncludeType)
45
71
  return DEFAULT_CASCADE_I
46
72
  else
@@ -49,78 +75,77 @@ module Muml_Property
49
75
  end
50
76
  def jpa_addPersistenceUnidirOneToOne!(ah)
51
77
  #TODO: unicity constraint
52
- ah.java_annotation_add("@OneToOne(cascade=CascadeType.ALL)")
53
- ah.umlx_owner_one.java_import_add("javax.persistence.OneToOne")
54
- ah.umlx_owner_one.java_import_add("javax.persistence.CascadeType")
78
+ ah.java_annotation_add("@OneToOne(#{jpa_addFetchType(ah)}, cascade=CascadeType.ALL)")
79
+ ah.umlx_owner_one.java_import_add('javax.persistence.OneToOne')
80
+ ah.umlx_owner_one.java_import_add('javax.persistence.CascadeType')
55
81
  #TODO: affiner cascadeType pour les delete
56
82
  end
57
83
 
58
84
  def jpa_addPersistenceUnidirOneToMany!(ah)
59
- ah.java_annotation_add(%{@OneToMany(fetch=FetchType.EAGER #{jpa_addRelationCascadeType(true)})})
60
- ah.umlx_owner_one.java_import_add("javax.persistence.OneToMany")
61
- ah.umlx_owner_one.java_import_add("javax.persistence.FetchType")
85
+ ah.java_annotation_add(%{@OneToMany(#{jpa_addFetchType(ah)} #{jpa_addRelationCascadeType(true)})})
86
+ ah.umlx_owner_one.java_import_add('javax.persistence.OneToMany')
62
87
  jpa_addJoinTable(ah)
63
88
  end
64
- DEFAULT_CASCADE="(cascade=CascadeType.ALL)"
65
- DEFAULT_CASCADE_I=",cascade=CascadeType.ALL"
89
+ DEFAULT_CASCADE='(cascade=CascadeType.ALL)'
90
+ DEFAULT_CASCADE_I=',cascade=CascadeType.ALL'
66
91
  def jpa_addPersistenceUnidirManyToOne!(ah)
67
- ah.java_annotation_add("@ManyToOne #{jpa_addRelationCascadeType(false)} ")
68
- ah.umlx_owner_one.java_import_add("javax.persistence.ManyToOne")
92
+ ah.java_annotation_add("@ManyToOne(#{jpa_addFetchType(ah)} #{jpa_addRelationCascadeType(true)}) ")
93
+ ah.umlx_owner_one.java_import_add('javax.persistence.ManyToOne')
69
94
  jpa_addJoinColumn!(ah)
70
95
  end
71
96
 
72
97
  def jpa_addPersistenceUnidirManyToMany!(ah)
73
- ah.java_annotation_add("@ManyToMany #{jpa_addRelationCascadeType(false)}")
74
- ah.umlx_owner_one.java_import_add("javax.persistence.ManyToMany")
98
+ ah.java_annotation_add("@ManyToMany (#{jpa_addFetchType(ah)} #{jpa_addRelationCascadeType(true)})")
99
+ ah.umlx_owner_one.java_import_add('javax.persistence.ManyToMany')
75
100
  jpa_addJoinTable(ah)
76
101
  jpa_addJoinColumn!(ah)
77
102
  end
78
103
  def jpa_addPersistenceBidirManyToManyMaster!(ah)
79
- ah.java_annotation_add("@ManyToMany #{jpa_addRelationCascadeType(false)}")
80
- ah.umlx_owner_one.java_import_add("javax.persistence.ManyToMany")
81
- jpa_addJoinColumn!(ah)
104
+ ah.java_annotation_add("@ManyToMany (#{jpa_addFetchType(ah)} #{jpa_addRelationCascadeType(true)})")
105
+ ah.umlx_owner_one.java_import_add('javax.persistence.ManyToMany')
106
+ #jpa_addJoinColumn!(ah)
82
107
  jpa_addJoinTable(ah)
83
108
  end
84
109
  def jpa_addPersistenceBidirManyToManySlave!(ah)
85
- ah.java_annotation_add("@ManyToMany #{jpa_addRelationCascadeType(false)}")
86
- ah.umlx_owner_one.java_import_add("javax.persistence.ManyToMany")
87
- jpa_addJoinColumn!(ah)
110
+ ah.java_annotation_add("@ManyToMany (#{jpa_addFetchType(ah)} #{jpa_addRelationCascadeType(true)}, mappedBy=\"#{umlx_otherEnd.java_NameProperty}\")")
111
+ ah.umlx_owner_one.java_import_add('javax.persistence.ManyToMany')
112
+ #jpa_addJoinColumn!(ah)
88
113
  #Do not add join column !
89
114
  #(or you will get 2 join tables)
90
115
  #jpa_addJoinTable(ah)
91
116
  end
92
117
 
93
118
  def jpa_addPersistenceBidirOneToOneMaster!(ah)
94
- ah.java_annotation_add(%{@OneToOne #{jpa_addRelationCascadeType(false)}})
95
- ah.umlx_owner_one.java_import_add("javax.persistence.OneToOne")
119
+ ah.java_annotation_add("@OneToOne (#{jpa_addFetchType(ah)} #{jpa_addRelationCascadeType(true)})")
120
+ ah.umlx_owner_one.java_import_add('javax.persistence.OneToOne')
96
121
  jpa_addJoinColumn!(ah)
97
122
  end
98
123
  def jpa_addPersistenceBidirOneToOneSlave!(ah)
99
- ah.java_annotation_add(%{@OneToOne(mappedBy="#{umlx_otherEnd.java_NameProperty}" #{jpa_addRelationCascadeType})})
100
- ah.umlx_owner_one.java_import_add("javax.persistence.OneToOne")
124
+ ah.java_annotation_add(%{@OneToOne(#{jpa_addFetchType(ah)}, mappedBy="#{umlx_otherEnd.java_NameProperty}" #{jpa_addRelationCascadeType})})
125
+ ah.umlx_owner_one.java_import_add('javax.persistence.OneToOne')
101
126
  end
102
127
 
103
128
  def jpa_addPersistenceBidirOneToManyMaster!(ah)
104
- ah.java_annotation_add(%{@OneToMany (mappedBy="#{umlx_otherEnd.java_NameProperty}"#{jpa_addRelationCascadeType})})
105
- ah.umlx_owner_one.java_import_add("javax.persistence.OneToMany")
129
+ ah.java_annotation_add(%{@OneToMany (#{jpa_addFetchType(ah)}, mappedBy="#{umlx_otherEnd.java_NameProperty}"#{jpa_addRelationCascadeType})})
130
+ ah.umlx_owner_one.java_import_add('javax.persistence.OneToMany')
106
131
  end
107
132
  def jpa_addPersistenceBidirOneToManySlave!(ah)
108
- ah.java_annotation_add(%{@OneToMany (mappedBy="#{umlx_otherEnd.java_NameProperty}"#{jpa_addRelationCascadeType})})
109
- ah.umlx_owner_one.java_import_add("javax.persistence.OneToMany")
133
+ ah.java_annotation_add(%{@OneToMany (#{jpa_addFetchType(ah)}, mappedBy="#{umlx_otherEnd.java_NameProperty}"#{jpa_addRelationCascadeType})})
134
+ ah.umlx_owner_one.java_import_add('javax.persistence.OneToMany')
110
135
  #jpa_addJoinColumn!(ah)
111
136
  end
112
137
 
113
138
  def jpa_addPersistenceBidirManyToOneMaster!(ah)
114
139
  #ah.java_annotation_add(%{@ManyToOne(mappedBy="#{umlx_otherEnd.java_NameProperty}")})
115
- ah.java_annotation_add(%{@ManyToOne #{jpa_addRelationCascadeType(false)}})
116
- ah.umlx_owner_one.java_import_add("javax.persistence.ManyToOne")
140
+ ah.java_annotation_add(%{@ManyToOne (#{jpa_addFetchType(ah)} #{jpa_addRelationCascadeType(true)})})
141
+ ah.umlx_owner_one.java_import_add('javax.persistence.ManyToOne')
117
142
  #ah.java_annotation_add(%{@JoinColumn(name="#{java_NameProperty}_fk"})
118
143
  jpa_addJoinColumn!(ah)
119
144
  end
120
145
  def jpa_addPersistenceBidirManyToOneSlave!(ah)
121
146
  #ah.java_annotation_add(%{@ManyToOne(mappedBy="#{umlx_otherEnd.java_NameProperty}")})
122
- ah.java_annotation_add(%{@ManyToOne #{jpa_addRelationCascadeType(false)}})
123
- ah.umlx_owner_one.java_import_add("javax.persistence.ManyToOne")
147
+ ah.java_annotation_add(%{@ManyToOne (#{jpa_addFetchType(ah)} #{jpa_addRelationCascadeType(true)})})
148
+ ah.umlx_owner_one.java_import_add('javax.persistence.ManyToOne')
124
149
  #ah.java_annotation_add(%{@JoinColumn(name="#{java_NameProperty}_fk"})
125
150
  jpa_addJoinColumn!(ah)
126
151
  end
@@ -142,14 +167,14 @@ module Muml_Property
142
167
  # field : A_self_id
143
168
  #
144
169
  def jpa_addJoinTable(ah)
145
- postfix=(uml_ownedAttribute_inv_one==uml_type_one) ? "_self" : ""
170
+ postfix=(uml_ownedAttribute_inv_one==uml_type_one) ? '_self' : ''
146
171
  ah.java_annotation_add %{ @JoinTable(
147
- name="#{uml_ownedAttribute_inv_one.java_Name}_#{java_NameProperty}",
148
- joinColumns={@JoinColumn( name="#{uml_ownedAttribute_inv_one.java_Name}_id")},
149
- inverseJoinColumns={@JoinColumn(name="#{uml_type_one.java_Name}#{postfix}_id")}
172
+ name = "#{uml_ownedAttribute_inv_one.jpa_Name}_#{java_NameProperty}",
173
+ joinColumns={@JoinColumn(name = "#{uml_ownedAttribute_inv_one.jpa_Name}_id")},
174
+ inverseJoinColumns={@JoinColumn(name = "#{uml_type_one.jpa_Name}#{postfix}_id")}
150
175
  )}
151
- ah.umlx_owner_one.java_import_add("javax.persistence.JoinTable")
152
- ah.umlx_owner_one.java_import_add("javax.persistence.JoinColumn")
176
+ ah.umlx_owner_one.java_import_add('javax.persistence.JoinTable')
177
+ ah.umlx_owner_one.java_import_add('javax.persistence.JoinColumn')
153
178
  end
154
179
 
155
180
  # adds JPA annotation for an attribute with a cardinality 0..1 or 1
@@ -157,22 +182,28 @@ module Muml_Property
157
182
  ml=DatatypeMapping.instance.getMapping(self.uml_type_one).maxStringLength
158
183
  if ml.nil?
159
184
  ah.java_annotation_add(%{@Basic})
160
- ah.umlx_owner_one.java_import_add("javax.persistence.Basic")
185
+ ah.umlx_owner_one.java_import_add('javax.persistence.Basic')
161
186
  else
162
187
  ah.java_annotation_add(%{@Column(length=#{ml})})
163
- ah.umlx_owner_one.java_import_add("javax.persistence.Column")
188
+ ah.umlx_owner_one.java_import_add('javax.persistence.Column')
164
189
  end
165
190
  end
166
191
 
167
192
  # adds JPA annotation for an attribute with a cardinality *
168
193
  def jpa_addPersistenceManyAttribute!(ah)
169
- ah.java_annotation_add(%{@Transient //TODO: standard JPA cannot handle this case. Hibernate extension @CollectionOfElements is required})
170
- ah.umlx_owner_one.java_import_add("javax.persistence.Transient")
194
+ if true
195
+ #use hibernate extensions
196
+ ah.java_annotation_add(%{@CollectionOfElements})
197
+ ah.umlx_owner_one.java_import_add('org.hibernate.annotations.CollectionOfElements')
198
+ else
199
+ ah.java_annotation_add(%{@Transient //TODO: standard JPA cannot handle this case. Hibernate extension @CollectionOfElements is required})
200
+ ah.umlx_owner_one.java_import_add('javax.persistence.Transient')
201
+ end
171
202
  end
172
203
 
173
204
  def jpa_addJoinColumn!(ah)
174
- ah.java_annotation_add(%{@JoinColumn(name="#{java_NameProperty}_fk")})
175
- ah.umlx_owner_one.java_import_add("javax.persistence.JoinColumn")
205
+ ah.java_annotation_add(%{@JoinColumn(name = "#{jpa_Name}_FK")})
206
+ ah.umlx_owner_one.java_import_add('javax.persistence.JoinColumn')
176
207
  end
177
208
 
178
209
  #adds property persistence annotation to annotationHolder.
@@ -181,7 +212,19 @@ module Muml_Property
181
212
  #* property itself self
182
213
  #* getter for the property
183
214
  def jpa_addPersistenceTo!(ah)
184
- if umlx_isAttribute?
215
+ return if ah.uml_isDerived?
216
+
217
+ if uml_type_one.kind_of?(Muml_Interface)
218
+ txt= %{
219
+ ERROR: JPA Persistence does not support interfaces.
220
+ ERROR: An association must point to a class.
221
+ ERROR: class: #{umlx_owner_one.java_qualifiedName}
222
+ ERROR: attribute: #{java_Name}
223
+ ERROR type #{uml_type_one.java_qualifiedName}
224
+ }
225
+ log.error txt
226
+ raise Exception.new(txt)
227
+ elsif umlx_isAttribute?
185
228
  jpa_addPersistenceToAttribute!(ah)
186
229
  else
187
230
  jpa_addPersistenceToAssociation!(ah)
@@ -225,7 +268,7 @@ module Muml_Property
225
268
  elsif !fromOne && !toOne
226
269
  jpa_addPersistenceUnidirManyToMany!(ah)
227
270
  else
228
- raise Warning.new("Internal error")
271
+ raise Warning.new('Internal error')
229
272
  end
230
273
  end
231
274
  def jpa_addPersistenceToAssociationBidir!(ah)
@@ -250,7 +293,7 @@ module Muml_Property
250
293
  elsif !fromOne && !toOne && (!master)
251
294
  jpa_addPersistenceBidirManyToManySlave!(ah)
252
295
  else
253
- raise Warning.new("Internal error")
296
+ raise Warning.new('Internal error')
254
297
  end
255
298
 
256
299
  return
@@ -258,7 +301,7 @@ module Muml_Property
258
301
  # if umlx_oneToOne?
259
302
  # if umlx_otherEnd.nil? || !umlx_otherEnd.umlx_isNavigable?
260
303
  # jpa_addPersistenceUnidirOneToOne!(ah)
261
- # #ah.java_annotation_add("@OneToOne")
304
+ # #ah.java_annotation_add('@OneToOne')
262
305
  #
263
306
  # elsif umlx_masterEnd?
264
307
  # ah.java_annotation_add("@OneToOne(cascade = {CascadeType.MERGE, CascadeType.REFRESH, CascadeType.PERSIST, CascadeType.REMOVE})")
@@ -281,30 +324,41 @@ end
281
324
 
282
325
  class DatatypeMapping
283
326
  def jpa_addTypeModificator(ah)
327
+ n=ah.jpa_addNameAnnotation
328
+ return if n.nil?
329
+ ah.java_annotation_add(%{@Column(#{n})})
330
+ ah.umlx_owner_one.java_import_add('javax.persistence.Column')
284
331
  #nop
285
332
  end
286
333
  end
287
334
  class DatatypeMappingCalendar < DatatypeMapping
288
335
  def jpa_addTypeModificator(ah)
289
- ah.java_annotation_add("@Temporal(TemporalType.DATE)")
290
- ah.umlx_owner_one.java_import_add("javax.persistence.Temporal")
291
- ah.umlx_owner_one.java_import_add("javax.persistence.TemporalType")
336
+ super
337
+ ah.java_annotation_add('@Temporal(TemporalType.DATE)')
338
+ ah.umlx_owner_one.java_import_add('javax.persistence.Temporal')
339
+ ah.umlx_owner_one.java_import_add('javax.persistence.TemporalType')
292
340
  end
293
341
  end
294
342
 
295
343
  class DatatypeMappingBLOB < DatatypeMapping
296
344
  def jpa_addTypeModificator(ah)
297
- ah.java_annotation_add("@Lob")
298
- ah.umlx_owner_one.java_import_add("javax.persistence.Lob")
345
+ #no super
346
+ ah.java_annotation_add('@Lob')
347
+ ah.umlx_owner_one.java_import_add('javax.persistence.Lob')
348
+
349
+ #add column name when needed
350
+ n=ah.jpa_addNameAnnotation
351
+ n=n.nil? ? '' : ",#{n}"
352
+
299
353
  #mysql: MEDIUMBLOB LONGBLOB TINYBLOB BLOB
300
354
  if ah.context[:mysql]
301
- ah.java_annotation_add(%{@Column(columnDefinition="LONGBLOB")})
302
- ah.umlx_owner_one.java_import_add("javax.persistence.Column")
355
+ ah.java_annotation_add(%{@Column(columnDefinition="LONGBLOB"#{n})})
356
+ ah.umlx_owner_one.java_import_add('javax.persistence.Column')
303
357
  end
304
358
  #cf: http://db.apache.org/derby/docs/10.1/ref/rrefblob.html
305
359
  if ah.context[:derby]
306
- ah.java_annotation_add(%{@Column(columnDefinition="BLOB(4M)")})
307
- ah.umlx_owner_one.java_import_add("javax.persistence.Column")
360
+ ah.java_annotation_add(%{@Column(columnDefinition="BLOB(4M)"#{n})})
361
+ ah.umlx_owner_one.java_import_add('javax.persistence.Column')
308
362
  end
309
363
  end
310
364
  end