From 190bb12964b7cb659176086233f75eec4703341f Mon Sep 17 00:00:00 2001 From: Santiago Torres Date: Sun, 17 Jan 2016 15:42:45 -0500 Subject: [PATCH] ENH: Replaces transport config with namespaced settings --- briar-android/res/values/roboguice.xml | 3 +- .../AndroidNotificationManagerImpl.java | 2 +- .../android/SettingsActivity.java | 26 ++++----- .../invitation/AddContactActivity.java | 6 +-- .../plugins/droidtooth/DroidtoothPlugin.java | 2 +- .../briarproject/plugins/tor/TorPlugin.java | 15 +++--- .../org/briarproject/api/TransportConfig.java | 16 ------ .../api/db/DatabaseComponent.java | 16 ++---- .../api/plugins/PluginCallback.java | 10 ++-- .../api/settings/SettingsManager.java | 20 +++++++ .../src/org/briarproject/db/Database.java | 23 ++------ .../db/DatabaseComponentImpl.java | 49 ++--------------- .../src/org/briarproject/db/JdbcDatabase.java | 53 +++++-------------- .../plugins/PluginManagerImpl.java | 38 ++++++++----- .../plugins/tcp/LanTcpPlugin.java | 2 +- .../settings/SettingsManagerImpl.java | 44 +++++++++++++++ .../briarproject/settings/SettingsModule.java | 13 +++++ .../plugins/modem/ModemPluginFactory.java | 2 +- .../db/DatabaseComponentImplTest.java | 22 ++------ .../org/briarproject/db/H2DatabaseTest.java | 26 ++++----- .../plugins/DuplexClientTest.java | 16 +++--- .../plugins/DuplexServerTest.java | 16 +++--- .../bluetooth/BluetoothClientTest.java | 4 +- .../bluetooth/BluetoothServerTest.java | 4 +- .../plugins/tcp/LanTcpClientTest.java | 4 +- .../plugins/tcp/LanTcpPluginTest.java | 8 +-- .../plugins/tcp/LanTcpServerTest.java | 4 +- 27 files changed, 206 insertions(+), 238 deletions(-) delete mode 100644 briar-api/src/org/briarproject/api/TransportConfig.java create mode 100644 briar-api/src/org/briarproject/api/settings/SettingsManager.java create mode 100644 briar-core/src/org/briarproject/settings/SettingsManagerImpl.java create mode 100644 briar-core/src/org/briarproject/settings/SettingsModule.java diff --git a/briar-android/res/values/roboguice.xml b/briar-android/res/values/roboguice.xml index 25a6e1ffa..fb5c39112 100644 --- a/briar-android/res/values/roboguice.xml +++ b/briar-android/res/values/roboguice.xml @@ -17,5 +17,6 @@ org.briarproject.sync.SyncModule org.briarproject.system.AndroidSystemModule org.briarproject.transport.TransportModule + org.briarproject.settings.SettingsModule - \ No newline at end of file + diff --git a/briar-android/src/org/briarproject/android/AndroidNotificationManagerImpl.java b/briar-android/src/org/briarproject/android/AndroidNotificationManagerImpl.java index c3ffb1e31..44e3649bd 100644 --- a/briar-android/src/org/briarproject/android/AndroidNotificationManagerImpl.java +++ b/briar-android/src/org/briarproject/android/AndroidNotificationManagerImpl.java @@ -93,7 +93,7 @@ EventListener { dbExecutor.execute(new Runnable() { public void run() { try { - settings = db.getSettings(); + settings = db.getSettings("settings-activity"); } catch (DbException e) { if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); diff --git a/briar-android/src/org/briarproject/android/SettingsActivity.java b/briar-android/src/org/briarproject/android/SettingsActivity.java index 8433bc114..2be512d37 100644 --- a/briar-android/src/org/briarproject/android/SettingsActivity.java +++ b/briar-android/src/org/briarproject/android/SettingsActivity.java @@ -23,7 +23,7 @@ import org.briarproject.android.util.HorizontalBorder; import org.briarproject.android.util.LayoutUtils; import org.briarproject.android.util.ListLoadingProgressBar; import org.briarproject.api.Settings; -import org.briarproject.api.TransportConfig; +import org.briarproject.api.settings.SettingsManager; import org.briarproject.api.TransportId; import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.db.DbException; @@ -77,6 +77,7 @@ OnClickListener { // Fields that are accessed from background threads must be volatile @Inject private volatile DatabaseComponent db; + @Inject private volatile SettingsManager settingsManager; @Inject private volatile EventBus eventBus; private volatile Settings settings; private volatile boolean bluetoothSetting = true, torSetting = false; @@ -262,14 +263,15 @@ OnClickListener { runOnDbThread(new Runnable() { public void run() { try { + settings = settingsManager.getSettings("settings-activity"); long now = System.currentTimeMillis(); - TransportConfig c = db.getConfig(new TransportId("bt")); - settings = db.getSettings(); + Settings btSettings = settingsManager.getSettings("bt"); + Settings torSettings = settingsManager.getSettings("tor"); long duration = System.currentTimeMillis() - now; if (LOG.isLoggable(INFO)) LOG.info("Loading settings took " + duration + " ms"); - bluetoothSetting = c.getBoolean("enable", false); - torSetting = settings.getBoolean("torOverWifi", false); + bluetoothSetting = btSettings.getBoolean("enable", false); + torSetting = torSettings.getBoolean("torOverWifi", false); displaySettings(); } catch (DbException e) { if (LOG.isLoggable(WARNING)) @@ -338,6 +340,7 @@ OnClickListener { } else if (view == torOverWifi || view == torOverWifiHint) { torSetting = !torSetting; storeTorSettings(); + displaySettings(); } else if (view == notifyPrivateMessages) { Settings s = new Settings(); s.putBoolean("notifyPrivateMessages", @@ -378,11 +381,8 @@ OnClickListener { try { Settings s = new Settings(); s.putBoolean("torOverWifi", torSetting); - TransportConfig c = new TransportConfig(); - c.putBoolean("torOverWifi", torSetting); long now = System.currentTimeMillis(); - db.mergeSettings(s); - db.mergeConfig(new TransportId("tor"), c); + settingsManager.mergeSettings(s, "tor"); long duration = System.currentTimeMillis() - now; if (LOG.isLoggable(INFO)) LOG.info("Merging config took " + duration + " ms"); @@ -398,10 +398,10 @@ OnClickListener { runOnDbThread(new Runnable() { public void run() { try { - TransportConfig c = new TransportConfig(); - c.putBoolean("enable", bluetoothSetting); + Settings s = new Settings(); + s.putBoolean("enable", bluetoothSetting); long now = System.currentTimeMillis(); - db.mergeConfig(new TransportId("bt"), c); + settingsManager.mergeSettings(s, "bt"); long duration = System.currentTimeMillis() - now; if (LOG.isLoggable(INFO)) LOG.info("Merging config took " + duration + " ms"); @@ -418,7 +418,7 @@ OnClickListener { public void run() { try { long now = System.currentTimeMillis(); - db.mergeSettings(settings); + settingsManager.mergeSettings(settings, "settings-activity"); long duration = System.currentTimeMillis() - now; if (LOG.isLoggable(INFO)) LOG.info("Merging settings took " + duration + " ms"); diff --git a/briar-android/src/org/briarproject/android/invitation/AddContactActivity.java b/briar-android/src/org/briarproject/android/invitation/AddContactActivity.java index ef2fc44d0..d548b4cfb 100644 --- a/briar-android/src/org/briarproject/android/invitation/AddContactActivity.java +++ b/briar-android/src/org/briarproject/android/invitation/AddContactActivity.java @@ -8,7 +8,7 @@ import android.widget.Toast; import org.briarproject.R; import org.briarproject.android.BriarActivity; import org.briarproject.android.util.AndroidUtils; -import org.briarproject.api.TransportConfig; +import org.briarproject.api.Settings; import org.briarproject.api.TransportId; import org.briarproject.api.android.ReferenceManager; import org.briarproject.api.crypto.CryptoComponent; @@ -170,12 +170,12 @@ implements InvitationListener { public void run() { try { long now = System.currentTimeMillis(); - TransportConfig c = db.getConfig(new TransportId("bt")); + Settings s = db.getSettings("bt"); long duration = System.currentTimeMillis() - now; if (LOG.isLoggable(INFO)) LOG.info("Loading setting took " + duration + " ms"); leaveBluetoothEnabled = bluetoothWasEnabled - || c.getBoolean("enable", false); + || s.getBoolean("enable", false); } catch (DbException e) { if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); diff --git a/briar-android/src/org/briarproject/plugins/droidtooth/DroidtoothPlugin.java b/briar-android/src/org/briarproject/plugins/droidtooth/DroidtoothPlugin.java index 635f7d429..ae5d0dd40 100644 --- a/briar-android/src/org/briarproject/plugins/droidtooth/DroidtoothPlugin.java +++ b/briar-android/src/org/briarproject/plugins/droidtooth/DroidtoothPlugin.java @@ -137,7 +137,7 @@ class DroidtoothPlugin implements DuplexPlugin { bind(); } else { wasDisabled = true; - if (callback.getConfig().getBoolean("enable", false)) { + if (callback.getSettings().getBoolean("enable", false)) { if (adapter.enable()) LOG.info("Enabling Bluetooth"); else LOG.info("Could not enable Bluetooth"); } else { diff --git a/briar-android/src/org/briarproject/plugins/tor/TorPlugin.java b/briar-android/src/org/briarproject/plugins/tor/TorPlugin.java index fc2a6d190..0f11e4466 100644 --- a/briar-android/src/org/briarproject/plugins/tor/TorPlugin.java +++ b/briar-android/src/org/briarproject/plugins/tor/TorPlugin.java @@ -11,7 +11,7 @@ import android.os.FileObserver; import net.freehaven.tor.control.EventHandler; import net.freehaven.tor.control.TorControlConnection; -import org.briarproject.api.TransportConfig; +import org.briarproject.api.Settings; import org.briarproject.api.TransportId; import org.briarproject.api.TransportProperties; import org.briarproject.api.contact.ContactId; @@ -23,6 +23,7 @@ import org.briarproject.api.plugins.duplex.DuplexPlugin; import org.briarproject.api.plugins.duplex.DuplexPluginCallback; import org.briarproject.api.plugins.duplex.DuplexTransportConnection; import org.briarproject.api.system.LocationUtils; +import org.briarproject.api.settings.SettingsManager; import org.briarproject.util.StringUtils; import java.io.EOFException; @@ -349,7 +350,7 @@ class TorPlugin implements DuplexPlugin, EventHandler, ioExecutor.execute(new Runnable() { public void run() { // If there's already a port number stored in config, reuse it - String portString = callback.getConfig().get("port"); + String portString = callback.getSettings().get("port"); int port; if (StringUtils.isNullOrEmpty(portString)) port = 0; else port = Integer.parseInt(portString); @@ -371,9 +372,9 @@ class TorPlugin implements DuplexPlugin, EventHandler, socket = ss; // Store the port number final String localPort = String.valueOf(ss.getLocalPort()); - TransportConfig c = new TransportConfig(); - c.put("port", localPort); - callback.mergeConfig(c); + Settings s = new Settings(); + s.put("port", localPort); + callback.mergeSettings(s); // Create a hidden service if necessary ioExecutor.execute(new Runnable() { public void run() { @@ -614,8 +615,8 @@ class TorPlugin implements DuplexPlugin, EventHandler, } boolean blocked = TorNetworkMetadata.isTorProbablyBlocked( country); - TransportConfig c = callback.getConfig(); - boolean wifiOnly = c.getBoolean("torOverWifi", false); + Settings s = callback.getSettings(); + boolean wifiOnly = s.getBoolean("torOverWifi", false); try { if (!online) { diff --git a/briar-api/src/org/briarproject/api/TransportConfig.java b/briar-api/src/org/briarproject/api/TransportConfig.java deleted file mode 100644 index 7997ede71..000000000 --- a/briar-api/src/org/briarproject/api/TransportConfig.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.briarproject.api; - -import java.util.Map; - -public class TransportConfig extends StringMap { - - private static final long serialVersionUID = 2330384620787778596L; - - public TransportConfig(Map m) { - super(m); - } - - public TransportConfig() { - super(); - } -} diff --git a/briar-api/src/org/briarproject/api/db/DatabaseComponent.java b/briar-api/src/org/briarproject/api/db/DatabaseComponent.java index 13d28f9d8..d1ed50606 100644 --- a/briar-api/src/org/briarproject/api/db/DatabaseComponent.java +++ b/briar-api/src/org/briarproject/api/db/DatabaseComponent.java @@ -1,7 +1,6 @@ package org.briarproject.api.db; import org.briarproject.api.Settings; -import org.briarproject.api.TransportConfig; import org.briarproject.api.TransportId; import org.briarproject.api.TransportProperties; import org.briarproject.api.contact.Contact; @@ -139,9 +138,6 @@ public interface DatabaseComponent { /** Returns all groups to which the user could subscribe. */ Collection getAvailableGroups() throws DbException; - /** Returns the configuration for the given transport. */ - TransportConfig getConfig(TransportId t) throws DbException; - /** Returns the contact with the given ID. */ Contact getContact(ContactId c) throws DbException; @@ -194,8 +190,8 @@ public interface DatabaseComponent { Map getRemoteProperties(TransportId t) throws DbException; - /** Returns all settings. */ - Settings getSettings() throws DbException; + /** Returns all settings for a given namespace. */ + Settings getSettings(String namespace) throws DbException; /** Returns all contacts who subscribe to the given group. */ Collection getSubscribers(GroupId g) throws DbException; @@ -220,12 +216,6 @@ public interface DatabaseComponent { void incrementStreamCounter(ContactId c, TransportId t, long rotationPeriod) throws DbException; - /** - * Merges the given configuration with existing configuration for the - * given transport. - */ - void mergeConfig(TransportId t, TransportConfig c) throws DbException; - /** * Merges the given properties with the existing local properties for the * given transport. @@ -234,7 +224,7 @@ public interface DatabaseComponent { throws DbException; /** Merges the given settings with the existing settings. */ - void mergeSettings(Settings s) throws DbException; + void mergeSettings(Settings s, String namespace) throws DbException; /** Processes an ack from the given contact. */ void receiveAck(ContactId c, Ack a) throws DbException; diff --git a/briar-api/src/org/briarproject/api/plugins/PluginCallback.java b/briar-api/src/org/briarproject/api/plugins/PluginCallback.java index 78d870a15..8216cafdf 100644 --- a/briar-api/src/org/briarproject/api/plugins/PluginCallback.java +++ b/briar-api/src/org/briarproject/api/plugins/PluginCallback.java @@ -1,8 +1,8 @@ package org.briarproject.api.plugins; -import org.briarproject.api.TransportConfig; import org.briarproject.api.TransportProperties; import org.briarproject.api.contact.ContactId; +import org.briarproject.api.Settings; import java.util.Map; @@ -12,8 +12,8 @@ import java.util.Map; */ public interface PluginCallback { - /** Returns the plugin's configuration. */ - TransportConfig getConfig(); + /** Returns the plugin's settings */ + Settings getSettings(); /** Returns the plugin's local transport properties. */ TransportProperties getLocalProperties(); @@ -21,8 +21,8 @@ public interface PluginCallback { /** Returns the plugin's remote transport properties. */ Map getRemoteProperties(); - /** Merges the given configuration with the plugin's configuration. */ - void mergeConfig(TransportConfig c); + /** Merges the given settings with the namespaced settings */ + void mergeSettings(Settings s); /** * Merges the given properties with the plugin's local transport properties. diff --git a/briar-api/src/org/briarproject/api/settings/SettingsManager.java b/briar-api/src/org/briarproject/api/settings/SettingsManager.java new file mode 100644 index 000000000..c398ebc62 --- /dev/null +++ b/briar-api/src/org/briarproject/api/settings/SettingsManager.java @@ -0,0 +1,20 @@ +package org.briarproject.api.settings; + +import org.briarproject.api.db.DbException; +import org.briarproject.api.Settings; + +public interface SettingsManager { + + /** + * Returns the settings object identified by the provided namespace + * string + */ + Settings getSettings(String namespace) throws DbException; + + /** + * Merges (read syncs) the provided settings identified by the provided namespace + * string + */ + void mergeSettings(Settings s, String namespace) throws DbException; + +} diff --git a/briar-core/src/org/briarproject/db/Database.java b/briar-core/src/org/briarproject/db/Database.java index a34c92814..374c56081 100644 --- a/briar-core/src/org/briarproject/db/Database.java +++ b/briar-core/src/org/briarproject/db/Database.java @@ -1,7 +1,6 @@ package org.briarproject.db; import org.briarproject.api.Settings; -import org.briarproject.api.TransportConfig; import org.briarproject.api.TransportId; import org.briarproject.api.TransportProperties; import org.briarproject.api.contact.Contact; @@ -223,13 +222,6 @@ interface Database { */ Collection getAvailableGroups(T txn) throws DbException; - /** - * Returns the configuration for the given transport. - *

- * Locking: read. - */ - TransportConfig getConfig(T txn, TransportId t) throws DbException; - /** * Returns the contact with the given ID. *

@@ -419,11 +411,11 @@ interface Database { int maxLength) throws DbException; /** - * Returns all settings. + * Returns all settings that belong to a namespace. *

* Locking: read. */ - Settings getSettings(T txn) throws DbException; + Settings getSettings(T txn, String namespace) throws DbException; /** * Returns all contacts who subscribe to the given group. @@ -524,15 +516,6 @@ interface Database { void lowerRequestedFlag(T txn, ContactId c, Collection requested) throws DbException; - /** - * Merges the given configuration with the existing configuration for the - * given transport. - *

- * Locking: write. - */ - void mergeConfig(T txn, TransportId t, TransportConfig config) - throws DbException; - /** * Merges the given properties with the existing local properties for the * given transport. @@ -547,7 +530,7 @@ interface Database { *

* Locking: write. */ - void mergeSettings(T txn, Settings s) throws DbException; + void mergeSettings(T txn, Settings s, String Namespace) throws DbException; /** * Marks a message as needing to be acknowledged to the given contact. diff --git a/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java b/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java index 795fb4136..64e6e8316 100644 --- a/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java +++ b/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java @@ -1,7 +1,6 @@ package org.briarproject.db; import org.briarproject.api.Settings; -import org.briarproject.api.TransportConfig; import org.briarproject.api.TransportId; import org.briarproject.api.TransportProperties; import org.briarproject.api.contact.Contact; @@ -524,25 +523,6 @@ class DatabaseComponentImpl implements DatabaseComponent { } } - public TransportConfig getConfig(TransportId t) throws DbException { - lock.readLock().lock(); - try { - T txn = db.startTransaction(); - try { - if (!db.containsTransport(txn, t)) - throw new NoSuchTransportException(); - TransportConfig config = db.getConfig(txn, t); - db.commitTransaction(txn); - return config; - } catch (DbException e) { - db.abortTransaction(txn); - throw e; - } - } finally { - lock.readLock().unlock(); - } - } - public Contact getContact(ContactId c) throws DbException { lock.readLock().lock(); try { @@ -808,12 +788,12 @@ class DatabaseComponentImpl implements DatabaseComponent { } } - public Settings getSettings() throws DbException { + public Settings getSettings(String namespace) throws DbException { lock.readLock().lock(); try { T txn = db.startTransaction(); try { - Settings s = db.getSettings(txn); + Settings s = db.getSettings(txn, namespace); db.commitTransaction(txn); return s; } catch (DbException e) { @@ -939,25 +919,6 @@ class DatabaseComponentImpl implements DatabaseComponent { } } - public void mergeConfig(TransportId t, TransportConfig c) - throws DbException { - lock.writeLock().lock(); - try { - T txn = db.startTransaction(); - try { - if (!db.containsTransport(txn, t)) - throw new NoSuchTransportException(); - db.mergeConfig(txn, t, c); - db.commitTransaction(txn); - } catch (DbException e) { - db.abortTransaction(txn); - throw e; - } - } finally { - lock.writeLock().unlock(); - } - } - public void mergeLocalProperties(TransportId t, TransportProperties p) throws DbException { boolean changed = false; @@ -982,14 +943,14 @@ class DatabaseComponentImpl implements DatabaseComponent { if (changed) eventBus.broadcast(new LocalTransportsUpdatedEvent()); } - public void mergeSettings(Settings s) throws DbException { + public void mergeSettings(Settings s, String namespace) throws DbException { boolean changed = false; lock.writeLock().lock(); try { T txn = db.startTransaction(); try { - if (!s.equals(db.getSettings(txn))) { - db.mergeSettings(txn, s); + if (!s.equals(db.getSettings(txn, namespace))) { + db.mergeSettings(txn, s, namespace); changed = true; } db.commitTransaction(txn); diff --git a/briar-core/src/org/briarproject/db/JdbcDatabase.java b/briar-core/src/org/briarproject/db/JdbcDatabase.java index d9a9a2f47..b4f5d7932 100644 --- a/briar-core/src/org/briarproject/db/JdbcDatabase.java +++ b/briar-core/src/org/briarproject/db/JdbcDatabase.java @@ -1,7 +1,6 @@ package org.briarproject.db; import org.briarproject.api.Settings; -import org.briarproject.api.TransportConfig; import org.briarproject.api.TransportId; import org.briarproject.api.TransportProperties; import org.briarproject.api.contact.Contact; @@ -64,14 +63,15 @@ import static org.briarproject.db.ExponentialBackoff.calculateExpiry; */ abstract class JdbcDatabase implements Database { - private static final int SCHEMA_VERSION = 11; - private static final int MIN_SCHEMA_VERSION = 10; + private static final int SCHEMA_VERSION = 12; + private static final int MIN_SCHEMA_VERSION = 12; private static final String CREATE_SETTINGS = "CREATE TABLE settings" + " (key VARCHAR NOT NULL," + " value VARCHAR NOT NULL," - + " PRIMARY KEY (key))"; + + " namespace VARCHAR NOT NULL," + + " PRIMARY KEY (key, namespace))"; private static final String CREATE_LOCAL_AUTHORS = "CREATE TABLE localAuthors" @@ -343,7 +343,7 @@ abstract class JdbcDatabase implements Database { Settings s = new Settings(); s.put("schemaVersion", String.valueOf(SCHEMA_VERSION)); s.put("minSchemaVersion", String.valueOf(MIN_SCHEMA_VERSION)); - mergeSettings(txn, s); + mergeSettings(txn, s, "db"); } commitTransaction(txn); } catch (DbException e) { @@ -354,7 +354,7 @@ abstract class JdbcDatabase implements Database { private boolean checkSchemaVersion(Connection txn) throws DbException { try { - Settings s = getSettings(txn); + Settings s = getSettings(txn, "db"); int schemaVersion = Integer.valueOf(s.get("schemaVersion")); if (schemaVersion == SCHEMA_VERSION) return true; if (schemaVersion < MIN_SCHEMA_VERSION) return false; @@ -1179,28 +1179,6 @@ abstract class JdbcDatabase implements Database { } } - public TransportConfig getConfig(Connection txn, TransportId t) - throws DbException { - PreparedStatement ps = null; - ResultSet rs = null; - try { - String sql = "SELECT key, value FROM transportConfigs" - + " WHERE transportId = ?"; - ps = txn.prepareStatement(sql); - ps.setString(1, t.getString()); - rs = ps.executeQuery(); - TransportConfig c = new TransportConfig(); - while (rs.next()) c.put(rs.getString(1), rs.getString(2)); - rs.close(); - ps.close(); - return c; - } catch (SQLException e) { - tryToClose(rs); - tryToClose(ps); - throw new DbException(e); - } - } - public Contact getContact(Connection txn, ContactId c) throws DbException { PreparedStatement ps = null; ResultSet rs = null; @@ -1921,12 +1899,13 @@ abstract class JdbcDatabase implements Database { } } - public Settings getSettings(Connection txn) throws DbException { + public Settings getSettings(Connection txn, String namespace) throws DbException { PreparedStatement ps = null; ResultSet rs = null; try { - String sql = "SELECT key, value FROM settings"; + String sql = "SELECT key, value FROM settings WHERE namespace = ?"; ps = txn.prepareStatement(sql); + ps.setString(1, namespace); rs = ps.executeQuery(); Settings s = new Settings(); while (rs.next()) s.put(rs.getString(1), rs.getString(2)); @@ -2373,12 +2352,6 @@ abstract class JdbcDatabase implements Database { } } - public void mergeConfig(Connection txn, TransportId t, TransportConfig c) - throws DbException { - // Merge the new configuration with the existing one - mergeStringMap(txn, t, c, "transportConfigs"); - } - public void mergeLocalProperties(Connection txn, TransportId t, TransportProperties p) throws DbException { // Merge the new properties with the existing ones @@ -2446,15 +2419,16 @@ abstract class JdbcDatabase implements Database { } } - public void mergeSettings(Connection txn, Settings s) throws DbException { + public void mergeSettings(Connection txn, Settings s, String namespace) throws DbException { PreparedStatement ps = null; try { // Update any settings that already exist - String sql = "UPDATE settings SET value = ? WHERE key = ?"; + String sql = "UPDATE settings SET value = ? WHERE key = ? AND namespace = ?"; ps = txn.prepareStatement(sql); for (Entry e : s.entrySet()) { ps.setString(1, e.getValue()); ps.setString(2, e.getKey()); + ps.setString(3, namespace); ps.addBatch(); } int[] batchAffected = ps.executeBatch(); @@ -2464,13 +2438,14 @@ abstract class JdbcDatabase implements Database { if (batchAffected[i] > 1) throw new DbStateException(); } // Insert any settings that don't already exist - sql = "INSERT INTO settings (key, value) VALUES (?, ?)"; + sql = "INSERT INTO settings (key, value, namespace) VALUES (?, ?, ?)"; ps = txn.prepareStatement(sql); int updateIndex = 0, inserted = 0; for (Entry e : s.entrySet()) { if (batchAffected[updateIndex] == 0) { ps.setString(1, e.getKey()); ps.setString(2, e.getValue()); + ps.setString(3, namespace); ps.addBatch(); inserted++; } diff --git a/briar-core/src/org/briarproject/plugins/PluginManagerImpl.java b/briar-core/src/org/briarproject/plugins/PluginManagerImpl.java index a780b887d..1bd9f805f 100644 --- a/briar-core/src/org/briarproject/plugins/PluginManagerImpl.java +++ b/briar-core/src/org/briarproject/plugins/PluginManagerImpl.java @@ -1,6 +1,5 @@ package org.briarproject.plugins; -import org.briarproject.api.TransportConfig; import org.briarproject.api.TransportId; import org.briarproject.api.TransportProperties; import org.briarproject.api.contact.ContactId; @@ -28,6 +27,8 @@ import org.briarproject.api.plugins.simplex.SimplexPluginFactory; import org.briarproject.api.property.TransportPropertyManager; import org.briarproject.api.system.Clock; import org.briarproject.api.ui.UiCallback; +import org.briarproject.api.Settings; +import org.briarproject.api.settings.SettingsManager; import java.io.IOException; import java.util.ArrayList; @@ -167,7 +168,9 @@ class PluginManagerImpl implements PluginManager { public void run() { try { TransportId id = factory.getId(); - SimplexCallback callback = new SimplexCallback(id); + String namespace = id.toString(); + + SimplexCallback callback = new SimplexCallback(id, namespace); SimplexPlugin plugin = factory.createPlugin(callback); if (plugin == null) { if (LOG.isLoggable(INFO)) { @@ -230,7 +233,8 @@ class PluginManagerImpl implements PluginManager { public void run() { try { TransportId id = factory.getId(); - DuplexCallback callback = new DuplexCallback(id); + String namespace = id.toString(); + DuplexCallback callback = new DuplexCallback(id, namespace); DuplexPlugin plugin = factory.createPlugin(callback); if (plugin == null) { if (LOG.isLoggable(INFO)) { @@ -309,18 +313,22 @@ class PluginManagerImpl implements PluginManager { private abstract class PluginCallbackImpl implements PluginCallback { protected final TransportId id; + protected final String namespace; - protected PluginCallbackImpl(TransportId id) { + protected PluginCallbackImpl(TransportId id, String namespace) { this.id = id; + this.namespace = namespace; } - public TransportConfig getConfig() { + public Settings getSettings() { + try { - return db.getConfig(id); + return db.getSettings(namespace); } catch (DbException e) { if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); - return new TransportConfig(); + return new Settings(); } + } public TransportProperties getLocalProperties() { @@ -343,12 +351,14 @@ class PluginManagerImpl implements PluginManager { } } - public void mergeConfig(TransportConfig c) { + public void mergeSettings(Settings s) { + try { - db.mergeConfig(id, c); + db.mergeSettings(s, namespace); } catch (DbException e) { if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); } + } public void mergeLocalProperties(TransportProperties p) { @@ -386,8 +396,8 @@ class PluginManagerImpl implements PluginManager { private class SimplexCallback extends PluginCallbackImpl implements SimplexPluginCallback { - private SimplexCallback(TransportId id) { - super(id); + private SimplexCallback(TransportId id, String namespace) { + super(id, namespace); } public void readerCreated(TransportConnectionReader r) { @@ -402,8 +412,8 @@ class PluginManagerImpl implements PluginManager { private class DuplexCallback extends PluginCallbackImpl implements DuplexPluginCallback { - private DuplexCallback(TransportId id) { - super(id); + private DuplexCallback(TransportId id, String namespace) { + super(id, namespace); } public void incomingConnectionCreated(DuplexTransportConnection d) { @@ -415,4 +425,4 @@ class PluginManagerImpl implements PluginManager { connectionManager.manageOutgoingConnection(c, id, d); } } -} \ No newline at end of file +} diff --git a/briar-core/src/org/briarproject/plugins/tcp/LanTcpPlugin.java b/briar-core/src/org/briarproject/plugins/tcp/LanTcpPlugin.java index 07dfac517..182c81e25 100644 --- a/briar-core/src/org/briarproject/plugins/tcp/LanTcpPlugin.java +++ b/briar-core/src/org/briarproject/plugins/tcp/LanTcpPlugin.java @@ -76,4 +76,4 @@ class LanTcpPlugin extends TcpPlugin { // Unrecognised prefix - may be compatible return true; } -} \ No newline at end of file +} diff --git a/briar-core/src/org/briarproject/settings/SettingsManagerImpl.java b/briar-core/src/org/briarproject/settings/SettingsManagerImpl.java new file mode 100644 index 000000000..6aa72c027 --- /dev/null +++ b/briar-core/src/org/briarproject/settings/SettingsManagerImpl.java @@ -0,0 +1,44 @@ +package org.briarproject.settings; + +import com.google.inject.Inject; + +import org.briarproject.api.settings.SettingsManager; +import org.briarproject.api.Settings; + +import org.briarproject.api.db.DatabaseComponent; +import org.briarproject.api.db.DbException; +import java.util.logging.Logger; + +import java.util.Collection; + +class SettingsManagerImpl implements SettingsManager { + + private final DatabaseComponent db; + private static final Logger LOG = + Logger.getLogger("SettingsManagerImpl"); + + @Inject + SettingsManagerImpl(DatabaseComponent db) { + this.db = db; + } + + /** + * Returns the settings object identified by the provided namespace + * string + */ + @Override + public Settings getSettings(String namespace) throws DbException { + return db.getSettings(namespace); + } + + /** + * Merges (read syncs) the provided settings identified by the provided namespace + * string + */ + @Override + public void mergeSettings(Settings s, String namespace) throws DbException { + db.mergeSettings(s, namespace); + } + + +} diff --git a/briar-core/src/org/briarproject/settings/SettingsModule.java b/briar-core/src/org/briarproject/settings/SettingsModule.java new file mode 100644 index 000000000..f2d0e2b46 --- /dev/null +++ b/briar-core/src/org/briarproject/settings/SettingsModule.java @@ -0,0 +1,13 @@ +package org.briarproject.settings; + +import com.google.inject.AbstractModule; + +import org.briarproject.api.settings.SettingsManager; + +public class SettingsModule extends AbstractModule { + + @Override + protected void configure() { + bind(SettingsManager.class).to(SettingsManagerImpl.class); + } +} diff --git a/briar-desktop/src/org/briarproject/plugins/modem/ModemPluginFactory.java b/briar-desktop/src/org/briarproject/plugins/modem/ModemPluginFactory.java index 58b2d75f3..2e9561c07 100644 --- a/briar-desktop/src/org/briarproject/plugins/modem/ModemPluginFactory.java +++ b/briar-desktop/src/org/briarproject/plugins/modem/ModemPluginFactory.java @@ -28,7 +28,7 @@ public class ModemPluginFactory implements DuplexPluginFactory { public DuplexPlugin createPlugin(DuplexPluginCallback callback) { // This plugin is not enabled by default - String enabled = callback.getConfig().get("enabled"); + String enabled = callback.getSettings().get("enabled"); if (StringUtils.isNullOrEmpty(enabled)) return null; return new ModemPlugin(modemFactory, serialPortList, callback, MAX_LATENCY); diff --git a/briar-tests/src/org/briarproject/db/DatabaseComponentImplTest.java b/briar-tests/src/org/briarproject/db/DatabaseComponentImplTest.java index 98115c6c7..ba44df116 100644 --- a/briar-tests/src/org/briarproject/db/DatabaseComponentImplTest.java +++ b/briar-tests/src/org/briarproject/db/DatabaseComponentImplTest.java @@ -3,7 +3,7 @@ package org.briarproject.db; import org.briarproject.BriarTestCase; import org.briarproject.TestMessage; import org.briarproject.TestUtils; -import org.briarproject.api.TransportConfig; +import org.briarproject.api.Settings; import org.briarproject.api.TransportId; import org.briarproject.api.TransportProperties; import org.briarproject.api.contact.Contact; @@ -611,13 +611,13 @@ public class DatabaseComponentImplTest extends BriarTestCase { oneOf(database).commitTransaction(txn); oneOf(eventBus).broadcast(with(any(ContactAddedEvent.class))); // Check whether the transport is in the DB (which it's not) - exactly(8).of(database).startTransaction(); + exactly(6).of(database).startTransaction(); will(returnValue(txn)); exactly(2).of(database).containsContact(txn, contactId); will(returnValue(true)); - exactly(8).of(database).containsTransport(txn, transportId); + exactly(6).of(database).containsTransport(txn, transportId); will(returnValue(false)); - exactly(8).of(database).abortTransaction(txn); + exactly(6).of(database).abortTransaction(txn); }}); DatabaseComponent db = createDatabaseComponent(database, eventBus, shutdown); @@ -625,13 +625,6 @@ public class DatabaseComponentImplTest extends BriarTestCase { db.addLocalAuthor(localAuthor); assertEquals(contactId, db.addContact(author, localAuthorId)); - try { - db.getConfig(transportId); - fail(); - } catch (NoSuchTransportException expected) { - // Expected - } - try { db.getLocalProperties(transportId); fail(); @@ -646,13 +639,6 @@ public class DatabaseComponentImplTest extends BriarTestCase { // Expected } - try { - db.mergeConfig(transportId, new TransportConfig()); - fail(); - } catch (NoSuchTransportException expected) { - // Expected - } - try { db.mergeLocalProperties(transportId, new TransportProperties()); fail(); diff --git a/briar-tests/src/org/briarproject/db/H2DatabaseTest.java b/briar-tests/src/org/briarproject/db/H2DatabaseTest.java index 41efa0ec6..35076d6f2 100644 --- a/briar-tests/src/org/briarproject/db/H2DatabaseTest.java +++ b/briar-tests/src/org/briarproject/db/H2DatabaseTest.java @@ -4,7 +4,6 @@ import org.briarproject.BriarTestCase; import org.briarproject.TestDatabaseConfig; import org.briarproject.TestMessage; import org.briarproject.TestUtils; -import org.briarproject.api.TransportConfig; import org.briarproject.api.TransportId; import org.briarproject.api.TransportProperties; import org.briarproject.api.contact.ContactId; @@ -21,6 +20,7 @@ import org.briarproject.api.sync.MessageId; import org.briarproject.api.transport.IncomingKeys; import org.briarproject.api.transport.OutgoingKeys; import org.briarproject.api.transport.TransportKeys; +import org.briarproject.api.Settings; import org.briarproject.system.SystemClock; import org.junit.After; import org.junit.Before; @@ -568,7 +568,7 @@ public class H2DatabaseTest extends BriarTestCase { } @Test - public void testUpdateTransportConfig() throws Exception { + public void testUpdateSettings() throws Exception { Database db = open(false); Connection txn = db.startTransaction(); @@ -576,22 +576,22 @@ public class H2DatabaseTest extends BriarTestCase { db.addTransport(txn, transportId, 123); // Set the transport config - TransportConfig c = new TransportConfig(); - c.put("foo", "foo"); - c.put("bar", "bar"); - db.mergeConfig(txn, transportId, c); - assertEquals(c, db.getConfig(txn, transportId)); + Settings s = new Settings(); + s.put("foo", "foo"); + s.put("bar", "bar"); + db.mergeSettings(txn, s, "test"); + assertEquals(s, db.getSettings(txn, "test")); // Update one of the properties and add another - TransportConfig c1 = new TransportConfig(); - c1.put("bar", "baz"); - c1.put("bam", "bam"); - db.mergeConfig(txn, transportId, c1); - TransportConfig merged = new TransportConfig(); + Settings s1 = new Settings(); + s1.put("bar", "baz"); + s1.put("bam", "bam"); + db.mergeSettings(txn, s1, "test"); + Settings merged = new Settings(); merged.put("foo", "foo"); merged.put("bar", "baz"); merged.put("bam", "bam"); - assertEquals(merged, db.getConfig(txn, transportId)); + assertEquals(merged, db.getSettings(txn, "test")); db.commitTransaction(txn); db.close(); diff --git a/briar-tests/src/org/briarproject/plugins/DuplexClientTest.java b/briar-tests/src/org/briarproject/plugins/DuplexClientTest.java index 640632b4d..ebfedddbd 100644 --- a/briar-tests/src/org/briarproject/plugins/DuplexClientTest.java +++ b/briar-tests/src/org/briarproject/plugins/DuplexClientTest.java @@ -1,6 +1,6 @@ package org.briarproject.plugins; -import org.briarproject.api.TransportConfig; +import org.briarproject.api.Settings; import org.briarproject.api.TransportProperties; import org.briarproject.api.contact.ContactId; import org.briarproject.api.crypto.PseudoRandom; @@ -58,19 +58,19 @@ public abstract class DuplexClientTest extends DuplexTest { protected static class ClientCallback implements DuplexPluginCallback { - private TransportConfig config = null; + private Settings settings = null; private TransportProperties local = null; private Map remote = null; - public ClientCallback(TransportConfig config, TransportProperties local, + public ClientCallback(Settings settings, TransportProperties local, Map remote) { - this.config = config; + this.settings = settings; this.local = local; this.remote = remote; } - public TransportConfig getConfig() { - return config; + public Settings getSettings() { + return settings; } public TransportProperties getLocalProperties() { @@ -81,8 +81,8 @@ public abstract class DuplexClientTest extends DuplexTest { return remote; } - public void mergeConfig(TransportConfig c) { - config = c; + public void mergeSettings(Settings s) { + settings = s; } public void mergeLocalProperties(TransportProperties p) { diff --git a/briar-tests/src/org/briarproject/plugins/DuplexServerTest.java b/briar-tests/src/org/briarproject/plugins/DuplexServerTest.java index 134bf36b6..fe2323c1b 100644 --- a/briar-tests/src/org/briarproject/plugins/DuplexServerTest.java +++ b/briar-tests/src/org/briarproject/plugins/DuplexServerTest.java @@ -1,6 +1,6 @@ package org.briarproject.plugins; -import org.briarproject.api.TransportConfig; +import org.briarproject.api.Settings; import org.briarproject.api.TransportProperties; import org.briarproject.api.contact.ContactId; import org.briarproject.api.plugins.duplex.DuplexPluginCallback; @@ -57,19 +57,19 @@ public abstract class DuplexServerTest extends DuplexTest { private final CountDownLatch latch = new CountDownLatch(1); - private TransportConfig config; + private Settings settings; private TransportProperties local; private Map remote; - public ServerCallback(TransportConfig config, TransportProperties local, + public ServerCallback(Settings settings, TransportProperties local, Map remote) { - this.config = config; + this.settings = settings; this.local = local; this.remote = remote; } - public TransportConfig getConfig() { - return config; + public Settings getSettings() { + return settings; } public TransportProperties getLocalProperties() { @@ -80,8 +80,8 @@ public abstract class DuplexServerTest extends DuplexTest { return remote; } - public void mergeConfig(TransportConfig c) { - config = c; + public void mergeSettings(Settings s) { + settings = s; } public void mergeLocalProperties(TransportProperties p) { diff --git a/briar-tests/src/org/briarproject/plugins/bluetooth/BluetoothClientTest.java b/briar-tests/src/org/briarproject/plugins/bluetooth/BluetoothClientTest.java index 02e0a343e..caf7f7514 100644 --- a/briar-tests/src/org/briarproject/plugins/bluetooth/BluetoothClientTest.java +++ b/briar-tests/src/org/briarproject/plugins/bluetooth/BluetoothClientTest.java @@ -1,6 +1,6 @@ package org.briarproject.plugins.bluetooth; -import org.briarproject.api.TransportConfig; +import org.briarproject.api.Settings; import org.briarproject.api.TransportProperties; import org.briarproject.api.contact.ContactId; import org.briarproject.plugins.DuplexClientTest; @@ -25,7 +25,7 @@ public class BluetoothClientTest extends DuplexClientTest { Map remote = Collections.singletonMap(contactId, p); // Create the plugin - callback = new ClientCallback(new TransportConfig(), + callback = new ClientCallback(new Settings(), new TransportProperties(), remote); plugin = new BluetoothPlugin(executor, new SystemClock(), new SecureRandom(), callback, 0, 0); diff --git a/briar-tests/src/org/briarproject/plugins/bluetooth/BluetoothServerTest.java b/briar-tests/src/org/briarproject/plugins/bluetooth/BluetoothServerTest.java index 671a0a413..ca71e8cf0 100644 --- a/briar-tests/src/org/briarproject/plugins/bluetooth/BluetoothServerTest.java +++ b/briar-tests/src/org/briarproject/plugins/bluetooth/BluetoothServerTest.java @@ -1,6 +1,6 @@ package org.briarproject.plugins.bluetooth; -import org.briarproject.api.TransportConfig; +import org.briarproject.api.Settings; import org.briarproject.api.TransportProperties; import org.briarproject.plugins.DuplexServerTest; import org.briarproject.system.SystemClock; @@ -20,7 +20,7 @@ public class BluetoothServerTest extends DuplexServerTest { TransportProperties local = new TransportProperties(); local.put("uuid", BluetoothTest.EMPTY_UUID); // Create the plugin - callback = new ServerCallback(new TransportConfig(), local, + callback = new ServerCallback(new Settings(), local, Collections.singletonMap(contactId, new TransportProperties())); plugin = new BluetoothPlugin(executor, new SystemClock(), new SecureRandom(), callback, 0, 0); diff --git a/briar-tests/src/org/briarproject/plugins/tcp/LanTcpClientTest.java b/briar-tests/src/org/briarproject/plugins/tcp/LanTcpClientTest.java index 4975d78c1..8ad17b59c 100644 --- a/briar-tests/src/org/briarproject/plugins/tcp/LanTcpClientTest.java +++ b/briar-tests/src/org/briarproject/plugins/tcp/LanTcpClientTest.java @@ -1,6 +1,6 @@ package org.briarproject.plugins.tcp; -import org.briarproject.api.TransportConfig; +import org.briarproject.api.Settings; import org.briarproject.api.TransportProperties; import org.briarproject.api.contact.ContactId; import org.briarproject.plugins.DuplexClientTest; @@ -28,7 +28,7 @@ public class LanTcpClientTest extends DuplexClientTest { Map remote = Collections.singletonMap(contactId, p); // Create the plugin - callback = new ClientCallback(new TransportConfig(), + callback = new ClientCallback(new Settings(), new TransportProperties(), remote); plugin = new LanTcpPlugin(executor, callback, MAX_LATENCY, MAX_IDLE_TIME, POLLING_INTERVAL); diff --git a/briar-tests/src/org/briarproject/plugins/tcp/LanTcpPluginTest.java b/briar-tests/src/org/briarproject/plugins/tcp/LanTcpPluginTest.java index 96f730d3c..cd52f2622 100644 --- a/briar-tests/src/org/briarproject/plugins/tcp/LanTcpPluginTest.java +++ b/briar-tests/src/org/briarproject/plugins/tcp/LanTcpPluginTest.java @@ -1,7 +1,7 @@ package org.briarproject.plugins.tcp; import org.briarproject.BriarTestCase; -import org.briarproject.api.TransportConfig; +import org.briarproject.api.Settings; import org.briarproject.api.TransportProperties; import org.briarproject.api.contact.ContactId; import org.briarproject.api.plugins.duplex.DuplexPlugin; @@ -176,8 +176,8 @@ public class LanTcpPluginTest extends BriarTestCase { private final CountDownLatch connectionsLatch = new CountDownLatch(1); private final TransportProperties local = new TransportProperties(); - public TransportConfig getConfig() { - return new TransportConfig(); + public Settings getSettings() { + return new Settings(); } public TransportProperties getLocalProperties() { @@ -188,7 +188,7 @@ public class LanTcpPluginTest extends BriarTestCase { return remote; } - public void mergeConfig(TransportConfig c) {} + public void mergeSettings(Settings s) {} public void mergeLocalProperties(TransportProperties p) { local.putAll(p); diff --git a/briar-tests/src/org/briarproject/plugins/tcp/LanTcpServerTest.java b/briar-tests/src/org/briarproject/plugins/tcp/LanTcpServerTest.java index 3a48a71c9..b415cc194 100644 --- a/briar-tests/src/org/briarproject/plugins/tcp/LanTcpServerTest.java +++ b/briar-tests/src/org/briarproject/plugins/tcp/LanTcpServerTest.java @@ -1,6 +1,6 @@ package org.briarproject.plugins.tcp; -import org.briarproject.api.TransportConfig; +import org.briarproject.api.Settings; import org.briarproject.api.TransportProperties; import org.briarproject.plugins.DuplexServerTest; @@ -18,7 +18,7 @@ public class LanTcpServerTest extends DuplexServerTest { private static final int POLLING_INTERVAL = 60 * 1000; private LanTcpServerTest(Executor executor) { - callback = new ServerCallback(new TransportConfig(), + callback = new ServerCallback(new Settings(), new TransportProperties(), Collections.singletonMap(contactId, new TransportProperties())); plugin = new LanTcpPlugin(executor, callback, MAX_LATENCY,