@object.save!
rescue ActiveRecord::RecordNotUnique
logger.debug resource_attrs.inspect
- if resource_attrs[:manifest_text] and resource_attrs[:uuid]
+ if @object.manifest_text and @object.uuid
@existing_object = model_class.
where('uuid=? and manifest_text=?',
- resource_attrs[:uuid],
- resource_attrs[:manifest_text]).
+ @object.uuid,
+ @object.manifest_text).
first
@object = @existing_object || @object
end
end
def assign_uuid
- if self.manifest_text.nil? and self.uuid.nil?
- super
- elsif self.manifest_text and self.uuid
+ if not self.manifest_text
+ errors.add :manifest_text, 'not supplied'
+ return false
+ end
+ expect_uuid = Digest::MD5.hexdigest(self.manifest_text)
+ if self.uuid
self.uuid.gsub! /\+.*/, ''
- if self.uuid == Digest::MD5.hexdigest(self.manifest_text)
- self.uuid.gsub! /$/, '+' + self.manifest_text.length.to_s
- true
- else
- errors.add :uuid, 'does not match checksum of manifest_text'
- false
+ if self.uuid != expect_uuid
+ errors.add :uuid, 'must match checksum of manifest_text'
+ return false
end
- elsif self.manifest_text
- errors.add :uuid, 'not supplied (must match checksum of manifest_text)'
- false
else
- errors.add :manifest_text, 'not supplied'
- false
+ self.uuid = expect_uuid
end
+ self.uuid.gsub! /$/, '+' + self.manifest_text.length.to_s
+ true
end
+ # TODO (#3036/tom) replace above assign_uuid method with below assign_uuid and self.generate_uuid
+ # def assign_uuid
+ # # Even admins cannot assign collection uuids.
+ # self.uuid = self.class.generate_uuid
+ # end
+ # def self.generate_uuid
+ # # The last 10 characters of a collection uuid are the last 10
+ # # characters of the base-36 SHA256 digest of manifest_text.
+ # [Server::Application.config.uuid_prefix,
+ # self.uuid_prefix,
+ # rand(2**256).to_s(36)[-5..-1] + Digest::SHA256.hexdigest(self.manifest_text).to_i(16).to_s(36)[-10..-1],
+ # ].join '-'
+ # end
+
def data_size
inspect_manifest_text if @data_size.nil? or manifest_text_changed?
@data_size
return
end
- #normalized_manifest = ""
- #IO.popen(['arv-normalize'], 'w+b') do |io|
- # io.write manifest_text
- # io.close_write
- # while buf = io.read(2**20)
- # normalized_manifest += buf
- # end
- #end
-
@data_size = 0
tmp = {}