ddr-models 2.6.2 → 2.7.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (146) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/.travis.yml +1 -1
  4. data/Gemfile +2 -3
  5. data/app/models/collection.rb +11 -3
  6. data/app/models/component.rb +54 -4
  7. data/app/models/item.rb +1 -2
  8. data/config/initializers/active_fedora_base.rb +8 -5
  9. data/config/initializers/rubydora_monkey_patch.rb +11 -0
  10. data/config/initializers/subscriptions.rb +16 -9
  11. data/config/locales/ddr-models.en.yml +3 -0
  12. data/ddr-models.gemspec +3 -2
  13. data/lib/ddr/actions/virus_check.rb +10 -16
  14. data/lib/ddr/auth.rb +0 -8
  15. data/lib/ddr/datastreams.rb +13 -2
  16. data/lib/ddr/datastreams/administrative_metadata_datastream.rb +9 -0
  17. data/lib/ddr/datastreams/content_datastream.rb +5 -0
  18. data/lib/ddr/datastreams/datastream_behavior.rb +60 -15
  19. data/lib/ddr/datastreams/delete_external_files.rb +29 -0
  20. data/lib/ddr/datastreams/descriptive_metadata_datastream.rb +33 -33
  21. data/lib/ddr/datastreams/external_file_datastream.rb +69 -0
  22. data/lib/ddr/datastreams/fits_datastream.rb +15 -5
  23. data/lib/ddr/datastreams/intermediate_file_datastream.rb +5 -0
  24. data/lib/ddr/datastreams/metadata_datastream.rb +15 -17
  25. data/lib/ddr/datastreams/multires_image_datastream.rb +5 -0
  26. data/lib/ddr/derivatives.rb +1 -0
  27. data/lib/ddr/derivatives/ptif_generator.rb +5 -1
  28. data/lib/ddr/derivatives/update_derivatives.rb +23 -0
  29. data/lib/ddr/events/deletion_event.rb +5 -9
  30. data/lib/ddr/events/event.rb +7 -9
  31. data/lib/ddr/events/ingestion_event.rb +5 -9
  32. data/lib/ddr/events/update_event.rb +12 -5
  33. data/lib/ddr/index.rb +0 -1
  34. data/lib/ddr/index/csv_query_result.rb +10 -2
  35. data/lib/ddr/index/fields.rb +10 -9
  36. data/lib/ddr/index/filter.rb +1 -0
  37. data/lib/ddr/managers/derivatives_manager.rb +84 -98
  38. data/lib/ddr/managers/technical_metadata_manager.rb +20 -5
  39. data/lib/ddr/models.rb +24 -24
  40. data/lib/ddr/models/base.rb +98 -74
  41. data/lib/ddr/models/cache.rb +20 -0
  42. data/lib/ddr/models/engine.rb +4 -6
  43. data/lib/ddr/models/file_management.rb +57 -152
  44. data/lib/ddr/models/fixity_checkable.rb +0 -5
  45. data/lib/ddr/models/has_admin_metadata.rb +4 -2
  46. data/lib/ddr/models/has_children.rb +35 -1
  47. data/lib/ddr/models/has_content.rb +3 -33
  48. data/lib/ddr/models/has_intermediate_file.rb +18 -0
  49. data/lib/ddr/models/has_multires_image.rb +12 -15
  50. data/lib/ddr/models/has_struct_metadata.rb +2 -38
  51. data/lib/ddr/models/indexing.rb +160 -163
  52. data/lib/ddr/models/permanent_id.rb +26 -49
  53. data/lib/ddr/models/solr_document.rb +21 -19
  54. data/lib/ddr/models/structure.rb +168 -41
  55. data/lib/ddr/models/structures/agent.rb +49 -0
  56. data/lib/ddr/models/structures/div.rb +64 -0
  57. data/lib/ddr/models/structures/f_locat.rb +54 -0
  58. data/lib/ddr/models/structures/file.rb +52 -0
  59. data/lib/ddr/models/structures/file_grp.rb +35 -0
  60. data/lib/ddr/models/structures/file_sec.rb +22 -0
  61. data/lib/ddr/models/structures/fptr.rb +31 -0
  62. data/lib/ddr/models/structures/mets_hdr.rb +37 -0
  63. data/lib/ddr/models/structures/mptr.rb +49 -0
  64. data/lib/ddr/models/structures/struct_map.rb +40 -0
  65. data/lib/ddr/models/version.rb +1 -1
  66. data/lib/ddr/notifications.rb +10 -12
  67. data/lib/ddr/utils.rb +29 -16
  68. data/lib/ddr/vocab.rb +15 -17
  69. data/lib/ddr/vocab/asset.rb +29 -19
  70. data/lib/ddr/vocab/contact.rb +5 -7
  71. data/lib/ddr/vocab/display.rb +6 -8
  72. data/lib/ddr/vocab/duke_terms.rb +8 -10
  73. data/lib/ddr/vocab/rdf_vocabulary_parser.rb +37 -39
  74. data/lib/ddr/vocab/roles.rb +17 -19
  75. data/lib/ddr/vocab/vocabulary.rb +26 -26
  76. data/spec/datastreams/external_file_datastream_spec.rb +37 -0
  77. data/spec/derivatives/png_generator_spec.rb +21 -25
  78. data/spec/derivatives/ptif_generator_spec.rb +22 -26
  79. data/spec/dummy/config/environments/test.rb +1 -1
  80. data/spec/dummy/db/schema.rb +23 -23
  81. data/spec/factories/structure_factories.rb +8 -2
  82. data/spec/fixtures/imageA.jpg +0 -0
  83. data/spec/fixtures/imageB.jpg +0 -0
  84. data/spec/index/csv_query_result_spec.rb +3 -3
  85. data/spec/index/fields_spec.rb +7 -6
  86. data/spec/managers/derivatives_manager_spec.rb +105 -112
  87. data/spec/managers/technical_metadata_manager_spec.rb +22 -18
  88. data/spec/models/active_fedora_base_spec.rb +0 -106
  89. data/spec/models/active_fedora_datastream_spec.rb +33 -2
  90. data/spec/models/attachment_spec.rb +0 -2
  91. data/spec/models/cache_spec.rb +32 -0
  92. data/spec/models/collection_spec.rb +43 -19
  93. data/spec/models/component_spec.rb +41 -51
  94. data/spec/models/descriptive_metadata_datastream_spec.rb +99 -87
  95. data/spec/models/events_spec.rb +50 -69
  96. data/spec/models/file_management_spec.rb +79 -187
  97. data/spec/models/has_children_spec.rb +54 -3
  98. data/spec/models/has_struct_metadata_spec.rb +32 -38
  99. data/spec/models/indexing_spec.rb +11 -6
  100. data/spec/models/item_spec.rb +21 -7
  101. data/spec/models/permanent_id_spec.rb +1 -5
  102. data/spec/models/solr_document_spec.rb +13 -41
  103. data/spec/models/structure_spec.rb +85 -16
  104. data/spec/models/structures/agent_spec.rb +30 -0
  105. data/spec/models/structures/div_spec.rb +26 -0
  106. data/spec/models/structures/f_locat_spec.rb +78 -0
  107. data/spec/models/structures/file_grp_spec.rb +23 -0
  108. data/spec/models/structures/file_sec_spec.rb +22 -0
  109. data/spec/models/structures/file_spec.rb +60 -0
  110. data/spec/models/structures/fptr_spec.rb +23 -0
  111. data/spec/models/structures/mets_hdr_spec.rb +26 -0
  112. data/spec/models/structures/mptr_spec.rb +25 -0
  113. data/spec/models/structures/struct_map_spec.rb +24 -0
  114. data/spec/models/target_spec.rb +0 -2
  115. data/spec/spec_helper.rb +4 -9
  116. data/spec/support/shared_examples_for_ddr_models.rb +96 -156
  117. data/spec/support/shared_examples_for_has_content.rb +56 -30
  118. data/spec/support/shared_examples_for_has_intermediate_spec.rb +28 -0
  119. data/spec/support/shared_examples_for_non_collection_models.rb +5 -0
  120. data/spec/support/structural_metadata_helper.rb +230 -59
  121. data/spec/utils_spec.rb +0 -2
  122. metadata +86 -44
  123. data/app/helpers/models_helper.rb +0 -10
  124. data/lib/ddr/auth/legacy/abstract_legacy_permissions.rb +0 -17
  125. data/lib/ddr/auth/legacy/legacy_authorization.rb +0 -44
  126. data/lib/ddr/auth/legacy/legacy_default_permissions.rb +0 -33
  127. data/lib/ddr/auth/legacy/legacy_permissions.rb +0 -33
  128. data/lib/ddr/auth/legacy/legacy_roles.rb +0 -25
  129. data/lib/ddr/index/legacy_license_fields.rb +0 -12
  130. data/lib/ddr/jobs.rb +0 -12
  131. data/lib/ddr/jobs/fits_file_characterization.rb +0 -13
  132. data/lib/ddr/jobs/fixity_check.rb +0 -13
  133. data/lib/ddr/jobs/job.rb +0 -36
  134. data/lib/ddr/jobs/queue.rb +0 -27
  135. data/lib/ddr/jobs/update_index.rb +0 -13
  136. data/lib/ddr/models/access_controllable.rb +0 -24
  137. data/lib/ddr/models/struct_div.rb +0 -63
  138. data/spec/auth/legacy_default_permissions_spec.rb +0 -37
  139. data/spec/auth/legacy_permissions_spec.rb +0 -37
  140. data/spec/helpers/models_helper_spec.rb +0 -11
  141. data/spec/jobs/fits_file_characterization_spec.rb +0 -16
  142. data/spec/jobs/fixity_check_spec.rb +0 -22
  143. data/spec/jobs/job_spec.rb +0 -40
  144. data/spec/jobs/update_index_spec.rb +0 -22
  145. data/spec/models/struct_div_spec.rb +0 -70
  146. data/spec/support/shared_examples_for_access_controllables.rb +0 -6
