rgen 0.5.2 → 0.5.3

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 CHANGED
@@ -99,7 +99,7 @@
99
99
  * Fixed metamodel builder bug: _register at one-side did not unregister from the element referenced by the old value
100
100
  * Added helper class for building simple model comparators
101
101
 
102
- =0.5.2 ( )
102
+ =0.5.2 (Jun 13th, 2010)
103
103
 
104
104
  * Added has_many_attr to metamodel builder, support for "many" attributes
105
105
  * Added JSON support (json instantiator and serializer)
@@ -110,3 +110,8 @@
110
110
  * Fixed ecore xml instantiator and serializer to handle references to builtin datatypes correctly
111
111
  * Fixed bug in ecore xml serializer to not output references which are opposites of containment references
112
112
 
113
+ =0.5.3 (Aug 13th, 2010)
114
+
115
+ * Fixed string escaping in JSON instantiator and serializer
116
+ * Fixed order of eClassifiers and eSubpackages within an EPackage created by reflection on a RGen module
117
+
data/Rakefile CHANGED
@@ -3,8 +3,8 @@ require 'rake/rdoctask'
3
3
 
4
4
  RGenGemSpec = Gem::Specification.new do |s|
5
5
  s.name = %q{rgen}
6
- s.version = "0.5.2"
7
- s.date = %q{2010-06-13}
6
+ s.version = "0.5.3"
7
+ s.date = %q{2010-08-13}
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}
@@ -32,13 +32,14 @@ class ECoreTransformer < Transformer
32
32
 
33
33
  transform Module, :to => EPackage, :if => :convert? do
34
34
  @enumParentModule ||= {}
35
- constants.select {|c| const_get(c).is_a?(MetamodelBuilder::DataTypes::Enum)}.
35
+ _constants = _constantOrder + (constants - _constantOrder)
36
+ _constants.select {|c| const_get(c).is_a?(MetamodelBuilder::DataTypes::Enum)}.
36
37
  each {|c| @enumParentModule[const_get(c)] = @current_object}
