You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by or...@apache.org on 2013/09/14 13:25:57 UTC

svn commit: r1523218 - in /qpid/trunk/qpid/java: broker/src/main/java/org/apache/qpid/server/configuration/startup/ broker/src/main/java/org/apache/qpid/server/configuration/store/ broker/src/main/java/org/apache/qpid/server/model/ broker/src/main/java...

Author: orudyy
Date: Sat Sep 14 11:25:57 2013
New Revision: 1523218

URL: http://svn.apache.org/r1523218
Log:
QPID-5138: Integrate preferences provider into Broker model, create association between preferences provider and authentication provider, add preferences provider recoverer and factory

Added:
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/PreferencesProviderRecoverer.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/FileSystemPreferencesProviderFactory.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/PreferencesProviderCreator.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/plugin/PreferencesProviderFactory.java
    qpid/trunk/qpid/java/broker/src/main/resources/META-INF/services/org.apache.qpid.server.plugin.PreferencesProviderFactory
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/AuthenticationProviderRecovererTest.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/PreferencesProviderRecovererTest.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/model/adapter/FileSystemPreferencesProviderFactoryTest.java
Modified:
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/AuthenticationProviderRecoverer.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/BrokerRecoverer.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/DefaultRecovererProvider.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/store/MemoryConfigurationEntryStore.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/AuthenticationProvider.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Broker.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Model.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/UUIDGenerator.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/User.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AuthenticationProviderAdapter.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AuthenticationProviderFactory.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java
    qpid/trunk/qpid/java/broker/src/main/resources/initial-config.json
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/BrokerRecovererTest.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/DefaultRecovererProviderTest.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/model/ConfiguredObjectStateTransitionTest.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/model/adapter/AuthenticationProviderFactoryTest.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/TestBrokerConfiguration.java

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/AuthenticationProviderRecoverer.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/AuthenticationProviderRecoverer.java?rev=1523218&r1=1523217&r2=1523218&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/AuthenticationProviderRecoverer.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/AuthenticationProviderRecoverer.java Sat Sep 14 11:25:57 2013
@@ -20,23 +20,29 @@
  */
 package org.apache.qpid.server.configuration.startup;
 
+import java.util.Collection;
 import java.util.Map;
 
 import org.apache.qpid.server.configuration.ConfigurationEntry;
 import org.apache.qpid.server.configuration.ConfiguredObjectRecoverer;
+import org.apache.qpid.server.configuration.IllegalConfigurationException;
 import org.apache.qpid.server.configuration.RecovererProvider;
+import org.apache.qpid.server.configuration.store.StoreConfigurationChangeListener;
 import org.apache.qpid.server.model.AuthenticationProvider;
 import org.apache.qpid.server.model.Broker;
 import org.apache.qpid.server.model.ConfiguredObject;
+import org.apache.qpid.server.model.PreferencesProvider;
 import org.apache.qpid.server.model.adapter.AuthenticationProviderFactory;
 
 public class AuthenticationProviderRecoverer implements ConfiguredObjectRecoverer<AuthenticationProvider>
 {
     private final AuthenticationProviderFactory _authenticationProviderFactory;
+    private final StoreConfigurationChangeListener _storeChangeListener;
 
-    public AuthenticationProviderRecoverer(AuthenticationProviderFactory authenticationProviderFactory)
+    public AuthenticationProviderRecoverer(AuthenticationProviderFactory authenticationProviderFactory,  StoreConfigurationChangeListener storeChangeListener)
     {
         _authenticationProviderFactory = authenticationProviderFactory;
+        _storeChangeListener = storeChangeListener;
     }
 
     @Override
@@ -46,6 +52,44 @@ public class AuthenticationProviderRecov
         Map<String, Object> attributes = configurationEntry.getAttributes();
         AuthenticationProvider authenticationProvider = _authenticationProviderFactory.recover(configurationEntry.getId(), attributes, broker);
 
+        Map<String, Collection<ConfigurationEntry>> childEntries = configurationEntry.getChildren();
+
+        for (String type : childEntries.keySet())
+        {
+            recoverType(recovererProvider, _storeChangeListener, authenticationProvider, childEntries, type);
+        }
+
         return authenticationProvider;
     }
+
+    private void recoverType(RecovererProvider recovererProvider,
+            StoreConfigurationChangeListener storeChangeListener,
+            AuthenticationProvider authenticationProvider,
+            Map<String, Collection<ConfigurationEntry>> childEntries,
+            String type)
+    {
+        ConfiguredObjectRecoverer<?> recoverer = recovererProvider.getRecoverer(type);
+        if (recoverer == null)
+        {
+            throw new IllegalConfigurationException("Cannot recover entry for the type '" + type + "' from broker");
+        }
+        Collection<ConfigurationEntry> entries = childEntries.get(type);
+        for (ConfigurationEntry childEntry : entries)
+        {
+            ConfiguredObject object = recoverer.create(recovererProvider, childEntry, authenticationProvider);
+            if (object == null)
+            {
+                throw new IllegalConfigurationException("Cannot create configured object for the entry " + childEntry);
+            }
+            if (object instanceof PreferencesProvider)
+            {
+                authenticationProvider.setPreferencesProvider((PreferencesProvider)object);
+            }
+            else
+            {
+                throw new IllegalConfigurationException("Cannot associate  " + object + " with authentication provider " + authenticationProvider);
+            }
+            object.addChangeListener(storeChangeListener);
+        }
+    }
 }

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/BrokerRecoverer.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/BrokerRecoverer.java?rev=1523218&r1=1523217&r2=1523218&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/BrokerRecoverer.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/BrokerRecoverer.java Sat Sep 14 11:25:57 2013
@@ -47,6 +47,7 @@ import org.apache.qpid.server.model.adap
 import org.apache.qpid.server.model.adapter.BrokerAdapter;
 import org.apache.qpid.server.model.adapter.GroupProviderFactory;
 import org.apache.qpid.server.model.adapter.PortFactory;
+import org.apache.qpid.server.model.adapter.PreferencesProviderCreator;
 import org.apache.qpid.server.stats.StatisticsGatherer;
 import org.apache.qpid.server.util.MapValueConverter;
 import org.apache.qpid.server.virtualhost.VirtualHostRegistry;
@@ -65,10 +66,13 @@ public class BrokerRecoverer implements 
     private final TaskExecutor _taskExecutor;
     private final BrokerOptions _brokerOptions;
     private final GroupProviderFactory _groupProviderFactory;
+    private final StoreConfigurationChangeListener _storeChangeListener;
+    private final PreferencesProviderCreator _preferencesProviderCreator;
 
     public BrokerRecoverer(AuthenticationProviderFactory authenticationProviderFactory, GroupProviderFactory groupProviderFactory,
-            AccessControlProviderFactory accessControlProviderFactory, PortFactory portFactory, StatisticsGatherer statisticsGatherer,
-            VirtualHostRegistry virtualHostRegistry, LogRecorder logRecorder, RootMessageLogger rootMessageLogger, TaskExecutor taskExecutor, BrokerOptions brokerOptions)
+            AccessControlProviderFactory accessControlProviderFactory, PortFactory portFactory, PreferencesProviderCreator preferencesProviderFactory, StatisticsGatherer statisticsGatherer,
+            VirtualHostRegistry virtualHostRegistry, LogRecorder logRecorder, RootMessageLogger rootMessageLogger, TaskExecutor taskExecutor,
+            BrokerOptions brokerOptions, StoreConfigurationChangeListener storeChangeListener)
     {
         _groupProviderFactory = groupProviderFactory;
         _portFactory = portFactory;
@@ -80,6 +84,8 @@ public class BrokerRecoverer implements 
         _rootMessageLogger = rootMessageLogger;
         _taskExecutor = taskExecutor;
         _brokerOptions = brokerOptions;
+        _storeChangeListener = storeChangeListener;
+        _preferencesProviderCreator = preferencesProviderFactory;
     }
 
     @Override
@@ -90,12 +96,11 @@ public class BrokerRecoverer implements 
 
         attributesCopy.put(Broker.MODEL_VERSION, Model.MODEL_VERSION);
 
-        StoreConfigurationChangeListener storeChangeListener = new StoreConfigurationChangeListener(entry.getStore());
         BrokerAdapter broker = new BrokerAdapter(entry.getId(), attributesCopy, _statisticsGatherer, _virtualHostRegistry,
-                _logRecorder, _rootMessageLogger, _authenticationProviderFactory, _groupProviderFactory, _accessControlProviderFactory,
-                _portFactory, _taskExecutor, entry.getStore(), _brokerOptions);
+                _logRecorder, _rootMessageLogger, _authenticationProviderFactory,_groupProviderFactory, _accessControlProviderFactory,
+                _portFactory , _preferencesProviderCreator, _taskExecutor, entry.getStore(), _brokerOptions);
 
-        broker.addChangeListener(storeChangeListener);
+        broker.addChangeListener(_storeChangeListener);
 
         //Recover the SSL keystores / truststores first, then others that depend on them
         Map<String, Collection<ConfigurationEntry>> childEntries = new HashMap<String, Collection<ConfigurationEntry>>(entry.getChildren());
