app/models/ddr/batch/batch_object.rb in ddr-batch-2.0.0.alpha.1 vs app/models/ddr/batch/batch_object.rb in ddr-batch-2.0.0.alpha.2
- old
+ new
@@ -29,12 +29,15 @@
pids = []
found_objects.each { |obj| pids << obj.pid }
return pids
end
+ def error_prefix
+ I18n.t('ddr.batch.errors.prefix', :identifier => identifier, :id => id)
+ end
+
def validate
- @error_prefix = I18n.t('ddr.batch.errors.prefix', :identifier => identifier, :id => id)
errors = []
errors += validate_model if model
errors += validate_datastreams if batch_object_datastreams
errors += validate_relationships if batch_object_relationships
errors += local_validations
@@ -64,93 +67,57 @@
def validate_model
errs = []
begin
model.constantize
rescue NameError
- errs << "#{@error_prefix} Invalid model name: #{model}"
+ errs << "#{error_prefix} Invalid model name: #{model}"
end
return errs
end
def validate_datastreams
errs = []
batch_object_datastreams.each do |d|
if model_datastream_keys.present?
unless model_datastream_keys.include?(d.name.to_sym)
- errs << "#{@error_prefix} Invalid datastream name for #{model}: #{d.name}"
+ errs << "#{error_prefix} Invalid datastream name for #{model}: #{d.name}"
end
end
unless BatchObjectDatastream::PAYLOAD_TYPES.include?(d.payload_type)
- errs << "#{@error_prefix} Invalid payload type for #{d.name} datastream: #{d.payload_type}"
+ errs << "#{error_prefix} Invalid payload type for #{d.name} datastream: #{d.payload_type}"
end
if d.payload_type.eql?(BatchObjectDatastream::PAYLOAD_TYPE_FILENAME)
unless File.readable?(d.payload)
- errs << "#{@error_prefix} Missing or unreadable file for #{d[:name]} datastream: #{d[:payload]}"
+ errs << "#{error_prefix} Missing or unreadable file for #{d[:name]} datastream: #{d[:payload]}"
end
end
if d.checksum && !d.checksum_type
- errs << "#{@error_prefix} Must specify checksum type if providing checksum for #{d.name} datastream"
+ errs << "#{error_prefix} Must specify checksum type if providing checksum for #{d.name} datastream"
end
if d.checksum_type
unless Ddr::Datastreams::CHECKSUM_TYPES.include?(d.checksum_type)
- errs << "#{@error_prefix} Invalid checksum type for #{d.name} datastream: #{d.checksum_type}"
+ errs << "#{error_prefix} Invalid checksum type for #{d.name} datastream: #{d.checksum_type}"
end
end
end
return errs
end
def validate_relationships
errs = []
batch_object_relationships.each do |r|
- obj_model = nil
- unless BatchObjectRelationship::OBJECT_TYPES.include?(r[:object_type])
- errs << "#{@error_prefix} Invalid object_type for #{r[:name]} relationship: #{r[:object_type]}"
- end
- if r[:object_type].eql?(BatchObjectRelationship::OBJECT_TYPE_PID)
- if batch.present? && batch.found_pids.keys.include?(r[:object])
- obj_model = batch.found_pids[r[:object]]
- else
- begin
- obj = ActiveFedora::Base.find(r[:object], :cast => true)
- obj_model = obj.class.name
- if batch.present?
- batch.add_found_pid(obj.pid, obj_model)
- end
- rescue ActiveFedora::ObjectNotFoundError
- pid_in_batch = false
- if batch.present?
- if batch.pre_assigned_pids.include?(r[:object])
- pid_in_batch = true
- end
- end
- unless pid_in_batch
- errs << "#{@error_prefix} #{r[:name]} relationship object does not exist: #{r[:object]}"
- end
- end
- end
- if obj_model
- relationship_reflection = Ddr::Utils.relationship_object_reflection(model, r[:name])
- if relationship_reflection
- klass = Ddr::Utils.reflection_object_class(relationship_reflection)
- if klass
- errs << "#{@error_prefix} #{r[:name]} relationship object #{r[:object]} exists but is not a(n) #{klass}" unless batch.found_pids[r[:object]].eql?(klass.name)
- end
- else
- errs << "#{@error_prefix} #{model} does not define a(n) #{r[:name]} relationship"
- end
- end
- end
+ r.valid?
+ errs += r.errors.messages.values.map { |msg| "#{error_prefix} msg" }
end
return errs
end
def verify_repository_object
verifications = {}
begin
- repo_object = ActiveFedora::Base.find(pid, :cast => true)
- rescue ActiveFedora::ObjectNotFound
+ repo_object = ActiveFedora::Base.find(pid)
+ rescue ActiveFedora::ObjectNotFoundError
verifications["Object exists in repository"] = VERIFICATION_FAIL
else
verifications["Object exists in repository"] = VERIFICATION_PASS
verifications["Object is correct model"] = verify_model(repo_object) if model
# verifications["Object has correct label"] = verify_label(repo_object) if label
@@ -219,15 +186,27 @@
rescue Ddr::Models::ChecksumInvalid
return VERIFICATION_FAIL
end
def verify_relationship(repo_object, relationship)
+ # if PID, proceed as below
+ # if AR rec ID,
+ # retrieve AR rec
+ # if AR rec has PID, proceed as below using AR rec PID
+ # if not, error (should not occur)
+ repo_object_id = case
+ when relationship.object_rec_id?
+ referent = batch.batch_objects.find(relationship.object)
+ referent.pid
+ when relationship.object_repo_id?
+ relationship.object
+ end
relationship_reflection = Ddr::Utils.relationship_object_reflection(model, relationship.name)
relationship_object_class = Ddr::Utils.reflection_object_class(relationship_reflection)
relationship_object = repo_object.send(relationship.name)
if !relationship_object.nil? &&
- relationship_object.pid.eql?(relationship.object) &&
+ relationship_object.pid.eql?(repo_object_id) &&
relationship_object.is_a?(relationship_object_class)
VERIFICATION_PASS
else
VERIFICATION_FAIL
end
@@ -273,14 +252,22 @@
end
return repo_object
end
def add_relationship(repo_object, relationship)
- relationship_object = case relationship[:object_type]
- when BatchObjectRelationship::OBJECT_TYPE_PID
- ActiveFedora::Base.find(relationship[:object], :cast => true)
+ repo_object_id = case
+ when relationship.object_rec_id?
+ referent = batch.batch_objects.find(relationship[:object])
+ referent.pid
+ when relationship.object_repo_id?
+ relationship[:object]
+ end
+ if repo_object_id.present?
+ relationship_object = ActiveFedora::Base.find(repo_object_id)
+ repo_object.send("#{relationship[:name]}=", relationship_object)
+ else
+ raise Ddr::Batch::Error, "Unable to determine repository ID for relationship #{relationship.id}"
end
- repo_object.send("#{relationship[:name]}=", relationship_object)
return repo_object
end
def set_rdf_subject(repo_object, ds_content)
graph = RDF::Graph.new