ucsdlib/damspas

View on GitHub
lib/dams/controller_helper.rb

Summary

Maintainability
F
1 wk
Test Coverage
module Dams
  module ControllerHelper
    
    #Mapping for OSF API
    def osf_title(document)
      dams_data = document['title_json_tesim']
      osf_data = ''
      unless dams_data.nil?
        dams_data.each do |datum|
          title = JSON.parse(datum)
          osf_data = title['name'] ? title['name'] : ''
          osf_data += title['name'] && title['translationVariant'].present? ? ' : ' : ''
          title_trans = title['translationVariant'] || []
          osf_data = osf_trans_title(title_trans, osf_data)
        end
      end
      osf_data
    end

    def osf_trans_title(title_trans, osf_data)
      if title_trans.class == Array
        title_trans.each do |trans|
          osf_data += trans
        end
      elsif title_trans.class == String
        osf_data += title_trans
      end
      osf_data
    end

    def osf_contributors(document)
      dams_data = document['relationship_json_tesim']
      osf_data = []

      unless dams_data.nil?
        dams_data.each do |datum|
          relationships = JSON.parse(datum)
          relationships.each do |_key, value|
            value.each do |v|
              osf_data << { "name": v }
            end
          end
        end
      end
      osf_data = osf_data.presence || osf_data << { 'name': 'UC San Diego Library' }
    end

    def osf_related_agents(document)
      dams_data = document['relationship_json_tesim']
      osf_data = []

      unless dams_data.nil?
        dams_data.each do |datum|
          relationships = JSON.parse(datum)
          relationships.each do |key, value|
            value.each do |v|
              osf_data << { agent_type: agent_type(key), type: 'Person', 'name': v }
            end
          end
        end
      end
      osf_data << { agent_type: 'Publisher', type: 'Organization', 'name': 'UC San Diego Library Digital Collections' }
    end

    def agent_type(type)
      type = 'principalinvestigator' if ['principal investigator', 'Principal Investigator'].include? type
      agent_dataset ||= YAML.safe_load(ERB.new(IO.read(Rails.root.join('config', 'share_agent_type.yml'))).result)
      has_agent_type = agent_dataset.fetch('key').include? type
      has_agent_type ? type : 'Contributor'
    end

    def osf_extra(document)
      dams_data = document['otherNote_json_tesim']
      osf_data = {}

      unless dams_data.nil?
        dams_data.each do |datum|
          other_note = JSON.parse(datum)
          osf_data = { funding: other_note['value'] } if other_note['type'] == 'funding'
        end
      end
      osf_data
    end

    def osf_description(document)
      dams_data = document['otherNote_json_tesim']
      osf_data = ''

      unless dams_data.nil?
        dams_data.each do |datum|
          other_note = JSON.parse(datum)
          osf_data = other_note['value'] if other_note['type'] == 'description'
        end
      end
      osf_data
    end

    def osf_uris(document)
      dams_data = document['id']
      osf_data = {}

      unless dams_data.nil?
        url = "http://library.ucsd.edu/dc/collection/#{dams_data}"
        osf_data = { 'canonicalUri': url, 'providerUris': url }
      end
      osf_data
    end

    def osf_date_published(document)
      dams_data = document['date_json_tesim']
      osf_data = ''

      unless dams_data.nil?
        dams_data.each do |datum|
          date = JSON.parse(datum)
          if date['type'] == 'issued'
            d_date = date['beginDate'] || ''
            osf_data = Time.utc(d_date.to_i, 1, 1) if d_date =~ /^\d{4}$/
          end
        end
      end
      osf_data.is_a?(Time) || osf_data.is_a?(DateTime) ? osf_data : Time.now.utc
    end

    def osf_languages(document)
      dams_data = document['language_tesim']
      langs = dams_data || []
      osf_data = []

      if langs.class == Array
        langs.each do |lang|
          osf_data << lang
        end
      elsif langs.class == String
        osf_data << langs
      end
      osf_data
    end

    def osf_mads_fields(document)
      osf_data = []
      mads_field ||= YAML.safe_load(ERB.new(IO.read(Rails.root.join('config', 'mads_field.yml'))).result)
      field_names = mads_field.fetch('key')
      field_names.each do |field_name|
        dams_data = document[field_name.to_s]
        if dams_data.is_a?(String)
          osf_data << dams_data
        elsif dams_data.is_a?(Array)
          dams_data.each do |datum|
            osf_data << datum
          end
        end
      end
      osf_data
    end

    def export_to_api(document)
      field_map = {
        'title': osf_title(document),
        'description': osf_description(document),
        'related_agents': osf_related_agents(document),
        'languages': osf_languages(document),
        'date_published': osf_date_published(document),
        'tags': osf_mads_fields(document),
        'extra': osf_extra(document)
      }
      { 'jsonData': field_map }
    end

