module Java::OrgMarc4j::MarcReader include Enumerable # Return the next record, after calling #hashify on it def each(hashify=true) while self.hasNext r = self.next r.hashify if hashify yield r end end end module MARC4J4R # Add some sugar to the MarcReader interface # # Adjust the interface so that a #new call to any implementations that # implement it can take a java.io.InputStream, ruby IO obejct, or String # (that will be interpreted as a filename) without complaining. # # The mechanism -- running module_eval on a string-representation of the # new method in each of the hard-coded implementations of MarcReader # (MarcStreamReader,MarcPermissiveStreamReader,MarcXmlReader) -- is ugly # and deeply unsettling. # # @author Bill Dueber # First, add Enumerable to the interface Java::org.marc4j.MarcReader.module_eval("include Enumerable") class Reader # Get a marc reader of the appropriate type # @param [String, IO, java.io.InputStream] input The IO stream (or filename) from which you want to read # @param [:strictmarc, :permissivemarc, :marcxml] The type of MARC reader you want. # @return [MarcReader] A MarcReader object with the syntactic sugar added in this file (e.g, each) # # @example Get a strict binary MARC reader for the file 'test.mrc' # reader = MARC4J4R::Reader.new('test.mrc') # # @example Get a permissive binary MARC reader # reader = MARC4J4R::Reader.new('test.mrc', :permissivemarc) # # @example Get a reader for an xml file # reader = MARC4J4R::Reader.new('test.xml', :marcxml) # # @example Get a reader based on an existing IO object # require 'open-uri' # infile = open('http://my.machine.com/test.mrc') # reader = MARC4J4R::Reader.new(infile) attr_reader :handle def self.new(input, type = :strictmarc) @handle = IOConvert.byteinstream(input) case type when :strictmarc then return Java::org.marc4j.MarcStreamReader.new(@handle) when :permissivemarc then return Java::org.marc4j.MarcPermissiveStreamReader.new(@handle, true, true) when :marcxml then return Java::org.marc4j.MarcXmlReader.new(@handle) when :alephsequential then return MARC4J4R::AlephSequentialReader.new(@handle) else raise ArgumentError, "Reader type #{type} illegal: must be :strictmarc, :permissivemarc, :marcxml, or :alephsequential" end end end end