37
38
  { :name => name.gsub(/.*::(\w+)$/,'\1'),
38
- :eClassifiers => trans(constants.collect{|c| const_get(c)}.select{|c| c.is_a?(Class) ||
39
+ :eClassifiers => trans(_constants.collect{|c| const_get(c)}.select{|c| c.is_a?(Class) ||
39
40
  (c.is_a?(MetamodelBuilder::DataTypes::Enum) && c != MetamodelBuilder::DataTypes::Boolean) }),
40
41
  :eSuperPackage => trans(name =~ /(.*)::\w+$/ ? eval($1) : nil),
41
- :eSubpackages => trans(constants.collect{|c| const_get(c)}.select{|c| c.is_a?(Module) && !c.is_a?(Class)}),
42
+ :eSubpackages => trans(_constants.collect{|c| const_get(c)}.select{|c| c.is_a?(Module) && !c.is_a?(Class)}),
42
43
  :eAnnotations => trans(_annotations)
43
44
  }
44
45
  end
@@ -87,4 +88,4 @@ end
87
88
 
88
89
  end
89
90
 
90
- end
91
+ end
@@ -15,7 +15,7 @@ module Instantiator
15
15
 
16
16
  class JsonParser < Racc::Parser
17
17
 
18
- module_eval <<'..end json_parser.y modeval..ide42306a0dd', 'json_parser.y', 38
18
+ module_eval <<'..end json_parser.y modeval..id3d5fb611e2', 'json_parser.y', 38
19
19
 
20
20
  ParserToken = Struct.new(:line, :file, :value)
21
21
 
@@ -45,6 +45,11 @@ module_eval <<'..end json_parser.y modeval..ide42306a0dd', 'json_parser.y', 38
45
45
  sval = $1
46
46
  sval.gsub!('\\\\','\\')
47
47
  sval.gsub!('\\"','"')
48
+ sval.gsub!('\\n',"\n")
49
+ sval.gsub!('\\r',"\r")
50
+ sval.gsub!('\\t',"\t")
51
+ sval.gsub!('\\f',"\f")
52
+ sval.gsub!('\\b',"\b")
48
53
  @q << [:STRING, ParserToken.new(line, file, sval)]
49
54
  when /\A(\{|\}|\[|\]|,|:|true|false)/
50
55
  str = $'
@@ -62,7 +67,7 @@ module_eval <<'..end json_parser.y modeval..ide42306a0dd', 'json_parser.y', 38
62
67
  r
63
68
  end
64
69
 
65
- ..end json_parser.y modeval..ide42306a0dd
70
+ ..end json_parser.y modeval..id3d5fb611e2
66
71
 
67
72
  ##### racc 1.4.5 generates ###
68
73
 
@@ -64,6 +64,11 @@ module Instantiator
64
64
  sval = $1
65
65
  sval.gsub!('\\\\','\\')
66
66
  sval.gsub!('\\"','"')
67
+ sval.gsub!('\\n',"\n")
68
+ sval.gsub!('\\r',"\r")
69
+ sval.gsub!('\\t',"\t")
70
+ sval.gsub!('\\f',"\f")
71
+ sval.gsub!('\\b',"\b")
67
72
  @q << [:STRING, ParserToken.new(line, file, sval)]
68
73
  when /\A(\{|\}|\[|\]|,|:|true|false)/
69
74
  str = $'
@@ -1,6 +1,7 @@
1
1
  # RGen Framework
2
2
  # (c) Martin Thiede, 2006
3
3
 
4
+ require 'rgen/metamodel_builder/constant_order_helper'
4
5
  require 'rgen/metamodel_builder/builder_runtime'
5
6
  require 'rgen/metamodel_builder/builder_extensions'
6
7
  require 'rgen/metamodel_builder/module_extension'
@@ -266,6 +266,7 @@ module BuilderExtensions
266
266
 
267
267
  def inherited(c)
268
268
  c.send(:include, c.const_set(:ClassModule, Module.new))
269
+ MetamodelBuilder::ConstantOrderHelper.classCreated(c)
269
270
  end
270
271
 
271
272
  protected
@@ -0,0 +1,89 @@
1
+ module RGen
2
+
3
+ module MetamodelBuilder
4
+
5
+ # The purpose of the ConstantOrderHelper is to capture the definition order of RGen metamodel builder
6
+ # classes, modules and enums. The problem is that Ruby doesn't seem to track the order of
7
+ # constants being created in a module. However the order is important because it defines the order
8
+ # of eClassifiers and eSubpackages in a EPackage.
9
+ #
10
+ # It would be helpful here if Ruby provided a +const_added+ callback, but this is not the case up to now.
11
+ #
12
+ # The idea for capturing is that all events of creating a RGen class, module or enum are reported to the
13
+ # ConstantOrderHelper singleton.
14
+ # For classes and modules it tries to add their names to the parent's +_constantOrder+ array.
15
+ # The parent module is derived from the class's or module's name. However, the new name is only added
16
+ # if the respective parent module has a new constant (which is not yet in +_constantOrder+) which
17
+ # points to the new class or module.
18
+ # For enums it is a bit more complicated, because at the time the enum is created, the parent
19
+ # module does not yet contain the constant to which the enum is assigned. Therefor, the enum is remembered
20
+ # and it is tried to be stored on the next event (class, module or enum) within the module which was
21
+ # created last (which was last extended with ModuleExtension). If it can not be found in that module,
22
+ # all parent modules of the last module are searched. This way it should also be correctly entered in
23
+ # case it was defined outside of the last created module.
24
+ # Note that an enum is not stored to the constant order array unless another event occurs. That's why
25
+ # it is possible that one enum is missing at the enum. This needs to be taken care of by the ECore transformer.
26
+ #
27
+ # This way of capturing should be sufficient for the regular use cases of the RGen metamodel builder language.
28
+ # However, it is possible to write code which messes this up, see unit tests for details.
29
+ # In the worst case, the new classes, modules or enums will just not be found in a parent module and thus be ignored.
30
+ #
31
+ ConstantOrderHelper = Class.new do
32
+
33
+ def initialize
34
+ @currentModule = nil
35
+ @pendingEnum = nil
36
+ end
37
+
38
+ def classCreated(c)
39
+ handlePendingEnum
40
+ cont = containerModule(c)
41
+ name = c.name.split("::").last
42
+ return unless cont.respond_to?(:_constantOrder) && !cont._constantOrder.include?(name)
43
+ cont._constantOrder << name
44
+ end
45
+
46
+ def moduleCreated(m)
47
+ handlePendingEnum
48
+ cont = containerModule(m)
49
+ name = m.name.split("::").last
50
+ return unless cont.respond_to?(:_constantOrder) && !cont._constantOrder.include?(name)
51
+ cont._constantOrder << name
52
+ @currentModule = m
53
+ end
54
+
55
+ def enumCreated(e)
56
+ handlePendingEnum
57
+ @pendingEnum = e
58
+ end
59
+
60
+ private
61
+
62
+ def containerModule(m)
63
+ containerName = m.name.split("::")[0..-2].join("::")
64
+ containerName.empty? ? nil : eval(containerName, TOPLEVEL_BINDING)
65
+ end
66
+
67
+ def handlePendingEnum
68
+ return unless @pendingEnum
69
+ m = @currentModule
70
+ while m
71
+ if m.respond_to?(:_constantOrder)
72
+ newConstants = m.constants - m._constantOrder
73
+ const = newConstants.find{|c| m.const_get(c).object_id == @pendingEnum.object_id}
74
+ if const
75
+ m._constantOrder << const
76
+ break
77
+ end
78
+ end
79
+ m = containerModule(m)
80
+ end
81
+ @pendingEnum = nil
82
+ end
83
+
84
+ end.new
85
+
86
+ end
87
+
88
+ end
89
+
@@ -21,6 +21,7 @@ module DataTypes
21
21
 
22
22
  # Creates a new named enum type object consisting of the elements passed as arguments.
23
23
  def initialize(params)
24
+ MetamodelBuilder::ConstantOrderHelper.enumCreated(self)
24
25
  if params.is_a?(Array)
25
26
  @literals = params
26
27
  @name = "anonymous"
@@ -64,4 +65,4 @@ end
64
65
 
65
66
  end
66
67
 
67
- end
68
+ end
@@ -17,6 +17,10 @@ module ModuleExtension
17
17
  def _annotations
18
18
  @_annotations ||= []
19
19
  end
20
+
21
+ def _constantOrder
22
+ @_constantOrder ||= []
23
+ end
20
24
 
21
25
  def final_method(m)
22
26
  @final_methods ||= []
@@ -26,8 +30,13 @@ module ModuleExtension
26
30
  def method_added(m)
27
31
  raise "Method #{m} can not be redefined" if @final_methods && @final_methods.include?(m)
28
32
  end
33
+
34
+ def self.extended(m)
35
+ MetamodelBuilder::ConstantOrderHelper.moduleCreated(m)
36
+ end
37
+
29
38
  end
30
39
 
31
40
  end
32
41
 
33
- end
42
+ end
@@ -101,7 +101,8 @@ class JsonSerializer
101
101
 
102
102
  def attributeValue(value, a)
103
103
  if a.eType == RGen::ECore::EString || a.eType.is_a?(RGen::ECore::EEnum)
104
- "\""+value.to_s.gsub('"','\\"').gsub('\\','\\\\')+"\""
104
+ "\""+value.to_s.gsub('\\','\\\\\\\\').gsub('"','\\"').gsub("\n","\\n").gsub("\r","\\r").
105
+ gsub("\t","\\t").gsub("\f","\\f").gsub("\b","\\b")+"\""
105
106
  else
106
107
  value.to_s
107
108
  end
@@ -46,18 +46,26 @@ class JsonTest < Test::Unit::TestCase
46
46
  end
47
47
 
48
48
  def test_json_serializer_escapes
49
- testModel = TestMM::TestNode.new(:text => %q(some " \ \" text))
49
+ testModel = TestMM::TestNode.new(:text => %Q(some " \\ \\" text \r xx \n xx \r\n xx \t xx \b xx \f))
50
50
  output = StringWriter.new
51
51
  ser = RGen::Serializer::JsonSerializer.new(output)
52
52
 
53
- assert_equal %q({ "_class": "TestNode", "text": "some \" \\ \\\" text" }), ser.serialize(testModel)
53
+ assert_equal %q({ "_class": "TestNode", "text": "some \" \\\\ \\\\\" text \r xx \n xx \r\n xx \t xx \b xx \f" }),
54
+ ser.serialize(testModel)
54
55
  end
55
56
 
56
57
  def test_json_instantiator_escapes
57
58
  env = RGen::Environment.new
58
59
  inst = RGen::Instantiator::JsonInstantiator.new(env, TestMM)
59
- inst.instantiate(%q({ "_class": "TestNode", "text": "some \" \\ \\\\\" text" }))
60
- assert_equal %q(some " \ \" text), env.elements.first.text
60
+ inst.instantiate(%q({ "_class": "TestNode", "text": "some \" \\\\ \\\\\" text \r xx \n xx \r\n xx \t xx \b xx \f" }))
61
+ assert_equal %Q(some " \\ \\" text \r xx \n xx \r\n xx \t xx \b xx \f), env.elements.first.text
62
+ end
63
+
64
+ def test_json_instantiator_escape_single_backslash
65
+ env = RGen::Environment.new
66
+ inst = RGen::Instantiator::JsonInstantiator.new(env, TestMM)
67
+ inst.instantiate(%q({ "_class": "TestNode", "text": "a single \\ will be just itself" }))
68
+ assert_equal %q(a single \\ will be just itself), env.elements.first.text
61
69
  end
62
70
 
63
71
  def test_json_serializer_integer
@@ -0,0 +1,125 @@
1
+ $:.unshift File.join(File.dirname(__FILE__),"..","lib")
2
+
3
+ require 'test/unit'
4
+ require 'rgen/ecore/ecore'
5
+ require 'rgen/array_extensions'
6
+
7
+ class MetamodelReflectionTest < Test::Unit::TestCase
8
+ include RGen::ECore
9
+
10
+ module TestMM1
11
+ extend RGen::MetamodelBuilder::ModuleExtension
12
+
13
+ class Class11 < RGen::MetamodelBuilder::MMBase
14
+ end
15
+
16
+ module Module11
17
+ extend RGen::MetamodelBuilder::ModuleExtension
18
+
19
+ DataType111 = RGen::MetamodelBuilder::DataTypes::Enum.new(:name => "DataType111" ,:literals => {:b => 1})
20
+ DataType112 = RGen::MetamodelBuilder::DataTypes::Enum.new(:name => "DataType112", :literals => {:b => 1})
21
+
22
+ class Class111 < RGen::MetamodelBuilder::MMBase
23
+ end
24
+
25
+ # anonymous classes won't be handled by the order helper, but will be in eClassifiers
26
+ Class112 = Class.new(RGen::MetamodelBuilder::MMBase)
27
+
28
+ # classes that are not MMBase won't be handled
29
+ class Class113
30
+ end
31
+
32
+ # modules that are not extended by the ModuleExtension are not handled
33
+ module Module111
34
+ end
35
+
36
+ # however it can be extendend later on
37
+ module Module112
38
+ # this one is not handled by the order helper since Module112 doesn't have the ModuleExtension yet
39
+ # however, it will be in eClassifiers
40
+ class Class1121 < RGen::MetamodelBuilder::MMBase
41
+ end
42
+ end
43
+ # this datatype must be in Module11 not Module112
44
+ DataType113 = RGen::MetamodelBuilder::DataTypes::Enum.new(:name => "DataType113", :literals => {:b => 1})
45
+
46
+ Module112.extend(RGen::MetamodelBuilder::ModuleExtension)
47
+ # this datatype must be in Module11 not Module112
48
+ DataType114 = RGen::MetamodelBuilder::DataTypes::Enum.new(:name => "DataType114", :literals => {:b => 1})
49
+ module Module112
50
+ # this one is handled because now Module112 is extended
51
+ class Class1122 < RGen::MetamodelBuilder::MMBase
52
+ end
53
+ end
54
+
55
+ DataType115 = RGen::MetamodelBuilder::DataTypes::Enum.new(:name => "DataType115", :literals => {:b => 1})
56
+ DataType116 = RGen::MetamodelBuilder::DataTypes::Enum.new(:name => "DataType116", :literals => {:b => 1})
57
+ end
58
+
59
+ DataType11 = RGen::MetamodelBuilder::DataTypes::Enum.new(:name => "DataType11", :literals => {:a => 1})
60
+
61
+ class Class12 < RGen::MetamodelBuilder::MMBase
62
+ end
63
+
64
+ class Class13 < RGen::MetamodelBuilder::MMBase
65
+ end
66
+ end
67
+
68
+ # datatypes outside of a module won't be handled
69
+ DataType1 = RGen::MetamodelBuilder::DataTypes::Enum.new(:name => "DataType1", :literals => {:b => 1})
70
+
71
+ # classes outside of a module won't be handled
72
+ class Class1 < RGen::MetamodelBuilder::MMBase
73
+ end
74
+
75
+ module TestMM2
76
+ extend RGen::MetamodelBuilder::ModuleExtension
77
+
78
+ TestMM1::Module11.extend(RGen::MetamodelBuilder::ModuleExtension)
79
+ # this is a critical case: because of the previous extension of Module11 which is in a different
80
+ # hierarchy, DataType7 is looked for in Module11 and its parents; finally it is not
81
+ # found and the definition is ignored for order calculation
82
+ DataType21 = RGen::MetamodelBuilder::DataTypes::Enum.new(:name => "DataType21", :literals => {:b => 1})
83
+
84
+ module Module21
85
+ extend RGen::MetamodelBuilder::ModuleExtension
86
+ end
87
+
88
+ module Module22
89
+ extend RGen::MetamodelBuilder::ModuleExtension
90
+ end
91
+
92
+ module Module23
93
+ extend RGen::MetamodelBuilder::ModuleExtension
94
+ end
95
+
96
+ # if there is no other class or module after the last datatype, it won't show up in _constantOrder
97
+ # however, the order of eClassifiers can still be reconstructed
98
+ DataType22 = RGen::MetamodelBuilder::DataTypes::Enum.new(:name => "DataType22", :literals => {:b => 1})
99
+ end
100
+
101
+ def test_constant_order
102
+ assert_equal ["Class11", "Module11", "DataType11", "Class12", "Class13"], TestMM1._constantOrder
103
+ assert_equal ["DataType111", "DataType112", "Class111", "DataType113", "Module112", "DataType114", "DataType115", "DataType116"], TestMM1::Module11._constantOrder
104
+ assert_equal ["Class1122"], TestMM1::Module11::Module112._constantOrder
105
+ assert_equal ["Module21", "Module22", "Module23"], TestMM2._constantOrder
106
+ end
107
+
108
+ def test_classifier_order
109
+ # eClassifiers also contains the ones which where ignored in order calculation, these are expected at the end
110
+ # (in an arbitrary order)
111
+ assert_equal ["Class11", "DataType11", "Class12", "Class13"], TestMM1.ecore.eClassifiers.name
112
+ assert_equal ["DataType111", "DataType112", "Class111", "DataType113", "DataType114", "DataType115", "DataType116", "Class112"], TestMM1::Module11.ecore.eClassifiers.name
113
+ assert_equal ["Class1122", "Class1121"], TestMM1::Module11::Module112.ecore.eClassifiers.name
114
+ assert_equal ["DataType22", "DataType21"], TestMM2.ecore.eClassifiers.name
115
+ end
116
+
117
+ def test_subpackage_order
118
+ assert_equal ["Module11"], TestMM1.ecore.eSubpackages.name
119
+ assert_equal ["Module112"], TestMM1::Module11.ecore.eSubpackages.name
120
+ assert_equal [], TestMM1::Module11::Module112.ecore.eSubpackages.name
121
+ assert_equal ["Module21", "Module22", "Module23"], TestMM2.ecore.eSubpackages.name
122
+ end
123
+ end
124
+
125
+
@@ -6,55 +6,60 @@ module HouseMetamodel
6
6
 
7
7
  SexEnum = Enum.new(:name => 'SexEnum', :literals =>[ :male, :female ])
8
8
 
9
- module Rooms
10
- extend RGen::MetamodelBuilder::ModuleExtension
11
- include RGen::MetamodelBuilder::DataTypes
9
+ class MeetingPlace < RGen::MetamodelBuilder::MMBase
10
+ annotation :source => "testmodel", :details => {'complexity' => '1', 'date_created' => '2006-07-12 08:40:46', 'date_modified' => '2006-07-12 08:44:02', 'ea_ntype' => '0', 'ea_stype' => 'Class', 'gentype' => 'Java', 'isSpecification' => 'false', 'package' => 'EAPK_A1B83D59_CAE1_422c_BA5F_D3624D7156AD', 'package_name' => 'HouseMetamodel', 'phase' => '1.0', 'status' => 'Proposed', 'style' => 'BackColor=-1;BorderColor=-1;BorderWidth=-1;FontColor=-1;VSwimLanes=0;HSwimLanes=0;BorderStyle=0;', 'tagged' => '0', 'version' => '1.0'}
11
+ end
12
12
 
13
+ class Person < RGen::MetamodelBuilder::MMBase
14
+ annotation 'complexity' => '1', 'date_created' => '2006-06-27 08:34:23', 'date_modified' => '2006-06-27 08:34:26', 'ea_ntype' => '0', 'ea_stype' => 'Class', 'gentype' => 'Java', 'isSpecification' => 'false', 'package' => 'EAPK_A1B83D59_CAE1_422c_BA5F_D3624D7156AD', 'package_name' => 'HouseMetamodel', 'phase' => '1.0', 'status' => 'Proposed', 'style' => 'BackColor=-1;BorderColor=-1;BorderWidth=-1;FontColor=-1;VSwimLanes=0;HSwimLanes=0;BorderStyle=0;', 'tagged' => '0', 'version' => '1.0'
15
+ has_attr 'sex', HouseMetamodel::SexEnum
16
+ has_many_attr 'nicknames', String
13
17
  end
14
18
 
15
- module DependingOnRooms
19
+ class House < RGen::MetamodelBuilder::MMBase
20
+ annotation 'complexity' => '1', 'date_created' => '2005-09-16 19:52:18', 'date_modified' => '2006-02-28 08:29:19', 'ea_ntype' => '0', 'ea_stype' => 'Class', 'gentype' => 'Java', 'isSpecification' => 'false', 'package' => 'EAPK_A1B83D59_CAE1_422c_BA5F_D3624D7156AD', 'package_name' => 'HouseMetamodel', 'phase' => '1.0', 'status' => 'Proposed', 'stereotype' => 'dummy', 'style' => 'BackColor=-1;BorderColor=-1;BorderWidth=-1;FontColor=-1;VSwimLanes=0;HSwimLanes=0;BorderStyle=0;', 'tagged' => '0', 'version' => '1.0'
21
+ has_attr 'size', Integer
22
+ has_attr 'module', String
23
+ has_attr 'address', String, :changeable => false do
24
+ annotation 'collection' => 'false', 'containment' => 'Not Specified', 'derived' => '0', 'duplicates' => '0', 'ea_guid' => '{A8DF581B-9AC6-4f75-AB48-8FAEDFC6E068}', 'lowerBound' => '1', 'ordered' => '0', 'position' => '0', 'styleex' => 'volatile=0;', 'type' => 'String', 'upperBound' => '1'
25
+ end
26
+ end
27
+
28
+
29
+ module Rooms
16
30
  extend RGen::MetamodelBuilder::ModuleExtension
17
31
  include RGen::MetamodelBuilder::DataTypes
18
32
 
19
- end
20
- end
21
33
 
22
- class HouseMetamodel::House < RGen::MetamodelBuilder::MMBase
23
- annotation 'complexity' => '1', 'date_created' => '2005-09-16 19:52:18', 'date_modified' => '2006-02-28 08:29:19', 'ea_ntype' => '0', 'ea_stype' => 'Class', 'gentype' => 'Java', 'isSpecification' => 'false', 'package' => 'EAPK_A1B83D59_CAE1_422c_BA5F_D3624D7156AD', 'package_name' => 'HouseMetamodel', 'phase' => '1.0', 'status' => 'Proposed', 'stereotype' => 'dummy', 'style' => 'BackColor=-1;BorderColor=-1;BorderWidth=-1;FontColor=-1;VSwimLanes=0;HSwimLanes=0;BorderStyle=0;', 'tagged' => '0', 'version' => '1.0'
24
- has_attr 'size', Integer
25
- has_attr 'module', String
26
- has_attr 'address', String, :changeable => false do
27
- annotation 'collection' => 'false', 'containment' => 'Not Specified', 'derived' => '0', 'duplicates' => '0', 'ea_guid' => '{A8DF581B-9AC6-4f75-AB48-8FAEDFC6E068}', 'lowerBound' => '1', 'ordered' => '0', 'position' => '0', 'styleex' => 'volatile=0;', 'type' => 'String', 'upperBound' => '1'
28
- end
29
- end
34
+ class Room < RGen::MetamodelBuilder::MMBase
35
+ abstract
36
+ annotation 'complexity' => '1', 'date_created' => '2005-09-16 19:52:28', 'date_modified' => '2006-06-22 21:15:25', 'ea_ntype' => '0', 'ea_stype' => 'Class', 'gentype' => 'Java', 'isSpecification' => 'false', 'package' => 'EAPK_F9D8C6E3_4DAD_4aa2_AD47_D0ABA4E93E08', 'package_name' => 'Rooms', 'phase' => '1.0', 'status' => 'Proposed', 'style' => 'BackColor=-1;BorderColor=-1;BorderWidth=-1;FontColor=-1;VSwimLanes=0;HSwimLanes=0;BorderStyle=0;', 'tagged' => '0', 'version' => '1.0'
37
+ end
30
38
 
31
- class HouseMetamodel::Person < RGen::MetamodelBuilder::MMBase
32
- annotation 'complexity' => '1', 'date_created' => '2006-06-27 08:34:23', 'date_modified' => '2006-06-27 08:34:26', 'ea_ntype' => '0', 'ea_stype' => 'Class', 'gentype' => 'Java', 'isSpecification' => 'false', 'package' => 'EAPK_A1B83D59_CAE1_422c_BA5F_D3624D7156AD', 'package_name' => 'HouseMetamodel', 'phase' => '1.0', 'status' => 'Proposed', 'style' => 'BackColor=-1;BorderColor=-1;BorderWidth=-1;FontColor=-1;VSwimLanes=0;HSwimLanes=0;BorderStyle=0;', 'tagged' => '0', 'version' => '1.0'
33
- has_attr 'sex', HouseMetamodel::SexEnum
34
- has_many_attr 'nicknames', String
35
- end
39
+ class Bathroom < Room
40
+ annotation 'complexity' => '1', 'date_created' => '2006-06-27 08:32:25', 'date_modified' => '2006-06-27 08:34:23', 'ea_ntype' => '0', 'ea_stype' => 'Class', 'gentype' => 'Java', 'isSpecification' => 'false', 'package' => 'EAPK_F9D8C6E3_4DAD_4aa2_AD47_D0ABA4E93E08', 'package_name' => 'Rooms', 'phase' => '1.0', 'status' => 'Proposed', 'style' => 'BackColor=-1;BorderColor=-1;BorderWidth=-1;FontColor=-1;VSwimLanes=0;HSwimLanes=0;BorderStyle=0;', 'tagged' => '0', 'version' => '1.0'
41
+ end
36
42
 
37
- class HouseMetamodel::MeetingPlace < RGen::MetamodelBuilder::MMBase
38
- annotation :source => "testmodel", :details => {'complexity' => '1', 'date_created' => '2006-07-12 08:40:46', 'date_modified' => '2006-07-12 08:44:02', 'ea_ntype' => '0', 'ea_stype' => 'Class', 'gentype' => 'Java', 'isSpecification' => 'false', 'package' => 'EAPK_A1B83D59_CAE1_422c_BA5F_D3624D7156AD', 'package_name' => 'HouseMetamodel', 'phase' => '1.0', 'status' => 'Proposed', 'style' => 'BackColor=-1;BorderColor=-1;BorderWidth=-1;FontColor=-1;VSwimLanes=0;HSwimLanes=0;BorderStyle=0;', 'tagged' => '0', 'version' => '1.0'}
39
- end
43
+ class Kitchen < RGen::MetamodelBuilder::MMMultiple(HouseMetamodel::MeetingPlace, Room)
44
+ annotation 'complexity' => '1', 'date_created' => '2005-11-30 19:26:13', 'date_modified' => '2006-06-22 21:15:34', 'ea_ntype' => '0', 'ea_stype' => 'Class', 'gentype' => 'Java', 'isSpecification' => 'false', 'package' => 'EAPK_F9D8C6E3_4DAD_4aa2_AD47_D0ABA4E93E08', 'package_name' => 'Rooms', 'phase' => '1.0', 'status' => 'Proposed', 'style' => 'BackColor=-1;BorderColor=-1;BorderWidth=-1;FontColor=-1;VSwimLanes=0;HSwimLanes=0;BorderStyle=0;', 'tagged' => '0', 'version' => '1.0'
45
+ end
40
46
 
41
- class HouseMetamodel::Rooms::Room < RGen::MetamodelBuilder::MMBase
42
- abstract
43
- annotation 'complexity' => '1', 'date_created' => '2005-09-16 19:52:28', 'date_modified' => '2006-06-22 21:15:25', 'ea_ntype' => '0', 'ea_stype' => 'Class', 'gentype' => 'Java', 'isSpecification' => 'false', 'package' => 'EAPK_F9D8C6E3_4DAD_4aa2_AD47_D0ABA4E93E08', 'package_name' => 'Rooms', 'phase' => '1.0', 'status' => 'Proposed', 'style' => 'BackColor=-1;BorderColor=-1;BorderWidth=-1;FontColor=-1;VSwimLanes=0;HSwimLanes=0;BorderStyle=0;', 'tagged' => '0', 'version' => '1.0'
44
- end
47
+ end
45
48
 
46
- class HouseMetamodel::Rooms::Bathroom < HouseMetamodel::Rooms::Room
47
- annotation 'complexity' => '1', 'date_created' => '2006-06-27 08:32:25', 'date_modified' => '2006-06-27 08:34:23', 'ea_ntype' => '0', 'ea_stype' => 'Class', 'gentype' => 'Java', 'isSpecification' => 'false', 'package' => 'EAPK_F9D8C6E3_4DAD_4aa2_AD47_D0ABA4E93E08', 'package_name' => 'Rooms', 'phase' => '1.0', 'status' => 'Proposed', 'style' => 'BackColor=-1;BorderColor=-1;BorderWidth=-1;FontColor=-1;VSwimLanes=0;HSwimLanes=0;BorderStyle=0;', 'tagged' => '0', 'version' => '1.0'
48
- end
49
+ module DependingOnRooms
50
+ extend RGen::MetamodelBuilder::ModuleExtension
51
+ include RGen::MetamodelBuilder::DataTypes
49
52
 
50
- class HouseMetamodel::Rooms::Kitchen < RGen::MetamodelBuilder::MMMultiple(HouseMetamodel::MeetingPlace, HouseMetamodel::Rooms::Room)
51
- annotation 'complexity' => '1', 'date_created' => '2005-11-30 19:26:13', 'date_modified' => '2006-06-22 21:15:34', 'ea_ntype' => '0', 'ea_stype' => 'Class', 'gentype' => 'Java', 'isSpecification' => 'false', 'package' => 'EAPK_F9D8C6E3_4DAD_4aa2_AD47_D0ABA4E93E08', 'package_name' => 'Rooms', 'phase' => '1.0', 'status' => 'Proposed', 'style' => 'BackColor=-1;BorderColor=-1;BorderWidth=-1;FontColor=-1;VSwimLanes=0;HSwimLanes=0;BorderStyle=0;', 'tagged' => '0', 'version' => '1.0'
52
- end
53
53
 
54
- class HouseMetamodel::DependingOnRooms::RoomSub < HouseMetamodel::Rooms::Room
55
- end
54
+ class RoomSub < HouseMetamodel::Rooms::Room
55
+ end
56
56
 
57
+ end
58
+ end
57
59
 
60
+ HouseMetamodel::Person.has_many 'home', HouseMetamodel::House do
61
+ annotation 'containment' => 'Unspecified'
62
+ end
58
63
  HouseMetamodel::House.has_one 'bathroom', HouseMetamodel::Rooms::Bathroom, :transient => true, :lowerBound => 1
59
64
  HouseMetamodel::House.one_to_one 'kitchen', HouseMetamodel::Rooms::Kitchen, 'house', :lowerBound => 1, :opposite_lowerBound => 1 do
60
65
  annotation 'containment' => 'Unspecified'
@@ -63,6 +68,3 @@ end
63
68
  HouseMetamodel::House.contains_many 'room', HouseMetamodel::Rooms::Room, 'house', :lowerBound => 1 do
64
69
  opposite_annotation 'containment' => 'Unspecified'
65
70
  end
66
- HouseMetamodel::Person.has_many 'home', HouseMetamodel::House do
67
- annotation 'containment' => 'Unspecified'
68
- end