// $HeadURL$
// $Id$
//
// Copyright © 2010 by the President and Fellows of Harvard College.
//
// Screensaver is an open-source project developed by the ICCB-L and NSRB labs
// at Harvard Medical School. This software is distributed under the terms of
// the GNU General Public License.
package edu.harvard.med.iccbl.screensaver.db;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.google.common.collect.Maps;
import org.apache.log4j.Logger;
import edu.harvard.med.screensaver.DatabaseConnectionSettings;
import edu.harvard.med.screensaver.ScreensaverProperties;
import edu.harvard.med.screensaver.db.DatabaseConnectionSettingsResolutionException;
import edu.harvard.med.screensaver.db.DatabaseConnectionSettingsResolver;
import edu.harvard.med.screensaver.db.NeedsScreensaverProperties;
/**
* Resolves database connection settings from a special RITG-provided production environment file.
*
* @author atolopko
*/
public class OrchestraAuthFileDatabaseConnectionSettingsResolver implements DatabaseConnectionSettingsResolver, NeedsScreensaverProperties
{
private static final Logger log = Logger.getLogger(OrchestraAuthFileDatabaseConnectionSettingsResolver.class);
private ScreensaverProperties _screensaverProperties;
@Override
public void setScreensaverProperties(ScreensaverProperties screensaverProperties)
{
_screensaverProperties = screensaverProperties;
}
@Override
public DatabaseConnectionSettings resolve() throws DatabaseConnectionSettingsResolutionException
{
String orchestraAuthFilename = _screensaverProperties.getProperty("orchestra.db.connection.file");
if (orchestraAuthFilename == null) {
log.warn("no orchestra database connection settings file specified");
return null;
}
log.info("using orchestra database connection settings from file " + orchestraAuthFilename);
try {
Pattern pattern = Pattern.compile("SetEnv\\s+(\\S+)\\s+(\\S+)");
File authFile = new File(orchestraAuthFilename);
FileInputStream authFileInputStream = new FileInputStream(authFile);
InputStreamReader authInputStreamReader = new InputStreamReader(authFileInputStream);
BufferedReader authBufferedReader = new BufferedReader(authInputStreamReader);
Map<String,String> settings = Maps.newHashMap();
String line = authBufferedReader.readLine();
while (line != null) {
Matcher matcher = pattern.matcher(line);
if (matcher.matches()) {
String property = matcher.group(1);
String propertyValue = matcher.group(2);
settings.put(property, propertyValue);
log.debug("parsed " + property + "=" + propertyValue);
}
line = authBufferedReader.readLine();
}
return new DatabaseConnectionSettings(settings.get("SCREENSAVER_PGSQL_SERVER"),
null,
settings.get("SCREENSAVER_PGSQL_DB"),
settings.get("SCREENSAVER_PGSQL_USER"),
settings.get("SCREENSAVER_PGSQL_PASSWORD"));
}
catch (IOException e) {
throw new DatabaseConnectionSettingsResolutionException("unable to read and parse the orchestra auth file", e);
}
}
}