Class: ActiveFedora::RelsExtDatastream

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

Instance Attribute Summary (collapse)

Attributes inherited from Datastream

#digital_object, #last_modified

Class Method Summary (collapse)

Instance Method Summary (collapse)

Methods inherited from Datastream

#create, #freeze, #frozen?, #initialize, #inspect, #label, #profile_from_hash, #realLabel, #save, #solrize_profile, #to_param, #to_solr

Constructor Details

This class inherits a constructor from ActiveFedora::Datastream

Instance Attribute Details

- (Object) model

Returns the value of attribute model



8
9
10
# File 'lib/active_fedora/rels_ext_datastream.rb', line 8

def model
  @model
end

Class Method Details

+ (Object) default_attributes



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

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

+ (Object) ensure_predicates_exist!(xml)



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

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

+ (Object) from_xml(xml, tmpl)

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

Parameters:



32
33
34
35
36
37
38
39
40
# File 'lib/active_fedora/rels_ext_datastream.rb', line 32

def self.from_xml(xml, tmpl) 
  if (xml.nil?)
    ### maybe put the template here?
  else
    ensure_predicates_exist!(xml)
    tmpl.model.relationships = xml
    tmpl
  end
end

Instance Method Details

- (Boolean) changed?

Returns:

  • (Boolean)


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

def changed?
  model.relationships_are_dirty? or super
end

- (Object) from_solr(solr_doc)

** 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::FieldMapper) to map solr key to relationship predicate.

Warning

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


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

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

- (Boolean) metadata?

Returns:

  • (Boolean)


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

def metadata?
  true
end

- (Object) serialize!



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

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

- (Object) to_rels_ext

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



43
44
45
46
47
48
49
50
51
# File 'lib/active_fedora/rels_ext_datastream.rb', line 43

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