EnumSet<ConsumerImpl.Option> options = EnumSet.noneOf(ConsumerImpl.Option.class);
boolean noLocal = false;
JMSSelectorFilter messageFilter = null;
if(destination instanceof MessageSourceDestination)
{
_queue = ((MessageSourceDestination) _destination).getQueue();
if(_queue instanceof AMQQueue && ((AMQQueue)_queue).getAvailableAttributes().contains("topic"))
{
source.setDistributionMode(StdDistMode.COPY);
}
Map<Symbol,Filter> filters = source.getFilter();
Map<Symbol,Filter> actualFilters = new HashMap<Symbol,Filter>();
if(filters != null)
{
for(Map.Entry<Symbol,Filter> entry : filters.entrySet())
{
if(entry.getValue() instanceof NoLocalFilter)
{
actualFilters.put(entry.getKey(), entry.getValue());
noLocal = true;
}
else if(messageFilter == null && entry.getValue() instanceof org.apache.qpid.amqp_1_0.type.messaging.JMSSelectorFilter)
{
org.apache.qpid.amqp_1_0.type.messaging.JMSSelectorFilter selectorFilter = (org.apache.qpid.amqp_1_0.type.messaging.JMSSelectorFilter) entry.getValue();
try
{
messageFilter = new JMSSelectorFilter(selectorFilter.getValue());
actualFilters.put(entry.getKey(), entry.getValue());
}
catch (ParseException e)
{
Error error = new Error();
error.setCondition(AmqpError.INVALID_FIELD);
error.setDescription("Invalid JMS Selector: " + selectorFilter.getValue());
error.setInfo(Collections.singletonMap(Symbol.valueOf("field"), Symbol.valueOf("filter")));
throw new AmqpErrorException(error);
}
catch (SelectorParsingException e)
{
Error error = new Error();
error.setCondition(AmqpError.INVALID_FIELD);
error.setDescription("Invalid JMS Selector: " + selectorFilter.getValue());
error.setInfo(Collections.singletonMap(Symbol.valueOf("field"), Symbol.valueOf("filter")));
throw new AmqpErrorException(error);
}
}
}
}
source.setFilter(actualFilters.isEmpty() ? null : actualFilters);
_target = new ConsumerTarget_1_0(this, source.getDistributionMode() != StdDistMode.COPY);
if(source.getDistributionMode() != StdDistMode.COPY)
{
options.add(ConsumerImpl.Option.ACQUIRES);
options.add(ConsumerImpl.Option.SEES_REQUEUES);
}
}
else if(destination instanceof ExchangeDestination)
{
try
{
ExchangeDestination exchangeDestination = (ExchangeDestination) destination;
boolean isDurable = exchangeDestination.getDurability() == TerminusDurability.CONFIGURATION
|| exchangeDestination.getDurability() == TerminusDurability.UNSETTLED_STATE;
String name;
if(isDurable)
{
String remoteContainerId = getEndpoint().getSession().getConnection().getRemoteContainerId();
remoteContainerId = remoteContainerId.replace("_","__").replace(".", "_:");
String endpointName = linkAttachment.getEndpoint().getName();
endpointName = endpointName
.replace("_", "__")
.replace(".", "_:")
.replace("(", "_O")
.replace(")", "_C")
.replace("<", "_L")
.replace(">", "_R");
name = "qpid_/" + remoteContainerId + "_/" + endpointName;
}
else
{
name = UUID.randomUUID().toString();
}
AMQQueue queue = _vhost.getQueue(name);
ExchangeImpl exchange = exchangeDestination.getExchange();
if(queue == null)
{
Map<String,Object> attributes = new HashMap<String,Object>();
attributes.put(Queue.ID, UUIDGenerator.generateQueueUUID(name, _vhost.getName()));
attributes.put(Queue.NAME, name);
attributes.put(Queue.DURABLE, isDurable);
attributes.put(Queue.LIFETIME_POLICY, LifetimePolicy.DELETE_ON_NO_OUTBOUND_LINKS);
attributes.put(Queue.EXCLUSIVE, ExclusivityPolicy.LINK);
queue = _vhost.createQueue(attributes);
}
else
{
Collection<BindingImpl> bindings = queue.getBindings();
List<BindingImpl> bindingsToRemove = new ArrayList<BindingImpl>();
for(BindingImpl existingBinding : bindings)
{
if(existingBinding.getExchange() != exchange)
{
bindingsToRemove.add(existingBinding);
}
}
for(BindingImpl existingBinding : bindingsToRemove)
{
existingBinding.delete();
}
}
String binding = null;
Map<Symbol,Filter> filters = source.getFilter();
Map<Symbol,Filter> actualFilters = new HashMap<Symbol,Filter>();
boolean hasBindingFilter = false;
if(filters != null && !filters.isEmpty())
{
for(Map.Entry<Symbol,Filter> entry : filters.entrySet())
{
if(!hasBindingFilter
&& entry.getValue() instanceof ExactSubjectFilter
&& exchange.getExchangeType() == DirectExchange.TYPE)
{
ExactSubjectFilter filter = (ExactSubjectFilter) filters.values().iterator().next();
source.setFilter(filters);
binding = filter.getValue();
actualFilters.put(entry.getKey(), entry.getValue());
hasBindingFilter = true;
}
else if(!hasBindingFilter
&& entry.getValue() instanceof MatchingSubjectFilter
&& exchange.getExchangeType() == TopicExchange.TYPE)
{
MatchingSubjectFilter filter = (MatchingSubjectFilter) filters.values().iterator().next();
source.setFilter(filters);
binding = filter.getValue();
actualFilters.put(entry.getKey(), entry.getValue());
hasBindingFilter = true;
}
else if(entry.getValue() instanceof NoLocalFilter)
{
actualFilters.put(entry.getKey(), entry.getValue());
noLocal = true;
}
else if(messageFilter == null && entry.getValue() instanceof org.apache.qpid.amqp_1_0.type.messaging.JMSSelectorFilter)
{
org.apache.qpid.amqp_1_0.type.messaging.JMSSelectorFilter selectorFilter = (org.apache.qpid.amqp_1_0.type.messaging.JMSSelectorFilter) entry.getValue();
try
{
messageFilter = new JMSSelectorFilter(selectorFilter.getValue());
actualFilters.put(entry.getKey(), entry.getValue());
}
catch (ParseException e)
{