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