active-fedora 3.1.6 → 3.2.0.pre1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. data/.gitignore +1 -0
  2. data/Gemfile.lock +22 -22
  3. data/History.txt +9 -3
  4. data/active-fedora.gemspec +3 -3
  5. data/config/predicate_mappings.yml +1 -0
  6. data/config/service_mappings.yml +9 -0
  7. data/lib/active_fedora.rb +7 -1
  8. data/lib/active_fedora/base.rb +84 -30
  9. data/lib/active_fedora/datastream.rb +4 -1
  10. data/lib/active_fedora/datastream_collections.rb +304 -293
  11. data/lib/active_fedora/metadata_datastream.rb +2 -24
  12. data/lib/active_fedora/metadata_datastream_helper.rb +32 -5
  13. data/lib/active_fedora/named_relationships.rb +95 -0
  14. data/lib/active_fedora/nested_attributes.rb +1 -1
  15. data/lib/active_fedora/predicates.rb +76 -0
  16. data/lib/active_fedora/reflection.rb +9 -1
  17. data/lib/active_fedora/relationship.rb +1 -0
  18. data/lib/active_fedora/relationship_graph.rb +152 -0
  19. data/lib/active_fedora/relationships_helper.rb +32 -41
  20. data/lib/active_fedora/rels_ext_datastream.rb +3 -10
  21. data/lib/active_fedora/semantic_node.rb +47 -203
  22. data/lib/active_fedora/service_definitions.rb +89 -0
  23. data/lib/active_fedora/unsaved_digital_object.rb +40 -0
  24. data/lib/active_fedora/version.rb +1 -1
  25. data/spec/integration/base_spec.rb +106 -309
  26. data/spec/integration/datastream_collections_spec.rb +135 -0
  27. data/spec/integration/rels_ext_datastream_spec.rb +14 -35
  28. data/spec/integration/semantic_node_spec.rb +6 -10
  29. data/spec/unit/base_datastream_management_spec.rb +0 -3
  30. data/spec/unit/base_extra_spec.rb +5 -9
  31. data/spec/unit/base_spec.rb +103 -57
  32. data/spec/unit/{base_named_datastream_spec.rb → datastream_collections_spec.rb} +107 -150
  33. data/spec/unit/metadata_datastream_spec.rb +0 -1
  34. data/spec/unit/nokogiri_datastream_spec.rb +0 -1
  35. data/spec/unit/predicates_spec.rb +64 -0
  36. data/spec/unit/qualified_dublin_core_datastream_spec.rb +0 -7
  37. data/spec/unit/relationship_graph_spec.rb +95 -0
  38. data/spec/unit/relationship_spec.rb +4 -4
  39. data/spec/unit/relationships_helper_spec.rb +43 -104
  40. data/spec/unit/rels_ext_datastream_spec.rb +6 -6
  41. data/spec/unit/semantic_node_spec.rb +27 -116
  42. data/spec/unit/service_definitions_spec.rb +52 -0
  43. data/spec/unit/solr_config_options_spec.rb +1 -1
  44. metadata +35 -17
@@ -1,4 +1,3 @@
1
- require 'active_support/core_ext/class/inheritable_attributes'
2
1
  module ActiveFedora
3
2
  # This module is meant to extend semantic node to add functionality based on a relationship's name
4
3
  # It is meant to turn a relationship into just another attribute in a model.
@@ -25,16 +24,10 @@ module ActiveFedora
25
24
  module RelationshipsHelper
26
25
  extend ActiveSupport::Concern
27
26
 
28
- # ms_inheritable_attributes :class_relationships_desc
29
27
  included do
30
- class_inheritable_accessor :class_relationships_desc
31
- # self.class_relationships_desc = {}
28
+ class_attribute :class_relationships_desc
32
29
  end
33
30
 
34
- # def self.included(klass)
35
- # klass.extend(ClassMethods)
36
- # end
37
-
38
31
 
39
32
  # ** EXPERIMENTAL **
40
33
  #
@@ -103,7 +96,7 @@ module ActiveFedora
103
96
  rels[:self] = {}
104
97
  names.each_pair do |name, predicate|
105
98
  set = []
106
- res = relationships.query(:predicate => find_graph_predicate(predicate))
99
+ res = relationships.query(:predicate => Predicates.find_graph_predicate(predicate))
107
100
  res.each_object do |o|
108
101
  set << o.to_s
109
102
  end
@@ -285,8 +278,6 @@ module ActiveFedora
285
278
  (assert_conforms_to 'object', object, klass)
286
279
  end
287
280
  end
288
- #r = ActiveFedora::Relationship.new({:subject=>:self,:predicate=>outbound_relationship_predicates[name],:object=>object})
289
- #add_relationship(r)
290
281
  add_relationship(outbound_relationship_predicates[name],object)
