rgen 0.5.4 → 0.6.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.
- data/CHANGELOG +28 -0
- data/Rakefile +3 -4
- data/lib/ea_support/uml13_ea_metamodel.rb +3 -3
- data/lib/ea_support/uml13_ea_to_uml13.rb +33 -2
- data/lib/ea_support/uml13_to_uml13_ea.rb +7 -0
- data/lib/mmgen/mm_ext/ecore_mmgen_ext.rb +4 -4
- data/lib/mmgen/templates/metamodel_generator.tpl +143 -143
- data/lib/rgen/ecore/ecore.rb +11 -1
- data/lib/rgen/ecore/ecore_interface.rb +47 -0
- data/lib/rgen/ecore/ecore_to_ruby.rb +166 -0
- data/lib/rgen/ecore/{ecore_transformer.rb → ruby_to_ecore.rb} +11 -11
- data/lib/rgen/environment.rb +15 -2
- data/lib/rgen/fragment/dump_file_cache.rb +63 -0
- data/lib/rgen/fragment/fragmented_model.rb +139 -0
- data/lib/rgen/fragment/model_fragment.rb +268 -0
- data/lib/rgen/instantiator/abstract_xml_instantiator.rb +44 -72
- data/lib/rgen/instantiator/default_xml_instantiator.rb +2 -2
- data/lib/rgen/instantiator/ecore_xml_instantiator.rb +16 -1
- data/lib/rgen/instantiator/json_instantiator.rb +16 -2
- data/lib/rgen/instantiator/nodebased_xml_instantiator.rb +118 -138
- data/lib/rgen/instantiator/qualified_name_resolver.rb +5 -1
- data/lib/rgen/instantiator/reference_resolver.rb +126 -24
- data/lib/rgen/instantiator/xmi11_instantiator.rb +6 -2
- data/lib/rgen/metamodel_builder.rb +18 -6
- data/lib/rgen/metamodel_builder/builder_extensions.rb +431 -407
- data/lib/rgen/metamodel_builder/builder_runtime.rb +8 -8
- data/lib/rgen/metamodel_builder/constant_order_helper.rb +4 -4
- data/lib/rgen/metamodel_builder/data_types.rb +5 -1
- data/lib/rgen/metamodel_builder/intermediate/feature.rb +167 -0
- data/lib/rgen/metamodel_builder/module_extension.rb +2 -2
- data/lib/rgen/model_builder.rb +10 -5
- data/lib/rgen/model_builder/builder_context.rb +17 -1
- data/lib/rgen/serializer/opposite_reference_filter.rb +18 -0
- data/lib/rgen/serializer/qualified_name_provider.rb +45 -0
- data/lib/rgen/template_language/template_container.rb +3 -1
- data/lib/rgen/{auto_class_creator.rb → util/auto_class_creator.rb} +6 -1
- data/lib/rgen/util/cached_glob.rb +67 -0
- data/lib/rgen/util/file_cache_map.rb +104 -0
- data/lib/rgen/util/file_change_detector.rb +78 -0
- data/lib/rgen/{method_delegation.rb → util/method_delegation.rb} +18 -3
- data/lib/rgen/{model_comparator.rb → util/model_comparator.rb} +17 -5
- data/lib/rgen/{model_comparator_base.rb → util/model_comparator_base.rb} +6 -1
- data/lib/rgen/{model_dumper.rb → util/model_dumper.rb} +6 -1
- data/lib/rgen/{name_helper.rb → util/name_helper.rb} +6 -1
- data/lib/rgen/util/pattern_matcher.rb +329 -0
- data/lib/transformers/uml13_to_ecore.rb +103 -60
- data/test/ecore_self_test.rb +43 -42
- data/test/json_test.rb +15 -0
- data/test/metamodel_builder_test.rb +361 -206
- data/test/metamodel_from_ecore_test.rb +45 -0
- data/test/metamodel_order_test.rb +10 -4
- data/test/metamodel_roundtrip_test.rb +2 -2
- data/test/metamodel_roundtrip_test/TestModel_Regenerated.rb +1 -1
- data/test/metamodel_roundtrip_test/houseMetamodel_Regenerated.ecore +50 -50
- data/test/method_delegation_test.rb +9 -9
- data/test/model_builder/ecore_internal.rb +19 -9
- data/test/model_builder/serializer_test.rb +1 -1
- data/test/reference_resolver_test.rb +79 -12
- data/test/rgen_test.rb +2 -0
- data/test/template_language_test.rb +7 -0
- data/test/template_language_test/templates/callback_indent_test/a.tpl +12 -0
- data/test/template_language_test/templates/callback_indent_test/b.tpl +5 -0
- data/test/testmodel/ea_testmodel_regenerated.xml +588 -583
- data/test/transformer_test.rb +3 -3
- data/test/util/file_cache_map_test.rb +91 -0
- data/test/util/file_cache_map_test/testdir/fileA +1 -0
- data/test/util_test.rb +4 -0
- data/test/xml_instantiator_test.rb +139 -135
- metadata +49 -104
- data/lib/rgen/ecore/ecore_instantiator.rb +0 -31
- data/lib/rgen/metamodel_builder/metamodel_description.rb +0 -232
- data/redist/xmlscan/ChangeLog +0 -1301
- data/redist/xmlscan/README +0 -34
- data/redist/xmlscan/THANKS +0 -11
- data/redist/xmlscan/doc/changes.html +0 -74
- data/redist/xmlscan/doc/changes.rd +0 -80
- data/redist/xmlscan/doc/en/conformance.html +0 -136
- data/redist/xmlscan/doc/en/conformance.rd +0 -152
- data/redist/xmlscan/doc/en/manual.html +0 -356
- data/redist/xmlscan/doc/en/manual.rd +0 -402
- data/redist/xmlscan/doc/ja/conformance.ja.html +0 -118
- data/redist/xmlscan/doc/ja/conformance.ja.rd +0 -134
- data/redist/xmlscan/doc/ja/manual.ja.html +0 -325
- data/redist/xmlscan/doc/ja/manual.ja.rd +0 -370
- data/redist/xmlscan/doc/src/Makefile +0 -41
- data/redist/xmlscan/doc/src/conformance.rd.src +0 -256
- data/redist/xmlscan/doc/src/langsplit.rb +0 -110
- data/redist/xmlscan/doc/src/manual.rd.src +0 -614
- data/redist/xmlscan/install.rb +0 -41
- data/redist/xmlscan/lib/xmlscan/encoding.rb +0 -311
- data/redist/xmlscan/lib/xmlscan/htmlscan.rb +0 -289
- data/redist/xmlscan/lib/xmlscan/namespace.rb +0 -352
- data/redist/xmlscan/lib/xmlscan/parser.rb +0 -299
- data/redist/xmlscan/lib/xmlscan/scanner.rb +0 -1109
- data/redist/xmlscan/lib/xmlscan/version.rb +0 -22
- data/redist/xmlscan/lib/xmlscan/visitor.rb +0 -158
- data/redist/xmlscan/lib/xmlscan/xmlchar.rb +0 -441
- data/redist/xmlscan/memo/CONFORMANCE +0 -1249
- data/redist/xmlscan/memo/PRODUCTIONS +0 -195
- data/redist/xmlscan/memo/contentspec.ry +0 -335
- data/redist/xmlscan/samples/chibixml.rb +0 -105
- data/redist/xmlscan/samples/getxmlchar.rb +0 -122
- data/redist/xmlscan/samples/rexml.rb +0 -159
- data/redist/xmlscan/samples/xmlbench.rb +0 -88
- data/redist/xmlscan/samples/xmlbench/parser/chibixml.rb +0 -22
- data/redist/xmlscan/samples/xmlbench/parser/nqxml.rb +0 -29
- data/redist/xmlscan/samples/xmlbench/parser/rexml.rb +0 -62
- data/redist/xmlscan/samples/xmlbench/parser/xmlparser.rb +0 -22
- data/redist/xmlscan/samples/xmlbench/parser/xmlscan-0.0.10.rb +0 -62
- data/redist/xmlscan/samples/xmlbench/parser/xmlscan-chibixml.rb +0 -22
- data/redist/xmlscan/samples/xmlbench/parser/xmlscan-rexml.rb +0 -22
- data/redist/xmlscan/samples/xmlbench/parser/xmlscan.rb +0 -99
- data/redist/xmlscan/samples/xmlbench/xmlbench-lib.rb +0 -116
- data/redist/xmlscan/samples/xmlconftest.rb +0 -200
- data/redist/xmlscan/test.rb +0 -7
- data/redist/xmlscan/tests/deftestcase.rb +0 -73
- data/redist/xmlscan/tests/runtest.rb +0 -47
- data/redist/xmlscan/tests/testall.rb +0 -14
- data/redist/xmlscan/tests/testencoding.rb +0 -438
- data/redist/xmlscan/tests/testhtmlscan.rb +0 -752
- data/redist/xmlscan/tests/testnamespace.rb +0 -457
- data/redist/xmlscan/tests/testparser.rb +0 -591
- data/redist/xmlscan/tests/testscanner.rb +0 -1749
- data/redist/xmlscan/tests/testxmlchar.rb +0 -143
- data/redist/xmlscan/tests/visitor.rb +0 -34
data/CHANGELOG
CHANGED
|
@@ -123,3 +123,31 @@
|
|
|
123
123
|
* Fixed ModelSerializer to add :as => in case of ambiguous child roles
|
|
124
124
|
* Made JsonInstantiator search subpackages for unqualified class names
|
|
125
125
|
|
|
126
|
+
=0.6.0
|
|
127
|
+
|
|
128
|
+
* Added exception when trying to instantiate abstract class
|
|
129
|
+
* Replaced xmlscan by dependency to nokogiri
|
|
130
|
+
* Made RGen work with Ruby 1.9
|
|
131
|
+
* Cleaned up intermediate attribute and reference description, improvement of metamodel load time
|
|
132
|
+
* Added optional data property for MMProxy
|
|
133
|
+
* Added ECoreToRuby which can create Ruby classes and modules from ECore models in memory (without metamodel generator)
|
|
134
|
+
* Refactored out QualifiedNameProvider and OppositeReferenceFilter
|
|
135
|
+
* Added model fragment/fragmented models support
|
|
136
|
+
* Extended Instantiator::ReferenceResolver and changed it into a class
|
|
137
|
+
* Moved utilities into util folder/module
|
|
138
|
+
* Added FileCacheMap
|
|
139
|
+
* Fixed template language bug: indenting not correct after callback into same template container and iinc/idec
|
|
140
|
+
* Added support for fragmented models
|
|
141
|
+
* Added FileChangeDetector utility
|
|
142
|
+
* Added CachedGlob utility
|
|
143
|
+
* Added index parameter to model element add methods
|
|
144
|
+
* Added MMGeneric
|
|
145
|
+
* Modified has_many_attr to allow the same value in the same attribute multiple times
|
|
146
|
+
* Made Environment#delete faster on large models
|
|
147
|
+
* Added type check of ecore defaultValueLiteral content in MetamodelBuilder
|
|
148
|
+
* Many-feature setters can work with an Enumerable instead of an Array
|
|
149
|
+
* Added pattern matcher utility
|
|
150
|
+
* Fixed problem of Ruby hanging when exceptions occur
|
|
151
|
+
* Fixed metamodel generator to quote illegal enum literal symbols
|
|
152
|
+
* Imporved UML to ECore transformer and EA support
|
|
153
|
+
|
data/Rakefile
CHANGED
|
@@ -3,21 +3,20 @@ require 'rake/rdoctask'
|
|
|
3
3
|
|
|
4
4
|
RGenGemSpec = Gem::Specification.new do |s|
|
|
5
5
|
s.name = %q{rgen}
|
|
6
|
-
s.version = "0.
|
|
6
|
+
s.version = "0.6.0"
|
|
7
7
|
s.date = Time.now.strftime("%Y-%m-%d")
|
|
8
8
|
s.summary = %q{Ruby Modelling and Generator Framework}
|
|
9
9
|
s.email = %q{martin dot thiede at gmx de}
|
|
10
10
|
s.homepage = %q{http://ruby-gen.org}
|
|
11
11
|
s.rubyforge_project = %q{rgen}
|
|
12
12
|
s.description = %q{RGen is a framework supporting Model Driven Software Development (MDSD). This means that it helps you build Metamodels, instantiate Models, modify and transform Models and finally generate arbitrary textual content from it.}
|
|
13
|
-
s.has_rdoc = true
|
|
14
13
|
s.authors = ["Martin Thiede"]
|
|
15
14
|
gemfiles = Rake::FileList.new
|
|
16
|
-
gemfiles.include("{lib,test
|
|
15
|
+
gemfiles.include("{lib,test}/**/*")
|
|
17
16
|
gemfiles.include("README", "CHANGELOG", "MIT-LICENSE", "Rakefile")
|
|
18
17
|
gemfiles.exclude(/\b\.bak\b/)
|
|
19
18
|
s.files = gemfiles
|
|
20
|
-
s.rdoc_options = ["--main", "README", "-x", "
|
|
19
|
+
s.rdoc_options = ["--main", "README", "-x", "test", "-x", "metamodels", "-x", "ea_support/uml13*"]
|
|
21
20
|
s.extra_rdoc_files = ["README", "CHANGELOG", "MIT-LICENSE"]
|
|
22
21
|
end
|
|
23
22
|
|
|
@@ -12,7 +12,7 @@ module UML13EA
|
|
|
12
12
|
ScopeKind = Enum.new(:name => 'ScopeKind', :literals =>[ :instance, :classifier ])
|
|
13
13
|
OrderingKind = Enum.new(:name => 'OrderingKind', :literals =>[ :unordered, :ordered, :sorted ])
|
|
14
14
|
CallConcurrencyKind = Enum.new(:name => 'CallConcurrencyKind', :literals =>[ :sequential, :guarded, :concurrent ])
|
|
15
|
-
AggregationKind = Enum.new(:name => 'AggregationKind', :literals =>[ :none, :aggregate, :composite ])
|
|
15
|
+
AggregationKind = Enum.new(:name => 'AggregationKind', :literals =>[ :none, :aggregate, :composite, :shared ])
|
|
16
16
|
VisibilityKind = Enum.new(:name => 'VisibilityKind', :literals =>[ :public, :protected, :private ])
|
|
17
17
|
end
|
|
18
18
|
|
|
@@ -188,7 +188,7 @@ class UML13EA::SubactivityState < UML13EA::SubmachineState
|
|
|
188
188
|
end
|
|
189
189
|
|
|
190
190
|
class UML13EA::StructuralFeature < UML13EA::Feature
|
|
191
|
-
has_attr '
|
|
191
|
+
has_attr 'changeable', UML13EA::ChangeableKind, :defaultValueLiteral => "changeable"
|
|
192
192
|
has_attr 'targetScope', UML13EA::ScopeKind, :defaultValueLiteral => "instance"
|
|
193
193
|
end
|
|
194
194
|
|
|
@@ -259,7 +259,7 @@ end
|
|
|
259
259
|
|
|
260
260
|
class UML13EA::AssociationEnd < RGen::MetamodelBuilder::MMMultiple(UML13EA::ModelElement, UML13EA::XmiIdProvider)
|
|
261
261
|
has_attr 'isNavigable', Boolean, :defaultValueLiteral => "false"
|
|
262
|
-
has_attr 'isOrdered', Boolean, :defaultValueLiteral => "
|
|
262
|
+
has_attr 'isOrdered', Boolean, :defaultValueLiteral => "false"
|
|
263
263
|
has_attr 'aggregation', UML13EA::AggregationKind, :defaultValueLiteral => "none"
|
|
264
264
|
has_attr 'targetScope', UML13EA::ScopeKind, :defaultValueLiteral => "instance"
|
|
265
265
|
has_attr 'changeable', UML13EA::ChangeableKind, :defaultValueLiteral => "changeable"
|
|
@@ -8,6 +8,10 @@ class UML13EAToUML13 < RGen::Transformer
|
|
|
8
8
|
def transform
|
|
9
9
|
trans(:class => Package)
|
|
10
10
|
trans(:class => Class)
|
|
11
|
+
@env_out.find(:class => UML13::Attribute).each do |me|
|
|
12
|
+
# remove tagged vales internally used by EA which have been converted to UML
|
|
13
|
+
me.taggedValue = me.taggedValue.reject{|tv| ["lowerBound", "upperBound"].include?(tv.tag)}
|
|
14
|
+
end
|
|
11
15
|
end
|
|
12
16
|
|
|
13
17
|
def cleanModel
|
|
@@ -20,10 +24,12 @@ class UML13EAToUML13 < RGen::Transformer
|
|
|
20
24
|
XmiIdProvider
|
|
21
25
|
AssociationEnd AssociationEndRole
|
|
22
26
|
StructuralFeature
|
|
27
|
+
Attribute
|
|
23
28
|
Generalization
|
|
24
29
|
ActivityModel
|
|
25
30
|
CompositeState
|
|
26
31
|
PseudoState
|
|
32
|
+
Dependency
|
|
27
33
|
)
|
|
28
34
|
|
|
29
35
|
transform AssociationEndRole, :to => UML13::AssociationEndRole do
|
|
@@ -46,12 +52,30 @@ class UML13EAToUML13 < RGen::Transformer
|
|
|
46
52
|
end
|
|
47
53
|
end
|
|
48
54
|
|
|
49
|
-
transform StructuralFeature, :to => UML13::StructuralFeature
|
|
55
|
+
transform StructuralFeature, :to => UML13::StructuralFeature,
|
|
56
|
+
:if => lambda{|c| !@current_object.is_a?(UML13EA::Attribute)} do
|
|
50
57
|
copy_features :except => [:changeable] do
|
|
51
58
|
{:changeability => {:none => :frozen}[changeable] }
|
|
52
59
|
end
|
|
53
60
|
end
|
|
54
61
|
|
|
62
|
+
transform StructuralFeature, :to => UML13::Attribute,
|
|
63
|
+
:if => lambda{|c| @current_object.is_a?(UML13EA::Attribute)} do
|
|
64
|
+
_lowerBound = taggedValue.find{|tv| tv.tag == "lowerBound"}
|
|
65
|
+
_upperBound = taggedValue.find{|tv| tv.tag == "upperBound"}
|
|
66
|
+
if _lowerBound || _upperBound
|
|
67
|
+
_multiplicity = UML13::Multiplicity.new(
|
|
68
|
+
:range => [UML13::MultiplicityRange.new(
|
|
69
|
+
:lower => (_lowerBound && _lowerBound.value) || "0",
|
|
70
|
+
:upper => (_upperBound && _upperBound.value) || "1"
|
|
71
|
+
)])
|
|
72
|
+
end
|
|
73
|
+
copy_features :except => [:changeable] do
|
|
74
|
+
{:changeability => {:none => :frozen}[changeable],
|
|
75
|
+
:multiplicity => _multiplicity }
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
55
79
|
transform Generalization, :to => UML13::Generalization do
|
|
56
80
|
copy_features :except => [:subtype, :supertype] do
|
|
57
81
|
{ :child => trans(subtype),
|
|
@@ -68,5 +92,12 @@ class UML13EAToUML13 < RGen::Transformer
|
|
|
68
92
|
end
|
|
69
93
|
|
|
70
94
|
copy PseudoState, :to => UML13::Pseudostate
|
|
95
|
+
|
|
96
|
+
transform Dependency, :to => UML13::Dependency do
|
|
97
|
+
_name_tag = taggedValue.find{|tv| tv.tag == "dst_name"}
|
|
98
|
+
copy_features do
|
|
99
|
+
{ :name => (_name_tag && _name_tag.value) || "Anonymous" }
|
|
100
|
+
end
|
|
101
|
+
end
|
|
71
102
|
|
|
72
|
-
end
|
|
103
|
+
end
|
|
@@ -18,6 +18,7 @@ class UML13ToUML13EA < RGen::Transformer
|
|
|
18
18
|
Association AssociationEnd AssociationEndRole
|
|
19
19
|
Generalization
|
|
20
20
|
Pseudostate
|
|
21
|
+
Attribute
|
|
21
22
|
)
|
|
22
23
|
|
|
23
24
|
copy ActivityGraph, :to => UML13EA::ActivityModel
|
|
@@ -72,6 +73,12 @@ class UML13ToUML13EA < RGen::Transformer
|
|
|
72
73
|
end
|
|
73
74
|
end
|
|
74
75
|
|
|
76
|
+
transform Attribute, :to => UML13EA::Attribute do
|
|
77
|
+
copy_features :except => [:changeability] do
|
|
78
|
+
{ :changeable => {:frozen => :none}[changeability] }
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
75
82
|
transform Generalization, :to => UML13EA::Generalization do
|
|
76
83
|
copy_features :except => [:child, :parent] do
|
|
77
84
|
{ :taggedValue => trans(taggedValue) + [@env_out.new(UML13EA::TaggedValue, :tag => "ea_type", :value => "Generalization")],
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
require 'rgen/name_helper'
|
|
1
|
+
require 'rgen/util/name_helper'
|
|
2
2
|
|
|
3
3
|
module RGen
|
|
4
4
|
|
|
5
5
|
module ECore
|
|
6
6
|
|
|
7
7
|
module EPackage::ClassModule
|
|
8
|
-
include RGen::NameHelper
|
|
8
|
+
include RGen::Util::NameHelper
|
|
9
9
|
|
|
10
10
|
def moduleName
|
|
11
11
|
firstToUpper(name)
|
|
@@ -58,7 +58,7 @@ module RGen
|
|
|
58
58
|
end
|
|
59
59
|
|
|
60
60
|
module EClassifier::ClassModule
|
|
61
|
-
include RGen::NameHelper
|
|
61
|
+
include RGen::Util::NameHelper
|
|
62
62
|
def classifierName
|
|
63
63
|
firstToUpper(name)
|
|
64
64
|
end
|
|
@@ -88,4 +88,4 @@ module RGen
|
|
|
88
88
|
|
|
89
89
|
end
|
|
90
90
|
|
|
91
|
-
end
|
|
91
|
+
end
|
|
@@ -1,172 +1,172 @@
|
|
|
1
1
|
|
|
2
2
|
<% define 'GenerateMetamodel', :for => EPackage do |filename| %>
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
15
|
<% end %>
|
|
16
|
-
|
|
16
|
+
|
|
17
17
|
<% define 'GeneratePackage', :for => EPackage do %>
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
+
<% if c.abstract %>abstract<% end %>
|
|
27
|
+
<% expand 'annotations::Annotations', :for => c %>
|
|
28
|
+
<% expand 'Attribute', this, :foreach => c.eAttributes %>
|
|
29
|
+
<%idec%>
|
|
30
|
+
end
|
|
31
|
+
<% end %><%nl%>
|
|
32
|
+
<% for p in eSubpackages %>
|
|
33
|
+
<%nl%><% expand 'GeneratePackage', :for => p %>
|
|
34
|
+
<% end %><%idec%>
|
|
35
|
+
end
|
|
36
36
|
<% end %>
|
|
37
37
|
|
|
38
38
|
<% define 'GenerateClassesReordered', :for => EPackage do %>
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
39
|
+
<% for c in allClassesSorted %><%nl%>
|
|
40
|
+
<% expand 'ClassHeaderFullyQualified', this, :for => c %><%iinc%>
|
|
41
|
+
<% if c.abstract %>abstract<% end %>
|
|
42
|
+
<% expand 'annotations::Annotations', :for => c %>
|
|
43
|
+
<% expand 'Attribute', this, :foreach => c.eAttributes %>
|
|
44
|
+
<%idec%>
|
|
45
|
+
end
|
|
46
|
+
<% end %><%nl%>
|
|
47
47
|
<% end %>
|
|
48
48
|
|
|
49
49
|
<% define 'GeneratePackagesOnly', :for => EPackage do %>
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
50
|
+
module <%= moduleName %><% iinc %>
|
|
51
|
+
extend RGen::MetamodelBuilder::ModuleExtension
|
|
52
|
+
include RGen::MetamodelBuilder::DataTypes
|
|
53
|
+
<% expand 'annotations::Annotations' %>
|
|
54
|
+
<%nl%>
|
|
55
|
+
<% expand 'EnumTypes' %>
|
|
56
|
+
<% for p in eSubpackages %>
|
|
57
|
+
<%nl%><% expand 'GeneratePackagesOnly', :for => p %>
|
|
58
|
+
<% end %><%idec%>
|
|
59
|
+
end
|
|
60
60
|
<% end %>
|
|
61
61
|
|
|
62
62
|
<% define 'Attribute', :for => EAttribute do |rootp| %>
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
RGen::MetamodelBuilder::
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
63
|
+
<% if upperBound == 1%>has_attr<% else %>has_many_attr<% end %> '<%= name %>', <%nows%>
|
|
64
|
+
<% if eType.is_a?(EEnum) %><%nows%>
|
|
65
|
+
<%= eType.qualifiedClassifierName(rootp) %><%nows%>
|
|
66
|
+
<% else %><%nows%>
|
|
67
|
+
<%= eType && eType.instanceClass.to_s %><%nows%>
|
|
68
|
+
<% end %><%nows%>
|
|
69
|
+
<% for p in RGen::MetamodelBuilder::Intermediate::Attribute.properties %>
|
|
70
|
+
<% unless p == :name || (p == :upperBound && (upperBound == 1 || upperBound == -1)) ||
|
|
71
|
+
RGen::MetamodelBuilder::Intermediate::Attribute.default_value(p) == getGeneric(p) %>
|
|
72
|
+
, :<%=p%> => <%nows%>
|
|
73
|
+
<% if getGeneric(p).is_a?(String) %>
|
|
74
|
+
"<%= getGeneric(p) %>"<%nows%>
|
|
75
|
+
<% elsif getGeneric(p).is_a?(Symbol) %>
|
|
76
|
+
:<%= getGeneric(p) %><%nows%>
|
|
77
|
+
<% else %>
|
|
78
|
+
<%= getGeneric(p) %><%nows%>
|
|
79
|
+
<% end %>
|
|
80
|
+
<% end %>
|
|
81
|
+
<% end %>
|
|
82
|
+
<%ws%><% expand 'annotations::Annotations' %><%nl%>
|
|
83
83
|
<% end %>
|
|
84
84
|
|
|
85
85
|
<% define 'EnumTypes', :for => EPackage do %>
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
86
|
+
<% for enum in eClassifiers.select{|c| c.is_a?(EEnum)} %>
|
|
87
|
+
<%= enum.name %> = Enum.new(:name => '<%= enum.name %>', :literals =>[ <%nows%>
|
|
88
|
+
<%= enum.eLiterals.collect { |lit| ":"+(lit.name =~ /^\d|\W/ ? "'"+lit.name+"'" : lit.name) }.join(', ') %> ])
|
|
89
|
+
<% end %>
|
|
90
90
|
<% end %>
|
|
91
91
|
|
|
92
92
|
<% define 'GenerateAssocs', :for => EPackage do %>
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
93
|
+
<% refDone = {} %>
|
|
94
|
+
<% for ref in eAllClassifiers.select{|c| c.is_a?(EClass)}.eReferences %>
|
|
95
|
+
<% if !refDone[ref] && ref.eOpposite %>
|
|
96
|
+
<% ref = ref.eOpposite if ref.eOpposite.containment %>
|
|
97
|
+
<% refDone[ref] = refDone[ref.eOpposite] = true %>
|
|
98
|
+
<% if !ref.many && !ref.eOpposite.many %>
|
|
99
|
+
<% if ref.containment %>
|
|
100
|
+
<% expand 'Reference', "contains_one", this, :for => ref %>
|
|
101
|
+
<% else %>
|
|
102
|
+
<% expand 'Reference', "one_to_one", this, :for => ref %>
|
|
103
|
+
<% end %>
|
|
104
|
+
<% elsif !ref.many && ref.eOpposite.many %>
|
|
105
|
+
<% expand 'Reference', "many_to_one", this, :for => ref %>
|
|
106
|
+
<% elsif ref.many && !ref.eOpposite.many %>
|
|
107
|
+
<% if ref.containment %>
|
|
108
|
+
<% expand 'Reference', "contains_many", this, :for => ref %>
|
|
109
|
+
<% else %>
|
|
110
|
+
<% expand 'Reference', "one_to_many", this, :for => ref %>
|
|
111
|
+
<% end %>
|
|
112
|
+
<% elsif ref.many && ref.eOpposite.many %>
|
|
113
|
+
<% expand 'Reference', "many_to_many", this, :for => ref %>
|
|
114
|
+
<% end %>
|
|
115
|
+
<% expand 'annotations::Annotations', :for => ref %><%nl%>
|
|
116
|
+
<% elsif !refDone[ref] %>
|
|
117
|
+
<% refDone[ref] = true %>
|
|
118
|
+
<% if !ref.many %>
|
|
119
|
+
<% if ref.containment %>
|
|
120
|
+
<% expand 'Reference', "contains_one_uni", this, :for => ref %>
|
|
121
|
+
<% else %>
|
|
122
|
+
<% expand 'Reference', "has_one", this, :for => ref %>
|
|
123
|
+
<% end %>
|
|
124
|
+
<% elsif ref.many %>
|
|
125
|
+
<% if ref.containment %>
|
|
126
|
+
<% expand 'Reference', "contains_many_uni", this, :for => ref %>
|
|
127
|
+
<% else %>
|
|
128
|
+
<% expand 'Reference', "has_many", this, :for => ref %>
|
|
129
|
+
<% end %>
|
|
130
|
+
<% end %>
|
|
131
|
+
<% expand 'annotations::Annotations', :for => ref %><%nl%>
|
|
132
|
+
<% end %>
|
|
133
|
+
<% end %>
|
|
134
134
|
<% end %>
|
|
135
135
|
|
|
136
136
|
<% define 'Reference', :for => EReference do |cmd, rootpackage| %>
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
137
|
+
<%= eContainingClass.qualifiedClassifierName(rootpackage) %>.<%= cmd %> '<%= name %>', <%= eType && eType.qualifiedClassifierName(rootpackage) %><%nows%>
|
|
138
|
+
<% if eOpposite %><%nows%>
|
|
139
|
+
, '<%= eOpposite.name%>'<%nows%>
|
|
140
|
+
<% end %><%nows%>
|
|
141
|
+
<% pset = RGen::MetamodelBuilder::Intermediate::Reference.properties.reject{|p| p == :name || p == :upperBound || p == :containment} %>
|
|
142
|
+
<% for p in pset.reject{|p| RGen::MetamodelBuilder::Intermediate::Reference.default_value(p) == getGeneric(p)} %>
|
|
143
|
+
, :<%=p%> => <%=getGeneric(p)%><%nows%>
|
|
144
|
+
<% end %>
|
|
145
|
+
<% if eOpposite %>
|
|
146
|
+
<% for p in pset.reject{|p| RGen::MetamodelBuilder::Intermediate::Reference.default_value(p) == eOpposite.getGeneric(p)} %>
|
|
147
|
+
, :opposite_<%=p%> => <%=eOpposite.getGeneric(p)%><%nows%>
|
|
148
|
+
<% end %>
|
|
149
|
+
<% end %><%ws%>
|
|
150
150
|
<% end %>
|
|
151
151
|
|
|
152
152
|
<% define 'ClassHeader', :for => EClass do |rootp| %>
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
153
|
+
class <%= classifierName %> < <% nows %>
|
|
154
|
+
<% if eSuperTypes.size > 1 %><% nows %>
|
|
155
|
+
RGen::MetamodelBuilder::MMMultiple(<%= eSuperTypes.collect{|t| t.qualifiedClassifierNameIfRequired(rootp)}.join(', ') %>)
|
|
156
|
+
<% elsif eSuperTypes.size > 0 %><% nows %>
|
|
157
|
+
<%= eSuperTypes.first.qualifiedClassifierNameIfRequired(rootp) %>
|
|
158
|
+
<% else %><% nows %>
|
|
159
|
+
RGen::MetamodelBuilder::MMBase
|
|
160
|
+
<% end %>
|
|
161
161
|
<% end %>
|
|
162
162
|
|
|
163
163
|
<% define 'ClassHeaderFullyQualified', :for => EClass do |rootp| %>
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
164
|
+
class <%= qualifiedClassifierName(rootp) %> < <% nows %>
|
|
165
|
+
<% if eSuperTypes.size > 1 %><% nows %>
|
|
166
|
+
RGen::MetamodelBuilder::MMMultiple(<%= eSuperTypes.collect{|t| t.qualifiedClassifierName(rootp)}.join(', ') %>)
|
|
167
|
+
<% elsif eSuperTypes.size > 0 %><% nows %>
|
|
168
|
+
<%= eSuperTypes.first.qualifiedClassifierName(rootp) %>
|
|
169
|
+
<% else %><% nows %>
|
|
170
|
+
RGen::MetamodelBuilder::MMBase
|
|
171
|
+
<% end %>
|
|
172
172
|
<% end %>
|