summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Godfrey <rgodfrey@apache.org>2015-03-02 00:45:45 +0000
committerRobert Godfrey <rgodfrey@apache.org>2015-03-02 00:45:45 +0000
commit2bb28f477ab2ff92d6fe6c7a5694449638f94661 (patch)
tree951c458de0b1e87ead062aa72e37e47cf08d6238
parentf56230eaa511dbfa02759b1b1e4e85769cd80aae (diff)
downloadqpid-python-2bb28f477ab2ff92d6fe6c7a5694449638f94661.tar.gz
QPID-6425 : [Java Broker] Allow for local and global name equivalence on virtual hosts
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1663189 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBHAReplicaVirtualHostImpl.java25
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/exchange/DefaultDestination.java5
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHost.java4
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java94
-rwxr-xr-xqpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostImpl.java2
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/RedirectingVirtualHostImpl.java25
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/Asserts.java1
7 files changed, 152 insertions, 4 deletions
diff --git a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBHAReplicaVirtualHostImpl.java b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBHAReplicaVirtualHostImpl.java
index dac8d01e72..205ff57fab 100644
--- a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBHAReplicaVirtualHostImpl.java
+++ b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBHAReplicaVirtualHostImpl.java
@@ -90,6 +90,8 @@ public class BDBHAReplicaVirtualHostImpl extends AbstractConfiguredObject<BDBHAR
@ManagedAttributeField
private List<String> _disabledConnectionValidators;
+ @ManagedAttributeField
+ private List<String> _globalAddressDomains;
@ManagedObjectFactoryConstructor
public BDBHAReplicaVirtualHostImpl(final Map<String, Object> attributes, VirtualHostNode<?> virtualHostNode)
@@ -482,6 +484,29 @@ public class BDBHAReplicaVirtualHostImpl extends AbstractConfiguredObject<BDBHAR
return _disabledConnectionValidators;
}
+ @Override
+ public List<String> getGlobalAddressDomains()
+ {
+ return _globalAddressDomains;
+ }
+
+ @Override
+ public String getLocalAddress(final String routingAddress)
+ {
+ String localAddress = routingAddress;
+ if(getGlobalAddressDomains() != null)
+ {
+ for(String domain : getGlobalAddressDomains())
+ {
+ if(localAddress.length() > routingAddress.length() - domain.length() && routingAddress.startsWith(domain + "/"))
+ {
+ localAddress = routingAddress.substring(domain.length());
+ }
+ }
+ }
+ return localAddress;
+ }
+
private void throwUnsupportedForReplica()
{
throw new IllegalStateException("The virtual host state of " + getState()
diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/exchange/DefaultDestination.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/exchange/DefaultDestination.java
index 127a8d9e52..fcc34ee4de 100644
--- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/exchange/DefaultDestination.java
+++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/exchange/DefaultDestination.java
@@ -62,7 +62,8 @@ public class DefaultDestination implements MessageDestination
final AMQQueue q = _virtualHost.getQueue(routingAddress);
if(q == null)
{
- if(routingAddress != null && routingAddress.contains("/") && !routingAddress.startsWith("/"))
+ routingAddress = _virtualHost.getLocalAddress(routingAddress);
+ if(routingAddress.contains("/") && !routingAddress.startsWith("/"))
{
String[] parts = routingAddress.split("/",2);
ExchangeImpl exchange = _virtualHost.getExchange(parts[0]);
@@ -71,7 +72,7 @@ public class DefaultDestination implements MessageDestination
return exchange.send(message, parts[1], instanceProperties, txn, postEnqueueAction);
}
}
- else if(routingAddress == null || !routingAddress.contains("/"))
+ else if(!routingAddress.contains("/"))
{
ExchangeImpl exchange = _virtualHost.getExchange(routingAddress);
if(exchange != null)
diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHost.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHost.java
index 38853e0a64..cc758ba7c9 100644
--- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHost.java
+++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/VirtualHost.java
@@ -46,6 +46,7 @@ public interface VirtualHost<X extends VirtualHost<X, Q, E>, Q extends Queue<?>,
String MODEL_VERSION = "modelVersion";
String ENABLED_CONNECTION_VALIDATORS = "enabledConnectionValidators";
String DISABLED_CONNECTION_VALIDATORS = "disabledConnectionValidators";
+ String GLOBAL_ADDRESS_DOMAINS = "globalAddressDomains";
@ManagedContextDefault( name = "queue.deadLetterQueueEnabled")
public static final boolean DEFAULT_DEAD_LETTER_QUEUE_ENABLED = false;
@@ -104,6 +105,9 @@ public interface VirtualHost<X extends VirtualHost<X, Q, E>, Q extends Queue<?>,
@ManagedAttribute( defaultValue = "${virtualhost.disabledConnectionValidators}")
List<String> getDisabledConnectionValidators();
+ @ManagedAttribute( defaultValue = "[]")
+ List<String> getGlobalAddressDomains();
+
@ManagedStatistic
long getQueueCount();
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 dff598790a..abc570239c 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
@@ -172,6 +172,8 @@ public abstract class AbstractVirtualHost<X extends AbstractVirtualHost<X>> exte
@ManagedAttributeField
private List<String> _disabledConnectionValidators;
+ @ManagedAttributeField
+ private List<String> _globalAddressDomains;
private boolean _useAsyncRecoverer;
@@ -222,6 +224,13 @@ public abstract class AbstractVirtualHost<X extends AbstractVirtualHost<X>> exte
{
throw new IllegalArgumentException(getClass().getSimpleName() + " must be durable");
}
+ if(getGlobalAddressDomains() != null)
+ {
+ for(String domain : getGlobalAddressDomains())
+ {
+ validateGlobalAddressDomain(domain);
+ }
+ }
}
@Override
@@ -240,6 +249,26 @@ public abstract class AbstractVirtualHost<X extends AbstractVirtualHost<X>> exte
throw new IntegrityViolationException("Cannot delete default virtual host '" + getName() + "'");
}
}
+ if(changedAttributes.contains(GLOBAL_ADDRESS_DOMAINS))
+ {
+ VirtualHost<?, ?, ?> virtualHost = (VirtualHost<?, ?, ?>) proxyForValidation;
+ if(virtualHost.getGlobalAddressDomains() != null)
+ {
+ for(String name : virtualHost.getGlobalAddressDomains())
+ {
+ validateGlobalAddressDomain(name);
+ }
+ }
+ }
+ }
+
+ private void validateGlobalAddressDomain(final String name)
+ {
+ String regex = "/(/?)([\\w_\\-:.\\$]+/)*[\\w_\\-:.\\$]+";
+ if(!name.matches(regex))
+ {
+ throw new IllegalArgumentException("'"+name+"' is not a valid global address domain");
+ }
}
@Override
@@ -253,8 +282,17 @@ public abstract class AbstractVirtualHost<X extends AbstractVirtualHost<X>> exte
{
super.validateOnCreate();
validateMessageStoreCreation();
+ if(getGlobalAddressDomains() != null)
+ {
+ for(String name : getGlobalAddressDomains())
+ {
+ validateGlobalAddressDomain(name);
+ }
+ }
}
+
+
private void validateMessageStoreCreation()
{
MessageStore store = createMessageStore();
@@ -574,11 +612,31 @@ public abstract class AbstractVirtualHost<X extends AbstractVirtualHost<X>> exte
return _disabledConnectionValidators;
}
+ @Override
+ public List<String> getGlobalAddressDomains()
+ {
+ return _globalAddressDomains;
+ }
@Override
public AMQQueue<?> getQueue(String name)
{
- return (AMQQueue<?>) getChildByName(Queue.class, name);
+ AMQQueue<?> childByName = (AMQQueue<?>) getChildByName(Queue.class, name);
+ if(childByName == null && getGlobalAddressDomains() != null)
+ {
+ for(String domain : getGlobalAddressDomains())
+ {
+ if(name.startsWith(domain + "/"))
+ {
+ childByName = (AMQQueue<?>) getChildByName(Queue.class,name.substring(domain.length()));
+ if(childByName != null)
+ {
+ break;
+ }
+ }
+ }
+ }
+ return childByName;
}
@Override
@@ -664,7 +722,22 @@ public abstract class AbstractVirtualHost<X extends AbstractVirtualHost<X>> exte
@Override
public ExchangeImpl getExchange(String name)
{
- return getChildByName(ExchangeImpl.class,name);
+ ExchangeImpl childByName = getChildByName(ExchangeImpl.class, name);
+ if(childByName == null && getGlobalAddressDomains() != null)
+ {
+ for(String domain : getGlobalAddressDomains())
+ {
+ if(name.startsWith(domain + "/"))
+ {
+ childByName = getChildByName(ExchangeImpl.class,name.substring(domain.length()));
+ if(childByName != null)
+ {
+ break;
+ }
+ }
+ }
+ }
+ return childByName;
}
@Override
@@ -721,6 +794,23 @@ public abstract class AbstractVirtualHost<X extends AbstractVirtualHost<X>> exte
exchange.deleteWithChecks();
}
+ @Override
+ public String getLocalAddress(final String routingAddress)
+ {
+ String localAddress = routingAddress;
+ if(getGlobalAddressDomains() != null)
+ {
+ for(String domain : getGlobalAddressDomains())
+ {
+ if(localAddress.length() > routingAddress.length() - domain.length() && routingAddress.startsWith(domain + "/"))
+ {
+ localAddress = routingAddress.substring(domain.length());
+ }
+ }
+ }
+ return localAddress;
+ }
+
public SecurityManager getSecurityManager()
{
return _broker.getSecurityManager();
diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostImpl.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostImpl.java
index b7689191bb..dff8a80dd9 100755
--- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostImpl.java
+++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostImpl.java
@@ -110,4 +110,6 @@ public interface VirtualHostImpl< X extends VirtualHostImpl<X,Q,E>, Q extends AM
EventLogger getEventLogger();
boolean authoriseCreateConnection(AMQConnectionModel<?, ?> connection);
+
+ String getLocalAddress(String routingAddress);
}
diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/RedirectingVirtualHostImpl.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/RedirectingVirtualHostImpl.java
index 89bd2fc8b9..cacc981e9b 100644
--- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/RedirectingVirtualHostImpl.java
+++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/RedirectingVirtualHostImpl.java
@@ -90,6 +90,8 @@ class RedirectingVirtualHostImpl
@ManagedAttributeField
private List<String> _disabledConnectionValidators;
+ @ManagedAttributeField
+ private List<String> _globalAddressDomains;
@ManagedObjectFactoryConstructor
public RedirectingVirtualHostImpl(final Map<String, Object> attributes, VirtualHostNode<?> virtualHostNode)
@@ -482,6 +484,29 @@ class RedirectingVirtualHostImpl
return _disabledConnectionValidators;
}
+ @Override
+ public List<String> getGlobalAddressDomains()
+ {
+ return _globalAddressDomains;
+ }
+
+ @Override
+ public String getLocalAddress(final String routingAddress)
+ {
+ String localAddress = routingAddress;
+ if(getGlobalAddressDomains() != null)
+ {
+ for(String domain : getGlobalAddressDomains())
+ {
+ if(localAddress.length() > routingAddress.length() - domain.length() && routingAddress.startsWith(domain + "/"))
+ {
+ localAddress = routingAddress.substring(domain.length());
+ }
+ }
+ }
+ return localAddress;
+ }
+
private void throwUnsupportedForRedirector()
{
throw new IllegalStateException("The virtual host state of " + getState()
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/Asserts.java b/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/Asserts.java
index de98d98e36..19708353aa 100644
--- a/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/Asserts.java
+++ b/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/Asserts.java
@@ -78,6 +78,7 @@ public class Asserts
ConfiguredObject.DESIRED_STATE,
VirtualHost.ENABLED_CONNECTION_VALIDATORS,
VirtualHost.DISABLED_CONNECTION_VALIDATORS,
+ VirtualHost.GLOBAL_ADDRESS_DOMAINS,
VirtualHost.TYPE);
assertEquals("Unexpected value of attribute " + VirtualHost.NAME,