active-fedora 7.0.0.rc2 → 7.0.0.rc3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +13 -3
  3. data/CONTRIBUTORS.md +1 -0
  4. data/Gemfile +2 -3
  5. data/active-fedora.gemspec +4 -3
  6. data/gemfiles/rails3.gemfile +1 -7
  7. data/gemfiles/rails4.1.gemfile +5 -0
  8. data/gemfiles/rails4.gemfile +1 -6
  9. data/lib/active_fedora.rb +6 -6
  10. data/lib/active_fedora/associations/association_scope.rb +1 -1
  11. data/lib/active_fedora/base.rb +2 -0
  12. data/lib/active_fedora/datastream.rb +29 -2
  13. data/lib/active_fedora/datastream_collections.rb +2 -2
  14. data/lib/active_fedora/datastream_hash.rb +1 -1
  15. data/lib/active_fedora/datastreams.rb +4 -23
  16. data/lib/active_fedora/file_configurator.rb +8 -7
  17. data/lib/active_fedora/om_datastream.rb +1 -1
  18. data/lib/active_fedora/rdf.rb +9 -0
  19. data/lib/active_fedora/rdf/configurable.rb +59 -0
  20. data/lib/active_fedora/rdf/identifiable.rb +59 -0
  21. data/lib/active_fedora/rdf/indexing.rb +24 -23
  22. data/lib/active_fedora/rdf/list.rb +154 -0
  23. data/lib/active_fedora/{ntriples_rdf_datastream.rb → rdf/ntriples_rdf_datastream.rb} +0 -0
  24. data/lib/active_fedora/rdf/object_resource.rb +20 -0
  25. data/lib/active_fedora/rdf/properties.rb +108 -0
  26. data/lib/active_fedora/rdf/rdf_datastream.rb +113 -0
  27. data/lib/active_fedora/{rdfxml_rdf_datastream.rb → rdf/rdfxml_rdf_datastream.rb} +0 -0
  28. data/lib/active_fedora/rdf/repositories.rb +36 -0
  29. data/lib/active_fedora/rdf/resource.rb +324 -0
  30. data/lib/active_fedora/rdf/term.rb +188 -0
  31. data/lib/active_fedora/relation.rb +1 -0
  32. data/lib/active_fedora/relation/finder_methods.rb +16 -17
  33. data/lib/active_fedora/relation/merger.rb +1 -1
  34. data/lib/active_fedora/relation/query_methods.rb +13 -5
  35. data/lib/active_fedora/reload_on_save.rb +16 -0
  36. data/lib/active_fedora/rubydora_connection.rb +0 -1
  37. data/lib/active_fedora/sharding.rb +1 -1
  38. data/lib/active_fedora/version.rb +1 -1
  39. data/script/console +10 -11
  40. data/spec/config_helper.rb +1 -1
  41. data/spec/fixtures/solr_rdf_descMetadata.nt +1 -1
  42. data/spec/integration/auditable_spec.rb +1 -1
  43. data/spec/integration/base_spec.rb +21 -3
  44. data/spec/integration/complex_rdf_datastream_spec.rb +32 -55
  45. data/spec/integration/field_to_solr_name_spec.rb +6 -8
  46. data/spec/integration/has_many_associations_spec.rb +10 -3
  47. data/spec/integration/load_from_solr_spec.rb +15 -17
  48. data/spec/integration/ntriples_datastream_spec.rb +19 -23
  49. data/spec/integration/om_datastream_spec.rb +1 -1
  50. data/spec/integration/rdf_nested_attributes_spec.rb +51 -70
  51. data/spec/integration/relation_spec.rb +24 -11
  52. data/spec/integration/scoped_query_spec.rb +5 -1
  53. data/spec/samples/hydra-mods_article_datastream.rb +4 -0
  54. data/spec/samples/hydra-rights_metadata_datastream.rb +5 -0
  55. data/spec/samples/marpa-dc_datastream.rb +6 -1
  56. data/spec/samples/special_thing.rb +5 -5
  57. data/spec/spec_helper.rb +0 -3
  58. data/spec/support/an_active_model.rb +5 -12
  59. data/spec/unit/active_fedora_spec.rb +2 -2
  60. data/spec/unit/attributes_spec.rb +4 -8
  61. data/spec/unit/base_datastream_management_spec.rb +5 -29
  62. data/spec/unit/base_spec.rb +4 -0
  63. data/spec/unit/code_configurator_spec.rb +2 -2
  64. data/spec/unit/config_spec.rb +2 -2
  65. data/spec/unit/core_spec.rb +2 -4
  66. data/spec/unit/datastream_spec.rb +15 -0
  67. data/spec/unit/datastreams_spec.rb +1 -12
  68. data/spec/unit/file_configurator_spec.rb +1 -1
  69. data/spec/unit/ntriples_datastream_spec.rb +52 -57
  70. data/spec/unit/om_datastream_spec.rb +3 -3
  71. data/spec/unit/query_spec.rb +3 -4
  72. data/spec/unit/rdf_configurable_spec.rb +37 -0
  73. data/spec/unit/rdf_datastream_spec.rb +5 -7
  74. data/spec/unit/rdf_list_nested_attributes_spec.rb +22 -36
  75. data/spec/unit/rdf_list_spec.rb +26 -38
  76. data/spec/unit/rdf_properties_spec.rb +70 -0
  77. data/spec/unit/rdf_repositories_spec.rb +28 -0
  78. data/spec/unit/rdf_resource_datastream_spec.rb +287 -0
  79. data/spec/unit/rdf_resource_spec.rb +341 -0
  80. data/spec/unit/rdfxml_rdf_datastream_spec.rb +10 -26
  81. data/spec/unit/reload_on_save_spec.rb +24 -0
  82. data/spec/unit/solr_service_spec.rb +3 -3
  83. metadata +45 -16
  84. data/lib/active_fedora/rdf_datastream.rb +0 -113
  85. data/lib/active_fedora/rdf_list.rb +0 -162
  86. data/lib/active_fedora/rdf_node.rb +0 -332
  87. data/lib/active_fedora/rdf_node/term_proxy.rb +0 -141
  88. data/lib/active_fedora/rdf_object.rb +0 -24
  89. data/lib/active_fedora/yaml_adaptor.rb +0 -12
  90. data/spec/unit/rdf_node_spec.rb +0 -36
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7a37149e295c1dc3110b4fc70371e8bb25f980a8
4
- data.tar.gz: b66fcc86fa8132818a1b40e8b1e9f06588d5d2a4
3
+ metadata.gz: 227fe9f2bd7222d69978ee4274e4be82f7d8f801
4
+ data.tar.gz: b12967fce3d7391ef17032c9ee105581a21efe85
5
5
  SHA512:
