summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Godfrey <rgodfrey@apache.org>2014-04-19 15:58:42 +0000
committerRobert Godfrey <rgodfrey@apache.org>2014-04-19 15:58:42 +0000
commitea530a932ae88cf40c72553e804ff36626b97bc1 (patch)
treeb69120e43f7ba5cde9db37c2c8cf877400e813da
parent1e7961c77a9b416851c3612c9b5c1945c7fc9731 (diff)
downloadqpid-python-ea530a932ae88cf40c72553e804ff36626b97bc1.tar.gz
QPID-5698 : [Java Broker] Make all configured object attributes either automated or derived (except for state) and enforce this
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1588667 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/binding/BindingImpl.java37
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java7
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/exchange/HeadersBinding.java16
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java4
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Binding.java2
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObject.java2
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ManagedAttribute.java1
-rw-r--r--qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/BindingRecoverer.java1
-rw-r--r--qpid/java/broker-core/src/test/java/org/apache/qpid/server/exchange/HeadersBindingTest.java4
-rw-r--r--qpid/java/broker-core/src/test/java/org/apache/qpid/server/exchange/TopicExchangeTest.java4
10 files changed, 52 insertions, 26 deletions
diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/binding/BindingImpl.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/binding/BindingImpl.java
index df548d651f..c1a5f92717 100644
--- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/binding/BindingImpl.java
+++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/binding/BindingImpl.java
@@ -29,12 +29,14 @@ import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;
+import org.apache.qpid.server.exchange.AbstractExchange;
import org.apache.qpid.server.exchange.ExchangeImpl;
import org.apache.qpid.server.logging.EventLogger;
import org.apache.qpid.server.logging.messages.BindingMessages;
import org.apache.qpid.server.logging.subjects.BindingLogSubject;
import org.apache.qpid.server.model.AbstractConfiguredObject;
import org.apache.qpid.server.model.ConfiguredObject;
+import org.apache.qpid.server.model.ManagedAttributeField;
import org.apache.qpid.server.model.Queue;
import org.apache.qpid.server.model.State;
import org.apache.qpid.server.model.VirtualHost;
@@ -46,12 +48,13 @@ public class BindingImpl
extends AbstractConfiguredObject<BindingImpl>
implements org.apache.qpid.server.model.Binding<BindingImpl>
{
- private final String _bindingKey;
+ private String _bindingKey;
private final AMQQueue _queue;
private final ExchangeImpl _exchange;
+ @ManagedAttributeField
private Map<String, Object> _arguments;
private final AtomicLong _matches = new AtomicLong();
- private final BindingLogSubject _logSubject;
+ private BindingLogSubject _logSubject;
final AtomicBoolean _deleted = new AtomicBoolean();
final CopyOnWriteArrayList<StateChangeListener<BindingImpl,State>> _stateChangeListeners =
@@ -60,27 +63,41 @@ public class BindingImpl
public BindingImpl(Map<String, Object> attributes, AMQQueue queue, ExchangeImpl exchange)
{
super(parentsMap(queue,exchange),enhanceWithDurable(attributes,queue,exchange),queue.getVirtualHost().getTaskExecutor());
- _bindingKey = (String)attributes.get(org.apache.qpid.server.model.Binding.NAME);
+ _bindingKey = getName();
_queue = queue;
_exchange = exchange;
- Map<String,Object> arguments = (Map<String, Object>) attributes.get(org.apache.qpid.server.model.Binding.ARGUMENTS);
- _arguments = arguments == null ? Collections.EMPTY_MAP : Collections.unmodifiableMap(arguments);
- //Perform ACLs
- queue.getVirtualHost().getSecurityManager().authoriseCreateBinding(this);
- _logSubject = new BindingLogSubject(_bindingKey,exchange,queue);
+ }
+
+ @Override
+ protected void onOpen()
+ {
+ super.onOpen();
+ _logSubject = new BindingLogSubject(_bindingKey,_exchange,_queue);
+
getEventLogger().message(_logSubject, BindingMessages.CREATED(String.valueOf(getArguments()),
getArguments() != null
&& !getArguments().isEmpty()));
-
-
+ if(_exchange instanceof AbstractExchange)
+ {
+ ((AbstractExchange)_exchange).doAddBinding(this);
+ }
}
@Override
protected void onCreate()
{
super.onCreate();
+ try
+ {
+ _queue.getVirtualHost().getSecurityManager().authoriseCreateBinding(this);
+ }
+ catch(AccessControlException e)
+ {
+ deleted();
+ throw e;
+ }
if (isDurable())
{
_queue.getVirtualHost().getDurableConfigurationStore().create(asObjectRecord());
diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java
index ef57af3af0..e42c3db0b1 100644
--- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java
+++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java
@@ -609,7 +609,7 @@ public abstract class AbstractExchange<T extends AbstractExchange<T>>
@Override
public boolean addBinding(String bindingKey, AMQQueue queue, Map<String, Object> arguments)
{
- return makeBinding(null, bindingKey, queue, arguments, false, false);
+ return makeBinding(null, bindingKey, queue, arguments, false);
}
@Override
@@ -622,7 +622,6 @@ public abstract class AbstractExchange<T extends AbstractExchange<T>>
bindingKey,
queue,
arguments,
- false,
true);
}
@@ -674,7 +673,6 @@ public abstract class AbstractExchange<T extends AbstractExchange<T>>
String bindingKey,
AMQQueue queue,
Map<String, Object> arguments,
- boolean restore,
boolean force)
{
if (bindingKey == null)
@@ -706,9 +704,9 @@ public abstract class AbstractExchange<T extends AbstractExchange<T>>
attributes.put(Binding.ARGUMENTS, arguments);
BindingImpl b = new BindingImpl(attributes, queue, this);
- b.create();
addBinding(b);
+ b.create();
return true;
@@ -738,7 +736,6 @@ public abstract class AbstractExchange<T extends AbstractExchange<T>>
b.getAMQQueue().addBinding(b);
childAdded(b);
- doAddBinding(b);
}
protected abstract void onBindingUpdated(final BindingImpl binding,
diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/exchange/HeadersBinding.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/exchange/HeadersBinding.java
index 5de3fa4d4e..fa4e3f21dd 100644
--- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/exchange/HeadersBinding.java
+++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/exchange/HeadersBinding.java
@@ -20,20 +20,21 @@
*/
package org.apache.qpid.server.exchange;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
import org.apache.log4j.Logger;
import org.apache.qpid.server.binding.BindingImpl;
import org.apache.qpid.server.filter.AMQInvalidArgumentException;
import org.apache.qpid.server.filter.FilterSupport;
+import org.apache.qpid.server.filter.Filterable;
import org.apache.qpid.server.filter.MessageFilter;
import org.apache.qpid.server.message.AMQMessageHeader;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import org.apache.qpid.server.filter.Filterable;
-
/**
* Defines binding and matching based on a set of headers.
*/
@@ -61,7 +62,8 @@ class HeadersBinding
_binding = binding;
if(_binding !=null)
{
- _mappings = _binding.getArguments();
+ Map<String, Object> arguments = _binding.getArguments();
+ _mappings = arguments == null ? Collections.<String,Object>emptyMap() : arguments;
initMappings();
}
else
diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java
index 4789da7126..03b19608af 100644
--- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java
+++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java
@@ -1351,6 +1351,10 @@ public abstract class AbstractConfiguredObject<X extends ConfiguredObject<X>> im
ManagedAttribute annotation = m.getAnnotation(ManagedAttribute.class);
if(annotation != null)
{
+ if(!(annotation.automate() || annotation.derived() || annotation.state()))
+ {
+ throw new ServerScopedRuntimeException("ManagedAttributes must be either automated or derived. " + m.getName() + " on " + clazz.getSimpleName() + " does not meet this criterion.");
+ }
if(!clazz.isInterface() || !ConfiguredObject.class.isAssignableFrom(clazz))
{
throw new ServerScopedRuntimeException("Can only define ManagedAttributes on interfaces which extend " + ConfiguredObject.class.getSimpleName() + ". " + clazz.getSimpleName() + " does not meet these criteria.");
diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Binding.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Binding.java
index 17b9282f66..a4e1f47160 100644
--- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Binding.java
+++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Binding.java
@@ -39,7 +39,7 @@ public interface Binding<X extends Binding<X>> extends ConfiguredObject<X>
@ManagedAttribute( derived = true )
Exchange<?> getExchange();
- @ManagedAttribute
+ @ManagedAttribute( automate = true )
Map<String,Object> getArguments();
@ManagedStatistic
diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObject.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObject.java
index 54bab071fd..1404f5e7b6 100644
--- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObject.java
+++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObject.java
@@ -122,7 +122,7 @@ public interface ConfiguredObject<X extends ConfiguredObject<X>>
*
* @return the actual state of the object
*/
- @ManagedAttribute
+ @ManagedAttribute( state = true )
State getState();
diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ManagedAttribute.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ManagedAttribute.java
index 20d8a3c311..4360e97c7e 100644
--- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ManagedAttribute.java
+++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/ManagedAttribute.java
@@ -30,6 +30,7 @@ public @interface ManagedAttribute
boolean secure() default false;
boolean derived() default false;
boolean automate() default false;
+ boolean state() default false;
boolean mandatory() default false;
String defaultValue() default "";
}
diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/BindingRecoverer.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/BindingRecoverer.java
index 526760aea7..a75696e9b8 100644
--- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/BindingRecoverer.java
+++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/BindingRecoverer.java
@@ -130,6 +130,7 @@ public class BindingRecoverer extends AbstractDurableConfiguredObjectRecoverer<B
UnresolvedConfiguredObject<? extends Binding> unresolvedConfiguredObject =
configuredObjectTypeFactory.recover(_record, _exchange, _queue);
Binding binding = (Binding<?>) unresolvedConfiguredObject.resolve();
+ binding.open();
}
return (_exchange).getBinding(_bindingName, _queue);
diff --git a/qpid/java/broker-core/src/test/java/org/apache/qpid/server/exchange/HeadersBindingTest.java b/qpid/java/broker-core/src/test/java/org/apache/qpid/server/exchange/HeadersBindingTest.java
index 3d6ab9e76d..9b1da6225b 100644
--- a/qpid/java/broker-core/src/test/java/org/apache/qpid/server/exchange/HeadersBindingTest.java
+++ b/qpid/java/broker-core/src/test/java/org/apache/qpid/server/exchange/HeadersBindingTest.java
@@ -361,7 +361,9 @@ public class HeadersBindingTest extends TestCase
attributes.put(Binding.ARGUMENTS, arguments);
}
attributes.put(Binding.ID, id);
- return new BindingImpl(attributes, queue, exchange);
+ BindingImpl binding = new BindingImpl(attributes, queue, exchange);
+ binding.open();
+ return binding;
}
diff --git a/qpid/java/broker-core/src/test/java/org/apache/qpid/server/exchange/TopicExchangeTest.java b/qpid/java/broker-core/src/test/java/org/apache/qpid/server/exchange/TopicExchangeTest.java
index 7b57143016..a6930a9acd 100644
--- a/qpid/java/broker-core/src/test/java/org/apache/qpid/server/exchange/TopicExchangeTest.java
+++ b/qpid/java/broker-core/src/test/java/org/apache/qpid/server/exchange/TopicExchangeTest.java
@@ -383,7 +383,9 @@ public class TopicExchangeTest extends QpidTestCase
attributes.put(Binding.ARGUMENTS, arguments);
}
attributes.put(Binding.ID, id);
- return new BindingImpl(attributes, queue, exchange);
+ BindingImpl binding = new BindingImpl(attributes, queue, exchange);
+ binding.open();
+ return binding;
}