291
282
  else
292
283
  false
@@ -330,7 +321,7 @@ module ActiveFedora
330
321
  def conforms_to?(model_class)
331
322
  if self.kind_of?(model_class)
332
323
  #check has model and class match
333
- mod = relationships.first(:predicate=>find_graph_predicate(:has_model))
324
+ mod = relationships.first(:predicate=>Predicates.find_graph_predicate(:has_model))
334
325
  if mod
335
326
  expected = ActiveFedora::ContentModel.pid_from_ruby_class(self.class)
336
327
  if mod.object.to_s == expected
@@ -429,121 +420,121 @@ module ActiveFedora
429
420
 
430
421
  # @deprecated Please use {#find_relationship_by_name} instead.
431
422
  def named_relationship(name)
432
- logger.warn("Deprecation: named_relationship has been deprecated. Please call find_relationship_by_name instead.")
423
+ ActiveSupport::Deprecation.warn("Deprecation: named_relationship has been deprecated. Please call find_relationship_by_name instead.")
433
424
  find_relationship_by_name(name)
434
425
  end
435
426
 
436
427
  # @deprecated Please use {#register_relationship_desc_subject} instead.
437
428
  def register_named_subject(subject)
438
- logger.warn("Deprecation: register_named_subject has been deprecated. Please call register_relationship_desc_subject instead.")
429
+ ActiveSupport::Deprecation.warn("Deprecation: register_named_subject has been deprecated. Please call register_relationship_desc_subject instead.")
439
430
  register_relationship_desc_subject(subject)
440
431
  end
441
432
 
442
433
  # @deprecated Please use {#register_relationship_desc} instead.
443
434
  def register_named_relationship(subject, name, predicate, opts)
444
- logger.warn("Deprecation: register_named_relationship has been deprecated. Please call register_relationship_desc instead.")
435
+ ActiveSupport::Deprecation.warn("Deprecation: register_named_relationship has been deprecated. Please call register_relationship_desc instead.")
445
436
  register_relationship_desc(subject, name, predicate, opts)
446
437
  end
447
438
 
448
439
  # @deprecated Please use {#relationships_by_name} instead.
449
440
  def named_relationships(outbound_only=true)
450
- logger.warn("Deprecation: named_relationships has been deprecated. Please call relationships_by_name instead.")
441
+ ActiveSupport::Deprecation.warn("Deprecation: named_relationships has been deprecated. Please call relationships_by_name instead.")
451
442
  relationships_by_name(outbound_only)
452
443
  end
453
444
 
454
445
  # @deprecated Please use {#relationships_by_name_from_class} instead.
455
446
  def named_relationships_from_class
456
- logger.warn("Deprecation: named_relationships_from_class has been deprecated. Please call relationships_by_name_from_class instead.")
447
+ ActiveSupport::Deprecation.warn("Deprecation: named_relationships_from_class has been deprecated. Please call relationships_by_name_from_class instead.")
457
448
  relationships_by_name_from_class
458
449
  end
459
450
 
460
451
  # @deprecated Please use {#inbound_relationships_by_name} instead.
461
452
  def named_inbound_relationships
462
- logger.warn("Deprecation: named_inbound_relationships has been deprecated. Please call inbound_relationships_by_name instead.")
453
+ ActiveSupport::Deprecation.warn("Deprecation: named_inbound_relationships has been deprecated. Please call inbound_relationships_by_name instead.")
463
454
  inbound_relationships_by_name
464
455
  end
465
456
 
466
457
  # @deprecated Please use {#outbound_relationships_by_name} instead.
467
458
  def named_outbound_relationships
468
- logger.warn("Deprecation: named_outbound_relationships has been deprecated. Please call outbound_relationships_by_name instead.")
459
+ ActiveSupport::Deprecation.warn("Deprecation: named_outbound_relationships has been deprecated. Please call outbound_relationships_by_name instead.")
469
460
  outbound_relationships_by_name
470
461
  end
471
462
 
472
463
  # @deprecated Please use {#outbound_relationship_predicates} instead.
473
464
  def outbound_named_relationship_predicates
474
- logger.warn("Deprecation: outbound_named_relationship_predicates has been deprecated. Please call outbound_relationship_predicates instead.")
465
+ ActiveSupport::Deprecation.warn("Deprecation: outbound_named_relationship_predicates has been deprecated. Please call outbound_relationship_predicates instead.")
475
466
  outbound_relationship_predicates
476
467
  end
477
468
 
478
469
  # @deprecated Please use {#inbound_relationship_predicates} instead.
479
470
  def inbound_named_relationship_predicates