6
- metadata.gz: 2c50f3f783e44031480f8f284e6bb3c18ec480e391785cfb000e03856b047bdc0d0aa45b481e30500a2f98b23a571e75b7922080edd4085f7abbb4d72675704a
7
- data.tar.gz: 8b70aa1d294dc6768a4e9e25c2d39835d6a73ff0e2ec7cce6101ca314837c7c87c8bc6366f3f909eb70d3a5c87131de96bf35d585740d43988a505b1e030f655
6
+ metadata.gz: 1e3c90b8b1ff58175a17ea84c1bb72671ae9c0d14bbcb944e0e542d89af4de8e2d36ab938bdbb314aa203f4908f6da6a75738b4973ced0c2ce02e879607b1f36
7
+ data.tar.gz: 048679b8db7f8393a59cd04c7dd0b5b04b7b5fe1988d0997abbdffc3d3d603aa30ed14e58171ebc46cb7fd51d39c605f2db58a6af2c29f84a4624ba81b86c0d5
@@ -1,12 +1,22 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.1.0
4
- - 2.0.0
5
- - 1.9.3
3
+ - 2.1.1
6
4
 
7
5
  gemfile:
8
6
  - gemfiles/rails3.gemfile
9
7
  - gemfiles/rails4.gemfile
8
+ - gemfiles/rails4.1.gemfile
9
+
10
+
11
+ matrix:
12
+ include:
13
+ - rvm: 2.1.0
14
+ gemfile: gemfiles/rails4.gemfile
15
+ - rvm: 2.0.0
16
+ gemfile: gemfiles/rails4.gemfile
17
+ - rvm: 1.9.3
18
+ gemfile: gemfiles/rails4.gemfile
19
+
10
20
 
