lib/adiwg/mdtranslator/readers/mdJson/mdJson_reader.rb in adiwg-mdtranslator-1.2.1 vs lib/adiwg/mdtranslator/readers/mdJson/mdJson_reader.rb in adiwg-mdtranslator-1.3.0

- old
+ new

@@ -11,165 +11,172 @@ # Stan Smith 2014-08-18 add json name/version to internal object # Stan Smith 2014-12-01 add data dictionary # Stan Smith 2014-12-03 changed class name to MdJsonReader from AdiwgJsonReader # Stan Smith 2014-12-11 refactored to handle namespacing readers and writers # Stan Smith 2015-06-12 added method to lookup contact in contact array +# Stan Smith 2015-06-22 replace global ($response) with passed in object (responseObj) +# Stan Smith 2015-07-14 refactored to remove global namespace constants +# Stan Smith 2015-07-14 added support for mdJson version numbers require 'json' +require_relative 'mdJson_validator' module ADIWG module Mdtranslator module Readers module MdJson - def self.readFile(file) - # set anticipated format of file in $response - $response[:readerFormat] = 'json' + def self.readFile(file, responseObj) + # set reference to responseObj for use throughout this module + @responseObj = responseObj + # receive json file into ruby hash parseJson(file) - if !$response[:readerStructurePass] + if !@responseObj[:readerStructurePass] return false end + # set format of file in $response + @responseObj[:readerFormat] = 'json' + # check mdJson version name checkVersionName - if !$response[:readerStructurePass] + if !@responseObj[:readerStructurePass] return false end # check mdJson version number checkVersionNumber - if !$response[:readerStructurePass] + if !@responseObj[:readerStructurePass] return false end # validate file against mdJson schema definition - require 'adiwg/mdtranslator/readers/mdJson/mdJson_validator' - $ReaderNS.validate(file) - if !$response[:readerValidationPass] + validate(file, @responseObj) + if !@responseObj[:readerValidationPass] return false end # load mdJson file into internal object require readerModule('module_mdJson') # instance classes needed in script intMetadataClass = InternalMetadata.new # create new internal metadata container for the reader @intObj = intMetadataClass.newBase - $ReaderNS.unpack(@intObj, @hMdJson) + + # + ADIWG::Mdtranslator::Readers::MdJson.unpack(@intObj, @hMdJson, @responseObj) return @intObj end def self.parseJson(file) # validate the input file structure # test for valid json syntax by attempting to parse the file begin @hMdJson = JSON.parse(file) - $response[:readerStructurePass] = true + @responseObj[:readerStructurePass] = true rescue JSON::JSONError => err - $response[:readerStructurePass] = false - $response[:readerStructureMessages] << 'JSON Parsing Failed - see following message(s):\n' - $response[:readerStructureMessages] << err.to_s.slice(0,300) + @responseObj[:readerStructurePass] = false + @responseObj[:readerStructureMessages] << 'JSON Parsing Failed - see following message(s):\n' + @responseObj[:readerStructureMessages] << err.to_s.slice(0,300) end end def self.checkVersionName # find version name on the input json file if @hMdJson.has_key?('version') hVersion = @hMdJson['version'] else - $response[:readerStructurePass] = false - $response[:readerStructureMessages] << 'Invalid input file schema declaration - see following message(s):\n' - $response[:readerStructureMessages] << 'The input file is missing the version:{} block.' + @responseObj[:readerStructurePass] = false + @responseObj[:readerStructureMessages] << 'Invalid input file schema declaration - see following message(s):\n' + @responseObj[:readerStructureMessages] << 'The input file is missing the version:{} block.' return end # check the version name if hVersion.has_key?('name') s = hVersion['name'] - if !s.nil? - $response[:readerFound] = s - else - $response[:readerStructurePass] = false - $response[:readerStructureMessages] << 'Invalid input file schema declaration - see following message(s):\n' - $response[:readerStructureMessages] << 'The input file version: => name: is missing.' + if s.nil? + @responseObj[:readerStructurePass] = false + @responseObj[:readerStructureMessages] << 'Invalid input file schema declaration - see following message(s):\n' + @responseObj[:readerStructureMessages] << 'The input file version: => name: is missing.' return end else - $response[:readerStructurePass] = false - $response[:readerStructureMessages] << 'Invalid input file schema declaration - see following message(s):\n' - $response[:readerStructureMessages] << "The input file version:{} block is missing the 'name:' attribute." + @responseObj[:readerStructurePass] = false + @responseObj[:readerStructureMessages] << 'Invalid input file schema declaration - see following message(s):\n' + @responseObj[:readerStructureMessages] << "The input file version:{} block is missing the 'name:' attribute." return end # check the version name is 'mdJson' if s != 'mdJson' - $response[:readerStructurePass] = false - $response[:readerStructureMessages] << 'Invalid input file schema declaration - see following message(s):\n' - $response[:readerStructureMessages] << "The mdTranslator reader expected the input file version: name: to be 'mdJson'." - $response[:readerStructureMessages] << "Version name found was: '#{s}'." + @responseObj[:readerStructurePass] = false + @responseObj[:readerStructureMessages] << 'Invalid input file schema declaration - see following message(s):\n' + @responseObj[:readerStructureMessages] << "The mdTranslator reader expected the input file version: name: to be 'mdJson'." + @responseObj[:readerStructureMessages] << "Version name found was: '#{s}'." end end def self.checkVersionNumber # find version number on the input json file hVersion = @hMdJson['version'] if hVersion.has_key?('version') s = hVersion['version'] if !s.nil? - $response[:readerVersionFound] = s + @responseObj[:readerVersionRequested] = s end else - $response[:readerStructurePass] = false - $response[:readerStructureMessages] << 'Invalid input file schema declaration - see following message(s):\n' - $response[:readerStructureMessages] << "The input file version:{} block is missing the 'version:' number attribute." + @responseObj[:readerStructurePass] = false + @responseObj[:readerStructureMessages] << 'Invalid input file schema declaration - see following message(s):\n' + @responseObj[:readerStructureMessages] << "The input file version:{} block is missing the 'version:' number attribute." return end - # test the reader version requested is supported - # remove maintenance release number first - # ... then look for a module folder name ending with the requested version - # ... example: 'modules_1.2' - aVersionParts = s.split('.') - if aVersionParts.length >= 2 - readerVersion = aVersionParts[0] +'.' + aVersionParts[1] - dir = File.join(File.dirname(__FILE__), 'modules_' + readerVersion) - if !File.directory?(dir) - $response[:readerStructurePass] = false - $response[:readerStructureMessages] << 'Invalid input file schema declaration - see following message(s):\n' - $response[:readerStructureMessages] << 'The input file version is not supported.' - $response[:readerStructureMessages] << "mdJson version requested was '#{s}'" - return - end - $response[:readerVersionUsed] = readerVersion - else - $response[:readerStructurePass] = false - $response[:readerStructureMessages] << 'Invalid input file schema declaration - see following message(s):\n' - $response[:readerStructureMessages] << 'The input file version number must be in the form MAJOR.MINOR.PATCH, e.g. 1.2.3' - $response[:readerStructureMessages] << 'Note the PATCH number is optional.' + # split the version number into its parts + aReqVersion = s.split('.') + + reqMajor = 0 + if !aReqVersion[0].nil? + reqMajor = aReqVersion[0] end - end - # require modules for the requested version - def self.readerModule(moduleName) - dir = File.join(File.dirname(__FILE__), 'modules_' + $response[:readerVersionUsed]) - file = File.join(dir, moduleName) + # test if the requested reader major version is supported + # look for a folder with modules for the major version number + dirName = File.join(File.dirname(__FILE__), 'modules_v' + reqMajor) + if !File.directory?(dirName) + @responseObj[:readerStructurePass] = false + @responseObj[:readerStructureMessages] << 'Invalid input file schema declaration - see following message(s):\n' + @responseObj[:readerStructureMessages] << 'A reader for the requested version is not supported.' + @responseObj[:readerStructureMessages] << "mdJson version requested was '#{s}'" + return false + end - # test for the existance of the module in the current mdJson version directory - if !File.exist?(File.join(dir, moduleName + '.rb')) - # file not found - # ... look for module in previous version directory - # ... note: no previous version directories exist yet + # the requested major version is supported + # get the full version number for this major version of mdJson + require File.join(dirName, 'version') + curVersion = ADIWG::Mdtranslator::Readers::MdJson::VERSION + @responseObj[:readerVersionUsed] = curVersion + aCurVersion = curVersion.split('.') + curMinor = aCurVersion[1] - # no prior version directory found - # ... file not found - return nil + # test that minor version number is not exceeded + reqMinor = 0 + if !aReqVersion[1].nil? + reqMinor = aReqVersion[1] + if curMinor < reqMinor + @responseObj[:readerStructurePass] = false + @responseObj[:readerStructureMessages] << 'Invalid input file schema declaration - see following message(s):\n' + @responseObj[:readerStructureMessages] << 'The requested reader minor version is not supported.' + @responseObj[:readerStructureMessages] << "mdJson version requested was '#{s}'" + return false + end end - return file + end # find the array pointer for a contact def self.findContact(contactId) pointer = nil @@ -178,10 +185,31 @@ if contact[:contactId] == contactId pointer = i end i += 1 end + return pointer + end + + # require modules for the requested version + def self.readerModule(moduleName) + majVersion = @responseObj[:readerVersionUsed].split('.')[0] + dirName = File.join(File.dirname(__FILE__), 'modules_v' + majVersion.to_s) + fileName = File.join(dirName, moduleName) + + # test for the existance of the module in the current mdJson version directory + if !File.exist?(File.join(dirName, moduleName + '.rb')) + # file not found + # ... look for module in previous version directory + # ... note: no previous version directories exist yet + + # no prior version directory found + # ... file not found + return nil + end + + return fileName end end end end