480
- logger.warn("Deprecation: inbound_named_relationship_predicates has been deprecated. Please call inbound_relationship_predicates instead.")
471
+ ActiveSupport::Deprecation.warn("Deprecation: inbound_named_relationship_predicates has been deprecated. Please call inbound_relationship_predicates instead.")
481
472
  inbound_relationship_predicates
482
473
  end
483
474
 
484
475
  # @deprecated Please use {#relationship_predicates} instead.
485
476
  def named_relationship_predicates
486
- logger.warn("Deprecation: named_relationship_predicates has been deprecated. Please call relationship_predicates instead.")
477
+ ActiveSupport::Deprecation.warn("Deprecation: named_relationship_predicates has been deprecated. Please call relationship_predicates instead.")
487
478
  relationship_predicates
488
479
  end
489
480
 
490
481
  # @deprecated Please use {#relationship_predicates_from_class} instead.
491
482
  def named_relationship_predicates_from_class
492
- logger.warn("Deprecation: named_relationship_predicates_from_class has been deprecated. Please call relationship_predicates_from_class instead.")
483
+ ActiveSupport::Deprecation.warn("Deprecation: named_relationship_predicates_from_class has been deprecated. Please call relationship_predicates_from_class instead.")
493
484
  relationship_predicates_from_class
494
485
  end
495
486
 
496
487
  # @deprecated Please use {#is_relationship_name?} instead.
497
488
  def is_named_relationship?(name, outbound_only=true)
498
- logger.warn("Deprecation: is_named_relationship? has been deprecated. Please call is_relationship_name? instead.")
489
+ ActiveSupport::Deprecation.warn("Deprecation: is_named_relationship? has been deprecated. Please call is_relationship_name? instead.")
499
490
  is_relationship_name?(name,outbound_only)
500
491
  end
501
492
 
502
493
  # @deprecated Please use {#relationships_desc} instead.
503
494
  def named_relationships_desc
504
- logger.warn("Deprecation: named_relationships_desc has been deprecated. Please call relationships_desc instead.")
495
+ ActiveSupport::Deprecation.warn("Deprecation: named_relationships_desc has been deprecated. Please call relationships_desc instead.")
505
496
  relationships_desc
506
497
  end
507
498
 
508
499
  # @deprecated Please use {#relationships_desc_from_class} instead.
509
500
  def named_relationships_desc_from_class
510
- logger.warn("Deprecation: named_relationships_desc_from_class has been deprecated. Please call relationships_desc_from_class instead.")
501
+ ActiveSupport::Deprecation.warn("Deprecation: named_relationships_desc_from_class has been deprecated. Please call relationships_desc_from_class instead.")
511
502
  relationships_desc_from_class
512
503
  end
513
504
 
514
505
  # @deprecated Please use {#relationship_model_type} instead.
515
506
  def named_relationship_type(name)
516
- logger.warn("Deprecation: named_relationship_type has been deprecated. Please call relationship_model_type instead.")
507
+ ActiveSupport::Deprecation.warn("Deprecation: named_relationship_type has been deprecated. Please call relationship_model_type instead.")
517
508
  relationship_model_type(name)
518
509
  end
519
510
 
520
511
  # @deprecated Please use {#add_relationship_by_name} instead.
521
512
  def add_named_relationship(name,object)
522
- logger.warn("Deprecation: add_named_relationship has been deprecated. Please call add_relationship_by_name instead.")
513
+ ActiveSupport::Deprecation.warn("Deprecation: add_named_relationship has been deprecated. Please call add_relationship_by_name instead.")
523
514
  add_relationship_by_name(name,object)
524
515
  end
525
516
 
526
517
  # @deprecated Please use {#remove_relationship_by_name} instead.
527
518
  def remove_named_relationship(name,object)
528
- logger.warn("Deprecation: remove_named_relationship has been deprecated. Please call remove_relationship_by_name instead.")
519
+ ActiveSupport::Deprecation.warn("Deprecation: remove_named_relationship has been deprecated. Please call remove_relationship_by_name instead.")
529
520
  remove_relationship_by_name(name,object)
530
521
  end
531
522
 
532
523
  # @deprecated Please use {#assert_conforms_to} instead.
533
524
  def assert_kind_of_model(name,object,model_class)
534
- logger.warn("Deprecation: assert_kind_of_model has been deprecated. Please call assert_conforms_to instead.")
525
+ ActiveSupport::Deprecation.warn("Deprecation: assert_kind_of_model has been deprecated. Please call assert_conforms_to instead.")
535
526
  assert_conforms_to(name,object,model_class)
536
527
  end
537
528
 
538
529
  # @deprecated Please use {#conforms_to?} instead.