@@ -1,9 +1,16 @@
1
- module Ddr
2
- module Events
3
- class UpdateEvent < Event
4
-
5
- self.description = "Object updated"
1
+ module Ddr::Events
2
+ class UpdateEvent < Event
3
+ self.description = "Object updated"
6
4
 
5
+ def self.call(*args)
6
+ super do |event, notification|
7
+ attrs_changed = notification.payload[:attributes_changed]
8
+ ds_changed = notification.payload[:datastreams_changed]
9
+ event.detail = ["Attributes changed: #{attrs_changed}",
10
+ "Datastreams changed: #{ds_changed.join(', ')}",
11
+ event.detail,
12
+ ].compact.join("\n\n")
13
+ end
7
14
  end
8
15
  end
9
16
  end
data/lib/ddr/index.rb CHANGED
@@ -10,7 +10,6 @@ module Ddr
10
10
  autoload :FieldAttribute
11
11
  autoload :Fields
12
12
  autoload :Filter
13
- autoload :LegacyLicenseFields
14
13
  autoload :Query
15
14
  autoload :QueryBuilder
16
15
  autoload :QueryClause
@@ -26,6 +26,7 @@ module Ddr::Index
26
26
 
27
27
  def csv_opts
28
28
  { headers: csv_headers,
29
+ converters: [convert_semicolons, convert_escaped_newlines],
29
30
  return_headers: false,
30
31
  write_headers: true,
31
32
  }
