You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by kw...@apache.org on 2014/04/21 16:28:32 UTC

svn commit: r1588886 [1/6] - in /qpid/trunk/qpid/java: bdbstore/jmx/src/main/java/org/apache/qpid/server/store/berkeleydb/jmx/ bdbstore/jmx/src/test/java/org/apache/qpid/server/store/berkeleydb/jmx/ bdbstore/src/main/java/org/apache/qpid/server/store/b...

Author: kwall
Date: Mon Apr 21 14:28:29 2014
New Revision: 1588886

URL: http://svn.apache.org/r1588886
Log:
QPID-5715: [Java Broker] Add virtual host node to the model and refactor existing broker functionality to conform the new model. Save configuration model version as VHN attribute and refactor the upgraders and configuration recovery.

Added:
    qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/
    qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/
    qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNode.java
    qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeFactory.java
      - copied, changed from r1588885, qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostFactory.java
    qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java
    qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBVirtualHostNode.java
      - copied, changed from r1588885, qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/EnvironmentFacadeFactory.java
    qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBVirtualHostNodeFactory.java
      - copied, changed from r1588885, qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostFactory.java
    qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBVirtualHostNodeImpl.java
    qpid/trunk/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeTest.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/configuration/startup/StoreUpgraderPhase.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/configuration/startup/UpgraderPhaseFactory.java
      - copied, changed from r1588885, qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/store/TestMemoryMessageStoreFactory.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHostNode.java
      - copied, changed from r1588885, qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/plugin/DurableConfigurationStoreFactory.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/VirtualHostStoreUpgraderAndRecoverer.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNode.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/FileBasedVirtualHostNode.java
      - copied, changed from r1588885, qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/DurableConfiguredObjectRecoverer.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/JsonVirtualHostNodeFactory.java
      - copied, changed from r1588885, qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostFactory.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/JsonVirtualHostNodeImpl.java
    qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/virtualhostnode/
    qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNodeTest.java
    qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/virtualhostnode/TestVirtualHostNode.java
    qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/virtualhostnode/TestVirtualHostNodeFactory.java
      - copied, changed from r1588885, qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostFactory.java
    qpid/trunk/qpid/java/broker-core/src/test/resources/META-INF/services/org.apache.qpid.server.plugin.ConfiguredObjectTypeFactory
      - copied, changed from r1588885, qpid/trunk/qpid/java/bdbstore/src/main/resources/META-INF/services/org.apache.qpid.server.plugin.ConfiguredObjectTypeFactory
    qpid/trunk/qpid/java/broker-core/src/test/resources/META-INF/services/org.apache.qpid.server.plugin.DurableConfigurationStoreFactory
      - copied, changed from r1588885, qpid/trunk/qpid/java/bdbstore/src/main/resources/META-INF/services/org.apache.qpid.server.plugin.ConfiguredObjectTypeFactory
    qpid/trunk/qpid/java/broker-plugins/derby-store/src/main/java/org/apache/qpid/server/virtualhostnode/
    qpid/trunk/qpid/java/broker-plugins/derby-store/src/main/java/org/apache/qpid/server/virtualhostnode/derby/
    qpid/trunk/qpid/java/broker-plugins/derby-store/src/main/java/org/apache/qpid/server/virtualhostnode/derby/DerbyVirtualHostNode.java
    qpid/trunk/qpid/java/broker-plugins/derby-store/src/main/java/org/apache/qpid/server/virtualhostnode/derby/DerbyVirtualHostNodeFactory.java
      - copied, changed from r1588885, qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostFactory.java
    qpid/trunk/qpid/java/broker-plugins/derby-store/src/main/resources/META-INF/services/org.apache.qpid.server.plugin.ConfiguredObjectTypeFactory
      - copied, changed from r1588885, qpid/trunk/qpid/java/bdbstore/src/main/resources/META-INF/services/org.apache.qpid.server.plugin.ConfiguredObjectTypeFactory
    qpid/trunk/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhostnode/
    qpid/trunk/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhostnode/jdbc/
    qpid/trunk/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhostnode/jdbc/JDBCVirtualHostNode.java
      - copied, changed from r1588885, qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/store/TestMemoryMessageStoreFactory.java
    qpid/trunk/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhostnode/jdbc/JDBCVirtualHostNodeFactory.java
      - copied, changed from r1588885, qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostFactory.java
    qpid/trunk/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhostnode/jdbc/JDBCVirtualHostNodeImpl.java
    qpid/trunk/qpid/java/broker-plugins/jdbc-store/src/main/resources/META-INF/services/org.apache.qpid.server.plugin.ConfiguredObjectTypeFactory
      - copied, changed from r1588885, qpid/trunk/qpid/java/bdbstore/src/main/resources/META-INF/services/org.apache.qpid.server.plugin.ConfiguredObjectTypeFactory
    qpid/trunk/qpid/java/broker-plugins/memory-store/src/main/java/org/apache/qpid/server/virtualhostnode/
    qpid/trunk/qpid/java/broker-plugins/memory-store/src/main/java/org/apache/qpid/server/virtualhostnode/memory/
    qpid/trunk/qpid/java/broker-plugins/memory-store/src/main/java/org/apache/qpid/server/virtualhostnode/memory/MemoryVirtualHostNode.java
      - copied, changed from r1588885, qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostFactory.java
    qpid/trunk/qpid/java/broker-plugins/memory-store/src/main/java/org/apache/qpid/server/virtualhostnode/memory/MemoryVirtualHostNodeFactory.java
      - copied, changed from r1588885, qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostFactory.java
    qpid/trunk/qpid/java/broker-plugins/memory-store/src/main/resources/META-INF/services/org.apache.qpid.server.plugin.ConfiguredObjectTypeFactory
      - copied, changed from r1588885, qpid/trunk/qpid/java/bdbstore/src/main/resources/META-INF/services/org.apache.qpid.server.plugin.ConfiguredObjectTypeFactory
Removed:
    qpid/trunk/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/VirtualHostTest.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/AbstractDurableConfiguredObjectRecoverer.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/ConfiguredObjectRecordRecoveverAndUpgrader.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/DurableConfigurationRecoverer.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/DurableConfiguredObjectRecoverer.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/UpgraderProvider.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/BindingRecoverer.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/DefaultUpgraderProvider.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/ExchangeRecoverer.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/QueueRecoverer.java
    qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/virtualhost/DurableConfigurationRecovererTest.java
Modified:
    qpid/trunk/qpid/java/bdbstore/jmx/src/main/java/org/apache/qpid/server/store/berkeleydb/jmx/BDBHAMessageStoreManagerMBean.java
    qpid/trunk/qpid/java/bdbstore/jmx/src/main/java/org/apache/qpid/server/store/berkeleydb/jmx/BDBHAMessageStoreManagerMBeanProvider.java
    qpid/trunk/qpid/java/bdbstore/jmx/src/test/java/org/apache/qpid/server/store/berkeleydb/jmx/BDBHAMessageStoreManagerMBeanTest.java
    qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHost.java
    qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostFactory.java
    qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStore.java
    qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreFactory.java
    qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/EnvironmentFacadeFactory.java
    qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/StandardEnvironmentFacade.java
    qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacade.java
    qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacadeFactory.java
    qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom7To8.java
    qpid/trunk/qpid/java/bdbstore/src/main/resources/META-INF/services/org.apache.qpid.server.plugin.ConfiguredObjectTypeFactory
    qpid/trunk/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom7To8Test.java
    qpid/trunk/qpid/java/bdbstore/systests/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBBackupTest.java
    qpid/trunk/qpid/java/bdbstore/systests/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBUpgradeTest.java
    qpid/trunk/qpid/java/bdbstore/systests/src/main/java/org/apache/qpid/server/store/berkeleydb/HAClusterBlackboxTest.java
    qpid/trunk/qpid/java/bdbstore/systests/src/main/java/org/apache/qpid/server/store/berkeleydb/HAClusterTwoNodeTest.java
    qpid/trunk/qpid/java/bdbstore/systests/src/main/java/org/apache/qpid/server/store/berkeleydb/HATestClusterCreator.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/configuration/startup/BrokerStoreUpgrader.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/configuration/store/StoreConfigurationChangeListener.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObjectTypeFactory.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Broker.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/BrokerModel.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHost.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/adapter/StandardVirtualHostFactory.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/AbstractPort.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/AmqpPortImpl.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/plugin/DurableConfigurationStoreFactory.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/AbstractJDBCMessageStore.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/AbstractMemoryMessageStore.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/DurableConfigurationStore.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/JsonFileConfigStore.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/JsonFileConfigStoreFactory.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/MessageStore.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/NullUpgrader.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/StandardVirtualHost.java
    qpid/trunk/qpid/java/broker-core/src/main/resources/META-INF/services/org.apache.qpid.server.plugin.ConfiguredObjectTypeFactory
    qpid/trunk/qpid/java/broker-core/src/main/resources/initial-config.json
    qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/configuration/startup/BrokerRecovererTest.java
    qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/configuration/startup/VirtualHostCreationTest.java
    qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/configuration/store/ConfigurationEntryStoreTestCase.java
    qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/configuration/store/StoreConfigurationChangeListenerTest.java
    qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/logging/actors/BaseActorTestCase.java
    qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/logging/actors/BaseConnectionActorTestCase.java
    qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/model/VirtualHostTest.java
    qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/store/AbstractDurableConfigurationStoreTestCase.java
    qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/store/JsonFileConfigStoreTest.java
    qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/store/TestMemoryMessageStoreFactory.java
    qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/util/BrokerTestHelper.java
    qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/virtualhost/MockVirtualHost.java
    qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/virtualhost/VirtualHostQueueCreationTest.java
    qpid/trunk/qpid/java/broker-plugins/derby-store/src/main/java/org/apache/qpid/server/store/derby/DerbyMessageStoreFactory.java
    qpid/trunk/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/JDBCMessageStore.java
    qpid/trunk/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/JDBCMessageStoreFactory.java
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageContentServlet.java
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageServlet.java
    qpid/trunk/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagementPluginImpl.java
    qpid/trunk/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/MBeanProvider.java
    qpid/trunk/qpid/java/broker-plugins/memory-store/src/main/java/org/apache/qpid/server/store/MemoryMessageStoreFactory.java
    qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/util/Strings.java
    qpid/trunk/qpid/java/qpid-test-utils/src/main/java/org/apache/qpid/test/utils/QpidTestCase.java
    qpid/trunk/qpid/java/systests/etc/config-systests.json
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/client/failover/MultipleBrokersFailoverTest.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/server/logging/AlertingTest.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/server/security/acl/ExternalACLJMXTest.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/server/stats/StatisticsReportingTest.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/server/store/SplitStoreTest.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/server/store/StoreOverfullTest.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/server/store/VirtualHostMessageStoreTest.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/management/jmx/StatisticsTest.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/Asserts.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/BindingRestTest.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/BrokerRestTest.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/ConnectionRestTest.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/ExchangeRestTest.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/QpidRestTestCase.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/QueueRestTest.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/RestTestHelper.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/StructureRestTest.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/VirtualHostRestTest.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/acl/BrokerACLTest.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/acl/ExchangeRestACLTest.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/acl/QueueRestACLTest.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/client/destination/AddressBasedDestinationTest.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/client/timeouts/SyncWaitDelayTest.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/TestBrokerConfiguration.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/TestUtils.java