@@ -117,11 +122,11 @@ public class BrokerRecoverer implements 
 
         for (String type : priorityChildEntries.keySet())
         {
-            recoverType(recovererProvider, storeChangeListener, broker, priorityChildEntries, type);
+            recoverType(recovererProvider, _storeChangeListener, broker, priorityChildEntries, type);
         }
         for (String type : childEntries.keySet())
         {
-            recoverType(recovererProvider, storeChangeListener, broker, childEntries, type);
+            recoverType(recovererProvider, _storeChangeListener, broker, childEntries, type);
         }
 
         return broker;

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/DefaultRecovererProvider.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/DefaultRecovererProvider.java?rev=1523218&r1=1523217&r2=1523218&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/DefaultRecovererProvider.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/DefaultRecovererProvider.java Sat Sep 14 11:25:57 2013
@@ -32,12 +32,15 @@ import org.apache.qpid.server.model.Grou
 import org.apache.qpid.server.model.KeyStore;
 import org.apache.qpid.server.model.Plugin;
 import org.apache.qpid.server.model.Port;
+import org.apache.qpid.server.model.PreferencesProvider;
 import org.apache.qpid.server.model.TrustStore;
 import org.apache.qpid.server.model.VirtualHost;
 import org.apache.qpid.server.model.adapter.AccessControlProviderFactory;
 import org.apache.qpid.server.model.adapter.AuthenticationProviderFactory;
 import org.apache.qpid.server.model.adapter.GroupProviderFactory;
 import org.apache.qpid.server.model.adapter.PortFactory;
+import org.apache.qpid.server.model.adapter.PreferencesProviderCreator;
+import org.apache.qpid.server.configuration.store.StoreConfigurationChangeListener;
 import org.apache.qpid.server.configuration.updater.TaskExecutor;
 import org.apache.qpid.server.plugin.AccessControlFactory;
 import org.apache.qpid.server.plugin.AuthenticationManagerFactory;
@@ -61,11 +64,14 @@ public class DefaultRecovererProvider im
     private final QpidServiceLoader<PluginFactory> _pluginFactoryServiceLoader;
     private final TaskExecutor _taskExecutor;
     private final BrokerOptions _brokerOptions;
+    private final StoreConfigurationChangeListener _storeChangeListener;
+    private final PreferencesProviderCreator _preferencesProviderCreator;
 
     public DefaultRecovererProvider(StatisticsGatherer brokerStatisticsGatherer, VirtualHostRegistry virtualHostRegistry,
-            LogRecorder logRecorder, RootMessageLogger rootMessageLogger, TaskExecutor taskExecutor, BrokerOptions brokerOptions)
+            LogRecorder logRecorder, RootMessageLogger rootMessageLogger, TaskExecutor taskExecutor, BrokerOptions brokerOptions, StoreConfigurationChangeListener storeChangeListener)
     {
-        _authenticationProviderFactory = new AuthenticationProviderFactory(new QpidServiceLoader<AuthenticationManagerFactory>());
+        _preferencesProviderCreator = new PreferencesProviderCreator();
+        _authenticationProviderFactory = new AuthenticationProviderFactory(new QpidServiceLoader<AuthenticationManagerFactory>(), _preferencesProviderCreator);
         _accessControlProviderFactory = new AccessControlProviderFactory(new QpidServiceLoader<AccessControlFactory>());
         _groupProviderFactory = new GroupProviderFactory(new QpidServiceLoader<GroupManagerFactory>());
         _portFactory = new PortFactory();
@@ -76,6 +82,7 @@ public class DefaultRecovererProvider im
         _pluginFactoryServiceLoader = new QpidServiceLoader<PluginFactory>();
         _taskExecutor = taskExecutor;
         _brokerOptions = brokerOptions;
+        _storeChangeListener = storeChangeListener;
     }
 
     @Override
@@ -83,8 +90,8 @@ public class DefaultRecovererProvider im
     {
         if (Broker.class.getSimpleName().equals(type))
         {
-            return new BrokerRecoverer(_authenticationProviderFactory, _groupProviderFactory, _accessControlProviderFactory, _portFactory, _brokerStatisticsGatherer,
-                    _virtualHostRegistry, _logRecorder, _rootMessageLogger, _taskExecutor, _brokerOptions);
+            return new BrokerRecoverer(_authenticationProviderFactory, _groupProviderFactory, _accessControlProviderFactory, _portFactory, _preferencesProviderCreator,
+                    _brokerStatisticsGatherer, _virtualHostRegistry, _logRecorder, _rootMessageLogger, _taskExecutor, _brokerOptions, _storeChangeListener);
         }
         else if(VirtualHost.class.getSimpleName().equals(type))
         {
@@ -96,7 +103,7 @@ public class DefaultRecovererProvider im
         }
         else if(AuthenticationProvider.class.getSimpleName().equals(type))
         {
-            return new AuthenticationProviderRecoverer(_authenticationProviderFactory);
+            return new AuthenticationProviderRecoverer(_authenticationProviderFactory, _storeChangeListener);
         }
         else if(Port.class.getSimpleName().equals(type))
         {
@@ -114,6 +121,10 @@ public class DefaultRecovererProvider im
         {
             return new TrustStoreRecoverer();
         }
+        else if(PreferencesProvider.class.getSimpleName().equals(type))
+        {
+            return new PreferencesProviderRecoverer(_preferencesProviderCreator);
+        }
         else if(Plugin.class.getSimpleName().equals(type))
         {
             return new PluginRecoverer(_pluginFactoryServiceLoader);

Added: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/PreferencesProviderRecoverer.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/PreferencesProviderRecoverer.java?rev=1523218&view=auto
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/PreferencesProviderRecoverer.java (added)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/PreferencesProviderRecoverer.java Sat Sep 14 11:25:57 2013
@@ -0,0 +1,41 @@
+package org.apache.qpid.server.configuration.startup;
+
+import org.apache.qpid.server.configuration.ConfigurationEntry;
+import org.apache.qpid.server.configuration.ConfiguredObjectRecoverer;
+import org.apache.qpid.server.configuration.RecovererProvider;
+import org.apache.qpid.server.model.AuthenticationProvider;
+import org.apache.qpid.server.model.ConfiguredObject;
+import org.apache.qpid.server.model.PreferencesProvider;
+import org.apache.qpid.server.model.adapter.PreferencesProviderCreator;
+
+public class PreferencesProviderRecoverer implements ConfiguredObjectRecoverer<PreferencesProvider>
+{
+
+    private PreferencesProviderCreator _preferencesProviderCreator;
+
+    public PreferencesProviderRecoverer(PreferencesProviderCreator preferencesProviderCreator)
+    {
+        _preferencesProviderCreator = preferencesProviderCreator;
+    }
+
+    @Override
+    public PreferencesProvider create(RecovererProvider recovererProvider, ConfigurationEntry entry,
+            ConfiguredObject... parents)
+    {
+        if (parents == null || parents.length == 0)
+        {
+            throw new IllegalArgumentException("AuthenticationProvider parent is not passed!");
+        }
+        if (parents.length != 1)
+        {
+            throw new IllegalArgumentException("Only one parent is expected!");
+        }
+        if (!(parents[0] instanceof AuthenticationProvider))
+        {
+            throw new IllegalArgumentException("Parent is not a AuthenticationProvider");
+        }
+        AuthenticationProvider authenticationProvider = (AuthenticationProvider)parents[0];
+        return _preferencesProviderCreator.recover(entry.getId(), entry.getAttributes(), authenticationProvider);
+    }
+
+}

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/store/MemoryConfigurationEntryStore.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/store/MemoryConfigurationEntryStore.java?rev=1523218&r1=1523217&r2=1523218&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/store/MemoryConfigurationEntryStore.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/store/MemoryConfigurationEntryStore.java Sat Sep 14 11:25:57 2013
@@ -291,7 +291,7 @@ public class MemoryConfigurationEntrySto
                         + " can not be loaded by store of version " + STORE_VERSION);
             }
 
-            ConfigurationEntry brokerEntry = toEntry(node, Broker.class, _entries);
+            ConfigurationEntry brokerEntry = toEntry(node, Broker.class, _entries, null);
             _rootId = brokerEntry.getId();
         }
         catch (IOException e)
@@ -370,7 +370,7 @@ public class MemoryConfigurationEntrySto
             byte[] bytes = json.getBytes("UTF-8");
             bais = new ByteArrayInputStream(bytes);
             JsonNode node = loadJsonNodes(bais, _objectMapper);
-            ConfigurationEntry brokerEntry = toEntry(node, Broker.class, _entries);
+            ConfigurationEntry brokerEntry = toEntry(node, Broker.class, _entries, null);
             _rootId = brokerEntry.getId();
         }
         catch(Exception e)
@@ -490,7 +490,7 @@ public class MemoryConfigurationEntrySto
         return root;
     }
 
