summaryrefslogtreecommitdiff
path: root/java/broker/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/broker/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java')
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java114
1 files changed, 95 insertions, 19 deletions
diff --git a/java/broker/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java b/java/broker/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java
index 8d24626b73..33af910f1a 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java
@@ -7,9 +7,9 @@
* 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
@@ -23,6 +23,7 @@ package org.apache.qpid.server.exchange;
import javax.management.MalformedObjectNameException;
import javax.management.NotCompliantMBeanException;
import javax.management.ObjectName;
+import javax.management.JMException;
import javax.management.openmbean.OpenType;
import javax.management.openmbean.CompositeType;
import javax.management.openmbean.TabularType;
@@ -33,6 +34,7 @@ import javax.management.openmbean.ArrayType;
import org.apache.qpid.AMQException;
import org.apache.qpid.framing.AMQShortString;
+import org.apache.qpid.management.common.mbeans.ManagedExchange;
import org.apache.qpid.server.management.AMQManagedObject;
import org.apache.qpid.server.management.Managable;
import org.apache.qpid.server.management.ManagedObject;
@@ -41,15 +43,20 @@ import org.apache.qpid.server.queue.QueueRegistry;
import org.apache.qpid.server.queue.AMQQueue;
import org.apache.qpid.server.registry.ApplicationRegistry;
import org.apache.qpid.server.virtualhost.VirtualHost;
+import org.apache.qpid.server.logging.actors.CurrentActor;
+import org.apache.qpid.server.logging.messages.ExchangeMessages;
+import org.apache.qpid.server.logging.subjects.ExchangeLogSubject;
+import org.apache.qpid.server.logging.LogSubject;
+import org.apache.log4j.Logger;
-import java.util.List;
import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
public abstract class AbstractExchange implements Exchange, Managable
{
private AMQShortString _name;
-
+ private Exchange _alternateExchange;
protected boolean _durable;
protected String _exchangeType;
@@ -64,6 +71,10 @@ public abstract class AbstractExchange implements Exchange, Managable
*/
protected boolean _autoDelete;
+ //The logSubject for ths exchange
+ private LogSubject _logSubject;
+ private Map<ExchangeReferrer,Object> _referrers = new ConcurrentHashMap<ExchangeReferrer,Object>();
+
/**
* Abstract MBean class. This has some of the methods implemented from
* management intrerface for exchanges. Any implementaion of an
@@ -72,30 +83,25 @@ public abstract class AbstractExchange implements Exchange, Managable
protected abstract class ExchangeMBean extends AMQManagedObject implements ManagedExchange
{
// open mbean data types for representing exchange bindings
- protected String[] _bindingItemNames;
- protected String[] _bindingItemIndexNames;
protected OpenType[] _bindingItemTypes;
protected CompositeType _bindingDataType;
protected TabularType _bindinglistDataType;
protected TabularDataSupport _bindingList;
-
+
public ExchangeMBean() throws NotCompliantMBeanException
{
- super(ManagedExchange.class, ManagedExchange.TYPE);
+ super(ManagedExchange.class, ManagedExchange.TYPE, ManagedExchange.VERSION);
}
protected void init() throws OpenDataException
{
- _bindingItemNames = new String[]{"Binding Key", "Queue Names"};
- _bindingItemIndexNames = new String[]{_bindingItemNames[0]};
-
_bindingItemTypes = new OpenType[2];
_bindingItemTypes[0] = SimpleType.STRING;
_bindingItemTypes[1] = new ArrayType(1, SimpleType.STRING);
_bindingDataType = new CompositeType("Exchange Binding", "Binding key and Queue names",
- _bindingItemNames, _bindingItemNames, _bindingItemTypes);
+ COMPOSITE_ITEM_NAMES, COMPOSITE_ITEM_DESCRIPTIONS, _bindingItemTypes);
_bindinglistDataType = new TabularType("Exchange Bindings", "Exchange Bindings for " + getName(),
- _bindingDataType, _bindingItemIndexNames);
+ _bindingDataType, TABULAR_UNIQUE_INDEX);
}
public ManagedObject getParentObject()
@@ -157,19 +163,33 @@ public abstract class AbstractExchange implements Exchange, Managable
* called during initialisation (template method pattern).
* @return the MBean
*/
- protected abstract ExchangeMBean createMBean() throws AMQException;
+ protected abstract ExchangeMBean createMBean() throws JMException;
- public void initialise(VirtualHost host, AMQShortString name, boolean durable, int ticket, boolean autoDelete) throws AMQException
+ public void initialise(VirtualHost host, AMQShortString name, boolean durable, int ticket, boolean autoDelete)
+ throws AMQException
{
_virtualHost = host;
_name = name;
_durable = durable;
_autoDelete = autoDelete;
_ticket = ticket;
- _exchangeMbean = createMBean();
- _exchangeMbean.register();
+ try
+ {
+ _exchangeMbean = createMBean();
+ _exchangeMbean.register();
+ }
+ catch (JMException e)
+ {
+ getLogger().error(e);
+ }
+ _logSubject = new ExchangeLogSubject(this, this.getVirtualHost());
+
+ // Log Exchange creation
+ CurrentActor.get().message(ExchangeMessages.EXH_CREATED(String.valueOf(getType()), String.valueOf(name), durable));
}
+ public abstract Logger getLogger();
+
public boolean isDurable()
{
return _durable;
@@ -191,11 +211,17 @@ public abstract class AbstractExchange implements Exchange, Managable
{
_exchangeMbean.unregister();
}
- }
+ if(_alternateExchange != null)
+ {
+ _alternateExchange.removeReference(this);
+ }
+
+ CurrentActor.get().message(_logSubject, ExchangeMessages.EXH_DELETED());
+ }
public String toString()
{
- return getClass().getName() + "[" + getName() +"]";
+ return getClass().getSimpleName() + "[" + getName() +"]";
}
public ManagedObject getManagedObject()
@@ -212,4 +238,54 @@ public abstract class AbstractExchange implements Exchange, Managable
{
return getVirtualHost().getQueueRegistry();
}
+
+ public boolean isBound(String bindingKey, Map<String,Object> arguments, AMQQueue queue)
+ {
+ return isBound(new AMQShortString(bindingKey), queue);
+ }
+
+
+ public boolean isBound(String bindingKey, AMQQueue queue)
+ {
+ return isBound(new AMQShortString(bindingKey), queue);
+ }
+
+ public boolean isBound(String bindingKey)
+ {
+ return isBound(new AMQShortString(bindingKey));
+ }
+
+ public Exchange getAlternateExchange()
+ {
+ return _alternateExchange;
+ }
+
+ public void setAlternateExchange(Exchange exchange)
+ {
+ if(_alternateExchange != null)
+ {
+ _alternateExchange.removeReference(this);
+ }
+ if(exchange != null)
+ {
+ exchange.addReference(this);
+ }
+ _alternateExchange = exchange;
+
+ }
+
+ public void removeReference(ExchangeReferrer exchange)
+ {
+ _referrers.remove(exchange);
+ }
+
+ public void addReference(ExchangeReferrer exchange)
+ {
+ _referrers.put(exchange, Boolean.TRUE);
+ }
+
+ public boolean hasReferrers()
+ {
+ return !_referrers.isEmpty();
+ }
}