Class: RedGrape::Serializer::GraphMLSerializer

Inherits:
Object
  • Object
show all
Defined in:
lib/red_grape/serializer/graphml_serializer.rb

Constant Summary collapse

NAMESPACES =
{
  'xmlns' => 'http://graphml.graphdrawing.org/xmlns',
  'xsi' => 'http://www.w3.org/2001/XMLSchema-instance'
}

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(graph) ⇒ GraphMLSerializer

Returns a new instance of GraphMLSerializer.



13
14
15
# File 'lib/red_grape/serializer/graphml_serializer.rb', line 13

def initialize(graph)
  @graph = graph
end

Instance Attribute Details

#graphObject (readonly)

Returns the value of attribute graph.



11
12
13
# File 'lib/red_grape/serializer/graphml_serializer.rb', line 11

def graph
  @graph
end

Instance Method Details

#load(filename) ⇒ Object



17
18
19
20
21
22
23
24
25
26
# File 'lib/red_grape/serializer/graphml_serializer.rb', line 17

def load(filename)
  if filename =~ /^<\?xml/
    parse_xml Nokogiri::XML(filename)
  else
    File.open(filename, 'r') do |file|
      parse_xml Nokogiri::XML(file)
    end
  end
  @graph
end

#nodes(xml, elm) ⇒ Object



65
66
67
# File 'lib/red_grape/serializer/graphml_serializer.rb', line 65

def nodes(xml, elm)
  xml.xpath(".//xmlns:#{elm}", NAMESPACES)
end

#parse_xml(xml) ⇒ Object

assumption: any sub-graph does not exist.



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/red_grape/serializer/graphml_serializer.rb', line 29

def parse_xml(xml)
  vertices = {}
  edges = {}
  property_descriptions = {}

  nodes(xml, 'key').each do |key_elm|
    defaults = nodes key_elm, 'default'
    default = defaults.size == 0 ? nil : defaults.first.children.to_s
    prop = PropertyDescription.new key_elm['attr.name'], key_elm['attr.type'], default
    (property_descriptions[key_elm['for']] ||= {})[key_elm['id']] = prop
  end
  @graph.instance_variable_set :@property_descriptions, property_descriptions

  nodes(xml, 'node').each do |node_elm|
    vertex = Vertex.new @graph, node_elm['id'], 
      :property_description => property_descriptions['node']
    data = nodes node_elm, 'data'
    data.each do |data_elm|
      vertex.set_property data_elm['key'], data_elm.children.first.to_s
    end
    vertices[vertex.id] = vertex
  end
  @graph.instance_variable_set :@vertices, vertices

  nodes(xml, 'edge').each do |edge_elm|
    edge = Edge.new @graph, edge_elm['id'], edge_elm['source'], edge_elm['target'], 
      edge_elm['label'], :property_description => property_descriptions['edge']
    data = nodes edge_elm, 'data'
    data.each do |data_elm|
      edge.set_property data_elm['key'], data_elm.children.first.to_s
    end
    edges[edge.id] = edge
  end
  @graph.instance_variable_set :@edges, edges
end

#saveObject



69
70
# File 'lib/red_grape/serializer/graphml_serializer.rb', line 69

def save
end