-    private ConfigurationEntry toEntry(JsonNode parent, Class<? extends ConfiguredObject> expectedConfiguredObjectClass, Map<UUID, ConfigurationEntry> entries)
+    private ConfigurationEntry toEntry(JsonNode parent, Class<? extends ConfiguredObject> expectedConfiguredObjectClass, Map<UUID, ConfigurationEntry> entries, Class<? extends ConfiguredObject> parentClass)
     {
         Map<String, Object> attributes = null;
         Set<UUID> childrenIds = new TreeSet<UUID>();
@@ -520,8 +520,22 @@ public class MemoryConfigurationEntrySto
                     if (element.isObject())
                     {
                         Class<? extends ConfiguredObject> expectedChildConfiguredObjectClass = _relationshipClasses.get(fieldName);
+                        if (expectedChildConfiguredObjectClass == null && expectedConfiguredObjectClass != null)
+                        {
+                            Collection<Class<? extends ConfiguredObject>> childTypes = Model.getInstance().getChildTypes(expectedConfiguredObjectClass);
+                            for (Class<? extends ConfiguredObject> childType : childTypes)
+                            {
+                                String relationship = childType.getSimpleName().toLowerCase();
+                                relationship += relationship.endsWith("s") ? "es": "s";
+                                if (fieldName.equals(relationship))
+                                {
+                                    expectedChildConfiguredObjectClass = childType;
+                                    break;
+                                }
+                            }
+                        }
                         // assuming it is a child node
-                        ConfigurationEntry entry = toEntry(element, expectedChildConfiguredObjectClass, entries);
+                        ConfigurationEntry entry = toEntry(element, expectedChildConfiguredObjectClass, entries, expectedConfiguredObjectClass);
                         childrenIds.add(entry.getId());
                     }
                     else

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/AuthenticationProvider.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/AuthenticationProvider.java?rev=1523218&r1=1523217&r2=1523218&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/AuthenticationProvider.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/AuthenticationProvider.java Sat Sep 14 11:25:57 2013
@@ -66,4 +66,15 @@ public interface AuthenticationProvider 
      */
     SubjectCreator getSubjectCreator();
 
+    /**
+     * Returns the preferences provider associated with this authentication provider
+     * @return PreferencesProvider
+     */
+    PreferencesProvider getPreferencesProvider();
+
+    /**
+     * Sets the preferences provider
+     * @param preferencesProvider
+     */
+    void setPreferencesProvider(PreferencesProvider preferencesProvider);
 }

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Broker.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Broker.java?rev=1523218&r1=1523217&r2=1523218&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Broker.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Broker.java Sat Sep 14 11:25:57 2013
@@ -45,6 +45,7 @@ public interface Broker extends Configur
     String SUPPORTED_VIRTUALHOST_TYPES = "supportedVirtualHostTypes";
     String SUPPORTED_VIRTUALHOST_STORE_TYPES = "supportedVirtualHostStoreTypes";
     String SUPPORTED_AUTHENTICATION_PROVIDERS = "supportedAuthenticationProviders";
+    String SUPPORTED_PREFERENCES_PROVIDERS_TYPES = "supportedPreferencesProviderTypes";
     String CREATED = "created";
     String DURABLE = "durable";
     String ID = "id";
@@ -93,6 +94,7 @@ public interface Broker extends Configur
                               SUPPORTED_BROKER_STORE_TYPES,
                               SUPPORTED_VIRTUALHOST_STORE_TYPES,
                               SUPPORTED_AUTHENTICATION_PROVIDERS,
+                              SUPPORTED_PREFERENCES_PROVIDERS_TYPES,
                               CREATED,
                               DURABLE,
                               ID,
@@ -183,4 +185,6 @@ public interface Broker extends Configur
     TaskExecutor getTaskExecutor();
 
     boolean isManagementMode();
+
+    AuthenticationProvider getAuthenticationProvider(SocketAddress localAddress);
 }

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Model.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Model.java?rev=1523218&r1=1523217&r2=1523218&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Model.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Model.java Sat Sep 14 11:25:57 2013
@@ -70,6 +70,7 @@ public class Model
         addRelationship(VirtualHost.class, VirtualHostAlias.class);
 
         addRelationship(AuthenticationProvider.class, User.class);
+        addRelationship(AuthenticationProvider.class, PreferencesProvider.class);
         addRelationship(User.class, GroupMember.class);
 
         addRelationship(GroupProvider.class, Group.class);

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/UUIDGenerator.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/UUIDGenerator.java?rev=1523218&r1=1523217&r2=1523218&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/UUIDGenerator.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/UUIDGenerator.java Sat Sep 14 11:25:57 2013
@@ -92,4 +92,9 @@ public class UUIDGenerator
     {
         return createUUID(type, childName);
     }
+
+    public static UUID generatePreferencesProviderUUID(String preferencesProviderName, String authenticationProviderName)
+    {
+        return createUUID(PreferencesProvider.class.getName(), authenticationProviderName, preferencesProviderName);
+    }
 }

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/User.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/User.java?rev=1523218&r1=1523217&r2=1523218&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/User.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/User.java Sat Sep 14 11:25:57 2013
@@ -24,6 +24,7 @@ package org.apache.qpid.server.model;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Map;
 
 public interface User extends ConfiguredObject
 {
@@ -54,4 +55,11 @@ public interface User extends Configured
 
     public void setPassword(String password);
 
+    public Map<String, Object> getPreferences();
+
+    public Object getPreference(String name);
+
+    public Map<String, Object> setPreferences(Map<String, Object> preferences);
+
+    public Map<String, Object> replacePreferences(Map<String, Object> newPreferences);
 }

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AuthenticationProviderAdapter.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AuthenticationProviderAdapter.java?rev=1523218&r1=1523217&r2=1523218&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AuthenticationProviderAdapter.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AuthenticationProviderAdapter.java Sat Sep 14 11:25:57 2013
@@ -43,6 +43,7 @@ import org.apache.qpid.server.model.Inte
 import org.apache.qpid.server.model.LifetimePolicy;
 import org.apache.qpid.server.model.PasswordCredentialManagingAuthenticationProvider;
 import org.apache.qpid.server.model.Port;
+import org.apache.qpid.server.model.PreferencesProvider;
 import org.apache.qpid.server.model.State;
 import org.apache.qpid.server.model.Statistics;
 import org.apache.qpid.server.model.UUIDGenerator;
@@ -51,7 +52,6 @@ import org.apache.qpid.server.model.Virt
 import org.apache.qpid.server.plugin.AuthenticationManagerFactory;
 import org.apache.qpid.server.plugin.QpidServiceLoader;
 import org.apache.qpid.server.configuration.IllegalConfigurationException;
-import org.apache.qpid.server.configuration.updater.TaskExecutor;
 import org.apache.qpid.server.security.SubjectCreator;
 import org.apache.qpid.server.security.access.Operation;
 import org.apache.qpid.server.security.auth.UsernamePrincipal;
@@ -70,9 +70,11 @@ public abstract class AuthenticationProv
 
     protected Collection<String> _supportedAttributes;
     protected Map<String, AuthenticationManagerFactory> _factories;
-    private AtomicReference<State> _state;
+    private final AtomicReference<State> _state;
+    private PreferencesProviderCreator _preferencesProviderCreator;
+    private PreferencesProvider _preferencesProvider;
 
-    private AuthenticationProviderAdapter(UUID id, Broker broker, final T authManager, Map<String, Object> attributes, Collection<String> attributeNames)
+    private AuthenticationProviderAdapter(UUID id, Broker broker, final T authManager, Map<String, Object> attributes, Collection<String> attributeNames, PreferencesProviderCreator preferencesProviderCreator)
     {
         super(id, null, null, broker.getTaskExecutor());
         _authManager = authManager;
@@ -84,6 +86,8 @@ public abstract class AuthenticationProv
         _state = new AtomicReference<State>(state);
         addParent(Broker.class, broker);
 
+        _preferencesProviderCreator = preferencesProviderCreator;
+
         // set attributes now after all attribute names are known
         if (attributes != null)
         {
@@ -210,9 +214,14 @@ public abstract class AuthenticationProv
         return super.getAttribute(name);
     }
 
+    @SuppressWarnings("unchecked")
     @Override
     public <C extends ConfiguredObject> Collection<C> getChildren(Class<C> clazz)
     {
+        if (clazz == PreferencesProvider.class && _preferencesProvider != null)
+        {
+            return (Collection<C>)Collections.<PreferencesProvider>singleton(_preferencesProvider);
+        }
         return Collections.emptySet();
     }
 
@@ -240,6 +249,10 @@ public abstract class AuthenticationProv
             {
                 _authManager.close();
                 _authManager.onDelete();
+                if (_preferencesProvider != null)
+                {
+                    _preferencesProvider.setDesiredState(_preferencesProvider.getActualState(), State.DELETED);
+                }
                 return true;
             }
             else
@@ -254,6 +267,10 @@ public abstract class AuthenticationProv
                 try
                 {
                     _authManager.initialise();
+                    if (_preferencesProvider != null)
+                    {
+                        _preferencesProvider.setDesiredState(_preferencesProvider.getActualState(), State.ACTIVE);
+                    }
                     return true;
                 }
                 catch(RuntimeException e)
@@ -397,24 +414,39 @@ public abstract class AuthenticationProv
         }
     }
 
-    public static class SimpleAuthenticationProviderAdapter extends AuthenticationProviderAdapter<AuthenticationManager>
+    public PreferencesProvider getPreferencesProvider()
     {
+        return _preferencesProvider;
+    }
 