Modified: qpid/trunk/qpid/java/bdbstore/jmx/src/main/java/org/apache/qpid/server/store/berkeleydb/jmx/BDBHAMessageStoreManagerMBean.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/bdbstore/jmx/src/main/java/org/apache/qpid/server/store/berkeleydb/jmx/BDBHAMessageStoreManagerMBean.java?rev=1588886&r1=1588885&r2=1588886&view=diff
==============================================================================
--- qpid/trunk/qpid/java/bdbstore/jmx/src/main/java/org/apache/qpid/server/store/berkeleydb/jmx/BDBHAMessageStoreManagerMBean.java (original)
+++ qpid/trunk/qpid/java/bdbstore/jmx/src/main/java/org/apache/qpid/server/store/berkeleydb/jmx/BDBHAMessageStoreManagerMBean.java Mon Apr 21 14:28:29 2014
@@ -38,6 +38,7 @@ import javax.management.openmbean.Tabula
 import org.apache.log4j.Logger;
 import org.apache.qpid.server.jmx.AMQManagedObject;
 import org.apache.qpid.server.jmx.ManagedObject;
+import org.apache.qpid.server.jmx.ManagedObjectRegistry;
 import org.apache.qpid.server.store.berkeleydb.replication.ReplicatedEnvironmentFacade;
 
 /**
@@ -75,9 +76,9 @@ public class BDBHAMessageStoreManagerMBe
     private final ReplicatedEnvironmentFacade _replicatedEnvironmentFacade;
     private final String _objectName;
 
-    protected BDBHAMessageStoreManagerMBean(String virtualHostName, ReplicatedEnvironmentFacade replicatedEnvironmentFacade, ManagedObject parent) throws JMException
+    protected BDBHAMessageStoreManagerMBean(String virtualHostName, ReplicatedEnvironmentFacade replicatedEnvironmentFacade, ManagedObjectRegistry registry) throws JMException
     {
-        super(ManagedBDBHAMessageStore.class, ManagedBDBHAMessageStore.TYPE, ((AMQManagedObject)parent).getRegistry());
+        super(ManagedBDBHAMessageStore.class, ManagedBDBHAMessageStore.TYPE, registry);
         LOGGER.debug("Creating BDBHAMessageStoreManagerMBean for " + virtualHostName);
         _replicatedEnvironmentFacade = replicatedEnvironmentFacade;
         _objectName = ObjectName.quote(virtualHostName);

Modified: qpid/trunk/qpid/java/bdbstore/jmx/src/main/java/org/apache/qpid/server/store/berkeleydb/jmx/BDBHAMessageStoreManagerMBeanProvider.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/bdbstore/jmx/src/main/java/org/apache/qpid/server/store/berkeleydb/jmx/BDBHAMessageStoreManagerMBeanProvider.java?rev=1588886&r1=1588885&r2=1588886&view=diff
==============================================================================
--- qpid/trunk/qpid/java/bdbstore/jmx/src/main/java/org/apache/qpid/server/store/berkeleydb/jmx/BDBHAMessageStoreManagerMBeanProvider.java (original)
+++ qpid/trunk/qpid/java/bdbstore/jmx/src/main/java/org/apache/qpid/server/store/berkeleydb/jmx/BDBHAMessageStoreManagerMBeanProvider.java Mon Apr 21 14:28:29 2014
@@ -26,11 +26,14 @@ import javax.management.StandardMBean;
 import org.apache.log4j.Logger;
 import org.apache.qpid.server.jmx.MBeanProvider;
 import org.apache.qpid.server.jmx.ManagedObject;
+import org.apache.qpid.server.jmx.ManagedObjectRegistry;
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.model.VirtualHost;
+import org.apache.qpid.server.model.VirtualHostNode;
 import org.apache.qpid.server.store.berkeleydb.BDBHAVirtualHost;
 import org.apache.qpid.server.store.berkeleydb.BDBMessageStore;
 import org.apache.qpid.server.store.berkeleydb.replication.ReplicatedEnvironmentFacade;
+import org.apache.qpid.server.virtualhostnode.berkeleydb.BDBHAVirtualHostNode;
 
 /**
  * This provide will create a {@link BDBHAMessageStoreManagerMBean} if the child is a virtual
@@ -49,15 +52,15 @@ public class BDBHAMessageStoreManagerMBe
     @Override
     public boolean isChildManageableByMBean(ConfiguredObject child)
     {
-        return (child instanceof VirtualHost && BDBHAVirtualHost.TYPE.equals(child.getType()));
+        return child instanceof BDBHAVirtualHostNode;
     }
 
     @Override
-    public StandardMBean createMBean(ConfiguredObject child, StandardMBean parent) throws JMException
+    public ManagedObject createMBean(ConfiguredObject child, ManagedObjectRegistry registry) throws JMException
     {
-        VirtualHost virtualHostChild = (VirtualHost) child;
+        BDBHAVirtualHostNode<?> virtualHostNode = (BDBHAVirtualHostNode<?>) child;
 
-        BDBMessageStore messageStore = (BDBMessageStore) virtualHostChild.getMessageStore();
+        BDBMessageStore messageStore = (BDBMessageStore) virtualHostNode.getConfigurationStore();
 
         if (LOGGER.isDebugEnabled())
         {
@@ -65,7 +68,7 @@ public class BDBHAMessageStoreManagerMBe
         }
 
         ReplicatedEnvironmentFacade replicatedEnvironmentFacade = (ReplicatedEnvironmentFacade)messageStore.getEnvironmentFacade();
-        return new BDBHAMessageStoreManagerMBean(virtualHostChild.getName(), replicatedEnvironmentFacade, (ManagedObject) parent);
+        return new BDBHAMessageStoreManagerMBean(virtualHostNode.getGroupName(), replicatedEnvironmentFacade, registry);
     }
 
     @Override

Modified: qpid/trunk/qpid/java/bdbstore/jmx/src/test/java/org/apache/qpid/server/store/berkeleydb/jmx/BDBHAMessageStoreManagerMBeanTest.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/bdbstore/jmx/src/test/java/org/apache/qpid/server/store/berkeleydb/jmx/BDBHAMessageStoreManagerMBeanTest.java?rev=1588886&r1=1588885&r2=1588886&view=diff
==============================================================================
--- qpid/trunk/qpid/java/bdbstore/jmx/src/test/java/org/apache/qpid/server/store/berkeleydb/jmx/BDBHAMessageStoreManagerMBeanTest.java (original)
+++ qpid/trunk/qpid/java/bdbstore/jmx/src/test/java/org/apache/qpid/server/store/berkeleydb/jmx/BDBHAMessageStoreManagerMBeanTest.java Mon Apr 21 14:28:29 2014
@@ -54,7 +54,6 @@ public class BDBHAMessageStoreManagerMBe
 
     private ReplicatedEnvironmentFacade _replicatedEnvironmentFacade;
     private BDBHAMessageStoreManagerMBean _mBean;
-    private AMQManagedObject _mBeanParent;
 
     @Override
     protected void setUp() throws Exception
@@ -62,9 +61,8 @@ public class BDBHAMessageStoreManagerMBe
         super.setUp();
 
         _replicatedEnvironmentFacade = mock(ReplicatedEnvironmentFacade.class);
-        _mBeanParent = mock(AMQManagedObject.class);
-        when(_mBeanParent.getRegistry()).thenReturn(mock(ManagedObjectRegistry.class));
-        _mBean = new BDBHAMessageStoreManagerMBean(TEST_STORE_NAME, _replicatedEnvironmentFacade, _mBeanParent);
+        ManagedObjectRegistry registry = mock(ManagedObjectRegistry.class);
+        _mBean = new BDBHAMessageStoreManagerMBean(TEST_STORE_NAME, _replicatedEnvironmentFacade, registry);
     }
 
     @Override

Modified: qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHost.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHost.java?rev=1588886&r1=1588885&r2=1588886&view=diff
==============================================================================
--- qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHost.java (original)
+++ qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHost.java Mon Apr 21 14:28:29 2014
@@ -20,93 +20,34 @@
  */
 package org.apache.qpid.server.store.berkeleydb;
 
