xamplr 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (142) hide show
  1. data/CHANGES.txt +13 -0
  2. data/LICENSE +3 -0
  3. data/README.rdoc +26 -0
  4. data/README.rdoc.orig +118 -0
  5. data/Rakefile +85 -0
  6. data/VERSION.yml +4 -0
  7. data/examples/random-people-shared-addresses/Makefile +16 -0
  8. data/examples/random-people-shared-addresses/batch-load-users.rb +83 -0
  9. data/examples/random-people-shared-addresses/find-mentions.rb +47 -0
  10. data/examples/random-people-shared-addresses/find-people-by-address.rb +104 -0
  11. data/examples/random-people-shared-addresses/optimise.rb +16 -0
  12. data/examples/random-people-shared-addresses/people.rb +35 -0
  13. data/examples/random-people-shared-addresses/query.rb +75 -0
  14. data/examples/random-people-shared-addresses/query2.rb +73 -0
  15. data/examples/random-people-shared-addresses/random-names.csv +10000 -0
  16. data/examples/random-people-shared-addresses/settings.rb +3 -0
  17. data/examples/random-people-shared-addresses/what-to-query-on.rb +82 -0
  18. data/examples/random-people-shared-addresses/xampl-gen.rb +36 -0
  19. data/examples/random-people-shared-addresses/xml/people.xml +14 -0
  20. data/examples/random-people/Makefile +16 -0
  21. data/examples/random-people/batch-load-users.rb +61 -0
  22. data/examples/random-people/optimise.rb +16 -0
  23. data/examples/random-people/people.rb +22 -0
  24. data/examples/random-people/query.rb +73 -0
  25. data/examples/random-people/query2.rb +73 -0
  26. data/examples/random-people/random-names.csv +10000 -0
  27. data/examples/random-people/rawtc.rb +91 -0
  28. data/examples/random-people/settings.rb +3 -0
  29. data/examples/random-people/what-to-query-on.rb +80 -0
  30. data/examples/random-people/xampl-gen.rb +36 -0
  31. data/examples/random-people/xml/people.xml +11 -0
  32. data/examples/read-testing/Makefile +10 -0
  33. data/examples/read-testing/load.rb +65 -0
  34. data/examples/read-testing/read.rb +51 -0
  35. data/examples/read-testing/rrr.rb +87 -0
  36. data/examples/read-testing/settings.rb +2 -0
  37. data/examples/read-testing/xampl-gen.rb +36 -0
  38. data/examples/read-testing/xml/text.xml +8 -0
  39. data/examples/tokyo-cabinet-experimental/expt-query.rb +42 -0
  40. data/examples/tokyo-cabinet-experimental/expt-query2.rb +42 -0
  41. data/examples/tokyo-cabinet-experimental/expt-query3.rb +41 -0
  42. data/examples/tokyo-cabinet-experimental/expt-reader.rb +32 -0
  43. data/examples/tokyo-cabinet-experimental/expt.rb +61 -0
  44. data/examples/tokyo-cabinet-experimental/xampl-gen.rb +36 -0
  45. data/examples/tokyo-cabinet-experimental/xml/tcx.xml +6 -0
  46. data/lib/xampl-generator.rb +3 -0
  47. data/lib/xampl.rb +3 -0
  48. data/lib/xamplr-generator.rb +10 -0
  49. data/lib/xamplr.rb +37 -0
  50. data/lib/xamplr/README-POSSIBLE-PROBLEMS +5 -0
  51. data/lib/xamplr/TODO +1 -0
  52. data/lib/xamplr/exceptions.rb +97 -0
  53. data/lib/xamplr/from-xml-orig.rb +350 -0
  54. data/lib/xamplr/from-xml.rb +439 -0
  55. data/lib/xamplr/gen-elements.xml +6230 -0
  56. data/lib/xamplr/gen.elements.xml +108 -0
  57. data/lib/xamplr/generate-elements.rb +15 -0
  58. data/lib/xamplr/generator.rb +5 -0
  59. data/lib/xamplr/graphml-out.rb +470 -0
  60. data/lib/xamplr/handwritten/example.rb +698 -0
  61. data/lib/xamplr/handwritten/hand-example.rb +533 -0
  62. data/lib/xamplr/handwritten/test-handwritten.rb +873 -0
  63. data/lib/xamplr/indexed-array.rb +115 -0
  64. data/lib/xamplr/mixins.rb +397 -0
  65. data/lib/xamplr/my.gen.elements.xml +461 -0
  66. data/lib/xamplr/notifications.rb +57 -0
  67. data/lib/xamplr/obsolete/fsdb.rb +62 -0
  68. data/lib/xamplr/persist-to-xml.rb +249 -0
  69. data/lib/xamplr/persistence.rb +522 -0
  70. data/lib/xamplr/persistence.rb.more_thread_safe +771 -0
  71. data/lib/xamplr/persistence.rb.partially_thread_safe +763 -0
  72. data/lib/xamplr/persister.rb +310 -0
  73. data/lib/xamplr/persisters/caches.rb +186 -0
  74. data/lib/xamplr/persisters/caching.rb +172 -0
  75. data/lib/xamplr/persisters/filesystem.rb +60 -0
  76. data/lib/xamplr/persisters/in-memory.rb +180 -0
  77. data/lib/xamplr/persisters/simple.rb +59 -0
  78. data/lib/xamplr/persisters/tokyo-cabinet.rb +641 -0
  79. data/lib/xamplr/simpleTemplate/danger.rx +4 -0
  80. data/lib/xamplr/simpleTemplate/obsolete/input-c.r4 +35 -0
  81. data/lib/xamplr/simpleTemplate/obsolete/play.r6.txt +12 -0
  82. data/lib/xamplr/simpleTemplate/obsolete/play_more.r6.txt +20 -0
  83. data/lib/xamplr/simpleTemplate/obsolete/test001.r5 +8 -0
  84. data/lib/xamplr/simpleTemplate/obsolete/test002.r5 +13 -0
  85. data/lib/xamplr/simpleTemplate/obsolete/test003.r5 +37 -0
  86. data/lib/xamplr/simpleTemplate/old/r6.000.rb +122 -0
  87. data/lib/xamplr/simpleTemplate/old/r6.001.rb +145 -0
  88. data/lib/xamplr/simpleTemplate/play.r6 +12 -0
  89. data/lib/xamplr/simpleTemplate/play_more.r6 +20 -0
  90. data/lib/xamplr/simpleTemplate/play_noblanks.r6 +21 -0
  91. data/lib/xamplr/simpleTemplate/playq.r6 +16 -0
  92. data/lib/xamplr/simpleTemplate/r6.rb +87 -0
  93. data/lib/xamplr/simpleTemplate/simple-template.rb +75 -0
  94. data/lib/xamplr/templates/child.template +47 -0
  95. data/lib/xamplr/templates/child_indexed.template +89 -0
  96. data/lib/xamplr/templates/child_modules.template +5 -0
  97. data/lib/xamplr/templates/element_classes.template +11 -0
  98. data/lib/xamplr/templates/element_data.template +282 -0
  99. data/lib/xamplr/templates/element_empty.template +285 -0
  100. data/lib/xamplr/templates/element_mixed.template +277 -0
  101. data/lib/xamplr/templates/element_simple.template +276 -0
  102. data/lib/xamplr/templates/package.template +26 -0
  103. data/lib/xamplr/test-support/Makefile +47 -0
  104. data/lib/xamplr/test-support/bench-cache.rb +80 -0
  105. data/lib/xamplr/test-support/bench-script.rb +21 -0
  106. data/lib/xamplr/test-support/bench.rb +116 -0
  107. data/lib/xamplr/test-support/bench2.rb +132 -0
  108. data/lib/xamplr/test-support/test-cache.rb +147 -0
  109. data/lib/xamplr/test-support/test-data/binding.xml +7 -0
  110. data/lib/xamplr/test-support/test-data/example.xml +14 -0
  111. data/lib/xamplr/test-support/test-data/internationalization-utf8.txt +1 -0
  112. data/lib/xamplr/test-support/test-data/labels.xml +37 -0
  113. data/lib/xamplr/test-support/test-data/labels001.xml +38 -0
  114. data/lib/xamplr/test-support/test-deep-change.rb +135 -0
  115. data/lib/xamplr/test-support/test-elements.rb +109 -0
  116. data/lib/xamplr/test-support/test-indexed-array.rb +169 -0
  117. data/lib/xamplr/test-support/test-misc.rb +73 -0
  118. data/lib/xamplr/test-support/test-names.rb +67 -0
  119. data/lib/xamplr/test-support/test-rollback.rb +106 -0
  120. data/lib/xamplr/test-support/test.rb +1504 -0
  121. data/lib/xamplr/to-ruby.rb +220 -0
  122. data/lib/xamplr/to-xml.rb +158 -0
  123. data/lib/xamplr/version.rb +67 -0
  124. data/lib/xamplr/visitor.rb +140 -0
  125. data/lib/xamplr/visitors.rb +573 -0
  126. data/lib/xamplr/xampl-generator.rb +533 -0
  127. data/lib/xamplr/xampl-hand-generated.rb +1535 -0
  128. data/lib/xamplr/xampl-module.rb +36 -0
  129. data/lib/xamplr/xampl-object-internals.rb +6 -0
  130. data/lib/xamplr/xampl-object.rb +202 -0
  131. data/lib/xamplr/xampl-persisted-object.rb +122 -0
  132. data/lib/xamplr/xml-text.rb +117 -0
  133. data/lib/xamplr/xml/document.xml +7 -0
  134. data/lib/xamplr/xml/elements.xml +101 -0
  135. data/lib/xamplr/xml/elements000.xml +73 -0
  136. data/lib/xamplr/xml/example.xml +23 -0
  137. data/lib/xamplr/xml/options.xml +12 -0
  138. data/lib/xamplr/xml/uche.xml +38 -0
  139. data/lib/xamplr/yEd-sample.graphml +300 -0
  140. data/test/test_helper.rb +10 -0
  141. data/test/xamplr_test.rb +7 -0
  142. metadata +245 -0
