rgen 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (145) hide show
  1. data/CHANGELOG +20 -1
  2. data/MIT-LICENSE +1 -1
  3. data/README +12 -9
  4. data/lib/instantiators/ea_instantiator.rb +36 -0
  5. data/lib/metamodels/uml13_metamodel.rb +559 -0
  6. data/lib/metamodels/uml13_metamodel_ext.rb +26 -0
  7. data/lib/mmgen/metamodel_generator.rb +5 -5
  8. data/lib/mmgen/mm_ext/ecore_ext.rb +95 -0
  9. data/lib/mmgen/mmgen.rb +6 -4
  10. data/lib/mmgen/templates/annotations.tpl +37 -0
  11. data/lib/mmgen/templates/metamodel_generator.tpl +171 -0
  12. data/lib/rgen/ecore/ecore.rb +190 -0
  13. data/lib/rgen/ecore/ecore_instantiator.rb +25 -0
  14. data/lib/rgen/ecore/ecore_transformer.rb +85 -0
  15. data/lib/rgen/environment.rb +9 -24
  16. data/lib/rgen/find_helper.rb +68 -0
  17. data/lib/rgen/{instantiator.rb → instantiator/abstract_instantiator.rb} +6 -2
  18. data/lib/rgen/instantiator/abstract_xml_instantiator.rb +59 -0
  19. data/lib/rgen/instantiator/default_xml_instantiator.rb +117 -0
  20. data/lib/rgen/instantiator/ecore_xml_instantiator.rb +144 -0
  21. data/lib/rgen/instantiator/nodebased_xml_instantiator.rb +157 -0
  22. data/lib/rgen/instantiator/xmi11_instantiator.rb +164 -0
  23. data/lib/rgen/metamodel_builder.rb +103 -9
  24. data/lib/rgen/metamodel_builder/build_helper.rb +26 -4
  25. data/lib/rgen/metamodel_builder/builder_extensions.rb +285 -88
  26. data/lib/rgen/metamodel_builder/builder_runtime.rb +7 -1
  27. data/lib/rgen/metamodel_builder/data_types.rb +67 -0
  28. data/lib/rgen/metamodel_builder/intermediate/annotation.rb +30 -0
  29. data/lib/rgen/metamodel_builder/metamodel_description.rb +232 -0
  30. data/lib/rgen/metamodel_builder/mm_multiple.rb +23 -0
  31. data/lib/rgen/metamodel_builder/module_extension.rb +33 -0
  32. data/lib/rgen/model_comparator.rb +56 -0
  33. data/lib/rgen/model_dumper.rb +5 -5
  34. data/lib/rgen/name_helper.rb +17 -1
  35. data/lib/rgen/template_language.rb +148 -28
  36. data/lib/rgen/template_language/directory_template_container.rb +56 -38
  37. data/lib/rgen/template_language/output_handler.rb +93 -77
  38. data/lib/rgen/template_language/template_container.rb +186 -143
  39. data/lib/rgen/transformer.rb +19 -14
  40. data/lib/transformers/uml13_to_ecore.rb +75 -0
  41. data/redist/xmlscan/ChangeLog +1301 -0
  42. data/redist/xmlscan/README +34 -0
  43. data/redist/xmlscan/THANKS +11 -0
  44. data/redist/xmlscan/doc/changes.html +74 -0
  45. data/redist/xmlscan/doc/changes.rd +80 -0
  46. data/redist/xmlscan/doc/en/conformance.html +136 -0
  47. data/redist/xmlscan/doc/en/conformance.rd +152 -0
  48. data/redist/xmlscan/doc/en/manual.html +356 -0
  49. data/redist/xmlscan/doc/en/manual.rd +402 -0
  50. data/redist/xmlscan/doc/ja/conformance.ja.html +118 -0
  51. data/redist/xmlscan/doc/ja/conformance.ja.rd +134 -0
  52. data/redist/xmlscan/doc/ja/manual.ja.html +325 -0
  53. data/redist/xmlscan/doc/ja/manual.ja.rd +370 -0
  54. data/redist/xmlscan/doc/src/Makefile +41 -0
  55. data/redist/xmlscan/doc/src/conformance.rd.src +256 -0
  56. data/redist/xmlscan/doc/src/langsplit.rb +110 -0
  57. data/redist/xmlscan/doc/src/manual.rd.src +614 -0
  58. data/redist/xmlscan/install.rb +41 -0
  59. data/redist/xmlscan/lib/xmlscan/encoding.rb +311 -0
  60. data/redist/xmlscan/lib/xmlscan/htmlscan.rb +289 -0
  61. data/redist/xmlscan/lib/xmlscan/namespace.rb +352 -0
  62. data/redist/xmlscan/lib/xmlscan/parser.rb +299 -0
  63. data/redist/xmlscan/lib/xmlscan/scanner.rb +1109 -0
  64. data/redist/xmlscan/lib/xmlscan/version.rb +22 -0
  65. data/redist/xmlscan/lib/xmlscan/visitor.rb +158 -0
  66. data/redist/xmlscan/lib/xmlscan/xmlchar.rb +441 -0
  67. data/redist/xmlscan/memo/CONFORMANCE +1249 -0
  68. data/redist/xmlscan/memo/PRODUCTIONS +195 -0
  69. data/redist/xmlscan/memo/contentspec.ry +335 -0
  70. data/redist/xmlscan/samples/chibixml.rb +105 -0
  71. data/redist/xmlscan/samples/getxmlchar.rb +122 -0
  72. data/redist/xmlscan/samples/rexml.rb +159 -0
  73. data/redist/xmlscan/samples/xmlbench.rb +88 -0
  74. data/redist/xmlscan/samples/xmlbench/parser/chibixml.rb +22 -0
  75. data/redist/xmlscan/samples/xmlbench/parser/nqxml.rb +29 -0
  76. data/redist/xmlscan/samples/xmlbench/parser/rexml.rb +62 -0
  77. data/redist/xmlscan/samples/xmlbench/parser/xmlparser.rb +22 -0
  78. data/redist/xmlscan/samples/xmlbench/parser/xmlscan-0.0.10.rb +62 -0
  79. data/redist/xmlscan/samples/xmlbench/parser/xmlscan-chibixml.rb +22 -0
  80. data/redist/xmlscan/samples/xmlbench/parser/xmlscan-rexml.rb +22 -0
  81. data/redist/xmlscan/samples/xmlbench/parser/xmlscan.rb +99 -0
  82. data/redist/xmlscan/samples/xmlbench/xmlbench-lib.rb +116 -0
  83. data/redist/xmlscan/samples/xmlconftest.rb +200 -0
  84. data/redist/xmlscan/test.rb +7 -0
  85. data/redist/xmlscan/tests/deftestcase.rb +73 -0
  86. data/redist/xmlscan/tests/runtest.rb +47 -0
  87. data/redist/xmlscan/tests/testall.rb +14 -0
  88. data/redist/xmlscan/tests/testencoding.rb +438 -0
  89. data/redist/xmlscan/tests/testhtmlscan.rb +752 -0
  90. data/redist/xmlscan/tests/testnamespace.rb +457 -0
  91. data/redist/xmlscan/tests/testparser.rb +591 -0
  92. data/redist/xmlscan/tests/testscanner.rb +1749 -0
  93. data/redist/xmlscan/tests/testxmlchar.rb +143 -0
  94. data/redist/xmlscan/tests/visitor.rb +34 -0
  95. data/test/array_extensions_test.rb +2 -2
  96. data/test/ea_instantiator_test.rb +41 -0
  97. data/test/ecore_self_test.rb +53 -0
  98. data/test/environment_test.rb +11 -6
  99. data/test/metamodel_builder_test.rb +404 -245
  100. data/test/metamodel_roundtrip_test.rb +52 -0
  101. data/test/metamodel_roundtrip_test/TestModel.rb +65 -0
  102. data/test/metamodel_roundtrip_test/TestModel_Regenerated.rb +64 -0
  103. data/test/metamodel_roundtrip_test/houseMetamodel.ecore +32 -0
  104. data/test/metamodel_roundtrip_test/houseMetamodel_from_ecore.rb +39 -0
  105. data/test/rgen_test.rb +3 -3
  106. data/test/template_language_test.rb +65 -39
  107. data/test/template_language_test/expected_result.txt +24 -3
  108. data/test/template_language_test/templates/code/array.tpl +11 -0
  109. data/test/template_language_test/templates/content/author.tpl +7 -0
  110. data/test/template_language_test/templates/content/chapter.tpl +1 -1
  111. data/test/template_language_test/templates/root.tpl +17 -8
  112. data/test/template_language_test/testout.txt +24 -3
  113. data/test/testmodel/class_model_checker.rb +119 -0
  114. data/test/{xmi_instantiator_test/testmodel.eap → testmodel/ea_testmodel.eap} +0 -0
  115. data/test/{xmi_instantiator_test/testmodel.xml → testmodel/ea_testmodel.xml} +81 -14
  116. data/test/testmodel/ea_testmodel_partial.xml +317 -0
  117. data/test/testmodel/ecore_model_checker.rb +101 -0
  118. data/test/testmodel/manual_testmodel.xml +22 -0
  119. data/test/testmodel/object_model_checker.rb +67 -0
  120. data/test/transformer_test.rb +18 -10
  121. data/test/xml_instantiator_test.rb +81 -8
  122. data/test/xml_instantiator_test/simple_ecore_model_checker.rb +94 -0
  123. data/test/xml_instantiator_test/simple_xmi_ecore_instantiator.rb +53 -0
  124. data/test/xml_instantiator_test/simple_xmi_metamodel.rb +49 -0
  125. data/test/xml_instantiator_test/simple_xmi_to_ecore.rb +75 -0
  126. metadata +126 -28
  127. data/lib/ea/xmi_class_instantiator.rb +0 -46
  128. data/lib/ea/xmi_helper.rb +0 -26
  129. data/lib/ea/xmi_metamodel.rb +0 -34
  130. data/lib/ea/xmi_object_instantiator.rb +0 -46
  131. data/lib/ea/xmi_to_classmodel.rb +0 -78
  132. data/lib/ea/xmi_to_objectmodel.rb +0 -92
  133. data/lib/mmgen/mm_ext/uml_classmodel_ext.rb +0 -71
  134. data/lib/mmgen/templates/uml_classmodel.tpl +0 -63
  135. data/lib/rgen/xml_instantiator.rb +0 -132
  136. data/lib/uml/objectmodel_instantiator.rb +0 -53
  137. data/lib/uml/uml_classmodel.rb +0 -92
  138. data/lib/uml/uml_objectmodel.rb +0 -65
  139. data/test/metamodel_generator_test.rb +0 -44
  140. data/test/metamodel_generator_test/TestModel.rb +0 -40
  141. data/test/metamodel_generator_test/expected_result.txt +0 -40
  142. data/test/xmi_class_instantiator_test.rb +0 -24
  143. data/test/xmi_instantiator_test/class_model_checker.rb +0 -97
  144. data/test/xmi_object_instantiator_test.rb +0 -65
  145. data/test/xml_instantiator_test/testmodel.xml +0 -7