-        public SimpleAuthenticationProviderAdapter(
-                UUID id, Broker broker, AuthenticationManager authManager, Map<String, Object> attributes, Collection<String> attributeNames)
-        {
-            super(id, broker,authManager, attributes, attributeNames);
-        }
+    public void setPreferencesProvider(PreferencesProvider provider)
+    {
+        _preferencesProvider = provider;
+    }
 
-        @Override
-        public <C extends ConfiguredObject> C createChild(Class<C> childClass,
-                                                          Map<String, Object> attributes,
-                                                          ConfiguredObject... otherParents)
+    @SuppressWarnings("unchecked")
+    @Override
+    public <C extends ConfiguredObject> C addChild(Class<C> childClass, Map<String, Object> attributes, ConfiguredObject... otherParents)
+    {
+        if(childClass == PreferencesProvider.class)
         {
-            throw new UnsupportedOperationException();
+            String name = MapValueConverter.getStringAttribute(PreferencesProvider.NAME, attributes);
+            PreferencesProvider pp = _preferencesProviderCreator.create(UUIDGenerator.generatePreferencesProviderUUID(name, getName()), attributes, this);
+            pp.setDesiredState(State.INITIALISING, State.ACTIVE);
+            _preferencesProvider = pp;
+            return (C)pp;
         }
+        throw new IllegalArgumentException("Cannot create child of class " + childClass.getSimpleName());
+    }
 
+    public static class SimpleAuthenticationProviderAdapter extends AuthenticationProviderAdapter<AuthenticationManager>
+    {
 
+        public SimpleAuthenticationProviderAdapter(
+                UUID id, Broker broker, AuthenticationManager authManager, Map<String, Object> attributes, Collection<String> attributeNames, PreferencesProviderCreator preferencesProviderCreator)
+        {
+            super(id, broker,authManager, attributes, attributeNames, preferencesProviderCreator);
+        }
     }
 
     public static class PrincipalDatabaseAuthenticationManagerAdapter
@@ -422,9 +454,9 @@ public abstract class AuthenticationProv
             implements PasswordCredentialManagingAuthenticationProvider
     {
         public PrincipalDatabaseAuthenticationManagerAdapter(
-                UUID id, Broker broker, PrincipalDatabaseAuthenticationManager authManager, Map<String, Object> attributes, Collection<String> attributeNames)
+                UUID id, Broker broker, PrincipalDatabaseAuthenticationManager authManager, Map<String, Object> attributes, Collection<String> attributeNames, PreferencesProviderCreator preferencesProviderCreator)
         {
-            super(id, broker, authManager, attributes, attributeNames);
+            super(id, broker, authManager, attributes, attributeNames, preferencesProviderCreator);
         }
 
         @Override
@@ -507,7 +539,7 @@ public abstract class AuthenticationProv
                 if(createUser(username, password,null))
                 {
                     @SuppressWarnings("unchecked")
-                    C pricipalAdapter = (C) new PrincipalAdapter(p, getTaskExecutor());
+                    C pricipalAdapter = (C) new PrincipalAdapter(p);
                     return pricipalAdapter;
                 }
                 else
@@ -529,7 +561,7 @@ public abstract class AuthenticationProv
                 Collection<User> principals = new ArrayList<User>(users.size());
                 for(Principal user : users)
                 {
-                    principals.add(new PrincipalAdapter(user, getTaskExecutor()));
+                    principals.add(new PrincipalAdapter(user));
                 }
                 @SuppressWarnings("unchecked")
                 Collection<C> unmodifiablePrincipals = (Collection<C>) Collections.unmodifiableCollection(principals);
@@ -544,22 +576,33 @@ public abstract class AuthenticationProv
         @Override
         protected void childAdded(ConfiguredObject child)
         {
-            // no-op, prevent storing users in the broker store
+            if (child instanceof User)
+            {
+                // no-op, prevent storing users in the broker store
+                return;
+            }
+            super.childAdded(child);
         }
 
         @Override
         protected void childRemoved(ConfiguredObject child)
         {
-            // no-op, as per above, users are not in the store
+            if (child instanceof User)
+            {
+                // no-op, as per above, users are not in the store
+                return;
+            }
+            super.childRemoved(child);
         }
 
         private class PrincipalAdapter extends AbstractAdapter implements User
         {
             private final Principal _user;
 
-            public PrincipalAdapter(Principal user, TaskExecutor taskExecutor)
+            public PrincipalAdapter(Principal user)
             {
-                super(UUIDGenerator.generateUserUUID(PrincipalDatabaseAuthenticationManagerAdapter.this.getName(), user.getName()), taskExecutor);
+                super(UUIDGenerator.generateUserUUID(PrincipalDatabaseAuthenticationManagerAdapter.this.getName(), user.getName()),
+                        PrincipalDatabaseAuthenticationManagerAdapter.this.getTaskExecutor());
                 _user = user;
 
             }
@@ -699,7 +742,13 @@ public abstract class AuthenticationProv
                 {
                     try
                     {
-                        deleteUser(_user.getName());
+                        String userName = _user.getName();
+                        deleteUser(userName);
+                        PreferencesProvider preferencesProvider = getPreferencesProvider();
+                        if (preferencesProvider != null)
+                        {
+                            preferencesProvider.deletePreferences(userName);
+                        }
                     }
                     catch (AccountNotFoundException e)
                     {
@@ -709,6 +758,60 @@ public abstract class AuthenticationProv
                 }
                 return false;
             }
+
+            @Override
+            public Map<String, Object> getPreferences()
+            {
+                PreferencesProvider preferencesProvider = getPreferencesProvider();
+                if (preferencesProvider == null)
+                {
+                    return null;
+                }
+                return preferencesProvider.getPreferences(this.getName());
+            }
+
+            @Override
+            public Object getPreference(String name)
+            {
+                Map<String, Object> preferences = getPreferences();
+                if (preferences == null)
+                {
+                    return null;
+                }
+                return preferences.get(name);
+            }
+
+            @Override
+            public Map<String, Object> setPreferences(Map<String, Object> preferences)
+            {
+                PreferencesProvider preferencesProvider = getPreferencesProvider();
+                if (preferencesProvider == null)
+                {
+                    return null;
+                }
+                return preferencesProvider.setPreferences(this.getName(), preferences);
+            }
+
+            @Override
+            public Map<String, Object> replacePreferences(Map<String, Object> newPreferences)
+            {
+                PreferencesProvider preferencesProvider = getPreferencesProvider();
+                if (preferencesProvider == null)
+                {
+                    return null;
+                }
+                Map<String, Object> preferences = preferencesProvider.deletePreferences(this.getName());
+                preferencesProvider.setPreferences(this.getName(), newPreferences);
+                return preferences;
+            }
+
+            private PreferencesProvider getPreferencesProvider()
+            {
+                return PrincipalDatabaseAuthenticationManagerAdapter.this.getPreferencesProvider();
+            }
+
         }
+
     }
+
 }

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AuthenticationProviderFactory.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AuthenticationProviderFactory.java?rev=1523218&r1=1523217&r2=1523218&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AuthenticationProviderFactory.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AuthenticationProviderFactory.java Sat Sep 14 11:25:57 2013
@@ -42,9 +42,11 @@ public class AuthenticationProviderFacto
 {
     private final Iterable<AuthenticationManagerFactory> _factories;
     private Collection<String> _supportedAuthenticationProviders;
+    private final PreferencesProviderCreator _preferencesProviderCreator;
 
-    public AuthenticationProviderFactory(QpidServiceLoader<AuthenticationManagerFactory> authManagerFactoryServiceLoader)
+    public AuthenticationProviderFactory(QpidServiceLoader<AuthenticationManagerFactory> authManagerFactoryServiceLoader, PreferencesProviderCreator preferencesProviderCreator)
     {
+        _preferencesProviderCreator = preferencesProviderCreator;
         _factories = authManagerFactoryServiceLoader.atLeastOneInstanceOf(AuthenticationManagerFactory.class);
         List<String> supportedAuthenticationProviders = new ArrayList<String>();
         for (AuthenticationManagerFactory factory : _factories)
@@ -89,11 +91,11 @@ public class AuthenticationProviderFacto
                 if (manager instanceof PrincipalDatabaseAuthenticationManager)
                 {
                     authenticationProvider = new PrincipalDatabaseAuthenticationManagerAdapter(id, broker,
-                            (PrincipalDatabaseAuthenticationManager) manager, attributes, factory.getAttributeNames());
+                            (PrincipalDatabaseAuthenticationManager) manager, attributes, factory.getAttributeNames(), _preferencesProviderCreator);
                 }
                 else
                 {
-                    authenticationProvider = new SimpleAuthenticationProviderAdapter(id, broker, manager, attributes, factory.getAttributeNames());
+                    authenticationProvider = new SimpleAuthenticationProviderAdapter(id, broker, manager, attributes, factory.getAttributeNames(), _preferencesProviderCreator);
                 }
                 return authenticationProvider;
             }

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java?rev=1523218&r1=1523217&r2=1523218&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java Sat Sep 14 11:25:57 2013
@@ -178,7 +178,7 @@ public class BrokerAdapter extends Abstr
     private final GroupProviderFactory _groupProviderFactory;
     private final AuthenticationProviderFactory _authenticationProviderFactory;
     private final AccessControlProviderFactory _accessControlProviderFactory;
