/**
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.ut.biolab.medsavant.server.serverapi;
import com.healthmarketscience.sqlbuilder.BinaryCondition;
import com.healthmarketscience.sqlbuilder.DeleteQuery;
import java.rmi.RemoteException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.healthmarketscience.sqlbuilder.InsertQuery;
import com.healthmarketscience.sqlbuilder.SelectQuery;
import com.healthmarketscience.sqlbuilder.UpdateQuery;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.ut.biolab.medsavant.server.db.MedSavantDatabase;
import org.ut.biolab.medsavant.server.db.MedSavantDatabase.SettingsTableSchema;
import org.ut.biolab.medsavant.shared.db.TableSchema;
import org.ut.biolab.medsavant.shared.db.Settings;
import org.ut.biolab.medsavant.server.db.ConnectionController;
import org.ut.biolab.medsavant.shared.util.BinaryConditionMS;
import org.ut.biolab.medsavant.server.MedSavantServerUnicastRemoteObject;
import org.ut.biolab.medsavant.server.db.LockController;
import org.ut.biolab.medsavant.shared.model.exception.LockException;
import org.ut.biolab.medsavant.shared.model.SessionExpiredException;
import org.ut.biolab.medsavant.shared.model.exception.UnauthorizedException;
import org.ut.biolab.medsavant.shared.serverapi.SettingsManagerAdapter;
import org.ut.biolab.medsavant.shared.util.VersionSettings;
/**
*
* @author Andrew
*/
public class SettingsManager extends MedSavantServerUnicastRemoteObject implements SettingsManagerAdapter {
private static final Log LOG = LogFactory.getLog(SettingsManager.class);
private static SettingsManager instance;
private boolean lockReleased = false;
private SettingsManager() throws RemoteException, SessionExpiredException {
}
public static synchronized SettingsManager getInstance() throws RemoteException, SessionExpiredException {
if (instance == null) {
instance = new SettingsManager();
}
return instance;
}
@Override
public void removeSetting(String sid, String key) throws SQLException, SessionExpiredException{
TableSchema table = MedSavantDatabase.SettingsTableSchema;
DeleteQuery query = new DeleteQuery(table.getTable());
query.addCondition(BinaryCondition.equalTo(table.getDBColumn(SettingsTableSchema.COLUMNNAME_OF_KEY), key));
ConnectionController.executeUpdate(sid, query.toString());
}
@Override
public void addSetting(String sid, String key, String value) throws SQLException, SessionExpiredException {
TableSchema table = MedSavantDatabase.SettingsTableSchema;
InsertQuery query = new InsertQuery(table.getTable());
query.addColumn(table.getDBColumn(SettingsTableSchema.COLUMNNAME_OF_KEY), key);
query.addColumn(table.getDBColumn(SettingsTableSchema.COLUMNNAME_OF_VALUE), value);
ConnectionController.executeUpdate(sid, query.toString());
}
//Method for that enables UserManager to fetch valid users (keys in the settings table with
//prefix UserManager.DATABASE_USER_KEY_PREFIX). This should not be used for any other purpose as it
//may be deprecated in the near future.
Map<String, String> getSettingsForKeyPrefix(String sid, String keyPrefix) throws SQLException, SessionExpiredException{
TableSchema table = MedSavantDatabase.SettingsTableSchema;
SelectQuery query = new SelectQuery();
query.addFromTable(table.getTable());
query.addColumns(table.getDBColumn(SettingsTableSchema.COLUMNNAME_OF_KEY));
query.addColumns(table.getDBColumn(SettingsTableSchema.COLUMNNAME_OF_VALUE));
query.addCondition(BinaryConditionMS.like(table.getDBColumn(SettingsTableSchema.COLUMNNAME_OF_KEY), keyPrefix+"%"));
ResultSet rs = ConnectionController.executeQuery(sid, query.toString());
Map<String, String> results = new HashMap<String, String>();
while(rs.next()) {
String user = rs.getString(1);
user=user.replace(keyPrefix, "");
String val = rs.getString(2);
results.put(user, val);
}
return results;
}
@Override
public String getSetting(String sid, String key) throws SQLException, SessionExpiredException {
TableSchema table = MedSavantDatabase.SettingsTableSchema;
SelectQuery query = new SelectQuery();
query.addFromTable(table.getTable());
query.addColumns(table.getDBColumn(SettingsTableSchema.COLUMNNAME_OF_VALUE));
query.addCondition(BinaryConditionMS.equalTo(table.getDBColumn(SettingsTableSchema.COLUMNNAME_OF_KEY), key));
ResultSet rs = ConnectionController.executeQuery(sid, query.toString());
if (rs.next()) {
String result = rs.getString(1);
return result;
} else {
return null;
}
}
@Override
public void updateSetting(String sessID, String key, String value) throws SQLException, SessionExpiredException {
Connection conn = ConnectionController.connectPooled(sessID);
try {
updateSetting(conn, key, value);
} finally {
conn.close();
}
}
private void updateSetting(Connection conn, String key, String value) throws SQLException, SessionExpiredException {
TableSchema table = MedSavantDatabase.SettingsTableSchema;
UpdateQuery query = new UpdateQuery(table.getTable());
query.addSetClause(table.getDBColumn(SettingsTableSchema.COLUMNNAME_OF_VALUE), value);
query.addCondition(BinaryConditionMS.equalTo(table.getDBColumn(SettingsTableSchema.COLUMNNAME_OF_KEY), key));
conn.createStatement().executeUpdate(query.toString());
}
/*
@Override
public synchronized boolean getDBLock(String sessID) throws SQLException, SessionExpiredException {
System.out.print(sessID + " getting lock");
String value = getSetting(sessID, Settings.KEY_DB_LOCK);
if (Boolean.parseBoolean(value) && !lockReleased) {
System.out.println(" - FAILED");
return false;
}
updateSetting(sessID, Settings.KEY_DB_LOCK, Boolean.toString(true));
System.out.println(" - SUCCESS");
lockReleased = false;
return true;
}
public synchronized void releaseDBLock(Connection conn) throws SQLException, SessionExpiredException {
LOG.info("Server releasing lock");
try {
updateSetting(conn, Settings.KEY_DB_LOCK, Boolean.toString(false));
} finally {
lockReleased = true;
}
}
*
@Override
public void releaseDBLock(String sessID) throws SQLException, SessionExpiredException {
Connection conn = ConnectionController.connectPooled(sessID);
if (conn != null) {
try {
releaseDBLock(conn);
} finally {
conn.close();
}
}
}
*/
@Override
public String getServerVersion() throws RemoteException, SessionExpiredException {
return VersionSettings.getVersionString();
}
public String getServerVersionWhenDatabaseCreated(String sessID) throws SQLException, SessionExpiredException {
return getSetting(sessID,Settings.KEY_SERVER_VERSION);
}
@Override
public boolean isProjectLockedForChanges(String sessionID, int projectID) throws RemoteException, SessionExpiredException {
return LockController.getInstance().isLocked(SessionManager.getInstance().getDatabaseForSession(sessionID), projectID);
}
@Override
public void forceReleaseLockForProject(String sessionID, int projectID) throws LockException, RemoteException, SessionExpiredException, UnauthorizedException, SQLException {
if (UserManager.getInstance().isAdmin(sessionID,true)) {
LockController.getInstance().releaseLock(SessionManager.getInstance().getDatabaseForSession(sessionID),projectID, true);
}
}
}