-import java.util.HashMap;
 import java.util.Map;
 
-import com.sleepycat.je.rep.StateChangeEvent;
-import com.sleepycat.je.rep.StateChangeListener;
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.server.connection.IConnectionRegistry;
-import org.apache.qpid.server.logging.messages.MessageStoreMessages;
 import org.apache.qpid.server.logging.subjects.MessageStoreLogSubject;
-import org.apache.qpid.server.model.Broker;
 import org.apache.qpid.server.model.ManagedObject;
-import org.apache.qpid.server.model.VirtualHost;
-import org.apache.qpid.server.store.ConfiguredObjectRecordRecoveverAndUpgrader;
+import org.apache.qpid.server.model.VirtualHostNode;
 import org.apache.qpid.server.store.DurableConfigurationStore;
 import org.apache.qpid.server.store.MessageStore;
-import org.apache.qpid.server.store.berkeleydb.replication.ReplicatedEnvironmentFacade;
-import org.apache.qpid.server.store.berkeleydb.replication.ReplicatedEnvironmentFacadeFactory;
-import org.apache.qpid.server.store.handler.ConfiguredObjectRecordHandler;
 import org.apache.qpid.server.virtualhost.AbstractVirtualHost;
-import org.apache.qpid.server.virtualhost.MessageStoreRecoverer;
-import org.apache.qpid.server.virtualhost.VirtualHostState;
 
 @ManagedObject( category = false, type = "BDB_HA" )
 public class BDBHAVirtualHost extends AbstractVirtualHost<BDBHAVirtualHost>
 {
     public static final String TYPE = "BDB_HA";
-    private static final Logger LOGGER = Logger.getLogger(BDBHAVirtualHost.class);
 
-    private BDBMessageStore _messageStore;
+    private final BDBMessageStore _messageStore;
     private MessageStoreLogSubject _messageStoreLogSubject;
 
-    BDBHAVirtualHost(final Map<String, Object> attributes, Broker<?> broker)
+    protected BDBHAVirtualHost(final Map<String, Object> attributes, VirtualHostNode<?> virtualHostNode)
     {
-        super(attributes, broker);
-    }
+        super(attributes, virtualHostNode);
 
-
-    @Override
-    public void validate()
-    {
-        super.validate();
-        Map<String, Object> attributes = getActualAttributes();
-        @SuppressWarnings("unchecked")
-        Map<String, Object> messageStoreSettings = (Map<String, Object>)attributes.get(org.apache.qpid.server.model.VirtualHost.MESSAGE_STORE_SETTINGS);
-        if (messageStoreSettings == null)
-        {
-            throw new IllegalArgumentException("Attribute '"+ org.apache.qpid.server.model.VirtualHost.MESSAGE_STORE_SETTINGS + "' is required.");
-        }
-
-        validateAttribute(MessageStore.STORE_PATH, String.class, messageStoreSettings);
-        validateAttribute(ReplicatedEnvironmentFacadeFactory.GROUP_NAME, String.class, messageStoreSettings);
-        validateAttribute(ReplicatedEnvironmentFacadeFactory.NODE_NAME, String.class, messageStoreSettings);
-        validateAttribute(ReplicatedEnvironmentFacadeFactory.NODE_ADDRESS, String.class, messageStoreSettings);
-        validateAttribute(ReplicatedEnvironmentFacadeFactory.HELPER_ADDRESS, String.class, messageStoreSettings);
+        _messageStore = (BDBMessageStore) virtualHostNode.getConfigurationStore();
+        _messageStoreLogSubject = new MessageStoreLogSubject(getName(), _messageStore.getClass().getSimpleName());
     }
 
-    private void validateAttribute(String attrName, Class<?> clazz, Map<String, Object> attributes)
-    {
-        Object attr = attributes.get(attrName);
-        if(!clazz.isInstance(attr))
-        {
-            throw new IllegalArgumentException("Attribute '"+ attrName
-                                               +"' is required and must be of type "+clazz.getSimpleName()+".");
-        }
-    }
-
-    protected void initialiseStorage(VirtualHost virtualHost)
+    @Override
+    protected void initialiseStorage()
     {
-        setState(VirtualHostState.PASSIVE);
-
-        _messageStoreLogSubject = new MessageStoreLogSubject(getName(), BDBMessageStore.class.getSimpleName());
-        _messageStore = new BDBMessageStore(new ReplicatedEnvironmentFacadeFactory());
-        getEventLogger().message(_messageStoreLogSubject, MessageStoreMessages.CREATED());
-
-        Map<String, Object> messageStoreSettings = new HashMap<String, Object>(virtualHost.getMessageStoreSettings());
-        messageStoreSettings.put(DurableConfigurationStore.IS_MESSAGE_STORE_TOO, true);
-
-        _messageStore.openConfigurationStore(virtualHost, messageStoreSettings);
-        _messageStore.openMessageStore(virtualHost, messageStoreSettings);
-
-        getEventLogger().message(_messageStoreLogSubject, MessageStoreMessages.STORE_LOCATION(_messageStore.getStoreLocation()));
-
-        // Make the virtualhost model object a replication group listener
-        ReplicatedEnvironmentFacade environmentFacade = (ReplicatedEnvironmentFacade) _messageStore.getEnvironmentFacade();
-        environmentFacade.setStateChangeListener(new BDBHAMessageStoreStateChangeListener());
-
     }
 
     @Override
@@ -121,98 +62,10 @@ public class BDBHAVirtualHost extends Ab
         return _messageStore;
     }
 
-    private void onMaster()
-    {
-        try
-        {
-            _messageStore.getEnvironmentFacade().getEnvironment().flushLog(true);
-
-            if(isStoreEmpty())
-            {
-                createDefaultExchanges();
-            }
-            else
-            {
-                ConfiguredObjectRecordHandler upgraderRecoverer =
-                        new ConfiguredObjectRecordRecoveverAndUpgrader(this, getDurableConfigurationRecoverers());
-                _messageStore.visitConfiguredObjectRecords(upgraderRecoverer);
-            }
-
-            new MessageStoreRecoverer(this, getMessageStoreLogSubject()).recover();
-
-            attainActivation();
-        }
-        catch (Exception e)
-        {
-            LOGGER.error("Failed to activate on hearing MASTER change event", e);
-        }
-    }
-
-    private void passivate()
-    {
-        VirtualHostState finalState = VirtualHostState.ERRORED;
-
-        try
-        {
-            /* the approach here is not ideal as there is a race condition where a
-             * queue etc could be created while the virtual host is on the way to
-             * the passivated state.  However the store state change from MASTER to UNKNOWN
-             * is documented as exceptionally rare.
-             */
-
-            getConnectionRegistry().close(IConnectionRegistry.VHOST_PASSIVATE_REPLY_TEXT);
-            removeHouseKeepingTasks();
-
-            getDtxRegistry().close();
-
-            finalState = VirtualHostState.PASSIVE;
-        }
-        finally
-        {
-            setState(finalState);
-            reportIfError(getVirtualHostState());
-        }
-    }
-
     @Override
     protected MessageStoreLogSubject getMessageStoreLogSubject()
     {
         return _messageStoreLogSubject;
     }
 
-    private class BDBHAMessageStoreStateChangeListener implements StateChangeListener
-    {
-
-        @Override
-        public void stateChange(StateChangeEvent stateChangeEvent) throws RuntimeException
-        {
-            com.sleepycat.je.rep.ReplicatedEnvironment.State state = stateChangeEvent.getState();
-
-            if (LOGGER.isInfoEnabled())
-            {
-                LOGGER.info("Received BDB event indicating transition to state " + state);
-            }
-
-            switch (state)
-            {
-            case MASTER:
-                onMaster();
-                break;
-            case REPLICA:
-                passivate();
-                break;
-            case DETACHED:
-                LOGGER.error("BDB replicated node in detached state, therefore passivating.");
-                passivate();
-                break;
-            case UNKNOWN:
-                LOGGER.warn("BDB replicated node in unknown state (hopefully temporarily)");
-                break;
-            default:
-                LOGGER.error("Unexpected state change: " + state);
-                throw new IllegalStateException("Unexpected state change: " + state);
-            }
-        }
-    }
-
 }

