libis-services 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
 - data/.gitignore +18 -0
 - data/Gemfile +4 -0
 - data/LICENSE.txt +22 -0
 - data/README.md +36 -0
 - data/Rakefile +6 -0
 - data/lib/libis-services.rb +1 -0
 - data/lib/libis/services.rb +21 -0
 - data/lib/libis/services/aleph/search.rb +157 -0
 - data/lib/libis/services/collective_access.rb +1 -0
 - data/lib/libis/services/collective_access/cataloguing.rb +48 -0
 - data/lib/libis/services/collective_access/connector.rb +151 -0
 - data/lib/libis/services/collective_access/item_info.rb +36 -0
 - data/lib/libis/services/collective_access/search.rb +26 -0
 - data/lib/libis/services/collective_access/service.rb +80 -0
 - data/lib/libis/services/digitool/digital_entity_manager.rb +223 -0
 - data/lib/libis/services/digitool/digitool_connector.rb +46 -0
 - data/lib/libis/services/digitool/meta_data_manager.rb +193 -0
 - data/lib/libis/services/extend/http_fetch.rb +63 -0
 - data/lib/libis/services/generic_search.rb +38 -0
 - data/lib/libis/services/http_error.rb +21 -0
 - data/lib/libis/services/oracle_client.rb +47 -0
 - data/lib/libis/services/primo.rb +2 -0
 - data/lib/libis/services/primo/limo.rb +33 -0
 - data/lib/libis/services/primo/search.rb +46 -0
 - data/lib/libis/services/rest_client.rb +66 -0
 - data/lib/libis/services/rosetta.rb +1 -0
 - data/lib/libis/services/rosetta/client.rb +107 -0
 - data/lib/libis/services/rosetta/collection_handler.rb +45 -0
 - data/lib/libis/services/rosetta/collection_info.rb +35 -0
 - data/lib/libis/services/rosetta/deposit_activity.rb +48 -0
 - data/lib/libis/services/rosetta/deposit_handler.rb +187 -0
 - data/lib/libis/services/rosetta/ie.rb +19 -0
 - data/lib/libis/services/rosetta/ie_handler.rb +29 -0
 - data/lib/libis/services/rosetta/pds_handler.rb +60 -0
 - data/lib/libis/services/rosetta/producer.rb +71 -0
 - data/lib/libis/services/rosetta/producer_handler.rb +125 -0
 - data/lib/libis/services/rosetta/service.rb +399 -0
 - data/lib/libis/services/rosetta/sip.rb +26 -0
 - data/lib/libis/services/rosetta/sip_handler.rb +30 -0
 - data/lib/libis/services/rosetta/user.rb +70 -0
 - data/lib/libis/services/rosetta/user_manager.rb +28 -0
 - data/lib/libis/services/scope/search.rb +46 -0
 - data/lib/libis/services/search_factory.rb +40 -0
 - data/lib/libis/services/sharepoint/connector.rb +236 -0
 - data/lib/libis/services/sharepoint/search.rb +19 -0
 - data/lib/libis/services/soap_client.rb +57 -0
 - data/lib/libis/services/soap_error.rb +22 -0
 - data/lib/libis/services/version.rb +5 -0
 - data/libis-services.gemspec +38 -0
 - data/spec/primo_limo_spec.rb +394 -0
 - data/spec/primo_search_spec.rb +39 -0
 - data/spec/rosetta_collection_spec.rb +206 -0
 - data/spec/rosetta_deposit_spec.rb +82 -0
 - data/spec/rosetta_ie_spec.rb +345 -0
 - data/spec/rosetta_pds_spec.rb +79 -0
 - data/spec/rosetta_producer_spec.rb +270 -0
 - data/spec/rosetta_sip_spec.rb +39 -0
 - data/spec/spec_helper.rb +12 -0
 - metadata +307 -0
 
| 
         @@ -0,0 +1,26 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'virtus'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module Libis
         
     | 
| 
      
 4 
     | 
    
         
            +
              module Services
         
     | 
| 
      
 5 
     | 
    
         
            +
                module Rosetta
         
     | 
| 
      
 6 
     | 
    
         
            +
                  class Sip
         
     | 
| 
      
 7 
     | 
    
         
            +
                    # noinspection RubyResolve
         
     | 
| 
      
 8 
     | 
    
         
            +
                    include Virtus.model nullify_blank: true
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                    MODULE = %w'PER'
         
     | 
| 
      
 11 
     | 
    
         
            +
                    STAGE = %w'Finished'
         
     | 
| 
      
 12 
     | 
    
         
            +
                    STATUS = %w'FINISHED'
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                    attribute :id, Integer
         
     | 
| 
      
 15 
     | 
    
         
            +
                    attribute :module, String
         
     | 
