package i2p.susi.dns; import java.io.File; import java.io.FileFilter; import java.io.IOException; import java.util.Properties; import net.i2p.I2PAppContext; import net.i2p.data.DataHelper; import net.i2p.util.Log; import net.i2p.util.OrderedProperties; /** * Holds methods common to several Beans. * @since 0.9.1 */ public class BaseBean { protected final I2PAppContext _context; protected final Properties properties; protected String action, lastSerial, serial; private long configLastLoaded; private static final String PRIVATE_BOOK = "private_addressbook"; private static final String DEFAULT_PRIVATE_BOOK = "../privatehosts.txt"; public static final String RC_PROP_THEME_NAME = "routerconsole.theme"; public static final String RC_PROP_UNIVERSAL_THEMING = "routerconsole.universal.theme"; public static final String PROP_THEME_NAME = "theme"; public static final String DEFAULT_THEME = "light"; public static final String BASE_THEME_PATH = "/themes/susidns/"; public static final String PROP_PW_ENABLE = "routerconsole.auth.enable"; private static final String ADDRESSBOOK_DIR = "addressbook"; private static final String CONFIG_FILE = "config.txt"; public BaseBean() { _context = I2PAppContext.getGlobalContext(); properties = new OrderedProperties(); } /** * @since 0.9.13 moved from ConfigBean.addressbookPrefix */ protected File addressbookDir() { return new File(_context.getRouterDir(), ADDRESSBOOK_DIR); } /** * @since 0.9.13 moved from ConfigBean.configFileName */ protected File configFile() { return new File(addressbookDir(), CONFIG_FILE); } protected void loadConfig() { synchronized (BaseBean.class) { long currentTime = System.currentTimeMillis(); if( !properties.isEmpty() && currentTime - configLastLoaded < 10000 ) return; reload(); } } /** * @since 0.9.13 moved from ConfigBean */ protected void reload() { try { synchronized (BaseBean.class) { properties.clear(); // use loadProps to trim DataHelper.loadProps(properties, configFile()); // added in 0.5, for compatibility with 0.4 config.txt if( properties.getProperty(PRIVATE_BOOK) == null) properties.setProperty(PRIVATE_BOOK, DEFAULT_PRIVATE_BOOK); configLastLoaded = System.currentTimeMillis(); } } catch (IOException e) { warn(e); } } /** * Returns the theme path * @since 0.9.1 */ public String getTheme() { loadConfig(); String url = BASE_THEME_PATH; String theme = properties.getProperty(PROP_THEME_NAME, DEFAULT_THEME); boolean universalTheming = _context.getBooleanProperty(RC_PROP_UNIVERSAL_THEMING); if (universalTheming) { // Fetch routerconsole theme (or use our default if it doesn't exist) theme = _context.getProperty(RC_PROP_THEME_NAME, DEFAULT_THEME); // Ensure that theme exists String[] themes = getThemes(); boolean themeExists = false; for (int i = 0; i < themes.length; i++) { if (themes[i].equals(theme)) themeExists = true; } if (!themeExists) theme = DEFAULT_THEME; } url += theme + "/"; return url; } /** * Get all themes * @return String[] -- Array of all the themes found. * @since 0.9.2 */ public String[] getThemes() { String[] themes = null; // "docs/themes/susidns/" File dir = new File(_context.getBaseDir(), "docs/themes/susidns"); FileFilter fileFilter = new FileFilter() { public boolean accept(File file) { return file.isDirectory(); } }; // Walk the themes dir, collecting the theme names, and append them to the map File[] dirnames = dir.listFiles(fileFilter); if (dirnames != null) { themes = new String[dirnames.length]; for(int i = 0; i < dirnames.length; i++) { themes[i] = dirnames[i].getName(); } } // return the map. return themes; } /** * @since 0.9.13 moved from subclasses */ public String getAction() { return action; } /** * @since 0.9.13 moved from subclasses */ public void setAction(String action) { this.action = DataHelper.stripHTML(action); } /** * @since 0.9.13 moved from subclasses */ public String getSerial() { lastSerial = Long.toString(_context.random().nextLong()); action = null; return lastSerial; } /** * @since 0.9.13 moved from subclasses */ public void setSerial(String serial) { this.serial = DataHelper.stripHTML(serial); } /** * Translate * @since 0.9.13 moved from subclasses */ protected static String _t(String s) { return Messages.getString(s); } /** * Translate * @since 0.9.13 moved from subclasses */ protected static String _t(String s, Object o) { return Messages.getString(s, o); } /** * Translate * @since 0.9.13 moved from subclasses */ protected static String _t(String s, Object o, Object o2) { return Messages.getString(s, o, o2); } /** * Translate (ngettext) * @since 0.9.13 moved from subclasses */ protected static String ngettext(String s, String p, int n) { return Messages.getString(n, s, p); } /** * @since 0.9.13 moved from Debug */ protected void debug(String msg) { Log log = _context.logManager().getLog(getClass()); if (log.shouldLog(Log.DEBUG)) log.debug(msg); } /** * @since 0.9.13 moved from Debug */ protected void warn(Throwable t) { Log log = _context.logManager().getLog(getClass()); if (log.shouldLog(Log.WARN)) log.warn("SusiDNS", t); } }