Modified: qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostFactory.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostFactory.java?rev=1588886&r1=1588885&r2=1588886&view=diff
==============================================================================
--- qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostFactory.java (original)
+++ qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostFactory.java Mon Apr 21 14:28:29 2014
@@ -20,13 +20,11 @@
  */
 package org.apache.qpid.server.store.berkeleydb;
 
+import java.util.Map;
+
 import org.apache.qpid.server.model.AbstractConfiguredObjectTypeFactory;
-import org.apache.qpid.server.model.Broker;
 import org.apache.qpid.server.model.ConfiguredObject;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.UUID;
+import org.apache.qpid.server.model.VirtualHostNode;
 
 public class BDBHAVirtualHostFactory extends AbstractConfiguredObjectTypeFactory<BDBHAVirtualHost>
 {
@@ -40,9 +38,8 @@ public class BDBHAVirtualHostFactory ext
     public BDBHAVirtualHost createInstance(final Map<String, Object> attributes,
                                                  final ConfiguredObject<?>... parents)
     {
-        final Broker broker = getParent(Broker.class, parents);
-        return new BDBHAVirtualHost(attributes, broker);
+        final VirtualHostNode<?> virtualHostNode = getParent(VirtualHostNode.class, parents);
+        return new BDBHAVirtualHost(attributes, virtualHostNode);
     }
 
-
 }

Modified: qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStore.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStore.java?rev=1588886&r1=1588885&r2=1588886&view=diff
==============================================================================
--- qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStore.java (original)
+++ qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStore.java Mon Apr 21 14:28:29 2014
@@ -27,6 +27,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Random;
 import java.util.UUID;
@@ -36,6 +37,7 @@ import java.util.concurrent.atomic.Atomi
 import org.apache.log4j.Logger;
 import org.apache.qpid.server.message.EnqueueableMessage;
 import org.apache.qpid.server.model.ConfiguredObject;
+import org.apache.qpid.server.model.VirtualHostNode;
 import org.apache.qpid.server.store.ConfiguredObjectRecord;
 import org.apache.qpid.server.store.DurableConfigurationStore;
 import org.apache.qpid.server.store.Event;
@@ -128,6 +130,9 @@ public class BDBMessageStore implements 
 
     private volatile Committer _committer;
 
+    private boolean _isMessageStoreProvider;
+
+    private String _storeLocation;
 
     public BDBMessageStore()
     {
@@ -153,7 +158,8 @@ public class BDBMessageStore implements 
             if (_environmentFacade == null)
             {
                 EnvironmentFacadeTask[] initialisationTasks = null;
-                if (MapValueConverter.getBooleanAttribute(IS_MESSAGE_STORE_TOO, storeSettings, false))
+                _isMessageStoreProvider = MapValueConverter.getBooleanAttribute(VirtualHostNode.IS_MESSAGE_STORE_PROVIDER, storeSettings, false);
+                if (_isMessageStoreProvider)
                 {
                     String[] databaseNames = new String[CONFIGURATION_STORE_DATABASE_NAMES.length + MESSAGE_STORE_DATABASE_NAMES.length];
                     System.arraycopy(CONFIGURATION_STORE_DATABASE_NAMES, 0, databaseNames, 0, CONFIGURATION_STORE_DATABASE_NAMES.length);
@@ -165,6 +171,7 @@ public class BDBMessageStore implements 
                     initialisationTasks = new EnvironmentFacadeTask[]{new UpgradeTask(parent), new OpenDatabasesTask(CONFIGURATION_STORE_DATABASE_NAMES)};
                 }
                 _environmentFacade = _environmentFacadeFactory.createEnvironmentFacade(storeSettings, initialisationTasks);
+                _storeLocation = _environmentFacade.getStoreLocation();
             }
             else
             {
@@ -274,6 +281,7 @@ public class BDBMessageStore implements 
             {
                 _environmentFacade = _environmentFacadeFactory.createEnvironmentFacade(messageStoreSettings,
                         new UpgradeTask(parent), new OpenDatabasesTask(MESSAGE_STORE_DATABASE_NAMES), new DiskSpaceTask(), new MaxMessageIdTask());
+                _storeLocation = _environmentFacade.getStoreLocation();
             }
 
             _committer = _environmentFacade.createCommitter(parent.getName());
@@ -292,11 +300,7 @@ public class BDBMessageStore implements 
     @Override
     public String getStoreLocation()
     {
-        if (_environmentFacade == null)
-        {
-            return null;
-        }
-        return _environmentFacade.getStoreLocation();
+        return _storeLocation;
     }
 
     public EnvironmentFacade getEnvironmentFacade()
@@ -355,6 +359,7 @@ public class BDBMessageStore implements 
             try
             {
                 _environmentFacade.close();
+                _environmentFacade = null;
             }
             catch(DatabaseException e)
             {
@@ -1514,21 +1519,22 @@ public class BDBMessageStore implements 
     @Override
     public void onDelete()
     {
-        String storeLocation = getStoreLocation();
-
-        if (storeLocation != null)
+        if (!_configurationStoreOpen.get() && !_messageStoreOpen.get())
         {
-            if (LOGGER.isDebugEnabled())
+            if (_storeLocation != null)
             {
-                LOGGER.debug("Deleting store " + storeLocation);
-            }
+                if (LOGGER.isDebugEnabled())
+                {
+                    LOGGER.debug("Deleting store " + _storeLocation);
+                }
 
-            File location = new File(storeLocation);
-            if (location.exists())
-            {
-                if (!FileUtils.delete(location, true))
+                File location = new File(_storeLocation);
+                if (location.exists())
                 {
-                    LOGGER.error("Cannot delete " + storeLocation);
+                    if (!FileUtils.delete(location, true))
+                    {
+                        LOGGER.error("Cannot delete " + _storeLocation);
+                    }
                 }
             }
         }
@@ -1711,6 +1717,7 @@ public class BDBMessageStore implements 
         checkMessageStoreOpen();
 
         Cursor cursor = null;
+        List<QueueEntryKey> entries = new ArrayList<QueueEntryKey>();
         try
         {
             cursor = getDeliveryDb().openCursor(null, null);
@@ -1718,15 +1725,10 @@ public class BDBMessageStore implements 
             QueueEntryBinding keyBinding = QueueEntryBinding.getInstance();
 
             DatabaseEntry value = new DatabaseEntry();
-            while (cursor.getNext(key, value, LockMode.RMW) == OperationStatus.SUCCESS)
+            while (cursor.getNext(key, value, LockMode.DEFAULT) == OperationStatus.SUCCESS)
             {
                 QueueEntryKey entry = keyBinding.entryToObject(key);
-                UUID queueId = entry.getQueueId();
-                long messageId = entry.getMessageId();
-                if (!handler.handle(queueId, messageId))
-                {
-                    break;
-                }
+                entries.add(entry);
             }
         }
         catch (DatabaseException e)
@@ -1737,6 +1739,17 @@ public class BDBMessageStore implements 
         {
             closeCursorSafely(cursor);
         }
+
+        for(QueueEntryKey entry : entries)
+        {
+            UUID queueId = entry.getQueueId();
+            long messageId = entry.getMessageId();
+            if (!handler.handle(queueId, messageId))
+            {
+                break;
+            }
+        }
+
     }
 
     @Override

Modified: qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreFactory.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreFactory.java?rev=1588886&r1=1588885&r2=1588886&view=diff
==============================================================================
--- qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreFactory.java (original)
+++ qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreFactory.java Mon Apr 21 14:28:29 2014
@@ -64,16 +64,18 @@ public class BDBMessageStoreFactory impl
 
             }
         }
+    }
 