@@ -0,0 +1,26 @@
1
+ # Some handy extensions to the UML13 metamodel
2
+ #
3
+ module UML13
4
+
5
+ module AssociationEnd::ClassModule
6
+ def otherEnd
7
+ association.connection.find{|c| c != self}
8
+ end
9
+ end
10
+
11
+ module Classifier::ClassModule
12
+ def localCompositeEnd
13
+ associationEnd.select{|e| e.aggregation == :composite}
14
+ end
15
+ def remoteCompositeEnd
16
+ associationEnd.otherEnd.select{|e| e.aggregation == :composite}
17
+ end
18
+ def localNavigableEnd
19
+ associationEnd.select{|e| e.isNavigable}
20
+ end
21
+ def remoteNavigableEnd
22
+ associationEnd.otherEnd.select{|e| e.isNavigable}
23
+ end
24
+ end
25
+
26
+ end
@@ -1,17 +1,17 @@
1
1
  require 'rgen/environment'
2
2
  require 'rgen/template_language'
3
- require 'uml/uml_classmodel'
4
- require 'mmgen/mm_ext/uml_classmodel_ext'
3
+ require 'rgen/ecore/ecore'
4
+ require 'mmgen/mm_ext/ecore_ext'
5
5
 
6
6
  module MMGen