@@ -60,8 +61,15 @@ module Ddr::Index
60
61
  end
61
62
 
62
63
  def data
63
- raw = Connection.get("select", params: solr_csv_params)
64
- raw.gsub(/\\#{CSV_MV_SEPARATOR}/, CSV_MV_SEPARATOR)
64
+ Connection.get("select", params: solr_csv_params)
65
+ end
66
+
67
+ def convert_semicolons
68
+ lambda { |f| f.gsub(/\\#{CSV_MV_SEPARATOR}/, CSV_MV_SEPARATOR) rescue f }
69
+ end
70
+
71
+ def convert_escaped_newlines
72
+ lambda { |f| f.gsub(/\\r/, "\r").gsub(/\\n/, "\n") rescue f }
65
73
  end
66
74
 
67
75
  end
@@ -29,6 +29,7 @@ module Ddr::Index
29
29
  CREATOR_FACET = Field.new :creator_facet, :facetable
30
30
  DATE_FACET = Field.new :date_facet, :facetable
31
31
  DATE_SORT = Field.new :date_sort, :sortable
32
+ DC_IS_PART_OF = Field.new :isPartOf, :symbol
32
33
  DEPOSITOR = Field.new :depositor, :stored_sortable
33
34
  DISPLAY_FORMAT = Field.new :display_format, :stored_sortable
34
35
  DOI = Field.new :doi, :symbol
@@ -42,11 +43,14 @@ module Ddr::Index
42
43
  IDENTIFIER_ALL = Field.new :identifier_all, :symbol
43
44
  ILLUSTRATED_FACET = Field.new :illustrated_facet, :facetable
44
45
  ILLUSTRATOR_FACET = Field.new :illustrator_facet, :facetable
46
+ INGESTED_BY = Field.new :ingested_by, :stored_sortable
47
+ INGESTION_DATE = Field.new :ingestion_date, :stored_sortable, type: :date
45
48
  INSTRUMENTATION_FACET = Field.new :instrumentation_facet, :facetable
46
49
  INTERNAL_URI = Field.new :internal_uri, :stored_sortable
47
50
  INTERVIEWER_NAME_FACET = Field.new :interviewer_name_facet, :facetable
48
51
  IS_ATTACHED_TO = Field.new :is_attached_to, :symbol
49
52
  IS_EXTERNAL_TARGET_FOR = Field.new :is_external_target_for, :symbol
53
+ IS_FORMAT_OF = Field.new :isFormatOf, :symbol
50
54
  IS_GOVERNED_BY = Field.new :is_governed_by, :symbol
51
55
  IS_LOCKED = Field.new :is_locked, :stored_sortable
52
56
  IS_MEMBER_OF = Field.new :is_member_of, :symbol
@@ -80,11 +84,12 @@ module Ddr::Index
80
84
  PUBLISHER_FACET = Field.new :publisher_facet, :facetable
81
85
  RESEARCH_HELP_CONTACT = Field.new :research_help_contact, :stored_sortable
82
86
  RESOURCE_ROLE = Field.new :resource_role, :symbol
87
+ RIGHTS_NOTE = Field.new :rights_note, :stored_searchable
83
88
  ROLL_NUMBER_FACET = Field.new :roll_number_facet, :facetable
84
89
  SERIES_FACET = Field.new :series_facet, :facetable
85
90
  SETTING_FACET = Field.new :setting_facet, :facetable
86
91
  SPATIAL_FACET = Field.new :spatial_facet, :facetable
87
- STRUCT_MAPS = Field.new :struct_maps, :stored_sortable
92
+ STRUCTURE = Field.new :structure, :stored_sortable
88
93
  SUBJECT_FACET = Field.new :subject_facet, :facetable
89
94
  SUBSERIES_FACET = Field.new :subseries_facet, :facetable
90
95
  TECHMD_COLOR_SPACE = Field.new :techmd_color_space, :symbol
@@ -99,6 +104,7 @@ module Ddr::Index
99
104
  TECHMD_ICC_PROFILE_VERSION = Field.new :techmd_icc_profile_version, :symbol
100
105
  TECHMD_IMAGE_HEIGHT = Field.new :techmd_image_height, :stored_searchable, type: :integer
101
106
  TECHMD_IMAGE_WIDTH = Field.new :techmd_image_width, :stored_searchable, type: :integer
107
+ TECHMD_MD5 = Field.new :techmd_md5, :stored_sortable
102
108
  TECHMD_MEDIA_TYPE = Field.new :techmd_media_type, :symbol
103
109
  TECHMD_MODIFICATION_TIME = Field.new :techmd_modification_time, :stored_searchable, type: :date
104
110
  TECHMD_PRONOM_IDENTIFIER = Field.new :techmd_pronom_identifier, :symbol
@@ -131,15 +137,10 @@ module Ddr::Index
131
137
  Deprecation.warn(Ddr::Index::Fields,
132
138
  "`Ddr::Index::Fields::#{name}` is deprecated." \
133
139
  " Use `Ddr::Index::Fields::ID` instead.")
134
- return ID
140
+ ID
141
+ else
142
+ super
135
143
  end
136
- if const = LegacyLicenseFields.const_get(name)
137
- # XXX Commented out b/c annoying, but maybe we want later ...
138
- # Deprecation.warn(Ddr::Index::Fields,
139
- # "`Ddr::Index::Fields::#{name}` is deprecated and will be removed in ddr-models 3.0.")
140
- return const
141
- end
142
- super
143
144
  end
144
145
 
145
146
  end
@@ -31,6 +31,7 @@ module Ddr::Index
31
31
  self.clauses += conditions.map do |field, v|
32
32
  Array(v).map { |value| QueryClause.negative(field, value) }
33
33
  end.flatten
34
+ self
34
35
  end
35
36
 
36
37
  def absent(field)
@@ -1,124 +1,110 @@
1
1
  require "resque"
2
2
 
3
- module Ddr
4
- module Managers
5
- class DerivativesManager < Manager
3
+ module Ddr::Managers
4
+ class DerivativesManager < Manager
5
+ extend Deprecation
6
6
 
7
- SCHEDULE_LATER = :later
8
- SCHEDULE_NOW = :now
9
- SCHEDULES = [ SCHEDULE_LATER, SCHEDULE_NOW ]
7
+ SCHEDULE_LATER = :later
8
+ SCHEDULE_NOW = :now
9
+ SCHEDULES = [ SCHEDULE_LATER, SCHEDULE_NOW ]
10
10
 
11
- ACTION_DELETE = "delete"
12
- ACTION_GENERATE = "generate"
11
+ ACTION_DELETE = "delete"
12
+ ACTION_GENERATE = "generate"
13
13
 
14
- def update_derivatives(schedule=SCHEDULE_LATER)
15
- raise ArgumentError, "Must be one of #{SCHEDULES}" unless SCHEDULES.include?(schedule)
16
- Ddr::Derivatives::DERIVATIVES.values.each do |derivative|
17
- if Ddr::Derivatives.update_derivatives.include?(derivative.name)
18
- # Need to update derivative if object has a datastream for this type of derivative and
19
- # either (or both) of the following conditions are true:
20
- # - object already has content in the derivative's datastream (need to delete or replace it)
21
- # - the derivative can be generated for this object
22
- if object.datastreams.include?(derivative.datastream) &&
23
- (object.datastreams[derivative.datastream].has_content? || generatable?(derivative))
24
- schedule == SCHEDULE_NOW ? update_derivative(derivative) : Resque.enqueue(DerivativeJob, object.pid, derivative.name)
25
- end
14
+ def update_derivatives(schedule=SCHEDULE_LATER)
15
+ raise ArgumentError, "Must be one of #{SCHEDULES}" unless SCHEDULES.include?(schedule)
16
+ Ddr::Derivatives::DERIVATIVES.values.each do |derivative|
17
+ if Ddr::Derivatives.update_derivatives.include?(derivative.name)
18
+ # Need to update derivative if object has a datastream for this type of derivative and
19
+ # either (or both) of the following conditions are true:
20
+ # - object already has content in the derivative's datastream (need to delete or replace it)
21
+ # - the derivative can be generated for this object
22
+ if object.datastreams.include?(derivative.datastream) &&
23
+ (object.datastreams[derivative.datastream].has_content? || generatable?(derivative))
24
+ schedule == SCHEDULE_NOW ? update_derivative(derivative) : Resque.enqueue(DerivativeJob, object.pid, derivative.name)
26
25
  end
27
26
  end
28
27
  end
28
+ end
29
29
 
30
- def update_derivative(derivative)
31
- raise ArgumentError, "This object does not have a datastream for #{derivative.name} derivatives" unless
32
- object.datastreams.include?(derivative.datastream)
33
- if generatable? derivative
34
- generate_derivative derivative
35
- else
36
- # Delete existing derivative (if there is one) if that type of derivative is no longer
37
- # applicable to the object
38
- if object.datastreams[derivative.datastream].has_content?
39
- delete_derivative derivative
40
- end
30
+ def update_derivative(derivative)
31
+ raise ArgumentError, "This object does not have a datastream for #{derivative.name} derivatives" unless
32
+ object.datastreams.include?(derivative.datastream)
33
+ if generatable? derivative
34
+ generate_derivative derivative
35
+ else
36
+ # Delete existing derivative (if there is one) if that type of derivative is no longer
37
+ # applicable to the object
38
+ if object.datastreams[derivative.datastream].has_content?
39
+ delete_derivative derivative
41
40
  end
42
41
  end
42
+ end
43
43
 
44
- def generate_derivative(derivative)
45
- ActiveSupport::Notifications.instrument(Ddr::Notifications::UPDATE,
46
- pid: object.pid,
47
- summary: "Generate #{derivative.name.to_s} derivative"
48
- ) do |payload|
49
- generate_derivative! derivative
44
+ def generate_derivative!(derivative)
45
+ tempdir_path = File.join(Dir.tmpdir, Dir::Tmpname.make_tmpname('',nil))
46
+ begin
47
+ tempdir = FileUtils.mkdir(tempdir_path).first
48
+ generator_source = create_source_file(tempdir)
49
+ generator_output = File.new(File.join(tempdir, "output.out"), 'wb')
50
+ exitstatus = derivative.generator.new(generator_source.path, generator_output.path, derivative.options).generate
51
+ generator_source.close unless generator_source.closed?
52
+ if exitstatus == 0
53
+ generator_output = File.open(generator_output, 'rb')
54
+ object.reload if object.persisted?
55
+ object.add_file generator_output, derivative.datastream, mime_type: derivative.generator.output_mime_type
56
+ object.save!
57
+ else
58
+ raise Ddr::Models::DerivativeGenerationFailure,
59
+ "Failure generating #{derivative.name} for #{object.pid}"
50
60
  end
61
+ generator_output.close unless generator_output.closed?
62
+ ensure
63
+ FileUtils.remove_dir(tempdir_path) if File.exist?(tempdir_path)
51
64
  end
65
+ end
52
66
 
53
- def generate_derivative!(derivative)
54
- tempdir_path = File.join(Dir.tmpdir, Dir::Tmpname.make_tmpname('',nil))
55
- begin
56
- tempdir = FileUtils.mkdir(tempdir_path).first
57
- generator_source = create_source_file(tempdir)
58
- generator_output = File.new(File.join(tempdir, "output.out"), 'wb')
59
- exitstatus = derivative.generator.new(generator_source.path, generator_output.path, derivative.options).generate
60
- generator_source.close unless generator_source.closed?
61
- if exitstatus == 0
62
- generator_output = File.open(generator_output, 'rb')
63
- object.reload if object.persisted?
64
- object.add_file generator_output, derivative.datastream, mime_type: derivative.generator.output_mime_type
65
- object.save!
66
- else
67
- raise Ddr::Models::DerivativeGenerationFailure,
68
- "Failure generating #{derivative.name} for #{object.pid}"
69
- end
70
- generator_output.close unless generator_output.closed?
71
- ensure
72
- FileUtils.remove_dir(tempdir_path) if File.exist?(tempdir_path)
73
- end
74
- end
67
+ alias_method :generate_derivative, :generate_derivative!
75
68
 
76
- def delete_derivative(derivative)
77
- ActiveSupport::Notifications.instrument(Ddr::Notifications::UPDATE,
78
- pid: object.pid,
79
- summary: "Delete derivative #{derivative.name.to_s}"
80
- ) do |payload|
81
- delete_derivative! derivative
82
- end
83
- end
69
+ def delete_derivative!(derivative)
70
+ File.unlink *object.datastreams[derivative.datastream].file_paths if
71
+ object.datastreams[derivative.datastream].external?
72
+ object.datastreams[derivative.datastream].delete
73
+ object.save!
74
+ end
84
75
 
85
- def delete_derivative!(derivative)
86
- File.unlink *object.datastreams[derivative.datastream].file_paths if
87
- object.datastreams[derivative.datastream].external?
88
- object.datastreams[derivative.datastream].delete
89
- object.save!
90
- end
76
+ alias_method :delete_derivative, :delete_derivative!
91
77
 
92
- class DerivativeJob
93
- @queue = :derivatives
94
- def self.perform(pid, derivative_name)
95
- object = ActiveFedora::Base.find(pid)
96
- derivative = Ddr::Derivatives::DERIVATIVES[derivative_name.to_sym]
97
- object.derivatives.update_derivative(derivative)
98
- end
78
+ class DerivativeJob
79
+ @queue = :derivatives
80
+ def self.perform(pid, derivative_name)
81
+ object = ActiveFedora::Base.find(pid)
82
+ derivative = Ddr::Derivatives::DERIVATIVES[derivative_name.to_sym]
83
+ object.derivatives.update_derivative(derivative)
99
84
  end
85
+ end
100
86
 
101
- private
87
+ private
102
88
 
103
- def create_source_file(dir)
104
- generator_source = File.new(File.join(dir, "source"), "wb")
105
- generator_source.write(object.content.content)
106
- generator_source.close
107
- generator_source
108
- end
89
+ def create_source_file(dir)
90
+ generator_source = File.new(File.join(dir, "source"), "wb")
91
+ source_content = object.has_intermediate_file? ? object.intermediateFile.content : object.content.content
92
+ generator_source.write(source_content)
93
+ generator_source.close
94
+ generator_source
95
+ end
109
96
 
110
- def generatable?(derivative)
111
- return false unless object.has_content?
112
- case derivative.name
113
- when :multires_image
114
- object.content_type == "image/tiff" || object.content_type == "image/jpeg"
115
- when :thumbnail
116
- object.image?
117
- else
118
- false
119
- end
97
+ def generatable?(derivative)
98
+ return false unless object.has_content?
99
+ case derivative.name
100
+ when :multires_image
101
+ object.content_type == "image/tiff" || object.content_type == "image/jpeg"
102
+ when :thumbnail
103
+ object.image?
104
+ else
105
+ false
120
106
  end
121
-
122
107
  end
108
+
123
109
  end
124
110
  end
@@ -5,11 +5,21 @@ module Ddr::Managers
5
5
 
6
6
  delegate :content, :fits, to: :object
7
7
 
8
- delegate :valid, :well_formed,
9
- :media_type, :format_label, :format_version, :pronom_identifier,
10
- :created, :modified, :creating_application, :extent,
11
- :image_width, :image_height, :color_space,
12
- :icc_profile_name, :icc_profile_version,
8
+ delegate :color_space,
9
+ :created,
10
+ :creating_application,
11
+ :extent,
12
+ :format_label,
13
+ :format_version,
14
+ :icc_profile_name,
15
+ :icc_profile_version,
16
+ :image_height,
17
+ :image_width,
18
+ :media_type,
19
+ :modified,
20
+ :pronom_identifier,
21
+ :valid,
22
+ :well_formed,
13
23
  to: :fits
14
24
 
15
25
  alias_method :last_modified, :modified
@@ -40,6 +50,10 @@ module Ddr::Managers
40
50
  end
41
51
  end
42
52
 
53
+ def md5
54
+ fits.md5.first
55
+ end
56
+
43
57
  def checksum_digest
44
58
  content.checksumType
45
59
  end
@@ -86,6 +100,7 @@ module Ddr::Managers
86
100
  Ddr::Index::Fields::TECHMD_ICC_PROFILE_VERSION => icc_profile_version,
87
101
  Ddr::Index::Fields::TECHMD_IMAGE_HEIGHT => image_height,
88
102
  Ddr::Index::Fields::TECHMD_IMAGE_WIDTH => image_width,
103
+ Ddr::Index::Fields::TECHMD_MD5 => md5,
89
104
  Ddr::Index::Fields::TECHMD_MEDIA_TYPE => media_type,
90
105
  Ddr::Index::Fields::TECHMD_PRONOM_IDENTIFIER => pronom_identifier,
91
106
  Ddr::Index::Fields::TECHMD_VALID => valid,
data/lib/ddr/models.rb CHANGED
@@ -1,11 +1,7 @@
1
1
  require 'ddr/models/engine'
2
2
  require 'ddr/models/version'
3
-
4
- # Awful hack to make Hydra::AccessControls::Permissions accessible
5
- $: << Gem.loaded_specs['hydra-access-controls'].full_gem_path + "/app/models/concerns"
6
-
3
+ require 'action_view' # https://github.com/haml/haml/issues/695
7
4
  require 'active_record'
8
-
9
5
  require 'hydra-core'
10
6
  require 'hydra/validations'
11
7
 
@@ -19,7 +15,6 @@ module Ddr
19
15
  autoload :Derivatives
20
16
  autoload :Events
21
17
  autoload :Index
22
- autoload :Jobs
23
18
  autoload :Managers
24
19
  autoload :Metadata
25
20
  autoload :Notifications
@@ -39,9 +34,9 @@ module Ddr
39
34
  module Models
40
35
  extend ActiveSupport::Autoload
41
36
 
42
- autoload :AccessControllable
43
37
  autoload :AdminSet
44
38
  autoload :Base
39
+ autoload :Cache
45
40
  autoload :ChecksumInvalid, 'ddr/models/error'
46
41
  autoload :Contact
47
42
  autoload :ContentModelError, 'ddr/models/error'
@@ -58,6 +53,7 @@ module Ddr
58
53
  autoload :HasAttachments
59
54
  autoload :HasChildren
60
55
  autoload :HasContent
56
+ autoload :HasIntermediateFile
61
57
  autoload :HasMultiresImage
62
58
  autoload :HasStructMetadata
63
59
  autoload :HasThumbnail
@@ -65,7 +61,6 @@ module Ddr
65
61
  autoload :NotFoundError, 'ddr/models/error'
66
62
  autoload :PermanentId
67
63
  autoload :SolrDocument
68
- autoload :StructDiv
69
64
  autoload :Structure
70
65
  autoload :WithContentFile
71
66
  autoload :YearFacet
@@ -78,14 +73,20 @@ module Ddr
78
73
  autoload :ParentLicense
79
74
  end
80
75
 
81
- # Base directory of default external file store
82
- mattr_accessor :external_file_store
83
-
84
- # Base directory of external file store for multires image derivatives
85
- mattr_accessor :multires_image_external_file_store
86
-
87
- # Regexp for building external file subpath from hex digest
88
- mattr_accessor :external_file_subpath_regexp
76
+ module Structures
77
+ extend ActiveSupport::Autoload
78
+
79
+ autoload :Agent
80
+ autoload :Div
81
+ autoload :File
82
+ autoload :FileGrp
83
+ autoload :FileSec
84
+ autoload :FLocat
85
+ autoload :Fptr
86
+ autoload :MetsHdr
87
+ autoload :Mptr
88
+ autoload :StructMap
89
+ end
89
90
 
90
91
  # Image server URL
91
92
  mattr_accessor :image_server_url
@@ -128,19 +129,18 @@ module Ddr
128
129
  false
129
130
  end
130
131
 
132
+ # File path to vips
133
+ mattr_accessor :vips_path
134
+
135
+ mattr_accessor :default_mime_type do
136
+ "application/octet-stream"
137
+ end
138
+
131
139
  # Yields an object with module configuration accessors
132
140
  def self.configure
133
141
  yield self
134
142
  end
135
143
 
136
- def self.external_file_subpath_pattern= (pattern)
137
- unless /^-{1,2}(\/-{1,2}){0,3}$/ =~ pattern
138
- raise "Invalid external file subpath pattern: #{pattern}"
139
- end
140
- re = pattern.split("/").map { |x| "(\\h{#{x.length}})" }.join("")
141
- self.external_file_subpath_regexp = Regexp.new("^#{re}")
142
- end
143
-
144
144
  end
145
145
  end
146
146