-        @SuppressWarnings("unchecked")
-        Map<String, Object> configurationStoreSettings = (Map<String, Object>) attributes.get(VirtualHost.CONFIGURATION_STORE_SETTINGS);
+    @Override
+    public void validateConfigurationStoreSettings(Map<String, Object> configurationStoreSettings)
+    {
         if(configurationStoreSettings != null && getType().equals(configurationStoreSettings.get(DurableConfigurationStore.STORE_TYPE)))
         {
             Object storePath = configurationStoreSettings.get(DurableConfigurationStore.STORE_PATH);
             if(!(storePath instanceof String))
             {
-                throw new IllegalArgumentException("Setting '"+ DurableConfigurationStore.STORE_PATH
-                                                               +"' is required and must be of type String.");
+                throw new IllegalArgumentException("Durable configuration store setting '" + DurableConfigurationStore.STORE_PATH
+                        + "' is required and must be of type String.");
 
             }
         }

Modified: qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/EnvironmentFacadeFactory.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/EnvironmentFacadeFactory.java?rev=1588886&r1=1588885&r2=1588886&view=diff
==============================================================================
--- qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/EnvironmentFacadeFactory.java (original)
+++ qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/EnvironmentFacadeFactory.java Mon Apr 21 14:28:29 2014
@@ -24,7 +24,7 @@ import java.util.Map;
 
 public interface EnvironmentFacadeFactory
 {
-    public static final String ENVIRONMENT_CONFIGURATION = "bdbEnvironmentConfig";
+    public static final String ENVIRONMENT_CONFIGURATION = "environmentConfiguration";
 
     EnvironmentFacade createEnvironmentFacade(Map<String, Object> storeSettings, EnvironmentFacadeTask... initialisationTasks);
 

Modified: qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/StandardEnvironmentFacade.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/StandardEnvironmentFacade.java?rev=1588886&r1=1588885&r2=1588886&view=diff
==============================================================================
--- qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/StandardEnvironmentFacade.java (original)
+++ qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/StandardEnvironmentFacade.java Mon Apr 21 14:28:29 2014
@@ -232,5 +232,4 @@ public class StandardEnvironmentFacade i
     {
         return _storePath;
     }
-
 }

Modified: qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacade.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacade.java?rev=1588886&r1=1588885&r2=1588886&view=diff
==============================================================================
--- qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacade.java (original)
+++ qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacade.java Mon Apr 21 14:28:29 2014
@@ -1103,4 +1103,5 @@ public class ReplicatedEnvironmentFacade
         }
 
     }
+
 }

Modified: qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacadeFactory.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacadeFactory.java?rev=1588886&r1=1588885&r2=1588886&view=diff
==============================================================================
--- qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacadeFactory.java (original)
+++ qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacadeFactory.java Mon Apr 21 14:28:29 2014
@@ -20,31 +20,14 @@
  */
 package org.apache.qpid.server.store.berkeleydb.replication;
 
-import com.sleepycat.je.Durability;
-import com.sleepycat.je.Durability.ReplicaAckPolicy;
-import com.sleepycat.je.Durability.SyncPolicy;
-import org.apache.qpid.server.store.MessageStore;
+import java.util.Map;
+
 import org.apache.qpid.server.store.berkeleydb.EnvironmentFacade;
 import org.apache.qpid.server.store.berkeleydb.EnvironmentFacadeFactory;
-
-import java.util.Map;
+import org.apache.qpid.server.virtualhostnode.berkeleydb.BDBHAVirtualHostNodeImpl;
 
 public class ReplicatedEnvironmentFacadeFactory implements EnvironmentFacadeFactory
 {
-    public static final String DURABILITY = "haDurability";
-    public static final String GROUP_NAME = "haGroupName";
-    public static final String HELPER_ADDRESS = "haHelperAddress";
-    public static final String NODE_ADDRESS = "haNodeAddress";
-    public static final String NODE_NAME = "haNodeName";
-    public static final String REPLICATION_CONFIG = "haReplicationConfig";
-    public static final String COALESCING_SYNC = "haCoalescingSync";
-    public static final String DESIGNATED_PRIMARY = "haDesignatedPrimary";
-
-    private static final int DEFAULT_NODE_PRIORITY = 1;
-    private static final Durability DEFAULT_DURABILITY = new Durability(SyncPolicy.NO_SYNC, SyncPolicy.NO_SYNC,
-            ReplicaAckPolicy.SIMPLE_MAJORITY);
-    private static final boolean DEFAULT_COALESCING_SYNC = true;
-
     @Override
     public EnvironmentFacade createEnvironmentFacade(final Map<String, Object> messageStoreSettings, EnvironmentFacadeTask... initialisationTasks)
     {
@@ -53,77 +36,76 @@ public class ReplicatedEnvironmentFacade
             @Override
             public boolean isDesignatedPrimary()
             {
-                return convertBoolean(messageStoreSettings.get(DESIGNATED_PRIMARY), false);
+                return (Boolean)messageStoreSettings.get(BDBHAVirtualHostNodeImpl.DESIGNATED_PRIMARY);
             }
 
             @Override
             public boolean isCoalescingSync()
             {
-                return convertBoolean(messageStoreSettings.get(COALESCING_SYNC), DEFAULT_COALESCING_SYNC);
+                return (Boolean)messageStoreSettings.get(BDBHAVirtualHostNodeImpl.COALESCING_SYNC);
             }
 
             @Override
             public String getStorePath()
             {
-                return (String) messageStoreSettings.get(MessageStore.STORE_PATH);
+                return (String) messageStoreSettings.get(BDBHAVirtualHostNodeImpl.STORE_PATH);
             }
 
             @SuppressWarnings("unchecked")
             @Override
             public Map<String, String> getParameters()
             {
-                return (Map<String, String>) messageStoreSettings.get(EnvironmentFacadeFactory.ENVIRONMENT_CONFIGURATION);
+                return (Map<String, String>) messageStoreSettings.get(BDBHAVirtualHostNodeImpl.ENVIRONMENT_CONFIGURATION);
             }
 
             @SuppressWarnings("unchecked")
             @Override
             public Map<String, String> getReplicationParameters()
             {
-                return (Map<String, String>) messageStoreSettings.get(REPLICATION_CONFIG);
+                return (Map<String, String>) messageStoreSettings.get(BDBHAVirtualHostNodeImpl.REPLICATED_ENVIRONMENT_CONFIGURATION);
             }
 
             @Override
             public int getQuorumOverride()
             {
-                return 0;
+                return (Integer)messageStoreSettings.get(BDBHAVirtualHostNodeImpl.QUORUM_OVERRIDE);
             }
 
             @Override
             public int getPriority()
             {
-                return DEFAULT_NODE_PRIORITY;
+                return (Integer)messageStoreSettings.get(BDBHAVirtualHostNodeImpl.PRIORITY);
             }
 
             @Override
             public String getName()
             {
-                return (String)messageStoreSettings.get(NODE_NAME);
+                return (String)messageStoreSettings.get(BDBHAVirtualHostNodeImpl.NAME);
             }
 
             @Override
             public String getHostPort()
             {
-                return (String)messageStoreSettings.get(NODE_ADDRESS);
+                return (String)messageStoreSettings.get(BDBHAVirtualHostNodeImpl.ADDRESS);
             }
 
             @Override
             public String getHelperHostPort()
             {
-                return (String)messageStoreSettings.get(HELPER_ADDRESS);
+                return (String)messageStoreSettings.get(BDBHAVirtualHostNodeImpl.HELPER_ADDRESS);
             }
 
             @Override
             public String getGroupName()
             {
-                return (String)messageStoreSettings.get(GROUP_NAME);
+                return (String)messageStoreSettings.get(BDBHAVirtualHostNodeImpl.GROUP_NAME);
             }
 
             @Override
             public String getDurability()
             {
-                String durability = (String)messageStoreSettings.get(DURABILITY);
-                return durability == null ? DEFAULT_DURABILITY.toString() : durability;
-            }
+                return (String)messageStoreSettings.get(BDBHAVirtualHostNodeImpl.DURABILITY);
+             }
         };
         return new ReplicatedEnvironmentFacade(configuration, initialisationTasks);
 
@@ -135,24 +117,4 @@ public class ReplicatedEnvironmentFacade
         return ReplicatedEnvironmentFacade.TYPE;
     }
 
-    private boolean convertBoolean(final Object value, boolean defaultValue)
-    {
-        if(value instanceof Boolean)
-        {
-            return (Boolean) value;
-        }
-        else if(value instanceof String)
-        {
-            return Boolean.valueOf((String) value);
-        }
-        else if(value == null)
-        {
-            return defaultValue;
-        }
-        else
-        {
-            throw new IllegalArgumentException("Cannot convert type " + value.getClass() + " to a Boolean");
-        }
-    }
-
 }

Modified: qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom7To8.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom7To8.java?rev=1588886&r1=1588885&r2=1588886&view=diff
==============================================================================
--- qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom7To8.java (original)
+++ qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom7To8.java Mon Apr 21 14:28:29 2014
@@ -78,7 +78,7 @@ public class UpgradeFrom7To8 extends Abs
 
         Map<String, Object> virtualHostAttributes = new HashMap<String, Object>();
         virtualHostAttributes.put("modelVersion", stringifiedConfigVersion);
-
+        virtualHostAttributes.put("name", parent.getName());
         String virtualHostName = parent.getName();
         UUID virtualHostId = UUIDGenerator.generateVhostUUID(virtualHostName);
         ConfiguredObjectRecord virtualHostRecord = new org.apache.qpid.server.store.ConfiguredObjectRecordImpl(virtualHostId, "VirtualHost", virtualHostAttributes);

