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
 
    
        checksums.yaml
    ADDED
    
    | 
         @@ -0,0 +1,7 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            ---
         
     | 
| 
      
 2 
     | 
    
         
            +
            SHA1:
         
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 3579b3767e5c7b66ebbc0c98c01f0c4164aafa89
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: b8e1fe27dceb49ad0d3fa234adaf4aedc942b3b9
         
     | 
| 
      
 5 
     | 
    
         
            +
            SHA512:
         
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: c54622890dce4e6f3325e26d5aa33792d9a109252c91d4a6ebd76c4e8844fd62efa01cc15331ea9ac46d58f8825ff414ce9ec300bf3dc45aeb911f28919ec7b7
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 5dd37c5e3740b0b55d12a0b9b01ff8690a33d83f2c1ad7818d7a8f56c41b223b7d14d98798a45c237973a61e880ccd51ac64dd79e40f33424c2b8fcd2484f88e
         
     | 
    
        data/.gitignore
    ADDED
    
    
    
        data/Gemfile
    ADDED
    
    
    
        data/LICENSE.txt
    ADDED
    
    | 
         @@ -0,0 +1,22 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            Copyright (c) 2014 Kris Dekeyser
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            MIT License
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            Permission is hereby granted, free of charge, to any person obtaining
         
     | 
| 
      
 6 
     | 
    
         
            +
            a copy of this software and associated documentation files (the
         
     | 
| 
      
 7 
     | 
    
         
            +
            "Software"), to deal in the Software without restriction, including
         
     | 
| 
      
 8 
     | 
    
         
            +
            without limitation the rights to use, copy, modify, merge, publish,
         
     | 
| 
      
 9 
     | 
    
         
            +
            distribute, sublicense, and/or sell copies of the Software, and to
         
     | 
| 
      
 10 
     | 
    
         
            +
            permit persons to whom the Software is furnished to do so, subject to
         
     | 
| 
      
 11 
     | 
    
         
            +
            the following conditions:
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            The above copyright notice and this permission notice shall be
         
     | 
| 
      
 14 
     | 
    
         
            +
            included in all copies or substantial portions of the Software.
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
         
     | 
| 
      
 17 
     | 
    
         
            +
            EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
         
     | 
| 
      
 18 
     | 
    
         
            +
            MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
         
     | 
| 
      
 19 
     | 
    
         
            +
            NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
         
     | 
| 
      
 20 
     | 
    
         
            +
            LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
         
     | 
| 
      
 21 
     | 
    
         
            +
            OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
         
     | 
