Class: ActiveFedora::RDFDatastream

Inherits:
File
  • Object
show all
Includes:
ActiveFedora::RDF::DatastreamIndexing, ActiveTriples::NestedAttributes, ActiveTriples::Properties, ActiveTriples::Reflection
Defined in:
lib/active_fedora/rdf/rdf_datastream.rb

Direct Known Subclasses

NtriplesRDFDatastream, RDFXMLDatastream

Constant Summary

Constants included from AttributeMethods

AttributeMethods::AttrNames, AttributeMethods::BLACKLISTED_CLASS_METHODS

Constants included from Callbacks

Callbacks::CALLBACKS

Class Method Summary collapse

Instance Method Summary collapse

Methods included from ActiveFedora::RDF::DatastreamIndexing

#primary_solr_name, #to_solr

Methods inherited from File

#attribute_will_change!, #changed?, #check_fixity, #checksum, #datastream_will_change!, #described_by, #exists!, #initialize, #inspect, #ldp_connection, #metadata, #metadata_changed?, #new_record?, #refresh, #reload, #remote_content, #save, #serialize!, #to_solr

Methods included from Querying

#default_sort_params, extended

Methods included from Scoping

#initialize_internals_callback, #populate_with_current_scope_attributes

Methods included from Identifiable

#id, #id=, #pid, #uri

Methods included from AttributeMethods

#[], #[]=, #attribute_for_inspect, #attribute_names, #attribute_present?, #attributes, #has_attribute?

Methods included from Callbacks

#destroy

Methods included from Versionable

#create_version, #has_versions?, #model_type, #restore_version, #versions

Methods included from Persistence

#delete, #destroy, #destroy!, #destroyed?, #eradicate, #new_record?, #persisted?, #save, #save!, #update

Methods included from File::Streaming

#headers, #stream

Methods included from File::Attributes

#create_date, #digest, #dirty_size, #empty?, #has_content?, #mime_type, #original_name, #original_name=, #persisted_size, #size

Methods included from Common

#<=>, #==, #frozen?, #ldp_source, #readonly!, #readonly?

Constructor Details

This class inherits a constructor from ActiveFedora::File

Class Method Details

.add_attribute_indexing_config(name, &block) ⇒ Object



22
23
24
25
# File 'lib/active_fedora/rdf/rdf_datastream.rb', line 22

def add_attribute_indexing_config(name, &block)
  Deprecation.warn(RDFDatastream, "Adding indexing to datastreams is deprecated")
  index_config[name] ||= ActiveFedora::Indexing::Map::IndexObject.new(name, &block)
end

.parent_uri(ds) ⇒ Object

Trim the last segment off the URI to get the parents uri



28
29
30
31
32
33
34
35
# File 'lib/active_fedora/rdf/rdf_datastream.rb', line 28

def parent_uri(ds)
  m = /^(.*)\/[^\/]*$/.match(ds.uri)
  if m
    m[1]
  else
    ::RDF::URI.new(nil)
  end
end

.property(name, *args, &block) ⇒ Object



17
18
19
20
# File 'lib/active_fedora/rdf/rdf_datastream.rb', line 17

def property(name, *args, &block)
  super
  add_attribute_indexing_config(name, &block) if block_given?
end

.rdf_subject(&block) ⇒ Object



11
12
13
14
15
# File 'lib/active_fedora/rdf/rdf_datastream.rb', line 11

def rdf_subject(&block)
  return @subject_block = block if block_given?

  @subject_block ||= ->(ds) { parent_uri(ds) }
end

.resource_class(klass = nil) ⇒ Class

ActiveTriples::Resource and include ActiveFedora::RDF::Persistence.

Parameters:

  • klass (Class) (defaults to: nil)

    an object to set as the resource class, Must be a descendant of

Returns:

  • (Class)

    the object resource class



42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/active_fedora/rdf/rdf_datastream.rb', line 42

def resource_class(klass = nil)
  if klass
    raise ArgumentError, "#{self} already has a resource_class #{@resource_class}, cannot redefine it to #{klass}" if @resource_class && klass != @resource_class
    raise ArgumentError, "#{klass} must be a subclass of ActiveTriples::Resource" unless klass < ActiveTriples::Resource
  end

  @resource_class ||= begin
                        klass = Class.new(klass || ActiveTriples::Resource)
                        klass.send(:include, RDF::Persistence)
                        klass
                      end
end

Instance Method Details

#contentObject



