active-fedora 1.0.5 → 1.1.0
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.
- data/.document +5 -0
- data/.gitignore +21 -0
- data/.hg/00changelog.i +0 -0
- data/.hg/branch +1 -0
- data/.hg/branch.cache +2 -0
- data/.hg/dirstate +0 -0
- data/.hg/hgrc +2 -0
- data/.hg/requires +2 -0
- data/.hg/store/00changelog.i +0 -0
- data/.hg/store/00manifest.i +0 -0
- data/.hg/store/data/.hgignore.i +0 -0
- data/.hg/store/data/.hgtags.i +0 -0
- data/.hg/store/data/_c_o_p_y_i_n_g.txt.i +0 -0
- data/.hg/store/data/_c_o_y_i_n_g._l_e_s_s_e_r.txt.i +0 -0
- data/.hg/store/data/_history.txt.i +0 -0
- data/.hg/store/data/_license.txt.i +0 -0
- data/.hg/store/data/_manifest.txt.i +0 -0
- data/.hg/store/data/_post_install.txt.i +0 -0
- data/.hg/store/data/_r_e_a_d_m_e.rdoc.i +0 -0
- data/.hg/store/data/_r_e_a_d_m_e.txt.i +0 -0
- data/.hg/store/data/_rakefile.i +0 -0
- data/.hg/store/data/_v_e_r_s_i_o_n.i +0 -0
- data/.hg/store/data/active-fedora.gemspec.i +0 -0
- data/.hg/store/data/active__fedora/_history.txt.i +0 -0
- data/.hg/store/data/active__fedora/_manifest.txt.i +0 -0
- data/.hg/store/data/active__fedora/_post_install.txt.i +0 -0
- data/.hg/store/data/active__fedora/_r_e_a_d_m_e.rdoc.i +0 -0
- data/.hg/store/data/active__fedora/_rakefile.i +0 -0
- data/.hg/store/data/active__fedora/lib/active__fedora.rb.i +0 -0
- data/.hg/store/data/active__fedora/script/console.i +0 -0
- data/.hg/store/data/active__fedora/script/destroy.i +0 -0
- data/.hg/store/data/active__fedora/script/generate.i +0 -0
- data/.hg/store/data/active__fedora/spec/active__fedora__spec.rb.i +0 -0
- data/.hg/store/data/active__fedora/spec/spec__helper.rb.i +0 -0
- data/.hg/store/data/config/fedora.yml.i +0 -0
- data/.hg/store/data/config/solr__mappings.yml.i +0 -0
- data/.hg/store/data/config/solr__mappings__af__0.1.yml.i +0 -0
- data/.hg/store/data/config/solr__mappings__bl__2.4.yml.i +0 -0
- data/.hg/store/data/lib/active-fedora.rb.i +0 -0
- data/.hg/store/data/lib/active__fedora.rb.i +0 -0
- data/.hg/store/data/lib/active__fedora/base.rb.i +0 -0
- data/.hg/store/data/lib/active__fedora/content__model.rb.i +0 -0
- data/.hg/store/data/lib/active__fedora/datastream.rb.i +0 -0
- data/.hg/store/data/lib/active__fedora/fedora__object.rb.i +0 -0
- data/.hg/store/data/lib/active__fedora/metadata__datastream.rb.i +0 -0
- data/.hg/store/data/lib/active__fedora/model.rb.i +0 -0
- data/.hg/store/data/lib/active__fedora/property.rb.i +0 -0
- data/.hg/store/data/lib/active__fedora/qualified__dublin__core__datastream.rb.i +0 -0
- data/.hg/store/data/lib/active__fedora/relationship.rb.i +0 -0
- data/.hg/store/data/lib/active__fedora/rels__ext__datastream.rb.i +0 -0
- data/.hg/store/data/lib/active__fedora/semantic__node.rb.i +0 -0
- data/.hg/store/data/lib/active__fedora/solr__mapper.rb.i +0 -0
- data/.hg/store/data/lib/active__fedora/solr__service.rb.i +0 -0
- data/.hg/store/data/lib/fedora/base.rb.i +0 -0
- data/.hg/store/data/lib/fedora/connection.rb.i +0 -0
- data/.hg/store/data/lib/fedora/datastream.rb.i +0 -0
- data/.hg/store/data/lib/fedora/fedora__object.rb.i +0 -0
- data/.hg/store/data/lib/fedora/formats.rb.i +0 -0
- data/.hg/store/data/lib/fedora/generic__search.rb.i +0 -0
- data/.hg/store/data/lib/fedora/repository.rb.i +0 -0
- data/.hg/store/data/lib/ruby-fedora.rb.i +0 -0
- data/.hg/store/data/lib/util/class__level__inheritable__attributes.rb.i +0 -0
- data/.hg/store/data/script/console.i +0 -0
- data/.hg/store/data/script/destroy.i +0 -0
- data/.hg/store/data/script/generate.i +0 -0
- data/.hg/store/data/solr/config/schema-1.5.xml.i +0 -0
- data/.hg/store/data/solr/config/schema.xml.i +0 -0
- data/.hg/store/data/solr/config/solrconfig-1.5.xml.i +0 -0
- data/.hg/store/data/spec/fixtures/changeme155.xml.i +0 -0
- data/.hg/store/data/spec/fixtures/dino.jpg.i +0 -0
- data/.hg/store/data/spec/fixtures/minivan.jpg.d +0 -0
- data/.hg/store/data/spec/fixtures/minivan.jpg.i +0 -0
- data/.hg/store/data/spec/fixtures/test__12.foxml.xml.i +0 -0
- data/.hg/store/data/spec/integration/active__fedora/base__spec.rb.i +0 -0
- data/.hg/store/data/spec/integration/active__fedora/datastream__spec.rb.i +0 -0
- data/.hg/store/data/spec/integration/active__fedora/fedora__object__spec.rb.i +0 -0
- data/.hg/store/data/spec/integration/active__fedora/full__featured__model__spec.rb.i +0 -0
- data/.hg/store/data/spec/integration/active__fedora/model__spec.rb.i +0 -0
- data/.hg/store/data/spec/integration/active__fedora/rels__ext__datastream__spec.rb.i +0 -0
- data/.hg/store/data/spec/integration/active__fedora/semantic__node__spec.rb.i +0 -0
- data/.hg/store/data/spec/integration/base__file__management__spec.rb.i +0 -0
- data/.hg/store/data/spec/integration/base__spec.rb.i +0 -0
- data/.hg/store/data/spec/integration/bug__spec.rb.i +0 -0
- data/.hg/store/data/spec/integration/datastream__spec.rb.i +0 -0
- data/.hg/store/data/spec/integration/datastreams__crud__spec.rb.i +0 -0
- data/.hg/store/data/spec/integration/fedora__object__spec.rb.i +0 -0
- data/.hg/store/data/spec/integration/full__featured__model__spec.rb.i +0 -0
- data/.hg/store/data/spec/integration/model__spec.rb.i +0 -0
- data/.hg/store/data/spec/integration/rels__ext__datastream__spec.rb.i +0 -0
- data/.hg/store/data/spec/integration/repository__spec.rb.i +0 -0
- data/.hg/store/data/spec/integration/rf__fedora__object__spec.rb.i +0 -0
- data/.hg/store/data/spec/integration/semantic__node__spec.rb.i +0 -0
- data/.hg/store/data/spec/integration/solr__service__spec.rb.i +0 -0
- data/.hg/store/data/spec/samples/models/audio__record.rb.i +0 -0
- data/.hg/store/data/spec/samples/models/image.rb.i +0 -0
- data/.hg/store/data/spec/samples/models/oral__history.rb.i +0 -0
- data/.hg/store/data/spec/samples/models/seminar.rb.i +0 -0
- data/.hg/store/data/spec/samples/models/seminar__audio__file.rb.i +0 -0
- data/.hg/store/data/spec/samples/oh__qdc.xml.i +0 -0
- data/.hg/store/data/spec/samples/oral__history.rb.i +0 -0
- data/.hg/store/data/spec/samples/oral__history__sample.xml.i +0 -0
- data/.hg/store/data/spec/samples/oral__history__sample__model.rb.i +0 -0
- data/.hg/store/data/spec/samples/oral__history__xml.xml.i +0 -0
- data/.hg/store/data/spec/spec.opts.i +0 -0
- data/.hg/store/data/spec/spec__helper.rb.i +0 -0
- data/.hg/store/data/spec/unit/active__fedora/base__cma__spec.rb.i +0 -0
- data/.hg/store/data/spec/unit/active__fedora/base__extra__spec.rb.i +0 -0
- data/.hg/store/data/spec/unit/active__fedora/base__spec.rb.i +0 -0
- data/.hg/store/data/spec/unit/active__fedora/content__model__spec.rb.i +0 -0
- data/.hg/store/data/spec/unit/active__fedora/datastream__spec.rb.i +0 -0
- data/.hg/store/data/spec/unit/active__fedora/inheritance__spec.rb.i +0 -0
- data/.hg/store/data/spec/unit/active__fedora/metadata__datastream__spec.rb.i +0 -0
- data/.hg/store/data/spec/unit/active__fedora/model__spec.rb.i +0 -0
- data/.hg/store/data/spec/unit/active__fedora/property__spec.rb.i +0 -0
- data/.hg/store/data/spec/unit/active__fedora/qualified__dublin__core__datastream__spec.rb.i +0 -0
- data/.hg/store/data/spec/unit/active__fedora/relationship__spec.rb.i +0 -0
- data/.hg/store/data/spec/unit/active__fedora/rels__ext__datastream__spec.rb.i +0 -0
- data/.hg/store/data/spec/unit/active__fedora/semantic__node__spec.rb.i +0 -0
- data/.hg/store/data/spec/unit/active__fedora/solr__service__spec.rb.i +0 -0
- data/.hg/store/data/spec/unit/active__fedora__spec.rb.i +0 -0
- data/.hg/store/data/spec/unit/base__cma__spec.rb.i +0 -0
- data/.hg/store/data/spec/unit/base__datastream__management__spec.rb.i +0 -0
- data/.hg/store/data/spec/unit/base__extra__spec.rb.i +0 -0
- data/.hg/store/data/spec/unit/base__file__management__spec.rb.i +0 -0
- data/.hg/store/data/spec/unit/base__loader__spec.rb.i +0 -0
- data/.hg/store/data/spec/unit/base__spec.rb.i +0 -0
- data/.hg/store/data/spec/unit/connection__spec.rb.i +0 -0
- data/.hg/store/data/spec/unit/content__model__spec.rb.i +0 -0
- data/.hg/store/data/spec/unit/datastream__concurrency__spec.rb.i +0 -0
- data/.hg/store/data/spec/unit/datastream__spec.rb.i +0 -0
- data/.hg/store/data/spec/unit/fedora__object__spec.rb.i +0 -0
- data/.hg/store/data/spec/unit/inheritance__spec.rb.i +0 -0
- data/.hg/store/data/spec/unit/metadata__datastream__spec.rb.i +0 -0
- data/.hg/store/data/spec/unit/model__spec.rb.i +0 -0
- data/.hg/store/data/spec/unit/property__spec.rb.i +0 -0
- data/.hg/store/data/spec/unit/qualified__dublin__core__datastream__spec.rb.i +0 -0
- data/.hg/store/data/spec/unit/relationship__spec.rb.i +0 -0
- data/.hg/store/data/spec/unit/rels__ext__datastream__spec.rb.i +0 -0
- data/.hg/store/data/spec/unit/repository__spec.rb.i +0 -0
- data/.hg/store/data/spec/unit/rf__datastream__spec.rb.i +0 -0
- data/.hg/store/data/spec/unit/semantic__node__spec.rb.i +0 -0
- data/.hg/store/data/spec/unit/solr__config__options__spec.rb.i +0 -0
- data/.hg/store/data/spec/unit/solr__mapper__spec.rb.i +0 -0
- data/.hg/store/data/spec/unit/solr__service__spec.rb.i +0 -0
- data/.hg/store/data/tasks/rspec.rake.i +0 -0
- data/.hg/store/undo +0 -0
- data/.hg/undo.branch +1 -0
- data/.hg/undo.dirstate +0 -0
- data/.hgignore +7 -0
- data/.hgtags +14 -0
- data/COPYING.txt +674 -0
- data/COYING.LESSER.txt +165 -0
- data/History.txt +34 -0
- data/LICENSE +20 -0
- data/License.txt +58 -0
- data/Manifest.txt +1 -1
- data/README.rdoc +13 -54
- data/README.txt +59 -0
- data/Rakefile +35 -0
- data/VERSION +1 -0
- data/active-fedora.gemspec +359 -0
- data/config/fedora.yml +16 -0
- data/config/solr_mappings.yml +14 -0
- data/config/solr_mappings_af_0.1.yml +16 -0
- data/config/solr_mappings_bl_2.4.yml +14 -0
- data/lib/active_fedora.rb +66 -6
- data/lib/active_fedora/base.rb +59 -23
- data/lib/active_fedora/datastream.rb +1 -1
- data/lib/active_fedora/metadata_datastream.rb +14 -7
- data/lib/active_fedora/model.rb +4 -4
- data/lib/active_fedora/rels_ext_datastream.rb +1 -1
- data/lib/active_fedora/semantic_node.rb +4 -3
- data/lib/active_fedora/solr_mapper.rb +17 -0
- data/lib/active_fedora/solr_service.rb +44 -2
- data/lib/fedora/base.rb +38 -0
- data/lib/fedora/connection.rb +210 -0
- data/lib/fedora/datastream.rb +56 -0
- data/lib/fedora/fedora_object.rb +161 -0
- data/lib/fedora/formats.rb +30 -0
- data/lib/fedora/generic_search.rb +71 -0
- data/lib/fedora/repository.rb +287 -0
- data/lib/ruby-fedora.rb +20 -0
- data/lib/util/class_level_inheritable_attributes.rb +23 -0
- data/script/console +15 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/solr/config/schema-1.5.xml +468 -0
- data/solr/config/schema.xml +174 -212
- data/solr/config/solrconfig-1.5.xml +1069 -0
- data/spec/active_fedora_spec.rb +7 -0
- data/spec/fixtures/changeme155.xml +255 -0
- data/spec/fixtures/dino.jpg +0 -0
- data/spec/fixtures/minivan.jpg +0 -0
- data/spec/fixtures/test_12.foxml.xml +121 -0
- data/spec/integration/base_file_management_spec.rb +20 -0
- data/spec/integration/base_spec.rb +196 -0
- data/spec/integration/bug_spec.rb +57 -0
- data/spec/integration/datastream_spec.rb +60 -0
- data/spec/integration/datastreams_crud_spec.rb +208 -0
- data/spec/integration/fedora_object_spec.rb +77 -0
- data/spec/integration/full_featured_model_spec.rb +207 -0
- data/spec/integration/model_spec.rb +54 -0
- data/spec/integration/rels_ext_datastream_spec.rb +67 -0
- data/spec/integration/repository_spec.rb +297 -0
- data/spec/integration/rf_fedora_object_spec.rb +95 -0
- data/spec/integration/semantic_node_spec.rb +95 -0
- data/spec/integration/solr_service_spec.rb +33 -0
- data/spec/samples/models/audio_record.rb +29 -0
- data/spec/samples/models/image.rb +5 -0
- data/spec/samples/models/oral_history.rb +50 -0
- data/spec/samples/models/seminar.rb +29 -0
- data/spec/samples/models/seminar_audio_file.rb +34 -0
- data/spec/samples/oh_qdc.xml +32 -0
- data/spec/samples/oral_history_sample.xml +38 -0
- data/spec/samples/oral_history_sample_model.rb +39 -0
- data/spec/samples/oral_history_xml.xml +35 -0
- data/spec/spec.opts +5 -0
- data/spec/spec_helper.rb +41 -0
- data/spec/unit/active_fedora_spec.rb +15 -0
- data/spec/unit/base_cma_spec.rb +25 -0
- data/spec/unit/base_datastream_management_spec.rb +119 -0
- data/spec/unit/base_extra_spec.rb +108 -0
- data/spec/unit/base_file_management_spec.rb +90 -0
- data/spec/unit/base_loader_spec.rb +43 -0
- data/spec/unit/base_spec.rb +584 -0
- data/spec/unit/connection_spec.rb +25 -0
- data/spec/unit/content_model_spec.rb +51 -0
- data/spec/unit/datastream_concurrency_spec.rb +59 -0
- data/spec/unit/datastream_spec.rb +85 -0
- data/spec/unit/fedora_object_spec.rb +66 -0
- data/spec/unit/inheritance_spec.rb +46 -0
- data/spec/unit/metadata_datastream_spec.rb +290 -0
- data/spec/unit/model_spec.rb +186 -0
- data/spec/unit/property_spec.rb +50 -0
- data/spec/unit/qualified_dublin_core_datastream_spec.rb +177 -0
- data/spec/unit/relationship_spec.rb +77 -0
- data/spec/unit/rels_ext_datastream_spec.rb +99 -0
- data/spec/unit/repository_spec.rb +136 -0
- data/spec/unit/rf_datastream_spec.rb +49 -0
- data/spec/unit/semantic_node_spec.rb +354 -0
- data/spec/unit/solr_config_options_spec.rb +98 -0
- data/spec/unit/solr_mapper_spec.rb +31 -0
- data/spec/unit/solr_service_spec.rb +83 -0
- data/tasks/hoe.rake +0 -0
- data/tasks/rspec.rake +29 -0
- metadata +373 -55
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
require 'fedora/base'
|
|
2
|
+
require 'fedora/repository'
|
|
3
|
+
|
|
4
|
+
class Fedora::Datastream < Fedora::BaseObject
|
|
5
|
+
|
|
6
|
+
attr_accessor :mime_type
|
|
7
|
+
|
|
8
|
+
def initialize(attrs = {})
|
|
9
|
+
super
|
|
10
|
+
if attrs
|
|
11
|
+
if attrs[:mime_type]
|
|
12
|
+
self.mime_type = attrs[:mime_type]
|
|
13
|
+
elsif attrs[:mimeType]
|
|
14
|
+
self.mime_type = attrs[:mimeType]
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
self.control_group='M' if @attributes[:mimeType]
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def pid
|
|
21
|
+
attributes[:pid]
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def control_group
|
|
25
|
+
@attributes[:controlGroup]
|
|
26
|
+
end
|
|
27
|
+
def control_group=(cg)
|
|
28
|
+
@attributes[:controlGroup]=cg
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def dsid
|
|
32
|
+
if attributes.has_key?(:dsid)
|
|
33
|
+
attributes[:dsid]
|
|
34
|
+
else
|
|
35
|
+
attributes[:dsID]
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def label
|
|
40
|
+
@attributes[:dsLabel]
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def label=(new_label)
|
|
44
|
+
@attributes[:dsLabel] = new_label
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# See http://www.fedora.info/definitions/identifiers/
|
|
48
|
+
def uri
|
|
49
|
+
"fedora:info/#{pid}/datastreams/#{dsid}"
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# @returns the url of the datastream in Fedora, without the repository userinfo
|
|
53
|
+
def url
|
|
54
|
+
return "#{Fedora::Repository.instance.base_url}/objects/#{pid}/datastreams/#{dsid}"
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
require 'xmlsimple'
|
|
2
|
+
require 'rexml/document'
|
|
3
|
+
require 'fedora/base'
|
|
4
|
+
|
|
5
|
+
class Fedora::FedoraObject < Fedora::BaseObject
|
|
6
|
+
attr_accessor :target_repository
|
|
7
|
+
|
|
8
|
+
# = Parameters
|
|
9
|
+
# attrs<Hash>:: fedora object attributes (see below)
|
|
10
|
+
#
|
|
11
|
+
# == Attributes (attrs)
|
|
12
|
+
# namespace<Symbol>::
|
|
13
|
+
# pid<Symbol>::
|
|
14
|
+
# state<Symbol>::
|
|
15
|
+
# label<Symbol>::
|
|
16
|
+
# contentModel<Symbol>::
|
|
17
|
+
# objectXMLFormat<Symbol>::
|
|
18
|
+
# ownerID<Symbol>::
|
|
19
|
+
#-
|
|
20
|
+
def initialize(attrs = nil)
|
|
21
|
+
super
|
|
22
|
+
# TODO: check for required attributes
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
####
|
|
26
|
+
# Attribute Accessors
|
|
27
|
+
####
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def load_attributes_from_fedora
|
|
31
|
+
#self.attributes.merge!(profile)
|
|
32
|
+
attributes.merge!(profile)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Reads all object properties from the object's FOXML into a hash. Provides slightly more info than .profile, including the object state.
|
|
36
|
+
def properties_from_fedora
|
|
37
|
+
#object_rexml = REXML::Document.new(object_xml)
|
|
38
|
+
#properties = {
|
|
39
|
+
# :pid => object_rexml.root.attributes["PID"],
|
|
40
|
+
# :state => object_rexml.root.elements["//foxml:property[@NAME='info:fedora/fedora-system:def/model#state']"].attributes["VALUE"],
|
|
41
|
+
# :create_date => object_rexml.root.elements["//foxml:property[@NAME='info:fedora/fedora-system:def/model#createdDate']"].attributes["VALUE"],
|
|
42
|
+
# :modified_date => object_rexml.root.elements["//foxml:property[@NAME='info:fedora/fedora-system:def/view#lastModifiedDate']"].attributes["VALUE"],
|
|
43
|
+
# :owner_id => object_rexml.root.elements['//foxml:property[@NAME="info:fedora/fedora-system:def/model#ownerId"]'].attributes['VALUE']
|
|
44
|
+
#}
|
|
45
|
+
#label_element = object_rexml.root.elements["//foxml:property[@NAME='info:fedora/fedora-system:def/model#label']"]
|
|
46
|
+
#if profile_hash[:label]
|
|
47
|
+
# properties.merge!({:label => label_element.attributes["VALUE"]})
|
|
48
|
+
#end
|
|
49
|
+
return profile
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def create_date
|
|
53
|
+
if attributes[:create_date]
|
|
54
|
+
return attributes[:create_date]
|
|
55
|
+
elsif !new_object?
|
|
56
|
+
properties_from_fedora[:create_date]
|
|
57
|
+
else
|
|
58
|
+
return nil
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def modified_date
|
|
63
|
+
if attributes[:modified_date]
|
|
64
|
+
return attributes[:modified_date]
|
|
65
|
+
elsif !new_object?
|
|
66
|
+
properties_from_fedora[:modified_date]
|
|
67
|
+
else
|
|
68
|
+
return nil
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def pid
|
|
74
|
+
self.attributes[:pid]
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def pid=(new_pid)
|
|
78
|
+
self.attributes.merge!({:pid => new_pid})
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def state
|
|
82
|
+
if attributes[:state]
|
|
83
|
+
return attributes[:state]
|
|
84
|
+
elsif !new_object?
|
|
85
|
+
properties_from_fedora[:state]
|
|
86
|
+
else
|
|
87
|
+
return nil
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def state=(new_state)
|
|
92
|
+
if ["I", "A", "D"].include? new_state
|
|
93
|
+
self.attributes[:state] = new_state
|
|
94
|
+
else
|
|
95
|
+
raise 'The object state of "' + new_state + '" is invalid. The allowed values for state are: A (active), D (deleted), and I (inactive).'
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def label
|
|
100
|
+
if attributes[:label]
|
|
101
|
+
return attributes[:label]
|
|
102
|
+
elsif !new_object?
|
|
103
|
+
properties_from_fedora[:label]
|
|
104
|
+
else
|
|
105
|
+
return nil
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def label=(new_label)
|
|
110
|
+
self.attributes[:label] = new_label
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# Get the object and read its @ownerId from the profile
|
|
114
|
+
def owner_id
|
|
115
|
+
if attributes[:owner_id]
|
|
116
|
+
return attributes[:owner_id]
|
|
117
|
+
elsif !new_object?
|
|
118
|
+
properties_from_fedora[:owner_id]
|
|
119
|
+
else
|
|
120
|
+
return nil
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def owner_id=(new_owner_id)
|
|
125
|
+
self.attributes.merge!({:ownerID => new_owner_id})
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def profile
|
|
129
|
+
# Use xmlsimple to slurp the attributes
|
|
130
|
+
retrieved_profile = XmlSimple.xml_in(Fedora::Repository.instance.fetch_custom(self.pid, :profile))
|
|
131
|
+
label = retrieved_profile["objLabel"].first unless retrieved_profile["objLabel"].first == {}
|
|
132
|
+
profile_hash = Hash[:pid => retrieved_profile["pid"],
|
|
133
|
+
:owner_id => retrieved_profile["objOwnerId"].first,
|
|
134
|
+
:label => label,
|
|
135
|
+
:create_date => retrieved_profile["objCreateDate"].first,
|
|
136
|
+
:modified_date => retrieved_profile["objLastModDate"].first,
|
|
137
|
+
:methods_list_url => retrieved_profile["objDissIndexViewURL"].first,
|
|
138
|
+
:datastreams_list_url => retrieved_profile["objItemIndexViewURL"].first,
|
|
139
|
+
:state => retrieved_profile["objState"].first
|
|
140
|
+
]
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def object_xml
|
|
144
|
+
Fedora::Repository.instance.fetch_custom(pid, :objectXML)
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def self.object_xml(pid=pid)
|
|
148
|
+
Fedora::Repository.instance.fetch_custom(pid, :objectXML)
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
# See http://www.fedora.info/definitions/identifiers
|
|
152
|
+
def uri
|
|
153
|
+
"fedora:info/#{pid}"
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
# @returns the url of the object in Fedora, without the repository userinfo
|
|
157
|
+
def url
|
|
158
|
+
repo_url = Fedora::Repository.instance.fedora_url
|
|
159
|
+
return "#{repo_url.scheme}://#{repo_url.host}:#{repo_url.port}#{repo_url.path}/objects/#{pid}"
|
|
160
|
+
end
|
|
161
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
module Fedora
|
|
2
|
+
module XmlFormat
|
|
3
|
+
extend self
|
|
4
|
+
|
|
5
|
+
def extension
|
|
6
|
+
"xml"
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def mime_type
|
|
10
|
+
"text/xml"
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def encode(hash)
|
|
14
|
+
hash.to_xml
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def decode(xml)
|
|
18
|
+
from_xml_data(Hash.from_xml(xml))
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
private
|
|
22
|
+
def from_xml_data(data)
|
|
23
|
+
if data.is_a?(Hash) && data.keys.size == 1
|
|
24
|
+
data.values.first
|
|
25
|
+
else
|
|
26
|
+
data
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
#
|
|
2
|
+
# @Creator Matt Zumwalt, MediaShelf LLC
|
|
3
|
+
# @Copyright Matt Zumwalt, 2007. All Rights Reserved.
|
|
4
|
+
#
|
|
5
|
+
|
|
6
|
+
module Fedora
|
|
7
|
+
class GenericSearch
|
|
8
|
+
|
|
9
|
+
def initialize(uri, service_name)
|
|
10
|
+
@uri = "#{uri}/#{service_name}"
|
|
11
|
+
@client = HTTPClient.new(@uri)
|
|
12
|
+
@extheader = {'User-Agent'=>"RubyFedora"}
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def call_resource
|
|
16
|
+
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# TODO: Handle ruby-tyle params, camel-casing them before passing to call_resource...
|
|
20
|
+
def update_index(params)
|
|
21
|
+
query = {:action=>action,:value=>value,:repositoryName=>repository_name,:indexName=>indexname,:restXslt=>"copyXML"}.merge(params)
|
|
22
|
+
query.merge {:operation> "updateIndex"}
|
|
23
|
+
|
|
24
|
+
@client.get(@uri, query, @extheader)
|
|
25
|
+
return "update_index Not Implemented."
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def browse_index(params)
|
|
30
|
+
# Sample: /fedoragsearch/rest?operation=browseIndex&startTerm=&fieldName=PID&termPageSize=20&indexName=FedoraIndex&restXslt=copyXml&resultPageXslt=browseIndexToResultPage
|
|
31
|
+
query = {:startTerm=>URLEncoder.encode(start_term, "UTF-8"),:fieldName=>"",:indexName=>"",:termPageSize=>"", :restXslt=>"copyXml", :resultPageXslt=>""}.merge(params)
|
|
32
|
+
query.merge {:operation> "browseIndex"}
|
|
33
|
+
@client.get(@uri, query, @extheader)
|
|
34
|
+
return "browse_index Not Implemented."
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def gfind_objects(params)
|
|
38
|
+
# Sample: /fedoragsearch/rest?operation=gfindObjects&query=test&hitPageSize=10&restXslt=copyXml
|
|
39
|
+
# fieldMaxLength limits the number of characters returned from the value of each object field.
|
|
40
|
+
# Snippets will highlight matched words within the search results. To keep the xml as simple as possible, set snippetsMax to 0.
|
|
41
|
+
query = {:query=>URLEncoder.encode(query, "UTF-8"),:value=>value,:indexName=>indexname,:hitPageStart=>"",:hitPageSize=>"",:snippetsMax=>"0",:fieldMaxLength=>"",:restXslt=>"copyXML",:resultPageXslt=>""}.merge(params)
|
|
42
|
+
query.merge {:operation> "gfindObjects"}
|
|
43
|
+
@client.get(@uri, query, @extheader)
|
|
44
|
+
return "gfind_objects Not Implemented."
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def get_index_info(params)
|
|
48
|
+
# Sample: /fedoragsearch/rest?operation=getIndexInfo&restXslt=copyXml
|
|
49
|
+
query = {:indexName=>"",:restXslt=>"copyXml", :resultPageXslt=>""}.merge(params)
|
|
50
|
+
query.merge {:operation> "getIndexInfo"}
|
|
51
|
+
@client.get(@uri, query, @extheader)
|
|
52
|
+
return "get_index_info Not Implemented."
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def get_repository_info(params)
|
|
56
|
+
# Sample: /fedoragsearch/rest?operation=getRepositoryInfo&restXslt=copyXml
|
|
57
|
+
query = {:repositoryName=>"",:restXslt=>"copyXml", :resultPageXslt=>""}.merge(params)
|
|
58
|
+
query.merge {:operation> "getRepositoryInfo"}
|
|
59
|
+
@client.get(@uri, query, @extheader)
|
|
60
|
+
return "get_repository_info Not Implemented."
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def configure(params)
|
|
64
|
+
query = {:configName=>""}.merge(params)
|
|
65
|
+
query.merge {:operation> "configure"}
|
|
66
|
+
@client.get(@uri, query, @extheader)
|
|
67
|
+
return "configure Not Implemented."
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
end
|
|
71
|
+
end
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
|
|
2
|
+
require 'fedora/base'
|
|
3
|
+
require 'fedora/connection'
|
|
4
|
+
require 'fedora/formats'
|
|
5
|
+
require 'fedora/fedora_object'
|
|
6
|
+
require 'fedora/datastream'
|
|
7
|
+
|
|
8
|
+
module Fedora
|
|
9
|
+
NAMESPACE = "fedora:info/"
|
|
10
|
+
ALL_FIELDS = [
|
|
11
|
+
:pid, :label, :fType, :cModel, :state, :ownerId, :cDate, :mDate, :dcmDate,
|
|
12
|
+
:bMech, :title, :creator, :subject, :description, :contributor,
|
|
13
|
+
:date, :type, :format, :identifier, :source, :language, :relation, :coverage, :rights
|
|
14
|
+
]
|
|
15
|
+
|
|
16
|
+
class Repository
|
|
17
|
+
|
|
18
|
+
attr_accessor :repository_name, :base_url, :fedora_version, :pid_namespace, :pid_delimiter
|
|
19
|
+
|
|
20
|
+
def self.flush
|
|
21
|
+
Thread.current[:repo]=nil
|
|
22
|
+
end
|
|
23
|
+
def self.register(url, surrogate=nil)
|
|
24
|
+
url = url.to_s.chop if url.to_s =~ /\/\Z/
|
|
25
|
+
Thread.current[:repo]= Fedora::Repository.new(url, surrogate)
|
|
26
|
+
begin
|
|
27
|
+
repo = Thread.current[:repo]
|
|
28
|
+
attributes = repo.describe_repository
|
|
29
|
+
repo.repository_name = attributes["repositoryName"].first
|
|
30
|
+
repo.base_url = attributes["repositoryBaseURL"].first
|
|
31
|
+
repo.fedora_version = attributes["repositoryVersion"].first
|
|
32
|
+
repo.pid_namespace = attributes["repositoryPID"].first["PID-namespaceIdentifier"].first
|
|
33
|
+
repo.pid_delimiter = attributes["repositoryPID"].first["PID-delimiter"].first
|
|
34
|
+
rescue
|
|
35
|
+
end
|
|
36
|
+
Thread.current[:repo]
|
|
37
|
+
end
|
|
38
|
+
def self.instance
|
|
39
|
+
raise "did you register a repo?" unless Thread.current[:repo]
|
|
40
|
+
Thread.current[:repo]
|
|
41
|
+
end
|
|
42
|
+
class StringResponse < String
|
|
43
|
+
attr_reader :content_type
|
|
44
|
+
|
|
45
|
+
def initialize(s, content_type)
|
|
46
|
+
super(s)
|
|
47
|
+
@content_type = content_type
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
attr_accessor :fedora_url
|
|
52
|
+
|
|
53
|
+
def initialize(fedora_url, surrogate=nil)
|
|
54
|
+
@fedora_url = fedora_url.is_a?(URI) ? fedora_url : URI.parse(fedora_url)
|
|
55
|
+
@surrogate = surrogate
|
|
56
|
+
@connection = nil
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Fetch the raw content of either a fedora object or datastream
|
|
60
|
+
def fetch_content(object_uri)
|
|
61
|
+
response = connection.raw_get("#{url_for(object_uri)}?format=xml")
|
|
62
|
+
StringResponse.new(response.body, response.content_type)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
# Find fedora objects with http://www.fedora.info/wiki/index.php/API-A-Lite_findObjects
|
|
68
|
+
#
|
|
69
|
+
# == Parameters
|
|
70
|
+
# query<String>:: the query string to be sent to Fedora.
|
|
71
|
+
# options<Hash>:: see below
|
|
72
|
+
#
|
|
73
|
+
# == Options<Hash> keys
|
|
74
|
+
# limit<String|Number>:: set the maxResults parameter in fedora
|
|
75
|
+
# select<Symbol|Array>:: the fields to returned. To include all fields, pass :all as the value.
|
|
76
|
+
# The field "pid" is always included.
|
|
77
|
+
#
|
|
78
|
+
# == Examples
|
|
79
|
+
# find_objects("label=Image1")
|
|
80
|
+
# find_objects("pid~demo:*", "label=test")
|
|
81
|
+
# find_objects("label=Image1", :include => :all)
|
|
82
|
+
# find_objects("label=Image1", :include => [:label])
|
|
83
|
+
#-
|
|
84
|
+
def find_objects(*args)
|
|
85
|
+
raise ArgumentError, "Missing query string" unless args.length >= 1
|
|
86
|
+
options = args.last.is_a?(Hash) ? args.pop : {}
|
|
87
|
+
|
|
88
|
+
fields = options[:select]
|
|
89
|
+
fields = (fields.nil? || (fields == :all)) ? ALL_FIELDS : ([:pid] + ([fields].flatten! - [:pid]))
|
|
90
|
+
|
|
91
|
+
query = args.join(' ')
|
|
92
|
+
params = { :resultFormat => 'xml', :query => query }
|
|
93
|
+
params[:maxResults] = options[:limit] if options[:limit]
|
|
94
|
+
params[:sessionToken] = options[:sessionToken] if options[:sessionToken]
|
|
95
|
+
includes = fields.inject("") { |s, f| s += "&#{f}=true"; s }
|
|
96
|
+
|
|
97
|
+
convert_xml(connection.get("#{fedora_url.path}/objects?#{params.to_fedora_query}#{includes}"))
|
|
98
|
+
end
|
|
99
|
+
def find_model(pid, klazz)
|
|
100
|
+
obj = self.find_objects("pid=#{pid}").first
|
|
101
|
+
doc = REXML::Document.new(obj.object_xml, :ignore_whitespace_nodes=>:all)
|
|
102
|
+
klazz.deserialize(doc)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# Create the given object if it's new (not obtained from a find method). Otherwise update the object.
|
|
106
|
+
#
|
|
107
|
+
# == Return
|
|
108
|
+
# boolean:: whether the operation is successful
|
|
109
|
+
#-
|
|
110
|
+
def save(object)
|
|
111
|
+
object.new_object? ? create(object) : update(object)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def nextid
|
|
115
|
+
d = REXML::Document.new(connection.post(fedora_url.path+"/management/getNextPID?xml=true").body)
|
|
116
|
+
d.elements['//pid'].text
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def create(object)
|
|
121
|
+
case object
|
|
122
|
+
when Fedora::FedoraObject
|
|
123
|
+
pid = (object.pid ? object : 'new')
|
|
124
|
+
response = connection.post("#{url_for(pid)}?" + object.attributes.to_fedora_query, object.blob)
|
|
125
|
+
if response.code == '201'
|
|
126
|
+
object.pid = extract_pid(response)
|
|
127
|
+
object.new_object = false
|
|
128
|
+
true
|
|
129
|
+
else
|
|
130
|
+
false
|
|
131
|
+
end
|
|
132
|
+
when Fedora::Datastream
|
|
133
|
+
raise ArgumentError, "Missing dsID attribute" if object.dsid.nil?
|
|
134
|
+
extra_headers = {}
|
|
135
|
+
extra_headers['Content-Type'] = object.attributes[:mimeType] if object.attributes[:mimeType]
|
|
136
|
+
response = connection.post("#{url_for(object)}?" + object.attributes.to_fedora_query,
|
|
137
|
+
object.blob, extra_headers)
|
|
138
|
+
if response.code == '201'
|
|
139
|
+
object.new_object = false
|
|
140
|
+
true
|
|
141
|
+
else
|
|
142
|
+
false
|
|
143
|
+
end
|
|
144
|
+
else
|
|
145
|
+
raise ArgumentError, "Unknown object type"
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
# Update the given object
|
|
151
|
+
# == Return
|
|
152
|
+
# boolean:: whether the operation is successful
|
|
153
|
+
#-
|
|
154
|
+
def update(object)
|
|
155
|
+
raise ArgumentError, "Missing pid attribute" if object.nil? || object.pid.nil?
|
|
156
|
+
case object
|
|
157
|
+
when Fedora::FedoraObject
|
|
158
|
+
response = connection.put("#{url_for(object)}?" + object.attributes.to_fedora_query)
|
|
159
|
+
response.code == '200' || '307'
|
|
160
|
+
when Fedora::Datastream
|
|
161
|
+
raise ArgumentError, "Missing dsID attribute" if object.dsid.nil?
|
|
162
|
+
response = connection.put("#{url_for(object)}?" + object.attributes.to_fedora_query, object.blob)
|
|
163
|
+
response.code == '200' || '201'
|
|
164
|
+
return response.code
|
|
165
|
+
else
|
|
166
|
+
raise ArgumentError, "Unknown object type"
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
# Delete the given pid
|
|
171
|
+
# == Parameters
|
|
172
|
+
# object<Object|String>:: The object to delete.
|
|
173
|
+
# This can be a uri String ("demo:1", "fedora:info/demo:1") or any object that responds uri method.
|
|
174
|
+
#
|
|
175
|
+
# == Return
|
|
176
|
+
# boolean:: whether the operation is successful
|
|
177
|
+
#-
|
|
178
|
+
def delete(object)
|
|
179
|
+
raise ArgumentError, "Object must not be nil" if object.nil?
|
|
180
|
+
response = connection.delete("#{url_for(object)}")
|
|
181
|
+
response.code == '200' or response.code == '204' # Temporary hack around error in Fedora 3.0 Final's REST API
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
# Export the given object
|
|
185
|
+
# == Parameters
|
|
186
|
+
# object<String|Object>:: a fedora uri, pid, FedoraObject instance
|
|
187
|
+
# method<Symbol>:: the method to fetch such as :export, :history, :versions, etc
|
|
188
|
+
# extra_params<Hash>:: any other extra parameters to pass to fedora
|
|
189
|
+
#
|
|
190
|
+
def export(object, extra_params={})
|
|
191
|
+
extra_params = {:format=>:foxml, :context=>:archive}.merge!(extra_params)
|
|
192
|
+
if extra_params[:format].kind_of?(String)
|
|
193
|
+
format = extra_params[:format]
|
|
194
|
+
else
|
|
195
|
+
format = case extra_params[:format]
|
|
196
|
+
when :atom then "info:fedora/fedora-system:ATOM-1.1"
|
|
197
|
+
when :atom_zip then "info:fedora/fedora-system:ATOMZip-1.1"
|
|
198
|
+
when :mets then "info:fedora/fedora-system:METSFedoraExt-1.1"
|
|
199
|
+
when :foxml then "info:fedora/fedora-system:FOXML-1.1"
|
|
200
|
+
else "info:fedora/fedora-system:FOXML-1.1"
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
fetch_custom(object, "export", :format=>format, :context=>extra_params[:context].to_s)
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
def ingest(content_to_ingest, extra_params={})
|
|
207
|
+
if extra_params[:pid]
|
|
208
|
+
url = url_for(extra_params[:pid])
|
|
209
|
+
else
|
|
210
|
+
url = url_for("new")
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
if content_to_ingest.kind_of?(File)
|
|
214
|
+
content_to_ingest = content_to_ingest.read
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
connection.post(url,content_to_ingest)
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
# Fetch the given object using custom method. This is used to fetch other aspects of a fedora object,
|
|
221
|
+
# such as profile, versions, etc...
|
|
222
|
+
# == Parameters
|
|
223
|
+
# object<String|Object>:: a fedora uri, pid, FedoraObject instance
|
|
224
|
+
# method<Symbol>:: the method to fetch such as :export, :history, :versions, etc
|
|
225
|
+
# extra_params<Hash>:: any other extra parameters to pass to fedora
|
|
226
|
+
#
|
|
227
|
+
# == Returns
|
|
228
|
+
# This method returns raw xml response from the server
|
|
229
|
+
#-
|
|
230
|
+
def fetch_custom(object, method, extra_params = { :format => 'xml' })
|
|
231
|
+
path = case method
|
|
232
|
+
when :profile then ""
|
|
233
|
+
else "/#{method}"
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
extra_params.delete(:format) if method == :export
|
|
237
|
+
connection.raw_get("#{url_for(object)}#{path}?#{extra_params.to_fedora_query}").body
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
def describe_repository
|
|
241
|
+
result_body = connection.raw_get("#{fedora_url.path}/describe?xml=true").body
|
|
242
|
+
XmlSimple.xml_in(result_body)
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
private
|
|
246
|
+
def convert_xml(response)
|
|
247
|
+
results = FedoraObjects.new
|
|
248
|
+
return results unless response && response['resultList']
|
|
249
|
+
|
|
250
|
+
results.session_token = response['listSession']['token'] if response['listSession']
|
|
251
|
+
objectFields = response['resultList']['objectFields']
|
|
252
|
+
case objectFields
|
|
253
|
+
when Array
|
|
254
|
+
objectFields.each { |attrs| results << FedoraObject.new(attrs.rekey!) }
|
|
255
|
+
when Hash
|
|
256
|
+
results << FedoraObject.new(objectFields.rekey!)
|
|
257
|
+
end
|
|
258
|
+
results.each {|result| result.new_object = false}
|
|
259
|
+
results
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
def url_for(object)
|
|
263
|
+
uri = object.respond_to?(:uri) ? object.uri : object.to_s
|
|
264
|
+
uri = (uri[0..NAMESPACE.length-1] == NAMESPACE ? uri[NAMESPACE.length..-1] : uri) # strip of fedora:info namespace
|
|
265
|
+
"#{fedora_url.path}/objects/#{uri}"
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
# Low level access to the remote fedora server
|
|
269
|
+
# The +refresh+ parameter toggles whether or not the connection is refreshed at every request
|
|
270
|
+
# or not (defaults to +false+).
|
|
271
|
+
def connection(refresh = false)
|
|
272
|
+
if refresh || @connection.nil?
|
|
273
|
+
@connection = Fedora::Connection.new(@fedora_url, Fedora::XmlFormat, @surrogate)
|
|
274
|
+
end
|
|
275
|
+
@connection
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
def extract_pid(response)
|
|
279
|
+
CGI.unescape(response['Location'].split('/').last)
|
|
280
|
+
end
|
|
281
|
+
end
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
class FedoraObjects < Array
|
|
285
|
+
attr_accessor :session_token
|
|
286
|
+
end
|
|
287
|
+
|