| 
      
 16 
     | 
    
         
            +
                    attribute :stage, String
         
     | 
| 
      
 17 
     | 
    
         
            +
                    attribute :status, String
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                    def to_hash
         
     | 
| 
      
 20 
     | 
    
         
            +
                      super.cleanup
         
     | 
| 
      
 21 
     | 
    
         
            +
                    end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                  end
         
     | 
| 
      
 24 
     | 
    
         
            +
                end
         
     | 
| 
      
 25 
     | 
    
         
            +
              end
         
     | 
| 
      
 26 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,30 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # encoding: utf-8
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'libis/tools/extend/hash'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require_relative 'client'
         
     | 
| 
      
 5 
     | 
    
         
            +
            require_relative 'sip'
         
     | 
| 
      
 6 
     | 
    
         
            +
            require_relative 'ie'
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            module Libis
         
     | 
| 
      
 9 
     | 
    
         
            +
              module Services
         
     | 
| 
      
 10 
     | 
    
         
            +
                module Rosetta
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                  class SipHandler < Libis::Services::Rosetta::Client
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                    def initialize(base_url = 'http://depot.lias.be', options = {})
         
     | 
| 
      
 15 
     | 
    
         
            +
                      super 'repository', 'SipWebServices', {url: base_url}.merge(options)
         
     | 
| 
      
 16 
     | 
    
         
            +
                    end
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                    def get_info(sip_id)
         
     | 
| 
      
 19 
     | 
    
         
            +
                      request_object :get_sip_status_info, Rosetta::Sip, arg0: sip_id
         
     | 
| 
      
 20 
     | 
    
         
            +
                    end
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                    def get_ies(sip_id)
         
     | 
| 
      
 23 
     | 
    
         
            +
                      request_array :get_sip_i_es, arg0: sip_id
         
     | 
| 
      
 24 
     | 
    
         
            +
                    end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                  end
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                end
         
     | 
| 
      
 29 
     | 
    
         
            +
              end
         
     | 
| 
      
 30 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,70 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'virtus'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module Libis
         
     | 
| 
      
 4 
     | 
    
         
            +
              module Services
         
     | 
| 
      
 5 
     | 
    
         
            +
                module Rosetta
         
     | 
| 
      
 6 
     | 
    
         
            +
                  class User
         
     | 
| 
      
 7 
     | 
    
         
            +
                    # noinspection RubyResolve
         
     | 
| 
      
 8 
     | 
    
         
            +
                    include Virtus.model nullify_blank: true
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                    RECORD_TYPE = %w'USER CONTACT ORGANIZATION STAFF PUBLIC'
         
     | 
| 
      
 11 
     | 
    
         
            +
                    USER_STATUS = %w'ACTIVE INACTIVE DELETED'
         
     | 
| 
      
 12 
     | 
    
         
            +
                    USER_ROLES_STATUS = %w'NEW ACTIVE INACTIVE PENDING DELETED'
         
     | 
| 
      
 13 
     | 
    
         
            +
                    USER_TYPE = %w'CASUAL INTERNAL EXTERNAL INTEXTAUTH'
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                    attribute :first_name, String
         
     | 
| 
      
 16 
     | 
    
         
            +
                    attribute :last_name, String
         
     | 
| 
      
 17 
     | 
    
         
            +
                    attribute :user_name, String
         
     | 
| 
      
 18 
     | 
    
         
            +
                    attribute :user_group, String
         
     | 
| 
      
 19 
     | 
    
         
            +
                    attribute :expiry_date, String
         
     | 
| 
      
 20 
     | 
    
         
            +
                    attribute :job_title, String
         
     | 
| 
      
 21 
     | 
    
         
            +
                    attribute :default_language, String
         
     | 
| 
      
 22 
     | 
    
         
            +
                    attribute :street, String
         
     | 
| 
      
 23 
     | 
    
         
            +
                    attribute :suburb, String
         
     | 
| 
      
 24 
     | 
    
         
            +
                    attribute :city, String
         
     | 
| 
      
 25 
     | 
    
         
            +
                    attribute :country, String
         
     | 
| 
      
 26 
     | 
    
         
            +
                    attribute :address_1, String
         
     | 
| 
      
 27 
     | 
    
         
            +
                    attribute :address_2, String
         
     | 
| 
      
 28 
     | 
    
         
            +
                    attribute :address_3, String
         
     | 
| 
      
 29 
     | 
    
         
            +
                    attribute :address_4, String
         
     | 
| 
      
 30 
     | 
    
         
            +
                    attribute :address_5, String
         
     | 
| 
      
 31 
     | 
    
         
            +
                    attribute :zip, Integer
         
     | 
| 
      
 32 
     | 
    
         
            +
                    attribute :email_address, String
         
     | 