11
21
  notifications:
12
22
  irc: "irc.freenode.org#projecthydra"
@@ -23,4 +23,5 @@ Contributors to this project:
23
23
  * Thomas Johnson
24
24
  * mpc3c
25
25
  * Steven Anderson
26
+ * Trey Terrell
26
27
 
data/Gemfile CHANGED
@@ -4,9 +4,8 @@ source "https://rubygems.org"
4
4
 
5
5
  gemspec
6
6
 
7
- group :development, :test do
8
- gem 'simplecov', :platforms => [:mri_19]#, :mri_20]
9
- gem 'simplecov-rcov', :platforms => [:mri_19]#, :mri_20]
7
+ group :test do
8
+ gem 'simplecov', require: false
10
9
  end
11
10
 
12
11
  gem 'jruby-openssl', :platform=> :jruby
@@ -19,8 +19,8 @@ Gem::Specification.new do |s|
19
19
  s.add_dependency('nom-xml', '>=0.5.1')
20
20
  s.add_dependency("activesupport", '>= 3.0.0')
21
21
  s.add_dependency("mediashelf-loggable")
22
- s.add_dependency("rubydora", '~>1.7.0')
23
- s.add_dependency("rdf")
22
+ s.add_dependency("rubydora", '~>1.7.4')
23
+ s.add_dependency("linkeddata")
24
24
  s.add_dependency("rdf-rdfxml", '~>1.1.0')
25
25
  s.add_dependency("deprecation")
26
26
  s.add_development_dependency("rdoc")
@@ -31,7 +31,8 @@ Gem::Specification.new do |s|
31
31
  s.add_development_dependency("equivalent-xml")
32
32
  s.add_development_dependency("rest-client")
33
33
  s.add_development_dependency("webmock")
34
-
34
+ s.add_development_dependency("simplecov", '~> 0.7.1')
35
+
35
36
  s.files = `git ls-files`.split("\n")
36
37
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
37
38
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
@@ -1,11 +1,5 @@
1
- source "http://rubygems.org"
1
+ source "https://rubygems.org"
2
2
 
3
3
  gemspec :path=>"../"
4
4
 
5
5
  gem 'activemodel', '~> 3.2.13'
6
-
7
- group :development, :test do
8
- gem 'rcov', :platform => :mri_18
9
- gem 'simplecov', :platform => :mri_19
10
- gem 'simplecov-rcov', :platform => :mri_19
11
- end
@@ -0,0 +1,5 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec :path=>"../"
4
+
5
+ gem 'activemodel', '4.1.0.rc1'
@@ -1,10 +1,5 @@
1
- source "http://rubygems.org"
1
+ source "https://rubygems.org"
2
2
 
3
3
  gemspec :path=>"../"
4
4
 
5
5
  gem 'activemodel', '~> 4.0.0'
6
-
7
- group :development, :test do
8
- gem 'simplecov', :platform => :mri_19
9
- gem 'simplecov-rcov', :platform => :mri_19
10
- end
@@ -47,7 +47,6 @@ module ActiveFedora #:nodoc:
47
47
  autoload :Model
48
48
  autoload :NestedAttributes
49
49
  autoload :NomDatastream
50
- autoload :NtriplesRDFDatastream
51
50
  autoload :NullRelation
52
51
  autoload :OmDatastream
53
52
  autoload :Property
@@ -55,13 +54,14 @@ module ActiveFedora #:nodoc:
55
54
  autoload :QualifiedDublinCoreDatastream
56
55
  autoload :Querying
57
56
  autoload :Rdf
