rgen 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|