Author: kwall
Date: Sat Jun 7 19:01:03 2014
New Revision: 1601163
URL: http://svn.apache.org/r1601163
Log:
QPID-5803: [Java Broker] Add ability for the virtualhostnode to create a
virtualhost using a blueprint supplied by context variable
* This commit reenables the SplitStoreTest.
* The UI has not been refactored by this commit, so it will not be possible to
create a non-HA virtualhost from the UI
(the UI will create only a virtualhostnode).. REST API is okay.
Modified:
qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBVirtualHostNodeImpl.java
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/JsonVirtualHostNodeImpl.java
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/virtualhostnode/AbstractStandardVirtualHostNodeTest.java
qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/virtualhostnode/TestVirtualHostNode.java
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/jdbc-store/src/main/java/org/apache/qpid/server/virtualhostnode/jdbc/JDBCVirtualHostNodeImpl.java
qpid/trunk/qpid/java/broker-plugins/memory-store/src/main/java/org/apache/qpid/server/virtualhostnode/memory/MemoryVirtualHostNode.java
qpid/trunk/qpid/java/systests/etc/config-systests.json
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/VirtualHostMessageStoreTest.java
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/management/jmx/MBeanLifeCycleTest.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/VirtualHostNodeRestTest.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/test/utils/QpidBrokerTestCase.java
qpid/trunk/qpid/java/test-profiles/JavaTransientExcludes
Modified:
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=1601163&r1=1601162&r2=1601163&view=diff
==============================================================================
---
qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBVirtualHostNodeImpl.java
(original)
+++
qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBVirtualHostNodeImpl.java
Sat Jun 7 19:01:03 2014
@@ -30,9 +30,11 @@ import org.apache.qpid.server.store.Dura
import org.apache.qpid.server.store.berkeleydb.BDBConfigurationStore;
import org.apache.qpid.server.virtualhostnode.AbstractStandardVirtualHostNode;
-@ManagedObject( category = false, type = "BDB" )
+@ManagedObject(type = BDBVirtualHostNodeImpl.VIRTUAL_HOST_NODE_TYPE, category
= false)
public class BDBVirtualHostNodeImpl extends
AbstractStandardVirtualHostNode<BDBVirtualHostNodeImpl> implements
BDBVirtualHostNode<BDBVirtualHostNodeImpl>
{
+ public static final String VIRTUAL_HOST_NODE_TYPE = "BDB";
+
@ManagedAttributeField
private String _storePath;
Modified:
qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNode.java
URL:
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNode.java?rev=1601163&r1=1601162&r2=1601163&view=diff
==============================================================================
---
qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNode.java
(original)
+++
qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNode.java
Sat Jun 7 19:01:03 2014
@@ -20,7 +20,6 @@
*/
package org.apache.qpid.server.virtualhostnode;
-import java.io.File;
import java.security.PrivilegedAction;
import java.util.Collection;
import java.util.Collections;
@@ -39,15 +38,13 @@ import org.apache.qpid.server.model.Remo
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.MessageStore;
-import org.apache.qpid.server.store.MessageStoreProvider;
import org.apache.qpid.server.store.VirtualHostStoreUpgraderAndRecoverer;
-import org.apache.qpid.server.virtualhost.ProvidedStoreVirtualHost;
public abstract class AbstractStandardVirtualHostNode<X extends
AbstractStandardVirtualHostNode<X>> extends AbstractVirtualHostNode<X>
implements VirtualHostNode<X>
{
private static final Logger LOGGER =
Logger.getLogger(AbstractStandardVirtualHostNode.class);
+ public static final String VIRTUALHOST_BLUEPRINT_CONTEXT_VAR =
"virtualhostBlueprint";
public AbstractStandardVirtualHostNode(Map<String, Object> attributes,
Broker<?> parent)
@@ -100,25 +97,32 @@ public abstract class AbstractStandardVi
if (host == null)
{
- // TODO normal case - we should not create VH,
- // TODO out if box case - if blueprint vh context variable is set,
use it to create a VH
- if (LOGGER.isDebugEnabled())
+ if (getContext() != null &&
getContext().containsKey(VIRTUALHOST_BLUEPRINT_CONTEXT_VAR))
{
- LOGGER.debug("Creating new virtualhost with name : " +
getName());
- }
- Map<String, Object> hostAttributes = new HashMap<String, Object>();
- hostAttributes.put(VirtualHost.MODEL_VERSION,
BrokerModel.MODEL_VERSION);
- hostAttributes.put(VirtualHost.NAME, getName());
- if (getConfigurationStore() instanceof MessageStoreProvider)
- {
- hostAttributes.put(VirtualHost.TYPE,
ProvidedStoreVirtualHost.VIRTUAL_HOST_TYPE);
- }
- else
- {
- hostAttributes.put(VirtualHost.TYPE, "DERBY");
- hostAttributes.put(VirtualHost.MESSAGE_STORE_SETTINGS,
getDefaultMessageStoreSettings());
+ Map<String, Object> virtualhostBlueprint =
getContextValue(Map.class, VIRTUALHOST_BLUEPRINT_CONTEXT_VAR);
+
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("Using virtualhost blueprint " +
virtualhostBlueprint);
+ }
+
+ Map<String, Object> virtualhostAttributes = new HashMap<>();
+ virtualhostAttributes.put(VirtualHost.MODEL_VERSION,
BrokerModel.MODEL_VERSION);
+ virtualhostAttributes.put(VirtualHost.NAME, getName());
+ virtualhostAttributes.putAll(virtualhostBlueprint);
+
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("Creating new virtualhost named " +
virtualhostAttributes.get(VirtualHost.NAME));
+ }
+
+ host = createChild(VirtualHost.class, virtualhostAttributes);
+
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("Created new virtualhost: " + host);
+ }
}
- host = createChild(VirtualHost.class, hostAttributes);
}
else
{
@@ -146,16 +150,4 @@ public abstract class AbstractStandardVi
{
return Collections.emptyList();
}
-
- // protected for unit testing purposes
- 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;
- }
-
-
}
Modified:
qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/JsonVirtualHostNodeImpl.java
URL:
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/JsonVirtualHostNodeImpl.java?rev=1601163&r1=1601162&r2=1601163&view=diff
==============================================================================
---
qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/JsonVirtualHostNodeImpl.java
(original)
+++
qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/JsonVirtualHostNodeImpl.java
Sat Jun 7 19:01:03 2014
@@ -29,9 +29,11 @@ import org.apache.qpid.server.model.Mana
import org.apache.qpid.server.store.DurableConfigurationStore;
import org.apache.qpid.server.store.JsonFileConfigStore;
-@ManagedObject(category=false, type="JSON")
+@ManagedObject(type=JsonVirtualHostNodeImpl.VIRTUAL_HOST_NODE_TYPE,
category=false)
public class JsonVirtualHostNodeImpl extends
AbstractStandardVirtualHostNode<JsonVirtualHostNodeImpl> implements
FileBasedVirtualHostNode<JsonVirtualHostNodeImpl>
{
+ public static final String VIRTUAL_HOST_NODE_TYPE = "JSON";
+
@ManagedAttributeField
private String _storePath;
Modified:
qpid/trunk/qpid/java/broker-core/src/main/resources/initial-config.json
URL:
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/resources/initial-config.json?rev=1601163&r1=1601162&r2=1601163&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-core/src/main/resources/initial-config.json
(original)
+++ qpid/trunk/qpid/java/broker-core/src/main/resources/initial-config.json Sat
Jun 7 19:01:03 2014
@@ -55,7 +55,10 @@
"virtualhostnodes" : [ {
"name" : "default",
"type" : "JSON",
- "storePath" : "${qpid.work_dir}/json/default"
+ "storePath" : "${qpid.work_dir}/default/config",
+ "context" : {
+ "virtualhostBlueprint" : "{ \"type\" : \"DERBY\",
\"messageStoreSettings\" : { \"storePath\" :
\"${qpid.work_dir}/default/messages\" }}"
+ }
} ],
"plugins" : [ {
"type" : "MANAGEMENT-HTTP",
Modified:
qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNodeTest.java
URL:
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNodeTest.java?rev=1601163&r1=1601162&r2=1601163&view=diff
==============================================================================
---
qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNodeTest.java
(original)
+++
qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNodeTest.java
Sat Jun 7 19:01:03 2014
@@ -136,12 +136,8 @@ public class AbstractStandardVirtualHost
node.start();
VirtualHost<?, ?, ?> virtualHost = node.getVirtualHost();
- assertNotNull("Virtual host was not created", virtualHost);
+ assertNull("Virtual host should not be automatically created",
virtualHost);
- // Virtualhost name taken from VHN and ID is random.
- assertEquals("Unexpected virtual host name",
TEST_VIRTUAL_HOST_NODE_NAME, virtualHost.getName());
- assertEquals("Unexpected virtual host state", State.ACTIVE,
virtualHost.getState());
- assertNotNull("Unexpected virtual host id", virtualHost.getId());
}
private ConfiguredObjectRecord createMockVirtualHostCOR(UUID virtualHostId)
Modified:
qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/virtualhostnode/TestVirtualHostNode.java
URL:
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/virtualhostnode/TestVirtualHostNode.java?rev=1601163&r1=1601162&r2=1601163&view=diff
==============================================================================
---
qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/virtualhostnode/TestVirtualHostNode.java
(original)
+++
qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/virtualhostnode/TestVirtualHostNode.java
Sat Jun 7 19:01:03 2014
@@ -20,18 +20,17 @@
*/
package org.apache.qpid.server.virtualhostnode;
-import java.util.Collections;
import java.util.Map;
import org.apache.qpid.server.model.Broker;
import org.apache.qpid.server.model.ManagedObject;
import org.apache.qpid.server.store.DurableConfigurationStore;
-import org.apache.qpid.server.store.MessageStore;
-import org.apache.qpid.server.store.TestMemoryMessageStore;
-@ManagedObject(type="TestMemory", category=false)
+@ManagedObject(type=TestVirtualHostNode.VIRTUAL_HOST_NODE_TYPE, category=false)
public class TestVirtualHostNode extends
AbstractStandardVirtualHostNode<TestVirtualHostNode>
{
+ public static final String VIRTUAL_HOST_NODE_TYPE = "TestMemory";
+
private final DurableConfigurationStore _store;
public TestVirtualHostNode(Broker<?> parent, Map<String, Object>
attributes)
@@ -53,9 +52,4 @@ public class TestVirtualHostNode extends
return _store;
}
- @Override
- public Map<String, Object> getDefaultMessageStoreSettings()
- {
- return Collections.<String,
Object>singletonMap(MessageStore.STORE_TYPE, TestMemoryMessageStore.TYPE);
- }
}
Modified:
qpid/trunk/qpid/java/broker-plugins/derby-store/src/main/java/org/apache/qpid/server/virtualhostnode/derby/DerbyVirtualHostNode.java
URL:
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/derby-store/src/main/java/org/apache/qpid/server/virtualhostnode/derby/DerbyVirtualHostNode.java?rev=1601163&r1=1601162&r2=1601163&view=diff
==============================================================================
---
qpid/trunk/qpid/java/broker-plugins/derby-store/src/main/java/org/apache/qpid/server/virtualhostnode/derby/DerbyVirtualHostNode.java
(original)
+++
qpid/trunk/qpid/java/broker-plugins/derby-store/src/main/java/org/apache/qpid/server/virtualhostnode/derby/DerbyVirtualHostNode.java
Sat Jun 7 19:01:03 2014
@@ -32,9 +32,11 @@ import org.apache.qpid.server.store.derb
import org.apache.qpid.server.virtualhostnode.AbstractStandardVirtualHostNode;
import org.apache.qpid.server.virtualhostnode.FileBasedVirtualHostNode;
-@ManagedObject( category = false, type = "DERBY" )
+@ManagedObject( category = false, type =
DerbyVirtualHostNode.VIRTUAL_HOST_NODE_TYPE )
public class DerbyVirtualHostNode extends
AbstractStandardVirtualHostNode<DerbyVirtualHostNode> implements
FileBasedVirtualHostNode<DerbyVirtualHostNode>
{
+ public static final String VIRTUAL_HOST_NODE_TYPE = "DERBY";
+
@ManagedAttributeField
private String _storePath;
Modified:
qpid/trunk/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhostnode/jdbc/JDBCVirtualHostNodeImpl.java
URL:
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhostnode/jdbc/JDBCVirtualHostNodeImpl.java?rev=1601163&r1=1601162&r2=1601163&view=diff
==============================================================================
---
qpid/trunk/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhostnode/jdbc/JDBCVirtualHostNodeImpl.java
(original)
+++
qpid/trunk/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhostnode/jdbc/JDBCVirtualHostNodeImpl.java
Sat Jun 7 19:01:03 2014
@@ -30,9 +30,11 @@ import org.apache.qpid.server.store.Dura
import org.apache.qpid.server.store.jdbc.JDBCMessageStore;
import org.apache.qpid.server.virtualhostnode.AbstractStandardVirtualHostNode;
-@ManagedObject( category = false, type = "JDBC" )
+@ManagedObject(type = JDBCVirtualHostNodeImpl.VIRTUAL_HOST_NODE_TYPE, category
= false )
public class JDBCVirtualHostNodeImpl extends
AbstractStandardVirtualHostNode<JDBCVirtualHostNodeImpl> implements
JDBCVirtualHostNode<JDBCVirtualHostNodeImpl>
{
+ public static final String VIRTUAL_HOST_NODE_TYPE = "JDBC";
+
@ManagedAttributeField
private String _connectionUrl;
Modified:
qpid/trunk/qpid/java/broker-plugins/memory-store/src/main/java/org/apache/qpid/server/virtualhostnode/memory/MemoryVirtualHostNode.java
URL:
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/memory-store/src/main/java/org/apache/qpid/server/virtualhostnode/memory/MemoryVirtualHostNode.java?rev=1601163&r1=1601162&r2=1601163&view=diff
==============================================================================
---
qpid/trunk/qpid/java/broker-plugins/memory-store/src/main/java/org/apache/qpid/server/virtualhostnode/memory/MemoryVirtualHostNode.java
(original)
+++
qpid/trunk/qpid/java/broker-plugins/memory-store/src/main/java/org/apache/qpid/server/virtualhostnode/memory/MemoryVirtualHostNode.java
Sat Jun 7 19:01:03 2014
@@ -29,9 +29,10 @@ import org.apache.qpid.server.store.Dura
import org.apache.qpid.server.store.MemoryConfigurationStore;
import org.apache.qpid.server.virtualhostnode.AbstractStandardVirtualHostNode;
-@ManagedObject(type="Memory",category=false)
+@ManagedObject(type=MemoryVirtualHostNode.VIRTUAL_HOST_NODE_TYPE,
category=false)
public class MemoryVirtualHostNode extends
AbstractStandardVirtualHostNode<MemoryVirtualHostNode>
{
+ public static final String VIRTUAL_HOST_NODE_TYPE = "Memory";
@ManagedObjectFactoryConstructor
public MemoryVirtualHostNode(Map<String, Object> attributes, Broker<?>
parent)
Modified: qpid/trunk/qpid/java/systests/etc/config-systests.json
URL:
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/systests/etc/config-systests.json?rev=1601163&r1=1601162&r2=1601163&view=diff
==============================================================================
--- qpid/trunk/qpid/java/systests/etc/config-systests.json (original)
+++ qpid/trunk/qpid/java/systests/etc/config-systests.json Sat Jun 7 19:01:03
2014
@@ -60,6 +60,9 @@
"virtualhostnodes" : [ {
"name" : "test",
"type" : "${messagestore.type}",
- "storePath" : "${QPID_WORK}/test/${test.port}"
+ "storePath" : "${QPID_WORK}/${test.port}/test/config",
+ "context" : {
+ "virtualhostBlueprint" : "{ \"type\" : \"ProvidedStore\" }"
+ }
} ]
}
Modified:
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/server/store/SplitStoreTest.java
URL:
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/server/store/SplitStoreTest.java?rev=1601163&r1=1601162&r2=1601163&view=diff
==============================================================================
---
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/server/store/SplitStoreTest.java
(original)
+++
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/server/store/SplitStoreTest.java
Sat Jun 7 19:01:03 2014
@@ -21,6 +21,7 @@
package org.apache.qpid.server.store;
import java.io.File;
+import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
@@ -32,10 +33,11 @@ import javax.jms.Session;
import org.apache.qpid.configuration.ClientProperties;
import org.apache.qpid.server.model.VirtualHostNode;
+import org.apache.qpid.server.virtualhostnode.AbstractStandardVirtualHostNode;
+import org.apache.qpid.server.virtualhostnode.FileBasedVirtualHostNode;
import org.apache.qpid.test.utils.QpidBrokerTestCase;
import org.apache.qpid.test.utils.TestBrokerConfiguration;
import org.apache.qpid.test.utils.TestFileUtils;
-import org.apache.qpid.test.utils.TestUtils;
import org.apache.qpid.util.FileUtils;
public class SplitStoreTest extends QpidBrokerTestCase
@@ -72,39 +74,27 @@ public class SplitStoreTest extends Qpid
// Overridden to prevent QBTC starting the Broker.
}
- public void testPass()
+ public void testJsonConfigurationStoreWithPersistentMessageStore() throws
Exception
{
-
+ doTest(JsonFileConfigStore.TYPE, getTestProfileMessageStoreType());
}
- // TODO reenable once we can specify a virtualhost blueprint context
variable with necessary message store location
- public void xtestJsonConfigurationStoreWithPersistentMessageStore() throws
Exception
+ public void testSeparateConfigurationAndMessageStoresOfTheSameType()
throws Exception
{
-
- doTest(JsonFileConfigStore.TYPE, _configStorePath);
+ doTest(getTestProfileVirtualHostNodeType(),
getTestProfileMessageStoreType());
}
- // TODO test will currently create a provided VH which will share
config/message store
- // TODO reenable once we can specify a virtualhost blueprint context
variable
- public void xtestSeparateConfigurationAndMessageStoresOfTheSameType()
throws Exception
+ private void configureAndStartBroker(String virtualHostNodeType, String
virtualHostType) throws Exception
{
- doTest(getTestProfileVirtualHostNodeType(), _configStorePath);
- }
+ final String blueprint = String.format(
+ "{ \"type\" : \"%s\", \"messageStoreSettings\" : { \"storePath\" :
\"%s\" } }", virtualHostType, _messageStorePath);
+ final Map<String, String> contextMap =
Collections.singletonMap(AbstractStandardVirtualHostNode.VIRTUALHOST_BLUEPRINT_CONTEXT_VAR,
+
blueprint);
- private void configureAndStartBroker(String nodeType, String storePath)
throws Exception
- {
TestBrokerConfiguration config = getBrokerConfiguration();
- config.setObjectAttribute(VirtualHostNode.class,
TestBrokerConfiguration.ENTRY_NAME_VIRTUAL_HOST, VirtualHostNode.TYPE,
nodeType);
- config.setObjectAttribute(VirtualHostNode.class,
TestBrokerConfiguration.ENTRY_NAME_VIRTUAL_HOST,
DurableConfigurationStore.STORE_PATH, storePath);
-
- Map<String, Object> messageStoreSettings = new HashMap<String,
Object>();
- messageStoreSettings.put(MessageStore.STORE_TYPE,
getTestProfileMessageStoreType());
- messageStoreSettings.put(MessageStore.STORE_PATH, _messageStorePath);
-
- // TODO initialise the virtualhost with the required attributes using
the virtualhost blueprint
- // mechanism.
-
- //TestUtils.createStoreWithVirtualHostEntry(messageStoreSettings,
config, nodeType);
+ config.setObjectAttribute(VirtualHostNode.class,
TestBrokerConfiguration.ENTRY_NAME_VIRTUAL_HOST, VirtualHostNode.TYPE,
virtualHostNodeType);
+ config.setObjectAttribute(VirtualHostNode.class,
TestBrokerConfiguration.ENTRY_NAME_VIRTUAL_HOST, VirtualHostNode.CONTEXT,
contextMap);
+ config.setObjectAttribute(VirtualHostNode.class,
TestBrokerConfiguration.ENTRY_NAME_VIRTUAL_HOST,
FileBasedVirtualHostNode.STORE_PATH, _configStorePath);
super.startBroker();
}
Modified:
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/server/store/VirtualHostMessageStoreTest.java
URL:
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/server/store/VirtualHostMessageStoreTest.java?rev=1601163&r1=1601162&r2=1601163&view=diff
==============================================================================
---
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/server/store/VirtualHostMessageStoreTest.java
(original)
+++
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/server/store/VirtualHostMessageStoreTest.java
Sat Jun 7 19:01:03 2014
@@ -30,7 +30,6 @@ import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
-import java.util.UUID;
import javax.security.auth.Subject;
@@ -57,6 +56,7 @@ import org.apache.qpid.server.model.Life
import org.apache.qpid.server.model.Queue;
import org.apache.qpid.server.model.State;
import org.apache.qpid.server.model.UUIDGenerator;
+import org.apache.qpid.server.model.VirtualHost;
import org.apache.qpid.server.model.VirtualHostNode;
import org.apache.qpid.server.protocol.AMQConnectionModel;
import org.apache.qpid.server.protocol.AMQSessionModel;
@@ -121,7 +121,8 @@ public class VirtualHostMessageStoreTest
{
super.setUp();
- String hostName = getName();
+ String nodeName = "node" + getName();
+ String hostName = "host" + getName();
_storePath = System.getProperty("QPID_WORK", TMP_FOLDER +
File.separator + getTestName()) + File.separator + hostName;
cleanup(new File(_storePath));
@@ -131,14 +132,18 @@ public class VirtualHostMessageStoreTest
when(broker.getTaskExecutor()).thenReturn(_taskExecutor);
ConfiguredObjectFactory factory = broker.getObjectFactory();
- Map<String, Object> nodeAttributes = new HashMap<String, Object>();
+ Map<String, Object> nodeAttributes = new HashMap<>();
nodeAttributes.put(ConfiguredObject.TYPE,
getTestProfileVirtualHostNodeType());
nodeAttributes.put(FileBasedVirtualHostNode.STORE_PATH, _storePath);
- nodeAttributes.put(VirtualHostNode.NAME, hostName);
- nodeAttributes.put(VirtualHostNode.ID, UUID.randomUUID());
+ nodeAttributes.put(VirtualHostNode.NAME, nodeName);
_node = factory.create(VirtualHostNode.class, nodeAttributes, broker);
_node.start();
+ final Map<String,Object> virtualHostAttributes = new HashMap<>();
+ virtualHostAttributes.put(VirtualHost.NAME, hostName);
+
+ _node.createChild(VirtualHost.class, virtualHostAttributes, _node);
+
_virtualHost = (VirtualHostImpl<?,?,?>)_node.getVirtualHost();
}
Modified:
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/management/jmx/MBeanLifeCycleTest.java
URL:
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/management/jmx/MBeanLifeCycleTest.java?rev=1601163&r1=1601162&r2=1601163&view=diff
==============================================================================
---
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/management/jmx/MBeanLifeCycleTest.java
(original)
+++
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/management/jmx/MBeanLifeCycleTest.java
Sat Jun 7 19:01:03 2014
@@ -25,14 +25,18 @@ import java.util.HashMap;
import java.util.Map;
import javax.management.ObjectName;
+import javax.servlet.http.HttpServletResponse;
import org.apache.qpid.management.common.mbeans.ManagedBroker;
import org.apache.qpid.server.management.plugin.HttpManagement;
import org.apache.qpid.server.model.AuthenticationProvider;
import org.apache.qpid.server.model.Plugin;
import org.apache.qpid.server.model.Port;
+import org.apache.qpid.server.model.VirtualHost;
import org.apache.qpid.server.model.VirtualHostNode;
import
org.apache.qpid.server.security.auth.manager.AnonymousAuthenticationManager;
+import org.apache.qpid.server.virtualhost.ProvidedStoreVirtualHost;
+import org.apache.qpid.server.virtualhostnode.memory.MemoryVirtualHostNode;
import org.apache.qpid.systest.rest.QpidRestTestCase;
import org.apache.qpid.test.utils.JMXTestUtils;
import org.apache.qpid.test.utils.TestBrokerConfiguration;
@@ -81,14 +85,24 @@ public class MBeanLifeCycleTest extends
public void testVirtualHostMBeanIsRegisteredOnVirtualHostCreation() throws
Exception
{
- String nodeName = "tmp";
- Map<String, Object> nodeData = new HashMap<String, Object>();
+ String nodeName = "ntmp";
+ String hostName = "htmp";
+
+ Map<String, Object> nodeData = new HashMap<>();
nodeData.put(VirtualHostNode.NAME, nodeName);
- nodeData.put(VirtualHostNode.TYPE, "Memory");
- int status = getRestTestHelper().submitRequest("virtualhostnode/" +
nodeName, "PUT", nodeData);
- assertEquals("Unexpected code", 201, status);
+ nodeData.put(VirtualHostNode.TYPE,
MemoryVirtualHostNode.VIRTUAL_HOST_NODE_TYPE);
+ getRestTestHelper().submitRequest("virtualhostnode/" + nodeName,
"PUT", nodeData, HttpServletResponse.SC_CREATED);
+
+ Map<String, Object> virtualhostData = new HashMap<>();
+ virtualhostData.put(VirtualHost.NAME, nodeName);
+ virtualhostData.put(VirtualHost.TYPE,
ProvidedStoreVirtualHost.VIRTUAL_HOST_TYPE);
+ getRestTestHelper().submitRequest("virtualhost/" + nodeName + "/" +
hostName,
+ "PUT",
+ virtualhostData,
+ HttpServletResponse.SC_CREATED);
+
- ManagedBroker managedBroker = _jmxUtils.getManagedBroker(nodeName);
+ ManagedBroker managedBroker = _jmxUtils.getManagedBroker(hostName);
assertNotNull("Host mBean is not created", managedBroker);
}
@@ -99,8 +113,7 @@ public class MBeanLifeCycleTest extends
boolean mBeanExists =_jmxUtils.doesManagedObjectExist(query);
assertTrue("Host mBean is not registered", mBeanExists);
- int status = getRestTestHelper().submitRequest("virtualhostnode/" +
TEST2_VIRTUALHOST, "DELETE");
- assertEquals("Unexpected code", 200, status);
+ getRestTestHelper().submitRequest("virtualhostnode/" +
TEST2_VIRTUALHOST, "DELETE", HttpServletResponse.SC_OK);
mBeanExists =_jmxUtils.doesManagedObjectExist(query);
assertFalse("Host mBean is not unregistered", mBeanExists);
Modified:
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/RestTestHelper.java
URL:
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/RestTestHelper.java?rev=1601163&r1=1601162&r2=1601163&view=diff
==============================================================================
---
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/RestTestHelper.java
(original)
+++
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/RestTestHelper.java
Sat Jun 7 19:01:03 2014
@@ -277,7 +277,7 @@ public class RestTestHelper
List<Map<String, Object>> response = getJsonAsList(path);
Assert.assertNotNull("Response cannot be null", response);
- Assert.assertEquals("Unexpected response", 1, response.size());
+ Assert.assertEquals("Unexpected response from " + path, 1,
response.size());
return response.get(0);
}
Modified:
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/VirtualHostNodeRestTest.java
URL:
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/VirtualHostNodeRestTest.java?rev=1601163&r1=1601162&r2=1601163&view=diff
==============================================================================
---
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/VirtualHostNodeRestTest.java
(original)
+++
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/VirtualHostNodeRestTest.java
Sat Jun 7 19:01:03 2014
@@ -31,7 +31,7 @@ import javax.servlet.http.HttpServletRes
import org.apache.qpid.server.model.ConfiguredObject;
import org.apache.qpid.server.model.VirtualHostNode;
-import org.apache.qpid.server.store.DurableConfigurationStore;
+import org.apache.qpid.server.virtualhostnode.FileBasedVirtualHostNode;
import org.apache.qpid.test.utils.TestBrokerConfiguration;
/**
@@ -53,7 +53,7 @@ public class VirtualHostNodeRestTest ex
}
}
- public void testCreateAndDeleteNodeWithTestProfileStore() throws Exception
+ public void testCreateAndDeleteVirtualHostNode() throws Exception
{
String storeType = getTestProfileVirtualHostNodeType();
String nodeName = "virtualhostnode-" + getTestName();
@@ -63,17 +63,6 @@ public class VirtualHostNodeRestTest ex
assertFalse("Store should not exist after deletion",
storePathAsFile.exists());
}
- public void testCreateAndDeleteNodeWithJsonStore() throws Exception
- {
- String storeType = "JSON";
- String nodeName = "virtualhostnode-" + getTestName();
- File storePathAsFile = new File(getStoreLocation(nodeName));
-
- createAndDeleteVirtualHostNode(storeType, nodeName, storePathAsFile);
- // TODO Defect: JSON store currently can't delete itself, uncomment
once this is resolved
- //assertFalse("Store should not exist after deletion",
storePathAsFile.exists());
- }
-
public void testRecoverVirtualHostNodeWithDesiredStateStopped() throws
Exception
{
stopBroker();
@@ -118,18 +107,20 @@ public class VirtualHostNodeRestTest ex
assertEquals(newDescription,
virtualhostNode.get(VirtualHostNode.DESCRIPTION));
}
- private void createAndDeleteVirtualHostNode(final String storeType,
+ private void createAndDeleteVirtualHostNode(final String
virtualhostNodeType,
final String nodeName,
final File storePathAsFile)
throws Exception
{
assertFalse("Store should not exist", storePathAsFile.exists());
- createVirtualHostNode(nodeName, storePathAsFile.getAbsolutePath(),
storeType);
+ createVirtualHostNode(nodeName, storePathAsFile.getAbsolutePath(),
virtualhostNodeType);
assertTrue("Store should exist after creation of node",
storePathAsFile.exists());
String restUrl = "virtualhostnode/" + nodeName;
Map<String, Object> virtualhostNode =
getRestTestHelper().getJsonAsSingletonList(restUrl);
Asserts.assertVirtualHostNode(nodeName, virtualhostNode);
+ assertNull("Virtualhostnode should not automatically get a virtualhost
child",
+ virtualhostNode.get("virtualhosts"));
getRestTestHelper().submitRequest(restUrl, "DELETE",
HttpServletResponse.SC_OK);
@@ -158,7 +149,7 @@ public class VirtualHostNodeRestTest ex
Map<String, Object> nodeData = new HashMap<String, Object>();
nodeData.put(VirtualHostNode.NAME, nodeName);
nodeData.put(VirtualHostNode.TYPE, storeType);
- nodeData.put(DurableConfigurationStore.STORE_PATH, configStorePath);
+ nodeData.put(FileBasedVirtualHostNode.STORE_PATH, configStorePath);
getRestTestHelper().submitRequest("virtualhostnode/" + nodeName,
"PUT",
Modified:
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/VirtualHostRestTest.java
URL:
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/VirtualHostRestTest.java?rev=1601163&r1=1601162&r2=1601163&view=diff
==============================================================================
---
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/VirtualHostRestTest.java
(original)
+++
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/VirtualHostRestTest.java
Sat Jun 7 19:01:03 2014
@@ -41,8 +41,9 @@ import org.apache.qpid.server.model.Virt
import org.apache.qpid.server.queue.LastValueQueue;
import org.apache.qpid.server.queue.PriorityQueue;
import org.apache.qpid.server.queue.SortedQueue;
-import org.apache.qpid.server.store.DurableConfigurationStore;
import org.apache.qpid.server.virtualhost.AbstractVirtualHost;
+import org.apache.qpid.server.virtualhost.ProvidedStoreVirtualHost;
+import org.apache.qpid.server.virtualhostnode.FileBasedVirtualHostNode;
import org.apache.qpid.util.FileUtils;
public class VirtualHostRestTest extends QpidRestTestCase
@@ -105,11 +106,11 @@ public class VirtualHostRestTest extends
Asserts.assertConnection(connections.get(0), _connection);
}
- public void testPutCreateVirtualHostUsingStoreType() throws Exception
+ public void testPutCreateVirtualHostUsingProfileNodeType() throws Exception
{
String hostName = getTestName();
- String storeType = getTestProfileVirtualHostNodeType();
- String storeLocation = createHost(hostName, storeType, null);
+ String virtualhostNodeType = getTestProfileVirtualHostNodeType();
+ String storeLocation = createVirtualHostNodeAndVirtualHost(hostName,
virtualhostNodeType);
try
{
// make sure that the host is saved in the broker store
@@ -525,12 +526,28 @@ public class VirtualHostRestTest extends
return getRestTestHelper().submitRequest("queue/test/test/" +
queueName, "PUT", queueData);
}
- private String createHost(String hostName, String storeType, String
configPath) throws IOException, JsonGenerationException,
- JsonMappingException
+ private String createVirtualHostNodeAndVirtualHost(String virtualHostName,
+ String
virtualHostNodeType) throws Exception
{
- String storePath = getStoreLocation(hostName);
- int responseCode = tryCreateVirtualHostNode(hostName, storeType,
storePath, configPath);
- assertEquals("Unexpected response code", 201, responseCode);
+ String storePath = getStoreLocation(virtualHostName);
+
+ Map<String, Object> nodeData = new HashMap<>();
+ nodeData.put(VirtualHostNode.NAME, virtualHostName);
+ nodeData.put(VirtualHostNode.TYPE, virtualHostNodeType);
+ nodeData.put(FileBasedVirtualHostNode.STORE_PATH, storePath);
+
+ getRestTestHelper().submitRequest("virtualhostnode/" +
virtualHostName, "PUT", nodeData, HttpServletResponse.SC_CREATED);
+
+ Map<String, Object> virtualhostData = new HashMap<>();
+ virtualhostData.put(VirtualHost.NAME, virtualHostName);
+ virtualhostData.put(VirtualHost.TYPE,
ProvidedStoreVirtualHost.VIRTUAL_HOST_TYPE);
+
+ getRestTestHelper().submitRequest("virtualhost/" + virtualHostName +
"/" + virtualHostName,
+ "PUT",
+ virtualhostData,
+ HttpServletResponse.SC_CREATED);
+
+
return storePath;
}
@@ -539,21 +556,6 @@ public class VirtualHostRestTest extends
return new File(TMP_FOLDER, "store-" + hostName + "-" +
System.currentTimeMillis()).getAbsolutePath();
}
- private int tryCreateVirtualHostNode(String hostName,
- String virtualHostNodeType,
- String storePath,
- String configPath) throws IOException,
- JsonGenerationException, JsonMappingException
- {
-
- Map<String, Object> hostData = new HashMap<String, Object>();
- hostData.put(VirtualHostNode.NAME, hostName);
- hostData.put(VirtualHostNode.TYPE, virtualHostNodeType);
- hostData.put(DurableConfigurationStore.STORE_PATH, storePath);
-
- return getRestTestHelper().submitRequest("virtualhostnode/" +
hostName, "PUT", hostData);
- }
-
private void assertNewVirtualHost(Map<String, Object> hostDetails)
{
@SuppressWarnings("unchecked")
Modified:
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/acl/BrokerACLTest.java
URL:
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/acl/BrokerACLTest.java?rev=1601163&r1=1601162&r2=1601163&view=diff
==============================================================================
---
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/acl/BrokerACLTest.java
(original)
+++
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/acl/BrokerACLTest.java
Sat Jun 7 19:01:03 2014
@@ -49,7 +49,7 @@ import org.apache.qpid.server.security.a
import org.apache.qpid.server.security.acl.AbstractACLTestCase;
import
org.apache.qpid.server.security.auth.manager.AnonymousAuthenticationManager;
import
org.apache.qpid.server.security.auth.manager.PlainPasswordDatabaseAuthenticationManager;
-import org.apache.qpid.server.store.DurableConfigurationStore;
+import org.apache.qpid.server.virtualhostnode.FileBasedVirtualHostNode;
import org.apache.qpid.systest.rest.QpidRestTestCase;
import org.apache.qpid.test.utils.TestBrokerConfiguration;
import org.apache.qpid.test.utils.TestFileUtils;
@@ -982,7 +982,7 @@ public class BrokerACLTest extends QpidR
Map<String, Object> data = new HashMap<String, Object>();
data.put(VirtualHostNode.NAME, virtualHostNodeName);
data.put(VirtualHostNode.TYPE, getTestProfileVirtualHostNodeType());
- data.put(DurableConfigurationStore.STORE_PATH,
getStoreLocation(virtualHostNodeName));
+ data.put(FileBasedVirtualHostNode.STORE_PATH,
getStoreLocation(virtualHostNodeName));
return getRestTestHelper().submitRequest("virtualhostnode/" +
virtualHostNodeName, "PUT", data);
}
Modified:
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java
URL:
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java?rev=1601163&r1=1601162&r2=1601163&view=diff
==============================================================================
---
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java
(original)
+++
qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java
Sat Jun 7 19:01:03 2014
@@ -22,6 +22,7 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -63,11 +64,15 @@ import org.apache.qpid.server.BrokerOpti
import org.apache.qpid.server.configuration.BrokerProperties;
import org.apache.qpid.server.configuration.updater.TaskExecutor;
import org.apache.qpid.server.configuration.updater.TaskExecutorImpl;
+import org.apache.qpid.server.model.ConfiguredObject;
import org.apache.qpid.server.model.Port;
import org.apache.qpid.server.model.Protocol;
import org.apache.qpid.server.model.VirtualHostNode;
import org.apache.qpid.server.store.DurableConfigurationStore;
import org.apache.qpid.server.store.MemoryConfigurationStore;
+import org.apache.qpid.server.virtualhost.ProvidedStoreVirtualHost;
+import org.apache.qpid.server.virtualhostnode.AbstractStandardVirtualHostNode;
+import org.apache.qpid.server.virtualhostnode.FileBasedVirtualHostNode;
import org.apache.qpid.url.URLSyntaxException;
import org.apache.qpid.util.FileUtils;
import org.apache.qpid.util.SystemUtils;
@@ -859,14 +864,18 @@ public class QpidBrokerTestCase extends
storeDir = "${QPID_WORK}" + File.separator + virtualHostNodeName +
File.separator + brokerPort;
}
- // add new virtual host configuration to the broker store
+ // add new virtual host node with vhost blueprint configuration to the
broker store
Map<String, Object> attributes = new HashMap<String, Object>();
attributes.put(VirtualHostNode.NAME, virtualHostNodeName);
attributes.put(VirtualHostNode.TYPE, storeType);
if (storeDir != null)
{
- attributes.put(DurableConfigurationStore.STORE_PATH, storeDir);
+ attributes.put(FileBasedVirtualHostNode.STORE_PATH, storeDir);
}
+ final String blueprint = String.format("{ \"type\" : \"%s\" } }",
ProvidedStoreVirtualHost.VIRTUAL_HOST_TYPE);
+ attributes.put(ConfiguredObject.CONTEXT,
Collections.singletonMap(AbstractStandardVirtualHostNode.VIRTUALHOST_BLUEPRINT_CONTEXT_VAR,
+
blueprint));
+
int port = getPort(brokerPort);
getBrokerConfiguration(port).addObjectConfiguration(VirtualHostNode.class,
attributes);
}
Modified: qpid/trunk/qpid/java/test-profiles/JavaTransientExcludes
URL:
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/test-profiles/JavaTransientExcludes?rev=1601163&r1=1601162&r2=1601163&view=diff
==============================================================================
--- qpid/trunk/qpid/java/test-profiles/JavaTransientExcludes (original)
+++ qpid/trunk/qpid/java/test-profiles/JavaTransientExcludes Sat Jun 7
19:01:03 2014
@@ -53,8 +53,9 @@ org.apache.qpid.systest.management.jmx.Q
org.apache.qpid.test.unit.client.MaxDeliveryCountTest#testWhenBrokerIsRestartedAfterEnqeuingMessages
+org.apache.qpid.systest.rest.VirtualHostRestTest#testPutCreateVirtualHostUsingProfileNodeType
org.apache.qpid.systest.rest.VirtualHostRestTest#testRecoverVirtualHostInDesiredStateStoppedWithDescription
-org.apache.qpid.systest.rest.VirtualHostNodeRestTest#testCreateAndDeleteNodeWithTestProfileStore
-org.apache.qpid.systest.rest.VirtualHostNodeRestTest#testCreateAndDeleteNodeWithJsonStore
+org.apache.qpid.systest.rest.VirtualHostNodeRestTest#testCreateAndDeleteVirtualHostNode
+
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]