codemodels 0.2.2-java

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.
@@ -0,0 +1,81 @@
1
+ # This module permits to manipulate Objects serialized
2
+ # as Hash
3
+
4
+ module CodeModels
5
+
6
+ module QuerySerialized
7
+
8
+ def self.rel_conts(root)
9
+ root.keys.select {|k| k.start_with? 'relcont_'}
10
+ end
11
+
12
+ def self.rel_non_conts(root)
13
+ root.keys.select {|k| k.start_with? 'relnoncont_'}
14
+ end
15
+
16
+ def self.attrs(root)
17
+ root.keys.select {|k| k.start_with? 'attr_'}
18
+ end
19
+
20
+ def self.print_tree(root,depth=0)
21
+ traverse(root) do |n,d|
22
+ s = ""
23
+ d.times { s = s + " " }
24
+ s = s + n['type'] if n
25
+ s = s + '<NIL>' unless n
26
+ puts s
27
+ end
28
+ end
29
+
30
+ def self.values(root,feat)
31
+ raw = root[feat]
32
+ return [] if raw==nil
33
+ return raw if raw.is_a? Array
34
+ return [raw]
35
+ end
36
+
37
+ def self.traverse(root,depth=0,&op)
38
+ return traverse(root['root'],depth,&op) if root and (root.key? 'root')
39
+ op.call(root,depth)
40
+ return unless root
41
+ rel_conts(root).each do |r|
42
+ if root[r].is_a? Array
43
+ root[r].each do |c|
44
+ raise "expected an object but it is a #{c.class} (relation: #{r})" unless c.is_a? Hash
45
+ traverse(c,depth+1,&op)
46
+ end
47
+ else
48
+ traverse(root[r],depth+1,&op)
49
+ end
50
+ end
51
+ end
52
+
53
+ # the set of values appearing in the object and its children
54
+ def self.collect_values(el)
55
+ values = Set.new
56
+ rel_conts(el).each do |r|
57
+ values(el,r).each {|c| values.merge(collect_values(c))}
58
+ end
59
+ attrs(el).each do |a|
60
+ values(el,a).each {|v| values.add(v)}
61
+ end
62
+ values
63
+ end
64
+
65
+ # a counting map values appearing in the object and its children
66
+ def self.collect_values_with_count(el)
67
+ values = Hash.new {|h,k| h[k]=0}
68
+ rel_conts(el).each do |r|
69
+ values(el,r).each do |ch|
70
+ collect_values_with_count(ch).each {|v,count| values[v]+=count}
71
+ end
72
+ end
73
+ attrs(el).each do |a|
74
+ values(el,a).each {|v| values[v]+=1 }
75
+ end
76
+ values
77
+ end
78
+
79
+ end
80
+
81
+ end
@@ -0,0 +1,186 @@
1
+ # Extensions to RGen objects
2
+
3
+ require 'rgen/metamodel_builder'
4
+
5
+ class RGen::MetamodelBuilder::MMBase
6
+
7
+ module ClassAddOn
8
+
9
+ def build(values={})
10
+ instance = self.new
11
+ if values.is_a? Hash
12
+ values.each do |k,v|
13
+ attribute = self.ecore.eAllAttributes.find {|x| x.name==k.to_s}
14
+ reference = self.ecore.eAllReferences.find {|x| x.name==k.to_s}
15
+ raise EMF::UnexistingFeature.new(k.to_s) unless (attribute or reference)
16
+ setter = (k.to_s+'=').to_sym
17
+ instance.send setter, v
18
+ end
19
+ else
20
+ has_dynamic = false
21
+ self.ecore.eAllAttributes.each {|a| has_dynamic|=a.name=='dynamic'}
22
+ d = 0
23
+ d = 1 if has_dynamic
24
+
25
+ raise EMF::SingleAttributeRequired.new(self.ecore.name,self.ecore.eAllAttributes) if self.ecore.eAllAttributes.count!=1+d
26
+ attribute = self.ecore.eAllAttributes[0]
27
+ set_attr(instance,attribute,values)
28
+ end
29
+ instance
30
+ end
31
+
32
+ private
33
+
34
+ def set_attr(instance,attribute,value)
35
+ setter = (attribute.name+'=').to_sym
36
+ instance.send setter, value
37
+ end
38
+ end
39
+
40
+ module SingletonAddOn
41
+
42
+ # It does not check references, it is needed to avoid infinite recursion
43
+ def shallow_eql?(other)
44
+ return false if other==nil
45
+ return false unless self.class==other.class
46
+ self.class.ecore.eAllAttributes.each do |attrib|
47
+ raise "Attrib <nil> for class #{self.class.ecore.name}" unless attrib
48
+ if attrib.name != 'dynamic' # I have to understand this...
49
+ self_value = self.get(attrib)
50
+ other_value = other.get(attrib)
51
+ #puts "returning false on #{attrib.name}" unless self_value.eql?(other_value)
52
+ return false unless self_value == other_value
53
+ end
54
+ end
55
+ true
56
+ end
57
+
58
+ def eql?(other)
59
+ # it should ignore relations which has as opposite a containement
60
+ return false unless self.shallow_eql?(other)
61
+ self.class.ecore.eAllReferences.each do |ref|
62
+ self_value = self.get(ref)
63
+ other_value = other.get(ref)
64
+ to_ignore = ref.getEOpposite and ref.getEOpposite.containment
65
+ unless to_ignore
66
+ if ref.containment
67
+ return false unless self_value == other_value
68
+ else
69
+ if (self_value.is_a? Array) or (other_value.is_a? Array)
70
+ return false unless self_value.count==other_value.count
71
+ for i in 0..(self_value.count-1)
72
+ unless self_value[i].shallow_eql?(other_value[i])
73
+ return false
74
+ end
75
+ end
76
+ else
77
+ if self_value==nil
78
+ return false unless other_value==nil
79
+ else
80
+ return false unless self_value.shallow_eql?(other_value)
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
86
+ true
87
+ end
88
+
89
+ def ==(other)
90
+ eql? other
91
+ end
92
+
93
+ def get(attr_or_ref)
94
+ getter = (attr_or_ref.name).to_sym
95
+ send getter
96
+ end
97
+
98
+ def all_children
99
+ arr = []
100
+ ecore = self.class.ecore
101
+ ecore.eAllReferences.select {|r| r.containment}.each do |ref|
102
+ res = self.send(ref.name.to_sym)
103
+ if ref.many
104
+ d = arr.count
105
+ res.each do |el|
106
+ arr << el unless res==nil
107
+ end
108
+ elsif res!=nil
109
+ d = arr.count
110
+ arr << res
111
+ end
112
+ end
113
+ arr
114
+ end
115
+
116
+ def all_children_deep
117
+ arr = []
118
+ all_children.each do |c|
119
+ arr << c
120
+ c.all_children_deep.each do |cc|
121
+ arr << cc
122
+ end
123
+ end
124
+ arr
125
+ end
126
+
127
+ def traverse(&op)
128
+ op.call(self)
129
+ all_children_deep.each do |c|
130
+ op.call(c)
131
+ end
132
+ end
133
+
134
+ def collect_values_with_count
135
+ values = Hash.new {|h,k| h[k]=0}
136
+ self.class.ecore.eAllAttributes.each do |a|
137
+ v = self.send(:"#{a.name}")
138
+ if v!=nil
139
+ if a.many
140
+ v.each {|el| values[el]+=1}
141
+ else
142
+ values[v]+=1
143
+ end
144
+ end
145
+ end
146
+ values
147
+ end
148
+
149
+ def collect_values_with_count_subtree
150
+ values = collect_values_with_count
151
+ all_children_deep.each do |c|
152
+ c.collect_values_with_count.each do |k,v|
153
+ values[k]+=v
154
+ end
155
+ end
156
+ values
157
+ end
158
+
159
+ def all_children_of_type(type)
160
+ all_children.select {|c| c and c.is_a?(type)}
161
+ end
162
+
163
+ def all_children_deep_of_type(type)
164
+ all_children_deep.select {|c| c and c.is_a?(type)}
165
+ end
166
+
167
+ def only_child_of_type(type)
168
+ selected = all_children_of_type(type)
169
+ raise "Exactly one child of type #{type} expected, #{selected.count} found on #{self}" unless selected.count==1
170
+ selected[0]
171
+ end
172
+
173
+ def only_child_deep_of_type(type)
174
+ selected = all_children_deep_of_type(type)
175
+ raise "Exactly one child of type #{type} expected, #{selected.count} found on #{self}" unless selected.count==1
176
+ selected[0]
177
+ end
178
+
179
+ end
180
+
181
+ class << self
182
+ include ClassAddOn
183
+ end
184
+
185
+ include SingletonAddOn
186
+ end
@@ -0,0 +1,142 @@
1
+ # This code permit to transform RGen-Objects in Hash objects
2
+ # containing lists and single values
3
+
4
+ require 'json'
5
+ require 'fileutils'
6
+ require 'rgen/metamodel_builder'
7
+
8
+ module CodeModels
9
+ module Serialization
10
+
11
+ module SerializationFunctionalities
12
+
13
+ # It could be a simple hash with a block passed to the
14
+ # constructor...
15
+ class SerializationMemory
16
+
17
+ def initialize
18
+ @next_id = 1
19
+ @id_map = {}
20
+ end
21
+
22
+ def id(rgen_object)
23
+ unless @id_map[rgen_object]
24
+ @id_map[rgen_object] = @next_id
25
+ @next_id += 1
26
+ end
27
+ @id_map[rgen_object]
28
+ end
29
+
30
+ end
31
+
32
+ def to_json(serialization_memory=SerializationMemory.new,adapters={},with_source_info=true)
33
+ e_object = self
34
+ map = { 'type' => qname, 'id' => serialization_memory.id(e_object) }
35
+ if with_source_info
36
+ if self.respond_to?(:source) && self.source
37
+ source_map = {}
38
+ if self.source.begin_pos
39
+ source_map['begin_pos'] = {'line'=> self.source.begin_pos.line, 'column'=>self.source.begin_pos.column}
40
+ end
41
+ if self.source.end_pos
42
+ source_map['end_pos'] = {'line'=> self.source.end_pos.line, 'column'=>self.source.end_pos.column}
43
+ end
44
+ map['source'] = source_map
45
+ end
46
+ end
47
+ e_class = e_object.class.ecore
48
+ e_class.eAllAttributes.each do |a|
49
+ jsonize_attr_value(map,a)
50
+ end
51
+ e_class.eAllReferences.each do |r|
52
+ id = jsonize_ref_value(map,r,adapters,serialization_memory)
53
+ end
54
+ if adapters.has_key? qname
55
+ adapters[qname].adapt(self,map)
56
+ end
57
+ map
58
+ end
59
+
60
+ private
61
+
62
+ def qname
63
+ self.class.to_s
64
+ end
65
+
66
+ def jsonize_attr_value(map,e_attr)
67
+ value = self.send(e_attr.name.to_sym)
68
+ if e_attr.upperBound==1
69
+ map["attr_#{e_attr.name}"] = value
70
+ else
71
+ l = []
72
+ value.each do |e|
73
+ l << e
74
+ end
75
+ map["attr_#{e_attr.name}"] = l
76
+ end
77
+ end
78
+
79
+ def jsonize_ref_value(map,e_ref,adapters,serialization_memory)
80
+ value = self.send e_ref.name.to_sym
81
+
82
+ propname = "relcont_#{e_ref.name}" if e_ref.containment
83
+ propname = "relnoncont_#{e_ref.name}" if not e_ref.containment
84
+
85
+ if e_ref.upperBound==1
86
+ map[propname] = jsonize_ref_single_el(value,e_ref.containment,adapters,serialization_memory)
87
+ else
88
+ l = []
89
+ (0...(value.size)).each do |i|
90
+ l << jsonize_ref_single_el(value.at(i),e_ref.containment,adapters,serialization_memory)
91
+ end
92
+ map[propname] = l
93
+ end
94
+ end
95
+
96
+ def jsonize_ref_single_el(single_value,containment,adapters,serialization_memory)
97
+ if containment
98
+ single_value.to_json(serialization_memory,adapters)
99
+ else
100
+ serialization_memory.id(single_value)
101
+ end
102
+ end
103
+
104
+ end
105
+
106
+ class ::RGen::MetamodelBuilder::MMBase
107
+ include SerializationFunctionalities
108
+ end
109
+
110
+ def self.load_file(path,max_nesting=500)
111
+ JSON.parse(File.read(path),{max_nesting: max_nesting})
112
+ end
113
+
114
+ def self.save_model(model,model_path, max_nesting=500)
115
+ dir = File.dirname(model_path)
116
+ FileUtils.mkdir_p(dir)
117
+
118
+ File.open(model_path, 'w') do |file|
119
+ file.write(JSON.pretty_generate(model, :max_nesting => max_nesting))
120
+ end
121
+ end
122
+
123
+ def self.rgenobject_to_model(root,adapters={})
124
+ model = {}
125
+ external_elements = []
126
+
127
+ sm = SerializationFunctionalities::SerializationMemory.new
128
+ model['root'] = root.to_json(sm,adapters)
129
+ model['external_elements'] = []
130
+ external_elements.each do |ee|
131
+ model['external_elements'] << ee.to_json(sm,adapters)
132
+ end
133
+ model
134
+ end
135
+
136
+ def self.save_as_model(root,model_path)
137
+ model = to_model(root)
138
+ save_model(model,model_path)
139
+ end
140
+
141
+ end # module
142
+ end # module
@@ -0,0 +1,3 @@
1
+ module CodeModels
2
+ VERSION = "0.2.2"
3
+ end
data/lib/codemodels.rb ADDED
@@ -0,0 +1,5 @@
1
+ curr_dir = File.dirname(__FILE__)
2
+
3
+ Dir[curr_dir+"/codemodels/*.rb"].each do |rb|
4
+ require rb
5
+ end