539
530
  def kind_of_model?(model_class)
540
- logger.warn("Deprecation: kind_of_model? has been deprecated. Please call conforms_to? instead.")
531
+ ActiveSupport::Deprecation.warn("Deprecation: kind_of_model? has been deprecated. Please call conforms_to? instead.")
541
532
  conforms_to?(model_class)
542
533
  end
543
534
 
544
535
  # @deprecated Please use {#relationship_query} instead.
545
536
  def named_relationship_query(relationship_name)
546
- logger.warn("Deprecation: named_relationship_query has been deprecated. Please call relationship_query instead.")
537
+ ActiveSupport::Deprecation.warn("Deprecation: named_relationship_query has been deprecated. Please call relationship_query instead.")
547
538
  relationship_query(relationship_name)
548
539
  end
549
540
 
@@ -834,55 +825,55 @@ module ActiveFedora
834
825
 
835
826
  # @deprecated Please use {#relationships_desc} instead.
836
827
  def named_relationships_desc
837
- logger.warn("Deprecation: named_relationships_desc has been deprecated. Please call relationships_desc instead.")
828
+ ActiveSupport::Deprecation.warn("Deprecation: named_relationships_desc has been deprecated. Please call relationships_desc instead.")
838
829
  relationships_desc
839
830
  end
840
831
 
841
832
  # @deprecated Please use {#register_relationship_desc_subject} instead.
842
833
  def register_named_subject(subject)
843
- logger.warn("Deprecation: register_named_subject has been deprecated. Please call register_relationship_desc_subject instead.")
834
+ ActiveSupport::Deprecation.warn("Deprecation: register_named_subject has been deprecated. Please call register_relationship_desc_subject instead.")
844
835
  register_relationship_desc_subject(subject)
845
836
  end
846
837
 
847
838
  # @deprecated Please use {#register_relationship_desc} instead.
848
839
  def register_named_relationship(subject, name, predicate, opts)
849
- logger.warn("Deprecation: register_named_relationship has been deprecated. Please call register_relationship_desc instead.")
840
+ ActiveSupport::Deprecation.warn("Deprecation: register_named_relationship has been deprecated. Please call register_relationship_desc instead.")
850
841
  register_relationship_desc(subject, name, predicate, opts)
851
842
  end
852
843
 
853
844
  # @deprecated Please use {#create_relationship_name_methods} instead.
854
845
  def create_named_relationship_methods(name)
855
- logger.warn("Deprecation: create_named_relationship_methods has been deprecated. Please call create_relationship_name_methods instead.")
846
+ ActiveSupport::Deprecation.warn("Deprecation: create_named_relationship_methods has been deprecated. Please call create_relationship_name_methods instead.")
856
847
  create_relationship_name_methods(name)
857
848
  end
858
849
 
859
850
  # @deprecated Please use {#create_bidirectional_relationship_name_methods} instead.
860
851
  def create_bidirectional_named_relationship_methods(name,outbound_name)
861
- logger.warn("Deprecation: create_bidirectional_named_relationship_methods has been deprecated. Please call create_bidirectional_relationship_name_methods instead.")
852
+ ActiveSupport::Deprecation.warn("Deprecation: create_bidirectional_named_relationship_methods has been deprecated. Please call create_bidirectional_relationship_name_methods instead.")
862
853
  create_bidirectional_relationship_name_methods(name,outbound_name)
863
854
  end
864
855
 
865
856
  # @deprecated Please use {#outbound_relationship_query} instead.
866
857
  def outbound_named_relationship_query(relationship_name,outbound_pids)
867
- logger.warn("Deprecation: outbound_named_relationship_query has been deprecated. Please call outbound_relationship_query instead.")
858
+ ActiveSupport::Deprecation.warn("Deprecation: outbound_named_relationship_query has been deprecated. Please call outbound_relationship_query instead.")
868
859
  outbound_relationship_query(relationship_name,outbound_pids)
869
860
  end
870
861
 
871
862
  # @deprecated Please use {#inbound_relationship_query} instead.
872
863
  def inbound_named_relationship_query(pid,relationship_name)
873
- logger.warn("Deprecation: inbound_named_relationship_query has been deprecated. Please call inbound_relationship_query instead.")
864
+ ActiveSupport::Deprecation.warn("Deprecation: inbound_named_relationship_query has been deprecated. Please call inbound_relationship_query instead.")
874
865
  inbound_relationship_query(pid,relationship_name)
875
866
  end
876
867
 
877
868
  # @deprecated Please use {#bidirectional_relationship_query} instead.
878
869
  def bidirectional_named_relationship_query(pid,relationship_name,outbound_pids)