-
+    private final PreferencesProviderCreator _preferencesProviderCreator;
     private final PortFactory _portFactory;
     private final SecurityManager _securityManager;
 
@@ -191,8 +191,8 @@ public class BrokerAdapter extends Abstr
 
     public BrokerAdapter(UUID id, Map<String, Object> attributes, StatisticsGatherer statisticsGatherer, VirtualHostRegistry virtualHostRegistry,
             LogRecorder logRecorder, RootMessageLogger rootMessageLogger, AuthenticationProviderFactory authenticationProviderFactory,
-            GroupProviderFactory groupProviderFactory, AccessControlProviderFactory accessControlProviderFactory, PortFactory portFactory, TaskExecutor taskExecutor,
-            ConfigurationEntryStore brokerStore, BrokerOptions brokerOptions)
+            GroupProviderFactory groupProviderFactory, AccessControlProviderFactory accessControlProviderFactory, PortFactory portFactory,
+            PreferencesProviderCreator preferencesProviderCreatory, TaskExecutor taskExecutor, ConfigurationEntryStore brokerStore, BrokerOptions brokerOptions)
     {
         super(id, DEFAULTS,  MapValueConverter.convert(attributes, ATTRIBUTE_TYPES), taskExecutor);
         _statisticsGatherer = statisticsGatherer;
@@ -201,6 +201,7 @@ public class BrokerAdapter extends Abstr
         _rootMessageLogger = rootMessageLogger;
         _statistics = new StatisticsAdapter(statisticsGatherer);
         _authenticationProviderFactory = authenticationProviderFactory;
+        _preferencesProviderCreator = preferencesProviderCreatory;
         _groupProviderFactory = groupProviderFactory;
         _accessControlProviderFactory = accessControlProviderFactory;
         _portFactory = portFactory;
@@ -213,7 +214,7 @@ public class BrokerAdapter extends Abstr
         {
             AuthenticationManager authManager = new SimpleAuthenticationManager(BrokerOptions.MANAGEMENT_MODE_USER_NAME, _brokerOptions.getManagementModePassword());
             AuthenticationProvider authenticationProvider = new SimpleAuthenticationProviderAdapter(UUID.randomUUID(), this,
-                    authManager, Collections.<String, Object> emptyMap(), Collections.<String> emptySet());
+                    authManager, Collections.<String, Object> emptyMap(), Collections.<String> emptySet(), _preferencesProviderCreator);
             _managementAuthenticationProvider = authenticationProvider;
         }
     }
@@ -783,6 +784,10 @@ public class BrokerAdapter extends Abstr
         {
             return _authenticationProviderFactory.getSupportedAuthenticationProviders();
         }
+        else if (SUPPORTED_PREFERENCES_PROVIDERS_TYPES.equals(name))
+        {
+            return _preferencesProviderCreator.getSupportedPreferencesProviders();
+        }
         else if (MODEL_VERSION.equals(name))
         {
             return Model.MODEL_VERSION;
@@ -1086,6 +1091,19 @@ public class BrokerAdapter extends Abstr
     @Override
     public SubjectCreator getSubjectCreator(SocketAddress localAddress)
     {
+        AuthenticationProvider provider = getAuthenticationProvider(localAddress);
+
+        if(provider == null)
+        {
+            throw new IllegalConfigurationException("Unable to determine authentication provider for address: " + localAddress);
+        }
+
+        return provider.getSubjectCreator();
+    }
+
+    @Override
+    public AuthenticationProvider getAuthenticationProvider(SocketAddress localAddress)
+    {
         InetSocketAddress inetSocketAddress = (InetSocketAddress)localAddress;
         AuthenticationProvider provider = null;
         Collection<Port> ports = getPorts();
@@ -1097,13 +1115,7 @@ public class BrokerAdapter extends Abstr
                 break;
             }
         }
-
-        if(provider == null)
-        {
-            throw new IllegalConfigurationException("Unable to determine authentication provider for address: " + localAddress);
-        }
-
-        return provider.getSubjectCreator();
+        return provider;
     }
 
     @Override

Added: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/FileSystemPreferencesProviderFactory.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/FileSystemPreferencesProviderFactory.java?rev=1523218&view=auto
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/FileSystemPreferencesProviderFactory.java (added)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/FileSystemPreferencesProviderFactory.java Sat Sep 14 11:25:57 2013
@@ -0,0 +1,32 @@
+package org.apache.qpid.server.model.adapter;
+
+import java.util.Map;
+import java.util.UUID;
+
+import org.apache.qpid.server.model.AuthenticationProvider;
+import org.apache.qpid.server.model.Broker;
+import org.apache.qpid.server.model.PreferencesProvider;
+import org.apache.qpid.server.plugin.PreferencesProviderFactory;
+
+public class FileSystemPreferencesProviderFactory implements PreferencesProviderFactory
+{
+
+    @Override
+    public String getType()
+    {
+        return FileSystemPreferencesProvider.PROVIDER_TYPE;
+    }
+
+    @Override
+    public PreferencesProvider createInstance(UUID id, Map<String, Object> attributes,
+            AuthenticationProvider authenticationProvider)
+    {
+        Broker broker = authenticationProvider.getParent(Broker.class);
+        FileSystemPreferencesProvider provider = new FileSystemPreferencesProvider(id, attributes, authenticationProvider, broker.getTaskExecutor());
+
+        // create store if such does not exist
+        provider.createStoreIfNotExist();
+        return provider;
+    }
+
+}

Added: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/PreferencesProviderCreator.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/PreferencesProviderCreator.java?rev=1523218&view=auto
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/PreferencesProviderCreator.java (added)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/PreferencesProviderCreator.java Sat Sep 14 11:25:57 2013
@@ -0,0 +1,66 @@
+package org.apache.qpid.server.model.adapter;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+import org.apache.qpid.server.configuration.IllegalConfigurationException;
+import org.apache.qpid.server.model.AuthenticationProvider;
+import org.apache.qpid.server.model.PreferencesProvider;
+import org.apache.qpid.server.plugin.PreferencesProviderFactory;
+import org.apache.qpid.server.plugin.QpidServiceLoader;
+
+public class PreferencesProviderCreator
+{
+    private final Map<String, PreferencesProviderFactory> _factories;
+    private Collection<String> _supportedPreferencesProviders;
+
+    public PreferencesProviderCreator()
+    {
+        QpidServiceLoader<PreferencesProviderFactory> preferencesProviderFactoriess = new QpidServiceLoader<PreferencesProviderFactory>();
+
+        Iterable<PreferencesProviderFactory> factories = preferencesProviderFactoriess
+                .instancesOf(PreferencesProviderFactory.class);
+
+        Map<String, PreferencesProviderFactory> registeredPreferencesProviderFactories = new HashMap<String, PreferencesProviderFactory>();
+        for (PreferencesProviderFactory factory : factories)
+        {
+            PreferencesProviderFactory existingFactory = registeredPreferencesProviderFactories.put(factory.getType(),
+                    factory);
+            if (existingFactory != null)
+            {
+                throw new IllegalConfigurationException("Preferences provider factory of the same type '"
+                        + factory.getType() + "' is already registered using class '" + existingFactory.getClass().getName()
+                        + "', can not register class '" + factory.getClass().getName() + "'");
+            }
+        }
+        _factories = registeredPreferencesProviderFactories;
+        _supportedPreferencesProviders = Collections.unmodifiableCollection(registeredPreferencesProviderFactories.keySet());
+    }
+
+    public Collection<String> getSupportedPreferencesProviders()
+    {
+        return _supportedPreferencesProviders;
+    }
+
+    public PreferencesProvider create(UUID id, Map<String, Object> attributes, AuthenticationProvider authenticationProvider)
+    {
+        return createPreferencesProvider(id, attributes, authenticationProvider);
+    }
+
+    public PreferencesProvider recover(UUID id, Map<String, Object> attributes, AuthenticationProvider authenticationProviderr)
+    {
+        return createPreferencesProvider(id, attributes, authenticationProviderr);
+    }
+
+    private PreferencesProvider createPreferencesProvider(UUID id, Map<String, Object> attributes, AuthenticationProvider authenticationProvider)
+    {
+        for (PreferencesProviderFactory factory : _factories.values())
+        {
+            return factory.createInstance(id, attributes, authenticationProvider);
+        }
+        throw new IllegalConfigurationException("No group provider factory found for configuration attributes " + attributes);
+    }
+}