| 
      
 33 
     | 
    
         
            +
                    attribute :web_site_url, String
         
     | 
| 
      
 34 
     | 
    
         
            +
                    attribute :telephone_1, String
         
     | 
| 
      
 35 
     | 
    
         
            +
                    attribute :telephone_2, String
         
     | 
| 
      
 36 
     | 
    
         
            +
                    attribute :fax, String
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                    attribute :password, String
         
     | 
| 
      
 39 
     | 
    
         
            +
                    attribute :password_verify, String
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
                    def to_hash
         
     | 
| 
      
 42 
     | 
    
         
            +
                      super.cleanup
         
     | 
| 
      
 43 
     | 
    
         
            +
                    end
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
                    def to_xml
         
     | 
| 
      
 46 
     | 
    
         
            +
                      Libis::Tools::XmlDocument.build do |xml|
         
     | 
| 
      
 47 
     | 
    
         
            +
                        # noinspection RubyResolve
         
     | 
| 
      
 48 
     | 
    
         
            +
                        xml.user_info {
         
     | 
| 
      
 49 
     | 
    
         
            +
                          xml.parent.default_namespace = 'http://www.exlibrisgroup.com/xsd/dps/backoffice/service'
         
     | 
| 
      
 50 
     | 
    
         
            +
                          self.attributes.each do |name, value|
         
     | 
| 
      
 51 
     | 
    
         
            +
                            xml.send(name, xmlns: '') { xml.text(value) } if value
         
     | 
| 
      
 52 
     | 
    
         
            +
                          end
         
     | 
| 
      
 53 
     | 
    
         
            +
                        }
         
     | 
| 
      
 54 
     | 
    
         
            +
                      end.to_xml
         
     | 
| 
      
 55 
     | 
    
         
            +
                    end
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
                    def self.from_xml(xml)
         
     | 
| 
      
 58 
     | 
    
         
            +
                      xml_doc = Libis::Tools::XmlDocument.parse(xml)
         
     | 
| 
      
 59 
     | 
    
         
            +
                      hash = xml_doc.to_hash(
         
     | 
| 
      
 60 
     | 
    
         
            +
                          strip_namespaces: true,
         
     | 
| 
      
 61 
     | 
    
         
            +
                          delete_namespace_attributes: true,
         
     | 
| 
      
 62 
     | 
    
         
            +
                          empty_tag_value: nil,
         
     | 
| 
      
 63 
     | 
    
         
            +
                          convert_tags_to: lambda { |tag| tag.to_sym }
         
     | 
| 
      
 64 
     | 
    
         
            +
                      )
         
     | 
| 
      
 65 
     | 
    
         
            +
                      self.new(hash[:producer_info])
         
     | 
| 
      
 66 
     | 
    
         
            +
                    end
         
     | 
| 
      
 67 
     | 
    
         
            +
                  end
         
     | 
| 
      
 68 
     | 
    
         
            +
                end
         
     | 
| 
      
 69 
     | 
    
         
            +
              end
         
     | 
| 
      
 70 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,28 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # encoding: utf-8
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'virtus'
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            require 'libis/tools/extend/hash'
         
     | 
| 
      
 5 
     | 
    
         
            +
            require_relative 'client'
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            module Libis
         
     | 
| 
      
 8 
     | 
    
         
            +
              module Services
         
     | 
| 
      
 9 
     | 
    
         
            +
                module Rosetta
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                  class UserManager < Libis::Services::Rosetta::Client
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                    def initialize(base_url = 'http://depot.lias.be', options = {})
         
     | 
| 
      
 14 
     | 
    
         
            +
                      super 'infra', 'UserManagerWS', {url: base_url}.merge(options)
         
     | 
| 
      
 15 
     | 
    
         
            +
                    end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                    def user(user_id, user_info)
         
     | 
| 
      
 18 
     | 
    
         
            +
                      user_info = user_info.to_hash if user_info.is_a? User
         
     | 
| 
      
 19 
     | 
    
         
            +
                      do_request :update_user, arg0: user_info, arg1: user_id
         
     | 
| 
      
 20 
     | 
    
         
            +
                    end
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                    protected
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                  end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                end
         
     | 
| 
      
 27 
     | 
    
         
            +
              end
         
     | 
| 
      
 28 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,46 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # coding: utf-8
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'libis/services/oracle_client'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'libis/tools/xml_document'
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            module Libis
         
     | 
| 
      
 7 
     | 
    
         
            +
              module Services
         
     | 
| 
      
 8 
     | 
    
         
            +
                module Scope
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                  class Search
         
     | 
| 
      
 11 
     | 
    
         
            +
                    include ::Libis::Services::GenericSearch
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                    def initialize
         
     | 
| 
      
 14 
     | 
    
         
            +
                      @doc = nil
         
     | 
