view src/nabble/model/SystemProperties.java @ 0:7ecd1a4ef557

add content
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 21 Mar 2019 19:15:52 -0600
parents
children
line wrap: on
line source

package nabble.model;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Map;
import java.util.TreeMap;

/**
 * Holds a Map with strings.
 * Basically, this is used to persist keys and values used by the application.
 * The cache Map is just a copy of the system table in the database.
 *
 * @author Hugo Teixeira
 */
public class SystemProperties {

	private static final Logger logger = LoggerFactory.getLogger(SystemProperties.class);

	private static final Map<String, String> cache = new TreeMap<String, String>();

	static {
		load();
	}

	private static void load() {
		long start = System.currentTimeMillis();
		try {
			Connection con = Db.dbGlobal().getConnection();
			try {
				PreparedStatement stmt = con.prepareStatement("select * from system");
				ResultSet rs = stmt.executeQuery();
				while (rs.next()) {
					String key = rs.getString("key_");
					String value = rs.getString("value");
					cache.put(key, value);
				}
			} finally {
				con.close();
			}
			logger.info("System properties loaded in " + (System.currentTimeMillis() - start) + " ms");
		} catch(SQLException e) {
			logger.error(SystemProperties.class.toString(), e);
		}
	}

	public static synchronized void set(String key, String value) {
		try {
			Connection con = Db.dbGlobal().getConnection();
			try {
				if (cache.containsKey(key)) {
					PreparedStatement stmt = con.prepareStatement("update system set value=? where key_=?");
					stmt.setString(1, value);
					stmt.setString(2, key);
					stmt.execute();
					stmt.close();
				} else {
					PreparedStatement stmt = con.prepareStatement("insert into system values (?,?)");
					stmt.setString(1, key);
					stmt.setString(2, value);
					stmt.execute();
					stmt.close();
				}
			} finally {
				con.close();
			}
			cache.put(key, value);
			logger.info("System Property added: " + key + " -- " + value);
		} catch(SQLException e) {
			throw new RuntimeException(e);
		}
	}

	public synchronized static String get(String key) {
		return cache.get(key);
	}

	public synchronized static int size() {
		return cache.size();
	}

	public synchronized static void remove(String key) {
		try {
			String sql = "delete from system where key_='" + key + "';";
			Connection con = Db.dbGlobal().getConnection();
			try {
				PreparedStatement stmt = con.prepareStatement(sql);
				stmt.execute();
			} finally {
				con.close();
			}
			cache.remove(key);
			logger.info("System Properties -- Key Removed = " + key);
		} catch(SQLException e) {
			throw new RuntimeException(e);
		}
	}

	public synchronized static void clear() {
		try {
			String sql = "delete from system";
			Connection con = Db.dbGlobal().getConnection();
			try {
				PreparedStatement stmt = con.prepareStatement(sql);
				stmt.execute();
			} finally {
				con.close();
			}
			cache.clear();
			logger.info("System Properties cleared");
		} catch(SQLException e) {
			throw new RuntimeException(e);
		}
	}

}