Added: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/plugin/PreferencesProviderFactory.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/plugin/PreferencesProviderFactory.java?rev=1523218&view=auto
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/plugin/PreferencesProviderFactory.java (added)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/plugin/PreferencesProviderFactory.java Sat Sep 14 11:25:57 2013
@@ -0,0 +1,12 @@
+package org.apache.qpid.server.plugin;
+
+import java.util.Map;
+import java.util.UUID;
+
+import org.apache.qpid.server.model.AuthenticationProvider;
+import org.apache.qpid.server.model.PreferencesProvider;
+
+public interface PreferencesProviderFactory extends Pluggable
+{
+    PreferencesProvider createInstance(UUID id, Map<String, Object> attributes, AuthenticationProvider authenticationProvider);
+}

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java?rev=1523218&r1=1523217&r2=1523218&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java Sat Sep 14 11:25:57 2013
@@ -33,6 +33,7 @@ import org.apache.qpid.server.configurat
 import org.apache.qpid.server.configuration.ConfiguredObjectRecoverer;
 import org.apache.qpid.server.configuration.RecovererProvider;
 import org.apache.qpid.server.configuration.startup.DefaultRecovererProvider;
+import org.apache.qpid.server.configuration.store.StoreConfigurationChangeListener;
 import org.apache.qpid.server.logging.CompositeStartupMessageLogger;
 import org.apache.qpid.server.logging.Log4jMessageLogger;
 import org.apache.qpid.server.logging.LogActor;
@@ -113,7 +114,8 @@ public class ApplicationRegistry impleme
             _taskExecutor = new TaskExecutor();
             _taskExecutor.start();
 
-            RecovererProvider provider = new DefaultRecovererProvider((StatisticsGatherer)this, _virtualHostRegistry, _logRecorder, _rootMessageLogger, _taskExecutor, brokerOptions);
+            StoreConfigurationChangeListener storeChangeListener = new StoreConfigurationChangeListener(_store);
+            RecovererProvider provider = new DefaultRecovererProvider((StatisticsGatherer)this, _virtualHostRegistry, _logRecorder, _rootMessageLogger, _taskExecutor, brokerOptions, storeChangeListener);
             ConfiguredObjectRecoverer<? extends ConfiguredObject> brokerRecoverer =  provider.getRecoverer(Broker.class.getSimpleName());
             _broker = (Broker) brokerRecoverer.create(provider, _store.getRootEntry());
 

Added: qpid/trunk/qpid/java/broker/src/main/resources/META-INF/services/org.apache.qpid.server.plugin.PreferencesProviderFactory
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/resources/META-INF/services/org.apache.qpid.server.plugin.PreferencesProviderFactory?rev=1523218&view=auto
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/resources/META-INF/services/org.apache.qpid.server.plugin.PreferencesProviderFactory (added)
+++ qpid/trunk/qpid/java/broker/src/main/resources/META-INF/services/org.apache.qpid.server.plugin.PreferencesProviderFactory Sat Sep 14 11:25:57 2013
@@ -0,0 +1,19 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+org.apache.qpid.server.model.adapter.FileSystemPreferencesProviderFactory
\ No newline at end of file