Added: qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNode.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNode.java?rev=1588886&view=auto
==============================================================================
--- qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNode.java (added)
+++ qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNode.java Mon Apr 21 14:28:29 2014
@@ -0,0 +1,65 @@
+/*
+ *
+ * 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.virtualhostnode.berkeleydb;
+
+import java.util.Map;
+
+import org.apache.qpid.server.model.ManagedAttribute;
+
+public interface BDBHAVirtualHostNode<X extends BDBHAVirtualHostNode<X>> extends BDBVirtualHostNode<X>
+{
+    public static final String GROUP_NAME = "groupName";
+    public static final String ADDRESS = "address";
+    public static final String HELPER_ADDRESS = "helperAddress";
+    public static final String DURABILITY = "durability";
+    public static final String COALESCING_SYNC = "coalescingSync";
+    public static final String DESIGNATED_PRIMARY = "designatedPrimary";
+    public static final String PRIORITY = "priority";
+    public static final String QUORUM_OVERRIDE = "quorumOverride";
+    public static final String REPLICATED_ENVIRONMENT_CONFIGURATION = "replicatedEnvironmentConfiguration";
+
+    @ManagedAttribute(automate = true, mandatory=true)
+    String getGroupName();
+
+    @ManagedAttribute(automate = true, mandatory=true)
+    String getAddress();
+
+    @ManagedAttribute(automate = true, mandatory=true)
+    String getHelperAddress();
+
+    @ManagedAttribute(automate = true, defaultValue = "NO_SYNC,NO_SYNC,SIMPLE_MAJORITY")
+    String getDurability();
+
+    @ManagedAttribute(automate = true, defaultValue = "true")
+    boolean isCoalescingSync();
+
+    @ManagedAttribute(automate = true, defaultValue = "false")
+    boolean isDesignatedPrimary();
+
+    @ManagedAttribute(automate = true, defaultValue = "1")
+    int getPriority();
+
+    @ManagedAttribute(automate = true, defaultValue = "0")
+    int getQuorumOverride();
+
+    @ManagedAttribute(automate = true)
+    Map<String, String> getReplicatedEnvironmentConfiguration();
+}

Copied: qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeFactory.java (from r1588885, qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostFactory.java)
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeFactory.java?p2=qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeFactory.java&p1=qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostFactory.java&r1=1588885&r2=1588886&rev=1588886&view=diff
==============================================================================
--- qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostFactory.java (original)
+++ qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeFactory.java Mon Apr 21 14:28:29 2014
@@ -18,31 +18,27 @@
  * under the License.
  *
  */
-package org.apache.qpid.server.store.berkeleydb;
+
+package org.apache.qpid.server.virtualhostnode.berkeleydb;
+
+import java.util.Map;
 
 import org.apache.qpid.server.model.AbstractConfiguredObjectTypeFactory;
 import org.apache.qpid.server.model.Broker;
 import org.apache.qpid.server.model.ConfiguredObject;
 
-import java.util.HashMap;
-import java.util.Map;
-import java.util.UUID;
-
-public class BDBHAVirtualHostFactory extends AbstractConfiguredObjectTypeFactory<BDBHAVirtualHost>
+public class BDBHAVirtualHostNodeFactory extends AbstractConfiguredObjectTypeFactory<BDBHAVirtualHostNodeImpl>
 {
-
-    public BDBHAVirtualHostFactory()
+    public BDBHAVirtualHostNodeFactory()
     {
-        super(BDBHAVirtualHost.class);
+        super(BDBHAVirtualHostNodeImpl.class);
     }
 
     @Override
-    public BDBHAVirtualHost createInstance(final Map<String, Object> attributes,
-                                                 final ConfiguredObject<?>... parents)
+    public BDBHAVirtualHostNodeImpl createInstance(Map<String, Object> attributes, ConfiguredObject<?>... parents)
     {
-        final Broker broker = getParent(Broker.class, parents);
-        return new BDBHAVirtualHost(attributes, broker);
+        Broker<?> broker = getParent(Broker.class, parents);
+        return new BDBHAVirtualHostNodeImpl(broker, attributes, broker.getTaskExecutor());
     }
 
-
 }