879
- logger.warn("Deprecation: bidirectional_named_relationship_query has been deprecated. Please call bidirectional_relationship_query instead.")
870
+ ActiveSupport::Deprecation.warn("Deprecation: bidirectional_named_relationship_query has been deprecated. Please call bidirectional_relationship_query instead.")
880
871
  bidirectional_relationship_query(pid,relationship_name,outbound_pids)
881
872
  end
882
873
 
883
874
  # @deprecated Please use {#predicate_exists_with_different_relationship_name?} instead.
884
875
  def named_predicate_exists_with_different_name?(subject,name,predicate)
885
- logger.warn("Deprecation: named_predicate_exists_with_different_name? has been deprecated. Please call predicate_exists_with_different_relationship_name? instead.")
876
+ ActiveSupport::Deprecation.warn("Deprecation: named_predicate_exists_with_different_name? has been deprecated. Please call predicate_exists_with_different_relationship_name? instead.")
886
877
  predicate_exists_with_different_relationship_name?(subject,name,predicate)
887
878
  end
888
879
  end
@@ -1,4 +1,3 @@
1
- require 'active_support/core_ext/class/inheritable_attributes'
2
1
  require 'solrizer/field_name_mapper'
3
2
  require 'uri'
4
3
  require 'rdf/rdfxml'
@@ -61,10 +60,10 @@ module ActiveFedora
61
60
  end
62
61
 
63
62
  def self.short_predicate(predicate)
