emf_jruby 0.1.5-java → 0.1.6-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.
- data/lib/emf/emf_nav.rb +56 -53
- data/lib/emf/emf_to_json.rb +67 -67
- data/lib/emf/eobject_util.rb +14 -14
- data/lib/emf/model.rb +4 -4
- data/lib/emf/stats.rb +97 -0
- data/lib/emf/xmi.rb +27 -27
- data/lib/emf_jruby.rb +13 -12
- metadata +28 -7
data/lib/emf/emf_nav.rb
CHANGED
@@ -1,54 +1,57 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
module
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
s =
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module JSON
|
4
|
+
def self.load_file(path,max_nesting=100)
|
5
|
+
parse(File.read(path),{max_nesting: max_nesting})
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
# This module permits to manipulate EObjects serialized
|
10
|
+
# as Hash
|
11
|
+
module EMF
|
12
|
+
|
13
|
+
def self.rel_conts(root)
|
14
|
+
root.keys.select {|k| k.start_with? 'relcont_'}
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.rel_non_conts(root)
|
18
|
+
root.keys.select {|k| k.start_with? 'relcont_'}
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.attrs(root)
|
22
|
+
root.keys.select {|k| k.start_with? 'attr_'}
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.values(root,feat)
|
26
|
+
raw = root[feat]
|
27
|
+
return raw if raw.is_a? Array
|
28
|
+
return [raw]
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.traverse(root,depth=0,&op)
|
32
|
+
return traverse(root['root'],depth,&op) if root and (root.key? 'root')
|
33
|
+
op.call(root,depth)
|
34
|
+
return unless root
|
35
|
+
rel_conts(root).each do |r|
|
36
|
+
if root[r].is_a? Array
|
37
|
+
root[r].each do |c|
|
38
|
+
raise "expected an object but it is a #{c.class} (relation: #{r})" unless c.is_a? Hash
|
39
|
+
traverse(c,depth+1,&op)
|
40
|
+
end
|
41
|
+
else
|
42
|
+
traverse(root[r],depth+1,&op)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.print_tree(root,depth=0)
|
48
|
+
traverse(root) do |n,d|
|
49
|
+
s = ""
|
50
|
+
d.times { s = s + " " }
|
51
|
+
s = s + n['type'] if n
|
52
|
+
s = s + '<NIL>' unless n
|
53
|
+
puts s
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
54
57
|
end
|
data/lib/emf/emf_to_json.rb
CHANGED
@@ -1,68 +1,68 @@
|
|
1
|
-
# This code permit to transform EObjects in Hash objects
|
2
|
-
# containing lists and single values
|
3
|
-
|
4
|
-
require 'emf/ast_serialization'
|
5
|
-
|
6
|
-
def qname(e_object)
|
7
|
-
e_class = e_object.eClass
|
8
|
-
e_package = e_class.ePackage
|
9
|
-
"#{e_package.nsURI}##{e_class.name}"
|
10
|
-
end
|
11
|
-
|
12
|
-
def jsonize_attr_value(map,e_object,e_attr)
|
13
|
-
value = e_object.eGet e_attr
|
14
|
-
if e_attr.upperBound==1
|
15
|
-
map["attr_#{e_attr.name}"] = value
|
16
|
-
else
|
17
|
-
l = []
|
18
|
-
(0..(value.size-1)).each do |i|
|
19
|
-
l << value.get(i)
|
20
|
-
end
|
21
|
-
map["attr_#{e_attr.name}"] = l
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def jsonize_ref_single_el(single_value,containment,adapters)
|
26
|
-
if containment
|
27
|
-
jsonize_obj(single_value,adapters)
|
28
|
-
else
|
29
|
-
serialization_id(single_value)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
def jsonize_ref_value(map,e_object,e_ref,adapters)
|
34
|
-
value = e_object.eGet e_ref
|
35
|
-
|
36
|
-
propname = "relcont_#{e_ref.name}" if e_ref.containment
|
37
|
-
propname = "relnoncont_#{e_ref.name}" if not e_ref.containment
|
38
|
-
|
39
|
-
if e_ref.upperBound==1
|
40
|
-
map[propname] = jsonize_ref_single_el(value,e_ref.containment,adapters)
|
41
|
-
else
|
42
|
-
l = []
|
43
|
-
(0..(value.size-1)).each do |i|
|
44
|
-
l << jsonize_ref_single_el(value.get(i),e_ref.containment,adapters)
|
45
|
-
end
|
46
|
-
map[propname] = l
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
def jsonize_obj(e_object, adapters={})
|
51
|
-
if not e_object
|
52
|
-
nil
|
53
|
-
else
|
54
|
-
map = { 'type' => qname(e_object), 'id' => serialization_id(e_object) }
|
55
|
-
e_class = e_object.eClass
|
56
|
-
e_class.eAllAttributes.each do |a|
|
57
|
-
jsonize_attr_value(map,e_object,a)
|
58
|
-
end
|
59
|
-
e_class.eAllReferences.each do |r|
|
60
|
-
#puts "ref #{r.name} #{r.containment}"
|
61
|
-
jsonize_ref_value(map,e_object,r,adapters)
|
62
|
-
end
|
63
|
-
if adapters.has_key? qname(e_object)
|
64
|
-
adapters[qname(e_object)].adapt(e_object,map)
|
65
|
-
end
|
66
|
-
map
|
67
|
-
end
|
1
|
+
# This code permit to transform EObjects in Hash objects
|
2
|
+
# containing lists and single values
|
3
|
+
|
4
|
+
require 'emf/ast_serialization'
|
5
|
+
|
6
|
+
def qname(e_object)
|
7
|
+
e_class = e_object.eClass
|
8
|
+
e_package = e_class.ePackage
|
9
|
+
"#{e_package.nsURI}##{e_class.name}"
|
10
|
+
end
|
11
|
+
|
12
|
+
def jsonize_attr_value(map,e_object,e_attr)
|
13
|
+
value = e_object.eGet e_attr
|
14
|
+
if e_attr.upperBound==1
|
15
|
+
map["attr_#{e_attr.name}"] = value
|
16
|
+
else
|
17
|
+
l = []
|
18
|
+
(0..(value.size-1)).each do |i|
|
19
|
+
l << value.get(i)
|
20
|
+
end
|
21
|
+
map["attr_#{e_attr.name}"] = l
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def jsonize_ref_single_el(single_value,containment,adapters)
|
26
|
+
if containment
|
27
|
+
jsonize_obj(single_value,adapters)
|
28
|
+
else
|
29
|
+
serialization_id(single_value)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def jsonize_ref_value(map,e_object,e_ref,adapters)
|
34
|
+
value = e_object.eGet e_ref
|
35
|
+
|
36
|
+
propname = "relcont_#{e_ref.name}" if e_ref.containment
|
37
|
+
propname = "relnoncont_#{e_ref.name}" if not e_ref.containment
|
38
|
+
|
39
|
+
if e_ref.upperBound==1
|
40
|
+
map[propname] = jsonize_ref_single_el(value,e_ref.containment,adapters)
|
41
|
+
else
|
42
|
+
l = []
|
43
|
+
(0..(value.size-1)).each do |i|
|
44
|
+
l << jsonize_ref_single_el(value.get(i),e_ref.containment,adapters)
|
45
|
+
end
|
46
|
+
map[propname] = l
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def jsonize_obj(e_object, adapters={})
|
51
|
+
if not e_object
|
52
|
+
nil
|
53
|
+
else
|
54
|
+
map = { 'type' => qname(e_object), 'id' => serialization_id(e_object) }
|
55
|
+
e_class = e_object.eClass
|
56
|
+
e_class.eAllAttributes.each do |a|
|
57
|
+
jsonize_attr_value(map,e_object,a)
|
58
|
+
end
|
59
|
+
e_class.eAllReferences.each do |r|
|
60
|
+
#puts "ref #{r.name} #{r.containment}"
|
61
|
+
jsonize_ref_value(map,e_object,r,adapters)
|
62
|
+
end
|
63
|
+
if adapters.has_key? qname(e_object)
|
64
|
+
adapters[qname(e_object)].adapt(e_object,map)
|
65
|
+
end
|
66
|
+
map
|
67
|
+
end
|
68
68
|
end
|
data/lib/emf/eobject_util.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
|
-
module EObjectUtil
|
2
|
-
|
3
|
-
def self.all_contents(root)
|
4
|
-
contents = []
|
5
|
-
root.getAllContents.each {|e| contents << e}
|
6
|
-
contents
|
7
|
-
end
|
8
|
-
|
9
|
-
def self.only_content_of_eclass(root,eclass)
|
10
|
-
selected = all_contents(root).select {|o| o.eClass.isSuperTypeOf eclass}
|
11
|
-
raise "One expected, #{selected.count} found" unless selected.count == 1
|
12
|
-
selected.first
|
13
|
-
end
|
14
|
-
|
1
|
+
module EObjectUtil
|
2
|
+
|
3
|
+
def self.all_contents(root)
|
4
|
+
contents = []
|
5
|
+
root.getAllContents.each {|e| contents << e}
|
6
|
+
contents
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.only_content_of_eclass(root,eclass)
|
10
|
+
selected = all_contents(root).select {|o| o.eClass.isSuperTypeOf eclass}
|
11
|
+
raise "One expected, #{selected.count} found" unless selected.count == 1
|
12
|
+
selected.first
|
13
|
+
end
|
14
|
+
|
15
15
|
end
|
data/lib/emf/model.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
class Model
|
2
|
-
attr_accessor :root
|
3
|
-
attr_accessor :name
|
4
|
-
attr_accessor :external_objects
|
1
|
+
class Model
|
2
|
+
attr_accessor :root
|
3
|
+
attr_accessor :name
|
4
|
+
attr_accessor :external_objects
|
5
5
|
end
|
data/lib/emf/stats.rb
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
require 'emf/emf_nav'
|
2
|
+
|
3
|
+
module CodeModels
|
4
|
+
|
5
|
+
class CountingMap
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@map = {}
|
9
|
+
@sum_values = 0
|
10
|
+
end
|
11
|
+
|
12
|
+
def inc(key)
|
13
|
+
@map[key] = 0 unless @map[key]
|
14
|
+
@map[key] = @map[key]+1
|
15
|
+
@sum_values += 1
|
16
|
+
end
|
17
|
+
|
18
|
+
def value(key)
|
19
|
+
@map[key] = 0 unless @map[key]
|
20
|
+
@map[key]
|
21
|
+
end
|
22
|
+
|
23
|
+
# number of times the value appeared divived by total frequency
|
24
|
+
def p(key)
|
25
|
+
@map[key].to_f/total_frequency.to_f
|
26
|
+
end
|
27
|
+
|
28
|
+
def each(&block)
|
29
|
+
@map.each(&block)
|
30
|
+
end
|
31
|
+
|
32
|
+
def total_frequency
|
33
|
+
@sum_values
|
34
|
+
end
|
35
|
+
|
36
|
+
def n_values
|
37
|
+
@map.count
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.entropy(counting_map)
|
43
|
+
s = 0.0
|
44
|
+
counting_map.each do |k,v|
|
45
|
+
p = counting_map.p(k)
|
46
|
+
s += p*Math.log(p)
|
47
|
+
end
|
48
|
+
-s
|
49
|
+
end
|
50
|
+
|
51
|
+
def idf(n,n_docs)
|
52
|
+
Math.log(n_docs.to_f/n.to_f)
|
53
|
+
end
|
54
|
+
|
55
|
+
def combine_self(arr,&op)
|
56
|
+
for i in 0..(arr.count-2)
|
57
|
+
for j in (i+1)..(arr.count-1)
|
58
|
+
op.call(arr[i],arr[j])
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def combine(arr1,arr2,&op)
|
64
|
+
arr1.each do |el1|
|
65
|
+
arr2.each {|el2| op.call(el1,el2)}
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
|
70
|
+
def self.load_models_from_dir(dir,verbose=false,max=-1)
|
71
|
+
per_type_values_map = Hash.new do |pt_hash,pt_key|
|
72
|
+
pt_hash[pt_key] = Hash.new do |pa_hash,pa_key|
|
73
|
+
pa_hash[pa_key] = CountingMap.new
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
n = 0
|
78
|
+
files = Dir[dir+'/**/*.json']
|
79
|
+
files = files[0..(max-1)] if max!=-1
|
80
|
+
files.each do |f|
|
81
|
+
n+=1
|
82
|
+
puts "...#{n}) #{f}" if verbose
|
83
|
+
model = ::JSON.load_file(f,max_nesting=500)
|
84
|
+
EMF.traverse(model) do |n|
|
85
|
+
if n
|
86
|
+
puts "\tnode: #{n['type']}" if verbose
|
87
|
+
EMF.attrs(n).each do |a|
|
88
|
+
puts "\t\tattr: #{a}" if verbose
|
89
|
+
per_type_values_map[n['type']][a].inc(n[a])
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
per_type_values_map
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
data/lib/emf/xmi.rb
CHANGED
@@ -1,28 +1,28 @@
|
|
1
|
-
# java_import org.eclipse.emf.ecore.resource.URIConverter
|
2
|
-
java_import org.eclipse.emf.ecore.resource.ResourceSet
|
3
|
-
java_import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl
|
4
|
-
java_import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl
|
5
|
-
# java_import import org.eclipse.emf.common.util.URI
|
6
|
-
java_import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl
|
7
|
-
java_import org.eclipse.emf.ecore.EObject
|
8
|
-
java_import org.eclipse.emf.ecore.resource.Resource
|
9
|
-
|
10
|
-
module EMF
|
11
|
-
|
12
|
-
def self.to_xmi_str(data)
|
13
|
-
if data.is_a? EObject
|
14
|
-
resource_set = ResourceSetImpl.new
|
15
|
-
resource = XMIResourceImpl.new
|
16
|
-
resource_set.resources.add resource
|
17
|
-
resource.contents.add e_object
|
18
|
-
to_xmi_str(resource)
|
19
|
-
elsif data.is_a? Resource
|
20
|
-
writer = java.io.StringWriter.new
|
21
|
-
data.save(writer,nil)
|
22
|
-
writer.to_s
|
23
|
-
else
|
24
|
-
raise "I do not know how to save a #{data.class}"
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
1
|
+
# java_import org.eclipse.emf.ecore.resource.URIConverter
|
2
|
+
java_import org.eclipse.emf.ecore.resource.ResourceSet
|
3
|
+
java_import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl
|
4
|
+
java_import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl
|
5
|
+
# java_import import org.eclipse.emf.common.util.URI
|
6
|
+
java_import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl
|
7
|
+
java_import org.eclipse.emf.ecore.EObject
|
8
|
+
java_import org.eclipse.emf.ecore.resource.Resource
|
9
|
+
|
10
|
+
module EMF
|
11
|
+
|
12
|
+
def self.to_xmi_str(data)
|
13
|
+
if data.is_a? EObject
|
14
|
+
resource_set = ResourceSetImpl.new
|
15
|
+
resource = XMIResourceImpl.new
|
16
|
+
resource_set.resources.add resource
|
17
|
+
resource.contents.add e_object
|
18
|
+
to_xmi_str(resource)
|
19
|
+
elsif data.is_a? Resource
|
20
|
+
writer = java.io.StringWriter.new
|
21
|
+
data.save(writer,nil)
|
22
|
+
writer.to_s
|
23
|
+
else
|
24
|
+
raise "I do not know how to save a #{data.class}"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
28
|
end
|
data/lib/emf_jruby.rb
CHANGED
@@ -1,12 +1,13 @@
|
|
1
|
-
emf_libs = $:.select{|e| e.gsub('emf_jruby').count>0}
|
2
|
-
raise "One lib containing 'emf_jruby' expected, found: #{emf_libs}" unless emf_libs.count==1
|
3
|
-
|
4
|
-
Dir[emf_libs[0]+"/jars/*.jar"].each do |jar|
|
5
|
-
require jar
|
6
|
-
end
|
7
|
-
|
8
|
-
require 'emf/ast_serialization'
|
9
|
-
require 'emf/emf_to_json'
|
10
|
-
require 'emf/eobject_util'
|
11
|
-
require 'emf/model'
|
12
|
-
require 'emf/xmi'
|
1
|
+
emf_libs = $:.select{|e| e.gsub('emf_jruby').count>0}
|
2
|
+
raise "One lib containing 'emf_jruby' expected, found: #{emf_libs}" unless emf_libs.count==1
|
3
|
+
|
4
|
+
Dir[emf_libs[0]+"/jars/*.jar"].each do |jar|
|
5
|
+
require jar
|
6
|
+
end
|
7
|
+
|
8
|
+
require 'emf/ast_serialization'
|
9
|
+
require 'emf/emf_to_json'
|
10
|
+
require 'emf/eobject_util'
|
11
|
+
require 'emf/model'
|
12
|
+
require 'emf/xmi'
|
13
|
+
require 'emf/stats'
|
metadata
CHANGED
@@ -2,15 +2,33 @@
|
|
2
2
|
name: emf_jruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.1.
|
5
|
+
version: 0.1.6
|
6
6
|
platform: java
|
7
7
|
authors:
|
8
8
|
- Federico Tomassetti
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-08-
|
13
|
-
dependencies:
|
12
|
+
date: 2013-08-02 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: json
|
16
|
+
version_requirements: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ">="
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: !binary |-
|
21
|
+
MA==
|
22
|
+
none: false
|
23
|
+
requirement: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: !binary |-
|
28
|
+
MA==
|
29
|
+
none: false
|
30
|
+
prerelease: false
|
31
|
+
type: :runtime
|
14
32
|
description: EMF support for JRuby. Support for loading and saving models in JSon.
|
15
33
|
email: f.tomassetti@gmail.com
|
16
34
|
executables: []
|
@@ -24,6 +42,7 @@ files:
|
|
24
42
|
- lib/emf/eobject_util.rb
|
25
43
|
- lib/emf/model.rb
|
26
44
|
- lib/emf/xmi.rb
|
45
|
+
- lib/emf/stats.rb
|
27
46
|
- lib/jars/org.antlr.runtime_3.0.0.v200803061811.jar
|
28
47
|
- lib/jars/org.eclipse.emf.common_2.8.0.v20130125-0546.jar
|
29
48
|
- lib/jars/org.eclipse.emf.ecore.xmi_2.8.1.v20130125-0546.jar
|
@@ -36,15 +55,17 @@ require_paths:
|
|
36
55
|
- lib
|
37
56
|
required_ruby_version: !ruby/object:Gem::Requirement
|
38
57
|
requirements:
|
39
|
-
- -
|
58
|
+
- - ">="
|
40
59
|
- !ruby/object:Gem::Version
|
41
|
-
version:
|
60
|
+
version: !binary |-
|
61
|
+
MA==
|
42
62
|
none: false
|
43
63
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
44
64
|
requirements:
|
45
|
-
- -
|
65
|
+
- - ">="
|
46
66
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
67
|
+
version: !binary |-
|
68
|
+
MA==
|
48
69
|
none: false
|
49
70
|
requirements: []
|
50
71
|
rubyforge_project:
|