hydra-pcdm 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. checksums.yaml +7 -0
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +26 -0
  4. data/.travis.yml +14 -0
  5. data/CONTRIBUTING.md +115 -0
  6. data/Gemfile +13 -0
  7. data/LICENSE +12 -0
  8. data/README.md +87 -0
  9. data/Rakefile +20 -0
  10. data/config/jetty.yml +6 -0
  11. data/hydra-pcdm.gemspec +30 -0
  12. data/lib/hydra/pcdm/collection_indexer.rb +12 -0
  13. data/lib/hydra/pcdm/models/collection.rb +6 -0
  14. data/lib/hydra/pcdm/models/concerns/collection_behavior.rb +79 -0
  15. data/lib/hydra/pcdm/models/concerns/object_behavior.rb +104 -0
  16. data/lib/hydra/pcdm/models/file.rb +20 -0
  17. data/lib/hydra/pcdm/models/object.rb +6 -0
  18. data/lib/hydra/pcdm/object_indexer.rb +10 -0
  19. data/lib/hydra/pcdm/services/collection/add_collection.rb +20 -0
  20. data/lib/hydra/pcdm/services/collection/add_object.rb +19 -0
  21. data/lib/hydra/pcdm/services/collection/add_related_object.rb +21 -0
  22. data/lib/hydra/pcdm/services/collection/get_collections.rb +18 -0
  23. data/lib/hydra/pcdm/services/collection/get_objects.rb +18 -0
  24. data/lib/hydra/pcdm/services/collection/get_related_objects.rb +17 -0
  25. data/lib/hydra/pcdm/services/collection/remove_collection.rb +36 -0
  26. data/lib/hydra/pcdm/services/collection/remove_object.rb +43 -0
  27. data/lib/hydra/pcdm/services/collection/remove_related_object.rb +36 -0
  28. data/lib/hydra/pcdm/services/file/add_type.rb +20 -0
  29. data/lib/hydra/pcdm/services/file/get_mime_type.rb +11 -0
  30. data/lib/hydra/pcdm/services/object/add_object.rb +20 -0
  31. data/lib/hydra/pcdm/services/object/add_related_object.rb +21 -0
  32. data/lib/hydra/pcdm/services/object/get_objects.rb +18 -0
  33. data/lib/hydra/pcdm/services/object/get_related_objects.rb +17 -0
  34. data/lib/hydra/pcdm/services/object/remove_object.rb +43 -0
  35. data/lib/hydra/pcdm/services/object/remove_related_object.rb +36 -0
  36. data/lib/hydra/pcdm/version.rb +5 -0
  37. data/lib/hydra/pcdm/vocab/ebucore_terms.rb +33 -0
  38. data/lib/hydra/pcdm/vocab/pcdm_terms.rb +87 -0
  39. data/lib/hydra/pcdm/vocab/sweetjpl_terms.rb +10 -0
  40. data/lib/hydra/pcdm.rb +69 -0
  41. data/spec/hydra/pcdm/collection_indexer_spec.rb +26 -0
  42. data/spec/hydra/pcdm/models/collection_spec.rb +82 -0
  43. data/spec/hydra/pcdm/models/file_spec.rb +56 -0
  44. data/spec/hydra/pcdm/models/object_spec.rb +141 -0
  45. data/spec/hydra/pcdm/object_indexer_spec.rb +20 -0
  46. data/spec/hydra/pcdm/services/collection/add_collection_spec.rb +197 -0
  47. data/spec/hydra/pcdm/services/collection/add_object_spec.rb +132 -0
  48. data/spec/hydra/pcdm/services/collection/add_related_object_spec.rb +94 -0
  49. data/spec/hydra/pcdm/services/collection/get_collections_spec.rb +40 -0
  50. data/spec/hydra/pcdm/services/collection/get_objects_spec.rb +40 -0
  51. data/spec/hydra/pcdm/services/collection/get_related_objects_spec.rb +37 -0
  52. data/spec/hydra/pcdm/services/collection/remove_collection_spec.rb +143 -0
  53. data/spec/hydra/pcdm/services/collection/remove_object_spec.rb +180 -0
  54. data/spec/hydra/pcdm/services/collection/remove_related_object_spec.rb +146 -0
  55. data/spec/hydra/pcdm/services/file/add_type_spec.rb +19 -0
  56. data/spec/hydra/pcdm/services/file/get_mime_type_spec.rb +24 -0
  57. data/spec/hydra/pcdm/services/object/add_object_spec.rb +186 -0
  58. data/spec/hydra/pcdm/services/object/add_related_object_spec.rb +94 -0
  59. data/spec/hydra/pcdm/services/object/get_objects_spec.rb +33 -0
  60. data/spec/hydra/pcdm/services/object/get_related_objects_spec.rb +39 -0
  61. data/spec/hydra/pcdm/services/object/remove_object_spec.rb +158 -0
  62. data/spec/hydra/pcdm/services/object/remove_related_object_spec.rb +126 -0
  63. data/spec/hydra/pcdm_spec.rb +56 -0
  64. data/spec/spec_helper.rb +34 -0
  65. metadata +215 -0