| 
      
 15 
     | 
    
         
            +
                    end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                    def find(term, options = {})
         
     | 
| 
      
 18 
     | 
    
         
            +
                      super
         
     | 
| 
      
 19 
     | 
    
         
            +
                      OracleClient.new('SCOPE01', 'APLKN_ARCHV_LIAS', 'archvsc').
         
     | 
| 
      
 20 
     | 
    
         
            +
                          call('kul_packages.scope_xml_meta_file_ed', [term.upcase])
         
     | 
| 
      
 21 
     | 
    
         
            +
                      err_file = "/nas/vol03/oracle/scope01/#{term}_err.XML"
         
     | 
| 
      
 22 
     | 
    
         
            +
                      if File.exist? err_file
         
     | 
| 
      
 23 
     | 
    
         
            +
                        doc = XmlDocument.open(err_file)
         
     | 
| 
      
 24 
     | 
    
         
            +
                        msg = doc.xpath('/error/error_msg').first.content
         
     | 
| 
      
 25 
     | 
    
         
            +
                        msg_detail = doc.xpath('/error/error_').first.content
         
     | 
| 
      
 26 
     | 
    
         
            +
                        File.delete(err_file)
         
     | 
| 
      
 27 
     | 
    
         
            +
                        @doc = nil
         
     | 
| 
      
 28 
     | 
    
         
            +
                        raise RuntimeError, "Scope search failed: '#{msg}'. Details: '#{msg_detail}'"
         
     | 
| 
      
 29 
     | 
    
         
            +
                      else
         
     | 
| 
      
 30 
     | 
    
         
            +
                        @doc = XmlDocument.open("/nas/vol03/oracle/scope01/#{term}_md.XML").to_hash
         
     | 
| 
      
 31 
     | 
    
         
            +
                      end
         
     | 
| 
      
 32 
     | 
    
         
            +
                    end
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
                    def each(_ = {})
         
     | 
| 
      
 35 
     | 
    
         
            +
                      yield @doc
         
     | 
| 
      
 36 
     | 
    
         
            +
                    end
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                    def next_record(_ = {})
         
     | 
| 
      
 39 
     | 
    
         
            +
                      yield @doc
         
     | 
| 
      
 40 
     | 
    
         
            +
                    end
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                  end
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
                end
         
     | 
| 
      
 45 
     | 
    
         
            +
              end
         
     | 
| 
      
 46 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,40 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # coding: utf-8
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require_relative 'aleph/search'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require_relative 'primo/search'
         
     | 
| 
      
 5 
     | 
    
         
            +
            require_relative 'sharepoint/search'
         
     | 
| 
      
 6 
     | 
    
         
            +
            require_relative 'scope/search'
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            module Libis
         
     | 
| 
      
 9 
     | 
    
         
            +
              module Services
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                class SearchFactory
         
     | 
| 
      
 12 
     | 
    
         
            +
                  def initialize(format, *args)
         
     | 
| 
      
 13 
     | 
    
         
            +
                    @search_class = self.class.const_get("Libis::Services::#{format}::Search")
         
     | 
| 
      
 14 
     | 
    
         
            +
                    @search_client = @search_class.new *args
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                  rescue Exception => e
         
     | 
| 
      
 17 
     | 
    
         
            +
                    puts e.message
         
     | 
| 
      
 18 
     | 
    
         
            +
                    exit -1
         
     | 
| 
      
 19 
     | 
    
         
            +
                  end
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                  def query(query, options = {})
         
     | 
| 
      
 22 
     | 
    
         
            +
                    @search_client.get(query, options)
         
     | 
| 
      
 23 
     | 
    
         
            +
                  end
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
                  def find(term, options = {})
         
     | 
| 
      
 26 
     | 
    
         
            +
                    @search_client.find(term, options)
         
     | 
| 
      
 27 
     | 
    
         
            +
                  end
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
                  def each(options = {}, &block)
         
     | 
| 
      
 30 
     | 
    
         
            +
                    @search_client.each(options, &block)
         
     | 
| 
      
 31 
     | 
    
         
            +
                  end
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                  def next_record(options = {}, &block)
         
     | 
| 
      
 34 
     | 
    
         
            +
                    @search_client.next_record(options, &block)
         
     | 
| 
      
 35 
     | 
    
         
            +
                  end
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
                end
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
              end
         
     | 
| 
      
 40 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,236 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # coding: utf-8
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'highline'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'libis/tools/logger'
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            require 'libis/services/soap_client'
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            module Libis
         
     | 
| 
      
 9 
     | 
    
         
            +
              module Services
         
     | 
| 
      
 10 
     | 
    
         
            +
                module Sharepoint
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                  class Search
         
     | 
