class RGen::ECore::ECoreToJson
ECoreToJson can turn ECore models into their JSON metamodel representations
Public Class Methods
new()
click to toggle source
# File lib/rgen/ecore/ecore_to_json.rb, line 12 def initialize end
Public Instance Methods
eannotation(e)
click to toggle source
# File lib/rgen/ecore/ecore_to_json.rb, line 117 def eannotation(e) merge(emodelelement(e), { :_class_ref => 'RGen.ECore.EAnnotation', :source => e.source, :details => e.details.map do |d| merge({}, { :_class_ref => 'RGen.ECore.EStringToStringMapEntry', :key => d.key, :value => d.value }) end }) end
eattribute(attr)
click to toggle source
# File lib/rgen/ecore/ecore_to_json.rb, line 152 def eattribute(attr) merge(estructuralfeature(attr), { :_class_ref => 'RGen.ECore.EAttribute', :iD => attr.iD }) end
eclass(_class)
click to toggle source
# File lib/rgen/ecore/ecore_to_json.rb, line 81 def eclass(_class) merge(eclassifier(_class), { :_class_ref => 'RGen.ECore.EClass', :abstract => _class.abstract, :interface => _class.interface, :eStructuralFeatures => _class.eStructuralFeatures.map do |sf| if sf.is_a?(RGen::ECore::EReference) ereference(sf) else eattribute(sf) end end, :eSuperTypes => _class.eSuperTypes.map { |st| {:_ref => ref_id(st)} } }) end
eclassifier(classifier)
click to toggle source
# File lib/rgen/ecore/ecore_to_json.rb, line 75 def eclassifier(classifier) enamedelement(classifier).merge({ # omit :instanceClassName => classifier.instanceClassName }) end
ecore_datatypes()
click to toggle source
# File lib/rgen/ecore/ecore_to_json.rb, line 32 def ecore_datatypes [RGen::ECore::EString, RGen::ECore::EInt, RGen::ECore::ELong, RGen::ECore::EBoolean, RGen::ECore::EFloat, RGen::ECore::ERubyObject, RGen::ECore::EJavaObject, RGen::ECore::ERubyClass, RGen::ECore::EJavaClass] .map {|dt| edatatype(dt)} end
edatatype(_datatype)
click to toggle source
# File lib/rgen/ecore/ecore_to_json.rb, line 97 def edatatype(_datatype) merge(eclassifier(_datatype), { :_class_ref => 'RGen.ECore.EDataType', :serializable => _datatype.serializable, :instanceClassName => _datatype.instanceClassName }) end
eenum(enum)
click to toggle source
# File lib/rgen/ecore/ecore_to_json.rb, line 105 def eenum(enum) merge(edatatype(enum), { :_class_ref => 'RGen.ECore.EEnum', :eLiterals => enum.eLiterals.map do |l| merge(enamedelement(l), { :_class_ref => 'RGen.ECore.EEnumLiteral', :value => l.value, }) end }) end
emodelelement(me)
click to toggle source
# File lib/rgen/ecore/ecore_to_json.rb, line 46 def emodelelement(me) { :eAnnotations => me.eAnnotations.map { |e| eannotation(e) } } end
enamedelement(ne)
click to toggle source
# File lib/rgen/ecore/ecore_to_json.rb, line 53 def enamedelement(ne) merge(emodelelement(ne), {:name => ne.name}) end
epackage(package)
click to toggle source
# File lib/rgen/ecore/ecore_to_json.rb, line 57 def epackage(package) merge(enamedelement(package), { :_class_ref => 'RGen.ECore.EPackage', :eClassifiers => package.eClassifiers.map do |classifier| if classifier.is_a?(RGen::ECore::EClass) eclass(classifier) elsif classifier.is_a?(RGen::ECore::EEnum) eenum(classifier) else edatatype(classifier) end end, :eSubpackages => package.eSubpackages.map { |sp| epackage(sp) }, :nsURI => package.nsURI, :nsPrefix => package.nsPrefix }) end
epackage_to_json(package)
click to toggle source
# File lib/rgen/ecore/ecore_to_json.rb, line 28 def epackage_to_json(package) epackage(package) end
epackage_to_json_pretty_string(package, append = [])
click to toggle source
# File lib/rgen/ecore/ecore_to_json.rb, line 38 def epackage_to_json_pretty_string(package, append = []) JSON.pretty_generate([epackage_to_json(package)] + append) end
epackage_to_json_string(package, append = [])
click to toggle source
# File lib/rgen/ecore/ecore_to_json.rb, line 42 def epackage_to_json_string(package, append = []) JSON.generate([epackage_to_json(package)] + append) end
ereference(ref)
click to toggle source
# File lib/rgen/ecore/ecore_to_json.rb, line 159 def ereference(ref) merge(estructuralfeature(ref), { :_class_ref => 'RGen.ECore.EReference', :containment => ref.containment, :resolveProxies => ref.resolveProxies, :eOpposite => ref.eOpposite ? {:_ref => "#{ref_id(ref.eOpposite.eContainer)}.#{ref.eOpposite.name}"} : nil }) end
estructuralfeature(sf)
click to toggle source
# File lib/rgen/ecore/ecore_to_json.rb, line 141 def estructuralfeature(sf) merge(etypedelement(sf), { :changeable => sf.changeable, :volatile => sf.volatile, :transient => sf.transient, :defaultValueLiteral => sf.defaultValueLiteral, :unsettable => sf.unsettable, :derived => sf.derived, }) end
etypedelement(te)
click to toggle source
# File lib/rgen/ecore/ecore_to_json.rb, line 131 def etypedelement(te) merge(enamedelement(te), { :ordered => te.ordered, :unique => te.unique, :lowerBound => te.lowerBound, :upperBound => te.upperBound, :eType => {:_ref => te.eType ? ref_id(te.eType) : nil} }) end
merge(hash, values)
click to toggle source
# File lib/rgen/ecore/ecore_to_json.rb, line 178 def merge(hash, values) values.each { |k, v| hash[k] = v unless v.nil? } hash end
ref_id(obj)
click to toggle source
# File lib/rgen/ecore/ecore_to_json.rb, line 168 def ref_id(obj) res = ref_parts(obj) res.join('.') end
ref_parts(obj)
click to toggle source
# File lib/rgen/ecore/ecore_to_json.rb, line 173 def ref_parts(obj) return [obj.name] unless obj.andand.eContainer ref_parts(obj.eContainer) << obj.name end
root_elements_to_json_string(root_elements)
click to toggle source
# File lib/rgen/ecore/ecore_to_json.rb, line 16 def root_elements_to_json_string(root_elements) JSON.pretty_generate(root_elements.map do |el| if el.is_a?(RGen::ECore::EPackage) epackage(el) elsif el.is_a?(RGen::ECore::EClass) eclass(el) else raise "Not implemented for #{el}" end end) end