active-fedora 3.1.6 → 3.2.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
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