Added: qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java?rev=1588886&view=auto
==============================================================================
--- qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java (added)
+++ qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java Mon Apr 21 14:28:29 2014
@@ -0,0 +1,537 @@
+/*
+ *
+ * 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.virtualhostnode.berkeleydb;
+
+import java.security.PrivilegedAction;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicReference;
+
+import javax.security.auth.Subject;
+
+import org.apache.log4j.Logger;
+import org.apache.qpid.server.configuration.updater.TaskExecutor;
+import org.apache.qpid.server.logging.EventLogger;
+import org.apache.qpid.server.logging.messages.ConfigStoreMessages;
+import org.apache.qpid.server.logging.subjects.MessageStoreLogSubject;
+import org.apache.qpid.server.model.AbstractConfiguredObject;
+import org.apache.qpid.server.model.Broker;
+import org.apache.qpid.server.model.BrokerModel;
+import org.apache.qpid.server.model.ConfiguredObject;
+import org.apache.qpid.server.model.ConfiguredObjectFactory;
+import org.apache.qpid.server.model.LifetimePolicy;
+import org.apache.qpid.server.model.ManagedAttributeField;
+import org.apache.qpid.server.model.ManagedObject;
+import org.apache.qpid.server.model.State;
+import org.apache.qpid.server.model.SystemContext;
+import org.apache.qpid.server.model.VirtualHost;
+import org.apache.qpid.server.model.VirtualHostNode;
+import org.apache.qpid.server.security.SecurityManager;
+import org.apache.qpid.server.store.DurableConfigurationStore;
+import org.apache.qpid.server.store.VirtualHostStoreUpgraderAndRecoverer;
+import org.apache.qpid.server.store.berkeleydb.BDBHAVirtualHost;
+import org.apache.qpid.server.store.berkeleydb.BDBHAVirtualHostFactory;
+import org.apache.qpid.server.store.berkeleydb.BDBMessageStore;
+import org.apache.qpid.server.store.berkeleydb.replication.ReplicatedEnvironmentFacade;
+import org.apache.qpid.server.store.berkeleydb.replication.ReplicatedEnvironmentFacadeFactory;
+import org.apache.qpid.server.virtualhost.VirtualHostState;
+
+import com.sleepycat.je.rep.StateChangeEvent;
+import com.sleepycat.je.rep.StateChangeListener;
+
+@ManagedObject( category = false, type = "BDB_HA" )
+public class BDBHAVirtualHostNodeImpl extends AbstractConfiguredObject<BDBHAVirtualHostNodeImpl> implements BDBHAVirtualHostNode<BDBHAVirtualHostNodeImpl>
+{
+    private static final Logger LOGGER = Logger.getLogger(BDBHAVirtualHostNodeImpl.class);
+
+    @ManagedAttributeField
+    private Map<String, String> _environmentConfiguration;
+
+    @ManagedAttributeField
+    private String _storePath;
+
+    @ManagedAttributeField
+    private String _groupName;
+
+    @ManagedAttributeField
+    private String _helperAddress;
+
+    @ManagedAttributeField
+    private String _address;
+
+    @ManagedAttributeField
+    private String _durability;
+
+    @ManagedAttributeField
+    private boolean _coalescingSync;
+
+    @ManagedAttributeField
+    private boolean _designatedPrimary;
+
+    @ManagedAttributeField
+    private int _priority;
+
+    @ManagedAttributeField
+    private int _quorumOverride;
+
+    @ManagedAttributeField
+    private Map<String, String> _replicatedEnvironmentConfiguration;
+
+    //TODO: remove this field
+    @ManagedAttributeField
+    private boolean _messageStoreProvider;
+
+    private final AtomicReference<State> _state = new AtomicReference<State>(State.INITIALISING);
+    private final Broker<?> _broker;
+    private final ConfiguredObjectFactory _objectFactory;
+    private final EventLogger _eventLogger;
+
+    private MessageStoreLogSubject _configurationStoreLogSubject;
+    private BDBMessageStore _durableConfigurationStore;
+
+    @SuppressWarnings("rawtypes")
+    protected BDBHAVirtualHostNodeImpl(Broker<?> broker, Map<String, Object> attributes, TaskExecutor taskExecutor)
+    {
+        super(Collections.<Class<? extends ConfiguredObject>,ConfiguredObject<?>>singletonMap(Broker.class, broker), attributes, taskExecutor);
+        _broker = broker;
+        _objectFactory = _broker.getParent(SystemContext.class).getObjectFactory();
+        SystemContext systemContext = _broker.getParent(SystemContext.class);
+        _eventLogger = systemContext.getEventLogger();
+
+    }
+
+    @Override
+    public Map<String, String> getEnvironmentConfiguration()
+    {
+        return _environmentConfiguration;
+    }
+
+    @Override
+    public String getStorePath()
+    {
+        return _storePath;
+    }
+
+    @Override
+    public boolean isMessageStoreProvider()
+    {
+        return true;
+    }
+
+    @Override
+    public VirtualHost<?,?,?> getVirtualHost()
+    {
+        @SuppressWarnings("rawtypes")
+        Collection<VirtualHost> children = getChildren(VirtualHost.class);
+        if (children.size() == 0)
+        {
+            return null;
+        }
+        else if (children.size() == 1)
+        {
+            return children.iterator().next();
+        }
+        else
+        {
+            throw new IllegalStateException(this + " has an unexpected number of virtualhost children, size " + children.size());
+        }
+    }
+
+
+    @Override
+    public DurableConfigurationStore getConfigurationStore()
+    {
+        return _durableConfigurationStore;
+    }
+
+    @Override
+    public State getState()
+    {
+        return _state.get();
+    }
+
+    @Override
+    public LifetimePolicy getLifetimePolicy()
+    {
+        return LifetimePolicy.PERMANENT;
+    }
+
+    @Override
+    public String getGroupName()
+    {
+        return _groupName;
+    }
+
+    @Override
+    public String getHelperAddress()
+    {
+        return _helperAddress;
+    }
+
+    @Override
+    public String getAddress()
+    {
+        return _address;
+    }
+
+    @Override
+    public String getDurability()
+    {
+        return _durability;
+    }
+
+    @Override
+    public boolean isCoalescingSync()
+    {
+        return _coalescingSync;
+    }
+
+    @Override
+    public boolean isDesignatedPrimary()
+    {
+        return _designatedPrimary;
+    }
+
+    @Override
+    public int getPriority()
+    {
+        return _priority;
+    }
+
+    @Override
+    public int getQuorumOverride()
+    {
+        return _quorumOverride;
+    }
+
+    @Override
+    public Map<String, String> getReplicatedEnvironmentConfiguration()
+    {
+        return _replicatedEnvironmentConfiguration;
+    }
+
+    @Override
+    protected boolean setState(State currentState, State desiredState)
+    {
+        State  state = getState();
+
+        if (desiredState == State.DELETED)
+        {
+            if (state == State.ACTIVE)
+            {
+                setDesiredState(state, State.STOPPED);
+            }
+            if (state == State.INITIALISING || state == State.STOPPED || state == State.ERRORED)
+            {
+                if( _state.compareAndSet(state, State.DELETED))
+                {
+                    delete();
+                    return true;
+                }
+            }
+            else
+            {
+                throw new IllegalStateException("Cannot delete virtual host node in " + state + " state");
+            }
+        }
+        else if (desiredState == State.ACTIVE)
+        {
+            if ((state == State.INITIALISING || state == State.STOPPED) && _state.compareAndSet(state, State.ACTIVE))
+            {
+                try
+                {
+                    activate();
+                }
+                catch(RuntimeException e)
+                {
+                    _state.compareAndSet(State.ACTIVE, State.ERRORED);
+                    if (_broker.isManagementMode())
+                    {
+                        LOGGER.warn("Failed to make " + this + " active.", e);
+                    }
+                    else
+                    {
+                        throw e;
+                    }
+                }
+                return true;
+            }
+            else
+            {
+                throw new IllegalStateException("Cannot activate virtual host node in " + state + " state");
+            }
+        }
+        else if (desiredState == State.STOPPED)
+        {
+            if (_state.compareAndSet(state, State.STOPPED))
+            {
+                stop();
+                return true;
+            }
+            else
+            {
+                throw new IllegalStateException("Cannot stop virtual host node in " + state + " state");
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public String toString()
+    {
+        return "BDBHAVirtualHostNodeImpl [name=" + getName() + ", storePath=" + _storePath + ", groupName=" + _groupName + ", address=" + _address
+                + ", state=" + _state.get() + "]";
+    }
+
+    @SuppressWarnings({ "rawtypes", "unchecked" })
+    @Override
+    protected <C extends ConfiguredObject> C addChild(Class<C> childClass, Map<String, Object> attributes,
+            ConfiguredObject... otherParents)
+    {
+        if(childClass == VirtualHost.class)
+        {
+            if ("MASTER".equals(((ReplicatedEnvironmentFacade)_durableConfigurationStore.getEnvironmentFacade()).getNodeState()))
+            {
+                BDBHAVirtualHostFactory virtualHostFactory = new BDBHAVirtualHostFactory();
+                return (C) virtualHostFactory.create(getObjectFactory(), attributes,this);
+            }
+            else
+            {
+                ReplicaVirtualHost host = new ReplicaVirtualHost(attributes, this);
+                host.create();
+                return (C) host;
+            }
+        }
+        return super.addChild(childClass, attributes, otherParents);
+    }
+
+    private void activate()
+    {
+        if (LOGGER.isDebugEnabled())
+        {
+            LOGGER.debug("Activating virtualhost node " + this);
+        }
+
+        _durableConfigurationStore = new BDBMessageStore(new ReplicatedEnvironmentFacadeFactory());
+        _configurationStoreLogSubject = new MessageStoreLogSubject(getName(), BDBMessageStore.class.getSimpleName());
+
+        Map<String, Object> attributes = buildAttributesForStore();
+
+        _durableConfigurationStore.openConfigurationStore(this, attributes);
+
+        _eventLogger.message(_configurationStoreLogSubject, ConfigStoreMessages.CREATED());
+        _eventLogger.message(_configurationStoreLogSubject, ConfigStoreMessages.STORE_LOCATION(getStorePath()));
+
+
+        ReplicatedEnvironmentFacade environmentFacade = (ReplicatedEnvironmentFacade) _durableConfigurationStore.getEnvironmentFacade();
+        environmentFacade.setStateChangeListener(new BDBHAMessageStoreStateChangeListener());
+    }
+
+    private void stop()
+    {
+        destroyVirtualHostIfExist();
+        _durableConfigurationStore.closeConfigurationStore();
+        _eventLogger.message(_configurationStoreLogSubject, ConfigStoreMessages.CLOSE());
+    }
+
+    private void delete()
+    {
+        VirtualHost<?, ?, ?> virtualHost = getVirtualHost();
+        if (virtualHost != null)
+        {
+            virtualHost.setDesiredState(virtualHost.getState(), State.DELETED);
+        }
+
+        //TODO: this needs to be called from parent
+        deleted();
+
+        _durableConfigurationStore.onDelete();
+
+    }
+
+    private Map<String, Object> buildAttributesForStore()
+    {
+        final Map<String, Object> attributes = new HashMap<String, Object>();
+        Subject.doAs(SecurityManager.getSubjectWithAddedSystemRights(), new PrivilegedAction<Object>()
+        {
+            @Override
+            public Object run()
+            {
+                for (String attributeName : getAttributeNames())
+                {
+                    Object value = getAttribute(attributeName);
+                    attributes.put(attributeName, value);
+                }
+                return null;
+            }
+        });
+
+        attributes.put(IS_MESSAGE_STORE_PROVIDER, true);
+        return attributes;
+    }
+
+    private void onMaster()
+    {
+        try
+        {
+            destroyVirtualHostIfExist();
+            _durableConfigurationStore.getEnvironmentFacade().getEnvironment().flushLog(true);
+
+            _eventLogger.message(_configurationStoreLogSubject, ConfigStoreMessages.RECOVERY_START());
+            VirtualHostStoreUpgraderAndRecoverer upgraderAndRecoverer = new VirtualHostStoreUpgraderAndRecoverer(this, _objectFactory);
+            upgraderAndRecoverer.perform(_durableConfigurationStore);
+            _eventLogger.message(_configurationStoreLogSubject, ConfigStoreMessages.RECOVERY_COMPLETE());
+
+            VirtualHost<?,?,?>  host = getVirtualHost();
+
+            if (host == null)
+            {
+                if (LOGGER.isDebugEnabled())
+                {
+                    LOGGER.debug("Creating new virtualhost with name : " +  getGroupName());
+                }
+
+                Map<String, Object> hostAttributes = new HashMap<String, Object>();
+                hostAttributes.put(VirtualHost.MODEL_VERSION, BrokerModel.MODEL_VERSION);
+                hostAttributes.put(VirtualHost.NAME, getGroupName());
+                hostAttributes.put(VirtualHost.TYPE, "BDB_HA");
+                host = createChild(VirtualHost.class, hostAttributes);
+            }
+            else
+            {
+                if (LOGGER.isDebugEnabled())
+                {
+                    LOGGER.debug("Recovered virtualhost with name : " +  getGroupName());
+                }
+
+                final VirtualHost<?,?,?> recoveredHost = host;
+                Subject.doAs(SecurityManager.getSubjectWithAddedSystemRights(), new PrivilegedAction<Object>()
+                {
+                    @Override
+                    public Object run()
+                    {
+                        recoveredHost.open();
+                        return null;
+                    }
+                });
+            }
+            host.setDesiredState(host.getState(), State.ACTIVE);
+
+        }
+        catch (Exception e)
+        {
+            LOGGER.error("Failed to activate on hearing MASTER change event", e);
+        }
+    }
+
+    private void onReplica()
+    {
+        try
+        {
+            destroyVirtualHostIfExist();
+
+            Map<String, Object> hostAttributes = new HashMap<String, Object>();
+            hostAttributes.put(VirtualHost.MODEL_VERSION, BrokerModel.MODEL_VERSION);
+            hostAttributes.put(VirtualHost.NAME, getGroupName());
+            hostAttributes.put(VirtualHost.TYPE, "BDB_HA");
+            createChild(VirtualHost.class, hostAttributes);
+        }
+        catch (Exception e)
+        {
+            LOGGER.error("Failed to create a replica host", e);
+        }
+    }
+
+    private void onDetached()
+    {
+        destroyVirtualHostIfExist();
+    }
+
+    protected void destroyVirtualHostIfExist()
+    {
+        VirtualHost<?,?,?> virtualHost = getVirtualHost();
+        if (virtualHost!= null)
+        {
+            virtualHost.setDesiredState(virtualHost.getState(), State.STOPPED);
+        }
+    }
+
+    private class BDBHAMessageStoreStateChangeListener implements StateChangeListener
+    {
+        @Override
+        public void stateChange(StateChangeEvent stateChangeEvent) throws RuntimeException
+        {
+            com.sleepycat.je.rep.ReplicatedEnvironment.State state = stateChangeEvent.getState();
+
+            if (LOGGER.isInfoEnabled())
+            {
+                LOGGER.info("Received BDB event indicating transition to state " + state);
+            }
+
+            switch (state)
+            {
+            case MASTER:
+                onMaster();
+                break;
+            case REPLICA:
+                onReplica();
+                break;
+            case DETACHED:
+                LOGGER.error("BDB replicated node in detached state, therefore passivating.");
+                onDetached();
+                break;
+            case UNKNOWN:
+                LOGGER.warn("BDB replicated node in unknown state (hopefully temporarily)");
+                break;
+            default:
+                LOGGER.error("Unexpected state change: " + state);
+                throw new IllegalStateException("Unexpected state change: " + state);
+            }
+        }
+    }
+
+    private class ReplicaVirtualHost extends BDBHAVirtualHost
+    {
+
+        ReplicaVirtualHost(Map<String, Object> attributes, VirtualHostNode<?> virtualHostNode)
+        {
+            super(attributes, virtualHostNode);
+            setState(VirtualHostState.PASSIVE);
+        }
+
+        @Override
+        public void onCreate()
+        {
+        }
+
+        @Override
+        public boolean setState(State currentState, State desiredState)
+        {
+            if (desiredState != State.STOPPED)
+            {
+                throw new IllegalArgumentException("Unsupported state " + desiredState);
+            }
+            return super.setState(currentState, desiredState);
+        }
+    }
+}

Copied: qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBVirtualHostNode.java (from r1588885, qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/EnvironmentFacadeFactory.java)
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBVirtualHostNode.java?p2=qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBVirtualHostNode.java&p1=qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/EnvironmentFacadeFactory.java&r1=1588885&r2=1588886&rev=1588886&view=diff
==============================================================================
--- qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/EnvironmentFacadeFactory.java (original)
+++ qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBVirtualHostNode.java Mon Apr 21 14:28:29 2014
@@ -18,20 +18,17 @@
  * under the License.
  *
  */