| 
      
 13 
     | 
    
         
            +
                    include ::Libis::Services::SoapClient
         
     | 
| 
      
 14 
     | 
    
         
            +
                    include ::Libis::Tools::Logger
         
     | 
| 
      
 15 
     | 
    
         
            +
                    include ::Libis::Services::GenericSearch
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                    private
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                    MY_QUERY_SYMBOLS = {
         
     | 
| 
      
 20 
     | 
    
         
            +
                        nil => 'Eq',
         
     | 
| 
      
 21 
     | 
    
         
            +
                        '==' => 'Eq',
         
     | 
| 
      
 22 
     | 
    
         
            +
                        '!=' => 'Neq',
         
     | 
| 
      
 23 
     | 
    
         
            +
                        '>' => 'Gt',
         
     | 
| 
      
 24 
     | 
    
         
            +
                        '>=' => 'Geq',
         
     | 
| 
      
 25 
     | 
    
         
            +
                        '<' => 'Lt',
         
     | 
| 
      
 26 
     | 
    
         
            +
                        '<=' => 'Leq',
         
     | 
| 
      
 27 
     | 
    
         
            +
                        'is null' => 'IsNull'
         
     | 
| 
      
 28 
     | 
    
         
            +
                    }
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                    MAX_QUERY_RETRY = 10
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
                    public
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
                    def initialize(options = {})
         
     | 
| 
      
 35 
     | 
    
         
            +
                      options[:server_url] = (options[:url] || 'https://www.groupware.kuleuven.be/sites/lias') + (options[:url_ext] || '/_vti_bin')
         
     | 
| 
      
 36 
     | 
    
         
            +
                      options[:ssl] = true if options[:server_url] =~ /^https:/
         
     | 
| 
      
 37 
     | 
    
         
            +
                      # options[:soap_url] = options[:server_url].gsub(/^(https?):\/\/)/,"\\1#{CGI.escape(username)}:#{CGI.escape(password)}@") + '/Lists.asmx'
         
     | 
| 
      
 38 
     | 
    
         
            +
                      options[:wsse_auth] = [options[:username], options[:password]]
         
     | 
| 
      
 39 
     | 
    
         
            +
                      options[:soap_url] = options[:server_url] + '/Lists.asmx'
         
     | 
| 
      
 40 
     | 
    
         
            +
                      options[:wsdl_url] = options[:soap_url] + '?wsdl'
         
     | 
| 
      
 41 
     | 
    
         
            +
                      configure options[:wsdl_url], options
         
     | 
| 
      
 42 
     | 
    
         
            +
                      options
         
     | 
| 
      
 43 
     | 
    
         
            +
                    end
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
                    def query(term, options = {})
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
                      options[:term] = term
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
                      options[:limit] ||= 100
         
     | 
| 
      
 50 
     | 
    
         
            +
                      options[:value_type] ||= 'Text'
         
     | 
| 
      
 51 
     | 
    
         
            +
                      options[:query_operator] = MY_QUERY_SYMBOLS[options[:query_operator] || '==']
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
                      options[:query_operator] = 'BeginsWith' if term =~ /^[^*]+\*$/
         
     | 
| 
      
 54 
     | 
    
         
            +
                      options[:query_operator] = 'Contains' if term =~ /^\*[^*]+\*$/
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
                      restart_query options
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
                      options
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
                    end
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
                    def each(options)
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
                      # we start with a new search
         
     | 
| 
      
 65 
     | 
    
         
            +
                      restart_query options
         
     | 
| 
      
 66 
     | 
    
         
            +
                      get_next_set options
         
     | 
| 
      
 67 
     | 
    
         
            +
             
     | 
| 
      
 68 
     | 
    
         
            +
                      while records_to_process? options
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
                        yield options[:result][:records][options[:current]]
         
     | 
| 
      
 71 
     | 
    
         
            +
             
     | 
| 
      
 72 
     | 
    
         
            +
                        options[:current] += 1
         
     | 
| 
      
 73 
     | 
    
         
            +
             
     | 
| 
      
 74 
     | 
    
         
            +
                        get_next_set(options) if require_next_set?(options)
         
     | 
| 
      
 75 
     | 
    
         
            +
             
     | 
| 
      
 76 
     | 
    
         
            +
                      end
         
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
      
 78 
     | 
    
         
            +
                      restart_query(options)
         
     | 
| 
      
 79 
     | 
    
         
            +
             
     | 
| 
      
 80 
     | 
    
         
            +
                    end
         
     | 
| 
      
 81 
     | 
    
         
            +
             
     | 
| 
      
 82 
     | 
    
         
            +
                    protected
         
     | 
| 
      
 83 
     | 
    
         
            +
             
     | 
| 
      
 84 
     | 
    
         
            +
                    def restart_query(options)
         
     | 
