lib/dams/mads_title.rb
require 'active_support/concern'
module Dams
module MadsTitle
extend ActiveSupport::Concern
include Dams::MadsTitleElements
included do
rdf_type MADS.Title
map_predicates do |map|
map.name(:in => MADS, :to => 'authoritativeLabel')
map.externalAuthority(:in => MADS, :to => 'hasExactExternalAuthority')
map.hasVariant(:in => MADS, :class_name => 'MadsVariant')
map.hasAbbreviationVariant(:in => MADS, :class_name => 'MadsVariant')
map.hasAcronymVariant(:in => MADS, :class_name => 'MadsVariant')
map.hasExpansionVariant(:in => MADS, :class_name => 'MadsVariant')
map.hasTranslationVariant(:in => MADS, :class_name => 'MadsVariant')
map.elem_list(:in => MADS, :to => 'elementList', :class_name=>'MadsTitleElementList')
end
rdf_subject { |ds|
if ds.pid.nil?
RDF::URI.new
else
RDF::URI.new(Rails.configuration.id_namespace + ds.pid)
end
}
def elementList
elem_list.first || elem_list.build
end
accepts_nested_attributes_for :nonSortElement, :mainTitleElement, :partNameElement, :partNumberElement, :subTitleElement, :hasVariant,
:hasAbbreviationVariant, :hasAcronymVariant, :hasExpansionVariant, :hasTranslationVariant
def serialize
check_type( graph, rdf_subject, MADS.Title )
super
end
### nonSort ####
delegate :nonSortElement_attributes=, to: :elementList
alias_method :nonSortElement, :elementList
def nonSortElement_with_update_name= (attributes)
self.nonSortElement_without_update_name= attributes
self.name = authLabel
end
alias_method :nonSortElement_without_update_name=, :nonSortElement_attributes=
alias_method :nonSortElement_attributes=, :nonSortElement_with_update_name=
### mainTitle ####
delegate :mainTitleElement_attributes=, to: :elementList
alias_method :mainTitleElement, :elementList
def mainTitleElement_with_update_name= (attributes)
self.mainTitleElement_without_update_name= attributes
self.name = authLabel
end
alias_method :mainTitleElement_without_update_name=, :mainTitleElement_attributes=
alias_method :mainTitleElement_attributes=, :mainTitleElement_with_update_name=
### partName ####
delegate :partNameElement_attributes=, to: :elementList
alias_method :partNameElement, :elementList
def partNameElement_with_update_name= (attributes)
self.partNameElement_without_update_name= attributes
self.name = authLabel
end
alias_method :partNameElement_without_update_name=, :partNameElement_attributes=
alias_method :partNameElement_attributes=, :partNameElement_with_update_name=
### partNumber ####
delegate :partNumberElement_attributes=, to: :elementList
alias_method :partNumberElement, :elementList
def partNumberElement_with_update_name= (attributes)
self.partNumberElement_without_update_name= attributes
self.name = authLabel
end
alias_method :partNumberElement_without_update_name=, :partNumberElement_attributes=
alias_method :partNumberElement_attributes=, :partNumberElement_with_update_name=
### subTitle ####
delegate :subTitleElement_attributes=, to: :elementList
alias_method :subTitleElement, :elementList
def subTitleElement_with_update_name= (attributes)
self.subTitleElement_without_update_name= attributes
self.name = authLabel
end
alias_method :subTitleElement_without_update_name=, :subTitleElement_attributes=
alias_method :subTitleElement_attributes=, :subTitleElement_with_update_name=
def authLabel
main = value
subt = subtitle
nons = nonSort
pnam = partName
pnum = partNumber
# make sure we have values not arrays
main = main.first if main.class == Array
subt = subt.first if subt.class == Array
nons = nons.first if nons.class == Array
pnam = pnam.first if pnam.class == Array
pnum = pnum.first if pnum.class == Array
authLabel = ""
authLabel += nons if nons
authLabel += " " + main if main
authLabel += ": " + subt if subt
#authLabel += ", " + nons if nons
authLabel += ", " + pnam if pnam
authLabel += ", " + pnum if pnum
authLabel if !authLabel.blank?
end
def value
get_title_value MadsMainTitleElement
end
def nonSort
get_title_value MadsNonSortElement
end
def partName
get_title_value MadsPartNameElement
end
def partNumber
get_title_value MadsPartNumberElement
end
def subtitle
get_title_value MadsSubTitleElement
end
def value=(s)
set_title_value MadsMainTitleElement, s
end
def nonSort=(s)
set_title_value MadsNonSortElement, s
end
def partName=(s)
set_title_value MadsPartNameElement, s
end
def partNumber=(s)
set_title_value MadsPartNumberElement, s
end
def subtitle=(s)
set_title_value MadsSubTitleElement, s
end
def variant
variants(hasVariant)
end
def variant=(val)
set_variant(hasVariant,val)
end
def translationVariant
variants(hasTranslationVariant)
end
def translationVariant=(val)
set_variant(hasTranslationVariant,val)
end
def abbreviationVariant
variants(hasAbbreviationVariant)
end
def abbreviationVariant=(val)
set_variant(hasAbbreviationVariant,val)
end
def acronymVariant
variants(hasAcronymVariant)
end
def acronymVariant=(val)
set_variant(hasAcronymVariant,val)
end
def expansionVariant
variants(hasExpansionVariant)
end
def expansionVariant=(val)
set_variant(hasExpansionVariant,val)
end
def set_variant(type, val)
if val.class == Array
val = val.first
end
if(!val.nil? && val.length > 0)
type.build if type[0] == nil
type[0].variantLabel = val
end
end
def variants(type)
variants = Array.new
type.each do |var|
variants << var.variantLabel.first
end
variants
end
def get_elem(klass)
idx = 0
while idx < elementList.size
return elementList[idx] if elementList[idx].class == klass
idx += 1
end
end
def get_title_value(klass)
elem = get_elem(klass)
if (elem.nil?)
return nil
elsif(elem.elementValue.nil?)
return nil
elsif(elem.elementValue.first == nil || elem.elementValue.first.size > elem.elementValue.size )
return elem.elementValue.first
else
return elem.elementValue.to_s
end
end
def set_title_value( klass, val )
e = get_elem(klass)
if e.nil?
e = klass.new( graph )
elementList[elementList.size] = e
end
e.elementValue = val
# manipulate graph directly
label = graph.first_object([nil,MADS.authoritativeLabel,nil])
if ( !label.nil? )
graph.update([rdf_subject, MADS.authoritativeLabel, authLabel])
elsif ( label.blank? || label.value.blank? ) && !authLabel.blank?
graph.insert([rdf_subject, MADS.authoritativeLabel, authLabel])
end
end
def to_solr (solr_doc={})
Solrizer.insert_field(solr_doc, 'title', name)
Solrizer.insert_field(solr_doc, "externalAuthority", externalAuthority.first.to_s)
if elementList.first
Solrizer.insert_field(solr_doc, "title_element", value)
Solrizer.insert_field(solr_doc, "sub_title_element", subtitle)
Solrizer.insert_field(solr_doc, "part_name_element", partName)
Solrizer.insert_field(solr_doc, "part_number_element", partNumber)
Solrizer.insert_field(solr_doc, "non_sort_element", nonSort)
end
solr_base solr_doc
end
end
class MadsTitleElementList
include ActiveFedora::RdfList
map_predicates do |map|
map.nonSortElement(:in=> MADS, :to =>"NonSortElement", :class_name => "MadsNonSortElement")
map.mainTitleElement(:in=> MADS, :to =>"MainTitleElement", :class_name => "MadsMainTitleElement")
map.partNameElement(:in=> MADS, :to =>"PartNameElement", :class_name => "MadsPartNameElement")
map.partNumberElement(:in=> MADS, :to =>"PartNumberElement", :class_name => "MadsPartNumberElement")
map.subTitleElement(:in=> MADS, :to =>"SubTitleElement", :class_name => "MadsSubTitleElement")
end
accepts_nested_attributes_for :nonSortElement, :mainTitleElement, :partNameElement, :partNumberElement, :subTitleElement
end
end
end