7
7
 
8
8
  module MetamodelGenerator
9
9
 
10
- def generateMetamodel(rootPackage, out_file, modules=[])
11
- tc = RGen::TemplateLanguage::DirectoryTemplateContainer.new(UMLClassModel, File.dirname(out_file))
10
+ def generateMetamodel(rootPackage, out_file)
11
+ tc = RGen::TemplateLanguage::DirectoryTemplateContainer.new(RGen::ECore, File.dirname(out_file))
12
12
  tpl_path = File.dirname(__FILE__) + '/templates'
13
13
  tc.load(tpl_path)
14
- tc.expand('uml_classmodel::GenerateClassModel', File.basename(out_file), modules, :for => rootPackage)
14
+ tc.expand('metamodel_generator::GenerateMetamodel', File.basename(out_file), :for => rootPackage)
15
15
  end
16
16
 
17
17
  end
@@ -0,0 +1,95 @@
1
+ require 'rgen/name_helper'
2
+
3
+ module RGen
4
+
5
+ module ECore
6
+
7
+ module EPackage::ClassModule
8
+ include RGen::NameHelper
9
+
10
+ def moduleName
11
+ firstToUpper(name)
12
+ end
13
+
14
+ def qualifiedModuleName(rootPackage)
15
+ return moduleName unless eSuperPackage and self != rootPackage
16
+ eSuperPackage.qualifiedModuleName(rootPackage) + "::" + moduleName
17
+ end
18
+
19
+ def allClassifiers
20
+ eSubpackages.inject(eClassifiers) {|r,p| r.concat(p.allClassifiers) }
21
+ end
22
+
23
+ def ancestorPackages
24
+ return [] unless eSuperPackage
25
+ [eSuperPackage] + eSuperPackage.ancestorPackages
26
+ end
27
+
28
+ def ownClasses
29
+ eClassifiers.select{|c| c.is_a?(EClass)}
30
+ end
31
+
32
+ def classesInGenerationOrdering
33
+ ownClasses + eSubpackages.collect{|s| s.classesInGenerationOrdering}.flatten
34
+ end
35
+
36
+ def needClassReorder?
37
+ classesInGenerationOrdering != inheritanceOrderClasses(classesInGenerationOrdering)
38
+ end
39
+
40
+ def allClassesSorted
41
+ inheritanceOrderClasses(classesInGenerationOrdering)
42
+ end
43
+
44
+ def inheritanceOrderClasses(cls)
45
+ sortArray = cls.dup
46
+ i1 = 0
47
+ while i1 < sortArray.size-1
48
+ again = false
49
+ for i2 in i1+1..sortArray.size-1
50
+ e2 = sortArray[i2]
51
+ if sortArray[i1].eSuperTypes.include?(e2)
52
+ sortArray.delete(e2)
53
+ sortArray.insert(i1,e2)
54
+ again = true
55
+ break
56
+ end
57
+ end
58
+ i1 += 1 unless again
59
+ end
60
+ sortArray
61
+ end
62
+ end
63
+
64
+ module EClassifier::ClassModule
65
+ include RGen::NameHelper
66
+ def classifierName
67
+ firstToUpper(name)
68
+ end
69
+ def qualifiedName(rootPackage)
70
+ (ePackage ? ePackage.qualifiedModuleName(rootPackage) + "::" : "") + classifierName
71
+ end
72
+ def ancestorPackages
73
+ return [] unless ePackage
74
+ [ePackage] + ePackage.ancestorPackages
75
+ end
76
+ def qualifiedNameIfRequired(package)
77
+ if ePackage != package
78
+ commonSuper = (package.ancestorPackages & ancestorPackages).first
79
+ qualifiedName(commonSuper)
80
+ else
81
+ classifierName
82
+ end
83
+ end
84
+ end
85
+
86
+ module EAttribute::ClassModule
87
+ def RubyType
88
+ typeMap = {'float' => 'Float', 'int' => 'Integer'}
89
+ (self.getType && typeMap[self.getType.downcase]) || 'String'
90
+ end
91
+ end
92
+
93
+ end
94
+
95
+ end
data/lib/mmgen/mmgen.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  $:.unshift File.join(File.dirname(__FILE__),"..")
2
2
 
