summaryrefslogtreecommitdiff
path: root/qpid/java
diff options
context:
space:
mode:
authorKeith Wall <kwall@apache.org>2014-04-26 22:22:10 +0000
committerKeith Wall <kwall@apache.org>2014-04-26 22:22:10 +0000
commitae1ccfdd01112311a9e9d0870928a0052578be8f (patch)
tree05f61677682e9c79cbef802220f806d2e80fb7f3 /qpid/java
parent8e2f0e3f6404241aa5919d3830c6578f7ca0b29f (diff)
downloadqpid-python-ae1ccfdd01112311a9e9d0870928a0052578be8f.tar.gz
QPID-5715: [Java Broker]: Refactor VHN implementations to avoid duplicated code
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1590316 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/java')
-rw-r--r--qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java218
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/VirtualHostStoreUpgraderAndRecoverer.java3
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java7
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNode.java263
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractVirtualHostNode.java289
5 files changed, 347 insertions, 433 deletions
diff --git a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java
index fff5c63337..55f90ebbcb 100644
--- a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java
+++ b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java
@@ -21,29 +21,20 @@
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;
@@ -55,12 +46,13 @@ 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 org.apache.qpid.server.virtualhostnode.AbstractVirtualHostNode;
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>
+public class BDBHAVirtualHostNodeImpl extends AbstractVirtualHostNode<BDBHAVirtualHostNodeImpl> implements BDBHAVirtualHostNode<BDBHAVirtualHostNodeImpl>
{
private static final Logger LOGGER = Logger.getLogger(BDBHAVirtualHostNodeImpl.class);
@@ -97,27 +89,9 @@ public class BDBHAVirtualHostNodeImpl extends AbstractConfiguredObject<BDBHAVirt
@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)
+ public 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();
-
+ super(broker, attributes, taskExecutor);
}
@Override
@@ -139,44 +113,6 @@ public class BDBHAVirtualHostNodeImpl extends AbstractConfiguredObject<BDBHAVirt
}
@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;
@@ -231,76 +167,10 @@ public class BDBHAVirtualHostNodeImpl extends AbstractConfiguredObject<BDBHAVirt
}
@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() + "]";
+ return "BDBHAVirtualHostNodeImpl [id=" + getId() + ", name=" + getName() + ", storePath=" + _storePath + ", groupName=" + _groupName + ", address=" + _address
+ + ", state=" + getState() + "]";
}
@SuppressWarnings({ "rawtypes", "unchecked" })
@@ -310,7 +180,7 @@ public class BDBHAVirtualHostNodeImpl extends AbstractConfiguredObject<BDBHAVirt
{
if(childClass == VirtualHost.class)
{
- if ("MASTER".equals(((ReplicatedEnvironmentFacade)_durableConfigurationStore.getEnvironmentFacade()).getNodeState()))
+ if ("MASTER".equals(((ReplicatedEnvironmentFacade)getConfigurationStore().getEnvironmentFacade()).getNodeState()))
{
BDBHAVirtualHostFactory virtualHostFactory = new BDBHAVirtualHostFactory();
return (C) virtualHostFactory.create(getObjectFactory(), attributes,this);
@@ -325,69 +195,35 @@ public class BDBHAVirtualHostNodeImpl extends AbstractConfiguredObject<BDBHAVirt
return super.addChild(childClass, attributes, otherParents);
}
- private void activate()
+ @Override
+ public BDBMessageStore getConfigurationStore()
{
- 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());
+ return (BDBMessageStore) super.getConfigurationStore();
}
- private void stop()
+ protected DurableConfigurationStore createConfigurationStore()
{
- destroyVirtualHostIfExist();
- _durableConfigurationStore.closeConfigurationStore();
- _eventLogger.message(_configurationStoreLogSubject, ConfigStoreMessages.CLOSE());
+ return new BDBMessageStore(new ReplicatedEnvironmentFacadeFactory());
}
- private void delete()
+ @Override
+ protected void activate()
{
- VirtualHost<?, ?, ?> virtualHost = getVirtualHost();
- if (virtualHost != null)
+ if (LOGGER.isDebugEnabled())
{
- virtualHost.setDesiredState(virtualHost.getState(), State.DELETED);
+ LOGGER.debug("Activating virtualhost node " + this);
}
- //TODO: this needs to be called from parent
- deleted();
+ Map<String, Object> attributes = buildAttributesForStore();
- _durableConfigurationStore.onDelete();
+ getConfigurationStore().openConfigurationStore(this, attributes);
- }
+ getEventLogger().message(getConfigurationStoreLogSubject(), ConfigStoreMessages.CREATED());
+ getEventLogger().message(getConfigurationStoreLogSubject(), ConfigStoreMessages.STORE_LOCATION(getStorePath()));
- 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;
+ ReplicatedEnvironmentFacade environmentFacade = (ReplicatedEnvironmentFacade) getConfigurationStore().getEnvironmentFacade();
+ environmentFacade.setStateChangeListener(new BDBHAMessageStoreStateChangeListener());
}
private void onMaster()
@@ -395,12 +231,12 @@ public class BDBHAVirtualHostNodeImpl extends AbstractConfiguredObject<BDBHAVirt
try
{
destroyVirtualHostIfExist();
- _durableConfigurationStore.getEnvironmentFacade().getEnvironment().flushLog(true);
+ getConfigurationStore().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());
+ getEventLogger().message(getConfigurationStoreLogSubject(), ConfigStoreMessages.RECOVERY_START());
+ VirtualHostStoreUpgraderAndRecoverer upgraderAndRecoverer = new VirtualHostStoreUpgraderAndRecoverer(this);
+ upgraderAndRecoverer.perform(getConfigurationStore());
+ getEventLogger().message(getConfigurationStoreLogSubject(), ConfigStoreMessages.RECOVERY_COMPLETE());
VirtualHost<?,?,?> host = getVirtualHost();
diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/VirtualHostStoreUpgraderAndRecoverer.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/VirtualHostStoreUpgraderAndRecoverer.java
index e1cffeb942..e1772c037a 100644
--- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/VirtualHostStoreUpgraderAndRecoverer.java
+++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/VirtualHostStoreUpgraderAndRecoverer.java
@@ -30,7 +30,6 @@ import java.util.UUID;
import org.apache.qpid.server.filter.FilterSupport;
import org.apache.qpid.server.model.Binding;
-import org.apache.qpid.server.model.ConfiguredObjectFactory;
import org.apache.qpid.server.model.Exchange;
import org.apache.qpid.server.model.Queue;
import org.apache.qpid.server.model.UUIDGenerator;
@@ -54,7 +53,7 @@ public class VirtualHostStoreUpgraderAndRecoverer
private final Map<String, UUID> _defaultExchangeIds;
- public VirtualHostStoreUpgraderAndRecoverer(VirtualHostNode<?> virtualHostNode, ConfiguredObjectFactory objectFactory)
+ public VirtualHostStoreUpgraderAndRecoverer(VirtualHostNode<?> virtualHostNode)
{
_virtualHostNode = virtualHostNode;
register(new Upgrader_0_0_to_0_1());
diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java
index abe3e2ce45..d9104bfbe0 100644
--- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java
+++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java
@@ -72,6 +72,7 @@ import org.apache.qpid.server.security.SecurityManager;
import org.apache.qpid.server.security.access.Operation;
import org.apache.qpid.server.stats.StatisticsCounter;
import org.apache.qpid.server.store.ConfiguredObjectRecord;
+import org.apache.qpid.server.store.ConfiguredObjectRecordImpl;
import org.apache.qpid.server.store.DurableConfigurationStore;
import org.apache.qpid.server.store.Event;
import org.apache.qpid.server.store.EventListener;
@@ -1401,10 +1402,11 @@ public abstract class AbstractVirtualHost<X extends AbstractVirtualHost<X>> exte
}
catch (Exception e)
{
- _logger.warn("Exception occurred on store deletion", e);
+ _logger.warn("Exception occurred on message store deletion", e);
}
}
setAttribute(VirtualHost.STATE, getState(), State.DELETED);
+ getDurableConfigurationStore().remove(asObjectRecord());
deleted();
}
@@ -1561,7 +1563,8 @@ public abstract class AbstractVirtualHost<X extends AbstractVirtualHost<X>> exte
protected void onCreate()
{
super.onCreate();
- getDurableConfigurationStore().create(asObjectRecord());
+ ConfiguredObjectRecord record = asObjectRecord();
+ getDurableConfigurationStore().create(new ConfiguredObjectRecordImpl(record.getId(), record.getType(), record.getAttributes()));
}
protected void activate()
diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNode.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNode.java
index 168b03945a..87470fb3cf 100644
--- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNode.java
+++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNode.java
@@ -21,62 +21,36 @@
package org.apache.qpid.server.virtualhostnode;
import java.io.File;
-import java.security.AccessControlException;
import java.security.PrivilegedAction;
-import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
-import java.util.Set;
-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.LifetimePolicy;
-import org.apache.qpid.server.model.ManagedAttributeField;
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.plugin.DurableConfigurationStoreFactory;
import org.apache.qpid.server.security.SecurityManager;
-import org.apache.qpid.server.security.access.Operation;
import org.apache.qpid.server.store.DurableConfigurationStore;
import org.apache.qpid.server.store.MessageStore;
import org.apache.qpid.server.store.VirtualHostStoreUpgraderAndRecoverer;
import org.apache.qpid.server.virtualhost.StandardVirtualHost;
-public abstract class AbstractStandardVirtualHostNode<X extends AbstractStandardVirtualHostNode<X>> extends AbstractConfiguredObject<X>
+public abstract class AbstractStandardVirtualHostNode<X extends AbstractStandardVirtualHostNode<X>> extends AbstractVirtualHostNode<X>
implements VirtualHostNode<X>
{
private static final Logger LOGGER = Logger.getLogger(AbstractStandardVirtualHostNode.class);
- private final Broker<?> _broker;
- private final AtomicReference<State> _state = new AtomicReference<State>(State.INITIALISING);
- private final EventLogger _eventLogger;
-
- @ManagedAttributeField
- private boolean _messageStoreProvider;
-
- private MessageStoreLogSubject _configurationStoreLogSubject;
- private DurableConfigurationStore _durableConfigurationStore;
-
- @SuppressWarnings("rawtypes")
public AbstractStandardVirtualHostNode(Broker<?> parent, Map<String, Object> attributes, TaskExecutor taskExecutor)
{
- super(parentsMap(parent), attributes, taskExecutor);
- _broker = parent;
- SystemContext systemContext = _broker.getParent(SystemContext.class);
- _eventLogger = systemContext.getEventLogger();
+ super(parent, attributes, taskExecutor);
}
@Override
@@ -89,27 +63,6 @@ public abstract class AbstractStandardVirtualHostNode<X extends AbstractStandard
durableConfigurationStoreFactory.validateConfigurationStoreSettings(storeSettings);
}
- @Override
- public void onOpen()
- {
- super.onOpen();
- DurableConfigurationStoreFactory durableConfigurationStoreFactory = getDurableConfigurationStoreFactory();
- _durableConfigurationStore = durableConfigurationStoreFactory.createDurableConfigurationStore();
- _configurationStoreLogSubject = new MessageStoreLogSubject(getName(), _durableConfigurationStore.getClass().getSimpleName());
-
- }
-
- protected abstract DurableConfigurationStoreFactory getDurableConfigurationStoreFactory();
-
- protected Map<String, Object> getDefaultMessageStoreSettings()
- {
- // TODO perhaps look for the MS with the default annotation and associated default.
- Map<String, Object> settings = new HashMap<String, Object>();
- settings.put(MessageStore.STORE_TYPE, "DERBY");
- settings.put(MessageStore.STORE_PATH, "${qpid.work_dir}" + File.separator + "derbystore" + File.separator + getName());
- return settings;
- }
-
@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
protected <C extends ConfiguredObject> C addChild(Class<C> childClass, Map<String, Object> attributes,
@@ -122,130 +75,18 @@ public abstract class AbstractStandardVirtualHostNode<X extends AbstractStandard
return super.addChild(childClass, attributes, otherParents);
}
-
-
- @SuppressWarnings({ "unchecked", "rawtypes" })
- @Override
- public <T extends ConfiguredObject> T getParent(Class<T> clazz)
- {
- if (clazz == Broker.class)
- {
- return (T) _broker;
- }
- return super.getParent(clazz);
- }
-
-
- @Override
- public State getState()
- {
- return _state.get();
- }
-
- @Override
- public LifetimePolicy getLifetimePolicy()
- {
- return LifetimePolicy.PERMANENT;
- }
-
@Override
- protected boolean setState(State currentState, State desiredState)
+ protected DurableConfigurationStore createConfigurationStore()
{
- State state = _state.get();
- if (desiredState == State.DELETED)
- {
- if (state == State.ACTIVE || state == State.INITIALISING)
- {
- state = setDesiredState(currentState, State.STOPPED);
- }
-
- if (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 boolean isMessageStoreProvider()
- {
- return _messageStoreProvider;
+ DurableConfigurationStoreFactory durableConfigurationStoreFactory = getDurableConfigurationStoreFactory();
+ DurableConfigurationStore store = durableConfigurationStoreFactory.createDurableConfigurationStore();
+ return store;
}
- @Override
- public VirtualHost<?,?,?> getVirtualHost()
- {
- 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());
- }
- }
+ protected abstract DurableConfigurationStoreFactory getDurableConfigurationStoreFactory();
@Override
- public DurableConfigurationStore getConfigurationStore()
- {
- return _durableConfigurationStore;
- }
-
- private void activate()
+ protected void activate()
{
if (LOGGER.isDebugEnabled())
{
@@ -254,23 +95,23 @@ public abstract class AbstractStandardVirtualHostNode<X extends AbstractStandard
Map<String, Object> attributes = buildAttributesForStore();
- _durableConfigurationStore.openConfigurationStore(this, attributes);
+ getConfigurationStore().openConfigurationStore(this, attributes);
- _eventLogger.message(_configurationStoreLogSubject, ConfigStoreMessages.CREATED());
+ getEventLogger().message(getConfigurationStoreLogSubject(), ConfigStoreMessages.CREATED());
if (this instanceof FileBasedVirtualHostNode)
{
@SuppressWarnings("rawtypes")
FileBasedVirtualHostNode fileBasedVirtualHostNode = (FileBasedVirtualHostNode) this;
- _eventLogger.message(_configurationStoreLogSubject, ConfigStoreMessages.STORE_LOCATION(fileBasedVirtualHostNode.getStorePath()));
+ getEventLogger().message(getConfigurationStoreLogSubject(), ConfigStoreMessages.STORE_LOCATION(fileBasedVirtualHostNode.getStorePath()));
}
- _eventLogger.message(_configurationStoreLogSubject, ConfigStoreMessages.RECOVERY_START());
+ getEventLogger().message(getConfigurationStoreLogSubject(), ConfigStoreMessages.RECOVERY_START());
- VirtualHostStoreUpgraderAndRecoverer upgrader = new VirtualHostStoreUpgraderAndRecoverer(this, getObjectFactory());
- upgrader.perform(_durableConfigurationStore);
+ VirtualHostStoreUpgraderAndRecoverer upgrader = new VirtualHostStoreUpgraderAndRecoverer(this);
+ upgrader.perform(getConfigurationStore());
- _eventLogger.message(_configurationStoreLogSubject, ConfigStoreMessages.RECOVERY_COMPLETE());
+ getEventLogger().message(getConfigurationStoreLogSubject(), ConfigStoreMessages.RECOVERY_COMPLETE());
VirtualHost<?,?,?> host = getVirtualHost();
@@ -307,75 +148,21 @@ public abstract class AbstractStandardVirtualHostNode<X extends AbstractStandard
host.setDesiredState(host.getState(), State.ACTIVE);
}
- 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;
- }
- });
-
- return attributes;
- }
-
- private void delete()
- {
- VirtualHost<?, ?, ?> virtualHost = getVirtualHost();
- if (virtualHost != null)
- {
- virtualHost.setDesiredState(virtualHost.getState(), State.DELETED);
- }
- //TODO: this needs to be called from parent
- deleted();
-
- // TODO Split onDelete into deleteMessageStore/deleteConfigStore
- if (_durableConfigurationStore instanceof MessageStore)
- {
- ((MessageStore)_durableConfigurationStore).onDelete();
- }
-
- }
-
- private void stop()
- {
- VirtualHost<?, ?, ?> virtualHost = getVirtualHost();
- if (virtualHost != null)
- {
- virtualHost.setDesiredState(virtualHost.getState(), State.STOPPED);
- }
- _durableConfigurationStore.closeConfigurationStore();
-
- _eventLogger.message(_configurationStoreLogSubject, ConfigStoreMessages.CLOSE());
- }
-
@Override
- protected void authoriseSetDesiredState(State currentState, State desiredState) throws AccessControlException
+ public String toString()
{
- if(desiredState == State.DELETED)
- {
- if (!_broker.getSecurityManager().authoriseConfiguringBroker(getName(), VirtualHostNode.class, Operation.DELETE))
- {
- throw new AccessControlException("Deletion of virtual host node is denied");
- }
- }
+ return this.getClass().getSimpleName() + "[id=" + getId() + ", name=" + getName() + ", state=" + getState() + "]";
}
- @Override
- protected void authoriseSetAttributes(ConfiguredObject<?> modified, Set<String> attributes) throws AccessControlException
+ // protected for unit testing purposes
+ protected Map<String, Object> getDefaultMessageStoreSettings()
{
- if (!_broker.getSecurityManager().authoriseConfiguringBroker(getName(), VirtualHostNode.class, Operation.UPDATE))
- {
- throw new AccessControlException("Setting of virtual host node attributes is denied");
- }
+ // TODO perhaps look for the MS with the default annotation and associated default.
+ Map<String, Object> settings = new HashMap<String, Object>();
+ settings.put(MessageStore.STORE_TYPE, "DERBY");
+ settings.put(MessageStore.STORE_PATH, "${qpid.work_dir}" + File.separator + "derbystore" + File.separator + getName());
+ return settings;
}
+
}
diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractVirtualHostNode.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractVirtualHostNode.java
new file mode 100644
index 0000000000..1db15003ed
--- /dev/null
+++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractVirtualHostNode.java
@@ -0,0 +1,289 @@
+/*
+ *
+ * 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;
+
+import java.security.AccessControlException;
+import java.security.PrivilegedAction;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+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.ConfiguredObject;
+import org.apache.qpid.server.model.LifetimePolicy;
+import org.apache.qpid.server.model.ManagedAttributeField;
+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.security.access.Operation;
+import org.apache.qpid.server.store.DurableConfigurationStore;
+import org.apache.qpid.server.store.MessageStore;
+
+public abstract class AbstractVirtualHostNode<X extends AbstractVirtualHostNode<X>> extends AbstractConfiguredObject<X> implements VirtualHostNode<X>
+{
+
+ private static final Logger LOGGER = Logger.getLogger(AbstractVirtualHostNode.class);
+
+ private final Broker<?> _broker;
+ private final AtomicReference<State> _state = new AtomicReference<State>(State.INITIALISING);
+ private final EventLogger _eventLogger;
+
+ private DurableConfigurationStore _durableConfigurationStore;
+
+ private MessageStoreLogSubject _configurationStoreLogSubject;
+
+ @ManagedAttributeField
+ private boolean _messageStoreProvider;
+
+ public AbstractVirtualHostNode(Broker<?> parent, Map<String, Object> attributes, TaskExecutor taskExecutor)
+ {
+ super(Collections.<Class<? extends ConfiguredObject>,ConfiguredObject<?>>singletonMap(Broker.class, parent),
+ attributes, taskExecutor);
+ _broker = parent;
+ SystemContext<?> systemContext = _broker.getParent(SystemContext.class);
+ _eventLogger = systemContext.getEventLogger();
+ }
+
+
+ @Override
+ public void onOpen()
+ {
+ super.onOpen();
+ _durableConfigurationStore = createConfigurationStore();
+ _configurationStoreLogSubject = new MessageStoreLogSubject(getName(), _durableConfigurationStore.getClass().getSimpleName());
+
+ }
+
+ @Override
+ public State getState()
+ {
+ return _state.get();
+ }
+
+ @Override
+ public LifetimePolicy getLifetimePolicy()
+ {
+ return LifetimePolicy.PERMANENT;
+ }
+
+ @Override
+ protected boolean setState(State currentState, State desiredState)
+ {
+ State state = _state.get();
+ if (desiredState == State.DELETED)
+ {
+ if (state == State.ACTIVE || state == State.INITIALISING)
+ {
+ state = setDesiredState(currentState, State.STOPPED);
+ }
+
+ if (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 boolean isMessageStoreProvider()
+ {
+ return _messageStoreProvider;
+ }
+
+ @Override
+ public VirtualHost<?,?,?> getVirtualHost()
+ {
+ 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;
+ }
+
+ protected Broker<?> getBroker()
+ {
+ return _broker;
+ }
+
+ protected EventLogger getEventLogger()
+ {
+ return _eventLogger;
+ }
+
+ protected DurableConfigurationStore getDurableConfigurationStore()
+ {
+ return _durableConfigurationStore;
+ }
+
+ protected MessageStoreLogSubject getConfigurationStoreLogSubject()
+ {
+ return _configurationStoreLogSubject;
+ }
+
+ protected 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;
+ }
+ });
+
+ return attributes;
+ }
+
+ protected void delete()
+ {
+ VirtualHost<?, ?, ?> virtualHost = getVirtualHost();
+ if (virtualHost != null)
+ {
+ virtualHost.setDesiredState(virtualHost.getState(), State.DELETED);
+ }
+
+ deleted();
+
+ if (getConfigurationStore() instanceof MessageStore)
+ {
+ ((MessageStore)getConfigurationStore()).onDelete();
+ }
+ }
+
+ protected void stop()
+ {
+ VirtualHost<?, ?, ?> virtualHost = getVirtualHost();
+ if (virtualHost != null)
+ {
+ virtualHost.setDesiredState(virtualHost.getState(), State.STOPPED);
+ }
+ getConfigurationStore().closeConfigurationStore();
+
+ getEventLogger().message(getConfigurationStoreLogSubject(), ConfigStoreMessages.CLOSE());
+ }
+
+ @Override
+ protected void authoriseSetDesiredState(State currentState, State desiredState) throws AccessControlException
+ {
+ if(desiredState == State.DELETED)
+ {
+ if (!_broker.getSecurityManager().authoriseConfiguringBroker(getName(), VirtualHostNode.class, Operation.DELETE))
+ {
+ throw new AccessControlException("Deletion of virtual host node is denied");
+ }
+ }
+ }
+
+ @Override
+ protected void authoriseSetAttributes(ConfiguredObject<?> modified, Set<String> attributes) throws AccessControlException
+ {
+ if (!_broker.getSecurityManager().authoriseConfiguringBroker(getName(), VirtualHostNode.class, Operation.UPDATE))
+ {
+ throw new AccessControlException("Setting of virtual host node attributes is denied");
+ }
+ }
+
+ protected abstract DurableConfigurationStore createConfigurationStore();
+
+ protected abstract void activate();
+
+} \ No newline at end of file