@@ -0,0 +1,108 @@
1
+ <xampl-gen:elements xmlns:xampl-gen='http://xampl.com/generator'>
2
+ <xampl-gen:element className='Elements'
3
+ attributeName='elements'
4
+ nstag='{http://xampl.com/generator}elements'
5
+ indexedByAttr='pid'
6
+ persisted='true'
7
+ name='elements'
8
+ kind='data'
9
+ namespace='http://xampl.com/generator'
10
+ package='XamplGenerator'>
11
+ <xampl-gen:attribute name='pid'/>
12
+ <xampl-gen:childElement element_name='element'
13
+ name='{http://xampl.com/generator}element'
14
+ namespace='http://xampl.com/generator'/>
15
+ </xampl-gen:element>
16
+ <xampl-gen:element className='Element'
17
+ attributeName='element'
18
+ nstag='{http://xampl.com/generator}element'
19
+ indexedByAttr='name'
20
+ name='element'
21
+ kind='data'
22
+ namespace='http://xampl.com/generator'
23
+ package='XamplGenerator'>
24
+ <xampl-gen:attribute name='has_content'/>
25
+ <xampl-gen:attribute name='class_name'/>
26
+ <xampl-gen:attribute name='attribute_name'/>
27
+ <xampl-gen:attribute name='nstag'/>
28
+ <xampl-gen:attribute name='empty'/>
29
+ <xampl-gen:attribute name='indexed_by_attr'/>
30
+ <xampl-gen:attribute name='persisted'/>
31
+ <xampl-gen:childElement element_name='childElement'
32
+ name='{http://xampl.com/generator}childElement'
33
+ namespace='http://xampl.com/generator'/>
34
+ <xampl-gen:attribute name='name'/>
35
+ <xampl-gen:attribute name='kind'/>
36
+ <xampl-gen:attribute name='namespace'/>
37
+ <xampl-gen:attribute name='package'/>
38
+ <xampl-gen:childElement element_name='attribute'
39
+ name='{http://xampl.com/generator}attribute'
40
+ namespace='http://xampl.com/generator'/>
41
+ </xampl-gen:element>
42
+ <xampl-gen:element className='ChildElement'
43
+ attributeName='child_element'
44
+ nstag='{http://xampl.com/generator}childElement'
45
+ empty='true'
46
+ indexedByAttr='name'
47
+ name='childElement'
48
+ kind='empty'
49
+ namespace='http://xampl.com/generator'
50
+ package='XamplGenerator'>
51
+ <xampl-gen:attribute name='element_name'/>
52
+ <xampl-gen:attribute name='name'/>
53
+ <xampl-gen:attribute name='namespace'/>
54
+ <xampl-gen:attribute name='index_class'/>
55
+ <xampl-gen:attribute name='index'/>
56
+ <xampl-gen:attribute name='package'/>
57
+ </xampl-gen:element>
58
+ <xampl-gen:element className='Attribute'
59
+ attributeName='attribute'
60
+ nstag='{http://xampl.com/generator}attribute'
61
+ empty='true'
62
+ indexedByAttr='name'
63
+ name='attribute'
64
+ kind='empty'
65
+ namespace='http://xampl.com/generator'
66
+ package='XamplGenerator'>
67
+ <xampl-gen:attribute name='namespace'/>
68
+ <xampl-gen:attribute name='name'/>
69
+ </xampl-gen:element>
70
+ <xampl-gen:element className='Options'
71
+ attributeName='options'
72
+ nstag='{http://xampl.com/generator}options'
73
+ name='options'
74
+ kind='data'
75
+ namespace='http://xampl.com/generator'
76
+ package='XamplGenerator'>
77
+ <xampl-gen:childElement element_name='index-attribute'
78
+ name='{http://xampl.com/generator}index-attribute'
79
+ namespace='http://xampl.com/generator'/>
80
+ <xampl-gen:childElement element_name='resolve'
81
+ name='{http://xampl.com/generator}resolve'
82
+ namespace='http://xampl.com/generator'/>
83
+ </xampl-gen:element>
84
+ <xampl-gen:element className='IndexAttribute'
85
+ attributeName='index_attribute'
86
+ nstag='{http://xampl.com/generator}index-attribute'
87
+ empty='true'
88
+ indexedByAttr='name'
89
+ name='index-attribute'
90
+ kind='empty'
91
+ namespace='http://xampl.com/generator'
92
+ package='XamplGenerator'>
93
+ <xampl-gen:attribute name='name'/>
94
+ <xampl-gen:attribute name='persisted'/>
95
+ </xampl-gen:element>
96
+ <xampl-gen:element className='Resolve'
97
+ attributeName='resolve'
98
+ nstag='{http://xampl.com/generator}resolve'
99
+ empty='true'
100
+ name='resolve'
101
+ kind='empty'
102
+ namespace='http://xampl.com/generator'
103
+ package='XamplGenerator'>
104
+ <xampl-gen:attribute name='namespace'/>
105
+ <xampl-gen:attribute name='pkg'/>
106
+ <xampl-gen:attribute name='preferred_prefix'/>
107
+ </xampl-gen:element>
108
+ </xampl-gen:elements>
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'xamplr-generator'
4
+ include XamplGenerator
5
+ include Xampl
6
+
7
+ options = Xampl.make(Options) { | options |
8
+ options.new_index_attribute("name")
9
+ options.new_index_attribute("id")
10
+ options.new_index_attribute("pid").persisted = true
11
+
12
+ options.resolve("http://xampl.com/generator", "XamplGenerator", "gen")
13
+ }
14
+
15
+ XamplGenerator.from_command_line(options)
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'xamplr-generator'
4
+
5
+ XamplGenerator.from_command_line
@@ -0,0 +1,470 @@
1
+ require 'fileutils'
2
+ require 'set'
3
+
4
+ module XamplGenerator
5
+
6
+ class GraphMLOut
7
+
8
+ def initialize(elements_map)
9
+ @elements_map = elements_map
10
+ end
11
+
12
+ def devise_filename(filename)
13
+ bn = File.basename(filename)
14
+ ext = File.extname(bn)
15
+ bn = bn[0..(bn.size - ext.size - 1)]
16
+ fn = "#{bn}.graphml"
17
+ end
18
+
19
+ def generate_class_nodes(element, include_mixins)
20
+
21
+ node = @element_to_node_map[element.nstag]
22
+
23
+ class_name = "#{ element.package }::#{ element.class_name }"
24
+ mixin_name = "#{ element.package }::#{ element.class_name }"
25
+
26
+ if element.persisted then
27
+ write_entity_node(node, class_name, element.kind)
28
+ else
29
+ write_internal_node(node, class_name, element.kind)
30
+ end
31
+
32
+ if include_mixins then
33
+ mixin_node = @mixed_in[element.nstag]
34
+ #puts "#{ element.nstag } => #{ node }, mixin: [#{ mixin_node }]"
35
+ if mixin_node then
36
+ write_mixin_node(mixin_node, class_name)
37
+ end
38
+ end
39
+ # puts "NODE #{ node } #{ class_name }"
40
+ # puts "NODE #{ mixin_node } #{ mixin_name }"
41
+ end
42
+
43
+ def generate_edges(element, include_mixins)
44
+ # for each child, generate an entity-ref or internal-ref edge
45
+ # for each child, generate a mixin-ref edge
46
+
47
+ return if ignore_package(element.package)
48
+
49
+ element.child_element_child.each do | celement |
50
+ next if ignore_package(celement.package)
51
+
52
+ cnstag = "{{#{ celement.namespace }}}#{ celement.element_name }"
53
+
54
+ referenced_element = @ns_to_element_map[ cnstag ]
55
+ next unless referenced_element
56
+
57
+ this_node = @element_to_node_map[ element.nstag ]
58
+
59
+ other_node = @element_to_node_map[ cnstag ]
60
+ other_mixin = @mixed_in[ cnstag ]
61
+
62
+ if referenced_element.persisted then
63
+ @current_edge += 1
64
+ write_entity_ref_edge(@current_edge, this_node, other_node)
65
+ # puts "ER EDGE #{ @current_edge }, #{ this_node } --> #{ other_node } :: #{ element.class_name } --> #{ referenced_element.class_name }"
66
+ else
67
+ @current_edge += 1
68
+ write_internal_ref_edge(@current_edge, this_node, other_node)
69
+ # puts "IR EDGE #{ @current_edge }, #{ this_node } --> #{ other_node } :: #{ element.class_name } --> #{ referenced_element.class_name }"
70
+ end
71
+ if include_mixins then
72
+ @current_edge += 1
73
+ write_mixin_ref_edge(@current_edge, this_node, other_mixin)
74
+ # puts "MI EDGE #{ @current_edge }, #{ this_node } --> #{ other_mixin } :: #{ element.class_name } --> #{ referenced_element.class_name }"
75
+ end
76
+ end
77
+ end
78
+
79
+ def ignore_package(package)
80
+ return true if @excluded_packages.member?(package)
81
+ return false if @included_packages.nil?
82
+ return true unless @included_packages.member?(package)
83
+ return false
84
+ end
85
+
86
+ # def ignore_package(package)
87
+ # puts "#{File.basename(__FILE__)}:#{__LINE__} pkg: [#{ package }], exclude: #{ @excluded_packages.inspect }, include: #{ @included_packages.inspect }"
88
+ # r = ignore_package_work(package)
89
+ # puts "#{File.basename(__FILE__)}:#{__LINE__} ignore? #{ r }"
90
+ # r
91
+ # end
92
+
93
+ #def write_graph_ml(filename, excluded_packages=[ 'C2', 'NavRelationships', 'App' ], included_packages=nil, include_mixins=false)
94
+ def write_graph_ml(filename, excluded_packages=[ ], included_packages=nil, include_mixins=true)
95
+
96
+ #puts "#{File.basename(__FILE__)}:#{__LINE__} no graphml yet"
97
+ #return
98
+
99
+ filename = devise_filename(filename)
100
+
101
+ @excluded_packages = Set.new(excluded_packages)
102
+ @included_packages = included_packages ? Set.new(included_packages) : nil
103
+
104
+ @element_to_node_map = {}
105
+ @ns_to_element_map = {}
106
+ @element_to_child_element_map = {}
107
+ @mixed_in = {}
108
+
109
+ nodes = 0
110
+ edges = 0
111
+ mixins = 0
112
+
113
+ @elements_map.each_value do |elements|
114
+ elements.element_child.each do |element|
115
+ next if ignore_package(element.package)
116
+ nodes += 1
117
+
118
+ @element_to_node_map[element.nstag] = nodes
119
+ @ns_to_element_map[element.nstag] = element
120
+ @element_to_child_element_map[element.nstag] = map = {}
121
+
122
+ element.child_element_child.each do | celement |
123
+ edges += 1
124
+ cnstag = "{{#{ celement.namespace }}}#{ celement.element_name }"
125
+ map[cnstag] = edges
126
+ unless @mixed_in.include?(cnstag) then
127
+ mixins += 1
128
+ @mixed_in[cnstag] = mixins
129
+ end
130
+ end
131
+ end
132
+ end
133
+
134
+ @mixed_in.each do | k, v |
135
+ @mixed_in[k] = v + nodes
136
+ end
137
+
138
+ # puts "#{File.basename(__FILE__)}:#{__LINE__} #{ @element_to_node_map.inspect }"
139
+
140
+ @reference_edges = edges
141
+
142
+ File.open(filename, "w") do | out |
143
+ @out = out
144
+
145
+ if include_mixins then
146
+ write_graphml_start(nodes + mixins, 2 * edges)
147
+ else
148
+ write_graphml_start(nodes, edges)
149
+ end
150
+ @elements_map.each_value do |elements|
151
+ elements.element_child.each do |element|
152
+ generate_class_nodes(element, include_mixins)
153
+ end
154
+ end
155
+
156
+ @current_edge = 0
157
+ @elements_map.each_value do |elements|
158
+ elements.element_child.each do |element|
159
+ generate_edges(element, include_mixins)
160
+ end
161
+ end
162
+ write_graphml_end
163
+ # puts "#{File.basename(__FILE__)}:#{__LINE__} EDGES:: predicted: #{ 2 * edges }, actual: #{ @current_edge }"
164
+ end
165
+ return nil
166
+ end
167
+
168
+ def write_entity_node(node, class_name, kind)
169
+ @out << <<EOS
170
+ <node id="n#{ node }">
171
+ <data key="d0">
172
+ <y:UMLClassNode>
173
+ <y:Geometry height="102.0"
174
+ width="111.0"
175
+ x="-5.5"
176
+ y="174.0"/>
177
+ <y:Fill color="#99CCFF"
178
+ transparent="false"/>
179
+ <y:BorderStyle color="#000000"
180
+ type="line"
181
+ width="2.0"/>
182
+ <y:NodeLabel alignment="center"
183
+ autoSizePolicy="content"
184
+ fontFamily="Dialog"
185
+ fontSize="13"
186
+ fontStyle="bold"
187
+ hasBackgroundColor="false"
188
+ hasLineColor="false"
189
+ height="19.310546875"
190
+ modelName="internal"
191
+ modelPosition="c"
192
+ textColor="#000000"
193
+ visible="true"
194
+ width="49.6904296875"
195
+ x="30.65478515625"
196
+ y="26.1328125">#{ class_name }
197
+ </y:NodeLabel>
198
+ <y:UML clipContent="true"
199
+ constraint=""
200
+ omitDetails="false"
201
+ stereotype="#{ kind }"
202
+ use3DEffect="false">
203
+ <!--y:AttributeLabel>bar
204
+ bar2</y:AttributeLabel>
205
+ <y:MethodLabel>foo()</y:MethodLabel-->
206
+ </y:UML>
207
+ </y:UMLClassNode>
208
+ </data>
209
+ <data key="d1">UMLClass</data>
210
+ </node>
211
+ EOS
212
+ end
213
+
214
+ def write_internal_node(node, class_name, kind)
215
+ @out << <<EOS
216
+ <node id="n#{ node }">
217
+ <data key="d0">
218
+ <y:UMLClassNode>
219
+ <y:Geometry height="102.0"
220
+ width="91.0"
221
+ x="4.5"
222
+ y="-1.0"/>
223
+ <y:Fill color="#CCFFCC"
224
+ transparent="false"/>
225
+ <y:BorderStyle color="#000000"
226
+ type="line"
227
+ width="1.0"/>
228
+ <y:NodeLabel alignment="center"
229
+ autoSizePolicy="content"
230
+ fontFamily="Dialog"
231
+ fontSize="13"
232
+ fontStyle="bold"
233
+ hasBackgroundColor="false"
234
+ hasLineColor="false"
235
+ height="19.310546875"
236
+ modelName="internal"
237
+ modelPosition="c"
238
+ textColor="#000000"
239
+ visible="true"
240
+ width="39.83251953125"
241
+ x="25.583740234375"
242
+ y="26.1328125">#{ class_name }
243
+ </y:NodeLabel>
244
+ <y:UML clipContent="true"
245
+ constraint=""
246
+ omitDetails="false"
247
+ stereotype="#{ kind }"
248
+ use3DEffect="false">
249
+ <!--y:AttributeLabel>bar</y:AttributeLabel>
250
+ <y:MethodLabel>foo()</y:MethodLabel-->
251
+ </y:UML>
252
+ </y:UMLClassNode>
253
+ </data>
254
+ <data key="d1">UMLClass</data>
255
+ </node>
256
+ EOS
257
+ end
258
+
259
+ def write_mixin_node(node, class_name)
260
+ @out << <<EOS
261
+ <node id="n#{ node }">
262
+ <data key="d0">
263
+ <y:UMLClassNode>
264
+ <y:Geometry height="102.0"
265
+ width="136.0"
266
+ x="-18.0"
267
+ y="349.0"/>
268
+ <y:Fill color="#FFCC99"
269
+ transparent="false"/>
270
+ <y:BorderStyle color="#000000"
271
+ type="line"
272
+ width="1.0"/>
273
+ <y:NodeLabel alignment="center"
274
+ autoSizePolicy="content"
275
+ fontFamily="Dialog"
276
+ fontSize="13"
277
+ fontStyle="bold"
278
+ hasBackgroundColor="false"
279
+ hasLineColor="false"
280
+ height="19.310546875"
281
+ modelName="internal"
282
+ modelPosition="c"
283
+ textColor="#000000"
284
+ visible="true"
285
+ width="110.818359375"
286
+ x="12.5908203125"
287
+ y="26.1328125">#{ class_name }
288
+ </y:NodeLabel>
289
+ <y:UML clipContent="true"
290
+ constraint=""
291
+ omitDetails="false"
292
+ stereotype="mixin"
293
+ use3DEffect="false">
294
+ <!--y:AttributeLabel></y:AttributeLabel>
295
+ <y:MethodLabel></y:MethodLabel-->
296
+ </y:UML>
297
+ </y:UMLClassNode>
298
+ </data>
299
+ <data key="d1">UMLClass</data>
300
+ </node>
301
+ EOS
302
+ end
303
+
304
+ def write_entity_ref_edge(edge, class_node, external_node)
305
+ @out << <<EOS
306
+ <edge id="e#{ edge }"
307
+ source="n#{ class_node }"
308
+ target="n#{ external_node }">
309
+ <data key="d2">
310
+ <y:PolyLineEdge>
311
+ <y:Path sx="0.0"
312
+ sy="0.0"
313
+ tx="0.0"
314
+ ty="0.0"/>
315
+ <y:LineStyle color="#000000"
316
+ type="line"
317
+ width="2.0"/>
318
+ <y:Arrows source="none"
319
+ target="short"/>
320
+ <y:EdgeLabel alignment="center"
321
+ distance="2.0"
322
+ fontFamily="Dialog"
323
+ fontSize="12"
324
+ fontStyle="plain"
325
+ hasBackgroundColor="false"
326
+ hasLineColor="false"
327
+ height="4.0"
328
+ modelName="six_pos"
329
+ modelPosition="tail"
330
+ preferredPlacement="anywhere"
331
+ ratio="0.5"
332
+ textColor="#000000"
333
+ visible="true"
334
+ width="4.0"
335
+ x="30.000732421875"
336
+ y="2.0"></y:EdgeLabel>
337
+ <y:BendStyle smoothed="false"/>
338
+ </y:PolyLineEdge>
339
+ </data>
340
+ <data key="d3">UMLuses</data>
341
+ </edge>
342
+ EOS
343
+ end
344
+
345
+ def write_internal_ref_edge(edge, class_node, internal_node)
346
+ @out << <<EOS
347
+ <edge id="e#{ edge }"
348
+ source="n#{ class_node }"
349
+ target="n#{ internal_node }">
350
+ <data key="d2">
351
+ <y:PolyLineEdge>
352
+ <y:Path sx="0.0"
353
+ sy="0.0"
354
+ tx="0.0"
355
+ ty="0.0"/>
356
+ <y:LineStyle color="#000000"
357
+ type="line"
358
+ width="1.0"/>
359
+ <y:Arrows source="none"
360
+ target="short"/>
361
+ <y:EdgeLabel alignment="center"
362
+ distance="2.0"
363
+ fontFamily="Dialog"
364
+ fontSize="12"
365
+ fontStyle="plain"
366
+ hasBackgroundColor="false"
367
+ hasLineColor="false"
368
+ height="4.0"
369
+ modelName="six_pos"
370
+ modelPosition="tail"
371
+ preferredPlacement="anywhere"
372
+ ratio="0.5"
373
+ textColor="#000000"
374
+ visible="true"
375
+ width="4.0"
376
+ x="2.0"
377
+ y="-38.529541015625"></y:EdgeLabel>
378
+ <y:BendStyle smoothed="false"/>
379
+ </y:PolyLineEdge>
380
+ </data>
381
+ <data key="d3">UMLuses</data>
382
+ </edge>
383
+ EOS
384
+ end
385
+
386
+ def write_mixin_ref_edge(edge, class_node, mixin_node)
387
+ @out << <<EOS
388
+ <edge id="e#{ edge }"
389
+ source="n#{ class_node }"
390
+ target="n#{ mixin_node }">
391
+ <data key="d2">
392
+ <y:PolyLineEdge>
393
+ <y:Path sx="0.0"
394
+ sy="0.0"
395
+ tx="0.0"
396
+ ty="0.0"/>
397
+ <y:LineStyle color="#000000"
398
+ type="line"
399
+ width="1.0"/>
400
+ <y:Arrows source="none"
401
+ target="white_delta"/>
402
+ <y:EdgeLabel alignment="center"
403
+ distance="2.0"
404
+ fontFamily="Dialog"
405
+ fontSize="12"
406
+ fontStyle="plain"
407
+ hasBackgroundColor="false"
408
+ hasLineColor="false"
409
+ height="4.0"
410
+ modelName="six_pos"
411
+ modelPosition="tail"
412
+ preferredPlacement="anywhere"
413
+ ratio="0.5"
414
+ textColor="#000000"
415
+ visible="true"
416
+ width="4.0"
417
+ x="2.0"
418
+ y="34.529541015625"></y:EdgeLabel>
419
+ <y:BendStyle smoothed="false"/>
420
+ </y:PolyLineEdge>
421
+ </data>
422
+ <data key="d3">UMLinherits</data>
423
+ </edge>
424
+ EOS
425
+ end
426
+
427
+ def write_graphml_start(nodes, edges)
428
+ @out << <<EOS
429
+ <?xml version="1.0" encoding="UTF-8"?>
430
+ <graphml xmlns="http://graphml.graphdrawing.org/xmlns/graphml"
431
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
432
+ xmlns:y="http://www.yworks.com/xml/graphml"
433
+ xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns/graphml http://www.yworks.com/xml/schema/graphml/1.0/ygraphml.xsd">
434
+ <key for="node"
435
+ id="d0"
436
+ yfiles.type="nodegraphics"/>
437
+ <key attr.name="description"
438
+ attr.type="string"
439
+ for="node"
440
+ id="d1"/>
441
+ <key for="edge"
442
+ id="d2"
443
+ yfiles.type="edgegraphics"/>
444
+ <key attr.name="description"
445
+ attr.type="string"
446
+ for="edge"
447
+ id="d3"/>
448
+ <key for="graphml"
449
+ id="d4"
450
+ yfiles.type="resources"/>
451
+ <graph edgedefault="directed"
452
+ id="G"
453
+ parse.edges="#{ edges }"
454
+ parse.nodes="#{ nodes }"
455
+ parse.order="free">
456
+ EOS
457
+ end
458
+
459
+ def write_graphml_end
460
+ @out << <<EOS
461
+ </graph>
462
+ <data key="d4">
463
+ <y:Resources/>
464
+ </data>
465
+ </graphml>
466
+ EOS
467
+ end
468
+
469
+ end
470
+ end