diff options
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.java | 114 |
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(); + } } |