Module: ActiveFedora::SemanticNode

Extended by:
ActiveSupport::Concern
Included in:
Base
Defined in:
lib/active_fedora/semantic_node.rb

Defined Under Namespace

Modules: ClassMethods

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#load_from_solrObject

Returns the value of attribute load_from_solr.



9
10
11
# File 'lib/active_fedora/semantic_node.rb', line 9

def load_from_solr
  @load_from_solr
end

#relationships_loadedObject

Returns the value of attribute relationships_loaded.



9
10
11
# File 'lib/active_fedora/semantic_node.rb', line 9

def relationships_loaded
  @relationships_loaded
end

#subjectObject

Returns the value of attribute subject.



9
10
11
# File 'lib/active_fedora/semantic_node.rb', line 9

def subject
  @subject
end

Instance Method Details

#add_relationship(predicate, target, literal = false) ⇒ Object

Add a relationship to the Object.

Parameters:

  • predicate
  • object

    Either a string URI or an object that is a kind of ActiveFedora::Base



30
31
32
33
# File 'lib/active_fedora/semantic_node.rb', line 30

def add_relationship(predicate, target, literal=false)
  object_relations.add(predicate, target, literal)
  rels_ext.content_will_change! if object_relations.dirty
end

#assert_kind_of(n, o, t) ⇒ Object



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

def assert_kind_of(n, o,t)
  raise "Assertion failure: #{n}: #{o} is not of type #{t}" unless o.kind_of?(t)
end

#build_statement(uri, predicate, target, literal = false) ⇒ Object

Create an RDF statement

Parameters:

  • uri

    a string represending the subject

  • predicate

    a predicate symbol

  • target

    an object to store



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/active_fedora/semantic_node.rb', line 76

def build_statement(uri, predicate, target, literal=false)
  ActiveSupport::Deprecation.warn("ActiveFedora::Base#build_statement has been deprecated.")
  raise "Not allowed anymore" if uri == :self
  target = target.internal_uri if target.respond_to? :internal_uri
  subject =  RDF::URI.new(uri)  #TODO cache
  unless literal or target.is_a? RDF::Resource
    begin
      target_uri = (target.is_a? URI) ? target : URI.parse(target)
      if target_uri.scheme.nil?
        raise ArgumentError, "Invalid target \"#{target}\". Must have namespace."
      end
      if target_uri.to_s =~ /\A[\w\-]+:[\w\-]+\Z/
        raise ArgumentError, "Invalid target \"#{target}\". Target should be a complete URI, and not a pid."
      end
    rescue URI::InvalidURIError
      raise ArgumentError, "Invalid target \"#{target}\". Target must be specified as a literal, or be a valid URI."
    end
  end
  if literal
    object = RDF::Literal.new(target)
  elsif target.is_a? RDF::Resource
    object = target
  else
    object = RDF::URI.new(target)
  end
  RDF::Statement.new(subject, find_graph_predicate(predicate), object)

end

#clear_relationship(predicate) ⇒ Object

Clears all relationships with the specified predicate

Parameters:

  • predicate


37
38
39
40
41
42
# File 'lib/active_fedora/semantic_node.rb', line 37

def clear_relationship(predicate)
  relationships(predicate).each do |target|
    object_relations.delete(predicate, target) 
  end
  rels_ext.content_will_change! if object_relations.dirty
end

#conforms_to?(model_class) ⇒ Boolean

Checks that this object is matches the model class passed in. It requires two steps to pass to return true

1. It has a hasModel relationship of the same model
2. kind_of? returns true for the model passed in

This method can most often be used to detect if an object from Fedora that was created with a different model was then used to populate this object.

Parameters:

  • the (Class)

    model class name to check if an object conforms_to that model

Returns:

  • (Boolean)

    true if this object conforms to the given model name



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

def conforms_to?(model_class)
  if self.kind_of?(model_class)
    #check has model and class match
    mod = relationships.first(:predicate=>Predicates.find_graph_predicate(:has_model))
    if mod
      expected = self.class.to_class_uri
      if mod.object.to_s == expected
        return true
      else
        raise "has_model relationship check failed for model #{model_class} raising exception, expected: '#{expected}' actual: '#{mod.object.to_s}'"
      end
    else
      raise "has_model relationship does not exist for model #{model_class} check raising exception"
    end
  else
    raise "kind_of? check failed for model #{model_class}, actual #{self.class} raising exception"
  end
  return false
end

#ids_for_outbound(predicate) ⇒ Object



161
162
163
164
165
166
# File 'lib/active_fedora/semantic_node.rb', line 161

def ids_for_outbound(predicate)
  (object_relations[predicate] || []).map do |o|
    o = o.to_s if o.kind_of? RDF::Literal
    o.kind_of?(String) ? o.gsub("info:fedora/", "") : o.pid
  end
