rgen 0.3.0 → 0.4.0

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 (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
@@ -1,34 +0,0 @@
1
- module XMIMetaModel
2
-
3
- module UML
4
-
5
- include RGen::MetamodelBuilder
6
- class Classifier_feature < MMBase
7
- has_many 'operation'
8
- end
9
- class ClassifierRole < MMBase
10
- end
11
- class Clazz < ClassifierRole
12
- has_many 'modelElement_stereotype'
13
- end
14
- class Operation < MMBase
15
- has_one 'parent'
16
- end
17
- class Generalization < MMBase
18
- end
19
- class ModelElement_stereotype < MMBase
20
- has_one 'parent'
21
- end
22
- class AssociationEnd < MMBase
23
- end
24
- class AssociationEndRole < MMBase
25
- end
26
- ClassifierRole.one_to_many 'associationEnds', AssociationEnd, 'typeClass'
27
- ClassifierRole.one_to_many 'associationEndRoles', AssociationEndRole, 'typeClass'
28
- Clazz.one_to_many 'generalizationsAsSubtype', Generalization, 'subtypeClass'
29
- Clazz.one_to_many 'generalizationsAsSupertype', Generalization, 'supertypeClass'
30
-
31
- end
32
-
33
- end
34
-
@@ -1,46 +0,0 @@
1
- require 'rgen/xml_instantiator'
2
- require 'rgen/environment'
3
- require 'uml/uml_objectmodel'
4
- require 'ea/xmi_metamodel'
5
-
6
- # This module can be used to instantiate an UMLObjectModel from an XMI description.
7
- #
8
- # Here is an example:
9
- #
10
- # include XMIObjectInstantiator
11
- #
12
- # envUML = RGen::Environment.new
13
- # File.open(MODEL_DIR+"/testmodel.xml") { |f|
14
- # XMIClassInstantiator.new.instantiateUMLObjectModel(envUML, f.read)
15
- # }
16
- #
17
- # # now use the newly created UML model
18
- # envUML.find(:class => UMLObjectModel::UMLObject).each { |o|
19
- # puts o.name
20
- # }
21
- #
22
- # This module relies on XmiToObjectmodel to do the actual transformation.
23
- #
24
- class XMIObjectInstantiator < RGen::XMLInstantiator
25
-
26
- include UMLObjectModel
27
-
28
- map_tag_ns "omg.org/UML1.3", XMIMetaModel::UML
29
-
30
- resolve_by_id :typeClass, :src => :type, :id => :xmi_id
31
-
32
- def initialize
33
- @envXMI = RGen::Environment.new
34
- super(@envXMI, XMIMetaModel, true)
35
- end
36
-
37
- # This method does the actual work.
38
- def instantiateUMLObjectModel(envOut, str)
39
- instantiate(str)
40
-
41
- require 'ea/xmi_to_objectmodel'
42
-
43
- XmiToObjectmodel.new(@envXMI,envOut).transform
44
- end
45
-
46
- end
@@ -1,78 +0,0 @@
1
- require 'rgen/transformer'
2
- require 'ea/xmi_helper'
3
- require 'ea/xmi_metamodel'
4
- require 'uml/uml_classmodel'
5
- require 'rgen/array_extensions'
6
-
7
- # This class is a RGen::Transformer working on an input and output Environment.
8
- # It creates an UMLClassModel from an XMI Model instantiated by a
9
- # RGen::XMLInstantiator.
10
- #
11
- # See description of RGen::XMLInstantiator for details about the XMI (meta-)model.
12
- # See UMLClassModel for details about the UML Class (meta-)model.
13
- class XmiToClassmodel < RGen::Transformer
14
- include UMLClassModel
15
- include RGen::XMIHelper
16
-
17
- # Do the actual transformation.
18
- # Input and output environment have to be provided to the transformer constructor.
19
- def transform
20
- trans(:class => XMIMetaModel::UML::Clazz)
21
- end
22
-
23
- transform XMIMetaModel::UML::Package, :to => UMLPackage do
24
- { :name => name,
25
- :superpackage => trans(parent.parent.is_a?(XMIMetaModel::UML::Package) ? parent.parent : nil) }
26
- end
27
-
28
- transform XMIMetaModel::UML::Attribute, :to => UMLAttribute do
29
- tv = TaggedValueHelper.new(@current_object)
30
- { :name => name, :type => tv['type'] }
31
- end
32
-
33
- transform XMIMetaModel::UML::Operation, :to => UMLOperation do
34
- { :name => name }
35
- end
36
-
37
- transform XMIMetaModel::UML::TaggedValue, :to => UMLTaggedValue do
38
- { :tag => tag, :value => value }
39
- end
40
-
41
- transform XMIMetaModel::UML::Clazz, :to => UMLClass do
42
- { :name => name,
43
- :package => trans(parent.parent.is_a?(XMIMetaModel::UML::Package) ? parent.parent : nil),
44
- :attributes => trans(classifier_feature.attribute),
45
- :operations => trans(classifier_feature.operation),
46
- :taggedvalues => trans(modelElement_taggedValue.taggedValue),
47
- :stereotypes => modelElement_stereotype.stereotype.name,
48
- :subclasses => trans(generalizationsAsSupertype.subtypeClass),
49
- :assocEnds => trans(associationEnds)}
50
- end
51
-
52
- transform XMIMetaModel::UML::Association, :to => :scAssociationClass do
53
- { :endA => trans(scAssocEnds[0]),
54
- :endB => trans(scAssocEnds[1]) }
55
- end
56
-
57
- method :scAssocEnds do
58
- association_connection.associationEnd
59
- end
60
-
61
- method :scAssociationClass do
62
- (scAssocEnds[0].aggregation == 'composite' or
63
- scAssocEnds[1].aggregation == 'composite' ?
64
- UMLAggregation : UMLAssociation )
65
- end
66
-
67
- transform XMIMetaModel::UML::AssociationEnd, :to => UMLAssociationEnd do
68
- # since we don't want to figure out if we are end A or end B,
69
- # we let the association transformer do the work
70
- trans(parent.parent)
71
- { :clazz => trans(typeClass),
72
- :role => name,
73
- :multiplicity => multiplicity,
74
- :composite => (aggregation == 'composite'),
75
- :navigable => (isNavigable == 'true') }
76
- end
77
-
78
- end
@@ -1,92 +0,0 @@
1
- require 'rgen/transformer'
2
- require 'ea/xmi_helper'
3
- require 'ea/xmi_metamodel'
4
- require 'uml/uml_objectmodel'
5
- require 'rgen/array_extensions'
6
-
7
- # This class is a RGen::Transformer working on an input and output Environment.
8
- # It creates an UMLObjectModel from an XMI Model instantiated by a
9
- # RGen::XMLInstantiator.
10
- #
11
- # See description of RGen::XMLInstantiator for details about the XMI (meta-)model.
12
- # See UMLObjectModel for details about the UML Object (meta-)model.
13
- class XmiToObjectmodel < RGen::Transformer
14
- include UMLObjectModel
15
- include RGen::XMIHelper
16
-
17
- # Do the actual transformation.
18
- # Input and output environment have to be provided to the transformer constructor.
19
- def transform
20
- trans(
21
- @env_in.find(:class => XMIMetaModel::UML::ClassifierRole)-
22
- @env_in.find(:class => XMIMetaModel::UML::Clazz)
23
- )
24
- end
25
-
26
- transform XMIMetaModel::UML::Package, :to => UMLPackage do
27
- { :name => name,
28
- :superpackage => trans(parent.parent.is_a?(XMIMetaModel::UML::Package) ? parent.parent : nil) }
29
- end
30
-
31
- transform XMIMetaModel::UML::ClassifierRole, :to => UMLObject, :if => :isEASTypeObject do
32
- trans(associationEndRoles.parent.parent)
33
- trans(associationEnds.parent.parent)
34
- taggedValues = TaggedValueHelper.new(@current_object)
35
- { :name => name,
36
- :classname => taggedValues['classname'],
37
- :attributeSettings => createAttributeSettings(taggedValues['runstate']),
38
- :package => trans(parent.parent.parent.parent) }
39
- end
40
-
41
- method :isEASTypeObject do
42
- taggedValues = TaggedValueHelper.new(@current_object)
43
- taggedValues['ea_stype'] == 'Object'
44
- end
45
-
46
- def createAttributeSettings(runstate)
47
- return [] unless runstate
48
- result = []
49
- as = nil
50
- runstate.split(';').each do |t|
51
- if t == '@VAR'
52
- as = @env_out.new UMLAttributeSetting
53
- result << as
54
- elsif t =~ /(\w+)=(\w+)/
55
- as.name = $2 if $1 == 'Variable'
56
- as.value = $2 if $1 == 'Value'
57
- end
58
- end
59
- result
60
- end
61
-
62
- transform XMIMetaModel::UML::AssociationRole, :to => UMLAssociation, :if => :isEATypeAssociation do
63
- ends = association_connection.associationEndRole
64
- { :endA => trans(ends[0]), :endB => trans(ends[1])}
65
- end
66
-
67
- method :isEATypeAssociation do
68
- taggedValues = TaggedValueHelper.new(@current_object)
69
- taggedValues['ea_type'] == 'Association'
70
- end
71
-
72
- transform XMIMetaModel::UML::Association, :to => UMLAggregation do
73
- ends = association_connection.associationEnd
74
- { :endA => trans(ends[0]), :endB => trans(ends[1])}
75
- end
76
-
77
- transform XMIMetaModel::UML::AssociationEndRole, :to => UMLAssociationEnd do
78
- buildAssociationEnd
79
- end
80
-
81
- transform XMIMetaModel::UML::AssociationEnd, :to => UMLAssociationEnd do
82
- buildAssociationEnd
83
- end
84
-
85
- method :buildAssociationEnd do
86
- { :object => trans(typeClass),
87
- :role => name,
88
- :composite => (aggregation == 'composite'),
89
- :navigable => (isNavigable == 'true') }
90
- end
91
-
92
- end
@@ -1,71 +0,0 @@
1
- require 'rgen/name_helper'
2
-
3
- module UMLClassModel
4
- class UMLPackage
5
- include RGen::NameHelper
6
-
7
- def moduleName
8
- firstToUpper(name)
9
- end
10
-
11
- def qualifiedModuleName(rootPackage)
12
- return moduleName unless superpackage and self != rootPackage
13
- superpackage.qualifiedModuleName(rootPackage) + "::" + moduleName
14
- end
15
-
16
- def sortedClasses
17
- sortArray = classes.dup
18
- i1 = 0
19
- while i1 < sortArray.size-1
20
- again = false
21
- for i2 in i1+1..sortArray.size-1
22
- e2 = sortArray[i2]
23
- if sortArray[i1].superclasses.include?(e2)
24
- sortArray.delete(e2)
25
- sortArray.insert(i1,e2)
26
- again = true
27
- break
28
- end
29
- end
30
- i1 += 1 unless again
31
- end
32
- sortArray
33
- end
34
- end
35
-
36
- class UMLClass
37
- include RGen::NameHelper
38
- def className
39
- firstToUpper(name)
40
- end
41
- def qualifiedName(rootPackage)
42
- (package ? package.qualifiedModuleName(rootPackage) + "::" : "") + className
43
- end
44
- def RubySuperclass(modules)
45
- superclasses = self.superclasses.reject {|c| modules.include?(c.name)}
46
- raise StandardError.new("#{self.name}: Duplicate superclasses: #{superclasses}") unless superclasses.size < 2
47
- superclasses[0]
48
- end
49
- end
50
-
51
- class UMLAttribute
52
- def RubyType
53
- typeMap = {'float' => 'Float', 'int' => 'Integer'}
54
- typeMap[self.getType.downcase] || 'String'
55
- end
56
- end
57
-
58
- class UMLAssociationEnd
59
- def MName
60
- return self.clazz.name.downcase unless role
61
- self.role
62
- end
63
- def one?
64
- self.upperMult == 1 or self.upperMult.nil?
65
- end
66
- def many?
67
- self.upperMult == :many
68
- end
69
- end
70
-
71
- end
@@ -1,63 +0,0 @@
1
-
2
- <% define 'GenerateClassModel', :for => UMLPackage do |filename, modules| %>
3
- <% file filename do %>
4
- require 'rgen/metamodel_builder'
5
-
6
- <% expand 'GeneratePackage', modules %>
7
- <%nl%>
8
- <% expand 'GenerateAssocs' %>
9
- <% end %>
10
- <% end %>
11
-
12
- <% define 'GeneratePackage', :for => UMLPackage do |modules| %>
13
- module <%= moduleName %><% iinc %>
14
- <% for c in sortedClasses %><%nl%>
15
- <% expand 'ModuleHeader', modules, :for => c %><%iinc%>
16
- <% (c.superclasses.name & modules).each do |n| %>
17
- include <%= n %>
18
- <% end %>
19
- <% if modules.include?(c.className) %>
20
- extend RGen::MetamodelBuilder::BuilderExtensions
21
- <% end %>
22
- has_one 'name', String
23
- <% for a in c.attributes %>
24
- has_one '<%= a.name %>', <%= a.RubyType %>
25
- <% end %><%idec%>
26
- end
27
- <% end %><%nl%>
28
- <% for p in subpackages %>
29
- <%nl%><% expand 'GeneratePackage', modules, :for => p %>
30
- <% end %><%idec%>
31
- end
32
- <% end %>
33
-
34
- <% define 'GenerateAssocs', :for => UMLPackage do %>
35
- <% for a in allClasses.assocEnds>>:assoc %>
36
- <% if a.endA.one? %>
37
- <% if a.endB.one? %>
38
- <%= a.endA.clazz.qualifiedName(this) %>.one_to_one '<%= a.endB.MName %>', <%= a.endB.clazz.qualifiedName(this) %>, '<%= a.endA.MName %>'
39
- <% elsif a.endB.many? %>
40
- <%= a.endA.clazz.qualifiedName(this) %>.one_to_many '<%= a.endB.MName %>', <%= a.endB.clazz.qualifiedName(this) %>, '<%= a.endA.MName %>'
41
- <% end %>
42
- <% elsif a.endA.many? %>
43
- <% if a.endB.one? %>
44
- <%= a.endB.clazz.qualifiedName(this) %>.one_to_many '<%= a.endA.MName %>', <%= a.endA.clazz.qualifiedName(this) %>, '<%= a.endB.MName %>'
45
- <% elsif a.endB.many? %>
46
- <%= a.endB.clazz.qualifiedName(this) %>.many_to_many '<%= a.endA.MName %>', <%= a.endA.clazz.qualifiedName(this) %>, '<%= a.endB.MName %>'
47
- <% end %>
48
- <% end %>
49
- <% end %>
50
- <% end %>
51
-
52
- <% define 'ModuleHeader' do |modules| %>
53
- <% if modules.include?(name) %>
54
- module <%= className %>
55
- <% else %>
56
- class <%= className %> < <% nows %>
57
- <% if rsc=RubySuperclass(modules) %><% nows %>
58
- <%= rsc.className %>
59
- <% else %><% nows %>
60
- RGen::MetamodelBuilder::MMBase
61
- <% end %>
62
- <% end %>
63
- <% end %>
@@ -1,132 +0,0 @@
1
- require 'rgen/metamodel_builder'
2
- require 'rgen/instantiator'
3
- require 'rgen/name_helper'
4
- require 'rexml/parsers/sax2parser'
5
- require 'rexml/sax2listener'
6
-
7
- module RGen
8
-
9
- class XMLInstantiator < Instantiator
10
- include REXML::SAX2Listener
11
- include NameHelper
12
-
13
- class << self
14
- def tag_ns_map
15
- @tag_ns_map ||={}
16
- @tag_ns_map
17
- end
18
- end
19
-
20
- class XMLElementDescriptor
21
- attr_reader :tag, :mod, :parent, :attributes
22
- attr_accessor :object, :children
23
- def initialize(tag, mod, parent, children, attributes)
24
- @tag, @mod, @parent, @children, @attributes = tag, mod, parent, children, attributes
25
- @parent.children << self if @parent
26
- end
27
- end
28
-
29
- NamespaceDescriptor = Struct.new(:prefix, :target)
30
-
31
- def self.map_tag_ns(from, to, prefix="")
32
- tag_ns_map[from] = NamespaceDescriptor.new(prefix, to)
33
- end
34
-
35
- def initialize(env, mod, createMM=false)
36
- super(env,mod)
37
- @env = env
38
- @default_module = mod
39
- @createMM = createMM
40
- @stack = []
41
- end
42
-
43
- def instantiate_file(file)
44
- File.open(file) { |f| parse(f.read)}
45
- resolve
46
- end
47
-
48
- def instantiate(text)
49
- parse(text)
50
- resolve
51
- end
52
-
53
- def parse(src)
54
- parser = REXML::Parsers::SAX2Parser.new(src)
55
- parser.listen(self)
56
- parser.parse
57
- end
58
-
59
- def start_element(ns, tag, qtag, attributes)
60
- ns_desc = self.class.tag_ns_map[ns]
61
- tag = ns_desc.nil? ? qtag : ns_desc.prefix+tag
62
- mod = (ns_desc && ns_desc.target) || @default_module
63
- @stack.push XMLElementDescriptor.new(tag, mod, @stack[-1], [], attributes)
64
- end
65
-
66
- def end_element(uri, localname, qname)
67
- elementDesc = @stack.pop
68
- obj = callBuildMethod(:new_object, NameError, :create_class, elementDesc.mod, elementDesc)
69
- @env << obj
70
- elementDesc.object = obj
71
- elementDesc.children.each { |c|
72
- callBuildMethod(:assoc_p2c, NoMethodError, :create_p2c_assoc, elementDesc, c)
73
- }
74
- elementDesc.attributes.each_pair {|k,v|
75
- callBuildMethod(:set_attribute, NoMethodError, :create_attribute, elementDesc, k, v)
76
- }
77
- # optionally prune children to save memory
78
- #elementDesc.children = nil
79
- end
80
-
81
- def callBuildMethod(method, exception, mmMethod, *args)
82
- begin
83
- send(method, *args)
84
- rescue exception
85
- if @createMM
86
- send(mmMethod, *args)
87
- send(method, *args)
88
- else
89
- raise
90
- end
91
- end
92
- end
93
-
94
- # Model and Metamodel builder methods
95
- # These methods are to be overwritten by specific instantiators
96
- def new_object(mod, node)
97
- mod.const_get(saneClassName(node)).new
98
- end
99
-
100
- def create_class(mod, node)
101
- mod.const_set(saneClassName(node), Class.new(RGen::MetamodelBuilder::MMBase))
102
- end
103
-
104
- def assoc_p2c(parent, child)
105
- parent.object.addGeneric(saneMethodName(child), child.object)
106
- child.object.setGeneric("parent", parent.object)
107
- end
108
-
109
- def create_p2c_assoc(parent, child)
110
- parent.object.class.has_many(saneMethodName(child), child.object.class)
111
- child.object.class.has_one("parent", RGen::MetamodelBuilder::MMBase)
112
- end
113
-
114
- def set_attribute(node, attr, value)
115
- node.object.setGeneric(normalize(attr), value)
116
- end
117
-
118
- def create_attribute(node, attr, value)
119
- node.object.class.has_one(normalize(attr))
120
- end
121
-
122
- def saneClassName(node)
123
- firstToUpper(normalize(node.tag)).sub(/^Class$/, 'Clazz')
124
- end
125
-
126
- def saneMethodName(node)
127
- firstToLower(normalize(node.tag)).sub(/^class$/, 'clazz')
128
- end
129
-
130
- end
131
-
132
- end