Class: ActiveFedora::RDFXMLWriter

Inherits:
RDF::RDFXML::Writer
  • Object
show all
Defined in:
lib/active_fedora/rdf_xml_writer.rb

Overview

an rdf:type assertion is present; this is incompatible with Fedora

Instance Method Summary collapse

Instance Method Details

#subject(subject, parent_node) ⇒ Object

Raises:

  • (RDF::WriterError)


11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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
64
65
66
67
# File 'lib/active_fedora/rdf_xml_writer.rb', line 11

def subject(subject, parent_node)
  node = nil
  
  raise RDF::WriterError, "Illegal use of subject #{subject.inspect}, not supported in RDF/XML" unless subject.resource?
  
  if !is_done?(subject)
    subject_done(subject)
    properties = @graph.properties(subject)
    add_debug {"subject: #{subject.inspect}, props: #{properties.inspect}"}

    @graph.query(:subject => subject).each do |st|
      raise RDF::WriterError, "Illegal use of predicate #{st.predicate.inspect}, not supported in RDF/XML" unless st.predicate.uri?
    end

    prop_list = order_properties(properties)
    add_debug {"=> property order: #{prop_list.to_sentence}"}

    qname = "rdf:Description"
    prefixes[:rdf] = RDF.to_uri

    node = Nokogiri::XML::Element.new(qname, parent_node.document)
    
    if subject.is_a?(RDF::Node)
      # Only need nodeID if it's referenced elsewhere
      if ref_count(subject) > (@depth == 0 ? 0 : 1)
        node["rdf:nodeID"] = subject.id
      else
        node.add_child(Nokogiri::XML::Comment.new(node.document, "Serialization for #{subject}")) if RDF::RDFXML::debug?
      end
    else
      node["rdf:about"] = relativize(subject)
    end

    prop_list.each do |prop|
      prop_ref = RDF::URI.intern(prop)
      
      properties[prop].each do |object|
        raise RDF::WriterError, "Illegal use of object #{object.inspect}, not supported in RDF/XML" unless object.resource? || object.literal?

        @depth += 1
        predicate(prop_ref, object, node, properties[prop].length == 1)
        @depth -= 1
      end
    end
  elsif @force_RDF_about.include?(subject)
    add_debug {"subject: #{subject.inspect}, force about"}
    node = Nokogiri::XML::Element.new("rdf:Description", parent_node.document)
    if subject.is_a?(RDF::Node)
      node["rdf:nodeID"] = subject.id
    else
      node["rdf:about"] = relativize(subject)
    end
  end
  @force_RDF_about.delete(subject)

  parent_node.add_child(node) if node
end