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