58
- autoload :RDFDatastream
59
- autoload :RdfList
60
- autoload :RdfNode
61
- autoload :RdfObject
62
- autoload :RdfxmlRDFDatastream
57
+ autoload_under 'rdf' do
58
+ autoload :RDFDatastream
59
+ autoload :RdfxmlRDFDatastream
60
+ autoload :NtriplesRDFDatastream
61
+ end
63
62
  autoload :Reflection
64
63
  autoload :Relation
64
+ autoload :ReloadOnSave
65
65
 
66
66
  autoload_under 'relation' do
67
67
  autoload :Calculations
@@ -23,7 +23,7 @@ module ActiveFedora
23
23
  if reflection.source_macro == :belongs_to
24
24
  elsif reflection.source_macro == :has_and_belongs_to_many
25
25
  else
26
- scope = scope.where( association.send(:find_predicate) => owner.internal_uri)
26
+ scope = scope.where( ActiveFedora::SolrService.construct_query_for_rel(association.send(:find_predicate) => owner.internal_uri))
27
27
  end
28
28
 
29
29
 
@@ -45,6 +45,8 @@ module ActiveFedora
45
45
  include Serialization
46
46
  include Core
47
47
  include FedoraAttributes
48
+ include ReloadOnSave
49
+ include Rdf::Identifiable
48
50
  end
49
51
 
50
52
  end
@@ -6,9 +6,21 @@ module ActiveFedora
6
6
  attr_writer :digital_object
7
7
  attr_accessor :last_modified
8
8
 
9
+ # @param digital_object [DigitalObject] the digital object that this object belongs to
10
+ # @param dsid [String] the datastream id, if this is nil, a datastream id will be generated.
11
+ # @param options [Hash]
12
+ # @option options [String,IO] :content the content for the datastream
13
+ # @option options [String] :dsLabel label for the datastream
14
+ # @option options [String] :dsLocation location for an external or redirect datastream
15
+ # @option options [String] :controlGroup a controlGroup for the datastream
16
+ # @option options [String] :mimeType the mime-type of the content
17
+ # @option options [String] :prefix the prefix for the auto-generated DSID (not to be confused with the solr prefix)
18
+ # @option options [Boolean] :versionable is the datastream versionable
9
19
  def initialize(digital_object=nil, dsid=nil, options={})
10
- ## When you use the versions feature of rubydora (0.5.x), you need to have a 3 argument constructor
11
- super
20
+ prefix = options.delete(:prefix)
21
+ dsid = nil if dsid == ''
22
+ dsid ||= generate_dsid(digital_object, prefix || "DS")
23
+ super(digital_object, dsid, options)
12
24
  end
13
25
 
14
26
  alias_method :realLabel, :label
@@ -81,6 +93,21 @@ module ActiveFedora
81
93
  end
82
94
 
83
95
  protected
