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.
- data/CHANGELOG +20 -1
- data/MIT-LICENSE +1 -1
- data/README +12 -9
- data/lib/instantiators/ea_instantiator.rb +36 -0
- data/lib/metamodels/uml13_metamodel.rb +559 -0
- data/lib/metamodels/uml13_metamodel_ext.rb +26 -0
- data/lib/mmgen/metamodel_generator.rb +5 -5
- data/lib/mmgen/mm_ext/ecore_ext.rb +95 -0
- data/lib/mmgen/mmgen.rb +6 -4
- data/lib/mmgen/templates/annotations.tpl +37 -0
- data/lib/mmgen/templates/metamodel_generator.tpl +171 -0
- data/lib/rgen/ecore/ecore.rb +190 -0
- data/lib/rgen/ecore/ecore_instantiator.rb +25 -0
- data/lib/rgen/ecore/ecore_transformer.rb +85 -0
- data/lib/rgen/environment.rb +9 -24
- data/lib/rgen/find_helper.rb +68 -0
- data/lib/rgen/{instantiator.rb → instantiator/abstract_instantiator.rb} +6 -2
- data/lib/rgen/instantiator/abstract_xml_instantiator.rb +59 -0
- data/lib/rgen/instantiator/default_xml_instantiator.rb +117 -0
- data/lib/rgen/instantiator/ecore_xml_instantiator.rb +144 -0
- data/lib/rgen/instantiator/nodebased_xml_instantiator.rb +157 -0
- data/lib/rgen/instantiator/xmi11_instantiator.rb +164 -0
- data/lib/rgen/metamodel_builder.rb +103 -9
- data/lib/rgen/metamodel_builder/build_helper.rb +26 -4
- data/lib/rgen/metamodel_builder/builder_extensions.rb +285 -88
- data/lib/rgen/metamodel_builder/builder_runtime.rb +7 -1
- data/lib/rgen/metamodel_builder/data_types.rb +67 -0
- data/lib/rgen/metamodel_builder/intermediate/annotation.rb +30 -0
- data/lib/rgen/metamodel_builder/metamodel_description.rb +232 -0
- data/lib/rgen/metamodel_builder/mm_multiple.rb +23 -0
- data/lib/rgen/metamodel_builder/module_extension.rb +33 -0
- data/lib/rgen/model_comparator.rb +56 -0
- data/lib/rgen/model_dumper.rb +5 -5
- data/lib/rgen/name_helper.rb +17 -1
- data/lib/rgen/template_language.rb +148 -28
- data/lib/rgen/template_language/directory_template_container.rb +56 -38
- data/lib/rgen/template_language/output_handler.rb +93 -77
- data/lib/rgen/template_language/template_container.rb +186 -143
- data/lib/rgen/transformer.rb +19 -14
- data/lib/transformers/uml13_to_ecore.rb +75 -0
- data/redist/xmlscan/ChangeLog +1301 -0
- data/redist/xmlscan/README +34 -0
- data/redist/xmlscan/THANKS +11 -0
- data/redist/xmlscan/doc/changes.html +74 -0
- data/redist/xmlscan/doc/changes.rd +80 -0
- data/redist/xmlscan/doc/en/conformance.html +136 -0
- data/redist/xmlscan/doc/en/conformance.rd +152 -0
- data/redist/xmlscan/doc/en/manual.html +356 -0
- data/redist/xmlscan/doc/en/manual.rd +402 -0
- data/redist/xmlscan/doc/ja/conformance.ja.html +118 -0
- data/redist/xmlscan/doc/ja/conformance.ja.rd +134 -0
- data/redist/xmlscan/doc/ja/manual.ja.html +325 -0
- data/redist/xmlscan/doc/ja/manual.ja.rd +370 -0
- data/redist/xmlscan/doc/src/Makefile +41 -0
- data/redist/xmlscan/doc/src/conformance.rd.src +256 -0
- data/redist/xmlscan/doc/src/langsplit.rb +110 -0
- data/redist/xmlscan/doc/src/manual.rd.src +614 -0
- data/redist/xmlscan/install.rb +41 -0
- data/redist/xmlscan/lib/xmlscan/encoding.rb +311 -0
- data/redist/xmlscan/lib/xmlscan/htmlscan.rb +289 -0
- data/redist/xmlscan/lib/xmlscan/namespace.rb +352 -0
- data/redist/xmlscan/lib/xmlscan/parser.rb +299 -0
- data/redist/xmlscan/lib/xmlscan/scanner.rb +1109 -0
- data/redist/xmlscan/lib/xmlscan/version.rb +22 -0
- data/redist/xmlscan/lib/xmlscan/visitor.rb +158 -0
- data/redist/xmlscan/lib/xmlscan/xmlchar.rb +441 -0
- data/redist/xmlscan/memo/CONFORMANCE +1249 -0
- data/redist/xmlscan/memo/PRODUCTIONS +195 -0
- data/redist/xmlscan/memo/contentspec.ry +335 -0
- data/redist/xmlscan/samples/chibixml.rb +105 -0
- data/redist/xmlscan/samples/getxmlchar.rb +122 -0
- data/redist/xmlscan/samples/rexml.rb +159 -0
- data/redist/xmlscan/samples/xmlbench.rb +88 -0
- data/redist/xmlscan/samples/xmlbench/parser/chibixml.rb +22 -0
- data/redist/xmlscan/samples/xmlbench/parser/nqxml.rb +29 -0
- data/redist/xmlscan/samples/xmlbench/parser/rexml.rb +62 -0
- data/redist/xmlscan/samples/xmlbench/parser/xmlparser.rb +22 -0
- data/redist/xmlscan/samples/xmlbench/parser/xmlscan-0.0.10.rb +62 -0
- data/redist/xmlscan/samples/xmlbench/parser/xmlscan-chibixml.rb +22 -0
- data/redist/xmlscan/samples/xmlbench/parser/xmlscan-rexml.rb +22 -0
- data/redist/xmlscan/samples/xmlbench/parser/xmlscan.rb +99 -0
- data/redist/xmlscan/samples/xmlbench/xmlbench-lib.rb +116 -0
- data/redist/xmlscan/samples/xmlconftest.rb +200 -0
- data/redist/xmlscan/test.rb +7 -0
- data/redist/xmlscan/tests/deftestcase.rb +73 -0
- data/redist/xmlscan/tests/runtest.rb +47 -0
- data/redist/xmlscan/tests/testall.rb +14 -0
- data/redist/xmlscan/tests/testencoding.rb +438 -0
- data/redist/xmlscan/tests/testhtmlscan.rb +752 -0
- data/redist/xmlscan/tests/testnamespace.rb +457 -0
- data/redist/xmlscan/tests/testparser.rb +591 -0
- data/redist/xmlscan/tests/testscanner.rb +1749 -0
- data/redist/xmlscan/tests/testxmlchar.rb +143 -0
- data/redist/xmlscan/tests/visitor.rb +34 -0
- data/test/array_extensions_test.rb +2 -2
- data/test/ea_instantiator_test.rb +41 -0
- data/test/ecore_self_test.rb +53 -0
- data/test/environment_test.rb +11 -6
- data/test/metamodel_builder_test.rb +404 -245
- data/test/metamodel_roundtrip_test.rb +52 -0
- data/test/metamodel_roundtrip_test/TestModel.rb +65 -0
- data/test/metamodel_roundtrip_test/TestModel_Regenerated.rb +64 -0
- data/test/metamodel_roundtrip_test/houseMetamodel.ecore +32 -0
- data/test/metamodel_roundtrip_test/houseMetamodel_from_ecore.rb +39 -0
- data/test/rgen_test.rb +3 -3
- data/test/template_language_test.rb +65 -39
- data/test/template_language_test/expected_result.txt +24 -3
- data/test/template_language_test/templates/code/array.tpl +11 -0
- data/test/template_language_test/templates/content/author.tpl +7 -0
- data/test/template_language_test/templates/content/chapter.tpl +1 -1
- data/test/template_language_test/templates/root.tpl +17 -8
- data/test/template_language_test/testout.txt +24 -3
- data/test/testmodel/class_model_checker.rb +119 -0
- data/test/{xmi_instantiator_test/testmodel.eap → testmodel/ea_testmodel.eap} +0 -0
- data/test/{xmi_instantiator_test/testmodel.xml → testmodel/ea_testmodel.xml} +81 -14
- data/test/testmodel/ea_testmodel_partial.xml +317 -0
- data/test/testmodel/ecore_model_checker.rb +101 -0
- data/test/testmodel/manual_testmodel.xml +22 -0
- data/test/testmodel/object_model_checker.rb +67 -0
- data/test/transformer_test.rb +18 -10
- data/test/xml_instantiator_test.rb +81 -8
- data/test/xml_instantiator_test/simple_ecore_model_checker.rb +94 -0
- data/test/xml_instantiator_test/simple_xmi_ecore_instantiator.rb +53 -0
- data/test/xml_instantiator_test/simple_xmi_metamodel.rb +49 -0
- data/test/xml_instantiator_test/simple_xmi_to_ecore.rb +75 -0
- metadata +126 -28
- data/lib/ea/xmi_class_instantiator.rb +0 -46
- data/lib/ea/xmi_helper.rb +0 -26
- data/lib/ea/xmi_metamodel.rb +0 -34
- data/lib/ea/xmi_object_instantiator.rb +0 -46
- data/lib/ea/xmi_to_classmodel.rb +0 -78
- data/lib/ea/xmi_to_objectmodel.rb +0 -92
- data/lib/mmgen/mm_ext/uml_classmodel_ext.rb +0 -71
- data/lib/mmgen/templates/uml_classmodel.tpl +0 -63
- data/lib/rgen/xml_instantiator.rb +0 -132
- data/lib/uml/objectmodel_instantiator.rb +0 -53
- data/lib/uml/uml_classmodel.rb +0 -92
- data/lib/uml/uml_objectmodel.rb +0 -65
- data/test/metamodel_generator_test.rb +0 -44
- data/test/metamodel_generator_test/TestModel.rb +0 -40
- data/test/metamodel_generator_test/expected_result.txt +0 -40
- data/test/xmi_class_instantiator_test.rb +0 -24
- data/test/xmi_instantiator_test/class_model_checker.rb +0 -97
- data/test/xmi_object_instantiator_test.rb +0 -65
- data/test/xml_instantiator_test/testmodel.xml +0 -7
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
module ObjectmodelInstantiator
|
|
2
|
-
|
|
3
|
-
def instantiateObjectModel(env_in, env_out, metamodel)
|
|
4
|
-
objectMap = {}
|
|
5
|
-
env_in.find(:class => UMLObjectModel::UMLObject).each do |o_in|
|
|
6
|
-
o_out = env_out.new metamodel.const_get(o_in.classname)
|
|
7
|
-
objectMap[o_in] = o_out
|
|
8
|
-
o_out.name = o_in.name
|
|
9
|
-
o_in.attributeSettings.each { |as|
|
|
10
|
-
conversions = ["to_s", "to_i", "to_f"]
|
|
11
|
-
conv = conversions.first
|
|
12
|
-
begin
|
|
13
|
-
o_out.send(as.name+"=",as.value.send(conv))
|
|
14
|
-
rescue StandardError
|
|
15
|
-
conv = conversions[conversions.index(conv)+1]
|
|
16
|
-
retry if conv
|
|
17
|
-
raise
|
|
18
|
-
end
|
|
19
|
-
}
|
|
20
|
-
end
|
|
21
|
-
env_in.find(:class => UMLObjectModel::UMLAssociation).each do |a_in|
|
|
22
|
-
begin
|
|
23
|
-
if a_in.roleA
|
|
24
|
-
begin
|
|
25
|
-
o_out = objectMap[a_in.objectB]
|
|
26
|
-
es = o_out.send(a_in.roleA)
|
|
27
|
-
rescue NoMethodError
|
|
28
|
-
raise StandardError.new("In #{o_out.class.name}(#{o_out.name}): method not found #{a_in.roleA}")
|
|
29
|
-
end
|
|
30
|
-
if es.is_a? RGen::MetamodelBuilder::ElementSet
|
|
31
|
-
es << objectMap[a_in.objectA]
|
|
32
|
-
else
|
|
33
|
-
objectMap[a_in.objectB].send(a_in.roleA+"=", objectMap[a_in.objectA])
|
|
34
|
-
end
|
|
35
|
-
elsif a_in.roleB
|
|
36
|
-
begin
|
|
37
|
-
o_out = objectMap[a_in.objectA]
|
|
38
|
-
es = o_out.send(a_in.roleB)
|
|
39
|
-
rescue NoMethodError
|
|
40
|
-
raise StandardError.new("In #{o_out.class.name}(#{o_out.name}): method not found #{a_in.roleB}")
|
|
41
|
-
end
|
|
42
|
-
if es.is_a? RGen::MetamodelBuilder::ElementSet
|
|
43
|
-
es << objectMap[a_in.objectB]
|
|
44
|
-
else
|
|
45
|
-
objectMap[a_in.objectA].send(a_in.roleB+"=", objectMap[a_in.objectB])
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
rescue StandardError => e
|
|
49
|
-
puts e.message
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
end
|
data/lib/uml/uml_classmodel.rb
DELETED
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
require 'rgen/metamodel_builder'
|
|
2
|
-
|
|
3
|
-
module UMLClassModel
|
|
4
|
-
|
|
5
|
-
include RGen::MetamodelBuilder
|
|
6
|
-
|
|
7
|
-
class UMLPackage < MMBase
|
|
8
|
-
has_one 'name', String
|
|
9
|
-
def allClasses
|
|
10
|
-
subpackages.inject(classes) {|r,p| r.concat(p.allClasses) }
|
|
11
|
-
end
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
class UMLClass < MMBase
|
|
15
|
-
has_one 'name', String
|
|
16
|
-
has_many 'stereotypes', String
|
|
17
|
-
def remoteNavigableEnds
|
|
18
|
-
assocEnds.otherEnd.select{|e| e.navigable}
|
|
19
|
-
end
|
|
20
|
-
def localNavigableEnds
|
|
21
|
-
assocEnds.select{|e| e.navigable}
|
|
22
|
-
end
|
|
23
|
-
def localCompositeEnds
|
|
24
|
-
assocEnds.select{|e| e.composite}
|
|
25
|
-
end
|
|
26
|
-
def remoteCompositeEnds
|
|
27
|
-
assocEnds.otherEnd.select{|e| e.composite}
|
|
28
|
-
# put constraint check here and return the container directly ?
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
class UMLOperation < MMBase
|
|
33
|
-
has_one 'name', String
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
class UMLAttribute < MMBase
|
|
37
|
-
has_one 'name', String
|
|
38
|
-
has_one 'type', String
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
class UMLTaggedValue < MMBase
|
|
42
|
-
has_one 'tag'
|
|
43
|
-
has_one 'value'
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
class UMLAssociation < MMBase
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
class UMLAggregation < UMLAssociation
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
class UMLAssociationEnd < MMBase
|
|
53
|
-
has_one 'multiplicity', String
|
|
54
|
-
has_one 'navigable' # boolean
|
|
55
|
-
has_one 'composite' # boolean
|
|
56
|
-
has_one 'role', String
|
|
57
|
-
def assoc
|
|
58
|
-
assocA || assocB
|
|
59
|
-
end
|
|
60
|
-
def otherEnd
|
|
61
|
-
return unless assoc
|
|
62
|
-
assoc.endA == self ? assoc.endB : assoc.endA
|
|
63
|
-
end
|
|
64
|
-
def lowerMult
|
|
65
|
-
return unless multiplicity
|
|
66
|
-
stringToMult(multiplicity.split("..")[0])
|
|
67
|
-
end
|
|
68
|
-
def upperMult
|
|
69
|
-
return unless multiplicity
|
|
70
|
-
ma = multiplicity.split("..")
|
|
71
|
-
stringToMult(ma[1] || ma[0])
|
|
72
|
-
end
|
|
73
|
-
private
|
|
74
|
-
def stringToMult(s)
|
|
75
|
-
return :many if s == "*"
|
|
76
|
-
return s.to_i
|
|
77
|
-
end
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
UMLPackage.one_to_many 'subpackages', UMLPackage, 'superpackage'
|
|
81
|
-
UMLPackage.one_to_many 'classes', UMLClass, 'package'
|
|
82
|
-
|
|
83
|
-
UMLClass.many_to_many 'superclasses', UMLClass, 'subclasses'
|
|
84
|
-
UMLClass.one_to_many 'assocEnds', UMLAssociationEnd, 'clazz'
|
|
85
|
-
UMLClass.one_to_many 'attributes', UMLAttribute, 'clazz'
|
|
86
|
-
UMLClass.one_to_many 'operations', UMLOperation, 'clazz'
|
|
87
|
-
UMLClass.one_to_many 'taggedvalues', UMLTaggedValue, 'clazz'
|
|
88
|
-
|
|
89
|
-
UMLAssociation.one_to_one 'endA', UMLAssociationEnd, 'assocA'
|
|
90
|
-
UMLAssociation.one_to_one 'endB', UMLAssociationEnd, 'assocB'
|
|
91
|
-
|
|
92
|
-
end
|
data/lib/uml/uml_objectmodel.rb
DELETED
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
require 'rgen/metamodel_builder'
|
|
2
|
-
|
|
3
|
-
module UMLObjectModel
|
|
4
|
-
|
|
5
|
-
include RGen::MetamodelBuilder
|
|
6
|
-
|
|
7
|
-
class UMLPackage < MMBase
|
|
8
|
-
has_one 'name', String
|
|
9
|
-
def allObjects
|
|
10
|
-
subpackages.inject(objects) {|r,p| r.concat(p.allObjects) }
|
|
11
|
-
end
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
class UMLObject < MMBase
|
|
15
|
-
has_one 'name', String
|
|
16
|
-
has_one 'classname', String
|
|
17
|
-
def remoteNavigableEnds
|
|
18
|
-
assocEnds.otherEnd.select{|e| e.navigable}
|
|
19
|
-
end
|
|
20
|
-
def localNavigableEnds
|
|
21
|
-
assocEnds.select{|e| e.navigable}
|
|
22
|
-
end
|
|
23
|
-
def localCompositeEnds
|
|
24
|
-
assocEnds.select{|e| e.composite}
|
|
25
|
-
end
|
|
26
|
-
def remoteCompositeEnds
|
|
27
|
-
assocEnds.otherEnd.select{|e| e.composite}
|
|
28
|
-
# put constraint check here and return the container directly ?
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
class UMLAttributeSetting < MMBase
|
|
33
|
-
has_one 'name', String
|
|
34
|
-
has_one 'value', String
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
class UMLAssociation < MMBase
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
class UMLAggregation < UMLAssociation
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
class UMLAssociationEnd < MMBase
|
|
44
|
-
has_one 'navigable' # boolean
|
|
45
|
-
has_one 'composite' # boolean
|
|
46
|
-
has_one 'role', String
|
|
47
|
-
def assoc
|
|
48
|
-
assocA || assocB
|
|
49
|
-
end
|
|
50
|
-
def otherEnd
|
|
51
|
-
return unless assoc
|
|
52
|
-
assoc.endA == self ? assoc.endB : assoc.endA
|
|
53
|
-
end
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
UMLPackage.one_to_many 'subpackages', UMLPackage, 'superpackage'
|
|
57
|
-
UMLPackage.one_to_many 'objects', UMLObject, 'package'
|
|
58
|
-
|
|
59
|
-
UMLObject.one_to_many 'assocEnds', UMLAssociationEnd, 'object'
|
|
60
|
-
UMLObject.one_to_many 'attributeSettings', UMLAttributeSetting, 'object'
|
|
61
|
-
|
|
62
|
-
UMLAssociation.one_to_one 'endA', UMLAssociationEnd, 'assocA'
|
|
63
|
-
UMLAssociation.one_to_one 'endB', UMLAssociationEnd, 'assocB'
|
|
64
|
-
|
|
65
|
-
end
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
$:.unshift File.join(File.dirname(__FILE__),"..","lib")
|
|
2
|
-
|
|
3
|
-
require 'test/unit'
|
|
4
|
-
require 'ea/xmi_class_instantiator'
|
|
5
|
-
require 'mmgen/metamodel_generator'
|
|
6
|
-
|
|
7
|
-
class MetamodelGeneratorTest < Test::Unit::TestCase
|
|
8
|
-
|
|
9
|
-
MODEL_DIR = File.join(File.dirname(__FILE__),"xmi_instantiator_test")
|
|
10
|
-
OUTPUT_DIR = File.dirname(__FILE__)+"/metamodel_generator_test"
|
|
11
|
-
MM_FILE = OUTPUT_DIR+"/TestModel.rb"
|
|
12
|
-
|
|
13
|
-
include MMGen::MetamodelGenerator
|
|
14
|
-
|
|
15
|
-
def test_generator
|
|
16
|
-
envUML = RGen::Environment.new
|
|
17
|
-
File.open(MODEL_DIR+"/testmodel.xml") { |f|
|
|
18
|
-
XMIClassInstantiator.new.instantiateUMLClassModel(envUML, f.read)
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
rootPackage = envUML.find(:class => UMLClassModel::UMLPackage).select{|p| p.name == "HouseMetamodel"}.first
|
|
22
|
-
assert_not_nil rootPackage
|
|
23
|
-
|
|
24
|
-
assert_raise StandardError do
|
|
25
|
-
# this will raise an exception because multiple inheritance is not resolved
|
|
26
|
-
generateMetamodel(rootPackage, MM_FILE)
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
# resolve multiple inheritance by specifying which class should be a module
|
|
30
|
-
modules = ['MeetingPlace']
|
|
31
|
-
generateMetamodel(rootPackage, MM_FILE, modules)
|
|
32
|
-
|
|
33
|
-
# try to use the generated metamodel
|
|
34
|
-
File.open(MM_FILE) { |f|
|
|
35
|
-
eval(f.read)
|
|
36
|
-
}
|
|
37
|
-
assert HouseMetamodel::House.new
|
|
38
|
-
|
|
39
|
-
result = expected = ""
|
|
40
|
-
File.open(MM_FILE) {|f| result = f.read}
|
|
41
|
-
File.open(OUTPUT_DIR+"/expected_result.txt") {|f| expected = f.read}
|
|
42
|
-
assert_equal expected, result
|
|
43
|
-
end
|
|
44
|
-
end
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
require 'rgen/metamodel_builder'
|
|
2
|
-
module HouseMetamodel
|
|
3
|
-
|
|
4
|
-
class Person < RGen::MetamodelBuilder::MMBase
|
|
5
|
-
has_one 'name', String
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
class House < RGen::MetamodelBuilder::MMBase
|
|
9
|
-
has_one 'name', String
|
|
10
|
-
has_one 'address', String
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
module MeetingPlace
|
|
14
|
-
extend RGen::MetamodelBuilder::BuilderExtensions
|
|
15
|
-
has_one 'name', String
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
module Rooms
|
|
20
|
-
|
|
21
|
-
class Room < RGen::MetamodelBuilder::MMBase
|
|
22
|
-
has_one 'name', String
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
class Bathroom < Room
|
|
26
|
-
has_one 'name', String
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
class Kitchen < Room
|
|
30
|
-
include MeetingPlace
|
|
31
|
-
has_one 'name', String
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
HouseMetamodel::Person.one_to_many 'home', HouseMetamodel::House, 'person'
|
|
38
|
-
HouseMetamodel::House.one_to_one 'bathroom', HouseMetamodel::Rooms::Bathroom, 'house'
|
|
39
|
-
HouseMetamodel::Rooms::Kitchen.one_to_one 'house', HouseMetamodel::House, 'kitchen'
|
|
40
|
-
HouseMetamodel::House.one_to_many 'room', HouseMetamodel::Rooms::Room, 'house'
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
require 'rgen/metamodel_builder'
|
|
2
|
-
module HouseMetamodel
|
|
3
|
-
|
|
4
|
-
class Person < RGen::MetamodelBuilder::MMBase
|
|
5
|
-
has_one 'name', String
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
class House < RGen::MetamodelBuilder::MMBase
|
|
9
|
-
has_one 'name', String
|
|
10
|
-
has_one 'address', String
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
module MeetingPlace
|
|
14
|
-
extend RGen::MetamodelBuilder::BuilderExtensions
|
|
15
|
-
has_one 'name', String
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
module Rooms
|
|
20
|
-
|
|
21
|
-
class Room < RGen::MetamodelBuilder::MMBase
|
|
22
|
-
has_one 'name', String
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
class Bathroom < Room
|
|
26
|
-
has_one 'name', String
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
class Kitchen < Room
|
|
30
|
-
include MeetingPlace
|
|
31
|
-
has_one 'name', String
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
HouseMetamodel::Person.one_to_many 'home', HouseMetamodel::House, 'person'
|
|
38
|
-
HouseMetamodel::House.one_to_one 'bathroom', HouseMetamodel::Rooms::Bathroom, 'house'
|
|
39
|
-
HouseMetamodel::Rooms::Kitchen.one_to_one 'house', HouseMetamodel::House, 'kitchen'
|
|
40
|
-
HouseMetamodel::House.one_to_many 'room', HouseMetamodel::Rooms::Room, 'house'
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
$:.unshift File.join(File.dirname(__FILE__),"..","lib")
|
|
2
|
-
$:.unshift File.join(File.dirname(__FILE__),"..","test")
|
|
3
|
-
|
|
4
|
-
require 'test/unit'
|
|
5
|
-
require 'ea/xmi_class_instantiator'
|
|
6
|
-
require 'rgen/transformer'
|
|
7
|
-
require 'xmi_instantiator_test/class_model_checker'
|
|
8
|
-
|
|
9
|
-
class XmiClassInstantiatorTest < Test::Unit::TestCase
|
|
10
|
-
|
|
11
|
-
MODEL_DIR = File.join(File.dirname(__FILE__),"xmi_instantiator_test")
|
|
12
|
-
|
|
13
|
-
include ClassModelChecker
|
|
14
|
-
|
|
15
|
-
def test_model
|
|
16
|
-
envUML = RGen::Environment.new
|
|
17
|
-
File.open(MODEL_DIR+"/testmodel.xml") { |f|
|
|
18
|
-
XMIClassInstantiator.new.instantiateUMLClassModel(envUML, f.read)
|
|
19
|
-
}
|
|
20
|
-
checkClassModel(envUML)
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
end
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
require 'uml/uml_classmodel'
|
|
2
|
-
|
|
3
|
-
module ClassModelChecker
|
|
4
|
-
include UMLClassModel
|
|
5
|
-
|
|
6
|
-
def checkClassModel(envUML)
|
|
7
|
-
|
|
8
|
-
# check main package
|
|
9
|
-
mainPackage = envUML.elements.select {|e| e.is_a? UMLPackage and e.name == "HouseMetamodel"}.first
|
|
10
|
-
assert_not_nil mainPackage
|
|
11
|
-
|
|
12
|
-
# check Rooms package
|
|
13
|
-
assert mainPackage.subpackages.is_a?(Array)
|
|
14
|
-
assert_equal 1, mainPackage.subpackages.size
|
|
15
|
-
assert mainPackage.subpackages[0].is_a?(UMLPackage)
|
|
16
|
-
roomsPackage = mainPackage.subpackages[0]
|
|
17
|
-
assert_equal "Rooms", roomsPackage.name
|
|
18
|
-
|
|
19
|
-
# check main package classes
|
|
20
|
-
assert mainPackage.classes.is_a?(Array)
|
|
21
|
-
assert_equal 3, mainPackage.classes.size
|
|
22
|
-
assert mainPackage.classes.all?{|c| c.is_a?(UMLClass)}
|
|
23
|
-
houseClass = mainPackage.classes.select{|c| c.name == "House"}.first
|
|
24
|
-
personClass = mainPackage.classes.select{|c| c.name == "Person"}.first
|
|
25
|
-
meetingPlaceClass = mainPackage.classes.select{|c| c.name == "MeetingPlace"}.first
|
|
26
|
-
assert_not_nil houseClass
|
|
27
|
-
assert_not_nil personClass
|
|
28
|
-
assert_not_nil meetingPlaceClass
|
|
29
|
-
|
|
30
|
-
# check Rooms package classes
|
|
31
|
-
assert roomsPackage.classes.is_a?(Array)
|
|
32
|
-
assert_equal 3, roomsPackage.classes.size
|
|
33
|
-
assert roomsPackage.classes.all?{|c| c.is_a?(UMLClass)}
|
|
34
|
-
roomClass = roomsPackage.classes.select{|c| c.name == "Room"}.first
|
|
35
|
-
kitchenClass = roomsPackage.classes.select{|c| c.name == "Kitchen"}.first
|
|
36
|
-
bathroomClass = roomsPackage.classes.select{|c| c.name == "Bathroom"}.first
|
|
37
|
-
assert_not_nil roomClass
|
|
38
|
-
assert_not_nil kitchenClass
|
|
39
|
-
assert_not_nil bathroomClass
|
|
40
|
-
|
|
41
|
-
# check Room inheritance
|
|
42
|
-
assert roomClass.subclasses.is_a?(Array)
|
|
43
|
-
assert_equal 2, roomClass.subclasses.size
|
|
44
|
-
assert_not_nil roomClass.subclasses.select{|c| c.name == "Kitchen"}.first
|
|
45
|
-
assert_not_nil roomClass.subclasses.select{|c| c.name == "Bathroom"}.first
|
|
46
|
-
assert kitchenClass.superclasses.is_a?(Array)
|
|
47
|
-
assert_equal 2, kitchenClass.superclasses.size
|
|
48
|
-
assert_equal roomClass.object_id, kitchenClass.superclasses.select{|c| c.name == "Room"}.first.object_id
|
|
49
|
-
assert_equal meetingPlaceClass.object_id, kitchenClass.superclasses.select{|c| c.name == "MeetingPlace"}.first.object_id
|
|
50
|
-
assert bathroomClass.superclasses.is_a?(Array)
|
|
51
|
-
assert_equal 1, bathroomClass.superclasses.size
|
|
52
|
-
assert_equal roomClass.object_id, bathroomClass.superclasses[0].object_id
|
|
53
|
-
|
|
54
|
-
# check House-Room "part of" association
|
|
55
|
-
assert houseClass.localCompositeEnds.otherEnd.clazz.is_a?(Array)
|
|
56
|
-
assert_equal 1, houseClass.localCompositeEnds.size
|
|
57
|
-
roomEnd = houseClass.localCompositeEnds[0].otherEnd
|
|
58
|
-
assert_equal UMLAggregation, roomEnd.assoc.class
|
|
59
|
-
assert_equal roomClass.object_id, roomEnd.clazz.object_id
|
|
60
|
-
assert_equal "room", roomEnd.role
|
|
61
|
-
assert_equal "1..*", roomEnd.multiplicity
|
|
62
|
-
assert_equal 1, roomEnd.lowerMult
|
|
63
|
-
assert_equal :many, roomEnd.upperMult
|
|
64
|
-
|
|
65
|
-
assert roomClass.remoteCompositeEnds.clazz.is_a?(Array)
|
|
66
|
-
assert_equal 1, roomClass.remoteCompositeEnds.size
|
|
67
|
-
assert_equal houseClass.object_id, roomClass.remoteCompositeEnds[0].clazz.object_id
|
|
68
|
-
assert_equal "house", roomClass.remoteCompositeEnds[0].role
|
|
69
|
-
|
|
70
|
-
# check House OUT associations
|
|
71
|
-
assert houseClass.remoteNavigableEnds.is_a?(Array)
|
|
72
|
-
assert_equal 2, houseClass.remoteNavigableEnds.size
|
|
73
|
-
bathEnd = houseClass.remoteNavigableEnds.select{|e| e.role == "bathroom"}.first
|
|
74
|
-
kitchenEnd = houseClass.remoteNavigableEnds.select{|e| e.role == "kitchen"}.first
|
|
75
|
-
assert_not_nil bathEnd
|
|
76
|
-
assert_not_nil kitchenEnd
|
|
77
|
-
assert_equal UMLAssociation, bathEnd.assoc.class
|
|
78
|
-
assert_equal UMLAssociation, kitchenEnd.assoc.class
|
|
79
|
-
assert_equal "1", kitchenEnd.multiplicity
|
|
80
|
-
assert_equal 1, kitchenEnd.lowerMult
|
|
81
|
-
assert_equal 1, kitchenEnd.upperMult
|
|
82
|
-
|
|
83
|
-
# check House IN associations
|
|
84
|
-
assert houseClass.localNavigableEnds.is_a?(Array)
|
|
85
|
-
assert_equal 3, houseClass.localNavigableEnds.size
|
|
86
|
-
homeEnd = houseClass.localNavigableEnds.select{|e| e.role == "home"}.first
|
|
87
|
-
assert_not_nil homeEnd
|
|
88
|
-
assert_equal UMLAssociation, homeEnd.assoc.class
|
|
89
|
-
assert_equal "0..*", homeEnd.multiplicity
|
|
90
|
-
assert_equal 0, homeEnd.lowerMult
|
|
91
|
-
assert_equal :many, homeEnd.upperMult
|
|
92
|
-
|
|
93
|
-
# check House all associations
|
|
94
|
-
assert houseClass.assocEnds.is_a?(Array)
|
|
95
|
-
assert_equal 4, houseClass.assocEnds.size
|
|
96
|
-
end
|
|
97
|
-
end
|