class Relationships

Public Class Methods

parse(zip_entry) click to toggle source
# File lib/ruby3mf/relationships.rb, line 3
def self.parse(zip_entry)
  relationships = []
  Log3mf.context "parsing relationships" do |l|
    begin
      # Parse Relationships XML
      doc = XmlVal.validate_parse(zip_entry)

      # Verify <Relationships><Relationship/></Relationships>
      root_element = doc.children[0]
      if root_element.name == "Relationships"
        relationship_elements = root_element.children
        if relationship_elements.size > 0
          relationship_elements.each do |node|
            if node.is_a?(Nokogiri::XML::Element) && node.name == "Relationship"
              l.error :multiple_relationships if (relationships.select { |r| r[:target] == node['Target'] && r[:type] == node['Type'] }.size > 0)
              l.error :non_unique_rel_id, :file => zip_entry.name, :id => node['Id'] if (relationships.select { |r| r[:id] == node['Id'] }.size > 0)
              relationships << {target: node['Target'], type: node['Type'], id: node['Id']}
              l.info "adding relationship: #{relationships.last.inspect}"
            else
              unless node.is_a? Nokogiri::XML::Text
                l.info "found non-Relationship node: #{node.name}"
              end
            end
          end

          if zip_entry.name=="_rels/.rels"
            l.context "Verifying StartPart" do |l|
              start_part_type = Document::MODEL_TYPE
              start_part_count = relationships.select { |r| r[:type] == start_part_type }.size
              if start_part_count != 1
                l.error :invalid_startpart_type
              end
            end
          end
        else
          l.error :dot_rels_file_no_relationship_element
        end
      else
        l.error :dot_rels_file_missing_relationships_element
      end

    rescue Nokogiri::XML::SyntaxError => e
      l.error :dot_rels_file_has_invalid_xml, e: "#{e.message}"
    end
  end
  relationships
end