64
- if match = /^(#{ActiveFedora::Base.predicate_mappings.keys.join('|')})(.+)$/.match(predicate.to_str)
63
+ if match = /^(#{Predicates.predicate_mappings.keys.join('|')})(.+)$/.match(predicate.to_str)
65
64
  namespace = match[1]
66
65
  predicate = match[2]
67
- pred = ActiveFedora::Base.predicate_mappings[namespace].invert[predicate]
66
+ pred = Predicates.predicate_mappings[namespace].invert[predicate]
68
67
  pred
69
68
  else
70
69
  raise "Unable to parse predicate: #{predicate}"
@@ -84,21 +83,15 @@ module ActiveFedora
84
83
  def from_solr(solr_doc)
85
84
  #cycle through all possible predicates
86
85
  model.relationships_loaded = true
87
- ActiveFedora::Base.predicate_mappings[ActiveFedora::Base.default_predicate_namespace].keys.each do |predicate|
86
+ Predicates.predicate_mappings[Predicates.default_predicate_namespace].keys.each do |predicate|
88
87
  predicate_symbol = ActiveFedora::SolrService.solr_name(predicate, :symbol)
89
88
  value = (solr_doc[predicate_symbol].nil? ? solr_doc[predicate_symbol.to_s]: solr_doc[predicate_symbol])
90
89
  unless value.nil?
91
90
  if value.is_a? Array
92
91
  value.each do |obj|
93
- #o_uri = URI.parse(obj)
94
- #literal = o_uri.scheme.nil?
95
- #r = ActiveFedora::Relationship.new(:subject=>:self, :predicate=>predicate, :object=>obj, :is_literal=>literal)
96
92
  model.add_relationship(predicate, obj)
97
93
  end
98
94
  else
99
- #o_uri = URI.parse(value)
100
- #literal = o_uri.scheme.nil?
101
- #r = ActiveFedora::Relationship.new(:subject=>:self, :predicate=>predicate, :object=>value, :is_literal=>literal)
102
95
  model.add_relationship(predicate, value)
103
96
  end
104
97
  end
@@ -1,31 +1,35 @@
1
1
  require 'rdf'
2
- require 'active_support/core_ext/class/inheritable_attributes'
3
2
  module ActiveFedora
4
3
  module SemanticNode
5
4
  extend ActiveSupport::Concern
6
5
  included do
7
- class_inheritable_accessor :class_relationships, :internal_uri, :class_named_relationships_desc
6
+ class_attribute :class_relationships, :internal_uri
8
7
  self.class_relationships = {}
9
- self.class_named_relationships_desc = {}
10
8
  end
11
- attr_accessor :named_relationship_desc, :relationships_are_dirty, :relationships_loaded, :load_from_solr, :subject #:internal_uri
12
-
13
- #TODO I think we can remove named_relationship_desc from attr_accessor - jcoyne
9
+ attr_accessor :relationships_loaded, :load_from_solr, :subject
14
10
 
15
11
  def assert_kind_of(n, o,t)
16
12
  raise "Assertion failure: #{n}: #{o} is not of type #{t}" unless o.kind_of?(t)
17
13
  end
14
+
15
+ def object_relations
16
+ load_relationships if !relationships_loaded
17
+ @object_relations ||= RelationshipGraph.new
18
+ end
18
19
 
20
+ def relationships_are_dirty
21
+ object_relations.dirty
22
+ end
23
+ def relationships_are_dirty=(val)
24
+ object_relations.dirty = val
25
+ end
26
+
19
27
  # Add a relationship to the Object.
20
28
  # @param predicate
21
29
  # @param object Either a string URI or an object that is a kind of ActiveFedora::Base
22
30
  def add_relationship(predicate, target, literal=false)
23
- stmt = build_statement(internal_uri, predicate, target, literal)
24
- unless relationships.has_statement? stmt
25
- relationships.insert stmt
26
- @relationships_are_dirty = true
27
- rels_ext.dirty = true
28
- end
31
+ object_relations.add(predicate, target, literal)
32
+ rels_ext.dirty = true
29
33
  end
30
34
 
31
35
  # Create an RDF statement
@@ -33,6 +37,7 @@ module ActiveFedora
33
37
  # @param predicate a predicate symbol
34
38
  # @param target an object to store
35
39
  def build_statement(uri, predicate, target, literal=false)
40
+ ActiveSupport::Deprecation.warn("ActiveFedora::Base#build_statement has been deprecated.")
36
41
  raise "Not allowed anymore" if uri == :self
37
42
  target = target.internal_uri if target.respond_to? :internal_uri
38
43
  subject = RDF::URI.new(uri) #TODO cache
@@ -60,42 +65,15 @@ module ActiveFedora
60
65
 
61
66
  end
62
67
 
63
- def find_graph_predicate(predicate)
64
- #TODO, these could be cached
65
- case predicate
66
- when :has_model, "hasModel", :hasModel
67
- xmlns="info:fedora/fedora-system:def/model#"
68
- begin
69
- rel_predicate = ActiveFedora::Base.predicate_lookup(predicate,xmlns)
70
- rescue UnregisteredPredicateError
71
- xmlns = nil
72
- rel_predicate = nil
73
- end
74
- else
75
- xmlns="info:fedora/fedora-system:def/relations-external#"
76
- begin
77
- rel_predicate = ActiveFedora::Base.predicate_lookup(predicate,xmlns)
78
- rescue UnregisteredPredicateError
79
- xmlns = nil
80
- rel_predicate = nil
81
- end
82
- end
83
-
84
- unless xmlns && rel_predicate
85
- rel_predicate, xmlns = ActiveFedora::Base.find_predicate(predicate)
86
- end
87
- self.class.vocabularies[xmlns][rel_predicate]
88
- end
89
68
 
90
69
 
91
- # ** EXPERIMENTAL **
92
70
  #
93
71
  # Remove a Rels-Ext relationship from the Object.
94
72
  # @param predicate
95
73
  # @param object Either a string URI or an object that responds to .pid
96
74
  def remove_relationship(predicate, obj, literal=false)
97
- relationships.delete build_statement(internal_uri, predicate, obj)
98
- @relationships_are_dirty = true
75
+ object_relations.delete(predicate, obj)
76
+ self.relationships_are_dirty = true
99
77
  rels_ext.dirty = true
100
78
  end
101
79
 
@@ -106,10 +84,8 @@ module ActiveFedora
106
84
  items = []
107
85
  objects.each do |object|
108
86
  if (response_format == :uri)
109
- #create a Relationship object so that it generates the appropriate uri
110
87
  #inbound relationships are always object properties
111
- r = ActiveFedora::Relationship.new(:subject=>:self, :predicate=>predicate, :object=>object)
112
- items.push(r.object)
88
+ items.push(object.internal_uri)
113
89
  else
114
90
  items.push(object)
115
91
  end
@@ -128,19 +104,14 @@ module ActiveFedora
128
104
  # If no arguments are supplied, return the whole RDF::Graph.
129
105
  # if a predicate is supplied as a parameter, then it returns the result of quering the graph with that predicate
130
106
  def relationships(*args)
131
- unless @subject
132
- raise "Must have internal_uri" unless internal_uri
133
- @subject = RDF::URI.new(internal_uri)
134
- end
135
- @relationships ||= RDF::Graph.new
136
107
  load_relationships if !relationships_loaded
137
108
 
138
- return @relationships if args.empty?
139
- rels = @relationships.query(:predicate => find_graph_predicate(args.first))
140
- results = []
141
- rels.each_object {|o| results << o.to_s }
142
- results
143
-
109
+ if args.empty?
110
+ raise "Must have internal_uri" unless internal_uri
111
+ return object_relations.to_graph(internal_uri)
112
+ end
113
+ rels = object_relations[args.first] || []
114
+ rels.map {|o| o.respond_to?(:internal_uri) ? o.internal_uri : o } #TODO, could just return the object
144
115
  end
145
116
 
146
117
  def load_relationships
@@ -185,12 +156,10 @@ module ActiveFedora
185
156
 
186
157
 
187
158
  def ids_for_outbound(predicate)
188
- id_array = []
189
- res = relationships.query(:predicate => find_graph_predicate(predicate))
190
- relationships(predicate).each do |o|
191
- id_array << o.gsub("info:fedora/", "")
159
+ (object_relations[predicate] || []).map do |o|
160
+ o = o.to_s if o.kind_of? RDF::Literal
161
+ o.kind_of?(String) ? o.gsub("info:fedora/", "") : o.pid
192
162
  end
193
- id_array
194
163
  end
195
164
 
196
165
  def load_bidirectional(name, inbound_method_name, outbound_method_name, opts)
@@ -219,7 +188,7 @@ module ActiveFedora
219
188
  if opts[:response_format] == :id_array && !self.class.relationship_has_solr_filter_query?(:self,"#{name}")
220
189
  return id_array
221
190
  else
222
- query = self.class.outbound_relationship_query("#{name}",id_array)
191
+ query = self.class.outbound_relationship_query(name,id_array)
223
192
  solr_result = SolrService.instance.conn.query(query)
224
193
  if opts[:response_format] == :solr
225
194
  return solr_result
@@ -238,13 +207,6 @@ module ActiveFedora
238
207
  end
239
208
 
240
209
  module ClassMethods
241
- def vocabularies
242
- return @vocabularies if @vocabularies
243
- @vocabularies = {}
244
- predicate_mappings.keys.each { |ns| @vocabularies[ns] = RDF::Vocabulary.new(ns)}
245
- @vocabularies
246
- end
247
-
248
210
  # Allows for a relationship to be treated like any other attribute of a model class. You define
249
211
  # relationships in your model class using this method. You then have access to several
250
212
  # helper methods to list, append, and remove objects from the list of relationships.
@@ -320,91 +282,29 @@ module ActiveFedora
320
282
  create_bidirectional_relationship_finders(name, outbound_predicate, inbound_predicate, opts)
321
283
  end
322
284
 
323
- # ** EXPERIMENTAL **
324
- #
325
- # Check to make sure a subject,name, and predicate triple does not already exist
326
- # with the same subject but different name.
327
- # This method is used to ensure conflicting has_relationship calls are not made because
328
- # predicates cannot be reused across relationship names. Otherwise, the mapping of relationship name
329
- # to predicate in RELS-EXT would be broken.
330
- def named_predicate_exists_with_different_name?(subject,name,predicate)
331
- if named_relationships_desc.has_key?(subject)
332
- named_relationships_desc[subject].each_pair do |existing_name, args|
333
- return true if !args[:predicate].nil? && args[:predicate] == predicate && existing_name != name
334
- end
335
- end
336
- return false
337
- end
338
-
339
- # ** EXPERIMENTAL **
340
- #
341
- # Return hash that stores named relationship metadata defined by has_relationship calls
342
- # ====Example
343
- # For the following relationship
344
- #
345
- # has_relationship "audio_records", :has_part, :type=>AudioRecord
346
- # Results in the following returned by named_relationships_desc
347
- # {:self=>{"audio_records"=>{:type=>AudioRecord, :singular=>nil, :predicate=>:has_part, :inbound=>false}}}
348
- def named_relationships_desc
349
- @class_named_relationships_desc ||= Hash[:self => {}]
350
- #class_named_relationships_desc
285
+
286
+ # relationships are tracked as a hash of structure
287
+ # @example
288
+ # ds.relationships # => {:self=>{:has_model=>["afmodel:SimpleThing"],:has_part=>["demo:20"]},:inbound=>{:is_part_of=>["demo:6"]}
289
+ def relationships
290
+ @class_relationships ||= Hash[:self => {}]
351
291
  end
352
-
353
- # ** EXPERIMENTAL **
354
- #
355
- # Internal method that ensures a relationship subject such as :self and :inbound
356
- # exist within the named_relationships_desc hash tracking named relationships metadata.
357
- def register_named_subject(subject)
358
- unless named_relationships_desc.has_key?(subject)
359
- named_relationships_desc[subject] = {}
292
+
293
+
294
+ def register_subject(subject)
295
+ if !relationships.has_key?(subject)
296
+ relationships[subject] = {}
360
297
  end
361
298
  end
362
-
363
- # ** EXPERIMENTAL **
364
- #
365
- # Internal method that adds relationship name and predicate pair to either an outbound (:self)
366
- # or inbound (:inbound) relationship types.
367
- def register_named_relationship(subject, name, predicate, opts)
368
- register_named_subject(subject)
369
- opts.merge!({:predicate=>predicate})
370
- named_relationships_desc[subject][name] = opts
299
+
300
+ def register_predicate(subject, predicate)
301
+ register_subject(subject)
302
+ if !relationships[subject].has_key?(predicate)
303
+ relationships[subject][predicate] = []
304
+ end
371
305
  end
372
-
373
- # ** EXPERIMENTAL **
374
- #
375
- # Used in has_relationship call to create dynamic helper methods to
376
- # append and remove objects to and from a named relationship
377
- # ====Example
378
- # For the following relationship
379
- #
380
- # has_relationship "audio_records", :has_part, :type=>AudioRecord
381
- #
382
- # Methods audio_records_append and audio_records_remove are created.
383
- # Boths methods take an object that is kind_of? ActiveFedora::Base as a parameter
384
- def create_named_relationship_methods(name)
385
- append_method_name = "#{name.to_s.downcase}_append"
386
- remove_method_name = "#{name.to_s.downcase}_remove"
387
- self.send(:define_method,:"#{append_method_name}") {|object| add_named_relationship(name,object)}
388
- self.send(:define_method,:"#{remove_method_name}") {|object| remove_named_relationship(name,object)}
389
- end
390
306
 
391
- # ** EXPERIMENTAL **
392
- # Similar to +create_named_relationship_methods+ except we are merely creating an alias for outbound portion of bidirectional
393
- #
394
- # ====Example
395
- # has_bidirectional_relationship "members", :has_collection_member, :is_member_of_collection
396
- #
397
- # Method members_outbound_append and members_outbound_remove added
398
- # This method will create members_append which does same thing as members_outbound_append
399
- # and will create members_remove which does same thing as members_outbound_remove
400
- def create_bidirectional_named_relationship_methods(name,outbound_name)
401
- append_method_name = "#{name.to_s.downcase}_append"
402
- remove_method_name = "#{name.to_s.downcase}_remove"
403
- self.send(:define_method,:"#{append_method_name}") {|object| add_named_relationship(outbound_name,object)}
404
- self.send(:define_method,:"#{remove_method_name}") {|object| remove_named_relationship(outbound_name,object)}
405
- end
406
307
 
407
-
408
308
  def create_inbound_relationship_finders(name, predicate, opts = {})
409
309
  class_eval <<-END, __FILE__, __LINE__
410
310
  def #{name}(opts={})
@@ -472,62 +372,6 @@ module ActiveFedora
472
372
  end
473
373
  END
474
374
  end
475
-
476
- # relationships are tracked as a hash of structure
477
- # @example
478
- # ds.relationships # => {:self=>{:has_model=>["afmodel:SimpleThing"],:has_part=>["demo:20"]},:inbound=>{:is_part_of=>["demo:6"]}
479
- def relationships
480
- @class_relationships ||= Hash[:self => {}]
481
- end
482
-
483
-
484
- def register_subject(subject)
485
- if !relationships.has_key?(subject)
486
- relationships[subject] = {}
487
- end
488
- end
489
-
490
- def register_predicate(subject, predicate)
491
- register_subject(subject)
492
- if !relationships[subject].has_key?(predicate)
493
- relationships[subject][predicate] = []
494
- end
495
- end
496
-
497
- # If predicate is a symbol, looks up the predicate in the predicate_mappings
498
- # If predicate is not a Symbol, returns the predicate untouched
499
- # @raise UnregisteredPredicateError if the predicate is a symbol but is not found in the predicate_mappings
500
- def predicate_lookup(predicate,namespace="info:fedora/fedora-system:def/relations-external#")
501
- if predicate.class == Symbol
502
- if predicate_mappings[namespace].has_key?(predicate)
503
- return predicate_mappings[namespace][predicate]
504
- else
505
- raise ActiveFedora::UnregisteredPredicateError
506
- end
507
- end
508
- return predicate
509
- end
510
-
511
- def predicate_config
512
- @@predicate_config ||= YAML::load(File.open(ActiveFedora.predicate_config)) if File.exist?(ActiveFedora.predicate_config)
513
- end
514
-
515
- def predicate_mappings
516
- predicate_config[:predicate_mapping]
517
- end
518
-
519
- def default_predicate_namespace
520
- predicate_config[:default_namespace]
521
- end
522
-
523
- def find_predicate(predicate)
524
- predicate_mappings.each do |namespace,predicates|
525
- if predicates.fetch(predicate,nil)
526
- return predicates[predicate], namespace
527
- end
528
- end
529
- raise ActiveFedora::UnregisteredPredicateError, "Unregistered predicate: #{predicate.inspect}"
530
- end
531
375
 
532
376
 
533
377
  end