-package org.apache.qpid.server.store.berkeleydb;
+package org.apache.qpid.server.virtualhostnode.berkeleydb;
 
 import java.util.Map;
 
-public interface EnvironmentFacadeFactory
-{
-    public static final String ENVIRONMENT_CONFIGURATION = "bdbEnvironmentConfig";
-
-    EnvironmentFacade createEnvironmentFacade(Map<String, Object> storeSettings, EnvironmentFacadeTask... initialisationTasks);
+import org.apache.qpid.server.model.ManagedAttribute;
+import org.apache.qpid.server.virtualhostnode.FileBasedVirtualHostNode;
 
-    String getType();
+public interface BDBVirtualHostNode<X extends BDBVirtualHostNode<X>> extends FileBasedVirtualHostNode<X>
+{
+    public static final String ENVIRONMENT_CONFIGURATION = "environmentConfiguration";
 
-    public static interface EnvironmentFacadeTask
-    {
-        void execute(EnvironmentFacade facade);
-    }
-}
+    @ManagedAttribute(mandatory=false, automate=true)
+    Map<String, String> getEnvironmentConfiguration();
+}
\ No newline at end of file

Copied: qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBVirtualHostNodeFactory.java (from r1588885, qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostFactory.java)
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBVirtualHostNodeFactory.java?p2=qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBVirtualHostNodeFactory.java&p1=qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostFactory.java&r1=1588885&r2=1588886&rev=1588886&view=diff
==============================================================================
--- qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostFactory.java (original)
+++ qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBVirtualHostNodeFactory.java Mon Apr 21 14:28:29 2014
@@ -18,31 +18,27 @@
  * under the License.
  *
  */
-package org.apache.qpid.server.store.berkeleydb;
+
+package org.apache.qpid.server.virtualhostnode.berkeleydb;
+
+import java.util.Map;
 
 import org.apache.qpid.server.model.AbstractConfiguredObjectTypeFactory;
 import org.apache.qpid.server.model.Broker;
 import org.apache.qpid.server.model.ConfiguredObject;
 
-import java.util.HashMap;
-import java.util.Map;
-import java.util.UUID;
-
-public class BDBHAVirtualHostFactory extends AbstractConfiguredObjectTypeFactory<BDBHAVirtualHost>
+public class BDBVirtualHostNodeFactory extends AbstractConfiguredObjectTypeFactory<BDBVirtualHostNodeImpl>
 {
-
-    public BDBHAVirtualHostFactory()
+    public BDBVirtualHostNodeFactory()
     {
-        super(BDBHAVirtualHost.class);
+        super(BDBVirtualHostNodeImpl.class);
     }
 
     @Override
-    public BDBHAVirtualHost createInstance(final Map<String, Object> attributes,
-                                                 final ConfiguredObject<?>... parents)
+    public BDBVirtualHostNodeImpl createInstance(Map<String, Object> attributes, ConfiguredObject<?>... parents)
     {
-        final Broker broker = getParent(Broker.class, parents);
-        return new BDBHAVirtualHost(attributes, broker);
+        Broker<?> broker = getParent(Broker.class, parents);
+        return new BDBVirtualHostNodeImpl(broker, attributes, broker.getTaskExecutor());
     }
 
-
 }

Added: qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBVirtualHostNodeImpl.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBVirtualHostNodeImpl.java?rev=1588886&view=auto
==============================================================================
--- qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBVirtualHostNodeImpl.java (added)
+++ qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBVirtualHostNodeImpl.java Mon Apr 21 14:28:29 2014
@@ -0,0 +1,71 @@
+/*
+ *
+ * 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.virtualhostnode.berkeleydb;
+
+import java.util.Map;
+
+import org.apache.qpid.server.configuration.updater.TaskExecutor;
+import org.apache.qpid.server.model.Broker;
+import org.apache.qpid.server.model.ManagedAttributeField;
+import org.apache.qpid.server.model.ManagedObject;
+import org.apache.qpid.server.plugin.DurableConfigurationStoreFactory;
+import org.apache.qpid.server.store.berkeleydb.BDBMessageStoreFactory;
+import org.apache.qpid.server.virtualhostnode.AbstractStandardVirtualHostNode;
+
+@ManagedObject( category = false, type = "BDB" )
+public class BDBVirtualHostNodeImpl extends AbstractStandardVirtualHostNode<BDBVirtualHostNodeImpl> implements BDBVirtualHostNode<BDBVirtualHostNodeImpl>
+{
+    @ManagedAttributeField
+    private String _storePath;
+
+    @ManagedAttributeField
+    private Map<String, String> _environmentConfiguration;
+
+    public BDBVirtualHostNodeImpl(Broker<?> parent, Map<String, Object> attributes, TaskExecutor taskExecutor)
+    {
+        super(parent, attributes, taskExecutor);
+    }
+
+    @Override
+    protected DurableConfigurationStoreFactory getDurableConfigurationStoreFactory()
+    {
+        return new BDBMessageStoreFactory();
+    }
+
+    @Override
+    public Map<String, String> getEnvironmentConfiguration()
+    {
+        return _environmentConfiguration;
+    }
+
+    @Override
+    public String getStorePath()
+    {
+        return _storePath;
+    }
+
+    @Override
+    public String toString()
+    {
+        return getClass().getSimpleName() + " [id=" + getId() + ", name=" + getName() + ", storePath=" + getStorePath() + "]";
+    }
+
+}

Modified: qpid/trunk/qpid/java/bdbstore/src/main/resources/META-INF/services/org.apache.qpid.server.plugin.ConfiguredObjectTypeFactory
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/bdbstore/src/main/resources/META-INF/services/org.apache.qpid.server.plugin.ConfiguredObjectTypeFactory?rev=1588886&r1=1588885&r2=1588886&view=diff
==============================================================================
--- qpid/trunk/qpid/java/bdbstore/src/main/resources/META-INF/services/org.apache.qpid.server.plugin.ConfiguredObjectTypeFactory (original)
+++ qpid/trunk/qpid/java/bdbstore/src/main/resources/META-INF/services/org.apache.qpid.server.plugin.ConfiguredObjectTypeFactory Mon Apr 21 14:28:29 2014
@@ -17,3 +17,5 @@
 # under the License.
 #
 org.apache.qpid.server.store.berkeleydb.BDBHAVirtualHostFactory
+org.apache.qpid.server.virtualhostnode.berkeleydb.BDBVirtualHostNodeFactory
+org.apache.qpid.server.virtualhostnode.berkeleydb.BDBHAVirtualHostNodeFactory



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