diff --git a/plugins/virtuoso/lib/virtuoso_plugin/dublin_core_metadata.rb b/plugins/virtuoso/lib/virtuoso_plugin/dublin_core_metadata.rb index 376cd87..f8990d4 100644 --- a/plugins/virtuoso/lib/virtuoso_plugin/dublin_core_metadata.rb +++ b/plugins/virtuoso/lib/virtuoso_plugin/dublin_core_metadata.rb @@ -2,19 +2,27 @@ class VirtuosoPlugin::DublinCoreMetadata include OAI::XPath - attr_accessor :date, :title, :creator, :subject, :description, :date, :type, :identifier, :language, :rights, :format + FIELDS = ['title', 'creator', 'subject', 'description', 'date', + 'type', 'identifier', 'language', 'rights', 'format'] def initialize(element) - @title = xpath(element, './/dc:title') - @creator = xpath(element, './/dc:creator') - @subject = xpath_all(element, './/dc:subject').map(&:text) - @description = xpath(element, './/dc:description') - @date = xpath(element, './/dc:date') - @type = xpath(element, './/dc:type') - @identifier = xpath(element, './/dc:identifier') - @language = xpath(element, './/dc:language') - @rights = xpath_all(element, './/dc:rights').map(&:text) - @format = xpath(element, './/dc:format') + @element = element + FIELDS.each do |field| + self.class.send(:attr_accessor, field) + self.send("#{field}=", extract_field("dc:#{field}")) + end + end + + def extract_field(name) + value = xpath_all(@element, ".//#{name}") + case value.size + when 0 + nil + when 1 + value.first.text + else + value.map(&:text) + end end end diff --git a/plugins/virtuoso/test/unit/dublin_core_metadata_test.rb b/plugins/virtuoso/test/unit/dublin_core_metadata_test.rb new file mode 100644 index 0000000..6c66998 --- /dev/null +++ b/plugins/virtuoso/test/unit/dublin_core_metadata_test.rb @@ -0,0 +1,51 @@ +require File.dirname(__FILE__) + '/../test_helper' + +class DublinCoreMetadataTest < ActiveSupport::TestCase + + should 'parse default dublin core fields' do + dc = VirtuosoPlugin::DublinCoreMetadata.new(metadata) + assert_equal "Title", dc.title + assert_equal "Creator", dc.creator + assert_equal ["Subject", "Other Subject"], dc.subject + assert_equal "Description", dc.description + assert_equal "2014", dc.date + assert_equal "Type", dc.type + assert_equal "Identifier", dc.identifier + assert_equal "Language", dc.language + assert_equal "Rights", dc.rights + assert_equal "Format", dc.format + end + + should 'extract fields' do + dc = VirtuosoPlugin::DublinCoreMetadata.new(metadata) + assert_equal "Title", dc.extract_field('dc:title') + assert_equal "Creator", dc.extract_field('dc:creator') + assert_equal ["Subject", "Other Subject"], dc.extract_field('dc:subject') + end + + should 'return nil when field do not exists' do + dc = VirtuosoPlugin::DublinCoreMetadata.new(metadata) + assert_equal nil, dc.extract_field('dc:undefinedField') + end + + def metadata + REXML::Document.new(' + + + Title + Creator + Subject + Other Subject + Description + 2014 + Type + Identifier + Language + Rights + Format + + + ') + end + +end -- libgit2 0.21.2