# Retrieve label from solr index instead of external record from repo
 def get_linked_object_label(id)
          @doc = get_search_results(:q => "id:#{id}")
          field = "name_tesim";
        
        @doc.each do |col| 
            if col.class == Array
                col.each do |c|
                    if(c.key?("#{field}"))
                        @label= c.fetch("#{field}").first
                  end
                end
            end
        end
       @label
  end

 # Returns an array of JSON objects with id and label
    def get_objects_json(object_type_param,field)
          @doc = get_search_results(:q => "has_model_ssim:info:fedora/afmodel:#{object_type_param}", :rows => '10000')
          @objects = Array.new
          @doc.each do |col| 
            if col.class == Array
                col.each do |c|
                    if(c.key?("#{field}"))
                        @tmpObject = {:id =>Rails.configuration.id_namespace+c.id,:label=>c.fetch("#{field}").first}
                                
                        @objects << @tmpObject
                    end
                end
            end
        end
        
        @objectsJson = @objects.to_json
    end


    def get_objects(object_type_param,field)
          @doc = get_search_results(:q => "has_model_ssim:info:fedora/afmodel:#{object_type_param}", :rows => '10000')
          @objects = Array.new
          @doc.each do |col| 
            if col.class == Array
                col.each do |c|
                    if(c.key?("#{field}"))
                        @tmpArray = Array.new
                        @tmpArray << c.fetch("#{field}").first
                        if(object_type_param.include? 'MadsScheme')
                            @tmpArray << Rails.configuration.id_namespace+c.id
                        else
                            @tmpArray << c.id
                        end            
                        @objects << @tmpArray
                    end
                end
            end
        end
        @objects.sort {|a,b|a[0].downcase <=> b[0].downcase}     
    end

    def get_objects_url(object_type_param,field)
          @doc = get_search_results(:q => "has_model_ssim:info:fedora/afmodel:#{object_type_param}", :rows => '10000')
          @objects = Array.new
          @doc.each do |col| 
            if col.class == Array
                col.each do |c|
                    if(c.key?("#{field}"))
                        @tmpArray = Array.new
                        @tmpArray << c.fetch("#{field}").first
                        @tmpArray << Rails.configuration.id_namespace+c.id
                                
                        @objects << @tmpArray
                    end
                end
            end
        end
        
        @objects.sort {|a,b|a[0].downcase <=> b[0].downcase}     
    end

    def get_related_resource_url(object_type_param,field1,field2)
          @doc = get_search_results(:q => "has_model_ssim:info:fedora/afmodel:#{object_type_param}", :rows => '10000')
          @objects = Array.new
          @doc.each do |col| 
            if col.class == Array
                col.each do |c|    
                    type = nil
                    desc = nil
                    if(c.key?("#{field1}"))
                        type = c.fetch("#{field1}").first                                        
                    end
                    if(c.key?("#{field2}"))
                        desc = c.fetch("#{field2}").first                                            
                    end    
                    
                    @tmpArray = Array.new
                    resourceLabel = nil
                    if(!type.nil? && !desc.nil? && desc.length > 0 && type.length > 0)
                        resourceLabel = type + " - " + desc
                    elsif(desc.nil? && !type.nil? && type.length > 0)
                        resourceLabel = type
                    elsif(type.nil? && !desc.nil? && desc.length > 0)
                        resourceLabel = desc
                    end
                    
                    if(!resourceLabel.nil?)
                        @tmpArray << resourceLabel
                        @tmpArray << Rails.configuration.id_namespace+c.id        
                        @objects << @tmpArray
                    end        
                end
            end
        end
        
        @objects.sort {|a,b|a[0].downcase <=> b[0].downcase}     
    end

    def get_related_resources(document)
      relResourceData = document["related_resource_json_tesim"]
      @relResourceHash = Hash.new
      if !relResourceData.nil? and relResourceData.length > 0
        relResourceData.each do |datum|
          relResource = JSON.parse(datum)
          if(!relResource['uri'].nil? and relResource['uri'].length > 0 and relResource['uri'].start_with?( Rails.configuration.id_namespace ))         
              @relResourceHash.store(relResource['uri'],relResource['description'])
            end
          end
      end
      return @relResourceHash
    end
               
    def get_relationship_name_id(object)
        if(!object.relationshipNameURI.nil? && !object.relationshipNameURI.nil? && object.relationshipNameURI.class != Array)
              if(!object.relationshipNameURI.personalName.nil? && !object.relationshipNameURI.personalName.empty?)
                  object.relationshipNameURI.personalName.to_s.gsub(/.*\//,'')[0..9]
              elsif(!object.relationshipNameURI.name.empty?)
                  object.relationshipNameURI.name.to_s.gsub(/.*\//,'')[0..9]
              elsif(!object.relationshipNameURI.corporateName.empty?)
                  object.relationshipNameURI.corporateName.to_s.gsub(/.*\//,'')[0..9] 
              elsif(!object.relationshipNameURI.conferenceName.empty?)
                  object.relationshipNameURI.conferenceName.to_s.gsub(/.*\//,'')[0..9]
              elsif(!object.relationshipNameURI.familyName.empty?)
                  object.relationshipNameURI.familyName.to_s.gsub(/.*\//,'')[0..9]                                               
              end 
        end       
    end

    def get_relationship_name_type(object)
        type = ""
        if(!object.relationshipNameURI.nil? && !object.relationshipNameURI.nil? && object.relationshipNameURI.class != Array)
              if(!object.relationshipNameURI.personalName.nil? && !object.relationshipNameURI.personalName.empty?)
                  type = "PersonalName"
              elsif(!object.relationshipNameURI.name.empty?)
                  type = "Name"              
              elsif(!object.relationshipNameURI.corporateName.empty?)
                  type = "CorporateName"
              elsif(!object.relationshipNameURI.conferenceName.empty?)
                  type = "ConferenceName"
              elsif(!object.relationshipNameURI.familyName.empty?)
                  type = "FamilyName"                                              
              end 
        end    
        type   
    end
                              
    def get_simple_subject_type(object)
        type = ""
           if !object.temporal[0].nil?
              type = "MadsTemporal" 
          elsif !object.topic[0].nil?
              type = "MadsTopic" 
          elsif !object.builtWorkPlace[0].nil?
              type = "DamsBuiltWorkPlace" 
          elsif !object.culturalContext[0].nil?
              type = "DamsCulturalContext" 
          elsif !object.function[0].nil?
              type = "DamsFunction" 
          elsif !object.genreForm[0].nil?
              type = "MadsGenreForm" 
          elsif !object.geographic[0].nil?
              type = "MadsGeographic"
          elsif !object.iconography[0].nil?
              type = "DamsIconography"           
          elsif !object.occupation[0].nil?
              type = "MadsOccupation"           
          elsif !object.scientificName[0].nil?
              type = "DamsScientificName" 
          elsif !object.stylePeriod[0].nil?
              type = "MadsStylePeriod"           
          elsif !object.technique[0].nil?
              type = "DamsTechnique"
          elsif !object.lithology[0].nil?
              type = "DamsLithology"
          elsif !object.series[0].nil?
              type = "DamsSeries"
          elsif !object.cruise[0].nil?
              type = "DamsCruise"     
          elsif !object.anatomy[0].nil?
              type = "DamsAnatomy"                                         
          end                              
        type   
    end
    
    def get_simple_subject_id(object)
        id = ""
        if !object.temporal[0].nil?   
              id = object.temporal.to_s.gsub(/.*\//,'')[0..9]
          elsif !object.topic[0].nil?
              id = object.topic.to_s.gsub(/.*\//,'')[0..9]
          elsif !object.builtWorkPlace[0].nil?
              id = object.builtWorkPlace.to_s.gsub(/.*\//,'')[0..9] 
          elsif !object.culturalContext[0].nil?
              id = object.culturalContext.to_s.gsub(/.*\//,'')[0..9] 
          elsif !object.function[0].nil?
              id = object.function.to_s.gsub(/.*\//,'')[0..9] 
          elsif !object.genreForm[0].nil?
              id = object.genreForm.to_s.gsub(/.*\//,'')[0..9]
          elsif !object.geographic[0].nil?
              id = object.geographic.to_s.gsub(/.*\//,'')[0..9]
          elsif !object.iconography[0].nil?
              id = object.iconography.to_s.gsub(/.*\//,'')[0..9]           
          elsif !object.occupation[0].nil?
              id = object.occupation.to_s.gsub(/.*\//,'')[0..9]           
          elsif !object.scientificName[0].nil?
              id = object.scientificName.to_s.gsub(/.*\//,'')[0..9]
          elsif !object.stylePeriod[0].nil?
              id = object.stylePeriod.to_s.gsub(/.*\//,'')[0..9]           
          elsif !object.technique[0].nil?
              id = object.technique.to_s.gsub(/.*\//,'')[0..9]
          elsif !object.lithology[0].nil?
              id = object.lithology.to_s.gsub(/.*\//,'')[0..9]
          elsif !object.series[0].nil?
              id = object.series.to_s.gsub(/.*\//,'')[0..9]
          elsif !object.cruise[0].nil?
              id = object.cruise.to_s.gsub(/.*\//,'')[0..9]    
          elsif !object.anatomy[0].nil?
              id = object.anatomy.to_s.gsub(/.*\//,'')[0..9]                                      
          end
        id   
    end
    
    def get_simple_subject_value(object)
        value = ""
        if !object.temporal[0].nil?   
              value = object.temporal.first.name.first
          elsif !object.topic[0].nil?
              value = object.topic.first.name.first
          elsif !object.builtWorkPlace[0].nil?
              value = object.builtWorkPlace.first.name.first
          elsif !object.culturalContext[0].nil?
              value = object.culturalContext.first.name.first
          elsif !object.function[0].nil?
              value = object.function.first.name.first 
          elsif !object.genreForm[0].nil?
              value = object.genreForm.first.name.first
          elsif !object.geographic[0].nil?
              value = object.geographic.first.name.first
          elsif !object.iconography[0].nil?
              value = object.iconography.first.name.first           
          elsif !object.occupation[0].nil?
              value = object.occupation.first.name.first           
          elsif !object.scientificName[0].nil?
              value = object.scientificName.first.name.first
          elsif !object.stylePeriod[0].nil?
              value = object.stylePeriod.first.name.first           
          elsif !object.technique[0].nil?
              value = object.technique.first.name.first                              
          elsif !object.lithology[0].nil?
              value = object.lithology.first.name.first
          elsif !object.series[0].nil?
              value = object.series.first.name.first           
          elsif !object.cruise[0].nil?
              value = object.cruise.first.name.first
          elsif !object.anatomy[0].nil?
              value = object.anatomy.first.name.first
          end
        value   
    end  
    
    def get_simple_subjects(object)       
        simpleSubjectArray = Array.new

     

          object.temporal.each do |temp|

            simpleSubjectArray << {
            :name => "Temporal", :value => get_pid(temp), :label => get_linked_object_label(get_pid(temp))
          }              
          end
          
          object.topic.each do |top|
        simpleSubjectArray << {
            :name => "Topic", :value => get_pid(top), :label => get_linked_object_label(get_pid(top))
          }              
          end
          
          object.builtWorkPlace.each do |built|
            simpleSubjectArray << {
            :name => "BuiltWorkPlace", :value => get_pid(built),:label => get_linked_object_label(get_pid(built))
          }
          end

          object.culturalContext.each do |cultural|
            simpleSubjectArray << {
            :name => "CulturalContext", :value => get_pid(cultural), :label => get_linked_object_label(get_pid(cultural))
          }              
          end

          object.function.each do |fun|
            simpleSubjectArray << {
            :name => "Function", :value => get_pid(fun), :label => get_linked_object_label(get_pid(fun))
          }              
          end
          
          object.genreForm.each do |genre|
            simpleSubjectArray << {
            :name => "GenreForm", :value => get_pid(genre), :label => get_linked_object_label(get_pid(genre))
          }              
          end
          
          object.geographic.each do |geo|
            simpleSubjectArray << {
            :name => "Geographic", :value => get_pid(geo), :label => get_linked_object_label(get_pid(geo))
          }              
          end
          
          object.iconography.each do |icon|
            simpleSubjectArray << {
            :name => "Iconography", :value => get_pid(icon), :label => get_linked_object_label(get_pid(icon))
          }              
          end
          
          object.occupation.each do |occ|
            simpleSubjectArray << {
            :name => "Occupation", :value => get_pid(occ), :label => get_linked_object_label(get_pid(occ))
          }              
          end
          
          object.scientificName.each do |sci|
            simpleSubjectArray << {
            :name => "ScientificName", :value => get_pid(sci), :label => get_linked_object_label(get_pid(sci))
          }              
          end
          
          object.stylePeriod.each do |style|
            simpleSubjectArray << {
            :name => "StylePeriod", :value => get_pid(style), :label => get_linked_object_label(get_pid(style))
          }              
          end
          
          object.technique.each do |tech|
            simpleSubjectArray << {
            :name => "Technique", :value => get_pid(tech), :label => get_linked_object_label(get_pid(tech))
          }                  
          end

          object.lithology.each do |li|
            simpleSubjectArray << {
            :name => "Lithology", :value => get_pid(li), :label => get_linked_object_label(get_pid(li))
          }              
          end
          
          object.series.each do |ser|
            simpleSubjectArray << {
            :name => "Series", :value => get_pid(ser), :label => get_linked_object_label(get_pid(ser))
          }              
          end
          
          object.cruise.each do |cru|
            simpleSubjectArray << {
            :name => "Cruise", :value => get_pid(cru), :label => get_linked_object_label(get_pid(cru))
          }                  
          end

          object.anatomy.each do |an|
            simpleSubjectArray << {
            :name => "Anatomy", :value => get_pid(an), :label => get_linked_object_label(get_pid(an))
          }              
          end
              
        simpleSubjectArray   
    end
    def get_pid(object)
      if object.class == RDF::URI
        object.to_s.gsub(/.*\//,'')
      else
        object.pid
      end
    end
           
    def get_name_type(object)
        type = ""
           if !object.name[0].nil?
              type = "Name"           
          elsif !object.conferenceName[0].nil?
              type = "ConferenceName"           
          elsif !object.corporateName[0].nil?
              type = "CorporateName"                 
          elsif !object.personalName[0].nil?
              type = "PersonalName" 
          elsif !object.familyName[0].nil?
              type = "FamilyName"     
          end
        type   
    end
    
   def get_name_id(object)
        id = ""
        if !object.name[0].nil?
              id = object.name.to_s.gsub(/.*\//,'')[0..9]          
          elsif !object.conferenceName[0].nil?
              id = object.conferenceName.to_s.gsub(/.*\//,'')[0..9]          
          elsif !object.corporateName[0].nil?
              id = object.corporateName.to_s.gsub(/.*\//,'')[0..9]                 
          elsif !object.personalName[0].nil?
              id = object.personalName.to_s.gsub(/.*\//,'')[0..9] 
          elsif !object.familyName[0].nil?
              id = object.familyName.to_s.gsub(/.*\//,'')[0..9]     
          end
        id   
    end
    
    def get_name_value(object)
        value = ""
        if !object.name[0].nil?
              value = object.name.first.name.first          
          elsif !object.conferenceName[0].nil?
              value = object.conferenceName.first.name.first          
          elsif !object.corporateName[0].nil?
              value = object.corporateName.first.name.first                 
          elsif !object.personalName[0].nil?
              value = object.personalName.first.name.first 
          elsif !object.familyName[0].nil?
              value = object.familyName.first.name.first     
          end
        value   
    end
    def get_creators(object)       
        creatorArray = Array.new

          object.conferenceName.each do |conf|
            creatorArray << {
            :name => "ConferenceName",
            :value => conf.pid,
        :label => get_linked_object_label(get_pid(conf))              
          }              
          end
          
          object.corporateName.each do |corp|
            creatorArray << {
            :name => "CorporateName",
            :value => corp.pid,    
        :label => get_linked_object_label(get_pid(corp))          
          }              
          end

        object.familyName.each do |fam|
            creatorArray << {
            :name => "FamilyName",
            :value => fam.pid,
        :label => get_linked_object_label(get_pid(fam))              
          }              
          end

           object.name.each do |nam|
            creatorArray << {
            :name => "Name",
            :value => nam.pid,
        :label => get_linked_object_label(get_pid(nam))              
          }              
          end

          object.personalName.each do |pers|
            creatorArray << {
            :name => "PersonalName",
            :value => pers.pid,        
        :label => get_linked_object_label(get_pid(pers))      
          }
          end

        creatorArray
                      
    end

   def get_rights_holders(object)       
        rightsHolderArray = Array.new

          object.rightsHolderConference.each do |conf|
            rightsHolderArray << {
            :name => "RightsHolderConference",
            :value => conf.pid,              
          }              
          end
          
          object.rightsHolderCorporate.each do |corp|
            rightsHolderArray << {
            :name => "RightsHolderCorporate",
            :value => corp.pid,              
          }              
          end

        object.rightsHolderFamily.each do |fam|
            rightsHolderArray << {
            :name => "RightsHolderFamily",
            :value => fam.pid,              
          }              
          end

           object.rightsHolderName.each do |nam|
            rightsHolderArray << {
            :name => "RightsHolderName",
            :value => nam.pid,              
          }              
          end

          object.rightsHolderPersonal.each do |pers|
            rightsHolderArray << {
            :name => "RightsHolderPersonal",
            :value => pers.pid,              
          }
          end

        rightsHolderArray
                      
    end
    
    def get_relationships(object)       
        relationshipArray = Array.new
        relationship = object.relationship
        roleId = ""
        if(!relationship.nil?)
            relationship.each do |relation|
                if(!relation.role.nil?)
                    roleId = relation.role.first.pid
                end

                  relation.conferenceName.each do |conf|
                    relationshipArray << {
                    :name => "ConferenceName",
                    :nameId => conf.pid,    
                    :roleId => "#{roleId}",          
                  }              
                  end
                  
                  relation.corporateName.each do |corp|
                    relationshipArray << {
                    :name => "CorporateName",
                    :nameId => corp.pid,
                    :roleId => "#{roleId}",                  
                  }              
                  end
        
                relation.familyName.each do |fam|
                    relationshipArray << {
                    :name => "FamilyName",
                    :nameId => fam.pid,
                    :roleId => "#{roleId}",                                  
                  }              
                  end
        
                   relation.name.each do |nam|
                    relationshipArray << {
                    :name => "Name",
                    :nameId => nam.pid,
                    :roleId => "#{roleId}",                                  
                  }              
                  end
        
                  relation.personalName.each do |pers|
                    relationshipArray << {
                    :name => "PersonalName",
                    :nameId => pers.pid,
                    :roleId => "#{roleId}",                                  
                  }
                  end
                                
            end
        end
        relationshipArray   
    end
        
    def index_links(object)
          solrizer = Solrizer::Fedora::Solrizer.new
          object.language.each do |lang|
              if(!lang.pid.nil? && lang.pid.to_s.length > 0)
                  solrizer.solrize lang.pid
              end
          end  
    end                                   

    def attach_file(object, file)
      if file.nil? || !file.respond_to?(:original_filename)
        return { alert: "No file uploaded" }
      else
        # set the filename
        @ds = "_1" # XXX TODO list files and choose next file id
        ext = File.extname(file.original_filename)
        @ds += ext unless ext.nil?

        # check mime type and include derivatives hook if derivable
        mt = file.content_type
        if ext.include?("wav") || ext.include?("tif") || ext.include?("mov") || ext.include?("avi") || ext.include?("pdf")
          # add the file and save the object
          object.add_file( file, @ds, file.original_filename )
          object.save!
          logger.warn "audit: #{session[:user_id]} create File #{object.id}/#{@ds}"
          Audit.create( user: session[:user_id], action: "create", classname: "File", object: "#{object.id}/#{@ds}")
          return { notice: "File Uploaded", deriv: @ds }
        else
          return { alert: "File Type #{mt} is not supported. Supported File Types: TIFF, WAV, MOV, AVI, PDF"}
        end
      end
    end

     def get_colletion_objects(collectionObjId, collectionObjArray,classType)
      if(!collectionObjId.nil?)
        collectionObjId.each do |colId|
          collectionObj = classType.find( colId.to_s.gsub(/.*\//,'')[0..9] )
          if (!collectionObj.nil?)
            collectionObjArray << collectionObj
          end    
        end
      end
     end
         
    def create_derivatives(object, file, fullPath)
      if file.nil? || !file.respond_to?(:original_filename)
        return { alert: "No file uploaded" }
      else       
      begin
        # set the filename
        @ds = "_1" # XXX TODO list files and choose next file id
        ext = File.extname(file.original_filename)
        @ds += ext unless ext.nil?
                
        dspart = @ds.split("_")
        
        if ( dspart.length == 2 )
          @cid = nil
          @fid = dspart[1]
        elsif ( dspart.length == 3 )
          @cid = dspart[1]
          @fid = dspart[2]
        else
          return{ notice: "Invalid datastream name: #@ds" }
          return
        end
    
        # add any extension stripped by rails
        ext = File.extname(fullPath)
        @fid += ext unless ext.nil?
    
        # build url to make damsrepo generate derivs
        user = ActiveFedora.fedora_config.credentials[:user]
        pass = ActiveFedora.fedora_config.credentials[:password]
        url = "#{dams_api_path}/api/files/#{object}/"
        url += "#{@cid}/" unless @cid.nil?
        url += "#{@fid}/derivatives?format=json"

        # call damsrepo
        puts "URL to create derivatives --------------- #{url}"
        response = RestClient::Request.new(
            :method => :post, :url => url, :user => user, :password => pass
          ).execute
        json = JSON.parse(response.to_str)
        if json['status'] == 'OK'
           return { notice: json['message']}
        else
           return { alert: json['message'] }
        end


        rescue Exception => e
          logger.warn "Error generating derivatives #{e.to_s}"
          return { alert: e.to_s}
        end
      end
    end

    def dams_api_path
      ActiveFedora.fedora_config.credentials[:url].gsub(/\/fedora$/,'')
    end
    def mint_doi( id )
      dams_post "#{dams_api_path}/api/objects/#{id}/mint_doi?format=json"
    end
    def dams_post( url )
      user = ActiveFedora.fedora_config.credentials[:user]
      pass = ActiveFedora.fedora_config.credentials[:password]
      response = RestClient::Request.new(
        :method => :post, :url => url, :user => user, :password => pass
      ).execute
      JSON.parse(response.to_str)
    end

    
    def get_html_data ( params, controller_path )
       xsl = (params[:xsl].nil? || params[:xsl].empty?)?'review.xsl':params[:xsl]
       controller = (controller_path.nil? || controller_path.empty?)?'':'&controller=' + URI.encode(controller_path)
       viewerUrl = "#{dams_api_path}/api/objects/#{params[:id]}/transform?recursive=true&xsl=#{xsl}&baseurl=" + URI.encode(dams_api_path) + controller
       uri = URI(viewerUrl)
       res = Net::HTTP.get_response(uri)
       res.body
    end       

    def get_data ( recursive = true, format )
       format = format.blank? ? 'xml':format
       viewerUrl = "#{dams_api_path}/api/objects/#{params[:id]}?" + (recursive ? "recursive=true&" : "") + "format=#{format}"
       uri = URI(viewerUrl)
       res = Net::HTTP.get_response(uri)
       res.body
    end

    def audit( id = "unknown" )
      classname = self.class.name.gsub("sController","")
      logger.warn "audit: #{session[:user_id]} #{params[:action]} #{classname} #{id}"
      Audit.create( user: session[:user_id], action: params[:action], classname: classname, object: id)
    end

    # parse a request's referrer and figure out which controller it came from
    def referrer_controller( request )
      uri = URI(request.referrer || "")
      if uri.host == request.host
        begin
          ref = Rails.application.routes.recognize_path(uri.path.gsub(/^\/dc/,""))
          ref[:controller]
        rescue Exception => e
          logger.warn "Referer controller error: #{e}"
        end
      end
    end

    def hide_label?(document)
      cannot?(:edit, document) && can?(:read, document) && (local_display?(rights_data(document)) || local_collection?(document))
    end

    def local_collection?(document)
      data = (Array(document['collection_json_tesim']) + Array(document['visibility_tesim'])).flatten.compact
      return false if data.blank?
      data.any? { |t| t.include?('local') }
    end

    def local_display?(data)
      return false if data.blank?
      data.any? { |t| t.include?('localDisplay') }
    end

    def metadata_display?(data)
      return false if data.blank?
      data.any? { |t| t.include?('localDisplay') || t.include?('metadataDisplay') }
    end

    def total_count(collection_id)
      solr_params = build_params("collections_tesim:#{collection_id}")
      raw_solr(solr_params).response['numFound'].to_i
    end

    def metadata_obj_count(collection_id)
      solr_params = build_params("collections_tesim:#{collection_id}", metadata_only_fquery)
      raw_solr(solr_params).response['numFound'].to_i
    end

    def build_params(query, fquery = nil)
      { q: query, fq: fquery, rows: 1 }
    end

    def metadata_only_fquery
      '(otherRights_tesim:localDisplay OR otherRights_tesim:metadataDisplay OR license_tesim:localDisplay)'
    end

    def raw_solr(params = {})
      solr_path = blacklight_config.solr_path
      res = blacklight_solr.send_and_receive(solr_path, params: params)
      solr_response = Blacklight::SolrResponse.new(force_to_utf8(res), params)
      solr_response
    end

    def mix_objects?(collection_id, obj_count)
      return false unless obj_count && obj_count.positive?
      total_count(collection_id) > obj_count
    end

    #---
    # Check to see if an object allows file download
    #
    # @return Boolean value
    #---
    def can_download?(solr_doc, fileid = nil)
      permissions = (Array(solr_doc['license_tesim']) + Array(solr_doc['otherRights_tesim'])).flatten.compact
      return false if streaming_media_type?(solr_doc['resource_type_tesim'], fileid) && metadata_display?(permissions)
      metadata_only_display = metadata_only_display?(permissions)
      return !restricted_file?(fileid) if fileid && metadata_only_display
      !metadata_only_display
    end

    def restricted_file?(fileid)
      fileid && fileid.include?('_2.jpg')
    end

    def streaming_media_type?(resource_types, fileid = nil)
      return false if resource_types.blank?
      video_type = resource_types.any? { |t| t.include?('video') || t.include?('sound') }
      return video_type unless video_type && fileid
      fileid.end_with?('.mp4', '.mp3')
    end

    def metadata_only_display?(data)
      return false if data.blank?
      data.any? { |t| t.include?('metadataDisplay') }
    end

    # Rights data: OtherRights and License
    # @return [Array]
    def rights_data(document)
      (Array(document['otherRights_tesim']) + Array(document['license_tesim'])).flatten.compact
    end
  end
end