reload software manager if not hit and do a little refactoring
Let getSoftwareManager() throw exception rather than return null when failed
to report the root cause to end user