@@ -0,0 +1,18 @@
1
+ module Hydra::PCDM
2
+ class GetObjectsFromCollection
3
+
4
+ ##
5
+ # Get member objects from a collection in order.
6
+ #
7
+ # @param [Hydra::PCDM::Collection] :parent_collection in which the child objects are members
8
+ #
9
+ # @return [Array<Hydra::PCDM::Collection>] all member objects
10
+
11
+ def self.call( parent_collection )
12
+ raise ArgumentError, "parent_collection must be a pcdm collection" unless Hydra::PCDM.collection? parent_collection
13
+
14
+ parent_collection.objects
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,17 @@
1
+ module Hydra::PCDM
2
+ class GetRelatedObjectsFromCollection
3
+
4
+ ##
5
+ # Get related objects from a collection.
6
+ #
7
+ # @param [Hydra::PCDM::Collection] :parent_collection to which the child objects are related
8
+ #
9
+ # @return [Array<Hydra::PCDM::Collection>] all related objects
10
+
11
+ def self.call( parent_collection )
12
+ raise ArgumentError, "parent_collection must be a pcdm collection" unless Hydra::PCDM.collection? parent_collection
13
+ parent_collection.related_objects.to_a
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,36 @@
1
+ module Hydra::PCDM
2
+ class RemoveCollectionFromCollection
3
+
4
+ ##
5
+ # Remove a collection from a collection.
6
+ #
7
+ # @param [Hydra::PCDM::Collection] :parent_collection from which to remove collection
8
+ # @param [Hydra::PCDM::Collection] :child_collection being removed
9
+ #
10
+ # @return [Hydra::PCDM::Collection] the updated pcdm collection
11
+
12
+ def self.call( parent_collection, child_collection )
13
+ raise ArgumentError, "parent_collection must be a pcdm collection" unless Hydra::PCDM.collection? parent_collection
14
+ raise ArgumentError, "child_collection must be a pcdm collection" unless Hydra::PCDM.collection? child_collection
15
+
16
+
17
+ # TODO FIX when members is empty, members.delete raises ActiveFedora::ObjectNotFoundError "Can't reload an object that hasn't been saved" (activefedora-aggregation issue #35)
18
+
19
+ # TODO members.delete should... (issue #103)(activefedora-aggregation issue #34)
20
+ # * return child_collection when successful delete (not Array [child_collection])
21
+ # * return nil if child_collection does not exist in parent_collection
22
+ # * raise error for any other problems
23
+
24
+ # TODO Per issue #103, uncomment the following line when (activefedora-aggregation issue #34) is resolved
25
+ # parent_collection.members.delete child_collection
26
+
27
+ # TODO Per issue #103, remove the following lines when (activefedora-aggregation issue #34) is resolved
28
+ return nil unless Hydra::PCDM::GetCollectionsFromCollection.call( parent_collection ).include? child_collection
29
+ removed_collection = parent_collection.members.delete child_collection
30
+ removed_collection = removed_collection.first if removed_collection.is_a? Array
31
+ removed_collection
32
+ # END WORK-AROUND
33
+ end
34
+
35
+ end
36
+ end
@@ -0,0 +1,43 @@
1
+ module Hydra::PCDM
2
+ class RemoveObjectFromCollection
3
+
4
+ ##
5
+ # Remove an object from a collection.
6
+ #
7
+ # @param [Hydra::PCDM::Collection] :parent_collection from which to remove object
8
+ # @param [Hydra::PCDM::Object] :child_object being removed
9
+ # @param [Fixnum] :nth_occurrence remove nth occurrence of this object in the list (default=1)
10
+ #
11
+ # @return [Hydra::PCDM::Collection] the updated pcdm collection
12
+
13
+ def self.call( parent_collection, child_object, nth_occurrence=1 )
14
+ raise ArgumentError, "parent_collection must be a pcdm collection" unless Hydra::PCDM.collection? parent_collection
15
+ raise ArgumentError, "child_object must be a pcdm object" unless Hydra::PCDM.object? child_object
16
+
17
+
18
+ # TODO FIX when members is empty, members.delete raises ActiveFedora::ObjectNotFoundError "Can't reload an object that hasn't been saved" (activefedora-aggregation issue #35)
19
+
20
+ # TODO members.delete should... (issue #103)(activefedora-aggregation issue #34)
21
+ # * return child_object when successful delete (not Array [child_object])
22
+ # * return nil if child_object does not exist in parent_collection
23
+ # * raise error for any other problems
24
+
25
+ # TODO Per issue #103, uncomment the following line when (activefedora-aggregation issue #34) is resolved
26
+ # parent_collection.members.delete child_object
27
+
28
+ # TODO Per issue #103, remove the following lines when (activefedora-aggregation issue #34) is resolved
29
+ return nil unless parent_collection.members.include? child_object
30
+ removed_object = parent_collection.members.delete child_object
31
+ removed_object = removed_object.first if removed_object.is_a? Array
32
+ removed_object
33
+ # END WORK-AROUND
34
+
35
+
36
+ # TODO -- The same object may be in the list multiple times. (issue #102)
37
+ # * How to remove nth occurrence?
38
+ # * Default to removing 1st occurrence from the beginning of the list.
39
+
40
+ end
41
+
42
+ end
43
+ end
@@ -0,0 +1,36 @@
1
+ module Hydra::PCDM
2
+ class RemoveRelatedObjectFromCollection
3
+
4
+ ##
5
+ # Remove an object from a collection.
6
+ #
7
+ # @param [Hydra::PCDM::Collection] :parent_collection from which to remove the related object
8
+ # @param [Hydra::PCDM::Object] :child_related_object being removed
9
+ #
10
+ # @return [Hydra::PCDM::Collection] the updated pcdm collection
11
+
12
+ def self.call( parent_collection, child_related_object )
13
+ raise ArgumentError, "parent_collection must be a pcdm collection" unless Hydra::PCDM.collection? parent_collection
14
+ raise ArgumentError, "child_related_object must be a pcdm object" unless Hydra::PCDM.object? child_related_object
15
+
16
+
17
+ # TODO FIX when related_objects is empty, related_objects.delete raises ActiveFedora::ObjectNotFoundError "Can't reload an object that hasn't been saved" (activefedora-aggregation issue #805)
18
+
19
+ # TODO related_objects.delete should... (issue #103)(activefedora-aggregation issue #805)
20
+ # * return child_related_object when successful delete (not Array [child_related_object])
21
+ # * return nil if child_related_object does not exist in parent_collection
22
+ # * raise error for any other problems
23
+
24
+ # TODO Per issue #103, uncomment the following line when (activefedora issue #805) is resolved
25
+ # parent_collection.related_objects.delete child_related_object
26
+
27
+ # TODO Per issue #103, remove the following lines when (activefedora issue #805) is resolved
28
+ return nil unless Hydra::PCDM::GetRelatedObjectsFromCollection.call( parent_collection ).include? child_related_object
29
+ removed_related_object = parent_collection.related_objects.delete child_related_object
30
+ removed_related_object = removed_related_object.first if removed_related_object.is_a? Array
31
+ removed_related_object
32
+ # END WORK-AROUND
33
+ end
34
+
35
+ end
36
+ end
@@ -0,0 +1,20 @@
1
+ module Hydra::PCDM
2
+ class AddTypeToFile
3
+
4
+ # This adds an additional RDF type to an exsiting Hydra::PCDM::File
5
+ #
6
+ # @param [Hydra::PCDM::File] the file object you want to add it to
7
+ # @param [RDF::URI] term you want to add as the type
8
+ #
9
+ # @return [Hydra::PCDM::File] the updated file
10
+
11
+ def self.call(file, uri)
12
+ t = file.metadata_node.get_values(:type)
13
+ return file if t.include?(uri)
14
+ t << uri
15
+ file.metadata_node.set_value(:type,t)
16
+ file
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,11 @@
1
+ module Hydra::PCDM
2
+ class GetMimeTypeForFile
3
+
4
+ def self.call(path)
5
+ raise ArgumentError, "supplied argument should be a path to a file" unless path.is_a?(String)
6
+ mime_types = MIME::Types.of(::File.basename(path))
7
+ mime_types.empty? ? "application/octet-stream" : mime_types.first.content_type
8
+ end
9
+
10
+ end
11
+ end
@@ -0,0 +1,20 @@
1
+ module Hydra::PCDM
2
+ class AddObjectToObject
3
+
4
+ ##
5
+ # Add an object to an object.
6
+ #
7
+ # @param [Hydra::PCDM::Object] :parent_object to which to add object
8
+ # @param [Hydra::PCDM::Object] :child_object being added
9
+ #
10
+ # @return [Hydra::PCDM::Object] the updated pcdm object
11
+
12
+ def self.call( parent_object, child_object )
13
+ raise ArgumentError, "parent_object must be a pcdm object" unless Hydra::PCDM.object? parent_object
14
+ raise ArgumentError, "child_object must be a pcdm object" unless Hydra::PCDM.object? child_object
15
+ raise ArgumentError, "an object can't be an ancestor of itself" if parent_object.ancestor? child_object
16
+ parent_object.members << child_object
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,21 @@
1
+ module Hydra::PCDM
2
+ class AddRelatedObjectToObject
3
+
4
+ ##
5
+ # Add a related object to an object.
6
+ #
7
+ # @param [Hydra::PCDM::Object] :parent_object to which to add the related object
8
+ # @param [Hydra::PCDM::Object] :child_related_object being added
9
+ #
10
+ # @return [Hydra::PCDM::Object] the updated pcdm object
11
+
12
+ def self.call( parent_object, child_related_object )
13
+ raise ArgumentError, "parent_object must be a pcdm object" unless Hydra::PCDM.object? parent_object
14
+ raise ArgumentError, "child_related_object must be a pcdm object" unless Hydra::PCDM.object? child_related_object
15
+
16
+ # parent_object.related_objects = parent_object.related_objects + child_related_object
17
+ parent_object.related_objects << child_related_object
18
+ end
19
+
20
+ end
21
+ end
@@ -0,0 +1,18 @@
1
+ module Hydra::PCDM
2
+ class GetObjectsFromObject
3
+
4
+ ##
5
+ # Get member objects from an object in order.
6
+ #
7
+ # @param [Hydra::PCDM::Object] :parent_object in which the child objects are members
8
+ #
9
+ # @return [Array<Hydra::PCDM::Object>] all member objects
10
+
11
+ def self.call( parent_object )
12
+ raise ArgumentError, "parent_object must be a pcdm object" unless Hydra::PCDM.object? parent_object
13
+
14
+ parent_object.objects
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,17 @@
1
+ module Hydra::PCDM
2
+ class GetRelatedObjectsFromObject
3
+
4
+ ##
5
+ # Get related objects from an object.
6
+ #
7
+ # @param [Hydra::PCDM::Object] :parent_object to which the child objects are related
8
+ #
9
+ # @return [Array<Hydra::PCDM::Object>] all related objects
10
+
11
+ def self.call( parent_object )
12
+ raise ArgumentError, "parent_object must be a pcdm object" unless Hydra::PCDM.object? parent_object
13
+ parent_object.related_objects.to_a
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,43 @@
1
+ module Hydra::PCDM
2
+ class RemoveObjectFromObject
3
+
4
+ ##
5
+ # Remove an object from an object.
6
+ #
7
+ # @param [Hydra::PCDM::Object] :parent_object from which to remove object
8
+ # @param [Hydra::PCDM::Object] :child_object being removed
9
+ # @param [Fixnum] :nth_occurrence remove nth occurrence of this object in the list (default=1)
10
+ #
11
+ # @return [Hydra::PCDM::Object] the updated pcdm object
12
+
13
+ def self.call( parent_object, child_object, nth_occurrence=1 )
14
+ raise ArgumentError, "parent_object must be a pcdm object" unless Hydra::PCDM.object? parent_object
15
+ raise ArgumentError, "child_object must be a pcdm object" unless Hydra::PCDM.object? child_object
16
+
17
+
18
+ # TODO FIX when members is empty, members.delete raises ActiveFedora::ObjectNotFoundError "Can't reload an object that hasn't been saved" (activefedora-aggregation issue #35)
19
+
20
+ # TODO members.delete should... (issue #103)(activefedora-aggregation issue #34)
21
+ # * return child_object when successful delete (not Array [child_object])
22
+ # * return nil if child_object does not exist in parent_object
23
+ # * raise error for any other problems
24
+
25
+ # TODO Per issue #103, uncomment the following line when (activefedora-aggregation issue #34) is resolved
26
+ # parent_object.members.delete child_object
27
+
28
+ # TODO Per issue #103, remove the following lines when (activefedora-aggregation issue #34) is resolved
29
+ return nil unless parent_object.members.include? child_object
30
+ removed_object = parent_object.members.delete child_object
31
+ removed_object = removed_object.first if removed_object.is_a? Array
32
+ removed_object
33
+ # END WORK-AROUND
34
+
35
+
36
+ # TODO -- The same object may be in the list multiple times. (issue #102)
37
+ # * How to remove nth occurrence?
38
+ # * Default to removing 1st occurrence from the beginning of the list.
39
+
40
+ end
41
+
42
+ end
43
+ end
@@ -0,0 +1,36 @@
1
+ module Hydra::PCDM
2
+ class RemoveRelatedObjectFromObject
3
+
4
+ ##
5
+ # Remove an object from an object.
6
+ #
7
+ # @param [Hydra::PCDM::Object] :parent_object from which to remove the related object
8
+ # @param [Hydra::PCDM::Object] :child_related_object being removed
9
+ #
10
+ # @return [Hydra::PCDM::Collection] the updated pcdm collection
11
+
12
+ def self.call( parent_object, child_related_object )
13
+ raise ArgumentError, "parent_object must be a pcdm object" unless Hydra::PCDM.object? parent_object
14
+ raise ArgumentError, "child_related_object must be a pcdm object" unless Hydra::PCDM.object? child_related_object
15
+
16
+
17
+ # TODO FIX when related_objects is empty, related_objects.delete raises ActiveFedora::ObjectNotFoundError "Can't reload an object that hasn't been saved" (activefedora-aggregation issue #805)
18
+
19
+ # TODO related_objects.delete should... (issue #103)(activefedora-aggregation issue #805)
20
+ # * return child_related_object when successful delete (not Array [child_related_object])
21
+ # * return nil if child_related_object does not exist in parent_object
22
+ # * raise error for any other problems
23
+
24
+ # TODO Per issue #103, uncomment the following line when (activefedora issue #805) is resolved
25
+ # parent_object.related_objects.delete child_related_object
26
+
27
+ # TODO Per issue #103, remove the following lines when (activefedora issue #805) is resolved
28
+ return nil unless Hydra::PCDM::GetRelatedObjectsFromObject.call( parent_object ).include? child_related_object
29
+ removed_related_object = parent_object.related_objects.delete child_related_object
30
+ removed_related_object = removed_related_object.first if removed_related_object.is_a? Array
31
+ removed_related_object
32
+ # END WORK-AROUND
33
+ end
34
+
35
+ end
36
+ end
@@ -0,0 +1,5 @@
1
+ module Hydra
2
+ module PCDM
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
@@ -0,0 +1,33 @@
1
+ require 'rdf'
2
+ module EBUCoreVocabularies
3
+ class EBUCoreTerms < RDF::StrictVocabulary("http://www.ebu.ch/metadata/ontologies/ebucore/ebucore#")
4
+ # Property definitions
5
+ property :filename,
6
+ comment: ["The name of the file containing the Resource.".freeze],
7
+ domain: "ebucore:Resource".freeze,
8
+ range: "xsd:string".freeze,
9
+ label: "File Name".freeze
10
+
11
+ property :fileSize,
12
+ comment: ["Size of a MediaResource in bytes.".freeze],
13
+ domain: "ebucore:Resource".freeze,
14
+ range: "xsd:integer".freeze,
15
+ label: "File Size".freeze
16
+
17
+ property :dateCreated,
18
+ comment: ["The date of creation of the media resource.".freeze],
19
+ domain: "ebucore:Resource".freeze,
20
+ range: "xsd:dateTime".freeze,
21
+ label: "Date Created".freeze
22
+
23
+ property :hasMimeType,
24
+ comment: ["Has Mime Type.".freeze],
25
+ range: "xsd:string".freeze,
26
+ label: "Has Mime Type".freeze
27
+
28
+ property :dateModified,
29
+ comment: ["To indicate the date at which the media resource has been modified.".freeze],
30
+ range: "xsd:dateTime".freeze,
31
+ label: "Date Modified".freeze
32
+ end
33
+ end
@@ -0,0 +1,87 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # This file generated automatically using vocab-fetch from https://raw.githubusercontent.com/duraspace/pcdm/master/models.rdf
3
+ require 'rdf'
4
+ module RDFVocabularies
5
+ class PCDMTerms < RDF::StrictVocabulary("http://pcdm.org/models#")
6
+
7
+ # Class definitions
8
+ term :AdministrativeSet,
9
+ comment: %(
10
+ An Administrative Set is a grouping of resources that an administrative unit is ultimately
11
+ responsible for managing. The set itself helps to manage the items within it. An Object
12
+ or Collection may be contained by only one AdministrativeSet.
13
+ ).freeze,
14
+ label: "Administrative Set".freeze,
15
+ "rdfs:isDefinedBy" => %(http://pcdm.org/models#).freeze,
16
+ subClassOf: "http://www.w3.org/ns/ldp#Container".freeze,
17
+ type: "rdfs:Class".freeze
18
+ term :Collection,
19
+ comment: %(
20
+ A Collection is a group of resources. Collections have descriptive metadata, access metadata,
21
+ and may links to works and/or collections. By default, member works and collections are an
22
+ unordered set, but can be ordered using the ORE Proxy class.
23
+ ).freeze,
24
+ label: "Collection".freeze,
25
+ "rdfs:isDefinedBy" => %(http://pcdm.org/models#).freeze,
26
+ subClassOf: "http://www.openarchives.org/ore/terms/Aggregation".freeze,
27
+ type: "rdfs:Class".freeze
28
+ term :File,
29
+ comment: %(
30
+ A File is a sequence of binary data and is described by some accompanying metadata.
31
+ The metadata typically includes at least basic technical metadata \(size, content type,
32
+ modification date, etc.\), but can also include properties related to preservation,
33
+ digitization process, provenance, etc. Files MUST be contained by exactly one Object.
34
+ ).freeze,
35
+ label: "File".freeze,
36
+ "rdfs:isDefinedBy" => %(http://pcdm.org/models#).freeze,
37
+ type: "rdfs:Class".freeze
38
+ term :Object,
39
+ comment: %(
40
+ An Object is an intellectual entity, sometimes called a "work", "digital object", etc.
41
+ Objects have descriptive metadata, access metadata, may contain files and other Objects as
42
+ member "components". Each level of a work is therefore represented by an Object instance,
43
+ and is capable of standing on its own, being linked to from Collections and other Objects.
44
+ Member Objects can be ordered using the ORE Proxy class.
45
+ ).freeze,
46
+ label: "Object".freeze,
47
+ "rdfs:isDefinedBy" => %(http://pcdm.org/models#).freeze,
48
+ subClassOf: "http://www.openarchives.org/ore/terms/Aggregation".freeze,
49
+ type: "rdfs:Class".freeze
50
+
51
+ # Property definitions
52
+ property :hasFile,
53
+ comment: %(Links to a File contained by this Object.).freeze,
54
+ domain: "http://pcdm.org/models#Object".freeze,
55
+ label: "has file".freeze,
56
+ range: "http://pcdm.org/models#File".freeze,
57
+ "rdfs:isDefinedBy" => %(http://pcdm.org/models#).freeze,
58
+ subPropertyOf: "http://www.w3.org/ns/ldp#contains".freeze,
59
+ type: "rdf:Property".freeze
60
+ property :hasMember,
61
+ comment: %(Links to a related Object. Typically used to link to component parts, such as a book linking to a page.).freeze,
62
+ domain: "http://www.openarchives.org/ore/terms/Aggregation".freeze,
63
+ label: "has member".freeze,
64
+ range: "http://www.openarchives.org/ore/terms/Aggregation".freeze,
65
+ "rdfs:isDefinedBy" => %(http://pcdm.org/models#).freeze,
66
+ subPropertyOf: "http://www.openarchives.org/ore/terms/aggregates".freeze,
67
+ type: "rdf:Property".freeze
68
+ property :hasRelatedFile,
69
+ comment: %(Links to a File which is related to this Object but doesn't directly describe or represent it, such as technical metadata about other files.).freeze,
70
+ domain: "http://pcdm.org/models#Object".freeze,
71
+ label: "has related file".freeze,
72
+ range: "http://pcdm.org/models#File".freeze,
73
+ "rdfs:isDefinedBy" => %(http://pcdm.org/models#).freeze,
74
+ subPropertyOf: "http://www.w3.org/ns/ldp#contains".freeze,
75
+ type: "rdf:Property".freeze
76
+
77
+ # Extra definitions
78
+ term :"",
79
+ comment: %(Ontology for the Portland Common Data Model, intended to underlie a wide array of repository and DAMS applications.).freeze,
80
+ "dc:modified" => %(2015-03-16).freeze,
81
+ "dc:publisher" => %(http://www.duraspace.org/).freeze,
82
+ "dc:title" => %(Portland Common Data Model).freeze,
83
+ label: "".freeze,
84
+ "owl:versionInfo" => %(2015/03/16).freeze,
85
+ "rdfs:seeAlso" => %(https://wiki.duraspace.org/display/FF/Portland+Common+Data+Model).freeze
86
+ end
87
+ end
@@ -0,0 +1,10 @@
1
+ require 'rdf'
2
+ module SweetjplVocabularies
3
+ class SweetjplTerms < RDF::StrictVocabulary("http://sweet.jpl.nasa.gov/2.2/reprDataFormat.owl#")
4
+ # Property definitions
5
+ property :byteOrder,
6
+ comment: ["Byte Order.".freeze],
7
+ range: "xsd:string".freeze,
8
+ label: "Byte Order".freeze
9
+ end
10
+ end
data/lib/hydra/pcdm.rb ADDED
@@ -0,0 +1,69 @@
1
+ require 'active_support'
2
+
3
+ module Hydra
4
+ module PCDM
5
+ extend ActiveSupport::Autoload
6
+
7
+ # vocabularies
8
+ autoload :RDFVocabularies, 'hydra/pcdm/vocab/pcdm_terms'
9
+ autoload :EBUCoreVocabularies, 'hydra/pcdm/vocab/ebucore_terms'
10
+ autoload :SweetjplVocabularies, 'hydra/pcdm/vocab/sweetjpl_terms'
11
+
12
+ # models
13
+ autoload :Collection, 'hydra/pcdm/models/collection'
14
+ autoload :Object, 'hydra/pcdm/models/object'
15
+ autoload :File, 'hydra/pcdm/models/file'
16
+
17
+ # behavior concerns
18
+ autoload :CollectionBehavior, 'hydra/pcdm/models/concerns/collection_behavior'
19
+ autoload :ObjectBehavior, 'hydra/pcdm/models/concerns/object_behavior'
20
+
21
+ autoload :CollectionIndexer
22
+ autoload :ObjectIndexer
23
+
24
+ # collection services
25
+ autoload :AddCollectionToCollection, 'hydra/pcdm/services/collection/add_collection'
26
+ autoload :AddObjectToCollection, 'hydra/pcdm/services/collection/add_object'
27
+ autoload :AddRelatedObjectToCollection, 'hydra/pcdm/services/collection/add_related_object'
28
+ autoload :GetCollectionsFromCollection, 'hydra/pcdm/services/collection/get_collections'
29
+ autoload :GetObjectsFromCollection, 'hydra/pcdm/services/collection/get_objects'
30
+ autoload :GetRelatedObjectsFromCollection, 'hydra/pcdm/services/collection/get_related_objects'
31
+ autoload :RemoveCollectionFromCollection, 'hydra/pcdm/services/collection/remove_collection'
32
+ autoload :RemoveObjectFromCollection, 'hydra/pcdm/services/collection/remove_object'
33
+ autoload :RemoveRelatedObjectFromCollection, 'hydra/pcdm/services/collection/remove_related_object'
34
+
35
+ # file services
36
+ autoload :AddTypeToFile, 'hydra/pcdm/services/file/add_type'
37
+ autoload :GetMimeTypeForFile, 'hydra/pcdm/services/file/get_mime_type'
38
+
39
+
40
+ # object services
41
+ autoload :AddFileToObject, 'hydra/pcdm/services/object/add_file'
42
+ autoload :AddObjectToObject, 'hydra/pcdm/services/object/add_object'
43
+ autoload :AddRelatedObjectToObject, 'hydra/pcdm/services/object/add_related_object'
44
+ autoload :CreateObject, 'hydra/pcdm/services/object/create'
45
+ autoload :GetObjectsFromObject, 'hydra/pcdm/services/object/get_objects'
46
+ autoload :GetRelatedObjectsFromObject, 'hydra/pcdm/services/object/get_related_objects'
47
+ autoload :GetFilesFromObject, 'hydra/pcdm/services/object/get_collections'
48
+ autoload :RemoveObjectFromObject, 'hydra/pcdm/services/object/remove_object'
49
+ autoload :RemoveRelatedObjectFromObject, 'hydra/pcdm/services/object/remove_related_object'
50
+
51
+
52
+ # model validations
53
+ def self.collection? collection
54
+ return false unless collection.respond_to? :type
55
+ collection.type.include? RDFVocabularies::PCDMTerms.Collection
56
+ end
57
+
58
+ def self.object? object
59
+ return false unless object.respond_to? :type
60
+ object.type.include? RDFVocabularies::PCDMTerms.Object
61
+ end
62
+
63
+ def self.file? file
64
+ return false unless file.respond_to? :metadata_node
65
+ file.metadata_node.type.include? RDFVocabularies::PCDMTerms.File
66
+ end
67
+
68
+ end
69
+ end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ describe Hydra::PCDM::CollectionIndexer do
4
+ let(:collection) { Hydra::PCDM::Collection.new }
5
+ let(:child_collections1) { Hydra::PCDM::Collection.new(id: '123') }
6
+ let(:child_collections2) { Hydra::PCDM::Collection.new(id: '456') }
7
+ let(:object1) { Hydra::PCDM::Object.new(id: '789') }
8
+ let(:indexer) { described_class.new(collection) }
9
+
10
+ before do
11
+ allow(collection).to receive(:child_collections).and_return([child_collections1, child_collections2])
12
+ allow(collection).to receive(:objects).and_return([object1])
13
+ allow(collection).to receive(:member_ids).and_return(['123', '456', '789'])
14
+ end
15
+
16
+ describe "#generate_solr_document" do
17
+ subject { indexer.generate_solr_document }
18
+
19
+ it "has fields" do
20
+ expect(subject['child_collections_ssim']).to eq ['123', '456']
21
+ expect(subject['objects_ssim']).to eq ['789']
22
+ expect(subject['members_ssim']).to eq ['123', '456', '789']
23
+ end
24
+ end
25
+ end
26
+