71
72
73
# File 'lib/active_fedora/rdf/rdf_datastream.rb', line 71

def content
  serialize
end

#content=(new_content) ⇒ Object



75
76
77
78
79
# File 'lib/active_fedora/rdf/rdf_datastream.rb', line 75

def content=(new_content)
  resource.clear!
  resource << deserialize(new_content)
  content
end

#content_changed?Boolean

Returns:

  • (Boolean)


86
87
88
89
90
91
# File 'lib/active_fedora/rdf/rdf_datastream.rb', line 86

def content_changed?
  return false unless instance_variable_defined? :@resource
  return true if empty_or_blank_subject? # can't be serialized because a subject hasn't been assigned yet.
  @content = serialize
  super
end

#deserialize(data = nil) ⇒ Object



153
154
155
156
157
158
159
160
161
162
# File 'lib/active_fedora/rdf/rdf_datastream.rb', line 153

def deserialize(data = nil)
  return ::RDF::Graph.new if new_record? && data.nil?
  data ||= remote_content

  # Because datastream_content can return nil, we should check that here.
  return ::RDF::Graph.new if data.nil?

  data.force_encoding('utf-8')
  ::RDF::Graph.new << ::RDF::Reader.for(serialization_format).new(data)
end

#empty_or_blank_subject?Boolean

Returns:

  • (Boolean)


93
94
95
# File 'lib/active_fedora/rdf/rdf_datastream.rb', line 93

def empty_or_blank_subject?
  resource.rdf_subject.node? || resource.rdf_subject.value.blank?
end

#freezeObject



97
98
99
# File 'lib/active_fedora/rdf/rdf_datastream.rb', line 97

def freeze
  @resource.freeze
end

#metadata?Boolean

Returns:

  • (Boolean)


67
68
69
# File 'lib/active_fedora/rdf/rdf_datastream.rb', line 67

def metadata?
  true
end

#parent_uriObject



63
64
65
# File 'lib/active_fedora/rdf/rdf_datastream.rb', line 63

def parent_uri
  self.class.parent_uri(self)
end

#refresh_attributesObject



127
128
129
# File 'lib/active_fedora/rdf/rdf_datastream.rb', line 127

def refresh_attributes
  @resource = nil
end

#resourceObject Also known as: graph

The resource is the RdfResource object that stores the graph for the datastream and is the central point for its relationship to other nodes.

set_value, get_value, and property accessors are delegated to this object.



107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/active_fedora/rdf/rdf_datastream.rb', line 107

def resource
  @resource ||= begin
                  klass = self.class.resource_class
                  klass.properties.merge(self.class.properties).each do |_prop, config|
                    klass.property(config.term,
                                   predicate: config.predicate,
                                   class_name: config.class_name)
                  end
                  klass.accepts_nested_attributes_for(*nested_attributes_options.keys) unless nested_attributes_options.blank?
                  uri_stub = self.class.rdf_subject.call(self)

                  r = klass.new(uri_stub)
                  r.datastream = self
                  r << deserialize
                  r
                end
end

#serialization_formatObject



164
165
166
# File 'lib/active_fedora/rdf/rdf_datastream.rb', line 164

def serialization_format
  raise "you must override the `serialization_format' method in a subclass"
end

#serializeObject



148
149
150
151
# File 'lib/active_fedora/rdf/rdf_datastream.rb', line 148

def serialize
  resource.set_subject!(parent_uri) if parent_uri && rdf_subject.node?
  resource.dump serialization_format
end

#term_values(*values) ⇒ Object

This method allows for delegation. This patches the fact that there’s no consistent API for allowing delegation - we’re matching the OmDatastream implementation as our “consistency” point. @TODO: We may need to enable deep RDF delegation at one point.



136
137
138
# File 'lib/active_fedora/rdf/rdf_datastream.rb', line 136

def term_values(*values)
  send(values.first)
end

#update_indexed_attributes(hash) ⇒ Object



140
141
142
143
144
145
146
# File 'lib/active_fedora/rdf/rdf_datastream.rb', line 140

def update_indexed_attributes(hash)
  hash.each do |fields, value|
    fields.each do |field|
      send("#{field}=", value)
    end
  end
end

#uri=(uri) ⇒ Object



81
82
83
84
# File 'lib/active_fedora/rdf/rdf_datastream.rb', line 81

def uri=(uri)
  super
  resource.set_subject!(parent_uri) if empty_or_blank_subject?
end