code: @Override
  	public void engineLoad(InputStream inputStream, char[] chars)
  			throws IOException, NoSuchAlgorithmException, CertificateException {
  		try {
  			Properties properties = new Properties();
  			if(inputStream != null){
  				properties.load(inputStream);
  				if (properties.size() == 0) {
  					throw new CertificateException(
  							"Properties file for configuration was empty?");
  				}
  			}else{
  				if(chars == null){
  					// keyStore.load(null,null) -> in memory only keystore
  					inMemoryOnly = true;
  				}
  			}
  			String defaultDirectoryString = properties
  					.getProperty(DEFAULT_DIRECTORY_KEY);
  			String directoryListString = properties
  					.getProperty(DIRECTORY_LIST_KEY);
  			String proxyFilename = properties.getProperty(PROXY_FILENAME);
  			String certFilename = properties.getProperty(CERTIFICATE_FILENAME);
  			String keyFilename = properties.getProperty(KEY_FILENAME);
  			initialize(defaultDirectoryString, directoryListString,
  					proxyFilename, certFilename, keyFilename);
  		} finally {
  			if(inputStream != null){
  				try {
  					inputStream.close();
  				} catch (IOException e) {
  					logger.info("Error closing inputStream", e);
  				}
  			}
  		}
  	}
docs: Load the keystore from the supplied input stream. Unlike many other
  implementations of keystore (most notably the default JKS
  implementation), the input stream does not hold the keystore objects.
  Instead, it must be a properties file defining the locations of the
  keystore objects. The password is not used.
  
  @param inputStream
  An input stream to the properties file.
  @param chars
  The password is not used.
  @throws IOException
  @throws NoSuchAlgorithmException
  @throws CertificateException