| 
      
 85 
     | 
    
         
            +
                      options[:start_id] = 0
         
     | 
| 
      
 86 
     | 
    
         
            +
                      options[:result] = nil
         
     | 
| 
      
 87 
     | 
    
         
            +
                      options[:current] = 0
         
     | 
| 
      
 88 
     | 
    
         
            +
                      options[:set_count] = 0
         
     | 
| 
      
 89 
     | 
    
         
            +
                      options[:next_set] = nil
         
     | 
| 
      
 90 
     | 
    
         
            +
                    end
         
     | 
| 
      
 91 
     | 
    
         
            +
             
     | 
| 
      
 92 
     | 
    
         
            +
                    def records_to_process?(options)
         
     | 
| 
      
 93 
     | 
    
         
            +
                      options[:current] < options[:set_count]
         
     | 
| 
      
 94 
     | 
    
         
            +
                    end
         
     | 
| 
      
 95 
     | 
    
         
            +
             
     | 
| 
      
 96 
     | 
    
         
            +
                    def require_next_set?(options)
         
     | 
| 
      
 97 
     | 
    
         
            +
                      options[:current] >= options[:set_count] and options[:next_set]
         
     | 
| 
      
 98 
     | 
    
         
            +
                    end
         
     | 
| 
      
 99 
     | 
    
         
            +
             
     | 
| 
      
 100 
     | 
    
         
            +
                    def get_next_set(options)
         
     | 
| 
      
 101 
     | 
    
         
            +
             
     | 
| 
      
 102 
     | 
    
         
            +
                      options[:current] = 0
         
     | 
| 
      
 103 
     | 
    
         
            +
                      options[:set_count] = 0
         
     | 
| 
      
 104 
     | 
    
         
            +
             
     | 
| 
      
 105 
     | 
    
         
            +
                      retry_count = MAX_QUERY_RETRY
         
     | 
| 
      
 106 
     | 
    
         
            +
             
     | 
| 
      
 107 
     | 
    
         
            +
                      while retry_count > 0
         
     | 
| 
      
 108 
     | 
    
         
            +
             
     | 
| 
      
 109 
     | 
    
         
            +
                        warn "Retrying (#{retry_count}) ..." if retry_count < MAX_QUERY_RETRY
         
     | 
| 
      
 110 
     | 
    
         
            +
             
     | 
| 
      
 111 
     | 
    
         
            +
                        query = {
         
     | 
| 
      
 112 
     | 
    
         
            +
                            'Query' => {
         
     | 
| 
      
 113 
     | 
    
         
            +
                                'Where' => {
         
     | 
| 
      
 114 
     | 
    
         
            +
                                    options[:query_operator] => {
         
     | 
| 
      
 115 
     | 
    
         
            +
                                        'FieldRef' => '',
         
     | 
| 
      
 116 
     | 
    
         
            +
                                        'Value' => options[:term],
         
     | 
| 
      
 117 
     | 
    
         
            +
                                        :attributes! => {
         
     | 
| 
      
 118 
     | 
    
         
            +
                                            'FieldRef' => {
         
     | 
| 
      
 119 
     | 
    
         
            +
                                                'Name' => options[:index]
         
     | 
| 
      
 120 
     | 
    
         
            +
                                            },
         
     | 
| 
      
 121 
     | 
    
         
            +
                                            'Value' => {
         
     | 
| 
      
 122 
     | 
    
         
            +
                                                'Type' => options[:value_type]
         
     | 
| 
      
 123 
     | 
    
         
            +
                                            }
         
     | 
| 
      
 124 
     | 
    
         
            +
                                        }
         
     | 
| 
      
 125 
     | 
    
         
            +
                                    }
         
     | 
| 
      
 126 
     | 
    
         
            +
                                }
         
     | 
| 
      
 127 
     | 
    
         
            +
                            }
         
     | 
| 
      
 128 
     | 
    
         
            +
                        }
         
     | 
| 
      
 129 
     | 
    
         
            +
             
     | 
| 
      
 130 
     | 
    
         
            +
                        query_options = {
         
     | 
| 
      
 131 
     | 
    
         
            +
                            'QueryOptions' => {
         
     | 
| 
      
 132 
     | 
    
         
            +
                                'ViewAttributes' => '',
         
     | 
| 
      
 133 
     | 
    
         
            +
                                :attributes! => {
         
     | 
| 
      
 134 
     | 
    
         
            +
                                    'ViewAttributes' => {
         
     | 
| 
      
 135 
     | 
    
         
            +
                                        'Scope' => 'RecursiveAll'
         
     | 
| 
      
 136 
     | 
    
         
            +
                                    }
         
     | 
| 
      
 137 
     | 
    
         
            +
                                }
         
     | 
| 
      
 138 
     | 
    
         
            +
                            }
         
     | 
| 
      
 139 
     | 
    
         
            +
                        }
         
     | 
