Repository: activemq-artemis Updated Branches: refs/heads/master 70d5e3149 -> c8b7dcec9
ARTEMIS-1537 broker was less strict while reloading configuration Project: http://git-wip-us.apache.org/repos/asf/activemq-artemis/repo Commit: http://git-wip-us.apache.org/repos/asf/activemq-artemis/commit/736e95c2 Tree: http://git-wip-us.apache.org/repos/asf/activemq-artemis/tree/736e95c2 Diff: http://git-wip-us.apache.org/repos/asf/activemq-artemis/diff/736e95c2 Branch: refs/heads/master Commit: 736e95c28722667f15ade16bbc3d13f9b6981ff3 Parents: 70d5e31 Author: Stanislav Knot <[email protected]> Authored: Tue Dec 5 17:01:20 2017 +0100 Committer: Michael Pearce <[email protected]> Committed: Tue Dec 12 13:18:41 2017 +0000 ---------------------------------------------------------------------- .../apache/activemq/artemis/utils/XMLUtil.java | 2 +- .../deployers/impl/FileConfigurationParser.java | 17 +- ...figurationTest-full-config-wrong-address.xml | 212 +++++++++++++++++++ .../impl/ConfigurationValidationTest.java | 16 ++ 4 files changed, 243 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/736e95c2/artemis-core-client/src/main/java/org/apache/activemq/artemis/utils/XMLUtil.java ---------------------------------------------------------------------- diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/utils/XMLUtil.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/utils/XMLUtil.java index ac57a15..017832b 100644 --- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/utils/XMLUtil.java +++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/utils/XMLUtil.java @@ -352,7 +352,7 @@ public final class XMLUtil { return nodes; } - private static URL findResource(final String resourceName) { + public static URL findResource(final String resourceName) { return AccessController.doPrivileged(new PrivilegedAction<URL>() { @Override public URL run() { http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/736e95c2/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java ---------------------------------------------------------------------- diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java index e8eee49..6c64a3b 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java @@ -89,6 +89,12 @@ import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; +import javax.xml.XMLConstants; +import javax.xml.transform.dom.DOMSource; +import javax.xml.validation.Schema; +import javax.xml.validation.SchemaFactory; +import javax.xml.validation.Validator; + /** * Parses an XML document according to the {@literal artemis-configuration.xsd} schema. */ @@ -248,14 +254,19 @@ public final class FileConfigurationParser extends XMLConfigurationUtil { } public Configuration parseMainConfig(final InputStream input) throws Exception { - Reader reader = new InputStreamReader(input); String xml = XMLUtil.readerToString(reader); xml = XMLUtil.replaceSystemProps(xml); Element e = XMLUtil.stringToElement(xml); - + SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); + Schema schema = schemaFactory.newSchema(XMLUtil.findResource("schema/artemis-server.xsd")); + Validator validator = schema.newValidator(); + try { + validator.validate(new DOMSource(e)); + } catch (Exception ex) { + ActiveMQServerLogger.LOGGER.error(ex.getMessage()); + } Configuration config = new ConfigurationImpl(); - parseMainConfig(e, config); return config; http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/736e95c2/artemis-server/src/test/resources/ConfigurationTest-full-config-wrong-address.xml ---------------------------------------------------------------------- diff --git a/artemis-server/src/test/resources/ConfigurationTest-full-config-wrong-address.xml b/artemis-server/src/test/resources/ConfigurationTest-full-config-wrong-address.xml new file mode 100644 index 0000000..202dbba --- /dev/null +++ b/artemis-server/src/test/resources/ConfigurationTest-full-config-wrong-address.xml @@ -0,0 +1,212 @@ +<?xml version='1.0'?> +<!-- +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. +--> + +<configuration xmlns="urn:activemq" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="urn:activemq /schema/artemis-configuration.xsd"> + + <core xmlns="urn:activemq:core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="urn:activemq:core "> + + <name>0.0.0.0</name> + + <persistence-enabled>true</persistence-enabled> + + <!-- this could be ASYNCIO, MAPPED, NIO + ASYNCIO: Linux Libaio + MAPPED: mmap files + NIO: Plain Java Files + --> + <journal-type>ASYNCIO</journal-type> + + <paging-directory>./data/paging</paging-directory> + + <bindings-directory>./data/bindings</bindings-directory> + + <journal-directory>./data/journal</journal-directory> + + <large-messages-directory>./data/large-messages</large-messages-directory> + + <journal-datasync>true</journal-datasync> + + <journal-min-files>2</journal-min-files> + + <journal-pool-files>-1</journal-pool-files> + + <journal-file-size>10M</journal-file-size> + + <!-- + This value was determined through a calculation. + Your system could perform 31,25 writes per millisecond + on the current journal configuration. + That translates as a sync write every 32000 nanoseconds. + + Note: If you specify 0 the system will perform writes directly to the disk. + We recommend this to be 0 if you are using journalType=MAPPED and ournal-datasync=false. + --> + <journal-buffer-timeout>32000</journal-buffer-timeout> + + + <!-- + When using ASYNCIO, this will determine the writing queue depth for libaio. + --> + <journal-max-io>4096</journal-max-io> + <!-- + You can verify the network health of a particular NIC by specifying the <network-check-NIC> element. + <network-check-NIC>theNicName</network-check-NIC> + --> + + <!-- + Use this to use an HTTP server to validate the network + <network-check-URL-list>http://www.apache.org</network-check-URL-list> --> + + <!-- <network-check-period>10000</network-check-period> --> + <!-- <network-check-timeout>1000</network-check-timeout> --> + + <!-- this is a comma separated list, no spaces, just DNS or IPs + it should accept IPV6 + + Warning: Make sure you understand your network topology as this is meant to validate if your network is valid. + Using IPs that could eventually disappear or be partially visible may defeat the purpose. + You can use a list of multiple IPs, and if any successful ping will make the server OK to continue running --> + <!-- <network-check-list>10.0.0.1</network-check-list> --> + + <!-- use this to customize the ping used for ipv4 addresses --> + <!-- <network-check-ping-command>ping -c 1 -t %d %s</network-check-ping-command> --> + + <!-- use this to customize the ping used for ipv6 addresses --> + <!-- <network-check-ping6-command>ping6 -c 1 %2$s</network-check-ping6-command> --> + + + + + <!-- how often we are looking for how many bytes are being used on the disk in ms --> + <disk-scan-period>5000</disk-scan-period> + + <!-- once the disk hits this limit the system will block, or close the connection in certain protocols + that won't support flow control. --> + <max-disk-usage>90</max-disk-usage> + + <!-- should the broker detect dead locks and other issues --> + <critical-analyzer>true</critical-analyzer> + + <critical-analyzer-timeout>120000</critical-analyzer-timeout> + + <critical-analyzer-check-period>60000</critical-analyzer-check-period> + + <critical-analyzer-policy>HALT</critical-analyzer-policy> + + <!-- the system will enter into page mode once you hit this limit. + This is an estimate in bytes of how much the messages are using in memory + + The system will use half of the available memory (-Xmx) by default for the global-max-size. + You may specify a different value here if you need to customize it to your needs. + + <global-max-size>100Mb</global-max-size> + + --> + + <acceptors> + + <!-- useEpoll means: it will use Netty epoll if you are on a system (Linux) that supports it --> + <!-- amqpCredits: The number of credits sent to AMQP producers --> + <!-- amqpLowCredits: The server will send the # credits specified at amqpCredits at this low mark --> + + <!-- Acceptor for every supported protocol --> + <acceptor name="artemis">tcp://0.0.0.0:61616?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;protocols=CORE,AMQP,STOMP,HORNETQ,MQTT,OPENWIRE;useEpoll=true;amqpCredits=1000;amqpLowCredits=300</acceptor> + + <!-- AMQP Acceptor. Listens on default AMQP port for AMQP traffic.--> + <acceptor name="amqp">tcp://0.0.0.0:5672?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;protocols=AMQP;useEpoll=true;amqpCredits=1000;amqpMinCredits=300</acceptor> + + <!-- STOMP Acceptor. --> + <acceptor name="stomp">tcp://0.0.0.0:61613?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;protocols=STOMP;useEpoll=true</acceptor> + + <!-- HornetQ Compatibility Acceptor. Enables HornetQ Core and STOMP for legacy HornetQ clients. --> + <acceptor name="hornetq">tcp://0.0.0.0:5445?protocols=HORNETQ,STOMP;useEpoll=true</acceptor> + + <!-- MQTT Acceptor --> + <acceptor name="mqtt">tcp://0.0.0.0:1883?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;protocols=MQTT;useEpoll=true</acceptor> + + </acceptors> + + + <security-settings> + <security-setting match="#"> + <permission type="createNonDurableQueue" roles="amq"/> + <permission type="deleteNonDurableQueue" roles="amq"/> + <permission type="createDurableQueue" roles="amq"/> + <permission type="deleteDurableQueue" roles="amq"/> + <permission type="createAddress" roles="amq"/> + <permission type="deleteAddress" roles="amq"/> + <permission type="consume" roles="amq"/> + <permission type="browse" roles="amq"/> + <permission type="send" roles="amq"/> + <!-- we need this otherwise ./artemis data imp wouldn't work --> + <permission type="manage" roles="amq"/> + </security-setting> + </security-settings> + + <address-settings> + <!-- if you define auto-create on certain queues, management has to be auto-create --> + <address-setting match="activemq.management#"> + <dead-letter-address>DLQ</dead-letter-address> + <expiry-address>ExpiryQueue</expiry-address> + <redelivery-delay>0</redelivery-delay> + <!-- with -1 only the global-max-size is in use for limiting --> + <max-size-bytes>-1</max-size-bytes> + <message-counter-history-day-limit>10</message-counter-history-day-limit> + <address-full-policy>PAGE</address-full-policy> + <auto-create-queues>true</auto-create-queues> + <auto-create-addresses>true</auto-create-addresses> + <auto-create-jms-queues>true</auto-create-jms-queues> + <auto-create-jms-topics>true</auto-create-jms-topics> + </address-setting> + <!--default for catch all--> + <address-setting match="#"> + <dead-letter-address>DLQ</dead-letter-address> + <expiry-address>ExpiryQueue</expiry-address> + <redelivery-delay>0</redelivery-delay> + <!-- with -1 only the global-max-size is in use for limiting --> + <max-size-bytes>-1</max-size-bytes> + <message-counter-history-day-limit>10</message-counter-history-day-limit> + <address-full-policy>PAGE</address-full-policy> + <auto-create-queues>true</auto-create-queues> + <auto-create-addresses>true</auto-create-addresses> + <auto-create-jms-queues>true</auto-create-jms-queues> + <auto-create-jms-topics>true</auto-create-jms-topics> + </address-setting> + </address-settings> + + <addresses> + <address name="DLQ"> + <anycast> + <queue name="DLQ" /> + </anycast> + </address> + <address name="ExpiryQueue"> + <anycast> + <queue name="ExpiryQueue" /> + </anycast> + </address> + fail + </addresses> + + </core> +</configuration> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/736e95c2/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/config/impl/ConfigurationValidationTest.java ---------------------------------------------------------------------- diff --git a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/config/impl/ConfigurationValidationTest.java b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/config/impl/ConfigurationValidationTest.java index ac6e4be..c6b7c16 100644 --- a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/config/impl/ConfigurationValidationTest.java +++ b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/config/impl/ConfigurationValidationTest.java @@ -57,4 +57,20 @@ public class ConfigurationValidationTest extends ActiveMQTestBase { Assert.assertEquals(true, fc.isPersistDeliveryCountBeforeDelivery()); } + + @Test + public void testChangeConfiguration() throws Exception { + FileConfiguration fc = new FileConfiguration(); + FileDeploymentManager deploymentManager = new FileDeploymentManager("ConfigurationTest-full-config.xml"); + deploymentManager.addDeployable(fc); + deploymentManager.readConfiguration(); + deploymentManager = new FileDeploymentManager("ConfigurationTest-full-config-wrong-address.xml"); + deploymentManager.addDeployable(fc); + + try { + deploymentManager.readConfiguration(); + fail("Exception expected"); + } catch (Exception ignored) { + } + } }
