ARTEMIS-853 Support for exclusive consumers

Rationalise and re-use URISupport.
This commit is contained in:
Michael André Pearce 2018-02-02 18:19:40 +00:00 committed by Michael Andre Pearce
parent dc41f3ca49
commit 38c45c9214
3 changed files with 58 additions and 46 deletions

View File

@ -16,46 +16,32 @@
*/
package org.apache.activemq.artemis.api.core;
import static org.apache.activemq.artemis.utils.uri.URISupport.appendParameters;
import static org.apache.activemq.artemis.utils.uri.URISupport.parseQuery;
import java.net.URISyntaxException;
import java.util.Map;
import org.apache.activemq.artemis.utils.uri.URISupport;
public class ParameterisedAddress {
public static SimpleString toParameterisedAddress(SimpleString address, Map<String, String> parameters) {
if (parameters != null && parameters.size() > 0) {
public static SimpleString toParameterisedAddress(SimpleString address, Map<String, String> parameters) throws URISyntaxException {
if (parameters != null && !parameters.isEmpty()) {
return SimpleString.toSimpleString(toParameterisedAddress(address.toString(), parameters));
} else {
return address;
}
}
public static String toParameterisedAddress(String address, Map<String, String> parameters) {
if (parameters != null && parameters.size() > 0) {
StringBuilder stringBuilder = new StringBuilder(address).append(PARAMETER_MARKER);
return toParameterString(stringBuilder, parameters).toString();
public static String toParameterisedAddress(String address, Map<String, String> parameters) throws URISyntaxException {
if (parameters != null && !parameters.isEmpty()) {
return appendParameters(new StringBuilder(address), parameters).toString();
} else {
return address;
}
}
private static StringBuilder toParameterString(StringBuilder stringBuilder, Map<String, String> parameters) {
boolean first = true;
for (Map.Entry<String, String> entry : parameters.entrySet()) {
if (first) {
first = false;
} else {
stringBuilder.append(PARAMETER_SEPERATOR);
}
stringBuilder.append(entry.getKey()).append(PARAMETER_KEY_VALUE_SEPERATOR).append(entry.getValue());
}
return stringBuilder;
}
public static char PARAMETER_SEPERATOR = '&';
public static char PARAMETER_KEY_VALUE_SEPERATOR = '=';
public static char PARAMETER_MARKER = '?';
public static String PARAMETER_SEPERATOR_STRING = Character.toString(PARAMETER_SEPERATOR);
public static String PARAMETER_KEY_VALUE_SEPERATOR_STRING = Character.toString(PARAMETER_KEY_VALUE_SEPERATOR);
public static String PARAMETER_MARKER_STRING = Character.toString(PARAMETER_MARKER);
private final SimpleString address;
private final QueueAttributes queueAttributes;
@ -81,22 +67,17 @@ public class ParameterisedAddress {
}
public ParameterisedAddress(String address) {
int index = address.indexOf(PARAMETER_MARKER);
int index = address.indexOf('?');
if (index == -1) {
this.address = SimpleString.toSimpleString(address);
this.queueAttributes = null;
} else {
this.address = SimpleString.toSimpleString(address.substring(0, index));
String parametersString = address.substring(index + 1, address.length());
String[] parameterPairs = parametersString.split(PARAMETER_SEPERATOR_STRING);
QueueAttributes queueAttributes = new QueueAttributes();
for (String param : parameterPairs) {
String[] keyValue = param.split(PARAMETER_KEY_VALUE_SEPERATOR_STRING);
if (keyValue.length != 2) {
throw new IllegalArgumentException("Malformed parameter section " + param);
} else {
queueAttributes.set(keyValue[0], keyValue[1]);
}
try {
parseQuery(address).forEach(queueAttributes::set);
} catch (URISyntaxException use) {
throw new IllegalArgumentException("Malformed parameters in address " + address);
}
this.queueAttributes = queueAttributes;
}
@ -107,11 +88,11 @@ public class ParameterisedAddress {
}
public static boolean isParameterised(String address) {
return address.contains(PARAMETER_MARKER_STRING);
return URISupport.containsQuery(address);
}
public static boolean isParameterised(SimpleString address) {
return address.contains(PARAMETER_MARKER);
return URISupport.containsQuery(address);
}
}

View File

@ -27,6 +27,8 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.activemq.artemis.api.core.SimpleString;
/**
* Utility class that provides methods for parsing URI's
*
@ -75,7 +77,7 @@ public class URISupport {
}
public URI toURI() throws URISyntaxException {
StringBuffer sb = new StringBuffer();
StringBuilder sb = new StringBuilder();
if (scheme != null) {
sb.append(scheme);
sb.append(':');
@ -98,18 +100,23 @@ public class URISupport {
sb.append('/');
sb.append(path);
}
if (!parameters.isEmpty()) {
sb.append("?");
sb.append(createQueryString(parameters));
}
appendParameters(sb, parameters);
if (fragment != null) {
sb.append("#");
sb.append('#');
sb.append(fragment);
}
return new URI(sb.toString());
}
}
public static StringBuilder appendParameters(StringBuilder sb, Map<String, String> parameters) throws URISyntaxException {
if (!parameters.isEmpty()) {
sb.append('?');
sb.append(createQueryString(parameters));
}
return sb;
}
/**
* Give a URI break off any URI options and store them in a Key / Value Mapping.
*
@ -122,8 +129,7 @@ public class URISupport {
uri = uri.substring(uri.lastIndexOf("?") + 1); // get only the relevant part of the query
Map<String, String> rc = new HashMap<>();
if (uri != null && !uri.isEmpty()) {
parseParameters(rc, uri.split("&"));
parseParameters(rc, uri.split(";"));
parseParameters(rc, uri.split("[&;]"));
}
return rc;
} catch (UnsupportedEncodingException e) {
@ -131,6 +137,14 @@ public class URISupport {
}
}
public static boolean containsQuery(String uri) {
return uri.contains("?");
}
public static boolean containsQuery(SimpleString uri) {
return uri.contains('?');
}
private static void parseParameters(Map<String, String> rc,
String[] parameters) throws UnsupportedEncodingException {
for (String parameter : parameters) {
@ -198,7 +212,7 @@ public class URISupport {
Map<String, String> queryParameters,
String optionPrefix) throws URISyntaxException {
if (queryParameters != null && !queryParameters.isEmpty()) {
StringBuffer newQuery = uri.getRawQuery() != null ? new StringBuffer(uri.getRawQuery()) : new StringBuffer();
StringBuilder newQuery = uri.getRawQuery() != null ? new StringBuilder(uri.getRawQuery()) : new StringBuilder();
for (Map.Entry<String, String> param : queryParameters.entrySet()) {
if (param.getKey().startsWith(optionPrefix)) {
if (newQuery.length() != 0) {

View File

@ -18,6 +18,7 @@ package org.apache.activemq.artemis.jms.client;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
@ -42,5 +43,21 @@ public class ActiveMQParameterTest {
activeMQDestination = new ActiveMQQueue("jms.queue.foo?last-value=false");
assertFalse(activeMQDestination.getQueueAttributes().getLastValue());
}
@Test
public void testMultipleQueueParameters() {
ActiveMQDestination activeMQDestination = new ActiveMQQueue("jms.queue.foo?last-value=true&exclusive=true");
assertEquals("jms.queue.foo", activeMQDestination.getAddress());
assertTrue(activeMQDestination.getQueueAttributes().getLastValue());
assertTrue(activeMQDestination.getQueueAttributes().getExclusive());
}
@Test
public void testNoQueueParameters() {
ActiveMQDestination activeMQDestination = new ActiveMQQueue("jms.queue.foo");
assertEquals("jms.queue.foo", activeMQDestination.getAddress());
assertNull(activeMQDestination.getQueueAttributes());
}
}