| 
      
 140 
     | 
    
         
            +
             
     | 
| 
      
 141 
     | 
    
         
            +
                        now = Time.now
         
     | 
| 
      
 142 
     | 
    
         
            +
                        window_start = Time.new(now.year, now.month, now.day, 12, 15)
         
     | 
| 
      
 143 
     | 
    
         
            +
                        window_end = Time.new(now.year, now.month, now.day, 13, 15)
         
     | 
| 
      
 144 
     | 
    
         
            +
                        if options[:selection] and now > window_start and now < window_end
         
     | 
| 
      
 145 
     | 
    
         
            +
                          query_options['QueryOptions']['Folder'] = options[:server_url] + 'Gedeelde%20documenten/' + options[:selection] + '/.'
         
     | 
| 
      
 146 
     | 
    
         
            +
                        end
         
     | 
| 
      
 147 
     | 
    
         
            +
             
     | 
| 
      
 148 
     | 
    
         
            +
                        if options[:next_set]
         
     | 
| 
      
 149 
     | 
    
         
            +
                          query_options['QueryOptions']['Paging'] = ''
         
     | 
| 
      
 150 
     | 
    
         
            +
                          query_options['QueryOptions'][:attributes!]['Paging'] = {'ListItemCollectionPositionNext' => options[:next_set]}
         
     | 
| 
      
 151 
     | 
    
         
            +
                        end
         
     | 
| 
      
 152 
     | 
    
         
            +
             
     | 
| 
      
 153 
     | 
    
         
            +
                        result = request 'GetListItems', {
         
     | 
| 
      
 154 
     | 
    
         
            +
                                                           soap_options: {
         
     | 
| 
      
 155 
     | 
    
         
            +
                                                               endpoint: options[:soap_url]
         
     | 
| 
      
 156 
     | 
    
         
            +
                                                           },
         
     | 
| 
      
 157 
     | 
    
         
            +
                                                           wsse_auth: options[:wsse_auth],
         
     | 
| 
      
 158 
     | 
    
         
            +
                                                           listName: options[:base],
         
     | 
| 
      
 159 
     | 
    
         
            +
                                                           viewName: '',
         
     | 
| 
      
 160 
     | 
    
         
            +
                                                           query: query,
         
     | 
| 
      
 161 
     | 
    
         
            +
                                                           viewFields: {'ViewFields' => ''},
         
     | 
| 
      
 162 
     | 
    
         
            +
                                                           rowLimit: options[:limit].to_s,
         
     | 
| 
      
 163 
     | 
    
         
            +
                                                           query_options: query_options,
         
     | 
| 
      
 164 
     | 
    
         
            +
                                                           webID: ''
         
     | 
| 
      
 165 
     | 
    
         
            +
                                                       }, {}, options
         
     | 
| 
      
 166 
     | 
    
         
            +
             
     | 
| 
      
 167 
     | 
    
         
            +
                        if result[:error]
         
     | 
| 
      
 168 
     | 
    
         
            +
                          warn "SOAP error: '#{result[:error]}'"
         
     | 
| 
      
 169 
     | 
    
         
            +
                          raise RuntimeError, 'Too many SOAP errors, giving up.' unless retry_count > 0
         
     | 
| 
      
 170 
     | 
    
         
            +
                        elsif result[:exception]
         
     | 
| 
      
 171 
     | 
    
         
            +
                          warn "SOAP exception: '#{result[:exception].message}'"
         
     | 
| 
      
 172 
     | 
    
         
            +
                          raise result[:exception] unless retry_count > 0
         
     | 
| 
      
 173 
     | 
    
         
            +
                        else
         
     | 
| 
      
 174 
     | 
    
         
            +
                          options[:result] = result
         
     | 
| 
      
 175 
     | 
    
         
            +
                          options[:set_count] = result[:count]
         
     | 
| 
      
 176 
     | 
    
         
            +
                          options[:next_set] = result[:next_set]
         
     | 
| 
      
 177 
     | 
    
         
            +
                          retry_count = 0
         
     | 
| 
      
 178 
     | 
    
         
            +
                          retry_count = MAX_QUERY_RETRY + 1 if options[:set_count] == 0 and options[:next_set]
         
     | 
| 
      
 179 
     | 
    
         
            +
                        end
         
     | 
| 
      
 180 
     | 
    
         
            +
             
     | 
| 
      
 181 
     | 
    
         
            +
                        retry_count -= 1
         
     | 
| 
      
 182 
     | 
    
         
            +
             
     | 
| 
      
 183 
     | 
    
         
            +
                      end
         
     | 