96
+
97
+ # return a valid dsid that is not currently in use. Uses a prefix (default "DS") and an auto-incrementing integer
98
+ # Example: if there are already datastreams with IDs DS1 and DS2, this method will return DS3. If you specify FOO as the prefix, it will return FOO1.
99
+ def generate_dsid(digital_object, prefix)
100
+ return unless digital_object
101
+ matches = digital_object.datastreams.keys.map {|d| data = /^#{prefix}(\d+)$/.match(d); data && data[1].to_i}.compact
102
+ val = matches.empty? ? 1 : matches.max + 1
103
+ format_dsid(prefix, val)
104
+ end
105
+
106
+ ### Provided so that an application can override how generated pids are formatted (e.g DS01 instead of DS1)
107
+ def format_dsid(prefix, suffix)
108
+ sprintf("%s%i", prefix,suffix)
109
+ end
110
+
84
111
  # The string to prefix all solr fields with. Override this method if you want
85
112
  # a prefix other than the default
86
113
  def prefix
@@ -215,8 +215,8 @@ module ActiveFedora
215
215
  assert_kind_of 'datastream', ds, ActiveFedora::Datastream
216
216
  #make sure dsid is nil so that it uses the prefix for mapping purposes
217
217
  #check dsid works for the prefix if it is set
218
- if !ds.dsid.nil? && opts.has_key?(:prefix)
219
- raise "dsid supplied does not conform to pattern #{opts[:prefix]}[number]" unless ds.dsid =~ /#{opts[:prefix]}[0-9]/
218
+ if ds.dsid && opts.has_key?(:prefix)
219
+ raise "dsid supplied (#{ds.dsid}) does not conform to pattern #{opts[:prefix]}[number]" unless ds.dsid =~ /#{opts[:prefix]}[0-9]/
220
220
  end
221
221
 
222
222
  add_datastream(ds,opts)
@@ -15,7 +15,7 @@ module ActiveFedora
15
15
  end
16
16
 
17
17
  def []= (key, val)
18
- @obj.inner_object.datastreams[key]=val# unless @obj.inner_object.new?
18
+ @obj.inner_object.datastreams[key]=val
19
19
  super
20
20
  end
21
21
 
@@ -2,7 +2,7 @@ module ActiveFedora
2
2
  module Datastreams
3
3
  extend ActiveSupport::Concern
4
4
 
5
- autoload :NokogiriDatastreams, 'active_fedora/datastreams/nokogiri_datastreams'
5
+ autoload :NokogiriDatastreams, 'active_fedora/datastreams/nokogiri_datastreams'
6
6
 
7
7
  included do
8
8
  class_attribute :ds_specs
@@ -81,15 +81,9 @@ module ActiveFedora
81
81
  end
82
82
  end
83
83
 
84
- # Adds datastream to the object. Saves the datastream to fedora upon adding.
85
- # If datastream does not have a DSID, a unique DSID is generated
86
- # :prefix option will set the prefix on auto-generated DSID
84
+ # Adds datastream to the object.
87
85
  # @return [String] dsid of the added datastream
88
86
  def add_datastream(datastream, opts={})
89
- if datastream.dsid == nil || datastream.dsid.empty?
90
- prefix = opts.has_key?(:prefix) ? opts[:prefix] : "DS"
91
- datastream.instance_variable_set :@dsid, generate_dsid(prefix)
92
- end
93
87
  datastreams[datastream.dsid] = datastream
94
88
  datastream.dsid
95
89
  end
@@ -99,18 +93,6 @@ module ActiveFedora
99
93
  datastreams.select { |k, ds| ds.metadata? }.reject { |k, ds| ds.kind_of?(ActiveFedora::RelsExtDatastream) }.values
100
94
  end
101
95
 
102
- # return a valid dsid that is not currently in use. Uses a prefix (default "DS") and an auto-incrementing integer
103
- # Example: if there are already datastreams with IDs DS1 and DS2, this method will return DS3. If you specify FOO as the prefix, it will return FOO1.
104
- def generate_dsid(prefix="DS")
105
- matches = datastreams.keys.map {|d| data = /^#{prefix}(\d+)$/.match(d); data && data[1].to_i}.compact
106
- val = matches.empty? ? 1 : matches.max + 1
107
- format_dsid(prefix, val)
108
- end
109
-
110
- ### Provided so that an application can override how generated pids are formatted (e.g DS01 instead of DS1)
111
- def format_dsid(prefix, suffix)
112
- sprintf("%s%i", prefix,suffix)
113
- end
114
96
 
115
97
  # Returns the RELS-EXT Datastream
116
98
  # Tries to grab from in-memory datastreams first
@@ -153,10 +135,9 @@ module ActiveFedora
153
135
 
154
136
 
155
137
  def create_datastream(type, dsid, opts={})
156
- dsid ||= generate_dsid(opts[:prefix] || "DS")
157
138
  klass = type.kind_of?(Class) ? type : type.constantize
158
- raise ArgumentError, "Argument dsid must be of type string" unless dsid.kind_of?(String)
159
- ds = klass.new(inner_object, dsid)
139
+ raise ArgumentError, "Argument dsid must be of type string" if dsid && !dsid.kind_of?(String)
140
+ ds = klass.new(inner_object, dsid, prefix: opts[:prefix])
160
141
  [:mimeType, :controlGroup, :dsLabel, :dsLocation, :checksumType, :versionable].each do |key|
161
142
  ds.send("#{key}=".to_sym, opts[key]) unless opts[key].nil?
162
143
  end
@@ -1,5 +1,5 @@
1
1
  require 'erb'
2
- require 'active_fedora/yaml_adaptor'
2
+ require 'yaml'
3
3
 
4
4
  module ActiveFedora
5
5
  class FileConfigurator
@@ -110,9 +110,10 @@ module ActiveFedora
110
110
  end
111
111
 
112
112
  begin
113
- fedora_yml = YAMLAdaptor.load(config_erb)
114
- rescue StandardError => e
115
- raise("fedora.yml was found, but could not be parsed.\n")
113
+ fedora_yml = YAML.load(config_erb)
114
+ rescue Psych::SyntaxError => e
115
+ raise "fedora.yml was found, but could not be parsed. " \
116
+ "Error #{e.message}"
116
117
  end
117
118
 
118
119
  config = fedora_yml.symbolize_keys
@@ -133,7 +134,7 @@ module ActiveFedora
133
134
  end
134
135
 
135
136
  begin
136
- solr_yml = YAMLAdaptor.load(config_erb)
137
+ solr_yml = YAML.load(config_erb)
137
138
  rescue StandardError => e
138
139
  raise("solr.yml was found, but could not be parsed.\n")
139
140
  end
@@ -209,7 +210,7 @@ module ActiveFedora
209
210
 
210
211
  def predicate_config
211
212
  @predicate_config_path ||= build_predicate_config_path
212
- YAMLAdaptor.load(File.open(@predicate_config_path)) if File.exist?(@predicate_config_path)
213
+ YAML.load(File.open(@predicate_config_path)) if File.exist?(@predicate_config_path)
213
214
  end
214
215
 
215
216
  protected
@@ -223,7 +224,7 @@ module ActiveFedora
223
224
  end
224
225
 
225
226
  def valid_predicate_mapping?(testfile)
226
- mapping = YAMLAdaptor.load(File.open(testfile))
227
+ mapping = YAML.load(File.open(testfile))
227
228
  return false unless mapping.has_key?(:default_namespace) && mapping[:default_namespace].is_a?(String)
228
229
  return false unless mapping.has_key?(:predicate_mapping) && mapping[:predicate_mapping].is_a?(Hash)
229
230
  true
@@ -186,7 +186,7 @@ module ActiveFedora
186
186
  end
187
187
 
188
188
  def generate_solr_symbol(base, data_type)
189
- ActiveFedora::SolrService.solr_name(base.to_sym, type: data_type)
189
+ ActiveFedora::SolrService.solr_name([prefix,base].join, type: data_type)
190
190
  end
191
191
 
192
192
  # ** Experimental **
@@ -4,5 +4,14 @@ module ActiveFedora
4
4
  autoload :NestedAttributes
5
5
  autoload :NodeConfig
6
6
  autoload :Indexing
7
+ autoload :Configurable
8
+ autoload :Properties
9
+ autoload :Identifiable
10
+ autoload :Repositories
11
+ autoload :Resource
12
+ autoload :VocabularyLoader
13
+ autoload :ObjectResource
14
+ autoload :Term
15
+ autoload :List
7
16
  end
8
17
  end
@@ -0,0 +1,59 @@
1
+ module ActiveFedora::Rdf
2
+ ##
3
+ # Module to include configurable class-wide properties common to
4
+ # Resource and RDFDatastream. It does its work at the class level,
5
+ # and is meant to be extended.
6
+ #
7
+ # Define properties at the class level with:
8
+ #
9
+ # configure base_uri: "http://oregondigital.org/resource/", repository: :parent
10
+ # Available properties are base_uri, rdf_label, type, and repository
11
+ module Configurable
12
+ extend Deprecation
13
+
14
+ def base_uri
15
+ nil
16
+ end
17
+
18
+ def rdf_label
19
+ nil
20
+ end
21
+
22
+ def type
23
+ nil
24
+ end
25
+
26
+ def rdf_type(value)
27
+ Deprecation.warn Configurable, "rdf_type is deprecated and will be removed in active-fedora 8.0.0. Use configure type: instead.", caller
28
+ configure type: value
29
+ end
30
+
31
+ def repository
32
+ :parent
33
+ end
34
+
35
+ # API method for configuring class properties an RDF Resource may need.
36
+ # This is an alternative to overriding the methods extended with this module.
37
+ def configure(options = {})
38
+ {
39
+ base_uri: options[:base_uri],
40
+ rdf_label: options[:rdf_label],
41
+ type: options[:type],
42
+ repository: options[:repository]
43
+ }.each do |name, value|
44
+ if value
45
+ value = self.send("transform_#{name}", value) if self.respond_to?("transform_#{name}")
46
+ define_singleton_method(name) do
47
+ value
48
+ end
49
+ end
50
+ end
51
+ end
52
+
53
+ def transform_type(value)
54
+ RDF::URI.new(value).tap do |value|
55
+ Resource.type_registry[value] = self
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,59 @@
1
+ ##
2
+ # This module is included to allow for an ActiveFedora::Base object to be set as the class_name for a Resource.
3
+ # Enables functionality like:
4
+ # base = ActiveFedora::Base.new('oregondigital:1')
5
+ # base.title = 'test'
6
+ # base.save
7
+ # subject.descMetadata.set = base
8
+ # subject.descMetadata.set # => <ActiveFedora::Base>
9
+ # subject.descMetadata.set.title # => 'test'
10
+ module ActiveFedora::Rdf::Identifiable
11
+ extend ActiveSupport::Concern
12
+ delegate :parent, :dump, :query, :rdf_type, :to => :resource
13
+
14
+ ##
15
+ # Defines which resource defines this ActiveFedora object.
16
+ # This is required for ActiveFedora::Rdf::Resource#set_value to append graphs.
17
+ # If there is no RdfResource, make a dummy one and freeze its graph.
18
+ def resource
19
+ return self.send(self.class.resource_datastream).resource unless self.class.resource_datastream.nil?
20
+ ActiveFedora::Rdf::ObjectResource.new(self.pid).freeze
21
+ end
22
+
23
+ module ClassMethods
24
+ ##
25
+ # Returns the datastream whose ActiveFedora::Rdf::Resource is used
26
+ # for the identifiable object. This supports delegating methods to
27
+ # the Resource and #from_uri. Defaults to :descMetadata if it
28
+ # responds to #rdf_subject, otherwise looks for the first
29
+ # registered datastream that does.
30
+ def resource_datastream(ds=nil)
31
+ @resource_datastream ||= ds ? ds : nil
32
+ return @resource_datastream unless @resource_datastream.nil?
33
+ return :descMetadata if self.ds_specs['descMetadata'][:type].respond_to? :rdf_subject
34
+ self.ds_specs.each do |dsid, conf|
35
+ return dsid.to_sym if conf[:type].respond_to? :rdf_subject
36
+ end
37
+ nil
38
+ end
39
+
40
+ ##
41
+ # Finds the appropriate ActiveFedora::Base object given a URI from a graph.
42
+ # Expected by the API in ActiveFedora::Rdf::Resource
43
+ # @TODO: Generalize this.
44
+ # @see ActiveFedora::Rdf::Resource.from_uri
45
+ # @param [RDF::URI] uri URI that is being looked up.
46
+ def from_uri(uri,_)
47
+ self.find(pid_from_subject(uri))
48
+ end
49
+
50
+ ##
51
+ # Finds the pid of an object from its RDF subject, override this
52
+ # for URI configurations not of form base_uri + pid
53
+ # @param [RDF::URI] uri URI to convert to pid
54
+ def pid_from_subject(uri)
55
+ base_uri = resource_datastream ? self.ds_specs[resource_datastream.to_s][:type].resource_class.base_uri : ActiveFedora::Rdf::ObjectResource.base_uri
56
+ uri.to_s.gsub(base_uri, "")
57
+ end
58
+ end
59
+ end