Class: RGen::Serializer::XMI11Serializer

Inherits:
XMLSerializer show all
Defined in:
lib/rgen/serializer/xmi11_serializer.rb

Constant Summary

Constants inherited from XMLSerializer

RGen::Serializer::XMLSerializer::INDENT_SPACE

Instance Method Summary collapse

Methods inherited from XMLSerializer

#endTag, #startTag, #writeText

Constructor Details

#initialize(file) ⇒ XMI11Serializer

Returns a new instance of XMI11Serializer.



9
10
11
12
13
# File 'lib/rgen/serializer/xmi11_serializer.rb', line 9

def initialize(file)
  super
  @namespacePrefix = ""
  @contentLevelElements = []
end

Instance Method Details

#attributeValues(element) ⇒ Object



80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/rgen/serializer/xmi11_serializer.rb', line 80

def attributeValues(element)
  result = [["xmi.id", xmiId(element)]]
  eAllAttributes(element).select{|a| !a.derived}.each do |a|
    val = element.getGeneric(a.name)
    result << [a.name, val] unless val.nil? || val == ""
  end
  eAllReferences(element).each do |r|
    next if r.derived
    next if r.containment
    next if r.eOpposite && r.eOpposite.containment && xmiLevel(element).nil?
    next if r.eOpposite && r.many && !r.eOpposite.many
    targetElements = element.getGenericAsArray(r.name)
    targetElements.compact!
    val = targetElements.collect{|te| xmiId(te)}.compact.join(' ')
    result << [r.name, val] unless val == ""
  end
  result  
end

#serialize(rootElement, headerInfo = nil) ⇒ Object



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/rgen/serializer/xmi11_serializer.rb', line 21

def serialize(rootElement, headerInfo=nil)
  attrs = []
  attrs << ['xmi.version', "1.1"]
  attrs << ['xmlns:'+@namespaceShortcut, @namespaceUrl] if @namespaceUrl
  attrs << ['timestamp', Time.now.to_s]
  startTag("XMI", attrs)
  if headerInfo
    startTag("XMI.header")
    writeHeaderInfo(headerInfo)
    endTag("XMI.header")
  end
  startTag("XMI.content")
  @contentLevelElements = []
  writeElement(rootElement)
  # write remaining toplevel elements, each of which could have
  # more toplevel elements as childs
  while @contentLevelElements.size > 0
    writeElement(@contentLevelElements.shift)
  end
  endTag("XMI.content") 
  endTag("XMI") 
end

#setNamespace(shortcut, url) ⇒ Object



15
16
17
18
19
# File 'lib/rgen/serializer/xmi11_serializer.rb', line 15

def setNamespace(shortcut, url)
  @namespaceShortcut = shortcut
  @namespaceUrl = url
  @namespacePrefix = shortcut+":"
end

#writeElement(element) ⇒ Object



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/rgen/serializer/xmi11_serializer.rb', line 57

def writeElement(element)
  tag = @namespacePrefix + element.class.ecore.name
  attrs = attributeValues(element)
  startTag(tag, attrs)
  containmentReferences(element).each do |r|
    roletag = @namespacePrefix + r.eContainingClass.name + "." + r.name
    targets = element.getGeneric(r.name)
    targets = [ targets ] unless targets.is_a?(Array)
    targets.compact!
    next if targets.empty?
    startTag(roletag)
    targets.each do |t|
      if xmiLevel(t) == :content
        @contentLevelElements << t
      else
        writeElement(t)
      end
    end
    endTag(roletag)
  end
  endTag(tag)
end

#writeHeaderInfo(hash) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/rgen/serializer/xmi11_serializer.rb', line 44

def writeHeaderInfo(hash)
  hash.each_pair do |k,v|
    tag = "XMI." + k.to_s
    startTag(tag)
    if v.is_a?(Hash)
      writeHeaderInfo(v)
    else
      writeText(v.to_s)
    end
    endTag(tag)
  end
end

#xmiId(element) ⇒ Object



99
100
101
102
103
104
105
# File 'lib/rgen/serializer/xmi11_serializer.rb', line 99

def xmiId(element)
  if element.respond_to?(:_xmi_id) && element._xmi_id
    element._xmi_id.to_s
  else
    element.object_id.to_s
  end
end

#xmiLevel(element) ⇒ Object



107
108
109
110
# File 'lib/rgen/serializer/xmi11_serializer.rb', line 107

def xmiLevel(element)
  return nil unless element.respond_to?(:_xmi_level) 
  element._xmi_level
end