3
- require 'ea/xmi_class_instantiator'
3
+ require 'ea/xmi_ecore_instantiator'
4
4
  require 'mmgen/metamodel_generator'
5
5
 
6
6
  include MMGen::MetamodelGenerator
@@ -16,11 +16,13 @@ else
16
16
  puts out_file
17
17
  end
18
18
 
19
- envUML = RGen::Environment.new
19
+ env = RGen::Environment.new
20
20
  File.open(file_name) { |f|
21
- XMIClassInstantiator.new.instantiateUMLClassModel(envUML, f.read)
21
+ puts "instantiating ..."
22
+ XMIECoreInstantiator.new.instantiateECoreModel(env, f.read)
22
23
  }
23
24
 
24
- rootPackage = envUML.find(:class => UMLClassModel::UMLPackage).select{|p| p.name == root_package_name}.first
25
+ rootPackage = env.find(:class => RGen::ECore::EPackage, :name => root_package_name).first
25
26
 
27
+ puts "generating ..."
26
28
  generateMetamodel(rootPackage, out_file, modules)
@@ -0,0 +1,37 @@
1
+ <% define 'Annotations', :for => EPackage do %>
2
+ <% for a in eAnnotations %>
3
+ annotation <% expand 'AnnotationArgs', :for => a %>
4
+ <% end %>
5
+ <% end %>
6
+
7
+ <% define 'Annotations', :for => EClass do %>
8
+ <% for a in eAnnotations %>
9
+ annotation <% expand 'AnnotationArgs', :for => a %>
10
+ <% end %>
11
+ <% end %>
12
+
13
+ <% define 'Annotations', :for => EStructuralFeature do %>
14
+ <% oppositeAnnotations = (this.respond_to?(:eOpposite) && eOpposite && eOpposite.eAnnotations) || [] %>
15
+ <% if eAnnotations.size > 0 || oppositeAnnotations.size > 0 %>
16
+ do<%iinc%>
17
+ <% for a in eAnnotations %>
18
+ annotation <% expand 'AnnotationArgs', :for => a %>
19
+ <% end %>
20
+ <% for a in oppositeAnnotations %>
21
+ opposite_annotation <% expand 'AnnotationArgs', :for => a %>
22
+ <% end %><%idec%>
23
+ end<%nows%>
24
+ <% end %>
25
+ <% end %>
26
+
27
+ <% define 'AnnotationArgs', :for => EAnnotation do %>
28
+ <% if source.nil? %>
29
+ <% expand 'Details' %>
30
+ <% else %>
31
+ :source => "<%= source.to_s %>", :details => {<% expand 'Details' %>}<%nows%>
32
+ <% end %>
33
+ <% end %>
34
+
35
+ <% define 'Details', :for => EAnnotation do %>
36
+ <%= details.sort{|a,b| a.key<=>b.key}.collect{ |d| "\'" + d.key + "\' => \'"+ d.value.gsub('\'','\\\'').to_s + "\'"}.join(', ') %><%nows%>
37
+ <% end %>
@@ -0,0 +1,171 @@
1
+
2
+ <% define 'GenerateMetamodel', :for => EPackage do |filename| %>
3
+ <% file filename do %>
4
+ require 'rgen/metamodel_builder'
5
+ <%nl%>
6
+ <% if needClassReorder? %>
7
+ <% expand 'GeneratePackagesOnly' %>
8
+ <% expand 'GenerateClassesReordered' %>
9
+ <% else %>
10
+ <% expand 'GeneratePackage' %>
11
+ <% end %>
12
+ <%nl%>
13
+ <% expand 'GenerateAssocs' %>
14
+ <% end %>
15
+ <% end %>
16
+
17
+ <% define 'GeneratePackage', :for => EPackage do %>
18
+ module <%= moduleName %><% iinc %>
19
+ extend RGen::MetamodelBuilder::ModuleExtension
20
+ include RGen::MetamodelBuilder::DataTypes
21
+ <% expand 'annotations::Annotations' %>
22
+ <%nl%>
23
+ <% expand 'EnumTypes' %>
24
+ <% for c in ownClasses %><%nl%>
25
+ <% expand 'ClassHeader', this, :for => c %><%iinc%>
26
+ <% expand 'annotations::Annotations', :for => c %>
27
+ <% expand 'Attribute', this, :foreach => c.eAttributes %>
28
+ <%idec%>
29
+ end
30
+ <% end %><%nl%>
31
+ <% for p in eSubpackages %>
32
+ <%nl%><% expand 'GeneratePackage', :for => p %>
33
+ <% end %><%idec%>
34
+ end
35
+ <% end %>
36
+
37
+ <% define 'GenerateClassesReordered', :for => EPackage do %>
38
+ <% for c in allClassesSorted %><%nl%>
39
+ <% expand 'ClassHeaderFullyQualified', this, :for => c %><%iinc%>
40
+ <% expand 'annotations::Annotations', :for => c %>
41
+ <% expand 'Attribute', this, :foreach => c.eAttributes %>
42
+ <%idec%>
43
+ end
44
+ <% end %><%nl%>
45
+ <% end %>
46
+
47
+ <% define 'GeneratePackagesOnly', :for => EPackage do %>
48
+ module <%= moduleName %><% iinc %>
49
+ extend RGen::MetamodelBuilder::ModuleExtension
50
+ include RGen::MetamodelBuilder::DataTypes
51
+ <% expand 'annotations::Annotations' %>
52
+ <%nl%>
53
+ <% expand 'EnumTypes' %>
54
+ <% for p in eSubpackages %>
55
+ <%nl%><% expand 'GeneratePackagesOnly', :for => p %>
56
+ <% end %><%idec%>
57
+ end
58
+ <% end %>
59
+
60
+ <% define 'Attribute', :for => EAttribute do |rootp| %>
61
+ <% if upperBound == 1%>
62
+ has_attr '<%= name %>', <%nows%>
63
+ <% if eType.is_a?(EEnum) %><%nows%>
64
+ <%= eType.qualifiedName(rootp) %><%nows%>
65
+ <% else %><%nows%>
66
+ <%= eType && eType.instanceClass.to_s %><%nows%>
67
+ <% end %><%nows%>
68
+ <% for p in RGen::MetamodelBuilder::AttributeDescription.propertySet %>
69
+ <% unless p == :name || p == :upperBound || RGen::MetamodelBuilder::AttributeDescription.default_value(p) == getGeneric(p) %>
70
+ , :<%=p%> => <%nows%>
71
+ <% if getGeneric(p).is_a?(String) %>
72
+ "<%= getGeneric(p) %>"<%nows%>
73
+ <% elsif getGeneric(p).is_a?(Symbol) %>
74
+ :<%= getGeneric(p) %><%nows%>
75
+ <% else %>
76
+ <%= getGeneric(p) %><%nows%>
77
+ <% end %>
78
+ <% end %>
79
+ <% end %>
80
+ <%ws%><% expand 'annotations::Annotations' %><%nl%>
81
+ <% end %>
82
+ <% end %>
83
+
84
+ <% define 'EnumTypes', :for => EPackage do %>
85
+ <% for enum in eClassifiers.select{|c| c.is_a?(EEnum)} %>
86
+ <%= enum.name %> = Enum.new([ <%nows%>
87
+ <%= enum.eLiterals.collect { |lit| ":"+lit.name }.join(', ') %> ])
88
+ <% end %>
89
+ <% end %>
90
+
91
+ <% define 'GenerateAssocs', :for => EPackage do %>
92
+ <% refDone = {} %>
93
+ <% for ref in allClassifiers.select{|c| c.is_a?(EClass)}.eReferences %>
94
+ <% if !refDone[ref] && ref.eOpposite %>
95
+ <% ref = ref.eOpposite if ref.eOpposite.containment %>
96
+ <% refDone[ref] = refDone[ref.eOpposite] = true %>
97
+ <% if !ref.many && !ref.eOpposite.many %>
98
+ <% if ref.containment %>
99
+ <% expand 'Reference', "contains_one", this, :for => ref %>
100
+ <% else %>
101
+ <% expand 'Reference', "one_to_one", this, :for => ref %>
102
+ <% end %>
103
+ <% elsif !ref.many && ref.eOpposite.many %>
104
+ <% expand 'Reference', "many_to_one", this, :for => ref %>
105
+ <% elsif ref.many && !ref.eOpposite.many %>
106
+ <% if ref.containment %>
107
+ <% expand 'Reference', "contains_many", this, :for => ref %>
108
+ <% else %>
109
+ <% expand 'Reference', "one_to_many", this, :for => ref %>
110
+ <% end %>
111
+ <% elsif ref.many && ref.eOpposite.many %>
112
+ <% expand 'Reference', "many_to_many", this, :for => ref %>
113
+ <% end %>
114
+ <% expand 'annotations::Annotations', :for => ref %><%nl%>
115
+ <% elsif !refDone[ref] %>
116
+ <% refDone[ref] = true %>
117
+ <% if !ref.many %>
118
+ <% if ref.containment %>
119
+ <% expand 'Reference', "contains_one_uni", this, :for => ref %>
120
+ <% else %>
121
+ <% expand 'Reference', "has_one", this, :for => ref %>
122
+ <% end %>
123
+ <% elsif ref.many %>
124
+ <% if ref.containment %>
125
+ <% expand 'Reference', "contains_many_uni", this, :for => ref %>
126
+ <% else %>
127
+ <% expand 'Reference', "has_many", this, :for => ref %>
128
+ <% end %>
129
+ <% end %>
130
+ <% expand 'annotations::Annotations', :for => ref %><%nl%>
131
+ <% end %>
132
+ <% end %>
133
+ <% end %>
134
+
135
+ <% define 'Reference', :for => EReference do |cmd, rootpackage| %>
136
+ <%= eContainingClass.qualifiedName(rootpackage) %>.<%= cmd %> '<%= name %>', <%= eType && eType.qualifiedName(rootpackage) %><%nows%>
137
+ <% if eOpposite %><%nows%>
138
+ , '<%= eOpposite.name%>'<%nows%>
139
+ <% end %><%nows%>
140
+ <% pset = RGen::MetamodelBuilder::ReferenceDescription.propertySet.reject{|p| p == :name || p == :upperBound || p == :containment} %>
141
+ <% for p in pset.reject{|p| RGen::MetamodelBuilder::ReferenceDescription.default_value(p) == getGeneric(p)} %>
142
+ , :<%=p%> => <%=getGeneric(p)%><%nows%>
143
+ <% end %>
144
+ <% if eOpposite %>
145
+ <% for p in pset.reject{|p| RGen::MetamodelBuilder::ReferenceDescription.default_value(p) == eOpposite.getGeneric(p)} %>
146
+ , :opposite_<%=p%> => <%=eOpposite.getGeneric(p)%><%nows%>
147
+ <% end %>
148
+ <% end %><%ws%>
149
+ <% end %>
150
+
151
+ <% define 'ClassHeader', :for => EClass do |rootp| %>
152
+ class <%= classifierName %> < <% nows %>
153
+ <% if eSuperTypes.size > 1 %><% nows %>
154
+ RGen::MetamodelBuilder::MMMultiple(<%= eSuperTypes.collect{|t| t.qualifiedNameIfRequired(rootp)}.join(', ') %>)
155
+ <% elsif eSuperTypes.size > 0 %><% nows %>
156
+ <%= eSuperTypes.first.qualifiedNameIfRequired(rootp) %>
157
+ <% else %><% nows %>
158
+ RGen::MetamodelBuilder::MMBase
159
+ <% end %>
160
+ <% end %>
161
+
162
+ <% define 'ClassHeaderFullyQualified', :for => EClass do |rootp| %>
163
+ class <%= qualifiedName(rootp) %> < <% nows %>
164
+ <% if eSuperTypes.size > 1 %><% nows %>
165
+ RGen::MetamodelBuilder::MMMultiple(<%= eSuperTypes.collect{|t| t.qualifiedName(rootp)}.join(', ') %>)
166
+ <% elsif eSuperTypes.size > 0 %><% nows %>
167
+ <%= eSuperTypes.first.qualifiedName(rootp) %>
168
+ <% else %><% nows %>
169
+ RGen::MetamodelBuilder::MMBase
170
+ <% end %>
171
+ <% end %>
@@ -0,0 +1,190 @@
1
+ require 'rgen/metamodel_builder'
2
+
3
+ module RGen
4
+ extend RGen::MetamodelBuilder::ModuleExtension
5
+
6
+ # This is the ECore metamodel described using the RGen::MetamodelBuilder language.
7
+ #
8
+ # Known differences to the Java/EMF implementation are:
9
+ # * Attributes can not be "many"
10
+ #
11
+ module ECore
12
+ extend RGen::MetamodelBuilder::ModuleExtension
13
+
14
+ class EObject < RGen::MetamodelBuilder::MMBase
15
+ end
16
+
17
+ class EModelElement < RGen::MetamodelBuilder::MMBase
18
+ end
19
+
20
+ class EAnnotation < RGen::MetamodelBuilder::MMMultiple(EModelElement, EObject)
21
+ has_attr 'source', String
22
+ end
23
+
24
+ class ENamedElement < EModelElement
25
+ has_attr 'name', String
26
+ end
27
+
28
+ class ETypedElement < ENamedElement
29
+ has_attr 'lowerBound', Integer, :defaultValueLiteral => "0"
30
+ has_attr 'ordered', Boolean, :defaultValueLiteral => "true"
31
+ has_attr 'unique', Boolean, :defaultValueLiteral => "true"
32
+ has_attr 'upperBound', Integer, :defaultValueLiteral => "1"
33
+ has_attr 'many', Boolean, :derived=>true
34
+ has_attr 'required', Boolean, :derived=>true
35
+ module ClassModule
36
+ def many_derived
37
+ upperBound > 1 || upperBound == -1
38
+ end
39
+ def required_derived
40
+ lowerBound > 0
41
+ end
42
+ end
43
+ end
44
+
45
+ class EStructuralFeature < ETypedElement
46
+ has_attr 'changeable', Boolean, :defaultValueLiteral => "true"
47
+ has_attr 'defaultValue', Object, :derived=>true
48
+ has_attr 'defaultValueLiteral', String
49
+ has_attr 'derived', Boolean, :defaultValueLiteral => "false"
50
+ has_attr 'transient', Boolean, :defaultValueLiteral => "false"
51
+ has_attr 'unsettable', Boolean, :defaultValueLiteral => "false"
52
+ has_attr 'volatile', Boolean, :defaultValueLiteral => "false"
53
+ module ClassModule
54
+ def defaultValue_derived
55
+ eval(defaultValueLiteral) unless defaultValueLiteral.nil?
56
+ end
57
+ end
58
+ end
59
+
60
+ class EAttribute < EStructuralFeature
61
+ has_attr 'iD', Boolean, :defaultValueLiteral => "false"
62
+ end
63
+
64
+ class EClassifier < ENamedElement
65
+ has_attr 'defaultValue', Object, :derived=>true
66
+ has_attr 'instanceClass', Object, :derived=>true
67
+ has_attr 'instanceClassName', String
68
+ module ClassModule
69
+ def instanceClass_derived
70
+ map = {"java.lang.String" => "String", "boolean" => "RGen::MetamodelBuilder::DataTypes::Boolean", "int" => "Integer"}
71
+ icn = instanceClassName
72
+ icn = "NilClass" if icn.nil?
73
+ icn = map[icn] if map[icn]
74
+ eval(icn)
75
+ end
76
+ end
77
+ end
78
+
79
+ class EDataType < EClassifier
80
+ has_attr 'serializable', Boolean
81
+ end
82
+
83
+ class EEnum < EDataType
84
+ end
85
+
86
+ class EEnumLiteral < ENamedElement
87
+ # instance may point to a "singleton object" (e.g. a Symbol) representing the literal
88
+ # has_attr 'instance', Object, :eType=>:EEnumerator, :transient=>true
89
+ has_attr 'literal', String
90
+ has_attr 'value', Integer
91
+ end
92
+
93
+ # TODO: check if required
94
+ class EFactory < EModelElement
95
+ end
96
+
97
+ class EOperation < ETypedElement
98
+ end
99
+
100
+ class EPackage < ENamedElement
101
+ has_attr 'nsPrefix', String
102
+ has_attr 'nsURI', String
103
+ end
104
+
105
+ class EParameter < ETypedElement
106
+ end
107
+
108
+ class EReference < EStructuralFeature
109
+ has_attr 'container', Boolean, :derived=>true
110
+ has_attr 'containment', Boolean, :defaultValueLiteral => "false"
111
+ has_attr 'resolveProxies', Boolean, :defaultValueLiteral => "true"
112
+ end
113
+
114
+ class EStringToStringMapEntry < RGen::MetamodelBuilder::MMBase
115
+ has_attr 'key', String
116
+ has_attr 'value', String
117
+ end
118
+
119
+ class EClass < EClassifier
120
+ has_attr 'abstract', Boolean
121
+ has_attr 'interface', Boolean
122
+ has_one 'eIDAttribute', ECore::EAttribute, :derived=>true, :resolveProxies=>false
123
+
124
+ has_many 'eAllAttributes', ECore::EAttribute, :derived=>true
125
+ has_many 'eAllContainments', ECore::EReference, :derived=>true
126
+ has_many 'eAllOperations', ECore::EOperation, :derived=>true
127
+ has_many 'eAllReferences', ECore::EReference, :derived=>true
128
+ has_many 'eAllStructuralFeatures', ECore::EStructuralFeature, :derived=>true
129
+ has_many 'eAllSuperTypes', ECore::EClass, :derived=>true
130
+ has_many 'eAttributes', ECore::EAttribute, :derived=>true
131
+ has_many 'eReferences', ECore::EReference, :derived=>true
132
+
133
+ module ClassModule
134
+ def eAllAttributes_derived
135
+ eAttributes + eSuperTypes.eAllAttributes
136
+ end
137
+ def eAllContainments_derived
138
+ eReferences.select{|r| r.containment} + eSuperTypes.eAllContainments
139
+ end
140
+ def eAllReferences_derived
141
+ eReferences + eSuperTypes.eAllReferences
142
+ end
143
+ def eAllStructuralFeatures_derived
144
+ eStructuralFeatures + eSuperTypes.eAllStructuralFeatures
145
+ end
146
+ def eAllSuperTypes_derived
147
+ eSuperTypes + eSuperTypes.eAllSuperTypes
148
+ end
149
+ def eAttributes_derived
150
+ eStructuralFeatures.select{|f| f.is_a?(EAttribute)}
151
+ end
152
+ def eReferences_derived
153
+ eStructuralFeatures.select{|f| f.is_a?(EReference)}
154
+ end
155
+ end
156
+ end
157
+
158
+ # predefined datatypes
159
+
160
+ EString = EDataType.new(:name => "EString", :instanceClassName => "String")
161
+ EInt = EDataType.new(:name => "EInt", :instanceClassName => "Integer")
162
+ EBoolean = EDataType.new(:name => "EBoolean", :instanceClassName => "RGen::MetamodelBuilder::DataTypes::Boolean")
163
+ EFloat = EDataType.new(:name => "EFloat", :instanceClassName => "Float")
164
+ ERubyObject = EDataType.new(:name => "ERubyObject", :instanceClassName => "Object")
165
+ EJavaObject = EDataType.new(:name => "EJavaObject")
166
+ ERubyClass = EDataType.new(:name => "ERubyClass", :instanceClassName => "Class")
167
+ EJavaClass = EDataType.new(:name => "EJavaClass")
168
+
169
+ end
170
+
171
+ ECore::EModelElement.contains_many 'eAnnotations', ECore::EAnnotation, 'eModelElement', :resolveProxies=>false
172
+ ECore::EAnnotation.contains_many_uni 'details', ECore::EStringToStringMapEntry, :resolveProxies=>false
173
+ ECore::EAnnotation.contains_many_uni 'contents', ECore::EObject, :resolveProxies=>false
174
+ ECore::EAnnotation.has_many 'references', ECore::EObject
175
+ ECore::EPackage.contains_many 'eClassifiers', ECore::EClassifier, 'ePackage'
176
+ ECore::EPackage.contains_many 'eSubpackages', ECore::EPackage, 'eSuperPackage'
177
+ ECore::ETypedElement.has_one 'eType', ECore::EClassifier
178
+ ECore::EClass.contains_many 'eOperations', ECore::EOperation, 'eContainingClass', :resolveProxies=>false
179
+ ECore::EClass.contains_many 'eStructuralFeatures', ECore::EStructuralFeature, 'eContainingClass', :resolveProxies=>false
180
+ ECore::EClass.has_many 'eSuperTypes', ECore::EClass
181
+ ECore::EEnum.contains_many 'eLiterals', ECore::EEnumLiteral, 'eEnum', :resolveProxies=>false
182
+ ECore::EFactory.one_to_one 'ePackage', ECore::EPackage, 'eFactoryInstance', :lowerBound=>1, :transient=>true, :resolveProxies=>false
183
+ ECore::EOperation.contains_many 'eParameters', ECore::EParameter, 'eOperation', :resolveProxies=>false
184
+ ECore::EOperation.has_many 'eExceptions', ECore::EClassifier
185
+ ECore::EReference.has_one 'eOpposite', ECore::EReference
186
+
187
+ ECore::EAttribute.has_one 'eAttributeType', ECore::EDataType, :lowerBound=>1, :derived=>true
188
+ ECore::EReference.has_one 'eReferenceType', ECore::EClass, :lowerBound=>1, :derived=>true
189
+
190
+ end