Modified: qpid/trunk/qpid/java/broker/src/main/resources/initial-config.json
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/resources/initial-config.json?rev=1523218&r1=1523217&r2=1523218&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/resources/initial-config.json (original)
+++ qpid/trunk/qpid/java/broker/src/main/resources/initial-config.json Sat Sep 14 11:25:57 2013
@@ -26,7 +26,12 @@
   "authenticationproviders" : [ {
     "name" : "passwordFile",
     "type" : "PlainPasswordFile",
-    "path" : "${qpid.home_dir}/etc/passwd"
+    "path" : "${qpid.home_dir}/etc/passwd",
+    "preferencesproviders" : [{
+        "name": "fileSystemPreferences",
+        "type": "FileSystemPreferences",
+        "path" : "${qpid.work_dir}/preferences/passwordFile"
+    }]
   } ],
   "ports" : [  {
     "name" : "AMQP",

Added: qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/AuthenticationProviderRecovererTest.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/AuthenticationProviderRecovererTest.java?rev=1523218&view=auto
==============================================================================
--- qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/AuthenticationProviderRecovererTest.java (added)
+++ qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/AuthenticationProviderRecovererTest.java Sat Sep 14 11:25:57 2013
@@ -0,0 +1,126 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.configuration.startup;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.io.File;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+import org.apache.qpid.server.configuration.ConfigurationEntry;
+import org.apache.qpid.server.configuration.ConfigurationEntryStore;
+import org.apache.qpid.server.configuration.ConfiguredObjectRecoverer;
+import org.apache.qpid.server.configuration.RecovererProvider;
+import org.apache.qpid.server.configuration.store.StoreConfigurationChangeListener;
+import org.apache.qpid.server.model.AuthenticationProvider;
+import org.apache.qpid.server.model.Broker;
+import org.apache.qpid.server.model.ConfiguredObject;
+import org.apache.qpid.server.model.PreferencesProvider;
+import org.apache.qpid.server.model.adapter.AuthenticationProviderFactory;
+import org.apache.qpid.server.model.adapter.FileSystemPreferencesProvider;
+import org.apache.qpid.server.model.adapter.PreferencesProviderCreator;
+import org.apache.qpid.server.plugin.AuthenticationManagerFactory;
+import org.apache.qpid.server.plugin.QpidServiceLoader;
+import org.apache.qpid.server.security.auth.manager.AnonymousAuthenticationManagerFactory;
+import org.apache.qpid.server.util.BrokerTestHelper;
+import org.apache.qpid.test.utils.QpidTestCase;
+import org.apache.qpid.test.utils.TestFileUtils;
+
+public class AuthenticationProviderRecovererTest extends QpidTestCase
+{
+    private Broker _broker;
+    private AuthenticationProviderRecoverer _recoverer;
+    private ConfigurationEntryStore _configurationStore;
+    private PreferencesProviderCreator _preferencesProviderCreator;
+
+    public void setUp() throws Exception
+    {
+        super.setUp();
+        BrokerTestHelper.setUp();
+        _broker = BrokerTestHelper.createBrokerMock();
+        _preferencesProviderCreator = new PreferencesProviderCreator();
+        QpidServiceLoader<AuthenticationManagerFactory> serviceLoader = new QpidServiceLoader<AuthenticationManagerFactory>();
+        AuthenticationProviderFactory authenticationProviderFactory = new AuthenticationProviderFactory(serviceLoader, _preferencesProviderCreator);
+        StoreConfigurationChangeListener storeChangeListener = mock(StoreConfigurationChangeListener.class);
+        _recoverer = new AuthenticationProviderRecoverer(authenticationProviderFactory, storeChangeListener);
+        _configurationStore = mock(ConfigurationEntryStore.class);
+    }
+
+    public void tearDown() throws Exception
+    {
+        try
+        {
+            BrokerTestHelper.tearDown();
+        }
+        finally
+        {
+            super.tearDown();
+        }
+    }
+
+    public void testRecoverAuthenticationProviderWithPreferencesProvider()
+    {
+        Map<String, Object> authenticationAttributes = new HashMap<String, Object>();
+        authenticationAttributes.put(AuthenticationManagerFactory.ATTRIBUTE_TYPE, AnonymousAuthenticationManagerFactory.PROVIDER_TYPE);
+        authenticationAttributes.put(AuthenticationProvider.NAME, "test-authenticator");
+        UUID authenticationId = UUID.randomUUID();
+
+        final PreferencesProviderRecoverer preferencesRecoverer = new PreferencesProviderRecoverer(_preferencesProviderCreator);
+        RecovererProvider recovererProvider = new RecovererProvider()
+        {
+            @Override
+            public ConfiguredObjectRecoverer<? extends ConfiguredObject> getRecoverer(String type)
+            {
+                return preferencesRecoverer;
+            }
+        };
+
+        Map<String, Object> preferencesAttributes = new HashMap<String, Object>();
+        UUID preferencesId = UUID.randomUUID();
+        preferencesAttributes.put(PreferencesProvider.TYPE, FileSystemPreferencesProvider.class);
+        preferencesAttributes.put(PreferencesProvider.NAME, "test-provider");
+        File file = TestFileUtils.createTempFile(this, ".prefs.json", "{\"test_user\":{\"pref1\": \"pref1Value\", \"pref2\": 1.0} }");
+        preferencesAttributes.put(FileSystemPreferencesProvider.PATH, file.getAbsolutePath());
+        ConfigurationEntry preferencesEntry = new ConfigurationEntry(preferencesId, PreferencesProvider.class.getSimpleName(), preferencesAttributes, Collections.<UUID>emptySet(), _configurationStore);
+        when(_configurationStore.getEntry(preferencesId)).thenReturn(preferencesEntry);
+
+        ConfigurationEntry authenticationProviderEntry = new ConfigurationEntry(authenticationId, AuthenticationProvider.class.getSimpleName(), authenticationAttributes, Collections.singleton(preferencesId), _configurationStore);
+        try
+        {
+            AuthenticationProvider authenticationProvider = _recoverer.create(recovererProvider, authenticationProviderEntry, _broker);
+            assertNotNull("Authentication provider was not recovered", authenticationProvider);
+            assertEquals("Unexpected name", "test-authenticator", authenticationProvider.getName());
+            assertEquals("Unexpected id", authenticationId, authenticationProvider.getId());
+            PreferencesProvider preferencesProvider = authenticationProvider.getPreferencesProvider();
+            assertNotNull("Preferences provider was not recovered", preferencesProvider);
+            assertEquals("Unexpected path", file.getAbsolutePath(), preferencesProvider.getAttribute(FileSystemPreferencesProvider.PATH));
+        }
+        finally
+        {
+            file.delete();
+        }
+    }
+
+}

Modified: qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/BrokerRecovererTest.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/BrokerRecovererTest.java?rev=1523218&r1=1523217&r2=1523218&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/BrokerRecovererTest.java (original)
+++ qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/BrokerRecovererTest.java Sat Sep 14 11:25:57 2013
@@ -55,6 +55,8 @@ import org.apache.qpid.server.model.adap
 import org.apache.qpid.server.model.adapter.AuthenticationProviderFactory;
 import org.apache.qpid.server.model.adapter.GroupProviderFactory;
 import org.apache.qpid.server.model.adapter.PortFactory;
+import org.apache.qpid.server.model.adapter.PreferencesProviderCreator;
+import org.apache.qpid.server.configuration.store.StoreConfigurationChangeListener;
 import org.apache.qpid.server.configuration.updater.TaskExecutor;
 import org.apache.qpid.server.stats.StatisticsGatherer;
 import org.apache.qpid.server.virtualhost.VirtualHostRegistry;
@@ -76,7 +78,9 @@ public class BrokerRecovererTest extends
         super.setUp();
 
         _brokerRecoverer = new BrokerRecoverer(mock(AuthenticationProviderFactory.class), mock(GroupProviderFactory.class), mock(AccessControlProviderFactory.class), mock(PortFactory.class),
-                mock(StatisticsGatherer.class), mock(VirtualHostRegistry.class), mock(LogRecorder.class), mock(RootMessageLogger.class), mock(TaskExecutor.class), mock(BrokerOptions.class));
+                mock(PreferencesProviderCreator.class),
+                mock(StatisticsGatherer.class), mock(VirtualHostRegistry.class), mock(LogRecorder.class), mock(RootMessageLogger.class), mock(TaskExecutor.class), mock(BrokerOptions.class),
+                mock(StoreConfigurationChangeListener.class));
         when(_brokerEntry.getId()).thenReturn(_brokerId);
         when(_brokerEntry.getChildren()).thenReturn(_brokerEntryChildren);
         when(_brokerEntry.getAttributes()).thenReturn(Collections.<String, Object>singletonMap(Broker.MODEL_VERSION, Model.MODEL_VERSION));

Modified: qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/DefaultRecovererProviderTest.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/DefaultRecovererProviderTest.java?rev=1523218&r1=1523217&r2=1523218&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/DefaultRecovererProviderTest.java (original)
+++ qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/DefaultRecovererProviderTest.java Sat Sep 14 11:25:57 2013
@@ -35,6 +35,7 @@ import org.apache.qpid.server.model.Plug
 import org.apache.qpid.server.model.Port;
 import org.apache.qpid.server.model.TrustStore;
 import org.apache.qpid.server.model.VirtualHost;
+import org.apache.qpid.server.configuration.store.StoreConfigurationChangeListener;
 import org.apache.qpid.server.configuration.updater.TaskExecutor;
 import org.apache.qpid.server.stats.StatisticsGatherer;
 import org.apache.qpid.server.virtualhost.VirtualHostRegistry;
@@ -55,7 +56,9 @@ public class DefaultRecovererProviderTes
         RootMessageLogger rootMessageLogger = mock(RootMessageLogger.class);
         TaskExecutor taskExecutor = mock(TaskExecutor.class);
 
-        DefaultRecovererProvider provider = new DefaultRecovererProvider(statisticsGatherer, virtualHostRegistry, logRecorder, rootMessageLogger, taskExecutor, mock(BrokerOptions.class));
+        DefaultRecovererProvider provider = new DefaultRecovererProvider(statisticsGatherer, virtualHostRegistry,
+                logRecorder, rootMessageLogger, taskExecutor, mock(BrokerOptions.class),
+                mock(StoreConfigurationChangeListener.class));
         for (String configuredObjectType : supportedTypes)
         {
             ConfiguredObjectRecoverer<?> recovever = provider.getRecoverer(configuredObjectType);

Added: qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/PreferencesProviderRecovererTest.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/PreferencesProviderRecovererTest.java?rev=1523218&view=auto
==============================================================================
--- qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/PreferencesProviderRecovererTest.java (added)
+++ qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/PreferencesProviderRecovererTest.java Sat Sep 14 11:25:57 2013
@@ -0,0 +1,75 @@
+package org.apache.qpid.server.configuration.startup;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.io.File;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+import org.apache.qpid.server.configuration.ConfigurationEntry;
+import org.apache.qpid.server.configuration.ConfigurationEntryStore;
+import org.apache.qpid.server.configuration.RecovererProvider;
+import org.apache.qpid.server.model.AuthenticationProvider;
+import org.apache.qpid.server.model.Broker;
+import org.apache.qpid.server.model.PreferencesProvider;
+import org.apache.qpid.server.model.adapter.FileSystemPreferencesProvider;
+import org.apache.qpid.server.model.adapter.PreferencesProviderCreator;
+import org.apache.qpid.server.util.BrokerTestHelper;
+import org.apache.qpid.test.utils.QpidTestCase;
+import org.apache.qpid.test.utils.TestFileUtils;
+
+public class PreferencesProviderRecovererTest extends QpidTestCase
+{
+    private AuthenticationProvider _authenticationProvider;
+    private Broker _broker;
+
+    public void setUp() throws Exception
+    {
+        super.setUp();
+        BrokerTestHelper.setUp();
+        _authenticationProvider = mock(AuthenticationProvider.class);
+        _broker = BrokerTestHelper.createBrokerMock();
+        when(_authenticationProvider.getParent(Broker.class)).thenReturn(_broker);
+    }
+
+    public void tearDown() throws Exception
+    {
+        try
+        {
+            BrokerTestHelper.tearDown();
+        }
+        finally
+        {
+            super.tearDown();
+        }
+    }
+
+    public void testRecoverFileSystemPreferencesProvider()
+    {
+        PreferencesProviderRecoverer recoverer = new PreferencesProviderRecoverer(new PreferencesProviderCreator());
+
+        Map<String, Object> attributes = new HashMap<String, Object>();
+        UUID id = UUID.randomUUID();
+        attributes.put(PreferencesProvider.TYPE, FileSystemPreferencesProvider.class);
+        attributes.put(PreferencesProvider.NAME, "test-provider");
+        File file = TestFileUtils.createTempFile(this, ".prefs.json", "{\"test_user\":{\"pref1\": \"pref1Value\", \"pref2\": 1.0} }");
+        try
+        {
+            attributes.put(FileSystemPreferencesProvider.PATH, file.getAbsolutePath());
+            ConfigurationEntry entry = new ConfigurationEntry(id, PreferencesProvider.class.getSimpleName(), attributes, Collections.<UUID>emptySet(), mock(ConfigurationEntryStore.class));
+            PreferencesProvider provider = recoverer.create(mock(RecovererProvider.class), entry, _authenticationProvider);
+            assertNotNull("Preferences provider was not recovered", provider);
+            assertEquals("Unexpected name", "test-provider", provider.getName());
+            assertEquals("Unexpected id", id, provider.getId());
+            assertEquals("Unexpected path", file.getAbsolutePath(), provider.getAttribute(FileSystemPreferencesProvider.PATH));
+        }
+        finally
+        {
+            file.delete();
+        }
+    }
+
+}

Modified: qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/model/ConfiguredObjectStateTransitionTest.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/model/ConfiguredObjectStateTransitionTest.java?rev=1523218&r1=1523217&r2=1523218&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/model/ConfiguredObjectStateTransitionTest.java (original)
+++ qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/model/ConfiguredObjectStateTransitionTest.java Sat Sep 14 11:25:57 2013
@@ -35,6 +35,7 @@ import org.apache.qpid.server.configurat
 import org.apache.qpid.server.configuration.ConfiguredObjectRecoverer;
 import org.apache.qpid.server.configuration.RecovererProvider;
 import org.apache.qpid.server.configuration.startup.DefaultRecovererProvider;
+import org.apache.qpid.server.configuration.store.StoreConfigurationChangeListener;
 import org.apache.qpid.server.configuration.updater.TaskExecutor;
 import org.apache.qpid.server.security.auth.manager.AnonymousAuthenticationManagerFactory;
 import org.apache.qpid.server.security.group.FileGroupManagerFactory;
@@ -62,7 +63,7 @@ public class ConfiguredObjectStateTransi
         when(_broker.getTaskExecutor()).thenReturn(executor);
 
         _recovererProvider = new DefaultRecovererProvider(statisticsGatherer, _broker.getVirtualHostRegistry(),
-                _broker.getLogRecorder(), _broker.getRootMessageLogger(), executor, new BrokerOptions());
+                _broker.getLogRecorder(), _broker.getRootMessageLogger(), executor, new BrokerOptions(), mock(StoreConfigurationChangeListener.class));
 
         _store = mock(ConfigurationEntryStore.class);
 

Modified: qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/model/adapter/AuthenticationProviderFactoryTest.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/model/adapter/AuthenticationProviderFactoryTest.java?rev=1523218&r1=1523217&r2=1523218&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/model/adapter/AuthenticationProviderFactoryTest.java (original)
+++ qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/model/adapter/AuthenticationProviderFactoryTest.java Sat Sep 14 11:25:57 2013
@@ -43,6 +43,7 @@ import org.apache.qpid.server.security.a
 
 public class AuthenticationProviderFactoryTest extends TestCase
 {
+    private PreferencesProviderCreator _preferencesProviderCreator = mock(PreferencesProviderCreator.class);
 
     public void testCreatePasswordCredentialManagingAuthenticationProvider()
     {
@@ -95,7 +96,7 @@ public class AuthenticationProviderFacto
                 Collections.singleton(authenticationManagerFactory));
         when(authenticationManagerFactory.createInstance(attributes)).thenReturn(authenticationManager);
 
-        AuthenticationProviderFactory providerFactory = new AuthenticationProviderFactory(authManagerFactoryServiceLoader);
+        AuthenticationProviderFactory providerFactory = new AuthenticationProviderFactory(authManagerFactoryServiceLoader, _preferencesProviderCreator);
 
         AuthenticationProvider provider = null;
         if (create)
@@ -124,7 +125,7 @@ public class AuthenticationProviderFacto
         when(managerFactory.createInstance(any(Map.class))).thenReturn(mock(PrincipalDatabaseAuthenticationManager.class));
         when(loader.atLeastOneInstanceOf(AuthenticationManagerFactory.class)).thenReturn(Collections.singleton(managerFactory));
 
-        AuthenticationProviderFactory providerFactory = new AuthenticationProviderFactory(loader);
+        AuthenticationProviderFactory providerFactory = new AuthenticationProviderFactory(loader, _preferencesProviderCreator);
 
         UUID randomUUID = UUID.randomUUID();
         AuthenticationProvider provider = providerFactory.create(randomUUID, broker, new HashMap<String, Object>());
@@ -145,7 +146,7 @@ public class AuthenticationProviderFacto
         when(managerFactory.createInstance(any(Map.class))).thenReturn(mock(AuthenticationManager.class));
         when(loader.atLeastOneInstanceOf(AuthenticationManagerFactory.class)).thenReturn(Collections.singleton(managerFactory));
 
-        AuthenticationProviderFactory providerFactory = new AuthenticationProviderFactory(loader);
+        AuthenticationProviderFactory providerFactory = new AuthenticationProviderFactory(loader, _preferencesProviderCreator);
         UUID id = UUID.randomUUID();
         AuthenticationProvider provider = providerFactory.create(id, broker, new HashMap<String, Object>());
 

Added: qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/model/adapter/FileSystemPreferencesProviderFactoryTest.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/model/adapter/FileSystemPreferencesProviderFactoryTest.java?rev=1523218&view=auto
==============================================================================
--- qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/model/adapter/FileSystemPreferencesProviderFactoryTest.java (added)
+++ qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/model/adapter/FileSystemPreferencesProviderFactoryTest.java Sat Sep 14 11:25:57 2013
@@ -0,0 +1,118 @@
+package org.apache.qpid.server.model.adapter;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+import org.apache.qpid.server.configuration.IllegalConfigurationException;
+import org.apache.qpid.server.model.AuthenticationProvider;
+import org.apache.qpid.server.model.Broker;
+import org.apache.qpid.server.model.PreferencesProvider;
+import org.apache.qpid.server.util.BrokerTestHelper;
+import org.apache.qpid.test.utils.QpidTestCase;
+import org.apache.qpid.test.utils.TestFileUtils;
+
+public class FileSystemPreferencesProviderFactoryTest extends QpidTestCase
+{
+    private AuthenticationProvider _authenticationProvider;
+    private Broker _broker;
+    private FileSystemPreferencesProviderFactory _factory;
+
+    public void setUp() throws Exception
+    {
+        super.setUp();
+        BrokerTestHelper.setUp();
+        _authenticationProvider = mock(AuthenticationProvider.class);
+        _broker = BrokerTestHelper.createBrokerMock();
+        when(_authenticationProvider.getParent(Broker.class)).thenReturn(_broker);
+        _factory = new FileSystemPreferencesProviderFactory();
+    }
+
+    public void tearDown() throws Exception
+    {
+        try
+        {
+            BrokerTestHelper.tearDown();
+        }
+        finally
+        {
+            super.tearDown();
+        }
+    }
+
+    public void testGetType()
+    {
+        assertEquals(FileSystemPreferencesProvider.PROVIDER_TYPE, _factory.getType());
+    }
+
+    public void testCreateInstanceRecovering()
+    {
+        Map<String, Object> attributes = new HashMap<String, Object>();
+        UUID id = UUID.randomUUID();
+        attributes.put(PreferencesProvider.TYPE, FileSystemPreferencesProvider.class);
+        attributes.put(PreferencesProvider.NAME, "test-provider");
+        File file = TestFileUtils.createTempFile(this, ".prefs.json", "{\"test_user\":{\"pref1\": \"pref1Value\", \"pref2\": 1.0} }");
+        try
+        {
+            attributes.put(FileSystemPreferencesProvider.PATH, file.getAbsolutePath());
+            PreferencesProvider provider = _factory.createInstance(id, attributes, _authenticationProvider);
+            assertNotNull("Preferences provider was not instantiated", provider);
+            assertEquals("Unexpected name", "test-provider", provider.getName());
+            assertEquals("Unexpected id", id, provider.getId());
+            assertEquals("Unexpected path", file.getAbsolutePath(),
+                    provider.getAttribute(FileSystemPreferencesProvider.PATH));
+        }
+        finally
+        {
+            file.delete();
+        }
+    }
+
+    public void testCreateInstanceRecoveringWhenPrefStoreDoesNotExist()
+    {
+        Map<String, Object> attributes = new HashMap<String, Object>();
+        UUID id = UUID.randomUUID();
+        attributes.put(PreferencesProvider.TYPE, FileSystemPreferencesProvider.class);
+        attributes.put(PreferencesProvider.NAME, "test-provider");
+        File file = new File(TMP_FOLDER, UUID.randomUUID() + "prefs.json");
+        assertFalse("Preferences store file should not exist", file.exists());
+        try
+        {
+            attributes.put(FileSystemPreferencesProvider.PATH, file.getAbsolutePath());
+            _factory.createInstance(id, attributes, _authenticationProvider);
+        }
+        catch (IllegalConfigurationException e)
+        {
+            // exception should be thrown if preferences store does not exist
+        }
+    }
+
+    public void testCreateInstanceNotRecovering()
+    {
+        Map<String, Object> attributes = new HashMap<String, Object>();
+        UUID id = UUID.randomUUID();
+        attributes.put(PreferencesProvider.TYPE, FileSystemPreferencesProvider.class);
+        attributes.put(PreferencesProvider.NAME, "test-provider");
+        File file = new File(TMP_FOLDER, UUID.randomUUID() + "prefs.json");
+        assertFalse("Preferences store file should not exist", file.exists());
+        try
+        {
+            attributes.put(FileSystemPreferencesProvider.PATH, file.getAbsolutePath());
+            PreferencesProvider provider = _factory.createInstance(id, attributes, _authenticationProvider);
+            assertNotNull("Preferences provider was not recovered", provider);
+            assertEquals("Unexpected name", "test-provider", provider.getName());
+            assertEquals("Unexpected id", id, provider.getId());
+            assertEquals("Unexpected path", file.getAbsolutePath(), provider.getAttribute(FileSystemPreferencesProvider.PATH));
+            assertTrue("Preferences store file should  exist", file.exists());
+        }
+        finally
+        {
+            file.delete();
+        }
+    }
+
+}

Modified: qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/TestBrokerConfiguration.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/TestBrokerConfiguration.java?rev=1523218&r1=1523217&r2=1523218&view=diff
==============================================================================
--- qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/TestBrokerConfiguration.java (original)
+++ qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/TestBrokerConfiguration.java Sat Sep 14 11:25:57 2013
@@ -38,6 +38,7 @@ import org.apache.qpid.server.model.Grou
 import org.apache.qpid.server.model.KeyStore;
 import org.apache.qpid.server.model.Plugin;
 import org.apache.qpid.server.model.Port;
+import org.apache.qpid.server.model.PreferencesProvider;
 import org.apache.qpid.server.model.TrustStore;
 import org.apache.qpid.server.model.UUIDGenerator;
 import org.apache.qpid.server.model.VirtualHost;
@@ -295,4 +296,16 @@ public class TestBrokerConfiguration
         _saved = saved;
     }
 
+    public void addPreferencesProviderConfiguration(String authenticationProvider, Map<String, Object> attributes)
+    {
+        ConfigurationEntry pp = new ConfigurationEntry(UUIDGenerator.generateRandomUUID(),
+                PreferencesProvider.class.getSimpleName(), attributes, Collections.<UUID> emptySet(), _store);
+        ConfigurationEntry ap = findObjectByName(authenticationProvider);
+        Set<UUID> children = new HashSet<UUID>();
+        children.addAll(ap.getChildrenIds());
+        children.add(pp.getId());
+        ConfigurationEntry newAp = new ConfigurationEntry(ap.getId(), ap.getType(), ap.getAttributes(), children, _store);
+        _store.save(newAp, pp);
+    }
+
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org