| 
      
 184 
     | 
    
         
            +
             
     | 
| 
      
 185 
     | 
    
         
            +
                    end
         
     | 
| 
      
 186 
     | 
    
         
            +
             
     | 
| 
      
 187 
     | 
    
         
            +
                    def result_parser(result, options)
         
     | 
| 
      
 188 
     | 
    
         
            +
             
     | 
| 
      
 189 
     | 
    
         
            +
                      records = []
         
     | 
| 
      
 190 
     | 
    
         
            +
                      result = result[:get_list_items_response][:get_list_items_result]
         
     | 
| 
      
 191 
     | 
    
         
            +
             
     | 
| 
      
 192 
     | 
    
         
            +
                      data = result[:listitems][:data]
         
     | 
| 
      
 193 
     | 
    
         
            +
             
     | 
| 
      
 194 
     | 
    
         
            +
                      rows = data[:row]
         
     | 
| 
      
 195 
     | 
    
         
            +
                      rows = [rows] unless rows.is_a? Array
         
     | 
| 
      
 196 
     | 
    
         
            +
             
     | 
| 
      
 197 
     | 
    
         
            +
                      rows.each do |row|
         
     | 
| 
      
 198 
     | 
    
         
            +
                        if options[:selection].nil? or row[:ows_FileRef] =~ /^\d+;#sites\/lias\/Gedeelde documenten\/#{options[:selection]}(|\/.*)$/
         
     | 
| 
      
 199 
     | 
    
         
            +
                          records << clean_row(row, options)
         
     | 
| 
      
 200 
     | 
    
         
            +
                        end
         
     | 
| 
      
 201 
     | 
    
         
            +
                      end
         
     | 
| 
      
 202 
     | 
    
         
            +
             
     | 
| 
      
 203 
     | 
    
         
            +
                      next_set = data[:@list_item_collection_position_next]
         
     | 
| 
      
 204 
     | 
    
         
            +
             
     | 
| 
      
 205 
     | 
    
         
            +
                      # the itemcount in the response is not interesting. We count only the records that match our selection criteria.
         
     | 
| 
      
 206 
     | 
    
         
            +
                      count = records.size
         
     | 
| 
      
 207 
     | 
    
         
            +
             
     | 
| 
      
 208 
     | 
    
         
            +
                      {next_set: next_set, records: records, count: count}
         
     | 
| 
      
 209 
     | 
    
         
            +
             
     | 
| 
      
 210 
     | 
    
         
            +
                    end
         
     | 
| 
      
 211 
     | 
    
         
            +
             
     | 
| 
      
 212 
     | 
    
         
            +
                    def clean_row(row, options)
         
     | 
| 
      
 213 
     | 
    
         
            +
             
     | 
| 
      
 214 
     | 
    
         
            +
                      options[:fields_found] ||= Set.new
         
     | 
| 
      
 215 
     | 
    
         
            +
                      row.keys.each { |k| options[:fields_found] << k }
         
     | 
| 
      
 216 
     | 
    
         
            +
             
     | 
| 
      
 217 
     | 
    
         
            +
                      fields_to_be_removed = [:ows_MetaInfo]
         
     | 
| 
      
 218 
     | 
    
         
            +
                      fields_to_be_removed = row.keys - options[:field_selection] if options[:field_selection]
         
     | 
| 
      
 219 
     | 
    
         
            +
             
     | 
| 
      
 220 
     | 
    
         
            +
                      record = SharepointRecord.new
         
     | 
| 
      
 221 
     | 
    
         
            +
             
     | 
| 
      
 222 
     | 
    
         
            +
                      row.each do |k, v|
         
     | 
| 
      
 223 
     | 
    
         
            +
                        key = k.to_s.gsub(/^@/, '').to_sym
         
     | 
| 
      
 224 
     | 
    
         
            +
                        next if fields_to_be_removed.include? key
         
     | 
| 
      
 225 
     | 
    
         
            +
                        record[key] = v.dot_net_clean
         
     | 
| 
      
 226 
     | 
    
         
            +
                      end
         
     | 
| 
      
 227 
     | 
    
         
            +
             
     | 
| 
      
 228 
     | 
    
         
            +
                      record
         
     | 
| 
      
 229 
     | 
    
         
            +
             
     | 
| 
      
 230 
     | 
    
         
            +
                    end
         
     | 
| 
      
 231 
     | 
    
         
            +
             
     | 
| 
      
 232 
     | 
    
         
            +
                  end
         
     | 
| 
      
 233 
     | 
    
         
            +
             
     | 
| 
      
 234 
     | 
    
         
            +
                end
         
     | 
| 
      
 235 
     | 
    
         
            +
              end
         
     | 
| 
      
 236 
     | 
    
         
            +
            end
         
     |