| 
      
 22 
     | 
    
         
            +
            WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
         
     | 
    
        data/README.md
    ADDED
    
    | 
         @@ -0,0 +1,36 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            [](http://badge.fury.io/rb/libis-services)
         
     | 
| 
      
 2 
     | 
    
         
            +
            [](https://travis-ci.org/Kris-LIBIS/LIBIS_Services)
         
     | 
| 
      
 3 
     | 
    
         
            +
            [](https://coveralls.io/r/Kris-LIBIS/LIBIS_Services)
         
     | 
| 
      
 4 
     | 
    
         
            +
            [](https://gemnasium.com/Kris-LIBIS/LIBIS_Services)
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            # Services
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            TODO: Write a gem description
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            ## Installation
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            Add this line to your application's Gemfile:
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 15 
     | 
    
         
            +
            gem 'Services'
         
     | 
| 
      
 16 
     | 
    
         
            +
            ```
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
            And then execute:
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
                $ bundle
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
            Or install it yourself as:
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                $ gem install Services
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
            ## Usage
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
            TODO: Write usage instructions here
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
            ## Contributing
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
            1. Fork it ( https://github.com/[my-github-username]/Services/fork )
         
     | 
| 
      
 33 
     | 
    
         
            +
            2. Create your feature branch (`git checkout -b my-new-feature`)
         
     | 
| 
      
 34 
     | 
    
         
            +
            3. Commit your changes (`git commit -am 'Add some feature'`)
         
     | 
| 
      
 35 
     | 
    
         
            +
            4. Push to the branch (`git push origin my-new-feature`)
         
     | 
| 
      
 36 
     | 
    
         
            +
            5. Create a new Pull Request
         
     | 
    
        data/Rakefile
    ADDED
    
    
| 
         @@ -0,0 +1 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'libis/services'
         
     | 
| 
         @@ -0,0 +1,21 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Libis
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Services
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
                autoload :HttpError, 'libis/services/http_error'
         
     | 
| 
      
 5 
     | 
    
         
            +
                autoload :SoapError, 'libis/services/soap_error'
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
                autoload :SoapClient, 'libis/services/soap_client'
         
     | 
| 
      
 8 
     | 
    
         
            +
                autoload :RestClient, 'libis/services/rest_client'
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                autoload :OracleClient, 'libis/services/oracle_client'
         
     | 
| 
      
 11 
     | 
    
         
            +
                autoload :DigitoolConnector, 'libis/services/digitool_connector'
         
     | 
| 
      
 12 
     | 
    
         
            +
                autoload :DigitalEntityManager, 'libis/services/digital_entity_manager'
         
     | 
| 
      
 13 
     | 
    
         
            +
                autoload :MetaDataManager, 'libis/services/meta_data_manager'
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                autoload :SharepointConnector, 'libis/services/sharepoint_connector'
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                autoload :Rosetta, 'libis/services/rosetta'
         
     | 
| 
      
 18 
     | 
    
         
            +
                autoload :Primo, 'libis/services/primo'
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
              end
         
     | 
| 
      
 21 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,157 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # coding: utf-8
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'backports/rails/hash'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'libis/tools/xml_document'
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            require 'libis/services/generic_search'
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            module Libis
         
     | 
| 
      
 9 
     | 
    
         
            +
              module Services
         
     | 
| 
      
 10 
     | 
    
         
            +
                module Aleph
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                  class Search
         
     | 
| 
      
 13 
     | 
    
         
            +
                    include ::Libis::Services::GenericSearch
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                    attr_accessor :host
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                    def find(term, options = {})
         
     | 
| 
      
 18 
     | 
    
         
            +
                      super
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
                      response = execute_http_query("op=find&code=#{options[:index]}&request=#{options[:term]}&base=#{options[:dbase]}")
         
     | 
| 
      
 21 
     | 
    
         
            +
                      if response
         
     | 
| 
      
 22 
     | 
    
         
            +
                        set_number = response['//find/set_number'].to_s
         
     | 
| 
      
 23 
     | 
    
         
            +
                        num_records = response['//find/no_records'].to_i
         
     | 
| 
      
 24 
     | 
    
         
            +
                        session_id = response['//find/session-id'].to_s
         
     | 
| 
      
 25 
     | 
    
         
            +
                        return options.merge id: set_number, num_records: num_records, session_id: session_id, record_pointer: 1
         
     | 
| 
      
 26 
     | 
    
         
            +
                      end
         
     | 
| 
      
 27 
     | 
    
         
            +
                      {}
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
                    end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                    def each(options)
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                      return unless ([:record_pointer, :num_records] & options.keys).size == 2
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                      while options[:record_pointer] <= options[:num_records]
         
     | 
| 
      
 36 
     | 
    
         
            +
                        next_record(options) { |r| yield r }
         
     | 
| 
      
 37 
     | 
    
         
            +
                      end
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
                      options
         
     | 
| 
      
 40 
     | 
    
         
            +
                    end
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                    def next_record(options = {}, &block)
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
                      return nil unless ([:record_pointer, :num_records, :set_number, :dbase] & options.keys).size == 4
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
                      if options[:record_pointer] <= options[:num_records]
         
     | 
| 
      
 47 
     | 
    
         
            +
                        response = execute_http_query(
         
     | 
| 
      
 48 
     | 
    
         
            +
                            'op=present' +
         
     | 
| 
      
 49 
     | 
    
         
            +
                                "&set_entry=#{options[:record_pointer]}" +
         
     | 
| 
      
 50 
     | 
    
         
            +
                                "&set_number=#{options[:set_number]}" +
         
     | 
| 
      
 51 
     | 
    
         
            +
                                "&base=#{options[:dbase]}"
         
     | 
| 
      
 52 
     | 
    
         
            +
                        )
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
                        if response
         
     | 
| 
      
 55 
     | 
    
         
            +
                          response.add_node 'search', type: 'opac', host: host, base: options[:dbase]
         
     | 
| 
      
 56 
     | 
    
         
            +
                          set_entry = response['//set_entry'].to_i
         
     | 
| 
      
 57 
     | 
    
         
            +
                          if set_entry == options[:record_pointer]
         
     | 
| 
      
 58 
     | 
    
         
            +
                            add_item_data(response, options[:dbase])
         
     | 
| 
      
 59 
     | 
    
         
            +
                            block_given? ? yield response : return response
         
     | 
| 
      
 60 
     | 
    
         
            +
                          end
         
     | 
| 
      
 61 
     | 
    
         
            +
                        end
         
     | 
| 
      
 62 
     | 
    
         
            +
                      else
         
     | 
| 
      
 63 
     | 
    
         
            +
                        puts 'no record found'
         
     | 
| 
      
 64 
     | 
    
         
            +
                      end
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
                    ensure
         
     | 
| 
      
 67 
     | 
    
         
            +
                      options[:record_pointer] += 1
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
      
 69 
     | 
    
         
            +
                    end
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
      
 71 
     | 
    
         
            +
                    private
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
      
 73 
     | 
    
         
            +
                    def add_item_data(xml_document, options)
         
     | 
| 
      
 74 
     | 
    
         
            +
             
     | 
| 
      
 75 
     | 
    
         
            +
                      doc_number = xml_document['//doc_number']
         
     | 
| 
      
 76 
     | 
    
         
            +
                      response = execute_http_query("op=item-data&base=#{options[:dbase]}&doc-number=#{doc_number}")
         
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
      
 78 
     | 
    
         
            +
                      if response
         
     | 
| 
      
 79 
     | 
    
         
            +
             
     | 
| 
      
 80 
     | 
    
         
            +
                        oai_marc = xml_document.get_node(:oai_marc)
         
     | 
| 
      
 81 
     | 
    
         
            +
             
     | 
| 
      
 82 
     | 
    
         
            +
                        #noinspection RubyResolve
         
     | 
| 
      
 83 
     | 
    
         
            +
                        response.get_nodes(:item).each do |r|
         
     | 
| 
      
 84 
     | 
    
         
            +
                          collection = response.value(:collection, r)
         
     | 
| 
      
 85 
     | 
    
         
            +
                          location = response.value(:sub-library, r)
         
     | 
| 
      
 86 
     | 
    
         
            +
                          classification = response.value('call-no-1', r)
         
     | 
| 
      
 87 
     | 
    
         
            +
             
     | 
| 
      
 88 
     | 
    
         
            +
                          varfield = xml_document.add_node 'varfield', nil, oai_marc, id: '852', i1: ' ', i2: ' '
         
     | 
| 
      
 89 
     | 
    
         
            +
             
     | 
| 
      
 90 
     | 
    
         
            +
                          xml_document.add_node 'subfield', collection, varfield, label: 'b'
         
     | 
| 
      
 91 
     | 
    
         
            +
                          xml_document.add_node 'subfield', location, varfield, label: 'c'
         
     | 
| 
      
 92 
     | 
    
         
            +
                          xml_document.add_node 'subfield', classification.gsub('$$h', ''), varfield, label: 'h'
         
     | 
| 
      
 93 
     | 
    
         
            +
             
     | 
| 
      
 94 
     | 
    
         
            +
                        end
         
     | 
| 
      
 95 
     | 
    
         
            +
                      end
         
     | 
| 
      
 96 
     | 
    
         
            +
                    end
         
     | 
| 
      
 97 
     | 
    
         
            +
             
     | 
| 
      
 98 
     | 
    
         
            +
             
     | 
| 
      
 99 
     | 
    
         
            +
                    def execute_http_query(data)
         
     | 
| 
      
 100 
     | 
    
         
            +
                      raise Exception, 'No host set' if host.nil? || host.size == 0
         
     | 
| 
      
 101 
     | 
    
         
            +
             
     | 
| 
      
 102 
     | 
    
         
            +
                      redo_count = 10
         
     | 
| 
      
 103 
     | 
    
         
            +
                      xml_document = nil
         
     | 
| 
      
 104 
     | 
    
         
            +
             
     | 
| 
      
 105 
     | 
    
         
            +
                      redo_search = false
         
     | 
| 
      
 106 
     | 
    
         
            +
             
     | 
| 
      
 107 
     | 
    
         
            +
                      begin
         
     | 
| 
      
 108 
     | 
    
         
            +
                        redo_search = false
         
     | 
| 
      
 109 
     | 
    
         
            +
             
     | 
| 
      
 110 
     | 
    
         
            +
                        begin
         
     | 
| 
      
 111 
     | 
    
         
            +
                          redo_count = redo_count - 1
         
     | 
| 
      
 112 
     | 
    
         
            +
                          sleep_time = 0.1 # in minutes
         
     | 
| 
      
 113 
     | 
    
         
            +
             
     | 
| 
      
 114 
     | 
    
         
            +
                          response = Net::HTTP.fetch(host, :data => data, :action => :post)
         
     | 
| 
      
 115 
     | 
    
         
            +
             
     | 
| 
      
 116 
     | 
    
         
            +
                          if response.is_a?(Net::HTTPOK)
         
     | 
| 
      
 117 
     | 
    
         
            +
                            xml_document = Libis::Tools::XmlDocument.parse(response.body)
         
     | 
| 
      
 118 
     | 
    
         
            +
                            error = xml_document['//error']
         
     | 
| 
      
 119 
     | 
    
         
            +
             
     | 
| 
      
 120 
     | 
    
         
            +
                            unless xml_document && error.nil?
         
     | 
| 
      
 121 
     | 
    
         
            +
                              unless error == 'empty set'
         
     | 
| 
      
 122 
     | 
    
         
            +
                                puts
         
     | 
| 
      
 123 
     | 
    
         
            +
                                puts "----------> Error searching for #{data} --> '#{error}'"
         
     | 
| 
      
 124 
     | 
    
         
            +
                                puts
         
     | 
| 
      
 125 
     | 
    
         
            +
                              end
         
     | 
| 
      
 126 
     | 
    
         
            +
                              if error =~ /license/
         
     | 
| 
      
 127 
     | 
    
         
            +
                                redo_search = true
         
     | 
| 
      
 128 
     | 
    
         
            +
                              end
         
     | 
| 
      
 129 
     | 
    
         
            +
                            end
         
     | 
| 
      
 130 
     | 
    
         
            +
                          else
         
     | 
| 
      
 131 
     | 
    
         
            +
                            puts response.error!
         
     | 
| 
      
 132 
     | 
    
         
            +
                          end
         
     | 
| 
      
 133 
     | 
    
         
            +
                        rescue Exception => ex
         
     | 
| 
      
 134 
     | 
    
         
            +
                          sleep_time = 0.5
         
     | 
| 
      
 135 
     | 
    
         
            +
                          if ex.message =~ /503 "Service Temporarily Unavailable"/
         
     | 
| 
      
 136 
     | 
    
         
            +
                            sleep_time = 30
         
     | 
| 
      
 137 
     | 
    
         
            +
                            Libis::Tools::Config.logger.warn "OPAC Service temporarily unavailable - retrying after #{sleep_time} minutes"
         
     | 
| 
      
 138 
     | 
    
         
            +
                          else
         
     | 
| 
      
 139 
     | 
    
         
            +
                            Libis::Tools::Config.logger.error "Problem with OPAC: '#{ex.message}' - retrying after #{sleep_time} minutes"
         
     | 
| 
      
 140 
     | 
    
         
            +
                            ex.backtrace.each { |x| Libis::Tools::Config.error "#{x}" }
         
     | 
| 
      
 141 
     | 
    
         
            +
                          end
         
     | 
| 
      
 142 
     | 
    
         
            +
                          redo_search = true
         
     | 
| 
      
 143 
     | 
    
         
            +
                        end
         
     | 
| 
      
 144 
     | 
    
         
            +
             
     | 
| 
      
 145 
     | 
    
         
            +
                        sleep sleep_time * 60 if redo_search
         
     | 
| 
      
 146 
     | 
    
         
            +
             
     | 
| 
      
 147 
     | 
    
         
            +
                      end until redo_search == false or redo_count < 0
         
     | 
| 
      
 148 
     | 
    
         
            +
             
     | 
| 
      
 149 
     | 
    
         
            +
                      xml_document
         
     | 
| 
      
 150 
     | 
    
         
            +
             
     | 
| 
      
 151 
     | 
    
         
            +
                    end
         
     | 
| 
      
 152 
     | 
    
         
            +
             
     | 
| 
      
 153 
     | 
    
         
            +
                  end
         
     | 
| 
      
 154 
     | 
    
         
            +
             
     | 
| 
      
 155 
     | 
    
         
            +
                end
         
     | 
| 
      
 156 
     | 
    
         
            +
              end
         
     | 
| 
      
 157 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'libis/services/collective_access/service'
         
     | 
| 
         @@ -0,0 +1,48 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # coding: utf-8
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require_relative 'connector'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            module Libis
         
     | 
| 
      
 6 
     | 
    
         
            +
              module Services
         
     | 
| 
      
 7 
     | 
    
         
            +
                module CollectiveAccess
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
                  class Cataloguing < Connector
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                    def initialize(host = nil)
         
     | 
| 
      
 12 
     | 
    
         
            +
                      super 'Cataloguing', host
         
     | 
| 
      
 13 
     | 
    
         
            +
                    end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                    def add_item(fields, type = nil)
         
     | 
| 
      
 16 
     | 
    
         
            +
                      type ||= 'ca_objects'
         
     | 
| 
      
 17 
     | 
    
         
            +
                      r, a = soap_encode fields
         
     | 
| 
      
 18 
     | 
    
         
            +
                      request :add, type: type, fieldInfo: r, :attributes! => {fieldInfo: a}
         
     | 
| 
      
 19 
     | 
    
         
            +
                    end
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                    def add_attributes(item, data, type = nil)
         
     | 
| 
      
 22 
     | 
    
         
            +
                      type ||= 'ca_objects'
         
     | 
| 
      
 23 
     | 
    
         
            +
                      r, a = soap_encode data
         
     | 
| 
      
 24 
     | 
    
         
            +
                      request :getAttributesByElement, type: type, item_id: item, attribute_code_or_id: attribute.to_s, attribute_list_array: r, :attributes! => {attribute_list_array: a}
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                    end
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                    def add_attribute(item, attribute, data, type = nil)
         
     | 
| 
      
 29 
     | 
    
         
            +
                      type ||= 'ca_objects'
         
     | 
| 
      
 30 
     | 
    
         
            +
                      r, a = soap_encode data
         
     | 
| 
      
 31 
     | 
    
         
            +
                      request :addAttribute, type: type, item_id: item, attribute_code_or_id: attribute.to_s, attribute_data_array: r, :attributes! => {attribute_data_array: a}
         
     | 
| 
      
 32 
     | 
    
         
            +
                    end
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
                    def remove(item, type = nil)
         
     | 
| 
      
 35 
     | 
    
         
            +
                      type ||= 'ca_objects'
         
     | 
| 
      
 36 
     | 
    
         
            +
                      request :remove, type: type, item_id: item
         
     | 
| 
      
 37 
     | 
    
         
            +
                    end
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
                    def remove_attributes(item, type = nil)
         
     | 
| 
      
 40 
     | 
    
         
            +
                      type ||= 'ca_objects'
         
     | 
| 
      
 41 
     | 
    
         
            +
                      request :removeAllAttributes, type: type, item_id: item
         
     | 
| 
      
 42 
     | 
    
         
            +
                    end
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
                  end
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
                end
         
     | 
| 
      
 47 
     | 
    
         
            +
              end
         
     | 
| 
      
 48 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,151 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # coding: utf-8
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'libis/services/soap_client'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            module Libis
         
     | 
| 
      
 6 
     | 
    
         
            +
              module Services
         
     | 
| 
      
 7 
     | 
    
         
            +
                module CollectiveAccess
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
                  #noinspection RubyStringKeysInHashInspection
         
     | 
| 
      
 10 
     | 
    
         
            +
                  class Connector
         
     | 
| 
      
 11 
     | 
    
         
            +
                    include Libis::Services::SoapClient
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                    attr_accessor :type_cast
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                    def initialize(service, host = nil)
         
     | 
| 
      
 16 
     | 
    
         
            +
                      @type_cast = true
         
     | 
| 
      
 17 
     | 
    
         
            +
                      @host = host || 'http://crkc.be.halotest.cc.kuleuven.be/ca_crkc'
         
     | 
| 
      
 18 
     | 
    
         
            +
                      @service = service
         
     | 
| 
      
 19 
     | 
    
         
            +
                      configure "#{@host}/service.php/#{@service.downcase}/#{@service}/soapWSDL?wsdl",
         
     | 
| 
      
 20 
     | 
    
         
            +
                                convert_request_keys_to: :none,
         
     | 
| 
      
 21 
     | 
    
         
            +
                                # convert_response_tags_to: lambda {
         
     | 
| 
      
 22 
     | 
    
         
            +
                                #     |tag| %w(Envelope Body).include?(tag) ? tag.snakecase.to_sym : tag.to_sym
         
     | 
| 
      
 23 
     | 
    
         
            +
                                # },
         
     | 
| 
      
 24 
     | 
    
         
            +
                                strip_namespaces: true
         
     | 
| 
      
 25 
     | 
    
         
            +
                    end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                    def authenticate(name = nil, password = nil)
         
     | 
| 
      
 28 
     | 
    
         
            +
                      name ||= 'administrator'
         
     | 
| 
      
 29 
     | 
    
         
            +
                      password ||= 'administrator'
         
     | 
| 
      
 30 
     | 
    
         
            +
                      result = request :auth, username: name, password: password
         
     | 
| 
      
 31 
     | 
    
         
            +
                      result.to_i == 1
         
     | 
| 
      
 32 
     | 
    
         
            +
                    end
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
                    def deauthenticate
         
     | 
| 
      
 35 
     | 
    
         
            +
                      request :deauthenticate
         
     | 
| 
      
 36 
     | 
    
         
            +
                    end
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                    protected
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
                    def result_parser(response)
         
     | 
| 
      
 41 
     | 
    
         
            +
                      result = response.hash
         
     | 
| 
      
 42 
     | 
    
         
            +
                      type_caster(result.first[1][result.first[1][:result].snakecase.to_sym])
         
     | 
| 
      
 43 
     | 
    
         
            +
                    end
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
                    def type_caster(result)
         
     | 
| 
      
 46 
     | 
    
         
            +
                      return result unless @type_cast
         
     | 
| 
      
 47 
     | 
    
         
            +
                      return result unless result.is_a? Hash
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
                      r = result
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
                      case r[:'@xsi:type']
         
     | 
| 
      
 52 
     | 
    
         
            +
                        when 'enc:Array'
         
     | 
| 
      
 53 
     | 
    
         
            +
                          elements = result[:item]
         
     | 
| 
      
 54 
     | 
    
         
            +
                          if elements.is_a? Array
         
     | 
| 
      
 55 
     | 
    
         
            +
                            r = Array.new
         
     | 
| 
      
 56 
     | 
    
         
            +
                            elements.each { |i| r << type_caster(i) }
         
     | 
| 
      
 57 
     | 
    
         
            +
                          else
         
     | 
| 
      
 58 
     | 
    
         
            +
                            r = type_caster(result[:item])
         
     | 
| 
      
 59 
     | 
    
         
            +
                          end
         
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
      
 61 
     | 
    
         
            +
                        when 'ns2:Map'
         
     | 
| 
      
 62 
     | 
    
         
            +
                          r = {}
         
     | 
| 
      
 63 
     | 
    
         
            +
                          elements = result[:item]
         
     | 
| 
      
 64 
     | 
    
         
            +
                          unless elements.is_a? Array
         
     | 
| 
      
 65 
     | 
    
         
            +
                            elements = Array.new
         
     | 
| 
      
 66 
     | 
    
         
            +
                            elements << result[:item]
         
     | 
| 
      
 67 
     | 
    
         
            +
                          end
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
      
 69 
     | 
    
         
            +
                          elements.each { |i|
         
     | 
| 
      
 70 
     | 
    
         
            +
                            key = i[:key]
         
     | 
| 
      
 71 
     | 
    
         
            +
                            value = i[:value]
         
     | 
| 
      
 72 
     | 
    
         
            +
                            value = type_caster(value)
         
     | 
| 
      
 73 
     | 
    
         
            +
                            r[key] = value
         
     | 
| 
      
 74 
     | 
    
         
            +
                          }
         
     | 
| 
      
 75 
     | 
    
         
            +
                        else
         
     | 
| 
      
 76 
     | 
    
         
            +
                        #do nothing
         
     | 
| 
      
 77 
     | 
    
         
            +
                      end
         
     | 
| 
      
 78 
     | 
    
         
            +
                      r
         
     | 
| 
      
 79 
     | 
    
         
            +
                    end
         
     | 
| 
      
 80 
     | 
    
         
            +
             
     | 
| 
      
 81 
     | 
    
         
            +
                    NS_ATTR_ENC = {'xmlns:enc' => 'http://schemas.xmlsoap.org/soap/encoding/'}
         
     | 
| 
      
 82 
     | 
    
         
            +
                    NS_ATTR_NS2 = {'xmlns:ns2' => 'http://xml.apache.org/xml-soap'}
         
     | 
| 
      
 83 
     | 
    
         
            +
             
     | 
| 
      
 84 
     | 
    
         
            +
                    def soap_encode(data)
         
     | 
| 
      
 85 
     | 
    
         
            +
                      result = data
         
     | 
| 
      
 86 
     | 
    
         
            +
                      attributes = nil
         
     | 
| 
      
 87 
     | 
    
         
            +
                      case data
         
     | 
| 
      
 88 
     | 
    
         
            +
                        when Array
         
     | 
| 
      
 89 
     | 
    
         
            +
                          i = data.size
         
     | 
| 
      
 90 
     | 
    
         
            +
                          t = type_string data[0]
         
     | 
| 
      
 91 
     | 
    
         
            +
                          attributes = {'xsi:type' => 'enc:Array'}
         
     | 
| 
      
 92 
     | 
    
         
            +
                          if t
         
     | 
| 
      
 93 
     | 
    
         
            +
                            attributes['enc:arrayType'] = "#{t}[#{i}]"
         
     | 
| 
      
 94 
     | 
    
         
            +
                          else
         
     | 
| 
      
 95 
     | 
    
         
            +
                            attributes['enc:arraySize'] = i
         
     | 
| 
      
 96 
     | 
    
         
            +
                          end
         
     | 
| 
      
 97 
     | 
    
         
            +
                          attributes.merge! NS_ATTR_ENC
         
     | 
| 
      
 98 
     | 
    
         
            +
                          if t =~ /^ns2:/
         
     | 
| 
      
 99 
     | 
    
         
            +
                            attributes.merge! NS_ATTR_NS2
         
     | 
| 
      
 100 
     | 
    
         
            +
                          end
         
     | 
| 
      
 101 
     | 
    
         
            +
                          result = Array.new
         
     | 
| 
      
 102 
     | 
    
         
            +
                          data.each { |x|
         
     | 
| 
      
 103 
     | 
    
         
            +
                            r, a = soap_encode x
         
     | 
| 
      
 104 
     | 
    
         
            +
                            i = {item: r}
         
     | 
| 
      
 105 
     | 
    
         
            +
                            i[:attributes!] = {item: a} if a
         
     | 
| 
      
 106 
     | 
    
         
            +
                            result << i
         
     | 
| 
      
 107 
     | 
    
         
            +
                          }
         
     | 
| 
      
 108 
     | 
    
         
            +
                        when Hash
         
     | 
| 
      
 109 
     | 
    
         
            +
                          attributes = {'xsi:type' => 'ns2:Map'}.merge NS_ATTR_NS2
         
     | 
| 
      
 110 
     | 
    
         
            +
                          result = {item: Array.new}
         
     | 
| 
      
 111 
     | 
    
         
            +
                          data.each { |k, v|
         
     | 
| 
      
 112 
     | 
    
         
            +
                            rk, ak = soap_encode k.to_s
         
     | 
| 
      
 113 
     | 
    
         
            +
                            rv, av = soap_encode v
         
     | 
| 
      
 114 
     | 
    
         
            +
                            i = {key: rk, value: rv}
         
     | 
| 
      
 115 
     | 
    
         
            +
                            i[:attributes!] = {}
         
     | 
| 
      
 116 
     | 
    
         
            +
                            i[:attributes!][:key] = ak if ak
         
     | 
| 
      
 117 
     | 
    
         
            +
                            i[:attributes!][:value] = av if av
         
     | 
| 
      
 118 
     | 
    
         
            +
                            result[:item] << i
         
     | 
| 
      
 119 
     | 
    
         
            +
                          }
         
     | 
| 
      
 120 
     | 
    
         
            +
                        else
         
     | 
| 
      
 121 
     | 
    
         
            +
                          t = type_string data
         
     | 
| 
      
 122 
     | 
    
         
            +
                          if t
         
     | 
| 
      
 123 
     | 
    
         
            +
                            attributes = {'xsi:type' => t}
         
     | 
| 
      
 124 
     | 
    
         
            +
                            attributes.merge! NS_ATTR_ENC if t =~ /^enc:/
         
     | 
| 
      
 125 
     | 
    
         
            +
                            attributes.merge! NS_ATTR_NS2 if t =~ /^ns2:/
         
     | 
| 
      
 126 
     | 
    
         
            +
                          end
         
     | 
| 
      
 127 
     | 
    
         
            +
                      end
         
     | 
| 
      
 128 
     | 
    
         
            +
                      return result, attributes
         
     | 
| 
      
 129 
     | 
    
         
            +
                    end
         
     | 
| 
      
 130 
     | 
    
         
            +
             
     | 
| 
      
 131 
     | 
    
         
            +
                    def type_string(data)
         
     | 
| 
      
 132 
     | 
    
         
            +
                      return nil if data.nil?
         
     | 
| 
      
 133 
     | 
    
         
            +
                      case data
         
     | 
| 
      
 134 
     | 
    
         
            +
                        when Array
         
     | 
| 
      
 135 
     | 
    
         
            +
                          'enc:Array'
         
     | 
| 
      
 136 
     | 
    
         
            +
                        when Hash
         
     | 
| 
      
 137 
     | 
    
         
            +
                          'ns2:Map'
         
     | 
| 
      
 138 
     | 
    
         
            +
                        when String
         
     | 
| 
      
 139 
     | 
    
         
            +
                          'xsd:string'
         
     | 
| 
      
 140 
     | 
    
         
            +
                        when Integer
         
     | 
| 
      
 141 
     | 
    
         
            +
                          'xsd:int'
         
     | 
| 
      
 142 
     | 
    
         
            +
                        else
         
     | 
| 
      
 143 
     | 
    
         
            +
                          'xsd:string'
         
     | 
| 
      
 144 
     | 
    
         
            +
                      end
         
     | 
| 
      
 145 
     | 
    
         
            +
                    end
         
     | 
| 
      
 146 
     | 
    
         
            +
             
     | 
| 
      
 147 
     | 
    
         
            +
                  end
         
     | 
| 
      
 148 
     | 
    
         
            +
             
     | 
| 
      
 149 
     | 
    
         
            +
                end
         
     | 
| 
      
 150 
     | 
    
         
            +
              end
         
     | 
| 
      
 151 
     | 
    
         
            +
            end
         
     |