@Override
public void exchangeDeclare(Session session, ExchangeDeclare method)
{
String exchangeName = method.getExchange();
VirtualHost virtualHost = getVirtualHost(session);
ExchangeRegistry exchangeRegistry = getExchangeRegistry(session);
//we must check for any unsupported arguments present and throw not-implemented
if(method.hasArguments())
{
Map<String,Object> args = method.getArguments();
//QPID-3392: currently we don't support any!
if(!args.isEmpty())
{
exception(session, method, ExecutionErrorCode.NOT_IMPLEMENTED, "Unsupported exchange argument(s) found " + args.keySet().toString());
return;
}
}
synchronized(exchangeRegistry)
{
Exchange exchange = getExchange(session, exchangeName);
if(method.getPassive())
{
if(exchange == null)
{
exception(session, method, ExecutionErrorCode.NOT_FOUND, "not-found: exchange-name '" + exchangeName + "'");
}
else
{
if (!exchange.getTypeShortString().toString().equals(method.getType())
&& (method.getType() != null && method.getType().length() > 0))
{
exception(session, method, ExecutionErrorCode.NOT_ALLOWED, "Attempt to redeclare exchange: "
+ exchangeName + " of type " + exchange.getTypeShortString() + " to " + method.getType() + ".");
}
}
}
else
{
if (exchange == null)
{
if (exchangeName.startsWith("amq."))
{
exception(session, method, ExecutionErrorCode.NOT_ALLOWED, "Attempt to declare exchange: "
+ exchangeName + " which begins with reserved prefix 'amq.'.");
}
else if (exchangeName.startsWith("qpid."))
{
exception(session, method, ExecutionErrorCode.NOT_ALLOWED, "Attempt to declare exchange: "
+ exchangeName + " which begins with reserved prefix 'qpid.'.");
}
else
{
ExchangeFactory exchangeFactory = virtualHost.getExchangeFactory();
try
{
exchange = exchangeFactory.createExchange(method.getExchange(),
method.getType(),
method.getDurable(),
method.getAutoDelete());
String alternateExchangeName = method.getAlternateExchange();
boolean validAlternate;
if(alternateExchangeName != null && alternateExchangeName.length() != 0)
{
Exchange alternate = getExchange(session, alternateExchangeName);
if(alternate == null)
{
validAlternate = false;
}
else
{
exchange.setAlternateExchange(alternate);
validAlternate = true;
}
}
else
{
validAlternate = true;
}
if(validAlternate)
{
if (exchange.isDurable())
{
DurableConfigurationStore store = virtualHost.getMessageStore();
store.createExchange(exchange);
}
exchangeRegistry.registerExchange(exchange);
}
else
{
exception(session, method, ExecutionErrorCode.NOT_FOUND,
"Unknown alternate exchange " + alternateExchangeName);