end

#inbound_relationship_predicatesHash

Return hash of inbound relationship names and predicate pairs

Returns:

  • (Hash)

    A hash of inbound relationship names mapped to predicates used



203
204
205
# File 'lib/active_fedora/semantic_node.rb', line 203

def inbound_relationship_predicates
  relationship_predicates.has_key?(:inbound) ? relationship_predicates[:inbound] : {}
end

#inbound_relationships(response_format = :uri) ⇒ Object



117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# File 'lib/active_fedora/semantic_node.rb', line 117

def inbound_relationships(response_format=:uri)
  rel_values = {}
  inbound_relationship_predicates.each_pair do |name,predicate|
    objects = self.send("#{name}",{:response_format=>response_format})
    items = []
    objects.each do |object|
      if (response_format == :uri)    
        #inbound relationships are always object properties
        items.push(object.internal_uri)
      else
        items.push(object)
      end
    end
    unless items.empty?
      rel_values.merge!({predicate=>items})
    end
  end
  return rel_values  
end

#load_relationshipsObject



154
155
156
157
158
159
# File 'lib/active_fedora/semantic_node.rb', line 154

def load_relationships
  self.relationships_loaded = true
  content = rels_ext.content
  return unless content.present?
  RelsExtDatastream.from_xml content, rels_ext
end

#object_relationsObject



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

def object_relations
  load_relationships if !relationships_loaded
  @object_relations ||= RelationshipGraph.new
end

#outbound_relationship_predicatesHash

Return hash of outbound relationship names and predicate pairs

Returns:

  • (Hash)

    A hash of outbound relationship names mapped to predicates used



197
198
199
# File 'lib/active_fedora/semantic_node.rb', line 197

def outbound_relationship_predicates
  relationship_predicates.has_key?(:self) ? relationship_predicates[:self] : {}
end

#outbound_relationshipsObject



137
138
139
# File 'lib/active_fedora/semantic_node.rb', line 137

def outbound_relationships()
  relationships.statements
end

#relationship_predicatesHash

Return hash of relationship names and predicate pairs (inbound and outbound). It retrieves this information via the relationships_desc hash in the class.

Returns:

  • (Hash)

    A hash of relationship names (inbound and outbound) mapped to predicates used



183
184
185
186
187
188
189
190
191
192
193
# File 'lib/active_fedora/semantic_node.rb', line 183

def relationship_predicates
  return @relationship_predicates if @relationship_predicates
  @relationship_predicates = {}
  relationships_desc.each_pair do |subj, names|
    @relationship_predicates[subj] = {}
    names.each_pair do |name, args|
      @relationship_predicates[subj][name] = args[:predicate]
    end
  end
  @relationship_predicates
end

#relationships(*args) ⇒ Object

If no arguments are supplied, return the whole RDF::Graph. if a predicate is supplied as a parameter, then it returns the result of quering the graph with that predicate



143
144
145
146
147
148
149
150
151
152
# File 'lib/active_fedora/semantic_node.rb', line 143

def relationships(*args)
  load_relationships if !relationships_loaded

  if args.empty?
    raise "Must have internal_uri" unless internal_uri
    return object_relations.to_graph(internal_uri)
  end
  rels = object_relations[args.first] || []
  rels.map {|o| o.respond_to?(:internal_uri) ? o.internal_uri : o }   #TODO, could just return the object
end

#relationships_are_dirtyObject



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

def relationships_are_dirty
  object_relations.dirty
end

#relationships_are_dirty=(val) ⇒ Object



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

def relationships_are_dirty=(val)
  object_relations.dirty = val
end

#relationships_descHash

Return hash that persists relationship metadata defined by has_relationship calls

Examples:

For the following relationship


has_relationship "audio_records", :has_part, :type=>AudioRecord

Results in the following returned by relationships_desc
{:self=>{"audio_records"=>{:type=>AudioRecord, :singular=>nil, :predicate=>:has_part, :inbound=>false}}}

Returns:

  • (Hash)

    Hash of relationship subject (:self or :inbound) mapped to nested hashs of each relationship name mapped to another hash relationship options



176
177
178
# File 'lib/active_fedora/semantic_node.rb', line 176

def relationships_desc
  @relationships_desc ||= self.class.relationships_desc
end

#remove_relationship(predicate, obj, literal = false) ⇒ Object

Remove a Rels-Ext relationship from the Object.

Parameters:

  • predicate
  • object

    Either a string URI or an object that responds to .pid



111
112
113
114
115
# File 'lib/active_fedora/semantic_node.rb', line 111

def remove_relationship(predicate, obj, literal=false)
  object_relations.delete(predicate, obj)
  self.relationships_are_dirty = true
  rels_ext.content_will_change!
end