Class: ActiveFedora::RelsExtDatastream

Inherits:
Datastream
  • Object
show all
Includes:
Solrizer::FieldNameMapper
Defined in:
lib/active_fedora/rels_ext_datastream.rb

Instance Attribute Summary collapse

Attributes inherited from Datastream

#digital_object, #fields, #last_modified

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Datastream

#create, #dirty, #dirty=, #dirty?, #initialize, #inspect, #new_object?, #profile_from_hash, #save, #solrize_profile, #to_param, #to_solr, #validate_content_present

Constructor Details

This class inherits a constructor from ActiveFedora::Datastream

Instance Attribute Details

#modelObject

Returns the value of attribute model.



10
11
12
# File 'lib/active_fedora/rels_ext_datastream.rb', line 10

def model
  @model
end

Class Method Details

.default_attributesObject



12
13
14
# File 'lib/active_fedora/rels_ext_datastream.rb', line 12

def self.default_attributes
  super.merge(:mimeType => 'application/rdf+xml')
end

.ensure_predicates_exist!(xml) ⇒ Object



84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/active_fedora/rels_ext_datastream.rb', line 84

def self.ensure_predicates_exist!(xml)
  statements = Nokogiri::XML(xml).xpath('//rdf:Description/*', 'rdf' => 'http://www.w3.org/1999/02/22-rdf-syntax-ns#')
  predicates = statements.collect { |e| { :prefix => e.namespace.prefix, :uri => e.namespace.href, :predicate => e.name } }.uniq
  predicates.each do |pred|
    unless Predicates.predicate_mappings[pred[:uri]]
      Predicates.predicate_mappings[pred[:uri]] = {}
      if pred[:prefix] and not Predicates.predicate_namespaces.has_value?(pred[:uri])
        Predicates.predicate_namespaces[pred[:prefix].to_sym] = pred[:uri]
      end
    end
    ns = Predicates.predicate_mappings[pred[:uri]]
    unless ns.invert[pred[:predicate]]
      ns["#{pred[:prefix]}_#{pred[:predicate].underscore}".to_sym] = pred[:predicate]
    end
  end
end

.from_xml(xml, tmpl) ⇒ Object

Populate a RelsExtDatastream object based on the “datastream” content Assumes that the datastream contains RDF XML from a Fedora RELS-EXT datastream

Parameters:



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/active_fedora/rels_ext_datastream.rb', line 54

def self.from_xml(xml, tmpl) 
  if (xml.nil?)
    ### maybe put the template here?
  else
    ensure_predicates_exist!(xml)
    RDF::RDFXML::Reader.new(xml) do |reader|
      reader.each_statement do |statement|
        literal = statement.object.kind_of?(RDF::Literal)
        predicate = self.short_predicate(statement.predicate)
        object = literal ? statement.object.value : statement.object.to_str
        tmpl.model.add_relationship(predicate, object, literal)
      end
    end
    tmpl.relationships_are_not_dirty!
    tmpl.changed_attributes.clear
    tmpl
  end
end

.short_predicate(predicate) ⇒ Object



101
102
103
104
105
106
107
108
109
110
111
# File 'lib/active_fedora/rels_ext_datastream.rb', line 101

def self.short_predicate(predicate)
  # for this regex to short-circuit correctly, namespaces must be sorted into descending order by length
  if match = /^(#{Predicates.predicate_mappings.keys.sort.reverse.join('|')})(.+)$/.match(predicate.to_str)
    namespace = match[1]
    predicate = match[2]
    pred = Predicates.predicate_mappings[namespace].invert[predicate]
    pred
  else
    raise "Unable to parse predicate: #{predicate}"
  end
end

Instance Method Details

#changed?Boolean

Returns:

  • (Boolean)


16
17
18
# File 'lib/active_fedora/rels_ext_datastream.rb', line 16

def changed?
  relationships_are_dirty? or super
end

#from_solr(solr_doc) ⇒ Object

** EXPERIMENTAL **

This is utilized by ActiveFedora::Base.load_instance_from_solr to load the relationships hash using the Solr document passed in instead of from the RELS-EXT datastream in Fedora. Utilizes solr_name method (provided by Solrizer::FieldNameMapper) to map solr key to relationship predicate.

Warning

Solr must be synchronized with RELS-EXT data in Fedora.


123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# File 'lib/active_fedora/rels_ext_datastream.rb', line 123

def from_solr(solr_doc)
  #cycle through all possible predicates
  model.relationships_loaded = true
  Predicates.predicate_mappings.each_pair do |namespace,predicates|
    predicates.keys.each do |predicate|
      predicate_symbol = ActiveFedora::SolrService.solr_name(predicate, :symbol)
      value = (solr_doc[predicate_symbol].nil? ? solr_doc[predicate_symbol.to_s]: solr_doc[predicate_symbol]) 
      unless value.nil? 
        if value.is_a? Array
          value.each do |obj|
            model.add_relationship(predicate, obj)
          end
        else
          model.add_relationship(predicate, value)
        end
      end
    end
  end
  @load_from_solr = true
end

#metadata?Boolean

Returns:

  • (Boolean)


20
21
22
# File 'lib/active_fedora/rels_ext_datastream.rb', line 20

def metadata?
  true
end

#relationshipsObject



41
42
43
# File 'lib/active_fedora/rels_ext_datastream.rb', line 41

def relationships
  model.relationships
end

#relationships_are_dirty!Object



33
34
35
# File 'lib/active_fedora/rels_ext_datastream.rb', line 33

def relationships_are_dirty!
  model.relationships_are_dirty = true
end

#relationships_are_dirty?Boolean

Returns:

  • (Boolean)


29
30
31
# File 'lib/active_fedora/rels_ext_datastream.rb', line 29

def relationships_are_dirty?
  model.relationships_are_dirty if model
end

#relationships_are_not_dirty!Object



37
38
39
# File 'lib/active_fedora/rels_ext_datastream.rb', line 37

def relationships_are_not_dirty!
  model.relationships_are_dirty = false
end

#serialize!Object



24
25
26
27
# File 'lib/active_fedora/rels_ext_datastream.rb', line 24

def serialize!
  self.content = to_rels_ext() if relationships_are_dirty?
  model.relationships_are_dirty = false
end

#to_rels_extObject

Creates a RELS-EXT datastream for insertion into a Fedora Object



74
75
76
77
78
79
80
81
82
# File 'lib/active_fedora/rels_ext_datastream.rb', line 74

def to_rels_ext()
  xml = ActiveFedora::RDFXMLWriter.buffer do |writer|
    writer.prefixes.merge! ActiveFedora::Predicates.predicate_namespaces
    relationships.each_statement do |statement|
      writer << statement
    end
  end
  xml
end

#to_xml(fields_xml) ⇒ Object



45
46
47
48
# File 'lib/active_fedora/rels_ext_datastream.rb', line 45

def to_xml(fields_xml) 
  ActiveSupport::Deprecation.warn("to_xml is deprecated, use to_rels_ext")
  to_rels_ext() 
end